diff --git a/DEPS b/DEPS
index 02e0bf4..1d75bec 100644
--- a/DEPS
+++ b/DEPS
@@ -283,7 +283,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': '4784f091deba6037d790a8ab3e4edbd5d8fdd978',
+  'angle_revision': 'b03f278925c6754bdb7a37feae315214b4cc604b',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -334,7 +334,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling HarfBuzz
   # and whatever else without interference from each other.
-  'harfbuzz_revision': 'd61b2074915cf5f8044dcb8e3dafc04b5b58c6b8',
+  'harfbuzz_revision': 'c88a6a9ec3c38793ec8b662362282e076e948943',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Emoji Segmenter
   # and whatever else without interference from each other.
@@ -354,7 +354,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': '2aa04c0df60d74ece3b0c01f5d678485798e5133',
+  'devtools_frontend_revision': 'c11af60fb020f514bcbed1177066378819b0828d',
   # 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.
@@ -747,11 +747,11 @@
     Var('chromium_git') + '/external/github.com/toji/webvr.info.git' + '@' + 'c58ae99b9ff9e2aa4c524633519570bf33536248',
 
   'src/docs/website': {
-    'url': Var('chromium_git') + '/website.git' + '@' + 'a1a7b0cb5eae86ac111698335ece12790121be09',
+    'url': Var('chromium_git') + '/website.git' + '@' + '9f911e639c13c9eaf06721a9755bcaf49ce63427',
   },
 
   'src/ios/third_party/earl_grey2/src': {
-      'url': Var('chromium_git') + '/external/github.com/google/EarlGrey.git' + '@' + '31af87eb29f2bf39da0e4adb29fb174de11bdd1d',
+      'url': Var('chromium_git') + '/external/github.com/google/EarlGrey.git' + '@' + '9d8a5c2b806286ee427c44591d9ee2a0f1b01896',
       'condition': 'checkout_ios',
   },
 
@@ -841,7 +841,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/linux-amd64',
-          'version': 'h3Fw4WWTDL-AIwlPuqOBmpc2Od7Ha52OSHPv4Kb5TXIC',
+          'version': '8zqTXxzVGxAv_4yJH62SDu338NH2a9Sj8E-Ue8Od1cQC',
         },
       ],
       'dep_type': 'cipd',
@@ -852,7 +852,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/mac-amd64',
-          'version': 'qVZQ0l3ks3l_8H6Bwr1OybmRn5KgDYfP2cGoI3NJBMsC',
+          'version': 'SI7tqcfHGyKVRq_68Hdai7SqtG-ddU5RFVc313lMD_UC',
         },
       ],
       'dep_type': 'cipd',
@@ -863,7 +863,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/windows-amd64',
-          'version': 'bSU1rw6Xvt1TnjbrQnh1dvf6X7rgCTG5qu_xdSVkxoQC',
+          'version': 'CHdWfS54WS0s0BeEADqbqHQ5mQqzzmMwGA7qUcJ5lQ0C',
         },
       ],
       'dep_type': 'cipd',
@@ -920,7 +920,7 @@
     'packages': [
       {
           'package': 'chromium/third_party/androidx',
-          'version': 'mZLJBHTeHRk84ycgeiLQoq58PydPeOPP227RHKbs_tkC',
+          'version': 'TFxpdey4vNeM1KsMbFcQX_jgFBdyUkLPbaCPTqbS77IC',
       },
     ],
     'condition': 'checkout_android',
@@ -1533,7 +1533,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + 'd55a1685ae00d37b13590430d7d916dc291da2cc',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + 'd836f02e9ab596cc817bff3efcae6287f9ee0403',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1708,7 +1708,7 @@
     Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'd275c5e1e31566ca21c5ba48cac7706d0d45728a',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + 'fd8ed05cee7c6a2af3f9143ea3b68bc4ac085ce3',
+    Var('webrtc_git') + '/src.git' + '@' + '80a860532e120bb8ca7bfb088672c6dc53281a80',
 
   'src/third_party/libgifcodec':
      Var('skia_git') + '/libgifcodec' + '@'+  Var('libgifcodec_revision'),
@@ -1811,7 +1811,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/help_app/app',
-        'version': 'ZuzzXBmHJpnH9hcJKLD7fyCXVEr_evbyFcO9LjH8RcMC',
+        'version': 'aJEXXGyUnjQdOYV24rRrtQV8x3UK-KMkW9nExv9j4rcC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index 6a7f11e..2358721 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -1008,6 +1008,15 @@
           r'^base[\\/]win[\\/]scoped_winrt_initializer\.cc$',
       ),
     ),
+    BanRule(
+      r'base::Watchdog',
+      (
+        'base::Watchdog is deprecated because it creates its own thread.',
+        'Instead, manually start a timer on a SequencedTaskRunner.',
+      ),
+      False,
+      (),
+    ),
 )
 
 _BANNED_MOJOM_PATTERNS : Sequence[BanRule] = (
diff --git a/WATCHLISTS b/WATCHLISTS
index df0073b..75fd5d7 100644
--- a/WATCHLISTS
+++ b/WATCHLISTS
@@ -2929,7 +2929,9 @@
     'webcodecs': ['feature-media-reviews@chromium.org'],
     'webgpu': ['cwallez+watch@chromium.org',
                'kainino+watch@chromium.org'],
-    'webid': ['yigu+watch@chromium.org', 'cbiesinger@chromium.org'],
+    'webid': ['yigu+watch@chromium.org',
+              'cbiesinger@chromium.org',
+              'icer@chromium.org'],
     'weblayer': ['cricke+watch@chromium.org'],
     'weblayer_safe_browsing' : ['carlosil+watch@chromium.org'],
     'weblayer_ssl' : ['carlosil+watch@chromium.org'],
diff --git a/android_webview/browser/gfx/hardware_renderer_viz.cc b/android_webview/browser/gfx/hardware_renderer_viz.cc
index c4ed963..b241aefd 100644
--- a/android_webview/browser/gfx/hardware_renderer_viz.cc
+++ b/android_webview/browser/gfx/hardware_renderer_viz.cc
@@ -360,7 +360,6 @@
     AwVulkanContextProvider* context_provider)
     : HardwareRenderer(state), output_surface_provider_(context_provider) {
   DCHECK_CALLED_ON_VALID_THREAD(render_thread_checker_);
-  DCHECK(output_surface_provider_.renderer_settings().use_skia_renderer);
 
   VizCompositorThreadRunnerWebView::GetInstance()->ScheduleOnVizAndBlock(
       base::BindOnce(&HardwareRendererViz::InitializeOnViz,
diff --git a/android_webview/browser/gfx/output_surface_provider_webview.cc b/android_webview/browser/gfx/output_surface_provider_webview.cc
index 22c42ad..12555ab 100644
--- a/android_webview/browser/gfx/output_surface_provider_webview.cc
+++ b/android_webview/browser/gfx/output_surface_provider_webview.cc
@@ -90,17 +90,9 @@
   // Webview does not own the surface so should not clear it.
   renderer_settings_.should_clear_root_render_pass = false;
 
-  renderer_settings_.use_skia_renderer = features::IsUsingSkiaRenderer();
-  LOG_IF(FATAL, !renderer_settings_.use_skia_renderer)
-      << "WebView requires skia renderer";
-
   enable_vulkan_ = features::IsUsingVulkan();
   DCHECK(!enable_vulkan_ || vulkan_context_provider_);
 
-  LOG_IF(FATAL, enable_vulkan_ && !renderer_settings_.use_skia_renderer)
-      << "--webview-enable-vulkan only works with skia renderer "
-         "(--enable-features=UseSkiaRenderer).";
-
   auto* command_line = base::CommandLine::ForCurrentProcess();
   debug_settings_.tint_composited_content =
       command_line->HasSwitch(switches::kTintCompositedContent);
diff --git a/android_webview/browser/gfx/scoped_app_gl_state_restore_impl.cc b/android_webview/browser/gfx/scoped_app_gl_state_restore_impl.cc
index 002c6f9c..99261ff 100644
--- a/android_webview/browser/gfx/scoped_app_gl_state_restore_impl.cc
+++ b/android_webview/browser/gfx/scoped_app_gl_state_restore_impl.cc
@@ -92,7 +92,6 @@
 bool g_supports_arm_shader_framebuffer_fetch = false;
 bool g_supports_nv_concervative_raster = false;
 bool g_supports_disable_multisample = false;
-bool g_use_skia_renderer = false;
 
 }  // namespace
 
@@ -166,7 +165,6 @@
       g_supports_disable_multisample =
           extensions.contains("GL_EXT_multisample_compatibility");
     }
-    g_use_skia_renderer = features::IsUsingSkiaRenderer();
   }
 
   SaveHWUIState(save_restore);
@@ -183,21 +181,16 @@
 }
 
 void ScopedAppGLStateRestoreImpl::SaveHWUIState(bool save_restore) {
-  if (g_use_skia_renderer) {
-    if (g_supports_arm_shader_framebuffer_fetch)
-      glGetBooleanv(GL_FETCH_PER_SAMPLE_ARM, &fetch_per_sample_arm_enabled_);
+  if (g_supports_arm_shader_framebuffer_fetch)
+    glGetBooleanv(GL_FETCH_PER_SAMPLE_ARM, &fetch_per_sample_arm_enabled_);
 
-    if (g_supports_disable_multisample)
-      glGetBooleanv(GL_MULTISAMPLE, &multisample_enabled_);
-  }
+  if (g_supports_disable_multisample)
+    glGetBooleanv(GL_MULTISAMPLE, &multisample_enabled_);
 
-  if (g_use_skia_renderer || save_restore) {
-    vertex_attrib_.resize(g_gl_max_vertex_attribs);
-    for (GLint i = 0; i < g_gl_max_vertex_attribs; ++i) {
-      glGetVertexAttribiv(
-          i, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING,
-          &vertex_attrib_[i].vertex_attrib_array_buffer_binding);
-    }
+  vertex_attrib_.resize(g_gl_max_vertex_attribs);
+  for (GLint i = 0; i < g_gl_max_vertex_attribs; ++i) {
+    glGetVertexAttribiv(i, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING,
+                        &vertex_attrib_[i].vertex_attrib_array_buffer_binding);
   }
 
   if (!save_restore)
@@ -304,26 +297,24 @@
   // to default state for this reason. This code is currently conservative;
   // it's likely that not all android versions needs all of these states
   // restored.
-  if (g_use_skia_renderer) {
-    if (gl::g_current_gl_driver->fn.glWindowRectanglesEXTFn)
-      glWindowRectanglesEXT(GL_EXCLUSIVE_EXT, 0, nullptr);
+  if (gl::g_current_gl_driver->fn.glWindowRectanglesEXTFn)
+    glWindowRectanglesEXT(GL_EXCLUSIVE_EXT, 0, nullptr);
 
-    if (gl::g_current_gl_driver->fn.glCoverageModulationNVFn)
-      glCoverageModulationNV(GL_NONE);
+  if (gl::g_current_gl_driver->fn.glCoverageModulationNVFn)
+    glCoverageModulationNV(GL_NONE);
 
-    if (g_supports_arm_shader_framebuffer_fetch)
-      GLEnableDisable(GL_FETCH_PER_SAMPLE_ARM, fetch_per_sample_arm_enabled_);
+  if (g_supports_arm_shader_framebuffer_fetch)
+    GLEnableDisable(GL_FETCH_PER_SAMPLE_ARM, fetch_per_sample_arm_enabled_);
 
-    if (g_supports_disable_multisample)
-      GLEnableDisable(GL_MULTISAMPLE, multisample_enabled_);
+  if (g_supports_disable_multisample)
+    GLEnableDisable(GL_MULTISAMPLE, multisample_enabled_);
 
-    // We do restore it even with Skia on the other side because it's new
-    // extension that skia on Android P and Q didn't use.
-    if (g_supports_nv_concervative_raster)
-      glDisable(GL_CONSERVATIVE_RASTERIZATION_NV);
-  }
+  // We do restore it even with Skia on the other side because it's new
+  // extension that skia on Android P and Q didn't use.
+  if (g_supports_nv_concervative_raster)
+    glDisable(GL_CONSERVATIVE_RASTERIZATION_NV);
 
-  if (g_use_skia_renderer && !save_restore) {
+  if (!save_restore) {
     if (gl::g_current_gl_driver->fn.glVertexAttribDivisorANGLEFn) {
       for (GLint i = 0; i < g_gl_max_vertex_attribs; ++i) {
         glBindBuffer(GL_ARRAY_BUFFER,
@@ -362,8 +353,7 @@
     // below) Android versions and HWUI there doesn't use the state, while
     // SkiaRenderer does, so we just reset it to default value.
     // Note despite the name function is no ANGLE specific.
-    if (g_use_skia_renderer &&
-        gl::g_current_gl_driver->fn.glVertexAttribDivisorANGLEFn) {
+    if (gl::g_current_gl_driver->fn.glVertexAttribDivisorANGLEFn) {
       glVertexAttribDivisorANGLE(i, 0);
     }
 
@@ -387,7 +377,7 @@
     glBindTexture(GL_TEXTURE_EXTERNAL_OES, bindings.texture_external_oes);
 
     // reset glSamplers if supported.
-    if (g_use_skia_renderer && gl::g_current_gl_driver->fn.glBindSamplerFn)
+    if (gl::g_current_gl_driver->fn.glBindSamplerFn)
       glBindSampler(ii, 0);
   }
   glActiveTexture(active_texture_);
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/devui/CrashesListFragmentTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/devui/CrashesListFragmentTest.java
index 4c9dca5..8d79892 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/devui/CrashesListFragmentTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/devui/CrashesListFragmentTest.java
@@ -70,8 +70,8 @@
 import org.chromium.android_webview.devui.MainActivity;
 import org.chromium.android_webview.devui.R;
 import org.chromium.android_webview.devui.WebViewPackageError;
+import org.chromium.android_webview.nonembedded_util.WebViewPackageHelper;
 import org.chromium.android_webview.devui.util.CrashBugUrlFactory;
-import org.chromium.android_webview.devui.util.WebViewPackageHelper;
 import org.chromium.android_webview.test.AwJUnit4ClassRunner;
 import org.chromium.base.Callback;
 import org.chromium.base.ContextUtils;
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/devui/HomeFragmentTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/devui/HomeFragmentTest.java
index 23a40f0..5a0e3e9 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/devui/HomeFragmentTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/devui/HomeFragmentTest.java
@@ -46,7 +46,7 @@
 import org.chromium.android_webview.devui.MainActivity;
 import org.chromium.android_webview.devui.R;
 import org.chromium.android_webview.devui.WebViewPackageError;
-import org.chromium.android_webview.devui.util.WebViewPackageHelper;
+import org.chromium.android_webview.nonembedded_util.WebViewPackageHelper;
 import org.chromium.android_webview.test.AwJUnit4ClassRunner;
 import org.chromium.base.test.BaseActivityTestRule;
 import org.chromium.base.test.util.Batch;
diff --git a/android_webview/lib/aw_main_delegate.cc b/android_webview/lib/aw_main_delegate.cc
index 7ec6c518..cdd9ff79 100644
--- a/android_webview/lib/aw_main_delegate.cc
+++ b/android_webview/lib/aw_main_delegate.cc
@@ -225,9 +225,6 @@
     features.DisableIfNotSet(::features::kWebPayments);
     features.DisableIfNotSet(::features::kServiceWorkerPaymentApps);
 
-    // WebView requires SkiaRenderer.
-    features.EnableIfNotSet(::features::kUseSkiaRenderer);
-
     // WebView does not support overlay fullscreen yet for video overlays.
     features.DisableIfNotSet(media::kOverlayFullscreenVideo);
 
diff --git a/android_webview/nonembedded/BUILD.gn b/android_webview/nonembedded/BUILD.gn
index 338deaad..94ce38fb 100644
--- a/android_webview/nonembedded/BUILD.gn
+++ b/android_webview/nonembedded/BUILD.gn
@@ -32,6 +32,7 @@
   deps = [
     ":devui_java",
     ":services_java",
+    ":util_java",
     "//android_webview:android_webview_product_config_java",
     "//android_webview:common_aidl_java",
     "//android_webview:common_crash_java",
@@ -75,12 +76,12 @@
     "java/src/org/chromium/android_webview/devui/util/UploadedCrashesInfoLoader.java",
     "java/src/org/chromium/android_webview/devui/util/WebViewCrashInfoCollector.java",
     "java/src/org/chromium/android_webview/devui/util/WebViewCrashLogParser.java",
-    "java/src/org/chromium/android_webview/devui/util/WebViewPackageHelper.java",
   ]
   deps = [
     ":devui_resources",
     ":services_java",
     ":system_webview_manifest",
+    ":util_java",
     "//android_webview:common_aidl_java",
     "//android_webview:common_crash_java",
     "//android_webview:common_java",
@@ -141,6 +142,11 @@
   resources_package = "org.chromium.android_webview.devui"
 }
 
+android_library("util_java") {
+  sources = [ "java/src/org/chromium/android_webview/nonembedded_util/WebViewPackageHelper.java" ]
+  deps = [ "//third_party/androidx:androidx_annotation_annotation_java" ]
+}
+
 source_set("nonembedded") {
   sources = [
     "component_updater/aw_component_installer_policy.cc",
diff --git a/android_webview/nonembedded/java/src/org/chromium/android_webview/devui/HomeFragment.java b/android_webview/nonembedded/java/src/org/chromium/android_webview/devui/HomeFragment.java
index 4a19bbd..f0c71ad 100644
--- a/android_webview/nonembedded/java/src/org/chromium/android_webview/devui/HomeFragment.java
+++ b/android_webview/nonembedded/java/src/org/chromium/android_webview/devui/HomeFragment.java
@@ -17,7 +17,7 @@
 import android.widget.ListView;
 import android.widget.TextView;
 
-import org.chromium.android_webview.devui.util.WebViewPackageHelper;
+import org.chromium.android_webview.nonembedded_util.WebViewPackageHelper;
 import org.chromium.ui.widget.Toast;
 
 import java.util.ArrayList;
diff --git a/android_webview/nonembedded/java/src/org/chromium/android_webview/devui/WebViewPackageError.java b/android_webview/nonembedded/java/src/org/chromium/android_webview/devui/WebViewPackageError.java
index ac9cbbf7d..492c4e5 100644
--- a/android_webview/nonembedded/java/src/org/chromium/android_webview/devui/WebViewPackageError.java
+++ b/android_webview/nonembedded/java/src/org/chromium/android_webview/devui/WebViewPackageError.java
@@ -13,7 +13,7 @@
 import android.os.Build;
 import android.provider.Settings;
 
-import org.chromium.android_webview.devui.util.WebViewPackageHelper;
+import org.chromium.android_webview.nonembedded_util.WebViewPackageHelper;
 import org.chromium.base.Log;
 
 import java.util.List;
diff --git a/android_webview/nonembedded/java/src/org/chromium/android_webview/devui/util/CrashBugUrlFactory.java b/android_webview/nonembedded/java/src/org/chromium/android_webview/devui/util/CrashBugUrlFactory.java
index b956659..bcfdbf6 100644
--- a/android_webview/nonembedded/java/src/org/chromium/android_webview/devui/util/CrashBugUrlFactory.java
+++ b/android_webview/nonembedded/java/src/org/chromium/android_webview/devui/util/CrashBugUrlFactory.java
@@ -12,6 +12,7 @@
 import androidx.annotation.VisibleForTesting;
 
 import org.chromium.android_webview.common.crash.CrashInfo;
+import org.chromium.android_webview.nonembedded_util.WebViewPackageHelper;
 import org.chromium.base.ContextUtils;
 
 import java.util.Locale;
diff --git a/android_webview/nonembedded/java/src/org/chromium/android_webview/nonembedded/WebViewApkApplication.java b/android_webview/nonembedded/java/src/org/chromium/android_webview/nonembedded/WebViewApkApplication.java
index ea86a7d..146c9a8 100644
--- a/android_webview/nonembedded/java/src/org/chromium/android_webview/nonembedded/WebViewApkApplication.java
+++ b/android_webview/nonembedded/java/src/org/chromium/android_webview/nonembedded/WebViewApkApplication.java
@@ -17,7 +17,7 @@
 import org.chromium.android_webview.common.CommandLineUtil;
 import org.chromium.android_webview.common.PlatformServiceBridge;
 import org.chromium.android_webview.common.SafeModeController;
-import org.chromium.android_webview.devui.util.WebViewPackageHelper;
+import org.chromium.android_webview.nonembedded_util.WebViewPackageHelper;
 import org.chromium.base.ContextUtils;
 import org.chromium.base.Log;
 import org.chromium.base.PathUtils;
diff --git a/android_webview/nonembedded/java/src/org/chromium/android_webview/devui/util/WebViewPackageHelper.java b/android_webview/nonembedded/java/src/org/chromium/android_webview/nonembedded_util/WebViewPackageHelper.java
similarity index 98%
rename from android_webview/nonembedded/java/src/org/chromium/android_webview/devui/util/WebViewPackageHelper.java
rename to android_webview/nonembedded/java/src/org/chromium/android_webview/nonembedded_util/WebViewPackageHelper.java
index bbf7c5f..f4cac213 100644
--- a/android_webview/nonembedded/java/src/org/chromium/android_webview/devui/util/WebViewPackageHelper.java
+++ b/android_webview/nonembedded/java/src/org/chromium/android_webview/nonembedded_util/WebViewPackageHelper.java
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-package org.chromium.android_webview.devui.util;
+package org.chromium.android_webview.nonembedded_util;
 
 import android.annotation.SuppressLint;
 import android.content.Context;
diff --git a/android_webview/test/BUILD.gn b/android_webview/test/BUILD.gn
index 99d0368..540fc16 100644
--- a/android_webview/test/BUILD.gn
+++ b/android_webview/test/BUILD.gn
@@ -243,6 +243,7 @@
     "//android_webview/js_sandbox:js_sandbox_java",
     "//android_webview/nonembedded:devui_java",
     "//android_webview/nonembedded:services_java",
+    "//android_webview/nonembedded:util_java",
     "//android_webview/proto:aw_variations_seed_proto_java",
     "//android_webview/proto:metrics_bridge_records_proto_java",
     "//android_webview/test/embedded_test_server:aw_net_java_test_support",
diff --git a/ash/BUILD.gn b/ash/BUILD.gn
index 9e0956bc..2b9d3c2 100644
--- a/ash/BUILD.gn
+++ b/ash/BUILD.gn
@@ -1900,6 +1900,8 @@
     "wm/gestures/back_gesture/back_gesture_event_handler.h",
     "wm/gestures/back_gesture/back_gesture_metrics.cc",
     "wm/gestures/back_gesture/back_gesture_metrics.h",
+    "wm/gestures/back_gesture/back_gesture_util.cc",
+    "wm/gestures/back_gesture/back_gesture_util.h",
     "wm/gestures/wm_fling_handler.cc",
     "wm/gestures/wm_fling_handler.h",
     "wm/gestures/wm_gesture_handler.cc",
diff --git a/ash/accessibility/dictation_nudge_controller_unittest.cc b/ash/accessibility/dictation_nudge_controller_unittest.cc
index 96f7394..eebd5a2 100644
--- a/ash/accessibility/dictation_nudge_controller_unittest.cc
+++ b/ash/accessibility/dictation_nudge_controller_unittest.cc
@@ -16,51 +16,13 @@
 #include "ui/compositor/layer.h"
 #include "ui/compositor/layer_animator.h"
 #include "ui/compositor/scoped_animation_duration_scale_mode.h"
+#include "ui/views/test/widget_test.h"
 #include "ui/views/widget/widget.h"
 #include "ui/views/widget/widget_observer.h"
 
 using ::testing::HasSubstr;
 
 namespace ash {
-namespace {
-
-class NudgeWigetObserver : public views::WidgetObserver {
- public:
-  NudgeWigetObserver(views::Widget* widget) : widget_(widget) {
-    if (!widget_)
-      return;
-
-    widget_->AddObserver(this);
-  }
-
-  ~NudgeWigetObserver() override { CleanupWidget(); }
-
-  void WaitForClose() {
-    if (!widget_)
-      return;
-    run_loop_ = std::make_unique<base::RunLoop>();
-    run_loop_->Run();
-  }
-
-  // views::WidgetObserver:
-  void OnWidgetClosing(views::Widget* widget) override {
-    CleanupWidget();
-    if (run_loop_)
-      run_loop_->Quit();
-  }
-
-  void CleanupWidget() {
-    if (!widget_)
-      return;
-    widget_->RemoveObserver(this);
-    widget_ = nullptr;
-  }
-
- private:
-  views::Widget* widget_;
-  std::unique_ptr<base::RunLoop> run_loop_;
-};
-}  // namespace
 
 // Tests for showing the Dictation Nudge from AccessibilityControllerImpl.
 class DictationNudgeControllerTest : public AshTestBase {
@@ -96,8 +58,8 @@
     return nudge->CreateLabelView();
   }
 
-  void WaitForWidgetClose(DictationNudgeController* controller,
-                          SystemNudge* nudge) {
+  void WaitForWidgetDestruction(DictationNudgeController* controller,
+                                SystemNudge* nudge) {
     views::Widget* nudge_widget = nudge->widget();
     ASSERT_TRUE(nudge_widget);
     EXPECT_FALSE(nudge_widget->IsClosed());
@@ -107,12 +69,12 @@
         ui::ScopedAnimationDurationScaleMode::SLOW_DURATION);
 
     // Pretend the hide nudge timer has elapsed.
-    NudgeWigetObserver widget_close_observer(nudge_widget);
+    views::test::WidgetDestroyedWaiter widget_destroyed_waiter(nudge_widget);
     controller->FireHideNudgeTimerForTesting();
 
     EXPECT_TRUE(nudge_widget->GetLayer()->GetAnimator()->is_animating());
 
-    widget_close_observer.WaitForClose();
+    widget_destroyed_waiter.Wait();
   }
 };
 
@@ -127,7 +89,7 @@
   SystemNudge* nudge = controller->GetSystemNudgeForTesting();
   ASSERT_TRUE(nudge);
 
-  WaitForWidgetClose(controller, nudge);
+  WaitForWidgetDestruction(controller, nudge);
 }
 
 TEST_F(DictationNudgeControllerTest, SetsLabelBasedOnApplicationLocale) {
@@ -156,7 +118,7 @@
     std::string text = base::UTF16ToUTF8(label->GetText());
     EXPECT_THAT(text, HasSubstr(testcase.label));
 
-    WaitForWidgetClose(controller, nudge);
+    WaitForWidgetDestruction(controller, nudge);
   }
 }
 
diff --git a/ash/clipboard/clipboard_history.cc b/ash/clipboard/clipboard_history.cc
index b82a462b..235b679 100644
--- a/ash/clipboard/clipboard_history.cc
+++ b/ash/clipboard/clipboard_history.cc
@@ -6,9 +6,13 @@
 
 #include "ash/clipboard/clipboard_history_util.h"
 #include "ash/clipboard/clipboard_nudge_controller.h"
+#include "ash/clipboard/scoped_clipboard_history_pause_impl.h"
 #include "base/bind.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/threading/sequenced_task_runner_handle.h"
+#include "ui/base/clipboard/clipboard.h"
+#include "ui/base/clipboard/clipboard_buffer.h"
+#include "ui/base/clipboard/clipboard_data.h"
 #include "ui/base/clipboard/clipboard_monitor.h"
 #include "ui/base/clipboard/clipboard_non_backed.h"
 #include "ui/base/data_transfer_policy/data_transfer_endpoint.h"
@@ -83,6 +87,7 @@
 
   auto removed = std::move(*iter);
   history_list_.erase(iter);
+  SyncClipboardToClipboardHistory();
   for (auto& observer : observers_)
     observer.OnClipboardHistoryItemRemoved(removed);
 }
@@ -94,17 +99,17 @@
   if (num_pause_ > 0)
     return;
 
+  // The clipboard may not exist in tests.
   auto* clipboard = ui::ClipboardNonBacked::GetForCurrentThread();
-  // Clipboard may not exist in tests.
   if (!clipboard)
     return;
 
   ui::DataTransferEndpoint data_dst(ui::EndpointType::kClipboardHistory);
   const auto* clipboard_data = clipboard->GetClipboardData(&data_dst);
   if (!clipboard_data) {
-    // `clipboard_data` is only empty when the Clipboard is cleared. This is
-    // done to prevent data leakage into or from locked forms(Locked Fullscreen
-    // state). Clear ClipboardHistory.
+    // `clipboard_data` is only empty when the clipboard is cleared. This is
+    // done to prevent data leakage into or from locked states (e.g., locked
+    // fullscreen). Clipboard history should also be cleared in this case.
     commit_data_weak_factory_.InvalidateWeakPtrs();
     Clear();
     return;
@@ -188,6 +193,32 @@
   return weak_factory_.GetWeakPtr();
 }
 
+void ClipboardHistory::SyncClipboardToClipboardHistory() {
+  // The clipboard may not exist in tests.
+  auto* clipboard = ui::ClipboardNonBacked::GetForCurrentThread();
+  if (!clipboard)
+    return;
+
+  ui::DataTransferEndpoint data_dst(ui::EndpointType::kClipboardHistory);
+  const auto* clipboard_data = clipboard->GetClipboardData(&data_dst);
+
+  // Only modify the clipboard if doing so would change its data, so as to avoid
+  // extraneous notifications to clipboard observers. If there is a change to
+  // make, pause clipboard history so that making the clipboard consistent with
+  // clipboard history does not cause clipboard history to update again.
+  ScopedClipboardHistoryPauseImpl scoped_pause(this);
+  if (history_list_.empty()) {
+    if (clipboard_data) {
+      static_cast<ui::Clipboard*>(clipboard)->Clear(
+          ui::ClipboardBuffer::kCopyPaste);
+    }
+  } else if (const auto& top_of_history_data = history_list_.front().data();
+             top_of_history_data != *clipboard_data) {
+    std::ignore = clipboard->WriteClipboardData(
+        std::make_unique<ui::ClipboardData>(top_of_history_data));
+  }
+}
+
 void ClipboardHistory::MaybeCommitData(ui::ClipboardData data) {
   if (!ClipboardHistoryUtil::IsSupported(data))
     return;
diff --git a/ash/clipboard/clipboard_history.h b/ash/clipboard/clipboard_history.h
index 78e7bd2..953e8956 100644
--- a/ash/clipboard/clipboard_history.h
+++ b/ash/clipboard/clipboard_history.h
@@ -72,6 +72,11 @@
   // `Resume()`.
   friend class ScopedClipboardHistoryPauseImpl;
 
+  // Ensures that the clipboard buffer contains the same data as the item at the
+  // top of clipboard history. If clipboard history is empty, then the clipboard
+  // is cleared.
+  void SyncClipboardToClipboardHistory();
+
   // Adds `data` to the top of the history list if `data` is supported by
   // clipboard history. If `data` is not supported, this method no-ops. If
   // `data` is already in the history list, `data` will be moved to the top of
diff --git a/ash/shelf/shelf_view.cc b/ash/shelf/shelf_view.cc
index 674c796..50b4b612 100644
--- a/ash/shelf/shelf_view.cc
+++ b/ash/shelf/shelf_view.cc
@@ -1917,7 +1917,19 @@
   if (ShelfItemForView(&source) || !context_menu)
     return source.GetBoundsInScreen();
 
-  const gfx::Rect shelf_bounds_in_screen = GetBoundsInScreen();
+  gfx::Rect shelf_bounds_in_screen;
+  if (ShelfConfig::Get()->is_in_app() && IsTabletModeEnabled()) {
+    // Use the shelf widget background as the menu anchor point in tablet mode
+    // and in app.
+    ShelfWidget* shelf_widget = shelf_->shelf_widget();
+    shelf_bounds_in_screen = shelf_widget->GetOpaqueBackground()->bounds();
+    const gfx::Rect widget_bounds =
+        shelf_widget->GetRootView()->GetBoundsInScreen();
+    shelf_bounds_in_screen.Offset(widget_bounds.x(), widget_bounds.y());
+  } else {
+    shelf_bounds_in_screen = GetBoundsInScreen();
+  }
+
   gfx::Point origin;
   switch (shelf_->alignment()) {
     case ShelfAlignment::kBottom:
diff --git a/ash/system/time/calendar_view.cc b/ash/system/time/calendar_view.cc
index e844d71..0c9c0ef 100644
--- a/ash/system/time/calendar_view.cc
+++ b/ash/system/time/calendar_view.cc
@@ -21,6 +21,7 @@
 #include "ash/system/tray/tri_view.h"
 #include "base/bind.h"
 #include "base/check.h"
+#include "base/memory/weak_ptr.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/time/time.h"
 #include "components/vector_icons/vector_icons.h"
@@ -28,6 +29,7 @@
 #include "ui/base/metadata/metadata_impl_macros.h"
 #include "ui/compositor/animation_throughput_reporter.h"
 #include "ui/compositor/layer.h"
+#include "ui/compositor/layer_animator.h"
 #include "ui/events/types/event_type.h"
 #include "ui/gfx/animation/tween.h"
 #include "ui/gfx/geometry/point.h"
@@ -440,8 +442,16 @@
   // dependency from `CalendarViewController`, since these views are destructed
   // after the controller.
   if (event_list_view_) {
-    RemoveChildViewT(event_list_view_);
-    event_list_view_ = nullptr;
+    // If the `event_list_view_` close animation is running, stop the animation
+    // and let the callback handle the removal.
+    ui::LayerAnimator* event_list_view_animator =
+        event_list_view_->layer()->GetAnimator();
+    if (event_list_view_animator->is_animating()) {
+      event_list_view_animator->StopAnimating();
+    } else {
+      RemoveChildViewT(event_list_view_);
+      event_list_view_ = nullptr;
+    }
   }
   content_view_->RemoveAllChildViews();
 }
@@ -1499,7 +1509,10 @@
 }
 
 void CalendarView::OnCloseEventListAnimationComplete() {
-  auto* focused_view = GetFocusManager()->GetFocusedView();
+  // GetFocusManager() can be nullptr if `CalendarView` is destroyed when the
+  // closing animation hasn't finished.
+  auto* focused_view =
+      GetFocusManager() ? GetFocusManager()->GetFocusedView() : nullptr;
   const bool was_focused = focused_view && Contains(focused_view);
 
   RemoveChildViewT(event_list_view_);
diff --git a/ash/webui/os_feedback_ui/resources/confirmation_page.html b/ash/webui/os_feedback_ui/resources/confirmation_page.html
index 8c1f7ff..47a7861 100644
--- a/ash/webui/os_feedback_ui/resources/confirmation_page.html
+++ b/ash/webui/os_feedback_ui/resources/confirmation_page.html
@@ -41,6 +41,7 @@
         on-click="handleBackButtonClicked_">
       <span>Send new report</span>
     </cr-button>
-    <cr-button id="buttonDone" class="cancel-button">Done</cr-button>
+    <cr-button id="buttonDone" class="cancel-button"
+      on-click="handleDoneButtonClicked_">Done</cr-button>
   </div>
 </div>
diff --git a/ash/webui/os_feedback_ui/resources/confirmation_page.js b/ash/webui/os_feedback_ui/resources/confirmation_page.js
index cc2967b..c24b73b 100644
--- a/ash/webui/os_feedback_ui/resources/confirmation_page.js
+++ b/ash/webui/os_feedback_ui/resources/confirmation_page.js
@@ -92,6 +92,14 @@
       detail: {currentState: FeedbackFlowState.CONFIRMATION}
     }));
   }
+
+  /**
+   * Close the app when user clicks the done button.
+   * @protected
+   */
+  handleDoneButtonClicked_() {
+    window.close();
+  }
 }
 
 customElements.define(ConfirmationPageElement.is, ConfirmationPageElement);
diff --git a/ash/webui/personalization_app/resources/trusted/user/avatar_camera_element.html b/ash/webui/personalization_app/resources/trusted/user/avatar_camera_element.html
index 317b1952..bd13cdd2 100644
--- a/ash/webui/personalization_app/resources/trusted/user/avatar_camera_element.html
+++ b/ash/webui/personalization_app/resources/trusted/user/avatar_camera_element.html
@@ -6,6 +6,7 @@
 
   div[slot='body'] {
     height: 255px;
+    overflow: hidden;
     position: relative;
   }
 
diff --git a/ash/wm/gestures/back_gesture/back_gesture_affordance.cc b/ash/wm/gestures/back_gesture/back_gesture_affordance.cc
index 2c90294..c8aeea51 100644
--- a/ash/wm/gestures/back_gesture/back_gesture_affordance.cc
+++ b/ash/wm/gestures/back_gesture/back_gesture_affordance.cc
@@ -10,6 +10,7 @@
 #include "ash/style/ash_color_provider.h"
 #include "ash/style/default_color_constants.h"
 #include "ash/style/default_colors.h"
+#include "ash/wm/gestures/back_gesture/back_gesture_util.h"
 #include "ash/wm/splitview/split_view_controller.h"
 #include "ash/wm/splitview/split_view_divider.h"
 #include "ash/wm/window_util.h"
@@ -46,9 +47,9 @@
 constexpr int kArrowSize = 20;
 constexpr int kBackgroundRadius = 20;
 
-// The background shadow for the circle. TODO(michelefan@): Clean up the shadows
-// after the `chromeos::features::IsDarkLightModeEnabled()` is enabled by
-// default.
+// The background shadow for the circle.
+// TODO(michelefan@): Clean up the shadows after the
+// `chromeos::features::IsDarkLightModeEnabled()` is enabled by default.
 constexpr int kBackNudgeShadowOffsetY1 = 1;
 constexpr int kBackNudgeShadowBlurRadius1 = 2;
 constexpr SkColor kBackNudgeShadowColor1 = SkColorSetA(SK_ColorBLACK, 0x4D);
@@ -156,35 +157,9 @@
         x_offset_ >= kDistanceForFullRadius ||
         state_ == BackGestureAffordance::State::COMPLETING;
 
-    if (chromeos::features::IsDarkLightModeEnabled()) {
+    if (chromeos::features::IsDarkLightModeEnabled())
       // Draw highlight border circles.
-      AshColorProvider* color_provider = AshColorProvider::Get();
-      const SkColor inner_color = color_provider->GetControlsLayerColor(
-          AshColorProvider::ControlsLayerType::kHighlightColor1);
-      const SkColor outer_color = color_provider->GetControlsLayerColor(
-          AshColorProvider::ControlsLayerType::kBorderColor1);
-
-      gfx::ScopedCanvas scoped_canvas(canvas);
-      const float dsf = canvas->UndoDeviceScaleFactor();
-      const float scaled_corner_radius = dsf * kBackgroundRadius;
-      gfx::PointF circle_center = center_point;
-      circle_center.Scale(dsf);
-
-      cc::PaintFlags hb_flags;
-      hb_flags.setStrokeWidth(views::kHighlightBorderThickness);
-      hb_flags.setColor(outer_color);
-      hb_flags.setStyle(cc::PaintFlags::kStroke_Style);
-      hb_flags.setAntiAlias(true);
-      canvas->DrawCircle(
-          circle_center,
-          scaled_corner_radius + 1.5 * views::kHighlightBorderThickness,
-          hb_flags);
-      hb_flags.setColor(inner_color);
-      canvas->DrawCircle(
-          circle_center,
-          scaled_corner_radius + views::kHighlightBorderThickness / 2.f,
-          hb_flags);
-    }
+      DrawCircleHighlightBorder(canvas, center_point, kBackgroundRadius);
 
     // Draw the arrow background circle.
     cc::PaintFlags bg_flags;
diff --git a/ash/wm/gestures/back_gesture/back_gesture_contextual_nudge.cc b/ash/wm/gestures/back_gesture/back_gesture_contextual_nudge.cc
index c8bc1e5..2c62b4e 100644
--- a/ash/wm/gestures/back_gesture/back_gesture_contextual_nudge.cc
+++ b/ash/wm/gestures/back_gesture/back_gesture_contextual_nudge.cc
@@ -12,6 +12,7 @@
 #include "ash/style/ash_color_provider.h"
 #include "ash/style/default_color_constants.h"
 #include "ash/style/default_colors.h"
+#include "ash/wm/gestures/back_gesture/back_gesture_util.h"
 #include "base/callback.h"
 #include "base/i18n/rtl.h"
 #include "base/timer/timer.h"
@@ -52,6 +53,8 @@
 constexpr int kLabelTopBottomInset = 6;
 
 // Shadow values for the back nudge circle.
+// TODO (michelefan@): remove the shadow for the back gesture nudge after D/L
+// flag is enabled by default.
 constexpr int kBackNudgeShadowOffsetY1 = 1;
 constexpr int kBackNudgeShadowBlurRadius1 = 2;
 constexpr SkColor kBackNudgeShadowColor1 = SkColorSetA(SK_ColorBLACK, 0x4D);
@@ -249,24 +252,33 @@
       circle_flags.setStyle(cc::PaintFlags::kFill_Style);
       circle_flags.setColor(DeprecatedGetBaseLayerColor(
           AshColorProvider::BaseLayerType::kOpaque, kCircleColor));
-      gfx::ShadowValues shadows;
-      shadows.push_back(gfx::ShadowValue(
-          gfx::Vector2d(0, kBackNudgeShadowOffsetY1),
-          kBackNudgeShadowBlurRadius1, kBackNudgeShadowColor1));
-      shadows.push_back(gfx::ShadowValue(
-          gfx::Vector2d(0, kBackNudgeShadowOffsetY2),
-          kBackNudgeShadowBlurRadius2, kBackNudgeShadowColor2));
-      circle_flags.setLooper(gfx::CreateShadowDrawLooper(shadows));
+
+      if (!chromeos::features::IsDarkLightModeEnabled()) {
+        gfx::ShadowValues shadows;
+        shadows.push_back(gfx::ShadowValue(
+            gfx::Vector2d(0, kBackNudgeShadowOffsetY1),
+            kBackNudgeShadowBlurRadius1, kBackNudgeShadowColor1));
+        shadows.push_back(gfx::ShadowValue(
+            gfx::Vector2d(0, kBackNudgeShadowOffsetY2),
+            kBackNudgeShadowBlurRadius2, kBackNudgeShadowColor2));
+        circle_flags.setLooper(gfx::CreateShadowDrawLooper(shadows));
+      }
+
+      gfx::PointF center_point;
       if (base::i18n::IsRTL()) {
         const gfx::Point right_center = GetLocalBounds().right_center();
-        canvas->DrawCircle(
-            gfx::Point(right_center.x() - kCircleRadius, right_center.y()),
-            kCircleRadius, circle_flags);
+        center_point =
+            gfx::PointF(right_center.x() - kCircleRadius, right_center.y());
       } else {
         const gfx::Point left_center = GetLocalBounds().left_center();
-        canvas->DrawCircle(
-            gfx::Point(left_center.x() + kCircleRadius, left_center.y()),
-            kCircleRadius, circle_flags);
+        center_point =
+            gfx::PointF(left_center.x() + kCircleRadius, left_center.y());
+      }
+      canvas->DrawCircle(center_point, kCircleRadius, circle_flags);
+
+      if (chromeos::features::IsDarkLightModeEnabled()) {
+        // Draw highlight border circles for the affordance.
+        DrawCircleHighlightBorder(canvas, center_point, kCircleRadius);
       }
 
       // Draw the black round rectangle around the text.
@@ -279,6 +291,11 @@
       label_bounds.Inset(
           gfx::Insets::VH(-kLabelTopBottomInset, -kLabelCornerRadius));
       canvas->DrawRoundRect(label_bounds, kLabelCornerRadius, round_rect_flags);
+
+      if (chromeos::features::IsDarkLightModeEnabled()) {
+        // Draw highlight border for the black round rectangle around the text.
+        DrawRoundRectHighlightBorder(canvas, label_bounds, kLabelCornerRadius);
+      }
     }
 
     // ui::ImplicitAnimationObserver:
diff --git a/ash/wm/gestures/back_gesture/back_gesture_util.cc b/ash/wm/gestures/back_gesture/back_gesture_util.cc
new file mode 100644
index 0000000..5ae3e463
--- /dev/null
+++ b/ash/wm/gestures/back_gesture/back_gesture_util.cc
@@ -0,0 +1,86 @@
+// Copyright 2022 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 "ash/wm/gestures/back_gesture/back_gesture_util.h"
+
+#include "ash/style/ash_color_provider.h"
+#include "ui/gfx/geometry/rect.h"
+#include "ui/gfx/scoped_canvas.h"
+#include "ui/views/highlight_border.h"
+
+namespace ash {
+
+namespace {
+
+constexpr float kOuterHightlightBorderThickness =
+    1.5 * views::kHighlightBorderThickness;
+constexpr float kInnerHightlightBorderThickness =
+    views::kHighlightBorderThickness / 2.f;
+
+SkColor GetHighlightBorderInnerColor() {
+  return AshColorProvider::Get()->GetControlsLayerColor(
+      AshColorProvider::ControlsLayerType::kHighlightColor1);
+}
+
+SkColor GetHighlightBorderOuterColor() {
+  return AshColorProvider::Get()->GetControlsLayerColor(
+      AshColorProvider::ControlsLayerType::kBorderColor1);
+}
+
+cc::PaintFlags GetHighlightBorderPaintFlags() {
+  cc::PaintFlags hb_flags;
+  hb_flags.setStrokeWidth(views::kHighlightBorderThickness);
+  hb_flags.setStyle(cc::PaintFlags::kStroke_Style);
+  hb_flags.setAntiAlias(true);
+  return hb_flags;
+}
+
+}  // namespace
+
+void DrawCircleHighlightBorder(gfx::Canvas* canvas,
+                               const gfx::PointF& circle_center,
+                               int radius) {
+  gfx::ScopedCanvas scoped_canvas(canvas);
+  // Scale bounds and corner radius with device scale factor to make sure
+  // border bounds match content bounds but keep border stroke width the same.
+  const float dsf = canvas->UndoDeviceScaleFactor();
+  const float scaled_corner_radius = dsf * radius;
+  gfx::PointF scaled_circle_center = circle_center;
+  scaled_circle_center.Scale(dsf);
+  cc::PaintFlags hb_flags = GetHighlightBorderPaintFlags();
+
+  hb_flags.setColor(GetHighlightBorderOuterColor());
+  canvas->DrawCircle(scaled_circle_center,
+                     scaled_corner_radius + kOuterHightlightBorderThickness,
+                     hb_flags);
+  hb_flags.setColor(GetHighlightBorderInnerColor());
+  canvas->DrawCircle(scaled_circle_center,
+                     scaled_corner_radius + kInnerHightlightBorderThickness,
+                     hb_flags);
+}
+
+void DrawRoundRectHighlightBorder(gfx::Canvas* canvas,
+                                  const gfx::Rect& bounds,
+                                  int corner_radius) {
+  gfx::ScopedCanvas scoped_canvas(canvas);
+  const float dsf = canvas->UndoDeviceScaleFactor();
+  const float scaled_corner_radius = dsf * corner_radius;
+  auto scaled_outer_bounds = gfx::ScaleToEnclosingRect(bounds, dsf);
+  scaled_outer_bounds.Inset(-kOuterHightlightBorderThickness);
+  auto scaled_inner_bounds = gfx::ScaleToEnclosingRect(bounds, dsf);
+  scaled_inner_bounds.Inset(-kInnerHightlightBorderThickness);
+
+  cc::PaintFlags hb_flags = GetHighlightBorderPaintFlags();
+
+  hb_flags.setColor(GetHighlightBorderOuterColor());
+  canvas->DrawRoundRect(scaled_outer_bounds,
+                        scaled_corner_radius + kOuterHightlightBorderThickness,
+                        hb_flags);
+  hb_flags.setColor(GetHighlightBorderInnerColor());
+  canvas->DrawRoundRect(scaled_inner_bounds,
+                        scaled_corner_radius + kInnerHightlightBorderThickness,
+                        hb_flags);
+}
+
+}  // namespace ash
\ No newline at end of file
diff --git a/ash/wm/gestures/back_gesture/back_gesture_util.h b/ash/wm/gestures/back_gesture/back_gesture_util.h
new file mode 100644
index 0000000..7a6eadb1
--- /dev/null
+++ b/ash/wm/gestures/back_gesture/back_gesture_util.h
@@ -0,0 +1,30 @@
+// Copyright 2022 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 ASH_WM_GESTURES_BACK_GESTURE_BACK_GESTURE_UTIL_H_
+#define ASH_WM_GESTURES_BACK_GESTURE_BACK_GESTURE_UTIL_H_
+
+#include "cc/paint/paint_flags.h"
+
+namespace gfx {
+class Canvas;
+class PointF;
+class Rect;
+}  // namespace gfx
+
+namespace ash {
+
+// Paints the circular shaped highlight border onto `canvas`.
+void DrawCircleHighlightBorder(gfx::Canvas* canvas,
+                               const gfx::PointF& circle_center,
+                               int radius);
+
+// Paints the round rectangular shaped highlight border onto `canvas`.
+void DrawRoundRectHighlightBorder(gfx::Canvas* canvas,
+                                  const gfx::Rect& bounds,
+                                  int corner_radius);
+
+}  // namespace ash
+
+#endif  // ASH_WM_GESTURES_BACK_GESTURE_BACK_GESTURE_UTIL_H_
\ No newline at end of file
diff --git a/base/big_endian.cc b/base/big_endian.cc
index e114216..c4f4443 100644
--- a/base/big_endian.cc
+++ b/base/big_endian.cc
@@ -17,7 +17,10 @@
 }
 
 BigEndianReader::BigEndianReader(const uint8_t* buf, size_t len)
-    : ptr_(buf), end_(ptr_ + len) {}
+    : ptr_(buf), end_(ptr_ + len) {
+  // Ensure `len` does not cause `end_` to wrap around.
+  CHECK_GE(end_, ptr_);
+}
 
 BigEndianReader::BigEndianReader(base::span<const uint8_t> buf)
     : ptr_(buf.data()), end_(buf.data() + buf.size()) {}
@@ -102,12 +105,15 @@
 }
 
 BigEndianWriter::BigEndianWriter(char* buf, size_t len)
-    : ptr_(buf), end_(ptr_ + len) {}
+    : ptr_(buf), end_(ptr_ + len) {
+  // Ensure `len` does not cause `end_` to wrap around.
+  CHECK_GE(end_, ptr_);
+}
 
 bool BigEndianWriter::Skip(size_t len) {
   if (len > remaining())
     return false;
-  ptr_ += len;
+  ptr_ += static_cast<ptrdiff_t>(len);
   return true;
 }
 
@@ -115,7 +121,7 @@
   if (len > remaining())
     return false;
   memcpy(ptr_, buf, len);
-  ptr_ += len;
+  ptr_ += static_cast<ptrdiff_t>(len);
   return true;
 }
 
diff --git a/base/big_endian.h b/base/big_endian.h
index 9ee0589..e5229c4 100644
--- a/base/big_endian.h
+++ b/base/big_endian.h
@@ -60,7 +60,7 @@
 
 template <>
 inline void ReadBigEndian<int8_t>(const uint8_t buf[], int8_t* out) {
-  *out = buf[0];
+  *out = static_cast<int8_t>(buf[0]);
 }
 
 template <>
@@ -78,7 +78,7 @@
   explicit BigEndianReader(base::span<const uint8_t> buf);
 
   const uint8_t* ptr() const { return ptr_; }
-  size_t remaining() const { return end_ - ptr_; }
+  size_t remaining() const { return static_cast<size_t>(end_ - ptr_); }
 
   bool Skip(size_t len);
   bool ReadBytes(void* out, size_t len);
@@ -123,7 +123,7 @@
   BigEndianWriter(char* buf, size_t len);
 
   char* ptr() const { return ptr_; }
-  size_t remaining() const { return end_ - ptr_; }
+  size_t remaining() const { return static_cast<size_t>(end_ - ptr_); }
 
   bool Skip(size_t len);
   bool WriteBytes(const void* buf, size_t len);
diff --git a/base/command_line.cc b/base/command_line.cc
index db71b62f..9ea1c43 100644
--- a/base/command_line.cc
+++ b/base/command_line.cc
@@ -12,6 +12,7 @@
 #include "base/files/file_path.h"
 #include "base/logging.h"
 #include "base/notreached.h"
+#include "base/numerics/checked_math.h"
 #include "base/ranges/algorithm.h"
 #include "base/strings/strcat.h"
 #include "base/strings/string_piece.h"
@@ -362,7 +363,8 @@
   if (!value.empty())
     base::StrAppend(&combined_switch_string, {kSwitchValueSeparator, value});
   // Append the switch and update the switches/arguments divider |begin_args_|.
-  argv_.insert(argv_.begin() + begin_args_++, combined_switch_string);
+  argv_.insert(argv_.begin() + begin_args_, combined_switch_string);
+  begin_args_ = (CheckedNumeric(begin_args_) + 1).ValueOrDie();
 }
 
 void CommandLine::AppendSwitchASCII(StringPiece switch_string,
@@ -632,7 +634,7 @@
   DCHECK(!raw_command_line_string_.empty());
 
   // Remove any previously parsed arguments.
-  argv_.resize(begin_args_);
+  argv_.resize(static_cast<size_t>(begin_args_));
 
   // Locate "--single-argument" in the process's raw command line. Results are
   // unpredictable if "--single-argument" appears as part of a previous
diff --git a/base/command_line.h b/base/command_line.h
index 080f0b2..97d3a12 100644
--- a/base/command_line.h
+++ b/base/command_line.h
@@ -259,7 +259,7 @@
   SwitchMap switches_;
 
   // The index after the program and switches, any arguments start here.
-  size_t begin_args_;
+  ptrdiff_t begin_args_;
 };
 
 class BASE_EXPORT DuplicateSwitchHandler {
diff --git a/base/cpu.cc b/base/cpu.cc
index 17c201b..98280f4e 100644
--- a/base/cpu.cc
+++ b/base/cpu.cc
@@ -279,7 +279,7 @@
     // This is checking for any hypervisor. Hypervisors may choose not to
     // announce themselves. Hypervisors trap CPUID and sometimes return
     // different results to underlying hardware.
-    is_running_in_vm_ = (cpu_info[2] & 0x80000000) != 0;
+    is_running_in_vm_ = (static_cast<uint32_t>(cpu_info[2]) & 0x80000000) != 0;
 
     // AVX instructions will generate an illegal instruction exception unless
     //   a) they are supported by the CPU,
@@ -302,20 +302,21 @@
   }
 
   // Get the brand string of the cpu.
-  __cpuid(cpu_info, 0x80000000);
-  const int max_parameter = cpu_info[0];
+  __cpuid(cpu_info, static_cast<int>(0x80000000));
+  const uint32_t max_parameter = static_cast<uint32_t>(cpu_info[0]);
 
-  static constexpr int kParameterStart = 0x80000002;
-  static constexpr int kParameterEnd = 0x80000004;
-  static constexpr int kParameterSize = kParameterEnd - kParameterStart + 1;
+  static constexpr uint32_t kParameterStart = 0x80000002;
+  static constexpr uint32_t kParameterEnd = 0x80000004;
+  static constexpr uint32_t kParameterSize =
+      kParameterEnd - kParameterStart + 1;
   static_assert(kParameterSize * sizeof(cpu_info) + 1 == std::size(cpu_string),
                 "cpu_string has wrong size");
 
   if (max_parameter >= kParameterEnd) {
     size_t i = 0;
-    for (int parameter = kParameterStart; parameter <= kParameterEnd;
+    for (uint32_t parameter = kParameterStart; parameter <= kParameterEnd;
          ++parameter) {
-      __cpuid(cpu_info, parameter);
+      __cpuid(cpu_info, static_cast<int>(parameter));
       memcpy(&cpu_string[i], cpu_info, sizeof(cpu_info));
       i += sizeof(cpu_info);
     }
@@ -323,9 +324,11 @@
     cpu_brand_ = cpu_string;
   }
 
-  static constexpr int kParameterContainingNonStopTimeStampCounter = 0x80000007;
+  static constexpr uint32_t kParameterContainingNonStopTimeStampCounter =
+      0x80000007;
   if (max_parameter >= kParameterContainingNonStopTimeStampCounter) {
-    __cpuid(cpu_info, kParameterContainingNonStopTimeStampCounter);
+    __cpuid(cpu_info,
+            static_cast<int>(kParameterContainingNonStopTimeStampCounter));
     has_non_stop_time_stamp_counter_ = (cpu_info[3] & (1 << 8)) != 0;
   }
 
diff --git a/base/feature_list.cc b/base/feature_list.cc
index 99703f8..a4e2f47e1 100644
--- a/base/feature_list.cc
+++ b/base/feature_list.cc
@@ -67,17 +67,21 @@
 // followed by a base::Pickle object that contains the feature and trial name.
 struct FeatureEntry {
   // SHA1(FeatureEntry): Increment this if structure changes!
-  static constexpr uint32_t kPersistentTypeId = 0x06567CA6 + 1;
+  static constexpr uint32_t kPersistentTypeId = 0x06567CA6 + 2;
 
   // Expected size for 32/64-bit check.
-  static constexpr size_t kExpectedInstanceSize = 8;
+  static constexpr size_t kExpectedInstanceSize = 16;
 
   // Specifies whether a feature override enables or disables the feature. Same
   // values as the OverrideState enum in feature_list.h
   uint32_t override_state;
 
+  // On e.g. x86, alignof(uint64_t) is 4.  Ensure consistent size and alignment
+  // of `pickle_size` across platforms.
+  uint32_t padding;
+
   // Size of the pickled structure, NOT the total size of this entry.
-  uint32_t pickle_size;
+  uint64_t pickle_size;
 
   // Reads the feature and trial name from the pickle. Calling this is only
   // valid on an initialized entry that's in shared memory.
@@ -86,7 +90,7 @@
     const char* src =
         reinterpret_cast<const char*>(this) + sizeof(FeatureEntry);
 
-    Pickle pickle(src, pickle_size);
+    Pickle pickle(src, checked_cast<size_t>(pickle_size));
     PickleIterator pickle_iter(pickle);
 
     if (!pickle_iter.ReadStringPiece(feature_name))
diff --git a/base/logging.cc b/base/logging.cc
index 5f9eba0..6f43ef20 100644
--- a/base/logging.cc
+++ b/base/logging.cc
@@ -383,7 +383,7 @@
       // Give up, nothing we can do now.
       break;
     }
-    bytes_written += rv;
+    bytes_written += static_cast<size_t>(rv);
   }
 }
 
diff --git a/base/memory/raw_ptr.h b/base/memory/raw_ptr.h
index 76054e3..d418025d 100644
--- a/base/memory/raw_ptr.h
+++ b/base/memory/raw_ptr.h
@@ -104,7 +104,7 @@
     return wrapped_ptr;
   }
 
-  // Advance the wrapped pointer by |delta| bytes.
+  // Advance the wrapped pointer by `delta_elems`.
   template <typename T>
   static ALWAYS_INLINE T* Advance(T* wrapped_ptr, ptrdiff_t delta_elems) {
     return wrapped_ptr + delta_elems;
@@ -245,10 +245,10 @@
     return static_cast<To*>(wrapped_ptr);
   }
 
-  // Advance the wrapped pointer by |delta| bytes.
+  // Advance the wrapped pointer by `delta_elems`.
   template <typename T>
-  static ALWAYS_INLINE T* Advance(T* wrapped_ptr, ptrdiff_t delta_elem) {
-    return wrapped_ptr + delta_elem;
+  static ALWAYS_INLINE T* Advance(T* wrapped_ptr, ptrdiff_t delta_elems) {
+    return wrapped_ptr + delta_elems;
   }
 
   // Returns a copy of a wrapped pointer, without making an assertion
@@ -422,15 +422,15 @@
     return wrapped_ptr;
   }
 
-  // Advance the wrapped pointer by |delta| bytes.
+  // Advance the wrapped pointer by `delta_elems`.
   template <typename T>
-  static ALWAYS_INLINE T* Advance(T* wrapped_ptr, ptrdiff_t delta_elem) {
+  static ALWAYS_INLINE T* Advance(T* wrapped_ptr, ptrdiff_t delta_elems) {
 #if DCHECK_IS_ON() || BUILDFLAG(ENABLE_BACKUP_REF_PTR_SLOW_CHECKS)
     uintptr_t address = reinterpret_cast<uintptr_t>(wrapped_ptr);
     if (IsSupportedAndNotNull(address))
-      CHECK(IsValidDelta(address, delta_elem * sizeof(T)));
+      CHECK(IsValidDelta(address, delta_elems * sizeof(T)));
 #endif
-    T* new_wrapped_ptr = WrapRawPtr(wrapped_ptr + delta_elem);
+    T* new_wrapped_ptr = WrapRawPtr(wrapped_ptr + delta_elems);
     ReleaseWrappedPtr(wrapped_ptr);
     return new_wrapped_ptr;
   }
@@ -509,7 +509,7 @@
     return wrapped_ptr;
   }
 
-  // Advance the wrapped pointer by |delta| bytes.
+  // Advance the wrapped pointer by `delta_elems`.
   template <typename T>
   static ALWAYS_INLINE T* Advance(T* wrapped_ptr, ptrdiff_t delta_elems) {
     return wrapped_ptr + delta_elems;
diff --git a/base/numerics/checked_math.h b/base/numerics/checked_math.h
index a1d72b9..e291158d 100644
--- a/base/numerics/checked_math.h
+++ b/base/numerics/checked_math.h
@@ -270,6 +270,9 @@
   };
 };
 
+template <typename T>
+CheckedNumeric(T t) -> CheckedNumeric<T>;
+
 // Convenience functions to avoid the ugly template disambiguator syntax.
 template <typename Dst, typename Src>
 constexpr bool IsValidForType(const CheckedNumeric<Src> value) {
diff --git a/base/parameter_pack.h b/base/parameter_pack.h
index 36ec9d8..7e657d33 100644
--- a/base/parameter_pack.h
+++ b/base/parameter_pack.h
@@ -44,7 +44,7 @@
   return c;
 }
 
-constexpr size_t pack_npos = -1;
+constexpr size_t pack_npos = static_cast<size_t>(-1);
 
 template <typename... Ts>
 struct ParameterPack {
diff --git a/base/task/post_job.cc b/base/task/post_job.cc
index 936b1bc..a1d685f 100644
--- a/base/task/post_job.cc
+++ b/base/task/post_job.cc
@@ -12,6 +12,29 @@
 
 namespace base {
 
+namespace {
+
+scoped_refptr<internal::JobTaskSource> CreateJobTaskSource(
+    const Location& from_here,
+    const TaskTraits& traits,
+    RepeatingCallback<void(JobDelegate*)> worker_task,
+    MaxConcurrencyCallback max_concurrency_callback) {
+  DCHECK(ThreadPoolInstance::Get())
+      << "Hint: if this is in a unit test, you're likely merely missing a "
+         "base::test::TaskEnvironment member in your fixture.\n";
+  // ThreadPool is implicitly the destination for PostJob(). Extension traits
+  // cannot be used.
+  DCHECK_EQ(traits.extension_id(),
+            TaskTraitsExtensionStorage::kInvalidExtensionId);
+
+  return base::MakeRefCounted<internal::JobTaskSource>(
+      from_here, traits, std::move(worker_task),
+      std::move(max_concurrency_callback),
+      static_cast<internal::ThreadPoolImpl*>(ThreadPoolInstance::Get()));
+}
+
+}  // namespace
+
 JobDelegate::JobDelegate(
     internal::JobTaskSource* task_source,
     internal::PooledTaskRunnerDelegate* pooled_task_runner_delegate)
@@ -139,18 +162,9 @@
                   const TaskTraits& traits,
                   RepeatingCallback<void(JobDelegate*)> worker_task,
                   MaxConcurrencyCallback max_concurrency_callback) {
-  DCHECK(ThreadPoolInstance::Get())
-      << "Hint: if this is in a unit test, you're likely merely missing a "
-         "base::test::TaskEnvironment member in your fixture.\n";
-  // ThreadPool is implicitly the destination for PostJob(). Extension traits
-  // cannot be used.
-  DCHECK_EQ(traits.extension_id(),
-            TaskTraitsExtensionStorage::kInvalidExtensionId);
-
-  auto task_source = base::MakeRefCounted<internal::JobTaskSource>(
-      from_here, traits, std::move(worker_task),
-      std::move(max_concurrency_callback),
-      static_cast<internal::ThreadPoolImpl*>(ThreadPoolInstance::Get()));
+  auto task_source =
+      CreateJobTaskSource(from_here, traits, std::move(worker_task),
+                          std::move(max_concurrency_callback));
   const bool queued =
       static_cast<internal::ThreadPoolImpl*>(ThreadPoolInstance::Get())
           ->EnqueueJobTaskSource(task_source);
@@ -159,4 +173,14 @@
   return JobHandle();
 }
 
+JobHandle CreateJob(const Location& from_here,
+                    const TaskTraits& traits,
+                    RepeatingCallback<void(JobDelegate*)> worker_task,
+                    MaxConcurrencyCallback max_concurrency_callback) {
+  auto task_source =
+      CreateJobTaskSource(from_here, traits, std::move(worker_task),
+                          std::move(max_concurrency_callback));
+  return internal::JobTaskSource::CreateJobHandle(std::move(task_source));
+}
+
 }  // namespace base
diff --git a/base/task/post_job.h b/base/task/post_job.h
index f622356..2c74448 100644
--- a/base/task/post_job.h
+++ b/base/task/post_job.h
@@ -113,7 +113,9 @@
 
   // Contributes to the job on this thread. Doesn't return until all tasks have
   // completed and max concurrency becomes 0. This also promotes this Job's
-  // priority to be at least as high as the calling thread's priority.
+  // priority to be at least as high as the calling thread's priority. When
+  // called immediately, prefer CreateJob(...).Join() over PostJob(...).Join()
+  // to avoid having too many workers scheduled for executing the workload.
   void Join();
 
   // Forces all existing workers to yield ASAP. Waits until they have all
@@ -195,6 +197,16 @@
                               RepeatingCallback<void(JobDelegate*)> worker_task,
                               MaxConcurrencyCallback max_concurrency_callback);
 
+// Creates and returns a JobHandle associated with a Job. Unlike PostJob(), this
+// doesn't immediately schedules |worker_task| to run on base::ThreadPool
+// workers; the Job is then scheduled by calling either
+// NotifyConcurrencyIncrease() or Join().
+JobHandle BASE_EXPORT
+CreateJob(const Location& from_here,
+          const TaskTraits& traits,
+          RepeatingCallback<void(JobDelegate*)> worker_task,
+          MaxConcurrencyCallback max_concurrency_callback);
+
 }  // namespace base
 
 #endif  // BASE_TASK_POST_JOB_H_
diff --git a/base/task/post_job_unittest.cc b/base/task/post_job_unittest.cc
index 74d3ae25..b6ecf74 100644
--- a/base/task/post_job_unittest.cc
+++ b/base/task/post_job_unittest.cc
@@ -12,6 +12,8 @@
 #include "base/test/bind.h"
 #include "base/test/gtest_util.h"
 #include "base/test/task_environment.h"
+#include "base/test/test_timeouts.h"
+#include "base/threading/platform_thread.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -26,7 +28,28 @@
       BindLambdaForTesting(
           [&](size_t /*worker_count*/) -> size_t { return num_tasks_to_run; }));
   handle.Join();
-  DCHECK_EQ(num_tasks_to_run, 0U);
+  EXPECT_EQ(num_tasks_to_run, 0U);
+}
+
+TEST(PostJobTest, CreateJobSimple) {
+  test::TaskEnvironment task_environment;
+  std::atomic_size_t num_tasks_to_run(4);
+  bool job_started = false;
+  auto handle =
+      CreateJob(FROM_HERE, {}, BindLambdaForTesting([&](JobDelegate* delegate) {
+                  EXPECT_TRUE(job_started);
+                  --num_tasks_to_run;
+                }),
+                BindLambdaForTesting([&](size_t /*worker_count*/) -> size_t {
+                  EXPECT_TRUE(job_started);
+                  return num_tasks_to_run;
+                }));
+
+  PlatformThread::Sleep(TestTimeouts::tiny_timeout());
+  EXPECT_EQ(num_tasks_to_run, 4U);
+  job_started = true;
+  handle.Join();
+  EXPECT_EQ(num_tasks_to_run, 0U);
 }
 
 TEST(PostJobTest, PostJobExtension) {
diff --git a/build/android/gyp/create_app_bundle.py b/build/android/gyp/create_app_bundle.py
index 87e396b..610d64f6 100755
--- a/build/android/gyp/create_app_bundle.py
+++ b/build/android/gyp/create_app_bundle.py
@@ -62,6 +62,9 @@
     'xmf'
 ]
 
+_COMPONENT_TYPES = ('activity', 'provider', 'receiver', 'service')
+_DEDUPE_ENTRY_TYPES = _COMPONENT_TYPES + ('activity-alias', 'meta-data')
+
 
 def _ParseArgs(args):
   parser = argparse.ArgumentParser()
@@ -416,17 +419,10 @@
   return classes
 
 
-def _MaybeCheckServicesAndProvidersPresentInBase(bundle_path, module_zips):
-  """Checks bundles with isolated splits define all services in the base module.
-
-  Due to b/169196314, service classes are not found if they are not present in
-  the base module. Providers are also checked because they are loaded early in
-  startup, and keeping them in the base module gives more time for the chrome
-  split to load.
-  """
+def _ValidateSplits(bundle_path, module_zips):
   logging.info('Reading manifests and running dexdump')
   base_zip = next(p for p in module_zips if os.path.basename(p) == 'base.zip')
-  module_names = [os.path.basename(p)[:-len('.zip')] for p in module_zips]
+  module_names = sorted(os.path.basename(p)[:-len('.zip')] for p in module_zips)
   # Using threads makes these step go from 7s -> 1s on my machine.
   with concurrent.futures.ThreadPoolExecutor() as executor:
     # Create list of classes from the base module's dex.
@@ -434,62 +430,65 @@
 
     # Create xmltrees of all module manifests.
     manifest_futures = [
-        executor.submit(_GetManifestForModule, bundle_path, name)
-        for name in module_names
+        executor.submit(_GetManifestForModule, bundle_path, n)
+        for n in module_names
     ]
     manifests_by_name = dict(
         zip(module_names, (f.result() for f in manifest_futures)))
     base_classes = classes_future.result()
 
-  base_manifest = manifests_by_name['base']
-  isolated_splits = base_manifest.get('{%s}isolatedSplits' %
-                                      manifest_utils.ANDROID_NAMESPACE)
-  if isolated_splits != 'true':
-    return
-
   # Collect service names from all split manifests.
   logging.info('Performing checks')
-  base_zip = None
-  service_names = _GetComponentNames(base_manifest, 'service')
-  provider_names = _GetComponentNames(base_manifest, 'provider')
-  for module_zip in module_zips:
-    name = os.path.basename(module_zip)[:-len('.zip')]
-    if name == 'base':
-      base_zip = module_zip
-    else:
-      cur_manifest = manifests_by_name[name]
-      service_names += _GetComponentNames(cur_manifest, 'service')
-      module_providers = _GetComponentNames(cur_manifest, 'provider')
-      if module_providers:
-        raise Exception("Providers should all be declared in the base manifest."
-                        " '%s' module declared: %s" % (name, module_providers))
+  errors = []
 
-  ignored_service_names = {
-      # Defined in the chime DFM manifest, but unused.
-      # org.chromium.chrome.browser.chime.ScheduledTaskService is used instead.
-      ("com.google.android.libraries.notifications.entrypoints.scheduled."
-       "ScheduledTaskService"),
+  # Ensure there are no components defined in multiple splits.
+  splits_by_component = {}
+  for module_name, cur_manifest in manifests_by_name.items():
+    for kind in _DEDUPE_ENTRY_TYPES:
+      for component in _GetComponentNames(cur_manifest, kind):
+        owner_module_name = splits_by_component.setdefault((kind, component),
+                                                           module_name)
+        # Allow services that exist only to keep <meta-data> out of
+        # ApplicationInfo.
+        if (owner_module_name != module_name
+            and not component.endswith('HolderService')):
+          errors.append(f'The {kind} "{component}" appeared in both '
+                        f'{owner_module_name} and {module_name}.')
 
-      # Defined in the chime DFM manifest, only used pre-O (where isolated
-      # splits are not supported).
-      ("com.google.android.libraries.notifications.executor.impl.basic."
-       "ChimeExecutorApiService"),
-  }
+  # Ensure components defined in base manifest exist in base dex.
+  for (kind, component), module_name in splits_by_component.items():
+    if module_name == 'base' and kind in _COMPONENT_TYPES:
+      if component not in base_classes:
+        errors.append(f"{component} is defined in the base manfiest, "
+                      f"but the class does not exist in the base splits' dex")
 
-  # Ensure all services are present in base module.
-  for service_name in service_names:
-    if service_name not in base_classes:
-      if service_name in ignored_service_names:
-        continue
-      raise Exception("Service %s should be present in the base module's dex."
+  # Remaining checks apply only when isolatedSplits="true".
+  isolated_splits = manifests_by_name['base'].get(
+      f'{manifest_utils.ANDROID_NAMESPACE}isolatedSplits')
+  if isolated_splits != 'true':
+    return errors
+
+  # Ensure all providers are present in base module. We enforce this because
+  # providers are loaded early in startup, and keeping them in the base module
+  # gives more time for the chrome split to load.
+  for module_name, cur_manifest in manifests_by_name.items():
+    if module_name == 'base':
+      continue
+    provider_names = _GetComponentNames(cur_manifest, 'provider')
+    if provider_names:
+      errors.append('Providers should all be declared in the base manifest.'
+                    ' "%s" module declared: %s' % (module_name, provider_names))
+
+  # Ensure all services are present in base module because service classes are
+  # not found if they are not present in the base module. b/169196314
+  # It is fine if they are defined in split manifests though.
+  for cur_manifest in manifests_by_name.values():
+    for service_name in _GetComponentNames(cur_manifest, 'service'):
+      if service_name not in base_classes:
+        errors.append("Service %s should be present in the base module's dex."
                       " See b/169196314 for more details." % service_name)
 
-  # Ensure all providers are present in base module.
-  for provider_name in provider_names:
-    if provider_name not in base_classes:
-      raise Exception(
-          "Provider %s should be present in the base module's dex." %
-          provider_name)
+  return errors
 
 
 def main(args):
@@ -553,7 +552,12 @@
       # enabled.  Consider making this run in parallel or move into a separate
       # step before enabling isolated splits by default.
       logging.info('Validating isolated split manifests')
-      _MaybeCheckServicesAndProvidersPresentInBase(tmp_bundle, module_zips)
+      errors = _ValidateSplits(tmp_bundle, module_zips)
+      if errors:
+        sys.stderr.write('Bundle failed sanity checks:\n  ')
+        sys.stderr.write('\n  '.join(errors))
+        sys.stderr.write('\n')
+        sys.exit(1)
 
     logging.info('Writing final output artifacts')
     shutil.move(tmp_bundle, options.out_bundle)
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index c3ae8f22..df86106 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -655,9 +655,11 @@
     # available disk space, 40GB and 100000 files.
     cache_policy = "cache_size=10%:cache_size_bytes=40g:cache_size_files=100000"
 
+    # An import limit of 30 has better performance (per speedometer) and lower
+    # binary size than the default setting of 100.
     # TODO(gbiv): We ideally shouldn't need to specify this; ThinLTO
     # should be able to better manage binary size increases on its own.
-    import_instr_limit = 5
+    import_instr_limit = 30
 
     if (is_win) {
       ldflags += [
@@ -694,21 +696,23 @@
       ldflags += [ "-Wl,--thinlto-cache-policy=$cache_policy" ]
 
       if (is_chromeos) {
-        # Not much performance difference was noted between the default (100)
-        # and these. ARM was originally set lower than x86 to keep the size
+        # ARM was originally set lower than x86 to keep the size
         # bloat of ThinLTO to <10%, but that's potentially no longer true.
         # FIXME(inglorion): maybe tune these?
         if (target_cpu == "arm" || target_cpu == "arm64") {
           import_instr_limit = 20
-        } else {
-          import_instr_limit = 30
         }
+      } else if (is_android) {
+        # TODO(crbug.com/1308318): Investigate if we can get the > 6% perf win
+        # of import_instr_limit 30 with a binary size hit smaller than ~2 MiB.
+        import_instr_limit = 5
       }
 
       ldflags += [ "-Wl,-mllvm,-import-instr-limit=$import_instr_limit" ]
     }
 
-    # TODO(https://crbug.com/1211155): investigate why this isn't effective on arm32.
+    # TODO(https://crbug.com/1211155): investigate why this isn't effective on
+    # arm32.
     if (!is_android || current_cpu == "arm64") {
       cflags += [ "-fwhole-program-vtables" ]
       if (!is_win) {
diff --git a/build/fuchsia/linux_internal.sdk.sha1 b/build/fuchsia/linux_internal.sdk.sha1
index 9469d886..92c95207a 100644
--- a/build/fuchsia/linux_internal.sdk.sha1
+++ b/build/fuchsia/linux_internal.sdk.sha1
@@ -1 +1 @@
-8.20220601.1.1
+8.20220601.2.1
diff --git a/build/linux/libudev/BUILD.gn b/build/linux/libudev/BUILD.gn
index dcd9f234..91ae863 100644
--- a/build/linux/libudev/BUILD.gn
+++ b/build/linux/libudev/BUILD.gn
@@ -10,6 +10,7 @@
   "udev_device_get_devtype",
   "udev_device_get_parent",
   "udev_device_get_parent_with_subsystem_devtype",
+  "udev_device_get_properties_list_entry",
   "udev_device_get_property_value",
   "udev_device_get_subsystem",
   "udev_device_get_sysattr_value",
diff --git a/cc/test/pixel_test.cc b/cc/test/pixel_test.cc
index 37efe341..21a4101 100644
--- a/cc/test/pixel_test.cc
+++ b/cc/test/pixel_test.cc
@@ -29,7 +29,6 @@
 #include "components/viz/common/quads/compositor_frame_metadata.h"
 #include "components/viz/common/resources/bitmap_allocation.h"
 #include "components/viz/common/resources/shared_bitmap.h"
-#include "components/viz/service/display/display_resource_provider_gl.h"
 #include "components/viz/service/display/display_resource_provider_skia.h"
 #include "components/viz/service/display/display_resource_provider_software.h"
 #include "components/viz/service/display/output_surface_client.h"
diff --git a/chrome/android/chrome_junit_test_java_sources.gni b/chrome/android/chrome_junit_test_java_sources.gni
index fa7160e68..41265c7 100644
--- a/chrome/android/chrome_junit_test_java_sources.gni
+++ b/chrome/android/chrome_junit_test_java_sources.gni
@@ -202,6 +202,7 @@
   "junit/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorMediatorTest.java",
   "junit/src/org/chromium/chrome/browser/suggestions/SuggestionsImageFetcherTest.java",
   "junit/src/org/chromium/chrome/browser/suggestions/tile/MostVisitedMediatorUnitTest.java",
+  "junit/src/org/chromium/chrome/browser/suggestions/tile/TileRendererTest.java",
   "junit/src/org/chromium/chrome/browser/supervised_user/ChildAccountServiceTest.java",
   "junit/src/org/chromium/chrome/browser/survey/ChromeSurveyControllerFlowTest.java",
   "junit/src/org/chromium/chrome/browser/survey/ChromeSurveyControllerTest.java",
diff --git a/chrome/android/chrome_test_java_sources.gni b/chrome/android/chrome_test_java_sources.gni
index b80d1f9..d9f8908 100644
--- a/chrome/android/chrome_test_java_sources.gni
+++ b/chrome/android/chrome_test_java_sources.gni
@@ -533,7 +533,6 @@
   "javatests/src/org/chromium/chrome/browser/suggestions/tile/MostVisitedTilesViewBinderUnitTest.java",
   "javatests/src/org/chromium/chrome/browser/suggestions/tile/TileGroupTest.java",
   "javatests/src/org/chromium/chrome/browser/suggestions/tile/TileGroupUnitTest.java",
-  "javatests/src/org/chromium/chrome/browser/suggestions/tile/TileRendererTest.java",
   "javatests/src/org/chromium/chrome/browser/survey/ChromeSurveyControllerIntegrationTest.java",
   "javatests/src/org/chromium/chrome/browser/survey/SurveyHttpClientBridgeTest.java",
   "javatests/src/org/chromium/chrome/browser/sync/AccountManagementFragmentTest.java",
diff --git a/chrome/android/java/res/values/dimens.xml b/chrome/android/java/res/values/dimens.xml
index 178cef86..ddf3421 100644
--- a/chrome/android/java/res/values/dimens.xml
+++ b/chrome/android/java/res/values/dimens.xml
@@ -279,6 +279,8 @@
     <dimen name="custom_tabs_screenshot_height">300dp</dimen>
     <dimen name="custom_tabs_screenshot_width">190dp</dimen>
     <dimen name="custom_tabs_handle_height">16dp</dimen>
+    <dimen name="custom_tabs_elevation">8dp</dimen>
+    <dimen name="custom_tabs_shadow_offset">4dp</dimen>
     <dimen name="custom_tabs_default_corner_radius">16dp</dimen>
 
     <!-- Account chooser dialog dimensions -->
diff --git a/chrome/android/java/res_app/layout/main.xml b/chrome/android/java/res_app/layout/main.xml
index d1ac674..24cae95 100644
--- a/chrome/android/java/res_app/layout/main.xml
+++ b/chrome/android/java/res_app/layout/main.xml
@@ -14,6 +14,7 @@
         android:inflatedId="@+id/custom_tabs_handle_view"
         android:layout_width="match_parent"
         android:layout_height="@dimen/custom_tabs_handle_height"
+        android:layout_marginTop="@dimen/custom_tabs_shadow_offset"
         android:layout="@layout/custom_tabs_handle_view"
         android:visibility="gone" />
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/flags/ChromeCachedFlags.java b/chrome/android/java/src/org/chromium/chrome/browser/app/flags/ChromeCachedFlags.java
index ca1681c..c27d9300 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/app/flags/ChromeCachedFlags.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/app/flags/ChromeCachedFlags.java
@@ -217,11 +217,7 @@
 
         // TODO(crbug.com/995355): Move other related flags from cacheNativeFlags() to here.
         List<String> featuresToCache = new ArrayList<String>() {
-            {
-                add(ChromeFeatureList.EXPERIMENTS_FOR_AGSA);
-                add(ChromeFeatureList.SERVICE_MANAGER_FOR_DOWNLOAD);
-                add(ChromeFeatureList.SERVICE_MANAGER_FOR_BACKGROUND_PREFETCH);
-            }
+            { add(ChromeFeatureList.EXPERIMENTS_FOR_AGSA); }
         };
         CachedFeatureFlags.cacheNativeFlags(featuresToCache);
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/PartialCustomTabHeightStrategy.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/PartialCustomTabHeightStrategy.java
index 4e1a40e1..b266e282 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/PartialCustomTabHeightStrategy.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/PartialCustomTabHeightStrategy.java
@@ -13,8 +13,10 @@
 import android.app.Activity;
 import android.content.Context;
 import android.content.res.Configuration;
+import android.graphics.Color;
 import android.graphics.Point;
 import android.graphics.Rect;
+import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.GradientDrawable;
 import android.os.Build;
 import android.util.DisplayMetrics;
@@ -96,6 +98,7 @@
     private final AnimatorListener mSpinnerFadeoutAnimatorListener;
     private final int mHandleHeight;
     private ValueAnimator mAnimator;
+    private int mShadowOffset;
 
     private @HeightStatus int mStatus = HeightStatus.INITIAL_HEIGHT;
     private @HeightStatus int mTargetStatus;
@@ -110,6 +113,7 @@
     private LinearLayout mNavbar;
     private CircularProgressDrawable mSpinner;
     private View mToolbarView;
+    private View mToolbarCoordinator;
 
     /** A callback to be called once the Custom Tab has been resized. */
     interface OnResizedCallback {
@@ -258,12 +262,21 @@
 
         // Invoked twice - when populated/destroyed(null)
         parentViewSupplier.addObserver(parentView -> {
+            if (parentView == null) return;
+
+            // Elevate the main web contents area as high as the handle bar to have the shadow
+            // effect look right.
+            int ev = mActivity.getResources().getDimensionPixelSize(R.dimen.custom_tabs_elevation);
+            View coordinatorLayout = (View) parentView.getParent();
+            coordinatorLayout.setElevation(ev);
+
             // When the navigation bar on the right side (not at the bottom), no need to call
             // the methods below since the contents height is fixed and the system navigation
             // bar works as expected.
             if (mNavbarHeight == 0) return;
+
             setContentsHeight();
-            updateNavbarVisibility(parentView != null);
+            updateNavbarVisibility(true);
         });
 
         mOnResizedCallback = onResizedCallback;
@@ -346,6 +359,7 @@
     @Override
     public void onToolbarInitialized(
             View coordinatorView, CustomTabToolbar toolbar, @Px int toolbarCornerRadius) {
+        mToolbarCoordinator = coordinatorView;
         roundCorners(coordinatorView, toolbar, toolbarCornerRadius);
 
         mToolbarView = toolbar;
@@ -364,6 +378,7 @@
         if (newConfig.orientation != mOrientation) {
             mOrientation = newConfig.orientation;
             initializeHeight();
+            updateShadowOffset();
             setContentsHeight();
             updateNavbarVisibility(true);
         }
@@ -382,22 +397,20 @@
         ViewStub handleViewStub = mActivity.findViewById(R.id.custom_tabs_handle_view_stub);
         handleViewStub.inflate();
         View handleView = mActivity.findViewById(R.id.custom_tabs_handle_view);
-
+        handleView.setElevation(
+                mActivity.getResources().getDimensionPixelSize(R.dimen.custom_tabs_elevation));
         GradientDrawable background = (GradientDrawable) handleView.getBackground();
         background.mutate();
         background.setCornerRadii(new float[] {toolbarCornerRadius, toolbarCornerRadius,
                 toolbarCornerRadius, toolbarCornerRadius, 0, 0, 0, 0});
+        handleView.setBackground(background);
+        updateShadowOffset();
 
         // Pass the handle View to CustomTabToolbar for background color management.
         toolbar.setHandleView(handleView);
 
-        // Make enough room for the handle View.
-        ViewGroup.MarginLayoutParams mlp =
-                (ViewGroup.MarginLayoutParams) coordinator.getLayoutParams();
-        mlp.setMargins(0, mHandleHeight, 0, 0);
-        coordinator.requestLayout();
-
-        mActivity.getWindow().setBackgroundDrawable(background);
+        // Having the transparent background is necessary for the shadow effect.
+        mActivity.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
     }
 
     private void initializeHeight() {
@@ -431,6 +444,26 @@
         mActivity.getWindow().setAttributes(attributes);
     }
 
+    private void updateShadowOffset() {
+        if (mOrientation == Configuration.ORIENTATION_LANDSCAPE) {
+            // Shadow is not necessary as CCT will be always of full-height in landscape mode.
+            mShadowOffset = 0;
+        } else {
+            mShadowOffset = mActivity.getResources().getDimensionPixelSize(
+                    R.dimen.custom_tabs_shadow_offset);
+        }
+        View handleView = mActivity.findViewById(R.id.custom_tabs_handle_view);
+        ViewGroup.MarginLayoutParams lp =
+                (ViewGroup.MarginLayoutParams) handleView.getLayoutParams();
+        lp.setMargins(0, mShadowOffset, 0, 0);
+
+        // Make enough room for the handle View.
+        ViewGroup.MarginLayoutParams mlp =
+                (ViewGroup.MarginLayoutParams) mToolbarCoordinator.getLayoutParams();
+        mlp.setMargins(0, mHandleHeight + mShadowOffset, 0, 0);
+        mToolbarCoordinator.requestLayout();
+    }
+
     private void updateWindowPos(@Px int y) {
         // Do not allow the Window to go down below the initial position or above the minimum
         // threshold capped by the status bar and (optionally) the 90%-height adjustment.
@@ -511,8 +544,12 @@
         // We resize CompositorViewHolder to occupy the size we want for CCT. This excludes
         // the bottom navigation bar height and the top margin of CVH set aside for
         // the handle bar portion of the CCT toolbar header.
+        // TODO(jinsukkim):
+        //   - Remove the shadow when in full-height so there won't be a gap beneath the status bar.
+        //   - Draw a thin border line around CCT on low-mem devices where the shadow effect via
+        //     android:elevation directive won't work.
         int windowPos = mActivity.getWindow().getAttributes().y;
-        lp.height = getDisplayHeight() - windowPos - mHandleHeight - mNavbarHeight;
+        lp.height = getDisplayHeight() - windowPos - mHandleHeight - mShadowOffset - mNavbarHeight;
         parentView.setLayoutParams(lp);
         if (oldHeight >= 0 && lp.height != oldHeight) mOnResizedCallback.onResized(lp.height);
     }
@@ -656,11 +693,12 @@
 
     @VisibleForTesting
     void setMockViewForTesting(LinearLayout navbar, ImageView spinnerView,
-            CircularProgressDrawable spinner, View toolbar) {
+            CircularProgressDrawable spinner, View toolbar, View toolbarCoordinator) {
         mNavbar = navbar;
         mSpinnerView = spinnerView;
         mSpinner = spinner;
         mToolbarView = toolbar;
+        mToolbarCoordinator = toolbarCoordinator;
     }
 
     @VisibleForTesting
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadBroadcastManagerImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadBroadcastManagerImpl.java
index fba9073..7db90b7 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadBroadcastManagerImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadBroadcastManagerImpl.java
@@ -35,7 +35,6 @@
 import org.chromium.base.IntentUtils;
 import org.chromium.chrome.browser.download.DownloadNotificationUmaHelper.UmaDownloadResumption;
 import org.chromium.chrome.browser.download.items.OfflineContentAggregatorNotificationBridgeUiFactory;
-import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.init.BrowserParts;
 import org.chromium.chrome.browser.init.ChromeBrowserInitializer;
@@ -217,8 +216,7 @@
             @Override
             public boolean startMinimalBrowser() {
                 if (!LegacyHelpers.isLegacyDownload(id)) return false;
-                return CachedFeatureFlags.isEnabled(ChromeFeatureList.SERVICE_MANAGER_FOR_DOWNLOAD)
-                        && !ACTION_DOWNLOAD_OPEN.equals(intent.getAction());
+                return !ACTION_DOWNLOAD_OPEN.equals(intent.getAction());
             }
         };
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/service/DownloadBackgroundTask.java b/chrome/android/java/src/org/chromium/chrome/browser/download/service/DownloadBackgroundTask.java
index ac8883e..9f1c86d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/service/DownloadBackgroundTask.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/service/DownloadBackgroundTask.java
@@ -10,15 +10,11 @@
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.annotations.NativeMethods;
 import org.chromium.chrome.browser.download.DownloadManagerService;
-import org.chromium.chrome.browser.flags.CachedFeatureFlags;
-import org.chromium.chrome.browser.flags.ChromeFeatureList;
-import org.chromium.chrome.browser.offlinepages.prefetch.PrefetchConfiguration;
 import org.chromium.chrome.browser.profiles.ProfileKey;
 import org.chromium.components.background_task_scheduler.NativeBackgroundTask;
 import org.chromium.components.background_task_scheduler.TaskParameters;
 import org.chromium.components.download.DownloadTaskType;
 import org.chromium.components.download.internal.BatteryStatusListenerAndroid;
-import org.chromium.content_public.browser.BrowserStartupController;
 
 /**
  * Entry point for the download service to perform desired action when the task is fired by the
@@ -29,9 +25,6 @@
     @DownloadTaskType
     private int mCurrentTaskType;
 
-    // Whether only the minimal browser is required to start.
-    private boolean mStartsMinimalBrowser;
-
     @Override
     protected @StartBeforeNativeResult int onStartTaskBeforeNativeLoaded(
             Context context, TaskParameters taskParameters, TaskFinishedCallback callback) {
@@ -40,11 +33,6 @@
         int optimalBatteryPercentage = taskParameters.getExtras().getInt(
                 DownloadTaskScheduler.EXTRA_OPTIMAL_BATTERY_PERCENTAGE);
         mCurrentTaskType = taskParameters.getExtras().getInt(DownloadTaskScheduler.EXTRA_TASK_TYPE);
-        // The feature value could change during native initialization, store it first.
-        mStartsMinimalBrowser = (mCurrentTaskType == DownloadTaskType.DOWNLOAD_AUTO_RESUMPTION_TASK
-                                        || mCurrentTaskType == DownloadTaskType.DOWNLOAD_LATER_TASK)
-                ? CachedFeatureFlags.isEnabled(ChromeFeatureList.SERVICE_MANAGER_FOR_DOWNLOAD)
-                : PrefetchConfiguration.isMinimalBrowserForBackgroundPrefetchEnabled();
         // Reschedule if minimum battery level is not satisfied.
         if (!requiresCharging
                 && BatteryStatusListenerAndroid.getBatteryPercentage() < optimalBatteryPercentage) {
@@ -60,8 +48,6 @@
         // In case of future upgrades, we would need to build an intent for the old version and
         // validate that this code still works. This would require decoupling this immediate class
         // from native as well.
-        assert BrowserStartupController.getInstance().isFullBrowserStarted()
-                || mStartsMinimalBrowser;
         DownloadManagerService.getDownloadManagerService().initForBackgroundTask();
         ProfileKey key = ProfileKey.getLastUsedRegularProfileKey();
         DownloadBackgroundTaskJni.get().startBackgroundTask(DownloadBackgroundTask.this, key,
@@ -70,7 +56,7 @@
 
     @Override
     protected boolean supportsMinimalBrowser() {
-        return mStartsMinimalBrowser;
+        return true;
     }
 
     @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchBackgroundTask.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchBackgroundTask.java
index 9ca3403..7269c3bd 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchBackgroundTask.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchBackgroundTask.java
@@ -28,7 +28,6 @@
     private static final int MINIMUM_BATTERY_PERCENTAGE_FOR_PREFETCHING = 50;
 
     private static boolean sSkipConditionCheckingForTesting;
-    private static boolean sAlwaysSupportMinimalBrowserForTesting;
     private static boolean sSkipCachingFlagForTesting;
 
     private long mNativeTask;
@@ -85,10 +84,6 @@
         sSkipConditionCheckingForTesting = true;
     }
 
-    @VisibleForTesting
-    static void alwaysSupportMinimalBrowserForTesting() {
-        sAlwaysSupportMinimalBrowserForTesting = true;
-    }
 
     @Override
     protected void onStartTaskWithNative(
@@ -188,11 +183,7 @@
 
     @Override
     protected boolean supportsMinimalBrowser() {
-        if (sAlwaysSupportMinimalBrowserForTesting) {
-            return true;
-        }
-
-        return PrefetchConfiguration.isMinimalBrowserForBackgroundPrefetchEnabled();
+        return true;
     }
 
     @NativeMethods
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/SuggestionsTileView.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/SuggestionsTileView.java
index 8851486..533b86e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/SuggestionsTileView.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/SuggestionsTileView.java
@@ -55,6 +55,7 @@
     public void renderIcon(Tile tile) {
         setIconDrawable(tile.getIcon());
         setIconViewLayoutParams(tile);
+        setIconTint(tile.getIconTint());
     }
 
     public void renderOfflineBadge(Tile tile) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/Tile.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/Tile.java
index 0f50ee54..7cb979bb 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/Tile.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/Tile.java
@@ -4,6 +4,7 @@
 
 package org.chromium.chrome.browser.suggestions.tile;
 
+import android.content.res.ColorStateList;
 import android.graphics.drawable.Drawable;
 
 import androidx.annotation.Nullable;
@@ -31,6 +32,9 @@
     private Drawable mIcon;
 
     @Nullable
+    private ColorStateList mIconTint;
+
+    @Nullable
     private Long mOfflinePageOfflineId;
 
     /**
@@ -152,6 +156,17 @@
         mIcon = icon;
     }
 
+    /**
+     * Updates the icon tint color.
+     */
+    public void setIconTint(@Nullable ColorStateList iconTint) {
+        mIconTint = iconTint;
+    }
+
+    public ColorStateList getIconTint() {
+        return mIconTint;
+    }
+
     @TileSectionType
     public int getSectionType() {
         return mSiteData.sectionType;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TileGroup.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TileGroup.java
index 88901d6..d3e4fbe 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TileGroup.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TileGroup.java
@@ -4,7 +4,6 @@
 
 package org.chromium.chrome.browser.suggestions.tile;
 
-import android.graphics.Bitmap;
 import android.util.SparseArray;
 import android.view.ContextMenu;
 import android.view.ContextMenu.ContextMenuInfo;
@@ -29,8 +28,6 @@
 import org.chromium.chrome.browser.suggestions.SuggestionsOfflineModelObserver;
 import org.chromium.chrome.browser.suggestions.SuggestionsUiDelegate;
 import org.chromium.chrome.browser.suggestions.mostvisited.MostVisitedSites;
-import org.chromium.components.favicon.IconType;
-import org.chromium.components.favicon.LargeIconBridge;
 import org.chromium.ui.mojom.WindowOpenDisposition;
 import org.chromium.url.GURL;
 
@@ -120,9 +117,9 @@
 
         /**
          * Returns a callback to be invoked when the icon for the provided tile is loaded. It will
-         * be responsible for updating the tile data and triggering the visual refresh.
+         * be responsible for triggering the visual refresh.
          */
-        LargeIconBridge.LargeIconCallback createIconLoadCallback(Tile tile);
+        Runnable createIconLoadCallback(Tile tile);
     }
 
     /**
@@ -222,13 +219,16 @@
         }
 
         @Override
-        public LargeIconBridge.LargeIconCallback createIconLoadCallback(Tile tile) {
+        public Runnable createIconLoadCallback(Tile tile) {
             // TODO(dgn): We could save on fetches by avoiding a new one when there is one pending
             // for the same URL, and applying the result to all matched URLs.
             boolean trackLoad =
                     isLoadTracked() && tile.getSectionType() == TileSectionType.PERSONALIZED;
             if (trackLoad) addTask(TileTask.FETCH_ICON);
-            return new LargeIconCallbackImpl(tile.getData(), trackLoad);
+            return () -> {
+                mObserver.onTileIconChanged(tile);
+                if (trackLoad) removeTask(TileTask.FETCH_ICON);
+            };
         }
     };
 
@@ -291,8 +291,7 @@
     @Override
     public void onIconMadeAvailable(GURL siteUrl) {
         for (Tile tile : findTilesForUrl(siteUrl)) {
-            mTileRenderer.updateIcon(tile.getData(),
-                    new LargeIconCallbackImpl(tile.getData(), /* trackLoadTask = */ false));
+            mTileRenderer.updateIcon(tile, () -> mObserver.onTileIconChanged(tile));
         }
     }
 
@@ -502,37 +501,6 @@
         mOfflineModelObserver.onDestroy();
     }
 
-    // TODO(dgn): I would like to move that to TileRenderer, but setting the data on the tile,
-    // notifying the observer and updating the tasks make it awkward.
-    private class LargeIconCallbackImpl implements LargeIconBridge.LargeIconCallback {
-        private final SiteSuggestion mSiteData;
-        private final boolean mTrackLoadTask;
-
-        private LargeIconCallbackImpl(SiteSuggestion suggestion, boolean trackLoadTask) {
-            mSiteData = suggestion;
-            mTrackLoadTask = trackLoadTask;
-        }
-
-        @Override
-        public void onLargeIconAvailable(@Nullable Bitmap icon, int fallbackColor,
-                boolean isFallbackColorDefault, @IconType int iconType) {
-            Tile tile = findTile(mSiteData);
-            if (tile != null) { // Do nothing if the tile was removed.
-                tile.setIconType(iconType);
-                if (icon == null) {
-                    mTileRenderer.setTileIconFromColor(tile, fallbackColor, isFallbackColorDefault);
-                } else {
-                    mTileRenderer.setTileIconFromBitmap(tile, icon);
-                }
-
-                mObserver.onTileIconChanged(tile);
-            }
-
-            // This call needs to be made after the tiles are completely initialised, for UMA.
-            if (mTrackLoadTask) removeTask(TileTask.FETCH_ICON);
-        }
-    }
-
     private class TileInteractionDelegateImpl
             implements TileInteractionDelegate, ContextMenuManager.Delegate {
         private final SiteSuggestion mSuggestion;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TileRenderer.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TileRenderer.java
index 7a7b9dd..de93a772 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TileRenderer.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TileRenderer.java
@@ -12,28 +12,37 @@
 import android.view.LayoutInflater;
 import android.view.ViewGroup;
 
+import androidx.annotation.DrawableRes;
 import androidx.annotation.LayoutRes;
+import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
+import androidx.core.content.res.ResourcesCompat;
 import androidx.core.graphics.drawable.RoundedBitmapDrawable;
 import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat;
 
 import org.chromium.base.TraceEvent;
 import org.chromium.base.library_loader.LibraryLoader;
+import org.chromium.base.task.PostTask;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.explore_sites.ExploreSitesBridge;
 import org.chromium.chrome.browser.explore_sites.ExploreSitesIPH;
 import org.chromium.chrome.browser.feature_engagement.TrackerFactory;
 import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory;
 import org.chromium.chrome.browser.suggestions.ImageFetcher;
 import org.chromium.chrome.browser.suggestions.SiteSuggestion;
 import org.chromium.chrome.browser.suggestions.SuggestionsConfig.TileStyle;
+import org.chromium.components.browser_ui.styles.ChromeColors;
 import org.chromium.components.browser_ui.widget.RoundedIconGenerator;
 import org.chromium.components.favicon.IconType;
 import org.chromium.components.favicon.LargeIconBridge;
 import org.chromium.components.feature_engagement.EventConstants;
 import org.chromium.components.feature_engagement.Tracker;
+import org.chromium.components.search_engines.TemplateUrlService;
+import org.chromium.content_public.browser.UiThreadTaskTraits;
 import org.chromium.ui.base.ViewUtils;
 
+import java.lang.ref.WeakReference;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -45,9 +54,9 @@
 public class TileRenderer {
     private static final String TAG = "TileRenderer";
 
-    private final Resources mResources;
-    private final RoundedIconGenerator mIconGenerator;
+    private final Context mContext;
     private final Resources.Theme mTheme;
+    private RoundedIconGenerator mIconGenerator;
     private ImageFetcher mImageFetcher;
 
     @TileStyle
@@ -63,17 +72,45 @@
     @LayoutRes
     private final int mTopSitesLayout;
 
+    private class LargeIconCallbackImpl implements LargeIconBridge.LargeIconCallback {
+        private final WeakReference<Tile> mTile;
+        private final Runnable mLoadCompleteCallback;
+
+        private LargeIconCallbackImpl(Tile tile, Runnable loadCompleteCallback) {
+            mTile = new WeakReference<>(tile);
+            mLoadCompleteCallback = loadCompleteCallback;
+        }
+
+        @Override
+        public void onLargeIconAvailable(@Nullable Bitmap icon, int fallbackColor,
+                boolean isFallbackColorDefault, @IconType int iconType) {
+            Tile tile = mTile.get();
+            if (tile != null) { // Do nothing if the tile was removed.
+                tile.setIconType(iconType);
+                if (icon == null) {
+                    setTileIconFromColor(tile, fallbackColor, isFallbackColorDefault);
+                } else {
+                    setTileIconFromBitmap(tile, icon);
+                }
+                if (mLoadCompleteCallback != null) mLoadCompleteCallback.run();
+            }
+
+            mTile.clear();
+        }
+    }
+
     public TileRenderer(
             Context context, @TileStyle int style, int titleLines, ImageFetcher imageFetcher) {
         mImageFetcher = imageFetcher;
         mStyle = style;
         mTitleLinesCount = titleLines;
 
-        mResources = context.getResources();
+        mContext = context;
+        Resources res = context.getResources();
         mTheme = context.getTheme();
-        mDesiredIconSize = mResources.getDimensionPixelSize(R.dimen.tile_view_icon_size);
-        mIconCornerRadius = mResources.getDimension(R.dimen.tile_view_icon_corner_radius);
-        int minIconSize = mResources.getDimensionPixelSize(R.dimen.tile_view_icon_min_size);
+        mDesiredIconSize = res.getDimensionPixelSize(R.dimen.tile_view_icon_size);
+        mIconCornerRadius = res.getDimension(R.dimen.tile_view_icon_corner_radius);
+        int minIconSize = res.getDimensionPixelSize(R.dimen.tile_view_icon_min_size);
 
         // On ldpi devices, mDesiredIconSize could be even smaller than the global limit.
         mMinIconSize = Math.min(mDesiredIconSize, minIconSize);
@@ -82,7 +119,7 @@
         mTopSitesLayout = getTopSitesLayout();
 
         int iconColor = context.getColor(R.color.default_favicon_background_color);
-        int iconTextSize = mResources.getDimensionPixelSize(R.dimen.tile_view_icon_text_size);
+        int iconTextSize = res.getDimensionPixelSize(R.dimen.tile_view_icon_text_size);
         mIconGenerator = new RoundedIconGenerator(
                 mDesiredIconSize, mDesiredIconSize, mDesiredIconSize / 2, iconColor, iconTextSize);
     }
@@ -150,14 +187,14 @@
             tileView = (TopSitesTileView) LayoutInflater.from(parentView.getContext())
                                .inflate(mTopSitesLayout, parentView, false);
 
-            tile.setIcon(
-                    VectorDrawableCompat.create(mResources, R.drawable.ic_apps_blue_24dp, mTheme));
+            tile.setIcon(VectorDrawableCompat.create(
+                    mContext.getResources(), R.drawable.ic_apps_blue_24dp, mTheme));
             tile.setType(TileVisualType.ICON_DEFAULT);
 
             if (LibraryLoader.getInstance().isInitialized() && setupDelegate != null) {
                 // One task to load actual icon.
                 LargeIconBridge.LargeIconCallback bridgeCallback =
-                        setupDelegate.createIconLoadCallback(tile);
+                        new LargeIconCallbackImpl(tile, setupDelegate.createIconLoadCallback(tile));
                 ExploreSitesBridge.getSummaryImage(Profile.getLastUsedRegularProfile(),
                         mDesiredIconSize,
                         (Bitmap img)
@@ -178,7 +215,7 @@
         // Note: It is important that the callbacks below don't keep a reference to the tile or
         // modify them as there is no guarantee that the same tile would be used to update the view.
         if (mImageFetcher != null && tile.getSource() != TileSource.EXPLORE) {
-            fetchIcon(tile.getData(), setupDelegate.createIconLoadCallback(tile));
+            updateIcon(tile, setupDelegate.createIconLoadCallback(tile));
         }
 
         TileGroup.TileInteractionDelegate delegate = setupDelegate.createInteractionDelegate(tile);
@@ -200,15 +237,21 @@
         return tileView;
     }
 
-    private void fetchIcon(
-            final SiteSuggestion siteData, final LargeIconBridge.LargeIconCallback iconCallback) {
-            mImageFetcher.makeLargeIconRequest(siteData.url, mMinIconSize, iconCallback);
-            return;
-    }
-
-    public void updateIcon(
-            SiteSuggestion siteData, LargeIconBridge.LargeIconCallback iconCallback) {
-        mImageFetcher.makeLargeIconRequest(siteData.url, mMinIconSize, iconCallback);
+    public void updateIcon(final Tile tile, final Runnable iconCallback) {
+        TemplateUrlService searchService = TemplateUrlServiceFactory.get();
+        if (searchService != null
+                && searchService.isSearchResultsPageFromDefaultSearchProvider(tile.getData().url)) {
+            // We already have an icon, and could trigger the update instantly.
+            // Problem is, the TileView is likely not attached yet and the update would not be
+            // properly reflected. Yield.
+            PostTask.postTask(UiThreadTaskTraits.DEFAULT, () -> {
+                setTileIconFromRes(tile, R.drawable.ic_suggestion_magnifier);
+                if (iconCallback != null) iconCallback.run();
+            });
+        } else {
+            mImageFetcher.makeLargeIconRequest(tile.getData().url, mMinIconSize,
+                    new LargeIconCallbackImpl(tile, iconCallback));
+        }
     }
 
     public void setTileIconFromBitmap(Tile tile, Bitmap icon) {
@@ -217,14 +260,21 @@
             radius = mDesiredIconSize / 2;
         }
         RoundedBitmapDrawable roundedIcon =
-                ViewUtils.createRoundedBitmapDrawable(mResources, icon, radius);
+                ViewUtils.createRoundedBitmapDrawable(mContext.getResources(), icon, radius);
         roundedIcon.setAntiAlias(true);
         roundedIcon.setFilterBitmap(true);
 
         tile.setIcon(roundedIcon);
+        tile.setIconTint(null);
         tile.setType(TileVisualType.ICON_REAL);
     }
 
+    public void setTileIconFromRes(Tile tile, @DrawableRes int res) {
+        tile.setIcon(ResourcesCompat.getDrawable(mContext.getResources(), res, null));
+        tile.setIconTint(ChromeColors.getSecondaryIconTint(mContext, /* isIncognito= */ false));
+        tile.setType(TileVisualType.ICON_DEFAULT);
+    }
+
     public void setTileIconFromColor(Tile tile, int fallbackColor, boolean isFallbackColorDefault) {
         // Explore should not have generated icons.
         if (tile.getSource() == TileSource.EXPLORE) {
@@ -232,7 +282,8 @@
         }
         mIconGenerator.setBackgroundColor(fallbackColor);
         Bitmap icon = mIconGenerator.generateIconForUrl(tile.getUrl());
-        tile.setIcon(new BitmapDrawable(mResources, icon));
+        tile.setIcon(new BitmapDrawable(mContext.getResources(), icon));
+        tile.setIconTint(null);
         tile.setType(
                 isFallbackColorDefault ? TileVisualType.ICON_DEFAULT : TileVisualType.ICON_COLOR);
     }
@@ -260,4 +311,9 @@
         assert false;
         return 0;
     }
+
+    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    public void setIconGeneratorForTesting(RoundedIconGenerator generator) {
+        mIconGenerator = generator;
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/SyncSettingsUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/SyncSettingsUtils.java
index ecb17f8..bf7f56a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/SyncSettingsUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/SyncSettingsUtils.java
@@ -242,7 +242,7 @@
             return context.getString(R.string.sync_error_generic);
         }
 
-        if (!syncService.isSyncRequested()) {
+        if (!syncService.isSyncRequested() || syncService.getChosenDataTypes().isEmpty()) {
             return context.getString(R.string.sync_data_types_off);
         }
 
@@ -305,7 +305,8 @@
         }
 
         SyncService syncService = SyncService.get();
-        if (syncService == null || !syncService.isSyncRequested()) {
+        if (syncService == null || !syncService.isSyncRequested()
+                || syncService.getChosenDataTypes().isEmpty()) {
             return AppCompatResources.getDrawable(context, R.drawable.ic_sync_off_48dp);
         }
         if (syncService.isSyncDisabledByEnterprisePolicy()) {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchBackgroundTaskTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchBackgroundTaskTest.java
index f624b46..5550c23 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchBackgroundTaskTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchBackgroundTaskTest.java
@@ -195,8 +195,6 @@
         });
         OfflineTestUtil.setPrefetchingEnabledByServer(true);
         OfflineTestUtil.setGCMTokenForTesting("dummy_gcm_token");
-
-        PrefetchBackgroundTask.alwaysSupportMinimalBrowserForTesting();
     }
 
     @After
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/tile/TileRendererTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/tile/TileRendererTest.java
deleted file mode 100644
index 101ddb6..0000000
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/tile/TileRendererTest.java
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright 2021 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.
-
-package org.chromium.chrome.browser.suggestions.tile;
-
-import android.widget.LinearLayout;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TestRule;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-import org.chromium.base.test.BaseActivityTestRule;
-import org.chromium.base.test.BaseJUnit4ClassRunner;
-import org.chromium.base.test.UiThreadTest;
-import org.chromium.base.test.util.Batch;
-import org.chromium.chrome.browser.suggestions.ImageFetcher;
-import org.chromium.chrome.browser.suggestions.SiteSuggestion;
-import org.chromium.chrome.browser.suggestions.SuggestionsConfig.TileStyle;
-import org.chromium.chrome.test.util.browser.Features;
-import org.chromium.ui.test.util.BlankUiTestActivity;
-import org.chromium.url.GURL;
-
-/** A simple test for {@link TileRenderer} using real {@link android.view.View} objects. */
-@RunWith(BaseJUnit4ClassRunner.class)
-@Batch(Batch.UNIT_TESTS)
-public class TileRendererTest {
-    private static final int TITLE_LINES = 1;
-
-    @Rule
-    public TestRule mFeaturesProcessor = new Features.JUnitProcessor();
-    @Rule
-    public BaseActivityTestRule<BlankUiTestActivity> mActivityTestRule =
-            new BaseActivityTestRule<>(BlankUiTestActivity.class);
-
-    @Mock
-    private ImageFetcher mMockImageFetcher;
-
-    @Mock
-    private TileGroup.TileSetupDelegate mTileSetupDelegate;
-
-    private LinearLayout mSharedParent;
-    private Tile mSharedTile;
-
-    @Before
-    public void setUp() {
-        mActivityTestRule.launchActivity(null);
-        MockitoAnnotations.initMocks(this);
-
-        mSharedParent = new LinearLayout(mActivityTestRule.getActivity());
-        SiteSuggestion siteSuggestion = new SiteSuggestion("Example", GURL.emptyGURL(), 0, 0, 0);
-        mSharedTile = new Tile(siteSuggestion, 0);
-    }
-
-    @Test
-    @UiThreadTest
-    @SmallTest
-    public void testBuildTestView_Modern() {
-        TileRenderer tileRenderer = new TileRenderer(
-                mActivityTestRule.getActivity(), TileStyle.MODERN, TITLE_LINES, mMockImageFetcher);
-
-        SuggestionsTileView tileView =
-                tileRenderer.buildTileView(mSharedTile, mSharedParent, mTileSetupDelegate);
-        Assert.assertNotNull(tileView);
-    }
-
-    @Test
-    @UiThreadTest
-    @SmallTest
-    public void testBuildTileView_ModernCondensed() {
-        TileRenderer tileRenderer = new TileRenderer(mActivityTestRule.getActivity(),
-                TileStyle.MODERN_CONDENSED, TITLE_LINES, mMockImageFetcher);
-
-        SuggestionsTileView tileView =
-                tileRenderer.buildTileView(mSharedTile, mSharedParent, mTileSetupDelegate);
-        Assert.assertNotNull(tileView);
-    }
-}
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/PartialCustomTabHeightStrategyTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/PartialCustomTabHeightStrategyTest.java
index 96a8c28..fee1e877 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/PartialCustomTabHeightStrategyTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/PartialCustomTabHeightStrategyTest.java
@@ -27,6 +27,7 @@
 import android.view.Display;
 import android.view.MotionEvent;
 import android.view.View;
+import android.view.ViewGroup;
 import android.view.ViewPropertyAnimator;
 import android.view.ViewStub;
 import android.view.Window;
@@ -116,7 +117,11 @@
     @Mock
     private View mToolbarView;
     @Mock
+    private View mToolbarCoordinator;
+    @Mock
     private FrameLayout mParentView;
+    @Mock
+    private ViewGroup mCoordinatorLayout;
 
     private List<WindowManager.LayoutParams> mAttributeResults;
     private DisplayMetrics mRealMetrics;
@@ -136,6 +141,8 @@
         when(mActivity.getWindowManager()).thenReturn(mWindowManager);
         when(mActivity.findViewById(R.id.custom_tabs_handle_view_stub)).thenReturn(mHandleViewStub);
         when(mActivity.findViewById(R.id.custom_tabs_handle_view)).thenReturn(mHandleView);
+        when(mHandleView.getLayoutParams()).thenReturn(mLayoutParams);
+        when(mToolbarCoordinator.getLayoutParams()).thenReturn(mLayoutParams);
         mAttributes = new WindowManager.LayoutParams();
         when(mWindow.getAttributes()).thenReturn(mAttributes);
         when(mWindow.getDecorView()).thenReturn(mDecorView);
@@ -152,6 +159,7 @@
         when(mSpinnerView.getParent()).thenReturn(mParentView);
         when(mSpinnerView.animate()).thenReturn(mViewAnimator);
         when(mParentView.getLayoutParams()).thenReturn(mLayoutParams);
+        when(mParentView.getParent()).thenReturn(mCoordinatorLayout);
 
         mParentViewSupplier.set(mParentView);
 
@@ -250,7 +258,8 @@
         PartialCustomTabHeightStrategy strategy = new PartialCustomTabHeightStrategy(mActivity,
                 mParentViewSupplier, 500, mMultiWindowModeStateDispatcher, null, null,
                 mOnResizedCallback, mActivityLifecycleDispatcher);
-        strategy.setMockViewForTesting(mNavbar, mSpinnerView, mSpinner, mToolbarView);
+        strategy.setMockViewForTesting(
+                mNavbar, mSpinnerView, mSpinner, mToolbarView, mToolbarCoordinator);
 
         verifyWindowFlagsSet();
 
@@ -327,7 +336,8 @@
         PartialCustomTabHeightStrategy strategy = new PartialCustomTabHeightStrategy(mActivity,
                 mParentViewSupplier, 800, mMultiWindowModeStateDispatcher, null, null,
                 mOnResizedCallback, mActivityLifecycleDispatcher);
-        strategy.setMockViewForTesting(mNavbar, mSpinnerView, mSpinner, mToolbarView);
+        strategy.setMockViewForTesting(
+                mNavbar, mSpinnerView, mSpinner, mToolbarView, mToolbarCoordinator);
 
         // Pass null because we have a mock Activity and we don't depend on the GestureDetector
         // inside as we test MotionEvents directly.
@@ -348,7 +358,8 @@
         PartialCustomTabHeightStrategy strategy = new PartialCustomTabHeightStrategy(mActivity,
                 mParentViewSupplier, 800, mMultiWindowModeStateDispatcher, null, null,
                 mOnResizedCallback, mActivityLifecycleDispatcher);
-        strategy.setMockViewForTesting(mNavbar, mSpinnerView, mSpinner, mToolbarView);
+        strategy.setMockViewForTesting(
+                mNavbar, mSpinnerView, mSpinner, mToolbarView, mToolbarCoordinator);
 
         mConfiguration.orientation = Configuration.ORIENTATION_LANDSCAPE;
         mRealMetrics.widthPixels = DEVICE_HEIGHT;
@@ -386,7 +397,8 @@
         PartialCustomTabHeightStrategy strategy = new PartialCustomTabHeightStrategy(mActivity,
                 mParentViewSupplier, 500, mMultiWindowModeStateDispatcher, null, null,
                 mOnResizedCallback, mActivityLifecycleDispatcher);
-        strategy.setMockViewForTesting(mNavbar, mSpinnerView, mSpinner, mToolbarView);
+        strategy.setMockViewForTesting(
+                mNavbar, mSpinnerView, mSpinner, mToolbarView, mToolbarCoordinator);
 
         verify(mWindow).addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
         verify(mWindow).clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
@@ -426,7 +438,8 @@
         PartialCustomTabHeightStrategy strategy = new PartialCustomTabHeightStrategy(mActivity,
                 mParentViewSupplier, 500, mMultiWindowModeStateDispatcher, null, null,
                 mOnResizedCallback, mActivityLifecycleDispatcher);
-        strategy.setMockViewForTesting(mNavbar, mSpinnerView, mSpinner, mToolbarView);
+        strategy.setMockViewForTesting(
+                mNavbar, mSpinnerView, mSpinner, mToolbarView, mToolbarCoordinator);
 
         verify(mWindow).addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
         verify(mWindow).clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
@@ -488,7 +501,8 @@
         PartialCustomTabHeightStrategy strategy = new PartialCustomTabHeightStrategy(mActivity,
                 mParentViewSupplier, 500, mMultiWindowModeStateDispatcher, null, null,
                 mOnResizedCallback, mActivityLifecycleDispatcher);
-        strategy.setMockViewForTesting(mNavbar, mSpinnerView, mSpinner, mToolbarView);
+        strategy.setMockViewForTesting(
+                mNavbar, mSpinnerView, mSpinner, mToolbarView, mToolbarCoordinator);
 
         verifyWindowFlagsSet();
 
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/read_later/ReadLaterIPHControllerUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/read_later/ReadLaterIPHControllerUnitTest.java
index a510062..d3a3fb1 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/read_later/ReadLaterIPHControllerUnitTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/read_later/ReadLaterIPHControllerUnitTest.java
@@ -40,6 +40,7 @@
 /** Unit test for {@link ReadLaterIPHController}. */
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
+@DisableFeatures({ChromeFeatureList.ANDROID_SCROLL_OPTIMIZATIONS})
 @EnableFeatures({ChromeFeatureList.READ_LATER, ChromeFeatureList.ENABLE_IPH})
 public class ReadLaterIPHControllerUnitTest {
     @Rule
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/suggestions/tile/TileRendererTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/suggestions/tile/TileRendererTest.java
new file mode 100644
index 0000000..5d08e190
--- /dev/null
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/suggestions/tile/TileRendererTest.java
@@ -0,0 +1,229 @@
+// Copyright 2021 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.
+
+package org.chromium.chrome.browser.suggestions.tile;
+
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anyInt;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.robolectric.Shadows.shadowOf;
+
+import android.app.Activity;
+import android.content.res.ColorStateList;
+import android.graphics.Bitmap;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.widget.LinearLayout;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.Robolectric;
+import org.robolectric.android.controller.ActivityController;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowDrawable;
+
+import org.chromium.base.library_loader.LibraryLoader;
+import org.chromium.base.metrics.test.ShadowRecordHistogram;
+import org.chromium.base.task.TaskTraits;
+import org.chromium.base.task.test.ShadowPostTask;
+import org.chromium.chrome.R;
+import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory;
+import org.chromium.chrome.browser.suggestions.ImageFetcher;
+import org.chromium.chrome.browser.suggestions.SiteSuggestion;
+import org.chromium.chrome.browser.suggestions.SuggestionsConfig.TileStyle;
+import org.chromium.components.browser_ui.widget.RoundedIconGenerator;
+import org.chromium.components.favicon.IconType;
+import org.chromium.components.favicon.LargeIconBridge.LargeIconCallback;
+import org.chromium.components.search_engines.TemplateUrlService;
+import org.chromium.content_public.browser.test.util.TestThreadUtils;
+import org.chromium.testing.local.LocalRobolectricTestRunner;
+import org.chromium.url.GURL;
+import org.chromium.url.JUnitTestGURLs;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/** A simple test for {@link TileRenderer} using real {@link android.view.View} objects. */
+@RunWith(LocalRobolectricTestRunner.class)
+@Config(manifest = Config.NONE, shadows = {ShadowRecordHistogram.class, ShadowPostTask.class})
+public class TileRendererTest {
+    /**
+     * Backend that substitutes normal PostTask operations. Allow us to coordinate task execution
+     * without having to wait or yield.
+     */
+    private static class ShadowPostTaskImpl extends ShadowPostTask.TestImpl {
+        private final List<Runnable> mRunnables = new ArrayList<>();
+
+        @Override
+        public void postDelayedTask(TaskTraits traits, Runnable task, long delay) {
+            mRunnables.add(task);
+        }
+
+        void runAll() {
+            for (int index = 0; index < mRunnables.size(); index++) {
+                mRunnables.get(index).run();
+            }
+            mRunnables.clear();
+        }
+    }
+
+    private static final int TITLE_LINES = 1;
+    private static final GURL TEST_URL = JUnitTestGURLs.getGURL(JUnitTestGURLs.EXAMPLE_URL);
+
+    @Mock
+    private ImageFetcher mMockImageFetcher;
+
+    @Mock
+    private TileGroup.TileSetupDelegate mTileSetupDelegate;
+
+    @Mock
+    private Runnable mTileSetupCallback;
+
+    @Mock
+    private TemplateUrlService mMockTemplateUrlService;
+
+    @Mock
+    private RoundedIconGenerator mIconGenerator;
+
+    @Mock
+    private Bitmap mBitmap;
+
+    @Mock
+    private ColorStateList mFakeColorStateList;
+
+    private ShadowPostTaskImpl mPostTaskRunner;
+    private ActivityController<Activity> mActivityController;
+    private Activity mActivity;
+    private LinearLayout mSharedParent;
+    private final ArgumentCaptor<Drawable> mIconCaptor = ArgumentCaptor.forClass(Drawable.class);
+    private final ArgumentCaptor<LargeIconCallback> mImageFetcherCallbackCaptor =
+            ArgumentCaptor.forClass(LargeIconCallback.class);
+
+    private Tile mTile;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mActivityController = Robolectric.buildActivity(Activity.class);
+        mActivityController.setup();
+        mActivity = mActivityController.get();
+        mActivity.setTheme(R.style.Theme_BrowserUI_DayNight);
+
+        mPostTaskRunner = new ShadowPostTaskImpl();
+        ShadowPostTask.setTestImpl(mPostTaskRunner);
+
+        LibraryLoader.getInstance().setLibrariesLoadedForNativeTests();
+        TemplateUrlServiceFactory.setInstanceForTesting(mMockTemplateUrlService);
+
+        mSharedParent = new LinearLayout(mActivity);
+        SiteSuggestion siteSuggestion =
+                new SiteSuggestion("Example", TEST_URL, 0, TileSource.TOP_SITES, 0);
+        mTile = new Tile(siteSuggestion, 0);
+        mTile.setIconTint(mFakeColorStateList);
+
+        // Set up mocks.
+        doReturn(mTileSetupCallback).when(mTileSetupDelegate).createIconLoadCallback(any());
+        doReturn(mBitmap).when(mIconGenerator).generateIconForUrl(any(GURL.class));
+    }
+
+    private void buildTileView(@TileStyle int style) {
+        TestThreadUtils.runOnUiThreadBlocking(() -> {
+            TileRenderer tileRenderer =
+                    new TileRenderer(mActivity, style, TITLE_LINES, mMockImageFetcher);
+            tileRenderer.setIconGeneratorForTesting(mIconGenerator);
+            SuggestionsTileView tileView =
+                    tileRenderer.buildTileView(mTile, mSharedParent, mTileSetupDelegate);
+            Assert.assertNotNull(tileView);
+        });
+    }
+
+    @Test
+    @SmallTest
+    public void testBuildTestView_Modern_noDecoration() {
+        buildTileView(TileStyle.MODERN);
+        // Expect no callbacks: we don't have any icon to offer there.
+        mPostTaskRunner.runAll();
+        verify(mTileSetupCallback, times(0)).run();
+    }
+
+    @Test
+    @SmallTest
+    public void testBuildTileView_ModernCondensed_noDecoration() {
+        buildTileView(TileStyle.MODERN_CONDENSED);
+        // Expect no callbacks: we don't have any icon to offer there.
+        mPostTaskRunner.runAll();
+        verify(mTileSetupCallback, times(0)).run();
+    }
+
+    @Test
+    @SmallTest
+    public void testBuildTileView_ModernCondensed_fallbackColor() {
+        buildTileView(TileStyle.MODERN_CONDENSED);
+        // Expect no callbacks: we don't have any icon to offer there.
+        mPostTaskRunner.runAll();
+        verify(mMockImageFetcher, times(1))
+                .makeLargeIconRequest(any(), anyInt(), mImageFetcherCallbackCaptor.capture());
+        verify(mTileSetupCallback, times(0)).run();
+        mImageFetcherCallbackCaptor.getValue().onLargeIconAvailable(
+                null, 0xace0ba5e, false, IconType.FAVICON);
+        verify(mTileSetupCallback, times(1)).run();
+
+        Assert.assertEquals(IconType.FAVICON, mTile.getIconType());
+        Assert.assertEquals(TileVisualType.ICON_COLOR, mTile.getType());
+        Assert.assertNull(mTile.getIconTint());
+
+        BitmapDrawable drawable = (BitmapDrawable) mTile.getIcon();
+        Assert.assertEquals(mBitmap, drawable.getBitmap());
+    }
+
+    @Test
+    @SmallTest
+    public void testBuildTileView_ModernCondensed_favicon() {
+        buildTileView(TileStyle.MODERN_CONDENSED);
+        // Expect no callbacks: we don't have any icon to offer there.
+        mPostTaskRunner.runAll();
+        verify(mMockImageFetcher, times(1))
+                .makeLargeIconRequest(any(), anyInt(), mImageFetcherCallbackCaptor.capture());
+        verify(mTileSetupCallback, times(0)).run();
+        mImageFetcherCallbackCaptor.getValue().onLargeIconAvailable(
+                mBitmap, 0xace0ba5e, false, IconType.TOUCH_ICON);
+        verify(mTileSetupCallback, times(1)).run();
+
+        Assert.assertEquals(IconType.TOUCH_ICON, mTile.getIconType());
+        Assert.assertEquals(TileVisualType.ICON_REAL, mTile.getType());
+        // Note: no way to test what bitmap got used here.
+        Assert.assertNotNull(mTile.getIcon());
+        Assert.assertNull(mTile.getIconTint());
+    }
+
+    @Test
+    @SmallTest
+    public void testBuildTestView_ModernSearch() {
+        doReturn(true)
+                .when(mMockTemplateUrlService)
+                .isSearchResultsPageFromDefaultSearchProvider(any());
+
+        buildTileView(TileStyle.MODERN);
+
+        verify(mTileSetupCallback, times(0)).run();
+        mPostTaskRunner.runAll();
+        verify(mTileSetupCallback, times(1)).run();
+
+        Assert.assertEquals(TileVisualType.ICON_DEFAULT, mTile.getType());
+        Assert.assertNotEquals(mFakeColorStateList, mTile.getIconTint());
+
+        ShadowDrawable shadowDrawable = shadowOf(mTile.getIcon());
+        Assert.assertEquals(
+                R.drawable.ic_suggestion_magnifier, shadowDrawable.getCreatedFromResId());
+    }
+}
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediatorUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediatorUnitTest.java
index f691b55..6157578 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediatorUnitTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarMediatorUnitTest.java
@@ -72,6 +72,7 @@
 import org.chromium.chrome.browser.util.ChromeAccessibilityUtil;
 import org.chromium.chrome.features.start_surface.StartSurfaceState;
 import org.chromium.chrome.test.util.browser.Features;
+import org.chromium.chrome.test.util.browser.Features.DisableFeatures;
 import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
 import org.chromium.components.feature_engagement.EventConstants;
 import org.chromium.components.feature_engagement.Tracker;
@@ -82,6 +83,7 @@
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
 @LooperMode(LooperMode.Mode.LEGACY)
+@DisableFeatures(ChromeFeatureList.ANDROID_SCROLL_OPTIMIZATIONS)
 @EnableFeatures(ChromeFeatureList.ENABLE_IPH)
 public class StartSurfaceToolbarMediatorUnitTest {
     private PropertyModel mPropertyModel;
diff --git a/chrome/android/trichrome.gni b/chrome/android/trichrome.gni
index 01b7f0b..c509e883 100644
--- a/chrome/android/trichrome.gni
+++ b/chrome/android/trichrome.gni
@@ -58,6 +58,7 @@
     # leave out the build hooks and let them get compiled into each APK. Later
     # this should probably be in the library.
     no_build_hooks = true
+    include_size_info = is_official_build
 
     alternative_android_sdk_dep = webview_framework_dep
     if (trichrome_synchronized_proguard) {
@@ -240,7 +241,7 @@
   # by SuperSize.
   _lines = [
     "# Written by build target \"${target_name}.\"",
-    "Library -f ${invoker.trichrome_library_basename}$_extra_args",
+    "Library -f ${invoker.trichrome_library_basename}$_extra_args --no-java",
     "Chrome -f ${invoker.trichrome_chrome_basename}$_extra_args",
     "WebView -f ${invoker.trichrome_webview_basename}$_extra_args",
   ]
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 849b3b6..f7c4434c 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -56,6 +56,7 @@
 #include "chrome/browser/sharing_hub/sharing_hub_features.h"
 #include "chrome/browser/site_isolation/about_flags.h"
 #include "chrome/browser/ui/app_list/search/search_features.h"
+#include "chrome/browser/ui/browser_navigator_params.h"
 #include "chrome/browser/ui/ui_features.h"
 #include "chrome/browser/unexpire_flags.h"
 #include "chrome/browser/unexpire_flags_gen.h"
@@ -6326,10 +6327,6 @@
      FEATURE_VALUE_TYPE(features::kLogJsConsoleMessages)},
 #endif  // BUILDFLAG(IS_ANDROID)
 
-    {"enable-skia-renderer", flag_descriptions::kSkiaRendererName,
-     flag_descriptions::kSkiaRendererDescription, kOsAll,
-     FEATURE_VALUE_TYPE(features::kUseSkiaRenderer)},
-
 #if BUILDFLAG(IS_CHROMEOS_ASH)
     {"allow-disable-touchpad-haptic-feedback",
      flag_descriptions::kAllowDisableTouchpadHapticFeedbackName,
@@ -9058,7 +9055,9 @@
 #else
   // Note: This will only be called by the UI when Lacros is available.
   DCHECK(crosapi::BrowserManager::Get());
-  crosapi::BrowserManager::Get()->SwitchToTab(GURL(chrome::kChromeUIFlagsURL));
+  crosapi::BrowserManager::Get()->SwitchToTab(
+      GURL(chrome::kChromeUIFlagsURL),
+      /*path_behavior=*/NavigateParams::RESPECT);
 #endif
 }
 #endif
diff --git a/chrome/browser/app_controller_mac_browsertest.mm b/chrome/browser/app_controller_mac_browsertest.mm
index 8bd6c1a..77cef98 100644
--- a/chrome/browser/app_controller_mac_browsertest.mm
+++ b/chrome/browser/app_controller_mac_browsertest.mm
@@ -331,7 +331,7 @@
       [[NSApplication sharedApplication] delegate]);
   ASSERT_TRUE(app_controller);
 
-  ExtensionTestMessageListener listener("Launched", false);
+  ExtensionTestMessageListener listener("Launched");
   const extensions::Extension* app =
       InstallAndLaunchPlatformApp("minimal");
   ASSERT_TRUE(listener.WaitUntilSatisfied());
diff --git a/chrome/browser/apps/app_service/publishers/standalone_browser_apps.cc b/chrome/browser/apps/app_service/publishers/standalone_browser_apps.cc
index e260966..a34288f 100644
--- a/chrome/browser/apps/app_service/publishers/standalone_browser_apps.cc
+++ b/chrome/browser/apps/app_service/publishers/standalone_browser_apps.cc
@@ -15,6 +15,7 @@
 #include "chrome/browser/apps/app_service/browser_app_instance_registry.h"
 #include "chrome/browser/apps/app_service/menu_util.h"
 #include "chrome/browser/ash/crosapi/browser_util.h"
+#include "chrome/browser/ui/browser_navigator_params.h"
 #include "chrome/browser/web_applications/web_app_utils.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/webui_url_constants.h"
@@ -219,7 +220,8 @@
   // `browser_manager` may be null in tests.
   if (!browser_manager)
     return;
-  browser_manager->SwitchToTab(GURL(chrome::kChromeUIContentSettingsURL));
+  browser_manager->SwitchToTab(GURL(chrome::kChromeUIContentSettingsURL),
+                               /*path_behavior=*/NavigateParams::RESPECT);
 }
 
 void StandaloneBrowserApps::StopApp(const std::string& app_id) {
diff --git a/chrome/browser/ash/accessibility/accessibility_manager.cc b/chrome/browser/ash/accessibility/accessibility_manager.cc
index 61806a0..ce8894e 100644
--- a/chrome/browser/ash/accessibility/accessibility_manager.cc
+++ b/chrome/browser/ash/accessibility/accessibility_manager.cc
@@ -273,7 +273,8 @@
 void AccessibilityManager::ShowAccessibilityHelp() {
   if (crosapi::browser_util::IsLacrosPrimaryBrowser()) {
     crosapi::BrowserManager::Get()->SwitchToTab(
-        GURL(chrome::kChromeAccessibilityHelpURL));
+        GURL(chrome::kChromeAccessibilityHelpURL),
+        /*path_behavior=*/NavigateParams::RESPECT);
     return;
   }
 
diff --git a/chrome/browser/ash/arc/session/arc_session_manager.cc b/chrome/browser/ash/arc/session/arc_session_manager.cc
index 2be0498..33731ec2 100644
--- a/chrome/browser/ash/arc/session/arc_session_manager.cc
+++ b/chrome/browser/ash/arc/session/arc_session_manager.cc
@@ -1812,7 +1812,10 @@
   std::deque<JobDesc> jobs = {
       JobDesc{kArcPrepareHostGeneratedDirJobName,
               UpstartOperation::JOB_START,
-              {std::string("IS_ARCVM=") + (is_arcvm ? "1" : "0")}},
+              {std::string("IS_ARCVM=") + (is_arcvm ? "1" : "0"),
+               // TODO(b/233107740) Remove this once crrev.com/c/3656121 has
+               // landed.
+               std::string("ADD_NATIVE_BRIDGE_64BIT_SUPPORT=0")}},
   };
   ConfigureUpstartJobs(std::move(jobs),
                        base::BindOnce(&ArcSessionManager::OnExpandPropertyFiles,
diff --git a/chrome/browser/ash/crosapi/BUILD.gn b/chrome/browser/ash/crosapi/BUILD.gn
index d5df81d..5ee0712 100644
--- a/chrome/browser/ash/crosapi/BUILD.gn
+++ b/chrome/browser/ash/crosapi/BUILD.gn
@@ -370,6 +370,7 @@
     "//chromeos/login/login_state",
     "//chromeos/printing",
     "//chromeos/startup:constants",
+    "//chromeos/system",
     "//components/component_updater:test_support",
     "//components/session_manager/core",
     "//printing/backend",
diff --git a/chrome/browser/ash/crosapi/browser_manager.cc b/chrome/browser/ash/crosapi/browser_manager.cc
index 73aa5e3..d8d96cb 100644
--- a/chrome/browser/ash/crosapi/browser_manager.cc
+++ b/chrome/browser/ash/crosapi/browser_manager.cc
@@ -31,6 +31,7 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/metrics/user_metrics.h"
 #include "base/metrics/user_metrics_action.h"
+#include "base/notreached.h"
 #include "base/path_service.h"
 #include "base/posix/eintr_wrapper.h"
 #include "base/process/launch.h"
@@ -66,10 +67,12 @@
 #include "chrome/browser/prefs/incognito_mode_prefs.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/ui/ash/shelf/chrome_shelf_controller.h"
+#include "chrome/browser/ui/browser_navigator_params.h"
 #include "chrome/common/channel_info.h"
 #include "chrome/common/chrome_paths.h"
 #include "chromeos/crosapi/cpp/crosapi_constants.h"
 #include "chromeos/crosapi/cpp/lacros_startup_state.h"
+#include "chromeos/crosapi/mojom/crosapi.mojom-shared.h"
 #include "chromeos/startup/startup_switches.h"
 #include "components/crash/core/app/crashpad.h"
 #include "components/nacl/common/buildflags.h"
@@ -393,6 +396,16 @@
   }
 }
 
+crosapi::mojom::OpenUrlParams_SwitchToTabPathBehavior ConvertPathBehavior(
+    NavigateParams::PathBehavior path_behavior) {
+  switch (path_behavior) {
+    case NavigateParams::RESPECT:
+      return crosapi::mojom::OpenUrlParams_SwitchToTabPathBehavior::kRespect;
+    case NavigateParams::IGNORE_AND_NAVIGATE:
+      return crosapi::mojom::OpenUrlParams_SwitchToTabPathBehavior::kIgnore;
+  }
+}
+
 }  // namespace
 
 BrowserManager::RestoreFromDeskTemplate::RestoreFromDeskTemplate(
@@ -650,13 +663,14 @@
   OpenUrlImpl(
       url,
       crosapi::mojom::OpenUrlParams::WindowOpenDisposition::kNewForegroundTab,
-      from);
+      from, NavigateParams::RESPECT);
 }
 
-void BrowserManager::SwitchToTab(const GURL& url) {
+void BrowserManager::SwitchToTab(const GURL& url,
+                                 NavigateParams::PathBehavior path_behavior) {
   OpenUrlImpl(
       url, crosapi::mojom::OpenUrlParams::WindowOpenDisposition::kSwitchToTab,
-      crosapi::mojom::OpenUrlFrom::kUnspecified);
+      crosapi::mojom::OpenUrlFrom::kUnspecified, path_behavior);
 }
 
 void BrowserManager::RestoreTab() {
@@ -1560,7 +1574,8 @@
 void BrowserManager::OpenUrlImpl(
     const GURL& url,
     crosapi::mojom::OpenUrlParams::WindowOpenDisposition disposition,
-    crosapi::mojom::OpenUrlFrom from) {
+    crosapi::mojom::OpenUrlFrom from,
+    NavigateParams::PathBehavior path_behavior) {
   auto result = MaybeStart(browser_util::InitialBrowserAction(
       mojom::InitialBrowserAction::kOpenWindowWithUrls, {url}, from));
   if (result != MaybeStartResult::kRunning)
@@ -1580,6 +1595,7 @@
   auto params = OpenUrlParams::New();
   params->disposition = disposition;
   params->from = from;
+  params->path_behavior = ConvertPathBehavior(path_behavior);
   browser_service_->service->OpenUrl(url, std::move(params), base::DoNothing());
 }
 
diff --git a/chrome/browser/ash/crosapi/browser_manager.h b/chrome/browser/ash/crosapi/browser_manager.h
index a2c9cd3..c30e130 100644
--- a/chrome/browser/ash/crosapi/browser_manager.h
+++ b/chrome/browser/ash/crosapi/browser_manager.h
@@ -24,6 +24,7 @@
 #include "chrome/browser/ash/crosapi/crosapi_id.h"
 #include "chrome/browser/ash/crosapi/crosapi_util.h"
 #include "chrome/browser/ash/crosapi/environment_provider.h"
+#include "chrome/browser/ui/browser_navigator_params.h"
 #include "chromeos/crosapi/mojom/crosapi.mojom.h"
 #include "chromeos/crosapi/mojom/desk_template.mojom.h"
 #include "components/component_updater/component_updater_service.h"
@@ -176,8 +177,10 @@
 
   // If there's already a tab opening the URL in lacros-chrome, in some window
   // of the primary profile, activate the tab. Otherwise, opens a tab for
-  // the given URL.
-  void SwitchToTab(const GURL& url);
+  // the given URL. `path_behavior` will be assigned to the variable of the same
+  // name in the `NavigateParams` struct that's used to perform the actual
+  // navigation downstream.
+  void SwitchToTab(const GURL& url, NavigateParams::PathBehavior path_behavior);
 
   // Similar to NewWindow(), but restores a tab recently closed.
   // See crosapi::mojom::BrowserService::RestoreTab for more details
@@ -517,7 +520,8 @@
   void OpenUrlImpl(
       const GURL& url,
       crosapi::mojom::OpenUrlParams::WindowOpenDisposition disposition,
-      crosapi::mojom::OpenUrlFrom from);
+      crosapi::mojom::OpenUrlFrom from,
+      NavigateParams::PathBehavior path_behavior);
 
   // Returns true if the crosapi interface of the currently running lacros
   // supports NewGuestWindow API. If lacros is older or lacros is not running,
diff --git a/chrome/browser/ash/crosapi/browser_util_unittest.cc b/chrome/browser/ash/crosapi/browser_util_unittest.cc
index 604155b..026af60fe 100644
--- a/chrome/browser/ash/crosapi/browser_util_unittest.cc
+++ b/chrome/browser/ash/crosapi/browser_util_unittest.cc
@@ -24,6 +24,7 @@
 #include "chrome/test/base/testing_browser_process.h"
 #include "chrome/test/base/testing_profile.h"
 #include "chromeos/crosapi/mojom/crosapi.mojom.h"
+#include "chromeos/system/fake_statistics_provider.h"
 #include "components/account_id/account_id.h"
 #include "components/policy/policy_constants.h"
 #include "components/user_manager/scoped_user_manager.h"
@@ -76,6 +77,12 @@
     scoped_user_manager_ = std::make_unique<user_manager::ScopedUserManager>(
         base::WrapUnique(fake_user_manager_));
     browser_util::RegisterLocalStatePrefs(pref_service_.registry());
+    chromeos::system::StatisticsProvider::SetTestProvider(
+        &statistics_provider_);
+  }
+
+  void TearDown() override {
+    chromeos::system::StatisticsProvider::SetTestProvider(nullptr);
   }
 
   void AddRegularUser(const std::string& email) {
@@ -95,6 +102,7 @@
   ash::FakeChromeUserManager* fake_user_manager_ = nullptr;
   std::unique_ptr<user_manager::ScopedUserManager> scoped_user_manager_;
   TestingPrefServiceSimple pref_service_;
+  chromeos::system::FakeStatisticsProvider statistics_provider_;
 };
 
 class LacrosSupportBrowserUtilTest : public BrowserUtilTest {
@@ -831,4 +839,26 @@
   EXPECT_TRUE(browser_init_params->device_properties->is_tablet_form_factor);
 }
 
+TEST_F(BrowserUtilTest, SerialNumber) {
+  IdleServiceAsh::DisableForTesting();
+  ScopedTestingLocalState local_state(TestingBrowserProcess::GetGlobal());
+  AddRegularUser("user@google.com");
+
+  std::string expected_serial_number = "fake-serial-number";
+  statistics_provider_.SetMachineStatistic("serial_number",
+                                           expected_serial_number);
+
+  EnvironmentProvider environment_provider;
+  mojom::BrowserInitParamsPtr browser_init_params =
+      browser_util::GetBrowserInitParams(
+          &environment_provider,
+          browser_util::InitialBrowserAction(
+              crosapi::mojom::InitialBrowserAction::kDoNotOpenWindow),
+          /*is_keep_alive_enabled=*/false);
+
+  auto serial_number = browser_init_params->device_properties->serial_number;
+  ASSERT_TRUE(serial_number.has_value());
+  EXPECT_EQ(serial_number.value(), expected_serial_number);
+}
+
 }  // namespace crosapi
diff --git a/chrome/browser/ash/crosapi/crosapi_util.cc b/chrome/browser/ash/crosapi/crosapi_util.cc
index da417dc..861db27 100644
--- a/chrome/browser/ash/crosapi/crosapi_util.cc
+++ b/chrome/browser/ash/crosapi/crosapi_util.cc
@@ -21,10 +21,13 @@
 #include "chrome/browser/ash/crosapi/idle_service_ash.h"
 #include "chrome/browser/ash/crosapi/native_theme_service_ash.h"
 #include "chrome/browser/ash/crosapi/resource_manager_ash.h"
+#include "chrome/browser/ash/policy/core/browser_policy_connector_ash.h"
+#include "chrome/browser/ash/policy/handlers/device_name_policy_handler.h"
 #include "chrome/browser/ash/profiles/profile_helper.h"
 #include "chrome/browser/ash/settings/cros_settings.h"
 #include "chrome/browser/ash/settings/device_settings_service.h"
 #include "chrome/browser/browser_process.h"
+#include "chrome/browser/browser_process_platform_part.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/ui/webui/chrome_web_ui_controller_factory.h"
 #include "chrome/browser/web_applications/web_app_utils.h"
@@ -95,6 +98,7 @@
 #include "chromeos/crosapi/mojom/web_page_info.mojom.h"
 #include "chromeos/services/machine_learning/public/mojom/machine_learning_service.mojom.h"
 #include "chromeos/startup/startup.h"
+#include "chromeos/system/statistics_provider.h"
 #include "components/account_manager_core/account_manager_util.h"
 #include "components/metrics/metrics_pref_names.h"
 #include "components/metrics/metrics_service.h"
@@ -173,6 +177,21 @@
 
   result->is_arc_available = arc::IsArcAvailable();
   result->is_tablet_form_factor = ash::switches::IsTabletFormFactor();
+
+  policy::BrowserPolicyConnectorAsh* policy_connector =
+      g_browser_process->platform_part()->browser_policy_connector_ash();
+  result->directory_device_id = policy_connector->GetDirectoryApiID();
+  result->serial_number = chromeos::system::StatisticsProvider::GetInstance()
+                              ->GetEnterpriseMachineID();
+  result->annotated_asset_id = policy_connector->GetDeviceAssetID();
+  result->annotated_location = policy_connector->GetDeviceAnnotatedLocation();
+  auto* device_name_policy_handler =
+      policy_connector->GetDeviceNamePolicyHandler();
+  if (device_name_policy_handler) {
+    result->hostname =
+        device_name_policy_handler->GetHostnameChosenByAdministrator();
+  }
+
   return result;
 }
 
diff --git a/chrome/browser/ash/crosapi/prefs_ash.cc b/chrome/browser/ash/crosapi/prefs_ash.cc
index 3a84127..4727155 100644
--- a/chrome/browser/ash/crosapi/prefs_ash.cc
+++ b/chrome/browser/ash/crosapi/prefs_ash.cc
@@ -90,7 +90,9 @@
            {mojom::PrefPath::kAccessibilitySwitchAccessEnabled,
             ash::prefs::kAccessibilitySwitchAccessEnabled},
            {mojom::PrefPath::kAccessibilityVirtualKeyboardEnabled,
-            ash::prefs::kAccessibilityVirtualKeyboardEnabled}});
+            ash::prefs::kAccessibilityVirtualKeyboardEnabled},
+           {mojom::PrefPath::kProtectedContentDefault,
+            prefs::kProtectedContentDefault}});
   auto pref_name = extension_prefpath_to_name->find(path);
   DCHECK(pref_name != extension_prefpath_to_name->end());
   return pref_name->second;
@@ -302,7 +304,8 @@
     case mojom::PrefPath::kExtensionAccessibilitySpokenFeedbackEnabled:
     case mojom::PrefPath::kAccessibilityStickyKeysEnabled:
     case mojom::PrefPath::kAccessibilitySwitchAccessEnabled:
-    case mojom::PrefPath::kAccessibilityVirtualKeyboardEnabled: {
+    case mojom::PrefPath::kAccessibilityVirtualKeyboardEnabled:
+    case mojom::PrefPath::kProtectedContentDefault: {
       if (!profile_prefs_registrar_) {
         LOG(WARNING) << "Primary profile is not yet initialized";
         return absl::nullopt;
diff --git a/chrome/browser/ash/crosapi/test_mojo_connection_manager_unittest.cc b/chrome/browser/ash/crosapi/test_mojo_connection_manager_unittest.cc
index 36880e61..6da3ed0 100644
--- a/chrome/browser/ash/crosapi/test_mojo_connection_manager_unittest.cc
+++ b/chrome/browser/ash/crosapi/test_mojo_connection_manager_unittest.cc
@@ -40,6 +40,7 @@
 #include "chromeos/crosapi/mojom/crosapi.mojom.h"
 #include "chromeos/login/login_state/login_state.h"
 #include "chromeos/startup/startup_switches.h"
+#include "chromeos/system/fake_statistics_provider.h"
 #include "components/account_id/account_id.h"
 #include "components/user_manager/fake_user_manager.h"
 #include "content/public/test/browser_task_environment.h"
@@ -171,6 +172,10 @@
 using TestMojoConnectionManagerTest = testing::Test;
 
 TEST_F(TestMojoConnectionManagerTest, ConnectMultipleClients) {
+  // Set fake statistics provider which is needed by crosapi_util.
+  chromeos::system::FakeStatisticsProvider statistics_provider_;
+  chromeos::system::StatisticsProvider::SetTestProvider(&statistics_provider_);
+
   // Create temp dir before task environment, just in case lingering tasks need
   // to access it.
   base::ScopedTempDir temp_dir;
diff --git a/chrome/browser/ash/login/app_mode/test/kiosk_enterprise_browsertest.cc b/chrome/browser/ash/login/app_mode/test/kiosk_enterprise_browsertest.cc
index 8f6a737..905560f 100644
--- a/chrome/browser/ash/login/app_mode/test/kiosk_enterprise_browsertest.cc
+++ b/chrome/browser/ash/login/app_mode/test/kiosk_enterprise_browsertest.cc
@@ -39,7 +39,8 @@
 
 namespace {
 
-const char kTestEnterpriseServiceAccountId[] = "service_account@example.com";
+const char kTestEnterpriseServiceAccountEmail[] =
+    "service_account@system.gserviceaccount.com";
 const char kTestRefreshToken[] = "fake-refresh-token";
 const char kTestUserinfoToken[] = "fake-userinfo-token";
 const char kTestLoginToken[] = "fake-login-token";
@@ -72,7 +73,7 @@
     userinfo_token_info.scopes.insert(
         "https://www.googleapis.com/auth/userinfo.email");
     userinfo_token_info.audience = gaia_urls->oauth2_chrome_client_id();
-    userinfo_token_info.email = kTestEnterpriseServiceAccountId;
+    userinfo_token_info.email = kTestEnterpriseServiceAccountEmail;
     fake_gaia_.fake_gaia()->IssueOAuthToken(kTestRefreshToken,
                                             userinfo_token_info);
 
@@ -89,7 +90,7 @@
     access_token_info.token = kTestAccessToken;
     access_token_info.scopes.insert(kTestAppScope);
     access_token_info.audience = kTestClientId;
-    access_token_info.email = kTestEnterpriseServiceAccountId;
+    access_token_info.email = kTestEnterpriseServiceAccountEmail;
     fake_gaia_.fake_gaia()->IssueOAuthToken(kTestLoginToken, access_token_info);
 
     DeviceOAuth2TokenService* token_service =
@@ -109,7 +110,7 @@
     settings_helper_.SetString(kAccountsPrefDeviceLocalAccountAutoLoginId,
                                account_id);
     settings_helper_.SetString(kServiceAccountIdentity,
-                               kTestEnterpriseServiceAccountId);
+                               kTestEnterpriseServiceAccountEmail);
   }
 
  private:
diff --git a/chrome/browser/ash/login/reporting/login_logout_reporter.cc b/chrome/browser/ash/login/reporting/login_logout_reporter.cc
index 6b0bcb4..ba16eff 100644
--- a/chrome/browser/ash/login/reporting/login_logout_reporter.cc
+++ b/chrome/browser/ash/login/reporting/login_logout_reporter.cc
@@ -177,7 +177,9 @@
              reporter_helper_->ShouldReportUser(user_email)) {
     record.mutable_affiliated_user()->set_user_email(user_email);
   }
-  reporter_helper_->ReportEvent(&record, ::reporting::Priority::SECURITY);
+  reporter_helper_->ReportEvent(
+      std::make_unique<LoginLogoutRecord>(std::move(record)),
+      ::reporting::Priority::SECURITY);
 }
 
 void LoginLogoutReporter::OnLogin(Profile* profile) {
@@ -244,10 +246,10 @@
     return;
   }
 
-  LoginLogoutRecord record;
-  record.set_event_timestamp_sec(last_kiosk_login_failure_timestamp.value());
-  record.set_session_type(LoginLogoutSessionType::KIOSK_SESSION);
-  record.mutable_login_event()->mutable_failure();
+  auto record = std::make_unique<LoginLogoutRecord>();
+  record->set_event_timestamp_sec(last_kiosk_login_failure_timestamp.value());
+  record->set_session_type(LoginLogoutSessionType::KIOSK_SESSION);
+  record->mutable_login_event()->mutable_failure();
 
   auto enqueue_cb = base::BindOnce([](::reporting::Status status) {
     if (!status.ok()) {
@@ -267,7 +269,7 @@
   // Enqueue callback should run on the UI thread (current thread) to access
   // pref service.
   reporter_helper_->ReportEvent(
-      &record, ::reporting::Priority::SECURITY,
+      std::move(record), ::reporting::Priority::SECURITY,
       base::BindPostTask(base::ThreadTaskRunnerHandle::Get(),
                          std::move(enqueue_cb)));
 }
diff --git a/chrome/browser/ash/policy/reporting/extension_install_event_log_uploader.cc b/chrome/browser/ash/policy/reporting/extension_install_event_log_uploader.cc
index 05b7213d..959561c 100644
--- a/chrome/browser/ash/policy/reporting/extension_install_event_log_uploader.cc
+++ b/chrome/browser/ash/policy/reporting/extension_install_event_log_uploader.cc
@@ -131,7 +131,8 @@
       },
       weak_factory_.GetWeakPtr(), base::ThreadTaskRunnerHandle::Get());
 
-  report_queue_->Enqueue(value_report, ::reporting::Priority::SLOW_BATCH,
+  report_queue_->Enqueue(std::move(value_report),
+                         ::reporting::Priority::SLOW_BATCH,
                          std::move(on_enqueue_done_cb));
 }
 
diff --git a/chrome/browser/ash/policy/reporting/remoting_host_event_reporter_delegate_impl.cc b/chrome/browser/ash/policy/reporting/remoting_host_event_reporter_delegate_impl.cc
index c50e96cb..1f3ac01 100644
--- a/chrome/browser/ash/policy/reporting/remoting_host_event_reporter_delegate_impl.cc
+++ b/chrome/browser/ash/policy/reporting/remoting_host_event_reporter_delegate_impl.cc
@@ -65,8 +65,9 @@
               record.host_user().user_email())) {
         record.clear_host_user();  // anonymize host user.
       }
-      user_event_helper_.ReportEvent(&record,
-                                     ::reporting::Priority::FAST_BATCH);
+      user_event_helper_.ReportEvent(
+          std::make_unique<::ash::reporting::CRDRecord>(std::move(record)),
+          ::reporting::Priority::FAST_BATCH);
     }
 
     // Task runner for asynchronous actions (including destructor).
diff --git a/chrome/browser/ash/policy/reporting/user_added_removed/user_added_removed_reporter.cc b/chrome/browser/ash/policy/reporting/user_added_removed/user_added_removed_reporter.cc
index 9efba1a..c41fb980 100644
--- a/chrome/browser/ash/policy/reporting/user_added_removed/user_added_removed_reporter.cc
+++ b/chrome/browser/ash/policy/reporting/user_added_removed/user_added_removed_reporter.cc
@@ -56,14 +56,14 @@
   }
 
   auto email = user->GetAccountId().GetUserEmail();
-  UserAddedRemovedRecord record;
-  record.mutable_user_added_event();
+  auto record = std::make_unique<UserAddedRemovedRecord>();
+  record->mutable_user_added_event();
   if (helper_->ShouldReportUser(email)) {
-    record.mutable_affiliated_user()->set_user_email(email);
+    record->mutable_affiliated_user()->set_user_email(email);
   }
-  record.set_event_timestamp_sec(base::Time::Now().ToTimeT());
+  record->set_event_timestamp_sec(base::Time::Now().ToTimeT());
 
-  helper_->ReportEvent(&record, ::reporting::Priority::IMMEDIATE);
+  helper_->ReportEvent(std::move(record), ::reporting::Priority::IMMEDIATE);
 }
 
 void UserAddedRemovedReporter::OnUserToBeRemoved(const AccountId& account_id) {
@@ -97,14 +97,15 @@
   bool is_affiliated_user = it->second;
   users_to_be_deleted_.erase(it);
 
-  UserAddedRemovedRecord record;
-  record.mutable_user_removed_event()->set_reason(UserRemovalReason(reason));
+  auto record = std::make_unique<UserAddedRemovedRecord>();
+  record->mutable_user_removed_event()->set_reason(UserRemovalReason(reason));
   if (is_affiliated_user) {
-    record.mutable_affiliated_user()->set_user_email(account_id.GetUserEmail());
+    record->mutable_affiliated_user()->set_user_email(
+        account_id.GetUserEmail());
   }
-  record.set_event_timestamp_sec(base::Time::Now().ToTimeT());
+  record->set_event_timestamp_sec(base::Time::Now().ToTimeT());
 
-  helper_->ReportEvent(&record, ::reporting::Priority::IMMEDIATE);
+  helper_->ReportEvent(std::move(record), ::reporting::Priority::IMMEDIATE);
 }
 
 void UserAddedRemovedReporter::ProcessRemoveUserCache() {
@@ -112,15 +113,15 @@
   auto users = user_manager->GetRemovedUserCache();
 
   for (const auto& user : users) {
-    UserAddedRemovedRecord record;
-    record.set_event_timestamp_sec(base::Time::Now().ToTimeT());
-    record.mutable_user_removed_event()->set_reason(
+    auto record = std::make_unique<UserAddedRemovedRecord>();
+    record->set_event_timestamp_sec(base::Time::Now().ToTimeT());
+    record->mutable_user_removed_event()->set_reason(
         UserRemovalReason(user.second));
     if (user.first != "") {
-      record.mutable_affiliated_user()->set_user_email(user.first);
+      record->mutable_affiliated_user()->set_user_email(user.first);
     }
 
-    helper_->ReportEvent(&record, ::reporting::Priority::IMMEDIATE);
+    helper_->ReportEvent(std::move(record), ::reporting::Priority::IMMEDIATE);
   }
 
   user_manager->MarkReporterInitialized();
diff --git a/chrome/browser/ash/policy/reporting/user_added_removed/user_added_removed_reporter_unittest.cc b/chrome/browser/ash/policy/reporting/user_added_removed/user_added_removed_reporter_unittest.cc
index e1b649d..48cb211d 100644
--- a/chrome/browser/ash/policy/reporting/user_added_removed/user_added_removed_reporter_unittest.cc
+++ b/chrome/browser/ash/policy/reporting/user_added_removed/user_added_removed_reporter_unittest.cc
@@ -53,11 +53,11 @@
   bool IsCurrentUserNew() const override { return is_user_new_; }
 
   void ReportEvent(
-      const google::protobuf::MessageLite* record,
+      std::unique_ptr<const google::protobuf::MessageLite> record,
       Priority priority,
       ReportQueue::EnqueueCallback enqueue_cb = base::DoNothing()) override {
     event_reported_ = true;
-    mock_queue_->Enqueue(record, priority, std::move(enqueue_cb));
+    mock_queue_->Enqueue(std::move(record), priority, std::move(enqueue_cb));
   }
 
   base::WeakPtr<::reporting::MockReportQueueStrict> mock_queue_;
diff --git a/chrome/browser/ash/policy/reporting/user_event_reporter_helper.cc b/chrome/browser/ash/policy/reporting/user_event_reporter_helper.cc
index c7bbcb0..eb390b1d 100644
--- a/chrome/browser/ash/policy/reporting/user_event_reporter_helper.cc
+++ b/chrome/browser/ash/policy/reporting/user_event_reporter_helper.cc
@@ -43,7 +43,7 @@
 }
 
 void UserEventReporterHelper::ReportEvent(
-    const google::protobuf::MessageLite* record,
+    std::unique_ptr<const google::protobuf::MessageLite> record,
     Priority priority,
     ReportQueue::EnqueueCallback enqueue_cb) {
   if (!report_queue_) {
@@ -51,7 +51,7 @@
         .Run(Status(error::UNAVAILABLE, "Reporting queue is null."));
     return;
   }
-  report_queue_->Enqueue(record, priority, std::move(enqueue_cb));
+  report_queue_->Enqueue(std::move(record), priority, std::move(enqueue_cb));
 }
 
 bool UserEventReporterHelper::IsCurrentUserNew() const {
diff --git a/chrome/browser/ash/policy/reporting/user_event_reporter_helper.h b/chrome/browser/ash/policy/reporting/user_event_reporter_helper.h
index acd42bf..cd0773f 100644
--- a/chrome/browser/ash/policy/reporting/user_event_reporter_helper.h
+++ b/chrome/browser/ash/policy/reporting/user_event_reporter_helper.h
@@ -52,7 +52,7 @@
   // Reports an event to the queue.
   // Thread safe, can be called on any thread.
   virtual void ReportEvent(
-      const google::protobuf::MessageLite* record,
+      std::unique_ptr<const google::protobuf::MessageLite> record,
       Priority priority,
       ReportQueue::EnqueueCallback enqueue_cb =
           base::BindOnce(&UserEventReporterHelper::OnEnqueueDefault));
diff --git a/chrome/browser/ash/policy/reporting/user_event_reporter_helper_unittest.cc b/chrome/browser/ash/policy/reporting/user_event_reporter_helper_unittest.cc
index 3ab4fff..915077e 100644
--- a/chrome/browser/ash/policy/reporting/user_event_reporter_helper_unittest.cc
+++ b/chrome/browser/ash/policy/reporting/user_event_reporter_helper_unittest.cc
@@ -40,7 +40,9 @@
       });
 
   UserEventReporterHelper reporter(std::move(mock_queue));
-  reporter.ReportEvent(&input_record, Priority::IMMEDIATE);
+  reporter.ReportEvent(
+      std::make_unique<UserEventReporterTestingRecord>(input_record),
+      Priority::IMMEDIATE);
 
   EXPECT_EQ(priority, Priority::IMMEDIATE);
   EXPECT_EQ(enqueued_record.field1(), input_record.field1());
@@ -73,7 +75,8 @@
 
   UserEventReporterHelper reporter(std::move(mock_queue));
   reporter.ReportEvent(
-      &input_record, Priority::IMMEDIATE,
+      std::make_unique<UserEventReporterTestingRecord>(input_record),
+      Priority::IMMEDIATE,
       base::BindLambdaForTesting([&](Status) { ++callback_run_count; }));
 
   EXPECT_EQ(callback_run_count, 1);
diff --git a/chrome/browser/ash/printing/history/print_job_reporting_service_impl.cc b/chrome/browser/ash/printing/history/print_job_reporting_service_impl.cc
index bb03dfc9..2659de5 100644
--- a/chrome/browser/ash/printing/history/print_job_reporting_service_impl.cc
+++ b/chrome/browser/ash/printing/history/print_job_reporting_service_impl.cc
@@ -70,7 +70,7 @@
     em::PrintJobEvent event = Convert(print_job_info);
     VLOG(1) << "Enqueuing event for print job: "
             << event.job_configuration().id();
-    Enqueue(event);
+    Enqueue(std::move(event));
   }
 
  private:
@@ -84,10 +84,11 @@
     cros_settings_->GetBoolean(kReportDevicePrintJobs, &should_report_);
   }
 
-  void Enqueue(const em::PrintJobEvent& event) {
+  void Enqueue(em::PrintJobEvent event) {
     DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-    report_queue_->Enqueue(&event, ::reporting::Priority::SLOW_BATCH,
-                           base::DoNothing());
+    report_queue_->Enqueue(
+        std::make_unique<em::PrintJobEvent>(std::move(event)),
+        ::reporting::Priority::SLOW_BATCH, base::DoNothing());
   }
 
   static em::PrintJobEvent Convert(const print::PrintJobInfo& print_job_info) {
diff --git a/chrome/browser/autofill_assistant/password_change/apc_client_impl.cc b/chrome/browser/autofill_assistant/password_change/apc_client_impl.cc
index 61fdc65..5e5eb9f 100644
--- a/chrome/browser/autofill_assistant/password_change/apc_client_impl.cc
+++ b/chrome/browser/autofill_assistant/password_change/apc_client_impl.cc
@@ -10,13 +10,37 @@
 #include "base/bind.h"
 #include "base/feature_list.h"
 #include "base/memory/raw_ptr.h"
+#include "chrome/browser/autofill_assistant/common_dependencies_chrome.h"
+#include "chrome/browser/autofill_assistant/password_change/apc_external_action_delegate.h"
 #include "chrome/browser/autofill_assistant/password_change/apc_onboarding_coordinator.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/autofill_assistant/password_change/assistant_display_delegate.h"
 #include "chrome/browser/ui/ui_features.h"
+#include "chrome/common/channel_info.h"
+#include "components/autofill_assistant/browser/public/autofill_assistant_factory.h"
+#include "components/autofill_assistant/browser/public/external_script_controller.h"
 #include "content/public/browser/web_contents.h"
 #include "url/gurl.h"
 
+// TODO(b/234418435): Remove these values from here once exposed in
+// autofill_assistant/browser/public.
+namespace {
+constexpr char kPasswordChangeUsername[] = "PASSWORD_CHANGE_USERNAME";
+constexpr char kPasswordChangeSkipLoginParameter[] =
+    "PASSWORD_CHANGE_SKIP_LOGIN";
+constexpr char kIntentParameter[] = "INTENT";
+constexpr char kSourceParameter[] = "SOURCE";
+constexpr char kIntent[] = "PASSWORD_CHANGE";
+constexpr char kParameterStartImediately[] = "START_IMMEDIATELY";
+constexpr char kParameterOriginalDeepLink[] = "ORIGINAL_DEEPLINK";
+constexpr char kParameterEnabled[] = "ENABLED";
+constexpr char kParameterCaller[] = "CALLER";
+
+constexpr int kInChromeCaller = 7;
+constexpr int kSourcePasswordChangeLeakWarning = 10;
+constexpr int kSourcePasswordChangeSettings = 11;
+}  // namespace
+
 ApcClientImpl::ApcClientImpl(content::WebContents* web_contents)
     : content::WebContentsUserData<ApcClientImpl>(*web_contents) {}
 
@@ -35,6 +59,10 @@
     return false;
   is_running_ = true;
 
+  url_ = url;
+  username_ = username;
+  skip_login_ = skip_login;
+
   // The coordinator takes care of checking whether a user has previously given
   // consent and, if not, prompts the user to give consent now.
   onboarding_coordinator_ = CreateOnboardingCoordinator();
@@ -46,7 +74,7 @@
 
 void ApcClientImpl::Stop() {
   onboarding_coordinator_.reset();
-
+  external_script_controller_.reset();
   is_running_ = false;
 }
 
@@ -62,12 +90,28 @@
     return;
   }
 
-  // TODO(crbug.com/1324089): Start execution. For now, immediately mark the run
-  // as complete.
-  OnRunComplete();
+  base::flat_map<std::string, std::string> params_map;
+  params_map[kPasswordChangeUsername] = username_;
+  params_map[kIntentParameter] = kIntent;
+  params_map[kParameterStartImediately] = "true";
+  params_map[kParameterOriginalDeepLink] = url_.spec();
+  params_map[kPasswordChangeSkipLoginParameter] =
+      skip_login_ ? "true" : "false";
+  params_map[kParameterEnabled] = "true";
+  params_map[kParameterCaller] = base::NumberToString(kInChromeCaller);
+  params_map[kSourceParameter] =
+      skip_login_ ? base::NumberToString(kSourcePasswordChangeLeakWarning)
+                  : base::NumberToString(kSourcePasswordChangeSettings);
+
+  external_script_controller_ = CreateExternalScriptController();
+  external_script_controller_->StartScript(
+      params_map,
+      base::BindOnce(&ApcClientImpl::OnRunComplete, base::Unretained(this)));
 }
 
-void ApcClientImpl::OnRunComplete() {
+void ApcClientImpl::OnRunComplete(
+    autofill_assistant::ExternalScriptController::ScriptResult result) {
+  // TODO(crbug.com/1324089): Handle failed result.
   Stop();
 }
 
@@ -86,4 +130,20 @@
   return ApcOnboardingCoordinator::Create(&GetWebContents());
 }
 
+std::unique_ptr<autofill_assistant::ExternalScriptController>
+ApcClientImpl::CreateExternalScriptController() {
+  side_panel_coordinator_ =
+      AssistantSidePanelCoordinator::Create(&GetWebContents());
+  apc_external_action_delegate_ = std::make_unique<ApcExternalActionDelegate>(
+      side_panel_coordinator_.get());
+  apc_external_action_delegate_->SetupDisplay();
+
+  std::unique_ptr<autofill_assistant::AutofillAssistant> autofill_assistant =
+      autofill_assistant::AutofillAssistantFactory::CreateForBrowserContext(
+          GetWebContents().GetBrowserContext(),
+          std::make_unique<autofill_assistant::CommonDependenciesChrome>());
+  return autofill_assistant->CreateExternalScriptController(
+      &GetWebContents(), apc_external_action_delegate_.get());
+}
+
 WEB_CONTENTS_USER_DATA_KEY_IMPL(ApcClientImpl);
diff --git a/chrome/browser/autofill_assistant/password_change/apc_client_impl.h b/chrome/browser/autofill_assistant/password_change/apc_client_impl.h
index 7c5c857..0691878 100644
--- a/chrome/browser/autofill_assistant/password_change/apc_client_impl.h
+++ b/chrome/browser/autofill_assistant/password_change/apc_client_impl.h
@@ -13,10 +13,13 @@
 #include "base/memory/raw_ptr.h"
 #include "chrome/browser/autofill_assistant/password_change/apc_onboarding_coordinator.h"
 #include "chrome/browser/ui/autofill_assistant/password_change/assistant_side_panel_coordinator.h"
+#include "components/autofill_assistant/browser/public/external_script_controller.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/browser/web_contents_user_data.h"
 #include "url/gurl.h"
 
+class ApcExternalActionDelegate;
+
 // TODO(crbug.com/1322419): Observe the SidePanel so that we can destruct
 // Onboarding, ScriptExecution, etc. on close.
 
@@ -44,6 +47,11 @@
   virtual std::unique_ptr<ApcOnboardingCoordinator>
   CreateOnboardingCoordinator();
 
+  // Creates an external script controller. Protected to allow for overrides
+  // by test classes.
+  virtual std::unique_ptr<autofill_assistant::ExternalScriptController>
+  CreateExternalScriptController();
+
   explicit ApcClientImpl(content::WebContents* web_contents);
 
  private:
@@ -54,11 +62,32 @@
   void OnOnboardingComplete(bool success);
 
   // Registers when a run is complete. Used in callbacks.
-  void OnRunComplete();
+  void OnRunComplete(
+      autofill_assistant::ExternalScriptController::ScriptResult result);
 
   // AssistantSidePanelCoordinator::Observer:
   void OnHidden() override;
 
+  // The delegate is responsible for handling protos received from backend DSL
+  // actions and UI updates.
+  std::unique_ptr<ApcExternalActionDelegate> apc_external_action_delegate_;
+
+  // Controls a script run triggered by the headless API. This class is
+  // responsible for handling the forwarding of action to
+  // `apc_external_action_delegate_` and managing the run lifetime.
+  std::unique_ptr<autofill_assistant::ExternalScriptController>
+      external_script_controller_;
+
+  // The username for which `Start()` was triggered.
+  std::string username_;
+
+  // The url for which `Start()` was triggered.
+  GURL url_;
+
+  // Whether the login step of a script run should be skipped.
+  // This is used during triggers from the leak warning.
+  bool skip_login_;
+
   // The state of the `ApcClient` to avoid that a run is started while
   // another is already ongoing in the tab.
   bool is_running_ = false;
diff --git a/chrome/browser/autofill_assistant/password_change/apc_client_impl_unittest.cc b/chrome/browser/autofill_assistant/password_change/apc_client_impl_unittest.cc
index 8b38d24..d12fea5 100644
--- a/chrome/browser/autofill_assistant/password_change/apc_client_impl_unittest.cc
+++ b/chrome/browser/autofill_assistant/password_change/apc_client_impl_unittest.cc
@@ -11,6 +11,7 @@
 #include "chrome/browser/autofill_assistant/password_change/mock_apc_onboarding_coordinator.h"
 #include "chrome/browser/ui/ui_features.h"
 #include "chrome/test/base/testing_profile.h"
+#include "components/autofill_assistant/browser/public/mock_external_script_controller.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/test/browser_task_environment.h"
 #include "content/public/test/test_web_contents_factory.h"
@@ -21,8 +22,17 @@
 namespace {
 constexpr char kUrl1[] = "https://www.example.com";
 constexpr char kUsername1[] = "Lori";
+
+constexpr char kPasswordChangeSkipLoginParameter[] =
+    "PASSWORD_CHANGE_SKIP_LOGIN";
+constexpr char kSourceParameter[] = "SOURCE";
+constexpr char kSourcePasswordChangeLeakWarning[] = "10";
+constexpr char kSourcePasswordChangeSettings[] = "11";
 }  // namespace
 
+using ::testing::DoAll;
+using ::testing::StrEq;
+
 class TestApcClientImpl : public ApcClientImpl {
  public:
   static TestApcClientImpl* CreateForWebContents(
@@ -36,16 +46,31 @@
     return std::move(coordinator_);
   }
 
+  std::unique_ptr<autofill_assistant::ExternalScriptController>
+  CreateExternalScriptController() override {
+    return std::move(external_script_controller_);
+  }
+
   // Allows setting an onboarding coordinator that is returned by the factory
-  // function. Must be called at least once before every exepcted call to
+  // function. Must be called at least once before every expected call to
   // `CreateOnboardingCoordinator()`.
   void InjectOnboardingCoordinatorForTesting(
       std::unique_ptr<ApcOnboardingCoordinator> coordinator) {
     coordinator_ = std::move(coordinator);
   }
 
+  // Allows setting an ExternalScriptController. Must be called at least once
+  // before every expected call to `CreateExternalScriptController()`.
+  void InjectExternalScriptControllerForTesting(
+      std::unique_ptr<autofill_assistant::ExternalScriptController>
+          external_script_controller) {
+    external_script_controller_ = std::move(external_script_controller);
+  }
+
  private:
   std::unique_ptr<ApcOnboardingCoordinator> coordinator_;
+  std::unique_ptr<autofill_assistant::ExternalScriptController>
+      external_script_controller_;
 };
 
 // static
@@ -65,9 +90,26 @@
     // Make sure that a `TestApcClientImpl` is registered for that
     // `WebContents`.
     test_apc_client_ = TestApcClientImpl::CreateForWebContents(web_contents());
-  }
 
+    // Prepare the coordinator.
+    auto coordinator = std::make_unique<MockApcOnboardingCoordinator>();
+    coordinator_ref_ = coordinator.get();
+    test_apc_client_->InjectOnboardingCoordinatorForTesting(
+        std::move(coordinator));
+
+    // Prepare the ExternalScriptController.
+    auto external_script_controller =
+        std::make_unique<autofill_assistant::MockExternalScriptController>();
+    external_script_controller_ref_ = external_script_controller.get();
+    test_apc_client_->InjectExternalScriptControllerForTesting(
+        std::move(external_script_controller));
+  }
   TestApcClientImpl* apc_client() { return test_apc_client_; }
+  MockApcOnboardingCoordinator* coordinator() { return coordinator_ref_; }
+  autofill_assistant::MockExternalScriptController*
+  external_script_controller() {
+    return external_script_controller_ref_;
+  }
   content::WebContents* web_contents() { return web_contents_; }
 
  private:
@@ -77,12 +119,14 @@
   TestingProfile profile_;
   content::TestWebContentsFactory web_contents_factory_;
   raw_ptr<content::WebContents> web_contents_;
-
+  raw_ptr<MockApcOnboardingCoordinator> coordinator_ref_;
+  raw_ptr<autofill_assistant::MockExternalScriptController>
+      external_script_controller_ref_;
   // The object that is tested.
   raw_ptr<TestApcClientImpl> test_apc_client_;
 };
 
-TEST_F(ApcClientImplTest, CreateAndStartApcFlow_WithFailedOnboarding) {
+TEST_F(ApcClientImplTest, CreateAndStartApcFlow_Success) {
   raw_ptr<ApcClient> client =
       ApcClient::GetOrCreateForWebContents(web_contents());
 
@@ -92,26 +136,97 @@
   // The `ApcClient` is paused.
   EXPECT_FALSE(client->IsRunning());
 
-  // Prepare the coordinator.
-  raw_ptr<MockApcOnboardingCoordinator> coordinator =
-      new MockApcOnboardingCoordinator();
-  apc_client()->InjectOnboardingCoordinatorForTesting(
-      base::WrapUnique<MockApcOnboardingCoordinator>(coordinator));
-
   // Prepare to extract the callback to the coordinator.
   ApcOnboardingCoordinator::Callback coordinator_callback;
-  EXPECT_CALL(*coordinator, PerformOnboarding)
+  EXPECT_CALL(*coordinator(), PerformOnboarding)
       .WillOnce(MoveArg<0>(&coordinator_callback));
 
-  EXPECT_TRUE(client->Start(GURL(kUrl1), kUsername1, /*skip_login=*/true));
+  EXPECT_TRUE(client->Start(GURL(kUrl1), kUsername1, /*skip_login=*/false));
   EXPECT_TRUE(client->IsRunning());
 
   // We cannot start a second flow.
-  EXPECT_FALSE(client->Start(GURL(kUrl1), kUsername1, /*skip_login=*/true));
+  EXPECT_FALSE(client->Start(GURL(kUrl1), kUsername1, /*skip_login=*/false));
+
+  // Prepare to extract the callback to the external script controller.
+  base::OnceCallback<void(
+      autofill_assistant::ExternalScriptController::ScriptResult)>
+      external_script_controller_callback;
+  EXPECT_CALL(*external_script_controller(), StartScript)
+      .Times(1)
+      .WillOnce(MoveArg<1>(&external_script_controller_callback));
+
+  // Successful onboarding.
+  std::move(coordinator_callback).Run(true);
+  EXPECT_TRUE(client->IsRunning());
+
+  autofill_assistant::ExternalScriptController::ScriptResult script_result = {
+      /* success= */ true};
+  std::move(external_script_controller_callback).Run(script_result);
+  EXPECT_FALSE(client->IsRunning());
+}
+
+TEST_F(ApcClientImplTest, CreateAndStartApcFlow_fromSettings) {
+  // Prepare to extract the callback to the coordinator.
+  ApcOnboardingCoordinator::Callback coordinator_callback;
+  EXPECT_CALL(*coordinator(), PerformOnboarding)
+      .WillOnce(MoveArg<0>(&coordinator_callback));
+
+  EXPECT_TRUE(
+      apc_client()->Start(GURL(kUrl1), kUsername1, /*skip_login=*/false));
+
+  // Prepare to extract the script_params to the external script
+  // controller.
+  base::flat_map<std::string, std::string> params_map;
+  EXPECT_CALL(*external_script_controller(), StartScript)
+      .Times(1)
+      .WillOnce(MoveArg<0>(&params_map));
+
+  // Successful onboarding.
+  std::move(coordinator_callback).Run(true);
+  EXPECT_TRUE(apc_client()->IsRunning());
+  EXPECT_THAT(params_map[kPasswordChangeSkipLoginParameter], StrEq("false"));
+  EXPECT_THAT(params_map[kSourceParameter],
+              StrEq(kSourcePasswordChangeSettings));
+}
+
+TEST_F(ApcClientImplTest, CreateAndStartApcFlow_fromLeakWarning) {
+  // Prepare to extract the callback to the coordinator.
+  ApcOnboardingCoordinator::Callback coordinator_callback;
+  EXPECT_CALL(*coordinator(), PerformOnboarding)
+      .Times(1)
+      .WillOnce(MoveArg<0>(&coordinator_callback));
+
+  // `skip_login` equals to a trigger from leak warning.
+  EXPECT_TRUE(
+      apc_client()->Start(GURL(kUrl1), kUsername1, /*skip_login=*/true));
+
+  // Prepare to extract the script_params to the external script
+  // controller.
+  base::flat_map<std::string, std::string> params_map;
+  EXPECT_CALL(*external_script_controller(), StartScript)
+      .Times(1)
+      .WillOnce(MoveArg<0>(&params_map));
+
+  // Successful onboarding.
+  std::move(coordinator_callback).Run(true);
+  EXPECT_THAT(params_map[kPasswordChangeSkipLoginParameter], StrEq("true"));
+  EXPECT_THAT(params_map[kSourceParameter],
+              StrEq(kSourcePasswordChangeLeakWarning));
+}
+
+TEST_F(ApcClientImplTest, CreateAndStartApcFlow_WithFailedOnboarding) {
+  // Prepare to extract the callback to the coordinator.
+  ApcOnboardingCoordinator::Callback coordinator_callback;
+  EXPECT_CALL(*coordinator(), PerformOnboarding)
+      .Times(1)
+      .WillOnce(MoveArg<0>(&coordinator_callback));
+
+  EXPECT_TRUE(
+      apc_client()->Start(GURL(kUrl1), kUsername1, /*skip_login=*/true));
 
   // Fail onboarding.
   std::move(coordinator_callback).Run(false);
-  EXPECT_FALSE(client->IsRunning());
+  EXPECT_FALSE(apc_client()->IsRunning());
 }
 
 TEST_F(ApcClientImplTest, CreateAndStartApcFlow_WithUnifiedSidePanelDisabled) {
diff --git a/chrome/browser/chrome_navigation_browsertest.cc b/chrome/browser/chrome_navigation_browsertest.cc
index 36e45b02..3da4faf 100644
--- a/chrome/browser/chrome_navigation_browsertest.cc
+++ b/chrome/browser/chrome_navigation_browsertest.cc
@@ -692,7 +692,7 @@
         chrome.test.sendMessage('ready');
       )");
 
-  ExtensionTestMessageListener ready_listener("ready", false /* will_reply */);
+  ExtensionTestMessageListener ready_listener("ready");
   extensions::ChromeTestExtensionLoader extension_loader(browser()->profile());
   extension_loader.LoadExtension(test_extension_dir.UnpackedPath());
 
@@ -753,7 +753,7 @@
   extensions::TestExtensionDir ext_dir;
   ext_dir.WriteManifest(kManifest);
   ext_dir.WriteFile(FILE_PATH_LITERAL("background.js"), kRulesScript);
-  ExtensionTestMessageListener ready_listener("ready", false /* will_reply */);
+  ExtensionTestMessageListener ready_listener("ready");
   extensions::ChromeTestExtensionLoader extension_loader(browser()->profile());
   scoped_refptr<const extensions::Extension> extension =
       extension_loader.LoadExtension(ext_dir.UnpackedPath());
@@ -891,7 +891,7 @@
   ext_dir.WriteFile(
       FILE_PATH_LITERAL("background.js"),
       content::JsReplace(kRulesScriptTemplate, kRedirectTargetUrl));
-  ExtensionTestMessageListener ready_listener("ready", false /* will_reply */);
+  ExtensionTestMessageListener ready_listener("ready");
   extensions::ChromeTestExtensionLoader extension_loader(browser()->profile());
   scoped_refptr<const extensions::Extension> extension =
       extension_loader.LoadExtension(ext_dir.UnpackedPath());
diff --git a/chrome/browser/chromeos/extensions/telemetry/api/BUILD.gn b/chrome/browser/chromeos/extensions/telemetry/api/BUILD.gn
index fda821c..52bbac4 100644
--- a/chrome/browser/chromeos/extensions/telemetry/api/BUILD.gn
+++ b/chrome/browser/chromeos/extensions/telemetry/api/BUILD.gn
@@ -37,8 +37,6 @@
     "//chrome/browser/ui",
     "//chrome/common/chromeos/extensions",
     "//chrome/common/chromeos/extensions/api",
-    "//components/security_state/content",
-    "//components/security_state/core",
     "//components/user_manager",
     "//content/public/browser",
     "//extensions/browser",
@@ -88,13 +86,10 @@
     "//chromeos/services/cros_healthd/public/cpp",
     "//chromeos/services/cros_healthd/public/mojom",
     "//components/user_manager",
-    "//content/test:test_support",
     "//extensions:test_support",
     "//extensions/browser",
     "//extensions/browser:test_support",
     "//extensions/common",
-    "//net",
-    "//net:test_support",
     "//url",
   ]
 }
diff --git a/chrome/browser/chromeos/extensions/telemetry/api/api_guard_delegate.cc b/chrome/browser/chromeos/extensions/telemetry/api/api_guard_delegate.cc
index 41e0ff24..af387f2 100644
--- a/chrome/browser/chromeos/extensions/telemetry/api/api_guard_delegate.cc
+++ b/chrome/browser/chromeos/extensions/telemetry/api/api_guard_delegate.cc
@@ -17,8 +17,6 @@
 #include "chrome/browser/ui/browser_list.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/common/chromeos/extensions/chromeos_system_extension_info.h"
-#include "components/security_state/content/content_utils.h"
-#include "components/security_state/core/security_state.h"
 #include "components/user_manager/user.h"
 #include "components/user_manager/user_manager.h"
 #include "content/public/browser/web_contents.h"
@@ -72,8 +70,8 @@
       return;
     }
 
-    if (!IsPwaUiOpenAndSecure(context, extension)) {
-      std::move(callback).Run("Companion PWA UI is not open or not secure");
+    if (!IsPwaUiOpen(context, extension)) {
+      std::move(callback).Run("Companion PWA UI is not open");
       return;
     }
 
@@ -99,8 +97,8 @@
     return user_manager::UserManager::Get()->IsCurrentUserOwner();
   }
 
-  bool IsPwaUiOpenAndSecure(content::BrowserContext* context,
-                            const extensions::Extension* extension) {
+  bool IsPwaUiOpen(content::BrowserContext* context,
+                   const extensions::Extension* extension) {
     Profile* profile = Profile::FromBrowserContext(context);
 
     const auto* externally_connectable_info =
@@ -118,13 +116,7 @@
             target_tab_strip->GetWebContentsAt(i);
         if (externally_connectable_info->matches.MatchesURL(
                 target_contents->GetLastCommittedURL())) {
-          // Ensure the PWA URL connection is secure (e.g. valid certificate).
-          const auto visible_security_state =
-              security_state::GetVisibleSecurityState(target_contents);
-          return security_state::GetSecurityLevel(
-                     *visible_security_state,
-                     /*used_policy_installed_certificate=*/false) ==
-                 security_state::SecurityLevel::SECURE;
+          return true;
         }
       }
     }
diff --git a/chrome/browser/chromeos/extensions/telemetry/api/api_guard_delegate_unittest.cc b/chrome/browser/chromeos/extensions/telemetry/api/api_guard_delegate_unittest.cc
index 2b527516c..272c9d8 100644
--- a/chrome/browser/chromeos/extensions/telemetry/api/api_guard_delegate_unittest.cc
+++ b/chrome/browser/chromeos/extensions/telemetry/api/api_guard_delegate_unittest.cc
@@ -16,16 +16,9 @@
 #include "components/sync_preferences/testing_pref_service_syncable.h"
 #include "components/user_manager/scoped_user_manager.h"
 #include "components/user_manager/user.h"
-#include "content/public/browser/navigation_entry.h"
-#include "content/public/browser/ssl_status.h"
 #include "extensions/common/extension.h"
 #include "extensions/common/extension_builder.h"
 #include "extensions/common/extension_urls.h"
-#include "net/base/net_errors.h"
-#include "net/cert/cert_status_flags.h"
-#include "net/cert/x509_certificate.h"
-#include "net/test/cert_test_util.h"
-#include "net/test/test_data_directory.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace chromeos {
@@ -48,7 +41,7 @@
 const std::vector<ExtensionInfoTestParams> kAllExtensionInfoTestParams{
     ExtensionInfoTestParams(
         /*extension_id=*/"gogonhoemckpdpadfnjnpgbjpbjnodgc",
-        /*pwa_page_url=*/"https://www.google.com",
+        /*pwa_page_url=*/"http://www.google.com",
         /*matches_origin=*/"*://www.google.com/*"),
     ExtensionInfoTestParams(
         /*extension_id=*/"alnedpmllcfpgldkagbfbjkloonjlfjb",
@@ -127,24 +120,6 @@
         hardware_info_delegate_factory_.get());
   }
 
-  void OpenPwaUrlAndSetCertificateWithStatus(net::CertStatus cert_status) {
-    const base::FilePath certs_dir = net::GetTestCertsDirectory();
-    scoped_refptr<net::X509Certificate> test_cert(
-        net::ImportCertFromFile(certs_dir, "ok_cert.pem"));
-    ASSERT_TRUE(test_cert);
-
-    // Open the PWA page url and set valid certificate to bypass the
-    // IsPwaUiOpenAndSecure() check.
-    AddTab(browser(), GURL(pwa_page_url()));
-
-    // AddTab() adds a new tab at index 0.
-    auto* web_contents = browser()->tab_strip_model()->GetWebContentsAt(0);
-    auto* entry = web_contents->GetController().GetVisibleEntry();
-    content::SSLStatus& ssl = entry->GetSSL();
-    ssl.certificate = test_cert;
-    ssl.cert_status = cert_status;
-  }
-
  private:
   void CreateExtension() {
     extension_ =
@@ -191,24 +166,12 @@
                                    future.GetCallback());
 
   ASSERT_TRUE(future.Wait());
-  EXPECT_EQ("Companion PWA UI is not open or not secure", future.Get());
-}
-
-TEST_P(ApiGuardDelegateTest, PwaIsOpenButNotSecure) {
-  OpenPwaUrlAndSetCertificateWithStatus(
-      /*cert_status=*/net::CERT_STATUS_INVALID);
-
-  auto api_guard_delegate = ApiGuardDelegate::Factory::Create();
-  base::test::TestFuture<std::string> future;
-  api_guard_delegate->CanAccessApi(profile(), extension(),
-                                   future.GetCallback());
-
-  ASSERT_TRUE(future.Wait());
-  EXPECT_EQ("Companion PWA UI is not open or not secure", future.Get());
+  EXPECT_EQ("Companion PWA UI is not open", future.Get());
 }
 
 TEST_P(ApiGuardDelegateTest, ManufacturerNotAllowed) {
-  OpenPwaUrlAndSetCertificateWithStatus(/*cert_status=*/net::OK);
+  // Open the PWA page url to bypass IsPwaUiOpen() check.
+  AddTab(browser(), GURL(pwa_page_url()));
 
   // Make sure device manufacturer is not allowed.
   SetDeviceManufacturer("GOOGLE");
@@ -224,7 +187,8 @@
 }
 
 TEST_P(ApiGuardDelegateTest, NoError) {
-  OpenPwaUrlAndSetCertificateWithStatus(/*cert_status=*/net::OK);
+  // Open the PWA page url to bypass IsPwaUiOpen() check.
+  AddTab(browser(), GURL(pwa_page_url()));
 
   auto api_guard_delegate = ApiGuardDelegate::Factory::Create();
   base::test::TestFuture<std::string> future;
@@ -282,30 +246,7 @@
                                    future.GetCallback());
 
   ASSERT_TRUE(future.Wait());
-  EXPECT_EQ("Companion PWA UI is not open or not secure", future.Get());
-}
-
-TEST_P(ApiGuardDelegateAffiliatedUserTest, PwaIsOpenButNotSecure) {
-  {
-    extensions::ExtensionManagementPrefUpdater<
-        sync_preferences::TestingPrefServiceSyncable>
-        updater(profile()->GetTestingPrefService());
-    // Make sure the extension is marked as force-installed.
-    updater.SetIndividualExtensionAutoInstalled(
-        extension_id(), extension_urls::kChromeWebstoreUpdateURL,
-        /*forced=*/true);
-  }
-
-  OpenPwaUrlAndSetCertificateWithStatus(
-      /*cert_status=*/net::CERT_STATUS_INVALID);
-
-  auto api_guard_delegate = ApiGuardDelegate::Factory::Create();
-  base::test::TestFuture<std::string> future;
-  api_guard_delegate->CanAccessApi(profile(), extension(),
-                                   future.GetCallback());
-
-  ASSERT_TRUE(future.Wait());
-  EXPECT_EQ("Companion PWA UI is not open or not secure", future.Get());
+  EXPECT_EQ("Companion PWA UI is not open", future.Get());
 }
 
 TEST_P(ApiGuardDelegateAffiliatedUserTest, ManufacturerNotAllowed) {
@@ -319,7 +260,8 @@
         /*forced=*/true);
   }
 
-  OpenPwaUrlAndSetCertificateWithStatus(/*cert_status=*/net::OK);
+  // Open the PWA page url to bypass IsPwaUiOpen() check.
+  AddTab(browser(), GURL(pwa_page_url()));
 
   // Make sure device manufacturer is not allowed.
   SetDeviceManufacturer("GOOGLE");
@@ -345,7 +287,8 @@
         /*forced=*/true);
   }
 
-  OpenPwaUrlAndSetCertificateWithStatus(/*cert_status=*/net::OK);
+  // Open the PWA page url to bypass IsPwaUiOpen() check.
+  AddTab(browser(), GURL(pwa_page_url()));
 
   auto api_guard_delegate = ApiGuardDelegate::Factory::Create();
   base::test::TestFuture<std::string> future;
diff --git a/chrome/browser/chromeos/extensions/telemetry/api/base_telemetry_extension_api_guard_function_browsertest.cc b/chrome/browser/chromeos/extensions/telemetry/api/base_telemetry_extension_api_guard_function_browsertest.cc
index 6d870e5..3c4e74e 100644
--- a/chrome/browser/chromeos/extensions/telemetry/api/base_telemetry_extension_api_guard_function_browsertest.cc
+++ b/chrome/browser/chromeos/extensions/telemetry/api/base_telemetry_extension_api_guard_function_browsertest.cc
@@ -17,11 +17,7 @@
 #include "components/user_manager/user.h"
 #include "components/user_manager/user_manager.h"
 #include "content/public/test/browser_test.h"
-#include "content/public/test/content_mock_cert_verifier.h"
-#include "net/base/net_errors.h"
-#include "net/cert/x509_certificate.h"
 #include "net/dns/mock_host_resolver.h"
-#include "net/test/embedded_test_server/embedded_test_server.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/gurl.h"
 
@@ -298,9 +294,7 @@
     : public BaseTelemetryExtensionBrowserTest {
  public:
   TelemetryExtensionApiGuardRealDelegateBrowserTest()
-      : fake_hardware_info_delegate_factory_("HP"),
-        https_server_(net::EmbeddedTestServer::TYPE_HTTPS) {
-    https_server_.ServeFilesFromSourceDirectory(GetChromeTestDataDir());
+      : fake_hardware_info_delegate_factory_("HP") {
     // Make sure device manufacturer is allowlisted.
     HardwareInfoDelegate::Factory::SetForTesting(
         &fake_hardware_info_delegate_factory_);
@@ -313,12 +307,6 @@
       const TelemetryExtensionApiGuardRealDelegateBrowserTest&) = delete;
 
   // BaseTelemetryExtensionBrowserTest:
-  void SetUpCommandLine(base::CommandLine* command_line) override {
-    BaseTelemetryExtensionBrowserTest::SetUpCommandLine(command_line);
-
-    mock_cert_verifier_.SetUpCommandLine(command_line);
-  }
-
   void SetUpOnMainThread() override {
     // Skip BaseTelemetryExtensionBrowserTest::SetUpOnMainThread() as it sets up
     // a FakeApiGuardDelegate instance.
@@ -328,8 +316,6 @@
     user_manager_enabler_ = std::make_unique<user_manager::ScopedUserManager>(
         std::make_unique<ash::FakeChromeUserManager>());
 
-    ASSERT_TRUE(https_server_.Start());
-
     // This is needed when navigating to a network URL (e.g.
     // ui_test_utils::NavigateToURL). Rules can only be added before
     // BrowserTestBase::InitializeNetworkProcess() is called because host
@@ -348,48 +334,14 @@
     BaseTelemetryExtensionBrowserTest::TearDownOnMainThread();
   }
 
-  void SetUpInProcessBrowserTestFixture() override {
-    BaseTelemetryExtensionBrowserTest::SetUpInProcessBrowserTestFixture();
-
-    mock_cert_verifier_.SetUpInProcessBrowserTestFixture();
-  }
-
-  void TearDownInProcessBrowserTestFixture() override {
-    mock_cert_verifier_.TearDownInProcessBrowserTestFixture();
-
-    BaseTelemetryExtensionBrowserTest::TearDownInProcessBrowserTestFixture();
-  }
-
-  content::ContentMockCertVerifier::CertVerifier* mock_cert_verifier() {
-    return mock_cert_verifier_.mock_cert_verifier();
-  }
-
-  void SetUpMockCertVerifierForHttpsServer() {
-    scoped_refptr<net::X509Certificate> cert(https_server_.GetCertificate());
-    net::CertVerifyResult verify_result;
-    verify_result.is_issued_by_known_root = true;
-    verify_result.verified_cert = cert;
-    verify_result.cert_status = net::OK;
-
-    mock_cert_verifier()->AddResultForCert(cert, verify_result, net::OK);
-  }
-
  protected:
   ash::FakeChromeUserManager* GetFakeUserManager() const {
     return static_cast<ash::FakeChromeUserManager*>(
         user_manager::UserManager::Get());
   }
 
-  GURL GetPwaGURL() const { return https_server_.GetURL("/ssl/google.html"); }
-
-  // BaseTelemetryExtensionBrowserTest:
-  std::string pwa_page_url() const override { return GetPwaGURL().spec(); }
-  std::string matches_origin() const override { return GetPwaGURL().spec(); }
-
   FakeHardwareInfoDelegate::Factory fake_hardware_info_delegate_factory_;
   std::unique_ptr<user_manager::ScopedUserManager> user_manager_enabler_;
-  net::EmbeddedTestServer https_server_;
-  content::ContentMockCertVerifier mock_cert_verifier_;
 };
 
 // Smoke test to verify that real ApiGuardDelegate works in prod.
@@ -403,13 +355,7 @@
   user_manager->SwitchActiveUser(account_id);
   user_manager->SetOwnerId(account_id);
 
-  base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
-      chromeos::switches::kTelemetryExtensionPwaOriginOverrideForTesting,
-      pwa_page_url());
-
-  SetUpMockCertVerifierForHttpsServer();
-
-  // Make sure PWA UI is open and secure.
+  // Make sure PWA UI is open.
   auto* pwa_page_rfh =
       ui_test_utils::NavigateToURL(browser(), GURL(pwa_page_url()));
   ASSERT_TRUE(pwa_page_rfh);
diff --git a/chrome/browser/chromeos/extensions/telemetry/api/base_telemetry_extension_browser_test.h b/chrome/browser/chromeos/extensions/telemetry/api/base_telemetry_extension_browser_test.h
index 395a81c..cd98568 100644
--- a/chrome/browser/chromeos/extensions/telemetry/api/base_telemetry_extension_browser_test.h
+++ b/chrome/browser/chromeos/extensions/telemetry/api/base_telemetry_extension_browser_test.h
@@ -30,8 +30,8 @@
  protected:
   std::string extension_id() const;
   std::string public_key() const;
-  virtual std::string pwa_page_url() const;
-  virtual std::string matches_origin() const;
+  std::string pwa_page_url() const;
+  std::string matches_origin() const;
   void CreateExtensionAndRunServiceWorker(
       const std::string& service_worker_content);
   virtual std::string GetManifestFile(const std::string& matches_origin);
diff --git a/chrome/browser/chromeos/extensions/telemetry/api/telemetry_extension_capabilities_browser_test.cc b/chrome/browser/chromeos/extensions/telemetry/api/telemetry_extension_capabilities_browser_test.cc
index a1ace85..a238761 100644
--- a/chrome/browser/chromeos/extensions/telemetry/api/telemetry_extension_capabilities_browser_test.cc
+++ b/chrome/browser/chromeos/extensions/telemetry/api/telemetry_extension_capabilities_browser_test.cc
@@ -174,7 +174,7 @@
   const auto extension_info = GetChromeOSExtensionInfoForId(extension_id());
   EXPECT_EQ(kPwaOriginOverride, extension_info.pwa_origin);
 
-  // Open the PWA page url to bypass IsPwaUiOpenAndSecure() check.
+  // Open the PWA page url to bypass IsPwaUiOpen() check.
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), GURL(kPwaPageUrl)));
 
   // Start listening on the extension.
diff --git a/chrome/browser/chromeos/policy/dlp/dlp_reporting_manager.cc b/chrome/browser/chromeos/policy/dlp/dlp_reporting_manager.cc
index 3156863..d30c523 100644
--- a/chrome/browser/chromeos/policy/dlp/dlp_reporting_manager.cc
+++ b/chrome/browser/chromeos/policy/dlp/dlp_reporting_manager.cc
@@ -261,8 +261,6 @@
   }
   reporting::ReportQueue::EnqueueCallback callback = base::BindOnce(
       &DlpReportingManager::OnEventEnqueued, base::Unretained(this));
-  report_queue_->Enqueue(&event, reporting::Priority::SLOW_BATCH,
-                         std::move(callback));
 
   switch (event.mode()) {
     case DlpPolicyEvent_Mode_BLOCK:
@@ -289,6 +287,8 @@
       NOTREACHED();
       break;
   }
+  report_queue_->Enqueue(std::make_unique<DlpPolicyEvent>(std::move(event)),
+                         reporting::Priority::SLOW_BATCH, std::move(callback));
 }
 
 }  // namespace policy
diff --git a/chrome/browser/device_api/device_attribute_api.cc b/chrome/browser/device_api/device_attribute_api.cc
index 6356e23..1ad26de 100644
--- a/chrome/browser/device_api/device_attribute_api.cc
+++ b/chrome/browser/device_api/device_attribute_api.cc
@@ -75,6 +75,7 @@
   else
     std::move(callback).Run(Result::NewAttribute(attribute));
 #elif BUILDFLAG(IS_CHROMEOS_LACROS)
+  // TODO(crbug.com/1328100): Replace with crosapi BrowserInitParams.
   chromeos::LacrosService::Get()
       ->GetRemote<crosapi::mojom::DeviceAttributes>()
       ->GetDirectoryDeviceId(
@@ -94,6 +95,7 @@
           ->GetHostnameChosenByAdministrator();
   std::move(callback).Run(Result::NewAttribute(attribute));
 #elif BUILDFLAG(IS_CHROMEOS_LACROS)
+  // TODO(crbug.com/1328100): Replace with crosapi BrowserInitParams.
   chromeos::LacrosService::Get()
       ->GetRemote<crosapi::mojom::DeviceAttributes>()
       ->GetDeviceHostname(
@@ -115,6 +117,7 @@
   else
     std::move(callback).Run(Result::NewAttribute(attribute));
 #elif BUILDFLAG(IS_CHROMEOS_LACROS)
+  // TODO(crbug.com/1328100): Replace with crosapi BrowserInitParams.
   chromeos::LacrosService::Get()
       ->GetRemote<crosapi::mojom::DeviceAttributes>()
       ->GetDeviceSerialNumber(
@@ -137,6 +140,7 @@
   else
     std::move(callback).Run(Result::NewAttribute(attribute));
 #elif BUILDFLAG(IS_CHROMEOS_LACROS)
+  // TODO(crbug.com/1328100): Replace with crosapi BrowserInitParams.
   chromeos::LacrosService::Get()
       ->GetRemote<crosapi::mojom::DeviceAttributes>()
       ->GetDeviceAssetId(
@@ -159,6 +163,7 @@
   else
     std::move(callback).Run(Result::NewAttribute(attribute));
 #elif BUILDFLAG(IS_CHROMEOS_LACROS)
+  // TODO(crbug.com/1328100): Replace with crosapi BrowserInitParams.
   chromeos::LacrosService::Get()
       ->GetRemote<crosapi::mojom::DeviceAttributes>()
       ->GetDeviceAnnotatedLocation(
diff --git a/chrome/browser/device_identity/device_oauth2_token_service.cc b/chrome/browser/device_identity/device_oauth2_token_service.cc
index 341715a..2733da9 100644
--- a/chrome/browser/device_identity/device_oauth2_token_service.cc
+++ b/chrome/browser/device_identity/device_oauth2_token_service.cc
@@ -143,14 +143,15 @@
 
 void DeviceOAuth2TokenService::OnGetTokenInfoResponse(
     std::unique_ptr<base::DictionaryValue> token_info) {
-  std::string gaia_robot_id;
+  std::string robot_email;
   // For robot accounts email id is the account id.
-  token_info->GetString("email", &gaia_robot_id);
+  token_info->GetString("email", &robot_email);
   gaia_oauth_client_.reset();
 
   store_->PrepareTrustedAccountId(base::BindRepeating(
       &DeviceOAuth2TokenService::OnPrepareTrustedAccountIdFinished,
-      weak_ptr_factory_.GetWeakPtr(), CoreAccountId::FromEmail(gaia_robot_id)));
+      weak_ptr_factory_.GetWeakPtr(),
+      CoreAccountId::FromRobotEmail(robot_email)));
 }
 
 void DeviceOAuth2TokenService::OnOAuthError() {
diff --git a/chrome/browser/device_identity/device_oauth2_token_service_unittest.cc b/chrome/browser/device_identity/device_oauth2_token_service_unittest.cc
index cfbe650..19c642a 100644
--- a/chrome/browser/device_identity/device_oauth2_token_service_unittest.cc
+++ b/chrome/browser/device_identity/device_oauth2_token_service_unittest.cc
@@ -33,6 +33,11 @@
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+namespace {
+const char kRobotEmail[] = "service_acct@system.gserviceaccount.com";
+const char kWrongRobotEmail[] = "WRONG_service_acct@system.gserviceaccount.com";
+}  // namespace
+
 class MockDeviceOAuth2TokenStore : public DeviceOAuth2TokenStore {
  public:
   MockDeviceOAuth2TokenStore() = default;
@@ -58,7 +63,7 @@
 
 #if !BUILDFLAG(IS_CHROMEOS_ASH)
   void SetAccountEmail(const std::string& account_email) override {
-    account_id_ = CoreAccountId::FromEmail(account_email);
+    account_id_ = CoreAccountId::FromRobotEmail(account_email);
   }
 #endif
 
@@ -102,14 +107,15 @@
   void SetUpDefaultValues() {
     CreateService();
     token_store_->SetRefreshTokenForTesting("device_refresh_token_4_test");
-    SetRobotAccountId("service_acct@g.com");
+    SetRobotAccountId(kRobotEmail);
     AssertConsumerTokensAndErrors(0, 0);
 
     token_store_->TriggerInitCallback(true, true);
   }
 
-  void SetRobotAccountId(const std::string& account_id) {
-    token_store_->SetAccountIdForTesting(CoreAccountId::FromEmail(account_id));
+  void SetRobotAccountId(const std::string& robot_email) {
+    token_store_->SetAccountIdForTesting(
+        CoreAccountId::FromRobotEmail(robot_email));
   }
 
   std::unique_ptr<OAuth2AccessTokenManager::Request> StartTokenRequest() {
@@ -232,8 +238,8 @@
 void DeviceOAuth2TokenServiceTest::PerformURLFetches() {
   PerformURLFetchesWithResults(
       net::HTTP_OK, GetValidTokenResponse("tokeninfo_access_token", 3600),
-      net::HTTP_OK, GetValidTokenInfoResponse("service_acct@g.com"),
-      net::HTTP_OK, GetValidTokenResponse("scoped_access_token", 3600));
+      net::HTTP_OK, GetValidTokenInfoResponse(kRobotEmail), net::HTTP_OK,
+      GetValidTokenResponse("scoped_access_token", 3600));
 }
 
 void DeviceOAuth2TokenServiceTest::AssertConsumerTokensAndErrors(
@@ -257,7 +263,7 @@
 TEST_F(DeviceOAuth2TokenServiceTest, RefreshTokenValidation_SuccessAsyncLoad) {
   CreateService();
   token_store()->SetRefreshTokenForTesting("device_refresh_token_4_test");
-  SetRobotAccountId("service_acct@g.com");
+  SetRobotAccountId(kRobotEmail);
 
   std::unique_ptr<OAuth2AccessTokenManager::Request> request =
       StartTokenRequest();
@@ -287,7 +293,7 @@
 TEST_F(DeviceOAuth2TokenServiceTest, RefreshTokenValidation_InitFailure) {
   CreateService();
   token_store()->SetRefreshTokenForTesting("device_refresh_token_4_test");
-  SetRobotAccountId("service_acct@g.com");
+  SetRobotAccountId(kRobotEmail);
   token_store()->TriggerInitCallback(false, true);
 
   EXPECT_FALSE(RefreshTokenIsAvailable());
@@ -306,7 +312,7 @@
       StartTokenRequest();
 
   PerformURLFetchesWithResults(net::HTTP_UNAUTHORIZED, "", net::HTTP_OK,
-                               GetValidTokenInfoResponse("service_acct@g.com"),
+                               GetValidTokenInfoResponse(kRobotEmail),
                                net::HTTP_OK,
                                GetValidTokenResponse("ignored", 3600));
 
@@ -320,7 +326,7 @@
       StartTokenRequest();
 
   PerformURLFetchesWithResults(net::HTTP_OK, "invalid response", net::HTTP_OK,
-                               GetValidTokenInfoResponse("service_acct@g.com"),
+                               GetValidTokenInfoResponse(kRobotEmail),
                                net::HTTP_OK,
                                GetValidTokenResponse("ignored", 3600));
 
@@ -363,7 +369,7 @@
 
   PerformURLFetchesWithResults(
       net::HTTP_OK, GetValidTokenResponse("tokeninfo_access_token", 3600),
-      net::HTTP_OK, GetValidTokenInfoResponse("service_acct@g.com"),
+      net::HTTP_OK, GetValidTokenInfoResponse(kRobotEmail),
       net::HTTP_BAD_REQUEST, "");
 
   AssertConsumerTokensAndErrors(0, 1);
@@ -377,8 +383,8 @@
 
   PerformURLFetchesWithResults(
       net::HTTP_OK, GetValidTokenResponse("tokeninfo_access_token", 3600),
-      net::HTTP_OK, GetValidTokenInfoResponse("service_acct@g.com"),
-      net::HTTP_OK, "invalid request");
+      net::HTTP_OK, GetValidTokenInfoResponse(kRobotEmail), net::HTTP_OK,
+      "invalid request");
 
   AssertConsumerTokensAndErrors(0, 1);
 }
@@ -388,12 +394,12 @@
   std::unique_ptr<OAuth2AccessTokenManager::Request> request =
       StartTokenRequest();
 
-  SetRobotAccountId("WRONG_service_acct@g.com");
+  SetRobotAccountId(kWrongRobotEmail);
 
   PerformURLFetchesWithResults(
       net::HTTP_OK, GetValidTokenResponse("tokeninfo_access_token", 3600),
-      net::HTTP_OK, GetValidTokenInfoResponse("service_acct@g.com"),
-      net::HTTP_OK, GetValidTokenResponse("ignored", 3600));
+      net::HTTP_OK, GetValidTokenInfoResponse(kRobotEmail), net::HTTP_OK,
+      GetValidTokenResponse("ignored", 3600));
 
   AssertConsumerTokensAndErrors(0, 1);
 }
@@ -405,7 +411,7 @@
 
   PerformURLFetchesWithResults(
       net::HTTP_INTERNAL_SERVER_ERROR, "", net::HTTP_OK,
-      GetValidTokenInfoResponse("service_acct@g.com"), net::HTTP_OK,
+      GetValidTokenInfoResponse(kRobotEmail), net::HTTP_OK,
       GetValidTokenResponse("ignored", 3600));
 
   AssertConsumerTokensAndErrors(0, 1);
diff --git a/chrome/browser/device_identity/device_oauth2_token_store_desktop.cc b/chrome/browser/device_identity/device_oauth2_token_store_desktop.cc
index 02bd095..b52a285 100644
--- a/chrome/browser/device_identity/device_oauth2_token_store_desktop.cc
+++ b/chrome/browser/device_identity/device_oauth2_token_store_desktop.cc
@@ -66,7 +66,7 @@
 }
 
 CoreAccountId DeviceOAuth2TokenStoreDesktop::GetAccountId() const {
-  return CoreAccountId::FromEmail(
+  return CoreAccountId::FromRobotEmail(
       local_state_->GetString(kCBCMServiceAccountEmail));
 }
 
@@ -115,7 +115,7 @@
 
 void DeviceOAuth2TokenStoreDesktop::SetAccountEmail(
     const std::string& account_email) {
-  if (GetAccountId() == CoreAccountId::FromEmail(account_email))
+  if (GetAccountId() == CoreAccountId::FromRobotEmail(account_email))
     return;
 
   local_state_->SetString(kCBCMServiceAccountEmail, account_email);
diff --git a/chrome/browser/device_identity/device_oauth2_token_store_desktop_unittest.cc b/chrome/browser/device_identity/device_oauth2_token_store_desktop_unittest.cc
index c015fa0..96b4ca9 100644
--- a/chrome/browser/device_identity/device_oauth2_token_store_desktop_unittest.cc
+++ b/chrome/browser/device_identity/device_oauth2_token_store_desktop_unittest.cc
@@ -15,6 +15,10 @@
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace {
+
+const char kTestRobotEmail[] = "foo@system.gserviceaccount.com";
+const char kTestOtherRobotEmail[] = "bar@system.gserviceaccount.com";
+
 class TestObserver : public DeviceOAuth2TokenStore::Observer {
  public:
   int called_count() const { return called_count_; }
@@ -70,7 +74,7 @@
 
 TEST_F(DeviceOAuth2TokenStoreDesktopTest, InitWithSavedToken) {
   scoped_testing_local_state()->Get()->SetString(kCBCMServiceAccountEmail,
-                                                 "foo@g.com");
+                                                 kTestRobotEmail);
 
   std::string token = "test_token";
   std::string encrypted_token;
@@ -92,13 +96,14 @@
   store.Init(base::BindOnce([](bool, bool) {}));
 
   EXPECT_EQ(1, observer.called_count());
-  EXPECT_EQ(store.GetAccountId(), CoreAccountId::FromEmail("foo@g.com"));
+  EXPECT_EQ(store.GetAccountId(),
+            CoreAccountId::FromRobotEmail(kTestRobotEmail));
   EXPECT_EQ(store.GetRefreshToken(), token);
 }
 
 TEST_F(DeviceOAuth2TokenStoreDesktopTest, ObserverNotifiedWhenAccountChanges) {
   scoped_testing_local_state()->Get()->SetString(kCBCMServiceAccountEmail,
-                                                 "foo@g.com");
+                                                 kTestRobotEmail);
 
   std::string token = "test_token";
   std::string encrypted_token;
@@ -121,10 +126,11 @@
 
   EXPECT_EQ(1, test_observer.called_count());
 
-  EXPECT_EQ(store.GetAccountId(), CoreAccountId::FromEmail("foo@g.com"));
+  EXPECT_EQ(store.GetAccountId(),
+            CoreAccountId::FromRobotEmail(kTestRobotEmail));
   EXPECT_EQ(store.GetRefreshToken(), token);
 
-  store.SetAccountEmail("bar@g.com");
+  store.SetAccountEmail(kTestOtherRobotEmail);
 
   EXPECT_EQ(2, test_observer.called_count());
 }
diff --git a/chrome/browser/devtools/devtools_browsertest.cc b/chrome/browser/devtools/devtools_browsertest.cc
index 4b8fec7..fdbe4ec 100644
--- a/chrome/browser/devtools/devtools_browsertest.cc
+++ b/chrome/browser/devtools/devtools_browsertest.cc
@@ -691,7 +691,7 @@
 
   const extensions::Extension* LoadExtension(base::FilePath extension_path) {
     extensions::TestExtensionRegistryObserver observer(extension_registry_);
-    ExtensionTestMessageListener activated_listener("WORKER_ACTIVATED", false);
+    ExtensionTestMessageListener activated_listener("WORKER_ACTIVATED");
     extensions::UnpackedInstaller::Create(extension_service_)
         ->Load(extension_path);
     observer.WaitForExtensionLoaded();
diff --git a/chrome/browser/devtools/protocol/devtools_protocol_browsertest.cc b/chrome/browser/devtools/protocol/devtools_protocol_browsertest.cc
index efea2f6f..8b079e4 100644
--- a/chrome/browser/devtools/protocol/devtools_protocol_browsertest.cc
+++ b/chrome/browser/devtools/protocol/devtools_protocol_browsertest.cc
@@ -834,7 +834,7 @@
 
   const extensions::Extension* LoadExtension(base::FilePath extension_path) {
     extensions::TestExtensionRegistryObserver observer(extension_registry_);
-    ExtensionTestMessageListener activated_listener("WORKER_ACTIVATED", false);
+    ExtensionTestMessageListener activated_listener("WORKER_ACTIVATED");
     extensions::UnpackedInstaller::Create(extension_service_)
         ->Load(extension_path);
     observer.WaitForExtensionLoaded();
diff --git a/chrome/browser/enterprise/connectors/common.cc b/chrome/browser/enterprise/connectors/common.cc
index 186df52..a8ca441 100644
--- a/chrome/browser/enterprise/connectors/common.cc
+++ b/chrome/browser/enterprise/connectors/common.cc
@@ -18,6 +18,8 @@
 #endif
 
 #if BUILDFLAG(IS_CHROMEOS_LACROS)
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/profiles/profile_manager.h"
 #include "components/policy/core/common/policy_loader_lacros.h"
 #endif
 
@@ -275,4 +277,18 @@
       /* file_count */ 1, state, download_item);
 }
 
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+Profile* GetMainProfileLacros() {
+  ProfileManager* profile_manager = g_browser_process->profile_manager();
+  if (!profile_manager)
+    return nullptr;
+  auto profiles = g_browser_process->profile_manager()->GetLoadedProfiles();
+  const auto main_it = base::ranges::find_if(
+      profiles, [](Profile* profile) { return profile->IsMainProfile(); });
+  if (main_it == profiles.end())
+    return nullptr;
+  return *main_it;
+}
+#endif
+
 }  // namespace enterprise_connectors
diff --git a/chrome/browser/enterprise/connectors/common.h b/chrome/browser/enterprise/connectors/common.h
index 0cf6d6d..2f4e8b9 100644
--- a/chrome/browser/enterprise/connectors/common.h
+++ b/chrome/browser/enterprise/connectors/common.h
@@ -261,6 +261,11 @@
                               base::OnceClosure keep_closure,
                               base::OnceClosure discard_closure);
 
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+// Returns the single main profile, or nullptr if none is found.
+Profile* GetMainProfileLacros();
+#endif
+
 }  // namespace enterprise_connectors
 
 #endif  // CHROME_BROWSER_ENTERPRISE_CONNECTORS_COMMON_H_
diff --git a/chrome/browser/enterprise/connectors/connectors_service.cc b/chrome/browser/enterprise/connectors/connectors_service.cc
index 00bb07c..f58b6b38 100644
--- a/chrome/browser/enterprise/connectors/connectors_service.cc
+++ b/chrome/browser/enterprise/connectors/connectors_service.cc
@@ -51,11 +51,13 @@
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 #include "chrome/browser/ash/policy/core/user_cloud_policy_manager_ash.h"
 #include "chrome/browser/ash/profiles/profile_helper.h"
+#include "chrome/browser/ash/settings/device_settings_service.h"
 #include "components/user_manager/user.h"
 #include "extensions/common/constants.h"
 #endif
 
 #if BUILDFLAG(IS_CHROMEOS_LACROS)
+#include "chromeos/startup/browser_init_params.h"
 #include "components/policy/core/common/policy_loader_lacros.h"
 #endif
 
@@ -84,8 +86,11 @@
   if (manager && manager->core() && manager->core()->client())
     client_id = manager->core()->client()->client_id();
 #elif BUILDFLAG(IS_CHROMEOS_LACROS)
-  // TODO(crbug.com/1252802): Add the client ID for LaCrOS.
-  std::string client_id = "";
+  Profile* main_profile = GetMainProfileLacros();
+  std::string client_id;
+  if (main_profile) {
+    client_id = reporting::GetUserClientId(main_profile).value_or("");
+  }
 #else
   std::string client_id =
       policy::BrowserDMTokenStorage::Get()->RetrieveClientId();
@@ -110,22 +115,24 @@
   return false;
 }
 
+#if BUILDFLAG(IS_CHROMEOS)
+absl::optional<std::string> GetDeviceDMToken() {
 #if BUILDFLAG(IS_CHROMEOS_LACROS)
-// Returns the single main profile, or nullptr if none is found.
-Profile* GetMainProfile() {
-  ProfileManager* profile_manager = g_browser_process->profile_manager();
-  if (!profile_manager)
-    return nullptr;
-  auto profiles = g_browser_process->profile_manager()->GetLoadedProfiles();
-  const auto main_it = base::ranges::find_if(
-      profiles, [](Profile* profile) { return profile->IsMainProfile(); });
-  if (main_it == profiles.end())
-    return nullptr;
-  return *main_it;
-}
-
+  const crosapi::mojom::BrowserInitParams* init_params =
+      chromeos::BrowserInitParams::Get();
+  if (init_params && init_params->device_properties) {
+    return init_params->device_properties->device_dm_token;
+  }
+  return absl::nullopt;
+#else
+  const enterprise_management::PolicyData* policy_data =
+      ash::DeviceSettingsService::Get()->policy_data();
+  if (policy_data && policy_data->has_request_token())
+    return policy_data->request_token();
+  return absl::nullopt;
 #endif
-
+}
+#endif
 }  // namespace
 
 const base::Feature kEnterpriseConnectorsEnabled{
@@ -246,6 +253,21 @@
   if (!settings.has_value())
     return absl::nullopt;
 
+#if BUILDFLAG(IS_CHROMEOS)
+  Profile* profile = Profile::FromBrowserContext(context_);
+  if (enterprise_connectors::IncludeDeviceInfo(profile,
+                                               /*per_profile=*/false)) {
+    // The device dm token includes additional information like a device id,
+    // which is relevant for reporting and should only be used for
+    // IncludeDeviceInfo==true.
+    absl::optional<std::string> device_dm_token = GetDeviceDMToken();
+    if (device_dm_token.has_value()) {
+      settings.value().dm_token = device_dm_token.value();
+      settings.value().per_profile = false;
+      return settings;
+    }
+  }
+#endif
   absl::optional<DmToken> dm_token = GetDmToken(ConnectorScopePref(connector));
   if (!dm_token.has_value())
     return absl::nullopt;
@@ -628,7 +650,7 @@
     if (primary_profile)
       return primary_profile;
 #elif BUILDFLAG(IS_CHROMEOS_LACROS)
-    Profile* main_profile = GetMainProfile();
+    Profile* main_profile = GetMainProfileLacros();
     if (main_profile)
       return main_profile;
 #endif
diff --git a/chrome/browser/enterprise/connectors/connectors_service_browsertest.cc b/chrome/browser/enterprise/connectors/connectors_service_browsertest.cc
index a7d7ef7..76a1bff 100644
--- a/chrome/browser/enterprise/connectors/connectors_service_browsertest.cc
+++ b/chrome/browser/enterprise/connectors/connectors_service_browsertest.cc
@@ -91,13 +91,13 @@
   return "Windows";
 #elif BUILDFLAG(IS_MAC)
   return "Mac OS X";
-#elif BUILDFLAG(IS_CHROMEOS_ASH)
+#elif BUILDFLAG(IS_CHROMEOS)
 #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
   return "ChromeOS";
 #else
   return "ChromiumOS";
 #endif
-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
+#elif BUILDFLAG(IS_LINUX)
   return "Linux";
 #endif
 #if BUILDFLAG(IS_FUCHSIA)
diff --git a/chrome/browser/extensions/api/enterprise_reporting_private/OWNERS b/chrome/browser/extensions/api/enterprise_reporting_private/OWNERS
index 9b7b96e..07cfee2 100644
--- a/chrome/browser/extensions/api/enterprise_reporting_private/OWNERS
+++ b/chrome/browser/extensions/api/enterprise_reporting_private/OWNERS
@@ -2,3 +2,4 @@
 pastarmovj@chromium.org
 zmin@chromium.org
 domfc@chromium.org
+seblalancette@chromium.org
diff --git a/chrome/browser/extensions/api/preference/preference_api.cc b/chrome/browser/extensions/api/preference/preference_api.cc
index 08144ed95..e28d34c9 100644
--- a/chrome/browser/extensions/api/preference/preference_api.cc
+++ b/chrome/browser/extensions/api/preference/preference_api.cc
@@ -106,8 +106,11 @@
     {"passwordSavingEnabled",
      password_manager::prefs::kCredentialsEnableService,
      APIPermissionID::kPrivacy, APIPermissionID::kPrivacy},
+
+    // Note in Lacros this is Ash-controlled.
     {"protectedContentEnabled", prefs::kProtectedContentDefault,
      APIPermissionID::kPrivacy, APIPermissionID::kPrivacy},
+
     {"proxy", proxy_config::prefs::kProxy, APIPermissionID::kProxy,
      APIPermissionID::kProxy},
     {"referrersEnabled", prefs::kEnableReferrers, APIPermissionID::kPrivacy,
@@ -372,7 +375,9 @@
              {chromeos::prefs::kAccessibilitySwitchAccessEnabled,
               crosapi::mojom::PrefPath::kAccessibilitySwitchAccessEnabled},
              {chromeos::prefs::kAccessibilityVirtualKeyboardEnabled,
-              crosapi::mojom::PrefPath::kAccessibilityVirtualKeyboardEnabled}});
+              crosapi::mojom::PrefPath::kAccessibilityVirtualKeyboardEnabled},
+             {prefs::kProtectedContentDefault,
+              crosapi::mojom::PrefPath::kProtectedContentDefault}});
     auto pref_path = name_to_extension_prefpath->find(pref_name);
     return pref_path == name_to_extension_prefpath->end()
                ? crosapi::mojom::PrefPath::kUnknown
diff --git a/chrome/browser/extensions/api/preference/preference_api_lacros_browsertest.cc b/chrome/browser/extensions/api/preference/preference_api_lacros_browsertest.cc
index a853075b6..18fad2f 100644
--- a/chrome/browser/extensions/api/preference/preference_api_lacros_browsertest.cc
+++ b/chrome/browser/extensions/api/preference/preference_api_lacros_browsertest.cc
@@ -113,7 +113,7 @@
       test_data_dir_.AppendASCII("preference/lacros");
   {
     extensions::ResultCatcher catcher;
-    ExtensionTestMessageListener listener("ready", true);
+    ExtensionTestMessageListener listener("ready", ReplyBehavior::kWillReply);
     EXPECT_TRUE(LoadExtension(extension_path)) << message_;
     EXPECT_TRUE(listener.WaitUntilSatisfied());
     // Run the tests.
@@ -124,7 +124,7 @@
 
   // The settings should not be reset when the extension is reloaded.
   {
-    ExtensionTestMessageListener listener("ready", true);
+    ExtensionTestMessageListener listener("ready", ReplyBehavior::kWillReply);
     ReloadExtension(last_loaded_extension_id());
     EXPECT_TRUE(listener.WaitUntilSatisfied());
     listener.Reply("");
@@ -140,7 +140,7 @@
   CheckPreferencesCleared();
 
   {
-    ExtensionTestMessageListener listener("ready", true);
+    ExtensionTestMessageListener listener("ready", ReplyBehavior::kWillReply);
     EXPECT_TRUE(LoadExtension(extension_path));
     EXPECT_TRUE(listener.WaitUntilSatisfied());
     listener.Reply("");
diff --git a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc
index 13a99129..cebdf400 100644
--- a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc
+++ b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.cc
@@ -1028,6 +1028,13 @@
 #else
   std::string client_id =
       policy::BrowserDMTokenStorage::Get()->RetrieveClientId();
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+  Profile* main_profile = enterprise_connectors::GetMainProfileLacros();
+  if (main_profile) {
+    // Prefer the user client id if available.
+    client_id = reporting::GetUserClientId(main_profile).value_or(client_id);
+  }
+#endif
 
   // Make sure DeviceManagementService has been initialized.
   device_management_service->ScheduleInitialization(0);
diff --git a/chrome/browser/extensions/chrome_extensions_browser_client.cc b/chrome/browser/extensions/chrome_extensions_browser_client.cc
index 61b611ad..e7d0aad 100644
--- a/chrome/browser/extensions/chrome_extensions_browser_client.cc
+++ b/chrome/browser/extensions/chrome_extensions_browser_client.cc
@@ -652,7 +652,8 @@
   auto* telemetry_service =
       safe_browsing::ExtensionTelemetryServiceFactory::GetForProfile(
           Profile::FromBrowserContext(context));
-  if (!telemetry_service || !telemetry_service->enabled()) {
+  if (!telemetry_service || !telemetry_service->enabled() ||
+      !IsExtensionTelemetryRemoteHostContactedSignalEnabled()) {
     return;
   }
   auto remote_host_signal =
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedSwipeRefreshLayout.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedSwipeRefreshLayout.java
index 5109db3..a5e1e2db 100644
--- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedSwipeRefreshLayout.java
+++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedSwipeRefreshLayout.java
@@ -6,12 +6,14 @@
 
 import android.annotation.SuppressLint;
 import android.app.Activity;
+import android.content.Context;
 import android.util.DisplayMetrics;
 import android.view.MotionEvent;
 import android.view.View;
 import android.view.View.MeasureSpec;
 import android.view.ViewConfiguration;
 import android.view.ViewGroup;
+import android.view.accessibility.AccessibilityManager;
 
 import androidx.annotation.IdRes;
 import androidx.annotation.NonNull;
@@ -74,9 +76,19 @@
         instance.addOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
             @Override
             public void onRefresh() {
-                String accessibilityRefreshString =
-                        activity.getResources().getString(R.string.accessibility_swipe_refresh);
-                instance.announceForAccessibility(accessibilityRefreshString);
+                AccessibilityManager accessibilityManager =
+                        (AccessibilityManager) instance.getContext().getSystemService(
+                                Context.ACCESSIBILITY_SERVICE);
+                if (accessibilityManager != null && accessibilityManager.isEnabled()) {
+                    try {
+                        accessibilityManager.interrupt();
+                    } catch (NullPointerException e) {
+                        // The interrupt call can throw an exception due to a framework bug
+                        // (http://b/32507871).
+                    }
+                    instance.announceForAccessibility(activity.getResources().getString(
+                            R.string.accessibility_swipe_refresh));
+                }
                 RecordUserAction.record("MobilePullGestureReloadNTP");
             }
         });
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/sections/SectionHeaderViewTest.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/sections/SectionHeaderViewTest.java
index 66351ca..2a7cffac 100644
--- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/sections/SectionHeaderViewTest.java
+++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/sections/SectionHeaderViewTest.java
@@ -74,6 +74,7 @@
 
     private void setFeatureOverridesForIPH() {
         FeatureList.TestValues testValues = new FeatureList.TestValues();
+        testValues.addFeatureFlagOverride(ChromeFeatureList.ANDROID_SCROLL_OPTIMIZATIONS, false);
         testValues.addFeatureFlagOverride(ChromeFeatureList.ENABLE_IPH, true);
         testValues.addFeatureFlagOverride(ChromeFeatureList.WEB_FEED, true);
         testValues.addFeatureFlagOverride(ChromeFeatureList.WEB_FEED_ONBOARDING, true);
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedFollowIntroControllerTest.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedFollowIntroControllerTest.java
index 29d041dc..13a791f6 100644
--- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedFollowIntroControllerTest.java
+++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedFollowIntroControllerTest.java
@@ -190,6 +190,8 @@
         mBaseTestValues.addFeatureFlagOverride(ChromeFeatureList.SNOOZABLE_IPH, false);
         mBaseTestValues.addFeatureFlagOverride(ChromeFeatureList.ENABLE_AUTOMATIC_SNOOZE, false);
         mBaseTestValues.addFeatureFlagOverride(ChromeFeatureList.ENABLE_IPH, true);
+        mBaseTestValues.addFeatureFlagOverride(
+                ChromeFeatureList.ANDROID_SCROLL_OPTIMIZATIONS, false);
         FeatureList.setTestValues(mBaseTestValues);
         resetWebFeedFollowIntroController();
 
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedFollowIntroViewTest.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedFollowIntroViewTest.java
index 8e9d036b..1828573 100644
--- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedFollowIntroViewTest.java
+++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedFollowIntroViewTest.java
@@ -87,6 +87,8 @@
     @SmallTest
     public void showIPHTest() {
         FeatureList.TestValues baseTestValues = new FeatureList.TestValues();
+        baseTestValues.addFeatureFlagOverride(
+                ChromeFeatureList.ANDROID_SCROLL_OPTIMIZATIONS, false);
         baseTestValues.addFeatureFlagOverride(ChromeFeatureList.ENABLE_IPH, true);
         FeatureList.setTestValues(baseTestValues);
 
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 09ed372..adb8ae61 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -5770,7 +5770,7 @@
   {
     "name": "tab-hover-card-images",
     "owners": [ "dfried", "corising", "//chrome/browser/ui/views/tabs/OWNERS" ],
-    "expiry_milestone": 105
+    "expiry_milestone": 110
   },
   {
     "name": "tab-outlines-in-low-contrast-themes",
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 2565e06..7c72b3a 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -2417,11 +2417,6 @@
     "Enable the support for policy controlled enabling or disabling of PIN "
     "Locking SIMs on managed devices.";
 
-const char kSkiaRendererName[] = "Skia API for compositing";
-const char kSkiaRendererDescription[] =
-    "If enabled, the display compositor will use Skia as the graphics API "
-    "instead of OpenGL ES.";
-
 const char kIsolateOriginsName[] = "Isolate additional origins";
 const char kIsolateOriginsDescription[] =
     "Requires dedicated processes for an additional set of origins, "
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc
index d585cd9..7d76673 100644
--- a/chrome/browser/flags/android/chrome_feature_list.cc
+++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -266,8 +266,6 @@
     &kSearchEnginePromoExistingDeviceV2,
     &kSearchEnginePromoNewDevice,
     &kSearchEnginePromoNewDeviceV2,
-    &kServiceManagerForBackgroundPrefetch,
-    &kServiceManagerForDownload,
     &kShareButtonInTopToolbar,
     &kSharedClipboardUI,
     &kShowScrollableMVTOnNTPAndroid,
@@ -741,12 +739,6 @@
 const base::Feature kRelatedSearchesUi{"RelatedSearchesUi",
                                        base::FEATURE_DISABLED_BY_DEFAULT};
 
-const base::Feature kServiceManagerForBackgroundPrefetch{
-    "ServiceManagerForBackgroundPrefetch", base::FEATURE_ENABLED_BY_DEFAULT};
-
-const base::Feature kServiceManagerForDownload{
-    "ServiceManagerForDownload", base::FEATURE_ENABLED_BY_DEFAULT};
-
 const base::Feature kShareButtonInTopToolbar{"ShareButtonInTopToolbar",
                                              base::FEATURE_DISABLED_BY_DEFAULT};
 
diff --git a/chrome/browser/flags/android/chrome_feature_list.h b/chrome/browser/flags/android/chrome_feature_list.h
index bcaf643..dc47f9d 100644
--- a/chrome/browser/flags/android/chrome_feature_list.h
+++ b/chrome/browser/flags/android/chrome_feature_list.h
@@ -127,8 +127,6 @@
 extern const base::Feature kSearchEnginePromoExistingDeviceV2;
 extern const base::Feature kSearchEnginePromoNewDevice;
 extern const base::Feature kSearchEnginePromoNewDeviceV2;
-extern const base::Feature kServiceManagerForBackgroundPrefetch;
-extern const base::Feature kServiceManagerForDownload;
 extern const base::Feature kShareButtonInTopToolbar;
 extern const base::Feature kSharingHubLinkToggle;
 extern const base::Feature kShowScrollableMVTOnNTPAndroid;
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java
index f85dff0e1..cc78c84784 100644
--- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java
+++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlags.java
@@ -51,8 +51,6 @@
                     .put(ChromeFeatureList.ANONYMOUS_UPDATE_CHECKS, true)
                     .put(ChromeFeatureList.CONDITIONAL_TAB_STRIP_ANDROID, false)
                     .put(ChromeFeatureList.LENS_CAMERA_ASSISTED_SEARCH, false)
-                    .put(ChromeFeatureList.SERVICE_MANAGER_FOR_DOWNLOAD, true)
-                    .put(ChromeFeatureList.SERVICE_MANAGER_FOR_BACKGROUND_PREFETCH, true)
                     .put(ChromeFeatureList.COMMAND_LINE_ON_NON_ROOTED, false)
                     .put(ChromeFeatureList.DOWNLOADS_AUTO_RESUMPTION_NATIVE, true)
                     .put(ChromeFeatureList.EARLY_LIBRARY_LOAD, true)
@@ -112,12 +110,6 @@
      */
     private static final Map<String, String> sNonDynamicPrefKeys =
             ImmutableMap.<String, String>builder()
-                    .put(ChromeFeatureList.SERVICE_MANAGER_FOR_DOWNLOAD,
-                            ChromePreferenceKeys
-                                    .FLAGS_CACHED_SERVICE_MANAGER_FOR_DOWNLOAD_RESUMPTION)
-                    .put(ChromeFeatureList.SERVICE_MANAGER_FOR_BACKGROUND_PREFETCH,
-                            ChromePreferenceKeys
-                                    .FLAGS_CACHED_SERVICE_MANAGER_FOR_BACKGROUND_PREFETCH)
                     .put(ChromeFeatureList.COMMAND_LINE_ON_NON_ROOTED,
                             ChromePreferenceKeys.FLAGS_CACHED_COMMAND_LINE_ON_NON_ROOTED_ENABLED)
                     .put(ChromeFeatureList.DOWNLOADS_AUTO_RESUMPTION_NATIVE,
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
index a81eb01..a0bb287 100644
--- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
+++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
@@ -487,9 +487,6 @@
             "SearchEnginePromo.NewDeviceVer2";
     public static final String SEND_TAB_TO_SELF_SIGNIN_PROMO = "SendTabToSelfSigninPromo";
     public static final String SEND_TAB_TO_SELF_V2 = "SendTabToSelfV2";
-    public static final String SERVICE_MANAGER_FOR_BACKGROUND_PREFETCH =
-            "ServiceManagerForBackgroundPrefetch";
-    public static final String SERVICE_MANAGER_FOR_DOWNLOAD = "ServiceManagerForDownload";
     public static final String SHARE_BUTTON_IN_TOP_TOOLBAR = "ShareButtonInTopToolbar";
     public static final String SHARE_CROW_BUTTON = "ShareCrowButton";
     public static final String SHARED_CLIPBOARD_UI = "SharedClipboardUI";
diff --git a/chrome/browser/google/google_brand_code_map_chromeos.cc b/chrome/browser/google/google_brand_code_map_chromeos.cc
index 906e65d..6c3502b 100644
--- a/chrome/browser/google/google_brand_code_map_chromeos.cc
+++ b/chrome/browser/google/google_brand_code_map_chromeos.cc
@@ -91,6 +91,7 @@
                      {"CDYS", {"CJRA", "BIRA", "NFVP"}},
                      {"CFGF", {"SKZQ", "CFPE", "KTXQ"}},
                      {"CFUL", {"GIFL", "EDYW", "GOJE"}},
+                     {"CKJN", {"KUGL", "XRVY", "AQPP"}},
                      {"CLQY", {"BBGR", "ULEA", "YDVH"}},
                      {"CLSF", {"OWOB", "RLJX", "OZWK"}},
                      {"CNOR", {"TEUF", "QHOY", "NQZD"}},
@@ -102,6 +103,7 @@
                      {"CWYF", {"SJVC", "WWPB", "ADRO"}},
                      {"CYQR", {"XGJJ", "DRMC", "RUQD"}},
                      {"CYSQ", {"NHHD", "TAVM", "FHSA"}},
+                     {"CZPM", {"ULQK", "OVJJ", "DUAD"}},
                      {"DBED", {"JUMI", "UTSY", "RXGS"}},
                      {"DBHI", {"MMGG", "MMQD", "XQDJ"}},
                      {"DEAA", {"HXUG", "BJUN", "IYTV"}},
@@ -112,6 +114,7 @@
                      {"DEAF", {"TATK", "RWXF", "DQDT"}},
                      {"DEAG", {"JFEX", "CVLN", "UFWN"}},
                      {"DEAH", {"HRBU", "DJKF", "CMPZ"}},
+                     {"DGSC", {"YDED", "SBBD", "LJJT"}},
                      {"DHAS", {"KEDN", "LUZR", "MHFN"}},
                      {"DISZ", {"PPAR", "VCPW", "NJKK"}},
                      {"DJBB", {"ZLXN", "WQCE", "ASCQ"}},
@@ -322,6 +325,7 @@
                      {"LPEW", {"XBJZ", "HTBP", "JQXK"}},
                      {"LPXP", {"WGRM", "JAXQ", "VPND"}},
                      {"LULQ", {"DEHI", "QYXC", "KAGT"}},
+                     {"LUXZ", {"SIXJ", "LBCX", "RJFU"}},
                      {"LYFT", {"LMQF", "CYMI", "ZGEF"}},
                      {"LYLN", {"XXWY", "JEUV", "RSOC"}},
                      {"LYVN", {"USOR", "ASKR", "LPGD"}},
@@ -368,6 +372,7 @@
                      {"PLKQ", {"EXXM", "LBZT", "SPDN"}},
                      {"PRYU", {"QFZV", "TZXL", "EPRT"}},
                      {"PSHU", {"DWTK", "RTTW", "PGXM"}},
+                     {"PTUY", {"IVGZ", "CNVR", "YCUX"}},
                      {"PULG", {"OXHS", "IBTI", "EKUW"}},
                      {"PVHI", {"FUBQ", "URIF", "UATZ"}},
                      {"PWFL", {"WGJQ", "KMBF", "UKJV"}},
@@ -460,6 +465,7 @@
                      {"UTTX", {"OZET", "BYVE", "PLSI"}},
                      {"UUCL", {"HELE", "KEDZ", "ZAAI"}},
                      {"UZTQ", {"CJSB", "RVPJ", "EASI"}},
+                     {"VAFH", {"FMPL", "YJOM", "RNEF"}},
                      {"VEUT", {"JDFA", "ALIR", "DDJM"}},
                      {"VGYW", {"AAXS", "SHZF", "HYJU"}},
                      {"VHUH", {"JYDF", "SFJY", "JMBU"}},
@@ -472,6 +478,7 @@
                      {"VYNC", {"MBDE", "ZHLY", "EESD"}},
                      {"VYRC", {"VKSO", "NKTO", "ZPZX"}},
                      {"VZMB", {"YCKT", "WSPC", "SHYP"}},
+                     {"VZSZ", {"CXMW", "WOAL", "PONV"}},
                      {"WBZQ", {"LAYK", "LQDM", "QBFV"}},
                      {"WCLL", {"DALK", "WPRA", "TPTP"}},
                      {"WFIQ", {"KKHX", "UTHS", "HDSP"}},
@@ -500,6 +507,7 @@
                      {"XVYQ", {"UAVB", "OEMI", "VQVK"}},
                      {"XWJE", {"KDZI", "IYPJ", "ERIM"}},
                      {"YAVR", {"DHAY", "KBWN", "BBPJ"}},
+                     {"YAZN", {"QIGR", "SHZH", "DKXN"}},
                      {"YEGM", {"SEQF", "OXKW", "OFEF"}},
                      {"YFVF", {"NPWS", "PUZZ", "TTCZ"}},
                      {"YGHA", {"BMDT", "AUXW", "GYPE"}},
@@ -516,6 +524,7 @@
                      {"YXED", {"KDUD", "MTUI", "WLHI"}},
                      {"YXMK", {"ZUSE", "TZFU", "DVKA"}},
                      {"ZBCF", {"BDTW", "MIQF", "VUNL"}},
+                     {"ZBCZ", {"DUPJ", "ESKI", "KECI"}},
                      {"ZDKS", {"UBRP", "AWQF", "GOVG"}},
                      {"ZDYJ", {"JNGY", "SDRU", "YIEW"}},
                      {"ZFCZ", {"JQUA", "SEEH", "RJVV"}},
@@ -526,6 +535,7 @@
                      {"ZJLO", {"HLMS", "OHWG", "HMAL"}},
                      {"ZKJH", {"OBDQ", "OUAQ", "SPYY"}},
                      {"ZLBC", {"DJCJ", "HNGZ", "IRYZ"}},
+                     {"ZLJE", {"NIZI", "ZWAH", "OAQL"}},
                      {"ZMHB", {"YRPB", "KPOF", "SBIB"}},
                      {"ZPIS", {"VXIY", "HUUG", "GHXQ"}},
                      {"ZSKM", {"JPEZ", "FTUS", "ZFUF"}},
diff --git a/chrome/browser/headless/headless_mode_browsertest_mac.mm b/chrome/browser/headless/headless_mode_browsertest_mac.mm
index 791cb6c8..3adcbf49 100644
--- a/chrome/browser/headless/headless_mode_browsertest_mac.mm
+++ b/chrome/browser/headless/headless_mode_browsertest_mac.mm
@@ -52,3 +52,26 @@
   EXPECT_TRUE(browser()->window()->IsVisible());
   EXPECT_FALSE(ns_window.visible);
 }
+
+IN_PROC_BROWSER_TEST_F(HeadlessModeBrowserTest,
+                       MinimizedRestoredWindowVisibility) {
+  gfx::NativeWindow native_window = browser()->window()->GetNativeWindow();
+  NSWindow* ns_window = native_window.GetNativeNSWindow();
+
+  // Verify initial state.
+  ASSERT_FALSE(browser()->window()->IsMinimized());
+  EXPECT_TRUE(browser()->window()->IsVisible());
+  EXPECT_FALSE(ns_window.visible);
+
+  // Verify minimized state.
+  browser()->window()->Minimize();
+  ASSERT_TRUE(browser()->window()->IsMinimized());
+  EXPECT_TRUE(browser()->window()->IsVisible());
+  EXPECT_FALSE(ns_window.visible);
+
+  // Verify restored state.
+  browser()->window()->Restore();
+  ASSERT_FALSE(browser()->window()->IsMinimized());
+  EXPECT_TRUE(browser()->window()->IsVisible());
+  EXPECT_FALSE(ns_window.visible);
+}
diff --git a/chrome/browser/history_clusters/history_clusters_bridge.cc b/chrome/browser/history_clusters/history_clusters_bridge.cc
index 6f43960..89ee9bd 100644
--- a/chrome/browser/history_clusters/history_clusters_bridge.cc
+++ b/chrome/browser/history_clusters/history_clusters_bridge.cc
@@ -131,7 +131,7 @@
             env,
             base::android::ToTypedJavaArrayOfObjects(env, cluster_visits,
                                                      cluster_visit_type),
-            base::android::ToJavaArrayOfStrings(env, cluster.keywords),
+            base::android::ToJavaArrayOfStrings(env, cluster.GetKeywords()),
             base::android::ConvertUTF16ToJavaString(env, label),
             base::android::ToJavaIntArray(env, label_match_starts),
             base::android::ToJavaIntArray(env, label_match_ends),
diff --git a/chrome/browser/lacros/browser_service_lacros.cc b/chrome/browser/lacros/browser_service_lacros.cc
index f145ad76..f3e252e2 100644
--- a/chrome/browser/lacros/browser_service_lacros.cc
+++ b/chrome/browser/lacros/browser_service_lacros.cc
@@ -129,6 +129,16 @@
                           can_trigger_fre));
 }
 
+NavigateParams::PathBehavior ConvertPathBehavior(
+    crosapi::mojom::OpenUrlParams_SwitchToTabPathBehavior path_behavior) {
+  switch (path_behavior) {
+    case crosapi::mojom::OpenUrlParams_SwitchToTabPathBehavior::kRespect:
+      return NavigateParams::RESPECT;
+    case crosapi::mojom::OpenUrlParams_SwitchToTabPathBehavior::kIgnore:
+      return NavigateParams::IGNORE_AND_NAVIGATE;
+  }
+}
+
 }  // namespace
 
 // A struct to keep the pending OpenUrl task.
@@ -429,6 +439,8 @@
       break;
     case OpenUrlParams::WindowOpenDisposition::kSwitchToTab:
       navigate_params.disposition = WindowOpenDisposition::SWITCH_TO_TAB;
+      navigate_params.path_behavior =
+          ConvertPathBehavior(params->path_behavior);
       break;
   }
 
diff --git a/chrome/browser/media/encrypted_media_supported_types_browsertest.cc b/chrome/browser/media/encrypted_media_supported_types_browsertest.cc
index 9ed9824..ccc127e1 100644
--- a/chrome/browser/media/encrypted_media_supported_types_browsertest.cc
+++ b/chrome/browser/media/encrypted_media_supported_types_browsertest.cc
@@ -468,6 +468,9 @@
 #if BUILDFLAG(ENABLE_LIBRARY_CDMS)
   EncryptedMediaSupportedTypesExternalClearKeyTest() {
     enabled_features_.push_back(media::kExternalClearKeyForTesting);
+#if BUILDFLAG(ENABLE_PLATFORM_HEVC)
+    enabled_features_.push_back(media::kPlatformHEVCDecoderSupport);
+#endif  // BUILDFLAG(ENABLE_PLATFORM_HEVC)
   }
 
   void SetUpCommandLine(base::CommandLine* command_line) override {
@@ -818,19 +821,30 @@
   EXPECT_ECK_PROPRIETARY(IsSupportedByKeySystem(
       kExternalClearKey, kVideoMP4MimeType, video_mp4_codecs()));
 
+  auto hevc_supported = IsSupportedByKeySystem(
+      kExternalClearKey, kVideoMP4MimeType, video_mp4_hevc_codecs());
+#if BUILDFLAG(ENABLE_HEVC_PARSER_AND_HW_DECODER)
+#if BUILDFLAG(IS_WIN)
   // On Windows platforms, HEVC support is detected through the GPU capabilities
   // which won't indicate support when running the tests.
-  // On macOS platforms, HEVC only support clear content.
   // TODO(crbug/1327470): Fix this so that we can inject HEVC support on
   // Windows.
-#if BUILDFLAG(ENABLE_HEVC_PARSER_AND_HW_DECODER) && !BUILDFLAG(IS_WIN) && \
-    !BUILDFLAG(IS_MAC)
-  EXPECT_ECK_PROPRIETARY(IsSupportedByKeySystem(
-      kExternalClearKey, kVideoMP4MimeType, video_mp4_hevc_codecs()));
+  EXPECT_UNSUPPORTED(hevc_supported);
+#elif BUILDFLAG(IS_MAC)
+  // On Mac platforms, HEVC support should be available if OS >= Big Sur 11.0
+  // and kPlatformHEVCDecoderSupport is enabled.
+  if (__builtin_available(macOS 11.0, *)) {
+    EXPECT_ECK_PROPRIETARY(hevc_supported);
+  } else {
+    EXPECT_UNSUPPORTED(hevc_supported);
+  }
 #else
-  EXPECT_UNSUPPORTED(IsSupportedByKeySystem(
-      kExternalClearKey, kVideoMP4MimeType, video_mp4_hevc_codecs()));
-#endif
+  EXPECT_ECK_PROPRIETARY(hevc_supported);
+#endif  // BUILDFLAG(IS_WIN)
+#else
+  EXPECT_UNSUPPORTED(hevc_supported);
+#endif  // BUILDFLAG(ENABLE_HEVC_PARSER_AND_HW_DECODER)
+
   EXPECT_ECK_PROPRIETARY(IsSupportedByKeySystem(
       kExternalClearKey, kAudioMP4MimeType, audio_mp4_codecs()));
 }
@@ -940,19 +954,31 @@
   // Valid video types.
   EXPECT_ECK_PROPRIETARY(IsSupportedByKeySystem(
       kExternalClearKey, kVideoMP4MimeType, video_mp4_codecs()));
+
+  auto hevc_supported = IsSupportedByKeySystem(
+      kExternalClearKey, kVideoMP4MimeType, video_mp4_hevc_codecs());
+#if BUILDFLAG(ENABLE_HEVC_PARSER_AND_HW_DECODER)
+#if BUILDFLAG(IS_WIN)
   // On Windows platforms, HEVC support is detected through the GPU capabilities
   // which won't indicate support when running the tests.
-  // On macOS platforms, HEVC only support clear content.
   // TODO(crbug/1327470): Fix this so that we can inject HEVC support on
   // Windows.
-#if BUILDFLAG(ENABLE_HEVC_PARSER_AND_HW_DECODER) && !BUILDFLAG(IS_WIN) && \
-    !BUILDFLAG(IS_MAC)
-  EXPECT_ECK_PROPRIETARY(IsSupportedByKeySystem(
-      kExternalClearKey, kVideoMP4MimeType, video_mp4_hevc_codecs()));
+  EXPECT_UNSUPPORTED(hevc_supported);
+#elif BUILDFLAG(IS_MAC)
+  // On Mac platforms, HEVC support should be available if OS >= Big Sur 11.0
+  // and kPlatformHEVCDecoderSupport is enabled.
+  if (__builtin_available(macOS 11.0, *)) {
+    EXPECT_ECK_PROPRIETARY(hevc_supported);
+  } else {
+    EXPECT_UNSUPPORTED(hevc_supported);
+  }
 #else
-  EXPECT_UNSUPPORTED(IsSupportedByKeySystem(
-      kExternalClearKey, kVideoMP4MimeType, video_mp4_hevc_codecs()));
-#endif
+  EXPECT_ECK_PROPRIETARY(hevc_supported);
+#endif  // BUILDFLAG(IS_WIN)
+#else
+  EXPECT_UNSUPPORTED(hevc_supported);
+#endif  // BUILDFLAG(ENABLE_HEVC_PARSER_AND_HW_DECODER)
+
   EXPECT_ECK(IsSupportedByKeySystem(kExternalClearKey, kVideoMP4MimeType,
                                     vp9_profile0_codecs()));
   EXPECT_ECK(IsSupportedByKeySystem(kExternalClearKey, kVideoMP4MimeType,
diff --git a/chrome/browser/offline_pages/android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchConfiguration.java b/chrome/browser/offline_pages/android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchConfiguration.java
index 226897ca..fe2b1cd 100644
--- a/chrome/browser/offline_pages/android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchConfiguration.java
+++ b/chrome/browser/offline_pages/android/java/src/org/chromium/chrome/browser/offlinepages/prefetch/PrefetchConfiguration.java
@@ -6,7 +6,6 @@
 
 import org.chromium.base.annotations.JNINamespace;
 import org.chromium.base.annotations.NativeMethods;
-import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.profiles.ProfileKey;
 
@@ -25,16 +24,6 @@
     }
 
     /**
-     * Returns true if PrefetchBackgroundTask should load native in minimal browser mode.
-     *
-     * Can be called even when native is not loaded yet.
-     */
-    public static boolean isMinimalBrowserForBackgroundPrefetchEnabled() {
-        return CachedFeatureFlags.isEnabled(
-                ChromeFeatureList.SERVICE_MANAGER_FOR_BACKGROUND_PREFETCH);
-    }
-
-    /**
      * Returns true if Offline Prefetch is allowed to run, requiring both the feature flag and the
      * user setting to be true. If the current browser Profile is null this method returns false.
      */
diff --git a/chrome/browser/optimization_guide/optimization_guide_keyed_service.cc b/chrome/browser/optimization_guide/optimization_guide_keyed_service.cc
index 2170de3..e3f0c86 100644
--- a/chrome/browser/optimization_guide/optimization_guide_keyed_service.cc
+++ b/chrome/browser/optimization_guide/optimization_guide_keyed_service.cc
@@ -61,26 +61,11 @@
 
 namespace {
 
-const char kOldOptimizationGuideHintStore[] = "previews_hint_cache_store";
-
 const char kOldOptimizationGuidePredictionModelAndFeaturesStore[] =
     "optimization_guide_model_and_features_store";
 
 // Deletes old store paths that were written in incorrect locations.
 void DeleteOldStorePaths(const base::FilePath& profile_path) {
-  // Added 04/2021.
-
-  // Delete profile_path.<other path> as that was not actually in the profile
-  // dir.
-  base::ThreadPool::PostTask(
-      FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT},
-      base::GetDeletePathRecursivelyCallback(
-          profile_path.AddExtensionASCII(kOldOptimizationGuideHintStore)));
-  base::ThreadPool::PostTask(
-      FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT},
-      base::GetDeletePathRecursivelyCallback(profile_path.AddExtensionASCII(
-          kOldOptimizationGuidePredictionModelAndFeaturesStore)));
-
   // Added 05/2022.
 
   // Delete profile_path/optimization_guide_model_and_features_store/...
diff --git a/chrome/browser/password_manager/chrome_password_manager_client.cc b/chrome/browser/password_manager/chrome_password_manager_client.cc
index b1b1b47..7edd240 100644
--- a/chrome/browser/password_manager/chrome_password_manager_client.cc
+++ b/chrome/browser/password_manager/chrome_password_manager_client.cc
@@ -115,7 +115,7 @@
 #include "third_party/re2/src/re2/re2.h"
 #include "url/url_constants.h"
 
-#if BUILDFLAG(FULL_SAFE_BROWSING)
+#if BUILDFLAG(SAFE_BROWSING_AVAILABLE)
 #include "chrome/browser/safe_browsing/advanced_protection_status_manager.h"
 #include "chrome/browser/safe_browsing/advanced_protection_status_manager_factory.h"
 #include "third_party/blink/public/mojom/clipboard/clipboard.mojom.h"
@@ -1424,7 +1424,6 @@
 #endif
 }
 
-#if !BUILDFLAG(IS_ANDROID)
 void ChromePasswordManagerClient::OnPaste() {
   std::u16string text;
   bool used_crosapi_workaround = false;
@@ -1463,7 +1462,6 @@
   was_on_paste_called_ = true;
   password_reuse_detection_manager_.OnPaste(std::move(text));
 }
-#endif
 
 void ChromePasswordManagerClient::RenderFrameCreated(
     content::RenderFrameHost* render_frame_host) {
diff --git a/chrome/browser/password_manager/chrome_password_manager_client.h b/chrome/browser/password_manager/chrome_password_manager_client.h
index de869c13..5b158a1 100644
--- a/chrome/browser/password_manager/chrome_password_manager_client.h
+++ b/chrome/browser/password_manager/chrome_password_manager_client.h
@@ -330,10 +330,7 @@
   // content::WebContentsObserver overrides.
   void PrimaryPageChanged(content::Page& page) override;
   void WebContentsDestroyed() override;
-// TODO(crbug.com/1006430): Paste event is not captured on Android.
-#if !BUILDFLAG(IS_ANDROID)
   void OnPaste() override;
-#endif
   void RenderFrameCreated(content::RenderFrameHost* render_frame_host) override;
 
   // content::RenderWidgetHost::InputEventObserver overrides.
diff --git a/chrome/browser/pdf/pdf_extension_test.cc b/chrome/browser/pdf/pdf_extension_test.cc
index d3821e5..549c3ac 100644
--- a/chrome/browser/pdf/pdf_extension_test.cc
+++ b/chrome/browser/pdf/pdf_extension_test.cc
@@ -3901,7 +3901,6 @@
   constexpr int k1_7 = 8;
   histograms.ExpectUniqueSample("PDF.FormType", kAcroForm, 1);
   histograms.ExpectUniqueSample("PDF.Version", k1_7, 1);
-  histograms.ExpectUniqueSample("PDF.IsTagged", 0, 1);
   histograms.ExpectUniqueSample("PDF.HasAttachment", 0, 1);
 
   // Custom histograms.
diff --git a/chrome/browser/policy/cbcm_invalidations_initializer.cc b/chrome/browser/policy/cbcm_invalidations_initializer.cc
index 588dfa4..ac095704 100644
--- a/chrome/browser/policy/cbcm_invalidations_initializer.cc
+++ b/chrome/browser/policy/cbcm_invalidations_initializer.cc
@@ -126,7 +126,7 @@
   // the service account has to be initialized to the one in the policy.
   if (!DeviceOAuth2TokenServiceFactory::Get()->RefreshTokenIsAvailable() ||
       DeviceOAuth2TokenServiceFactory::Get()->GetRobotAccountId() !=
-          CoreAccountId::FromEmail(account_email)) {
+          CoreAccountId::FromRobotEmail(account_email)) {
     // Initialize the device service account and fetch auth codes to exchange
     // for a refresh token. Creating this object starts that process and the
     // callback will be called from it whether it succeeds or not.
diff --git a/chrome/browser/policy/cbcm_invalidations_initializer_unittest.cc b/chrome/browser/policy/cbcm_invalidations_initializer_unittest.cc
index bd739b2..1d55da5 100644
--- a/chrome/browser/policy/cbcm_invalidations_initializer_unittest.cc
+++ b/chrome/browser/policy/cbcm_invalidations_initializer_unittest.cc
@@ -27,9 +27,10 @@
 static const char kSecondRefreshToken[] = "second_refresh_token";
 static const char kFirstAccessToken[] = "first_access_token";
 static const char kSecondAccessToken[] = "second_access_token";
-static const char kServiceAccountEmail[] = "service_account@example.com";
+static const char kServiceAccountEmail[] =
+    "service_account@system.gserviceaccount.com";
 static const char kOtherServiceAccountEmail[] =
-    "other_service_account@example.com";
+    "other_service_account@system.gserviceaccount.com";
 static const char kDMToken[] = "dm_token";
 static const char kAuthCode[] = "auth_code";
 
@@ -213,7 +214,7 @@
   EXPECT_EQ(0, test_url_loader_factory()->NumPending());
   EXPECT_TRUE(
       DeviceOAuth2TokenServiceFactory::Get()->RefreshTokenIsAvailable());
-  EXPECT_EQ(CoreAccountId::FromEmail(kServiceAccountEmail),
+  EXPECT_EQ(CoreAccountId::FromRobotEmail(kServiceAccountEmail),
             DeviceOAuth2TokenServiceFactory::Get()->GetRobotAccountId());
   std::string first_refresh_token =
       testing_local_state()->GetString(kCBCMServiceAccountRefreshToken);
@@ -234,7 +235,7 @@
   // Now a different refresh token and email should be present. The token
   // themselves aren't validated because they're encrypted. Verifying that it
   // changed is sufficient.
-  EXPECT_EQ(CoreAccountId::FromEmail(kOtherServiceAccountEmail),
+  EXPECT_EQ(CoreAccountId::FromRobotEmail(kOtherServiceAccountEmail),
             DeviceOAuth2TokenServiceFactory::Get()->GetRobotAccountId());
   EXPECT_NE(first_refresh_token,
             testing_local_state()->GetString(kCBCMServiceAccountRefreshToken));
@@ -284,7 +285,7 @@
   // Now a different refresh token and email should be present. The token
   // themselves aren't validated because they're encrypted. Verifying that it
   // changed is sufficient.
-  EXPECT_EQ(CoreAccountId::FromEmail(kOtherServiceAccountEmail),
+  EXPECT_EQ(CoreAccountId::FromRobotEmail(kOtherServiceAccountEmail),
             DeviceOAuth2TokenServiceFactory::Get()->GetRobotAccountId());
   EXPECT_NE(first_refresh_token,
             testing_local_state()->GetString(kCBCMServiceAccountRefreshToken));
diff --git a/chrome/browser/policy/cloud/component_cloud_policy_browsertest.cc b/chrome/browser/policy/cloud/component_cloud_policy_browsertest.cc
index 765135a6..79971ac 100644
--- a/chrome/browser/policy/cloud/component_cloud_policy_browsertest.cc
+++ b/chrome/browser/policy/cloud/component_cloud_policy_browsertest.cc
@@ -146,9 +146,9 @@
         << "Pre-existing policies in this machine will make this test fail.";
 
     // Install the initial extension.
-    ExtensionTestMessageListener ready_listener("ready", false);
-    event_listener_ =
-        std::make_unique<ExtensionTestMessageListener>("event", true);
+    ExtensionTestMessageListener ready_listener("ready");
+    event_listener_ = std::make_unique<ExtensionTestMessageListener>(
+        "event", ReplyBehavior::kWillReply);
     extension_ = LoadExtension(kTestExtensionPath);
     ASSERT_TRUE(extension_.get());
     ASSERT_EQ(kTestExtension, extension_->id());
@@ -262,7 +262,7 @@
 #endif
 IN_PROC_BROWSER_TEST_F(ComponentCloudPolicyTest, MAYBE_FetchExtensionPolicy) {
   // Read the initial policy.
-  ExtensionTestMessageListener policy_listener(kTestPolicyJSON, false);
+  ExtensionTestMessageListener policy_listener(kTestPolicyJSON);
   event_listener_->Reply("get-policy-Name");
   EXPECT_TRUE(policy_listener.WaitUntilSatisfied());
 }
@@ -275,13 +275,14 @@
 #endif
 IN_PROC_BROWSER_TEST_F(ComponentCloudPolicyTest, MAYBE_UpdateExtensionPolicy) {
   // Read the initial policy.
-  ExtensionTestMessageListener policy_listener(kTestPolicyJSON, true);
+  ExtensionTestMessageListener policy_listener(kTestPolicyJSON,
+                                               ReplyBehavior::kWillReply);
   event_listener_->Reply("get-policy-Name");
   EXPECT_TRUE(policy_listener.WaitUntilSatisfied());
 
   // Update the policy at the server and reload policy.
-  event_listener_ =
-      std::make_unique<ExtensionTestMessageListener>("event", true);
+  event_listener_ = std::make_unique<ExtensionTestMessageListener>(
+      "event", ReplyBehavior::kWillReply);
   policy_listener.Reply("idle");
   test_server_.UpdateExternalPolicy(dm_protocol::kChromeExtensionPolicyType,
                                     kTestExtension, kTestPolicy2);
@@ -292,11 +293,12 @@
   EXPECT_TRUE(event_listener_->WaitUntilSatisfied());
 
   // This policy was removed.
-  ExtensionTestMessageListener policy_listener1("{}", true);
+  ExtensionTestMessageListener policy_listener1("{}",
+                                                ReplyBehavior::kWillReply);
   event_listener_->Reply("get-policy-Name");
   EXPECT_TRUE(policy_listener1.WaitUntilSatisfied());
 
-  ExtensionTestMessageListener policy_listener2(kTestPolicy2JSON, false);
+  ExtensionTestMessageListener policy_listener2(kTestPolicy2JSON);
   policy_listener1.Reply("get-policy-Another");
   EXPECT_TRUE(policy_listener2.WaitUntilSatisfied());
 }
@@ -319,7 +321,7 @@
   // the extension.
   RefreshPolicies();
 
-  ExtensionTestMessageListener result_listener("ok", false);
+  ExtensionTestMessageListener result_listener("ok");
   result_listener.set_failure_message("fail");
   scoped_refptr<const extensions::Extension> extension2 =
       LoadExtension(kTestExtension2Path);
@@ -343,7 +345,8 @@
 #if !BUILDFLAG(IS_CHROMEOS)
 IN_PROC_BROWSER_TEST_F(ComponentCloudPolicyTest, SignOutAndBackIn) {
   // Read the initial policy.
-  ExtensionTestMessageListener initial_policy_listener(kTestPolicyJSON, true);
+  ExtensionTestMessageListener initial_policy_listener(
+      kTestPolicyJSON, ReplyBehavior::kWillReply);
   event_listener_->Reply("get-policy-Name");
   EXPECT_TRUE(initial_policy_listener.WaitUntilSatisfied());
 
@@ -368,13 +371,14 @@
 
   // Now sign-out. The policy cache should be removed, and the extension should
   // get an empty policy update.
-  ExtensionTestMessageListener event_listener("event", true);
+  ExtensionTestMessageListener event_listener("event",
+                                              ReplyBehavior::kWillReply);
   initial_policy_listener.Reply("idle");
   SignOut();
   EXPECT_TRUE(event_listener.WaitUntilSatisfied());
 
   // The extension got an update event; verify that the policy was empty.
-  ExtensionTestMessageListener signout_policy_listener("{}", false);
+  ExtensionTestMessageListener signout_policy_listener("{}");
   event_listener.Reply("get-policy-Name");
   EXPECT_TRUE(signout_policy_listener.WaitUntilSatisfied());
 
@@ -387,13 +391,14 @@
   EXPECT_FALSE(base::PathExists(cache_path));
 
   // Verify that the policy is fetched again if the user signs back in.
-  ExtensionTestMessageListener event_listener2("event", true);
+  ExtensionTestMessageListener event_listener2("event",
+                                               ReplyBehavior::kWillReply);
 
   SignInAndRegister();
   EXPECT_TRUE(event_listener2.WaitUntilSatisfied());
 
   // The extension got updated policy; verify it.
-  ExtensionTestMessageListener signin_policy_listener(kTestPolicyJSON, false);
+  ExtensionTestMessageListener signin_policy_listener(kTestPolicyJSON);
   event_listener2.Reply("get-policy-Name");
   EXPECT_TRUE(signin_policy_listener.WaitUntilSatisfied());
 
@@ -432,7 +437,8 @@
 #endif
 IN_PROC_BROWSER_TEST_F(KeyRotationComponentCloudPolicyTest, MAYBE_Basic) {
   // Read the initial policy.
-  ExtensionTestMessageListener policy_listener(kTestPolicyJSON, true);
+  ExtensionTestMessageListener policy_listener(kTestPolicyJSON,
+                                               ReplyBehavior::kWillReply);
   event_listener_->Reply("get-policy-Name");
   EXPECT_TRUE(policy_listener.WaitUntilSatisfied());
   const int public_key_version =
@@ -441,8 +447,8 @@
 
   // Update the policy at the server and reload the policy, causing also the key
   // rotation to be performed by the policy test server.
-  event_listener_ =
-      std::make_unique<ExtensionTestMessageListener>("event", true);
+  event_listener_ = std::make_unique<ExtensionTestMessageListener>(
+      "event", ReplyBehavior::kWillReply);
   policy_listener.Reply("idle");
   test_server_.UpdateExternalPolicy(dm_protocol::kChromeExtensionPolicyType,
                                     kTestExtension, kTestPolicy2);
@@ -455,11 +461,12 @@
       GetFetchedPolicyPublicKeyVersion(kTestExtension);
   EXPECT_LT(public_key_version, new_public_key_version);
 
-  ExtensionTestMessageListener policy_listener1("{}", true);
+  ExtensionTestMessageListener policy_listener1("{}",
+                                                ReplyBehavior::kWillReply);
   event_listener_->Reply("get-policy-Name");
   EXPECT_TRUE(policy_listener1.WaitUntilSatisfied());
 
-  ExtensionTestMessageListener policy_listener2(kTestPolicy2JSON, false);
+  ExtensionTestMessageListener policy_listener2(kTestPolicy2JSON);
   policy_listener1.Reply("get-policy-Another");
   EXPECT_TRUE(policy_listener2.WaitUntilSatisfied());
 }
diff --git a/chrome/browser/predictors/loading_predictor_tab_helper_unittest.cc b/chrome/browser/predictors/loading_predictor_tab_helper_unittest.cc
index 1119217..b71423d9 100644
--- a/chrome/browser/predictors/loading_predictor_tab_helper_unittest.cc
+++ b/chrome/browser/predictors/loading_predictor_tab_helper_unittest.cc
@@ -888,6 +888,7 @@
       content::NavigationSimulator::CreateRendererInitiated(fenced_frame_url,
                                                             fenced_frame_root);
   navigation_simulator->Commit();
+  fenced_frame_root = navigation_simulator->GetFinalRenderFrameHost();
 
   EXPECT_EQ(0u, test_collector_->count_resource_loads_completed());
 
diff --git a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java
index 815c708..b6a43c4b 100644
--- a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java
+++ b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java
@@ -341,19 +341,6 @@
     public static final String FLAGS_CACHED_NETWORK_SERVICE_WARM_UP_ENABLED =
             "network_service_warm_up_enabled";
     /**
-     * Key for whether PrefetchBackgroundTask should load native in service manager only mode.
-     * Default value is false.
-     */
-    public static final String FLAGS_CACHED_SERVICE_MANAGER_FOR_BACKGROUND_PREFETCH =
-            "service_manager_for_background_prefetch";
-    /**
-     * Key for whether DownloadResumptionBackgroundTask should load native in service manager only
-     * mode.
-     * Default value is false.
-     */
-    public static final String FLAGS_CACHED_SERVICE_MANAGER_FOR_DOWNLOAD_RESUMPTION =
-            "service_manager_for_download_resumption";
-    /**
      * Whether or not the start surface is enabled.
      * Default value is false.
      */
diff --git a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/DeprecatedChromePreferenceKeys.java b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/DeprecatedChromePreferenceKeys.java
index 443a255..f2bba2c 100644
--- a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/DeprecatedChromePreferenceKeys.java
+++ b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/DeprecatedChromePreferenceKeys.java
@@ -123,6 +123,8 @@
                 "prefetch_notification_offline_counter",
                 "prefetch_notification_shown_time",
                 "prioritize_bootstrap_tasks",
+                "service_manager_for_background_prefetch",
+                "service_manager_for_download_resumption",
                 "signin_promo_impressions_count_bookmarks",
                 "signin_promo_impressions_count_settings",
                 "sole_integration_enabled",
diff --git a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/LegacyChromePreferenceKeys.java b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/LegacyChromePreferenceKeys.java
index 42b815d7..312c399 100644
--- a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/LegacyChromePreferenceKeys.java
+++ b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/LegacyChromePreferenceKeys.java
@@ -65,8 +65,6 @@
                 ChromePreferenceKeys.FLAGS_CACHED_GRID_TAB_SWITCHER_ENABLED,
                 ChromePreferenceKeys.FLAGS_CACHED_IMMERSIVE_UI_MODE_ENABLED,
                 ChromePreferenceKeys.FLAGS_CACHED_NETWORK_SERVICE_WARM_UP_ENABLED,
-                ChromePreferenceKeys.FLAGS_CACHED_SERVICE_MANAGER_FOR_BACKGROUND_PREFETCH,
-                ChromePreferenceKeys.FLAGS_CACHED_SERVICE_MANAGER_FOR_DOWNLOAD_RESUMPTION,
                 ChromePreferenceKeys.FLAGS_CACHED_START_SURFACE_ENABLED,
                 ChromePreferenceKeys.FLAGS_CACHED_SWAP_PIXEL_FORMAT_TO_FIX_CONVERT_FROM_TRANSLUCENT,
                 ChromePreferenceKeys.FLAGS_CACHED_TAB_GROUPS_ANDROID_ENABLED,
diff --git a/chrome/browser/prefetch/search_prefetch/search_prefetch_service.cc b/chrome/browser/prefetch/search_prefetch/search_prefetch_service.cc
index eb835d7..c56c03bc 100644
--- a/chrome/browser/prefetch/search_prefetch/search_prefetch_service.cc
+++ b/chrome/browser/prefetch/search_prefetch/search_prefetch_service.cc
@@ -34,6 +34,7 @@
 #include "components/search_engines/template_url_service.h"
 #include "content/public/browser/web_contents.h"
 #include "net/base/load_flags.h"
+#include "net/base/url_util.h"
 #include "services/network/public/cpp/resource_request.h"
 #include "url/origin.h"
 
@@ -408,13 +409,15 @@
 std::unique_ptr<SearchPrefetchURLLoader>
 SearchPrefetchService::TakePrefetchResponseFromDiskCache(
     const GURL& navigation_url) {
-  if (prefetch_cache_.find(navigation_url) == prefetch_cache_.end()) {
+  GURL navigation_url_without_ref(net::SimplifyUrlForRequest(navigation_url));
+  if (prefetch_cache_.find(navigation_url_without_ref) ==
+      prefetch_cache_.end()) {
     return nullptr;
   }
 
   return std::make_unique<CacheAliasSearchPrefetchURLLoader>(
       profile_, BaseSearchPrefetchRequest::NetworkAnnotationForPrefetch(),
-      prefetch_cache_[navigation_url].first, nullptr);
+      prefetch_cache_[navigation_url_without_ref].first, nullptr);
 }
 
 void SearchPrefetchService::ClearPrefetches() {
@@ -530,30 +533,36 @@
 }
 
 void SearchPrefetchService::ClearCacheEntry(const GURL& navigation_url) {
-  if (prefetch_cache_.find(navigation_url) == prefetch_cache_.end()) {
+  GURL navigation_url_without_ref(net::SimplifyUrlForRequest(navigation_url));
+  if (prefetch_cache_.find(navigation_url_without_ref) ==
+      prefetch_cache_.end()) {
     return;
   }
 
-  prefetch_cache_.erase(navigation_url);
+  prefetch_cache_.erase(navigation_url_without_ref);
   SaveToPrefs();
 }
 
 void SearchPrefetchService::UpdateServeTime(const GURL& navigation_url) {
-  if (prefetch_cache_.find(navigation_url) == prefetch_cache_.end())
+  GURL navigation_url_without_ref(net::SimplifyUrlForRequest(navigation_url));
+  if (prefetch_cache_.find(navigation_url_without_ref) == prefetch_cache_.end())
     return;
 
-  prefetch_cache_[navigation_url].second = base::Time::Now();
+  prefetch_cache_[navigation_url_without_ref].second = base::Time::Now();
   SaveToPrefs();
 }
 
 void SearchPrefetchService::AddCacheEntry(const GURL& navigation_url,
                                           const GURL& prefetch_url) {
-  if (navigation_url == prefetch_url) {
+  GURL navigation_url_without_ref(net::SimplifyUrlForRequest(navigation_url));
+  GURL prefetch_url_without_ref(net::SimplifyUrlForRequest(prefetch_url));
+  if (navigation_url_without_ref == prefetch_url_without_ref) {
     return;
   }
 
-  prefetch_cache_.emplace(navigation_url,
-                          std::make_pair(prefetch_url, base::Time::Now()));
+  prefetch_cache_.emplace(
+      navigation_url_without_ref,
+      std::make_pair(prefetch_url_without_ref, base::Time::Now()));
 
   if (prefetch_cache_.size() <= SearchPrefetchMaxCacheEntries()) {
     SaveToPrefs();
@@ -587,7 +596,7 @@
   }
 
   for (auto element : dictionary->DictItems()) {
-    GURL navigation_url(element.first);
+    GURL navigation_url(net::SimplifyUrlForRequest(GURL(element.first)));
     if (!navigation_url.is_valid())
       continue;
 
@@ -600,18 +609,20 @@
       continue;
     }
 
-    const std::string* prefetch_url = prefetch_url_and_time[0].GetIfString();
-    if (!prefetch_url)
+    const std::string* prefetch_url_string =
+        prefetch_url_and_time[0].GetIfString();
+    if (!prefetch_url_string)
       continue;
 
+    GURL prefetch_url(net::SimplifyUrlForRequest(GURL(*prefetch_url_string)));
     // Make sure we are only mapping same origin in case of corrupted prefs.
     if (url::Origin::Create(navigation_url) !=
-        url::Origin::Create(GURL(*prefetch_url))) {
+        url::Origin::Create(prefetch_url)) {
       continue;
     }
 
     // Don't redirect same URL.
-    if (navigation_url == *prefetch_url)
+    if (navigation_url == prefetch_url)
       continue;
 
     // Make sure the navigation URL is still a search URL.
@@ -635,9 +646,8 @@
       continue;
     }
 
-    prefetch_cache_.emplace(
-        navigation_url,
-        std::make_pair(GURL(*prefetch_url), last_update.value()));
+    prefetch_cache_.emplace(navigation_url,
+                            std::make_pair(prefetch_url, last_update.value()));
   }
   return dictionary->DictSize() > prefetch_cache_.size();
 }
diff --git a/chrome/browser/prefetch/search_prefetch/search_prefetch_service_browsertest.cc b/chrome/browser/prefetch/search_prefetch/search_prefetch_service_browsertest.cc
index 143f6ae..6d759ba9 100644
--- a/chrome/browser/prefetch/search_prefetch/search_prefetch_service_browsertest.cc
+++ b/chrome/browser/prefetch/search_prefetch/search_prefetch_service_browsertest.cc
@@ -898,6 +898,100 @@
 }
 
 IN_PROC_BROWSER_TEST_P(SearchPrefetchServiceEnabledBrowserTest,
+                       BackPrefetchServedRefParam) {
+  // This test prefetches and serves two SRP responses. It then navigates back
+  // then forward, the back navigation should not be cached, due to cache limit
+  // size of 1, the second navigation should be cached.
+
+  base::HistogramTester histogram_tester;
+  auto* search_prefetch_service =
+      SearchPrefetchServiceFactory::GetForProfile(browser()->profile());
+  EXPECT_NE(nullptr, search_prefetch_service);
+
+  // Disable back/forward cache to ensure that it doesn't get preserved in the
+  // back/forward cache.
+  content::DisableBackForwardCacheForTesting(
+      GetWebContents(), content::BackForwardCache::TEST_REQUIRES_NO_CACHING);
+
+  std::string search_terms = "prefetch_content";
+  auto [prefetch_url, search_url] =
+      GetSearchPrefetchAndNonPrefetch(search_terms);
+  EXPECT_TRUE(search_prefetch_service->MaybePrefetchURL(prefetch_url));
+  WaitUntilStatusChangesTo(base::ASCIIToUTF16(search_terms),
+                           SearchPrefetchStatus::kComplete);
+  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), search_url));
+
+  // Add a ref param onto the page before navigating away.
+  std::string script = R"(
+    const url = new URL(document.URL);
+    url.hash = "blah";
+    history.replaceState(null, "", url.toString());
+  )";
+
+  content::RenderFrameHost* frame = GetWebContents()->GetMainFrame();
+  EXPECT_TRUE(content::ExecuteScript(frame, script));
+
+  // The prefetch should be served, and only 1 request should be issued.
+  EXPECT_EQ(1u, search_server_requests().size());
+  auto inner_html = GetDocumentInnerHTML();
+  EXPECT_FALSE(base::Contains(inner_html, "regular"));
+  EXPECT_TRUE(base::Contains(inner_html, "prefetch"));
+  histogram_tester.ExpectTotalCount(
+      "Omnibox.SearchPrefetch.ClickToNavigationIntercepted", 1);
+  histogram_tester.ExpectTotalCount(
+      "Omnibox.SearchPrefetch.NavigationInterceptedToForwardingComplete", 1);
+
+  search_terms = "prefetch_content_2";
+  auto [prefetch_url_2, search_url_2] =
+      GetSearchPrefetchAndNonPrefetch(search_terms);
+  EXPECT_TRUE(search_prefetch_service->MaybePrefetchURL(prefetch_url_2));
+  WaitUntilStatusChangesTo(base::ASCIIToUTF16(search_terms),
+                           SearchPrefetchStatus::kComplete);
+  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), search_url_2));
+
+  // The prefetch should be served, and only 1 request (now the second total
+  // request) should be issued.
+  EXPECT_EQ(2u, search_server_requests().size());
+  inner_html = GetDocumentInnerHTML();
+  EXPECT_FALSE(base::Contains(inner_html, "regular"));
+  EXPECT_TRUE(base::Contains(inner_html, "prefetch"));
+  histogram_tester.ExpectTotalCount(
+      "Omnibox.SearchPrefetch.ClickToNavigationIntercepted", 2);
+  histogram_tester.ExpectTotalCount(
+      "Omnibox.SearchPrefetch.NavigationInterceptedToForwardingComplete", 2);
+
+  content::TestNavigationObserver back_load_observer(GetWebContents());
+  GetWebContents()->GetController().GoBack();
+  back_load_observer.Wait();
+
+  // There should not be a cached prefetch request, so there should be a network
+  // request.
+  EXPECT_EQ(3u, search_server_requests().size());
+  inner_html = GetDocumentInnerHTML();
+  EXPECT_TRUE(base::Contains(inner_html, "regular"));
+  EXPECT_FALSE(base::Contains(inner_html, "prefetch"));
+  histogram_tester.ExpectTotalCount(
+      "Omnibox.SearchPrefetch.ClickToNavigationIntercepted", 2);
+  histogram_tester.ExpectTotalCount(
+      "Omnibox.SearchPrefetch.NavigationInterceptedToForwardingComplete", 2);
+
+  content::TestNavigationObserver forward_load_observer(GetWebContents());
+  GetWebContents()->GetController().GoForward();
+  forward_load_observer.Wait();
+
+  // There should be a cached prefetch request, so there should not be a new
+  // network request.
+  EXPECT_EQ(3u, search_server_requests().size());
+  inner_html = GetDocumentInnerHTML();
+  EXPECT_FALSE(base::Contains(inner_html, "regular"));
+  EXPECT_TRUE(base::Contains(inner_html, "prefetch"));
+  histogram_tester.ExpectTotalCount(
+      "Omnibox.SearchPrefetch.ClickToNavigationIntercepted", 2);
+  histogram_tester.ExpectTotalCount(
+      "Omnibox.SearchPrefetch.NavigationInterceptedToForwardingComplete", 3);
+}
+
+IN_PROC_BROWSER_TEST_P(SearchPrefetchServiceEnabledBrowserTest,
                        BackPrefetchServedAfterPrefs) {
   // This test prefetches and serves two SRP responses. It then navigates back
   // then forward, the back navigation should not be cached, due to cache limit
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn b/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn
index 5cde8e71..791497d6 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn
@@ -45,7 +45,6 @@
   "background/output/output_role_info.js",
   "background/output/output_types.js",
   "background/phonetic_data.js",
-  "background/user_action_monitor.js",
   "common/abstract_earcons.js",
   "common/background_bridge.js",
   "common/braille/braille_interface.js",
@@ -126,6 +125,7 @@
   "background/range_automation_handler.js",
   "background/smart_sticky_mode.js",
   "background/tts_background.js",
+  "background/user_action_monitor.js",
   "common/abstract_tts.js",
   "common/braille/braille_command_data.js",
   "common/braille/braille_table.js",
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/chromevox_state.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/chromevox_state.js
index cb8272039..0b8eb1c 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/chromevox_state.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/chromevox_state.js
@@ -7,6 +7,7 @@
  *     ChromeVox state, to avoid direct dependencies on the Background
  *     object and to facilitate mocking for tests.
  */
+import {UserActionMonitor} from '/chromevox/background/user_action_monitor.js';
 
 /**
  * An interface implemented by objects to observe ChromeVox state changes.
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/command_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/command_handler.js
index 221a9c3..db2fbd3 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/command_handler.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/command_handler.js
@@ -71,27 +71,7 @@
 
     // Check for loss of focus which results in us invalidating our current
     // range. Note this call is synchronous.
-    chrome.automation.getFocus((focusedNode) => {
-      const cur = ChromeVoxState.instance.currentRange;
-      if (cur && !cur.isValid()) {
-        ChromeVoxState.instance.setCurrentRange(
-            cursors.Range.fromNode(focusedNode));
-      }
-
-      if (!focusedNode ||
-
-          // This case detects when TalkBack (in ARC++) is enabled (which also
-          // covers when the ARC++ window is active). Clear the ChromeVox range
-          // so keys get passed through for ChromeVox commands.
-          (ChromeVoxState.instance.talkBackEnabled &&
-
-           // This additional check is not strictly necessary, but we use it to
-           // ensure we are never inadvertently losing focus. ARC++ windows set
-           // "focus" on a root view.
-           focusedNode.role === RoleType.CLIENT)) {
-        ChromeVoxState.instance.setCurrentRange(null);
-      }
-    });
+    chrome.automation.getFocus(focus => this.checkForLossOfFocus_(focus));
 
     // These commands don't require a current range.
     switch (command) {
@@ -1522,6 +1502,34 @@
   }
 
   /**
+   * @param {AutomationNode} focusedNode
+   * @private
+   */
+  checkForLossOfFocus_(focusedNode) {
+    const cur = ChromeVoxState.instance.currentRange;
+    if (cur && !cur.isValid()) {
+      ChromeVoxState.instance.setCurrentRange(
+          cursors.Range.fromNode(focusedNode));
+    }
+
+    if (!focusedNode) {
+      ChromeVoxState.instance.setCurrentRange(null);
+      return;
+    }
+
+    // This case detects when TalkBack (in ARC++) is enabled (which also
+    // covers when the ARC++ window is active). Clear the ChromeVox range
+    // so keys get passed through for ChromeVox commands.
+    if (ChromeVoxState.instance.talkBackEnabled &&
+        // This additional check is not strictly necessary, but we use it to
+        // ensure we are never inadvertently losing focus. ARC++ windows set
+        // "focus" on a root view.
+        focusedNode.role === RoleType.CLIENT) {
+      ChromeVoxState.instance.setCurrentRange(null);
+    }
+  }
+
+  /**
    * Performs global initialization.
    */
   init() {
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/gesture_command_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/gesture_command_handler.js
index a0c49d6..bbd9d03 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/gesture_command_handler.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/gesture_command_handler.js
@@ -8,6 +8,7 @@
 import {ChromeVoxState} from '/chromevox/background/chromevox_state.js';
 import {GestureInterface} from '/chromevox/background/gesture_interface.js';
 import {PointerHandler} from '/chromevox/background/pointer_handler.js';
+import {UserActionMonitor} from '/chromevox/background/user_action_monitor.js';
 import {GestureCommandData, GestureGranularity} from '/chromevox/common/gesture_command_data.js';
 import {EventGenerator} from '/common/event_generator.js';
 
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/loader.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/loader.js
index ea09be2..ef5aa9f 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/loader.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/loader.js
@@ -32,6 +32,7 @@
 goog.require('Output');
 goog.require('OutputEventType');
 goog.require('PanelCommand');
+goog.require('PanelCommandType');
 goog.require('PanelNodeMenuData');
 goog.require('PanelTabMenuItemData');
 goog.require('PhoneticData');
@@ -42,7 +43,6 @@
 goog.require('TreeDumper');
 goog.require('TreePathRecoveryStrategy');
 goog.require('TtsInterface');
-goog.require('UserActionMonitor');
 goog.require('ValueSelectionSpan');
 goog.require('ValueSpan');
 
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/user_action_monitor.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/user_action_monitor.js
index 45697c7..292dbdb3 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/user_action_monitor.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/user_action_monitor.js
@@ -6,15 +6,6 @@
  * @fileoverview Monitors user actions.
  */
 
-goog.provide('UserActionMonitor');
-
-goog.require('CommandHandlerInterface');
-goog.require('KeyCode');
-goog.require('KeySequence');
-goog.require('Output');
-goog.require('PanelCommand');
-goog.require('PanelCommandType');
-
 /**
  * The types of actions we want to monitor.
  * @enum {string}
@@ -33,7 +24,7 @@
  * various handlers to intercept user actions before they are processed by the
  * rest of ChromeVox.
  */
-UserActionMonitor = class {
+export class UserActionMonitor {
   /**
    * @param {!Array<UserActionMonitor.ActionInfo>} actionInfos A queue of
    *     expected actions.
@@ -185,7 +176,7 @@
   static destroy() {
     UserActionMonitor.instance = null;
   }
-};
+}
 
 /**
  * The key sequence used to close ChromeVox.
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/user_action_monitor_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/user_action_monitor_test.js
index e8826bab..570ee09 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/user_action_monitor_test.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/user_action_monitor_test.js
@@ -19,6 +19,8 @@
         'ChromeVoxKbHandler', '/chromevox/common/keyboard_handler.js');
     await importModule(
         'ChromeVoxState', '/chromevox/background/chromevox_state.js');
+    await importModule(
+        'UserActionMonitor', '/chromevox/background/user_action_monitor.js');
   }
 
   /**
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/common/keyboard_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/common/keyboard_handler.js
index d94920d0..09ac90d 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/common/keyboard_handler.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/common/keyboard_handler.js
@@ -5,6 +5,7 @@
 /**
  * @fileoverview Handles user keyboard input events.
  */
+import {UserActionMonitor} from '/chromevox/background/user_action_monitor.js';
 import {KeyMap} from '/chromevox/common/key_map.js';
 import {KeyUtil} from '/chromevox/common/key_util.js';
 
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/learn_mode/kbexplorer_loader.js b/chrome/browser/resources/chromeos/accessibility/chromevox/learn_mode/kbexplorer_loader.js
index d698a997..cf47aeea 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/learn_mode/kbexplorer_loader.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/learn_mode/kbexplorer_loader.js
@@ -15,4 +15,3 @@
 goog.require('Msgs');
 goog.require('NavBraille');
 goog.require('Spannable');
-goog.require('UserActionMonitor');
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_loader.js b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_loader.js
index 0272ca6..ff4fc54 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_loader.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_loader.js
@@ -21,7 +21,6 @@
 goog.require('PanelCommand');
 goog.require('PanelNodeMenuData');
 goog.require('QueueMode');
-goog.require('UserActionMonitor');
 
 goog.require('constants');
 goog.require('cursors.Cursor');
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/tutorial_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/tutorial_test.js
index 527fb4ef..9320614a 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/tutorial_test.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/tutorial_test.js
@@ -15,6 +15,8 @@
     await super.setUpDeferred();
     await importModule(
         'ChromeVoxState', '/chromevox/background/chromevox_state.js');
+    await importModule(
+        'UserActionMonitor', '/chromevox/background/user_action_monitor.js');
   }
 
   assertActiveLessonIndex(expectedIndex) {
diff --git a/chrome/browser/resources/signin/profile_customization/profile_customization_app.html b/chrome/browser/resources/signin/profile_customization/profile_customization_app.html
index f84ee151..ba221fa 100644
--- a/chrome/browser/resources/signin/profile_customization/profile_customization_app.html
+++ b/chrome/browser/resources/signin/profile_customization/profile_customization_app.html
@@ -103,7 +103,19 @@
   cr-button {
     font-size: 12px;
     width: 111px;
+  }
 
+  .action-container.in-dialog-design {
+    padding: 0 24px 24px;
+  }
+
+  .in-dialog-design #doneButton {
+    width: 119px;
+  }
+
+  .in-dialog-design #skipButton {
+    margin-inline-end: 12px;
+    width: 76px;
   }
 </style>
 
@@ -133,11 +145,19 @@
     </cr-customize-themes>
   </div>
 
-  <div class="action-container">
+  <div
+    class$="[[getActionContainerClass_(profileCustomizationInDialogDesign_)]]">
     <cr-button id="doneButton" class="action-button"
         disabled="[[isDoneButtonDisabled_(profileName_)]]"
         on-click="onDoneCustomizationClicked_" autofocus>
       $i18n{profileCustomizationDoneLabel}
     </cr-button>
+    <template is="dom-if" if="[[profileCustomizationInDialogDesign_]]">
+      <!-- TODO: add action and i18n on Skip -->
+      <cr-button id="skipButton" class="cancel-button">
+        Skip
+      </cr-button>
+    </template>
   <div>
+
 </div>
diff --git a/chrome/browser/resources/signin/profile_customization/profile_customization_app.ts b/chrome/browser/resources/signin/profile_customization/profile_customization_app.ts
index f36b978..7f9b7143 100644
--- a/chrome/browser/resources/signin/profile_customization/profile_customization_app.ts
+++ b/chrome/browser/resources/signin/profile_customization/profile_customization_app.ts
@@ -110,6 +110,10 @@
     this.isManaged_ = profileInfo.isManaged;
     this.welcomeTitle_ = profileInfo.welcomeTitle;
   }
+
+  private getActionContainerClass_(inDialogDesign: boolean): string {
+    return 'action-container' + (inDialogDesign ? ' in-dialog-design' : '');
+  }
 }
 
 declare global {
diff --git a/chrome/browser/resources/usb_internals/BUILD.gn b/chrome/browser/resources/usb_internals/BUILD.gn
index 76fa0df..8737e0a7 100644
--- a/chrome/browser/resources/usb_internals/BUILD.gn
+++ b/chrome/browser/resources/usb_internals/BUILD.gn
@@ -72,7 +72,6 @@
     "//chrome/browser/ui/webui/usb_internals:mojo_bindings_webui_js",
     "//ui/webui/resources/js:assert.m",
     "//ui/webui/resources/js:cr.m",
-    "//ui/webui/resources/js/cr/ui:tabs",
   ]
 }
 
@@ -83,7 +82,6 @@
     "//ui/webui/resources/js:assert.m",
     "//ui/webui/resources/js:cr.m",
     "//ui/webui/resources/js:util.m",
-    "//ui/webui/resources/js/cr/ui:tabs",
     "//ui/webui/resources/js/cr/ui:tree",
   ]
 }
diff --git a/chrome/browser/resources/usb_internals/app.html b/chrome/browser/resources/usb_internals/app.html
index b663026..a26cfdaf 100644
--- a/chrome/browser/resources/usb_internals/app.html
+++ b/chrome/browser/resources/usb_internals/app.html
@@ -1,108 +1,103 @@
-<link rel="stylesheet" href="chrome://resources/css/tabs.css">
 <link rel="stylesheet" href="chrome://resources/css/tree.css">
 <link rel="stylesheet" href="usb_internals.css">
-<tabbox>
-  <tabs>
-    <tab>Test Devices</tab>
-    <tab>Devices</tab>
-  </tabs>
-  <tabpanels>
-    <tabpanel>
-      <!-- Test Devices -->
-      <h2>Test Devices</h2>
-      <p>
-        <table class="styled-table">
-          <thead>
-            <tr>
-              <th>Name</th>
-              <th>Serial number</th>
-              <th>Landing page</th>
-              <th>
-            </tr>
-          </thead>
-          <tbody id="test-device-list">
-          </tbody>
-
-          <template id="test-device-row">
-            <tr>
-              <td></td>
-              <td></td>
-              <td></td>
-              <td><button>Remove</button></td>
-            </tr>
-          </template>
-
-        </table>
-      </p>
-      <div class="page-section">
-        <strong>Add a test device:</strong>
-        <form id="add-test-device-form" action="">
-          <p>
-            <label>
-              Name: <input id="test-device-name" type="text" size="40">
-            </label>
-          </p>
-          <p>
-            <label>
-              Serial number:
-              <input id="test-device-serial" type="text" size="40">
-            </label>
-          </p>
-          <p>
-            <label>
-              Landing page:
-              <input id="test-device-landing-page" type="text" size="40">
-            </label>
-          </p>
-          <button type="submit">Add</button>
-          <span id="add-test-device-result"></span>
-        </form>
-      </div>
-    </tabpanel>
-
-    <tabpanel>
-      <!-- Devices -->
-      <h2>Devices</h2>
+<cr-tab-box sticky-tabs hidden>
+  <div slot="tab">Test Devices</div>
+  <div slot="tab">Devices</div>
+  <div slot="panel">
+    <!-- Test Devices -->
+    <h2>Test Devices</h2>
+    <p>
       <table class="styled-table">
         <thead>
           <tr>
-            <th>Bus Number</th>
-            <th>Port Number</th>
-            <th>Vendor Id</th>
-            <th>Product Id</th>
-            <th>Manufacturer Name</th>
-            <th>Product Name</th>
-            <th>Serial Number</th>
+            <th>Name</th>
+            <th>Serial number</th>
+            <th>Landing page</th>
             <th>
           </tr>
         </thead>
-        <tbody id="device-list"></tbody>
+        <tbody id="test-device-list">
+        </tbody>
 
-        <template id="device-row">
+        <template id="test-device-row">
           <tr>
             <td></td>
             <td></td>
             <td></td>
-            <td></td>
-            <td></td>
-            <td></td>
-            <td></td>
-            <td><button>Inspect</button></td>
+            <td><button>Remove</button></td>
           </tr>
         </template>
 
       </table>
-    </tabpanel>
-  </tabpanels>
-</tabbox>
+    </p>
+    <div class="page-section">
+      <strong>Add a test device:</strong>
+      <form id="add-test-device-form" action="">
+        <p>
+          <label>
+            Name: <input id="test-device-name" type="text" size="40">
+          </label>
+        </p>
+        <p>
+          <label>
+            Serial number:
+            <input id="test-device-serial" type="text" size="40">
+          </label>
+        </p>
+        <p>
+          <label>
+            Landing page:
+            <input id="test-device-landing-page" type="text" size="40">
+          </label>
+        </p>
+        <button type="submit">Add</button>
+        <span id="add-test-device-result"></span>
+      </form>
+    </div>
+  </div>
+
+  <div slot="panel">
+    <!-- Devices -->
+    <h2>Devices</h2>
+    <table class="styled-table">
+      <thead>
+        <tr>
+          <th>Bus Number</th>
+          <th>Port Number</th>
+          <th>Vendor Id</th>
+          <th>Product Id</th>
+          <th>Manufacturer Name</th>
+          <th>Product Name</th>
+          <th>Serial Number</th>
+          <th>
+        </tr>
+      </thead>
+      <tbody id="device-list"></tbody>
+
+      <template id="device-row">
+        <tr>
+          <td></td>
+          <td></td>
+          <td></td>
+          <td></td>
+          <td></td>
+          <td></td>
+          <td></td>
+          <td><button>Inspect</button></td>
+        </tr>
+      </template>
+
+    </table>
+  </div>
+</cr-tab-box>
 
 
 <template id="tab-template">
-  <tab></tab>
+  <div slot="tab"></div>
 </template>
 
 <template id="device-tabpanel-template">
-  <tabpanel>
+  <div slot="panel">
     <tree class="tree-view"></tree>
     <div class="descriptor-button">
       <button class="device-descriptor-button">Get Device Descriptor</button>
@@ -192,7 +187,7 @@
         <textarea cols="31"></textarea>
       </div>
     </div>
-  </tabpanel>
+  </div>
 </template>
 
 <template id="descriptor-panel-template">
diff --git a/chrome/browser/resources/usb_internals/app.js b/chrome/browser/resources/usb_internals/app.js
index 19e29d9..7ea72af6 100644
--- a/chrome/browser/resources/usb_internals/app.js
+++ b/chrome/browser/resources/usb_internals/app.js
@@ -6,9 +6,9 @@
  * Javascript for usb_internals.html, served from chrome://usb-internals/.
  */
 
+import 'chrome://resources/cr_elements/cr_tab_box/cr_tab_box.js';
+
 import {assert} from 'chrome://resources/js/assert.m.js';
-import {decorate} from 'chrome://resources/js/cr/ui.m.js';
-import {TabBox} from 'chrome://resources/js/cr/ui/tabs.js';
 import {getTrustedHTML} from 'chrome://resources/js/static_types.js';
 
 import {DevicesPage} from './devices_page.js';
@@ -69,7 +69,8 @@
     });
     this.refreshTestDeviceList();
 
-    decorate(assert(this.$('tabbox')), TabBox);
+    const tabbox = this.$('cr-tab-box');
+    tabbox.hidden = false;
   }
 
   async refreshTestDeviceList() {
diff --git a/chrome/browser/resources/usb_internals/devices_page.js b/chrome/browser/resources/usb_internals/devices_page.js
index ffe5b46..f6fe833 100644
--- a/chrome/browser/resources/usb_internals/devices_page.js
+++ b/chrome/browser/resources/usb_internals/devices_page.js
@@ -9,13 +9,11 @@
 
 import {assertInstanceof} from 'chrome://resources/js/assert.m.js';
 import {decorate} from 'chrome://resources/js/cr/ui.m.js';
-import {Tab, TabPanel} from 'chrome://resources/js/cr/ui/tabs.js';
 import {Tree, TreeItem} from 'chrome://resources/js/cr/ui/tree.js';
 import {queryRequiredElement} from 'chrome://resources/js/util.m.js';
 import {String16} from 'chrome://resources/mojo/mojo/public/mojom/base/string16.mojom-webui.js';
 
 import {DescriptorPanel, renderClassCodeWithDescription} from './descriptor_panel.js';
-
 import {UsbAlternateInterfaceInfo, UsbConfigurationInfo, UsbDeviceInfo, UsbDeviceRemote, UsbEndpointInfo, UsbInterfaceInfo, UsbTransferDirection, UsbTransferType} from './usb_device.mojom-webui.js';
 import {UsbDeviceManagerRemote} from './usb_manager.mojom-webui.js';
 
@@ -87,12 +85,16 @@
    * @private
    */
   switchToTab_(device) {
+    const tabs = Array.from(this.root.querySelectorAll('div[slot=\'tab\']'));
     const tabId = device.guid;
+    let index = tabs.findIndex(tab => tab.id === tabId);
 
-    if (null == this.root.getElementById(tabId)) {
+    if (index === -1) {
       const devicePage = new DevicePage(this.usbManager_, device, this.root);
+      index = tabs.length;
     }
-    this.root.getElementById(tabId).selected = true;
+    const tabBox = this.root.querySelector('cr-tab-box');
+    tabBox.setAttribute('selected-index', index);
   }
 }
 
@@ -118,13 +120,13 @@
    * @private
    */
   renderTab_(device) {
-    const tabs = queryRequiredElement('tabs', this.root);
+    const tabBox = this.root.querySelector('cr-tab-box');
 
     const tabTemplate = queryRequiredElement('#tab-template', this.root);
     /** @type {DocumentFragment|Node} */
     const tabClone = document.importNode(tabTemplate.content, true);
 
-    const tab = tabClone.querySelector('tab');
+    const tab = tabClone.querySelector('div[slot=\'tab\']');
     if (device.productName && device.productName.data.length > 0) {
       tab.textContent = decodeString16(device.productName);
     } else {
@@ -134,10 +136,9 @@
     }
     tab.id = device.guid;
 
-    tabs.appendChild(tabClone);
-    decorate(tab, Tab);
+    const firstPanel = tabBox.querySelector('div[slot=\'panel\']');
+    tabBox.insertBefore(tab, firstPanel);
 
-    const tabPanels = queryRequiredElement('tabpanels', this.root);
     const tabPanelTemplate =
         queryRequiredElement('#device-tabpanel-template', this.root);
     /** @type {DocumentFragment|Node} */
@@ -154,12 +155,11 @@
     treeViewRoot.innerText = '';
     renderDeviceTree(device, treeViewRoot);
 
-    const tabPanel =
-        assertInstanceof(tabPanelClone.querySelector('tabpanel'), HTMLElement);
+    const tabPanel = assertInstanceof(
+        tabPanelClone.querySelector('div[slot=\'panel\']'), HTMLElement);
     this.initializeDescriptorPanels_(tabPanel, device.guid);
 
-    tabPanels.appendChild(tabPanelClone);
-    decorate(tabPanel, TabPanel);
+    tabBox.appendChild(tabPanel);
   }
 
   /**
diff --git a/chrome/browser/resources/usb_internals/usb_internals.css b/chrome/browser/resources/usb_internals/usb_internals.css
index 8b640a3..1eeb8ea 100644
--- a/chrome/browser/resources/usb_internals/usb_internals.css
+++ b/chrome/browser/resources/usb_internals/usb_internals.css
@@ -3,11 +3,9 @@
  * found in the LICENSE file.
  */
 
-tabs {
-  position: sticky;
-  top: 0;
+cr-tab-box {
   /* selected treeItem is 2 */
-  z-index: 3;
+  --cr-tab-box-tabs-z-index: 3;
 }
 
 /* Devices Tab */
@@ -159,4 +157,4 @@
   color: red;
   display: block;
   font-size: 24px;
-}
\ No newline at end of file
+}
diff --git a/chrome/browser/safe_browsing/BUILD.gn b/chrome/browser/safe_browsing/BUILD.gn
index d9b50fe..ed8d055 100644
--- a/chrome/browser/safe_browsing/BUILD.gn
+++ b/chrome/browser/safe_browsing/BUILD.gn
@@ -136,6 +136,7 @@
       "services_delegate.h",
       "tailored_security/chrome_tailored_security_service.cc",
       "tailored_security/chrome_tailored_security_service.h",
+      "tailored_security/tailored_security_notification_result.h",
       "tailored_security/tailored_security_outcome.h",
       "tailored_security/tailored_security_service_factory.cc",
       "tailored_security/tailored_security_service_factory.h",
diff --git a/chrome/browser/safe_browsing/tailored_security/chrome_tailored_security_service.cc b/chrome/browser/safe_browsing/tailored_security/chrome_tailored_security_service.cc
index f308b0a7..4115d2b 100644
--- a/chrome/browser/safe_browsing/tailored_security/chrome_tailored_security_service.cc
+++ b/chrome/browser/safe_browsing/tailored_security/chrome_tailored_security_service.cc
@@ -7,6 +7,7 @@
 #include "base/metrics/histogram_functions.h"
 #include "build/build_config.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/safe_browsing/tailored_security/tailored_security_notification_result.h"
 #include "chrome/browser/signin/identity_manager_factory.h"
 #include "chrome/browser/ui/browser_finder.h"
 #include "components/prefs/pref_service.h"
@@ -46,6 +47,15 @@
 
 }  // namespace
 
+// Records an UMA Histogram value to count the result of trying to notify a sync
+// user about enhanced protection for the enable case.
+void RecordEnabledNotificationResult(
+    TailoredSecurityNotificationResult result) {
+  base::UmaHistogramEnumeration(
+      "SafeBrowsing.TailoredSecurity.SyncPromptEnabledNotificationResult",
+      result);
+}
+
 ChromeTailoredSecurityService::ChromeTailoredSecurityService(Profile* profile)
     : TailoredSecurityService(IdentityManagerFactory::GetForProfile(profile),
                               profile->GetPrefs()),
@@ -59,20 +69,36 @@
   if (!base::FeatureList::IsEnabled(kTailoredSecurityIntegration))
     return;
 
-  if (!identity_manager()->HasPrimaryAccount(signin::ConsentLevel::kSync))
+  if (!identity_manager()->HasPrimaryAccount(signin::ConsentLevel::kSync)) {
+    if (is_enabled) {
+      RecordEnabledNotificationResult(
+          TailoredSecurityNotificationResult::kAccountNotConsented);
+    }
     return;
+  }
 
   if (SafeBrowsingPolicyHandler::IsSafeBrowsingProtectionLevelSetByPolicy(
           profile_->GetPrefs())) {
+    if (is_enabled) {
+      RecordEnabledNotificationResult(
+          TailoredSecurityNotificationResult::kSafeBrowsingControlledByPolicy);
+    }
     return;
   }
 
   if (is_enabled) {
+    // TODO(crbug.com/1330723): Remove this metric. This case is being replaced
+    // by `kEnhancedProtectionAlreadyEnabled`.
     base::UmaHistogramBoolean(
         "SafeBrowsing.TailoredSecurity.SyncPromptSkippedAlreadyEnabled",
         IsEnhancedProtectionEnabled(*prefs()));
   }
 
+  if (is_enabled && IsEnhancedProtectionEnabled(*prefs())) {
+    RecordEnabledNotificationResult(
+        TailoredSecurityNotificationResult::kEnhancedProtectionAlreadyEnabled);
+  }
+
   if (is_enabled && !IsEnhancedProtectionEnabled(*prefs())) {
     ShowSyncNotification(true);
   }
@@ -87,8 +113,13 @@
 void ChromeTailoredSecurityService::ShowSyncNotification(bool is_enabled) {
 #if BUILDFLAG(IS_ANDROID)
   content::WebContents* web_contents = GetWebContentsForProfile(profile_);
-  if (!web_contents)
+  if (!web_contents) {
+    if (is_enabled) {
+      RecordEnabledNotificationResult(
+          TailoredSecurityNotificationResult::kNoWebContentsAvailable);
+    }
     return;
+  }
 
   // Since the Android UX is a notice, we simply set Safe Browsing state.
   SetSafeBrowsingState(profile_->GetPrefs(),
@@ -104,6 +135,9 @@
 #else
   DisplayTailoredSecurityConsentedModalDesktop(profile_, is_enabled);
 #endif
+  if (is_enabled) {
+    RecordEnabledNotificationResult(TailoredSecurityNotificationResult::kShown);
+  }
 }
 
 #if BUILDFLAG(IS_ANDROID)
diff --git a/chrome/browser/safe_browsing/tailored_security/tailored_security_notification_result.h b/chrome/browser/safe_browsing/tailored_security/tailored_security_notification_result.h
new file mode 100644
index 0000000..47f9599
--- /dev/null
+++ b/chrome/browser/safe_browsing/tailored_security/tailored_security_notification_result.h
@@ -0,0 +1,23 @@
+// Copyright 2022 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_SAFE_BROWSING_TAILORED_SECURITY_TAILORED_SECURITY_NOTIFICATION_RESULT_H_
+#define CHROME_BROWSER_SAFE_BROWSING_TAILORED_SECURITY_TAILORED_SECURITY_NOTIFICATION_RESULT_H_
+
+// This represents the result of trying to show a notification to the user when
+// the state of the account tailored security bit changes. These values are
+// persisted to logs. Entries should not be renumbered and numeric values should
+// never be reused.
+enum class TailoredSecurityNotificationResult {
+  kUnknownResult = 0,
+  kShown = 1,
+  // All other results are the reason for not being shown.
+  kAccountNotConsented = 2,
+  kEnhancedProtectionAlreadyEnabled = 3,
+  kNoWebContentsAvailable = 4,
+  kSafeBrowsingControlledByPolicy = 5,
+  kMaxValue = kSafeBrowsingControlledByPolicy,
+};
+
+#endif  // CHROME_BROWSER_SAFE_BROWSING_TAILORED_SECURITY_TAILORED_SECURITY_NOTIFICATION_RESULT_H_
diff --git a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/FREMobileIdentityConsistencyFieldTrial.java b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/FREMobileIdentityConsistencyFieldTrial.java
index 2e12747..c30efd2 100644
--- a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/FREMobileIdentityConsistencyFieldTrial.java
+++ b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/FREMobileIdentityConsistencyFieldTrial.java
@@ -34,12 +34,12 @@
  */
 public class FREMobileIdentityConsistencyFieldTrial {
     private static final Object LOCK = new Object();
-    private static final String ENABLED_GROUP = "Enabled3";
+    private static final String ENABLED_GROUP = "Enabled4";
     @VisibleForTesting
-    public static final String DISABLED_GROUP = "Disabled3";
+    public static final String DISABLED_GROUP = "Disabled4";
     private static final String DEFAULT_GROUP = "Default";
     @VisibleForTesting
-    public static final String OLD_FRE_WITH_UMA_DIALOG_GROUP = "OldFreWithUmaDialog3";
+    public static final String OLD_FRE_WITH_UMA_DIALOG_GROUP = "OldFreWithUmaDialog4";
 
     /**
      * The group variation values should be consecutive starting from zero. WELCOME_TO_CHROME acts
diff --git a/chrome/browser/site_isolation/site_details_browsertest.cc b/chrome/browser/site_isolation/site_details_browsertest.cc
index 16a43f7..6688543 100644
--- a/chrome/browser/site_isolation/site_details_browsertest.cc
+++ b/chrome/browser/site_isolation/site_details_browsertest.cc
@@ -875,6 +875,7 @@
       const FencedFrameSiteDetailsBrowserTest&) = delete;
 
   void SetUpOnMainThread() override {
+    host_resolver()->AddRule("*", "127.0.0.1");
     ASSERT_TRUE(embedded_test_server()->Start());
   }
 
@@ -892,12 +893,13 @@
 
 IN_PROC_BROWSER_TEST_F(FencedFrameSiteDetailsBrowserTest,
                        MemoryDetailsForFencedFrame) {
-  auto initial_url = embedded_test_server()->GetURL("/empty.html");
+  content::IsolateAllSitesForTesting(base::CommandLine::ForCurrentProcess());
+  auto initial_url = embedded_test_server()->GetURL("a.com", "/empty.html");
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), initial_url));
 
   // Load a fenced frame.
   GURL fenced_frame_url =
-      embedded_test_server()->GetURL("/fenced_frames/iframe.html");
+      embedded_test_server()->GetURL("b.com", "/fenced_frames/iframe.html");
   content::RenderFrameHost* fenced_frame_host =
       fenced_frame_test_helper().CreateFencedFrame(
           web_contents()->GetMainFrame(), fenced_frame_url);
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index 81fa8f8d..4b6e4714 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -1696,6 +1696,8 @@
       "webui/signin/signin_utils.h",
       "webui/support_tool/support_tool_ui.cc",
       "webui/support_tool/support_tool_ui.h",
+      "webui/support_tool/support_tool_ui_utils.cc",
+      "webui/support_tool/support_tool_ui_utils.h",
       "webui/sync_file_system_internals/dump_database_handler.cc",
       "webui/sync_file_system_internals/dump_database_handler.h",
       "webui/sync_file_system_internals/extension_statuses_handler.cc",
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/HomeButtonCoordinatorTest.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/HomeButtonCoordinatorTest.java
index 9a5fceb..9690e54 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/HomeButtonCoordinatorTest.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/HomeButtonCoordinatorTest.java
@@ -39,6 +39,7 @@
 import org.chromium.chrome.browser.user_education.IPHCommand;
 import org.chromium.chrome.browser.user_education.UserEducationHelper;
 import org.chromium.chrome.test.util.browser.Features;
+import org.chromium.chrome.test.util.browser.Features.DisableFeatures;
 import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
 import org.chromium.components.feature_engagement.FeatureConstants;
 import org.chromium.url.GURL;
@@ -50,6 +51,7 @@
 /** Unit tests for HomeButtonCoordinator. */
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(shadows = {HomeButtonCoordinatorTest.ShadowChromeFeatureList.class})
+@DisableFeatures(ChromeFeatureList.ANDROID_SCROLL_OPTIMIZATIONS)
 @EnableFeatures(ChromeFeatureList.ENABLE_IPH)
 public class HomeButtonCoordinatorTest {
     private static final GURL NTP_URL = JUnitTestGURLs.getGURL(JUnitTestGURLs.NTP_URL);
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToggleTabStackButtonCoordinatorTest.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToggleTabStackButtonCoordinatorTest.java
index d7c0c20..7c6fa24a 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToggleTabStackButtonCoordinatorTest.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToggleTabStackButtonCoordinatorTest.java
@@ -40,6 +40,7 @@
 import org.chromium.chrome.browser.user_education.IPHCommand;
 import org.chromium.chrome.browser.user_education.UserEducationHelper;
 import org.chromium.chrome.test.util.browser.Features;
+import org.chromium.chrome.test.util.browser.Features.DisableFeatures;
 import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
 import org.chromium.components.feature_engagement.FeatureConstants;
 
@@ -54,6 +55,7 @@
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(shadows = {ToggleTabStackButtonCoordinatorTest.ShadowChromeFeatureList.class})
 @LooperMode(LooperMode.Mode.LEGACY)
+@DisableFeatures(ChromeFeatureList.ANDROID_SCROLL_OPTIMIZATIONS)
 @EnableFeatures(ChromeFeatureList.ENABLE_IPH)
 public class ToggleTabStackButtonCoordinatorTest {
     private static final ToolbarIntentMetadata DEFAULT_INTENT_METADATA =
diff --git a/chrome/browser/ui/ash/clipboard_history_browsertest.cc b/chrome/browser/ui/ash/clipboard_history_browsertest.cc
index 1f8f8e47..21418b4 100644
--- a/chrome/browser/ui/ash/clipboard_history_browsertest.cc
+++ b/chrome/browser/ui/ash/clipboard_history_browsertest.cc
@@ -45,6 +45,7 @@
 #include "content/public/test/browser_test.h"
 #include "content/public/test/browser_test_utils.h"
 #include "net/dns/mock_host_resolver.h"
+#include "ui/base/clipboard/clipboard_data.h"
 #include "ui/base/clipboard/clipboard_monitor.h"
 #include "ui/base/clipboard/clipboard_non_backed.h"
 #include "ui/base/clipboard/scoped_clipboard_writer.h"
@@ -241,6 +242,20 @@
   return true;
 }
 
+// Returns whether the clipboard buffer matches clipboard history's first item.
+// If clipboard history is empty, returns whether the clipboard buffer is empty.
+bool VerifyClipboardBufferAndHistoryInSync() {
+  auto* clipboard = ui::ClipboardNonBacked::GetForCurrentThread();
+  if (!clipboard)
+    return false;
+
+  ui::DataTransferEndpoint data_dst(ui::EndpointType::kClipboardHistory);
+  const auto* const clipboard_data = clipboard->GetClipboardData(&data_dst);
+  const auto& items = GetClipboardItems();
+  return items.empty() ? clipboard_data == nullptr
+                       : items.front().data() == *clipboard_data;
+}
+
 }  // namespace
 
 class ClipboardHistoryBrowserTest : public ash::LoginManagerTest {
@@ -625,13 +640,21 @@
   ASSERT_EQ(2, GetContextMenu()->GetMenuItemsCount());
 
   // Delete the second menu item.
-  ClickAtDeleteButton(/*index=*/1);
+  {
+    ScopedClipboardHistoryListUpdateWaiter scoped_waiter;
+    ClickAtDeleteButton(/*index=*/1);
+  }
   EXPECT_EQ(1, GetContextMenu()->GetMenuItemsCount());
   EXPECT_TRUE(VerifyClipboardTextData({"B"}));
+  EXPECT_TRUE(VerifyClipboardBufferAndHistoryInSync());
 
   // Delete the last menu item. Verify that the menu is closed.
-  ClickAtDeleteButton(/*index=*/0);
+  {
+    ScopedClipboardHistoryListUpdateWaiter scoped_waiter;
+    ClickAtDeleteButton(/*index=*/0);
+  }
   EXPECT_FALSE(GetClipboardHistoryController()->IsMenuShowing());
+  EXPECT_TRUE(VerifyClipboardBufferAndHistoryInSync());
 
   // No menu shows because of the empty clipboard history.
   ShowContextMenuViaAccelerator(/*wait_for_selection=*/false);
@@ -654,23 +677,35 @@
 
   // Select the first menu item via key then delete it. Verify the menu and the
   // clipboard history.
-  PressAndRelease(ui::KeyboardCode::VKEY_BACK);
+  {
+    ScopedClipboardHistoryListUpdateWaiter scoped_waiter;
+    PressAndRelease(ui::KeyboardCode::VKEY_BACK);
+  }
   EXPECT_EQ(2, GetContextMenu()->GetMenuItemsCount());
   EXPECT_TRUE(VerifyClipboardTextData({"B", "A"}));
+  EXPECT_TRUE(VerifyClipboardBufferAndHistoryInSync());
 
   histogram_tester.ExpectTotalCount(
       "Ash.ClipboardHistory.ContextMenu.DisplayFormatDeleted", 1);
 
   // Select the second menu item via key then delete it. Verify the menu and the
   // clipboard history.
-  PressAndRelease(ui::KeyboardCode::VKEY_DOWN, ui::EF_NONE);
-  PressAndRelease(ui::KeyboardCode::VKEY_BACK, ui::EF_NONE);
+  {
+    ScopedClipboardHistoryListUpdateWaiter scoped_waiter;
+    PressAndRelease(ui::KeyboardCode::VKEY_DOWN, ui::EF_NONE);
+    PressAndRelease(ui::KeyboardCode::VKEY_BACK, ui::EF_NONE);
+  }
   EXPECT_EQ(1, GetContextMenu()->GetMenuItemsCount());
   EXPECT_TRUE(VerifyClipboardTextData({"B"}));
+  EXPECT_TRUE(VerifyClipboardBufferAndHistoryInSync());
 
   // Delete the last item. Verify that the menu is closed.
-  PressAndRelease(ui::KeyboardCode::VKEY_BACK, ui::EF_NONE);
+  {
+    ScopedClipboardHistoryListUpdateWaiter scoped_waiter;
+    PressAndRelease(ui::KeyboardCode::VKEY_BACK, ui::EF_NONE);
+  }
   EXPECT_FALSE(GetClipboardHistoryController()->IsMenuShowing());
+  EXPECT_TRUE(VerifyClipboardBufferAndHistoryInSync());
 
   // Trigger the accelerator of opening the clipboard history menu. No menu
   // shows because of the empty history data.
diff --git a/chrome/browser/ui/ash/system_tray_client_impl.cc b/chrome/browser/ui/ash/system_tray_client_impl.cc
index 41683ac..284dcc20 100644
--- a/chrome/browser/ui/ash/system_tray_client_impl.cc
+++ b/chrome/browser/ui/ash/system_tray_client_impl.cc
@@ -42,6 +42,7 @@
 #include "chrome/browser/lifetime/application_lifetime.h"
 #include "chrome/browser/lifetime/termination_notification.h"
 #include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/browser/ui/browser_navigator_params.h"
 #include "chrome/browser/ui/chrome_pages.h"
 #include "chrome/browser/ui/managed_ui.h"
 #include "chrome/browser/ui/scoped_tabbed_browser_displayer.h"
@@ -173,15 +174,21 @@
 }
 
 void OpenInBrowser(const GURL& event_url) {
-  ash::NewWindowDelegate* primary_delegate =
-      ash::NewWindowDelegate::GetPrimary();
-  if (!primary_delegate) {
-    LOG(ERROR) << __FUNCTION__ << " failed to get primary window delegate";
+  if (crosapi::browser_util::IsLacrosPrimaryBrowser()) {
+    auto* browser_manager = crosapi::BrowserManager::Get();
+    browser_manager->SwitchToTab(
+        event_url,
+        /*path_behavior=*/NavigateParams::IGNORE_AND_NAVIGATE);
     return;
   }
 
-  primary_delegate->OpenUrl(event_url,
-                            ash::NewWindowDelegate::OpenUrlFrom::kUnspecified);
+  // Lacros is not the primary browser, so use this workaround.
+  chrome::ScopedTabbedBrowserDisplayer displayer(
+      ProfileManager::GetActiveUserProfile());
+  NavigateParams params(
+      GetSingletonTabNavigateParams(displayer.browser(), event_url));
+  params.path_behavior = NavigateParams::IGNORE_AND_NAVIGATE;
+  ShowSingletonTabOverwritingNTP(displayer.browser(), &params);
 }
 
 ash::ManagementDeviceMode GetManagementDeviceMode(
@@ -510,7 +517,8 @@
 void SystemTrayClientImpl::ShowPaletteHelp() {
   if (crosapi::browser_util::IsLacrosPrimaryBrowser()) {
     crosapi::BrowserManager::Get()->SwitchToTab(
-        GURL(chrome::kChromePaletteHelpURL));
+        GURL(chrome::kChromePaletteHelpURL),
+        /*path_behavior=*/NavigateParams::RESPECT);
     return;
   }
 
@@ -536,7 +544,8 @@
   // Otherwise show enterprise management info page.
   if (crosapi::browser_util::IsLacrosPrimaryBrowser()) {
     crosapi::BrowserManager::Get()->SwitchToTab(
-        GURL(chrome::kChromeUIManagementURL));
+        GURL(chrome::kChromeUIManagementURL),
+        /*path_behavior=*/NavigateParams::RESPECT);
     return;
   }
 
diff --git a/chrome/browser/ui/hats/hats_helper_unittest.cc b/chrome/browser/ui/hats/hats_helper_unittest.cc
index 792e0735..743fe45 100644
--- a/chrome/browser/ui/hats/hats_helper_unittest.cc
+++ b/chrome/browser/ui/hats/hats_helper_unittest.cc
@@ -108,5 +108,6 @@
       content::NavigationSimulator::CreateRendererInitiated(fenced_frame_url,
                                                             fenced_frame_rfh);
   navigation_simulator->Commit();
+  fenced_frame_rfh = navigation_simulator->GetFinalRenderFrameHost();
   EXPECT_TRUE(fenced_frame_rfh->IsFencedFrameRoot());
 }
diff --git a/chrome/browser/ui/views/frame/tab_strip_region_view.cc b/chrome/browser/ui/views/frame/tab_strip_region_view.cc
index ecbcbe03..b2b94b9 100644
--- a/chrome/browser/ui/views/frame/tab_strip_region_view.cc
+++ b/chrome/browser/ui/views/frame/tab_strip_region_view.cc
@@ -35,6 +35,7 @@
 #include "ui/views/style/typography.h"
 #include "ui/views/view.h"
 #include "ui/views/view_class_properties.h"
+#include "ui/views/view_utils.h"
 
 namespace {
 
@@ -163,13 +164,26 @@
 
   // Perform a hit test against the |tab_strip_container_| to ensure that the
   // rect is within the visible portion of the |tab_strip_| before calling the
-  // tab strip's |IsRectInWindowCaption()|.
+  // tab strip's |IsRectInWindowCaption()| for scrolling disabled. Defer to
+  // scroll container if scrolling is enabled.
   // TODO(tluk): Address edge case where |rect| might partially intersect with
   // the |tab_strip_container_| and the |tab_strip_| but not over the same
   // pixels. This could lead to this returning false when it should be returning
   // true.
-  if (tab_strip_container_->HitTestRect(get_target_rect(tab_strip_container_)))
-    return tab_strip_->IsRectInWindowCaption(get_target_rect(tab_strip_));
+
+  if (tab_strip_container_->HitTestRect(
+          get_target_rect(tab_strip_container_))) {
+    if (base::FeatureList::IsEnabled(features::kScrollableTabStrip)) {
+      TabStripScrollContainer* scroll_container =
+          views::AsViewClass<TabStripScrollContainer>(tab_strip_container_);
+
+      return scroll_container->IsRectInWindowCaption(
+          get_target_rect(scroll_container));
+
+    } else {
+      return tab_strip_->IsRectInWindowCaption(get_target_rect(tab_strip_));
+    }
+  }
 
   // The child could have a non-rectangular shape, so if the rect is not in the
   // visual portions of the child view we treat it as a click to the caption.
diff --git a/chrome/browser/ui/views/frame/tab_strip_region_view.h b/chrome/browser/ui/views/frame/tab_strip_region_view.h
index a788e6e..57d2075e 100644
--- a/chrome/browser/ui/views/frame/tab_strip_region_view.h
+++ b/chrome/browser/ui/views/frame/tab_strip_region_view.h
@@ -70,6 +70,9 @@
   views::View* GetDefaultFocusableChild() override;
 
   views::FlexLayout* layout_manager_for_testing() { return layout_manager_; }
+  raw_ptr<views::View> GetTabStripContainerForTesting() {
+    return tab_strip_container_;
+  }
 
  private:
   // Updates the border padding for |new_tab_button_|.  This should be called
diff --git a/chrome/browser/ui/views/frame/tab_strip_region_view_unittest.cc b/chrome/browser/ui/views/frame/tab_strip_region_view_unittest.cc
index 226b6dbd..338d527 100644
--- a/chrome/browser/ui/views/frame/tab_strip_region_view_unittest.cc
+++ b/chrome/browser/ui/views/frame/tab_strip_region_view_unittest.cc
@@ -16,12 +16,14 @@
 #include "chrome/browser/ui/views/tabs/new_tab_button.h"
 #include "chrome/browser/ui/views/tabs/tab.h"
 #include "chrome/browser/ui/views/tabs/tab_strip.h"
+#include "chrome/browser/ui/views/tabs/tab_strip_scroll_container.h"
 #include "chrome/browser/ui/views/tabs/tab_style_views.h"
 #include "chrome/test/views/chrome_views_test_base.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/gfx/animation/animation_test_api.h"
 #include "ui/views/layout/flex_layout.h"
 #include "ui/views/view.h"
+#include "ui/views/view_utils.h"
 #include "ui/views/widget/widget.h"
 
 // TabStripRegionViewTestBase contains no test cases.
@@ -265,6 +267,55 @@
       tab_strip_->tab_at(tab_strip_->GetModelCount() - 1)->GetVisible());
 }
 
+TEST_F(TabStripRegionViewTestWithScrollingEnabled,
+       TabStripScrollButtonsNotInWindowCaption) {
+  const int minimum_active_width = TabStyleViews::GetMinimumInactiveWidth();
+  controller_->AddTab(0, true);
+  CompleteAnimationAndLayout();
+
+  // Add tabs to the tabstrip until it is full and should start overflowing.
+  while (GetInactiveTabWidth() > minimum_active_width) {
+    controller_->AddTab(0, false);
+    CompleteAnimationAndLayout();
+  }
+
+  // Add a few more tabs after the tabstrip is full to ensure the tabstrip
+  // starts scrolling. This needs to expand the tabstrip width by a decent
+  // amount in order to get the tabstrip to be wider than the entire tabstrip
+  // region, not just the portion of that that's allocated to the tabstrip
+  // itself (e.g. some of that space is for the NTB).
+  for (int i = 0; i < 10; i++) {
+    controller_->AddTab(0, false);
+    CompleteAnimationAndLayout();
+  }
+
+  raw_ptr<TabStripScrollContainer> scroll_container =
+      views::AsViewClass<TabStripScrollContainer>(
+          tab_strip_region_view_->GetTabStripContainerForTesting());
+  raw_ptr<views::ImageButton> leading_scroll_button_ =
+      scroll_container->GetLeadingScrollButtonForTesting();
+  raw_ptr<views::ImageButton> trailing_scroll_button_ =
+      scroll_container->GetTrailingScrollButtonForTesting();
+
+  // Check to see if children are visible
+  EXPECT_TRUE(leading_scroll_button_ != nullptr &&
+              leading_scroll_button_->IsDrawn());
+  EXPECT_TRUE(trailing_scroll_button_ != nullptr &&
+              trailing_scroll_button_->IsDrawn());
+
+  gfx::Point scrolling_button_point =
+      leading_scroll_button_->bounds().CenterPoint();
+  gfx::Rect scrolling_button_rect =
+      gfx::Rect(scrolling_button_point, gfx::Size(1, 1));
+  gfx::RectF floating_rect_in_target_coords_f(scrolling_button_rect);
+  views::View::ConvertRectToTarget(leading_scroll_button_,
+                                   tab_strip_region_view_,
+                                   &floating_rect_in_target_coords_f);
+
+  EXPECT_FALSE(tab_strip_region_view_->IsRectInWindowCaption(
+      gfx::ToEnclosingRect(floating_rect_in_target_coords_f)));
+}
+
 INSTANTIATE_TEST_SUITE_P(All,
                          TabStripRegionViewTest,
                          ::testing::Values(true, false));
diff --git a/chrome/browser/ui/views/side_search/side_search_browser_controller_interactive_uitest.cc b/chrome/browser/ui/views/side_search/side_search_browser_controller_interactive_uitest.cc
index af3088c..111c66b 100644
--- a/chrome/browser/ui/views/side_search/side_search_browser_controller_interactive_uitest.cc
+++ b/chrome/browser/ui/views/side_search/side_search_browser_controller_interactive_uitest.cc
@@ -1206,8 +1206,8 @@
   NavigateInSideContents(third_url, third_url);
 }
 
-#if BUILDFLAG(IS_MAC)
-// TODO(crbug.com/1305891): Test is flaky on Mac bots.
+#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
+// TODO(crbug.com/1305891): Test is flaky on Mac and Windows bots.
 #define MAYBE_DeclarativeNetRequestInterceptsSidePanelNavigations \
   DISABLED_DeclarativeNetRequestInterceptsSidePanelNavigations
 #else
diff --git a/chrome/browser/ui/views/tabs/tab_strip_scroll_container.cc b/chrome/browser/ui/views/tabs/tab_strip_scroll_container.cc
index 328e48a..02941b1 100644
--- a/chrome/browser/ui/views/tabs/tab_strip_scroll_container.cc
+++ b/chrome/browser/ui/views/tabs/tab_strip_scroll_container.cc
@@ -256,6 +256,33 @@
   right_overflow_indicator_->SchedulePaint();
 }
 
+bool TabStripScrollContainer::IsRectInWindowCaption(const gfx::Rect& rect) {
+  const auto get_target_rect = [&](views::View* target) {
+    gfx::RectF rect_in_target_coords_f(rect);
+    View::ConvertRectToTarget(this, target, &rect_in_target_coords_f);
+    return gfx::ToEnclosingRect(rect_in_target_coords_f);
+  };
+
+  if (leading_scroll_button_->GetLocalBounds().Intersects(
+          get_target_rect(leading_scroll_button_))) {
+    return !leading_scroll_button_->HitTestRect(
+        get_target_rect(leading_scroll_button_));
+  }
+
+  if (trailing_scroll_button_->GetLocalBounds().Intersects(
+          get_target_rect(trailing_scroll_button_))) {
+    return !trailing_scroll_button_->HitTestRect(
+        get_target_rect(trailing_scroll_button_));
+  }
+
+  if (scroll_view_->GetLocalBounds().Intersects(
+          get_target_rect(scroll_view_))) {
+    return tab_strip_->IsRectInWindowCaption(get_target_rect(tab_strip_));
+  }
+
+  return true;
+}
+
 void TabStripScrollContainer::OnThemeChanged() {
   View::OnThemeChanged();
   FrameColorsChanged();
diff --git a/chrome/browser/ui/views/tabs/tab_strip_scroll_container.h b/chrome/browser/ui/views/tabs/tab_strip_scroll_container.h
index 979dd3c3..7f805c2b0 100644
--- a/chrome/browser/ui/views/tabs/tab_strip_scroll_container.h
+++ b/chrome/browser/ui/views/tabs/tab_strip_scroll_container.h
@@ -31,6 +31,16 @@
   // views::ViewObserver:
   void OnViewPreferredSizeChanged(View* view) override;
 
+  bool IsRectInWindowCaption(const gfx::Rect& rect);
+
+  raw_ptr<views::ImageButton> GetLeadingScrollButtonForTesting() {
+    return leading_scroll_button_;
+  }
+
+  raw_ptr<views::ImageButton> GetTrailingScrollButtonForTesting() {
+    return trailing_scroll_button_;
+  }
+
  private:
   int GetTabStripAvailableWidth() const;
 
diff --git a/chrome/browser/ui/webui/about_ui.cc b/chrome/browser/ui/webui/about_ui.cc
index 452b124..8ba2d1b 100644
--- a/chrome/browser/ui/webui/about_ui.cc
+++ b/chrome/browser/ui/webui/about_ui.cc
@@ -786,7 +786,9 @@
 #else
   // Note: This will only be called by the UI when Lacros is available.
   DCHECK(crosapi::BrowserManager::Get());
-  crosapi::BrowserManager::Get()->SwitchToTab(GURL(chrome::kChromeUIAboutURL));
+  crosapi::BrowserManager::Get()->SwitchToTab(
+      GURL(chrome::kChromeUIAboutURL),
+      /*path_behavior=*/NavigateParams::RESPECT);
 #endif
   return true;
 }
diff --git a/chrome/browser/ui/webui/components/components_handler.cc b/chrome/browser/ui/webui/components/components_handler.cc
index 36eb101..36086851 100644
--- a/chrome/browser/ui/webui/components/components_handler.cc
+++ b/chrome/browser/ui/webui/components/components_handler.cc
@@ -182,7 +182,8 @@
   // Note: This will only be called by the UI when Lacros is available.
   DCHECK(crosapi::BrowserManager::Get());
   crosapi::BrowserManager::Get()->SwitchToTab(
-      GURL(chrome::kChromeUIComponentsUrl));
+      GURL(chrome::kChromeUIComponentsUrl),
+      /*path_behavior=*/NavigateParams::RESPECT);
 #endif
 }
 #endif  // BUILDFLAG(IS_CHROMEOS)
diff --git a/chrome/browser/ui/webui/profile_helper_browsertest.cc b/chrome/browser/ui/webui/profile_helper_browsertest.cc
index 1321a1bd..4c36b94 100644
--- a/chrome/browser/ui/webui/profile_helper_browsertest.cc
+++ b/chrome/browser/ui/webui/profile_helper_browsertest.cc
@@ -192,8 +192,7 @@
 }
 #endif  // !BUILDFLAG(IS_CHROMEOS_LACROS)
 
-// This test is flaky. See https://crbug.com/1307249
-IN_PROC_BROWSER_TEST_F(ProfileHelperTest, DISABLED_DeleteActiveProfile) {
+IN_PROC_BROWSER_TEST_F(ProfileHelperTest, DeleteActiveProfile) {
   content::TestWebUI web_ui;
   Browser* original_browser = browser();
   ProfileAttributesStorage& storage =
diff --git a/chrome/browser/ui/webui/signin/enterprise_profile_welcome_handler_unittest.cc b/chrome/browser/ui/webui/signin/enterprise_profile_welcome_handler_unittest.cc
index 206480e..c9fb3cde 100644
--- a/chrome/browser/ui/webui/signin/enterprise_profile_welcome_handler_unittest.cc
+++ b/chrome/browser/ui/webui/signin/enterprise_profile_welcome_handler_unittest.cc
@@ -42,7 +42,8 @@
         browser()->tab_strip_model()->GetActiveWebContents());
 
     account_info_.email = user_manager::kStubUserEmail;
-    account_info_.account_id = CoreAccountId::FromEmail(account_info_.email);
+    account_info_.gaia = user_manager::kStubUserId;
+    account_info_.account_id = CoreAccountId::FromGaiaId(account_info_.gaia);
   }
 
   void InitializeHandler(EnterpriseProfileWelcomeUI::ScreenType screen_type,
diff --git a/chrome/browser/ui/webui/support_tool/support_tool_ui.cc b/chrome/browser/ui/webui/support_tool/support_tool_ui.cc
index 8d2ddc6..255a476c9 100644
--- a/chrome/browser/ui/webui/support_tool/support_tool_ui.cc
+++ b/chrome/browser/ui/webui/support_tool/support_tool_ui.cc
@@ -15,7 +15,6 @@
 #include "base/files/file_path.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/strings/string_piece_forward.h"
-#include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/time/time.h"
 #include "base/values.h"
@@ -29,6 +28,7 @@
 #include "chrome/browser/support_tool/support_tool_handler.h"
 #include "chrome/browser/support_tool/support_tool_util.h"
 #include "chrome/browser/ui/chrome_select_file_policy.h"
+#include "chrome/browser/ui/webui/support_tool/support_tool_ui_utils.h"
 #include "chrome/browser/ui/webui/webui_util.h"
 #include "chrome/common/url_constants.h"
 #include "chrome/grit/support_tool_resources.h"
@@ -49,7 +49,10 @@
 const char kSupportCaseIDQuery[] = "case_id";
 const char kModuleQuery[] = "module";
 
+// TODO(b/226318326): Move the utility functions to support_tool_ui_utils.h and
+// add unit tests for them.
 namespace {
+
 // Returns the support case ID that's extracted from `url` with query
 // `kSupportCaseIDQuery`. Returns empty string if `url` doesn't contain support
 // case ID.
@@ -231,76 +234,6 @@
   return base::Value(std::move(result));
 }
 
-// Returns the human readable name corresponding to `data_collector_type`.
-std::string GetPIITypeDescription(feedback::PIIType type_enum) {
-  // This function will return translatable strings in future. For now, return
-  // string constants until we have the translatable strings ready.
-  switch (type_enum) {
-    case feedback::PIIType::kAndroidAppStoragePath:
-      return "Android App Storage Paths";
-    case feedback::PIIType::kBSSID:
-      return "BSSID (Basic Service Set Identifier)";
-    case feedback::PIIType::kCellID:
-      return "Cell Tower Identifier";
-    case feedback::PIIType::kEmail:
-      return "Email Address";
-    case feedback::PIIType::kGaiaID:
-      return "GAIA (Google Accounts and ID Administration) ID";
-    case feedback::PIIType::kHash:
-      return "Hashes";
-    case feedback::PIIType::kIPPAddress:
-      return "IPP (Internet Printing Protocol) Addresses";
-    case feedback::PIIType::kIPAddress:
-      return "IP (Internet Protocol) Address";
-    case feedback::PIIType::kLocationAreaCode:
-      return "Location Area Code";
-    case feedback::PIIType::kMACAddress:
-      return "MAC Address";
-    case feedback::PIIType::kUIHierarchyWindowTitles:
-      return "Window Titles";
-    case feedback::PIIType::kURL:
-      return "URLs";
-    case feedback::PIIType::kUUID:
-      return "Universal Unique Identifiers (UUIDs)";
-    case feedback::PIIType::kSerial:
-      return "Serial Numbers";
-    case feedback::PIIType::kSSID:
-      return "SSID (Service Set Identifier)";
-    case feedback::PIIType::kVolumeLabel:
-      return "Volume Labels";
-    default:
-      return "Error: Undefined";
-  }
-}
-
-// type PIIDataItem = {
-//   piiTypeDescription: string,
-//   piiType: number,
-//   detectedData: string,
-//   count: number,
-//   keep: boolean,
-// }
-base::Value::List GetDetectedPIIDataItems(const PIIMap& detected_pii) {
-  base::Value::List detected_pii_data_items;
-  for (const auto& pii_entry : detected_pii) {
-    base::Value::Dict pii_data_item;
-    pii_data_item.Set("piiTypeDescription",
-                      GetPIITypeDescription(pii_entry.first));
-    pii_data_item.Set("piiType", static_cast<int>(pii_entry.first));
-    pii_data_item.Set(
-        "detectedData",
-        base::JoinString(std::vector<base::StringPiece>(
-                             pii_entry.second.begin(), pii_entry.second.end()),
-                         ", "));
-    pii_data_item.Set("count", static_cast<int>(pii_entry.second.size()));
-    // TODO(b/200511640): Set `keep` field to the value we'll get from URL's
-    // pii_masking_on query if it exists.
-    pii_data_item.Set("keep", false);
-    detected_pii_data_items.Append(base::Value(std::move(pii_data_item)));
-  }
-  return detected_pii_data_items;
-}
-
 // Returns the current time in YYYY_MM_DD_HH_mm format.
 std::string GetTimestampString(base::Time timestamp) {
   base::Time::Exploded tex;
@@ -321,21 +254,6 @@
   return suggested_path.AppendASCII(filename);
 }
 
-std::set<feedback::PIIType> GetSelectedPIIToKeep(
-    const base::Value::List* pii_items) {
-  std::set<feedback::PIIType> pii_to_keep;
-  for (const auto& item : *pii_items) {
-    const base::Value::Dict* item_as_dict = item.GetIfDict();
-    DCHECK(item_as_dict);
-    absl::optional<bool> keep = item_as_dict->FindBool("keep");
-    if (keep && keep.value()) {
-      pii_to_keep.insert(static_cast<feedback::PIIType>(
-          item_as_dict->FindInt("piiType").value()));
-    }
-  }
-  return pii_to_keep;
-}
-
 std::string GetDataCollectionModuleQuery(
     std::set<support_tool::DataCollectorType> included_data_collectors) {
   support_tool::DataCollectionModule module;
@@ -609,7 +527,7 @@
   if (select_file_dialog_)
     return;
 
-  selected_pii_to_keep_ = GetSelectedPIIToKeep(pii_items);
+  selected_pii_to_keep_ = GetPIITypesToKeep(pii_items);
 
   AllowJavascript();
   content::WebContents* web_contents = web_ui()->GetWebContents();
diff --git a/chrome/browser/ui/webui/support_tool/support_tool_ui_utils.cc b/chrome/browser/ui/webui/support_tool/support_tool_ui_utils.cc
new file mode 100644
index 0000000..5cb9752
--- /dev/null
+++ b/chrome/browser/ui/webui/support_tool/support_tool_ui_utils.cc
@@ -0,0 +1,134 @@
+// Copyright 2022 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/ui/webui/support_tool/support_tool_ui_utils.h"
+
+#include <map>
+#include <set>
+#include <string>
+#include <vector>
+
+#include "base/check.h"
+#include "base/strings/string_piece_forward.h"
+#include "base/strings/string_util.h"
+#include "base/values.h"
+#include "chrome/browser/support_tool/data_collector.h"
+#include "components/feedback/pii_types.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
+
+namespace support_tool_ui {
+
+const char kAndroidAppInfo[] = "Android App Information";
+const char kSSID[] = "WiFi SSID";
+const char kLocationInfo[] = "Location Info";
+const char kEmail[] = "Email Address";
+const char kGAIA[] = "Google Account ID";
+const char kStableIdentifier[] =
+    "Other Stable Identifiers (e.g., Hashes or UUIDs)";
+const char kIPPAddress[] = "Printing IPP Address";
+const char kIPAddress[] = "IP Address";
+const char kMACAddress[] = "Network MAC Address";
+const char kWindowTitle[] = "Window Titles";
+const char kURL[] = "URLs";
+const char kSerial[] = "Device & Component Serial Numbers";
+const char kRemovableStorage[] = "Removable Storage Names";
+
+const char kPiiItemDescriptionKey[] = "piiTypeDescription";
+const char kPiiItemDetectedDataKey[] = "detectedData";
+const char kPiiItemPIITypeKey[] = "piiType";
+const char kPiiItemCountKey[] = "count";
+const char kPiiItemKeepKey[] = "keep";
+
+}  // namespace support_tool_ui
+
+namespace {
+
+// Returns the human readable name corresponding to `data_collector_type`.
+std::string GetPIITypeDescription(feedback::PIIType type_enum) {
+  // This function will return translatable strings in future. For now, return
+  // string constants until we have the translatable strings ready.
+  switch (type_enum) {
+    case feedback::PIIType::kAndroidAppStoragePath:
+      // App storage path is part of information about an Android app.
+      return support_tool_ui::kAndroidAppInfo;
+    case feedback::PIIType::kEmail:
+      return support_tool_ui::kEmail;
+    case feedback::PIIType::kGaiaID:
+      return support_tool_ui::kGAIA;
+    case feedback::PIIType::kIPPAddress:
+      return support_tool_ui::kIPPAddress;
+    case feedback::PIIType::kIPAddress:
+      return support_tool_ui::kIPAddress;
+    case feedback::PIIType::kLocationInfo:
+      return support_tool_ui::kLocationInfo;
+    case feedback::PIIType::kMACAddress:
+      return support_tool_ui::kMACAddress;
+    case feedback::PIIType::kUIHierarchyWindowTitles:
+      return support_tool_ui::kWindowTitle;
+    case feedback::PIIType::kURL:
+      return support_tool_ui::kURL;
+    case feedback::PIIType::kSerial:
+      return support_tool_ui::kSerial;
+    case feedback::PIIType::kSSID:
+      return support_tool_ui::kSSID;
+    case feedback::PIIType::kStableIdentifier:
+      return support_tool_ui::kStableIdentifier;
+    case feedback::PIIType::kVolumeLabel:
+      // Volume labels are a part of removable storage paths in various logs.
+      return support_tool_ui::kRemovableStorage;
+    default:
+      return "Error: Undefined";
+  }
+}
+
+}  // namespace
+
+// type PIIDataItem = {
+//   piiTypeDescription: string,
+//   piiType: number,
+//   detectedData: string,
+//   count: number,
+//   keep: boolean,
+// }
+base::Value::List GetDetectedPIIDataItems(const PIIMap& detected_pii) {
+  base::Value::List detected_pii_data_items;
+  for (const auto& pii_entry : detected_pii) {
+    base::Value::Dict pii_data_item;
+    pii_data_item.Set(support_tool_ui::kPiiItemDescriptionKey,
+                      GetPIITypeDescription(pii_entry.first));
+    pii_data_item.Set(support_tool_ui::kPiiItemPIITypeKey,
+                      static_cast<int>(pii_entry.first));
+    pii_data_item.Set(
+        support_tool_ui::kPiiItemDetectedDataKey,
+        base::JoinString(
+            std::vector<base::StringPiece>(pii_entry.second.begin(),
+                                           pii_entry.second.end()),
+            // Join the PII strings with a comma in between them when displaying
+            // to the user to make it more easily readable.
+            ", "));
+    pii_data_item.Set(support_tool_ui::kPiiItemCountKey,
+                      static_cast<int>(pii_entry.second.size()));
+    // TODO(b/200511640): Set `keep` field to the value we'll get from URL's
+    // pii_masking_on query if it exists.
+    pii_data_item.Set(support_tool_ui::kPiiItemKeepKey, false);
+    detected_pii_data_items.Append(base::Value(std::move(pii_data_item)));
+  }
+  return detected_pii_data_items;
+}
+
+std::set<feedback::PIIType> GetPIITypesToKeep(
+    const base::Value::List* pii_items) {
+  std::set<feedback::PIIType> pii_to_keep;
+  for (const auto& item : *pii_items) {
+    const base::Value::Dict* item_as_dict = item.GetIfDict();
+    DCHECK(item_as_dict);
+    absl::optional<bool> keep =
+        item_as_dict->FindBool(support_tool_ui::kPiiItemKeepKey);
+    if (keep && keep.value()) {
+      pii_to_keep.insert(static_cast<feedback::PIIType>(
+          item_as_dict->FindInt(support_tool_ui::kPiiItemPIITypeKey).value()));
+    }
+  }
+  return pii_to_keep;
+}
diff --git a/chrome/browser/ui/webui/support_tool/support_tool_ui_utils.h b/chrome/browser/ui/webui/support_tool/support_tool_ui_utils.h
new file mode 100644
index 0000000..b9bc835
--- /dev/null
+++ b/chrome/browser/ui/webui/support_tool/support_tool_ui_utils.h
@@ -0,0 +1,56 @@
+// Copyright 2022 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_UI_WEBUI_SUPPORT_TOOL_SUPPORT_TOOL_UI_UTILS_H_
+#define CHROME_BROWSER_UI_WEBUI_SUPPORT_TOOL_SUPPORT_TOOL_UI_UTILS_H_
+
+#include <set>
+
+#include "base/values.h"
+#include "chrome/browser/support_tool/data_collector.h"
+#include "components/feedback/pii_types.h"
+
+namespace support_tool_ui {
+
+// Strings that contain the human readable description of feedback::PIIType
+// enums.
+extern const char kAndroidAppInfo[];
+extern const char kSSID[];
+extern const char kLocationInfo[];
+extern const char kEmail[];
+extern const char kGAIA[];
+extern const char kStableIdentifier[];
+extern const char kIPPAddress[];
+extern const char kIPAddress[];
+extern const char kMACAddress[];
+extern const char kWindowTitle[];
+extern const char kURL[];
+extern const char kSerial[];
+extern const char kRemovableStorage[];
+
+// String keys of the fields of PIIDataItem dictionary that Support Tool UI
+// stores the detected PII to display it to user.
+extern const char kPiiItemDescriptionKey[];
+extern const char kPiiItemPIITypeKey[];
+extern const char kPiiItemDetectedDataKey[];
+extern const char kPiiItemCountKey[];
+extern const char kPiiItemKeepKey[];
+
+}  // namespace support_tool_ui
+
+// Returns PIIDataItems in `detected_pii` where PIIDataItem is
+// type PIIDataItem = {
+//   piiTypeDescription: string,
+//   piiTypes: number[],
+//   detectedData: string,
+//   count: number,
+//   keep: boolean,
+// }
+base::Value::List GetDetectedPIIDataItems(const PIIMap& detected_pii);
+
+// Returns the set of PIITypes that has their `keep` field true in `pii_items`.
+std::set<feedback::PIIType> GetPIITypesToKeep(
+    const base::Value::List* pii_items);
+
+#endif  // CHROME_BROWSER_UI_WEBUI_SUPPORT_TOOL_SUPPORT_TOOL_UI_UTILS_H_
diff --git a/chrome/browser/ui/webui/support_tool/support_tool_ui_utils_unittest.cc b/chrome/browser/ui/webui/support_tool/support_tool_ui_utils_unittest.cc
new file mode 100644
index 0000000..682d862c
--- /dev/null
+++ b/chrome/browser/ui/webui/support_tool/support_tool_ui_utils_unittest.cc
@@ -0,0 +1,93 @@
+// Copyright 2022 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/ui/webui/support_tool/support_tool_ui_utils.h"
+
+#include <set>
+#include <string>
+
+#include "base/containers/fixed_flat_map.h"
+#include "base/strings/string_piece_forward.h"
+#include "base/values.h"
+#include "chrome/browser/support_tool/data_collector.h"
+#include "components/feedback/pii_types.h"
+#include "testing/gmock/include/gmock/gmock-matchers.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using ::testing::StrEq;
+using ::testing::UnorderedElementsAreArray;
+
+namespace {
+
+// The PIIMap for testing.
+const PIIMap kPIIMap = {
+    {feedback::PIIType::kIPAddress, {"0.255.255.255", "::ffff:cb0c:10ea"}},
+    {feedback::PIIType::kURL,
+     {"chrome-extension://nkoccljplnhpfnfiajclkommnmllphnl/foobar.js?bar=x"}},
+    {feedback::PIIType::kStableIdentifier,
+     {"123e4567-e89b-12d3-a456-426614174000",
+      "27540283740a0897ab7c8de0f809add2bacde78f"}}};
+
+const feedback::PIIType kPIITypes[] = {feedback::PIIType::kIPAddress,
+                                       feedback::PIIType::kURL,
+                                       feedback::PIIType::kStableIdentifier};
+
+// PII strings with the definition strings.
+const auto kPIIStringsWithDefinition = base::MakeFixedFlatMap<
+    base::StringPiece,
+    base::StringPiece>(
+    {{support_tool_ui::kIPAddress, "0.255.255.255, ::ffff:cb0c:10ea"},
+     {support_tool_ui::kURL,
+      "chrome-extension://nkoccljplnhpfnfiajclkommnmllphnl/foobar.js?bar=x"},
+     {support_tool_ui::kStableIdentifier,
+      "123e4567-e89b-12d3-a456-426614174000, "
+      "27540283740a0897ab7c8de0f809add2bacde78f"}});
+
+}  // namespace
+
+class SupportToolUiUtilsTest : public ::testing::Test {
+ public:
+  SupportToolUiUtilsTest() = default;
+
+  SupportToolUiUtilsTest(const SupportToolUiUtilsTest&) = delete;
+  SupportToolUiUtilsTest& operator=(const SupportToolUiUtilsTest&) = delete;
+};
+
+TEST_F(SupportToolUiUtilsTest, PiiItems) {
+  // Get the list of detected PII items in PIIMap.
+  base::Value::List detected_pii_items = GetDetectedPIIDataItems(kPIIMap);
+  EXPECT_EQ(detected_pii_items.size(), kPIIMap.size());
+  // Check the contents of `detected_pii_items` list.
+  for (const auto& detected_pii_item : detected_pii_items) {
+    const base::Value::Dict* pii_item = detected_pii_item.GetIfDict();
+    // PIIItem must be a Value::Dict.
+    EXPECT_TRUE(pii_item);
+    const std::string* description =
+        pii_item->FindString(support_tool_ui::kPiiItemDescriptionKey);
+    // The dictionary must contain description.
+    EXPECT_TRUE(description);
+    const auto* pii_string_with_definition =
+        kPIIStringsWithDefinition.find(*description);
+    // The definition string must exist in `kPIIStringsWithDefinition`.
+    EXPECT_NE(pii_string_with_definition, kPIIStringsWithDefinition.end());
+    const std::string* pii_data =
+        pii_item->FindString(support_tool_ui::kPiiItemDetectedDataKey);
+    // Check the detected data.
+    EXPECT_THAT(*pii_data, StrEq(pii_string_with_definition->second));
+  }
+
+  // Update all PII items to have their keep value as true.
+  for (auto& detected_pii_item : detected_pii_items) {
+    base::Value::Dict& pii_item = detected_pii_item.GetDict();
+    // Remove the `keep` key to update it.
+    pii_item.Remove(support_tool_ui::kPiiItemKeepKey);
+    pii_item.Set(support_tool_ui::kPiiItemKeepKey, true);
+  }
+
+  const std::set<feedback::PIIType>& pii_to_keep_result =
+      GetPIITypesToKeep(&detected_pii_items);
+  // Check if the returned PII type set is as expected.
+  EXPECT_THAT(pii_to_keep_result, UnorderedElementsAreArray(kPIITypes));
+}
diff --git a/chrome/browser/ui/webui/version/version_handler_chromeos.cc b/chrome/browser/ui/webui/version/version_handler_chromeos.cc
index 4a28204..66c8636 100644
--- a/chrome/browser/ui/webui/version/version_handler_chromeos.cc
+++ b/chrome/browser/ui/webui/version/version_handler_chromeos.cc
@@ -83,7 +83,8 @@
   // Note: This will only be called by the UI when Lacros is available.
   DCHECK(crosapi::BrowserManager::Get());
   crosapi::BrowserManager::Get()->SwitchToTab(
-      GURL(chrome::kChromeUIVersionURL));
+      GURL(chrome::kChromeUIVersionURL),
+      /*path_behavior=*/NavigateParams::RESPECT);
 #endif
 }
 
diff --git a/chrome/browser/usb/usb_browsertest.cc b/chrome/browser/usb/usb_browsertest.cc
index ad9bad5..121f939 100644
--- a/chrome/browser/usb/usb_browsertest.cc
+++ b/chrome/browser/usb/usb_browsertest.cc
@@ -482,7 +482,8 @@
   )");
 
   // Launch the test app.
-  ExtensionTestMessageListener ready_listener("ready", true);
+  ExtensionTestMessageListener ready_listener("ready",
+                                              ReplyBehavior::kWillReply);
   extensions::ResultCatcher result_catcher;
   scoped_refptr<const extensions::Extension> extension =
       LoadExtension(dir.UnpackedPath());
diff --git a/chrome/browser/user_education/java/src/org/chromium/chrome/browser/user_education/IPHCommand.java b/chrome/browser/user_education/java/src/org/chromium/chrome/browser/user_education/IPHCommand.java
index d323963..cf4c40d 100644
--- a/chrome/browser/user_education/java/src/org/chromium/chrome/browser/user_education/IPHCommand.java
+++ b/chrome/browser/user_education/java/src/org/chromium/chrome/browser/user_education/IPHCommand.java
@@ -4,6 +4,7 @@
 
 package org.chromium.chrome.browser.user_education;
 
+import android.content.res.Resources;
 import android.graphics.Rect;
 import android.view.View;
 
@@ -17,9 +18,12 @@
  * Class encapsulating the data needed to show in-product help (IPH).
  */
 public class IPHCommand {
+    private Resources mResources;
     public final String featureName;
-    public final String contentString;
-    public final String accessibilityText;
+    public final int stringId;
+    public String contentString;
+    public final int accessibilityStringId;
+    public String accessibilityText;
     public final boolean dismissOnTouch;
     public final View anchorView;
     @Nullable
@@ -28,7 +32,7 @@
     public final Runnable onShowCallback;
     @Nullable
     public final Runnable onBlockedCallback;
-    public final Rect insetRect;
+    public Rect insetRect;
     public final long autoDismissTimeout;
     public final ViewRectProvider viewRectProvider;
     @Nullable
@@ -38,12 +42,56 @@
     @AnchoredPopupWindow.VerticalOrientation
     public final int preferredVerticalOrientation;
 
+    public void fetchFromResources() {
+        if (contentString == null) {
+            assert mResources != null;
+            contentString = mResources.getString(stringId);
+        }
+
+        if (accessibilityText == null) {
+            assert mResources != null;
+            accessibilityText = mResources.getString(accessibilityStringId);
+        }
+
+        if (insetRect == null && anchorRect == null) {
+            int yInsetPx =
+                    mResources.getDimensionPixelOffset(R.dimen.iph_text_bubble_menu_anchor_y_inset);
+            insetRect = new Rect(0, 0, 0, yInsetPx);
+        }
+    }
+
+    IPHCommand(Resources resources, String featureName, int stringId, int accessibilityStringId,
+            boolean dismissOnTouch, View anchorView, Runnable onDismissCallback,
+            Runnable onShowCallback, Runnable onBlockedCallback, long autoDismissTimeout,
+            ViewRectProvider viewRectProvider, HighlightParams params, Rect anchorRect,
+            boolean removeArrow,
+            @AnchoredPopupWindow.VerticalOrientation int preferredVerticalOrientation) {
+        this.mResources = resources;
+        this.featureName = featureName;
+        this.stringId = stringId;
+        this.accessibilityStringId = accessibilityStringId;
+        this.dismissOnTouch = dismissOnTouch;
+        this.anchorView = anchorView;
+        this.onDismissCallback = onDismissCallback;
+        this.onShowCallback = onShowCallback;
+        this.onBlockedCallback = onBlockedCallback;
+        this.autoDismissTimeout = autoDismissTimeout;
+        this.viewRectProvider = viewRectProvider;
+        this.highlightParams = params;
+        this.anchorRect = anchorRect;
+        this.removeArrow = removeArrow;
+        this.preferredVerticalOrientation = preferredVerticalOrientation;
+    }
+
+    // TODO(peilinwang): Remove this constructor after ANDROID_SCROLL_OPTIMIZATIONS fully rolls out.
     IPHCommand(String featureName, String contentString, String accessibilityText,
             boolean dismissOnTouch, View anchorView, Runnable onDismissCallback,
             Runnable onShowCallback, Runnable onBlockedCallback, Rect insetRect,
             long autoDismissTimeout, ViewRectProvider viewRectProvider, HighlightParams params,
             Rect anchorRect, boolean removeArrow,
             @AnchoredPopupWindow.VerticalOrientation int preferredVerticalOrientation) {
+        this.stringId = 0;
+        this.accessibilityStringId = 0;
         this.featureName = featureName;
         this.contentString = contentString;
         this.accessibilityText = accessibilityText;
diff --git a/chrome/browser/user_education/java/src/org/chromium/chrome/browser/user_education/IPHCommandBuilder.java b/chrome/browser/user_education/java/src/org/chromium/chrome/browser/user_education/IPHCommandBuilder.java
index 0c77a3e2..59d92ea7 100644
--- a/chrome/browser/user_education/java/src/org/chromium/chrome/browser/user_education/IPHCommandBuilder.java
+++ b/chrome/browser/user_education/java/src/org/chromium/chrome/browser/user_education/IPHCommandBuilder.java
@@ -212,6 +212,10 @@
             return null;
         }
 
+        if (ChromeFeatureList.isEnabled(ChromeFeatureList.ANDROID_SCROLL_OPTIMIZATIONS)) {
+            return buildLazy();
+        }
+
         try (TraceEvent te = TraceEvent.scoped("IPHCommandBuilder::build")) {
             if (mOnDismissCallback == null) {
                 mOnDismissCallback = NO_OP_RUNNABLE;
@@ -246,4 +250,24 @@
                     mAnchorRect, mRemoveArrow, mPreferredVerticalOrientation);
         }
     }
+
+    public IPHCommand buildLazy() {
+        try (TraceEvent te = TraceEvent.scoped("IPHCommandBuilder::buildLazy")) {
+            if (mOnDismissCallback == null) {
+                mOnDismissCallback = NO_OP_RUNNABLE;
+            }
+            if (mOnShowCallback == null) {
+                mOnShowCallback = NO_OP_RUNNABLE;
+            }
+
+            if (mOnBlockedCallback == null) {
+                mOnBlockedCallback = NO_OP_RUNNABLE;
+            }
+
+            return new IPHCommand(mResources, mFeatureName, mStringId, mAccessibilityStringId,
+                    mDismissOnTouch, mAnchorView, mOnDismissCallback, mOnShowCallback,
+                    mOnBlockedCallback, mAutoDismissTimeout, mViewRectProvider, mHighlightParams,
+                    mAnchorRect, mRemoveArrow, mPreferredVerticalOrientation);
+        }
+    }
 }
diff --git a/chrome/browser/user_education/java/src/org/chromium/chrome/browser/user_education/UserEducationHelper.java b/chrome/browser/user_education/java/src/org/chromium/chrome/browser/user_education/UserEducationHelper.java
index 0371f89..8f0b44c6 100644
--- a/chrome/browser/user_education/java/src/org/chromium/chrome/browser/user_education/UserEducationHelper.java
+++ b/chrome/browser/user_education/java/src/org/chromium/chrome/browser/user_education/UserEducationHelper.java
@@ -81,10 +81,6 @@
         }
 
         String featureName = iphCommand.featureName;
-        String contentString = iphCommand.contentString;
-        String accessibilityString = iphCommand.accessibilityText;
-        assert (!contentString.isEmpty());
-        assert (!accessibilityString.isEmpty());
         assert (featureName != null);
 
         ViewRectProvider viewRectProvider = iphCommand.viewRectProvider;
@@ -107,6 +103,17 @@
             return;
         }
 
+        // If scroll optimizations were enabled, iphCommand would have been built lazily, and we
+        // would have to fetch the data that is needed from this point on.
+        if (ChromeFeatureList.isEnabled(ChromeFeatureList.ANDROID_SCROLL_OPTIMIZATIONS)) {
+            iphCommand.fetchFromResources();
+        }
+
+        String contentString = iphCommand.contentString;
+        String accessibilityString = iphCommand.accessibilityText;
+        assert (!contentString.isEmpty());
+        assert (!accessibilityString.isEmpty());
+
         // Automatic snoozes are handled separately. If automatic snoozing is enabled, we won't show
         // snooze UI in the IPH, but we will treat the dismiss as an implicit snooze action.
         boolean shouldShowSnoozeButton = triggerDetails.shouldShowSnooze
diff --git a/chrome/browser/user_education/java/src/org/chromium/chrome/browser/user_education/UserEducationHelperTest.java b/chrome/browser/user_education/java/src/org/chromium/chrome/browser/user_education/UserEducationHelperTest.java
index 185f0be..b4a356b7 100644
--- a/chrome/browser/user_education/java/src/org/chromium/chrome/browser/user_education/UserEducationHelperTest.java
+++ b/chrome/browser/user_education/java/src/org/chromium/chrome/browser/user_education/UserEducationHelperTest.java
@@ -113,6 +113,7 @@
         mTestValues.addFeatureFlagOverride(ChromeFeatureList.SNOOZABLE_IPH, true);
         mTestValues.addFeatureFlagOverride(ChromeFeatureList.ENABLE_AUTOMATIC_SNOOZE, false);
         mTestValues.addFeatureFlagOverride(ChromeFeatureList.ENABLE_IPH, true);
+        mTestValues.addFeatureFlagOverride(ChromeFeatureList.ANDROID_SCROLL_OPTIMIZATIONS, false);
         FeatureList.setTestValues(mTestValues);
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             when(mTracker.shouldTriggerHelpUIWithSnooze(FeatureConstants.DOWNLOAD_HOME_FEATURE))
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index e5e31cb..cdeb8990 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1654084629-1bcfe2fec67291c9f3e097ae63fa1329a2451b24.profdata
+chrome-win32-main-1654095358-c584e3d00ca67339756384f10d6db80ad5d760b6.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index 685f7aa..2f6edb91 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1654084629-5d4e1f46e230d434df17660e6e6f67f77979130d.profdata
+chrome-win64-main-1654095358-5d7d79735dfab517cee6421bfe17b0065432e90e.profdata
diff --git a/chrome/chrome_cleaner/os/system_util_cleaner_unittest.cc b/chrome/chrome_cleaner/os/system_util_cleaner_unittest.cc
index 2805f4d..36ee11a2 100644
--- a/chrome/chrome_cleaner/os/system_util_cleaner_unittest.cc
+++ b/chrome/chrome_cleaner/os/system_util_cleaner_unittest.cc
@@ -8,7 +8,6 @@
 
 #include <aclapi.h>
 #include <shlobj.h>
-#include <shlwapi.h>
 #include <stdint.h>
 #include <wincrypt.h>
 
@@ -28,6 +27,7 @@
 #include "base/test/scoped_path_override.h"
 #include "base/test/test_shortcut_win.h"
 #include "base/test/test_timeouts.h"
+#include "base/win/shlwapi.h"
 #include "base/win/shortcut.h"
 #include "base/win/sid.h"
 #include "chrome/chrome_cleaner/constants/chrome_cleaner_switches.h"
diff --git a/chrome/common/extensions/api/privacy.json b/chrome/common/extensions/api/privacy.json
index aeeba02..3b1c8d0c 100644
--- a/chrome/common/extensions/api/privacy.json
+++ b/chrome/common/extensions/api/privacy.json
@@ -124,7 +124,7 @@
             "$ref": "types.ChromeSetting",
             "value": ["protectedContentEnabled", {"type":"boolean"}],
             "description": "<strong>Available on Windows and ChromeOS only</strong>: If enabled, Chrome provides a unique ID to plugins in order to run protected content. The value of this preference is of type boolean, and the default value is <code>true</code>.",
-            "platforms": ["win", "chromeos"]
+            "platforms": ["win", "chromeos", "lacros"]
           }
         }
       }
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 150b247..5f92e3b 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -6675,6 +6675,7 @@
       "../browser/ui/webui/signin/profile_picker_handler_unittest.cc",
       "../browser/ui/webui/signin/signin_url_utils_unittest.cc",
       "../browser/ui/webui/signin/sync_confirmation_handler_unittest.cc",
+      "../browser/ui/webui/support_tool/support_tool_ui_utils_unittest.cc",
       "../browser/ui/webui/sync_internals/sync_internals_message_handler_unittest.cc",
       "../browser/ui/webui/tab_search/tab_search_page_handler_unittest.cc",
       "../browser/ui/webui/theme_source_unittest.cc",
@@ -6841,6 +6842,7 @@
       "//chrome/browser/ui/webui/new_tab_page:mojo_bindings",
       "//chrome/browser/web_applications:web_applications_test_support",
       "//components/app_constants",
+      "//components/autofill_assistant/browser/public:unit_test_support",
       "//components/chrome_cleaner/test:test_name_helper",
       "//components/commerce/core:commerce_heuristics_data",
       "//components/enterprise",
@@ -7857,9 +7859,6 @@
         "//chrome/browser/chromeos/extensions/telemetry/api:unit_tests",
         "//chrome/common/chromeos/extensions",
         "//chromeos/dbus/image_burner",
-        "//content/public/browser",
-        "//net",
-        "//net:test_support",
       ]
     } else {
       sources += [
diff --git a/chrome/test/data/extensions/api_test/preference/lacros/manifest.json b/chrome/test/data/extensions/api_test/preference/lacros/manifest.json
index 594998a..8a08c1e 100644
--- a/chrome/test/data/extensions/api_test/preference/lacros/manifest.json
+++ b/chrome/test/data/extensions/api_test/preference/lacros/manifest.json
@@ -3,7 +3,7 @@
   "version" : "0.1",
   "manifest_version": 2,
   "description" : "Lacros extension controlled pref API Test Extension",
-  "permissions": [ "accessibilityFeatures.read", "accessibilityFeatures.modify" ],
+  "permissions": [ "accessibilityFeatures.read", "accessibilityFeatures.modify", "privacy" ],
   "background": {
     "scripts": ["test.js"],
     "persistent": false
diff --git a/chrome/test/data/extensions/api_test/preference/lacros/test.js b/chrome/test/data/extensions/api_test/preference/lacros/test.js
index c1c93d2..b83730c1 100644
--- a/chrome/test/data/extensions/api_test/preference/lacros/test.js
+++ b/chrome/test/data/extensions/api_test/preference/lacros/test.js
@@ -18,6 +18,12 @@
     preferences: {
       autoclick: false,
     }
+  },
+  {
+    root: chrome.privacy.websites,
+    preferences: {
+      protectedContentEnabled: true,
+    }
   }
 ];
 
diff --git a/chrome/test/data/extensions/api_test/preference/standard/test.js b/chrome/test/data/extensions/api_test/preference/standard/test.js
index 4a220ae..a01e3a74 100644
--- a/chrome/test/data/extensions/api_test/preference/standard/test.js
+++ b/chrome/test/data/extensions/api_test/preference/standard/test.js
@@ -75,7 +75,7 @@
 // Tests getting the preference value (which should be uncontrolled and at its
 // default value).
 function prefGetter(prefName, defaultValue) {
-  if (possibly_missing_preferences.has(prefName) && !this[prefName]) {
+  if (possibly_missing_preferences.has(prefName)) {
     return;
   }
   this[prefName].get({}, expectDefault(prefName, defaultValue));
@@ -84,7 +84,7 @@
 // Tests setting the preference value (to the inverse of the default, so that
 // it should be controlled by this extension).
 function prefSetter(prefName, defaultValue) {
-  if (possibly_missing_preferences.has(prefName) && !this[prefName]) {
+  if (possibly_missing_preferences.has(prefName)) {
     return;
   }
   this[prefName].set({value: !defaultValue},
diff --git a/chrome/test/data/webui/chromeos/os_feedback_ui/confirmation_page_test.js b/chrome/test/data/webui/chromeos/os_feedback_ui/confirmation_page_test.js
index 26563eb3..dc488d1 100644
--- a/chrome/test/data/webui/chromeos/os_feedback_ui/confirmation_page_test.js
+++ b/chrome/test/data/webui/chromeos/os_feedback_ui/confirmation_page_test.js
@@ -5,6 +5,7 @@
 import {ConfirmationPageElement} from 'chrome://os-feedback/confirmation_page.js';
 import {FeedbackFlowState} from 'chrome://os-feedback/feedback_flow.js';
 import {SendReportStatus} from 'chrome://os-feedback/feedback_types.js';
+import {PromiseResolver} from 'chrome://resources/js/promise_resolver.m.js';
 
 import {assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
 import {eventToPromise, flushTasks, isVisible} from '../../test_util.js';
@@ -185,4 +186,23 @@
     assertTrue(!!actualCurrentState);
     assertEquals(FeedbackFlowState.CONFIRMATION, actualCurrentState);
   });
+
+  // Test clicking done button should close the window.
+  test('ClickDoneButtonShouldCloseWindow', async () => {
+    await initializePage();
+    const resolver = new PromiseResolver();
+    let windowCloseCalled = 0;
+
+    const closeMock = () => {
+      windowCloseCalled++;
+      return resolver.promise;
+    };
+    window.close = closeMock;
+
+    const doneButton = getElement(page, '#buttonDone');
+    doneButton.click();
+    await flushTasks();
+
+    assertEquals(1, windowCloseCalled);
+  });
 }
diff --git a/chrome/test/data/webui/chromeos/scanning/loading_page_test.js b/chrome/test/data/webui/chromeos/scanning/loading_page_test.js
index a71b64c..0e810f6 100644
--- a/chrome/test/data/webui/chromeos/scanning/loading_page_test.js
+++ b/chrome/test/data/webui/chromeos/scanning/loading_page_test.js
@@ -88,6 +88,7 @@
         loadingPage.$$('#noScannersDiv img')));
 
     // Setup UI to display no scanners div.
+    setIsDarkModeEnabled_(false);
     loadingPage.appState = AppState.NO_SCANNERS;
     await flushTasks();
     assertEquals(getNoScannersSvg().src, lightModeSvg);
@@ -106,6 +107,7 @@
         (/** @type {!HTMLImageElement} */ (loadingPage.$$('#loadingDiv img')));
 
     // Setup UI to display no scanners div.
+    setIsDarkModeEnabled_(false);
     loadingPage.appState = AppState.NO_SCANNERS;
     await flushTasks();
     assertEquals(getLoadingSvg().src, lightModeSvg);
diff --git a/chrome/test/data/webui/chromeos/scanning/scan_preview_test.js b/chrome/test/data/webui/chromeos/scanning/scan_preview_test.js
index ad3c74f..f65705c6 100644
--- a/chrome/test/data/webui/chromeos/scanning/scan_preview_test.js
+++ b/chrome/test/data/webui/chromeos/scanning/scan_preview_test.js
@@ -429,6 +429,7 @@
     const darkModeSvg = `${srcBase}svg/ready_to_scan_dark.svg`;
     const getReadyToScanSvg = () =>
         (/** @type {!HTMLImageElement} */ (scanPreview.$$('#readyToScanImg')));
+    setIsDarkModeEnabled_(false);
     assertEquals(getReadyToScanSvg().src, lightModeSvg);
 
     // Mock media query state for dark mode.
diff --git a/chrome/test/data/webui/settings/chromeos/os_about_page_tests.js b/chrome/test/data/webui/settings/chromeos/os_about_page_tests.js
index dad1a66..38facec9 100644
--- a/chrome/test/data/webui/settings/chromeos/os_about_page_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/os_about_page_tests.js
@@ -22,7 +22,10 @@
   /** @type {?TestLifetimeBrowserProxy} */
   let lifetimeBrowserProxy = null;
 
-  const SPINNER_ICON = 'chrome://resources/images/throbber_small.svg';
+  const SPINNER_ICON_LIGHT_MODE =
+      'chrome://resources/images/throbber_small.svg';
+  const SPINNER_ICON_DARK_MODE =
+      'chrome://resources/images/throbber_small_dark.svg';
 
   setup(function() {
     lifetimeBrowserProxy = new TestLifetimeBrowserProxy();
@@ -96,54 +99,78 @@
   }
 
   /**
-   * Test that the status icon and status message update according to
-   * incoming 'update-status-changed' events.
+   * @param {boolean} active
    */
-  test('IconAndMessageUpdates', function() {
-    const icon = page.shadowRoot.querySelector('iron-icon');
-    assertTrue(!!icon);
-    const statusMessageEl =
-        page.shadowRoot.querySelector('#updateStatusMessage div');
-    let previousMessageText = statusMessageEl.textContent;
+  function setDarkMode(active) {
+    assertTrue(!!page);
+    page.isDarkModeActive_ = active;
+  }
 
-    fireStatusChanged(UpdateStatus.CHECKING);
-    assertEquals(SPINNER_ICON, icon.src);
-    assertEquals(null, icon.getAttribute('icon'));
-    assertNotEquals(previousMessageText, statusMessageEl.textContent);
-    previousMessageText = statusMessageEl.textContent;
+  ['light', 'dark'].forEach((mode) => {
+    suite(`with ${mode} mode active`, () => {
+      const isDarkMode = mode === 'dark';
 
-    fireStatusChanged(UpdateStatus.UPDATING, {progress: 0});
-    assertEquals(SPINNER_ICON, icon.src);
-    assertEquals(null, icon.getAttribute('icon'));
-    assertFalse(statusMessageEl.textContent.includes('%'));
-    assertNotEquals(previousMessageText, statusMessageEl.textContent);
-    previousMessageText = statusMessageEl.textContent;
+      /**
+       * Test that the OS update status message and icon update according to
+       * incoming 'update-status-changed' events, for light and dark mode
+       * respectively.
+       */
+      test('status message and icon update', () => {
+        setDarkMode(isDarkMode);
+        const icon = page.shadowRoot.querySelector('iron-icon');
+        assertTrue(!!icon);
+        const statusMessageEl =
+            page.shadowRoot.querySelector('#updateStatusMessage div');
+        let previousMessageText = statusMessageEl.textContent;
 
-    fireStatusChanged(UpdateStatus.UPDATING, {progress: 1});
-    assertNotEquals(previousMessageText, statusMessageEl.textContent);
-    assertTrue(statusMessageEl.textContent.includes('%'));
-    previousMessageText = statusMessageEl.textContent;
+        fireStatusChanged(UpdateStatus.CHECKING);
+        if (isDarkMode) {
+          assertEquals(SPINNER_ICON_DARK_MODE, icon.src);
+        } else {
+          assertEquals(SPINNER_ICON_LIGHT_MODE, icon.src);
+        }
+        assertEquals(null, icon.getAttribute('icon'));
+        assertNotEquals(previousMessageText, statusMessageEl.textContent);
+        previousMessageText = statusMessageEl.textContent;
 
-    fireStatusChanged(UpdateStatus.NEARLY_UPDATED);
-    assertEquals(null, icon.src);
-    assertEquals('settings:check-circle', icon.icon);
-    assertNotEquals(previousMessageText, statusMessageEl.textContent);
-    previousMessageText = statusMessageEl.textContent;
+        fireStatusChanged(UpdateStatus.UPDATING, {progress: 0});
+        if (isDarkMode) {
+          assertEquals(SPINNER_ICON_DARK_MODE, icon.src);
+        } else {
+          assertEquals(SPINNER_ICON_LIGHT_MODE, icon.src);
+        }
+        assertEquals(null, icon.getAttribute('icon'));
+        assertFalse(statusMessageEl.textContent.includes('%'));
+        assertNotEquals(previousMessageText, statusMessageEl.textContent);
+        previousMessageText = statusMessageEl.textContent;
 
-    fireStatusChanged(UpdateStatus.DISABLED_BY_ADMIN);
-    assertEquals(null, icon.src);
-    assertEquals('cr20:domain', icon.icon);
-    assertNotEquals(previousMessageText, statusMessageEl.textContent);
+        fireStatusChanged(UpdateStatus.UPDATING, {progress: 1});
+        assertNotEquals(previousMessageText, statusMessageEl.textContent);
+        assertTrue(statusMessageEl.textContent.includes('%'));
+        previousMessageText = statusMessageEl.textContent;
 
-    fireStatusChanged(UpdateStatus.FAILED);
-    assertEquals(null, icon.src);
-    assertEquals('cr:error-outline', icon.icon);
-    assertEquals(0, statusMessageEl.textContent.trim().length);
+        fireStatusChanged(UpdateStatus.NEARLY_UPDATED);
+        assertEquals(null, icon.src);
+        assertEquals('settings:check-circle', icon.icon);
+        assertNotEquals(previousMessageText, statusMessageEl.textContent);
+        previousMessageText = statusMessageEl.textContent;
 
-    fireStatusChanged(UpdateStatus.DISABLED);
-    assertEquals(null, icon.src);
-    assertEquals(null, icon.getAttribute('icon'));
-    assertEquals(0, statusMessageEl.textContent.trim().length);
+        fireStatusChanged(UpdateStatus.DISABLED_BY_ADMIN);
+        assertEquals(null, icon.src);
+        assertEquals('cr20:domain', icon.icon);
+        assertNotEquals(previousMessageText, statusMessageEl.textContent);
+
+        fireStatusChanged(UpdateStatus.FAILED);
+        assertEquals(null, icon.src);
+        assertEquals('cr:error-outline', icon.icon);
+        assertEquals(0, statusMessageEl.textContent.trim().length);
+
+        fireStatusChanged(UpdateStatus.DISABLED);
+        assertEquals(null, icon.src);
+        assertEquals(null, icon.getAttribute('icon'));
+        assertEquals(0, statusMessageEl.textContent.trim().length);
+      });
+    });
   });
 
   test('ErrorMessageWithHtml', function() {
diff --git a/chrome/test/data/webui/usb_internals_test.js b/chrome/test/data/webui/usb_internals_test.js
index a86eafd2..c33bf5c 100644
--- a/chrome/test/data/webui/usb_internals_test.js
+++ b/chrome/test/data/webui/usb_internals_test.js
@@ -289,9 +289,9 @@
     assertEquals(2, tables.length);
 
     // Only 2 tabs after loading page.
-    const tabs = app.shadowRoot.querySelectorAll('tab');
+    const tabs = app.shadowRoot.querySelectorAll('div[slot=\'tab\']');
     assertEquals(2, tabs.length);
-    const tabPanels = app.shadowRoot.querySelectorAll('tabpanel');
+    const tabPanels = app.shadowRoot.querySelectorAll('div[slot=\'panel\']');
     assertEquals(2, tabPanels.length);
 
     // The second is the devices table, which has 8 columns.
@@ -311,25 +311,31 @@
     // Click the inspect button to open information about the first device.
     // The device info is opened as a third tab panel.
     devicesTable.querySelectorAll('button')[0].click();
-    assertEquals(3, app.shadowRoot.querySelectorAll('tab').length);
-    assertEquals(3, app.shadowRoot.querySelectorAll('tabpanel').length);
-    assertTrue(app.shadowRoot.querySelectorAll('tabpanel')[2].selected);
+    assertEquals(
+        3, app.shadowRoot.querySelectorAll('div[slot=\'tab\']').length);
+    let panels = app.shadowRoot.querySelectorAll('div[slot=\'panel\']');
+    assertEquals(3, panels.length);
+    assertTrue(panels[2].hasAttribute('selected'));
 
     // Check that clicking the inspect button for another device will open a
     // new tabpanel.
     devicesTable.querySelectorAll('button')[1].click();
-    assertEquals(4, app.shadowRoot.querySelectorAll('tab').length);
-    assertEquals(4, app.shadowRoot.querySelectorAll('tabpanel').length);
-    assertTrue(app.shadowRoot.querySelectorAll('tabpanel')[3].selected);
-    assertFalse(app.shadowRoot.querySelectorAll('tabpanel')[2].selected);
+    assertEquals(
+        4, app.shadowRoot.querySelectorAll('div[slot=\'tab\']').length);
+    panels = app.shadowRoot.querySelectorAll('div[slot=\'panel\']');
+    assertEquals(4, panels.length);
+    assertTrue(panels[3].hasAttribute('selected'));
+    assertFalse(panels[2].hasAttribute('selected'));
 
     // Check that clicking the inspect button for the same device a second
     // time will open the same tabpanel.
     devicesTable.querySelectorAll('button')[0].click();
-    assertEquals(4, app.shadowRoot.querySelectorAll('tab').length);
-    assertEquals(4, app.shadowRoot.querySelectorAll('tabpanel').length);
-    assertTrue(app.shadowRoot.querySelectorAll('tabpanel')[2].selected);
-    assertFalse(app.shadowRoot.querySelectorAll('tabpanel')[3].selected);
+    assertEquals(
+        4, app.shadowRoot.querySelectorAll('div[slot=\'tab\']').length);
+    panels = app.shadowRoot.querySelectorAll('div[slot=\'panel\']');
+    assertEquals(4, panels.length);
+    assertTrue(panels[2].hasAttribute('selected'));
+    assertFalse(panels[3].hasAttribute('selected'));
   });
 
   test('RenderDeviceInfoTree', function() {
@@ -337,7 +343,7 @@
     // showing WebUSB information. Check the tree displays correct data.
     // The tab panel of the first device is opened in previous test as the
     // third tab panel.
-    const deviceTab = app.shadowRoot.querySelectorAll('tabpanel')[2];
+    const deviceTab = app.shadowRoot.querySelectorAll('div[slot=\'panel\']')[2];
     const tree = deviceTab.querySelector('tree');
     const treeItems = tree.querySelectorAll('.tree-item');
     assertEquals(11, treeItems.length);
@@ -361,7 +367,7 @@
     await deviceTabInitializedResolver.promise;
     // The tab panel of the first device is opened in previous test as the
     // third tab panel. This device has correct device descriptor.
-    const deviceTab = app.shadowRoot.querySelectorAll('tabpanel')[2];
+    const deviceTab = app.shadowRoot.querySelectorAll('div[slot=\'panel\']')[2];
     deviceTab.querySelector('.device-descriptor-button').click();
 
     await deviceDescriptorRenderResolver.promise;
@@ -427,7 +433,7 @@
     // Inspect the second device, which has short device descriptor.
     devicesTable.querySelectorAll('button')[1].click();
     // The fourth is the device tab (a third tab was opened in a previous test).
-    const deviceTab = app.shadowRoot.querySelectorAll('tabpanel')[3];
+    const deviceTab = app.shadowRoot.querySelectorAll('div[slot=\'panel\']')[3];
 
     await deviceTabInitializedResolver.promise;
     deviceDescriptorRenderResolver = new PromiseResolver();
diff --git a/chrome/test/enterprise/e2e/.vpython3 b/chrome/test/enterprise/e2e/.vpython3
index 818a605..2f0f1f56 100644
--- a/chrome/test/enterprise/e2e/.vpython3
+++ b/chrome/test/enterprise/e2e/.vpython3
@@ -11,8 +11,8 @@
 
 wheel: <
   name: "infra/celab/celab/windows-amd64"
-  # Source: https://ci.chromium.org/ui/p/celab/builders/ci/Windows/b8820786327162315505
-  version: "y9-Qg-fAfAomhA0jHYVRQ_o767NoGSg5CVJ1Gv0OW2QC"
+  # Source: https://ci.chromium.org/ui/p/celab/builders/ci/Windows/b8812542790914655777
+  version: "WRbKQgmTylFDU2eOdn2p2O3EO1Wm-nDcNFy4b6wjalYC"
 >
 
 # googleapiclient
diff --git a/chrome/test/ppapi/ppapi_browsertest.cc b/chrome/test/ppapi/ppapi_browsertest.cc
index 886946a..ff3e0b3 100644
--- a/chrome/test/ppapi/ppapi_browsertest.cc
+++ b/chrome/test/ppapi/ppapi_browsertest.cc
@@ -2105,7 +2105,7 @@
   }
 
   void RunTests(const std::string& extension_dirname) {
-    ExtensionTestMessageListener listener("PASS", false);
+    ExtensionTestMessageListener listener("PASS");
     LaunchTestingApp(extension_dirname);
     EXPECT_TRUE(listener.WaitUntilSatisfied());
   }
diff --git a/chrome/updater/constants.cc b/chrome/updater/constants.cc
index 8bde3ba..b0694186 100644
--- a/chrome/updater/constants.cc
+++ b/chrome/updater/constants.cc
@@ -60,10 +60,6 @@
 const char kSessionIdSwitch[] = "sessionid";  // needs backward-compatibility
 const char kAppGuidSwitch[] = "appguid";
 
-#if BUILDFLAG(IS_WIN)
-const char kInstallFromOutDir[] = "install-from-out-dir";
-#endif  // BUILDFLAG(IS_WIN)
-
 const char kHealthCheckSwitch[] = "healthcheck";
 
 const char kHandoffSwitch[] = "handoff";        // needs backward-compatibility
diff --git a/chrome/updater/constants.h b/chrome/updater/constants.h
index f721596..26b7f02 100644
--- a/chrome/updater/constants.h
+++ b/chrome/updater/constants.h
@@ -89,14 +89,6 @@
 // UTF8 encoding as well as a UTF8 BOM.
 extern const char kInstallerDataSwitch[];
 
-#if BUILDFLAG(IS_WIN)
-// A debug switch to indicate that --install is running from the `out` directory
-// of the build. When this switch is present, the setup picks up the run time
-// dependencies of the updater from the `out` directory instead of using the
-// metainstaller uncompressed archive.
-extern const char kInstallFromOutDir[];
-#endif  // BUILDFLAG(IS_WIN)
-
 // Uninstalls the updater.
 extern const char kUninstallSwitch[];
 
diff --git a/chrome/updater/crash_reporter.cc b/chrome/updater/crash_reporter.cc
index 9cee1668..5100526 100644
--- a/chrome/updater/crash_reporter.cc
+++ b/chrome/updater/crash_reporter.cc
@@ -74,7 +74,7 @@
   const absl::optional<base::FilePath> database_path =
       GetVersionedDirectory(updater_scope);
   if (!database_path) {
-    LOG(DFATAL) << "Failed to get the database path.";
+    LOG(ERROR) << "Failed to get the database path.";
     return;
   }
 
diff --git a/chrome/updater/updater.cc b/chrome/updater/updater.cc
index 5e49a7b3..ca27751 100644
--- a/chrome/updater/updater.cc
+++ b/chrome/updater/updater.cc
@@ -54,9 +54,6 @@
 // directory of the build.
 // - To debug, append the following arguments to any updater command line:
 //    --enable-logging --vmodule=*/chrome/updater/*=2,*/components/winhttp/*=2.
-// - To run the `updater --install` from the `out` directory of the build,
-//   use --install-from-out-dir command line switch in addition to other
-//   arguments for --install.
 
 namespace updater {
 namespace {
diff --git a/chrome/updater/win/setup/setup.cc b/chrome/updater/win/setup/setup.cc
index 0b115df..ca57f339 100644
--- a/chrome/updater/win/setup/setup.cc
+++ b/chrome/updater/win/setup/setup.cc
@@ -77,11 +77,6 @@
 // of the updater (which is generated by GN at build time) is parsed, and the
 // relevant file names are extracted.
 std::vector<base::FilePath> GetSetupFiles(const base::FilePath& source_dir) {
-  const auto* command_line = base::CommandLine::ForCurrentProcess();
-  if (command_line->HasSwitch(kInstallFromOutDir)) {
-    return ParseFilesFromDeps(source_dir.Append(FILE_PATH_LITERAL(
-        "gen\\chrome\\updater\\win\\installer\\updater.runtime_deps")));
-  }
   std::vector<base::FilePath> result;
   base::FileEnumerator it(
       source_dir, false, base::FileEnumerator::FileType::FILES,
diff --git a/chrome/updater/win/setup/setup_util.cc b/chrome/updater/win/setup/setup_util.cc
index 254bac2..a19c110 100644
--- a/chrome/updater/win/setup/setup_util.cc
+++ b/chrome/updater/win/setup/setup_util.cc
@@ -328,27 +328,6 @@
   return index != kTypeLibIndexes.end() ? index->second : L"";
 }
 
-std::vector<base::FilePath> ParseFilesFromDeps(const base::FilePath& deps) {
-  constexpr size_t kDepsFileSizeMax = 0x4000;  // 16KB.
-  std::string contents;
-  if (!base::ReadFileToStringWithMaxSize(deps, &contents, kDepsFileSizeMax))
-    return {};
-  const base::flat_set<const wchar_t*, CaseInsensitiveASCIICompare>
-      exclude_extensions = {L".pdb", L".js"};
-  std::vector<base::FilePath> result;
-  for (const auto& line :
-       base::SplitString(contents, "\r\n", base::TRIM_WHITESPACE,
-                         base::SPLIT_WANT_NONEMPTY)) {
-    const auto filename =
-        base::FilePath(base::ASCIIToWide(line)).NormalizePathSeparators();
-    if (!base::Contains(exclude_extensions,
-                        filename.FinalExtension().c_str())) {
-      result.push_back(filename);
-    }
-  }
-  return result;
-}
-
 void RegisterUserRunAtStartup(const std::wstring& run_value_name,
                               const base::CommandLine& command,
                               WorkItemList* list) {
diff --git a/chrome/updater/win/setup/setup_util.h b/chrome/updater/win/setup/setup_util.h
index ea1cb6e..36a0464 100644
--- a/chrome/updater/win/setup/setup_util.h
+++ b/chrome/updater/win/setup/setup_util.h
@@ -84,12 +84,6 @@
                             bool internal_service,
                             WorkItemList* list);
 
-// Parses the run time dependency file which contains all dependencies of
-// the `updater` target. This file is a text file, where each line of
-// text represents a single dependency. Some dependencies are not needed for
-// updater to run, and are filtered out from the return value of this function.
-std::vector<base::FilePath> ParseFilesFromDeps(const base::FilePath& deps);
-
 // Adds a worklist item to set a value in the Run key in the user registry under
 // the value `run_value_name` to start the specified `command`.
 void RegisterUserRunAtStartup(const std::wstring& run_value_name,
diff --git a/chrome/updater/win/setup/setup_util_unittest.cc b/chrome/updater/win/setup/setup_util_unittest.cc
index 0f60c71..67513a10 100644
--- a/chrome/updater/win/setup/setup_util_unittest.cc
+++ b/chrome/updater/win/setup/setup_util_unittest.cc
@@ -10,22 +10,4 @@
 
 namespace updater {
 
-TEST(UpdaterSetupUtil, ParseFilesFromDeps) {
-  base::FilePath source_path;
-  ASSERT_TRUE(base::PathService::Get(base::DIR_SOURCE_ROOT, &source_path));
-  const base::FilePath deps = source_path.AppendASCII("chrome")
-                                  .AppendASCII("updater")
-                                  .AppendASCII("test")
-                                  .AppendASCII("data")
-                                  .AppendASCII("updater.runtime_deps");
-  const auto files = ParseFilesFromDeps(deps);
-  EXPECT_EQ(files.size(), 5u);
-  EXPECT_EQ(files[0], base::FilePath(FILE_PATH_LITERAL(".\\updater.exe")));
-  EXPECT_EQ(files[1], base::FilePath(FILE_PATH_LITERAL(".\\base.dll")));
-  EXPECT_EQ(files[2], base::FilePath(FILE_PATH_LITERAL("msvcp140d.dll")));
-  EXPECT_EQ(files[3], base::FilePath(FILE_PATH_LITERAL("icudtl.dat")));
-  EXPECT_EQ(files[4], base::FilePath(FILE_PATH_LITERAL(
-                          "gen\\chrome\\updater\\win\\uninstall.cmd")));
-}
-
 }  // namespace updater
diff --git a/chromeos/crosapi/mojom/arc.mojom b/chromeos/crosapi/mojom/arc.mojom
index edac26a0..58e2397d 100644
--- a/chromeos/crosapi/mojom/arc.mojom
+++ b/chromeos/crosapi/mojom/arc.mojom
@@ -11,31 +11,31 @@
 // TODO(crbug.com/1268687): It should be migrated to AppService in the future.
 
 // The status in ash-chrome side. Return with the result.
-[Stable]
+[Stable, Extensible]
 enum RequestActivityIconsStatus {
   // Connection established successfully in ash-chrome.
   kSuccess,
 
   // Ended with error to connect to ARC in ash-chrome.
-  kArcNotAvailable,
+  [Default] kArcNotAvailable,
 };
 
-[Stable]
+[Stable, Extensible]
 enum RequestTextSelectionActionsStatus {
   // Connection established successfully in ash-chrome.
   kSuccess,
 
   // Ended with error to connect to ARC in ash-chrome.
-  kArcNotAvailable,
+  [Default] kArcNotAvailable,
 };
 
-[Stable]
+[Stable, Extensible]
 enum RequestUrlHandlerListStatus {
   // Connection established successfully in ash-chrome.
   kSuccess,
 
   // Ended with error to connect to ARC in ash-chrome.
-  kArcNotAvailable,
+  [Default]kArcNotAvailable,
 };
 
 [Stable, Extensible]
diff --git a/chromeos/crosapi/mojom/crosapi.mojom b/chromeos/crosapi/mojom/crosapi.mojom
index c3f0700..f5ad45f 100644
--- a/chromeos/crosapi/mojom/crosapi.mojom
+++ b/chromeos/crosapi/mojom/crosapi.mojom
@@ -641,9 +641,8 @@
 };
 
 // The device specific data needed in Lacros.
-// Next version: 3
-// Next id: 4
-// TODO(igorcov): Include DeviceAttributes here.
+// Next version: 4
+// Next id: 9
 [Stable]
 struct DeviceProperties {
   // The value of device DM token. It is the raw data from the policy, not
@@ -662,6 +661,24 @@
 
   // Whether the device is of tablet form factor.
   [MinVersion=2] bool is_tablet_form_factor@3;
+
+  // The value of the device identifier of the directory API that is
+  // generated by the server and identifies the cloud record of the device for
+  // querying in the cloud directory API. See
+  // https://developers.google.com/admin-sdk/directory/v1/guides/manage-chrome-devices.
+  [MinVersion=3] string? directory_device_id@4;
+
+  // The device's serial number.
+  [MinVersion=3] string? serial_number@5;
+
+  // The administrator-annotated Asset Id.
+  [MinVersion=3] string? annotated_asset_id@6;
+
+  // The administrator-annotated location.
+  [MinVersion=3] string? annotated_location@7;
+
+  // The device's hostname as set by DeviceHostnameTemplate policy.
+  [MinVersion=3] string? hostname@8;
 };
 
 [Stable, Extensible]
@@ -1074,6 +1091,19 @@
   WindowOpenDisposition disposition@0;
 
   [MinVersion=1] OpenUrlFrom from@1;
+
+  // Decides how the URL's path is to be considered when WindowOpenDisposition
+  // is kSwitchToTab, i.e. a search is performed for an existing tab that
+  // matches a given URL.
+  [Stable, Extensible]
+  enum SwitchToTabPathBehavior {
+    // If the two paths are different, the URLs do not match.
+    [Default] kRespect = 0,
+
+    // Path is ignored when testing two URLs for a match.
+    kIgnore = 1,
+  };
+  [MinVersion=2] SwitchToTabPathBehavior path_behavior@2;
 };
 
 // BrowserService defines the APIs that live in a browser (such as
diff --git a/chromeos/crosapi/mojom/prefs.mojom b/chromeos/crosapi/mojom/prefs.mojom
index ddb3180..cf264302 100644
--- a/chromeos/crosapi/mojom/prefs.mojom
+++ b/chromeos/crosapi/mojom/prefs.mojom
@@ -87,6 +87,8 @@
   [MinVersion=4] kApplicationLocale = 29,
   // M104: prefs::kSharedStorage (profile)
   [MinVersion=5] kSharedStorage = 30,
+  // M104: prefs::kProtectedContentDefault (extension)
+  [MinVersion=6] kProtectedContentDefault = 31,
 };
 
 // Information about who or what is controlling a particular pref. This is used
@@ -122,7 +124,7 @@
 };
 
 // Interface for prefs. Implemented by ash-chrome.
-// Next version: 3
+// Next version: 4
 // Next method id: 5
 [Stable, Uuid="815df607-0596-46f7-9ed9-14683b4826a3"]
 interface Prefs {
@@ -132,7 +134,7 @@
 
   // Gets the specified ash pref. Additionally returns the control state of the
   // pref.
-  [MinVersion=2]
+  [MinVersion=3]
   GetExtensionPrefWithControl@3(PrefPath path) => (
     mojo_base.mojom.Value? value, PrefControlState control);
 
diff --git a/chromeos/network/network_state.cc b/chromeos/network/network_state.cc
index d4b0fff..ff65beb9 100644
--- a/chromeos/network/network_state.cc
+++ b/chromeos/network/network_state.cc
@@ -668,13 +668,10 @@
 
   UMA_HISTOGRAM_ENUMERATION("CaptivePortal.NetworkStateResult", portal_state_);
   if (portal_state_ != PortalState::kOnline) {
-    portal_status_code_ = status_code;
     NET_LOG(EVENT) << "Network is in captive portal state: " << NetworkId(this)
-                   << " status_code=" << portal_status_code_;
+                   << " status_code=" << status_code;
     base::UmaHistogramSparse("CaptivePortal.NetworkStateStatusCode",
-                             std::abs(portal_status_code_));
-  } else {
-    portal_status_code_ = 0;
+                             std::abs(status_code));
   }
 }
 
diff --git a/chromeos/network/network_state.h b/chromeos/network/network_state.h
index c09f05a06..8acf9a4 100644
--- a/chromeos/network/network_state.h
+++ b/chromeos/network/network_state.h
@@ -369,7 +369,6 @@
 
   // Portal state is derived from connection_state_ and Shill portal properties.
   PortalState portal_state_ = PortalState::kUnknown;
-  int portal_status_code_ = 0;
 
   // Whether the current device has already connected to the tether host device
   // providing the hotspot corresponding to this NetworkState.
diff --git a/components/autofill_assistant/browser/headless/client_headless.cc b/components/autofill_assistant/browser/headless/client_headless.cc
index d34cfca..902d818c 100644
--- a/components/autofill_assistant/browser/headless/client_headless.cc
+++ b/components/autofill_assistant/browser/headless/client_headless.cc
@@ -123,8 +123,7 @@
 }
 
 WebsiteLoginManager* ClientHeadless::GetWebsiteLoginManager() const {
-  // TODO(b/201964911): return instance.
-  return nullptr;
+  return website_login_manager_.get();
 }
 
 password_manager::PasswordChangeSuccessTracker*
diff --git a/components/autofill_assistant/browser/public/BUILD.gn b/components/autofill_assistant/browser/public/BUILD.gn
index 2f276680..d19f754 100644
--- a/components/autofill_assistant/browser/public/BUILD.gn
+++ b/components/autofill_assistant/browser/public/BUILD.gn
@@ -49,6 +49,8 @@
   sources = [
     "mock_autofill_assistant.cc",
     "mock_autofill_assistant.h",
+    "mock_external_script_controller.cc",
+    "mock_external_script_controller.h",
     "mock_runtime_manager.cc",
     "mock_runtime_manager.h",
   ]
diff --git a/components/autofill_assistant/browser/public/mock_external_script_controller.cc b/components/autofill_assistant/browser/public/mock_external_script_controller.cc
new file mode 100644
index 0000000..b4f88b3
--- /dev/null
+++ b/components/autofill_assistant/browser/public/mock_external_script_controller.cc
@@ -0,0 +1,13 @@
+// Copyright 2022 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 "components/autofill_assistant/browser/public/mock_external_script_controller.h"
+
+namespace autofill_assistant {
+
+MockExternalScriptController::MockExternalScriptController() = default;
+
+MockExternalScriptController::~MockExternalScriptController() = default;
+
+}  // namespace autofill_assistant
diff --git a/components/autofill_assistant/browser/public/mock_external_script_controller.h b/components/autofill_assistant/browser/public/mock_external_script_controller.h
new file mode 100644
index 0000000..00e1680
--- /dev/null
+++ b/components/autofill_assistant/browser/public/mock_external_script_controller.h
@@ -0,0 +1,28 @@
+// Copyright 2022 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 COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_PUBLIC_MOCK_EXTERNAL_SCRIPT_CONTROLLER_H_
+#define COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_PUBLIC_MOCK_EXTERNAL_SCRIPT_CONTROLLER_H_
+
+#include "base/callback_helpers.h"
+#include "components/autofill_assistant/browser/public/external_script_controller.h"
+#include "testing/gmock/include/gmock/gmock.h"
+
+namespace autofill_assistant {
+
+class MockExternalScriptController : public ExternalScriptController {
+ public:
+  MockExternalScriptController();
+  ~MockExternalScriptController() override;
+
+  MOCK_METHOD(void,
+              StartScript,
+              ((const base::flat_map<std::string, std::string>&),
+               (base::OnceCallback<void(ScriptResult)>)),
+              (override));
+};
+
+}  // namespace autofill_assistant
+
+#endif  // COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_PUBLIC_MOCK_EXTERNAL_SCRIPT_CONTROLLER_H_
diff --git a/components/blocked_content/safe_browsing_triggered_popup_blocker_unittest.cc b/components/blocked_content/safe_browsing_triggered_popup_blocker_unittest.cc
index dfb6e0e..f0f5891 100644
--- a/components/blocked_content/safe_browsing_triggered_popup_blocker_unittest.cc
+++ b/components/blocked_content/safe_browsing_triggered_popup_blocker_unittest.cc
@@ -590,6 +590,7 @@
       content::NavigationSimulator::CreateRendererInitiated(fenced_frame_url,
                                                             fenced_frame_root);
   navigation_simulator->Commit();
+  fenced_frame_root = navigation_simulator->GetFinalRenderFrameHost();
 
   // The popup blocker is not triggered for a fenced frame.
   EXPECT_FALSE(popup_blocker()->ShouldApplyAbusivePopupBlocker(
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/tile/TileView.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/tile/TileView.java
index eafa673..2e0d0e7 100644
--- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/tile/TileView.java
+++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/tile/TileView.java
@@ -5,6 +5,7 @@
 package org.chromium.components.browser_ui.widget.tile;
 
 import android.content.Context;
+import android.content.res.ColorStateList;
 import android.graphics.drawable.Drawable;
 import android.util.AttributeSet;
 import android.widget.FrameLayout;
@@ -13,6 +14,7 @@
 
 import androidx.annotation.VisibleForTesting;
 
+import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.components.browser_ui.widget.R;
 import org.chromium.components.browser_ui.widget.RoundedCornerOutlineProvider;
 
@@ -78,6 +80,13 @@
         mIconView.setImageDrawable(icon);
     }
 
+    /**
+     * Applies or clears icon tint.
+     */
+    public void setIconTint(ColorStateList color) {
+        ApiCompatibilityUtils.setImageTintList(mIconView, color);
+    }
+
     /** Shows or hides the offline badge to reflect the offline availability. */
     protected void setOfflineBadgeVisibility(boolean showOfflineBadge) {
         mBadgeView.setVisibility(showOfflineBadge ? VISIBLE : GONE);
diff --git a/components/certificate_transparency/data/log_list.json b/components/certificate_transparency/data/log_list.json
index d806b54..d86f90d 100644
--- a/components/certificate_transparency/data/log_list.json
+++ b/components/certificate_transparency/data/log_list.json
@@ -1,6 +1,6 @@
 {
-  "version": "9.29",
-  "log_list_timestamp": "2022-05-31T12:56:20Z",
+  "version": "9.30",
+  "log_list_timestamp": "2022-06-01T12:54:29Z",
   "operators": [
     {
       "name": "Google",
diff --git a/components/enterprise/browser/reporting/real_time_uploader.cc b/components/enterprise/browser/reporting/real_time_uploader.cc
index faf959e..3e48b6e 100644
--- a/components/enterprise/browser/reporting/real_time_uploader.cc
+++ b/components/enterprise/browser/reporting/real_time_uploader.cc
@@ -114,12 +114,12 @@
 }
 
 void RealTimeUploader::UploadClosure(
-    std::unique_ptr<google::protobuf::MessageLite> report,
+    std::unique_ptr<const google::protobuf::MessageLite> report,
     EnqueueCallback callback) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   DCHECK(report_queue_);
   report_queue_->Enqueue(
-      report.get(), report_priority_,
+      std::move(report), report_priority_,
       base::BindPostTask(
           base::ThreadTaskRunnerHandle::Get(),
           base::BindOnce(&RealTimeUploader::OnReportEnqueued,
diff --git a/components/enterprise/browser/reporting/real_time_uploader.h b/components/enterprise/browser/reporting/real_time_uploader.h
index 2ee5830..0de77453 100644
--- a/components/enterprise/browser/reporting/real_time_uploader.h
+++ b/components/enterprise/browser/reporting/real_time_uploader.h
@@ -57,8 +57,9 @@
       reporting::ReportQueueProvider::CreateReportQueueResponse
           create_report_queue_response);
 
-  void UploadClosure(std::unique_ptr<google::protobuf::MessageLite> report,
-                     EnqueueCallback callback);
+  void UploadClosure(
+      std::unique_ptr<const google::protobuf::MessageLite> report,
+      EnqueueCallback callback);
   void OnReportEnqueued(EnqueueCallback callback, reporting::Status status);
 
   std::unique_ptr<reporting::ReportQueue> report_queue_;
diff --git a/components/enterprise/browser/reporting/real_time_uploader_unittest.cc b/components/enterprise/browser/reporting/real_time_uploader_unittest.cc
index 063ad6d..a9adceb 100644
--- a/components/enterprise/browser/reporting/real_time_uploader_unittest.cc
+++ b/components/enterprise/browser/reporting/real_time_uploader_unittest.cc
@@ -19,6 +19,7 @@
 using ::testing::_;
 using ::testing::InSequence;
 using ::testing::Invoke;
+using ::testing::StrEq;
 using ::testing::WithArg;
 
 namespace enterprise_reporting {
@@ -159,7 +160,7 @@
     InSequence sequence;
 
     EXPECT_CALL(*uploader_->mock_report_queue(),
-                AddRecord(base::StringPiece(expected_report_1), kPriority, _))
+                AddRecord(StrEq(expected_report_1), kPriority, _))
         .Times(1)
         .WillOnce(WithArg<2>(
             Invoke([](reporting::ReportQueue::EnqueueCallback callback) {
@@ -169,7 +170,7 @@
             })));
 
     EXPECT_CALL(*uploader_->mock_report_queue(),
-                AddRecord(base::StringPiece(expected_report_2), kPriority, _))
+                AddRecord(StrEq(expected_report_2), kPriority, _))
         .Times(1)
         .WillOnce(WithArg<2>(
             Invoke([](reporting::ReportQueue::EnqueueCallback callback) {
@@ -207,7 +208,7 @@
 
   EXPECT_CALL(*uploader_->mock_report_queue(),
 
-              AddRecord(base::StringPiece(expected_report), kPriority, _))
+              AddRecord(StrEq(expected_report), kPriority, _))
       .Times(1)
       .WillOnce(WithArg<2>(
           Invoke([](reporting::ReportQueue::EnqueueCallback callback) {
diff --git a/components/feedback/pii_types.h b/components/feedback/pii_types.h
index 8a6425a..38bfc9f7 100644
--- a/components/feedback/pii_types.h
+++ b/components/feedback/pii_types.h
@@ -18,26 +18,23 @@
   // components following <package_name>/ are app specific and will be
   // considered as PII sensitive data.
   kAndroidAppStoragePath,
-  // BSSID (Basic Service Set Identifier) of a wifi service.
-  kBSSID,
-  // Unique identifier of the cell of the Cell tower object that's used by
-  // ModemManager.
-  kCellID,
   // Email addresses.
   kEmail,
   // GAIA (Google Accounts and ID Administration) ID. Gaia ID is a 64-bit
   // integer.
   kGaiaID,
-  // Hexadecimal strings of length 32, 40 and 64 are considered to be hashes.
-  kHash,
   // IPP (Internet Printing Protocol) Addresses.
   kIPPAddress,
   // IP (Internet Protocol) address. Stores data in two versions: IPv4 (e.g.
   // 127.0.0.1) or IPv6 (e.g. 2001:0db8:85a3:0000:0000:8a2e:0370:7334).
   kIPAddress,
-  // The Location Area Code (LAC) for GSM and WCDMA networks of the Cell tower
-  // object that's used by ModemManager.
-  kLocationAreaCode,
+  // Location information related to Cell tower object that's used by
+  // ModemManager. Contains two type of data:
+  // 1- The Location Area Code (LAC) for GSM and WCDMA networks of the Cell
+  // tower object that's used by ModemManager.
+  // 2- Cell ID as unique identifier of the cell of the Cell tower object that's
+  // used by ModemManager.
+  kLocationInfo,
   // MAC address is a unique identifier assigned to a network interface
   // controller (NIC) for use as a network address in communications within a
   // network segment (e.g 00:00:5e:00:53:af). MAC addresses with general meaning
@@ -48,14 +45,18 @@
   kUIHierarchyWindowTitles,
   // URLs that can appear in logs.
   kURL,
-  // Universal Unique Identifiers (UUIDs). UUID can also be given by 'blkid',
-  // 'lvs' and 'pvs' tools.
-  kUUID,
   // Serial numbers.
   kSerial,
   // SSID (Service Set Identifier) of wifi networks can be detected in the logs
-  // provided by wpa_supplicant and shill.
+  // provided by wpa_supplicant and shill. BSSID (Basic Service Set Identifier)
+  // of a wifi service, is also categorized under this.
   kSSID,
+  // Stable identifiers. Contains information in two main categories:
+  // 1- Universal Unique Identifiers (UUIDs): UUID can also be given by 'blkid',
+  // 'lvs' and 'pvs' tools.
+  // 2- Hashes: Hexadecimal strings of length 32, 40 and 64 are considered to be
+  // hashes.
+  kStableIdentifier,
   // Volume labels presented in the 'blkid' tool, and as part of removable
   // media paths shown in various logs such as cros-disks (in syslog).
   kVolumeLabel,
diff --git a/components/feedback/redaction_tool.cc b/components/feedback/redaction_tool.cc
index c26504b..ddc3fb88 100644
--- a/components/feedback/redaction_tool.cc
+++ b/components/feedback/redaction_tool.cc
@@ -49,9 +49,9 @@
 // (?:regex) denotes non-capturing parentheses group.
 CustomPatternWithAlias kCustomPatternsWithContext[] = {
     // ModemManager
-    {"CellID", "(\\bCell ID: ')([0-9a-fA-F]+)(')", PIIType::kCellID},
+    {"CellID", "(\\bCell ID: ')([0-9a-fA-F]+)(')", PIIType::kLocationInfo},
     {"LocAC", "(\\bLocation area code: ')([0-9a-fA-F]+)(')",
-     PIIType::kLocationAreaCode},
+     PIIType::kLocationInfo},
 
     // wpa_supplicant
     {"SSID", "(?i-s)(\\bssid[= ]')(.+)(')", PIIType::kSSID},
@@ -87,10 +87,11 @@
 
     // UUIDs given by the 'blkid' tool. These don't necessarily look like
     // standard UUIDs, so treat them specially.
-    {"UUID", R"xxx((UUID=")([0-9a-zA-Z-]+)("))xxx", PIIType::kUUID},
+    {"UUID", R"xxx((UUID=")([0-9a-zA-Z-]+)("))xxx", PIIType::kStableIdentifier},
     // Also cover UUIDs given by the 'lvs' and 'pvs' tools, which similarly
     // don't necessarily look like standard UUIDs.
-    {"UUID", R"xxx(("[lp]v_uuid":")([0-9a-zA-Z-]+)("))xxx", PIIType::kUUID},
+    {"UUID", R"xxx(("[lp]v_uuid":")([0-9a-zA-Z-]+)("))xxx",
+     PIIType::kStableIdentifier},
 
     // Volume labels presented in the 'blkid' tool, and as part of removable
     // media paths shown in various logs such as cros-disks (in syslog).
@@ -387,7 +388,7 @@
     {"UUID",
      "(?i)([0-9a-zA-Z]{8}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-"
      "[0-9a-zA-Z]{12})",
-     PIIType::kUUID},
+     PIIType::kStableIdentifier},
 };
 
 // Like RE2's FindAndConsume, searches for the first occurrence of |pattern| in
@@ -503,10 +504,11 @@
 
   // Do hashes last since they may appear in URLs and they also prevent us
   // from properly recognizing the Android storage paths.
-  if (pii_types_to_keep.find(PIIType::kHash) == pii_types_to_keep.end()) {
+  if (pii_types_to_keep.find(PIIType::kStableIdentifier) ==
+      pii_types_to_keep.end()) {
     // URLs and Android storage paths will be partially redacted (only hashes)
     // if |pii_types_to_keep| contains PIIType::kURL or
-    // PIIType::kAndroidAppStoragePath and not PIIType::kHash.
+    // PIIType::kAndroidAppStoragePath and not PIIType::kStableIdentifier.
     redacted = RedactHashes(std::move(redacted), nullptr);
   }
   return redacted;
@@ -624,7 +626,7 @@
       hashes_[hash] = replacement_hash;
     }
     if (detected != nullptr) {
-      (*detected)[PIIType::kHash].insert(hash);
+      (*detected)[PIIType::kStableIdentifier].insert(hash);
     }
 
     result += replacement_hash;
diff --git a/components/feedback/redaction_tool_unittest.cc b/components/feedback/redaction_tool_unittest.cc
index ede2365..445e8202 100644
--- a/components/feedback/redaction_tool_unittest.cc
+++ b/components/feedback/redaction_tool_unittest.cc
@@ -36,7 +36,8 @@
      "aaaaaaaa [SSID=<SSID: 1>]aaaaa", PIIType::kSSID},
     {"aaaaaaaahttp://tets.comaaaaaaa",  // URL.
      "aaaaaaaa<URL: 1>", PIIType::kURL},
-    {"u:object_r:system_data_file:s0:c512,c768",  // No PII, it is an SELinux context.
+    {"u:object_r:system_data_file:s0:c512,c768",  // No PII, it is an SELinux
+                                                  // context.
      "u:object_r:system_data_file:s0:c512,c768", PIIType::kNone},
     {"aaaaaemail@example.comaaa",  // Email address.
      "<email: 1>", PIIType::kEmail},
@@ -181,7 +182,7 @@
     {"chrome-extension://nkoccljplnhpfnfiajclkommnmllphnl/foobar.js?bar=x",
      "<URL: 3>", PIIType::kURL},  // Potentially PII in parameter.
     {"/root/27540283740a0897ab7c8de0f809add2bacde78f/foo",
-     "/root/<HASH:2754 1>/foo", PIIType::kHash},  // Hash string.
+     "/root/<HASH:2754 1>/foo", PIIType::kStableIdentifier},  // Hash string.
 #if BUILDFLAG(IS_CHROMEOS_ASH)    // We only redact Android paths on Chrome OS.
     // Allowed android storage path.
     {"112K\t/home/root/deadbeef1234/android-data/data/system_de",
@@ -468,11 +469,11 @@
   // The PIIType for the CustomPatternWithAlias is not relevant, only for
   // testing.
   const CustomPatternWithAlias kPattern1 = {"ID", "(\\b(?i)id:? ')(\\d+)(')",
-                                            PIIType::kUUID};
+                                            PIIType::kStableIdentifier};
   const CustomPatternWithAlias kPattern2 = {"ID", "(\\b(?i)id=')(\\d+)(')",
-                                            PIIType::kUUID};
+                                            PIIType::kStableIdentifier};
   const CustomPatternWithAlias kPattern3 = {"IDG", "(\\b(?i)idg=')(\\d+)(')",
-                                            PIIType::kCellID};
+                                            PIIType::kLocationInfo};
   EXPECT_EQ("", RedactCustomPatternWithContext("", kPattern1));
   EXPECT_EQ("foo\nbar\n",
             RedactCustomPatternWithContext("foo\nbar\n", kPattern1));
@@ -543,15 +544,17 @@
   // will be redacted with the URL or Android storage path that they're part of.
   std::string redaction_output_mac_and_hashes;
   for (const auto& s : kStringsWithRedactions) {
-    if (s.pii_type == PIIType::kMACAddress || s.pii_type == PIIType::kHash) {
+    if (s.pii_type == PIIType::kMACAddress ||
+        s.pii_type == PIIType::kStableIdentifier) {
       redaction_output_mac_and_hashes.append(s.pre_redaction).append("\n");
     } else {
       redaction_output_mac_and_hashes.append(s.post_redaction).append("\n");
     }
   }
-  EXPECT_EQ(redaction_output_mac_and_hashes,
-            redactor_.RedactAndKeepSelected(
-                redaction_input, {PIIType::kMACAddress, PIIType::kHash}));
+  EXPECT_EQ(
+      redaction_output_mac_and_hashes,
+      redactor_.RedactAndKeepSelected(
+          redaction_input, {PIIType::kMACAddress, PIIType::kStableIdentifier}));
 }
 
 TEST_F(RedactionToolTest, RedactAndKeepSelectedHashes) {
@@ -652,7 +655,9 @@
              "::0101:ffff:c0a8:640a",
          }},
         {PIIType::kMACAddress, {"aa:aa:aa:aa:aa:aa"}}, {
-      PIIType::kHash, { "27540283740a0897ab7c8de0f809add2bacde78f" }
+      PIIType::kStableIdentifier, {
+        "27540283740a0897ab7c8de0f809add2bacde78f"
+      }
     }
   };
 
diff --git a/components/flags_ui/resources/flags.css b/components/flags_ui/resources/flags.css
index 5a3ad4d..f9cfc01 100644
--- a/components/flags_ui/resources/flags.css
+++ b/components/flags_ui/resources/flags.css
@@ -35,7 +35,7 @@
   --google-red-300: rgb(242, 139, 130);
   --google-red-700: rgb(197, 34, 31);
 
-  --interactive-color: var(--google-blue-500);
+  --interactive-color: var(--google-blue-600);
   --primary-color: var(--google-grey-900);
   --secondary-color: var(--google-grey-700);
   --warning-color: var(--google-red-700);
diff --git a/components/history/core/browser/history_types.cc b/components/history/core/browser/history_types.cc
index 7ca62a8..a9d1ef02 100644
--- a/components/history/core/browser/history_types.cc
+++ b/components/history/core/browser/history_types.cc
@@ -421,15 +421,28 @@
 ClusterVisit& ClusterVisit::operator=(const ClusterVisit&) = default;
 ClusterVisit& ClusterVisit::operator=(ClusterVisit&&) = default;
 
+ClusterKeywordData::ClusterKeywordData() = default;
+ClusterKeywordData::ClusterKeywordData(
+    const std::vector<std::string>& entity_collections)
+    : entity_collections(entity_collections) {}
+ClusterKeywordData::ClusterKeywordData(const ClusterKeywordData&) = default;
+ClusterKeywordData::ClusterKeywordData(ClusterKeywordData&&) = default;
+ClusterKeywordData& ClusterKeywordData::operator=(const ClusterKeywordData&) =
+    default;
+ClusterKeywordData& ClusterKeywordData::operator=(ClusterKeywordData&&) =
+    default;
+ClusterKeywordData::~ClusterKeywordData() = default;
+
 Cluster::Cluster() = default;
 Cluster::Cluster(int64_t cluster_id,
                  const std::vector<ClusterVisit>& visits,
-                 const std::vector<std::u16string>& keywords,
+                 const base::flat_map<std::u16string, ClusterKeywordData>&
+                     keyword_to_data_map,
                  bool should_show_on_prominent_ui_surfaces,
                  absl::optional<std::u16string> label)
     : cluster_id(cluster_id),
       visits(visits),
-      keywords(keywords),
+      keyword_to_data_map(keyword_to_data_map),
       should_show_on_prominent_ui_surfaces(
           should_show_on_prominent_ui_surfaces),
       label(label) {}
@@ -439,6 +452,14 @@
 Cluster& Cluster::operator=(Cluster&&) = default;
 Cluster::~Cluster() = default;
 
+std::vector<std::u16string> Cluster::GetKeywords() const {
+  std::vector<std::u16string> keywords;
+  for (const auto& p : keyword_to_data_map) {
+    keywords.push_back(p.first);
+  }
+  return keywords;
+}
+
 ClusterRow::ClusterRow() = default;
 ClusterRow::ClusterRow(int64_t cluster_id) : cluster_id(cluster_id) {}
 ClusterRow::ClusterRow(const ClusterRow&) = default;
diff --git a/components/history/core/browser/history_types.h b/components/history/core/browser/history_types.h
index 94ee0b4f..174c403 100644
--- a/components/history/core/browser/history_types.h
+++ b/components/history/core/browser/history_types.h
@@ -15,6 +15,7 @@
 #include <vector>
 
 #include "base/callback.h"
+#include "base/containers/flat_map.h"
 #include "base/containers/stack_container.h"
 #include "base/time/time.h"
 #include "components/favicon_base/favicon_types.h"
@@ -881,13 +882,29 @@
   bool hidden = false;
 };
 
+// Additional data for a cluster keyword.
+struct ClusterKeywordData {
+  ClusterKeywordData();
+  explicit ClusterKeywordData(
+      const std::vector<std::string>& entity_collections);
+  ClusterKeywordData(const ClusterKeywordData&);
+  ClusterKeywordData(ClusterKeywordData&&);
+  ClusterKeywordData& operator=(const ClusterKeywordData&);
+  ClusterKeywordData& operator=(ClusterKeywordData&&);
+  ~ClusterKeywordData();
+
+  // Entity collections associated with the keyword this is attached to.
+  std::vector<std::string> entity_collections;
+};
+
 // A cluster of `ClusterVisit`s with associated metadata (i.e. `keywords` and
 // `should_show_on_prominent_ui_surfaces`).
 struct Cluster {
   Cluster();
   Cluster(int64_t cluster_id,
           const std::vector<ClusterVisit>& visits,
-          const std::vector<std::u16string>& keywords,
+          const base::flat_map<std::u16string, ClusterKeywordData>&
+              keyword_to_data_map,
           bool should_show_on_prominent_ui_surfaces = true,
           absl::optional<std::u16string> label = absl::nullopt);
   Cluster(const Cluster&);
@@ -896,11 +913,16 @@
   Cluster& operator=(Cluster&&);
   ~Cluster();
 
+  std::vector<std::u16string> GetKeywords() const;
+
   int64_t cluster_id = 0;
   std::vector<ClusterVisit> visits;
-  // TODO(manukh): retrieve and persist `keywords`,
+  // TODO(manukh): retrieve and persist `keyword_to_data_map`,
   // `should_show_on_prominent_ui_surfaces, and `label`.
-  std::vector<std::u16string> keywords;
+
+  // A map of keywords to additional data.
+  base::flat_map<std::u16string, ClusterKeywordData> keyword_to_data_map;
+
   // Whether the cluster should be shown prominently on UI surfaces.
   bool should_show_on_prominent_ui_surfaces = true;
 
diff --git a/components/history_clusters/core/history_clusters_debug_jsons.cc b/components/history_clusters/core/history_clusters_debug_jsons.cc
index 51848a5..d699fd1 100644
--- a/components/history_clusters/core/history_clusters_debug_jsons.cc
+++ b/components/history_clusters/core/history_clusters_debug_jsons.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "base/json/json_writer.h"
+#include "base/strings/utf_string_conversions.h"
 #include "base/values.h"
 
 namespace history_clusters {
@@ -55,11 +56,19 @@
     base::DictionaryValue debug_cluster;
 
     debug_cluster.SetStringKey("label", cluster.label.value_or(u""));
-    base::ListValue debug_keywords;
-    for (const auto& keyword : cluster.keywords) {
-      debug_keywords.Append(keyword);
+    base::DictionaryValue debug_keyword_to_data_map;
+    for (const auto& keyword_data_p : cluster.keyword_to_data_map) {
+      base::ListValue debug_collection;
+      for (const auto& collection : keyword_data_p.second.entity_collections) {
+        debug_collection.Append(collection);
+      }
+      base::DictionaryValue debug_keyword_data;
+      debug_keyword_data.SetKey("collections", std::move(debug_collection));
+      debug_keyword_to_data_map.SetKey(base::UTF16ToUTF8(keyword_data_p.first),
+                                       std::move(debug_keyword_data));
     }
-    debug_cluster.SetKey("keywords", std::move(debug_keywords));
+    debug_cluster.SetKey("keyword_to_data_map",
+                         std::move(debug_keyword_to_data_map));
     debug_cluster.SetBoolKey("should_show_on_prominent_ui_surfaces",
                              cluster.should_show_on_prominent_ui_surfaces);
 
diff --git a/components/history_clusters/core/history_clusters_service.cc b/components/history_clusters/core/history_clusters_service.cc
index 8b94bdd0..964e0b4 100644
--- a/components/history_clusters/core/history_clusters_service.cc
+++ b/components/history_clusters/core/history_clusters_service.cc
@@ -303,8 +303,8 @@
     // Lowercase the keywords for case insensitive matching while adding to the
     // accumulator.
     if (keyword_accumulator->size() < max_keyword_phrases) {
-      for (auto& keyword : cluster.keywords) {
-        keyword_accumulator->insert(base::i18n::ToLower(keyword));
+      for (const auto& keyword_data : cluster.keyword_to_data_map) {
+        keyword_accumulator->insert(base::i18n::ToLower(keyword_data.first));
       }
     }
 
diff --git a/components/history_clusters/core/history_clusters_service_unittest.cc b/components/history_clusters/core/history_clusters_service_unittest.cc
index 60182244..719cc1a 100644
--- a/components/history_clusters/core/history_clusters_service_unittest.cc
+++ b/components/history_clusters/core/history_clusters_service_unittest.cc
@@ -418,9 +418,9 @@
                              .is_existing_part_of_tab_group);
             EXPECT_FLOAT_EQ(visits[1].score, 0.5);
 
-            ASSERT_EQ(cluster.keywords.size(), 2u);
-            EXPECT_EQ(cluster.keywords[0], u"apples");
-            EXPECT_EQ(cluster.keywords[1], u"Red Oranges");
+            ASSERT_EQ(cluster.keyword_to_data_map.size(), 2u);
+            EXPECT_TRUE(cluster.keyword_to_data_map.contains(u"apples"));
+            EXPECT_TRUE(cluster.keyword_to_data_map.contains(u"Red Oranges"));
 
             cluster = clusters[1];
             visits = cluster.visits;
@@ -431,7 +431,7 @@
                       GetHardcodedTestVisits()[1].visit_row.visit_time);
             EXPECT_EQ(visits[0].annotated_visit.url_row.title(),
                       u"Code Storage Title");
-            EXPECT_TRUE(cluster.keywords.empty());
+            EXPECT_TRUE(cluster.keyword_to_data_map.empty());
 
             run_loop_quit.Run();
           }));
@@ -445,7 +445,8 @@
                            test_clustering_backend_->GetVisitById(2),
                            test_clustering_backend_->GetVisitById(5),
                        },
-                       {u"apples", u"Red Oranges"},
+                       {{u"apples", history::ClusterKeywordData()},
+                        {u"Red Oranges", history::ClusterKeywordData()}},
                        /*should_show_on_prominent_ui_surfaces=*/true));
   clusters.push_back(
       history::Cluster(0,
@@ -618,7 +619,10 @@
                              test_clustering_backend_->GetVisitById(5),
                              test_clustering_backend_->GetVisitById(2),
                          },
-                         {u"apples", u"oranges", u"z", u"apples bananas"},
+                         {{u"apples", history::ClusterKeywordData()},
+                          {u"oranges", history::ClusterKeywordData()},
+                          {u"z", history::ClusterKeywordData()},
+                          {u"apples bananas", history::ClusterKeywordData()}},
                          /*should_show_on_prominent_ui_surfaces=*/true));
     clusters.push_back(
         history::Cluster(0,
@@ -626,14 +630,14 @@
                              test_clustering_backend_->GetVisitById(5),
                              test_clustering_backend_->GetVisitById(2),
                          },
-                         {u"sensitive"},
+                         {{u"sensitive", history::ClusterKeywordData()}},
                          /*should_show_on_prominent_ui_surfaces=*/false));
     clusters.push_back(
         history::Cluster(0,
                          {
                              test_clustering_backend_->GetVisitById(5),
                          },
-                         {u"singlevisit"},
+                         {{u"singlevisit", history::ClusterKeywordData()}},
                          /*should_show_on_prominent_ui_surfaces=*/true));
 
     test_clustering_backend_->FulfillCallback(clusters);
@@ -738,7 +742,8 @@
                            test_clustering_backend_->GetVisitById(1),
                            test_clustering_backend_->GetVisitById(2),
                        },
-                       {u"peach", u""},
+                       {{u"peach", history::ClusterKeywordData()},
+                        {u"", history::ClusterKeywordData()}},
                        /*should_show_on_prominent_ui_surfaces=*/true));
   test_clustering_backend_->FulfillCallback(clusters2);
   history::BlockUntilHistoryProcessesPendingRequests(history_service_.get());
@@ -774,7 +779,10 @@
             test_clustering_backend_->GetVisitById(
                 /*visit_id=*/2, /*score=*/0.0, /*engagement_score=*/20.0),
         },
-        {u"apples", u"oranges", u"z", u"apples bananas"},
+        {{u"apples", history::ClusterKeywordData()},
+         {u"oranges", history::ClusterKeywordData()},
+         {u"z", history::ClusterKeywordData()},
+         {u"apples bananas", history::ClusterKeywordData()}},
         /*should_show_on_prominent_ui_surfaces=*/true));
     clusters.push_back(
         history::Cluster(0,
@@ -782,14 +790,14 @@
                              test_clustering_backend_->GetVisitById(5),
                              test_clustering_backend_->GetVisitById(2),
                          },
-                         {u"sensitive"},
+                         {{u"sensitive", history::ClusterKeywordData()}},
                          /*should_show_on_prominent_ui_surfaces=*/false));
     clusters.push_back(
         history::Cluster(0,
                          {
                              test_clustering_backend_->GetVisitById(2),
                          },
-                         {u"singlevisit"},
+                         {{u"singlevisit", history::ClusterKeywordData()}},
                          /*should_show_on_prominent_ui_surfaces=*/true));
 
     test_clustering_backend_->FulfillCallback(clusters);
@@ -862,7 +870,10 @@
             test_clustering_backend_->GetVisitById(
                 /*visit_id=*/2, /*score=*/0.0, /*engagement_score=*/20.0),
         },
-        {u"apples", u"oranges", u"z", u"apples bananas"},
+        {{u"apples", history::ClusterKeywordData()},
+         {u"oranges", history::ClusterKeywordData()},
+         {u"z", history::ClusterKeywordData()},
+         {u"apples bananas", history::ClusterKeywordData()}},
         /*should_show_on_prominent_ui_surfaces=*/true));
     clusters.push_back(
         history::Cluster(0,
@@ -870,14 +881,14 @@
                              test_clustering_backend_->GetVisitById(5),
                              test_clustering_backend_->GetVisitById(2),
                          },
-                         {u"sensitive"},
+                         {{u"sensitive", history::ClusterKeywordData()}},
                          /*should_show_on_prominent_ui_surfaces=*/false));
     clusters.push_back(
         history::Cluster(0,
                          {
                              test_clustering_backend_->GetVisitById(2),
                          },
-                         {u"singlevisit"},
+                         {{u"singlevisit", history::ClusterKeywordData()}},
                          /*should_show_on_prominent_ui_surfaces=*/true));
 
     test_clustering_backend_->FulfillCallback(clusters);
@@ -1026,17 +1037,21 @@
                            test_clustering_backend_->GetVisitById(1),
                            test_clustering_backend_->GetVisitById(2),
                        },
-                       {u"one", u"two", u"three", u"four five six"},
+                       {{u"one", history::ClusterKeywordData()},
+                        {u"two", history::ClusterKeywordData()},
+                        {u"three", history::ClusterKeywordData()},
+                        {u"four five six", history::ClusterKeywordData()}},
                        /*should_show_on_prominent_ui_surfaces=*/true));
   // 2) The 2nd cluster has only 1 visit. Since it's keywords won't be cached,
   // they should not affect the max.
-  clusters.push_back(
-      history::Cluster(0,
-                       {
-                           test_clustering_backend_->GetVisitById(3),
-                       },
-                       {u"ignored not cached", u"elephant penguin kangaroo"},
-                       /*should_show_on_prominent_ui_surfaces=*/true));
+  clusters.push_back(history::Cluster(
+      0,
+      {
+          test_clustering_backend_->GetVisitById(3),
+      },
+      {{u"ignored not cached", history::ClusterKeywordData()},
+       {u"elephant penguin kangaroo", history::ClusterKeywordData()}},
+      /*should_show_on_prominent_ui_surfaces=*/true));
   // 3) With this 3rd cluster, we'll have 5 phrases and 7 words. Now that we've
   // reached 5 phrases, the next cluster's keywords should not be cached.
   clusters.push_back(
@@ -1045,7 +1060,7 @@
                            test_clustering_backend_->GetVisitById(4),
                            test_clustering_backend_->GetVisitById(5),
                        },
-                       {u"seven"},
+                       {{u"seven", history::ClusterKeywordData()}},
                        /*should_show_on_prominent_ui_surfaces=*/true));
   // 4) The 4th cluster's keywords should not be cached since we've reached 5
   // phrases.
@@ -1055,7 +1070,7 @@
                            test_clustering_backend_->GetVisitById(6),
                            test_clustering_backend_->GetVisitById(7),
                        },
-                       {u"eight"},
+                       {{u"eight", history::ClusterKeywordData()}},
                        /*should_show_on_prominent_ui_surfaces=*/true));
   test_clustering_backend_->FulfillCallback(clusters);
   history::BlockUntilHistoryProcessesPendingRequests(history_service_.get());
diff --git a/components/history_clusters/core/history_clusters_util.cc b/components/history_clusters/core/history_clusters_util.cc
index 48166f69..f92e38d 100644
--- a/components/history_clusters/core/history_clusters_util.cc
+++ b/components/history_clusters/core/history_clusters_util.cc
@@ -214,7 +214,8 @@
     }
 
     cluster.search_match_score = total_matching_visit_score;
-    if (DoesQueryMatchClusterKeywords(find_nodes, cluster.keywords)) {
+
+    if (DoesQueryMatchClusterKeywords(find_nodes, cluster.GetKeywords())) {
       // Arbitrarily chosen that cluster keyword matches are worth three points.
       // TODO(crbug.com/1307071): Use relevancy score for each cluster keyword
       // once support for that is added to the backend.
diff --git a/components/history_clusters/core/history_clusters_util_unittest.cc b/components/history_clusters/core/history_clusters_util_unittest.cc
index e083511..5f73382 100644
--- a/components/history_clusters/core/history_clusters_util_unittest.cc
+++ b/components/history_clusters/core/history_clusters_util_unittest.cc
@@ -61,7 +61,8 @@
                            GetHardcodedClusterVisit(2),
                            GetHardcodedClusterVisit(1),
                        },
-                       {u"apples", u"Red Oranges"},
+                       {{u"apples", history::ClusterKeywordData()},
+                        {u"Red Oranges", history::ClusterKeywordData()}},
                        /*should_show_on_prominent_ui_surfaces=*/false,
                        /*label=*/u"LabelOne"));
   all_clusters.push_back(
@@ -144,7 +145,8 @@
                            GetHardcodedClusterVisit(1),
                            GetHardcodedClusterVisit(2),
                        },
-                       {u"apples", u"Red Oranges"},
+                       {{u"apples", history::ClusterKeywordData()},
+                        {u"Red Oranges", history::ClusterKeywordData()}},
                        /*should_show_on_prominent_ui_surfaces=*/false));
 
   // No promotion when we match a keyword.
@@ -180,14 +182,15 @@
                            GetHardcodedClusterVisit(1),
                            GetHardcodedClusterVisit(2),
                        },
-                       {u"apples", u"Red Oranges"},
+                       {{u"apples", history::ClusterKeywordData()},
+                        {u"Red Oranges", history::ClusterKeywordData()}},
                        /*should_show_on_prominent_ui_surfaces=*/false));
   all_clusters.push_back(
       history::Cluster(2,
                        {
                            GetHardcodedClusterVisit(1),
                        },
-                       {u"search"},
+                       {{u"search", history::ClusterKeywordData()}},
                        /*should_show_on_prominent_ui_surfaces=*/false));
 
   // When the flag is off, leave the initial ordering alone.
@@ -248,7 +251,7 @@
   cluster1.visits.push_back(GetHardcodedClusterVisit(1, .5));
   cluster1.visits.push_back(GetHardcodedClusterVisit(1, .5));
   cluster1.visits.push_back(GetHardcodedClusterVisit(1, .5));
-  cluster1.keywords.push_back(u"keyword");
+  cluster1.keyword_to_data_map = {{u"keyword", history::ClusterKeywordData()}};
 
   // Low scoring visits should be above the fold only if they're one of top 4.
   history::Cluster cluster2;
@@ -258,14 +261,14 @@
   cluster2.visits.push_back(GetHardcodedClusterVisit(1, .4));
   cluster2.visits.push_back(GetHardcodedClusterVisit(1, .4));
   cluster2.visits.push_back(GetHardcodedClusterVisit(1, .4));
-  cluster2.keywords.push_back(u"keyword");
+  cluster2.keyword_to_data_map = {{u"keyword", history::ClusterKeywordData()}};
 
   // 0 scoring visits should be above the fold only if they're 1st.
   history::Cluster cluster3;
   cluster3.cluster_id = 8;
   cluster3.visits.push_back(GetHardcodedClusterVisit(1, 0.0));
   cluster3.visits.push_back(GetHardcodedClusterVisit(1, 0.0));
-  cluster3.keywords.push_back(u"keyword");
+  cluster3.keyword_to_data_map = {{u"keyword", history::ClusterKeywordData()}};
 
   all_clusters.push_back(cluster1);
   all_clusters.push_back(cluster2);
diff --git a/components/history_clusters/core/keyword_cluster_finalizer.cc b/components/history_clusters/core/keyword_cluster_finalizer.cc
index 832002a..62a4f3a 100644
--- a/components/history_clusters/core/keyword_cluster_finalizer.cc
+++ b/components/history_clusters/core/keyword_cluster_finalizer.cc
@@ -42,7 +42,8 @@
 KeywordClusterFinalizer::~KeywordClusterFinalizer() = default;
 
 void KeywordClusterFinalizer::FinalizeCluster(history::Cluster& cluster) {
-  base::flat_set<std::u16string> keywords_set;
+  base::flat_map<std::u16string, history::ClusterKeywordData>
+      keyword_to_data_map;
   for (const auto& visit : cluster.visits) {
     if (!GetConfig().keyword_filter_on_noisy_visits && IsNoisyVisit(visit)) {
       // Do not put keywords if user visits the page a lot and it's not a
@@ -57,16 +58,27 @@
     for (const auto& entity :
          visit.annotated_visit.content_annotations.model_annotations.entities) {
       base::flat_set<std::u16string> entity_keywords;
-      entity_keywords.insert(base::UTF8ToUTF16(entity.id));
+      const std::u16string keyword_u16str = base::UTF8ToUTF16(entity.id);
+      entity_keywords.insert(keyword_u16str);
+
+      auto it = entity_metadata_map_.find(entity.id);
+      // Add entity collections to keyword data.
+      keyword_to_data_map[keyword_u16str] =
+          it != entity_metadata_map_.end()
+              ? history::ClusterKeywordData(it->second.collections)
+              : history::ClusterKeywordData();
 
       if (GetConfig().keyword_filter_on_entity_aliases) {
-        auto it = entity_metadata_map_.find(entity.id);
         if (it != entity_metadata_map_.end()) {
           for (size_t i = 0; i < it->second.human_readable_aliases.size() &&
                              i < GetConfig().max_entity_aliases_in_keywords;
                i++) {
-            entity_keywords.insert(
-                base::UTF8ToUTF16(it->second.human_readable_aliases[i]));
+            const auto alias =
+                base::UTF8ToUTF16(it->second.human_readable_aliases[i]);
+            entity_keywords.insert(alias);
+            // Use the same collections of an entity for its aliases as well.
+            keyword_to_data_map[alias] =
+                history::ClusterKeywordData(it->second.collections);
           }
         }
       }
@@ -75,19 +87,21 @@
         // If we do not want any keywords associated with the visit host, make
         // sure that none of the keywords associated with the entity look like
         // they are for the visit host.
+        bool clear_entity_keywords = false;
         for (const auto& entity_keyword : entity_keywords) {
           if (IsKeywordSimilarToVisitHost(lowercase_host_parts,
                                           entity_keyword)) {
             // One of the keywords is likely for the visit host, so clear out
             // the keywords for the whole entity.
-            entity_keywords.clear();
+            clear_entity_keywords = true;
             break;
           }
         }
-      }
-
-      if (!entity_keywords.empty()) {
-        keywords_set.insert(entity_keywords.begin(), entity_keywords.end());
+        if (clear_entity_keywords) {
+          for (const auto& keyword : entity_keywords) {
+            keyword_to_data_map.erase(keyword);
+          }
+        }
       }
     }
     if (GetConfig().keyword_filter_on_categories) {
@@ -99,18 +113,18 @@
                                         category_u16string)) {
           continue;
         }
-        keywords_set.insert(category_u16string);
+        keyword_to_data_map[category_u16string] = history::ClusterKeywordData();
       }
     }
 
     if (GetConfig().keyword_filter_on_search_terms &&
         !visit.annotated_visit.content_annotations.search_terms.empty()) {
-      keywords_set.insert(
-          visit.annotated_visit.content_annotations.search_terms);
+      keyword_to_data_map[visit.annotated_visit.content_annotations
+                              .search_terms] = history::ClusterKeywordData();
     }
   }
-  cluster.keywords =
-      std::vector<std::u16string>(keywords_set.begin(), keywords_set.end());
+
+  cluster.keyword_to_data_map = std::move(keyword_to_data_map);
 }
 
 }  // namespace history_clusters
diff --git a/components/history_clusters/core/keyword_cluster_finalizer_unittest.cc b/components/history_clusters/core/keyword_cluster_finalizer_unittest.cc
index c7845f1..f5dba63 100644
--- a/components/history_clusters/core/keyword_cluster_finalizer_unittest.cc
+++ b/components/history_clusters/core/keyword_cluster_finalizer_unittest.cc
@@ -23,6 +23,7 @@
   void SetUp() override {
     optimization_guide::EntityMetadata github_md;
     github_md.human_readable_aliases = {"git hub", "github llc"};
+    github_md.collections = {"/collection/computer"};
     base::flat_map<std::string, optimization_guide::EntityMetadata>
         entity_metadata_map;
     entity_metadata_map["github"] = github_md;
@@ -81,8 +82,13 @@
   history::Cluster cluster;
   cluster.visits = {visit2, visit3};
   FinalizeCluster(cluster);
-  EXPECT_THAT(cluster.keywords,
-              UnorderedElementsAre(u"github", u"otherentity"));
+
+  ASSERT_TRUE(cluster.keyword_to_data_map.contains(u"github"));
+  EXPECT_EQ(cluster.keyword_to_data_map[u"github"].entity_collections,
+            std::vector<std::string>{"/collection/computer"});
+  ASSERT_TRUE(cluster.keyword_to_data_map.contains(u"otherentity"));
+  EXPECT_TRUE(
+      cluster.keyword_to_data_map[u"otherentity"].entity_collections.empty());
 }
 
 class KeywordClusterFinalizerIncludeAllTest
@@ -137,10 +143,27 @@
   history::Cluster cluster;
   cluster.visits = {visit2, visit3};
   FinalizeCluster(cluster);
-  EXPECT_THAT(
-      cluster.keywords,
-      UnorderedElementsAre(u"github", u"category", u"onlyinnoisyvisit",
-                           u"otherentity", u"git hub", u"search", u"baz"));
+
+  ASSERT_TRUE(cluster.keyword_to_data_map.contains(u"github"));
+  EXPECT_EQ(cluster.keyword_to_data_map[u"github"].entity_collections,
+            std::vector<std::string>{"/collection/computer"});
+  ASSERT_TRUE(cluster.keyword_to_data_map.contains(u"git hub"));
+  EXPECT_EQ(cluster.keyword_to_data_map[u"git hub"].entity_collections,
+            std::vector<std::string>{"/collection/computer"});
+  ASSERT_TRUE(cluster.keyword_to_data_map.contains(u"category"));
+  EXPECT_TRUE(
+      cluster.keyword_to_data_map[u"category"].entity_collections.empty());
+  ASSERT_TRUE(cluster.keyword_to_data_map.contains(u"onlyinnoisyvisit"));
+  EXPECT_TRUE(cluster.keyword_to_data_map[u"onlyinnoisyvisit"]
+                  .entity_collections.empty());
+  ASSERT_TRUE(cluster.keyword_to_data_map.contains(u"otherentity"));
+  EXPECT_TRUE(
+      cluster.keyword_to_data_map[u"otherentity"].entity_collections.empty());
+  ASSERT_TRUE(cluster.keyword_to_data_map.contains(u"search"));
+  EXPECT_TRUE(
+      cluster.keyword_to_data_map[u"search"].entity_collections.empty());
+  ASSERT_TRUE(cluster.keyword_to_data_map.contains(u"baz"));
+  EXPECT_TRUE(cluster.keyword_to_data_map[u"baz"].entity_collections.empty());
 }
 
 }  // namespace
diff --git a/components/history_clusters/core/on_device_clustering_backend.cc b/components/history_clusters/core/on_device_clustering_backend.cc
index a487b1f..e89a515 100644
--- a/components/history_clusters/core/on_device_clustering_backend.cc
+++ b/components/history_clusters/core/on_device_clustering_backend.cc
@@ -406,7 +406,7 @@
       finalizer->FinalizeCluster(cluster);
     }
     visits_in_clusters.emplace_back(cluster.visits.size());
-    keyword_sizes.emplace_back(cluster.keywords.size());
+    keyword_sizes.emplace_back(cluster.keyword_to_data_map.size());
   }
 
   // It's a bit strange that this is essentially a `ClusterProcessor` but has
diff --git a/components/history_clusters/core/on_device_clustering_backend_unittest.cc b/components/history_clusters/core/on_device_clustering_backend_unittest.cc
index 55d2a10..16d89c9 100644
--- a/components/history_clusters/core/on_device_clustering_backend_unittest.cc
+++ b/components/history_clusters/core/on_device_clustering_backend_unittest.cc
@@ -219,7 +219,7 @@
               ElementsAre(ElementsAre(testing::VisitResult(1, 1.0),
                                       testing::VisitResult(2, 1.0))));
   ASSERT_EQ(result_clusters.size(), 1u);
-  EXPECT_THAT(result_clusters.at(0).keywords,
+  EXPECT_THAT(result_clusters.at(0).GetKeywords(),
               UnorderedElementsAre(std::u16string(u"google-category"),
                                    std::u16string(u"com"),
                                    std::u16string(u"google-entity")));
@@ -660,7 +660,7 @@
               FloatEq(0.5));
   // Cluster should have 3 keywords.
   EXPECT_THAT(
-      cluster.keywords,
+      cluster.GetKeywords(),
       UnorderedElementsAre(u"rewritten-foo", u"category-foo", u"alias-foo"));
 
   history::Cluster cluster2 = result_clusters.at(1);
@@ -674,7 +674,7 @@
                   .model_annotations.entities.empty());
   EXPECT_TRUE(third_result_visit.annotated_visit.content_annotations
                   .model_annotations.categories.empty());
-  EXPECT_TRUE(cluster2.keywords.empty());
+  EXPECT_TRUE(cluster2.keyword_to_data_map.empty());
 
   histogram_tester.ExpectUniqueSample(
       "History.Clusters.Backend.ClusterSize.Min", 1, 1);
diff --git a/components/history_clusters/core/query_clusters_state_unittest.cc b/components/history_clusters/core/query_clusters_state_unittest.cc
index bf84528..c4df1363 100644
--- a/components/history_clusters/core/query_clusters_state_unittest.cc
+++ b/components/history_clusters/core/query_clusters_state_unittest.cc
@@ -84,10 +84,10 @@
 
   std::vector<history::Cluster> raw_clusters;
   raw_clusters.push_back(
-      history::Cluster(1, {}, {u"keyword_one"},
+      history::Cluster(1, {}, {{u"keyword_one", history::ClusterKeywordData()}},
                        /*should_show_on_prominent_ui_surfaces=*/false));
   raw_clusters.push_back(
-      history::Cluster(2, {}, {u"keyword_two"},
+      history::Cluster(2, {}, {{u"keyword_two", history::ClusterKeywordData()}},
                        /*should_show_on_prominent_ui_surfaces=*/true));
 
   auto result =
@@ -114,12 +114,13 @@
   {
     std::vector<history::Cluster> raw_clusters;
     // Verify that non-matching prominent clusters are filtered out.
-    raw_clusters.push_back(
-        history::Cluster(1, {}, {u"keyword_one"},
-                         /*should_show_on_prominent_ui_surfaces=*/true));
+    raw_clusters.push_back(history::Cluster(
+        1, {}, {{u"keyword_one", history::ClusterKeywordData()}},
+        /*should_show_on_prominent_ui_surfaces=*/true));
     // Verify that matching non-prominent clusters still are shown.
     raw_clusters.push_back(
-        history::Cluster(2, {GetHardcodedClusterVisit(1)}, {u"myquery"},
+        history::Cluster(2, {GetHardcodedClusterVisit(1)},
+                         {{u"myquery", history::ClusterKeywordData()}},
                          /*should_show_on_prominent_ui_surfaces=*/false));
 
     auto result =
@@ -144,17 +145,20 @@
     // Verify that a matching non-prominent non-duplicate cluster is still
     // allowed.
     raw_clusters.push_back(
-        history::Cluster(3, {GetHardcodedClusterVisit(2)}, {u"myquery"},
+        history::Cluster(3, {GetHardcodedClusterVisit(2)},
+                         {{u"myquery", history::ClusterKeywordData()}},
                          /*should_show_on_prominent_ui_surfaces=*/false));
 
     // Verify that a matching non-prominent duplicate cluster is filtered out.
     raw_clusters.push_back(
-        history::Cluster(4, {GetHardcodedClusterVisit(1)}, {u"myquery"},
+        history::Cluster(4, {GetHardcodedClusterVisit(1)},
+                         {{u"myquery", history::ClusterKeywordData()}},
                          /*should_show_on_prominent_ui_surfaces=*/false));
 
     // Verify that a matching prominent duplicate cluster is still allowed.
     raw_clusters.push_back(
-        history::Cluster(5, {GetHardcodedClusterVisit(1)}, {u"myquery"},
+        history::Cluster(5, {GetHardcodedClusterVisit(1)},
+                         {{u"myquery", history::ClusterKeywordData()}},
                          /*should_show_on_prominent_ui_surfaces=*/true));
 
     auto result =
diff --git a/components/omnibox/browser/autocomplete_input.cc b/components/omnibox/browser/autocomplete_input.cc
index bf123c4..ca5b385 100644
--- a/components/omnibox/browser/autocomplete_input.cc
+++ b/components/omnibox/browser/autocomplete_input.cc
@@ -245,6 +245,7 @@
   if (scheme)
     *scheme = parsed_scheme;
   const std::string parsed_scheme_utf8(base::UTF16ToUTF8(parsed_scheme));
+  DCHECK(base::IsStringASCII(parsed_scheme_utf8));
 
   // If we can't canonicalize the user's input, the rest of the autocomplete
   // system isn't going to be able to produce a navigable URL match for it.
@@ -278,7 +279,7 @@
   }
 #endif  // BUILDFLAG(IS_CHROMEOS)
 
-  if (base::LowerCaseEqualsASCII(parsed_scheme_utf8, url::kFileScheme)) {
+  if (base::EqualsCaseInsensitiveASCII(parsed_scheme_utf8, url::kFileScheme)) {
     // A user might or might not type a scheme when entering a file URL.  In
     // either case, |parsed_scheme_utf8| will tell us that this is a file URL,
     // but |parts->scheme| might be empty, e.g. if the user typed "C:\foo".
@@ -304,8 +305,9 @@
   // (e.g. "ftp" or "view-source") but I'll wait to spend the effort on that
   // until I run into some cases that really need it.
   if (parts->scheme.is_nonempty() &&
-      !base::LowerCaseEqualsASCII(parsed_scheme_utf8, url::kHttpScheme) &&
-      !base::LowerCaseEqualsASCII(parsed_scheme_utf8, url::kHttpsScheme)) {
+      !base::EqualsCaseInsensitiveASCII(parsed_scheme_utf8, url::kHttpScheme) &&
+      !base::EqualsCaseInsensitiveASCII(parsed_scheme_utf8,
+                                        url::kHttpsScheme)) {
     metrics::OmniboxInputType type =
         scheme_classifier.GetInputTypeForScheme(parsed_scheme_utf8);
     if (type != metrics::OmniboxInputType::EMPTY)
@@ -559,8 +561,8 @@
   int after_scheme_and_colon = parts.scheme.end() + 1;
   // For the view-source and blob schemes, we should emphasize the host of the
   // URL qualified by the view-source or blob prefix.
-  if ((base::LowerCaseEqualsASCII(scheme_str, kViewSourceScheme) ||
-       base::LowerCaseEqualsASCII(scheme_str, url::kBlobScheme)) &&
+  if ((base::EqualsCaseInsensitiveASCII(scheme_str, kViewSourceScheme) ||
+       base::EqualsCaseInsensitiveASCII(scheme_str, url::kBlobScheme)) &&
       (static_cast<int>(text.length()) > after_scheme_and_colon)) {
     // Obtain the URL prefixed by view-source or blob and parse it.
     std::u16string real_url(text.substr(after_scheme_and_colon));
@@ -582,7 +584,8 @@
         host->reset();
       }
     }
-  } else if (base::LowerCaseEqualsASCII(scheme_str, url::kFileSystemScheme) &&
+  } else if (base::EqualsCaseInsensitiveASCII(scheme_str,
+                                              url::kFileSystemScheme) &&
              parts.inner_parsed() && parts.inner_parsed()->scheme.is_valid()) {
     *host = parts.inner_parsed()->host;
   }
diff --git a/components/omnibox/browser/history_url_provider.cc b/components/omnibox/browser/history_url_provider.cc
index ad4b5c2..88b4933 100644
--- a/components/omnibox/browser/history_url_provider.cc
+++ b/components/omnibox/browser/history_url_provider.cc
@@ -907,7 +907,7 @@
   // input's text and parts between Parse() and here, it seems better to be
   // paranoid and check.
   if ((input.type() != metrics::OmniboxInputType::UNKNOWN) ||
-      !base::LowerCaseEqualsASCII(input.scheme(), url::kHttpScheme) ||
+      !base::EqualsCaseInsensitiveASCII(input.scheme(), url::kHttpScheme) ||
       !input.parts().host.is_nonempty())
     return GURL();
 
diff --git a/components/omnibox/browser/search_provider.cc b/components/omnibox/browser/search_provider.cc
index 4a502da..494fe49 100644
--- a/components/omnibox/browser/search_provider.cc
+++ b/components/omnibox/browser/search_provider.cc
@@ -827,9 +827,9 @@
   // and happens to currently be invalid -- in which case we again want to run
   // our checks below.  Other QUERY cases are less likely to be URLs and thus we
   // assume we're OK.
-  if (!base::LowerCaseEqualsASCII(input_.scheme(), url::kHttpScheme) &&
-      !base::LowerCaseEqualsASCII(input_.scheme(), url::kHttpsScheme) &&
-      !base::LowerCaseEqualsASCII(input_.scheme(), url::kFtpScheme))
+  if (!base::EqualsCaseInsensitiveASCII(input_.scheme(), url::kHttpScheme) &&
+      !base::EqualsCaseInsensitiveASCII(input_.scheme(), url::kHttpsScheme) &&
+      !base::EqualsCaseInsensitiveASCII(input_.scheme(), url::kFtpScheme))
     return (input_.type() != metrics::OmniboxInputType::QUERY);
 
   // Don't send URLs with usernames, queries or refs.  Some of these are
@@ -851,7 +851,7 @@
   // Don't send anything for https except the hostname.  Hostnames are OK
   // because they are visible when the TCP connection is established, but the
   // specific path may reveal private information.
-  if (base::LowerCaseEqualsASCII(input_.scheme(), url::kHttpsScheme) &&
+  if (base::EqualsCaseInsensitiveASCII(input_.scheme(), url::kHttpsScheme) &&
       parts.path.is_nonempty())
     return true;
 
diff --git a/components/omnibox/common/omnibox_features.cc b/components/omnibox/common/omnibox_features.cc
index 3a83062..030dc86f 100644
--- a/components/omnibox/common/omnibox_features.cc
+++ b/components/omnibox/common/omnibox_features.cc
@@ -300,7 +300,8 @@
 // https://example.com instead, with fallback to http://example.com if
 // necessary.
 const base::Feature kDefaultTypedNavigationsToHttps{
-    "OmniboxDefaultTypedNavigationsToHttps", base::FEATURE_ENABLED_BY_DEFAULT};
+    "OmniboxDefaultTypedNavigationsToHttps",
+    enabled_by_default_desktop_android};
 // Parameter name used to look up the delay before falling back to the HTTP URL
 // while trying an HTTPS URL. The parameter is treated as a TimeDelta, so the
 // unit must be included in the value as well (e.g. 3s for 3 seconds).
diff --git a/components/optimization_guide/content/browser/page_text_observer_unittest.cc b/components/optimization_guide/content/browser/page_text_observer_unittest.cc
index 20c37a7..e1b480c6 100644
--- a/components/optimization_guide/content/browser/page_text_observer_unittest.cc
+++ b/components/optimization_guide/content/browser/page_text_observer_unittest.cc
@@ -1226,6 +1226,7 @@
       content::NavigationSimulator::CreateRendererInitiated(kFencedFrameUrl,
                                                             fenced_frame_rfh);
   navigation_simulator->Commit();
+  fenced_frame_rfh = navigation_simulator->GetFinalRenderFrameHost();
 
   // Add an OOPIF subframe.
   content::RenderFrameHost* oopif_subframe =
diff --git a/components/optimization_guide/core/hints_manager.cc b/components/optimization_guide/core/hints_manager.cc
index 3d553863..25a1ccb8 100644
--- a/components/optimization_guide/core/hints_manager.cc
+++ b/components/optimization_guide/core/hints_manager.cc
@@ -76,15 +76,8 @@
     std::move(update_closure).Run();
 }
 
-// Returns whether the particular component version can be processed, and if it
-// can be, locks the semaphore (in the form of a pref) to signal that the
-// processing of this particular version has started.
-bool CanProcessComponentVersion(PrefService* pref_service,
-                                const base::Version& version,
-                                ProcessHintsComponentResult* out_result) {
-  DCHECK(version.IsValid());
-  DCHECK(out_result);
-
+absl::optional<base::Version>
+GetPendingOptimizationHintsComponentVersionFromPref(PrefService* pref_service) {
   const std::string previous_attempted_version_string =
       pref_service->GetString(prefs::kPendingHintsProcessingVersion);
   if (!previous_attempted_version_string.empty()) {
@@ -94,21 +87,11 @@
       DLOG(ERROR) << "Bad contents in hints processing pref";
       // Clear pref for fresh start next time.
       pref_service->ClearPref(prefs::kPendingHintsProcessingVersion);
-      *out_result =
-          ProcessHintsComponentResult::kFailedPreviouslyAttemptedVersionInvalid;
-      return false;
+      return absl::nullopt;
     }
-    if (previous_attempted_version.CompareTo(version) == 0) {
-      *out_result = ProcessHintsComponentResult::kFailedFinishProcessing;
-      // Previously attempted same version without completion.
-      return false;
-    }
+    return absl::make_optional(previous_attempted_version);
   }
-
-  // Write config version to pref.
-  pref_service->SetString(prefs::kPendingHintsProcessingVersion,
-                          version.GetString());
-  return true;
+  return absl::nullopt;
 }
 
 // Returns whether |optimization_type| is allowlisted by |optimizations|. If
@@ -306,7 +289,9 @@
     scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
     std::unique_ptr<PushNotificationManager> push_notification_manager,
     OptimizationGuideLogger* optimization_guide_logger)
-    : is_off_the_record_(is_off_the_record),
+    : failed_component_version_(
+          GetPendingOptimizationHintsComponentVersionFromPref(pref_service)),
+      is_off_the_record_(is_off_the_record),
       application_locale_(application_locale),
       pref_service_(pref_service),
       hint_cache_(
@@ -405,16 +390,20 @@
     return;
   }
 
-  ProcessHintsComponentResult out_result;
-  if (!CanProcessComponentVersion(pref_service_, info.version, &out_result)) {
+  if (failed_component_version_ &&
+      failed_component_version_->CompareTo(info.version) >= 0) {
     OPTIMIZATION_GUIDE_LOGGER(optimization_guide_logger_)
         << "Skipping processing OptimizationHints component version: "
         << info.version.GetString()
         << " as it had failed in a previous session";
-    RecordProcessHintsComponentResult(out_result);
+    RecordProcessHintsComponentResult(
+        ProcessHintsComponentResult::kFailedFinishProcessing);
     MaybeRunUpdateClosure(std::move(next_update_closure_));
     return;
   }
+  // Write version that we are currently processing to prefs.
+  pref_service_->SetString(prefs::kPendingHintsProcessingVersion,
+                           info.version.GetString());
 
   std::unique_ptr<StoreUpdateData> update_data =
       is_off_the_record_
diff --git a/components/optimization_guide/core/hints_manager.h b/components/optimization_guide/core/hints_manager.h
index d496cb9..b68eca3 100644
--- a/components/optimization_guide/core/hints_manager.h
+++ b/components/optimization_guide/core/hints_manager.h
@@ -404,6 +404,10 @@
   // |optimization_guide_service_|.
   absl::optional<HintsComponentInfo> hints_component_info_;
 
+  // The component version that failed to process in the last session, if
+  // applicable.
+  const absl::optional<base::Version> failed_component_version_;
+
   // The version of the component that is currently being processed.
   absl::optional<base::Version> currently_processing_component_version_;
 
diff --git a/components/optimization_guide/core/hints_manager_unittest.cc b/components/optimization_guide/core/hints_manager_unittest.cc
index fa406d62..1a1a4a5 100644
--- a/components/optimization_guide/core/hints_manager_unittest.cc
+++ b/components/optimization_guide/core/hints_manager_unittest.cc
@@ -288,6 +288,12 @@
     scoped_feature_list_.InitAndEnableFeatureWithParameters(
         features::kOptimizationHints,
         GetOptimizationHintsDefaultFeatureParams());
+
+    pref_service_ =
+        std::make_unique<sync_preferences::TestingPrefServiceSyncable>();
+    prefs::RegisterProfilePrefs(pref_service_->registry());
+    unified_consent::UnifiedConsentService::RegisterPrefs(
+        pref_service_->registry());
   }
   ~HintsManagerTest() override = default;
 
@@ -301,6 +307,7 @@
 
   void TearDown() override {
     ResetHintsManager();
+    pref_service_.reset();
     ProtoDatabaseProviderTestBase::TearDown();
   }
 
@@ -308,12 +315,6 @@
     if (hints_manager_)
       ResetHintsManager();
 
-    pref_service_ =
-        std::make_unique<sync_preferences::TestingPrefServiceSyncable>();
-    prefs::RegisterProfilePrefs(pref_service_->registry());
-    unified_consent::UnifiedConsentService::RegisterPrefs(
-        pref_service_->registry());
-
     url_loader_factory_ =
         base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
             &test_url_loader_factory_);
@@ -341,7 +342,6 @@
     hints_manager_.reset();
     tab_url_provider_.reset();
     hint_store_.reset();
-    pref_service_.reset();
     RunUntilIdle();
   }
 
@@ -731,6 +731,7 @@
 TEST_F(HintsManagerTest, ProcessHintsWithExistingPref) {
   // Write hints processing pref for version 2.0.0.
   pref_service()->SetString(prefs::kPendingHintsProcessingVersion, "2.0.0");
+  CreateHintsManager(/*top_host_provider=*/nullptr);
 
   // Verify config not processed for same version (2.0.0) and pref not cleared.
   {
@@ -761,6 +762,7 @@
        ProcessHintsWithExistingPrefDoesNotClearOrCountAsMidProcessing) {
   // Write hints processing pref for version 2.0.0.
   pref_service()->SetString(prefs::kPendingHintsProcessingVersion, "2.0.0");
+  CreateHintsManager(/*top_host_provider=*/nullptr);
 
   // Verify component for same version counts as "failed".
   base::HistogramTester histogram_tester;
@@ -782,22 +784,9 @@
 TEST_F(HintsManagerTest, ProcessHintsWithInvalidPref) {
   // Create pref file with invalid version.
   pref_service()->SetString(prefs::kPendingHintsProcessingVersion, "bad-2.0.0");
+  CreateHintsManager(/*top_host_provider=*/nullptr);
 
-  // Verify config not processed for existing pref with bad value but
-  // that the pref is cleared.
-  {
-    base::HistogramTester histogram_tester;
-    InitializeWithDefaultConfig("2.0.0");
-    EXPECT_TRUE(pref_service()
-                    ->GetString(prefs::kPendingHintsProcessingVersion)
-                    .empty());
-    histogram_tester.ExpectUniqueSample(
-        "OptimizationGuide.ProcessHintsResult",
-        ProcessHintsComponentResult::kFailedPreviouslyAttemptedVersionInvalid,
-        1);
-  }
-
-  // Now verify config is processed with pref cleared.
+  // Verify config is processed with pref cleared.
   {
     base::HistogramTester histogram_tester;
     InitializeWithDefaultConfig("2.0.0");
diff --git a/components/page_load_metrics/browser/observers/use_counter/ukm_features.cc b/components/page_load_metrics/browser/observers/use_counter/ukm_features.cc
index 42388f0..be70e68a 100644
--- a/components/page_load_metrics/browser/observers/use_counter/ukm_features.cc
+++ b/components/page_load_metrics/browser/observers/use_counter/ukm_features.cc
@@ -232,6 +232,8 @@
           WebFeature::kScriptSchedulingType_ParserBlockingInline,
           WebFeature::kScriptSchedulingType_InOrder,
           WebFeature::kScriptSchedulingType_Async,
+          WebFeature::kClientHintsMetaHTTPEquivAcceptCH,
+          WebFeature::kClientHintsMetaNameAcceptCH,
       }));
   return *opt_in_features;
 }
diff --git a/components/password_manager/content/browser/content_password_manager_driver_unittest.cc b/components/password_manager/content/browser/content_password_manager_driver_unittest.cc
index 64b2b17..68c95a6 100644
--- a/components/password_manager/content/browser/content_password_manager_driver_unittest.cc
+++ b/components/password_manager/content/browser/content_password_manager_driver_unittest.cc
@@ -410,6 +410,7 @@
       content::NavigationSimulator::CreateRendererInitiated(fenced_frame_url,
                                                             fenced_frame_root);
   navigation_simulator->Commit();
+  fenced_frame_root = navigation_simulator->GetFinalRenderFrameHost();
 
   autofill::FormData initial_form;
   autofill::FormData form_in_fenced_frame =
diff --git a/components/policy/core/common/cloud/cloud_policy_util.cc b/components/policy/core/common/cloud/cloud_policy_util.cc
index 699ca03..5b497688 100644
--- a/components/policy/core/common/cloud/cloud_policy_util.cc
+++ b/components/policy/core/common/cloud/cloud_policy_util.cc
@@ -56,6 +56,10 @@
 #include "components/user_manager/user_manager.h"
 #endif
 
+#if BUILDFLAG(IS_CHROMEOS_LACROS)
+#include "chromeos/startup/browser_init_params.h"
+#endif
+
 #if BUILDFLAG(IS_WIN)
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
@@ -159,7 +163,7 @@
 }
 
 std::string GetOSUsername() {
-#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_APPLE)
+#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_APPLE)
   struct passwd* creds = getpwuid(getuid());
   if (!creds || !creds->pw_name)
     return std::string();
@@ -185,6 +189,18 @@
   if (!user)
     return std::string();
   return user->GetAccountId().GetUserEmail();
+#elif BUILDFLAG(IS_CHROMEOS_LACROS)
+  const crosapi::mojom::BrowserInitParams* init_params =
+      chromeos::BrowserInitParams::Get();
+  if (init_params && init_params->device_account) {
+    return init_params->device_account->raw_email;
+  }
+  // Fallback if init_params are missing.
+  struct passwd* creds = getpwuid(getuid());
+  if (!creds || !creds->pw_name)
+    return std::string();
+
+  return creds->pw_name;
 #elif BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_FUCHSIA)
   // TODO(crbug.com/1257674): This should be fully implemented when there is
   // support in fuchsia.
@@ -214,6 +230,14 @@
 #if BUILDFLAG(IS_CHROMEOS_ASH)
   return chromeos::system::StatisticsProvider::GetInstance()
       ->GetEnterpriseMachineID();
+#elif BUILDFLAG(IS_CHROMEOS_LACROS)
+  const crosapi::mojom::BrowserInitParams* init_params =
+      chromeos::BrowserInitParams::Get();
+  if (init_params && init_params->device_properties &&
+      init_params->device_properties->serial_number.has_value()) {
+    return init_params->device_properties->serial_number.value();
+  }
+  return GetMachineName();
 #else
   return GetMachineName();
 #endif
diff --git a/components/remote_cocoa/app_shim/native_widget_ns_window_bridge.h b/components/remote_cocoa/app_shim/native_widget_ns_window_bridge.h
index b627ac5..6805512 100644
--- a/components/remote_cocoa/app_shim/native_widget_ns_window_bridge.h
+++ b/components/remote_cocoa/app_shim/native_widget_ns_window_bridge.h
@@ -399,19 +399,15 @@
   // on the first call to SetVisibilityState().
   std::vector<uint8_t> pending_restoration_data_;
 
-  // A structure to hold a headless mode window state. This is present iff the
-  // window has been created in headless mode.
+  // This tracks headless window visibility and fullscreen states.
+  // In headless mode the platform window is never made visible or change its
+  // state, so this structure holds the requested state for reporting.
   struct HeadlessModeWindow {
-    // This tracks headless window visibility state. In headless mode
-    // the platform window is always hidden, so we use this boolean
-    // to track the window's expected visibility state.
     bool visibility_state = false;
-    // This tracks headless window fullscreen state. In headless mode the
-    // platform window is never made fullscreen because AppKit implicitly
-    // makes fullscreen windows visible.
     bool fullscreen_state = false;
   };
 
+  // This is present iff the window has been created in headless mode.
   absl::optional<HeadlessModeWindow> headless_mode_window_;
 
   display::ScopedDisplayObserver display_observer_{this};
diff --git a/components/remote_cocoa/app_shim/native_widget_ns_window_bridge.mm b/components/remote_cocoa/app_shim/native_widget_ns_window_bridge.mm
index 23acd2a1..f313f0b 100644
--- a/components/remote_cocoa/app_shim/native_widget_ns_window_bridge.mm
+++ b/components/remote_cocoa/app_shim/native_widget_ns_window_bridge.mm
@@ -1364,6 +1364,16 @@
 }
 
 void NativeWidgetNSWindowBridge::SetMiniaturized(bool miniaturized) {
+  // In headless mode the platform window is always hidden and WebKit
+  // will not deminiaturize hidden windows. So instead of changing the window
+  // miniaturization state just lie to the upper layer pretending the window did
+  // change its state. We don't need to keep track of the requested state here
+  // because the host will do this.
+  if (headless_mode_window_) {
+    host_->OnWindowMiniaturizedChanged(miniaturized);
+    return;
+  }
+
   if (miniaturized) {
     // Calling performMiniaturize: will momentarily highlight the button, but
     // AppKit will reject it if there is no miniaturize button.
diff --git a/components/reporting/client/mock_report_queue.h b/components/reporting/client/mock_report_queue.h
index 1cb4202..99e1c43 100644
--- a/components/reporting/client/mock_report_queue.h
+++ b/components/reporting/client/mock_report_queue.h
@@ -25,7 +25,7 @@
 
   MOCK_METHOD(void,
               AddRecord,
-              (base::StringPiece, Priority, EnqueueCallback),
+              (std::string, Priority, EnqueueCallback),
               (const));
 
   MOCK_METHOD(void, Flush, (Priority, FlushCallback), (override));
diff --git a/components/reporting/client/report_queue.cc b/components/reporting/client/report_queue.cc
index 59a6d1b..cb1c346 100644
--- a/components/reporting/client/report_queue.cc
+++ b/components/reporting/client/report_queue.cc
@@ -26,7 +26,7 @@
 
 namespace {
 
-StatusOr<std::string> ValueToJson(const base::Value::Dict& record) {
+StatusOr<std::string> ValueToJson(base::Value::Dict record) {
   std::string json_record;
   if (!base::JSONWriter::Write(record, &json_record)) {
     return Status(error::INVALID_ARGUMENT,
@@ -36,7 +36,7 @@
 }
 
 StatusOr<std::string> ProtoToString(
-    const google::protobuf::MessageLite* record) {
+    std::unique_ptr<const google::protobuf::MessageLite> record) {
   std::string protobuf_record;
   if (!record->SerializeToString(&protobuf_record)) {
     return Status(error::INVALID_ARGUMENT,
@@ -50,25 +50,26 @@
 
 ReportQueue::~ReportQueue() = default;
 
-void ReportQueue::Enqueue(base::StringPiece record,
+void ReportQueue::Enqueue(std::string record,
                           Priority priority,
                           ReportQueue::EnqueueCallback callback) const {
-  AddRecord(record, priority, std::move(callback));
+  AddRecord(std::move(record), priority, std::move(callback));
 }
 
-void ReportQueue::Enqueue(const base::Value::Dict& record,
+void ReportQueue::Enqueue(base::Value::Dict record,
                           Priority priority,
                           ReportQueue::EnqueueCallback callback) const {
   ASSIGN_OR_ONCE_CALLBACK_AND_RETURN(std::string json_record, callback,
-                                     ValueToJson(record));
+                                     ValueToJson(std::move(record)));
   AddRecord(json_record, priority, std::move(callback));
 }
 
-void ReportQueue::Enqueue(const google::protobuf::MessageLite* record,
-                          Priority priority,
-                          ReportQueue::EnqueueCallback callback) const {
+void ReportQueue::Enqueue(
+    std::unique_ptr<const google::protobuf::MessageLite> record,
+    Priority priority,
+    ReportQueue::EnqueueCallback callback) const {
   ASSIGN_OR_ONCE_CALLBACK_AND_RETURN(std::string protobuf_record, callback,
-                                     ProtoToString(record));
+                                     ProtoToString(std::move(record)));
   AddRecord(protobuf_record, priority, std::move(callback));
 }
 
diff --git a/components/reporting/client/report_queue.h b/components/reporting/client/report_queue.h
index 50e5186d..29d2b184 100644
--- a/components/reporting/client/report_queue.h
+++ b/components/reporting/client/report_queue.h
@@ -122,20 +122,21 @@
   // (destination : requirement)
   // UPLOAD_EVENTS : UploadEventsRequest
   //
-  // |record| will be sent as a string with no conversion.
-  void Enqueue(base::StringPiece record,
+  // |record| string (owned) will be sent with no conversion.
+  void Enqueue(std::string record,
                Priority priority,
                EnqueueCallback callback) const;
 
-  // |record| will be converted to a JSON string with base::JsonWriter::Write.
-  void Enqueue(const base::Value::Dict& record,
+  // |record| as a dictionary (owned) will be converted to a JSON string with
+  // base::JsonWriter::Write.
+  void Enqueue(base::Value::Dict record,
                Priority priority,
                EnqueueCallback callback) const;
 
-  // |record| will be converted to a string with SerializeToString(). The
-  // handler is responsible for converting the record back to a proto with a
-  // ParseFromString() call.
-  void Enqueue(const google::protobuf::MessageLite* record,
+  // |record| as a protobuf (owned) will be converted to a string with
+  // SerializeToString(). The handler is responsible for converting the record
+  // back to a proto with a ParseFromString() call.
+  void Enqueue(std::unique_ptr<const google::protobuf::MessageLite> record,
                Priority priority,
                EnqueueCallback callback) const;
 
@@ -152,7 +153,7 @@
   PrepareToAttachActualQueue() const = 0;
 
  protected:
-  virtual void AddRecord(base::StringPiece record,
+  virtual void AddRecord(std::string record,
                          Priority priority,
                          EnqueueCallback callback) const = 0;
 };
diff --git a/components/reporting/client/report_queue_impl.cc b/components/reporting/client/report_queue_impl.cc
index 8986ab3..16993eb 100644
--- a/components/reporting/client/report_queue_impl.cc
+++ b/components/reporting/client/report_queue_impl.cc
@@ -53,7 +53,7 @@
   DETACH_FROM_SEQUENCE(sequence_checker_);
 }
 
-void ReportQueueImpl::AddRecord(base::StringPiece record,
+void ReportQueueImpl::AddRecord(std::string record,
                                 Priority priority,
                                 EnqueueCallback callback) const {
   const Status status = config_->CheckPolicy();
@@ -70,20 +70,20 @@
 
   sequenced_task_runner_->PostTask(
       FROM_HERE, base::BindOnce(&ReportQueueImpl::SendRecordToStorage,
-                                base::Unretained(this), std::string(record),
+                                base::Unretained(this), std::move(record),
                                 priority, std::move(callback)));
 }
 
-void ReportQueueImpl::SendRecordToStorage(base::StringPiece record_data,
+void ReportQueueImpl::SendRecordToStorage(std::string record_data,
                                           Priority priority,
                                           EnqueueCallback callback) const {
-  storage_->AddRecord(priority, AugmentRecord(record_data),
+  storage_->AddRecord(priority, AugmentRecord(std::move(record_data)),
                       std::move(callback));
 }
 
-Record ReportQueueImpl::AugmentRecord(base::StringPiece record_data) const {
+Record ReportQueueImpl::AugmentRecord(std::string record_data) const {
   Record record;
-  record.set_data(std::string(record_data));
+  *record.mutable_data() = std::move(record_data);
   record.set_destination(config_->destination());
 
   // record with no DM token is assumed to be associated with device DM token
@@ -153,18 +153,18 @@
           priority, std::move(callback), weak_ptr_factory_.GetWeakPtr()));
 }
 
-void SpeculativeReportQueueImpl::AddRecord(base::StringPiece record,
+void SpeculativeReportQueueImpl::AddRecord(std::string record,
                                            Priority priority,
                                            EnqueueCallback callback) const {
   sequenced_task_runner_->PostTask(
       FROM_HERE,
       base::BindOnce(&SpeculativeReportQueueImpl::MaybeEnqueueRecord,
-                     weak_ptr_factory_.GetWeakPtr(), std::string(record),
+                     weak_ptr_factory_.GetWeakPtr(), std::move(record),
                      priority, std::move(callback)));
 }
 
 void SpeculativeReportQueueImpl::MaybeEnqueueRecord(
-    base::StringPiece record,
+    std::string record,
     Priority priority,
     EnqueueCallback callback) const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
@@ -178,12 +178,12 @@
   // Queue is ready. If memory queue is empty, just forward the
   // record.
   if (pending_records_.empty()) {
-    report_queue_->Enqueue(record, priority, std::move(callback));
+    report_queue_->Enqueue(std::move(record), priority, std::move(callback));
     return;
   }
   // If memory queue is not empty, attach the new record at the
   // end and initiate enqueuing of everything from there.
-  pending_records_.emplace(record, priority);
+  pending_records_.emplace(std::move(record), priority);
   EnqueuePendingRecords(std::move(callback));
 }
 
diff --git a/components/reporting/client/report_queue_impl.h b/components/reporting/client/report_queue_impl.h
index 344b1ec..4f4ffcd 100644
--- a/components/reporting/client/report_queue_impl.h
+++ b/components/reporting/client/report_queue_impl.h
@@ -62,16 +62,15 @@
                   scoped_refptr<StorageModuleInterface> storage);
 
  private:
-  void AddRecord(base::StringPiece record,
+  void AddRecord(std::string record,
                  Priority priority,
                  EnqueueCallback callback) const override;
 
-  void SendRecordToStorage(base::StringPiece record,
+  void SendRecordToStorage(std::string record,
                            Priority priority,
                            EnqueueCallback callback) const;
 
-  [[nodiscard]] reporting::Record AugmentRecord(
-      base::StringPiece record_data) const;
+  [[nodiscard]] reporting::Record AugmentRecord(std::string record_data) const;
 
   std::unique_ptr<ReportQueueConfiguration> config_;
   scoped_refptr<StorageModuleInterface> storage_;
@@ -104,7 +103,7 @@
  protected:
   // Forwards |AddRecord| to |ReportQueue|, if already created.
   // Records the record internally otherwise.
-  void AddRecord(base::StringPiece record,
+  void AddRecord(std::string record,
                  Priority priority,
                  EnqueueCallback callback) const override;
 
@@ -116,9 +115,9 @@
   // Enqueues head of the |pending_records_| and reapplies for the rest of it.
   void EnqueuePendingRecords(EnqueueCallback callback) const;
 
-  // Optionally enqueues |record| to actual queue, if ready.
+  // Optionally enqueues |record| (owned) to actual queue, if ready.
   // Otherwise adds it to the end of |pending_records_|.
-  void MaybeEnqueueRecord(base::StringPiece record,
+  void MaybeEnqueueRecord(std::string record,
                           Priority priority,
                           EnqueueCallback callback) const;
 
diff --git a/components/reporting/client/report_queue_impl_unittest.cc b/components/reporting/client/report_queue_impl_unittest.cc
index 805e9c8..ba28fdd 100644
--- a/components/reporting/client/report_queue_impl_unittest.cc
+++ b/components/reporting/client/report_queue_impl_unittest.cc
@@ -119,7 +119,7 @@
   base::Value::Dict test_dict;
   test_dict.Set(kTestKey, kTestValue);
   test::TestEvent<Status> a;
-  report_queue_->Enqueue(test_dict, priority_, a.cb());
+  report_queue_->Enqueue(test_dict.Clone(), priority_, a.cb());
   EXPECT_OK(a.result());
 
   EXPECT_EQ(test_storage_module()->priority(), priority_);
@@ -133,15 +133,16 @@
 // Enqueues a |TestMessage| and ensures that it arrives unaltered in the
 // |StorageModuleInterface|.
 TEST_F(ReportQueueImplTest, SuccessfulProtoRecord) {
-  reporting::test::TestMessage test_message;
+  test::TestMessage test_message;
   test_message.set_test(kTestMessage);
   test::TestEvent<Status> a;
-  report_queue_->Enqueue(&test_message, priority_, a.cb());
+  report_queue_->Enqueue(std::make_unique<test::TestMessage>(test_message),
+                         priority_, a.cb());
   EXPECT_OK(a.result());
 
   EXPECT_EQ(test_storage_module()->priority(), priority_);
 
-  reporting::test::TestMessage result_message;
+  test::TestMessage result_message;
   ASSERT_TRUE(
       result_message.ParseFromString(test_storage_module()->record().data()));
   ASSERT_EQ(result_message.test(), test_message.test());
@@ -157,10 +158,11 @@
             std::move(callback).Run(Status(error::UNKNOWN, "Failing for Test"));
           })));
 
-  reporting::test::TestMessage test_message;
+  test::TestMessage test_message;
   test_message.set_test(kTestMessage);
   test::TestEvent<Status> a;
-  report_queue_->Enqueue(&test_message, priority_, a.cb());
+  report_queue_->Enqueue(std::make_unique<test::TestMessage>(test_message),
+                         priority_, a.cb());
   const auto result = a.result();
   EXPECT_FALSE(result.ok());
   EXPECT_EQ(result.error_code(), error::UNKNOWN);
@@ -171,7 +173,7 @@
       .WillOnce(Return(Status(error::UNAUTHENTICATED, "Failing for tests")));
   constexpr char kTestString[] = "El-Chupacabra";
   test::TestEvent<Status> a;
-  report_queue_->Enqueue(kTestString, priority_, a.cb());
+  report_queue_->Enqueue(std::string(kTestString), priority_, a.cb());
   const auto result = a.result();
   EXPECT_FALSE(result.ok());
   EXPECT_EQ(result.error_code(), error::UNAUTHENTICATED);
@@ -180,10 +182,11 @@
 TEST_F(ReportQueueImplTest, EnqueueProtoFailsOnPolicy) {
   EXPECT_CALL(mocked_policy_check_, Call())
       .WillOnce(Return(Status(error::UNAUTHENTICATED, "Failing for tests")));
-  reporting::test::TestMessage test_message;
+  test::TestMessage test_message;
   test_message.set_test(kTestMessage);
   test::TestEvent<Status> a;
-  report_queue_->Enqueue(&test_message, priority_, a.cb());
+  report_queue_->Enqueue(std::make_unique<test::TestMessage>(test_message),
+                         priority_, a.cb());
   const auto result = a.result();
   EXPECT_FALSE(result.ok());
   EXPECT_EQ(result.error_code(), error::UNAUTHENTICATED);
@@ -197,17 +200,18 @@
   base::Value::Dict test_dict;
   test_dict.Set(kTestKey, kTestValue);
   test::TestEvent<Status> a;
-  report_queue_->Enqueue(test_dict, priority_, a.cb());
+  report_queue_->Enqueue(test_dict.Clone(), priority_, a.cb());
   const auto result = a.result();
   EXPECT_FALSE(result.ok());
   EXPECT_EQ(result.error_code(), error::UNAUTHENTICATED);
 }
 
 TEST_F(ReportQueueImplTest, EnqueueAndFlushSuccess) {
-  reporting::test::TestMessage test_message;
+  test::TestMessage test_message;
   test_message.set_test(kTestMessage);
   test::TestEvent<Status> a;
-  report_queue_->Enqueue(&test_message, priority_, a.cb());
+  report_queue_->Enqueue(std::make_unique<test::TestMessage>(test_message),
+                         priority_, a.cb());
   EXPECT_OK(a.result());
   test::TestEvent<Status> f;
   report_queue_->Flush(priority_, f.cb());
@@ -215,10 +219,11 @@
 }
 
 TEST_F(ReportQueueImplTest, EnqueueSuccessFlushFailure) {
-  reporting::test::TestMessage test_message;
+  test::TestMessage test_message;
   test_message.set_test(kTestMessage);
   test::TestEvent<Status> a;
-  report_queue_->Enqueue(&test_message, priority_, a.cb());
+  report_queue_->Enqueue(std::make_unique<test::TestMessage>(test_message),
+                         priority_, a.cb());
   EXPECT_OK(a.result());
 
   EXPECT_CALL(*test_storage_module(), Flush(Eq(priority_), _))
@@ -240,7 +245,8 @@
   constexpr char kTestString[] = "El-Chupacabra";
   test::TestEvent<Status> a;
   auto speculative_report_queue = SpeculativeReportQueueImpl::Create();
-  speculative_report_queue->Enqueue(kTestString, priority_, a.cb());
+  speculative_report_queue->Enqueue(std::string(kTestString), priority_,
+                                    a.cb());
   EXPECT_OK(a.result());
 
   speculative_report_queue->AttachActualQueue(std::move(report_queue_));
@@ -263,9 +269,11 @@
 
   // Call `Enqueue` for 2 records before report queue is ready, both will be
   // added to pending records.
-  speculative_report_queue->Enqueue(kTestString1, priority_, event1.cb());
+  speculative_report_queue->Enqueue(std::string(kTestString1), priority_,
+                                    event1.cb());
   EXPECT_OK(event1.result());
-  speculative_report_queue->Enqueue(kTestString2, priority_, event2.cb());
+  speculative_report_queue->Enqueue(std::string(kTestString2), priority_,
+                                    event2.cb());
   EXPECT_OK(event2.result());
 
   base::queue<ReportQueue::EnqueueCallback> enqueue_cb_queue;
@@ -273,19 +281,19 @@
   auto mock_queue = std::make_unique<MockReportQueue>();
   EXPECT_CALL(*mock_queue, AddRecord)
       .Times(3)
-      .WillRepeatedly(
-          [&enqueue_cb_queue, &enqueue_count](base::StringPiece record_string,
-                                              Priority event_priority,
-                                              ReportQueue::EnqueueCallback cb) {
-            ++enqueue_count;
-            enqueue_cb_queue.emplace(std::move(cb));
-          });
+      .WillRepeatedly([&enqueue_cb_queue, &enqueue_count](
+                          std::string record_string, Priority event_priority,
+                          ReportQueue::EnqueueCallback cb) {
+        ++enqueue_count;
+        enqueue_cb_queue.emplace(std::move(cb));
+      });
 
   // First record should be enqueued after calling `AttachActualQueue`.
   speculative_report_queue->AttachActualQueue(std::move(mock_queue));
   // Second record should be enqueued after calling `Enqueue` for the third
   // record, and third record should be added to pending records.
-  speculative_report_queue->Enqueue(kTestString3, priority_, event3.cb());
+  speculative_report_queue->Enqueue(std::string(kTestString3), priority_,
+                                    event3.cb());
   task_environment_.RunUntilIdle();
   ASSERT_EQ(enqueue_count, 2);
 
@@ -312,8 +320,8 @@
 
 TEST_F(ReportQueueImplTest, EnqueueRecordWithInvalidPriority) {
   test::TestEvent<Status> event;
-  report_queue_->Enqueue(kTestMessage, Priority::UNDEFINED_PRIORITY,
-                         event.cb());
+  report_queue_->Enqueue(std::string(kTestMessage),
+                         Priority::UNDEFINED_PRIORITY, event.cb());
   const auto result = event.result();
 
   ASSERT_FALSE(result.ok());
diff --git a/components/reporting/client/report_queue_provider_unittest.cc b/components/reporting/client/report_queue_provider_unittest.cc
index 2abce5a7..44683d0 100644
--- a/components/reporting/client/report_queue_provider_unittest.cc
+++ b/components/reporting/client/report_queue_provider_unittest.cc
@@ -64,7 +64,7 @@
             // Asynchronously create ReportingQueue.
             base::OnceCallback<void(StatusOr<std::unique_ptr<ReportQueue>>)>
                 queue_cb = base::BindOnce(
-                    [](base::StringPiece data,
+                    [](std::string data,
                        reporting::ReportQueue::EnqueueCallback done_cb,
                        reporting::StatusOr<std::unique_ptr<
                            reporting::ReportQueue>> report_queue_result) {
@@ -76,14 +76,13 @@
                       // Queue created successfully, enqueue the message.
                       EXPECT_CALL(*static_cast<MockReportQueue*>(
                                       report_queue_result.ValueOrDie().get()),
-                                  AddRecord(StrEq(std::string(data)),
-                                            Eq(FAST_BATCH), _))
+                                  AddRecord(StrEq(data), Eq(FAST_BATCH), _))
                           .WillOnce(WithArg<2>(
                               Invoke([](ReportQueue::EnqueueCallback cb) {
                                 std::move(cb).Run(Status::StatusOK());
                               })));
                       report_queue_result.ValueOrDie()->Enqueue(
-                          data, FAST_BATCH, std::move(done_cb));
+                          std::move(data), FAST_BATCH, std::move(done_cb));
                     },
                     std::string(data), std::move(done_cb));
             reporting::ReportQueueProvider::CreateQueue(std::move(config),
diff --git a/components/reporting/metrics/fake_metric_report_queue.cc b/components/reporting/metrics/fake_metric_report_queue.cc
index 67f1b8aa..6635d0a 100644
--- a/components/reporting/metrics/fake_metric_report_queue.cc
+++ b/components/reporting/metrics/fake_metric_report_queue.cc
@@ -4,6 +4,9 @@
 
 #include "components/reporting/metrics/fake_metric_report_queue.h"
 
+#include <memory>
+#include <vector>
+
 #include "base/task/sequenced_task_runner.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "components/reporting/proto/synced/record_constants.pb.h"
@@ -35,9 +38,10 @@
                         default_rate,
                         rate_unit_to_ms) {}
 
-void FakeMetricReportQueue::Enqueue(const MetricData& metric_data,
-                                    ReportQueue::EnqueueCallback callback) {
-  reported_data_.emplace_back(metric_data);
+void FakeMetricReportQueue::Enqueue(
+    std::unique_ptr<const MetricData> metric_data,
+    ReportQueue::EnqueueCallback callback) {
+  reported_data_.emplace_back(std::move(metric_data));
   std::move(callback).Run(Status());
 }
 
@@ -47,7 +51,8 @@
   num_flush_++;
 }
 
-std::vector<MetricData> FakeMetricReportQueue::GetMetricDataReported() const {
+const std::vector<std::unique_ptr<const MetricData>>&
+FakeMetricReportQueue::GetMetricDataReported() const {
   return reported_data_;
 }
 
diff --git a/components/reporting/metrics/fake_metric_report_queue.h b/components/reporting/metrics/fake_metric_report_queue.h
index beee1d1..3f79237 100644
--- a/components/reporting/metrics/fake_metric_report_queue.h
+++ b/components/reporting/metrics/fake_metric_report_queue.h
@@ -5,6 +5,7 @@
 #ifndef COMPONENTS_REPORTING_METRICS_FAKE_METRIC_REPORT_QUEUE_H_
 #define COMPONENTS_REPORTING_METRICS_FAKE_METRIC_REPORT_QUEUE_H_
 
+#include <memory>
 #include <vector>
 
 #include "components/reporting/client/report_queue.h"
@@ -29,17 +30,18 @@
 
   ~FakeMetricReportQueue() override;
 
-  void Enqueue(const MetricData& metric_data,
+  void Enqueue(std::unique_ptr<const MetricData> metric_data,
                ReportQueue::EnqueueCallback callback) override;
 
-  std::vector<MetricData> GetMetricDataReported() const;
+  const std::vector<std::unique_ptr<const MetricData>>& GetMetricDataReported()
+      const;
 
   int GetNumFlush() const;
 
  private:
   void Flush() override;
 
-  std::vector<MetricData> reported_data_;
+  std::vector<std::unique_ptr<const MetricData>> reported_data_;
 
   int num_flush_ = 0;
 };
diff --git a/components/reporting/metrics/metric_data_collector.cc b/components/reporting/metrics/metric_data_collector.cc
index d0388ae..083afcfb 100644
--- a/components/reporting/metrics/metric_data_collector.cc
+++ b/components/reporting/metrics/metric_data_collector.cc
@@ -35,7 +35,7 @@
       base::SequencedTaskRunnerHandle::Get(), std::move(on_collected_cb)));
 }
 
-void CollectorBase::ReportMetricData(const MetricData& metric_data,
+void CollectorBase::ReportMetricData(MetricData metric_data,
                                      base::OnceClosure on_data_reported) {
   auto enqueue_cb = base::BindOnce(
       [](base::OnceClosure on_data_reported, Status status) {
@@ -46,7 +46,9 @@
         std::move(on_data_reported).Run();
       },
       std::move(on_data_reported));
-  metric_report_queue_->Enqueue(metric_data, std::move(enqueue_cb));
+  metric_report_queue_->Enqueue(
+      std::make_unique<MetricData>(std::move(metric_data)),
+      std::move(enqueue_cb));
 }
 
 OneShotCollector::OneShotCollector(Sampler* sampler,
@@ -84,7 +86,8 @@
   }
 
   metric_data->set_timestamp_ms(base::Time::Now().ToJavaTime());
-  ReportMetricData(metric_data.value(), std::move(on_data_reported_));
+  ReportMetricData(std::move(metric_data.value()),
+                   std::move(on_data_reported_));
 }
 
 PeriodicCollector::PeriodicCollector(Sampler* sampler,
@@ -122,7 +125,7 @@
   }
 
   metric_data->set_timestamp_ms(base::Time::Now().ToJavaTime());
-  ReportMetricData(metric_data.value());
+  ReportMetricData(std::move(metric_data.value()));
 }
 
 void PeriodicCollector::StartPeriodicCollection() {
@@ -236,6 +239,6 @@
     return;
   }
 
-  ReportMetricData(metric_data.value());
+  ReportMetricData(std::move(metric_data.value()));
 }
 }  // namespace reporting
diff --git a/components/reporting/metrics/metric_data_collector.h b/components/reporting/metrics/metric_data_collector.h
index 92366d90..1cbd49a 100644
--- a/components/reporting/metrics/metric_data_collector.h
+++ b/components/reporting/metrics/metric_data_collector.h
@@ -44,7 +44,7 @@
       absl::optional<MetricData> metric_data) = 0;
 
   virtual void ReportMetricData(
-      const MetricData& metric_data,
+      MetricData metric_data,
       base::OnceClosure on_data_reported = base::DoNothing());
 
   SEQUENCE_CHECKER(sequence_checker_);
diff --git a/components/reporting/metrics/metric_data_collector_unittest.cc b/components/reporting/metrics/metric_data_collector_unittest.cc
index ad4a8cc6..e9cd451a 100644
--- a/components/reporting/metrics/metric_data_collector_unittest.cc
+++ b/components/reporting/metrics/metric_data_collector_unittest.cc
@@ -18,6 +18,7 @@
 #include "components/reporting/metrics/fake_sampler.h"
 #include "components/reporting/metrics/metric_report_queue.h"
 #include "components/reporting/proto/synced/metric_data.pb.h"
+#include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
@@ -36,7 +37,8 @@
   absl::optional<MetricEventType> DetectEvent(
       const MetricData& previous_metric_data,
       const MetricData& current_metric_data) override {
-    previous_metric_list_.emplace_back(previous_metric_data);
+    previous_metric_list_.emplace_back(
+        std::make_unique<const MetricData>(previous_metric_data));
     if (!has_event_) {
       return absl::nullopt;
     }
@@ -45,14 +47,15 @@
 
   void SetHasEvent(bool has_event) { has_event_ = has_event; }
 
-  std::vector<MetricData> GetPreviousMetricList() {
+  const std::vector<std::unique_ptr<const MetricData>>& GetPreviousMetricList()
+      const {
     return previous_metric_list_;
   }
 
  private:
   bool has_event_ = false;
 
-  std::vector<MetricData> previous_metric_list_;
+  std::vector<std::unique_ptr<const MetricData>> previous_metric_list_;
 };
 }  // namespace test
 
@@ -110,12 +113,13 @@
   EXPECT_EQ(sampler_->GetNumCollectCalls(), 1);
 
   FlushTasks();
-  auto metric_data_reported = metric_report_queue_->GetMetricDataReported();
+  const auto& metric_data_reported =
+      metric_report_queue_->GetMetricDataReported();
 
-  ASSERT_EQ(metric_data_reported.size(), 1ul);
+  ASSERT_THAT(metric_data_reported, ::testing::SizeIs(1));
   EXPECT_TRUE(callback_called);
-  EXPECT_TRUE(metric_data_reported[0].has_timestamp_ms());
-  EXPECT_TRUE(metric_data_reported[0].has_info_data());
+  EXPECT_TRUE(metric_data_reported[0]->has_timestamp_ms());
+  EXPECT_TRUE(metric_data_reported[0]->has_info_data());
 }
 
 TEST_F(MetricDataCollectorTest, OneShotCollector_NoMetricData) {
@@ -134,7 +138,8 @@
   // Setting is initially enabled, data is being collected.
   EXPECT_EQ(sampler_->GetNumCollectCalls(), 1);
   FlushTasks();
-  auto metric_data_reported = metric_report_queue_->GetMetricDataReported();
+  const auto& metric_data_reported =
+      metric_report_queue_->GetMetricDataReported();
 
   ASSERT_TRUE(metric_data_reported.empty());
   EXPECT_FALSE(callback_called);
@@ -167,11 +172,12 @@
   EXPECT_EQ(sampler_->GetNumCollectCalls(), 1);
 
   FlushTasks();
-  auto metric_data_reported = metric_report_queue_->GetMetricDataReported();
+  const auto& metric_data_reported =
+      metric_report_queue_->GetMetricDataReported();
 
-  ASSERT_EQ(metric_data_reported.size(), 1ul);
-  EXPECT_TRUE(metric_data_reported[0].has_timestamp_ms());
-  EXPECT_TRUE(metric_data_reported[0].has_info_data());
+  ASSERT_THAT(metric_data_reported, ::testing::SizeIs(1));
+  EXPECT_TRUE(metric_data_reported[0]->has_timestamp_ms());
+  EXPECT_TRUE(metric_data_reported[0]->has_info_data());
 }
 
 TEST_F(MetricDataCollectorTest, OneShotCollector_DefaultEnabled) {
@@ -191,12 +197,13 @@
   EXPECT_EQ(sampler_->GetNumCollectCalls(), 1);
 
   FlushTasks();
-  auto metric_data_reported = metric_report_queue_->GetMetricDataReported();
+  const auto& metric_data_reported =
+      metric_report_queue_->GetMetricDataReported();
 
-  ASSERT_EQ(metric_data_reported.size(), 1ul);
+  ASSERT_THAT(metric_data_reported, ::testing::SizeIs(1));
   EXPECT_TRUE(callback_called);
-  EXPECT_TRUE(metric_data_reported[0].has_timestamp_ms());
-  EXPECT_TRUE(metric_data_reported[0].has_info_data());
+  EXPECT_TRUE(metric_data_reported[0]->has_timestamp_ms());
+  EXPECT_TRUE(metric_data_reported[0]->has_info_data());
 }
 
 TEST_F(MetricDataCollectorTest, OneShotCollector_DefaultDisabled) {
@@ -275,16 +282,17 @@
   EXPECT_EQ(sampler_->GetNumCollectCalls(), expected_collect_calls);
 
   FlushTasks();
-  auto metric_data_reported = metric_report_queue_->GetMetricDataReported();
+  const auto& metric_data_reported =
+      metric_report_queue_->GetMetricDataReported();
 
-  ASSERT_EQ(metric_data_reported.size(), 5ul);
+  ASSERT_THAT(metric_data_reported, ::testing::SizeIs(5));
   for (int i = 0; i < 5; ++i) {
-    EXPECT_TRUE(metric_data_reported[i].has_timestamp_ms());
-    EXPECT_EQ(metric_data_reported[i].has_telemetry_data(),
+    EXPECT_TRUE(metric_data_reported[i]->has_timestamp_ms());
+    EXPECT_EQ(metric_data_reported[i]->has_telemetry_data(),
               metric_data[i].has_telemetry_data());
-    EXPECT_EQ(metric_data_reported[i].has_info_data(),
+    EXPECT_EQ(metric_data_reported[i]->has_info_data(),
               metric_data[i].has_info_data());
-    EXPECT_EQ(metric_data_reported[i].has_event_data(),
+    EXPECT_EQ(metric_data_reported[i]->has_event_data(),
               metric_data[i].has_event_data());
   }
 }
@@ -304,7 +312,8 @@
   // One initial collection at startup.
   EXPECT_EQ(sampler_->GetNumCollectCalls(), 1);
   FlushTasks();
-  auto metric_data_reported = metric_report_queue_->GetMetricDataReported();
+  const auto& metric_data_reported =
+      metric_report_queue_->GetMetricDataReported();
 
   ASSERT_TRUE(metric_data_reported.empty());
 }
@@ -338,13 +347,14 @@
   EXPECT_EQ(sampler_->GetNumCollectCalls(), 2);
 
   FlushTasks();
-  auto metric_data_reported = metric_report_queue_->GetMetricDataReported();
+  const auto& metric_data_reported =
+      metric_report_queue_->GetMetricDataReported();
 
-  ASSERT_EQ(metric_data_reported.size(), 2ul);
-  EXPECT_TRUE(metric_data_reported[0].has_timestamp_ms());
-  EXPECT_TRUE(metric_data_reported[0].has_telemetry_data());
-  EXPECT_TRUE(metric_data_reported[1].has_timestamp_ms());
-  EXPECT_TRUE(metric_data_reported[1].has_telemetry_data());
+  ASSERT_THAT(metric_data_reported, ::testing::SizeIs(2));
+  EXPECT_TRUE(metric_data_reported[0]->has_timestamp_ms());
+  EXPECT_TRUE(metric_data_reported[0]->has_telemetry_data());
+  EXPECT_TRUE(metric_data_reported[1]->has_timestamp_ms());
+  EXPECT_TRUE(metric_data_reported[1]->has_telemetry_data());
 }
 
 TEST_F(MetricDataCollectorTest, PeriodicCollector_DefaultEnabled) {
@@ -373,14 +383,15 @@
   EXPECT_EQ(sampler_->GetNumCollectCalls(), 2);
 
   FlushTasks();
-  auto metric_data_reported = metric_report_queue_->GetMetricDataReported();
+  const auto& metric_data_reported =
+      metric_report_queue_->GetMetricDataReported();
 
-  ASSERT_EQ(metric_data_reported.size(), 2ul);
-  EXPECT_TRUE(metric_data_reported[0].has_timestamp_ms());
-  EXPECT_TRUE(metric_data_reported[0].has_telemetry_data());
-  EXPECT_TRUE(metric_data_reported[1].has_timestamp_ms());
-  EXPECT_FALSE(metric_data_reported[1].has_telemetry_data());
-  EXPECT_TRUE(metric_data_reported[1].has_event_data());
+  ASSERT_THAT(metric_data_reported, ::testing::SizeIs(2));
+  EXPECT_TRUE(metric_data_reported[0]->has_timestamp_ms());
+  EXPECT_TRUE(metric_data_reported[0]->has_telemetry_data());
+  EXPECT_TRUE(metric_data_reported[1]->has_timestamp_ms());
+  EXPECT_FALSE(metric_data_reported[1]->has_telemetry_data());
+  EXPECT_TRUE(metric_data_reported[1]->has_event_data());
 }
 
 TEST_F(MetricDataCollectorTest, PeriodicCollector_DefaultDisabled) {
@@ -441,32 +452,34 @@
   // Data collected but not reported.
   EXPECT_EQ(sampler_->GetNumCollectCalls(), 3);
   FlushTasks();
-  auto previous_metric_list = event_detector_ptr->GetPreviousMetricList();
+  const auto& previous_metric_list =
+      event_detector_ptr->GetPreviousMetricList();
 
-  ASSERT_EQ(previous_metric_list.size(), 3ul);
+  ASSERT_THAT(previous_metric_list, ::testing::SizeIs(3));
 
-  EXPECT_FALSE(previous_metric_list[0].has_timestamp_ms());
-  EXPECT_FALSE(previous_metric_list[0].has_info_data());
-  EXPECT_FALSE(previous_metric_list[0].has_telemetry_data());
-  EXPECT_FALSE(previous_metric_list[0].has_event_data());
+  EXPECT_FALSE(previous_metric_list[0]->has_timestamp_ms());
+  EXPECT_FALSE(previous_metric_list[0]->has_info_data());
+  EXPECT_FALSE(previous_metric_list[0]->has_telemetry_data());
+  EXPECT_FALSE(previous_metric_list[0]->has_event_data());
 
-  EXPECT_TRUE(previous_metric_list[1].has_timestamp_ms());
-  EXPECT_TRUE(previous_metric_list[1].has_info_data());
-  EXPECT_FALSE(previous_metric_list[1].has_telemetry_data());
-  EXPECT_FALSE(previous_metric_list[1].has_event_data());
+  EXPECT_TRUE(previous_metric_list[1]->has_timestamp_ms());
+  EXPECT_TRUE(previous_metric_list[1]->has_info_data());
+  EXPECT_FALSE(previous_metric_list[1]->has_telemetry_data());
+  EXPECT_FALSE(previous_metric_list[1]->has_event_data());
 
-  EXPECT_TRUE(previous_metric_list[2].has_timestamp_ms());
-  EXPECT_FALSE(previous_metric_list[2].has_info_data());
-  EXPECT_TRUE(previous_metric_list[2].has_telemetry_data());
-  EXPECT_TRUE(previous_metric_list[2].has_event_data());
+  EXPECT_TRUE(previous_metric_list[2]->has_timestamp_ms());
+  EXPECT_FALSE(previous_metric_list[2]->has_info_data());
+  EXPECT_TRUE(previous_metric_list[2]->has_telemetry_data());
+  EXPECT_TRUE(previous_metric_list[2]->has_event_data());
 
-  auto metric_data_reported = metric_report_queue_->GetMetricDataReported();
+  const auto& metric_data_reported =
+      metric_report_queue_->GetMetricDataReported();
 
-  ASSERT_EQ(metric_data_reported.size(), 1ul);
-  EXPECT_TRUE(metric_data_reported[0].has_timestamp_ms());
-  EXPECT_FALSE(metric_data_reported[0].has_info_data());
-  EXPECT_TRUE(metric_data_reported[0].has_telemetry_data());
-  EXPECT_TRUE(metric_data_reported[0].has_event_data());
+  ASSERT_THAT(metric_data_reported, ::testing::SizeIs(1));
+  EXPECT_TRUE(metric_data_reported[0]->has_timestamp_ms());
+  EXPECT_FALSE(metric_data_reported[0]->has_info_data());
+  EXPECT_TRUE(metric_data_reported[0]->has_telemetry_data());
+  EXPECT_TRUE(metric_data_reported[0]->has_event_data());
 }
 
 TEST_F(MetricDataCollectorTest, PeriodicEventCollector_WithAdditionalSamplers) {
@@ -516,21 +529,22 @@
   EXPECT_EQ(sampler_->GetNumCollectCalls(), 1);
 
   task_environment_.RunUntilIdle();
-  auto metric_data_reported = metric_report_queue_->GetMetricDataReported();
+  const auto& metric_data_reported =
+      metric_report_queue_->GetMetricDataReported();
 
-  ASSERT_EQ(metric_data_reported.size(), 1ul);
-  EXPECT_TRUE(metric_data_reported[0].has_timestamp_ms());
-  EXPECT_TRUE(metric_data_reported[0].has_event_data());
-  ASSERT_TRUE(metric_data_reported[0].has_telemetry_data());
+  ASSERT_THAT(metric_data_reported, ::testing::SizeIs(1));
+  EXPECT_TRUE(metric_data_reported[0]->has_timestamp_ms());
+  EXPECT_TRUE(metric_data_reported[0]->has_event_data());
+  ASSERT_TRUE(metric_data_reported[0]->has_telemetry_data());
   ASSERT_TRUE(
-      metric_data_reported[0].telemetry_data().has_networks_telemetry());
+      metric_data_reported[0]->telemetry_data().has_networks_telemetry());
   ASSERT_TRUE(metric_data_reported[0]
-                  .telemetry_data()
+                  ->telemetry_data()
                   .networks_telemetry()
                   .has_https_latency_data());
 
   auto https_latency_data = metric_data_reported[0]
-                                .telemetry_data()
+                                ->telemetry_data()
                                 .networks_telemetry()
                                 .https_latency_data();
   EXPECT_EQ(https_latency_data.verdict(), additional_metric_data[0]
diff --git a/components/reporting/metrics/metric_event_observer_manager.cc b/components/reporting/metrics/metric_event_observer_manager.cc
index f8bab08..de76712 100644
--- a/components/reporting/metrics/metric_event_observer_manager.cc
+++ b/components/reporting/metrics/metric_event_observer_manager.cc
@@ -88,6 +88,8 @@
           << status;
     }
   });
-  metric_report_queue_->Enqueue(metric_data.value(), std::move(enqueue_cb));
+  metric_report_queue_->Enqueue(
+      std::make_unique<MetricData>(std::move(metric_data.value())),
+      std::move(enqueue_cb));
 }
 }  // namespace reporting
diff --git a/components/reporting/metrics/metric_event_observer_manager_unittest.cc b/components/reporting/metrics/metric_event_observer_manager_unittest.cc
index 3288f3a4..f114254 100644
--- a/components/reporting/metrics/metric_event_observer_manager_unittest.cc
+++ b/components/reporting/metrics/metric_event_observer_manager_unittest.cc
@@ -35,7 +35,7 @@
  protected:
   base::test::SingleThreadTaskEnvironment task_environment_;
 
-  const std::string kEnableSettingPath = "enable_path";
+  static constexpr char kEnableSettingPath[] = "enable_path";
 
   std::unique_ptr<test::FakeReportingSettings> settings_;
   std::unique_ptr<test::FakeMetricEventObserver> event_observer_;
@@ -58,10 +58,11 @@
   for (size_t i = 0; i < reporting_count; ++i) {
     event_observer_ptr->RunCallback(metric_data);
 
-    auto metric_data_reported = metric_report_queue_->GetMetricDataReported();
-    ASSERT_EQ(metric_data_reported.size(), i + 1);
-    EXPECT_TRUE(metric_data_reported[i].has_timestamp_ms());
-    EXPECT_TRUE(metric_data_reported[i].has_event_data());
+    const auto& metric_data_reported =
+        metric_report_queue_->GetMetricDataReported();
+    ASSERT_THAT(metric_data_reported, ::testing::SizeIs(i + 1));
+    EXPECT_TRUE(metric_data_reported[i]->has_timestamp_ms());
+    EXPECT_TRUE(metric_data_reported[i]->has_event_data());
   }
 
   // Setting disabled, no more data should be reported even if the callback is
@@ -71,8 +72,8 @@
   event_observer_ptr->RunCallback(metric_data);
 
   ASSERT_FALSE(event_observer_ptr->GetReportingEnabled());
-  EXPECT_EQ(metric_report_queue_->GetMetricDataReported().size(),
-            reporting_count);
+  EXPECT_THAT(metric_report_queue_->GetMetricDataReported(),
+              ::testing::SizeIs(reporting_count));
 }
 
 TEST_F(MetricEventObserverManagerTest, InitiallyDisabled) {
@@ -96,9 +97,10 @@
   event_observer_ptr->RunCallback(metric_data);
 
   ASSERT_TRUE(event_observer_ptr->GetReportingEnabled());
-  auto metric_data_reported = metric_report_queue_->GetMetricDataReported();
-  ASSERT_EQ(metric_data_reported.size(), 1ul);
-  EXPECT_TRUE(metric_data_reported[0].has_event_data());
+  const auto& metric_data_reported =
+      metric_report_queue_->GetMetricDataReported();
+  ASSERT_THAT(metric_data_reported, ::testing::SizeIs(1));
+  EXPECT_TRUE(metric_data_reported[0]->has_event_data());
 }
 
 TEST_F(MetricEventObserverManagerTest, DefaultEnabled) {
@@ -114,10 +116,11 @@
   ASSERT_TRUE(event_observer_ptr->GetReportingEnabled());
   event_observer_ptr->RunCallback(metric_data);
 
-  auto metric_data_reported = metric_report_queue_->GetMetricDataReported();
-  ASSERT_EQ(metric_data_reported.size(), 1ul);
-  EXPECT_TRUE(metric_data_reported[0].has_timestamp_ms());
-  EXPECT_TRUE(metric_data_reported[0].has_event_data());
+  const auto& metric_data_reported =
+      metric_report_queue_->GetMetricDataReported();
+  ASSERT_THAT(metric_data_reported, ::testing::SizeIs(1));
+  EXPECT_TRUE(metric_data_reported[0]->has_timestamp_ms());
+  EXPECT_TRUE(metric_data_reported[0]->has_event_data());
 }
 
 TEST_F(MetricEventObserverManagerTest, DefaultDisabled) {
@@ -161,14 +164,15 @@
   event_observer_ptr->RunCallback(metric_data);
   task_environment_.RunUntilIdle();
 
-  auto metric_data_reported = metric_report_queue_->GetMetricDataReported();
+  const auto& metric_data_reported =
+      metric_report_queue_->GetMetricDataReported();
 
   ASSERT_EQ(additional_sampler.GetNumCollectCalls(), 1);
   EXPECT_EQ(empty_additional_sampler.GetNumCollectCalls(), 1);
   ASSERT_THAT(metric_data_reported, ::testing::SizeIs(1));
-  EXPECT_TRUE(metric_data_reported[0].has_timestamp_ms());
-  EXPECT_TRUE(metric_data_reported[0].has_event_data());
-  EXPECT_TRUE(metric_data_reported[0].has_telemetry_data());
+  EXPECT_TRUE(metric_data_reported[0]->has_timestamp_ms());
+  EXPECT_TRUE(metric_data_reported[0]->has_event_data());
+  EXPECT_TRUE(metric_data_reported[0]->has_telemetry_data());
 }
 
 }  // namespace
diff --git a/components/reporting/metrics/metric_report_queue.cc b/components/reporting/metrics/metric_report_queue.cc
index d571648f..2cc535bf 100644
--- a/components/reporting/metrics/metric_report_queue.cc
+++ b/components/reporting/metrics/metric_report_queue.cc
@@ -34,9 +34,10 @@
 
 MetricReportQueue::~MetricReportQueue() = default;
 
-void MetricReportQueue::Enqueue(const MetricData& metric_data,
+void MetricReportQueue::Enqueue(std::unique_ptr<const MetricData> metric_data,
                                 ReportQueue::EnqueueCallback callback) {
-  report_queue_->Enqueue(&metric_data, priority_, std::move(callback));
+  report_queue_->Enqueue(std::move(metric_data), priority_,
+                         std::move(callback));
 }
 
 void MetricReportQueue::Upload() {
diff --git a/components/reporting/metrics/metric_report_queue.h b/components/reporting/metrics/metric_report_queue.h
index ec45833..b03055fe 100644
--- a/components/reporting/metrics/metric_report_queue.h
+++ b/components/reporting/metrics/metric_report_queue.h
@@ -43,7 +43,7 @@
   virtual ~MetricReportQueue();
 
   // Enqueue the metric data.
-  virtual void Enqueue(const MetricData& metric_data,
+  virtual void Enqueue(std::unique_ptr<const MetricData> metric_data,
                        ReportQueue::EnqueueCallback callback);
 
   // Initiate manual upload of records with `priority_` and restart timer if
diff --git a/components/reporting/metrics/metric_report_queue_unittest.cc b/components/reporting/metrics/metric_report_queue_unittest.cc
index 48266cd..fe28437f 100644
--- a/components/reporting/metrics/metric_report_queue_unittest.cc
+++ b/components/reporting/metrics/metric_report_queue_unittest.cc
@@ -72,8 +72,9 @@
       });
   bool callback_called = false;
   metric_report_queue.Enqueue(
-      record, base::BindLambdaForTesting(
-                  [&callback_called](Status) { callback_called = true; }));
+      std::make_unique<MetricData>(record),
+      base::BindLambdaForTesting(
+          [&callback_called](Status) { callback_called = true; }));
   EXPECT_TRUE(callback_called);
 
   EXPECT_CALL(*mock_queue_ptr, Flush(priority_, _)).Times(1);
@@ -97,7 +98,7 @@
                                         kDefaultRate);
 
   EXPECT_CALL(*mock_queue_ptr, AddRecord(_, _, _))
-      .WillOnce([&record, this](base::StringPiece record_string,
+      .WillOnce([&record, this](std::string record_string,
                                 Priority actual_priority,
                                 ReportQueue::EnqueueCallback cb) {
         std::move(cb).Run(Status());
@@ -110,8 +111,9 @@
       });
   bool callback_called = false;
   metric_report_queue.Enqueue(
-      record, base::BindLambdaForTesting(
-                  [&callback_called](Status) { callback_called = true; }));
+      std::make_unique<MetricData>(record),
+      base::BindLambdaForTesting(
+          [&callback_called](Status) { callback_called = true; }));
   EXPECT_TRUE(callback_called);
 
   ON_CALL(*mock_queue_ptr, Flush(priority_, _)).WillByDefault([&]() {
@@ -147,7 +149,7 @@
                                         kDefaultRate);
 
   EXPECT_CALL(*mock_queue_ptr, AddRecord(_, _, _))
-      .WillOnce([&record, this](base::StringPiece record_string,
+      .WillOnce([&record, this](std::string record_string,
                                 Priority actual_priority,
                                 ReportQueue::EnqueueCallback cb) {
         std::move(cb).Run(Status());
@@ -160,8 +162,9 @@
       });
   bool callback_called = false;
   metric_report_queue.Enqueue(
-      record, base::BindLambdaForTesting(
-                  [&callback_called](Status) { callback_called = true; }));
+      std::make_unique<MetricData>(record),
+      base::BindLambdaForTesting(
+          [&callback_called](Status) { callback_called = true; }));
   EXPECT_TRUE(callback_called);
 
   EXPECT_CALL(*mock_queue_ptr, Flush).Times(0);
@@ -184,7 +187,7 @@
                                         kDefaultRate);
 
   EXPECT_CALL(*mock_queue_ptr, AddRecord(_, _, _))
-      .WillOnce([&record, this](base::StringPiece record_string,
+      .WillOnce([&record, this](std::string record_string,
                                 Priority actual_priority,
                                 ReportQueue::EnqueueCallback cb) {
         std::move(cb).Run(Status());
@@ -197,8 +200,9 @@
       });
   bool callback_called = false;
   metric_report_queue.Enqueue(
-      record, base::BindLambdaForTesting(
-                  [&callback_called](Status) { callback_called = true; }));
+      std::make_unique<MetricData>(record),
+      base::BindLambdaForTesting(
+          [&callback_called](Status) { callback_called = true; }));
   EXPECT_TRUE(callback_called);
 
   EXPECT_CALL(*mock_queue_ptr, Flush(priority_, _)).Times(1);
diff --git a/components/security_interstitials/content/security_interstitial_tab_helper_unittest.cc b/components/security_interstitials/content/security_interstitial_tab_helper_unittest.cc
index 99f68d3..8643b7f 100644
--- a/components/security_interstitials/content/security_interstitial_tab_helper_unittest.cc
+++ b/components/security_interstitials/content/security_interstitial_tab_helper_unittest.cc
@@ -263,6 +263,7 @@
       content::NavigationSimulator::CreateRendererInitiated(fenced_frame_url,
                                                             fenced_frame_rfh);
   navigation_simulator->Commit();
+  fenced_frame_rfh = navigation_simulator->GetFinalRenderFrameHost();
   EXPECT_TRUE(fenced_frame_rfh->IsFencedFrameRoot());
   EXPECT_FALSE(blocking_page_destroyed);
   EXPECT_TRUE(helper->IsDisplayingInterstitial());
diff --git a/components/services/screen_ai/DEPS b/components/services/screen_ai/DEPS
index 56522424..c12b2ff5e 100644
--- a/components/services/screen_ai/DEPS
+++ b/components/services/screen_ai/DEPS
@@ -1,3 +1,4 @@
 include_rules = [
-  "+ui/accessibility"
-]
\ No newline at end of file
+  "+ui/accessibility",
+  "+ui/gfx/geometry",
+]
diff --git a/components/services/screen_ai/proto/chrome_screen_ai.proto b/components/services/screen_ai/proto/chrome_screen_ai.proto
index 7f3fc40..5c7e1d2 100644
--- a/components/services/screen_ai/proto/chrome_screen_ai.proto
+++ b/components/services/screen_ai/proto/chrome_screen_ai.proto
@@ -264,6 +264,13 @@
   float angle = 5;
 }
 
+enum Direction {
+  LEFT_TO_RIGHT = 0;
+  RIGHT_TO_LEFT = 1;
+  UNSPECIFIED = 2;
+  TOP_TO_BOTTOM = 3;
+}
+
 // Text line with associated bounding box.
 // This proto is copied from google3/ocr/photo/proto/image.proto.
 message LineBox {
@@ -291,7 +298,7 @@
   int32 order_within_block = 7;
 
   // The direction of the script contained in the word. Directed by the enum
-  // ocr.photo.Direction defined above.
+  // Direction defined above.
   int32 direction = 8;
 
   // Content type for this line.
@@ -343,7 +350,7 @@
   int32 background_rgb_value = 12;
 
   // The direction of the script contained in the word. Directed by the enum
-  // ocr.photo.Direction defined above.
+  // Direction defined above.
   int32 direction = 13;
 
   // Content type for this word.
diff --git a/components/services/screen_ai/proto/proto_convertor.cc b/components/services/screen_ai/proto/proto_convertor.cc
index 9eb6476..5a46c5c 100644
--- a/components/services/screen_ai/proto/proto_convertor.cc
+++ b/components/services/screen_ai/proto/proto_convertor.cc
@@ -4,12 +4,19 @@
 
 #include "components/services/screen_ai/proto/proto_convertor.h"
 
+#include <memory>
+
 #include "base/containers/contains.h"
 #include "components/services/screen_ai/proto/chrome_screen_ai.pb.h"
 #include "components/services/screen_ai/proto/dimension.pb.h"
 #include "components/services/screen_ai/proto/view_hierarchy.pb.h"
 #include "components/services/screen_ai/public/mojom/screen_ai_service.mojom.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "ui/accessibility/ax_enum_util.h"
+#include "ui/accessibility/ax_enums.mojom.h"
+#include "ui/accessibility/ax_node_data.h"
+#include "ui/gfx/geometry/rect_f.h"
+#include "ui/gfx/geometry/transform.h"
 
 namespace {
 
@@ -19,6 +26,69 @@
 // adjust this threshold.
 const float kScreenAIMinConfidenceThreshold = 0.1;
 
+// Returns the next valid ID that can be used for identifying `AXNode`s in the
+// accessibility tree.
+ui::AXNodeID GetNextNodeID() {
+  static int next_node_id = 1;
+  return next_node_id++;
+}
+
+void SerializePredictedType(
+    const chrome_screen_ai::UIComponent_PredictedType& predicted_type,
+    ui::AXNodeData& out_data) {
+  switch (predicted_type.type_of_case()) {
+    case chrome_screen_ai::UIComponent_PredictedType::kEnumType:
+      // TODO(https://crbug.com/1278249): Add tests to ensure these two types
+      // match. Add a PRESUBMIT test that compares the proto and enum.
+      // TODO(accessibility): Why do we even need an enum. Couldn't all
+      // predicted types be strings? We could easily map from a string to an
+      // ax::mojom::Role. Then, we won't need to keep the enums synced.
+      out_data.role = static_cast<ax::mojom::Role>(predicted_type.enum_type());
+      break;
+    case chrome_screen_ai::UIComponent_PredictedType::kStringType:
+      out_data.role = ax::mojom::Role::kGenericContainer;
+      out_data.AddStringAttribute(ax::mojom::StringAttribute::kRoleDescription,
+                                  predicted_type.string_type());
+      break;
+    case chrome_screen_ai::UIComponent_PredictedType::TYPE_OF_NOT_SET:
+      // TODO(accessibility): Why is this a possibility if the member in the
+      // proto is not marked optional?
+      NOTREACHED();
+      break;
+  }
+}
+
+void SerializeBoundingBox(const chrome_screen_ai::Rect& bounding_box,
+                          const ui::AXNodeID& container_id,
+                          ui::AXNodeData& out_data) {
+  out_data.relative_bounds.bounds =
+      gfx::RectF(bounding_box.x(), bounding_box.y(), bounding_box.width(),
+                 bounding_box.height());
+  if (container_id != ui::kInvalidAXNodeID)
+    out_data.relative_bounds.offset_container_id = container_id;
+  if (bounding_box.angle()) {
+    out_data.relative_bounds.transform = std::make_unique<gfx::Transform>();
+    out_data.relative_bounds.transform->Rotate(bounding_box.angle());
+  }
+}
+
+absl::optional<ui::AXNodeData> SerializeUIComponent(
+    const chrome_screen_ai::UIComponent& ui_component) {
+  // The score is only used to prune very low confidence detections and we don't
+  // use it in the accessibility tree.
+  if (ui_component.predicted_type().confidence() <
+      kScreenAIMinConfidenceThreshold) {
+    return absl::nullopt;
+  }
+
+  ui::AXNodeData node_data;
+  node_data.id = GetNextNodeID();
+  SerializePredictedType(ui_component.predicted_type(), node_data);
+  SerializeBoundingBox(ui_component.bounding_box(),
+                       /* container_id */ ui::kInvalidAXNodeID, node_data);
+  return node_data;
+}
+
 // Adds the subtree of |nodes[node_index_to_add]| to |nodes_order| with
 // pre-order traversal.
 // The comment at the beginning of |Screen2xSnapshotToViewHierarchy| explains
@@ -29,7 +99,7 @@
                 const int node_index_to_add) {
   nodes_order.push_back(node_index_to_add);
   const ui::AXNodeData& node = nodes[node_index_to_add];
-  for (int32_t child_id : node.child_ids)
+  for (const ui::AXNodeID& child_id : node.child_ids)
     AddSubTree(nodes, id_to_position, nodes_order, id_to_position[child_id]);
 }
 
@@ -39,53 +109,28 @@
 
 ui::AXTreeUpdate ScreenAIVisualAnnotationToAXTreeUpdate(
     const std::string& serialized_proto) {
-  ui::AXTreeUpdate updates;
+  ui::AXTreeUpdate update;
 
-  chrome_screen_ai::VisualAnnotation results;
-  if (!results.ParseFromString(serialized_proto)) {
+  chrome_screen_ai::VisualAnnotation visual_annotation;
+  if (!visual_annotation.ParseFromString(serialized_proto)) {
     VLOG(1) << "Could not parse Screen AI library output.";
-    return updates;
+    return update;
   }
 
   // TODO(https://crbug.com/1278249): Create an AXTreeSource and create the
   // update using AXTreeSerializer.
 
-  for (const auto& uic : results.ui_component()) {
-    // Score is only used to prune very low confidence detections and we don't
-    // use it downstream.
-    if (uic.predicted_type().confidence() < kScreenAIMinConfidenceThreshold)
-      continue;
-
-    ui::AXNodeData node;
-
-    node.relative_bounds.bounds.set_x(uic.bounding_box().x());
-    node.relative_bounds.bounds.set_y(uic.bounding_box().y());
-    node.relative_bounds.bounds.set_width(uic.bounding_box().width());
-    node.relative_bounds.bounds.set_height(uic.bounding_box().height());
-
-    switch (uic.predicted_type().type_of_case()) {
-      case chrome_screen_ai::UIComponent_PredictedType::kEnumType:
-        // TODO(https://crbug.com/1278249): Add tests to ensure these two types
-        // match. Add a PRESUBMIT test that compares the proto and enum.
-        node.role =
-            static_cast<ax::mojom::Role>(uic.predicted_type().enum_type());
-        break;
-      case chrome_screen_ai::UIComponent_PredictedType::kStringType:
-        node.role = ax::mojom::Role::kGenericContainer;
-        node.AddStringAttribute(ax::mojom::StringAttribute::kRoleDescription,
-                                uic.predicted_type().string_type());
-        break;
-      case chrome_screen_ai::UIComponent_PredictedType::TYPE_OF_NOT_SET:
-        NOTREACHED();
-        continue;
-    }
-    updates.nodes.push_back(node);
+  for (const auto& ui_component : visual_annotation.ui_component()) {
+    absl::optional<ui::AXNodeData> node_data =
+        SerializeUIComponent(ui_component);
+    if (node_data)
+      update.nodes.push_back(*node_data);
   }
 
   // TODO(https://crbug.com/1278249): Add UMA metrics to record the number of
   // annotations, item types, confidence levels, etc.
 
-  return updates;
+  return update;
 }
 
 std::string Screen2xSnapshotToViewHierarchy(const ui::AXTreeUpdate& snapshot) {
@@ -115,7 +160,7 @@
     const ui::AXNodeData& node = snapshot.nodes[i];
 
     id_to_position[static_cast<int>(node.id)] = static_cast<int>(i);
-    for (int32_t child_id : node.child_ids)
+    for (const ui::AXNodeID& child_id : node.child_ids)
       child_id_to_parent_id[child_id] = static_cast<int>(node.id);
 
     // Set root as the first node and take its size as snapshot size.
@@ -165,7 +210,7 @@
     attrib->set_int_value(ax_node_id);
 
     // Child IDs.
-    for (int32_t id : node.child_ids) {
+    for (const ui::AXNodeID& id : node.child_ids) {
       attrib = uie->add_attributes();
       attrib->set_name("/axnode/child_ids");
       attrib->set_int_value(id);
diff --git a/components/services/screen_ai/proto/proto_convertor.h b/components/services/screen_ai/proto/proto_convertor.h
index 0d0089e..92570b2 100644
--- a/components/services/screen_ai/proto/proto_convertor.h
+++ b/components/services/screen_ai/proto/proto_convertor.h
@@ -20,4 +20,5 @@
 std::string Screen2xSnapshotToViewHierarchy(const ui::AXTreeUpdate& snapshot);
 
 }  // namespace screen_ai
+
 #endif  // COMPONENTS_SERVICES_SCREEN_AI_PROTO_PROTO_CONVERTOR_H_
diff --git a/components/signin/internal/identity_manager/mutable_profile_oauth2_token_service_delegate.cc b/components/signin/internal/identity_manager/mutable_profile_oauth2_token_service_delegate.cc
index 868c9b48..0e2e638 100644
--- a/components/signin/internal/identity_manager/mutable_profile_oauth2_token_service_delegate.cc
+++ b/components/signin/internal/identity_manager/mutable_profile_oauth2_token_service_delegate.cc
@@ -379,16 +379,7 @@
     return;
   }
 
-  // If |account_id| is an email address, then canonicalize it. This is needed
-  // to support legacy account IDs, and will not be needed after switching to
-  // gaia IDs.
-  if (primary_account_id.ToString().find('@') != std::string::npos) {
-    loading_primary_account_id_ = CoreAccountId::FromEmail(
-        gaia::CanonicalizeEmail(primary_account_id.ToString()));
-  } else {
-    loading_primary_account_id_ = primary_account_id;
-  }
-
+  loading_primary_account_id_ = primary_account_id;
   web_data_service_request_ = token_web_data_->GetAllTokens(this);
 }
 
diff --git a/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager_unittest.cc b/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager_unittest.cc
index 7445c05..218a72e0 100644
--- a/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager_unittest.cc
+++ b/components/subresource_filter/content/browser/content_subresource_filter_throttle_manager_unittest.cc
@@ -1743,6 +1743,7 @@
             throttle_manager);
 
   navigation_simulator()->Commit();
+  fenced_frame_root = navigation_simulator()->GetFinalRenderFrameHost();
 
   // Committing the fenced frame navigation should not change the Page's
   // throttle manager.
diff --git a/components/sync/model/client_tag_based_remote_update_handler.cc b/components/sync/model/client_tag_based_remote_update_handler.cc
index e4c8825..77cf4b69 100644
--- a/components/sync/model/client_tag_based_remote_update_handler.cc
+++ b/components/sync/model/client_tag_based_remote_update_handler.cc
@@ -176,8 +176,9 @@
     entity_changes->push_back(
         EntityChange::CreateDelete(entity->storage_key()));
   } else if (entity->MatchesData(data)) {
-    // Remote update that is a no-op and can be ignored.
-    entity->RecordIgnoredRemoteUpdate(update);
+    // Remote update that is a no-op, metadata should still be updated.
+    entity->RecordAcceptedRemoteUpdate(
+        update, bridge_->TrimRemoteSpecificsForCaching(data.specifics));
   } else {
     // Remote update.
     entity->RecordAcceptedRemoteUpdate(
diff --git a/components/sync/model/client_tag_based_remote_update_handler_unittest.cc b/components/sync/model/client_tag_based_remote_update_handler_unittest.cc
index 0712afdd..62598e7 100644
--- a/components/sync/model/client_tag_based_remote_update_handler_unittest.cc
+++ b/components/sync/model/client_tag_based_remote_update_handler_unittest.cc
@@ -165,6 +165,62 @@
   EXPECT_EQ(0U, ProcessorEntityCount());
 }
 
+TEST_F(ClientTagBasedRemoteUpdateHandlerTest,
+       ShouldNotClearTrimmedSpecificsOnNoopRemoteUpdates) {
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitAndEnableFeature(kCacheBaseEntitySpecificsInMetadata);
+
+  const std::string kUnknownField = "unknown_field";
+
+  // Initial update containing unsupported fields.
+  UpdateResponseData update1 = GenerateUpdate(kKey1, kValue1);
+  *update1.entity.specifics.mutable_unknown_fields() = kUnknownField;
+  ProcessSingleUpdate(std::move(update1));
+  ASSERT_EQ(1U, ProcessorEntityCount());
+  ASSERT_EQ(1U, db()->data_change_count());
+  ASSERT_EQ(1U, db()->metadata_change_count());
+
+  // Redundant update should not clear trimmed specifics.
+  UpdateResponseData update2 = GenerateUpdate(kKey1, kValue1);
+  *update2.entity.specifics.mutable_unknown_fields() = kUnknownField;
+  ProcessSingleUpdate(std::move(update2));
+  EXPECT_EQ(1U, db()->data_change_count());
+  EXPECT_EQ(2U, db()->metadata_change_count());
+  EXPECT_EQ(kUnknownField, db()->GetMetadata(kKey1)
+                               .possibly_trimmed_base_specifics()
+                               .unknown_fields());
+}
+
+TEST_F(ClientTagBasedRemoteUpdateHandlerTest,
+       ShouldUpdateMetadataOnNoopRemoteUpdates) {
+  ProcessSingleUpdate(GenerateUpdate(kKey1, kValue1));
+  ASSERT_EQ(1U, ProcessorEntityCount());
+  ASSERT_EQ(1U, db()->data_change_count());
+  ASSERT_EQ(1U, db()->metadata_change_count());
+
+  // Redundant update from server doesn't write data but updates metadata.
+  const int64_t time_before_update =
+      db()->GetMetadata(kKey1).modification_time();
+  ProcessSingleUpdate(GenerateUpdate(kKey1, kValue1));
+  EXPECT_EQ(1U, db()->data_change_count());
+  EXPECT_EQ(2U, db()->metadata_change_count());
+  // Check that `modification_time` was updated.
+  EXPECT_NE(time_before_update, db()->GetMetadata(kKey1).modification_time());
+}
+
+TEST_F(ClientTagBasedRemoteUpdateHandlerTest,
+       ShouldIgnoreReflectionsOnRemoteUpdates) {
+  ProcessSingleUpdate(GenerateUpdate(kKey1, kValue1));
+  ASSERT_EQ(1U, ProcessorEntityCount());
+  ASSERT_EQ(1U, db()->data_change_count());
+  ASSERT_EQ(1U, db()->metadata_change_count());
+
+  // A reflection (update already received) is ignored completely.
+  ProcessSingleUpdate(GenerateUpdate(kKey1, kValue1, /*version_offset=*/0));
+  EXPECT_EQ(1U, db()->data_change_count());
+  EXPECT_EQ(1U, db()->metadata_change_count());
+}
+
 TEST_F(ClientTagBasedRemoteUpdateHandlerTest, ShouldProcessRemoteUpdates) {
   base::test::ScopedFeatureList feature_list;
   feature_list.InitAndEnableFeature(kCacheBaseEntitySpecificsInMetadata);
@@ -174,20 +230,10 @@
   ASSERT_EQ(1U, db()->data_change_count());
   ASSERT_EQ(1U, db()->metadata_change_count());
 
-  // Redundant update from server doesn't write data but updates metadata.
-  ProcessSingleUpdate(GenerateUpdate(kKey1, kValue1));
-  EXPECT_EQ(1U, db()->data_change_count());
-  EXPECT_EQ(2U, db()->metadata_change_count());
-
-  // A reflection (update already received) is ignored completely.
-  ProcessSingleUpdate(GenerateUpdate(kKey1, kValue1, /*version_offset=*/0));
-  EXPECT_EQ(1U, db()->data_change_count());
-  EXPECT_EQ(2U, db()->metadata_change_count());
-
   // Should update both data and metadata.
   ProcessSingleUpdate(GenerateUpdate(kKey1, kValue2));
   ASSERT_EQ(2U, db()->data_change_count());
-  ASSERT_EQ(3U, db()->metadata_change_count());
+  ASSERT_EQ(2U, db()->metadata_change_count());
   EXPECT_EQ(1U, db()->data_count());
   EXPECT_EQ(1U, db()->metadata_count());
 
@@ -195,7 +241,7 @@
   const sync_pb::EntityMetadata& metadata = db()->GetMetadata(kKey1);
   EXPECT_EQ(0, metadata.sequence_number());
   EXPECT_EQ(0, metadata.acked_sequence_number());
-  EXPECT_EQ(3, metadata.server_version());
+  EXPECT_EQ(2, metadata.server_version());
   EXPECT_TRUE(metadata.has_possibly_trimmed_base_specifics());
 }
 
diff --git a/components/sync/test/model/fake_model_type_sync_bridge.cc b/components/sync/test/model/fake_model_type_sync_bridge.cc
index e148e554..499f9b5 100644
--- a/components/sync/test/model/fake_model_type_sync_bridge.cc
+++ b/components/sync/test/model/fake_model_type_sync_bridge.cc
@@ -387,6 +387,20 @@
       std::move(delete_metadata_change_list));
 }
 
+sync_pb::EntitySpecifics FakeModelTypeSyncBridge::TrimRemoteSpecificsForCaching(
+    const sync_pb::EntitySpecifics& entity_specifics) const {
+  if (entity_specifics.unknown_fields().empty()) {
+    return sync_pb::EntitySpecifics();
+  }
+
+  // Keep top-level unknown fields for testing without specific data type
+  // trimming (e.g. in processor unit tests).
+  sync_pb::EntitySpecifics trimmed_specifics;
+  *trimmed_specifics.mutable_unknown_fields() =
+      entity_specifics.unknown_fields();
+  return trimmed_specifics;
+}
+
 void FakeModelTypeSyncBridge::SetConflictResolution(
     ConflictResolution resolution) {
   conflict_resolution_ = resolution;
diff --git a/components/sync/test/model/fake_model_type_sync_bridge.h b/components/sync/test/model/fake_model_type_sync_bridge.h
index 29dd8e2..5e9f788 100644
--- a/components/sync/test/model/fake_model_type_sync_bridge.h
+++ b/components/sync/test/model/fake_model_type_sync_bridge.h
@@ -134,6 +134,8 @@
       const EntityData& remote_data) const override;
   void ApplyStopSyncChanges(
       std::unique_ptr<MetadataChangeList> delete_metadata_change_list) override;
+  sync_pb::EntitySpecifics TrimRemoteSpecificsForCaching(
+      const sync_pb::EntitySpecifics& entity_specifics) const override;
 
   // Stores a resolution for the next call to ResolveConflict. Note that if this
   // is a USE_NEW resolution, the data will only exist for one resolve call.
diff --git a/components/sync/trusted_vault/trusted_vault_request_unittest.cc b/components/sync/trusted_vault/trusted_vault_request_unittest.cc
index 9905515..51f9209d 100644
--- a/components/sync/trusted_vault/trusted_vault_request_unittest.cc
+++ b/components/sync/trusted_vault/trusted_vault_request_unittest.cc
@@ -87,7 +87,7 @@
       TrustedVaultRequest::HttpMethod http_method,
       const absl::optional<std::string>& request_body,
       TrustedVaultRequest::CompletionCallback completion_callback) {
-    const CoreAccountId account_id = CoreAccountId::FromEmail("user@gmail.com");
+    const CoreAccountId account_id = CoreAccountId::FromGaiaId("user_id");
     FakeTrustedVaultAccessTokenFetcher access_token_fetcher(access_token);
 
     auto request = std::make_unique<TrustedVaultRequest>(
diff --git a/components/user_education/views/help_bubble_view.cc b/components/user_education/views/help_bubble_view.cc
index f8b01175..a9811d3 100644
--- a/components/user_education/views/help_bubble_view.cc
+++ b/components/user_education/views/help_bubble_view.cc
@@ -199,6 +199,7 @@
         this,
         std::make_unique<views::CircleHighlightPathGenerator>(gfx::Insets()));
     SetAccessibleName(accessible_name);
+    SetTooltipText(accessible_name);
 
     constexpr int kIconSize = 16;
     SetImageModel(views::ImageButton::STATE_NORMAL,
diff --git a/components/version_info/version_info.cc b/components/version_info/version_info.cc
index 637d1533..96da8a9 100644
--- a/components/version_info/version_info.cc
+++ b/components/version_info/version_info.cc
@@ -69,7 +69,7 @@
   return "iOS";
 #elif BUILDFLAG(IS_MAC)
   return "Mac OS X";
-#elif BUILDFLAG(IS_CHROMEOS_ASH)
+#elif BUILDFLAG(IS_CHROMEOS)
 # if BUILDFLAG(GOOGLE_CHROME_BRANDING)
   return "ChromeOS";
 # else
@@ -77,7 +77,7 @@
 # endif
 #elif BUILDFLAG(IS_ANDROID)
   return "Android";
-#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_LACROS)
+#elif BUILDFLAG(IS_LINUX)
   return "Linux";
 #elif BUILDFLAG(IS_FREEBSD)
   return "FreeBSD";
diff --git a/components/viz/common/BUILD.gn b/components/viz/common/BUILD.gn
index 77d982f..9dbc3d6 100644
--- a/components/viz/common/BUILD.gn
+++ b/components/viz/common/BUILD.gn
@@ -180,12 +180,6 @@
     "frame_sinks/delay_based_time_source.h",
     "frame_timing_details.h",
     "frame_timing_details_map.h",
-    "gl_i420_converter.cc",
-    "gl_i420_converter.h",
-    "gl_nv12_converter.cc",
-    "gl_nv12_converter.h",
-    "gl_scaler.cc",
-    "gl_scaler.h",
     "gpu/context_cache_controller.cc",
     "gpu/context_cache_controller.h",
     "gpu/context_lost_observer.h",
diff --git a/components/viz/common/display/renderer_settings.h b/components/viz/common/display/renderer_settings.h
index 8b0b5ed..bc48a50 100644
--- a/components/viz/common/display/renderer_settings.h
+++ b/components/viz/common/display/renderer_settings.h
@@ -30,7 +30,6 @@
   bool partial_swap_enabled = false;
   bool should_clear_root_render_pass = true;
   bool release_overlay_resources_after_gpu_query = false;
-  bool use_skia_renderer = true;
   bool dont_round_texture_sizes_for_pixel_tests = false;
   int highp_threshold_min = 0;
   bool auto_resize_output_surface = true;
diff --git a/components/viz/common/features.cc b/components/viz/common/features.cc
index ef40fcc..e264531 100644
--- a/components/viz/common/features.cc
+++ b/components/viz/common/features.cc
@@ -69,10 +69,6 @@
 const base::Feature kSimpleFrameRateThrottling{
     "SimpleFrameRateThrottling", base::FEATURE_DISABLED_BY_DEFAULT};
 
-// Use the SkiaRenderer.
-const base::Feature kUseSkiaRenderer{"UseSkiaRenderer",
-                                     base::FEATURE_ENABLED_BY_DEFAULT};
-
 // Kill-switch to disable de-jelly, even if flags/properties indicate it should
 // be enabled.
 const base::Feature kDisableDeJelly{"DisableDeJelly",
@@ -85,10 +81,6 @@
                                        base::FEATURE_DISABLED_BY_DEFAULT};
 #endif
 
-// Uses glClear to composite solid color quads whenever possible.
-const base::Feature kFastSolidColorDraw{"FastSolidColorDraw",
-                                        base::FEATURE_DISABLED_BY_DEFAULT};
-
 // Submit CompositorFrame from SynchronousLayerTreeFrameSink directly to viz in
 // WebView.
 const base::Feature kVizFrameSubmissionForWebView{
@@ -218,8 +210,8 @@
 }
 
 bool IsUsingSkiaRenderer() {
-  return base::FeatureList::IsEnabled(kUseSkiaRenderer) ||
-         features::IsUsingVulkan();
+  // TODO(crbug.com/1247756): Remove this when all callers are gone.
+  return true;
 }
 
 #if BUILDFLAG(IS_ANDROID)
@@ -233,10 +225,6 @@
 }
 #endif
 
-bool IsUsingFastPathForSolidColorQuad() {
-  return base::FeatureList::IsEnabled(kFastSolidColorDraw);
-}
-
 bool IsUsingVizFrameSubmissionForWebView() {
   return base::FeatureList::IsEnabled(kVizFrameSubmissionForWebView);
 }
diff --git a/components/viz/common/features.h b/components/viz/common/features.h
index a0c1743..c068ed0 100644
--- a/components/viz/common/features.h
+++ b/components/viz/common/features.h
@@ -22,7 +22,6 @@
 VIZ_COMMON_EXPORT extern const base::Feature kAdpf;
 VIZ_COMMON_EXPORT extern const base::FeatureParam<int> kAdpfTargetDurationMs;
 VIZ_COMMON_EXPORT extern const base::Feature kEnableOverlayPrioritization;
-VIZ_COMMON_EXPORT extern const base::Feature kUseSkiaRenderer;
 VIZ_COMMON_EXPORT extern const base::Feature kDelegatedCompositing;
 VIZ_COMMON_EXPORT extern const base::Feature kRecordSkPicture;
 VIZ_COMMON_EXPORT extern const base::Feature kDisableDeJelly;
@@ -32,7 +31,6 @@
 #if BUILDFLAG(IS_ANDROID)
 VIZ_COMMON_EXPORT extern const base::Feature kDynamicColorGamut;
 #endif
-VIZ_COMMON_EXPORT extern const base::Feature kFastSolidColorDraw;
 VIZ_COMMON_EXPORT extern const base::Feature kVizFrameSubmissionForWebView;
 VIZ_COMMON_EXPORT extern const base::Feature kUsePreferredIntervalForVideo;
 VIZ_COMMON_EXPORT extern const base::Feature kUseRealBuffersForPageFlipTest;
@@ -76,7 +74,6 @@
 VIZ_COMMON_EXPORT bool IsOverlayPrioritizationEnabled();
 VIZ_COMMON_EXPORT bool IsDelegatedCompositingEnabled();
 VIZ_COMMON_EXPORT bool IsSyncWindowDestructionEnabled();
-VIZ_COMMON_EXPORT bool IsUsingFastPathForSolidColorQuad();
 VIZ_COMMON_EXPORT bool IsUsingSkiaRenderer();
 VIZ_COMMON_EXPORT bool IsUsingVizFrameSubmissionForWebView();
 VIZ_COMMON_EXPORT bool IsUsingPreferredIntervalForVideo();
diff --git a/components/viz/common/gl_i420_converter.cc b/components/viz/common/gl_i420_converter.cc
deleted file mode 100644
index c00e202..0000000
--- a/components/viz/common/gl_i420_converter.cc
+++ /dev/null
@@ -1,209 +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 "components/viz/common/gl_i420_converter.h"
-
-#include <utility>
-
-#include "components/viz/common/gpu/context_provider.h"
-
-namespace viz {
-
-GLI420Converter::GLI420Converter(ContextProvider* context_provider)
-    : GLI420Converter(context_provider, true) {
-  DCHECK(context_provider_);
-}
-
-GLI420Converter::GLI420Converter(ContextProvider* context_provider,
-                                 bool allow_mrt_path)
-    : context_provider_(context_provider),
-      step1_(context_provider_),
-      step2_(context_provider_) {
-  DCHECK(context_provider_);
-  context_provider_->AddObserver(this);
-  if (!allow_mrt_path || step1_.GetMaxDrawBuffersSupported() < 2) {
-    step3_ = std::make_unique<GLScaler>(context_provider_);
-    step4_ = std::make_unique<GLScaler>(context_provider_);
-  }
-}
-
-GLI420Converter::~GLI420Converter() {
-  OnContextLost();  // Free context-related resources.
-}
-
-bool GLI420Converter::Configure(const Parameters& params) {
-  Parameters step1_params = params;
-  if (!step1_params.output_color_space.IsValid()) {
-    step1_params.output_color_space = gfx::ColorSpace::CreateREC709();
-  }
-
-  // Configure the "step 1" scaler.
-  if (is_using_mrt_path()) {
-    step1_params.export_format = Parameters::ExportFormat::NV61;
-    DCHECK_EQ(step1_params.swizzle[0], params.swizzle[0]);
-    step1_params.swizzle[1] = GL_RGBA;  // Don't swizzle 2nd rendering target.
-  } else {
-    step1_params.export_format = Parameters::ExportFormat::INTERLEAVED_QUADS;
-    step1_params.swizzle[0] = GL_RGBA;  // Will swizzle in steps 2-4.
-  }
-  if (!step1_.Configure(step1_params)) {
-    return false;
-  }
-
-  // Configure the "step 2" scaler (and steps 3 and 4 for the non-MRT path) that
-  // further transform the output from the "step 1" scaler to produce the final
-  // outputs.
-  Parameters step2_params;
-  step2_params.scale_to = gfx::Vector2d(1, 1);
-  step2_params.source_color_space = step1_params.output_color_space;
-  step2_params.output_color_space = step1_params.output_color_space;
-  // Use FAST quality, a single bilinear pass, because there will either be no
-  // scaling or exactly 50% scaling.
-  step2_params.quality = Parameters::Quality::FAST;
-  step2_params.swizzle[0] = params.swizzle[0];
-  if (is_using_mrt_path()) {
-    // NV61 provides half-width and full-height U/V. I420 U/V planes are
-    // half-width and half-height. So, scale Y by 50%.
-    step2_params.scale_from = gfx::Vector2d(1, 2);
-    step2_params.export_format =
-        Parameters::ExportFormat::DEINTERLEAVE_PAIRWISE;
-    step2_params.swizzle[1] = step2_params.swizzle[0];
-    if (!step2_.Configure(step2_params)) {
-      return false;
-    }
-  } else {
-    // Extract a full-size Y plane from the interleaved YUVA from step 1.
-    step2_params.scale_from = gfx::Vector2d(1, 1);
-    step2_params.export_format = Parameters::ExportFormat::CHANNEL_0;
-    if (!step2_.Configure(step2_params)) {
-      return false;
-    }
-    // Extract half-size U/V planes from the interleaved YUVA from step 1.
-    step2_params.scale_from = gfx::Vector2d(2, 2);
-    step2_params.export_format = Parameters::ExportFormat::CHANNEL_1;
-    if (!step3_->Configure(step2_params)) {
-      return false;
-    }
-    step2_params.export_format = Parameters::ExportFormat::CHANNEL_2;
-    if (!step4_->Configure(step2_params)) {
-      return false;
-    }
-  }
-
-  params_ = params;
-  return true;
-}
-
-bool GLI420Converter::Convert(GLuint src_texture,
-                              const gfx::Size& src_texture_size,
-                              const gfx::Vector2d& src_offset,
-                              const gfx::Rect& output_rect,
-                              const GLuint yuv_textures[3]) {
-  DCHECK_EQ(output_rect.x() % 8, 0);
-  DCHECK_EQ(output_rect.width() % 8, 0);
-  DCHECK_EQ(output_rect.y() % 2, 0);
-  DCHECK_EQ(output_rect.height() % 2, 0);
-
-  if (!context_provider_) {
-    return false;
-  }
-
-  if (is_using_mrt_path()) {
-    const gfx::Rect luma_output_rect(output_rect.x() / 4, output_rect.y(),
-                                     output_rect.width() / 4,
-                                     output_rect.height());
-    EnsureIntermediateTextureDefined(luma_output_rect.size());
-    const gfx::Rect chroma_output_rect(
-        gfx::Size(luma_output_rect.width() / 2, luma_output_rect.height() / 2));
-    return (step1_.ScaleToMultipleOutputs(
-                src_texture, src_texture_size, src_offset, yuv_textures[0],
-                intermediate_texture_, luma_output_rect) &&
-            step2_.ScaleToMultipleOutputs(intermediate_texture_,
-                                          intermediate_texture_size_,
-                                          gfx::Vector2d(), yuv_textures[1],
-                                          yuv_textures[2], chroma_output_rect));
-  }
-
-  // Non-MRT path:
-  EnsureIntermediateTextureDefined(output_rect.size());
-  const gfx::Rect luma_output_rect(0, 0, output_rect.width() / 4,
-                                   output_rect.height());
-  const gfx::Rect chroma_output_rect(0, 0, luma_output_rect.width() / 2,
-                                     luma_output_rect.height() / 2);
-  return (step1_.Scale(src_texture, src_texture_size, src_offset,
-                       intermediate_texture_, output_rect) &&
-          step2_.Scale(intermediate_texture_, intermediate_texture_size_,
-                       gfx::Vector2d(), yuv_textures[0], luma_output_rect) &&
-          step3_->Scale(intermediate_texture_, intermediate_texture_size_,
-                        gfx::Vector2d(), yuv_textures[1], chroma_output_rect) &&
-          step4_->Scale(intermediate_texture_, intermediate_texture_size_,
-                        gfx::Vector2d(), yuv_textures[2], chroma_output_rect));
-}
-
-// static
-gfx::Rect GLI420Converter::ToAlignedRect(const gfx::Rect& rect) {
-  // Origin coordinates: FLOOR(...)
-  const int aligned_x =
-      ((rect.x() < 0) ? ((rect.x() - 7) / 8) : (rect.x() / 8)) * 8;
-  const int aligned_y =
-      ((rect.y() < 0) ? ((rect.y() - 1) / 2) : (rect.y() / 2)) * 2;
-  // Span coordinates: CEIL(...)
-  const int aligned_right =
-      ((rect.right() < 0) ? (rect.right() / 8) : ((rect.right() + 7) / 8)) * 8;
-  const int aligned_bottom =
-      ((rect.bottom() < 0) ? (rect.bottom() / 2) : ((rect.bottom() + 1) / 2)) *
-      2;
-  return gfx::Rect(aligned_x, aligned_y, aligned_right - aligned_x,
-                   aligned_bottom - aligned_y);
-}
-
-// static
-bool GLI420Converter::ParametersAreEquivalent(const Parameters& a,
-                                              const Parameters& b) {
-  const auto Resolve = [](Parameters params) {
-    // Per header comments, if an invalid output_color_space is specified, use
-    // REC709.
-    if (!params.output_color_space.IsValid()) {
-      params.output_color_space = gfx::ColorSpace::CreateREC709();
-    }
-    // Both of these fields are overwritten, in Configure(), whether the MRT
-    // path is going to be used or not. So, for the purposes of "equivalence,"
-    // just set these like the MRT path would.
-    params.export_format = Parameters::ExportFormat::NV61;
-    params.swizzle[1] = GL_RGBA;
-    return params;
-  };
-  return GLScaler::ParametersAreEquivalent(Resolve(a), Resolve(b));
-}
-
-void GLI420Converter::EnsureIntermediateTextureDefined(
-    const gfx::Size& required) {
-  if (intermediate_texture_size_ == required) {
-    return;
-  }
-  auto* const gl = context_provider_->ContextGL();
-  if (intermediate_texture_ == 0) {
-    gl->GenTextures(1, &intermediate_texture_);
-  }
-  gl->BindTexture(GL_TEXTURE_2D, intermediate_texture_);
-  gl->TexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, required.width(), required.height(),
-                 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
-  intermediate_texture_size_ = required;
-}
-
-void GLI420Converter::OnContextLost() {
-  if (intermediate_texture_ != 0) {
-    if (auto* gl = context_provider_->ContextGL()) {
-      gl->DeleteTextures(1, &intermediate_texture_);
-    }
-    intermediate_texture_ = 0;
-    intermediate_texture_size_ = gfx::Size();
-  }
-  if (context_provider_) {
-    context_provider_->RemoveObserver(this);
-    context_provider_ = nullptr;
-  }
-}
-
-}  // namespace viz
diff --git a/components/viz/common/gl_i420_converter.h b/components/viz/common/gl_i420_converter.h
deleted file mode 100644
index 6792ca8f..0000000
--- a/components/viz/common/gl_i420_converter.h
+++ /dev/null
@@ -1,195 +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 COMPONENTS_VIZ_COMMON_GL_I420_CONVERTER_H_
-#define COMPONENTS_VIZ_COMMON_GL_I420_CONVERTER_H_
-
-#include <memory>
-
-#include "base/memory/raw_ptr.h"
-#include "base/memory/scoped_refptr.h"
-#include "components/viz/common/gl_scaler.h"
-#include "components/viz/common/gpu/context_lost_observer.h"
-#include "components/viz/common/viz_common_export.h"
-#include "ui/gfx/color_space.h"
-#include "ui/gfx/geometry/size.h"
-
-namespace gfx {
-class Rect;
-class Vector2d;
-}  // namespace gfx
-
-namespace viz {
-
-class ContextProvider;
-
-// A convenience wrapper around GLScaler that also reformats the scaler's output
-// from interleaved RGBA to I420 planes. The I420 format consists of three
-// planes of image data: the Y (luma) plane at full size, plus U and V (chroma)
-// planes at half-width and half-height. There are two possible modes of
-// operation (auto-detected at runtime):
-//
-// The faster, multiple rendering target (MRT) path: If the platform supports
-// MRTs (most of the GPUs in use today), scaling and conversion is a two step
-// process:
-//
-//   Step 1: Produce NV61 format output, a luma plane and a UV-interleaved
-//   image. The luma plane is the same as the desired I420 luma plane. Note,
-//   that the UV image is of half-width but not yet half-height.
-//
-//               (interleaved quads)
-//     RGBA RGBA RGBA RGBA RGBA RGBA RGBA RGBA
-//     RGBA RGBA RGBA RGBA RGBA RGBA RGBA RGBA
-//     RGBA RGBA RGBA RGBA RGBA RGBA RGBA RGBA
-//     RGBA RGBA RGBA RGBA RGBA RGBA RGBA RGBA
-//       |
-//       |     (luma plane)  (chroma, interleaved)
-//       |       YYYY YYYY      UVUV UVUV
-//       +---> { YYYY YYYY  +   UVUV UVUV }
-//               YYYY YYYY      UVUV UVUV
-//               YYYY YYYY      UVUV UVUV
-//
-//   Step 2: Derives the two I420 chroma planes from the UV-interleaved image
-//   from Step 1. This step separates the U and V pixels into separate planes,
-//   and also scales the height by half. This produces the desired I420 chroma
-//   planes.
-//
-//     (chroma, interleaved)     (two chroma planes)
-//           UVUV UVUV
-//           UVUV UVUV       -->   { UUUU + VVVV }
-//           UVUV UVUV               UUUU   VVVV
-//           UVUV UVUV
-//
-// The non-MRT path: For platforms that can only render to a single target at a
-// time. This first scales the source to its final size and color-converts,
-// transforming an RGBA input into a YUVA output. Then, it scans the YUVA image
-// three times to generate each of the Y+U+V planes.
-//
-// Texture packing: OpenGLES2 treats all of the input and output textures as
-// RGBA format. See comments for the Convert() method, which explains how the
-// planar image data is packed into GL_RGBA textures, how the output textures
-// should be sized, and why there are alignment requirements when specifying the
-// output rect.
-class VIZ_COMMON_EXPORT GLI420Converter final : public ContextLostObserver {
- public:
-  // GLI420Converter uses the exact same parameters as GLScaler.
-  using Parameters = GLScaler::Parameters;
-
-  explicit GLI420Converter(ContextProvider* context_provider);
-
-  GLI420Converter(const GLI420Converter&) = delete;
-  GLI420Converter& operator=(const GLI420Converter&) = delete;
-
-  ~GLI420Converter() final;
-
-  // Returns true if the GL context provides the necessary support for enabling
-  // precise color management (see Parameters::enable_precise_color_management).
-  bool SupportsPreciseColorManagement() const {
-    return step1_.SupportsPreciseColorManagement();
-  }
-
-  // [Re]Configure the converter with the given |new_params|. Returns true on
-  // success, or false on failure. If |new_params| does not specify an
-  // |output_color_space|, it will be default to REC709.
-  [[nodiscard]] bool Configure(const Parameters& new_params);
-
-  // Returns the currently-configured and resolved Parameters. Results are
-  // undefined if Configure() has never been called successfully.
-  const Parameters& params() const { return params_; }
-
-  // Scales a portion of |src_texture|, then format-converts it to three I420
-  // planes, placing the results into |yuv_textures| at offset (0, 0). Returns
-  // true to indicate success, or false if this GLI420Converter is not valid.
-  //
-  // |src_texture_size| is the full, allocated size of the |src_texture|. This
-  // is required for computing texture coordinate transforms (and only because
-  // the OpenGL ES 2.0 API lacks the ability to query this info).
-  //
-  // |src_offset| is the offset in the source texture corresponding to point
-  // (0,0) in the source/output coordinate spaces. This prevents the need for
-  // extra texture copies just to re-position the source coordinate system.
-  //
-  // |aligned_output_rect| selects the region to draw (in the scaled, not the
-  // source, coordinate space). This is used to save work in cases where only a
-  // portion needs to be re-scaled. Because of the way the planar image data is
-  // packed in the output textures, the output rect's coordinates must be
-  // aligned (see ToAlignedRect() below).
-  //
-  // The |yuv_textures| are packed with planar data, meaning that each RGBA quad
-  // contains four pixel values: R is pixel 0, G is pixel 1, and so on. This
-  // makes it trivial to read-back the textures from a pixel buffer as a
-  // sequence of unsigned bytes. Thus, the output texture for the Y plane should
-  // be defined as GL_RGBA and be at least 1/4 the width of that specified in
-  // |aligned_output_rect|. Similarly, the output textures for the U and V
-  // planes should be defined as GL_RGBA and have at least 1/8 the width and 1/2
-  // the height of |aligned_output_rect|.
-  //
-  // WARNING: The output will always be placed at (0, 0) in the output textures,
-  // and not at |aligned_output_rect.origin()|.
-  //
-  // Note that the |src_texture| will have the min/mag filter set to GL_LINEAR
-  // and wrap_s/t set to CLAMP_TO_EDGE in this call.
-  bool Convert(GLuint src_texture,
-               const gfx::Size& src_texture_size,
-               const gfx::Vector2d& src_offset,
-               const gfx::Rect& aligned_output_rect,
-               const GLuint yuv_textures[3]);
-
-  // Returns the smallest Rect that encloses |rect| and lays on aligned
-  // boundaries, as required by the |aligned_output_rect| argument passed to
-  // Convert(). The horizontal coordinates will always be a multiple of 8, and
-  // the vertical coordinates a multiple of 2.
-  static gfx::Rect ToAlignedRect(const gfx::Rect& rect);
-
-  // Returns true if configuring a GLI420Converter with either |a| or |b| will
-  // produce identical behaviors and results.
-  static bool ParametersAreEquivalent(const Parameters& a, const Parameters& b);
-
- private:
-  friend class GLI420ConverterPixelTest;
-
-  GLI420Converter(ContextProvider* context_provider, bool allow_mrt_path);
-
-  bool is_using_mrt_path() const { return !step3_; }
-
-  // Creates or re-defines the intermediate texture, to ensure a texture of the
-  // given |required| size is defined.
-  void EnsureIntermediateTextureDefined(const gfx::Size& required);
-
-  // ContextLostObserver implementation.
-  void OnContextLost() final;
-
-  // The provider of the GL context. This is non-null while the GL context is
-  // valid and GLI420Converter is observing for context loss.
-  raw_ptr<ContextProvider> context_provider_;
-
-  // Scales the source content and produces either:
-  //   * MRT path: NV61-format output in two textures.
-  //   * Non-MRT path: YUVA interleaved output in one texture.
-  GLScaler step1_;
-
-  // Holds the results from executing the first-stage |scaler_|, and is read by
-  // the other scalers:
-  //   * MRT path: This holds the UV-interleaved data (2nd rendering target).
-  //   * Non-MRT path: The scaled YUVA interleaved data.
-  GLuint intermediate_texture_ = 0;
-  gfx::Size intermediate_texture_size_;
-
-  // Step 2 operation using the |intermediate_texture_| as input:
-  //   * MRT path: Separates-out the U and V planes (and scales height by half).
-  //   * Non-MRT path: Extracts the luma plane.
-  GLScaler step2_;
-
-  // Steps 3 and 4 are used by the non-MRT path only, to extract the two chroma
-  // planes from |intermediate_texture_|.
-  std::unique_ptr<GLScaler> step3_;
-  std::unique_ptr<GLScaler> step4_;
-
-  // The Parameters that were provided to the last successful Configure() call.
-  Parameters params_;
-};
-
-}  // namespace viz
-
-#endif  // COMPONENTS_VIZ_COMMON_GL_I420_CONVERTER_H_
diff --git a/components/viz/common/gl_nv12_converter.cc b/components/viz/common/gl_nv12_converter.cc
deleted file mode 100644
index 2c73713..0000000
--- a/components/viz/common/gl_nv12_converter.cc
+++ /dev/null
@@ -1,195 +0,0 @@
-// Copyright 2021 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 "components/viz/common/gl_nv12_converter.h"
-
-#include "base/memory/ptr_util.h"
-#include "components/viz/common/gl_i420_converter.h"
-#include "components/viz/common/gpu/context_provider.h"
-
-namespace viz {
-
-// static
-std::unique_ptr<GLNV12Converter> GLNV12Converter::CreateConverterForTest(
-    ContextProvider* context_provider,
-    bool allow_mrt_path) {
-  return base::WrapUnique(
-      new GLNV12Converter(context_provider, allow_mrt_path));
-}
-
-GLNV12Converter::GLNV12Converter(ContextProvider* context_provider)
-    : GLNV12Converter(context_provider, true) {}
-
-GLNV12Converter::GLNV12Converter(ContextProvider* context_provider,
-                                 bool allow_mrt_path)
-    : context_provider_(context_provider),
-      step1_(context_provider_),
-      step2_(context_provider_) {
-  DCHECK(context_provider_);
-  context_provider_->AddObserver(this);
-  if (!allow_mrt_path || step1_.GetMaxDrawBuffersSupported() < 2) {
-    step3_ = std::make_unique<GLScaler>(context_provider_);
-  }
-}
-
-GLNV12Converter::~GLNV12Converter() {
-  OnContextLost();  // Free context-related resources.
-}
-
-// static
-gfx::Rect GLNV12Converter::ToAlignedRect(const gfx::Rect& rect) {
-  // Origin coordinates: FLOOR(...)
-  const int aligned_x =
-      ((rect.x() < 0) ? ((rect.x() - 3) / 4) : (rect.x() / 4)) * 4;
-  const int aligned_y =
-      ((rect.y() < 0) ? ((rect.y() - 1) / 2) : (rect.y() / 2)) * 2;
-  // Span coordinates: CEIL(...)
-  const int aligned_right =
-      ((rect.right() < 0) ? (rect.right() / 4) : ((rect.right() + 3) / 4)) * 4;
-  const int aligned_bottom =
-      ((rect.bottom() < 0) ? (rect.bottom() / 2) : ((rect.bottom() + 1) / 2)) *
-      2;
-  return gfx::Rect(aligned_x, aligned_y, aligned_right - aligned_x,
-                   aligned_bottom - aligned_y);
-}
-
-// static
-bool GLNV12Converter::ParametersAreEquivalent(const Parameters& a,
-                                              const Parameters& b) {
-  // Implemented in terms of GLI420Converter:
-  return GLI420Converter::ParametersAreEquivalent(a, b);
-}
-
-void GLNV12Converter::EnsureIntermediateTextureDefined(
-    const gfx::Size& required) {
-  if (intermediate_texture_size_ == required) {
-    return;
-  }
-  auto* const gl = context_provider_->ContextGL();
-  if (intermediate_texture_ == 0) {
-    gl->GenTextures(1, &intermediate_texture_);
-  }
-  gl->BindTexture(GL_TEXTURE_2D, intermediate_texture_);
-  gl->TexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, required.width(), required.height(),
-                 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
-  intermediate_texture_size_ = required;
-}
-
-bool GLNV12Converter::Configure(const Parameters& params) {
-  Parameters step1_params = params;
-  if (!step1_params.output_color_space.IsValid()) {
-    step1_params.output_color_space = gfx::ColorSpace::CreateREC709();
-  }
-
-  // Configure the "step 1" scaler.
-  if (is_using_mrt_path()) {
-    step1_params.export_format = Parameters::ExportFormat::NV61;
-    DCHECK_EQ(step1_params.swizzle[0], params.swizzle[0]);
-    step1_params.swizzle[1] = GL_RGBA;  // Don't swizzle 2nd rendering target.
-  } else {
-    step1_params.export_format = Parameters::ExportFormat::INTERLEAVED_QUADS;
-    step1_params.swizzle[0] = GL_RGBA;  // Will swizzle in steps 2-3.
-  }
-  if (!step1_.Configure(step1_params)) {
-    return false;
-  }
-
-  // Configure the "step 2" scaler (and step 3 for the non-MRT path) that
-  // further transform the output from the "step 1" scaler to produce the final
-  // outputs.
-  Parameters step2_params;
-  step2_params.scale_to = gfx::Vector2d(1, 1);
-  step2_params.source_color_space = step1_params.output_color_space;
-  step2_params.output_color_space = step1_params.output_color_space;
-  // Use FAST quality, a single bilinear pass, because there will either be no
-  // scaling or exactly 50% scaling.
-  step2_params.quality = Parameters::Quality::FAST;
-  step2_params.swizzle[0] = params.swizzle[0];
-  if (is_using_mrt_path()) {
-    // NV61 provides half-width and full-height U/V. NV12 UV planes are
-    // half-width and half-height. So, scale just the Y by 50%.
-    step2_params.scale_from = gfx::Vector2d(1, 2);
-    step2_params.export_format = Parameters::ExportFormat::INTERLEAVED_QUADS;
-    step2_params.swizzle[1] = step2_params.swizzle[0];
-    if (!step2_.Configure(step2_params)) {
-      return false;
-    }
-  } else {
-    // Extract a full-size Y plane from the interleaved YUVA from step 1.
-    step2_params.scale_from = gfx::Vector2d(1, 1);
-    step2_params.export_format = Parameters::ExportFormat::CHANNEL_0;
-    if (!step2_.Configure(step2_params)) {
-      return false;
-    }
-    // Extract a half-size UV plane from the interleaved YUVA from step 1.
-    // UV_CHANNELS provides half-width and full-height UV plane. NV12 UV planes
-    // are half-wifth and half-height. So, scale just the Y by 50%.
-    step2_params.scale_from = gfx::Vector2d(1, 2);
-    step2_params.export_format = Parameters::ExportFormat::UV_CHANNELS;
-    if (!step3_->Configure(step2_params)) {
-      return false;
-    }
-  }
-
-  params_ = params;
-  return true;
-}
-
-bool GLNV12Converter::Convert(GLuint src_texture,
-                              const gfx::Size& src_texture_size,
-                              const gfx::Vector2d& src_offset,
-                              const gfx::Rect& aligned_output_rect,
-                              const GLuint yuv_textures[2]) {
-  DCHECK_EQ(aligned_output_rect.x() % 4, 0);
-  DCHECK_EQ(aligned_output_rect.width() % 4, 0);
-  DCHECK_EQ(aligned_output_rect.y() % 2, 0);
-  DCHECK_EQ(aligned_output_rect.height() % 2, 0);
-
-  if (!context_provider_) {
-    return false;
-  }
-
-  if (is_using_mrt_path()) {
-    const gfx::Rect luma_output_rect(
-        aligned_output_rect.x() / 4, aligned_output_rect.y(),
-        aligned_output_rect.width() / 4, aligned_output_rect.height());
-    EnsureIntermediateTextureDefined(luma_output_rect.size());
-    const gfx::Rect chroma_output_rect(
-        gfx::Size(luma_output_rect.width(), luma_output_rect.height() / 2));
-    return (step1_.ScaleToMultipleOutputs(
-                src_texture, src_texture_size, src_offset, yuv_textures[0],
-                intermediate_texture_, luma_output_rect) &&
-            step2_.Scale(intermediate_texture_, intermediate_texture_size_,
-                         gfx::Vector2d(), yuv_textures[1], chroma_output_rect));
-  }
-
-  // Non-MRT path:
-  EnsureIntermediateTextureDefined(aligned_output_rect.size());
-  const gfx::Rect luma_output_rect(0, 0, aligned_output_rect.width() / 4,
-                                   aligned_output_rect.height());
-  const gfx::Rect chroma_output_rect(0, 0, luma_output_rect.width(),
-                                     luma_output_rect.height() / 2);
-  return (step1_.Scale(src_texture, src_texture_size, src_offset,
-                       intermediate_texture_, aligned_output_rect) &&
-          step2_.Scale(intermediate_texture_, intermediate_texture_size_,
-                       gfx::Vector2d(), yuv_textures[0], luma_output_rect) &&
-          step3_->Scale(intermediate_texture_, intermediate_texture_size_,
-                        gfx::Vector2d(), yuv_textures[1], chroma_output_rect));
-}
-
-void GLNV12Converter::OnContextLost() {
-  if (intermediate_texture_ != 0) {
-    if (auto* gl = context_provider_->ContextGL()) {
-      gl->DeleteTextures(1, &intermediate_texture_);
-    }
-    intermediate_texture_ = 0;
-    intermediate_texture_size_ = gfx::Size();
-  }
-  if (context_provider_) {
-    context_provider_->RemoveObserver(this);
-    context_provider_ = nullptr;
-  }
-}
-
-}  // namespace viz
diff --git a/components/viz/common/gl_nv12_converter.h b/components/viz/common/gl_nv12_converter.h
deleted file mode 100644
index 15c6944..0000000
--- a/components/viz/common/gl_nv12_converter.h
+++ /dev/null
@@ -1,200 +0,0 @@
-// Copyright 2021 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 COMPONENTS_VIZ_COMMON_GL_NV12_CONVERTER_H_
-#define COMPONENTS_VIZ_COMMON_GL_NV12_CONVERTER_H_
-
-#include <memory>
-
-#include "base/memory/raw_ptr.h"
-#include "base/memory/scoped_refptr.h"
-#include "components/viz/common/gl_scaler.h"
-#include "components/viz/common/gpu/context_lost_observer.h"
-#include "components/viz/common/viz_common_export.h"
-#include "ui/gfx/color_space.h"
-#include "ui/gfx/geometry/size.h"
-
-namespace gfx {
-class Rect;
-class Vector2d;
-}  // namespace gfx
-
-namespace viz {
-
-class ContextProvider;
-
-// A convenience wrapper around GLScaler that also reformats the scaler's output
-// from interleaved RGBA to NV12 planes. The NV12 format consists of two
-// planes of image data: the Y (luma) plane at full size, plus interleaved UV
-// (chroma) plane at half-width and half-height. There are two possible modes of
-// operation (auto-detected at runtime):
-//
-// The faster, multiple rendering target (MRT) path: If the platform supports
-// MRTs (most of the GPUs in use today), scaling and conversion is a two step
-// process:
-//
-//   Step 1: Produce NV61 format output, a luma plane and a UV-interleaved
-//   image. The luma plane is the same as the desired NV12 luma plane. Note,
-//   that the UV image is of half-width but not yet half-height.
-//
-//               (interleaved quads)
-//     RGBA RGBA RGBA RGBA RGBA RGBA RGBA RGBA
-//     RGBA RGBA RGBA RGBA RGBA RGBA RGBA RGBA
-//     RGBA RGBA RGBA RGBA RGBA RGBA RGBA RGBA
-//     RGBA RGBA RGBA RGBA RGBA RGBA RGBA RGBA
-//       |
-//       |     (luma plane)  (chroma, interleaved)
-//       |       YYYY YYYY      UVUV UVUV
-//       +---> { YYYY YYYY  +   UVUV UVUV }
-//               YYYY YYYY      UVUV UVUV
-//               YYYY YYYY      UVUV UVUV
-//
-//   Step 2: Downscales the chroma plane.
-//
-//     (chroma, interleaved)     (chroma, interleaved)
-//           UVUV UVUV
-//           UVUV UVUV     -->   UVUV UVUV
-//           UVUV UVUV           UVUV UVUV
-//           UVUV UVUV
-//
-// The non-MRT path: For platforms that can only render to a single target at a
-// time. This first scales the source to its final size and color-converts,
-// transforming an RGBA input into a YUVx output. Then, it scans the YUVA image
-// two times to generate each of the Y+UV planes.
-//
-// Texture packing: OpenGLES2 treats all of the input and output textures as
-// RGBA format. See comments for the Convert() method, which explains how the
-// planar image data is packed into GL_RGBA textures, how the output textures
-// should be sized, and why there are alignment requirements when specifying the
-// output rect.
-class VIZ_COMMON_EXPORT GLNV12Converter final : public ContextLostObserver {
- public:
-  // GLNV12Converter uses the exact same parameters as GLScaler.
-  using Parameters = GLScaler::Parameters;
-
-  explicit GLNV12Converter(ContextProvider* context_provider);
-  ~GLNV12Converter() final;
-
-  // Returns true if the GL context provides the necessary support for enabling
-  // precise color management (see Parameters::enable_precise_color_management).
-  bool SupportsPreciseColorManagement() const {
-    return step1_.SupportsPreciseColorManagement();
-  }
-
-  // [Re]Configure the converter with the given |new_params|. Returns true on
-  // success, or false on failure. If |new_params| does not specify an
-  // |output_color_space|, it will be default to REC709.
-  [[nodiscard]] bool Configure(const Parameters& new_params);
-
-  // Returns the currently-configured and resolved Parameters. Results are
-  // undefined if Configure() has never been called successfully.
-  const Parameters& params() const { return params_; }
-
-  // Scales a portion of |src_texture|, then format-converts it to two NV12
-  // planes, placing the results into |yuv_textures| at offset (0, 0). Returns
-  // true to indicate success, or false if this GLNV12Converter is not valid.
-  //
-  // |src_texture_size| is the full, allocated size of the |src_texture|. This
-  // is required for computing texture coordinate transforms (and only because
-  // the OpenGL ES 2.0 API lacks the ability to query this info).
-  //
-  // |src_offset| is the offset in the source texture corresponding to point
-  // (0,0) in the source/output coordinate spaces. This prevents the need for
-  // extra texture copies just to re-position the source coordinate system.
-  //
-  // |aligned_output_rect| selects the region to draw (in the scaled, not the
-  // source, coordinate space). This is used to save work in cases where only a
-  // portion needs to be re-scaled. Because of the way the planar image data is
-  // packed in the output textures, the output rect's coordinates must be
-  // aligned (see ToAlignedRect() below).
-  //
-  // The |yuv_textures| are packed with planar data. Depending on the plane,
-  // the packing is as follows:
-  // - for Y plane, each RGBA quad contains four pixel values: R is pixel 0,
-  //   G is pixel 1, and so on.
-  // - for UV plane, each RGBA quad contains 2 pixel values: RG are UV values
-  //   for pixel 0, BA are UV values for pixel 1, and so on.
-  // This makes it trivial to read-back the textures from a pixel buffer as a
-  // sequence of unsigned bytes. Thus, the output texture for the Y plane should
-  // be defined as GL_RGBA and be at least 1/4 the width of that specified in
-  // |aligned_output_rect|. Similarly, the output texture for the UV plane
-  // should be defined as GL_RGBA and have at least 1/4 the width [1]
-  // and 1/2 the height [2] of |aligned_output_rect|.
-  //
-  // [1] 1/4 width  = 1/4     // we pack 4 values per pixel
-  //                * 1/2     // chroma planes are subsampled
-  //                * 2       // we pack 2 chroma planes
-  //                * width
-  // [2] 1/2 height = 1/2     // chroma planes are subsampled
-  //                * height
-  //
-  // WARNING: The output will always be placed at (0, 0) in the output textures,
-  // and not at |aligned_output_rect.origin()|.
-  //
-  // Note that the |src_texture| will have the min/mag filter set to GL_LINEAR
-  // and wrap_s/t set to CLAMP_TO_EDGE in this call.
-  bool Convert(GLuint src_texture,
-               const gfx::Size& src_texture_size,
-               const gfx::Vector2d& src_offset,
-               const gfx::Rect& aligned_output_rect,
-               const GLuint yuv_textures[2]);
-
-  // Returns the smallest Rect that encloses |rect| and lays on aligned
-  // boundaries, as required by the |aligned_output_rect| argument passed to
-  // Convert(). The horizontal coordinates will always be a multiple of 4, and
-  // the vertical coordinates a multiple of 2.
-  static gfx::Rect ToAlignedRect(const gfx::Rect& rect);
-
-  // Returns true if configuring a GLNV12Converter with either |a| or |b| will
-  // produce identical behaviors and results.
-  static bool ParametersAreEquivalent(const Parameters& a, const Parameters& b);
-
-  static std::unique_ptr<GLNV12Converter> CreateConverterForTest(
-      ContextProvider* context_provider,
-      bool allow_mrt_path);
-
- private:
-  GLNV12Converter(ContextProvider* context_provider, bool allow_mrt_path);
-
-  bool is_using_mrt_path() const { return !step3_; }
-
-  // Creates or re-defines the intermediate texture, to ensure a texture of the
-  // given |required| size is defined.
-  void EnsureIntermediateTextureDefined(const gfx::Size& required);
-
-  // ContextLostObserver implementation.
-  void OnContextLost() final;
-
-  // The provider of the GL context. This is non-null while the GL context is
-  // valid and GLNV12Converter is observing for context loss.
-  raw_ptr<ContextProvider> context_provider_;
-
-  // Scales the source content and produces either:
-  //   * MRT path: NV61-format output in two textures.
-  //   * Non-MRT path: YUVA interleaved output in one texture.
-  GLScaler step1_;
-
-  // Holds the results from executing the first-stage |scaler_|, and is read by
-  // the other scalers:
-  //   * MRT path: This holds the UV-interleaved data (2nd rendering target).
-  //   * Non-MRT path: The scaled YUVA interleaved data.
-  GLuint intermediate_texture_ = 0;
-  gfx::Size intermediate_texture_size_;
-
-  // Step 2 operation using the |intermediate_texture_| as input:
-  //   * MRT path: Scales the height by half.
-  //   * Non-MRT path: Extracts the luma plane.
-  GLScaler step2_;
-
-  // Steps 3 is used by the non-MRT path only, to extract the interleaved chroma
-  // planes from |intermediate_texture_|.
-  std::unique_ptr<GLScaler> step3_;
-
-  // The Parameters that were provided to the last successful Configure() call.
-  Parameters params_;
-};
-
-}  // namespace viz
-
-#endif  // COMPONENTS_VIZ_COMMON_GL_NV12_CONVERTER_H_
diff --git a/components/viz/common/gl_scaler.cc b/components/viz/common/gl_scaler.cc
deleted file mode 100644
index 2393ebc..0000000
--- a/components/viz/common/gl_scaler.cc
+++ /dev/null
@@ -1,1661 +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 "components/viz/common/gl_scaler.h"
-
-#include <algorithm>
-#include <array>
-#include <sstream>
-#include <string>
-
-#include "base/logging.h"
-#include "components/viz/common/gpu/context_provider.h"
-#include "gpu/GLES2/gl2chromium.h"
-#include "gpu/GLES2/gl2extchromium.h"
-#include "third_party/skia/include/third_party/skcms/skcms.h"
-#include "ui/gfx/color_transform.h"
-#include "ui/gfx/geometry/rect_conversions.h"
-
-namespace viz {
-
-namespace {
-
-// The code in GLScaler that computes the ScalerStages is greatly simplified by
-// being able to access the X and Y components by index (instead of
-// Vector2d::x() or Vector2d::y()). Thus, define a helper class to represent the
-// relative size as a 2-element std::array and convert to/from Vector2d.
-struct RelativeSize : public std::array<int, 2> {
-  using std::array<int, 2>::operator[];
-
-  RelativeSize(int width, int height) : std::array<int, 2>{{width, height}} {}
-  explicit RelativeSize(const gfx::Vector2d& v)
-      : std::array<int, 2>{{v.x(), v.y()}} {}
-
-  gfx::Vector2d AsVector2d() const {
-    return gfx::Vector2d((*this)[0], (*this)[1]);
-  }
-};
-
-std::ostream& operator<<(std::ostream& out, const RelativeSize& size) {
-  return (out << size[0] << 'x' << size[1]);
-}
-
-}  // namespace
-
-GLScaler::GLScaler(ContextProvider* context_provider)
-    : context_provider_(context_provider) {
-  if (context_provider_) {
-    DCHECK(context_provider_->ContextGL());
-    context_provider_->AddObserver(this);
-  }
-}
-
-GLScaler::~GLScaler() {
-  OnContextLost();  // Ensures destruction in dependency order.
-}
-
-bool GLScaler::SupportsPreciseColorManagement() const {
-  if (!context_provider_) {
-    return false;
-  }
-  if (!supports_half_floats_.has_value()) {
-    supports_half_floats_ = AreAllGLExtensionsPresent(
-        context_provider_->ContextGL(),
-        {"GL_EXT_color_buffer_half_float", "GL_OES_texture_half_float_linear"});
-  }
-  return supports_half_floats_.value();
-}
-
-int GLScaler::GetMaxDrawBuffersSupported() const {
-  if (!context_provider_) {
-    return 0;
-  }
-
-  if (max_draw_buffers_ < 0) {
-    // Query the GL context for the multiple draw buffers extension and, if
-    // present, the actual platform-supported maximum.
-    GLES2Interface* const gl = context_provider_->ContextGL();
-    DCHECK(gl);
-    if (AreAllGLExtensionsPresent(gl, {"GL_EXT_draw_buffers"})) {
-      gl->GetIntegerv(GL_MAX_DRAW_BUFFERS_EXT, &max_draw_buffers_);
-    } else {
-      // The extension is not present & OpenGL ES 2.0 does not support
-      // glDrawBuffers function without it.
-      max_draw_buffers_ = 0;
-    }
-  }
-
-  return max_draw_buffers_;
-}
-
-bool GLScaler::Configure(const Parameters& new_params) {
-  chain_.reset();
-  shader_programs_.clear();
-
-  if (!context_provider_) {
-    return false;
-  }
-  GLES2Interface* const gl = context_provider_->ContextGL();
-  DCHECK(gl);
-
-  params_ = new_params;
-
-  // Ensure the client has provided valid scaling vectors.
-  if (params_.scale_from.x() == 0 || params_.scale_from.y() == 0 ||
-      params_.scale_to.x() == 0 || params_.scale_to.y() == 0) {
-    // The caller computed invalid scale_from and/or scale_to values.
-    DVLOG(1) << __func__ << ": Invalid scaling vectors: scale_from="
-             << params_.scale_from.ToString()
-             << ", scale_to=" << params_.scale_to.ToString();
-    return false;
-  }
-
-  // Resolve the color spaces according to the rules described in the header
-  // file.
-  if (!params_.source_color_space.IsValid()) {
-    params_.source_color_space = gfx::ColorSpace::CreateSRGB();
-  }
-  if (!params_.output_color_space.IsValid()) {
-    params_.output_color_space = params_.source_color_space;
-  }
-
-  // Check that 16-bit half floats are supported if precise color management is
-  // being requested.
-  if (params_.enable_precise_color_management) {
-    if (!SupportsPreciseColorManagement()) {
-      DVLOG(1) << __func__
-               << ": GL context does not support the half-floats "
-                  "required for precise color management.";
-      return false;
-    }
-  }
-
-  // Check that MRT support is available if certain export formats were
-  // specified in the Parameters.
-  if (params_.export_format == Parameters::ExportFormat::NV61 ||
-      params_.export_format ==
-          Parameters::ExportFormat::DEINTERLEAVE_PAIRWISE) {
-    if (GetMaxDrawBuffersSupported() < 2) {
-      DVLOG(1) << __func__ << ": GL context does not support 2+ draw buffers.";
-      return false;
-    }
-  }
-
-  // Color space transformation is meaningless when using the deinterleaver
-  // because it only deals with two color channels. This also means precise
-  // color management must be disabled.
-  if (params_.export_format ==
-          Parameters::ExportFormat::DEINTERLEAVE_PAIRWISE &&
-      (params_.source_color_space != params_.output_color_space ||
-       params_.enable_precise_color_management)) {
-    NOTIMPLEMENTED();
-    return false;
-  }
-
-  // Check that one of the two implemented output swizzles has been specified.
-  for (GLenum s : params_.swizzle) {
-    if (s != GL_RGBA && s != GL_BGRA_EXT) {
-      NOTIMPLEMENTED();
-      return false;
-    }
-  }
-
-  // Create the chain of ScalerStages. If the quality setting is FAST or there
-  // is no scaling to be done, just create a single stage.
-  std::unique_ptr<ScalerStage> chain;
-  if (params_.quality == Parameters::Quality::FAST ||
-      params_.scale_from == params_.scale_to) {
-    chain = std::make_unique<ScalerStage>(gl, Shader::BILINEAR, HORIZONTAL,
-                                          params_.scale_from, params_.scale_to);
-  } else if (params_.quality == Parameters::Quality::GOOD) {
-    chain = CreateAGoodScalingChain(gl, params_.scale_from, params_.scale_to);
-  } else if (params_.quality == Parameters::Quality::BEST) {
-    chain = CreateTheBestScalingChain(gl, params_.scale_from, params_.scale_to);
-  } else {
-    NOTREACHED();
-  }
-  chain = MaybeAppendExportStage(gl, std::move(chain), params_.export_format);
-
-  // Determine the color space and the data type of the pixels in the
-  // intermediate textures, depending on whether precise color management is
-  // enabled. Note that nothing special need be done here if no scaling will be
-  // performed.
-  GLenum intermediate_texture_type;
-  if (params_.enable_precise_color_management &&
-      params_.scale_from != params_.scale_to) {
-    // Ensure the scaling color space is using a linear transfer function.
-    constexpr auto kLinearFunction = std::make_tuple(1, 0, 1, 0, 0, 0, 1);
-    skcms_TransferFunction fn;
-    if (params_.source_color_space.GetTransferFunction(&fn) &&
-        std::make_tuple(fn.a, fn.b, fn.c, fn.d, fn.e, fn.f, fn.g) ==
-            kLinearFunction) {
-      scaling_color_space_ = params_.source_color_space;
-    } else {
-      // Use the source color space, but with a linear transfer function.
-      skcms_Matrix3x3 to_XYZD50;
-      params_.source_color_space.GetPrimaryMatrix(&to_XYZD50);
-      std::tie(fn.a, fn.b, fn.c, fn.d, fn.e, fn.f, fn.g) = kLinearFunction;
-      scaling_color_space_ = gfx::ColorSpace::CreateCustom(to_XYZD50, fn);
-    }
-    intermediate_texture_type = GL_HALF_FLOAT_OES;
-  } else {
-    scaling_color_space_ = params_.source_color_space;
-    intermediate_texture_type = GL_UNSIGNED_BYTE;
-  }
-
-  // Set the shader program on the final stage. Include color space
-  // transformation and swizzling, if necessary.
-  std::unique_ptr<gfx::ColorTransform> transform;
-  if (scaling_color_space_ != params_.output_color_space) {
-    transform = gfx::ColorTransform::NewColorTransform(
-        scaling_color_space_, params_.output_color_space);
-  }
-  ScalerStage* const final_stage = chain.get();
-  final_stage->set_shader_program(
-      GetShaderProgram(final_stage->shader(), intermediate_texture_type,
-                       transform.get(), params_.swizzle));
-
-  // Set the shader program on all prior stages. These stages are all operating
-  // in the same color space, |scaling_color_space_|.
-  static const GLenum kNoSwizzle[2] = {GL_RGBA, GL_RGBA};
-  ScalerStage* input_stage = final_stage;
-  while (input_stage->input_stage()) {
-    input_stage = input_stage->input_stage();
-    input_stage->set_shader_program(GetShaderProgram(
-        input_stage->shader(), intermediate_texture_type, nullptr, kNoSwizzle));
-  }
-  // From this point, |input_stage| points to the first ScalerStage (i.e., the
-  // one that will be reading from the source).
-
-  // If necessary, prepend an extra "import stage" that color-converts the input
-  // before any scaling occurs. It's important not to merge color space
-  // conversion of the source with any other steps because the texture sampler
-  // must not linearly interpolate until after the colors have been mapped to a
-  // linear color space.
-  if (params_.source_color_space != scaling_color_space_) {
-    input_stage->set_input_stage(std::make_unique<ScalerStage>(
-        gl, Shader::BILINEAR, HORIZONTAL, input_stage->scale_from(),
-        input_stage->scale_from()));
-    input_stage = input_stage->input_stage();
-    transform = gfx::ColorTransform::NewColorTransform(
-        params_.source_color_space, scaling_color_space_);
-    input_stage->set_shader_program(
-        GetShaderProgram(input_stage->shader(), intermediate_texture_type,
-                         transform.get(), kNoSwizzle));
-  }
-
-  // If the source content is Y-flipped, the input scaler stage will perform
-  // math to account for this. It also will flip the content during scaling so
-  // that all following stages may assume the content is not flipped. Then, the
-  // final stage must ensure the final output is correctly flipped-back (or not)
-  // based on what the first stage did PLUS what is being requested by the
-  // client code.
-  if (params_.is_flipped_source) {
-    input_stage->set_is_flipped_source(true);
-    input_stage->set_flip_output(true);
-  }
-  if (input_stage->flip_output() != params_.flip_output) {
-    final_stage->set_flip_output(!final_stage->flip_output());
-  }
-
-  chain_ = std::move(chain);
-  VLOG(2) << __func__ << " built this: " << *this;
-  return true;
-}
-
-bool GLScaler::ScaleToMultipleOutputs(GLuint src_texture,
-                                      const gfx::Size& src_texture_size,
-                                      const gfx::Vector2d& src_offset,
-                                      GLuint dest_texture_0,
-                                      GLuint dest_texture_1,
-                                      const gfx::Rect& output_rect) {
-  if (!chain_) {
-    return false;
-  }
-
-  // Bind the vertex attributes used to sweep the entire source area when
-  // executing the shader programs.
-  GLES2Interface* const gl = context_provider_->ContextGL();
-  DCHECK(gl);
-  if (vertex_attributes_buffer_) {
-    gl->BindBuffer(GL_ARRAY_BUFFER, vertex_attributes_buffer_);
-  } else {
-    gl->GenBuffers(1, &vertex_attributes_buffer_);
-    gl->BindBuffer(GL_ARRAY_BUFFER, vertex_attributes_buffer_);
-    gl->BufferData(GL_ARRAY_BUFFER, sizeof(ShaderProgram::kVertexAttributes),
-                   ShaderProgram::kVertexAttributes, GL_STATIC_DRAW);
-  }
-
-  // Disable GL clipping/blending features that interfere with assumptions made
-  // by the implementation. Only those known to possibly be enabled elsewhere in
-  // Chromium code are disabled here, while the remainder are sanity-DCHECK'ed.
-  gl->Disable(GL_SCISSOR_TEST);
-  gl->Disable(GL_STENCIL_TEST);
-  gl->Disable(GL_BLEND);
-  DCHECK_NE(gl->IsEnabled(GL_CULL_FACE), GL_TRUE);
-  DCHECK_NE(gl->IsEnabled(GL_DEPTH_TEST), GL_TRUE);
-  DCHECK_NE(gl->IsEnabled(GL_POLYGON_OFFSET_FILL), GL_TRUE);
-  DCHECK_NE(gl->IsEnabled(GL_SAMPLE_ALPHA_TO_COVERAGE), GL_TRUE);
-  DCHECK_NE(gl->IsEnabled(GL_SAMPLE_COVERAGE), GL_TRUE);
-  DCHECK_NE(gl->IsEnabled(GL_SCISSOR_TEST), GL_TRUE);
-  DCHECK_NE(gl->IsEnabled(GL_STENCIL_TEST), GL_TRUE);
-
-  chain_->ScaleToMultipleOutputs(src_texture, src_texture_size, src_offset,
-                                 dest_texture_0, dest_texture_1, output_rect);
-
-  gl->BindBuffer(GL_ARRAY_BUFFER, 0);
-  return true;
-}
-
-// static
-bool GLScaler::ParametersHasSameScaleRatio(const GLScaler::Parameters& params,
-                                           const gfx::Vector2d& from,
-                                           const gfx::Vector2d& to) {
-  // Returns true iff a_num/a_denom == b_num/b_denom.
-  const auto AreRatiosEqual = [](int32_t a_num, int32_t a_denom, int32_t b_num,
-                                 int32_t b_denom) -> bool {
-    // The math (for each dimension):
-    //   If: a_num/a_denom == b_num/b_denom
-    //   Then: a_num*b_denom == b_num*a_denom
-    //
-    // ...and cast to int64_t to guarantee no overflow from the multiplications.
-    return (static_cast<int64_t>(a_num) * b_denom) ==
-           (static_cast<int64_t>(b_num) * a_denom);
-  };
-
-  return AreRatiosEqual(params.scale_from.x(), params.scale_to.x(), from.x(),
-                        to.x()) &&
-         AreRatiosEqual(params.scale_from.y(), params.scale_to.y(), from.y(),
-                        to.y());
-}
-
-// static
-bool GLScaler::ParametersAreEquivalent(const Parameters& a,
-                                       const Parameters& b) {
-  if (!ParametersHasSameScaleRatio(a, b.scale_from, b.scale_to) ||
-      a.enable_precise_color_management != b.enable_precise_color_management ||
-      a.quality != b.quality || a.is_flipped_source != b.is_flipped_source ||
-      a.flip_output != b.flip_output || a.export_format != b.export_format ||
-      a.swizzle[0] != b.swizzle[0] || a.swizzle[1] != b.swizzle[1]) {
-    return false;
-  }
-
-  const gfx::ColorSpace source_color_space_a =
-      a.source_color_space.IsValid() ? a.source_color_space
-                                     : gfx::ColorSpace::CreateSRGB();
-  const gfx::ColorSpace source_color_space_b =
-      b.source_color_space.IsValid() ? b.source_color_space
-                                     : gfx::ColorSpace::CreateSRGB();
-  if (source_color_space_a != source_color_space_b) {
-    return false;
-  }
-
-  const gfx::ColorSpace output_color_space_a = a.output_color_space.IsValid()
-                                                   ? a.output_color_space
-                                                   : source_color_space_a;
-  const gfx::ColorSpace output_color_space_b = b.output_color_space.IsValid()
-                                                   ? b.output_color_space
-                                                   : source_color_space_b;
-  return output_color_space_a == output_color_space_b;
-}
-
-void GLScaler::OnContextLost() {
-  // The destruction order here is important due to data dependencies.
-  chain_.reset();
-  shader_programs_.clear();
-  if (vertex_attributes_buffer_) {
-    if (auto* gl = context_provider_->ContextGL()) {
-      gl->DeleteBuffers(1, &vertex_attributes_buffer_);
-    }
-    vertex_attributes_buffer_ = 0;
-  }
-  if (context_provider_) {
-    context_provider_->RemoveObserver(this);
-    context_provider_ = nullptr;
-  }
-}
-
-GLScaler::ShaderProgram* GLScaler::GetShaderProgram(
-    Shader shader,
-    GLenum texture_type,
-    const gfx::ColorTransform* color_transform,
-    const GLenum swizzle[2]) {
-  const ShaderCacheKey key{
-      shader,
-      texture_type,
-      color_transform ? color_transform->GetSrcColorSpace() : gfx::ColorSpace(),
-      color_transform ? color_transform->GetDstColorSpace() : gfx::ColorSpace(),
-      swizzle[0],
-      swizzle[1]};
-  auto it = shader_programs_.find(key);
-  if (it == shader_programs_.end()) {
-    GLES2Interface* const gl = context_provider_->ContextGL();
-    DCHECK(gl);
-    it = shader_programs_
-             .emplace(std::piecewise_construct, std::forward_as_tuple(key),
-                      std::forward_as_tuple(gl, shader, texture_type,
-                                            color_transform, swizzle))
-             .first;
-  }
-  return &it->second;
-}
-
-// static
-std::unique_ptr<GLScaler::ScalerStage> GLScaler::CreateAGoodScalingChain(
-    gpu::gles2::GLES2Interface* gl,
-    const gfx::Vector2d& scale_from,
-    const gfx::Vector2d& scale_to) {
-  DCHECK(scale_from.x() != 0 && scale_from.y() != 0)
-      << "Bad scale_from: " << scale_from.ToString();
-  DCHECK(scale_to.x() != 0 && scale_to.y() != 0)
-      << "Bad scale_to: " << scale_to.ToString();
-  DCHECK(scale_from != scale_to);
-
-  // The GOOD quality chain performs one bilinear upscale followed by N bilinear
-  // halvings, and does this is both directions. Exception: No upscale is needed
-  // when |scale_from| is a power of two multiple of |scale_to|.
-  //
-  // Since all shaders use bilinear filtering, the heuristics below attempt to
-  // greedily merge steps wherever possible to minimize GPU memory usage and
-  // processing time. This also means that it will be extremely rare for the
-  // stage doing the initial upscale to actually require a larger output texture
-  // than the source texture (a downscale will be merged into the same stage).
-
-  // Determine the initial upscaled-to size, as the minimum number of doublings
-  // to make |scale_to| greater than |scale_from|.
-  const RelativeSize from(scale_from);
-  const RelativeSize to(scale_to);
-  RelativeSize upscale_to = to;
-  for (Axis x_or_y : std::array<Axis, 2>{HORIZONTAL, VERTICAL}) {
-    while (upscale_to[x_or_y] < from[x_or_y]) {
-      upscale_to[x_or_y] *= 2;
-    }
-  }
-
-  // Create the stages in order from first-to-last, taking the greediest path
-  // each time. Something like an A* algorithm would be better for discovering
-  // an optimal sequence of operations, and would allow using the BILINEAR3
-  // shader as well, but the run-time performance to compute the stages would be
-  // too prohibitive.
-  std::unique_ptr<ScalerStage> chain;
-  struct CandidateOp {
-    Shader shader;
-    Axis primary_axis;
-    RelativeSize output_size;
-  };
-  std::vector<CandidateOp> candidates;
-  for (RelativeSize cur = from; cur != to;
-       cur = RelativeSize(chain->scale_to())) {
-    candidates.clear();
-
-    // Determine whether it's possible to do exactly 2 bilinear passes in both
-    // directions.
-    RelativeSize output_size_2x2 = {0, 0};
-    for (Axis x_or_y : std::array<Axis, 2>{VERTICAL, HORIZONTAL}) {
-      if (cur[x_or_y] == from[x_or_y]) {
-        // For the first stage, the 2 bilinear passes must be the initial
-        // upscale followed by one downscale. If there is no initial upscale,
-        // then the 2 passes must both be downscales.
-        if (upscale_to[x_or_y] != from[x_or_y] &&
-            upscale_to[x_or_y] / 2 >= to[x_or_y]) {
-          output_size_2x2[x_or_y] = upscale_to[x_or_y] / 2;
-        } else if (upscale_to[x_or_y] == from[x_or_y] &&
-                   upscale_to[x_or_y] / 4 >= to[x_or_y]) {
-          output_size_2x2[x_or_y] = cur[x_or_y] / 4;
-        }
-      } else {
-        // For all later stages, the 2 bilinear passes must be 2 halvings.
-        if (cur[x_or_y] / 4 >= to[x_or_y]) {
-          output_size_2x2[x_or_y] = cur[x_or_y] / 4;
-        }
-      }
-    }
-    if (output_size_2x2[HORIZONTAL] != 0 && output_size_2x2[VERTICAL] != 0) {
-      candidates.push_back(
-          CandidateOp{Shader::BILINEAR2X2, HORIZONTAL, output_size_2x2});
-    }
-
-    // Determine the valid set of Ops that do 1 to 3 bilinear passes in one
-    // direction and 0 or 1 pass in the other direction.
-    for (Axis x_or_y : std::array<Axis, 2>{VERTICAL, HORIZONTAL}) {
-      // The first bilinear pass in x_or_y must be an upscale or a halving.
-      Shader shader = Shader::BILINEAR;
-      RelativeSize output_size = cur;
-      if (cur[x_or_y] == from[x_or_y] && upscale_to[x_or_y] != from[x_or_y]) {
-        output_size[x_or_y] = upscale_to[x_or_y];
-      } else if (cur[x_or_y] / 2 >= to[x_or_y]) {
-        output_size[x_or_y] /= 2;
-      } else {
-        DCHECK_EQ(cur[x_or_y], to[x_or_y]);
-        continue;
-      }
-
-      // Determine whether 1 or 2 additional passes can be made in the same
-      // direction.
-      if (output_size[x_or_y] / 4 >= to[x_or_y]) {
-        shader = Shader::BILINEAR4;  // 2 more passes == 3 total.
-        output_size[x_or_y] /= 4;
-      } else if (output_size[x_or_y] / 2 >= to[x_or_y]) {
-        shader = Shader::BILINEAR2;  // 1 more pass == 2 total.
-        output_size[x_or_y] /= 2;
-      } else {
-        DCHECK_EQ(output_size[x_or_y], to[x_or_y]);
-      }
-
-      // Determine whether 0 or 1 bilinear passes can be made in the other
-      // direction at the same time.
-      const Axis y_or_x = TheOtherAxis(x_or_y);
-      if (cur[y_or_x] == from[y_or_x] && upscale_to[y_or_x] != from[y_or_x]) {
-        output_size[y_or_x] = upscale_to[y_or_x];
-      } else if (cur[y_or_x] / 2 >= to[y_or_x]) {
-        output_size[y_or_x] /= 2;
-      } else {
-        DCHECK_EQ(cur[y_or_x], to[y_or_x]);
-      }
-
-      candidates.push_back(CandidateOp{shader, x_or_y, output_size});
-    }
-
-    // From the candidates, pick the one that produces the fewest number of
-    // output pixels, and append a new ScalerStage. There are opportunities to
-    // improve the "cost function" here (e.g., pixels in the Y direction
-    // probably cost more to process than pixels in the X direction), but that
-    // would require more research.
-    const auto best_candidate = std::min_element(
-        candidates.begin(), candidates.end(),
-        [](const CandidateOp& a, const CandidateOp& b) {
-          static_assert(sizeof(a.output_size[0]) <= sizeof(int32_t),
-                        "Overflow issue in the math here.");
-          const int64_t cost_of_a =
-              int64_t{a.output_size[HORIZONTAL]} * a.output_size[VERTICAL];
-          const int64_t cost_of_b =
-              int64_t{b.output_size[HORIZONTAL]} * b.output_size[VERTICAL];
-          return cost_of_a < cost_of_b;
-        });
-    DCHECK(best_candidate != candidates.end());
-    DCHECK(cur != best_candidate->output_size)
-        << "Best candidate's output size (" << best_candidate->output_size
-        << ") should not equal the input size.";
-    auto next_stage = std::make_unique<ScalerStage>(
-        gl, best_candidate->shader, best_candidate->primary_axis,
-        cur.AsVector2d(), best_candidate->output_size.AsVector2d());
-    next_stage->set_input_stage(std::move(chain));
-    chain = std::move(next_stage);
-  }
-
-  return chain;
-}
-
-// static
-std::unique_ptr<GLScaler::ScalerStage> GLScaler::CreateTheBestScalingChain(
-    gpu::gles2::GLES2Interface* gl,
-    const gfx::Vector2d& scale_from,
-    const gfx::Vector2d& scale_to) {
-  // The BEST quality chain performs one bicubic upscale followed by N bicubic
-  // halvings, and does this is both directions. Exception: No upscale is needed
-  // when |scale_from| is a power of two multiple of |scale_to|.
-
-  // Determine the initial upscaled-to size, as the minimum number of doublings
-  // to make |scale_to| greater than |scale_from|.
-  const RelativeSize from(scale_from);
-  const RelativeSize to(scale_to);
-  RelativeSize upscale_to = to;
-  for (Axis x_or_y : std::array<Axis, 2>{HORIZONTAL, VERTICAL}) {
-    while (upscale_to[x_or_y] < from[x_or_y]) {
-      upscale_to[x_or_y] *= 2;
-    }
-  }
-
-  // Create the stages in order from first-to-last.
-  RelativeSize cur = from;
-  std::unique_ptr<ScalerStage> chain;
-  for (Axis x_or_y : std::array<Axis, 2>{VERTICAL, HORIZONTAL}) {
-    if (upscale_to[x_or_y] != from[x_or_y]) {
-      RelativeSize next = cur;
-      next[x_or_y] = upscale_to[x_or_y];
-      auto upscale_stage =
-          std::make_unique<ScalerStage>(gl, Shader::BICUBIC_UPSCALE, x_or_y,
-                                        cur.AsVector2d(), next.AsVector2d());
-      upscale_stage->set_input_stage(std::move(chain));
-      chain = std::move(upscale_stage);
-      cur = next;
-    }
-    while (cur[x_or_y] > to[x_or_y]) {
-      RelativeSize next = cur;
-      next[x_or_y] /= 2;
-      auto next_stage =
-          std::make_unique<ScalerStage>(gl, Shader::BICUBIC_HALF_1D, x_or_y,
-                                        cur.AsVector2d(), next.AsVector2d());
-      next_stage->set_input_stage(std::move(chain));
-      chain = std::move(next_stage);
-      cur = next;
-    }
-  }
-  DCHECK_EQ(cur, to);
-
-  return chain;
-}
-
-// static
-std::unique_ptr<GLScaler::ScalerStage> GLScaler::MaybeAppendExportStage(
-    gpu::gles2::GLES2Interface* gl,
-    std::unique_ptr<GLScaler::ScalerStage> chain,
-    GLScaler::Parameters::ExportFormat export_format) {
-  DCHECK(chain);
-
-  if (export_format == Parameters::ExportFormat::INTERLEAVED_QUADS) {
-    return chain;  // No format change.
-  }
-
-  // If the final stage uses the BILINEAR shader that is not upscaling, the
-  // export stage can replace it with no change in the results. Otherwise, a
-  // separate export stage will be appended.
-  gfx::Vector2d scale_from = chain->scale_from();
-  const gfx::Vector2d scale_to = chain->scale_to();
-  if (chain->shader() == Shader::BILINEAR && scale_from.x() >= scale_to.x() &&
-      scale_from.y() >= scale_to.y()) {
-    chain = chain->take_input_stage();
-  } else {
-    scale_from = scale_to;
-  }
-
-  Shader shader = Shader::BILINEAR;
-  scale_from.set_x(scale_from.x() * 4);
-  switch (export_format) {
-    case Parameters::ExportFormat::INTERLEAVED_QUADS:
-      NOTREACHED();
-      break;
-    case Parameters::ExportFormat::CHANNEL_0:
-      shader = Shader::PLANAR_CHANNEL_0;
-      break;
-    case Parameters::ExportFormat::CHANNEL_1:
-      shader = Shader::PLANAR_CHANNEL_1;
-      break;
-    case Parameters::ExportFormat::CHANNEL_2:
-      shader = Shader::PLANAR_CHANNEL_2;
-      break;
-    case Parameters::ExportFormat::CHANNEL_3:
-      shader = Shader::PLANAR_CHANNEL_3;
-      break;
-    case Parameters::ExportFormat::NV61:
-      shader = Shader::I422_NV61_MRT;
-      break;
-    case Parameters::ExportFormat::DEINTERLEAVE_PAIRWISE:
-      shader = Shader::DEINTERLEAVE_PAIRWISE_MRT;
-      // Horizontal scale is only 0.5X, not 0.25X like all the others.
-      scale_from.set_x(scale_from.x() / 2);
-      break;
-    case Parameters::ExportFormat::UV_CHANNELS:
-      shader = Shader::PLANAR_CHANNELS_1_2;
-      break;
-  }
-
-  auto export_stage = std::make_unique<ScalerStage>(gl, shader, HORIZONTAL,
-                                                    scale_from, scale_to);
-  export_stage->set_input_stage(std::move(chain));
-  return export_stage;
-}
-
-// static
-GLScaler::Axis GLScaler::TheOtherAxis(GLScaler::Axis x_or_y) {
-  return x_or_y == HORIZONTAL ? VERTICAL : HORIZONTAL;
-}
-
-// static
-const char* GLScaler::GetShaderName(GLScaler::Shader shader) {
-  switch (shader) {
-#define CASE_RETURN_SHADER_STR(x) \
-  case Shader::x:                 \
-    return #x
-    CASE_RETURN_SHADER_STR(BILINEAR);
-    CASE_RETURN_SHADER_STR(BILINEAR2);
-    CASE_RETURN_SHADER_STR(BILINEAR3);
-    CASE_RETURN_SHADER_STR(BILINEAR4);
-    CASE_RETURN_SHADER_STR(BILINEAR2X2);
-    CASE_RETURN_SHADER_STR(BICUBIC_UPSCALE);
-    CASE_RETURN_SHADER_STR(BICUBIC_HALF_1D);
-    CASE_RETURN_SHADER_STR(PLANAR_CHANNEL_0);
-    CASE_RETURN_SHADER_STR(PLANAR_CHANNEL_1);
-    CASE_RETURN_SHADER_STR(PLANAR_CHANNEL_2);
-    CASE_RETURN_SHADER_STR(PLANAR_CHANNEL_3);
-    CASE_RETURN_SHADER_STR(I422_NV61_MRT);
-    CASE_RETURN_SHADER_STR(DEINTERLEAVE_PAIRWISE_MRT);
-    CASE_RETURN_SHADER_STR(PLANAR_CHANNELS_1_2);
-#undef CASE_RETURN_SHADER_STR
-  }
-}
-
-// static
-bool GLScaler::AreAllGLExtensionsPresent(
-    gpu::gles2::GLES2Interface* gl,
-    const std::vector<std::string>& names) {
-  DCHECK(gl);
-  if (const auto* extensions = gl->GetString(GL_EXTENSIONS)) {
-    const std::string extensions_string =
-        " " + std::string(reinterpret_cast<const char*>(extensions)) + " ";
-    for (const std::string& name : names) {
-      if (extensions_string.find(" " + name + " ") == std::string::npos) {
-        return false;
-      }
-    }
-    return true;
-  }
-  return false;
-}
-
-GLScaler::Parameters::Parameters() = default;
-GLScaler::Parameters::Parameters(const Parameters& other) = default;
-GLScaler::Parameters::~Parameters() = default;
-
-// static
-const GLfloat GLScaler::ShaderProgram::kVertexAttributes[16] = {
-    -1.0f, -1.0f, 0.0f, 0.0f,  // vertex 0
-    1.0f,  -1.0f, 1.0f, 0.0f,  // vertex 1
-    -1.0f, 1.0f,  0.0f, 1.0f,  // vertex 2
-    1.0f,  1.0f,  1.0f, 1.0f,  // vertex 3
-};
-
-GLScaler::ShaderProgram::ShaderProgram(
-    gpu::gles2::GLES2Interface* gl,
-    GLScaler::Shader shader,
-    GLenum texture_type,
-    const gfx::ColorTransform* color_transform,
-    const GLenum swizzle[2])
-    : gl_(gl),
-      shader_(shader),
-      texture_type_(texture_type),
-      program_(gl_->CreateProgram()) {
-  DCHECK(program_);
-
-  std::basic_ostringstream<GLchar> vertex_header;
-  std::basic_ostringstream<GLchar> fragment_directives;
-  std::basic_ostringstream<GLchar> fragment_header;
-  std::basic_ostringstream<GLchar> shared_variables;
-  std::basic_ostringstream<GLchar> vertex_main;
-  std::basic_ostringstream<GLchar> fragment_main;
-
-  vertex_header
-      << ("precision highp float;\n"
-          "attribute vec2 a_position;\n"
-          "attribute vec2 a_texcoord;\n"
-          "uniform vec4 src_rect;\n");
-
-  fragment_header << "precision mediump float;\n";
-  switch (texture_type_) {
-    case GL_FLOAT:
-      fragment_header << "precision highp sampler2D;\n";
-      break;
-    case GL_HALF_FLOAT_OES:
-      fragment_header << "precision mediump sampler2D;\n";
-      break;
-    default:
-      fragment_header << "precision lowp sampler2D;\n";
-      break;
-  }
-  fragment_header << "uniform sampler2D s_texture;\n";
-
-  if (color_transform && shader_ != Shader::PLANAR_CHANNEL_3) {
-    const std::string& source = color_transform->GetShaderSource();
-    // Assumption: gfx::ColorTransform::GetShaderSource() should provide a
-    // function named DoColorConversion() that takes a vec3 argument and returns
-    // a vec3.
-    DCHECK_NE(source.find("DoColorConversion"), std::string::npos);
-    fragment_header << source;
-  }
-
-  vertex_main
-      << ("  gl_Position = vec4(a_position, 0.0, 1.0);\n"
-          "  vec2 texcoord = src_rect.xy + a_texcoord * src_rect.zw;\n");
-
-  switch (shader_) {
-    case Shader::BILINEAR:
-      shared_variables << "varying highp vec2 v_texcoord;\n";
-      vertex_main << "  v_texcoord = texcoord;\n";
-      fragment_main << "  vec4 sample = texture2D(s_texture, v_texcoord);\n";
-      if (color_transform) {
-        fragment_main << "  sample.rgb = DoColorConversion(sample.rgb);\n";
-      }
-      if (swizzle[0] == GL_BGRA_EXT) {
-        fragment_main << "  sample.rb = sample.br;\n";
-      }
-      fragment_main << "  gl_FragColor = sample;\n";
-      break;
-
-    case Shader::BILINEAR2:
-      // This is equivialent to two passes of the BILINEAR shader above. It can
-      // be used to scale an image down 1.0x-2.0x in either dimension, or
-      // exactly 4x.
-      shared_variables << "varying highp vec4 v_texcoords;\n";
-      vertex_header << "uniform vec2 scaling_vector;\n";
-      vertex_main
-          << ("  vec2 step = scaling_vector / 4.0;\n"
-              "  v_texcoords.xy = texcoord + step;\n"
-              "  v_texcoords.zw = texcoord - step;\n");
-      fragment_main
-          << ("  vec4 blended = (texture2D(s_texture, v_texcoords.xy) +\n"
-              "                  texture2D(s_texture, v_texcoords.zw)) /\n"
-              "                 2.0;\n");
-      if (color_transform) {
-        fragment_main << "  blended.rgb = DoColorConversion(blended.rgb);\n";
-      }
-      if (swizzle[0] == GL_BGRA_EXT) {
-        fragment_main << "  blended.rb = blended.br;\n";
-      }
-      fragment_main << "  gl_FragColor = blended;\n";
-      break;
-
-    case Shader::BILINEAR3:
-      // This is kind of like doing 1.5 passes of the BILINEAR shader. It can be
-      // used to scale an image down 1.5x-3.0x, or exactly 6x.
-      shared_variables
-          << ("varying highp vec4 v_texcoords0;\n"
-              "varying highp vec2 v_texcoords1;\n");
-      vertex_header << "uniform vec2 scaling_vector;\n";
-      vertex_main
-          << ("  vec2 step = scaling_vector / 3.0;\n"
-              "  v_texcoords0.xy = texcoord + step;\n"
-              "  v_texcoords0.zw = texcoord;\n"
-              "  v_texcoords1 = texcoord - step;\n");
-      fragment_main
-          << ("  vec4 blended = (texture2D(s_texture, v_texcoords0.xy) +\n"
-              "                  texture2D(s_texture, v_texcoords0.zw) +\n"
-              "                  texture2D(s_texture, v_texcoords1)) / 3.0;\n");
-      if (color_transform) {
-        fragment_main << "  blended.rgb = DoColorConversion(blended.rgb);\n";
-      }
-      if (swizzle[0] == GL_BGRA_EXT) {
-        fragment_main << "  blended.rb = blended.br;\n";
-      }
-      fragment_main << "  gl_FragColor = blended;\n";
-      break;
-
-    case Shader::BILINEAR4:
-      // This is equivialent to three passes of the BILINEAR shader above. It
-      // can be used to scale an image down 2.0x-4.0x or exactly 8x.
-      shared_variables << "varying highp vec4 v_texcoords[2];\n";
-      vertex_header << "uniform vec2 scaling_vector;\n";
-      vertex_main
-          << ("  vec2 step = scaling_vector / 8.0;\n"
-              "  v_texcoords[0].xy = texcoord - step * 3.0;\n"
-              "  v_texcoords[0].zw = texcoord - step;\n"
-              "  v_texcoords[1].xy = texcoord + step;\n"
-              "  v_texcoords[1].zw = texcoord + step * 3.0;\n");
-      fragment_main
-          << ("  vec4 blended = (\n"
-              "      texture2D(s_texture, v_texcoords[0].xy) +\n"
-              "      texture2D(s_texture, v_texcoords[0].zw) +\n"
-              "      texture2D(s_texture, v_texcoords[1].xy) +\n"
-              "      texture2D(s_texture, v_texcoords[1].zw)) / 4.0;\n");
-      if (color_transform) {
-        fragment_main << "  blended.rgb = DoColorConversion(blended.rgb);\n";
-      }
-      if (swizzle[0] == GL_BGRA_EXT) {
-        fragment_main << "  blended.rb = blended.br;\n";
-      }
-      fragment_main << "  gl_FragColor = blended;\n";
-      break;
-
-    case Shader::BILINEAR2X2:
-      // This is equivialent to four passes of the BILINEAR shader above, two in
-      // each dimension. It can be used to scale an image down 1.0x-2.0x in both
-      // X and Y directions. Or, it could be used to scale an image down by
-      // exactly 4x in both dimensions.
-      shared_variables << "varying highp vec4 v_texcoords[2];\n";
-      vertex_header << "uniform vec2 scaling_vector;\n";
-      vertex_main
-          << ("  vec2 step = scaling_vector / 4.0;\n"
-              "  v_texcoords[0].xy = texcoord + vec2(step.x, step.y);\n"
-              "  v_texcoords[0].zw = texcoord + vec2(step.x, -step.y);\n"
-              "  v_texcoords[1].xy = texcoord + vec2(-step.x, step.y);\n"
-              "  v_texcoords[1].zw = texcoord + vec2(-step.x, -step.y);\n");
-      fragment_main
-          << ("  vec4 blended = (\n"
-              "      texture2D(s_texture, v_texcoords[0].xy) +\n"
-              "      texture2D(s_texture, v_texcoords[0].zw) +\n"
-              "      texture2D(s_texture, v_texcoords[1].xy) +\n"
-              "      texture2D(s_texture, v_texcoords[1].zw)) / 4.0;\n");
-      if (color_transform) {
-        fragment_main << "  blended.rgb = DoColorConversion(blended.rgb);\n";
-      }
-      if (swizzle[0] == GL_BGRA_EXT) {
-        fragment_main << "  blended.rb = blended.br;\n";
-      }
-      fragment_main << "  gl_FragColor = blended;\n";
-      break;
-
-    case Shader::BICUBIC_UPSCALE:
-      // When scaling up, 4 texture reads are necessary. However, some
-      // instructions can be saved because the parameter passed to the bicubic
-      // function will be in a known range. Also, when sampling the bicubic
-      // function like this, the sum is always exactly one, so normalization can
-      // be skipped as well.
-      shared_variables << "varying highp vec2 v_texcoord;\n";
-      vertex_main << "  v_texcoord = texcoord;\n";
-      fragment_header
-          << ("uniform highp vec2 src_pixelsize;\n"
-              "uniform highp vec2 scaling_vector;\n"
-              "const float a = -0.5;\n"
-              // This function is equivialent to calling the bicubic
-              // function with x-1, x, 1-x and 2-x (assuming
-              // 0 <= x < 1). The following is the Catmull-Rom spline.
-              // See: http://wikipedia.org/wiki/Cubic_Hermite_spline
-              "vec4 filt4(float x) {\n"
-              "  return vec4(x * x * x, x * x, x, 1) *\n"
-              "         mat4(       a,      -2.0 * a,   a, 0.0,\n"
-              "               a + 2.0,      -a - 3.0, 0.0, 1.0,\n"
-              "              -a - 2.0, 3.0 + 2.0 * a,  -a, 0.0,\n"
-              "                    -a,             a, 0.0, 0.0);\n"
-              "}\n"
-              "mat4 pixels_x(highp vec2 pos, highp vec2 step) {\n"
-              "  return mat4(texture2D(s_texture, pos - step),\n"
-              "              texture2D(s_texture, pos),\n"
-              "              texture2D(s_texture, pos + step),\n"
-              "              texture2D(s_texture, pos + step * 2.0));\n"
-              "}\n");
-      fragment_main
-          << ("  highp vec2 pixel_pos = v_texcoord * src_pixelsize - \n"
-              "      scaling_vector / 2.0;\n"
-              "  highp float frac = fract(dot(pixel_pos, scaling_vector));\n"
-              "  highp vec2 base = \n"
-              "      (floor(pixel_pos) + vec2(0.5)) / src_pixelsize;\n"
-              "  highp vec2 step = scaling_vector / src_pixelsize;\n"
-              "  vec4 blended = pixels_x(base, step) * filt4(frac);\n");
-      if (color_transform) {
-        fragment_main << "  blended.rgb = DoColorConversion(blended.rgb);\n";
-      }
-      if (swizzle[0] == GL_BGRA_EXT) {
-        fragment_main << "  blended.rb = blended.br;\n";
-      }
-      fragment_main << "  gl_FragColor = blended;\n";
-      break;
-
-    case Shader::BICUBIC_HALF_1D:
-      // This scales down an image by exactly half in one dimension. The
-      // bilinear lookup reduces the number of texture reads from 8 to 4.
-      shared_variables << "varying highp vec4 v_texcoords[2];\n";
-      vertex_header
-          << ("uniform vec2 scaling_vector;\n"
-              "const float CenterDist = 99.0 / 140.0;\n"
-              "const float LobeDist = 11.0 / 4.0;\n");
-      vertex_main
-          << ("  vec2 step = scaling_vector / 2.0;\n"
-              "  v_texcoords[0].xy = texcoord - LobeDist * step;\n"
-              "  v_texcoords[0].zw = texcoord - CenterDist * step;\n"
-              "  v_texcoords[1].xy = texcoord + CenterDist * step;\n"
-              "  v_texcoords[1].zw = texcoord + LobeDist * step;\n");
-      fragment_header
-          << ("const float CenterWeight = 35.0 / 64.0;\n"
-              "const float LobeWeight = -3.0 / 64.0;\n");
-      fragment_main
-          << ("  vec4 blended = \n"
-              // Lobe pixels
-              "      (texture2D(s_texture, v_texcoords[0].xy) +\n"
-              "       texture2D(s_texture, v_texcoords[1].zw)) *\n"
-              "          LobeWeight +\n"
-              // Center pixels
-              "      (texture2D(s_texture, v_texcoords[0].zw) +\n"
-              "       texture2D(s_texture, v_texcoords[1].xy)) *\n"
-              "          CenterWeight;\n");
-      if (color_transform) {
-        fragment_main << "  blended.rgb = DoColorConversion(blended.rgb);\n";
-      }
-      if (swizzle[0] == GL_BGRA_EXT) {
-        fragment_main << "  blended.rb = blended.br;\n";
-      }
-      fragment_main << "  gl_FragColor = blended;\n";
-      break;
-
-    case Shader::PLANAR_CHANNEL_0:
-    case Shader::PLANAR_CHANNEL_1:
-    case Shader::PLANAR_CHANNEL_2:
-    case Shader::PLANAR_CHANNEL_3: {
-      // Select one color channel, and pack 4 pixels into one output quad. See
-      // header file for diagram.
-      shared_variables << "varying highp vec4 v_texcoords[2];\n";
-      vertex_header << "uniform vec2 scaling_vector;\n";
-      vertex_main
-          << ("  vec2 step = scaling_vector / 4.0;\n"
-              "  v_texcoords[0].xy = texcoord - step * 1.5;\n"
-              "  v_texcoords[0].zw = texcoord - step * 0.5;\n"
-              "  v_texcoords[1].xy = texcoord + step * 0.5;\n"
-              "  v_texcoords[1].zw = texcoord + step * 1.5;\n");
-      std::basic_string<GLchar> convert_open;
-      std::basic_string<GLchar> convert_close;
-      if (color_transform && shader_ != Shader::PLANAR_CHANNEL_3) {
-        convert_open = "DoColorConversion(";
-        convert_close = ".rgb)";
-      }
-      const char selector = "rgba"[static_cast<int>(shader_) -
-                                   static_cast<int>(Shader::PLANAR_CHANNEL_0)];
-      fragment_main << "  vec4 packed_quad = vec4(\n"
-                    << "      " << convert_open
-                    << "texture2D(s_texture, v_texcoords[0].xy)"
-                    << convert_close << '.' << selector << ",\n"
-                    << "      " << convert_open
-                    << "texture2D(s_texture, v_texcoords[0].zw)"
-                    << convert_close << '.' << selector << ",\n"
-                    << "      " << convert_open
-                    << "texture2D(s_texture, v_texcoords[1].xy)"
-                    << convert_close << '.' << selector << ",\n"
-                    << "      " << convert_open
-                    << "texture2D(s_texture, v_texcoords[1].zw)"
-                    << convert_close << '.' << selector << ");\n";
-      if (swizzle[0] == GL_BGRA_EXT) {
-        fragment_main << "  packed_quad.rb = packed_quad.br;\n";
-      }
-      fragment_main << "  gl_FragColor = packed_quad;\n";
-      break;
-    }
-
-    case Shader::I422_NV61_MRT:
-      // I422 sampling, delivered via two output textures (NV61 format). See
-      // header file for diagram.
-      shared_variables << "varying highp vec4 v_texcoords[2];\n";
-      vertex_header << "uniform vec2 scaling_vector;\n";
-      vertex_main
-          << ("  vec2 step = scaling_vector / 4.0;\n"
-              "  v_texcoords[0].xy = texcoord - step * 1.5;\n"
-              "  v_texcoords[0].zw = texcoord - step * 0.5;\n"
-              "  v_texcoords[1].xy = texcoord + step * 0.5;\n"
-              "  v_texcoords[1].zw = texcoord + step * 1.5;\n");
-      fragment_directives << "#extension GL_EXT_draw_buffers : enable\n";
-      fragment_main
-          << ("  vec3 pixel0 = texture2D(s_texture, v_texcoords[0].xy).rgb;\n"
-              "  vec3 pixel1 = texture2D(s_texture, v_texcoords[0].zw).rgb;\n"
-              "  vec3 pixel01 = (pixel0 + pixel1) / 2.0;\n"
-              "  vec3 pixel2 = texture2D(s_texture, v_texcoords[1].xy).rgb;\n"
-              "  vec3 pixel3 = texture2D(s_texture, v_texcoords[1].zw).rgb;\n"
-              "  vec3 pixel23 = (pixel2 + pixel3) / 2.0;\n");
-      if (color_transform) {
-        fragment_main
-            << ("  pixel0 = DoColorConversion(pixel0);\n"
-                "  pixel1 = DoColorConversion(pixel1);\n"
-                "  pixel01 = DoColorConversion(pixel01);\n"
-                "  pixel2 = DoColorConversion(pixel2);\n"
-                "  pixel3 = DoColorConversion(pixel3);\n"
-                "  pixel23 = DoColorConversion(pixel23);\n");
-      }
-      if (swizzle[0] == GL_BGRA_EXT) {
-        fragment_main
-            << ("  gl_FragData[0] = \n"
-                "      vec4(pixel2.r, pixel1.r, pixel0.r, pixel3.r);\n");
-      } else {
-        fragment_main
-            << ("  gl_FragData[0] = \n"
-                "      vec4(pixel0.r, pixel1.r, pixel2.r, pixel3.r);\n");
-      }
-      if (swizzle[1] == GL_BGRA_EXT) {
-        fragment_main
-            << ("  gl_FragData[1] = \n"
-                "      vec4(pixel23.g, pixel01.b, pixel01.g, pixel23.b);\n");
-      } else {
-        fragment_main
-            << ("  gl_FragData[1] = \n"
-                "      vec4(pixel01.g, pixel01.b, pixel23.g, pixel23.b);\n");
-      }
-      break;
-
-    case Shader::DEINTERLEAVE_PAIRWISE_MRT:
-      // Sample two pixels and unswizzle them. There's no need to do vertical
-      // scaling with math, since the bilinear interpolation in the sampler
-      // takes care of that.
-      shared_variables << "varying highp vec4 v_texcoords;\n";
-      vertex_header << "uniform vec2 scaling_vector;\n";
-      vertex_main
-          << ("  vec2 step = scaling_vector / 2.0;\n"
-              "  v_texcoords.xy = texcoord - step * 0.5;\n"
-              "  v_texcoords.zw = texcoord + step * 0.5;\n");
-      fragment_directives << "#extension GL_EXT_draw_buffers : enable\n";
-      DCHECK(!color_transform);
-      fragment_main
-          << ("  vec4 lo_uvuv = texture2D(s_texture, v_texcoords.xy);\n"
-              "  vec4 hi_uvuv = texture2D(s_texture, v_texcoords.zw);\n"
-              "  vec4 uuuu = vec4(lo_uvuv.rb, hi_uvuv.rb);\n"
-              "  vec4 vvvv = vec4(lo_uvuv.ga, hi_uvuv.ga);\n");
-      if (swizzle[0] == GL_BGRA_EXT) {
-        fragment_main << "  uuuu.rb = uuuu.br;\n";
-      }
-      fragment_main << "  gl_FragData[0] = uuuu;\n";
-      if (swizzle[1] == GL_BGRA_EXT) {
-        fragment_main << "  vvvv.rb = vvvv.br;\n";
-      }
-      fragment_main << "  gl_FragData[1] = vvvv;\n";
-      break;
-
-    case Shader::PLANAR_CHANNELS_1_2: {
-      // Select two color channels, and pack 2 pairs of pixels into one output
-      // quad. See header file for diagram.
-      // This shader performs the same work that is being done by
-      // Shader::I422_NV61_MRT (see above) for its second render target.
-      shared_variables << "varying highp vec4 v_texcoords[2];\n";
-      vertex_header << "uniform vec2 scaling_vector;\n";
-      vertex_main
-          << ("  vec2 step = scaling_vector / 4.0;\n"
-              "  v_texcoords[0].xy = texcoord - step * 1.5;\n"
-              "  v_texcoords[0].zw = texcoord - step * 0.5;\n"
-              "  v_texcoords[1].xy = texcoord + step * 0.5;\n"
-              "  v_texcoords[1].zw = texcoord + step * 1.5;\n");
-      fragment_main
-          << ("  vec3 pixel0 = texture2D(s_texture, v_texcoords[0].xy).rgb;\n"
-              "  vec3 pixel1 = texture2D(s_texture, v_texcoords[0].zw).rgb;\n"
-              "  vec3 pixel01 = (pixel0 + pixel1) / 2.0;\n"
-              "  vec3 pixel2 = texture2D(s_texture, v_texcoords[1].xy).rgb;\n"
-              "  vec3 pixel3 = texture2D(s_texture, v_texcoords[1].zw).rgb;\n"
-              "  vec3 pixel23 = (pixel2 + pixel3) / 2.0;\n");
-
-      if (color_transform) {
-        fragment_main
-            << ("  pixel01 = DoColorConversion(pixel01);\n"
-                "  pixel23 = DoColorConversion(pixel23);\n");
-      }
-
-      fragment_main
-          << ("  vec4 packed_quad = vec4(\n"
-              "      pixel01.g, pixel01.b, pixel23.g, pixel23.b);\n");
-
-      if (swizzle[0] == GL_BGRA_EXT) {
-        fragment_main << "  packed_quad.rb = packed_quad.br;\n";
-      }
-
-      fragment_main << "  gl_FragColor = packed_quad;\n";
-      break;
-    }
-  }
-
-  // Helper function to compile the shader source and log the GLSL compiler's
-  // results.
-  const char* shader_name = GLScaler::GetShaderName(shader_);
-  const auto CompileShaderFromSource =
-      [shader_name](GLES2Interface* gl, const std::basic_string<GLchar>& source,
-                    GLenum type) -> GLuint {
-    VLOG(2) << __func__ << ": Compiling shader " << type
-            << " with source:" << std::endl
-            << source << ", for GLScaler::Shader=" << shader_name;
-    const GLuint shader = gl->CreateShader(type);
-    const GLchar* source_data = source.data();
-    const GLint length = base::checked_cast<GLint>(source.size());
-    gl->ShaderSource(shader, 1, &source_data, &length);
-    gl->CompileShader(shader);
-    GLint compile_status = GL_FALSE;
-    gl->GetShaderiv(shader, GL_COMPILE_STATUS, &compile_status);
-
-    // Fetch logs and forward them to the system logger. If compilation failed,
-    // clean-up and return 0 for error.
-    if (compile_status != GL_TRUE || VLOG_IS_ON(2)) {
-      GLint log_length = 0;
-      gl->GetShaderiv(shader, GL_INFO_LOG_LENGTH, &log_length);
-      std::string log;
-      if (log_length > 0) {
-        std::unique_ptr<GLchar[]> tmp(new GLchar[log_length]);
-        GLsizei returned_log_length = 0;
-        gl->GetShaderInfoLog(shader, log_length, &returned_log_length,
-                             tmp.get());
-        log.assign(tmp.get(), returned_log_length);
-      }
-      if (log.empty()) {
-        log = "<<NO LOG>>";
-      }
-      if (compile_status != GL_TRUE) {
-        LOG(ERROR) << __func__ << ": Compilation of shader " << type
-                   << " failed:" << std::endl
-                   << log;
-        gl->DeleteShader(shader);
-        return 0;
-      }
-      VLOG(2) << __func__ << ": Compilation of shader " << type
-              << " succeeded:" << std::endl
-              << log;
-    }
-    return shader;
-  };
-
-  // Compile the vertex shader and attach it to the program.
-  const std::string shared_variables_str = shared_variables.str();
-  const GLuint vertex_shader =
-      CompileShaderFromSource(gl_,
-                              vertex_header.str() + shared_variables_str +
-                                  "void main() {\n" + vertex_main.str() + "}\n",
-                              GL_VERTEX_SHADER);
-  if (vertex_shader == 0) {
-    return;
-  }
-  gl_->AttachShader(program_, vertex_shader);
-  gl_->DeleteShader(vertex_shader);
-
-  // Compile the fragment shader and attach to |program_|.
-  const GLuint fragment_shader = CompileShaderFromSource(
-      gl_,
-      fragment_directives.str() + fragment_header.str() + shared_variables_str +
-          "void main() {\n" + fragment_main.str() + "}\n",
-      GL_FRAGMENT_SHADER);
-  if (fragment_shader == 0) {
-    return;
-  }
-  gl_->AttachShader(program_, fragment_shader);
-  gl_->DeleteShader(fragment_shader);
-
-  // Link the program.
-  gl_->LinkProgram(program_);
-  GLint link_status = GL_FALSE;
-  gl_->GetProgramiv(program_, GL_LINK_STATUS, &link_status);
-  if (link_status != GL_TRUE) {
-    LOG(ERROR) << "Failed to link shader program.";
-    return;
-  }
-
-#define DCHECK_RESOLVED_LOCATION(member)                                  \
-  DCHECK(member != -1 || gl_->GetGraphicsResetStatusKHR() != GL_NO_ERROR) \
-      << "Failed to get " #member " in program, or GPU process crashed."
-
-  // Resolve the locations of the global variables.
-  position_location_ = gl_->GetAttribLocation(program_, "a_position");
-  DCHECK_RESOLVED_LOCATION(position_location_);
-  texcoord_location_ = gl_->GetAttribLocation(program_, "a_texcoord");
-  DCHECK_RESOLVED_LOCATION(texcoord_location_);
-  texture_location_ = gl_->GetUniformLocation(program_, "s_texture");
-  DCHECK_RESOLVED_LOCATION(texture_location_);
-  src_rect_location_ = gl_->GetUniformLocation(program_, "src_rect");
-  DCHECK_RESOLVED_LOCATION(src_rect_location_);
-  switch (shader_) {
-    case Shader::BILINEAR:
-      break;
-
-    case Shader::BILINEAR2:
-    case Shader::BILINEAR3:
-    case Shader::BILINEAR4:
-    case Shader::BILINEAR2X2:
-    case Shader::BICUBIC_HALF_1D:
-    case Shader::PLANAR_CHANNEL_0:
-    case Shader::PLANAR_CHANNEL_1:
-    case Shader::PLANAR_CHANNEL_2:
-    case Shader::PLANAR_CHANNEL_3:
-    case Shader::I422_NV61_MRT:
-    case Shader::DEINTERLEAVE_PAIRWISE_MRT:
-    case Shader::PLANAR_CHANNELS_1_2:
-      scaling_vector_location_ =
-          gl_->GetUniformLocation(program_, "scaling_vector");
-      DCHECK_RESOLVED_LOCATION(scaling_vector_location_);
-      break;
-
-    case Shader::BICUBIC_UPSCALE:
-      src_pixelsize_location_ =
-          gl_->GetUniformLocation(program_, "src_pixelsize");
-      DCHECK_RESOLVED_LOCATION(src_pixelsize_location_);
-      scaling_vector_location_ =
-          gl_->GetUniformLocation(program_, "scaling_vector");
-      DCHECK_RESOLVED_LOCATION(scaling_vector_location_);
-      break;
-  }
-
-#undef DCHECK_RESOLVED_LOCATION
-}
-
-GLScaler::ShaderProgram::~ShaderProgram() {
-  gl_->DeleteProgram(program_);
-}
-
-void GLScaler::ShaderProgram::UseProgram(const gfx::Size& src_texture_size,
-                                         const gfx::RectF& src_rect,
-                                         const gfx::Size& dst_size,
-                                         GLScaler::Axis primary_axis,
-                                         bool flip_y) {
-  gl_->UseProgram(program_);
-
-  // OpenGL defines the last parameter to VertexAttribPointer as type
-  // "const GLvoid*" even though it is actually an offset into the buffer
-  // object's data store and not a pointer to the client's address space.
-  const void* offsets[2] = {nullptr,
-                            reinterpret_cast<const void*>(2 * sizeof(GLfloat))};
-
-  gl_->VertexAttribPointer(position_location_, 2, GL_FLOAT, GL_FALSE,
-                           4 * sizeof(GLfloat), offsets[0]);
-  gl_->EnableVertexAttribArray(position_location_);
-
-  gl_->VertexAttribPointer(texcoord_location_, 2, GL_FLOAT, GL_FALSE,
-                           4 * sizeof(GLfloat), offsets[1]);
-  gl_->EnableVertexAttribArray(texcoord_location_);
-
-  // Always sample from the first texture unit.
-  gl_->Uniform1i(texture_location_, 0);
-
-  // Convert |src_rect| from pixel coordinates to texture coordinates. The
-  // source texture coordinates are in the range [0.0,1.0] for each dimension,
-  // but the sampling rect may slightly "spill" outside that range (e.g., for
-  // scaler overscan).
-  GLfloat src_rect_texcoord[4] = {
-      src_rect.x() / src_texture_size.width(),
-      src_rect.y() / src_texture_size.height(),
-      src_rect.width() / src_texture_size.width(),
-      src_rect.height() / src_texture_size.height(),
-  };
-  if (flip_y) {
-    src_rect_texcoord[1] += src_rect_texcoord[3];
-    src_rect_texcoord[3] *= -1.0f;
-  }
-  gl_->Uniform4fv(src_rect_location_, 1, src_rect_texcoord);
-
-  // Set shader-specific uniform inputs. The |scaling_vector| is the ratio of
-  // the number of source pixels sampled per dest pixels output. It is used by
-  // the shader programs to locate distinct texels from the source texture, and
-  // sample them at the appropriate offset to produce each output texel.
-  switch (shader_) {
-    case Shader::BILINEAR:
-      break;
-
-    case Shader::BILINEAR2:
-    case Shader::BILINEAR3:
-    case Shader::BILINEAR4:
-    case Shader::BICUBIC_HALF_1D:
-    case Shader::PLANAR_CHANNEL_0:
-    case Shader::PLANAR_CHANNEL_1:
-    case Shader::PLANAR_CHANNEL_2:
-    case Shader::PLANAR_CHANNEL_3:
-    case Shader::I422_NV61_MRT:
-    case Shader::DEINTERLEAVE_PAIRWISE_MRT:
-    case Shader::PLANAR_CHANNELS_1_2:
-      switch (primary_axis) {
-        case HORIZONTAL:
-          gl_->Uniform2f(scaling_vector_location_,
-                         src_rect_texcoord[2] / dst_size.width(), 0.0);
-          break;
-        case VERTICAL:
-          gl_->Uniform2f(scaling_vector_location_, 0.0,
-                         src_rect_texcoord[3] / dst_size.height());
-          break;
-      }
-      break;
-
-    case Shader::BILINEAR2X2:
-      gl_->Uniform2f(scaling_vector_location_,
-                     src_rect_texcoord[2] / dst_size.width(),
-                     src_rect_texcoord[3] / dst_size.height());
-      break;
-
-    case Shader::BICUBIC_UPSCALE:
-      gl_->Uniform2f(src_pixelsize_location_, src_texture_size.width(),
-                     src_texture_size.height());
-      // For this shader program, the |scaling_vector| has an alternate meaning:
-      // It is only being used to select whether bicubic sampling is stepped in
-      // the X or the Y direction.
-      gl_->Uniform2f(scaling_vector_location_,
-                     primary_axis == HORIZONTAL ? 1.0 : 0.0,
-                     primary_axis == VERTICAL ? 1.0 : 0.0);
-      break;
-  }
-}
-
-GLScaler::ScalerStage::ScalerStage(gpu::gles2::GLES2Interface* gl,
-                                   GLScaler::Shader shader,
-                                   GLScaler::Axis primary_axis,
-                                   const gfx::Vector2d& scale_from,
-                                   const gfx::Vector2d& scale_to)
-    : gl_(gl),
-      shader_(shader),
-      primary_axis_(primary_axis),
-      scale_from_(scale_from),
-      scale_to_(scale_to) {
-  DCHECK(gl_);
-}
-
-GLScaler::ScalerStage::~ScalerStage() {
-  if (dest_framebuffer_) {
-    gl_->DeleteFramebuffers(1, &dest_framebuffer_);
-  }
-  if (intermediate_texture_) {
-    gl_->DeleteTextures(1, &intermediate_texture_);
-  }
-}
-
-void GLScaler::ScalerStage::ScaleToMultipleOutputs(
-    GLuint src_texture,
-    gfx::Size src_texture_size,
-    const gfx::Vector2d& src_offset,
-    GLuint dest_texture_0,
-    GLuint dest_texture_1,
-    const gfx::Rect& output_rect) {
-  if (output_rect.IsEmpty())
-    return;  // No work to do.
-
-  // Make a recursive call to the "input" ScalerStage to produce an intermediate
-  // texture for this stage to source from. Adjust src_* variables to use the
-  // intermediate texture as input.
-  //
-  // If there is no input stage, simply modify |src_rect| to account for the
-  // overall |src_offset| and Y-flip.
-  gfx::RectF src_rect = ToSourceRect(output_rect);
-  if (input_stage_) {
-    const gfx::Rect input_rect = ToInputRect(src_rect);
-    EnsureIntermediateTextureDefined(input_rect.size());
-    input_stage_->ScaleToMultipleOutputs(src_texture, src_texture_size,
-                                         src_offset, intermediate_texture_, 0,
-                                         input_rect);
-    src_texture = intermediate_texture_;
-    src_texture_size = intermediate_texture_size_;
-    DCHECK(!is_flipped_source_);
-    src_rect -= input_rect.OffsetFromOrigin();
-  } else {
-    if (is_flipped_source_) {
-      src_rect.set_x(src_rect.x() + src_offset.x());
-      src_rect.set_y(src_texture_size.height() - src_rect.bottom() -
-                     src_offset.y());
-    } else {
-      src_rect += src_offset;
-    }
-  }
-
-  // Attach the output texture(s) to the framebuffer.
-  if (!dest_framebuffer_) {
-    gl_->GenFramebuffers(1, &dest_framebuffer_);
-  }
-  gl_->BindFramebuffer(GL_FRAMEBUFFER, dest_framebuffer_);
-  gl_->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
-                            dest_texture_0, 0);
-  if (dest_texture_1 > 0) {
-    gl_->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + 1,
-                              GL_TEXTURE_2D, dest_texture_1, 0);
-  }
-
-  // Bind to the source texture and set the texture sampler to use bilinear
-  // filtering and clamp-to-edge, as required by all shader programs.
-  //
-  // It would be better to stash the existing parameter values, and restore them
-  // back later. However, glGetTexParameteriv() currently requires a blocking
-  // call to the GPU service, which is extremely costly performance-wise.
-  gl_->ActiveTexture(GL_TEXTURE0);
-  gl_->BindTexture(GL_TEXTURE_2D, src_texture);
-  gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-  gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-  gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-  gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-
-  // Prepare the shader program for drawing.
-  DCHECK(program_);
-  program_->UseProgram(src_texture_size, src_rect, output_rect.size(),
-                       primary_axis_, flip_output_);
-
-  // Execute the draw.
-  gl_->Viewport(0, 0, output_rect.width(), output_rect.height());
-  const GLenum buffers[] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT0 + 1};
-  if (dest_texture_1 > 0) {
-    gl_->DrawBuffersEXT(2, buffers);
-  }
-  gl_->DrawArrays(GL_TRIANGLE_STRIP, 0, 4);
-  if (dest_texture_1 > 0) {
-    // Set the draw buffers back, to not disrupt external operations.
-    gl_->DrawBuffersEXT(1, buffers);
-  }
-
-  gl_->BindTexture(GL_TEXTURE_2D, 0);
-  gl_->BindFramebuffer(GL_FRAMEBUFFER, 0);
-}
-
-gfx::RectF GLScaler::ScalerStage::ToSourceRect(
-    const gfx::Rect& output_rect) const {
-  return gfx::ScaleRect(gfx::RectF(output_rect),
-                        static_cast<float>(scale_from_.x()) / scale_to_.x(),
-                        static_cast<float>(scale_from_.y()) / scale_to_.y());
-}
-
-gfx::Rect GLScaler::ScalerStage::ToInputRect(gfx::RectF source_rect) const {
-  int overscan_x = 0;
-  int overscan_y = 0;
-  switch (shader_) {
-    case Shader::BILINEAR:
-    case Shader::BILINEAR2:
-    case Shader::BILINEAR3:
-    case Shader::BILINEAR4: {
-      // These shaders sample 1 or more points along the primary axis, and only
-      // 1 point in the other direction, in order to produce each output pixel.
-      // The amount of overscan is always 0 or 1 pixel along the primary axis,
-      // and this can be determined by looking at the upper-left-most source
-      // texture sampling point: If this point is to the left of the middle of
-      // the upper-left-most source pixel, the texture sampler will also read
-      // the pixel to the left of that (for linear interpolation). Similar
-      // behavior can occur towards the right, upwards, and downwards at the
-      // source boundaries.
-      int threshold;
-      switch (shader_) {
-        default:
-          threshold = 1;
-          break;
-        case Shader::BILINEAR2:
-          threshold = 2;
-          break;
-        case Shader::BILINEAR3:
-          threshold = 3;
-          break;
-        case Shader::BILINEAR4:
-          threshold = 4;
-          break;
-      }
-      switch (primary_axis_) {
-        case HORIZONTAL:
-          if (scale_from_.x() < threshold * scale_to_.x()) {
-            overscan_x = 1;
-          }
-          if (scale_from_.y() < scale_to_.y()) {
-            overscan_y = 1;
-          }
-          break;
-        case VERTICAL:
-          if (scale_from_.x() < scale_to_.x()) {
-            overscan_x = 1;
-          }
-          if (scale_from_.y() < threshold * scale_to_.y()) {
-            overscan_y = 1;
-          }
-          break;
-      }
-      break;
-    }
-
-    case Shader::BILINEAR2X2:
-      // This shader samples 2 points along both axes, and the overscan is 0 or
-      // 1 pixel in both directions (same explanation as for the other BILINEAR
-      // shaders).
-      if (scale_from_.x() < 2 * scale_to_.x()) {
-        overscan_x = 1;
-      }
-      if (scale_from_.y() < 2 * scale_to_.y()) {
-        overscan_y = 1;
-      }
-      break;
-
-    case Shader::BICUBIC_UPSCALE:
-      // For each output pixel, this shader always reads 2 pixels about the
-      // source position in one dimension, and has no overscan in the other
-      // dimension.
-      if (scale_from_.x() < scale_to_.x()) {
-        DCHECK_EQ(HORIZONTAL, primary_axis_);
-        overscan_x = 2;
-      } else if (scale_from_.y() < scale_to_.y()) {
-        DCHECK_EQ(VERTICAL, primary_axis_);
-        overscan_y = 2;
-      } else if (scale_from_ == scale_to_) {
-        // Special case: When not scaling, the math in the shader will resolve
-        // to just outputting the value for a single source pixel. The shader
-        // will sample surrounding pixels, but then apply a zero weight to them
-        // during convolution. Thus, there is effectively no overscan.
-        NOTREACHED();  // This is a crazy-expensive way to do a 1:1 copy!
-      } else {
-        NOTREACHED();  // Downscaling is meaningless.
-      }
-      break;
-
-    case Shader::BICUBIC_HALF_1D: {
-      // For each output pixel, this shader always reads 4 pixels about the
-      // source position in one dimension, and has no overscan in the other
-      // dimension. However, since the source position always has a distance
-      // >= 1 inside the "logical" bounds, there can never be more than 3 pixels
-      // of overscan.
-      if (scale_from_.x() == 2 * scale_to_.x()) {
-        DCHECK_EQ(HORIZONTAL, primary_axis_);
-        overscan_x = 3;
-      } else if (scale_from_.y() == 2 * scale_to_.y()) {
-        DCHECK_EQ(VERTICAL, primary_axis_);
-        overscan_y = 3;
-      } else {
-        // Anything but a half-downscale in one dimension is meaningless.
-        NOTREACHED();
-      }
-      break;
-    }
-
-    case Shader::PLANAR_CHANNEL_0:
-    case Shader::PLANAR_CHANNEL_1:
-    case Shader::PLANAR_CHANNEL_2:
-    case Shader::PLANAR_CHANNEL_3:
-    case Shader::I422_NV61_MRT:
-    case Shader::PLANAR_CHANNELS_1_2:
-      // All of these sample 4x1 source pixels to produce each output "pixel".
-      // There is no overscan. They can also be combined with a bilinear
-      // downscale, but not an upscale.
-      DCHECK_GE(scale_from_.x(), 4 * scale_to_.x());
-      DCHECK_EQ(HORIZONTAL, primary_axis_);
-      break;
-
-    case Shader::DEINTERLEAVE_PAIRWISE_MRT:
-      // This shader samples 2x1 source pixels to produce each output "pixel".
-      // There is no overscan. It can also be combined with a bilinear
-      // downscale, but not an upscale.
-      DCHECK_GE(scale_from_.x(), 2 * scale_to_.x());
-      DCHECK_EQ(HORIZONTAL, primary_axis_);
-      break;
-  }
-
-  source_rect.Inset(gfx::InsetsF::VH(-overscan_y, -overscan_x));
-  return gfx::ToEnclosingRect(source_rect);
-}
-
-void GLScaler::ScalerStage::EnsureIntermediateTextureDefined(
-    const gfx::Size& size) {
-  // Reallocate a new texture, if needed.
-  if (!intermediate_texture_) {
-    gl_->GenTextures(1, &intermediate_texture_);
-  }
-  if (intermediate_texture_size_ != size) {
-    gl_->BindTexture(GL_TEXTURE_2D, intermediate_texture_);
-    // Note: Not setting the filter or wrap parameters on the texture here
-    // because that will be done in ScaleToMultipleOutputs() anyway.
-    gl_->TexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, size.width(), size.height(), 0,
-                    GL_RGBA, program_->texture_type(), nullptr);
-    intermediate_texture_size_ = size;
-  }
-}
-
-std::ostream& operator<<(std::ostream& out, const GLScaler& scaler) {
-  if (!scaler.chain_) {
-    return (out << "[GLScaler NOT configured]");
-  }
-
-  out << "Output";
-  const GLScaler::ScalerStage* const final_stage = scaler.chain_.get();
-  for (auto* stage = final_stage; stage; stage = stage->input_stage()) {
-    out << u8" ← {" << GLScaler::GetShaderName(stage->shader());
-    if (stage->shader_program()) {
-      switch (stage->shader_program()->texture_type()) {
-        case GL_FLOAT:
-          out << "/highp";
-          break;
-        case GL_HALF_FLOAT_OES:
-          out << "/mediump";
-          break;
-        default:
-          out << "/lowp";
-          break;
-      }
-    }
-    if (stage->flip_output()) {
-      out << "+flip_y";
-    }
-    if (stage->scale_from() == stage->scale_to()) {
-      out << " copy";
-    } else {
-      out << ' ' << stage->scale_from().ToString() << " to "
-          << stage->scale_to().ToString();
-    }
-    if (!stage->input_stage() &&
-        scaler.params_.source_color_space != scaler.scaling_color_space_) {
-      out << ", with color x-form "
-          << scaler.params_.source_color_space.ToString() << " to "
-          << scaler.scaling_color_space_.ToString();
-    }
-    if (stage == final_stage) {
-      if (scaler.params_.output_color_space != scaler.scaling_color_space_) {
-        out << ", with color x-form to "
-            << scaler.params_.output_color_space.ToString();
-      }
-      for (int i = 0; i < 2; ++i) {
-        if (scaler.params_.swizzle[i] != GL_RGBA) {
-          out << ", with swizzle(" << i << ')';
-        }
-      }
-    }
-    out << '}';
-  }
-  out << u8" ← Source";
-  return out;
-}
-
-}  // namespace viz
diff --git a/components/viz/common/gl_scaler.h b/components/viz/common/gl_scaler.h
deleted file mode 100644
index 99013e8c..0000000
--- a/components/viz/common/gl_scaler.h
+++ /dev/null
@@ -1,538 +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 COMPONENTS_VIZ_COMMON_GL_SCALER_H_
-#define COMPONENTS_VIZ_COMMON_GL_SCALER_H_
-
-#include <stdint.h>
-
-#include <map>
-#include <memory>
-#include <ostream>
-#include <string>
-#include <tuple>
-#include <utility>
-#include <vector>
-
-#include "base/memory/raw_ptr.h"
-#include "base/memory/scoped_refptr.h"
-#include "components/viz/common/gpu/context_lost_observer.h"
-#include "components/viz/common/viz_common_export.h"
-#include "gpu/command_buffer/client/gles2_interface.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
-#include "ui/gfx/color_space.h"
-#include "ui/gfx/geometry/rect.h"
-#include "ui/gfx/geometry/rect_f.h"
-#include "ui/gfx/geometry/size.h"
-#include "ui/gfx/geometry/vector2d.h"
-
-namespace gfx {
-class ColorTransform;
-}  // namespace gfx
-
-namespace viz {
-
-class ContextProvider;
-
-// A high-performance texture scaler for use with an OpenGL ES 2.0 context. It
-// can be configured to operate at different quality levels, manages/converts
-// color spaces, and optionally re-arranges/formats data in output textures for
-// use with more-efficient texture readback pipelines.
-class VIZ_COMMON_EXPORT GLScaler final : public ContextLostObserver {
- public:
-  struct VIZ_COMMON_EXPORT Parameters {
-    // Relative scale from/to factors. Both of these must be non-zero.
-    gfx::Vector2d scale_from = gfx::Vector2d(1, 1);
-    gfx::Vector2d scale_to = gfx::Vector2d(1, 1);
-
-    // The color space of the source texture and the desired color space of the
-    // output texture. If |source_color_space| is not set (or invalid), sRGB is
-    // assumed. If |output_color_space| is not set (or invalid), the source
-    // color space is assumed.
-    gfx::ColorSpace source_color_space;
-    gfx::ColorSpace output_color_space;
-
-    // Enable color management heuristics, using higher precision texture and
-    // gamma-aware scaling?
-    //
-    // When disabled, the gamma of the source color space and other concerns are
-    // ignored and 8-bit precision is used.
-    //
-    // When enabled, scaling occurs in a linear color space with 16-bit floats.
-    // This produces excellent results for virtually all color spaces while
-    // typically requiring twice the memory and execution resources. The caller
-    // must ensure the GL context supports the use of GL_RGBA16F format
-    // textures.
-    //
-    // Relevant reading: http://www.ericbrasseur.org/gamma.html
-    bool enable_precise_color_management = false;
-
-    // Selects the trade-off between quality and speed.
-    enum class Quality : int8_t {
-      // Bilinear single pass. Fastest possible. Do not use this unless the GL
-      // implementation is so slow that the other quality options won't work.
-      FAST,
-
-      // Bilinear upscale + N * 50% bilinear downscales. This is still fast
-      // enough for general-purpose use, and image quality is nearly as good as
-      // BEST when downscaling.
-      GOOD,
-
-      // Bicubic upscale + N * 50% bicubic downscales. Produces very good
-      // quality scaled images, but it's 2-8x slower than the "GOOD" quality.
-      BEST,
-    } quality = Quality::GOOD;
-
-    // Is the source texture Y-flipped (i.e., the origin is the lower-left
-    // corner and not the upper-left corner)? Most GL textures are Y-flipped.
-    // This information is required so that the scaler can correctly compute the
-    // sampling region.
-    bool is_flipped_source = true;
-
-    // Should the output be vertically flipped? Usually, this is used when the
-    // source is not Y-flipped, but the destination texture needs to be. Or, it
-    // can be used to draw the final output upside-down to avoid having to copy
-    // the rows in reverse order after a glReadPixels().
-    bool flip_output = false;
-
-    // Optionally rearrange the image data for export. Generally, this is used
-    // to make later readback steps more efficient (e.g., using glReadPixels()
-    // will produce the raw bytes in their correct locations).
-    //
-    // Output textures are assumed to be using one of the 4-channel RGBA
-    // formats. While it may be more "proper" to use a single-component texture
-    // format for the planar-oriented image data, not all GL implementations
-    // support the use of those formats. However, all must support at least
-    // GL_RGBA. Therefore, each RGBA pixel is treated as a generic "vec4" (a
-    // quad of values).
-    //
-    // When using this feature, it is usually necessary to adjust the
-    // |output_rect| passed to Scale() or ScaleToMultipleOutputs(). See notes
-    // below.
-    enum class ExportFormat : int8_t {
-      // Do not rearrange the image data:
-      //
-      //   (interleaved quads)     (interleaved quads)
-      //   RGBA RGBA RGBA RGBA     RGBA RGBA RGBA RGBA
-      //   RGBA RGBA RGBA RGBA --> RGBA RGBA RGBA RGBA
-      //   RGBA RGBA RGBA RGBA     RGBA RGBA RGBA RGBA
-      INTERLEAVED_QUADS,
-
-      // Select one color channel, packing each of 4 pixels' values into the 4
-      // elements of one output quad.
-      //
-      // For example, for CHANNEL_0:
-      //
-      //             (interleaved quads)              (channel 0)
-      //   RGBA RGBA RGBA RGBA RGBA RGBA RGBA RGBA     RRRR RRRR
-      //   RGBA RGBA RGBA RGBA RGBA RGBA RGBA RGBA --> RRRR RRRR
-      //   RGBA RGBA RGBA RGBA RGBA RGBA RGBA RGBA     RRRR RRRR
-      //
-      // Note: Because of this packing, the horizontal coordinates of the
-      // |output_rect| used with Scale() should be divided by 4.
-      CHANNEL_0,
-      CHANNEL_1,
-      CHANNEL_2,
-      CHANNEL_3,
-
-      // I422 sampling, delivered via two output textures (NV61 format): The
-      // first texture is produced the same as CHANNEL_0, while the second
-      // texture contains CHANNEL_1 and CHANNEL_2 at half-width interleaved and
-      // full-height. For example, if this is combined with RGB→YUV color space
-      // conversion:
-      //
-      //              (interleaved quads)
-      //    RGBA RGBA RGBA RGBA RGBA RGBA RGBA RGBA
-      //    RGBA RGBA RGBA RGBA RGBA RGBA RGBA RGBA
-      //    RGBA RGBA RGBA RGBA RGBA RGBA RGBA RGBA
-      //      |
-      //      |     (luma plane)  (chroma, interleaved)
-      //      |       YYYY YYYY      UVUV UVUV
-      //      +---> { YYYY YYYY  +   UVUV UVUV }
-      //              YYYY YYYY      UVUV UVUV
-      //
-      // Note: Because of this packing, the horizontal coordinates of the
-      // |output_rect| used with ScaleToMultipleOutputs() should be divided by
-      // 4.
-      // Note 2: This requires a GL context that supports multiple render
-      // targets with at least two draw buffers.
-      NV61,
-
-      // Deinterleave into two output textures.
-      //
-      //  UVUV UVUV       UUUU   VVVV
-      //  UVUV UVUV --> { UUUU + VVVV }
-      //  UVUV UVUV       UUUU   VVVV
-      //
-      // Note: Because of this packing, the horizontal coordinates of the
-      // |output_rect| used with ScaleToMultipleOutputs() should be divided by
-      // 2.
-      // Note 2: This requires a GL context that supports multiple render
-      // targets with at least two draw buffers.
-      DEINTERLEAVE_PAIRWISE,
-
-      // Select CHANNEL_1 and CHANNEL_2, packing each 2-channel pair from
-      // 4-pixel values into the 2 elements of one output quad. The channels
-      // will be selected at half-width and full height. This should be
-      // equivalent to the second texture produced by ExportFormat::NV61 (see
-      // above). If used on textures after they have gone through RGB→YUV color
-      // space conversion, the transformation is:
-      //
-      //             (interleaved quads)              (channels 1 & 2)
-      //   YUVx YUVx YUVx YUVx YUVx YUVx YUVx YUVx       UVUV UVUV
-      //   YUVx YUVx YUVx YUVx YUVx YUVx YUVx YUVx  -->  UVUV UVUV
-      //   YUVx YUVx YUVx YUVx YUVx YUVx YUVx YUVx       UVUV UVUV
-      //
-      // Note: Because of this packing, the horizontal coordinates of the
-      // |output_rect| used with Scale() should be divided by 4.
-      UV_CHANNELS,
-    } export_format = ExportFormat::INTERLEAVED_QUADS;
-
-    // Optionally swizzle the ordering of the values in each output quad. If the
-    // output of the scaler is not going to be read back (e.g., used with
-    // glReadPixels()), simply leave these unchanged. Otherwise, changing this
-    // allows a read-back pipeline to use the native format of the platform to
-    // avoid having to perform extra "BGRA⇄RGBA swizzle" memcpy's. Usually, this
-    // should match the format to be used with glReadPixels(), and that should
-    // match the GL_IMPLEMENTATION_COLOR_READ_FORMAT.
-    GLenum swizzle[2] = {
-        GL_RGBA,  // For |dest_texture_0|.
-        GL_RGBA,  // For |dest_texture_1|.
-    };
-
-    Parameters();
-    Parameters(const Parameters& other);
-    ~Parameters();
-  };
-
-  explicit GLScaler(ContextProvider* context_provider);
-
-  GLScaler(const GLScaler&) = delete;
-  GLScaler& operator=(const GLScaler&) = delete;
-
-  ~GLScaler() final;
-
-  // Returns true if the GL context provides the necessary support for enabling
-  // precise color management (see Parameters::enable_precise_color_management).
-  bool SupportsPreciseColorManagement() const;
-
-  // Returns the maximum number of simultaneous drawing buffers supported by the
-  // GL context. Certain Parameters can only be used when this is more than 1.
-  int GetMaxDrawBuffersSupported() const;
-
-  // [Re]Configure the scaler with the given |new_params|. Returns true on
-  // success, or false on failure.
-  [[nodiscard]] bool Configure(const Parameters& new_params);
-
-  // Returns the currently-configured and resolved Parameters. Note that these
-  // Parameters might not be exactly the same as those that were passed to
-  // Configure() because some properties (e.g., color spaces) are auto-resolved;
-  // however, ParametersAreEquivalent() will still return true. Results are
-  // undefined if Configure() has never been called successfully.
-  const Parameters& params() const { return params_; }
-
-  // Scales a portion of |src_texture| and draws the result into |dest_texture|
-  // at offset (0, 0). Returns true to indicate success, or false if this
-  // GLScaler is not valid.
-  //
-  // |src_texture_size| is the full, allocated size of the |src_texture|. This
-  // is required for computing texture coordinate transforms (and only because
-  // the OpenGL ES 2.0 API lacks the ability to query this info).
-  //
-  // |src_offset| is the offset in the source texture corresponding to point
-  // (0,0) in the source/output coordinate spaces. This prevents the need for
-  // extra texture copies just to re-position the source coordinate system.
-  //
-  // |output_rect| selects the region to draw (in the scaled, not the source,
-  // coordinate space). This is used to save work in cases where only a portion
-  // needs to be re-scaled. The implementation will back-compute, internally, to
-  // determine the region of the |src_texture| to sample.
-  //
-  // WARNING: The output will always be placed at (0, 0) in the |dest_texture|,
-  // and not at |output_rect.origin()|.
-  //
-  // Note that the |src_texture| will have the min/mag filter set to GL_LINEAR
-  // and wrap_s/t set to CLAMP_TO_EDGE in this call.
-  [[nodiscard]] bool Scale(GLuint src_texture,
-                           const gfx::Size& src_texture_size,
-                           const gfx::Vector2d& src_offset,
-                           GLuint dest_texture,
-                           const gfx::Rect& output_rect) {
-    return ScaleToMultipleOutputs(src_texture, src_texture_size, src_offset,
-                                  dest_texture, 0, output_rect);
-  }
-
-  // Same as above, but for use cases where there are two output textures drawn
-  // (see Parameters::ExportFormat).
-  [[nodiscard]] bool ScaleToMultipleOutputs(GLuint src_texture,
-                                            const gfx::Size& src_texture_size,
-                                            const gfx::Vector2d& src_offset,
-                                            GLuint dest_texture_0,
-                                            GLuint dest_texture_1,
-                                            const gfx::Rect& output_rect);
-
-  // Returns true if from:to represent the same scale ratio as that specified in
-  // |params|.
-  static bool ParametersHasSameScaleRatio(const Parameters& params,
-                                          const gfx::Vector2d& from,
-                                          const gfx::Vector2d& to);
-
-  // Returns true if configuring a GLScaler with either |a| or |b| will produce
-  // identical behaviors and results.
-  static bool ParametersAreEquivalent(const Parameters& a, const Parameters& b);
-
- private:
-  friend class GLScalerOverscanPixelTest;
-  friend class GLScalerShaderPixelTest;
-  friend VIZ_COMMON_EXPORT std::ostream& operator<<(std::ostream&,
-                                                    const GLScaler&);
-
-  using GLES2Interface = gpu::gles2::GLES2Interface;
-
-  enum Axis { HORIZONTAL = 0, VERTICAL = 1 };
-
-  // The shaders used by each stage in the scaling pipeline.
-  enum class Shader : int8_t {
-    BILINEAR,
-    BILINEAR2,
-    BILINEAR3,
-    BILINEAR4,
-    BILINEAR2X2,
-    BICUBIC_UPSCALE,
-    BICUBIC_HALF_1D,
-    PLANAR_CHANNEL_0,
-    PLANAR_CHANNEL_1,
-    PLANAR_CHANNEL_2,
-    PLANAR_CHANNEL_3,
-    PLANAR_CHANNELS_1_2,
-    I422_NV61_MRT,
-    DEINTERLEAVE_PAIRWISE_MRT,
-  };
-
-  // A cached, re-usable shader program that performs one step in the scaling
-  // pipeline.
-  class VIZ_COMMON_EXPORT ShaderProgram {
-   public:
-    ShaderProgram(GLES2Interface* gl,
-                  Shader shader,
-                  GLenum texture_type,
-                  const gfx::ColorTransform* color_transform,
-                  const GLenum swizzle[2]);
-
-    ShaderProgram(const ShaderProgram&) = delete;
-    ShaderProgram& operator=(const ShaderProgram&) = delete;
-
-    ~ShaderProgram();
-
-    Shader shader() const { return shader_; }
-    GLenum texture_type() const { return texture_type_; }
-
-    // UseProgram must be called with GL_ARRAY_BUFFER bound to a vertex
-    // attribute buffer. |src_texture_size| is the size of the entire source
-    // texture, regardless of which region is to be sampled. |src_rect| is the
-    // source region, not including overscan pixels past the edges.
-    // |primary_axis| determines whether multiple texture samplings occur in one
-    // direction or the other (for some shaders). Note that this cannot
-    // necessarily be determined by just comparing the src and dst sizes.
-    // |flip_y| causes the |src_rect| to be scanned upside-down, to produce a
-    // vertically-flipped result.
-    void UseProgram(const gfx::Size& src_texture_size,
-                    const gfx::RectF& src_rect,
-                    const gfx::Size& dst_size,
-                    Axis primary_axis,
-                    bool flip_y);
-
-    // GL_ARRAY_BUFFER data that must be bound when drawing with a
-    // ShaderProgram. These are the vertex attributes that will sweep the entire
-    // source area when executing the program. They represent triangle strip
-    // coordinates: The first two columns are (x,y) values interpolated to
-    // produce the vertex coordinates in object space, while the latter two
-    // columns are (s,t) values interpolated to produce the texture coordinates
-    // that correspond to the vertex coordinates.
-    static const GLfloat kVertexAttributes[16];
-
-   private:
-    const raw_ptr<GLES2Interface> gl_;
-    const Shader shader_;
-    const GLenum texture_type_;
-
-    // A program for copying a source texture into a destination texture.
-    const GLuint program_;
-
-    // The location of the position in the program.
-    GLint position_location_ = -1;
-    // The location of the texture coordinate in the program.
-    GLint texcoord_location_ = -1;
-    // The location of the source texture in the program.
-    GLint texture_location_ = -1;
-    // The location of the texture coordinate of the source rectangle in the
-    // program.
-    GLint src_rect_location_ = -1;
-    // Location of size of source image in pixels.
-    GLint src_pixelsize_location_ = -1;
-    // Location of vector for scaling ratio between source and dest textures.
-    GLint scaling_vector_location_ = -1;
-  };
-
-  // One scaling stage in a chain of scaler pipeline stages. Each ScalerStage
-  // owns the previous ScalerStage in the chain: At execution time, a "working
-  // backwards" approach is used: The previous "input" stage renders an
-  // intermediate result that will be used as input for the current stage.
-  //
-  // Each ScalerStage caches textures and framebuffers to avoid reallocating
-  // them for each separate image scaling, which can be expensive on some
-  // platforms/drivers.
-  class VIZ_COMMON_EXPORT ScalerStage {
-   public:
-    ScalerStage(GLES2Interface* gl,
-                Shader shader,
-                Axis primary_axis,
-                const gfx::Vector2d& scale_from,
-                const gfx::Vector2d& scale_to);
-
-    ScalerStage(const ScalerStage&) = delete;
-    ScalerStage& operator=(const ScalerStage&) = delete;
-
-    ~ScalerStage();
-
-    Shader shader() const { return shader_; }
-    const gfx::Vector2d& scale_from() const { return scale_from_; }
-    const gfx::Vector2d& scale_to() const { return scale_to_; }
-
-    ScalerStage* input_stage() const { return input_stage_.get(); }
-    void set_input_stage(std::unique_ptr<ScalerStage> stage) {
-      input_stage_ = std::move(stage);
-    }
-    std::unique_ptr<ScalerStage> take_input_stage() {
-      return std::move(input_stage_);
-    }
-
-    ShaderProgram* shader_program() const { return program_; }
-    void set_shader_program(ShaderProgram* program) { program_ = program; }
-
-    bool is_flipped_source() const { return is_flipped_source_; }
-    void set_is_flipped_source(bool flipped) { is_flipped_source_ = flipped; }
-
-    bool flip_output() const { return flip_output_; }
-    void set_flip_output(bool flip) { flip_output_ = flip; }
-
-    void ScaleToMultipleOutputs(GLuint src_texture,
-                                gfx::Size src_texture_size,
-                                const gfx::Vector2d& src_offset,
-                                GLuint dest_texture_0,
-                                GLuint dest_texture_1,
-                                const gfx::Rect& output_rect);
-
-   private:
-    friend class GLScalerOverscanPixelTest;
-
-    // Returns the given |output_rect| mapped to the input stage's coordinate
-    // system.
-    gfx::RectF ToSourceRect(const gfx::Rect& output_rect) const;
-
-    // Returns the given |source_rect| padded to include the overscan pixels the
-    // shader program will access.
-    gfx::Rect ToInputRect(gfx::RectF source_rect) const;
-
-    // Generates the intermediate texture and/or re-defines it if its size has
-    // changed.
-    void EnsureIntermediateTextureDefined(const gfx::Size& size);
-
-    const raw_ptr<GLES2Interface> gl_;
-    const Shader shader_;
-    const Axis primary_axis_;
-    const gfx::Vector2d scale_from_;
-    const gfx::Vector2d scale_to_;
-
-    std::unique_ptr<ScalerStage> input_stage_;
-    raw_ptr<ShaderProgram> program_ = nullptr;
-    bool is_flipped_source_ = false;
-    bool flip_output_ = false;
-
-    GLuint intermediate_texture_ = 0;
-    gfx::Size intermediate_texture_size_;
-    GLuint dest_framebuffer_ = 0;
-  };
-
-  // ContextLostObserver implementation.
-  void OnContextLost() final;
-
-  // Returns a cached ShaderProgram, creating one on-demand if necessary.
-  ShaderProgram* GetShaderProgram(Shader shader,
-                                  GLenum texture_type,
-                                  const gfx::ColorTransform* color_transform,
-                                  const GLenum swizzle[2]);
-
-  // Create a scaling chain using the bilinear shaders.
-  static std::unique_ptr<ScalerStage> CreateAGoodScalingChain(
-      gpu::gles2::GLES2Interface* gl,
-      const gfx::Vector2d& scale_from,
-      const gfx::Vector2d& scale_to);
-
-  // Create a scaling chain using the bicubic shaders.
-  static std::unique_ptr<ScalerStage> CreateTheBestScalingChain(
-      gpu::gles2::GLES2Interface* gl,
-      const gfx::Vector2d& scale_from,
-      const gfx::Vector2d& scale_to);
-
-  // Modifies |chain| by appending an export stage, to rearrange the image data
-  // according to the requested |export_format|. In some cases, this will delete
-  // the final stage in |chain| before appending the export stage.
-  static std::unique_ptr<ScalerStage> MaybeAppendExportStage(
-      gpu::gles2::GLES2Interface* gl,
-      std::unique_ptr<ScalerStage> chain,
-      Parameters::ExportFormat export_format);
-
-  // Returns the other of the two axes.
-  static Axis TheOtherAxis(Axis axis);
-
-  // Returns the name of the |shader| in string form, for logging purposes.
-  static const char* GetShaderName(Shader shader);
-
-  // Returns true if the given |gl| context mentions all of |names| in its
-  // extensions string.
-  static bool AreAllGLExtensionsPresent(gpu::gles2::GLES2Interface* gl,
-                                        const std::vector<std::string>& names);
-
-  // The provider of the GL context. This is non-null while the GL context is
-  // valid and GLScaler is observing for context loss.
-  raw_ptr<ContextProvider> context_provider_;
-
-  // Set by Configure() to the resolved set of Parameters.
-  Parameters params_;
-
-  // If set to true, half-float textures are supported. This is lazy-initialized
-  // by SupportsPreciseColorManagement().
-  mutable absl::optional<bool> supports_half_floats_;
-
-  // The maximum number of simultaneous draw buffers, lazy-initialized by
-  // GetMaxDrawBuffersSupported(). -1 means "not yet known."
-  mutable int max_draw_buffers_ = -1;
-
-  // Cache of ShaderPrograms. The cache key consists of fields that correspond
-  // to the arguments of GetShaderProgram(): the shader, the texture format, the
-  // source and output color spaces (color transform), and the two swizzles.
-  using ShaderCacheKey = std::
-      tuple<Shader, GLenum, gfx::ColorSpace, gfx::ColorSpace, GLenum, GLenum>;
-  std::map<ShaderCacheKey, ShaderProgram> shader_programs_;
-
-  // The GL_ARRAY_BUFFER that holds the vertices and the texture coordinates
-  // data for sweeping the source area when a ScalerStage draws a quad (to
-  // execute its shader program).
-  GLuint vertex_attributes_buffer_ = 0;
-
-  // The chain of ScalerStages.
-  std::unique_ptr<ScalerStage> chain_;
-
-  // The color space in which the scaling stages operate.
-  gfx::ColorSpace scaling_color_space_;
-};
-
-// For logging.
-VIZ_COMMON_EXPORT std::ostream& operator<<(std::ostream& out,
-                                           const GLScaler& scaler);
-
-}  // namespace viz
-
-#endif  // COMPONENTS_VIZ_COMMON_GL_SCALER_H_
diff --git a/components/viz/common/resources/resource_format_utils.cc b/components/viz/common/resources/resource_format_utils.cc
index 52dc3be..7e93dcb 100644
--- a/components/viz/common/resources/resource_format_utils.cc
+++ b/components/viz/common/resources/resource_format_utils.cc
@@ -266,44 +266,6 @@
   }
 }
 
-unsigned int GLCopyTextureInternalFormat(ResourceFormat format) {
-  // In GLES2, valid formats for glCopyTexImage2D are: GL_ALPHA, GL_LUMINANCE,
-  // GL_LUMINANCE_ALPHA, GL_RGB, or GL_RGBA.
-  // Extensions typically used for glTexImage2D do not also work for
-  // glCopyTexImage2D. For instance GL_BGRA_EXT may not be used for
-  // anything but gl(Sub)TexImage2D:
-  // https://www.khronos.org/registry/gles/extensions/EXT/EXT_texture_format_BGRA8888.txt
-  DCHECK_LE(format, RESOURCE_FORMAT_MAX);
-  static const GLenum format_gl_data_format[] = {
-      GL_RGBA,       // RGBA_8888
-      GL_RGBA,       // RGBA_4444
-      GL_RGBA,       // BGRA_8888
-      GL_ALPHA,      // ALPHA_8
-      GL_LUMINANCE,  // LUMINANCE_8
-      GL_RGB,        // RGB_565
-      GL_RGB,        // BGR_565
-      GL_RGB,        // ETC1
-      GL_LUMINANCE,  // RED_8
-      GL_RGBA,       // RG_88
-      GL_LUMINANCE,  // LUMINANCE_F16
-      GL_RGBA,       // RGBA_F16
-      GL_LUMINANCE,  // R16_EXT
-      GL_RGBA,       // RG16_EXT
-      GL_RGB,        // RGBX_8888
-      GL_RGB,        // BGRX_8888
-      GL_ZERO,       // RGBA_1010102
-      GL_ZERO,       // BGRA_1010102
-      GL_ZERO,       // YVU_420
-      GL_ZERO,       // YUV_420_BIPLANAR
-      GL_ZERO,       // P010
-  };
-
-  static_assert(std::size(format_gl_data_format) == (RESOURCE_FORMAT_MAX + 1),
-                "format_gl_data_format does not handle all cases.");
-
-  return format_gl_data_format[format];
-}
-
 gfx::BufferFormat BufferFormat(ResourceFormat format) {
   switch (format) {
     case BGRA_8888:
diff --git a/components/viz/common/resources/resource_format_utils.h b/components/viz/common/resources/resource_format_utils.h
index fe2ee221..ae1328b9 100644
--- a/components/viz/common/resources/resource_format_utils.h
+++ b/components/viz/common/resources/resource_format_utils.h
@@ -36,8 +36,6 @@
 VIZ_RESOURCE_FORMAT_EXPORT unsigned int GLDataType(ResourceFormat format);
 VIZ_RESOURCE_FORMAT_EXPORT unsigned int GLDataFormat(ResourceFormat format);
 VIZ_RESOURCE_FORMAT_EXPORT unsigned int GLInternalFormat(ResourceFormat format);
-VIZ_RESOURCE_FORMAT_EXPORT unsigned int GLCopyTextureInternalFormat(
-    ResourceFormat format);
 
 // Returns the pixel format of the resource when mapped into client-side memory.
 // Returns a default value when IsGpuMemoryBufferFormatSupported() returns false
diff --git a/components/viz/host/renderer_settings_creation.cc b/components/viz/host/renderer_settings_creation.cc
index 6a830ec..9d34ced 100644
--- a/components/viz/host/renderer_settings_creation.cc
+++ b/components/viz/host/renderer_settings_creation.cc
@@ -66,7 +66,6 @@
 #endif
   renderer_settings.allow_antialiasing =
       !command_line->HasSwitch(switches::kDisableCompositedAntialiasing);
-  renderer_settings.use_skia_renderer = features::IsUsingSkiaRenderer();
 
   if (command_line->HasSwitch(switches::kSlowDownCompositingScaleFactor)) {
     const int kMinSlowDownScaleFactor = 1;
diff --git a/components/viz/service/BUILD.gn b/components/viz/service/BUILD.gn
index fe988e3..33e1f40f 100644
--- a/components/viz/service/BUILD.gn
+++ b/components/viz/service/BUILD.gn
@@ -43,8 +43,6 @@
     "display/display_damage_tracker.h",
     "display/display_resource_provider.cc",
     "display/display_resource_provider.h",
-    "display/display_resource_provider_gl.cc",
-    "display/display_resource_provider_gl.h",
     "display/display_resource_provider_null.cc",
     "display/display_resource_provider_null.h",
     "display/display_resource_provider_skia.cc",
@@ -57,22 +55,10 @@
     "display/display_scheduler_base.h",
     "display/draw_polygon.cc",
     "display/draw_polygon.h",
-    "display/dynamic_geometry_binding.cc",
-    "display/dynamic_geometry_binding.h",
     "display/external_use_client.cc",
     "display/external_use_client.h",
     "display/frame_rate_decider.cc",
     "display/frame_rate_decider.h",
-    "display/geometry_binding.cc",
-    "display/geometry_binding.h",
-    "display/gl_renderer.cc",
-    "display/gl_renderer.h",
-    "display/gl_renderer_copier.cc",
-    "display/gl_renderer_copier.h",
-    "display/gl_renderer_draw_cache.cc",
-    "display/gl_renderer_draw_cache.h",
-    "display/layer_quad.cc",
-    "display/layer_quad.h",
     "display/null_renderer.cc",
     "display/null_renderer.h",
     "display/output_surface.cc",
@@ -92,19 +78,11 @@
     "display/overlay_processor_stub.h",
     "display/pending_swap_params.cc",
     "display/pending_swap_params.h",
-    "display/program_binding.cc",
-    "display/program_binding.h",
     "display/renderer_utils.cc",
     "display/renderer_utils.h",
     "display/resolved_frame_data.cc",
     "display/resolved_frame_data.h",
     "display/resource_fence.h",
-    "display/scoped_gpu_memory_buffer_texture.cc",
-    "display/scoped_gpu_memory_buffer_texture.h",
-    "display/scoped_render_pass_texture.cc",
-    "display/scoped_render_pass_texture.h",
-    "display/shader.cc",
-    "display/shader.h",
     "display/shared_bitmap_manager.h",
     "display/skia_output_surface.cc",
     "display/skia_output_surface.h",
@@ -114,24 +92,12 @@
     "display/software_output_device.h",
     "display/software_renderer.cc",
     "display/software_renderer.h",
-    "display/static_geometry_binding.cc",
-    "display/static_geometry_binding.h",
     "display/surface_aggregator.cc",
     "display/surface_aggregator.h",
-    "display/sync_query_collection.cc",
-    "display/sync_query_collection.h",
-    "display/texture_deleter.cc",
-    "display/texture_deleter.h",
     "display_embedder/buffer_queue.cc",
     "display_embedder/buffer_queue.h",
     "display_embedder/compositor_gpu_thread.cc",
     "display_embedder/compositor_gpu_thread.h",
-    "display_embedder/gl_output_surface.cc",
-    "display_embedder/gl_output_surface.h",
-    "display_embedder/gl_output_surface_buffer_queue.cc",
-    "display_embedder/gl_output_surface_buffer_queue.h",
-    "display_embedder/gl_output_surface_offscreen.cc",
-    "display_embedder/gl_output_surface_offscreen.h",
     "display_embedder/in_process_gpu_memory_buffer_manager.cc",
     "display_embedder/in_process_gpu_memory_buffer_manager.h",
     "display_embedder/output_surface_provider.h",
@@ -141,8 +107,6 @@
     "display_embedder/server_shared_bitmap_manager.h",
     "display_embedder/software_output_surface.cc",
     "display_embedder/software_output_surface.h",
-    "display_embedder/viz_process_context_provider.cc",
-    "display_embedder/viz_process_context_provider.h",
     "display_embedder/vsync_parameter_listener.cc",
     "display_embedder/vsync_parameter_listener.h",
     "frame_sinks/begin_frame_tracker.cc",
@@ -275,10 +239,6 @@
   ]
 
   if (is_chromeos_ash) {
-    sources += [
-      "display_embedder/gl_output_surface_chromeos.cc",
-      "display_embedder/gl_output_surface_chromeos.h",
-    ]
     if (use_v4l2_codec || use_vaapi) {
       deps += [ "//ash/components/arc/video_accelerator" ]
     }
@@ -329,8 +289,6 @@
       "display/overlay_processor_android.h",
       "display/overlay_processor_surface_control.cc",
       "display/overlay_processor_surface_control.h",
-      "display_embedder/gl_output_surface_android.cc",
-      "display_embedder/gl_output_surface_android.h",
       "frame_sinks/external_begin_frame_source_android.cc",
       "frame_sinks/external_begin_frame_source_android.h",
       "gl/throw_uncaught_exception.cc",
@@ -546,26 +504,21 @@
     "display/delegated_ink_point_pixel_test_helper.cc",
     "display/delegated_ink_point_pixel_test_helper.h",
     "display/display_damage_tracker_unittest.cc",
-    "display/display_resource_provider_gl_unittest.cc",
     "display/display_resource_provider_skia_unittest.cc",
     "display/display_resource_provider_software_unittest.cc",
     "display/display_scheduler_unittest.cc",
     "display/display_unittest.cc",
     "display/draw_polygon_unittest.cc",
     "display/frame_rate_decider_unittest.cc",
-    "display/layer_quad_unittest.cc",
     "display/renderer_pixeltest.cc",
     "display/resolved_frame_data_unittest.cc",
-    "display/shader_unittest.cc",
     "display/skia_readback_pixeltest.cc",
     "display/software_renderer_unittest.cc",
     "display/surface_aggregator_pixeltest.cc",
     "display/surface_aggregator_unittest.cc",
-    "display/texture_deleter_unittest.cc",
     "display/viz_pixel_test.cc",
     "display/viz_pixel_test.h",
     "display_embedder/buffer_queue_unittest.cc",
-    "display_embedder/gl_output_surface_buffer_queue_unittest.cc",
     "display_embedder/server_shared_bitmap_manager_unittest.cc",
     "display_embedder/skia_output_device_buffer_queue_unittest.cc",
     "display_embedder/skia_output_surface_impl_unittest.cc",
diff --git a/components/viz/service/compositor_frame_fuzzer/fuzzer_software_output_surface_provider.cc b/components/viz/service/compositor_frame_fuzzer/fuzzer_software_output_surface_provider.cc
index 9b0b639f..941f49d 100644
--- a/components/viz/service/compositor_frame_fuzzer/fuzzer_software_output_surface_provider.cc
+++ b/components/viz/service/compositor_frame_fuzzer/fuzzer_software_output_surface_provider.cc
@@ -89,8 +89,7 @@
 std::unique_ptr<DisplayCompositorMemoryAndTaskController>
 FuzzerSoftwareOutputSurfaceProvider::CreateGpuDependency(
     bool gpu_compositing,
-    gpu::SurfaceHandle surface_handle,
-    const RendererSettings& renderer_settings) {
+    gpu::SurfaceHandle surface_handle) {
   return nullptr;
 }
 
diff --git a/components/viz/service/compositor_frame_fuzzer/fuzzer_software_output_surface_provider.h b/components/viz/service/compositor_frame_fuzzer/fuzzer_software_output_surface_provider.h
index 2f115f65..24ccdee8 100644
--- a/components/viz/service/compositor_frame_fuzzer/fuzzer_software_output_surface_provider.h
+++ b/components/viz/service/compositor_frame_fuzzer/fuzzer_software_output_surface_provider.h
@@ -30,8 +30,7 @@
   // OutputSurfaceProvider implementation.
   std::unique_ptr<DisplayCompositorMemoryAndTaskController> CreateGpuDependency(
       bool gpu_compositing,
-      gpu::SurfaceHandle surface_handle,
-      const RendererSettings& renderer_settings) override;
+      gpu::SurfaceHandle surface_handle) override;
   std::unique_ptr<OutputSurface> CreateOutputSurface(
       gpu::SurfaceHandle surface_handle,
       bool gpu_compositing,
diff --git a/components/viz/service/display/direct_renderer.cc b/components/viz/service/display/direct_renderer.cc
index 4d7c04e..774d3ae 100644
--- a/components/viz/service/display/direct_renderer.cc
+++ b/components/viz/service/display/direct_renderer.cc
@@ -92,21 +92,10 @@
 DirectRenderer::~DirectRenderer() = default;
 
 void DirectRenderer::Initialize() {
-  auto* context_provider = output_surface_->context_provider();
-
   use_partial_swap_ = settings_->partial_swap_enabled && CanPartialSwap();
-  allow_empty_swap_ = use_partial_swap_;
-  if (context_provider) {
-    if (context_provider->ContextCapabilities().commit_overlay_planes)
-      allow_empty_swap_ = true;
-#if DCHECK_IS_ON()
-    supports_occlusion_query_ =
-        context_provider->ContextCapabilities().occlusion_query;
-#endif
-  } else {
-    allow_empty_swap_ |=
-        output_surface_->capabilities().supports_commit_overlay_planes;
-  }
+  allow_empty_swap_ =
+      use_partial_swap_ ||
+      output_surface_->capabilities().supports_commit_overlay_planes;
 
   initialized_ = true;
 }
@@ -226,16 +215,6 @@
   auto* root_render_pass = render_passes_in_draw_order->back().get();
   DCHECK(root_render_pass);
 
-#if DCHECK_IS_ON()
-  bool overdraw_tracing_enabled;
-  TRACE_EVENT_CATEGORY_GROUP_ENABLED(TRACE_DISABLED_BY_DEFAULT("viz.overdraw"),
-                                     &overdraw_tracing_enabled);
-  DLOG_IF(WARNING, !overdraw_tracing_support_missing_logged_once_ &&
-                       overdraw_tracing_enabled && !supports_occlusion_query_)
-      << "Overdraw tracing enabled on platform without support.";
-  overdraw_tracing_support_missing_logged_once_ = true;
-#endif
-
   bool overdraw_feedback = debug_settings_->show_overdraw_feedback;
   if (overdraw_feedback && !output_surface_->capabilities().supports_stencil) {
 #if DCHECK_IS_ON()
diff --git a/components/viz/service/display/direct_renderer.h b/components/viz/service/display/direct_renderer.h
index f330efc..cab2564 100644
--- a/components/viz/service/display/direct_renderer.h
+++ b/components/viz/service/display/direct_renderer.h
@@ -377,8 +377,6 @@
   bool initialized_ = false;
 #if DCHECK_IS_ON()
   bool overdraw_feedback_support_missing_logged_once_ = false;
-  bool overdraw_tracing_support_missing_logged_once_ = false;
-  bool supports_occlusion_query_ = false;
 #endif
   gfx::Rect last_root_render_pass_scissor_rect_;
   gfx::Size enlarge_pass_texture_amount_;
diff --git a/components/viz/service/display/display.cc b/components/viz/service/display/display.cc
index c374c6d..b3fa209 100644
--- a/components/viz/service/display/display.cc
+++ b/components/viz/service/display/display.cc
@@ -24,6 +24,7 @@
 #include "components/viz/common/display/renderer_settings.h"
 #include "components/viz/common/features.h"
 #include "components/viz/common/frame_sinks/begin_frame_source.h"
+#include "components/viz/common/quads/aggregated_render_pass_draw_quad.h"
 #include "components/viz/common/quads/compositor_frame.h"
 #include "components/viz/common/quads/draw_quad.h"
 #include "components/viz/common/quads/shared_quad_state.h"
@@ -34,12 +35,10 @@
 #include "components/viz/service/display/delegated_ink_point_renderer_base.h"
 #include "components/viz/service/display/direct_renderer.h"
 #include "components/viz/service/display/display_client.h"
-#include "components/viz/service/display/display_resource_provider_gl.h"
 #include "components/viz/service/display/display_resource_provider_null.h"
 #include "components/viz/service/display/display_resource_provider_skia.h"
 #include "components/viz/service/display/display_resource_provider_software.h"
 #include "components/viz/service/display/display_scheduler.h"
-#include "components/viz/service/display/gl_renderer.h"
 #include "components/viz/service/display/null_renderer.h"
 #include "components/viz/service/display/output_surface.h"
 #include "components/viz/service/display/renderer_utils.h"
@@ -341,15 +340,6 @@
   if (resource_provider_) {
     resource_provider_->SetAllowAccessToGPUThread(true);
   }
-#if BUILDFLAG(IS_ANDROID)
-  // In certain cases, drivers hang when tearing down the display. Finishing
-  // before teardown appears to address this. As we're during display teardown,
-  // an additional finish should have minimal impact.
-  // TODO(ericrk): Add a more robust workaround. crbug.com/899705
-  if (auto* context = output_surface_->context_provider()) {
-    context->ContextGL()->Finish();
-  }
-#endif
 
   if (no_pending_swaps_callback_)
     std::move(no_pending_swaps_callback_).Run();
@@ -364,8 +354,6 @@
 
   // Only do this if Initialize() happened.
   if (client_) {
-    if (auto* context = output_surface_->context_provider())
-      context->RemoveObserver(this);
     if (skia_output_surface_)
       skia_output_surface_->RemoveContextLostObserver(this);
   }
@@ -407,9 +395,6 @@
   // This depends on assumptions that Display::Initialize will happen on the
   // same callstack as the ContextProvider being created/initialized or else
   // it could miss a callback before setting this.
-  if (auto* context = output_surface_->context_provider())
-    context->AddObserver(this);
-
   if (skia_output_surface_)
     skia_output_surface_->AddContextLostObserver(this);
 }
@@ -489,8 +474,7 @@
       scheduler_->ForceImmediateSwapIfPossible();
 
     if (no_pending_swaps_callback && pending_swaps_ > 0 &&
-        (output_surface_->context_provider() ||
-         output_surface_->AsSkiaOutputSurface())) {
+        output_surface_->AsSkiaOutputSurface()) {
       no_pending_swaps_callback_ = std::move(no_pending_swaps_callback);
     }
 
@@ -543,14 +527,6 @@
         resource_provider.get(), overlay_processor_.get(),
         skia_output_surface_);
     resource_provider_ = std::move(resource_provider);
-  } else if (output_surface_->context_provider()) {
-    auto resource_provider = std::make_unique<DisplayResourceProviderGL>(
-        output_surface_->context_provider(), enable_shared_images);
-    renderer_ = std::make_unique<GLRenderer>(
-        &settings_, debug_settings_, output_surface_.get(),
-        resource_provider.get(), overlay_processor_.get(),
-        current_task_runner_);
-    resource_provider_ = std::move(resource_provider);
   } else if (output_surface_->capabilities().skips_draw) {
     auto resource_provider = std::make_unique<DisplayResourceProviderNull>();
     renderer_ = std::make_unique<NullRenderer>(
diff --git a/components/viz/service/display/display_resource_provider_gl.cc b/components/viz/service/display/display_resource_provider_gl.cc
deleted file mode 100644
index 6b8ed37..0000000
--- a/components/viz/service/display/display_resource_provider_gl.cc
+++ /dev/null
@@ -1,427 +0,0 @@
-// Copyright 2021 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 "components/viz/service/display/display_resource_provider_gl.h"
-
-#include <utility>
-#include <vector>
-
-#include "base/dcheck_is_on.h"
-#include "base/memory/raw_ptr.h"
-#include "base/trace_event/trace_event.h"
-#include "build/build_config.h"
-#include "components/viz/common/gpu/context_provider.h"
-#include "gpu/GLES2/gl2extchromium.h"
-#include "gpu/command_buffer/client/gles2_interface.h"
-#include "ui/gfx/gpu_fence.h"
-#include "ui/gl/gl_fence.h"
-
-using gpu::gles2::GLES2Interface;
-
-namespace viz {
-namespace {
-
-class ScopedSetActiveTexture {
- public:
-  ScopedSetActiveTexture(GLES2Interface* gl, GLenum unit)
-      : gl_(gl), unit_(unit) {
-#if DCHECK_IS_ON()
-    GLint active_unit = 0;
-    gl->GetIntegerv(GL_ACTIVE_TEXTURE, &active_unit);
-    DCHECK_EQ(GL_TEXTURE0, active_unit);
-#endif
-
-    if (unit_ != GL_TEXTURE0)
-      gl_->ActiveTexture(unit_);
-  }
-
-  ~ScopedSetActiveTexture() {
-    // Active unit being GL_TEXTURE0 is effectively the ground state.
-    if (unit_ != GL_TEXTURE0)
-      gl_->ActiveTexture(GL_TEXTURE0);
-  }
-
- private:
-  raw_ptr<GLES2Interface> gl_;
-  GLenum unit_;
-};
-
-}  // namespace
-
-DisplayResourceProviderGL::DisplayResourceProviderGL(
-    ContextProvider* compositor_context_provider,
-    bool enable_shared_images)
-    : DisplayResourceProvider(DisplayResourceProvider::kGpu),
-      compositor_context_provider_(compositor_context_provider),
-      enable_shared_images_(enable_shared_images) {
-  DCHECK(compositor_context_provider_);
-}
-
-DisplayResourceProviderGL::~DisplayResourceProviderGL() {
-  Destroy();
-  GLES2Interface* gl = ContextGL();
-  if (gl)
-    gl->Finish();
-
-  while (!resources_.empty())
-    DeleteResourceInternal(resources_.begin());
-}
-
-void DisplayResourceProviderGL::DeleteResourceInternal(
-    ResourceMap::iterator it) {
-  TRACE_EVENT0("viz", "DisplayResourceProvider::DeleteResourceInternal");
-  ChildResource* resource = &it->second;
-
-  if (resource->gl_id) {
-    GLES2Interface* gl = ContextGL();
-    DCHECK(gl);
-    gl->DeleteTextures(1, &resource->gl_id);
-  }
-
-  resources_.erase(it);
-}
-
-GLES2Interface* DisplayResourceProviderGL::ContextGL() const {
-  DCHECK(compositor_context_provider_);
-  return compositor_context_provider_->ContextGL();
-}
-
-const DisplayResourceProvider::ChildResource*
-DisplayResourceProviderGL::LockForRead(ResourceId id, bool overlay_only) {
-  // TODO(ericrk): We should never fail TryGetResource, but we appear to be
-  // doing so on Android in rare cases. Handle this gracefully until a better
-  // solution can be found. https://crbug.com/811858
-  ChildResource* resource = TryGetResource(id);
-  if (!resource)
-    return nullptr;
-
-  // Mailbox sync_tokens must be processed by a call to WaitSyncToken() prior to
-  // calling LockForRead().
-  DCHECK_NE(NEEDS_WAIT, resource->synchronization_state());
-  DCHECK(resource->is_gpu_resource_type());
-
-  const gpu::Mailbox& mailbox = resource->transferable.mailbox_holder.mailbox;
-  GLES2Interface* gl = ContextGL();
-  DCHECK(gl);
-  if (!resource->gl_id) {
-    if (mailbox.IsSharedImage() && enable_shared_images_) {
-      resource->gl_id =
-          gl->CreateAndTexStorage2DSharedImageCHROMIUM(mailbox.name);
-    } else {
-      resource->gl_id = gl->CreateAndConsumeTextureCHROMIUM(
-          resource->transferable.mailbox_holder.mailbox.name);
-    }
-    resource->SetLocallyUsed();
-  }
-  if (mailbox.IsSharedImage() && enable_shared_images_) {
-    if (overlay_only) {
-      if (resource->lock_for_overlay_count == 0) {
-        // If |lock_for_read_count| > 0, then BeginSharedImageAccess has
-        // already been called with READ, so don't re-lock with OVERLAY.
-        if (resource->lock_for_read_count == 0) {
-          gl->BeginSharedImageAccessDirectCHROMIUM(
-              resource->gl_id, GL_SHARED_IMAGE_ACCESS_MODE_OVERLAY_CHROMIUM);
-        }
-      }
-    } else {
-      if (resource->lock_for_read_count == 0) {
-        // If |lock_for_overlay_count| > 0, then we have already begun access
-        // for OVERLAY. End this access and "upgrade" it to READ.
-        // See https://crbug.com/1113925 for how this can go wrong.
-        if (resource->lock_for_overlay_count > 0)
-          gl->EndSharedImageAccessDirectCHROMIUM(resource->gl_id);
-        gl->BeginSharedImageAccessDirectCHROMIUM(
-            resource->gl_id, GL_SHARED_IMAGE_ACCESS_MODE_READ_CHROMIUM);
-      }
-    }
-  }
-
-  if (overlay_only)
-    resource->lock_for_overlay_count++;
-  else
-    resource->lock_for_read_count++;
-  if (resource->transferable.synchronization_type ==
-      TransferableResource::SynchronizationType::kGpuCommandsCompleted) {
-    if (current_read_lock_fence_.get())
-      current_read_lock_fence_->Set();
-    resource->read_lock_fence = current_read_lock_fence_;
-  }
-
-  return resource;
-}
-
-void DisplayResourceProviderGL::UnlockForRead(ResourceId id,
-                                              bool overlay_only) {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  ChildResource* resource = TryGetResource(id);
-  // TODO(ericrk): We should never fail to find id, but we appear to be
-  // doing so on Android in rare cases. Handle this gracefully until a better
-  // solution can be found. https://crbug.com/811858
-  if (!resource)
-    return;
-
-  DCHECK(resource->is_gpu_resource_type());
-  if (resource->transferable.mailbox_holder.mailbox.IsSharedImage() &&
-      enable_shared_images_) {
-    // If this is the last READ or OVERLAY access, then end access.
-    if (resource->lock_for_read_count + resource->lock_for_overlay_count == 1) {
-      DCHECK(resource->gl_id);
-      GLES2Interface* gl = ContextGL();
-      DCHECK(gl);
-      if (!resource->release_fence.is_null()) {
-        auto fence = gfx::GpuFence(resource->release_fence.Clone());
-        if (gl::GLFence::IsGpuFenceSupported()) {
-          auto fence_id =
-              gl->CreateClientGpuFenceCHROMIUM(fence.AsClientGpuFence());
-          gl->WaitGpuFenceCHROMIUM(fence_id);
-          gl->DestroyGpuFenceCHROMIUM(fence_id);
-        } else {
-          fence.Wait();
-        }
-      }
-      gl->EndSharedImageAccessDirectCHROMIUM(resource->gl_id);
-    }
-  }
-  if (overlay_only) {
-    DCHECK_GT(resource->lock_for_overlay_count, 0);
-    resource->lock_for_overlay_count--;
-  } else {
-    DCHECK_GT(resource->lock_for_read_count, 0);
-    resource->lock_for_read_count--;
-  }
-  TryReleaseResource(id, resource);
-}
-
-std::vector<ReturnedResource>
-DisplayResourceProviderGL::DeleteAndReturnUnusedResourcesToChildImpl(
-    Child& child_info,
-    DeleteStyle style,
-    const std::vector<ResourceId>& unused) {
-  std::vector<ReturnedResource> to_return;
-  // Reserve enough space to avoid re-allocating, so we can keep item pointers
-  // for later using.
-  to_return.reserve(unused.size());
-  std::vector<ReturnedResource*> need_synchronization_resources;
-  std::vector<GLbyte*> unverified_sync_tokens;
-
-  GLES2Interface* gl = ContextGL();
-  DCHECK(gl);
-  DCHECK(can_access_gpu_thread_);
-  for (ResourceId local_id : unused) {
-    auto it = resources_.find(local_id);
-    CHECK(it != resources_.end());
-    ChildResource& resource = it->second;
-    DCHECK(resource.is_gpu_resource_type());
-
-    ResourceId child_id = resource.transferable.id;
-    DCHECK(child_info.child_to_parent_map.count(child_id));
-
-    auto can_delete = CanDeleteNow(child_info, resource, style);
-    if (can_delete == CanDeleteNowResult::kNo) {
-      // Defer this resource deletion.
-      resource.marked_for_deletion = true;
-      continue;
-    }
-
-    const bool is_lost = can_delete == CanDeleteNowResult::kYesButLoseResource;
-
-    if (resource.gl_id && resource.filter != resource.transferable.filter) {
-      DCHECK(resource.transferable.mailbox_holder.texture_target);
-      DCHECK(!resource.ShouldWaitSyncToken());
-      gl->BindTexture(resource.transferable.mailbox_holder.texture_target,
-                      resource.gl_id);
-      gl->TexParameteri(resource.transferable.mailbox_holder.texture_target,
-                        GL_TEXTURE_MIN_FILTER, resource.transferable.filter);
-      gl->TexParameteri(resource.transferable.mailbox_holder.texture_target,
-                        GL_TEXTURE_MAG_FILTER, resource.transferable.filter);
-      resource.SetLocallyUsed();
-    }
-
-    to_return.emplace_back(child_id, resource.sync_token(),
-                           std::move(resource.release_fence),
-                           resource.imported_count, is_lost);
-    auto& returned = to_return.back();
-
-    if (resource.needs_sync_token()) {
-      need_synchronization_resources.push_back(&returned);
-    } else if (returned.sync_token.HasData() &&
-               !returned.sync_token.verified_flush()) {
-      unverified_sync_tokens.push_back(returned.sync_token.GetData());
-    }
-
-    child_info.child_to_parent_map.erase(child_id);
-    resource.imported_count = 0;
-    DeleteResourceInternal(it);
-  }
-
-  gpu::SyncToken new_sync_token;
-  if (!need_synchronization_resources.empty()) {
-    gl->GenUnverifiedSyncTokenCHROMIUM(new_sync_token.GetData());
-    unverified_sync_tokens.push_back(new_sync_token.GetData());
-  }
-
-  if (!unverified_sync_tokens.empty()) {
-    gl->VerifySyncTokensCHROMIUM(unverified_sync_tokens.data(),
-                                 unverified_sync_tokens.size());
-  }
-
-  // Set sync token after verification.
-  for (ReturnedResource* returned : need_synchronization_resources)
-    returned->sync_token = new_sync_token;
-
-  return to_return;
-}
-
-GLenum DisplayResourceProviderGL::GetResourceTextureTarget(ResourceId id) {
-  return GetResource(id)->transferable.mailbox_holder.texture_target;
-}
-
-void DisplayResourceProviderGL::WaitSyncToken(ResourceId id) {
-  ChildResource* resource = TryGetResource(id);
-  // TODO(ericrk): We should never fail TryGetResource, but we appear to
-  // be doing so on Android in rare cases. Handle this gracefully until a
-  // better solution can be found. https://crbug.com/811858
-  if (!resource)
-    return;
-  WaitSyncTokenInternal(resource);
-}
-
-GLenum DisplayResourceProviderGL::BindForSampling(ResourceId resource_id,
-                                                  GLenum unit,
-                                                  GLenum filter) {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  GLES2Interface* gl = ContextGL();
-  auto it = resources_.find(resource_id);
-  // TODO(ericrk): We should never fail to find resource_id, but we appear to
-  // be doing so on Android in rare cases. Handle this gracefully until a
-  // better solution can be found. https://crbug.com/811858
-  if (it == resources_.end())
-    return GL_TEXTURE_2D;
-
-  ChildResource* resource = &it->second;
-  DCHECK(resource->lock_for_read_count);
-
-  ScopedSetActiveTexture scoped_active_tex(gl, unit);
-  GLenum target = resource->transferable.mailbox_holder.texture_target;
-  gl->BindTexture(target, resource->gl_id);
-
-  // Texture parameters can be modified by concurrent reads so reset them
-  // before binding the texture. See https://crbug.com/1092080.
-  gl->TexParameteri(target, GL_TEXTURE_MIN_FILTER, filter);
-  gl->TexParameteri(target, GL_TEXTURE_MAG_FILTER, filter);
-  resource->filter = filter;
-
-  return target;
-}
-
-void DisplayResourceProviderGL::WaitSyncTokenInternal(ChildResource* resource) {
-  DCHECK(resource);
-  if (!resource->ShouldWaitSyncToken())
-    return;
-  GLES2Interface* gl = ContextGL();
-  DCHECK(gl);
-  // In the case of context lost, this sync token may be empty (see comment in
-  // the UpdateSyncToken() function). The WaitSyncTokenCHROMIUM() function
-  // handles empty sync tokens properly so just wait anyways and update the
-  // state the synchronized.
-  gl->WaitSyncTokenCHROMIUM(resource->sync_token().GetConstData());
-  resource->SetSynchronized();
-}
-
-DisplayResourceProviderGL::ScopedReadLockGL::ScopedReadLockGL(
-    DisplayResourceProviderGL* resource_provider,
-    ResourceId resource_id)
-    : resource_provider_(resource_provider), resource_id_(resource_id) {
-  const ChildResource* resource =
-      resource_provider->LockForRead(resource_id, false /* overlay_only */);
-  // TODO(ericrk): We should never fail LockForRead, but we appear to be
-  // doing so on Android in rare cases. Handle this gracefully until a better
-  // solution can be found. https://crbug.com/811858
-  if (!resource)
-    return;
-
-  texture_id_ = resource->gl_id;
-  target_ = resource->transferable.mailbox_holder.texture_target;
-  size_ = resource->transferable.size;
-  color_space_ = resource->transferable.color_space;
-  hdr_metadata_ = resource->transferable.hdr_metadata;
-}
-
-DisplayResourceProviderGL::ScopedReadLockGL::~ScopedReadLockGL() {
-  resource_provider_->UnlockForRead(resource_id_, false /* overlay_only */);
-}
-
-DisplayResourceProviderGL::ScopedSamplerGL::ScopedSamplerGL(
-    DisplayResourceProviderGL* resource_provider,
-    ResourceId resource_id,
-    GLenum filter)
-    : resource_lock_(resource_provider, resource_id),
-      unit_(GL_TEXTURE0),
-      target_(resource_provider->BindForSampling(resource_id, unit_, filter)) {}
-
-DisplayResourceProviderGL::ScopedSamplerGL::ScopedSamplerGL(
-    DisplayResourceProviderGL* resource_provider,
-    ResourceId resource_id,
-    GLenum unit,
-    GLenum filter)
-    : resource_lock_(resource_provider, resource_id),
-      unit_(unit),
-      target_(resource_provider->BindForSampling(resource_id, unit_, filter)) {}
-
-DisplayResourceProviderGL::ScopedSamplerGL::~ScopedSamplerGL() = default;
-
-DisplayResourceProviderGL::ScopedOverlayLockGL::ScopedOverlayLockGL(
-    DisplayResourceProviderGL* resource_provider,
-    ResourceId resource_id)
-    : resource_provider_(resource_provider), resource_id_(resource_id) {
-  const ChildResource* resource =
-      resource_provider->LockForRead(resource_id, true /* overlay_only */);
-  if (!resource)
-    return;
-
-  texture_id_ = resource->gl_id;
-}
-
-DisplayResourceProviderGL::ScopedOverlayLockGL::~ScopedOverlayLockGL() {
-  resource_provider_->UnlockForRead(resource_id_, true /* overlay_only */);
-}
-
-void DisplayResourceProviderGL::ScopedOverlayLockGL::SetReleaseFence(
-    gfx::GpuFenceHandle release_fence) {
-  auto* resource = resource_provider_->GetResource(resource_id_);
-  DCHECK(resource);
-  resource->release_fence = std::move(release_fence);
-}
-
-bool DisplayResourceProviderGL::ScopedOverlayLockGL::HasReadLockFence() const {
-  auto* resource = resource_provider_->GetResource(resource_id_);
-  DCHECK(resource);
-  return resource->transferable.synchronization_type ==
-         TransferableResource::SynchronizationType::kGpuCommandsCompleted;
-}
-
-DisplayResourceProviderGL::SynchronousFence::SynchronousFence(
-    gpu::gles2::GLES2Interface* gl)
-    : gl_(gl), has_synchronized_(true) {}
-
-DisplayResourceProviderGL::SynchronousFence::~SynchronousFence() = default;
-
-void DisplayResourceProviderGL::SynchronousFence::Set() {
-  has_synchronized_ = false;
-}
-
-bool DisplayResourceProviderGL::SynchronousFence::HasPassed() {
-  if (!has_synchronized_) {
-    has_synchronized_ = true;
-    Synchronize();
-  }
-  return true;
-}
-
-void DisplayResourceProviderGL::SynchronousFence::Synchronize() {
-  TRACE_EVENT0("viz", "DisplayResourceProvider::SynchronousFence::Synchronize");
-  gl_->Finish();
-}
-
-}  // namespace viz
diff --git a/components/viz/service/display/display_resource_provider_gl.h b/components/viz/service/display/display_resource_provider_gl.h
deleted file mode 100644
index 8a75cf5..0000000
--- a/components/viz/service/display/display_resource_provider_gl.h
+++ /dev/null
@@ -1,165 +0,0 @@
-// Copyright 2021 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 COMPONENTS_VIZ_SERVICE_DISPLAY_DISPLAY_RESOURCE_PROVIDER_GL_H_
-#define COMPONENTS_VIZ_SERVICE_DISPLAY_DISPLAY_RESOURCE_PROVIDER_GL_H_
-
-#include <vector>
-
-#include "base/memory/raw_ptr.h"
-#include "components/viz/service/display/display_resource_provider.h"
-#include "components/viz/service/viz_service_export.h"
-
-namespace gpu {
-namespace gles2 {
-class GLES2Interface;
-}  // namespace gles2
-}  // namespace gpu
-
-namespace viz {
-
-class ContextProvider;
-
-// DisplayResourceProvider implementation used with GLRenderer.
-class VIZ_SERVICE_EXPORT DisplayResourceProviderGL
-    : public DisplayResourceProvider {
- public:
-  // Android with GLRenderer doesn't support overlays with shared images
-  // enabled. For everything else |enable_shared_images| is true.
-  DisplayResourceProviderGL(ContextProvider* compositor_context_provider,
-                            bool enable_shared_images = true);
-  ~DisplayResourceProviderGL() override;
-
-  GLenum GetResourceTextureTarget(ResourceId id);
-  void WaitSyncToken(ResourceId id);
-
-  // The following lock classes are part of the DisplayResourceProvider API and
-  // are needed to read the resource contents. The user must ensure that they
-  // only use GL locks on GL resources, etc, and this is enforced by assertions.
-  class VIZ_SERVICE_EXPORT ScopedReadLockGL {
-   public:
-    ScopedReadLockGL(DisplayResourceProviderGL* resource_provider,
-                     ResourceId resource_id);
-    ~ScopedReadLockGL();
-
-    ScopedReadLockGL(const ScopedReadLockGL&) = delete;
-    ScopedReadLockGL& operator=(const ScopedReadLockGL&) = delete;
-
-    GLuint texture_id() const { return texture_id_; }
-    GLenum target() const { return target_; }
-    const gfx::Size& size() const { return size_; }
-    const gfx::ColorSpace& color_space() const { return color_space_; }
-    const absl::optional<gfx::HDRMetadata>& hdr_metadata() const {
-      return hdr_metadata_;
-    }
-
-   private:
-    const raw_ptr<DisplayResourceProviderGL> resource_provider_;
-    const ResourceId resource_id_;
-
-    GLuint texture_id_ = 0;
-    GLenum target_ = GL_TEXTURE_2D;
-    gfx::Size size_;
-    gfx::ColorSpace color_space_;
-    absl::optional<gfx::HDRMetadata> hdr_metadata_;
-  };
-
-  class VIZ_SERVICE_EXPORT ScopedSamplerGL {
-   public:
-    ScopedSamplerGL(DisplayResourceProviderGL* resource_provider,
-                    ResourceId resource_id,
-                    GLenum filter);
-    ScopedSamplerGL(DisplayResourceProviderGL* resource_provider,
-                    ResourceId resource_id,
-                    GLenum unit,
-                    GLenum filter);
-    ~ScopedSamplerGL();
-
-    ScopedSamplerGL(const ScopedSamplerGL&) = delete;
-    ScopedSamplerGL& operator=(const ScopedSamplerGL&) = delete;
-
-    GLuint texture_id() const { return resource_lock_.texture_id(); }
-    GLenum target() const { return target_; }
-    const gfx::ColorSpace& color_space() const {
-      return resource_lock_.color_space();
-    }
-    const absl::optional<gfx::HDRMetadata>& hdr_metadata() const {
-      return resource_lock_.hdr_metadata();
-    }
-
-   private:
-    const ScopedReadLockGL resource_lock_;
-    const GLenum unit_;
-    const GLenum target_;
-  };
-
-  class VIZ_SERVICE_EXPORT ScopedOverlayLockGL {
-   public:
-    ScopedOverlayLockGL(DisplayResourceProviderGL* resource_provider,
-                        ResourceId resource_id);
-    ~ScopedOverlayLockGL();
-
-    ScopedOverlayLockGL(const ScopedOverlayLockGL&) = delete;
-    ScopedOverlayLockGL& operator=(const ScopedOverlayLockGL&) = delete;
-
-    GLuint texture_id() const { return texture_id_; }
-
-    // Sets the given |release_fence| onto this resource.
-    // This is propagated to ReturnedResource when the resource is freed.
-    void SetReleaseFence(gfx::GpuFenceHandle release_fence);
-
-    // Returns true iff this resource has a read lock fence set.
-    bool HasReadLockFence() const;
-
-   private:
-    const raw_ptr<DisplayResourceProviderGL> resource_provider_;
-    const ResourceId resource_id_;
-    GLuint texture_id_ = 0;
-  };
-
-  class VIZ_SERVICE_EXPORT SynchronousFence : public ResourceFence {
-   public:
-    explicit SynchronousFence(gpu::gles2::GLES2Interface* gl);
-
-    SynchronousFence(const SynchronousFence&) = delete;
-    SynchronousFence& operator=(const SynchronousFence&) = delete;
-
-    // ResourceFence implementation.
-    void Set() override;
-    bool HasPassed() override;
-
-    // Returns true if fence has been set but not yet synchornized.
-    bool has_synchronized() const { return has_synchronized_; }
-
-   private:
-    ~SynchronousFence() override;
-
-    void Synchronize();
-
-    raw_ptr<gpu::gles2::GLES2Interface> gl_;
-    bool has_synchronized_;
-  };
-
- private:
-  const ChildResource* LockForRead(ResourceId id, bool overlay_only);
-  void UnlockForRead(ResourceId id, bool overlay_only);
-
-  // DisplayResourceProvider overrides:
-  std::vector<ReturnedResource> DeleteAndReturnUnusedResourcesToChildImpl(
-      Child& child_info,
-      DeleteStyle style,
-      const std::vector<ResourceId>& unused) override;
-
-  gpu::gles2::GLES2Interface* ContextGL() const;
-  void DeleteResourceInternal(ResourceMap::iterator it);
-  GLenum BindForSampling(ResourceId resource_id, GLenum unit, GLenum filter);
-  void WaitSyncTokenInternal(ChildResource* resource);
-
-  const raw_ptr<ContextProvider> compositor_context_provider_;
-  const bool enable_shared_images_;
-};
-
-}  // namespace viz
-
-#endif  // COMPONENTS_VIZ_SERVICE_DISPLAY_DISPLAY_RESOURCE_PROVIDER_GL_H_
diff --git a/components/viz/service/display/display_resource_provider_gl_unittest.cc b/components/viz/service/display/display_resource_provider_gl_unittest.cc
deleted file mode 100644
index a71ac8d9..0000000
--- a/components/viz/service/display/display_resource_provider_gl_unittest.cc
+++ /dev/null
@@ -1,722 +0,0 @@
-// Copyright 2021 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 "components/viz/service/display/display_resource_provider_gl.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <memory>
-#include <set>
-#include <unordered_map>
-#include <utility>
-#include <vector>
-
-#include "base/bind.h"
-#include "base/callback_helpers.h"
-#include "base/check.h"
-#include "base/memory/raw_ptr.h"
-#include "base/memory/ref_counted.h"
-#include "build/build_config.h"
-#include "components/viz/client/client_resource_provider.h"
-#include "components/viz/common/resources/release_callback.h"
-#include "components/viz/common/resources/resource_format_utils.h"
-#include "components/viz/common/resources/returned_resource.h"
-#include "components/viz/test/test_context_provider.h"
-#include "components/viz/test/test_gles2_interface.h"
-#include "gpu/GLES2/gl2extchromium.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/khronos/GLES2/gl2.h"
-#include "third_party/khronos/GLES2/gl2ext.h"
-#include "ui/gfx/geometry/rect.h"
-
-using testing::_;
-using testing::ByMove;
-using testing::DoAll;
-using testing::Return;
-using testing::SaveArg;
-
-namespace viz {
-namespace {
-
-class MockReleaseCallback {
- public:
-  MOCK_METHOD2(Released, void(const gpu::SyncToken& token, bool lost));
-};
-
-MATCHER_P(MatchesSyncToken, sync_token, "") {
-  gpu::SyncToken other;
-  memcpy(&other, arg, sizeof(other));
-  return other == sync_token;
-}
-
-static void CollectResources(std::vector<ReturnedResource>* array,
-                             std::vector<ReturnedResource> returned) {
-  array->insert(array->end(), std::make_move_iterator(returned.begin()),
-                std::make_move_iterator(returned.end()));
-}
-
-class ResourceProviderGLES2Interface : public TestGLES2Interface {
- public:
-  ResourceProviderGLES2Interface() = default;
-
-  void WaitSyncTokenCHROMIUM(const GLbyte* sync_token) override {
-    gpu::SyncToken sync_token_data;
-    if (sync_token)
-      memcpy(&sync_token_data, sync_token, sizeof(sync_token_data));
-
-    if (sync_token_data.release_count() >
-        last_waited_sync_token_.release_count()) {
-      last_waited_sync_token_ = sync_token_data;
-    }
-  }
-
-  const gpu::SyncToken& last_waited_sync_token() const {
-    return last_waited_sync_token_;
-  }
-
- private:
-  gpu::SyncToken last_waited_sync_token_;
-};
-
-class DisplayResourceProviderGLTest : public testing::Test {
- public:
-  DisplayResourceProviderGLTest() {
-    auto gl_owned = std::make_unique<ResourceProviderGLES2Interface>();
-    gl_ = gl_owned.get();
-    context_provider_ = TestContextProvider::Create(std::move(gl_owned));
-    context_provider_->UnboundTestContextGL()
-        ->set_support_texture_format_bgra8888(true);
-    context_provider_->BindToCurrentThread();
-
-    child_context_provider_ = TestContextProvider::Create();
-    child_context_provider_->UnboundTestContextGL()
-        ->set_support_texture_format_bgra8888(true);
-    child_context_provider_->BindToCurrentThread();
-
-    resource_provider_ =
-        std::make_unique<DisplayResourceProviderGL>(context_provider_.get());
-
-    child_resource_provider_ = std::make_unique<ClientResourceProvider>();
-  }
-
-  ~DisplayResourceProviderGLTest() override {
-    child_resource_provider_->ShutdownAndReleaseAllResources();
-  }
-
-  static ReturnCallback GetReturnCallback(
-      std::vector<ReturnedResource>* array) {
-    return base::BindRepeating(&CollectResources, array);
-  }
-
-  static void SetResourceFilter(DisplayResourceProviderGL* resource_provider,
-                                ResourceId id,
-                                GLenum filter) {
-    DisplayResourceProviderGL::ScopedSamplerGL sampler(resource_provider, id,
-                                                       GL_TEXTURE_2D, filter);
-  }
-
-  TransferableResource CreateResource(ResourceFormat format) {
-    constexpr gfx::Size size(64, 64);
-    gpu::Mailbox gpu_mailbox = gpu::Mailbox::Generate();
-    gpu::SyncToken sync_token = GenSyncToken();
-    EXPECT_TRUE(sync_token.HasData());
-
-    TransferableResource gl_resource = TransferableResource::MakeGL(
-        gpu_mailbox, GL_LINEAR, GL_TEXTURE_2D, sync_token, size,
-        false /* is_overlay_candidate */);
-    gl_resource.format = format;
-    return gl_resource;
-  }
-
-  ResourceId MakeGpuResourceAndSendToDisplay(
-      GLuint filter,
-      GLuint target,
-      const gpu::SyncToken& sync_token,
-      DisplayResourceProvider* resource_provider) {
-    ReturnCallback return_callback = base::DoNothing();
-
-    int child = resource_provider->CreateChild(return_callback, SurfaceId());
-
-    gpu::Mailbox gpu_mailbox = gpu::Mailbox::Generate();
-    constexpr gfx::Size size(64, 64);
-    auto resource =
-        TransferableResource::MakeGL(gpu_mailbox, GL_LINEAR, target, sync_token,
-                                     size, false /* is_overlay_candidate */);
-    resource.id = ResourceId(11);
-    resource_provider->ReceiveFromChild(child, {resource});
-    auto& map = resource_provider->GetChildToParentMap(child);
-    return map.find(resource.id)->second;
-  }
-
-  gpu::SyncToken GenSyncToken() {
-    gpu::SyncToken sync_token(gpu::CommandBufferNamespace::GPU_IO,
-                              gpu::CommandBufferId::FromUnsafeValue(0x123),
-                              next_fence_sync_++);
-    sync_token.SetVerifyFlush();
-    return sync_token;
-  }
-
- protected:
-  raw_ptr<ResourceProviderGLES2Interface> gl_ = nullptr;
-  uint64_t next_fence_sync_ = 1;
-  scoped_refptr<TestContextProvider> context_provider_;
-  scoped_refptr<TestContextProvider> child_context_provider_;
-  std::unique_ptr<DisplayResourceProviderGL> resource_provider_;
-  std::unique_ptr<ClientResourceProvider> child_resource_provider_;
-};
-
-TEST_F(DisplayResourceProviderGLTest, ReadLockCountStopsReturnToChildOrDelete) {
-  MockReleaseCallback release;
-  TransferableResource tran = CreateResource(RGBA_8888);
-  ResourceId id1 = child_resource_provider_->ImportResource(
-      tran, base::BindOnce(&MockReleaseCallback::Released,
-                           base::Unretained(&release)));
-
-  std::vector<ReturnedResource> returned_to_child;
-  int child_id = resource_provider_->CreateChild(
-      GetReturnCallback(&returned_to_child), SurfaceId());
-  {
-    // Transfer some resources to the parent.
-    std::vector<TransferableResource> list;
-    child_resource_provider_->PrepareSendToParent(
-        {id1}, &list,
-        static_cast<RasterContextProvider*>(child_context_provider_.get()));
-    ASSERT_EQ(1u, list.size());
-    EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id1));
-
-    resource_provider_->ReceiveFromChild(child_id, list);
-
-    // In DisplayResourceProvider's namespace, use the mapped resource id.
-    std::unordered_map<ResourceId, ResourceId, ResourceIdHasher> resource_map =
-        resource_provider_->GetChildToParentMap(child_id);
-    ResourceId mapped_resource_id = resource_map[list[0].id];
-    resource_provider_->WaitSyncToken(mapped_resource_id);
-    DisplayResourceProviderGL::ScopedReadLockGL lock(resource_provider_.get(),
-                                                     mapped_resource_id);
-
-    resource_provider_->DeclareUsedResourcesFromChild(child_id,
-                                                      ResourceIdSet());
-    EXPECT_EQ(0u, returned_to_child.size());
-  }
-
-  EXPECT_EQ(1u, returned_to_child.size());
-  child_resource_provider_->ReceiveReturnsFromParent(
-      std::move(returned_to_child));
-
-  // No need to wait for the sync token here -- it will be returned to the
-  // client on delete.
-  {
-    EXPECT_CALL(release, Released(_, _));
-    child_resource_provider_->RemoveImportedResource(id1);
-  }
-
-  resource_provider_->DestroyChild(child_id);
-}
-
-class TestFence : public ResourceFence {
- public:
-  TestFence() = default;
-
-  // ResourceFence implementation.
-  void Set() override {}
-  bool HasPassed() override { return passed; }
-
-  bool passed = false;
-
- private:
-  ~TestFence() override = default;
-};
-
-TEST_F(DisplayResourceProviderGLTest, ReadLockFenceStopsReturnToChildOrDelete) {
-  MockReleaseCallback release;
-  TransferableResource tran1 = CreateResource(RGBA_8888);
-  tran1.synchronization_type =
-      TransferableResource::SynchronizationType::kGpuCommandsCompleted;
-  ResourceId id1 = child_resource_provider_->ImportResource(
-      tran1, base::BindOnce(&MockReleaseCallback::Released,
-                            base::Unretained(&release)));
-
-  std::vector<ReturnedResource> returned_to_child;
-  int child_id = resource_provider_->CreateChild(
-      GetReturnCallback(&returned_to_child), SurfaceId());
-
-  // Transfer some resources to the parent.
-  std::vector<TransferableResource> list;
-  child_resource_provider_->PrepareSendToParent(
-      {id1}, &list,
-      static_cast<RasterContextProvider*>(child_context_provider_.get()));
-  ASSERT_EQ(1u, list.size());
-  EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id1));
-  EXPECT_EQ(list[0].synchronization_type,
-            TransferableResource::SynchronizationType::kGpuCommandsCompleted);
-
-  resource_provider_->ReceiveFromChild(child_id, list);
-
-  // In DisplayResourceProvider's namespace, use the mapped resource id.
-  std::unordered_map<ResourceId, ResourceId, ResourceIdHasher> resource_map =
-      resource_provider_->GetChildToParentMap(child_id);
-
-  scoped_refptr<TestFence> fence(new TestFence);
-  resource_provider_->SetReadLockFence(fence.get());
-  {
-    ResourceId parent_id = resource_map[list.front().id];
-    resource_provider_->WaitSyncToken(parent_id);
-    DisplayResourceProviderGL::ScopedReadLockGL lock(resource_provider_.get(),
-                                                     parent_id);
-  }
-  resource_provider_->DeclareUsedResourcesFromChild(child_id, ResourceIdSet());
-  EXPECT_EQ(0u, returned_to_child.size());
-
-  resource_provider_->DeclareUsedResourcesFromChild(child_id, ResourceIdSet());
-  EXPECT_EQ(0u, returned_to_child.size());
-  fence->passed = true;
-
-  resource_provider_->DeclareUsedResourcesFromChild(child_id, ResourceIdSet());
-  EXPECT_EQ(1u, returned_to_child.size());
-
-  child_resource_provider_->ReceiveReturnsFromParent(
-      std::move(returned_to_child));
-  EXPECT_CALL(release, Released(_, _));
-  child_resource_provider_->RemoveImportedResource(id1);
-}
-
-TEST_F(DisplayResourceProviderGLTest, ReadLockFenceDestroyChild) {
-  MockReleaseCallback release;
-
-  TransferableResource tran1 = CreateResource(RGBA_8888);
-  tran1.synchronization_type =
-      TransferableResource::SynchronizationType::kGpuCommandsCompleted;
-  ResourceId id1 = child_resource_provider_->ImportResource(
-      tran1, base::BindOnce(&MockReleaseCallback::Released,
-                            base::Unretained(&release)));
-
-  TransferableResource tran2 = CreateResource(RGBA_8888);
-  ASSERT_EQ(tran2.synchronization_type,
-            TransferableResource::SynchronizationType::kSyncToken);
-  ResourceId id2 = child_resource_provider_->ImportResource(
-      tran2, base::BindOnce(&MockReleaseCallback::Released,
-                            base::Unretained(&release)));
-
-  std::vector<ReturnedResource> returned_to_child;
-  int child_id = resource_provider_->CreateChild(
-      GetReturnCallback(&returned_to_child), SurfaceId());
-
-  // Transfer resources to the parent.
-  std::vector<TransferableResource> list;
-  child_resource_provider_->PrepareSendToParent(
-      {id1, id2}, &list,
-      static_cast<RasterContextProvider*>(child_context_provider_.get()));
-  ASSERT_EQ(2u, list.size());
-  EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id1));
-  EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id2));
-
-  resource_provider_->ReceiveFromChild(child_id, list);
-
-  // In DisplayResourceProvider's namespace, use the mapped resource id.
-  std::unordered_map<ResourceId, ResourceId, ResourceIdHasher> resource_map =
-      resource_provider_->GetChildToParentMap(child_id);
-
-  scoped_refptr<TestFence> fence(new TestFence);
-  resource_provider_->SetReadLockFence(fence.get());
-  {
-    for (auto& resource : list) {
-      ResourceId parent_id = resource_map[resource.id];
-      resource_provider_->WaitSyncToken(parent_id);
-      DisplayResourceProviderGL::ScopedReadLockGL lock(resource_provider_.get(),
-                                                       parent_id);
-    }
-  }
-  EXPECT_EQ(0u, returned_to_child.size());
-
-  EXPECT_EQ(2u, resource_provider_->num_resources());
-
-  resource_provider_->DestroyChild(child_id);
-
-  EXPECT_EQ(0u, resource_provider_->num_resources());
-  EXPECT_EQ(2u, returned_to_child.size());
-
-  // id1 should be lost and id2 should not.
-  EXPECT_EQ(returned_to_child[0].lost, returned_to_child[0].id == id1);
-  EXPECT_EQ(returned_to_child[1].lost, returned_to_child[1].id == id1);
-
-  child_resource_provider_->ReceiveReturnsFromParent(
-      std::move(returned_to_child));
-  EXPECT_CALL(release, Released(_, _)).Times(2);
-  child_resource_provider_->RemoveImportedResource(id1);
-  child_resource_provider_->RemoveImportedResource(id2);
-}
-
-// Test that ScopedBatchReturnResources batching works.
-TEST_F(DisplayResourceProviderGLTest,
-       ScopedBatchReturnResourcesPreventsReturn) {
-  MockReleaseCallback release;
-
-  std::vector<ReturnedResource> returned_to_child;
-  int child_id = resource_provider_->CreateChild(
-      GetReturnCallback(&returned_to_child), SurfaceId());
-
-  // Transfer some resources to the parent.
-  constexpr size_t kTotalResources = 5;
-  constexpr size_t kLockedResources = 3;
-  constexpr size_t kUsedResources = 4;
-  ResourceId ids[kTotalResources];
-  for (auto& id : ids) {
-    TransferableResource tran = CreateResource(RGBA_8888);
-    id = child_resource_provider_->ImportResource(
-        tran, base::BindOnce(&MockReleaseCallback::Released,
-                             base::Unretained(&release)));
-  }
-  std::vector<ResourceId> resource_ids_to_transfer(ids, ids + kTotalResources);
-
-  std::vector<TransferableResource> list;
-  child_resource_provider_->PrepareSendToParent(
-      resource_ids_to_transfer, &list,
-      static_cast<RasterContextProvider*>(child_context_provider_.get()));
-  ASSERT_EQ(kTotalResources, list.size());
-  for (const auto& id : ids)
-    EXPECT_TRUE(child_resource_provider_->InUseByConsumer(id));
-
-  resource_provider_->ReceiveFromChild(child_id, list);
-
-  // In DisplayResourceProvider's namespace, use the mapped resource id.
-  std::unordered_map<ResourceId, ResourceId, ResourceIdHasher> resource_map =
-      resource_provider_->GetChildToParentMap(child_id);
-  std::vector<std::unique_ptr<DisplayResourceProviderGL::ScopedReadLockGL>>
-      read_locks;
-  for (size_t i = 0; i < kLockedResources; i++) {
-    ResourceId mapped_resource_id = resource_map[ids[i]];
-    resource_provider_->WaitSyncToken(mapped_resource_id);
-    read_locks.push_back(
-        std::make_unique<DisplayResourceProviderGL::ScopedReadLockGL>(
-            resource_provider_.get(), mapped_resource_id));
-  }
-
-  // Mark all locked resources, and one unlocked resource as used for first
-  // batch.
-  {
-    DisplayResourceProviderGL::ScopedBatchReturnResources returner(
-        resource_provider_.get());
-    resource_provider_->DeclareUsedResourcesFromChild(
-        child_id, ResourceIdSet(ids, ids + kUsedResources));
-    EXPECT_EQ(0u, returned_to_child.size());
-  }
-  EXPECT_EQ(1u, returned_to_child.size());
-  child_resource_provider_->ReceiveReturnsFromParent(
-      std::move(returned_to_child));
-  returned_to_child.clear();
-
-  // Return all locked resources.
-  {
-    DisplayResourceProviderGL::ScopedBatchReturnResources returner(
-        resource_provider_.get());
-    resource_provider_->DeclareUsedResourcesFromChild(
-        child_id, ResourceIdSet(ids + kLockedResources, ids + kUsedResources));
-    // Can be called multiple times while batching is enabled.  This happens in
-    // practice when the same surface is visited using different paths during
-    // surface aggregation.
-    resource_provider_->DeclareUsedResourcesFromChild(
-        child_id, ResourceIdSet(ids + kLockedResources, ids + kUsedResources));
-    read_locks.clear();
-    EXPECT_EQ(0u, returned_to_child.size());
-  }
-  EXPECT_EQ(kLockedResources, returned_to_child.size());
-  // Returned resources that were locked share the same sync token.
-  for (const auto& resource : returned_to_child)
-    EXPECT_EQ(resource.sync_token, returned_to_child[0].sync_token);
-
-  child_resource_provider_->ReceiveReturnsFromParent(
-      std::move(returned_to_child));
-  returned_to_child.clear();
-
-  // Returns from destroying the child is also batched.
-  {
-    DisplayResourceProviderGL::ScopedBatchReturnResources returner(
-        resource_provider_.get());
-    resource_provider_->DestroyChild(child_id);
-    EXPECT_EQ(0u, returned_to_child.size());
-  }
-  EXPECT_EQ(1u, returned_to_child.size());
-  child_resource_provider_->ReceiveReturnsFromParent(
-      std::move(returned_to_child));
-  returned_to_child.clear();
-
-  EXPECT_CALL(release, Released(_, _)).Times(kTotalResources);
-  for (const auto& id : ids)
-    child_resource_provider_->RemoveImportedResource(id);
-}
-
-class TextureStateTrackingGLES2Interface : public TestGLES2Interface {
- public:
-  MOCK_METHOD2(BindTexture, void(GLenum target, GLuint texture));
-  MOCK_METHOD3(TexParameteri, void(GLenum target, GLenum pname, GLint param));
-  MOCK_METHOD1(WaitSyncTokenCHROMIUM, void(const GLbyte* sync_token));
-  MOCK_METHOD1(CreateAndConsumeTextureCHROMIUM,
-               unsigned(const GLbyte* mailbox));
-
-  // Force all textures to be consecutive numbers starting at "1",
-  // so we easily can test for them.
-  GLuint NextTextureId() override { return next_texture_id_++; }
-
-  void RetireTextureId(GLuint) override {}
-};
-
-class ResourceProviderTestImportedResourceGLFilters {
- public:
-  static void RunTest(bool mailbox_nearest_neighbor, GLenum sampler_filter) {
-    auto gl_owned = std::make_unique<TextureStateTrackingGLES2Interface>();
-    TextureStateTrackingGLES2Interface* gl = gl_owned.get();
-    auto context_provider = TestContextProvider::Create(std::move(gl_owned));
-    context_provider->BindToCurrentThread();
-
-    auto resource_provider =
-        std::make_unique<DisplayResourceProviderGL>(context_provider.get());
-
-    auto child_gl_owned =
-        std::make_unique<TextureStateTrackingGLES2Interface>();
-    TextureStateTrackingGLES2Interface* child_gl = child_gl_owned.get();
-    auto child_context_provider =
-        TestContextProvider::Create(std::move(child_gl_owned));
-    child_context_provider->BindToCurrentThread();
-
-    auto child_resource_provider = std::make_unique<ClientResourceProvider>();
-
-    unsigned texture_id = 1;
-    gpu::SyncToken sync_token(gpu::CommandBufferNamespace::GPU_IO,
-                              gpu::CommandBufferId::FromUnsafeValue(0x12),
-                              0x34);
-
-    EXPECT_CALL(*child_gl, BindTexture(_, _)).Times(0);
-    EXPECT_CALL(*child_gl, WaitSyncTokenCHROMIUM(_)).Times(0);
-    EXPECT_CALL(*child_gl, CreateAndConsumeTextureCHROMIUM(_)).Times(0);
-
-    gpu::Mailbox gpu_mailbox = gpu::Mailbox::Generate();
-    GLuint filter = mailbox_nearest_neighbor ? GL_NEAREST : GL_LINEAR;
-    constexpr gfx::Size size(64, 64);
-    auto resource = TransferableResource::MakeGL(
-        gpu_mailbox, filter, GL_TEXTURE_2D, sync_token, size,
-        false /* is_overlay_candidate */);
-
-    MockReleaseCallback release;
-    ResourceId resource_id = child_resource_provider->ImportResource(
-        resource, base::BindOnce(&MockReleaseCallback::Released,
-                                 base::Unretained(&release)));
-    EXPECT_NE(kInvalidResourceId, resource_id);
-
-    testing::Mock::VerifyAndClearExpectations(child_gl);
-
-    // Transfer resources to the parent.
-    std::vector<TransferableResource> send_to_parent;
-    std::vector<ReturnedResource> returned_to_child;
-    int child_id = resource_provider->CreateChild(
-        base::BindRepeating(&CollectResources, &returned_to_child),
-        SurfaceId());
-    child_resource_provider->PrepareSendToParent(
-        {resource_id}, &send_to_parent,
-        static_cast<RasterContextProvider*>(child_context_provider.get()));
-    resource_provider->ReceiveFromChild(child_id, send_to_parent);
-
-    // In DisplayResourceProvider's namespace, use the mapped resource id.
-    std::unordered_map<ResourceId, ResourceId, ResourceIdHasher> resource_map =
-        resource_provider->GetChildToParentMap(child_id);
-    ResourceId mapped_resource_id = resource_map[resource_id];
-    {
-      // The verified flush flag will be set by
-      // ClientResourceProvider::PrepareSendToParent. Before checking if
-      // the gpu::SyncToken matches, set this flag first.
-      sync_token.SetVerifyFlush();
-
-      // Mailbox sync point WaitSyncToken before using the texture.
-      EXPECT_CALL(*gl, WaitSyncTokenCHROMIUM(MatchesSyncToken(sync_token)));
-      resource_provider->WaitSyncToken(mapped_resource_id);
-      testing::Mock::VerifyAndClearExpectations(gl);
-
-      EXPECT_CALL(*gl, CreateAndConsumeTextureCHROMIUM(_))
-          .WillOnce(Return(texture_id));
-      EXPECT_CALL(*gl, BindTexture(GL_TEXTURE_2D, texture_id));
-
-      // The sampler will reset these if |mailbox_nearest_neighbor| does not
-      // match |sampler_filter|.
-      if (mailbox_nearest_neighbor != (sampler_filter == GL_NEAREST)) {
-        EXPECT_CALL(*gl, TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
-                                       sampler_filter));
-        EXPECT_CALL(*gl, TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
-                                       sampler_filter));
-      }
-
-      DisplayResourceProviderGL::ScopedSamplerGL lock(
-          resource_provider.get(), mapped_resource_id, sampler_filter);
-      testing::Mock::VerifyAndClearExpectations(gl);
-
-      // When done with it, a sync point should be inserted, but no produce is
-      // necessary.
-      EXPECT_CALL(*child_gl, WaitSyncTokenCHROMIUM(_)).Times(0);
-      EXPECT_CALL(*child_gl, CreateAndConsumeTextureCHROMIUM(_)).Times(0);
-    }
-
-    EXPECT_EQ(0u, returned_to_child.size());
-    // Transfer resources back from the parent to the child. Set no resources as
-    // being in use.
-    resource_provider->DeclareUsedResourcesFromChild(child_id, ResourceIdSet());
-    EXPECT_EQ(1u, returned_to_child.size());
-    child_resource_provider->ReceiveReturnsFromParent(
-        std::move(returned_to_child));
-
-    gpu::SyncToken released_sync_token;
-    {
-      EXPECT_CALL(release, Released(_, false))
-          .WillOnce(SaveArg<0>(&released_sync_token));
-      child_resource_provider->RemoveImportedResource(resource_id);
-    }
-    EXPECT_TRUE(released_sync_token.HasData());
-  }
-};
-
-TEST_F(DisplayResourceProviderGLTest, ReceiveGLTexture2D_LinearToLinear) {
-  ResourceProviderTestImportedResourceGLFilters::RunTest(false, GL_LINEAR);
-}
-
-TEST_F(DisplayResourceProviderGLTest, ReceiveGLTexture2D_NearestToNearest) {
-  ResourceProviderTestImportedResourceGLFilters::RunTest(true, GL_NEAREST);
-}
-
-TEST_F(DisplayResourceProviderGLTest, ReceiveGLTexture2D_NearestToLinear) {
-  ResourceProviderTestImportedResourceGLFilters::RunTest(true, GL_LINEAR);
-}
-
-TEST_F(DisplayResourceProviderGLTest, ReceiveGLTexture2D_LinearToNearest) {
-  ResourceProviderTestImportedResourceGLFilters::RunTest(false, GL_NEAREST);
-}
-
-TEST_F(DisplayResourceProviderGLTest, ReceiveGLTextureExternalOES) {
-  auto gl_owned = std::make_unique<TextureStateTrackingGLES2Interface>();
-  TextureStateTrackingGLES2Interface* gl = gl_owned.get();
-  auto context_provider = TestContextProvider::Create(std::move(gl_owned));
-  context_provider->BindToCurrentThread();
-
-  auto resource_provider =
-      std::make_unique<DisplayResourceProviderGL>(context_provider.get());
-
-  auto child_gl_owned = std::make_unique<TextureStateTrackingGLES2Interface>();
-  TextureStateTrackingGLES2Interface* child_gl = child_gl_owned.get();
-  auto child_context_provider =
-      TestContextProvider::Create(std::move(child_gl_owned));
-  child_context_provider->BindToCurrentThread();
-
-  auto child_resource_provider = std::make_unique<ClientResourceProvider>();
-
-  gpu::SyncToken sync_token(gpu::CommandBufferNamespace::GPU_IO,
-                            gpu::CommandBufferId::FromUnsafeValue(0x12), 0x34);
-
-  EXPECT_CALL(*child_gl, BindTexture(_, _)).Times(0);
-  EXPECT_CALL(*child_gl, WaitSyncTokenCHROMIUM(_)).Times(0);
-  EXPECT_CALL(*child_gl, CreateAndConsumeTextureCHROMIUM(_)).Times(0);
-
-  gpu::Mailbox gpu_mailbox = gpu::Mailbox::Generate();
-  ReleaseCallback callback = base::DoNothing();
-
-  constexpr gfx::Size size(64, 64);
-  auto resource = TransferableResource::MakeGL(
-      gpu_mailbox, GL_LINEAR, GL_TEXTURE_EXTERNAL_OES, sync_token, size,
-      false /* is_overlay_candidate */);
-
-  ResourceId resource_id =
-      child_resource_provider->ImportResource(resource, std::move(callback));
-  EXPECT_NE(kInvalidResourceId, resource_id);
-
-  testing::Mock::VerifyAndClearExpectations(child_gl);
-
-  // Transfer resources to the parent.
-  std::vector<TransferableResource> send_to_parent;
-  std::vector<ReturnedResource> returned_to_child;
-  int child_id = resource_provider->CreateChild(
-      base::BindRepeating(&CollectResources, &returned_to_child), SurfaceId());
-  child_resource_provider->PrepareSendToParent(
-      {resource_id}, &send_to_parent,
-      static_cast<RasterContextProvider*>(child_context_provider_.get()));
-  resource_provider->ReceiveFromChild(child_id, send_to_parent);
-
-  // Before create DrawQuad in DisplayResourceProvider's namespace, get the
-  // mapped resource id first.
-  std::unordered_map<ResourceId, ResourceId, ResourceIdHasher> resource_map =
-      resource_provider->GetChildToParentMap(child_id);
-  ResourceId mapped_resource_id = resource_map[resource_id];
-  {
-    // The verified flush flag will be set by
-    // ClientResourceProvider::PrepareSendToParent. Before checking if
-    // the gpu::SyncToken matches, set this flag first.
-    sync_token.SetVerifyFlush();
-
-    // Mailbox sync point WaitSyncToken before using the texture.
-    EXPECT_CALL(*gl, WaitSyncTokenCHROMIUM(MatchesSyncToken(sync_token)));
-    resource_provider->WaitSyncToken(mapped_resource_id);
-    testing::Mock::VerifyAndClearExpectations(gl);
-
-    unsigned texture_id = 1;
-
-    EXPECT_CALL(*gl, CreateAndConsumeTextureCHROMIUM(_))
-        .WillOnce(Return(texture_id));
-
-    DisplayResourceProviderGL::ScopedReadLockGL lock(resource_provider.get(),
-                                                     mapped_resource_id);
-    testing::Mock::VerifyAndClearExpectations(gl);
-
-    // When done with it, a sync point should be inserted, but no produce is
-    // necessary.
-    EXPECT_CALL(*gl, WaitSyncTokenCHROMIUM(_)).Times(0);
-    EXPECT_CALL(*gl, CreateAndConsumeTextureCHROMIUM(_)).Times(0);
-    testing::Mock::VerifyAndClearExpectations(gl);
-  }
-  EXPECT_EQ(0u, returned_to_child.size());
-  // Transfer resources back from the parent to the child. Set no resources as
-  // being in use.
-  resource_provider->DeclareUsedResourcesFromChild(child_id, ResourceIdSet());
-  EXPECT_EQ(1u, returned_to_child.size());
-  child_resource_provider->ReceiveReturnsFromParent(
-      std::move(returned_to_child));
-
-  child_resource_provider->RemoveImportedResource(resource_id);
-}
-
-TEST_F(DisplayResourceProviderGLTest, WaitSyncTokenIfNeeded) {
-  auto gl_owned = std::make_unique<TextureStateTrackingGLES2Interface>();
-  TextureStateTrackingGLES2Interface* gl = gl_owned.get();
-  auto context_provider = TestContextProvider::Create(std::move(gl_owned));
-  context_provider->BindToCurrentThread();
-
-  auto resource_provider =
-      std::make_unique<DisplayResourceProviderGL>(context_provider.get());
-
-  EXPECT_CALL(*gl, BindTexture(_, _)).Times(0);
-  EXPECT_CALL(*gl, WaitSyncTokenCHROMIUM(_)).Times(0);
-  EXPECT_CALL(*gl, CreateAndConsumeTextureCHROMIUM(_)).Times(0);
-
-  gpu::SyncToken sync_token(gpu::CommandBufferNamespace::GPU_IO,
-                            gpu::CommandBufferId::FromUnsafeValue(0x12), 0x34);
-  ResourceId id_with_sync = MakeGpuResourceAndSendToDisplay(
-      GL_LINEAR, GL_TEXTURE_2D, sync_token, resource_provider.get());
-  ResourceId id_without_sync = MakeGpuResourceAndSendToDisplay(
-      GL_LINEAR, GL_TEXTURE_2D, gpu::SyncToken(), resource_provider.get());
-
-  // First call to WaitSyncToken should call WaitSyncToken, but only if a
-  // SyncToken was present.
-  {
-    EXPECT_CALL(*gl, WaitSyncTokenCHROMIUM(MatchesSyncToken(sync_token)))
-        .Times(1);
-    resource_provider->WaitSyncToken(id_with_sync);
-    EXPECT_CALL(*gl, WaitSyncTokenCHROMIUM(_)).Times(0);
-    resource_provider->WaitSyncToken(id_without_sync);
-  }
-
-  {
-    // Subsequent calls to WaitSyncToken shouldn't call WaitSyncToken.
-    EXPECT_CALL(*gl, WaitSyncTokenCHROMIUM(_)).Times(0);
-    resource_provider->WaitSyncToken(id_with_sync);
-    resource_provider->WaitSyncToken(id_without_sync);
-  }
-}
-
-}  // namespace
-}  // namespace viz
diff --git a/components/viz/service/display/display_unittest.cc b/components/viz/service/display/display_unittest.cc
index 9c0a5087..7175b9ef 100644
--- a/components/viz/service/display/display_unittest.cc
+++ b/components/viz/service/display/display_unittest.cc
@@ -4333,10 +4333,7 @@
   void SetUp() override { EnablePrediction(); }
 
   void SetUpRenderers() {
-    // First set up the display to use the Skia renderer.
-    RendererSettings settings;
-    settings.use_skia_renderer = true;
-    SetUpGpuDisplay(settings);
+    SetUpGpuDisplay(RendererSettings());
 
     // Initialize the renderer and create an ink renderer.
     display_->Initialize(&client_, manager_.surface_manager());
@@ -4859,9 +4856,7 @@
           features::kUsePlatformDelegatedInk);
 
       // Set up the display to use the Skia renderer.
-      RendererSettings settings;
-      settings.use_skia_renderer = true;
-      SetUpGpuDisplaySkiaWithPlatformInk(settings);
+      SetUpGpuDisplaySkiaWithPlatformInk(RendererSettings());
 
       display_->Initialize(&client_, manager_.surface_manager());
     }
diff --git a/components/viz/service/display/dynamic_geometry_binding.cc b/components/viz/service/display/dynamic_geometry_binding.cc
deleted file mode 100644
index bb47dba..0000000
--- a/components/viz/service/display/dynamic_geometry_binding.cc
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2015 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 "components/viz/service/display/dynamic_geometry_binding.h"
-
-#include <stdint.h>
-
-#include "gpu/command_buffer/client/gles2_interface.h"
-#include "ui/gfx/geometry/quad_f.h"
-#include "ui/gfx/geometry/rect_f.h"
-
-namespace viz {
-
-DynamicGeometryBinding::DynamicGeometryBinding(gpu::gles2::GLES2Interface* gl)
-    : gl_(gl), quad_vertices_vbo_(0), quad_elements_vbo_(0) {
-  GLuint buffers[2];
-  gl_->GenBuffers(2, buffers);
-  quad_vertices_vbo_ = buffers[0];
-  quad_elements_vbo_ = buffers[1];
-
-  gl_->BindBuffer(GL_ARRAY_BUFFER, quad_vertices_vbo_);
-  gl_->BufferData(GL_ARRAY_BUFFER, sizeof(GeometryBindingQuad), nullptr,
-                  GL_DYNAMIC_DRAW);
-
-  gl_->BindBuffer(GL_ELEMENT_ARRAY_BUFFER, quad_elements_vbo_);
-  gl_->BufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GeometryBindingQuadIndex),
-                  nullptr, GL_DYNAMIC_DRAW);
-}
-
-DynamicGeometryBinding::~DynamicGeometryBinding() {
-  GLuint buffers[2] = {quad_vertices_vbo_, quad_elements_vbo_};
-  gl_->DeleteBuffers(2, buffers);
-}
-
-void DynamicGeometryBinding::InitializeCustomQuad(const gfx::QuadF& quad) {
-  float uv[] = {0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f};
-  InitializeCustomQuadWithUVs(quad, uv);
-}
-
-void DynamicGeometryBinding::InitializeCustomQuadWithUVs(const gfx::QuadF& quad,
-                                                         const float uv[8]) {
-  GeometryBindingVertex v0 = {
-      {quad.p1().x(), quad.p1().y(), 0.0f}, {uv[0], uv[1]}, 0.0f};
-  GeometryBindingVertex v1 = {
-      {quad.p2().x(), quad.p2().y(), 0.0f}, {uv[2], uv[3]}, 1.0f};
-  GeometryBindingVertex v2 = {
-      {quad.p3().x(), quad.p3().y(), 0.0f}, {uv[4], uv[5]}, 2.0f};
-  GeometryBindingVertex v3 = {
-      {quad.p4().x(), quad.p4().y(), 0.0f}, {uv[6], uv[7]}, 3.0f};
-
-  GeometryBindingQuad local_quad = {v0, v1, v2, v3};
-  GeometryBindingQuadIndex quad_index(
-      static_cast<uint16_t>(0), static_cast<uint16_t>(1),
-      static_cast<uint16_t>(2), static_cast<uint16_t>(3),
-      static_cast<uint16_t>(0), static_cast<uint16_t>(2));
-
-  gl_->BufferSubData(GL_ARRAY_BUFFER, 0, sizeof(GeometryBindingQuad),
-                     &local_quad);
-  gl_->BufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0,
-                     sizeof(GeometryBindingQuadIndex), &quad_index);
-}
-
-void DynamicGeometryBinding::PrepareForDraw() {
-  SetupGLContext(gl_, quad_elements_vbo_, quad_vertices_vbo_);
-}
-
-}  // namespace viz
diff --git a/components/viz/service/display/dynamic_geometry_binding.h b/components/viz/service/display/dynamic_geometry_binding.h
deleted file mode 100644
index 2d34096..0000000
--- a/components/viz/service/display/dynamic_geometry_binding.h
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2015 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 COMPONENTS_VIZ_SERVICE_DISPLAY_DYNAMIC_GEOMETRY_BINDING_H_
-#define COMPONENTS_VIZ_SERVICE_DISPLAY_DYNAMIC_GEOMETRY_BINDING_H_
-
-#include "base/memory/raw_ptr.h"
-#include "components/viz/service/display/geometry_binding.h"
-#include "components/viz/service/viz_service_export.h"
-
-namespace gfx {
-class QuadF;
-}
-
-namespace viz {
-
-class VIZ_SERVICE_EXPORT DynamicGeometryBinding {
- public:
-  explicit DynamicGeometryBinding(gpu::gles2::GLES2Interface* gl);
-
-  DynamicGeometryBinding(const DynamicGeometryBinding&) = delete;
-  DynamicGeometryBinding& operator=(const DynamicGeometryBinding&) = delete;
-
-  ~DynamicGeometryBinding();
-
-  void PrepareForDraw();
-  void InitializeCustomQuad(const gfx::QuadF& quad);
-  void InitializeCustomQuadWithUVs(const gfx::QuadF& quad, const float uv[8]);
-
- private:
-  raw_ptr<gpu::gles2::GLES2Interface> gl_;
-
-  GLuint quad_vertices_vbo_;
-  GLuint quad_elements_vbo_;
-};
-
-}  // namespace viz
-
-#endif  // COMPONENTS_VIZ_SERVICE_DISPLAY_DYNAMIC_GEOMETRY_BINDING_H_
diff --git a/components/viz/service/display/geometry_binding.cc b/components/viz/service/display/geometry_binding.cc
deleted file mode 100644
index e2013e1..0000000
--- a/components/viz/service/display/geometry_binding.cc
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright 2011 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 "components/viz/service/display/geometry_binding.h"
-
-#include <stdint.h>
-#include <string.h>
-
-#include "gpu/command_buffer/client/gles2_interface.h"
-#include "ui/gfx/geometry/rect_f.h"
-
-namespace viz {
-
-void SetupGLContext(gpu::gles2::GLES2Interface* gl,
-                    GLuint quad_elements_vbo,
-                    GLuint quad_vertices_vbo) {
-  gl->BindBuffer(GL_ELEMENT_ARRAY_BUFFER, quad_elements_vbo);
-
-  gl->BindBuffer(GL_ARRAY_BUFFER, quad_vertices_vbo);
-  // OpenGL defines the last parameter to VertexAttribPointer as type
-  // "const GLvoid*" even though it is actually an offset into the buffer
-  // object's data store and not a pointer to the client's address space.
-  const void* offsets[3] = {
-      nullptr, reinterpret_cast<const void*>(3 * sizeof(float)),
-      reinterpret_cast<const void*>(5 * sizeof(float)),
-  };
-
-  gl->VertexAttribPointer(GeometryBinding::PositionAttribLocation(), 3,
-                          GL_FLOAT, false, 6 * sizeof(float), offsets[0]);
-  gl->VertexAttribPointer(GeometryBinding::TexCoordAttribLocation(), 2,
-                          GL_FLOAT, false, 6 * sizeof(float), offsets[1]);
-  gl->VertexAttribPointer(GeometryBinding::TriangleIndexAttribLocation(), 1,
-                          GL_FLOAT, false, 6 * sizeof(float), offsets[2]);
-  gl->EnableVertexAttribArray(GeometryBinding::PositionAttribLocation());
-  gl->EnableVertexAttribArray(GeometryBinding::TexCoordAttribLocation());
-  gl->EnableVertexAttribArray(GeometryBinding::TriangleIndexAttribLocation());
-}
-
-GeometryBindingQuad::GeometryBindingQuad() {
-  v0 = {{0, 0, 0}, {0, 0}, 0};
-  v1 = {{0, 0, 0}, {0, 0}, 0};
-  v2 = {{0, 0, 0}, {0, 0}, 0};
-  v3 = {{0, 0, 0}, {0, 0}, 0};
-}
-
-GeometryBindingQuad::GeometryBindingQuad(const GeometryBindingVertex& vert0,
-                                         const GeometryBindingVertex& vert1,
-                                         const GeometryBindingVertex& vert2,
-                                         const GeometryBindingVertex& vert3) {
-  v0 = vert0;
-  v1 = vert1;
-  v2 = vert2;
-  v3 = vert3;
-}
-
-GeometryBindingQuadIndex::GeometryBindingQuadIndex() {
-  memset(data, 0x0, sizeof(data));
-}
-
-GeometryBindingQuadIndex::GeometryBindingQuadIndex(uint16_t index0,
-                                                   uint16_t index1,
-                                                   uint16_t index2,
-                                                   uint16_t index3,
-                                                   uint16_t index4,
-                                                   uint16_t index5) {
-  data[0] = index0;
-  data[1] = index1;
-  data[2] = index2;
-  data[3] = index3;
-  data[4] = index4;
-  data[5] = index5;
-}
-
-}  // namespace viz
diff --git a/components/viz/service/display/geometry_binding.h b/components/viz/service/display/geometry_binding.h
deleted file mode 100644
index 64bdf0b..0000000
--- a/components/viz/service/display/geometry_binding.h
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2011 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 COMPONENTS_VIZ_SERVICE_DISPLAY_GEOMETRY_BINDING_H_
-#define COMPONENTS_VIZ_SERVICE_DISPLAY_GEOMETRY_BINDING_H_
-
-#include <stdint.h>
-
-#include "gpu/command_buffer/client/gles2_interface.h"
-#include "third_party/khronos/GLES2/gl2.h"
-#include "third_party/khronos/GLES2/gl2ext.h"
-#include "ui/gfx/geometry/rect_f.h"
-
-namespace viz {
-
-struct GeometryBindingVertex {
-  float a_position[3];
-  float a_texCoord[2];
-  // Index of the vertex, divide by 4 to have the matrix for this quad.
-  float a_index;
-};
-
-struct GeometryBindingQuad {
-  GeometryBindingQuad();
-  GeometryBindingQuad(const GeometryBindingVertex& vert0,
-                      const GeometryBindingVertex& vert1,
-                      const GeometryBindingVertex& vert2,
-                      const GeometryBindingVertex& vert3);
-  GeometryBindingVertex v0, v1, v2, v3;
-};
-static_assert(sizeof(GeometryBindingQuad) == 24 * sizeof(float),
-              "struct Quad should be densely packed");
-
-struct GeometryBindingQuadIndex {
-  GeometryBindingQuadIndex();
-  GeometryBindingQuadIndex(uint16_t index0,
-                           uint16_t index1,
-                           uint16_t index2,
-                           uint16_t index3,
-                           uint16_t index4,
-                           uint16_t index5);
-
-  uint16_t data[6];
-};
-static_assert(sizeof(GeometryBindingQuadIndex) == 6 * sizeof(uint16_t),
-              "struct QuadIndex should be densely packed");
-
-struct GeometryBinding {
-  // All layer shaders share the same attribute locations for the vertex
-  // positions and texture coordinates. This allows switching shaders without
-  // rebinding attribute arrays.
-  static int PositionAttribLocation() { return 0; }
-  static int TexCoordAttribLocation() { return 1; }
-  static int TriangleIndexAttribLocation() { return 2; }
-};
-
-void SetupGLContext(gpu::gles2::GLES2Interface* gl,
-                    GLuint quad_elements_vbo,
-                    GLuint quad_vertices_vbo);
-
-}  // namespace viz
-
-#endif  // COMPONENTS_VIZ_SERVICE_DISPLAY_GEOMETRY_BINDING_H_
diff --git a/components/viz/service/display/gl_renderer.cc b/components/viz/service/display/gl_renderer.cc
deleted file mode 100644
index e0a8510..0000000
--- a/components/viz/service/display/gl_renderer.cc
+++ /dev/null
@@ -1,4505 +0,0 @@
-// Copyright 2010 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 "components/viz/service/display/gl_renderer.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <algorithm>
-#include <limits>
-#include <memory>
-#include <numeric>
-#include <set>
-#include <vector>
-
-#include "base/bind.h"
-#include "base/callback_helpers.h"
-#include "base/check_op.h"
-#include "base/containers/cxx20_erase.h"
-#include "base/feature_list.h"
-#include "base/memory/ptr_util.h"
-#include "base/memory/raw_ptr.h"
-#include "base/notreached.h"
-#include "base/strings/string_split.h"
-#include "base/strings/string_util.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "base/time/time.h"
-#include "base/trace_event/trace_event.h"
-#include "build/build_config.h"
-#include "cc/base/math_util.h"
-#include "cc/debug/debug_colors.h"
-#include "cc/paint/render_surface_filters.h"
-#include "cc/raster/scoped_gpu_raster.h"
-#include "components/viz/common/display/renderer_settings.h"
-#include "components/viz/common/features.h"
-#include "components/viz/common/frame_sinks/copy_output_request.h"
-#include "components/viz/common/gpu/context_provider.h"
-#include "components/viz/common/quads/compositor_frame.h"
-#include "components/viz/common/quads/compositor_frame_metadata.h"
-#include "components/viz/common/quads/compositor_render_pass.h"
-#include "components/viz/common/quads/picture_draw_quad.h"
-#include "components/viz/common/quads/stream_video_draw_quad.h"
-#include "components/viz/common/quads/texture_draw_quad.h"
-#include "components/viz/common/resources/platform_color.h"
-#include "components/viz/common/resources/resource_format_utils.h"
-#include "components/viz/common/resources/resource_id.h"
-#include "components/viz/common/skia_helper.h"
-#include "components/viz/common/viz_utils.h"
-#include "components/viz/service/display/draw_polygon.h"
-#include "components/viz/service/display/dynamic_geometry_binding.h"
-#include "components/viz/service/display/layer_quad.h"
-#include "components/viz/service/display/output_surface.h"
-#include "components/viz/service/display/output_surface_frame.h"
-#include "components/viz/service/display/resource_fence.h"
-#include "components/viz/service/display/scoped_render_pass_texture.h"
-#include "components/viz/service/display/static_geometry_binding.h"
-#include "components/viz/service/display/texture_deleter.h"
-#include "gpu/GLES2/gl2extchromium.h"
-#include "gpu/command_buffer/client/context_support.h"
-#include "gpu/command_buffer/client/gles2_interface.h"
-#include "gpu/command_buffer/common/gpu_memory_allocation.h"
-#include "gpu/config/gpu_driver_bug_workaround_type.h"
-#include "gpu/config/gpu_feature_info.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
-#include "third_party/skia/include/core/SkBitmap.h"
-#include "third_party/skia/include/core/SkColor.h"
-#include "third_party/skia/include/core/SkColorFilter.h"
-#include "third_party/skia/include/core/SkImage.h"
-#include "third_party/skia/include/core/SkSurface.h"
-#include "third_party/skia/include/core/SkTypes.h"
-#include "third_party/skia/include/effects/SkShaderMaskFilter.h"
-#include "third_party/skia/include/gpu/GrBackendSurface.h"
-#include "third_party/skia/include/gpu/GrDirectContext.h"
-#include "third_party/skia/include/gpu/gl/GrGLInterface.h"
-#include "third_party/skia/include/gpu/gl/GrGLTypes.h"
-#include "ui/gfx/color_space.h"
-#include "ui/gfx/color_transform.h"
-#include "ui/gfx/geometry/quad_f.h"
-#include "ui/gfx/geometry/rect.h"
-#include "ui/gfx/geometry/rect_conversions.h"
-#include "ui/gfx/geometry/rrect_f.h"
-#include "ui/gfx/geometry/size_conversions.h"
-#include "ui/gfx/geometry/skia_conversions.h"
-#include "ui/gfx/geometry/vector2d.h"
-#include "ui/gfx/gpu_fence_handle.h"
-
-using gpu::gles2::GLES2Interface;
-
-namespace viz {
-namespace {
-
-Float4 UVTransform(const TextureDrawQuad* quad) {
-  gfx::RectF uv_rect =
-      gfx::BoundingRect(quad->uv_top_left, quad->uv_bottom_right);
-  gfx::RectF visible_uv_rect = cc::MathUtil::ScaleRectProportional(
-      uv_rect, gfx::RectF(quad->rect), gfx::RectF(quad->visible_rect));
-
-  gfx::PointF uv0 = visible_uv_rect.origin();
-  gfx::PointF uv1 = visible_uv_rect.bottom_right();
-  Float4 xform = {{uv0.x(), uv0.y(), uv1.x() - uv0.x(), uv1.y() - uv0.y()}};
-  if (quad->y_flipped) {
-    xform.data[1] = 1.0f - xform.data[1];
-    xform.data[3] = -xform.data[3];
-  }
-  return xform;
-}
-
-// To prevent sampling outside the visible rect.
-Float4 UVClampRect(gfx::RectF uv_visible_rect,
-                   const gfx::Size& texture_size,
-                   SamplerType sampler) {
-  gfx::SizeF half_texel(0.5f, 0.5f);
-  if (sampler != SAMPLER_TYPE_2D_RECT) {
-    half_texel.Scale(1.f / texture_size.width(), 1.f / texture_size.height());
-  } else {
-    uv_visible_rect.Scale(texture_size.width(), texture_size.height());
-  }
-  uv_visible_rect.Inset(
-      gfx::InsetsF::VH(half_texel.height(), half_texel.width()));
-  return {{uv_visible_rect.x(), uv_visible_rect.y(), uv_visible_rect.right(),
-           uv_visible_rect.bottom()}};
-}
-
-Float4 PremultipliedColor(SkColor color, float opacity) {
-  const U8CPU alpha255 = SkColorGetA(color);
-  const unsigned int alpha256 = alpha255 + 1;
-  const unsigned int premultiplied_red = (SkColorGetR(color) * alpha256) >> 8;
-  const unsigned int premultiplied_green = (SkColorGetG(color) * alpha256) >> 8;
-  const unsigned int premultiplied_blue = (SkColorGetB(color) * alpha256) >> 8;
-  const float factor = opacity / 255.0f;
-  return {{premultiplied_red * factor, premultiplied_green * factor,
-           premultiplied_blue * factor, alpha255 * factor}};
-}
-
-SamplerType SamplerTypeFromTextureTarget(GLenum target) {
-  switch (target) {
-    case GL_TEXTURE_2D:
-      return SAMPLER_TYPE_2D;
-    case GL_TEXTURE_RECTANGLE_ARB:
-      return SAMPLER_TYPE_2D_RECT;
-    case GL_TEXTURE_EXTERNAL_OES:
-      return SAMPLER_TYPE_EXTERNAL_OES;
-    default:
-      NOTREACHED();
-      return SAMPLER_TYPE_2D;
-  }
-}
-
-BlendMode BlendModeFromSkXfermode(SkBlendMode mode) {
-  switch (mode) {
-    case SkBlendMode::kSrcOver:
-      return BLEND_MODE_NORMAL;
-    case SkBlendMode::kDstIn:
-      return BLEND_MODE_DESTINATION_IN;
-    case SkBlendMode::kScreen:
-      return BLEND_MODE_SCREEN;
-    case SkBlendMode::kOverlay:
-      return BLEND_MODE_OVERLAY;
-    case SkBlendMode::kDarken:
-      return BLEND_MODE_DARKEN;
-    case SkBlendMode::kLighten:
-      return BLEND_MODE_LIGHTEN;
-    case SkBlendMode::kColorDodge:
-      return BLEND_MODE_COLOR_DODGE;
-    case SkBlendMode::kColorBurn:
-      return BLEND_MODE_COLOR_BURN;
-    case SkBlendMode::kHardLight:
-      return BLEND_MODE_HARD_LIGHT;
-    case SkBlendMode::kSoftLight:
-      return BLEND_MODE_SOFT_LIGHT;
-    case SkBlendMode::kDifference:
-      return BLEND_MODE_DIFFERENCE;
-    case SkBlendMode::kExclusion:
-      return BLEND_MODE_EXCLUSION;
-    case SkBlendMode::kMultiply:
-      return BLEND_MODE_MULTIPLY;
-    case SkBlendMode::kHue:
-      return BLEND_MODE_HUE;
-    case SkBlendMode::kSaturation:
-      return BLEND_MODE_SATURATION;
-    case SkBlendMode::kColor:
-      return BLEND_MODE_COLOR;
-    case SkBlendMode::kLuminosity:
-      return BLEND_MODE_LUMINOSITY;
-    case SkBlendMode::kSrc:
-      return BLEND_MODE_NONE;
-    default:
-      NOTREACHED();
-      return BLEND_MODE_NONE;
-  }
-}
-
-// Adds a timer query that spans all GL calls in its scope. |viz.composite_time|
-// trace category must be enabled for this to work.
-// Note:: Multiple timer queries cannot be nested.
-class ScopedTimerQuery {
- public:
-  ScopedTimerQuery(bool tracing_enabled,
-                   gpu::gles2::GLES2Interface* gl,
-                   base::queue<std::pair<unsigned, std::string>>* timer_queries,
-                   const std::string& quad_type_str)
-      : gl_(gl) {
-    if (!tracing_enabled) {
-      gl_ = nullptr;
-      return;
-    }
-    unsigned timer_query;
-    gl_->GenQueriesEXT(1, &timer_query);
-    gl_->BeginQueryEXT(GL_TIME_ELAPSED_EXT, timer_query);
-    timer_queries->emplace(timer_query, quad_type_str);
-  }
-
-  ~ScopedTimerQuery() {
-    if (gl_)
-      gl_->EndQueryEXT(GL_TIME_ELAPSED_EXT);
-  }
-
- private:
-  raw_ptr<gpu::gles2::GLES2Interface> gl_;
-};
-
-void AccumulateDrawRects(const gfx::Rect& quad_rect,
-                         const gfx::Transform& target_transform,
-                         std::vector<gfx::Rect>* drawn_rects) {
-  gfx::RectF quad_rect_f(quad_rect);
-
-  // If the transform is not axis aligned then assume the largest possible
-  // bounds the quad can take in the render target. In this case, we take the
-  // sum of 2 sides.
-  if (!target_transform.Preserves2dAxisAlignment()) {
-    // Increase the length of each side to |width + height|.
-    const int total_length = quad_rect.width() + quad_rect.height();
-    quad_rect_f.set_height(total_length);
-    quad_rect_f.set_width(total_length);
-
-    // Ensure that the increase is equally distributed on either sides of the
-    // quad such that the position of the center of the quad does not change.
-    const float delta_x = -(quad_rect.height() / 2.f);
-    const float delta_y = -(quad_rect.width() / 2.f);
-    quad_rect_f.Offset(gfx::Vector2d(delta_x, delta_y));
-
-    // Apply only the scale and translation component.
-    const gfx::Vector2dF& translate = target_transform.To2dTranslation();
-    const gfx::Vector2dF& scale = target_transform.To2dScale();
-    quad_rect_f.Scale(scale.x(), scale.y());
-    quad_rect_f.Offset(translate.x(), translate.y());
-  } else {
-    target_transform.TransformRect(&quad_rect_f);
-  }
-  drawn_rects->push_back(gfx::ToRoundedRect(quad_rect_f));
-}
-
-// Smallest unit that impact anti-aliasing output. We use this to
-// determine when anti-aliasing is unnecessary.
-const float kAntiAliasingEpsilon = 1.0f / 1024.0f;
-
-// A dummy timer query ID used to identify the beginning of a frame in the queue
-// of timer queries.
-const unsigned kTimerQueryDummy = 0;
-
-}  // anonymous namespace
-
-static GLint GetActiveTextureUnit(GLES2Interface* gl) {
-  GLint active_unit = 0;
-  gl->GetIntegerv(GL_ACTIVE_TEXTURE, &active_unit);
-  return active_unit;
-}
-
-// Parameters needed to draw a CompositorRenderPassDrawQuad.
-struct GLRenderer::DrawRenderPassDrawQuadParams {
-  DrawRenderPassDrawQuadParams() {}
-  ~DrawRenderPassDrawQuadParams() {
-    // Don't leak the texture.
-    DCHECK(!background_texture);
-  }
-
-  // Required inputs below.
-  raw_ptr<const AggregatedRenderPassDrawQuad> quad = nullptr;
-
-  // Either |contents_texture| or |bypass_quad_texture| is populated. The
-  // |contents_texture| will be valid if non-null, and when null the
-  // bypass_quad_texture will be valid instead.
-  raw_ptr<ScopedRenderPassTexture> contents_texture = nullptr;
-  struct {
-    ResourceId resource_id = kInvalidResourceId;
-    gfx::Size size;
-  } bypass_quad_texture;
-
-  raw_ptr<const gfx::QuadF> clip_region = nullptr;
-  bool flip_texture = false;
-
-  // |window_matrix| maps from [-1,-1]-[1,1] unit square coordinates to window
-  // pixel coordinates.
-  gfx::Transform window_matrix;
-  // |projection_matrix| maps texture coordinates (in pixels) to the 2D plane in
-  // [-1,-1]-[1,1] unit square coordinates. If FlippedFrameBuffer() is true,
-  // |projection_matrix| includes this flip.
-  gfx::Transform projection_matrix;
-  // |quad_to_target_transform| transforms from local quad pixel coordinates to
-  // target content space pixel coordinates, including scale, offset,
-  // perspective, and rotation.
-  gfx::Transform quad_to_target_transform;
-  raw_ptr<const cc::FilterOperations> filters = nullptr;
-  raw_ptr<const cc::FilterOperations> backdrop_filters = nullptr;
-  absl::optional<gfx::RRectF> backdrop_filter_bounds;
-
-  // Whether the texture to be sampled from needs to be flipped.
-  bool source_needs_flip = false;
-
-  float edge[24];
-  SkScalar color_matrix[20];
-
-  // Blending in the fragment shaders is used for modifications to the backdrop
-  // and for supporting advanced blending equation when not available by the
-  // underlying graphics API.
-  bool use_shaders_for_blending = false;
-  SkBlendMode blend_mode = SkBlendMode::kSrcOver;
-
-  bool use_aa = false;
-
-  // Some filters affect pixels outside the original contents bounds, in which
-  // case ApplyImageFilter will modify this rect.
-  gfx::RectF dst_rect;
-
-  // A Skia image that should be sampled from instead of the original
-  // contents.
-  sk_sp<SkImage> filter_image;
-
-  // The original contents, bound for sampling.
-  std::unique_ptr<DisplayResourceProviderGL::ScopedSamplerGL>
-      bypass_quad_resource_lock;
-
-  // A mask to be applied when drawing the RPDQ.
-  std::unique_ptr<DisplayResourceProviderGL::ScopedSamplerGL>
-      mask_resource_lock;
-
-  // Whether a color matrix needs to be applied by the shaders when drawing
-  // the RPDQ.
-  bool use_color_matrix = false;
-
-  gfx::QuadF surface_quad;
-
-  // |contents_device_transform| transforms from vertex geometry, which is often
-  // the unit quad [-0.5, 0.5], all the way to 2D window pixel coordinates,
-  // including 3D effects, frame buffer orientation, and window offset. The
-  // definition of the incoming vertex geometry comes from either
-  // shared_geometry_ or clipped_geometry_, which are initialized from
-  // DirectRenderer::QuadVertexRect or DynamicGeometryBinding, respectively.
-  // |contents_device_transform| is typically calculated as
-  //    |window_matrix| * |projection_matrix| * |quad_rect_matrix|
-  // and then flattened with FlattenTo2d(). Here, |quad_rect_matrix| is a
-  // combination of the geometry->quad transform as well as the quad->target
-  // space transform. The geometry->quad is the mapping from the bound geometry,
-  // often [-0.5, 0.5], to the quad, which is quad->rect.
-  gfx::Transform contents_device_transform;
-
-  gfx::RectF tex_coord_rect;
-
-  // The color space of the texture bound for sampling (from filter_image or
-  // bypass_quad_resource_lock, depending on the path taken).
-  gfx::ColorSpace contents_and_bypass_color_space;
-
-  // Background filters block.
-  // Original background texture.
-  uint32_t background_texture = 0;
-  GLenum background_texture_format = 0;
-  // Backdrop bounding box.
-  gfx::Rect background_rect;
-  // Filtered background texture.
-  sk_sp<SkImage> background_image;
-  GLuint background_image_id = 0;
-  // A multiplier for the temporary surface we create to apply the backdrop
-  // filter.
-  float backdrop_filter_quality = 1.0;
-  // Whether the original background texture is needed for the mask.
-  bool mask_for_background = false;
-
-  bool apply_shader_based_rounded_corner = true;
-};
-
-class GLRenderer::ScopedUseGrContext {
- public:
-  static std::unique_ptr<ScopedUseGrContext> Create(GLRenderer* renderer) {
-    // GrContext for filters is created lazily, and may fail if the context
-    // is lost.
-    // TODO(vmiura,bsalomon): crbug.com/487850 Ensure that
-    // ContextProvider::GrContext() does not return NULL.
-    GrDirectContext* direct = GrAsDirectContext(
-        renderer->output_surface_->context_provider()->GrContext());
-    if (direct)
-      return base::WrapUnique(new ScopedUseGrContext(renderer));
-    return nullptr;
-  }
-
-  ScopedUseGrContext(const ScopedUseGrContext&) = delete;
-  ScopedUseGrContext& operator=(const ScopedUseGrContext&) = delete;
-
-  ~ScopedUseGrContext() {
-    // Pass context control back to GLrenderer.
-    scoped_gpu_raster_ = nullptr;
-    renderer_->RestoreGLStateAfterSkia();
-  }
-
-  GrDirectContext* context() const {
-    return renderer_->output_surface_->context_provider()->GrContext();
-  }
-
- private:
-  explicit ScopedUseGrContext(GLRenderer* renderer)
-      : scoped_gpu_raster_(new cc::ScopedGpuRaster(
-            renderer->output_surface_->context_provider())),
-        renderer_(renderer) {
-    // scoped_gpu_raster_ passes context control to Skia.
-  }
-
-  std::unique_ptr<cc::ScopedGpuRaster> scoped_gpu_raster_;
-  raw_ptr<GLRenderer> renderer_;
-};
-
-GLRenderer::GLRenderer(
-    const RendererSettings* settings,
-    const DebugRendererSettings* debug_settings,
-    OutputSurface* output_surface,
-    DisplayResourceProviderGL* resource_provider,
-    OverlayProcessorInterface* overlay_processor,
-    scoped_refptr<base::SingleThreadTaskRunner> current_task_runner)
-    : DirectRenderer(settings,
-                     debug_settings,
-                     output_surface,
-                     resource_provider,
-                     overlay_processor),
-      shared_geometry_quad_(QuadVertexRect()),
-      gl_(output_surface->context_provider()->ContextGL()),
-      context_support_(output_surface->context_provider()->ContextSupport()),
-      texture_deleter_(current_task_runner),
-      copier_(output_surface->context_provider(), &texture_deleter_),
-      sync_queries_(gl_),
-      bound_geometry_(NO_BINDING),
-      current_task_runner_(std::move(current_task_runner)) {
-  DCHECK(gl_);
-  DCHECK(context_support_);
-
-  const auto& context_caps =
-      output_surface_->context_provider()->ContextCapabilities();
-
-  use_discard_framebuffer_ = context_caps.discard_framebuffer;
-  use_sync_query_ = context_caps.sync_query;
-  use_blend_equation_advanced_ = context_caps.blend_equation_advanced;
-  use_blend_equation_advanced_coherent_ =
-      context_caps.blend_equation_advanced_coherent;
-  use_occlusion_query_ = context_caps.occlusion_query;
-  use_timer_query_ = context_caps.timer_queries;
-  use_swap_with_bounds_ = context_caps.swap_buffers_with_bounds;
-  supports_multi_sampling_ = context_caps.max_samples > 0;
-  prefer_draw_to_copy_ = output_surface_->context_provider()
-                             ->GetGpuFeatureInfo()
-                             .IsWorkaroundEnabled(gpu::PREFER_DRAW_TO_COPY);
-  use_fast_path_solid_color_quad_ =
-      features::IsUsingFastPathForSolidColorQuad();
-  InitializeSharedObjects();
-}
-
-GLRenderer::~GLRenderer() {
-  CleanupSharedObjects();
-
-  auto* context_provider = output_surface_->context_provider();
-  auto* cache_controller = context_provider->CacheController();
-
-  if (context_busy_) {
-    cache_controller->ClientBecameNotBusy(std::move(context_busy_));
-  }
-  if (context_visibility_) {
-    cache_controller->ClientBecameNotVisibleDuringShutdown(
-        std::move(context_visibility_));
-  }
-}
-
-bool GLRenderer::CanPartialSwap() {
-  if (use_swap_with_bounds_)
-    return false;
-  auto* context_provider = output_surface_->context_provider();
-  return context_provider->ContextCapabilities().post_sub_buffer;
-}
-
-void GLRenderer::DidChangeVisibility() {
-  if (visible_) {
-    output_surface_->EnsureBackbuffer();
-  } else {
-    TRACE_EVENT0("viz", "GLRenderer::DidChangeVisibility dropping resources");
-    ReleaseRenderPassTextures();
-    output_surface_->DiscardBackbuffer();
-    gl_->ReleaseShaderCompiler();
-  }
-
-  PrepareGeometry(NO_BINDING);
-
-  auto* context_provider = output_surface_->context_provider();
-  auto* cache_controller = context_provider->CacheController();
-  if (visible_) {
-    DCHECK(!context_visibility_);
-    context_visibility_ = cache_controller->ClientBecameVisible();
-  } else {
-    DCHECK(context_visibility_);
-    cache_controller->ClientBecameNotVisible(std::move(context_visibility_));
-  }
-}
-
-void GLRenderer::ReleaseRenderPassTextures() {
-  render_pass_textures_.clear();
-  render_pass_backdrop_textures_.clear();
-}
-
-void GLRenderer::DiscardPixels() {
-  if (!use_discard_framebuffer_)
-    return;
-  bool using_default_framebuffer =
-      !current_framebuffer_texture_ &&
-      output_surface_->capabilities().uses_default_gl_framebuffer;
-  GLenum attachments[] = {static_cast<GLenum>(
-      using_default_framebuffer ? GL_COLOR_EXT : GL_COLOR_ATTACHMENT0_EXT)};
-  gl_->DiscardFramebufferEXT(GL_FRAMEBUFFER, std::size(attachments),
-                             attachments);
-}
-
-void GLRenderer::PrepareSurfaceForPass(
-    SurfaceInitializationMode initialization_mode,
-    const gfx::Rect& render_pass_scissor) {
-  SetViewport();
-
-  switch (initialization_mode) {
-    case SURFACE_INITIALIZATION_MODE_PRESERVE:
-      EnsureScissorTestDisabled();
-      return;
-    case SURFACE_INITIALIZATION_MODE_FULL_SURFACE_CLEAR:
-      EnsureScissorTestDisabled();
-      DiscardPixels();
-      ClearFramebuffer();
-      break;
-    case SURFACE_INITIALIZATION_MODE_SCISSORED_CLEAR:
-      SetScissorTestRect(render_pass_scissor);
-      ClearFramebuffer();
-      break;
-  }
-
-  if (OverdrawTracingEnabled()) {
-    gl_->GenQueriesEXT(1, &occlusion_query_);
-    gl_->BeginQueryEXT(GL_SAMPLES_PASSED_ARB, occlusion_query_);
-  }
-
-  // For each render pass, reset the drawn region.
-  drawn_rects_.clear();
-}
-
-void GLRenderer::ClearFramebuffer() {
-  // On DEBUG builds, opaque render passes are cleared to blue to easily see
-  // regions that were not drawn on the screen.
-  if (current_frame()->current_render_pass->has_transparent_background)
-    gl_->ClearColor(0, 0, 0, 0);
-  else
-    gl_->ClearColor(0, 0, 1, 1);
-
-  gl_->ClearStencil(0);
-
-  bool always_clear = overdraw_feedback_;
-#ifndef NDEBUG
-  always_clear = true;
-#endif
-  if (always_clear ||
-      current_frame()->current_render_pass->has_transparent_background) {
-    GLbitfield clear_bits = GL_COLOR_BUFFER_BIT;
-    if (always_clear)
-      clear_bits |= GL_STENCIL_BUFFER_BIT;
-    gl_->Clear(clear_bits);
-  }
-}
-
-void GLRenderer::BeginDrawingFrame() {
-  TRACE_EVENT0("viz", "GLRenderer::BeginDrawingFrame");
-
-  if (!context_busy_) {
-    context_busy_ = output_surface_->context_provider()
-                        ->CacheController()
-                        ->ClientBecameBusy();
-  }
-
-  // Begin batching read of shared images.
-  gl_->BeginBatchReadAccessSharedImageCHROMIUM();
-
-  scoped_refptr<ResourceFence> read_lock_fence;
-  if (use_sync_query_) {
-    read_lock_fence = sync_queries_.StartNewFrame();
-  } else {
-    read_lock_fence =
-        base::MakeRefCounted<DisplayResourceProviderGL::SynchronousFence>(gl_);
-  }
-  resource_provider()->SetReadLockFence(read_lock_fence.get());
-
-  // Insert WaitSyncTokenCHROMIUM on quad resources prior to drawing the frame,
-  // so that drawing can proceed without GL context switching interruptions.
-  for (const auto& pass : *current_frame()->render_passes_in_draw_order) {
-    for (auto* quad : pass->quad_list) {
-      for (ResourceId resource_id : quad->resources)
-        resource_provider()->WaitSyncToken(resource_id);
-    }
-  }
-
-  // TODO(enne): Do we need to reinitialize all of this state per frame?
-  ReinitializeGLState();
-
-  // Add a dummy timer query as a fence to identify the beginning of a frame in
-  // the circular queue.
-  if (CompositeTimeTracingEnabled())
-    timer_queries_.emplace(kTimerQueryDummy, "");
-
-  num_triangles_drawn_ = 0;
-}
-
-void GLRenderer::DoDrawQuad(const DrawQuad* quad,
-                            const gfx::QuadF* clip_region) {
-  DCHECK(quad->rect.Contains(quad->visible_rect));
-  if (quad->material != DrawQuad::Material::kTextureContent) {
-    FlushTextureQuadCache(SHARED_BINDING);
-  }
-
-  switch (quad->material) {
-    case DrawQuad::Material::kInvalid:
-      NOTREACHED();
-      break;
-    case DrawQuad::Material::kAggregatedRenderPass:
-      DrawRenderPassQuad(AggregatedRenderPassDrawQuad::MaterialCast(quad),
-                         clip_region);
-      break;
-    case DrawQuad::Material::kDebugBorder:
-      DrawDebugBorderQuad(DebugBorderDrawQuad::MaterialCast(quad));
-      break;
-    case DrawQuad::Material::kPictureContent:
-      // PictureDrawQuad should only be used for resourceless software draws.
-      NOTREACHED();
-      break;
-    case DrawQuad::Material::kCompositorRenderPass:
-      // At this point, RenderPassDrawQuads should be replaced by
-      // AggregatedRenderPassDrawQuad.
-      NOTREACHED();
-      break;
-    case DrawQuad::Material::kSolidColor:
-      DrawSolidColorQuad(SolidColorDrawQuad::MaterialCast(quad), clip_region);
-      break;
-    case DrawQuad::Material::kStreamVideoContent:
-      DrawStreamVideoQuad(StreamVideoDrawQuad::MaterialCast(quad), clip_region);
-      break;
-    case DrawQuad::Material::kSurfaceContent:
-      // Surface content should be fully resolved to other quad types before
-      // reaching a direct renderer.
-      NOTREACHED();
-      break;
-    case DrawQuad::Material::kSharedElement:
-      // Shared element should be fully resolved to other quad types before
-      // reaching a direct renderer.
-      NOTREACHED();
-      break;
-    case DrawQuad::Material::kTextureContent:
-      EnqueueTextureQuad(TextureDrawQuad::MaterialCast(quad), clip_region);
-      break;
-    case DrawQuad::Material::kTiledContent:
-      DrawTileQuad(TileDrawQuad::MaterialCast(quad), clip_region);
-      break;
-    case DrawQuad::Material::kYuvVideoContent:
-      DrawYUVVideoQuad(YUVVideoDrawQuad::MaterialCast(quad), clip_region);
-      break;
-    case DrawQuad::Material::kVideoHole:
-      // VideoHoleDrawQuad should only be used by Cast, and should
-      // have been replaced by cast-specific OverlayProcessor before
-      // reach here. In non-cast build, an untrusted render could send such
-      // Quad and the quad would then reach here unexpectedly. Therefore
-      // we should skip NOTREACHED() so an untrusted render is not capable
-      // of causing a crash.
-      break;
-  }
-}
-
-// This function does not handle 3D sorting right now, since the debug border
-// quads are just drawn as their original quads and not in split pieces. This
-// results in some debug border quads drawing over foreground quads.
-void GLRenderer::DrawDebugBorderQuad(const DebugBorderDrawQuad* quad) {
-  SetBlendEnabled(quad->ShouldDrawWithBlending());
-
-  SetUseProgram(ProgramKey::DebugBorder(), gfx::ColorSpace::CreateSRGB(),
-                CurrentRenderPassColorSpace());
-
-  // Use the full quad_rect for debug quads to not move the edges based on
-  // partial swaps.
-  gfx::Rect layer_rect = quad->rect;
-  gfx::Transform render_matrix;
-  QuadRectTransform(&render_matrix,
-                    quad->shared_quad_state->quad_to_target_transform,
-                    gfx::RectF(layer_rect));
-  SetShaderMatrix(current_frame()->projection_matrix * render_matrix);
-  SetShaderColor(quad->color, 1.f);
-
-  gl_->LineWidth(quad->width);
-
-  // The indices for the line are stored in the same array as the triangle
-  // indices.
-  gl_->DrawElements(GL_LINE_LOOP, 4, GL_UNSIGNED_SHORT, nullptr);
-}
-
-// This is a utility to convert from GrGLenum color format into the equivalent
-// skColorType format. Note: this only supports the limited set of values that
-// can get returned by GLRenderer::GetBackdropTexture().
-static SkColorType GlFormatToSkFormat(GrGLenum format) {
-  switch (format) {
-    case GL_RGB:
-      return kRGB_888x_SkColorType;
-    case GL_RGBA:
-      return kRGBA_8888_SkColorType;
-    case GL_BGRA_EXT:
-      return kBGRA_8888_SkColorType;
-    case GL_RGB10_A2_EXT:
-      return kRGBA_1010102_SkColorType;
-    default:
-      NOTREACHED() << std::hex << std::showbase << format;
-      return kN32_SkColorType;
-  }
-}
-
-static GrGLenum SkFormatToGlFormat(SkColorType format) {
-  switch (format) {
-    case kRGB_888x_SkColorType:
-      return GL_RGB8_OES;
-    case kRGBA_8888_SkColorType:
-      return GL_RGBA8_OES;
-    case kBGRA_8888_SkColorType:
-      return GL_BGRA8_EXT;
-    case kRGBA_1010102_SkColorType:
-      return GL_RGB10_A2_EXT;
-    default:
-      NOTREACHED();
-      return GL_RGBA8_OES;
-  }
-}
-
-// Wrap a given texture in a Ganesh backend texture.
-static sk_sp<SkImage> WrapTexture(uint32_t texture_id,
-                                  uint32_t target,
-                                  const gfx::Size& size,
-                                  GrDirectContext* context,
-                                  bool flip_texture,
-                                  SkColorType format,
-                                  bool adopt_texture) {
-  GrGLenum texture_format = SkFormatToGlFormat(format);
-  GrGLTextureInfo texture_info;
-  texture_info.fTarget = target;
-  texture_info.fID = texture_id;
-  texture_info.fFormat = texture_format;
-  GrBackendTexture backend_texture(size.width(), size.height(),
-                                   GrMipMapped::kNo, texture_info);
-  GrSurfaceOrigin origin =
-      flip_texture ? kBottomLeft_GrSurfaceOrigin : kTopLeft_GrSurfaceOrigin;
-  if (adopt_texture) {
-    return SkImage::MakeFromAdoptedTexture(
-        context, backend_texture, origin, format, kPremul_SkAlphaType, nullptr);
-  } else {
-    return SkImage::MakeFromTexture(context, backend_texture, origin, format,
-                                    kPremul_SkAlphaType, nullptr);
-  }
-}
-
-static gfx::RectF CenteredRect(const gfx::Rect& tile_rect) {
-  return gfx::RectF(
-      gfx::PointF(-0.5f * tile_rect.width(), -0.5f * tile_rect.height()),
-      gfx::SizeF(tile_rect.size()));
-}
-
-bool GLRenderer::CanApplyBlendModeUsingBlendFunc(SkBlendMode blend_mode) {
-  return use_blend_equation_advanced_ || blend_mode == SkBlendMode::kSrcOver ||
-         blend_mode == SkBlendMode::kDstIn ||
-         blend_mode == SkBlendMode::kScreen;
-}
-
-void GLRenderer::ApplyBlendModeUsingBlendFunc(SkBlendMode blend_mode) {
-  // Any modes set here must be reset in RestoreBlendFuncToDefault
-  if (blend_mode == SkBlendMode::kSrcOver) {
-    // Left no-op intentionally.
-  } else if (blend_mode == SkBlendMode::kDstIn) {
-    gl_->BlendFunc(GL_ZERO, GL_SRC_ALPHA);
-  } else if (blend_mode == SkBlendMode::kDstOut) {
-    gl_->BlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_ALPHA);
-  } else if (blend_mode == SkBlendMode::kScreen) {
-    gl_->BlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ONE);
-  } else {
-    DCHECK(use_blend_equation_advanced_);
-    GLenum equation = GL_FUNC_ADD;
-    switch (blend_mode) {
-      case SkBlendMode::kScreen:
-        equation = GL_SCREEN_KHR;
-        break;
-      case SkBlendMode::kOverlay:
-        equation = GL_OVERLAY_KHR;
-        break;
-      case SkBlendMode::kDarken:
-        equation = GL_DARKEN_KHR;
-        break;
-      case SkBlendMode::kLighten:
-        equation = GL_LIGHTEN_KHR;
-        break;
-      case SkBlendMode::kColorDodge:
-        equation = GL_COLORDODGE_KHR;
-        break;
-      case SkBlendMode::kColorBurn:
-        equation = GL_COLORBURN_KHR;
-        break;
-      case SkBlendMode::kHardLight:
-        equation = GL_HARDLIGHT_KHR;
-        break;
-      case SkBlendMode::kSoftLight:
-        equation = GL_SOFTLIGHT_KHR;
-        break;
-      case SkBlendMode::kDifference:
-        equation = GL_DIFFERENCE_KHR;
-        break;
-      case SkBlendMode::kExclusion:
-        equation = GL_EXCLUSION_KHR;
-        break;
-      case SkBlendMode::kMultiply:
-        equation = GL_MULTIPLY_KHR;
-        break;
-      case SkBlendMode::kHue:
-        equation = GL_HSL_HUE_KHR;
-        break;
-      case SkBlendMode::kSaturation:
-        equation = GL_HSL_SATURATION_KHR;
-        break;
-      case SkBlendMode::kColor:
-        equation = GL_HSL_COLOR_KHR;
-        break;
-      case SkBlendMode::kLuminosity:
-        equation = GL_HSL_LUMINOSITY_KHR;
-        break;
-      default:
-        NOTREACHED() << "Unexpected blend mode: SkBlendMode::k"
-                     << SkBlendMode_Name(blend_mode);
-        return;
-    }
-    gl_->BlendEquation(equation);
-  }
-}
-
-void GLRenderer::RestoreBlendFuncToDefault(SkBlendMode blend_mode) {
-  switch (blend_mode) {
-    case SkBlendMode::kSrcOver:
-      break;
-    case SkBlendMode::kDstIn:
-    case SkBlendMode::kDstOut:
-    case SkBlendMode::kScreen:
-      gl_->BlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
-      break;
-    default:
-      DCHECK(use_blend_equation_advanced_);
-      gl_->BlendEquation(GL_FUNC_ADD);
-  }
-}
-
-bool GLRenderer::ShouldApplyBackdropFilters(
-    const DrawRenderPassDrawQuadParams* params) {
-  if (!params->backdrop_filters)
-    return false;
-  if (params->quad->shared_quad_state->opacity == 0.f)
-    return false;
-  DCHECK(!params->backdrop_filters->IsEmpty());
-  return true;
-}
-
-gfx::Rect GLRenderer::GetBackdropBoundingBoxForRenderPassQuad(
-    DrawRenderPassDrawQuadParams* params,
-    gfx::Transform* backdrop_filter_bounds_transform,
-    absl::optional<gfx::RRectF>* backdrop_filter_bounds,
-    gfx::Rect* unclipped_rect) const {
-  DCHECK(backdrop_filter_bounds_transform);
-  DCHECK(backdrop_filter_bounds);
-  DCHECK(unclipped_rect);
-
-  const auto* quad = params->quad.get();
-  gfx::QuadF scaled_region;
-  // |scaled_region| is a quad in [-0.5,0.5] space that represents |clip_region|
-  // as a fraction of the space defined by |quad->rect|. If |clip_region| is
-  // nullptr, then scaled_region is [-0.5,0.5].
-  if (!GetScaledRegion(quad->rect, params->clip_region, &scaled_region)) {
-    scaled_region = SharedGeometryQuad().BoundingBox();
-  }
-  // |backdrop_filter_bounds| is a rounded rect in [-0.5,0.5] space that
-  // represents |params->backdrop_filter_bounds| as a fraction of the space
-  // defined by |quad->rect|, not including its offset.
-  *backdrop_filter_bounds = gfx::RRectF();
-  if (!params->backdrop_filter_bounds ||
-      !GetScaledRRectF(quad->rect, params->backdrop_filter_bounds.value(),
-                       &backdrop_filter_bounds->value())) {
-    backdrop_filter_bounds->reset();
-  }
-
-  // |backdrop_rect| is now the bounding box of clip_region, in window pixel
-  // coordinates, and with flip applied.
-  gfx::Rect backdrop_rect = gfx::ToEnclosingRect(cc::MathUtil::MapClippedRect(
-      params->contents_device_transform, scaled_region.BoundingBox()));
-
-  if (!backdrop_rect.IsEmpty() && (params->filters || params->use_aa)) {
-    // If we have regular filters or antialiasing, grab an extra one-pixel
-    // border around the background, so texture edge clamping gives us a
-    // transparent border.
-    backdrop_rect.Inset(-1);
-  }
-
-  *unclipped_rect = backdrop_rect;
-  backdrop_rect.Intersect(MoveFromDrawToWindowSpace(
-      current_frame()->current_render_pass->output_rect));
-  if (ShouldApplyBackdropFilters(params)) {
-    float max_pixel_movement = params->backdrop_filters->MaximumPixelMovement();
-    gfx::Rect scissor_rect(current_window_space_viewport_);
-    scissor_rect.Inset(-max_pixel_movement);
-    backdrop_rect.Intersect(scissor_rect);
-  }
-
-  // The frame buffer flip is already included in the captured backdrop image,
-  // and it is included in |contents_device_transform| (through
-  // |projection_matrix|). Don't double-flip.
-  *backdrop_filter_bounds_transform = params->contents_device_transform;
-  float new_y = 2 * backdrop_filter_bounds_transform->To2dTranslation().y() +
-                backdrop_rect.bottom() - unclipped_rect->bottom() +
-                backdrop_rect.y() - unclipped_rect->y();
-  backdrop_filter_bounds_transform->PostScale(1, -1);
-  backdrop_filter_bounds_transform->PostTranslate(0, new_y);
-
-  // Shift to the space of the captured backdrop image.
-  backdrop_filter_bounds_transform->PostTranslate(-backdrop_rect.x(),
-                                                  -backdrop_rect.y());
-
-  return backdrop_rect;
-}
-
-GLenum GLRenderer::GetFramebufferCopyTextureFormat() {
-  // If copying a non-root renderpass then use the format of the bound
-  // texture. Otherwise, we use the format of the default framebuffer. But
-  // whatever the format is, convert it to a valid format for CopyTexSubImage2D.
-  GLenum format;
-  if (!current_framebuffer_texture_) {
-    format = output_surface_->GetFramebufferCopyTextureFormat();
-  } else {
-    ResourceFormat resource_format = CurrentRenderPassResourceFormat();
-    DCHECK(GLSupportsFormat(resource_format));
-    format = GLCopyTextureInternalFormat(resource_format);
-  }
-  // Verify the format is valid for GLES2's glCopyTexSubImage2D.
-  DCHECK(format == GL_ALPHA || format == GL_LUMINANCE ||
-         format == GL_LUMINANCE_ALPHA || format == GL_RGB ||
-         format == GL_RGBA ||
-         (output_surface_->context_provider()
-              ->ContextCapabilities()
-              .texture_format_bgra8888 &&
-          format == GL_BGRA_EXT) ||
-         format == GL_RGB10_A2_EXT)
-      << std::hex << std::showbase << format;
-  return format;
-}
-
-uint32_t GLRenderer::GetBackdropTexture(const gfx::Rect& window_rect,
-                                        float scale,
-                                        GLenum* internal_format) {
-  DCHECK(internal_format);
-  DCHECK_GE(window_rect.x(), 0);
-  DCHECK_GE(window_rect.y(), 0);
-  DCHECK_LE(window_rect.right(), current_surface_size_.width());
-  DCHECK_LE(window_rect.bottom(), current_surface_size_.height());
-
-  uint32_t texture_id;
-  gl_->GenTextures(1, &texture_id);
-  DCHECK(texture_id);
-  gl_->BindTexture(GL_TEXTURE_2D, texture_id);
-
-  gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-  gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-  gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-  gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-  ResourceFormat resource_format = CurrentRenderPassResourceFormat();
-  // Get gl_format, gl_type and internal_format.
-  DCHECK(GLSupportsFormat(resource_format));
-  *internal_format = GLInternalFormat(resource_format);
-  GLenum gl_format = GLDataFormat(resource_format);
-  GLenum gl_type = GLDataType(resource_format);
-
-  if (supports_multi_sampling_ && scale != 1.0f) {
-    DCHECK(!prefer_draw_to_copy_ || !current_framebuffer_texture_);
-
-    gfx::Size target_size = window_rect.size();
-    target_size = gfx::ScaleToCeiledSize(target_size, scale);
-
-    gl_->TexImage2D(GL_TEXTURE_2D, 0, *internal_format, target_size.width(),
-                    target_size.height(), 0, gl_format, gl_type, nullptr);
-
-    unsigned fbo = 0;
-    gl_->GenFramebuffers(1, &fbo);
-    gl_->BindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);
-    gl_->FramebufferTexture2D(GL_DRAW_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0,
-                              GL_TEXTURE_2D, texture_id, 0);
-    DCHECK_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE),
-              gl_->CheckFramebufferStatus(GL_DRAW_FRAMEBUFFER_EXT));
-
-    gl_->Scissor(0, 0, target_size.width(), target_size.height());
-
-    gl_->BlitFramebufferCHROMIUM(window_rect.x(), window_rect.y(),
-                                 window_rect.right(), window_rect.bottom(), 0,
-                                 0, target_size.width(), target_size.height(),
-                                 GL_COLOR_BUFFER_BIT, GL_LINEAR);
-
-    gl_->DeleteFramebuffers(1, &fbo);
-  } else if (prefer_draw_to_copy_ && current_framebuffer_texture_) {
-    // If there is a source texture |current_framebuffer_texture_| and the
-    // workaround |prefer_draw_to_copy_| is enabled, then do texture to texture
-    // copy via draw instead of glCopyTexImage2D.
-
-    // Size the destination texture with empty data. This is required since
-    // CopySubTextureCHROMIUM() does not sizes the texture but CopyTexImage2D
-    // does.
-    gl_->TexImage2D(GL_TEXTURE_2D, 0, *internal_format, window_rect.width(),
-                    window_rect.height(), 0, gl_format, gl_type, nullptr);
-    gl_->CopySubTextureCHROMIUM(
-        current_framebuffer_texture_->id(), 0, GL_TEXTURE_2D, texture_id, 0, 0,
-        0, window_rect.x(), window_rect.y(), window_rect.width(),
-        window_rect.height(), GL_FALSE, GL_FALSE, GL_FALSE);
-  } else {
-    *internal_format = GetFramebufferCopyTextureFormat();
-
-    // CopyTexImage2D requires inernalformat channels to be a subset of
-    // the channels of the source texture internalformat.
-    DCHECK(*internal_format == GL_RGB || *internal_format == GL_RGBA ||
-           *internal_format == GL_BGRA_EXT ||
-           *internal_format == GL_RGB10_A2_EXT);
-    if (*internal_format == GL_BGRA_EXT)
-      *internal_format = GL_RGBA;
-    gl_->CopyTexImage2D(GL_TEXTURE_2D, 0, *internal_format, window_rect.x(),
-                        window_rect.y(), window_rect.width(),
-                        window_rect.height(), 0);
-  }
-  gl_->BindTexture(GL_TEXTURE_2D, 0);
-  return texture_id;
-}
-
-static sk_sp<SkImage> FinalizeImage(sk_sp<SkSurface> surface) {
-  // Flush the drawing before source texture read lock goes out of scope.
-  // Skia API does not guarantee that when the SkImage goes out of scope,
-  // its externally referenced resources would force the rendering to be
-  // flushed.
-  surface->getCanvas()->flush();
-  sk_sp<SkImage> image = surface->makeImageSnapshot();
-  if (!image || !image->isTextureBacked()) {
-    return nullptr;
-  }
-  return image;
-}
-
-sk_sp<SkImage> GLRenderer::ApplyBackdropFilters(
-    DrawRenderPassDrawQuadParams* params,
-    const gfx::Rect& unclipped_rect,
-    const absl::optional<gfx::RRectF>& backdrop_filter_bounds,
-    const gfx::Transform& backdrop_filter_bounds_transform) {
-  DCHECK(ShouldApplyBackdropFilters(params));
-  DCHECK(params->backdrop_filter_quality > 0.0f &&
-         params->backdrop_filter_quality <= 1.0f);
-  DCHECK(!params->filters)
-      << "Filters should always be in a separate Effect node";
-  const auto* quad = params->quad.get();
-  auto use_gr_context = ScopedUseGrContext::Create(this);
-
-  // Check if cached result can be used
-  auto bg_texture_it =
-      render_pass_backdrop_textures_.find(quad->render_pass_id);
-  if (bg_texture_it != render_pass_backdrop_textures_.end()) {
-    if (!quad->intersects_damage_under)
-      return bg_texture_it->second;
-    else
-      render_pass_backdrop_textures_.erase(bg_texture_it);
-  }
-
-  gfx::Vector2d clipping_offset =
-      (params->background_rect.top_right() - unclipped_rect.top_right()) +
-      (params->background_rect.bottom_left() - unclipped_rect.bottom_left());
-
-  gfx::Rect quality_adjusted_rect = ScaleToEnclosingRect(
-      params->background_rect, params->backdrop_filter_quality);
-
-  // When backdrop_filter_quality is less than 1.0f, scale the blur amount
-  // accordingly.
-  cc::FilterOperations filter_operations;
-  if (params->backdrop_filter_quality < 1.0f) {
-    for (const cc::FilterOperation& op :
-         params->backdrop_filters->operations()) {
-      if (op.type() == cc::FilterOperation::BLUR) {
-        cc::FilterOperation blur_op(op);
-        blur_op.set_amount(op.amount() * params->backdrop_filter_quality);
-        filter_operations.Append(blur_op);
-      } else {
-        filter_operations.Append(op);
-      }
-    }
-  }
-  const cc::FilterOperations& filters = params->backdrop_filter_quality < 1.0f
-                                            ? filter_operations
-                                            : *params->backdrop_filters;
-
-  auto paint_filter = cc::RenderSurfaceFilters::BuildImageFilter(
-      filters, gfx::SizeF(quality_adjusted_rect.size()),
-      gfx::Vector2dF(clipping_offset));
-
-  // TODO(senorblanco): background filters should be moved to the
-  // makeWithFilter fast-path, and go back to calling ApplyImageFilter().
-  // See http://crbug.com/613233.
-  if (!paint_filter || !use_gr_context)
-    return nullptr;
-
-  auto filter = paint_filter->cached_sk_filter_;
-  sk_sp<SkImage> src_image = WrapTexture(
-      params->background_texture, GL_TEXTURE_2D, quality_adjusted_rect.size(),
-      use_gr_context->context(), /*flip_texture=*/true,
-      GlFormatToSkFormat(params->background_texture_format),
-      /*adopt_texture=*/false);
-  if (!src_image) {
-    TRACE_EVENT_INSTANT0("cc",
-                         "ApplyBackdropFilters wrap background texture failed",
-                         TRACE_EVENT_SCOPE_THREAD);
-    return nullptr;
-  }
-
-  // Create surface to draw into.
-  SkImageInfo dst_info = SkImageInfo::MakeN32Premul(
-      quality_adjusted_rect.width(), quality_adjusted_rect.height());
-  sk_sp<SkSurface> surface = SkSurface::MakeRenderTarget(
-      use_gr_context->context(), SkBudgeted::kYes, dst_info);
-  if (!surface) {
-    TRACE_EVENT_INSTANT0("viz",
-                         "ApplyBackdropFilters surface allocation failed",
-                         TRACE_EVENT_SCOPE_THREAD);
-    return nullptr;
-  }
-
-  // Big filters can sometimes fallback to CPU. Therefore, we need
-  // to disable subnormal floats for performance and security reasons.
-  cc::ScopedSubnormalFloatDisabler disabler;
-
-  gfx::RectF src_image_rect =
-      gfx::RectF(quality_adjusted_rect.width(), quality_adjusted_rect.height());
-  SkRect dest_rect = RectToSkRect(gfx::Rect(quality_adjusted_rect.size()));
-
-  // If the content underneath the backdrop filter can be exposed because of
-  // blending or bounds, paint the backdrop at full opacity first. The
-  // backdrop-filtered content will not be blended with the backdrop later, it
-  // will be rastered over the top. So we need to paint it here, unfiltered.
-  if (backdrop_filter_bounds.has_value() || quad->ShouldDrawWithBlending()) {
-    surface->getCanvas()->drawImageRect(
-        src_image, RectFToSkRect(src_image_rect), dest_rect,
-        SkSamplingOptions(), nullptr, SkCanvas::kStrict_SrcRectConstraint);
-  }
-
-  if (backdrop_filter_bounds.has_value()) {
-    // Crop the source image to the backdrop_filter_bounds.
-    gfx::Rect filter_clip = gfx::ToEnclosingRect(cc::MathUtil::MapClippedRect(
-        backdrop_filter_bounds_transform, backdrop_filter_bounds->rect()));
-    gfx::Rect src_rect(params->background_rect.width(),
-                       params->background_rect.height());
-    filter_clip.Intersect(src_rect);
-    if (filter_clip.IsEmpty())
-      return FinalizeImage(surface);
-    if (filter_clip != src_rect) {
-      filter_clip = gfx::ScaleToEnclosingRect(filter_clip,
-                                              params->backdrop_filter_quality);
-      src_image = src_image->makeSubset(RectToSkIRect(filter_clip),
-                                        use_gr_context->context());
-      src_image_rect = gfx::RectF(filter_clip.width(), filter_clip.height());
-      dest_rect = RectToSkRect(filter_clip);
-    }
-  }
-
-  SkIPoint offset;
-  SkIRect subset;
-  sk_sp<SkImage> filtered_image = SkiaHelper::ApplyImageFilter(
-      use_gr_context->context(), src_image, src_image_rect, src_image_rect,
-      quad->filters_scale, std::move(filter), &offset, &subset,
-      quad->filters_origin, true);
-
-  // Clip the filtered image to the (rounded) bounding box of the element.
-  if (backdrop_filter_bounds.has_value()) {
-    surface->getCanvas()->save();
-    gfx::RRectF clip_rect(backdrop_filter_bounds.value());
-    surface->getCanvas()->setMatrix(
-        backdrop_filter_bounds_transform.matrix().asM33());
-    surface->getCanvas()->clipRRect(SkRRect(clip_rect), SkClipOp::kIntersect,
-                                    true /* antialias */);
-    surface->getCanvas()->resetMatrix();
-  }
-
-  SkPaint paint;
-  // Paint the filtered backdrop image with opacity.
-  if (quad->shared_quad_state->opacity < 1.0) {
-    paint.setImageFilter(
-        SkiaHelper::BuildOpacityFilter(quad->shared_quad_state->opacity));
-  }
-  // Now paint the pre-filtered image onto the canvas (possibly with mask
-  // applied).
-  surface->getCanvas()->drawImageRect(filtered_image, SkRect::Make(subset),
-                                      dest_rect, SkSamplingOptions(), &paint,
-                                      SkCanvas::kStrict_SrcRectConstraint);
-
-  if (backdrop_filter_bounds.has_value()) {
-    surface->getCanvas()->restore();
-  }
-
-  sk_sp<SkImage> filtered_image_texture = FinalizeImage(surface);
-  if (!quad->intersects_damage_under) {
-    render_pass_backdrop_textures_[params->quad->render_pass_id] =
-        filtered_image_texture;
-  }
-  return filtered_image_texture;
-}
-
-const DrawQuad* GLRenderer::CanPassBeDrawnDirectly(
-    const AggregatedRenderPass* pass) {
-#if BUILDFLAG(IS_APPLE)
-  // On Macs, this path can sometimes lead to all black output.
-  // TODO(enne): investigate this and remove this hack.
-  return nullptr;
-#else
-  // Can only collapse a single tile quad.
-  if (pass->quad_list.size() != 1)
-    return nullptr;
-
-  const DrawQuad* quad = *pass->quad_list.BackToFrontBegin();
-  // Hack: this could be supported by concatenating transforms, but
-  // in practice if there is one quad, it is at the origin of the render pass
-  // and has the same size as the pass.
-  if (!quad->shared_quad_state->quad_to_target_transform.IsIdentity() ||
-      quad->rect != pass->output_rect)
-    return nullptr;
-  // The quad is expected to be the entire layer so that AA edges are correct.
-  if (quad->shared_quad_state->quad_layer_rect != quad->rect)
-    return nullptr;
-  if (quad->material != DrawQuad::Material::kTiledContent)
-    return nullptr;
-
-  // TODO(chrishtr): support could be added for opacity, but care needs
-  // to be taken to make sure it is correct w.r.t. non-commutative filters etc.
-  if (quad->shared_quad_state->opacity != 1.0f)
-    return nullptr;
-
-  if (quad->shared_quad_state->blend_mode != SkBlendMode::kSrcOver)
-    return nullptr;
-
-  const TileDrawQuad* tile_quad = TileDrawQuad::MaterialCast(quad);
-  // Hack: this could be supported by passing in a subrectangle to draw
-  // render pass, although in practice if there is only one quad there
-  // will be no border texels on the input.
-  if (tile_quad->tex_coord_rect != gfx::RectF(tile_quad->rect))
-    return nullptr;
-  // Tile quad features not supported in render pass shaders.
-  if (tile_quad->nearest_neighbor)
-    return nullptr;
-  // BUG=skia:3868, Skia currently doesn't support texture rectangle inputs.
-  // See also the DCHECKs about GL_TEXTURE_2D in DrawRenderPassQuad.
-  GLenum target =
-      resource_provider()->GetResourceTextureTarget(tile_quad->resource_id());
-  if (target != GL_TEXTURE_2D)
-    return nullptr;
-
-  return tile_quad;
-#endif
-}
-
-void GLRenderer::DrawRenderPassQuad(const AggregatedRenderPassDrawQuad* quad,
-                                    const gfx::QuadF* clip_region) {
-  auto bypass = render_pass_bypass_quads_.find(quad->render_pass_id);
-  DrawRenderPassDrawQuadParams params;
-  params.quad = quad;
-  params.clip_region = clip_region;
-  params.window_matrix = current_frame()->window_matrix;
-  params.projection_matrix = current_frame()->projection_matrix;
-  params.tex_coord_rect = quad->tex_coord_rect;
-  ScopedTimerQuery scoped_timer_query(CompositeTimeTracingEnabled(), gl_,
-                                      &timer_queries_, "kRenderPassDrawQuad");
-  if (bypass != render_pass_bypass_quads_.end()) {
-    DCHECK(bypass->second->material == DrawQuad::Material::kTiledContent);
-    const TileDrawQuad* tile_quad = TileDrawQuad::MaterialCast(bypass->second);
-    // The projection matrix used by GLRenderer has a flip.  As tile texture
-    // inputs are oriented opposite to framebuffer outputs, don't flip via
-    // texture coords and let the projection matrix naturallyd o it.
-    params.flip_texture = false;
-    params.bypass_quad_texture.resource_id = tile_quad->resource_id();
-    params.bypass_quad_texture.size = tile_quad->texture_size;
-    DrawRenderPassQuadInternal(&params);
-  } else {
-    auto contents_texture_it = render_pass_textures_.find(quad->render_pass_id);
-    DCHECK(contents_texture_it->second.id());
-    // See above comments about texture flipping.  When the input is a
-    // render pass, it needs to an extra flip to be oriented correctly.
-    params.flip_texture = true;
-    params.contents_texture = &contents_texture_it->second;
-    DrawRenderPassQuadInternal(&params);
-  }
-
-  if (params.background_texture) {
-    gl_->DeleteTextures(1, &params.background_texture);
-    params.background_texture = 0;
-  }
-}
-
-void GLRenderer::DrawRenderPassQuadInternal(
-    DrawRenderPassDrawQuadParams* params) {
-  params->quad_to_target_transform =
-      params->quad->shared_quad_state->quad_to_target_transform;
-  if (!InitializeRPDQParameters(params))
-    return;
-
-  UpdateRPDQShadersForBlending(params);
-  bool can_draw = UpdateRPDQWithSkiaFilters(params);
-  // The above calls use ScopedUseGrContext which can change the bound
-  // framebuffer, so we need to restore it for the current RenderPass.
-  UseRenderPass(current_frame()->current_render_pass);
-  // As part of restoring the framebuffer, we call SetViewport directly, rather
-  // than through PrepareSurfaceForPass. PrepareSurfaceForPass also clears the
-  // surface, which is not desired when restoring.
-  SetViewport();
-
-  if (!can_draw)
-    return;
-
-  UpdateRPDQTexturesForSampling(params);
-  UpdateRPDQBlendMode(params);
-  ChooseRPDQProgram(params, CurrentRenderPassColorSpace());
-  UpdateRPDQUniforms(params);
-  DrawRPDQ(*params);
-
-  AccumulateDrawRects(params->quad->visible_rect,
-                      params->quad->shared_quad_state->quad_to_target_transform,
-                      &drawn_rects_);
-}
-
-bool GLRenderer::InitializeRPDQParameters(
-    DrawRenderPassDrawQuadParams* params) {
-  DCHECK(params);
-  const auto* quad = params->quad.get();
-  SkMatrix local_matrix;
-  local_matrix.setTranslate(quad->filters_origin.x(), quad->filters_origin.y());
-  local_matrix.postScale(quad->filters_scale.x(), quad->filters_scale.y());
-  params->filters = FiltersForPass(quad->render_pass_id);
-  params->backdrop_filters = BackdropFiltersForPass(quad->render_pass_id);
-  if (ShouldApplyBackdropFilters(params)) {
-    params->backdrop_filter_bounds =
-        BackdropFilterBoundsForPass(quad->render_pass_id);
-    if (params->backdrop_filter_bounds.has_value()) {
-      params->backdrop_filter_bounds->Scale(quad->filters_scale.x(),
-                                            quad->filters_scale.y());
-    }
-  } else {
-    params->backdrop_filter_bounds.reset();
-  }
-  params->backdrop_filter_quality = quad->backdrop_filter_quality;
-  gfx::Rect dst_rect = params->filters
-                           ? params->filters->MapRect(quad->rect, local_matrix)
-                           : quad->rect;
-  params->dst_rect.SetRect(static_cast<float>(dst_rect.x()),
-                           static_cast<float>(dst_rect.y()),
-                           static_cast<float>(dst_rect.width()),
-                           static_cast<float>(dst_rect.height()));
-  gfx::Transform quad_rect_matrix;
-  gfx::Rect quad_layer_rect(quad->shared_quad_state->quad_layer_rect);
-  if (params->filters)
-    quad_layer_rect = params->filters->MapRect(quad_layer_rect, local_matrix);
-  QuadRectTransform(&quad_rect_matrix, params->quad_to_target_transform,
-                    gfx::RectF(quad_layer_rect));
-  params->contents_device_transform =
-      params->window_matrix * params->projection_matrix * quad_rect_matrix;
-  params->contents_device_transform.FlattenTo2d();
-
-  // Can only draw surface if device matrix is invertible.
-  if (!params->contents_device_transform.IsInvertible())
-    return false;
-
-  // TODO(sunxd): unify the anti-aliasing logic of RPDQ and TileDrawQuad.
-  params->surface_quad = SharedGeometryQuad();
-  gfx::QuadF device_layer_quad;
-  if (settings_->allow_antialiasing && !quad->force_anti_aliasing_off &&
-      quad->IsEdge()) {
-    bool clipped = false;
-    device_layer_quad = cc::MathUtil::MapQuad(params->contents_device_transform,
-                                              params->surface_quad, &clipped);
-    params->use_aa = ShouldAntialiasQuad(device_layer_quad, clipped,
-                                         settings_->force_antialiasing);
-  }
-
-  const gfx::QuadF* aa_quad = params->use_aa ? &device_layer_quad : nullptr;
-  SetupRenderPassQuadForClippingAndAntialiasing(
-      params->contents_device_transform, quad, aa_quad, params->clip_region,
-      &params->surface_quad, params->edge);
-
-  return true;
-}
-
-// Get a GL texture id from an SkImage. An optional origin pointer can be
-// passed in which will be filled out with the origin for the texture
-// backing the SkImage.
-static GLuint GetGLTextureIDFromSkImage(const SkImage* image,
-                                        GrSurfaceOrigin* origin = nullptr) {
-  GrBackendTexture backend_texture = image->getBackendTexture(true, origin);
-  if (!backend_texture.isValid()) {
-    return 0;
-  }
-  GrGLTextureInfo info;
-  bool result = backend_texture.getGLTextureInfo(&info);
-  DCHECK(result);
-  return info.fID;
-}
-
-void GLRenderer::UpdateRPDQShadersForBlending(
-    DrawRenderPassDrawQuadParams* params) {
-  const auto* quad = params->quad.get();
-  params->blend_mode = quad->shared_quad_state->blend_mode;
-  params->use_shaders_for_blending =
-      !CanApplyBlendModeUsingBlendFunc(params->blend_mode) ||
-      ShouldApplyBackdropFilters(params) ||
-      settings_->force_blending_with_shaders;
-
-  if (params->use_shaders_for_blending) {
-    // Compute a bounding box around the pixels that will be visible through
-    // the quad.
-    absl::optional<gfx::RRectF> backdrop_filter_bounds;
-    gfx::Transform backdrop_filter_bounds_transform;
-    gfx::Rect unclipped_rect;
-    params->background_rect = GetBackdropBoundingBoxForRenderPassQuad(
-        params, &backdrop_filter_bounds_transform, &backdrop_filter_bounds,
-        &unclipped_rect);
-
-    if (!params->background_rect.IsEmpty()) {
-      // The pixels from the filtered background should completely replace the
-      // current pixel values.
-      if (blend_enabled())
-        SetBlendEnabled(false);
-
-      // Read the pixels in the bounding box into a buffer R.
-      // This function allocates a texture, which should contribute to the
-      // amount of memory used by render surfaces:
-      // LayerTreeHost::CalculateMemoryForRenderSurfaces.
-      const auto& operations = params->backdrop_filters->operations();
-      DCHECK(params->backdrop_filter_quality == 1.0f ||
-             (operations.size() == 1 &&
-              operations.front().type() == cc::FilterOperation::BLUR));
-      params->background_texture = GetBackdropTexture(
-          params->background_rect, params->backdrop_filter_quality,
-          &params->background_texture_format);
-
-      if (ShouldApplyBackdropFilters(params)) {
-        // Apply the background filters to R, so that it is applied in the
-        // pixels' coordinate space.
-        params->background_image =
-            ApplyBackdropFilters(params, unclipped_rect, backdrop_filter_bounds,
-                                 backdrop_filter_bounds_transform);
-        if (params->background_image) {
-          params->background_image_id =
-              GetGLTextureIDFromSkImage(params->background_image.get());
-          DCHECK(params->background_image_id || IsContextLost());
-        }
-      }
-      if (params->background_image_id) {
-        // Reset original background texture if there is not any mask.
-        if (!quad->mask_resource_id()) {
-          gl_->DeleteTextures(1, &params->background_texture);
-          params->background_texture = 0;
-        }
-      } else if (CanApplyBlendModeUsingBlendFunc(params->blend_mode) &&
-                 ShouldApplyBackdropFilters(params)) {
-        // Something went wrong with applying backdrop filters to the
-        // backdrop.
-        params->use_shaders_for_blending = false;
-        gl_->DeleteTextures(1, &params->background_texture);
-        params->background_texture = 0;
-      }
-    } else {  // params->background_rect.IsEmpty()
-      DCHECK(!params->background_image_id);
-      params->use_shaders_for_blending = false;
-      params->blend_mode = SkBlendMode::kSrcOver;
-    }
-  }
-
-  // Need original background texture for mask?
-  params->mask_for_background =
-      params->background_texture &&  // Have original background texture
-      params->background_image_id;   // Have mask texture
-  // If we have background texture + background image, then we also have mask
-  // resource.
-  if (params->background_texture && params->background_image_id) {
-    DCHECK(params->mask_for_background);
-    DCHECK(quad->mask_resource_id());
-  }
-
-  DCHECK_EQ(params->background_texture || params->background_image_id,
-            params->use_shaders_for_blending);
-}
-
-bool GLRenderer::UpdateRPDQWithSkiaFilters(
-    DrawRenderPassDrawQuadParams* params) {
-  const auto* quad = params->quad.get();
-  // Apply filters to the contents texture.
-  if (params->filters) {
-    DCHECK(!params->filters->IsEmpty());
-    gfx::Size size = params->contents_texture
-                         ? params->contents_texture->size()
-                         : params->bypass_quad_texture.size;
-    auto paint_filter = cc::RenderSurfaceFilters::BuildImageFilter(
-        *params->filters, gfx::SizeF(size));
-    auto filter = paint_filter ? paint_filter->cached_sk_filter_ : nullptr;
-    if (filter) {
-      SkColorFilter* colorfilter_rawptr = nullptr;
-      filter->asColorFilter(&colorfilter_rawptr);
-      sk_sp<SkColorFilter> cf(colorfilter_rawptr);
-
-      if (cf && cf->asAColorMatrix(params->color_matrix)) {
-        // We have a color matrix at the root of the filter DAG; apply it
-        // locally in the compositor and process the rest of the DAG (if any)
-        // in Skia.
-        params->use_color_matrix = true;
-        filter = sk_ref_sp(filter->getInput(0));
-      }
-      if (filter) {
-        gfx::Rect clip_rect =
-            quad->shared_quad_state->clip_rect.value_or(current_draw_rect_);
-        gfx::Transform transform = params->quad_to_target_transform;
-        transform.FlattenTo2d();
-        if (!transform.IsInvertible()) {
-          return false;
-        }
-        // If the transform has perspective, there might be visible content
-        // outside of the bounds of the quad.
-        if (!transform.HasPerspective()) {
-          gfx::QuadF clip_quad = gfx::QuadF(gfx::RectF(clip_rect));
-          gfx::QuadF local_clip =
-              cc::MathUtil::InverseMapQuadToLocalSpace(transform, clip_quad);
-          params->dst_rect.Intersect(local_clip.BoundingBox());
-        }
-        // If we've been fully clipped out (by crop rect or clipping), there's
-        // nothing to draw.
-        if (params->dst_rect.IsEmpty()) {
-          return false;
-        }
-        SkIPoint offset;
-        SkIRect subset;
-        gfx::RectF src_rect(quad->rect);
-        auto use_gr_context = ScopedUseGrContext::Create(this);
-        if (!use_gr_context)
-          return false;
-
-        if (params->contents_texture) {
-          params->contents_and_bypass_color_space =
-              params->contents_texture->color_space();
-          sk_sp<SkImage> src_image = WrapTexture(
-              params->contents_texture->id(), GL_TEXTURE_2D,
-              params->contents_texture->size(), use_gr_context->context(),
-              params->flip_texture, kN32_SkColorType, /*adopt_texture=*/false);
-          params->filter_image = SkiaHelper::ApplyImageFilter(
-              use_gr_context->context(), src_image, src_rect, params->dst_rect,
-              quad->filters_scale, std::move(filter), &offset, &subset,
-              quad->filters_origin, true);
-        } else {
-          DisplayResourceProviderGL::ScopedReadLockGL
-              prefilter_bypass_quad_texture_lock(
-                  resource_provider(), params->bypass_quad_texture.resource_id);
-          params->contents_and_bypass_color_space =
-              prefilter_bypass_quad_texture_lock.color_space();
-          sk_sp<SkImage> src_image =
-              WrapTexture(prefilter_bypass_quad_texture_lock.texture_id(),
-                          prefilter_bypass_quad_texture_lock.target(),
-                          prefilter_bypass_quad_texture_lock.size(),
-                          use_gr_context->context(), params->flip_texture,
-                          kN32_SkColorType, /*adopt_texture=*/false);
-          params->filter_image = SkiaHelper::ApplyImageFilter(
-              use_gr_context->context(), src_image, src_rect, params->dst_rect,
-              quad->filters_scale, std::move(filter), &offset, &subset,
-              quad->filters_origin, true);
-        }
-
-        if (!params->filter_image)
-          return false;
-        params->dst_rect =
-            gfx::RectF(src_rect.x() + offset.fX, src_rect.y() + offset.fY,
-                       subset.width(), subset.height());
-        gfx::RectF tex_rect = gfx::RectF(gfx::PointF(subset.x(), subset.y()),
-                                         params->dst_rect.size());
-        params->tex_coord_rect = tex_rect;
-      }
-    }
-  }
-  return true;
-}
-
-void GLRenderer::UpdateRPDQTexturesForSampling(
-    DrawRenderPassDrawQuadParams* params) {
-  if (params->quad->mask_resource_id()) {
-    params->mask_resource_lock =
-        std::make_unique<DisplayResourceProviderGL::ScopedSamplerGL>(
-
-            resource_provider(), params->quad->mask_resource_id(), GL_TEXTURE1,
-            GL_LINEAR);
-  }
-
-  if (params->filter_image) {
-    GrSurfaceOrigin origin;
-    GLuint filter_image_id =
-        GetGLTextureIDFromSkImage(params->filter_image.get(), &origin);
-    DCHECK(filter_image_id || IsContextLost());
-    DCHECK_EQ(GL_TEXTURE0, GetActiveTextureUnit(gl_));
-    gl_->BindTexture(GL_TEXTURE_2D, filter_image_id);
-    gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-    gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-    // |params->contents_and_bypass_color_space| was populated when
-    // |params->filter_image| was populated.
-    params->source_needs_flip = kBottomLeft_GrSurfaceOrigin == origin;
-  } else if (params->contents_texture) {
-    params->contents_texture->BindForSampling();
-    params->contents_and_bypass_color_space =
-        params->contents_texture->color_space();
-    params->source_needs_flip = params->flip_texture;
-  } else {
-    params->bypass_quad_resource_lock =
-        std::make_unique<DisplayResourceProviderGL::ScopedSamplerGL>(
-            resource_provider(), params->bypass_quad_texture.resource_id,
-            GL_LINEAR);
-    DCHECK_EQ(static_cast<GLenum>(GL_TEXTURE_2D),
-              params->bypass_quad_resource_lock->target());
-    params->contents_and_bypass_color_space =
-        params->bypass_quad_resource_lock->color_space();
-    params->source_needs_flip = params->flip_texture;
-  }
-}
-
-void GLRenderer::UpdateRPDQBlendMode(DrawRenderPassDrawQuadParams* params) {
-  SkBlendMode blend_mode = params->blend_mode;
-  SetBlendEnabled((!params->use_shaders_for_blending &&
-                   (params->quad->ShouldDrawWithBlending() ||
-                    !IsDefaultBlendMode(blend_mode))) ||
-                  ShouldApplyRoundedCorner(params->quad));
-  if (!params->use_shaders_for_blending) {
-    if (!use_blend_equation_advanced_coherent_ && use_blend_equation_advanced_)
-      gl_->BlendBarrierKHR();
-
-    ApplyBlendModeUsingBlendFunc(blend_mode);
-  }
-}
-
-void GLRenderer::ChooseRPDQProgram(DrawRenderPassDrawQuadParams* params,
-                                   const gfx::ColorSpace& target_color_space) {
-  TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired(
-      gl_, &highp_threshold_cache_, settings_->highp_threshold_min,
-      params->quad->shared_quad_state->visible_quad_layer_rect.size());
-
-  BlendMode shader_blend_mode =
-      params->use_shaders_for_blending
-          ? BlendModeFromSkXfermode(params->blend_mode)
-          : BLEND_MODE_NONE;
-
-  SamplerType sampler_type = SAMPLER_TYPE_2D;
-  MaskMode mask_mode = NO_MASK;
-  bool mask_for_background = params->mask_for_background;
-  if (params->mask_resource_lock) {
-    mask_mode = HAS_MASK;
-    sampler_type =
-        SamplerTypeFromTextureTarget(params->mask_resource_lock->target());
-  }
-  SetUseProgram(
-      ProgramKey::RenderPass(
-          tex_coord_precision, sampler_type, shader_blend_mode,
-          params->use_aa ? USE_AA : NO_AA, mask_mode, mask_for_background,
-          params->use_color_matrix, tint_gl_composited_content_,
-          params->apply_shader_based_rounded_corner &&
-              ShouldApplyRoundedCorner(params->quad)),
-      params->contents_and_bypass_color_space, target_color_space);
-}
-
-void GLRenderer::UpdateRPDQUniforms(DrawRenderPassDrawQuadParams* params) {
-  gfx::RectF tex_rect = params->tex_coord_rect;
-
-  gfx::Size texture_size;
-  if (params->filter_image) {
-    texture_size.set_width(params->filter_image->width());
-    texture_size.set_height(params->filter_image->height());
-  } else if (params->contents_texture) {
-    texture_size = params->contents_texture->size();
-  } else {
-    texture_size = params->bypass_quad_texture.size;
-  }
-
-  tex_rect.Scale(1.0f / texture_size.width(), 1.0f / texture_size.height());
-
-  DCHECK(current_program_->vertex_tex_transform_location() != -1 ||
-         IsContextLost());
-  if (params->source_needs_flip) {
-    // Flip the content vertically in the shader, as the RenderPass input
-    // texture is already oriented the same way as the framebuffer, but the
-    // projection transform does a flip.
-    gl_->Uniform4f(current_program_->vertex_tex_transform_location(),
-                   tex_rect.x(), 1.0f - tex_rect.y(), tex_rect.width(),
-                   -tex_rect.height());
-  } else {
-    // Tile textures are oriented opposite the framebuffer, so can use
-    // the projection transform to do the flip.
-    gl_->Uniform4f(current_program_->vertex_tex_transform_location(),
-                   tex_rect.x(), tex_rect.y(), tex_rect.width(),
-                   tex_rect.height());
-  }
-
-  GLint last_texture_unit = 0;
-  if (current_program_->mask_sampler_location() != -1) {
-    DCHECK(params->mask_resource_lock);
-    DCHECK_NE(current_program_->mask_tex_coord_scale_location(), 1);
-    DCHECK_NE(current_program_->mask_tex_coord_offset_location(), 1);
-    gl_->Uniform1i(current_program_->mask_sampler_location(), 1);
-
-    gfx::RectF mask_uv_rect = params->quad->mask_uv_rect;
-    if (SamplerTypeFromTextureTarget(params->mask_resource_lock->target()) !=
-        SAMPLER_TYPE_2D) {
-      mask_uv_rect.Scale(params->quad->mask_texture_size.width(),
-                         params->quad->mask_texture_size.height());
-    }
-
-    SkMatrix tex_to_mask = SkMatrix::RectToRect(RectFToSkRect(tex_rect),
-                                                RectFToSkRect(mask_uv_rect));
-
-    if (params->source_needs_flip) {
-      // Mask textures are oriented vertically flipped relative to the
-      // framebuffer and the RenderPass contents texture, so we flip the tex
-      // coords from the RenderPass texture to find the mask texture coords.
-      tex_to_mask.preTranslate(0, 1);
-      tex_to_mask.preScale(1, -1);
-    }
-
-    gl_->Uniform2f(current_program_->mask_tex_coord_offset_location(),
-                   tex_to_mask.getTranslateX(), tex_to_mask.getTranslateY());
-    gl_->Uniform2f(current_program_->mask_tex_coord_scale_location(),
-                   tex_to_mask.getScaleX(), tex_to_mask.getScaleY());
-    last_texture_unit = 1;
-  }
-
-  if (current_program_->edge_location() != -1)
-    gl_->Uniform3fv(current_program_->edge_location(), 8, params->edge);
-
-  if (current_program_->color_matrix_location() != -1) {
-    float matrix[16];
-    for (int i = 0; i < 4; ++i) {
-      for (int j = 0; j < 4; ++j)
-        matrix[i * 4 + j] = SkScalarToFloat(params->color_matrix[j * 5 + i]);
-    }
-    gl_->UniformMatrix4fv(current_program_->color_matrix_location(), 1, false,
-                          matrix);
-  }
-
-  if (current_program_->color_offset_location() != -1) {
-    float offset[4];
-    for (int i = 0; i < 4; ++i)
-      offset[i] = params->color_matrix[i * 5 + 4];
-
-    gl_->Uniform4fv(current_program_->color_offset_location(), 1, offset);
-  }
-
-  if (current_program_->tint_color_matrix_location() != -1) {
-    auto matrix = cc::DebugColors::TintCompositedContentColorTransformMatrix();
-    gl_->UniformMatrix4fv(current_program_->tint_color_matrix_location(), 1,
-                          false, matrix.data());
-  }
-
-  if (current_program_->backdrop_location() != -1) {
-    DCHECK(params->background_texture || params->background_image_id);
-    DCHECK_NE(current_program_->backdrop_location(), 0);
-    DCHECK_NE(current_program_->backdrop_rect_location(), 0);
-
-    ++last_texture_unit;
-    gl_->Uniform1i(current_program_->backdrop_location(), last_texture_unit);
-
-    gl_->Uniform4f(current_program_->backdrop_rect_location(),
-                   params->background_rect.x(), params->background_rect.y(),
-                   1.0f / params->background_rect.width(),
-                   1.0f / params->background_rect.height());
-
-    // Either |background_image_id| or |background_texture| will be the
-    // |backdrop_location| in the shader.
-    if (params->background_image_id) {
-      gl_->ActiveTexture(GL_TEXTURE0 + last_texture_unit);
-      gl_->BindTexture(GL_TEXTURE_2D, params->background_image_id);
-      if (params->backdrop_filter_quality != 1.0f)
-        gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-      gl_->ActiveTexture(GL_TEXTURE0);
-    }
-    // If |mask_for_background| then we have both |background_image_id| and
-    // |background_texture|, and the latter will be the
-    // |original_backdrop_location| in the shader.
-    if (params->mask_for_background) {
-      DCHECK(params->background_image_id);
-      DCHECK(params->background_texture);
-      ++last_texture_unit;
-      gl_->Uniform1i(current_program_->original_backdrop_location(),
-                     last_texture_unit);
-    }
-    if (params->background_texture) {
-      gl_->ActiveTexture(GL_TEXTURE0 + last_texture_unit);
-      gl_->BindTexture(GL_TEXTURE_2D, params->background_texture);
-      gl_->ActiveTexture(GL_TEXTURE0);
-    }
-  }
-
-  SetShaderOpacity(params->quad->shared_quad_state->opacity);
-  if (current_program_->rounded_corner_rect_location() != -1) {
-    SetShaderRoundedCorner(params->quad->shared_quad_state->mask_filter_info
-                               .rounded_corner_bounds(),
-                           params->window_matrix * params->projection_matrix);
-  }
-  SetShaderQuadF(params->surface_quad);
-}
-
-void GLRenderer::DrawRPDQ(const DrawRenderPassDrawQuadParams& params) {
-  DrawQuadGeometry(params.projection_matrix, params.quad_to_target_transform,
-                   params.dst_rect);
-
-  // Flush the compositor context before the filter bitmap goes out of
-  // scope, so the draw gets processed before the filter texture gets deleted.
-  if (params.filter_image)
-    gl_->Flush();
-
-  if (!params.use_shaders_for_blending)
-    RestoreBlendFuncToDefault(params.blend_mode);
-}
-
-namespace {
-// These functions determine if a quad, clipped by a clip_region contains
-// the entire {top|bottom|left|right} edge.
-bool is_top(const gfx::QuadF* clip_region, const DrawQuad* quad) {
-  if (!quad->IsTopEdge())
-    return false;
-  if (!clip_region)
-    return true;
-
-  return std::abs(clip_region->p1().y()) < kAntiAliasingEpsilon &&
-         std::abs(clip_region->p2().y()) < kAntiAliasingEpsilon;
-}
-
-bool is_bottom(const gfx::QuadF* clip_region, const DrawQuad* quad) {
-  if (!quad->IsBottomEdge())
-    return false;
-  if (!clip_region)
-    return true;
-
-  return std::abs(clip_region->p3().y() -
-                  quad->shared_quad_state->quad_layer_rect.height()) <
-             kAntiAliasingEpsilon &&
-         std::abs(clip_region->p4().y() -
-                  quad->shared_quad_state->quad_layer_rect.height()) <
-             kAntiAliasingEpsilon;
-}
-
-bool is_left(const gfx::QuadF* clip_region, const DrawQuad* quad) {
-  if (!quad->IsLeftEdge())
-    return false;
-  if (!clip_region)
-    return true;
-
-  return std::abs(clip_region->p1().x()) < kAntiAliasingEpsilon &&
-         std::abs(clip_region->p4().x()) < kAntiAliasingEpsilon;
-}
-
-bool is_right(const gfx::QuadF* clip_region, const DrawQuad* quad) {
-  if (!quad->IsRightEdge())
-    return false;
-  if (!clip_region)
-    return true;
-
-  return std::abs(clip_region->p2().x() -
-                  quad->shared_quad_state->quad_layer_rect.width()) <
-             kAntiAliasingEpsilon &&
-         std::abs(clip_region->p3().x() -
-                  quad->shared_quad_state->quad_layer_rect.width()) <
-             kAntiAliasingEpsilon;
-}
-}  // anonymous namespace
-
-static gfx::QuadF GetDeviceQuadWithAntialiasingOnExteriorEdges(
-    const LayerQuad& device_layer_edges,
-    const gfx::Transform& device_transform,
-    const gfx::QuadF& tile_quad,
-    const gfx::QuadF* clip_region,
-    const DrawQuad* quad) {
-  auto tile_rect = gfx::RectF(quad->visible_rect);
-
-  gfx::PointF bottom_right = tile_quad.p3();
-  gfx::PointF bottom_left = tile_quad.p4();
-  gfx::PointF top_left = tile_quad.p1();
-  gfx::PointF top_right = tile_quad.p2();
-  bool clipped = false;
-
-  // Map points to device space. We ignore |clipped|, since the result of
-  // |MapPoint()| still produces a valid point to draw the quad with. When
-  // clipped, the point will be outside of the viewport. See crbug.com/416367.
-  bottom_right =
-      cc::MathUtil::MapPoint(device_transform, bottom_right, &clipped);
-  bottom_left = cc::MathUtil::MapPoint(device_transform, bottom_left, &clipped);
-  top_left = cc::MathUtil::MapPoint(device_transform, top_left, &clipped);
-  top_right = cc::MathUtil::MapPoint(device_transform, top_right, &clipped);
-
-  LayerQuad::Edge bottom_edge(bottom_right, bottom_left);
-  LayerQuad::Edge left_edge(bottom_left, top_left);
-  LayerQuad::Edge top_edge(top_left, top_right);
-  LayerQuad::Edge right_edge(top_right, bottom_right);
-
-  // Only apply anti-aliasing to edges not clipped by culling or scissoring.
-  // If an edge is degenerate we do not want to replace it with a "proper" edge
-  // as that will cause the quad to possibly expand in strange ways.
-  if (!top_edge.degenerate() && is_top(clip_region, quad) &&
-      tile_rect.y() == quad->rect.y()) {
-    top_edge = device_layer_edges.top();
-  }
-  if (!left_edge.degenerate() && is_left(clip_region, quad) &&
-      tile_rect.x() == quad->rect.x()) {
-    left_edge = device_layer_edges.left();
-  }
-  if (!right_edge.degenerate() && is_right(clip_region, quad) &&
-      tile_rect.right() == quad->rect.right()) {
-    right_edge = device_layer_edges.right();
-  }
-  if (!bottom_edge.degenerate() && is_bottom(clip_region, quad) &&
-      tile_rect.bottom() == quad->rect.bottom()) {
-    bottom_edge = device_layer_edges.bottom();
-  }
-
-  float sign = tile_quad.IsCounterClockwise() ? -1 : 1;
-  bottom_edge.scale(sign);
-  left_edge.scale(sign);
-  top_edge.scale(sign);
-  right_edge.scale(sign);
-
-  // Create device space quad.
-  return LayerQuad(left_edge, top_edge, right_edge, bottom_edge).ToQuadF();
-}
-
-float GetTotalQuadError(const gfx::QuadF* clipped_quad,
-                        const gfx::QuadF* ideal_rect) {
-  return (clipped_quad->p1() - ideal_rect->p1()).LengthSquared() +
-         (clipped_quad->p2() - ideal_rect->p2()).LengthSquared() +
-         (clipped_quad->p3() - ideal_rect->p3()).LengthSquared() +
-         (clipped_quad->p4() - ideal_rect->p4()).LengthSquared();
-}
-
-// Attempt to rotate the clipped quad until it lines up the most
-// correctly. This is necessary because we check the edges of this
-// quad against the expected left/right/top/bottom for anti-aliasing.
-void AlignQuadToBoundingBox(gfx::QuadF* clipped_quad) {
-  auto bounding_quad = gfx::QuadF(clipped_quad->BoundingBox());
-  gfx::QuadF best_rotation = *clipped_quad;
-  float least_error_amount = GetTotalQuadError(clipped_quad, &bounding_quad);
-  for (size_t i = 1; i < 4; ++i) {
-    clipped_quad->Realign(1);
-    float new_error = GetTotalQuadError(clipped_quad, &bounding_quad);
-    if (new_error < least_error_amount) {
-      least_error_amount = new_error;
-      best_rotation = *clipped_quad;
-    }
-  }
-  *clipped_quad = best_rotation;
-}
-
-void InflateAntiAliasingDistances(const gfx::QuadF& quad,
-                                  LayerQuad* device_layer_edges,
-                                  float edge[24]) {
-  DCHECK(!quad.BoundingBox().IsEmpty());
-  LayerQuad device_layer_bounds(gfx::QuadF(quad.BoundingBox()));
-
-  device_layer_edges->InflateAntiAliasingDistance();
-  device_layer_edges->ToFloatArray(edge);
-
-  device_layer_bounds.InflateAntiAliasingDistance();
-  device_layer_bounds.ToFloatArray(&edge[12]);
-}
-
-// static
-bool GLRenderer::ShouldAntialiasQuad(const gfx::QuadF& device_layer_quad,
-                                     bool clipped,
-                                     bool force_aa) {
-  // AAing clipped quads is not supported by the code yet.
-  if (clipped)
-    return false;
-  if (device_layer_quad.BoundingBox().IsEmpty())
-    return false;
-  if (force_aa)
-    return true;
-
-  bool is_axis_aligned_in_target = device_layer_quad.IsRectilinear();
-  bool is_nearest_rect_within_epsilon =
-      is_axis_aligned_in_target &&
-      gfx::IsNearestRectWithinDistance(device_layer_quad.BoundingBox(),
-                                       kAntiAliasingEpsilon);
-  return !is_nearest_rect_within_epsilon;
-}
-
-// static
-void GLRenderer::SetupQuadForClippingAndAntialiasing(
-    const gfx::Transform& device_transform,
-    const DrawQuad* quad,
-    const gfx::QuadF* aa_quad,
-    const gfx::QuadF* clip_region,
-    gfx::QuadF* local_quad,
-    float edge[24]) {
-  gfx::QuadF rotated_clip;
-  const gfx::QuadF* local_clip_region = clip_region;
-  if (local_clip_region) {
-    rotated_clip = *clip_region;
-    AlignQuadToBoundingBox(&rotated_clip);
-    local_clip_region = &rotated_clip;
-  }
-
-  if (!aa_quad) {
-    if (local_clip_region)
-      *local_quad = *local_clip_region;
-    return;
-  }
-
-  LayerQuad device_layer_edges(*aa_quad);
-  InflateAntiAliasingDistances(*aa_quad, &device_layer_edges, edge);
-
-  // If we have a clip region then we are split, and therefore
-  // by necessity, at least one of our edges is not an external
-  // one.
-  bool is_full_rect = quad->visible_rect == quad->rect;
-
-  bool region_contains_all_outside_edges =
-      is_full_rect &&
-      (is_top(local_clip_region, quad) && is_left(local_clip_region, quad) &&
-       is_bottom(local_clip_region, quad) && is_right(local_clip_region, quad));
-
-  bool use_aa_on_all_four_edges =
-      !local_clip_region && region_contains_all_outside_edges;
-
-  gfx::QuadF device_quad;
-  if (use_aa_on_all_four_edges) {
-    device_quad = device_layer_edges.ToQuadF();
-  } else {
-    gfx::QuadF tile_quad(local_clip_region
-                             ? *local_clip_region
-                             : gfx::QuadF(gfx::RectF(quad->visible_rect)));
-    device_quad = GetDeviceQuadWithAntialiasingOnExteriorEdges(
-        device_layer_edges, device_transform, tile_quad, local_clip_region,
-        quad);
-  }
-
-  *local_quad =
-      cc::MathUtil::InverseMapQuadToLocalSpace(device_transform, device_quad);
-}
-
-// static
-void GLRenderer::SetupRenderPassQuadForClippingAndAntialiasing(
-    const gfx::Transform& device_transform,
-    const AggregatedRenderPassDrawQuad* quad,
-    const gfx::QuadF* aa_quad,
-    const gfx::QuadF* clip_region,
-    gfx::QuadF* local_quad,
-    float edge[24]) {
-  gfx::QuadF rotated_clip;
-  const gfx::QuadF* local_clip_region = clip_region;
-  if (local_clip_region) {
-    rotated_clip = *clip_region;
-    AlignQuadToBoundingBox(&rotated_clip);
-    local_clip_region = &rotated_clip;
-  }
-
-  if (!aa_quad) {
-    GetScaledRegion(quad->rect, local_clip_region, local_quad);
-    return;
-  }
-
-  LayerQuad device_layer_edges(*aa_quad);
-  InflateAntiAliasingDistances(*aa_quad, &device_layer_edges, edge);
-
-  gfx::QuadF device_quad;
-
-  // Apply anti-aliasing only to the edges that are not being clipped
-  if (local_clip_region) {
-    gfx::QuadF tile_quad(gfx::RectF(quad->visible_rect));
-    GetScaledRegion(quad->rect, local_clip_region, &tile_quad);
-    device_quad = GetDeviceQuadWithAntialiasingOnExteriorEdges(
-        device_layer_edges, device_transform, tile_quad, local_clip_region,
-        quad);
-  } else {
-    device_quad = device_layer_edges.ToQuadF();
-  }
-
-  *local_quad =
-      cc::MathUtil::InverseMapQuadToLocalSpace(device_transform, device_quad);
-}
-
-void GLRenderer::DrawSolidColorQuad(const SolidColorDrawQuad* quad,
-                                    const gfx::QuadF* clip_region) {
-  gfx::Rect tile_rect = quad->visible_rect;
-
-  SkColor color = quad->color;
-  float opacity = quad->shared_quad_state->opacity;
-
-  // Early out if alpha is small enough that quad doesn't contribute to output,
-  // for kSrcOver blend mode.
-  if (quad->shared_quad_state->blend_mode == SkBlendMode::kSrcOver) {
-    float alpha = (SkColorGetA(color) * (1.0f / 255.0f)) * opacity;
-    if (alpha < std::numeric_limits<float>::epsilon() &&
-        quad->ShouldDrawWithBlending() &&
-        quad->shared_quad_state->blend_mode == SkBlendMode::kSrcOver)
-      return;
-  }
-
-  gfx::Transform device_transform =
-      current_frame()->window_matrix * current_frame()->projection_matrix *
-      quad->shared_quad_state->quad_to_target_transform;
-  device_transform.FlattenTo2d();
-  if (!device_transform.IsInvertible())
-    return;
-
-  auto local_quad = gfx::QuadF(gfx::RectF(tile_rect));
-
-  gfx::QuadF device_layer_quad;
-  bool use_aa = false;
-  bool allow_aa = settings_->allow_antialiasing &&
-                  !quad->force_anti_aliasing_off && quad->IsEdge();
-
-  if (allow_aa) {
-    bool clipped = false;
-    bool force_aa = false;
-    device_layer_quad = cc::MathUtil::MapQuad(
-        device_transform,
-        gfx::QuadF(
-            gfx::RectF(quad->shared_quad_state->visible_quad_layer_rect)),
-        &clipped);
-    use_aa = ShouldAntialiasQuad(device_layer_quad, clipped, force_aa);
-  }
-
-  ScopedTimerQuery scoped_timer_query(CompositeTimeTracingEnabled(), gl_,
-                                      &timer_queries_,
-                                      use_aa ? "kSolidColorAA" : "kSolidColor");
-
-  float edge[24];
-  const gfx::QuadF* aa_quad = use_aa ? &device_layer_quad : nullptr;
-  SetupQuadForClippingAndAntialiasing(device_transform, quad, aa_quad,
-                                      clip_region, &local_quad, edge);
-
-  SetUseProgram(ProgramKey::SolidColor(use_aa ? USE_AA : NO_AA,
-                                       tint_gl_composited_content_,
-                                       ShouldApplyRoundedCorner(quad)),
-                CurrentRenderPassColorSpace(), CurrentRenderPassColorSpace());
-
-  gfx::ColorSpace quad_color_space = gfx::ColorSpace::CreateSRGB();
-  SkColor4f color_f = SkColor4f::FromColor(color);
-
-  // Apply color transform if the color space or source and target do not match.
-  if (quad_color_space != CurrentRenderPassColorSpace()) {
-    const gfx::ColorTransform* color_transform =
-        GetColorTransform(quad_color_space, CurrentRenderPassColorSpace());
-    gfx::ColorTransform::TriStim col(color_f.fR, color_f.fG, color_f.fB);
-    color_transform->Transform(&col, 1);
-    color_f.fR = col.x();
-    color_f.fG = col.y();
-    color_f.fB = col.z();
-    color = color_f.toSkColor();
-  }
-
-  // Apply any color matrix that may be present.
-  if (HasOutputColorMatrix()) {
-    const SkM44& output_color_matrix = output_surface_->color_matrix();
-    const SkV4 color_v{color_f.fR, color_f.fG, color_f.fB, color_f.fA};
-    const SkV4 result = output_color_matrix * color_v;
-    std::copy(result.ptr(), result.ptr() + 4, color_f.vec());
-    color = color_f.toSkColor();
-  }
-
-  // Try using glClear to draw the solid color quad if possible. This is much
-  // more performant than executing the shader pipeline.
-  if (CanUseFastSolidColorDraw(quad) && !use_aa) {
-    // Pre-multiply the alpha and opacity to get the correct blending in case of
-    // transparent buffers. glClear does not have any alpha blending stage.
-    Float4 result = PremultipliedColor(color, opacity);
-    SkRGBA4f<kPremul_SkAlphaType> color_f_premul;
-    std::copy(result.data, result.data + 4, color_f_premul.vec());
-
-    gfx::RectF quad_rect_in_target_f(quad->visible_rect);
-
-    device_transform.TransformRect(&quad_rect_in_target_f);
-    gfx::Rect quad_rect_in_target = gfx::ToRoundedRect(quad_rect_in_target_f);
-
-    // If we are using partial swap, make sure the new scissor rect is within
-    // the partial swap bounds.
-    if (!scissor_rect_.IsEmpty() && is_scissor_enabled_)
-      quad_rect_in_target.Intersect(scissor_rect_);
-
-    gl_->Enable(GL_SCISSOR_TEST);
-    gl_->Scissor(quad_rect_in_target.x(), quad_rect_in_target.y(),
-                 quad_rect_in_target.width(), quad_rect_in_target.height());
-
-    gl_->ClearColor(color_f_premul.fR, color_f_premul.fG, color_f_premul.fB,
-                    color_f_premul.fA);
-    gl_->Clear(GL_COLOR_BUFFER_BIT);
-
-    // Restore GL scissor state.
-    if (is_scissor_enabled_)
-      gl_->Enable(GL_SCISSOR_TEST);
-    else
-      gl_->Disable(GL_SCISSOR_TEST);
-
-    gl_->Scissor(scissor_rect_.x(), scissor_rect_.y(), scissor_rect_.width(),
-                 scissor_rect_.height());
-  } else {
-    SetShaderColor(color, opacity);
-    if (current_program_->rounded_corner_rect_location() != -1) {
-      SetShaderRoundedCorner(
-          quad->shared_quad_state->mask_filter_info.rounded_corner_bounds(),
-          current_frame()->window_matrix * current_frame()->projection_matrix);
-    }
-
-    if (current_program_->tint_color_matrix_location() != -1) {
-      auto matrix =
-          cc::DebugColors::TintCompositedContentColorTransformMatrix();
-      gl_->UniformMatrix4fv(current_program_->tint_color_matrix_location(), 1,
-                            false, matrix.data());
-    }
-
-    if (use_aa) {
-      gl_->Uniform3fv(current_program_->edge_location(), 8, edge);
-    }
-
-    // Enable blending when the quad properties require it or if we decided
-    // to use antialiasing.
-    SetBlendEnabled(quad->ShouldDrawWithBlending() || use_aa);
-    ApplyBlendModeUsingBlendFunc(quad->shared_quad_state->blend_mode);
-
-    // Antialiasing requires a normalized quad, but this could lead to floating
-    // point precision errors, so only normalize when antialiasing is on.
-    if (use_aa) {
-      DrawQuadGeometryWithAA(quad, &local_quad, tile_rect);
-    } else {
-      PrepareGeometry(SHARED_BINDING);
-      SetShaderQuadF(local_quad);
-      SetShaderMatrix(current_frame()->projection_matrix *
-                      quad->shared_quad_state->quad_to_target_transform);
-      gl_->DrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, nullptr);
-      num_triangles_drawn_ += 2;
-    }
-    RestoreBlendFuncToDefault(quad->shared_quad_state->blend_mode);
-  }
-
-  // Add the quad to the region that has been drawn.
-  AccumulateDrawRects(quad->visible_rect,
-                      quad->shared_quad_state->quad_to_target_transform,
-                      &drawn_rects_);
-}
-
-void GLRenderer::DrawTileQuad(const TileDrawQuad* quad,
-                              const gfx::QuadF* clip_region) {
-  DrawContentQuad(quad, quad->resource_id(), clip_region);
-}
-
-void GLRenderer::DrawContentQuad(const ContentDrawQuadBase* quad,
-                                 ResourceId resource_id,
-                                 const gfx::QuadF* clip_region) {
-  gfx::Transform device_transform =
-      current_frame()->window_matrix * current_frame()->projection_matrix *
-      quad->shared_quad_state->quad_to_target_transform;
-  device_transform.FlattenTo2d();
-
-  gfx::QuadF device_layer_quad;
-  bool use_aa = false;
-  bool allow_aa = settings_->allow_antialiasing &&
-                  !quad->force_anti_aliasing_off && quad->IsEdge();
-  if (allow_aa) {
-    bool clipped = false;
-    bool force_aa = false;
-    device_layer_quad = cc::MathUtil::MapQuad(
-        device_transform,
-        gfx::QuadF(
-            gfx::RectF(quad->shared_quad_state->visible_quad_layer_rect)),
-        &clipped);
-    use_aa = ShouldAntialiasQuad(device_layer_quad, clipped, force_aa);
-  }
-
-  // TODO(timav): simplify coordinate transformations in DrawContentQuadAA
-  // similar to the way DrawContentQuadNoAA works and then consider
-  // combining DrawContentQuadAA and DrawContentQuadNoAA into one method.
-  if (use_aa)
-    DrawContentQuadAA(quad, resource_id, device_transform, device_layer_quad,
-                      clip_region);
-  else
-    DrawContentQuadNoAA(quad, resource_id, clip_region);
-
-  AccumulateDrawRects(quad->visible_rect,
-                      quad->shared_quad_state->quad_to_target_transform,
-                      &drawn_rects_);
-}
-
-void GLRenderer::DrawContentQuadAA(const ContentDrawQuadBase* quad,
-                                   ResourceId resource_id,
-                                   const gfx::Transform& device_transform,
-                                   const gfx::QuadF& aa_quad,
-                                   const gfx::QuadF* clip_region) {
-  if (!device_transform.IsInvertible())
-    return;
-
-  ScopedTimerQuery scoped_timer_query(CompositeTimeTracingEnabled(), gl_,
-                                      &timer_queries_, "kTiledContentAA");
-
-  gfx::Rect tile_rect = quad->visible_rect;
-
-  gfx::RectF tex_coord_rect = cc::MathUtil::ScaleRectProportional(
-      quad->tex_coord_rect, gfx::RectF(quad->rect), gfx::RectF(tile_rect));
-  float tex_to_geom_scale_x = quad->rect.width() / quad->tex_coord_rect.width();
-  float tex_to_geom_scale_y =
-      quad->rect.height() / quad->tex_coord_rect.height();
-
-  gfx::RectF clamp_geom_rect(tile_rect);
-  gfx::RectF clamp_tex_rect(tex_coord_rect);
-  // Clamp texture coordinates to avoid sampling outside the layer
-  // by deflating the tile region half a texel or half a texel
-  // minus epsilon for one pixel layers. The resulting clamp region
-  // is mapped to the unit square by the vertex shader and mapped
-  // back to normalized texture coordinates by the fragment shader
-  // after being clamped to 0-1 range.
-  float tex_clamp_x =
-      std::min(0.5f, 0.5f * clamp_tex_rect.width() - kAntiAliasingEpsilon);
-  float tex_clamp_y =
-      std::min(0.5f, 0.5f * clamp_tex_rect.height() - kAntiAliasingEpsilon);
-  float geom_clamp_x =
-      std::min(tex_clamp_x * tex_to_geom_scale_x,
-               0.5f * clamp_geom_rect.width() - kAntiAliasingEpsilon);
-  float geom_clamp_y =
-      std::min(tex_clamp_y * tex_to_geom_scale_y,
-               0.5f * clamp_geom_rect.height() - kAntiAliasingEpsilon);
-  clamp_geom_rect.Inset(gfx::InsetsF::VH(geom_clamp_y, geom_clamp_x));
-  clamp_tex_rect.Inset(gfx::InsetsF::VH(tex_clamp_y, tex_clamp_x));
-
-  // Map clamping rectangle to unit square.
-  float vertex_tex_translate_x = -clamp_geom_rect.x() / clamp_geom_rect.width();
-  float vertex_tex_translate_y =
-      -clamp_geom_rect.y() / clamp_geom_rect.height();
-  float vertex_tex_scale_x = tile_rect.width() / clamp_geom_rect.width();
-  float vertex_tex_scale_y = tile_rect.height() / clamp_geom_rect.height();
-
-  TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired(
-      gl_, &highp_threshold_cache_, settings_->highp_threshold_min,
-      quad->texture_size);
-
-  auto local_quad = gfx::QuadF(gfx::RectF(tile_rect));
-  float edge[24];
-  SetupQuadForClippingAndAntialiasing(device_transform, quad, &aa_quad,
-                                      clip_region, &local_quad, edge);
-  DisplayResourceProviderGL::ScopedSamplerGL quad_resource_lock(
-      resource_provider(), resource_id,
-      quad->nearest_neighbor ? GL_NEAREST : GL_LINEAR);
-  SamplerType sampler =
-      SamplerTypeFromTextureTarget(quad_resource_lock.target());
-
-  float fragment_tex_translate_x = clamp_tex_rect.x();
-  float fragment_tex_translate_y = clamp_tex_rect.y();
-  float fragment_tex_scale_x = clamp_tex_rect.width();
-  float fragment_tex_scale_y = clamp_tex_rect.height();
-
-  // Map to normalized texture coordinates.
-  if (sampler != SAMPLER_TYPE_2D_RECT) {
-    gfx::Size texture_size = quad->texture_size;
-    DCHECK(!texture_size.IsEmpty());
-    fragment_tex_translate_x /= texture_size.width();
-    fragment_tex_translate_y /= texture_size.height();
-    fragment_tex_scale_x /= texture_size.width();
-    fragment_tex_scale_y /= texture_size.height();
-  }
-
-  SetUseProgram(
-      ProgramKey::Tile(tex_coord_precision, sampler, USE_AA,
-                       quad->is_premultiplied ? PREMULTIPLIED_ALPHA
-                                              : NON_PREMULTIPLIED_ALPHA,
-                       false, false, tint_gl_composited_content_,
-                       ShouldApplyRoundedCorner(quad)),
-      quad_resource_lock.color_space(), CurrentRenderPassColorSpace());
-
-  if (current_program_->tint_color_matrix_location() != -1) {
-    auto matrix = cc::DebugColors::TintCompositedContentColorTransformMatrix();
-    gl_->UniformMatrix4fv(current_program_->tint_color_matrix_location(), 1,
-                          false, matrix.data());
-  }
-
-  gl_->Uniform3fv(current_program_->edge_location(), 8, edge);
-
-  gl_->Uniform4f(current_program_->vertex_tex_transform_location(),
-                 vertex_tex_translate_x, vertex_tex_translate_y,
-                 vertex_tex_scale_x, vertex_tex_scale_y);
-  gl_->Uniform4f(current_program_->fragment_tex_transform_location(),
-                 fragment_tex_translate_x, fragment_tex_translate_y,
-                 fragment_tex_scale_x, fragment_tex_scale_y);
-
-  // Blending is required for antialiasing.
-  SetBlendEnabled(true);
-  SetShaderOpacity(quad->shared_quad_state->opacity);
-  if (current_program_->rounded_corner_rect_location() != -1) {
-    SetShaderRoundedCorner(
-        quad->shared_quad_state->mask_filter_info.rounded_corner_bounds(),
-        current_frame()->window_matrix * current_frame()->projection_matrix);
-  }
-  DCHECK(CanApplyBlendModeUsingBlendFunc(quad->shared_quad_state->blend_mode));
-  ApplyBlendModeUsingBlendFunc(quad->shared_quad_state->blend_mode);
-
-  // Draw the quad with antialiasing.
-  DrawQuadGeometryWithAA(quad, &local_quad, tile_rect);
-  RestoreBlendFuncToDefault(quad->shared_quad_state->blend_mode);
-}
-
-void GLRenderer::DrawContentQuadNoAA(const ContentDrawQuadBase* quad,
-                                     ResourceId resource_id,
-                                     const gfx::QuadF* clip_region) {
-  gfx::RectF tex_coord_rect = cc::MathUtil::ScaleRectProportional(
-      quad->tex_coord_rect, gfx::RectF(quad->rect),
-      gfx::RectF(quad->visible_rect));
-  float tex_to_geom_scale_x = quad->rect.width() / quad->tex_coord_rect.width();
-  float tex_to_geom_scale_y =
-      quad->rect.height() / quad->tex_coord_rect.height();
-
-  ScopedTimerQuery scoped_timer_query(CompositeTimeTracingEnabled(), gl_,
-                                      &timer_queries_, "kTiledContent");
-
-  bool scaled = (tex_to_geom_scale_x != 1.f || tex_to_geom_scale_y != 1.f);
-  GLenum filter = (scaled || !quad->shared_quad_state->quad_to_target_transform
-                                  .IsIdentityOrIntegerTranslation()) &&
-                          !quad->nearest_neighbor
-                      ? GL_LINEAR
-                      : GL_NEAREST;
-
-  DisplayResourceProviderGL::ScopedSamplerGL quad_resource_lock(
-      resource_provider(), resource_id, filter);
-  SamplerType sampler =
-      SamplerTypeFromTextureTarget(quad_resource_lock.target());
-
-  // Tiles are guaranteed to have been entirely filled except for the
-  // bottom/right external edge tiles.  Because of border texels, any
-  // internal edge will have uvs that are offset from 0 and 1, so
-  // clamping to tex_coord_rect in all cases would cause these border
-  // texels to not be sampled.  Therefore, only clamp texture coordinates
-  // for external edge bottom/right tiles that don't have content all
-  // the way to the edge and are using bilinear filtering.
-  gfx::Size texture_size = quad->texture_size;
-  bool fills_right_edge =
-      !quad->IsRightEdge() || texture_size.width() == tex_coord_rect.right();
-  bool fills_bottom_edge =
-      !quad->IsBottomEdge() || texture_size.height() == tex_coord_rect.bottom();
-  bool has_tex_clamp_rect =
-      filter == GL_LINEAR && (!fills_right_edge || !fills_bottom_edge);
-  gfx::SizeF tex_clamp_size(texture_size);
-  // Clamp from the original tex coord rect, instead of the one that has
-  // been adjusted by the visible rect.
-  if (!fills_right_edge)
-    tex_clamp_size.set_width(quad->tex_coord_rect.right() - 0.5f);
-  if (!fills_bottom_edge)
-    tex_clamp_size.set_height(quad->tex_coord_rect.bottom() - 0.5f);
-
-  // Map to normalized texture coordinates.
-  if (sampler != SAMPLER_TYPE_2D_RECT) {
-    DCHECK(!texture_size.IsEmpty());
-    tex_coord_rect.Scale(1.f / texture_size.width(),
-                         1.f / texture_size.height());
-    tex_clamp_size.Scale(1.f / texture_size.width(),
-                         1.f / texture_size.height());
-  }
-
-  TexCoordPrecision tex_coord_precision =
-      TexCoordPrecisionRequired(gl_, &highp_threshold_cache_,
-                                settings_->highp_threshold_min, texture_size);
-  SetUseProgram(
-      ProgramKey::Tile(tex_coord_precision, sampler, NO_AA,
-                       quad->is_premultiplied ? PREMULTIPLIED_ALPHA
-                                              : NON_PREMULTIPLIED_ALPHA,
-                       !quad->ShouldDrawWithBlending(), has_tex_clamp_rect,
-                       tint_gl_composited_content_,
-                       ShouldApplyRoundedCorner(quad)),
-      quad_resource_lock.color_space(), CurrentRenderPassColorSpace());
-
-  if (current_program_->tint_color_matrix_location() != -1) {
-    auto matrix = cc::DebugColors::TintCompositedContentColorTransformMatrix();
-    gl_->UniformMatrix4fv(current_program_->tint_color_matrix_location(), 1,
-                          false, matrix.data());
-  }
-
-  if (has_tex_clamp_rect) {
-    gl_->Uniform4f(current_program_->tex_clamp_rect_location(), 0, 0,
-                   tex_clamp_size.width(), tex_clamp_size.height());
-  }
-  gl_->Uniform4f(current_program_->vertex_tex_transform_location(),
-                 tex_coord_rect.x(), tex_coord_rect.y(), tex_coord_rect.width(),
-                 tex_coord_rect.height());
-
-  DCHECK(CanApplyBlendModeUsingBlendFunc(quad->shared_quad_state->blend_mode));
-  SetBlendEnabled(quad->ShouldDrawWithBlending());
-  ApplyBlendModeUsingBlendFunc(quad->shared_quad_state->blend_mode);
-
-  SetShaderOpacity(quad->shared_quad_state->opacity);
-  if (current_program_->rounded_corner_rect_location() != -1) {
-    SetShaderRoundedCorner(
-        quad->shared_quad_state->mask_filter_info.rounded_corner_bounds(),
-        current_frame()->window_matrix * current_frame()->projection_matrix);
-  }
-
-  // Pass quad coordinates to the uniform in the same order as GeometryBinding
-  // does, then vertices will match the texture mapping in the vertex buffer.
-  // The method SetShaderQuadF() changes the order of vertices and so it's
-  // not used here.
-  auto tile_quad = gfx::QuadF(gfx::RectF(quad->visible_rect));
-  float width = quad->visible_rect.width();
-  float height = quad->visible_rect.height();
-  auto top_left = gfx::PointF(quad->visible_rect.origin());
-  if (clip_region) {
-    tile_quad = *clip_region;
-    float gl_uv[8] = {
-        (tile_quad.p4().x() - top_left.x()) / width,
-        (tile_quad.p4().y() - top_left.y()) / height,
-        (tile_quad.p1().x() - top_left.x()) / width,
-        (tile_quad.p1().y() - top_left.y()) / height,
-        (tile_quad.p2().x() - top_left.x()) / width,
-        (tile_quad.p2().y() - top_left.y()) / height,
-        (tile_quad.p3().x() - top_left.x()) / width,
-        (tile_quad.p3().y() - top_left.y()) / height,
-    };
-    PrepareGeometry(CLIPPED_BINDING);
-    clipped_geometry_->InitializeCustomQuadWithUVs(
-        gfx::QuadF(gfx::RectF(quad->visible_rect)), gl_uv);
-  } else {
-    PrepareGeometry(SHARED_BINDING);
-  }
-  float gl_quad[8] = {
-      tile_quad.p4().x(), tile_quad.p4().y(), tile_quad.p1().x(),
-      tile_quad.p1().y(), tile_quad.p2().x(), tile_quad.p2().y(),
-      tile_quad.p3().x(), tile_quad.p3().y(),
-  };
-  gl_->Uniform2fv(current_program_->quad_location(), 4, gl_quad);
-
-  SetShaderMatrix(current_frame()->projection_matrix *
-                  quad->shared_quad_state->quad_to_target_transform);
-
-  gl_->DrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, nullptr);
-  num_triangles_drawn_ += 2;
-  RestoreBlendFuncToDefault(quad->shared_quad_state->blend_mode);
-}
-
-void GLRenderer::DrawYUVVideoQuad(const YUVVideoDrawQuad* quad,
-                                  const gfx::QuadF* clip_region) {
-  std::string gpu_composite_time_string;
-  if (!clip_region && quad->rect == quad->visible_rect)
-    gpu_composite_time_string = "kYuvVideoContent";
-  else
-    gpu_composite_time_string = "kYuvVideoContentClipped";
-  ScopedTimerQuery scoped_timer_query(CompositeTimeTracingEnabled(), gl_,
-                                      &timer_queries_,
-                                      gpu_composite_time_string);
-
-  SetBlendEnabled(quad->ShouldDrawWithBlending());
-
-  TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired(
-      gl_, &highp_threshold_cache_, settings_->highp_threshold_min,
-      quad->shared_quad_state->visible_quad_layer_rect.size());
-  YUVAlphaTextureMode alpha_texture_mode = quad->a_plane_resource_id()
-                                               ? YUV_HAS_ALPHA_TEXTURE
-                                               : YUV_NO_ALPHA_TEXTURE;
-  UVTextureMode uv_texture_mode =
-      quad->v_plane_resource_id() == quad->u_plane_resource_id()
-          ? UV_TEXTURE_MODE_UV
-          : UV_TEXTURE_MODE_U_V;
-
-  DisplayResourceProviderGL::ScopedSamplerGL y_plane_lock(
-      resource_provider(), quad->y_plane_resource_id(), GL_TEXTURE1, GL_LINEAR);
-  DisplayResourceProviderGL::ScopedSamplerGL u_plane_lock(
-      resource_provider(), quad->u_plane_resource_id(), GL_TEXTURE2, GL_LINEAR);
-  DCHECK_EQ(y_plane_lock.target(), u_plane_lock.target());
-  DCHECK_EQ(y_plane_lock.color_space(), u_plane_lock.color_space());
-
-  // TODO(ccameron): There are currently two sources of the color space: the
-  // resource color space and quad->video_color_space. Remove one of them.
-  gfx::ColorSpace src_color_space = quad->video_color_space;
-  // Invalid or unspecified color spaces should be treated as REC709.
-  if (!src_color_space.IsValid())
-    src_color_space = gfx::ColorSpace::CreateREC709();
-  else
-    DCHECK_EQ(src_color_space, y_plane_lock.color_space());
-  // The source color space should never be RGB.
-  DCHECK_NE(src_color_space, src_color_space.GetAsFullRangeRGB());
-
-  gfx::ColorSpace dst_color_space = CurrentRenderPassColorSpace();
-
-#if BUILDFLAG(IS_WIN)
-  // Force sRGB output on Windows for overlay candidate video quads to match
-  // DirectComposition behavior in case these switch between overlays and
-  // compositing. See https://crbug.com/811118 for details.
-  // Currently if HDR is supported, OverlayProcessor doesn't promote HDR video
-  // frame as overlay candidate. So it's unnecessary to worry about the
-  // compositing-overlay switch here. In addition drawing a HDR video using sRGB
-  // can cancel the advantages of HDR.
-  const bool supports_dc_layers =
-      output_surface_->capabilities().supports_dc_layers;
-  if (supports_dc_layers && !src_color_space.IsHDR() &&
-      resource_provider()->IsOverlayCandidate(quad->y_plane_resource_id())) {
-    DCHECK(
-        resource_provider()->IsOverlayCandidate(quad->u_plane_resource_id()));
-    dst_color_space = gfx::ColorSpace::CreateSRGB();
-  }
-#endif
-
-  // TODO(jbauman): Use absl::optional when available.
-  std::unique_ptr<DisplayResourceProviderGL::ScopedSamplerGL> v_plane_lock;
-  if (uv_texture_mode == UV_TEXTURE_MODE_U_V) {
-    v_plane_lock = std::make_unique<DisplayResourceProviderGL::ScopedSamplerGL>(
-        resource_provider(), quad->v_plane_resource_id(), GL_TEXTURE3,
-        GL_LINEAR);
-    DCHECK_EQ(y_plane_lock.target(), v_plane_lock->target());
-    DCHECK_EQ(y_plane_lock.color_space(), v_plane_lock->color_space());
-  }
-  std::unique_ptr<DisplayResourceProviderGL::ScopedSamplerGL> a_plane_lock;
-  if (alpha_texture_mode == YUV_HAS_ALPHA_TEXTURE) {
-    a_plane_lock = std::make_unique<DisplayResourceProviderGL::ScopedSamplerGL>(
-        resource_provider(), quad->a_plane_resource_id(), GL_TEXTURE4,
-        GL_LINEAR);
-    DCHECK_EQ(y_plane_lock.target(), a_plane_lock->target());
-  }
-
-  // All planes must have the same sampler type.
-  SamplerType sampler = SamplerTypeFromTextureTarget(y_plane_lock.target());
-
-  SetUseProgram(
-      ProgramKey::YUVVideo(tex_coord_precision, sampler, alpha_texture_mode,
-                           uv_texture_mode, tint_gl_composited_content_,
-                           ShouldApplyRoundedCorner(quad)),
-      src_color_space, dst_color_space, /*adjust_src_white_level=*/true);
-
-  if (current_program_->tint_color_matrix_location() != -1) {
-    auto matrix = cc::DebugColors::TintCompositedContentColorTransformMatrix();
-    gl_->UniformMatrix4fv(current_program_->tint_color_matrix_location(), 1,
-                          false, matrix.data());
-  }
-
-  if (current_program_->rounded_corner_rect_location() != -1) {
-    SetShaderRoundedCorner(
-        quad->shared_quad_state->mask_filter_info.rounded_corner_bounds(),
-        current_frame()->window_matrix * current_frame()->projection_matrix);
-  }
-
-  gfx::SizeF ya_tex_scale(1.0f, 1.0f);
-  gfx::SizeF uv_tex_scale(1.0f, 1.0f);
-  if (sampler != SAMPLER_TYPE_2D_RECT) {
-    DCHECK(!quad->ya_tex_size.IsEmpty());
-    DCHECK(!quad->uv_tex_size.IsEmpty());
-    ya_tex_scale = gfx::SizeF(1.0f / quad->ya_tex_size.width(),
-                              1.0f / quad->ya_tex_size.height());
-    uv_tex_scale = gfx::SizeF(1.0f / quad->uv_tex_size.width(),
-                              1.0f / quad->uv_tex_size.height());
-  }
-
-  float ya_vertex_tex_translate_x =
-      quad->ya_tex_coord_rect.x() * ya_tex_scale.width();
-  float ya_vertex_tex_translate_y =
-      quad->ya_tex_coord_rect.y() * ya_tex_scale.height();
-  float ya_vertex_tex_scale_x =
-      quad->ya_tex_coord_rect.width() * ya_tex_scale.width();
-  float ya_vertex_tex_scale_y =
-      quad->ya_tex_coord_rect.height() * ya_tex_scale.height();
-
-  float uv_vertex_tex_translate_x =
-      quad->uv_tex_coord_rect.x() * uv_tex_scale.width();
-  float uv_vertex_tex_translate_y =
-      quad->uv_tex_coord_rect.y() * uv_tex_scale.height();
-  float uv_vertex_tex_scale_x =
-      quad->uv_tex_coord_rect.width() * uv_tex_scale.width();
-  float uv_vertex_tex_scale_y =
-      quad->uv_tex_coord_rect.height() * uv_tex_scale.height();
-
-  gl_->Uniform2f(current_program_->ya_tex_scale_location(),
-                 ya_vertex_tex_scale_x, ya_vertex_tex_scale_y);
-  gl_->Uniform2f(current_program_->ya_tex_offset_location(),
-                 ya_vertex_tex_translate_x, ya_vertex_tex_translate_y);
-  gl_->Uniform2f(current_program_->uv_tex_scale_location(),
-                 uv_vertex_tex_scale_x, uv_vertex_tex_scale_y);
-  gl_->Uniform2f(current_program_->uv_tex_offset_location(),
-                 uv_vertex_tex_translate_x, uv_vertex_tex_translate_y);
-
-  gfx::RectF ya_clamp_rect(ya_vertex_tex_translate_x, ya_vertex_tex_translate_y,
-                           ya_vertex_tex_scale_x, ya_vertex_tex_scale_y);
-  ya_clamp_rect.Inset(gfx::InsetsF::VH(0.5f * ya_tex_scale.height(),
-                                       0.5f * ya_tex_scale.width()));
-  gfx::RectF uv_clamp_rect(uv_vertex_tex_translate_x, uv_vertex_tex_translate_y,
-                           uv_vertex_tex_scale_x, uv_vertex_tex_scale_y);
-  uv_clamp_rect.Inset(gfx::InsetsF::VH(0.5f * uv_tex_scale.height(),
-                                       0.5f * uv_tex_scale.width()));
-  gl_->Uniform4f(current_program_->ya_clamp_rect_location(), ya_clamp_rect.x(),
-                 ya_clamp_rect.y(), ya_clamp_rect.right(),
-                 ya_clamp_rect.bottom());
-  gl_->Uniform4f(current_program_->uv_clamp_rect_location(), uv_clamp_rect.x(),
-                 uv_clamp_rect.y(), uv_clamp_rect.right(),
-                 uv_clamp_rect.bottom());
-
-  gl_->Uniform1i(current_program_->y_texture_location(), 1);
-  if (uv_texture_mode == UV_TEXTURE_MODE_UV) {
-    gl_->Uniform1i(current_program_->uv_texture_location(), 2);
-  } else {
-    gl_->Uniform1i(current_program_->u_texture_location(), 2);
-    gl_->Uniform1i(current_program_->v_texture_location(), 3);
-  }
-  if (alpha_texture_mode == YUV_HAS_ALPHA_TEXTURE)
-    gl_->Uniform1i(current_program_->a_texture_location(), 4);
-
-  gl_->Uniform1f(current_program_->resource_multiplier_location(),
-                 quad->resource_multiplier);
-  gl_->Uniform1f(current_program_->resource_offset_location(),
-                 quad->resource_offset);
-
-  // The transform and vertex data are used to figure out the extents that the
-  // un-antialiased quad should have and which vertex this is and the float
-  // quad passed in via uniform is the actual geometry that gets used to draw
-  // it. This is why this centered rect is used and not the original quad_rect.
-  auto tile_rect = gfx::RectF(quad->rect);
-
-  SetShaderOpacity(quad->shared_quad_state->opacity);
-  if (!clip_region && quad->rect == quad->visible_rect) {
-    DrawQuadGeometry(current_frame()->projection_matrix,
-                     quad->shared_quad_state->quad_to_target_transform,
-                     tile_rect);
-  } else {
-    gfx::QuadF region_quad =
-        clip_region ? *clip_region : gfx::QuadF(gfx::RectF(quad->visible_rect));
-    float uvs[8] = {0};
-    GetScaledUVs(quad->rect, &region_quad, uvs);
-    region_quad.Scale(1.0f / tile_rect.width(), 1.0f / tile_rect.height());
-    region_quad -= gfx::Vector2dF(0.5f, 0.5f);
-    DrawQuadGeometryClippedByQuadF(
-        quad->shared_quad_state->quad_to_target_transform, tile_rect,
-        region_quad, uvs);
-  }
-
-  // Track the region in the current target surface that has been drawn to.
-  AccumulateDrawRects(quad->visible_rect,
-                      quad->shared_quad_state->quad_to_target_transform,
-                      &drawn_rects_);
-}
-
-void GLRenderer::DrawStreamVideoQuad(const StreamVideoDrawQuad* quad,
-                                     const gfx::QuadF* clip_region) {
-  std::string gpu_composite_time_string;
-  if (!clip_region && quad->rect == quad->visible_rect) {
-    gpu_composite_time_string = "kStreamVideoContent";
-  } else {
-    gpu_composite_time_string = "kStreamVideoContentClipped";
-  }
-  ScopedTimerQuery scoped_timer_query(CompositeTimeTracingEnabled(), gl_,
-                                      &timer_queries_,
-                                      gpu_composite_time_string);
-  SetBlendEnabled(quad->ShouldDrawWithBlending());
-
-  DCHECK(output_surface_->context_provider()
-             ->ContextCapabilities()
-             .egl_image_external);
-
-  TexCoordPrecision tex_coord_precision = TexCoordPrecisionRequired(
-      gl_, &highp_threshold_cache_, settings_->highp_threshold_min,
-      quad->shared_quad_state->visible_quad_layer_rect.size());
-
-  DisplayResourceProviderGL::ScopedReadLockGL lock(resource_provider(),
-                                                   quad->resource_id());
-
-  SetUseProgram(ProgramKey::VideoStream(tex_coord_precision,
-                                        ShouldApplyRoundedCorner(quad)),
-                lock.color_space(), CurrentRenderPassColorSpace());
-
-  DCHECK_EQ(GL_TEXTURE0, GetActiveTextureUnit(gl_));
-  gl_->BindTexture(GL_TEXTURE_EXTERNAL_OES, lock.texture_id());
-
-  static float gl_matrix[16];
-  gfx::Transform matrix;
-  matrix.Scale(quad->uv_bottom_right.x() - quad->uv_top_left.x(),
-               quad->uv_bottom_right.y() - quad->uv_top_left.y());
-  matrix.Translate(quad->uv_top_left.x(), quad->uv_top_left.y());
-  ToGLMatrix(&gl_matrix[0], matrix);
-  gl_->UniformMatrix4fv(current_program_->tex_matrix_location(), 1, false,
-                        gl_matrix);
-
-  SetShaderOpacity(quad->shared_quad_state->opacity);
-  if (current_program_->rounded_corner_rect_location() != -1) {
-    SetShaderRoundedCorner(
-        quad->shared_quad_state->mask_filter_info.rounded_corner_bounds(),
-        current_frame()->window_matrix * current_frame()->projection_matrix);
-  }
-  gfx::Size texture_size = lock.size();
-  gfx::RectF uv_visible_rect(quad->uv_top_left.x(), quad->uv_top_left.y(),
-                             quad->uv_bottom_right.x() - quad->uv_top_left.x(),
-                             quad->uv_bottom_right.y() - quad->uv_top_left.y());
-  const SamplerType sampler = SamplerTypeFromTextureTarget(lock.target());
-  Float4 tex_clamp_rect = UVClampRect(uv_visible_rect, texture_size, sampler);
-  gl_->Uniform4f(current_program_->tex_clamp_rect_location(),
-                 tex_clamp_rect.data[0], tex_clamp_rect.data[1],
-                 tex_clamp_rect.data[2], tex_clamp_rect.data[3]);
-
-  auto tile_rect = gfx::RectF(quad->rect);
-
-  if (!clip_region && quad->rect == quad->visible_rect) {
-    DrawQuadGeometry(current_frame()->projection_matrix,
-                     quad->shared_quad_state->quad_to_target_transform,
-                     tile_rect);
-  } else {
-    gfx::QuadF region_quad =
-        clip_region ? *clip_region : gfx::QuadF(gfx::RectF(quad->visible_rect));
-    float uvs[8] = {0};
-    GetScaledUVs(quad->rect, &region_quad, uvs);
-    region_quad.Scale(1.0f / tile_rect.width(), 1.0f / tile_rect.height());
-    region_quad -= gfx::Vector2dF(0.5f, 0.5f);
-    DrawQuadGeometryClippedByQuadF(
-        quad->shared_quad_state->quad_to_target_transform, tile_rect,
-        region_quad, uvs);
-  }
-
-  AccumulateDrawRects(quad->visible_rect,
-                      quad->shared_quad_state->quad_to_target_transform,
-                      &drawn_rects_);
-}
-
-void GLRenderer::FlushTextureQuadCache(BoundGeometry flush_binding) {
-  // Check to see if we have anything to draw.
-  if (draw_cache_.is_empty)
-    return;
-  ScopedTimerQuery scoped_timer_query(CompositeTimeTracingEnabled(), gl_,
-                                      &timer_queries_, "kTextureContentFlush");
-
-  PrepareGeometry(flush_binding);
-
-  // Set the correct blending mode.
-  SetBlendEnabled(draw_cache_.needs_blending);
-
-  // Assume the current active textures is 0.
-  DisplayResourceProviderGL::ScopedSamplerGL locked_quad(
-      resource_provider(), draw_cache_.resource_id,
-      draw_cache_.nearest_neighbor ? GL_NEAREST : GL_LINEAR);
-
-  // Bind the program to the GL state.
-  SetUseProgram(draw_cache_.program_key, locked_quad.color_space(),
-                CurrentRenderPassColorSpace(),
-                /*adjust_src_white_level=*/draw_cache_.is_video_frame,
-                locked_quad.hdr_metadata());
-
-  if (current_program_->rounded_corner_rect_location() != -1) {
-    SetShaderRoundedCorner(
-        draw_cache_.mask_filter_info.rounded_corner_bounds(),
-        current_frame()->window_matrix * current_frame()->projection_matrix);
-  }
-
-  DCHECK_EQ(GL_TEXTURE0, GetActiveTextureUnit(gl_));
-  gl_->BindTexture(locked_quad.target(), locked_quad.texture_id());
-
-  static_assert(sizeof(Float4) == 4 * sizeof(float),
-                "Float4 struct should be densely packed");
-  static_assert(sizeof(Float16) == 16 * sizeof(float),
-                "Float16 struct should be densely packed");
-
-  // Upload the tranforms for both points and uvs.
-  gl_->UniformMatrix4fv(
-      current_program_->matrix_location(),
-      static_cast<int>(draw_cache_.matrix_data.size()), false,
-      reinterpret_cast<float*>(&draw_cache_.matrix_data.front()));
-  gl_->Uniform4fv(current_program_->vertex_tex_transform_location(),
-                  static_cast<int>(draw_cache_.uv_xform_data.size()),
-                  reinterpret_cast<float*>(&draw_cache_.uv_xform_data.front()));
-
-  if (current_program_->tint_color_matrix_location() != -1) {
-    auto matrix = cc::DebugColors::TintCompositedContentColorTransformMatrix();
-    gl_->UniformMatrix4fv(current_program_->tint_color_matrix_location(), 1,
-                          false, matrix.data());
-  }
-
-  if (current_program_->tex_clamp_rect_location() != -1) {
-    // Draw batching is not allowed with texture clamping.
-    DCHECK_EQ(1u, draw_cache_.matrix_data.size());
-    gl_->Uniform4f(current_program_->tex_clamp_rect_location(),
-                   draw_cache_.tex_clamp_rect_data.data[0],
-                   draw_cache_.tex_clamp_rect_data.data[1],
-                   draw_cache_.tex_clamp_rect_data.data[2],
-                   draw_cache_.tex_clamp_rect_data.data[3]);
-  }
-
-  if (draw_cache_.background_color != SK_ColorTRANSPARENT) {
-    Float4 background_color =
-        PremultipliedColor(draw_cache_.background_color, 1.f);
-    gl_->Uniform4fv(current_program_->background_color_location(), 1,
-                    background_color.data);
-  }
-
-  gl_->Uniform1fv(
-      current_program_->vertex_opacity_location(),
-      static_cast<int>(draw_cache_.vertex_opacity_data.size()),
-      static_cast<float*>(&draw_cache_.vertex_opacity_data.front()));
-
-  DCHECK_LE(draw_cache_.matrix_data.size(),
-            static_cast<size_t>(std::numeric_limits<int>::max()) / 6u);
-
-  // Draw the quads!
-  gl_->DrawElements(GL_TRIANGLES,
-                    6 * static_cast<int>(draw_cache_.matrix_data.size()),
-                    GL_UNSIGNED_SHORT, nullptr);
-  num_triangles_drawn_ += 2 * static_cast<int>(draw_cache_.matrix_data.size());
-
-  // Clear the cache.
-  draw_cache_.is_empty = true;
-  draw_cache_.resource_id = kInvalidResourceId;
-  draw_cache_.uv_xform_data.resize(0);
-  draw_cache_.vertex_opacity_data.resize(0);
-  draw_cache_.matrix_data.resize(0);
-  draw_cache_.tex_clamp_rect_data = Float4();
-  draw_cache_.is_video_frame = false;
-
-  // If we had a clipped binding, prepare the shared binding for the
-  // next inserts.
-  if (flush_binding == CLIPPED_BINDING) {
-    PrepareGeometry(SHARED_BINDING);
-  }
-}
-
-void GLRenderer::EnqueueTextureQuad(const TextureDrawQuad* quad,
-                                    const gfx::QuadF* clip_region) {
-  // If we have a clip_region then we have to render the next quad
-  // with dynamic geometry, therefore we must flush all pending
-  // texture quads.
-  if (clip_region) {
-    // We send in false here because we want to flush what's currently in the
-    // queue using the shared_geometry and not clipped_geometry
-    FlushTextureQuadCache(SHARED_BINDING);
-  }
-
-  DisplayResourceProviderGL::ScopedReadLockGL lock(resource_provider(),
-                                                   quad->resource_id());
-  // ScopedReadLockGL contains the correct texture size, even when
-  // quad->resource_size_in_pixels() is empty.
-  const gfx::Size texture_size = lock.size();
-  TexCoordPrecision tex_coord_precision =
-      TexCoordPrecisionRequired(gl_, &highp_threshold_cache_,
-                                settings_->highp_threshold_min, texture_size);
-
-  const SamplerType sampler = SamplerTypeFromTextureTarget(lock.target());
-
-  bool need_tex_clamp_rect = !quad->resource_size_in_pixels().IsEmpty() &&
-                             (quad->uv_top_left != gfx::PointF(0, 0) ||
-                              quad->uv_bottom_right != gfx::PointF(1, 1));
-
-  ProgramKey program_key = ProgramKey::Texture(
-      tex_coord_precision, sampler,
-      quad->premultiplied_alpha ? PREMULTIPLIED_ALPHA : NON_PREMULTIPLIED_ALPHA,
-      quad->background_color != SK_ColorTRANSPARENT, need_tex_clamp_rect,
-      tint_gl_composited_content_, ShouldApplyRoundedCorner(quad));
-  ResourceId resource_id = quad->resource_id();
-
-  size_t max_quads = StaticGeometryBinding::NUM_QUADS;
-  if (draw_cache_.is_empty || draw_cache_.program_key != program_key ||
-      draw_cache_.resource_id != resource_id ||
-      draw_cache_.needs_blending != quad->ShouldDrawWithBlending() ||
-      draw_cache_.nearest_neighbor != quad->nearest_neighbor ||
-      draw_cache_.background_color != quad->background_color ||
-      draw_cache_.mask_filter_info !=
-          quad->shared_quad_state->mask_filter_info ||
-      draw_cache_.matrix_data.size() >= max_quads ||
-      draw_cache_.is_video_frame != quad->is_video_frame) {
-    FlushTextureQuadCache(SHARED_BINDING);
-    draw_cache_.is_empty = false;
-    draw_cache_.program_key = program_key;
-    draw_cache_.resource_id = resource_id;
-    draw_cache_.needs_blending = quad->ShouldDrawWithBlending();
-    draw_cache_.nearest_neighbor = quad->nearest_neighbor;
-    draw_cache_.background_color = quad->background_color;
-    draw_cache_.mask_filter_info = quad->shared_quad_state->mask_filter_info;
-    draw_cache_.is_video_frame = quad->is_video_frame;
-  }
-
-  // Generate the uv-transform
-  auto uv_transform = UVTransform(quad);
-  if (sampler == SAMPLER_TYPE_2D_RECT) {
-    // Un-normalize the texture coordiantes for rectangle targets.
-    uv_transform.data[0] *= texture_size.width();
-    uv_transform.data[2] *= texture_size.width();
-    uv_transform.data[1] *= texture_size.height();
-    uv_transform.data[3] *= texture_size.height();
-  }
-  draw_cache_.uv_xform_data.push_back(uv_transform);
-
-  if (need_tex_clamp_rect) {
-    DCHECK_EQ(1u, draw_cache_.uv_xform_data.size());
-    DCHECK_EQ(texture_size.ToString(),
-              quad->resource_size_in_pixels().ToString());
-    DCHECK(!texture_size.IsEmpty());
-    gfx::RectF uv_visible_rect(
-        quad->uv_top_left.x(), quad->uv_top_left.y(),
-        quad->uv_bottom_right.x() - quad->uv_top_left.x(),
-        quad->uv_bottom_right.y() - quad->uv_top_left.y());
-    Float4 tex_clamp_rect = UVClampRect(uv_visible_rect, texture_size, sampler);
-    draw_cache_.tex_clamp_rect_data = tex_clamp_rect;
-  }
-
-  // Generate the vertex opacity
-  const float opacity = quad->shared_quad_state->opacity;
-  draw_cache_.vertex_opacity_data.push_back(quad->vertex_opacity[0] * opacity);
-  draw_cache_.vertex_opacity_data.push_back(quad->vertex_opacity[1] * opacity);
-  draw_cache_.vertex_opacity_data.push_back(quad->vertex_opacity[2] * opacity);
-  draw_cache_.vertex_opacity_data.push_back(quad->vertex_opacity[3] * opacity);
-
-  // Generate the transform matrix
-  gfx::Transform quad_rect_matrix;
-  QuadRectTransform(&quad_rect_matrix,
-                    quad->shared_quad_state->quad_to_target_transform,
-                    gfx::RectF(quad->visible_rect));
-  quad_rect_matrix = current_frame()->projection_matrix * quad_rect_matrix;
-
-  Float16 m;
-  quad_rect_matrix.matrix().getColMajor(m.data);
-  draw_cache_.matrix_data.push_back(m);
-
-  // Track the region in the current target surface that has been drawn to.
-  AccumulateDrawRects(quad->visible_rect,
-                      quad->shared_quad_state->quad_to_target_transform,
-                      &drawn_rects_);
-
-  if (clip_region) {
-    DCHECK_EQ(quad->rect, quad->visible_rect);
-    gfx::QuadF scaled_region;
-    if (!GetScaledRegion(quad->rect, clip_region, &scaled_region)) {
-      scaled_region = SharedGeometryQuad().BoundingBox();
-    }
-    // Both the scaled region and the SharedGeomtryQuad are in the space
-    // -0.5->0.5. We need to move that to the space 0->1.
-    float uv[8];
-    uv[0] = scaled_region.p1().x() + 0.5f;
-    uv[1] = scaled_region.p1().y() + 0.5f;
-    uv[2] = scaled_region.p2().x() + 0.5f;
-    uv[3] = scaled_region.p2().y() + 0.5f;
-    uv[4] = scaled_region.p3().x() + 0.5f;
-    uv[5] = scaled_region.p3().y() + 0.5f;
-    uv[6] = scaled_region.p4().x() + 0.5f;
-    uv[7] = scaled_region.p4().y() + 0.5f;
-    PrepareGeometry(CLIPPED_BINDING);
-    clipped_geometry_->InitializeCustomQuadWithUVs(scaled_region, uv);
-    FlushTextureQuadCache(CLIPPED_BINDING);
-  } else if (need_tex_clamp_rect) {
-    FlushTextureQuadCache(SHARED_BINDING);
-  }
-}
-
-void GLRenderer::FinishDrawingFrame() {
-  if (use_sync_query_) {
-    sync_queries_.EndCurrentFrame();
-  }
-
-  swap_buffer_rect_.Union(current_frame()->root_damage_rect);
-
-  if (use_swap_with_bounds_)
-    swap_content_bounds_ = current_frame()->root_content_bounds;
-
-  copier_.FreeUnusedCachedResources();
-
-  current_framebuffer_texture_ = nullptr;
-
-  gl_->Disable(GL_BLEND);
-  blend_shadow_ = false;
-
-  // Schedule output surface as overlay first to preserve existing ordering
-  // semantics during overlay refactoring.
-  ScheduleOutputSurfaceAsOverlay();
-
-#if BUILDFLAG(IS_ANDROID) || defined(USE_OZONE)
-  ScheduleOverlays();
-#elif BUILDFLAG(IS_APPLE)
-  ScheduleCALayers();
-#elif BUILDFLAG(IS_WIN)
-  ScheduleDCLayers();
-#endif
-
-  TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("viz.triangles"), "Triangles Drawn",
-                 num_triangles_drawn_);
-
-  // Mark the end of batched read of shared images.
-  gl_->EndBatchReadAccessSharedImageCHROMIUM();
-}
-
-bool GLRenderer::OverdrawTracingEnabled() {
-  // Only collect trace data if we select viz.overdraw.
-  bool tracing_enabled;
-  TRACE_EVENT_CATEGORY_GROUP_ENABLED(TRACE_DISABLED_BY_DEFAULT("viz.overdraw"),
-                                     &tracing_enabled);
-  // ARB_occlusion_query is required for tracing.
-  // Trace only the root render pass.
-  return tracing_enabled && use_occlusion_query_ &&
-         current_frame()->current_render_pass ==
-             current_frame()->root_render_pass;
-}
-
-bool GLRenderer::CompositeTimeTracingEnabled() {
-  bool tracing_enabled;
-  TRACE_EVENT_CATEGORY_GROUP_ENABLED(
-      TRACE_DISABLED_BY_DEFAULT("viz.gpu_composite_time"), &tracing_enabled);
-
-  return tracing_enabled && use_timer_query_;
-}
-
-void GLRenderer::AddCompositeTimeTraces(base::TimeTicks ready_timestamp) {
-  DCHECK(CompositeTimeTracingEnabled());
-  DCHECK_EQ(timer_queries_.front().first, kTimerQueryDummy);
-
-  std::size_t count = 0;
-  uint64_t duration = 0;
-
-  // List of queries to delete after their results are retrieved.
-  std::vector<unsigned> queries_to_delete;
-
-  // Queue of durations per draw call. The |second| in the pair represents the
-  // draw call type as string.
-  base::queue<std::pair<uint64_t, std::string>> durations;
-
-  // Pop the fence query as it does not represent a timer query.
-  timer_queries_.pop();
-
-  // Initialize |start_time_ticks| as the end timestamp and walk backwards to
-  // find the actual timestamp.
-  base::TimeTicks start_time_ticks = ready_timestamp;
-
-  while (timer_queries_.size() &&
-         timer_queries_.front().first != kTimerQueryDummy) {
-    count++;
-    gl_->GetQueryObjectui64vEXT(timer_queries_.front().first,
-                                GL_QUERY_RESULT_EXT, &duration);
-    durations.emplace(duration, timer_queries_.front().second);
-    queries_to_delete.push_back(timer_queries_.front().first);
-    timer_queries_.pop();
-    start_time_ticks -= base::Nanoseconds(duration);
-  }
-
-  // Delete all timer queries for which results have been retrieved.
-  gl_->DeleteQueriesEXT(count, queries_to_delete.data());
-
-  base::TimeDelta unique_id_delta = ready_timestamp - start_time_ticks;
-  const int trace_unique_id = unique_id_delta.InMilliseconds() * count;
-
-  TRACE_EVENT_ASYNC_BEGIN_WITH_TIMESTAMP0(
-      TRACE_DISABLED_BY_DEFAULT("viz.gpu_composite_time"), "Composite Time",
-      TRACE_ID_LOCAL(trace_unique_id), start_time_ticks);
-
-  while (!durations.empty()) {
-    duration = durations.front().first;
-
-    // |duration| may be set to 0 if the timer query result was unavailable in
-    // |GetQueryObjectui64vEXT| function call.
-    if (!duration) {
-      durations.pop();
-      continue;
-    }
-    TRACE_EVENT_ASYNC_STEP_INTO_WITH_TIMESTAMP0(
-        TRACE_DISABLED_BY_DEFAULT("viz.gpu_composite_time"), "Composite Time",
-        TRACE_ID_LOCAL(trace_unique_id), durations.front().second.c_str(),
-        start_time_ticks);
-    start_time_ticks += base::Nanoseconds(duration);
-    durations.pop();
-  }
-
-  TRACE_EVENT_ASYNC_END_WITH_TIMESTAMP0(
-      TRACE_DISABLED_BY_DEFAULT("viz.gpu_composite_time"), "Composite Time",
-      TRACE_ID_LOCAL(trace_unique_id), ready_timestamp);
-}
-
-void GLRenderer::FinishDrawingQuadList() {
-  FlushTextureQuadCache(SHARED_BINDING);
-  if (occlusion_query_) {
-    // Use the current surface area as max result. The effect is that overdraw
-    // is reported as a percentage of the output surface size. ie. 2x overdraw
-    // for the whole screen is reported as 200.
-    base::CheckedNumeric<int> surface_area =
-        current_surface_size_.GetCheckedArea();
-    DCHECK_GT(static_cast<int>(surface_area.ValueOrDefault(INT_MAX)), 0);
-
-    gl_->EndQueryEXT(GL_SAMPLES_PASSED_ARB);
-    context_support_->SignalQuery(
-        occlusion_query_, base::BindOnce(&GLRenderer::ProcessOverdrawFeedback,
-                                         weak_ptr_factory_.GetWeakPtr(),
-                                         surface_area, occlusion_query_));
-    occlusion_query_ = 0;
-  }
-}
-
-void GLRenderer::GenerateMipmap() {
-  DCHECK(current_framebuffer_texture_);
-  current_framebuffer_texture_->set_generate_mipmap();
-}
-
-bool GLRenderer::FlippedFramebuffer() const {
-#if BUILDFLAG(IS_APPLE)
-  if (force_drawing_frame_framebuffer_unflipped_)
-    return false;
-#endif
-  if (current_frame()->current_render_pass != current_frame()->root_render_pass)
-    return true;
-  return FlippedRootFramebuffer();
-}
-
-bool GLRenderer::FlippedRootFramebuffer() const {
-  // GL is normally flipped, so a flipped output results in an unflipping.
-  return output_surface_->capabilities().output_surface_origin ==
-         gfx::SurfaceOrigin::kBottomLeft;
-}
-
-void GLRenderer::EnsureScissorTestEnabled() {
-  if (is_scissor_enabled_)
-    return;
-
-  FlushTextureQuadCache(SHARED_BINDING);
-  gl_->Enable(GL_SCISSOR_TEST);
-  is_scissor_enabled_ = true;
-}
-
-void GLRenderer::EnsureScissorTestDisabled() {
-  if (!is_scissor_enabled_)
-    return;
-
-  FlushTextureQuadCache(SHARED_BINDING);
-  gl_->Disable(GL_SCISSOR_TEST);
-  is_scissor_enabled_ = false;
-}
-
-void GLRenderer::CopyDrawnRenderPass(
-    const copy_output::RenderPassGeometry& geometry,
-    std::unique_ptr<CopyOutputRequest> request) {
-  TRACE_EVENT0("viz", "GLRenderer::CopyDrawnRenderPass");
-
-  GLuint framebuffer_texture = 0;
-  gfx::Size framebuffer_texture_size;
-  if (current_framebuffer_texture_) {
-    framebuffer_texture = current_framebuffer_texture_->id();
-    framebuffer_texture_size = current_framebuffer_texture_->size();
-  }
-  copier_.CopyFromTextureOrFramebuffer(
-      std::move(request), geometry, GetFramebufferCopyTextureFormat(),
-      framebuffer_texture, framebuffer_texture_size, FlippedFramebuffer(),
-      CurrentRenderPassColorSpace());
-
-  // The copier modified texture/framebuffer bindings, shader programs, and
-  // other GL state; and so this must be restored before continuing.
-  RestoreGLState();
-
-  // CopyDrawnRenderPass() can change the binding of the framebuffer target as
-  // a part of its usual scaling and readback operations. It will break next
-  // CopyDrawnRenderPass() call for the root render pass. Therefore, make sure
-  // to restore the correct framebuffer between readbacks. (Even if it did
-  // not, a Mac-specific bug requires this workaround: http://crbug.com/99393)
-  const auto* render_pass = current_frame()->current_render_pass;
-  if (render_pass == current_frame()->root_render_pass)
-    BindFramebufferToOutputSurface();
-}
-
-void GLRenderer::ToGLMatrix(float* gl_matrix, const gfx::Transform& transform) {
-  transform.matrix().getColMajor(gl_matrix);
-}
-
-void GLRenderer::SetShaderQuadF(const gfx::QuadF& quad) {
-  if (!current_program_ || current_program_->quad_location() == -1)
-    return;
-  float gl_quad[8];
-  gl_quad[0] = quad.p1().x();
-  gl_quad[1] = quad.p1().y();
-  gl_quad[2] = quad.p2().x();
-  gl_quad[3] = quad.p2().y();
-  gl_quad[4] = quad.p3().x();
-  gl_quad[5] = quad.p3().y();
-  gl_quad[6] = quad.p4().x();
-  gl_quad[7] = quad.p4().y();
-  gl_->Uniform2fv(current_program_->quad_location(), 4, gl_quad);
-}
-
-void GLRenderer::SetShaderOpacity(float opacity) {
-  if (!current_program_ || current_program_->alpha_location() == -1)
-    return;
-  gl_->Uniform1f(current_program_->alpha_location(), opacity);
-}
-
-void GLRenderer::SetShaderMatrix(const gfx::Transform& transform) {
-  if (!current_program_ || current_program_->matrix_location() == -1)
-    return;
-  float gl_matrix[16];
-  ToGLMatrix(gl_matrix, transform);
-  gl_->UniformMatrix4fv(current_program_->matrix_location(), 1, false,
-                        gl_matrix);
-}
-
-void GLRenderer::SetShaderColor(SkColor color, float opacity) {
-  if (!current_program_ || current_program_->color_location() == -1)
-    return;
-  Float4 float_color = PremultipliedColor(color, opacity);
-  gl_->Uniform4fv(current_program_->color_location(), 1, float_color.data);
-}
-
-void GLRenderer::SetStencilEnabled(bool enabled) {
-  if (enabled == stencil_shadow_)
-    return;
-
-  if (enabled)
-    gl_->Enable(GL_STENCIL_TEST);
-  else
-    gl_->Disable(GL_STENCIL_TEST);
-  stencil_shadow_ = enabled;
-}
-
-void GLRenderer::SetBlendEnabled(bool enabled) {
-  if (enabled == blend_shadow_)
-    return;
-
-  if (enabled)
-    gl_->Enable(GL_BLEND);
-  else
-    gl_->Disable(GL_BLEND);
-  blend_shadow_ = enabled;
-}
-
-void GLRenderer::SetShaderRoundedCorner(
-    const gfx::RRectF& rounded_corner_bounds,
-    const gfx::Transform& screen_transform) {
-  DCHECK(current_program_);
-  DCHECK(!rounded_corner_bounds.IsEmpty());
-  DCHECK_NE(current_program_->rounded_corner_rect_location(), -1);
-  DCHECK_NE(current_program_->rounded_corner_radius_location(), -1);
-  DCHECK(screen_transform.IsScaleOrTranslation());
-
-  const gfx::Vector2dF& translate = screen_transform.To2dTranslation();
-  const gfx::Vector2dF& scale = screen_transform.To2dScale();
-  gfx::RRectF bounds_in_screen = rounded_corner_bounds;
-  bounds_in_screen.Scale(scale.x(), scale.y());
-  bounds_in_screen.Offset(translate.x(), translate.y());
-
-  gfx::RectF rect = bounds_in_screen.rect();
-
-  gl_->Uniform4f(current_program_->rounded_corner_rect_location(), rect.x(),
-                 rect.y(), rect.width(), rect.height());
-  gl_->Uniform4f(
-      current_program_->rounded_corner_radius_location(),
-      bounds_in_screen.GetCornerRadii(gfx::RRectF::Corner::kUpperLeft).x(),
-      bounds_in_screen.GetCornerRadii(gfx::RRectF::Corner::kUpperRight).x(),
-      bounds_in_screen.GetCornerRadii(gfx::RRectF::Corner::kLowerRight).x(),
-      bounds_in_screen.GetCornerRadii(gfx::RRectF::Corner::kLowerLeft).x());
-}
-
-void GLRenderer::DrawQuadGeometryClippedByQuadF(
-    const gfx::Transform& draw_transform,
-    const gfx::RectF& quad_rect,
-    const gfx::QuadF& clipping_region_quad,
-    const float* uvs) {
-  PrepareGeometry(CLIPPED_BINDING);
-  if (uvs) {
-    clipped_geometry_->InitializeCustomQuadWithUVs(clipping_region_quad, uvs);
-  } else {
-    clipped_geometry_->InitializeCustomQuad(clipping_region_quad);
-  }
-  gfx::Transform quad_rect_matrix;
-  QuadRectTransform(&quad_rect_matrix, draw_transform, quad_rect);
-  SetShaderMatrix(current_frame()->projection_matrix * quad_rect_matrix);
-
-  gl_->DrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT,
-                    reinterpret_cast<const void*>(0));
-  num_triangles_drawn_ += 2;
-}
-
-void GLRenderer::DrawQuadGeometry(const gfx::Transform& projection_matrix,
-                                  const gfx::Transform& draw_transform,
-                                  const gfx::RectF& quad_rect) {
-  PrepareGeometry(SHARED_BINDING);
-  gfx::Transform quad_rect_matrix;
-  QuadRectTransform(&quad_rect_matrix, draw_transform, quad_rect);
-  SetShaderMatrix(projection_matrix * quad_rect_matrix);
-
-  gl_->DrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, nullptr);
-  num_triangles_drawn_ += 2;
-}
-
-void GLRenderer::DrawQuadGeometryWithAA(const DrawQuad* quad,
-                                        gfx::QuadF* local_quad,
-                                        const gfx::Rect& tile_rect) {
-  DCHECK(local_quad);
-  // Normalize to tile_rect.
-  local_quad->Scale(1.0f / tile_rect.width(), 1.0f / tile_rect.height());
-
-  SetShaderQuadF(*local_quad);
-
-  // The transform and vertex data are used to figure out the extents that the
-  // un-antialiased quad should have and which vertex this is and the float
-  // quad passed in via uniform is the actual geometry that gets used to draw
-  // it. This is why this centered rect is used and not the original quad_rect.
-  DrawQuadGeometry(current_frame()->projection_matrix,
-                   quad->shared_quad_state->quad_to_target_transform,
-                   CenteredRect(tile_rect));
-}
-
-void GLRenderer::SwapBuffers(SwapFrameData swap_frame_data) {
-  DCHECK(visible_);
-
-  TRACE_EVENT0("viz", "GLRenderer::SwapBuffers");
-  // We're done! Time to swapbuffers!
-
-  gfx::Size surface_size = surface_size_for_swap_buffers();
-
-  OutputSurfaceFrame output_frame;
-  output_frame.latency_info = std::move(swap_frame_data.latency_info);
-  output_frame.top_controls_visible_height_changed =
-      swap_frame_data.top_controls_visible_height_changed;
-  output_frame.size = surface_size;
-#if BUILDFLAG(IS_MAC)
-  output_frame.ca_layer_error_code = swap_frame_data.ca_layer_error_code;
-#endif
-
-  if (use_swap_with_bounds_) {
-    output_frame.content_bounds = std::move(swap_content_bounds_);
-  } else if (use_partial_swap_) {
-    // If supported, we can save significant bandwidth by only swapping the
-    // damaged/scissored region (clamped to the viewport).
-    swap_buffer_rect_.Intersect(gfx::Rect(surface_size));
-    int flipped_y_pos_of_rect_bottom = surface_size.height() -
-                                       swap_buffer_rect_.y() -
-                                       swap_buffer_rect_.height();
-    output_frame.sub_buffer_rect =
-        gfx::Rect(swap_buffer_rect_.x(),
-                  FlippedRootFramebuffer() ? flipped_y_pos_of_rect_bottom
-                                           : swap_buffer_rect_.y(),
-                  swap_buffer_rect_.width(), swap_buffer_rect_.height());
-  } else if (swap_buffer_rect_.IsEmpty() && allow_empty_swap_) {
-    output_frame.sub_buffer_rect = swap_buffer_rect_;
-  }
-
-  // Record resources from viz clients that have been shipped as overlays to the
-  // gpu together.
-  swapping_overlay_resources_.push_back(std::move(pending_overlay_resources_));
-  pending_overlay_resources_.clear();
-  if (settings_->release_overlay_resources_after_gpu_query) {
-    // Record RenderPass textures that have been shipped as overlays to the gpu
-    // together.
-    displayed_overlay_textures_.push_back(
-        std::move(awaiting_swap_overlay_textures_));
-    awaiting_swap_overlay_textures_.clear();
-  } else {
-    // If |displayed_overlay_textures_| is appended to in this case then
-    // SwapBuffersComplete needs to be extended to handle it.
-    DCHECK(awaiting_swap_overlay_textures_.empty());
-  }
-
-  output_surface_->SwapBuffers(std::move(output_frame));
-
-  swap_buffer_rect_ = gfx::Rect();
-
-  if (context_busy_) {
-    output_surface_->context_provider()->CacheController()->ClientBecameNotBusy(
-        std::move(context_busy_));
-  }
-}
-
-void GLRenderer::SwapBuffersSkipped() {
-  if (context_busy_) {
-    output_surface_->context_provider()->CacheController()->ClientBecameNotBusy(
-        std::move(context_busy_));
-  }
-}
-
-void GLRenderer::SwapBuffersComplete(gfx::GpuFenceHandle release_fence) {
-  // Returned release fence is signalled when the latest swap is presented,
-  // and tells us we can re-use the buffers from the /previous/ swap.
-  if (swapping_overlay_resources_.size() > 1) {
-    for (auto& lock : swapping_overlay_resources_[0]) {
-      lock->SetReleaseFence(release_fence.Clone());
-    }
-  }
-
-  if (settings_->release_overlay_resources_after_gpu_query) {
-    // Once a resource has been swap-ACKed, send a query to the GPU process to
-    // ask if the resource is no longer being consumed by the system compositor.
-    // The response will come with the next swap-ACK.
-    if (!swapping_overlay_resources_.empty()) {
-      for (OverlayResourceLock& lock : swapping_overlay_resources_.front()) {
-        unsigned texture = lock->texture_id();
-        if (swapped_and_acked_overlay_resources_.find(texture) ==
-            swapped_and_acked_overlay_resources_.end()) {
-          swapped_and_acked_overlay_resources_[texture] = std::move(lock);
-        }
-      }
-      swapping_overlay_resources_.pop_front();
-    }
-    if (!displayed_overlay_textures_.empty()) {
-      for (auto& overlay : displayed_overlay_textures_.front())
-        awaiting_release_overlay_textures_.push_back(std::move(overlay));
-      displayed_overlay_textures_.erase(displayed_overlay_textures_.begin());
-    }
-
-    size_t query_texture_count = swapped_and_acked_overlay_resources_.size() +
-                                 awaiting_release_overlay_textures_.size();
-    if (query_texture_count) {
-      std::vector<uint32_t> query_texture_ids;
-      query_texture_ids.reserve(query_texture_count);
-
-      for (auto& pair : swapped_and_acked_overlay_resources_)
-        query_texture_ids.push_back(pair.first);
-      for (auto& overlay : awaiting_release_overlay_textures_)
-        query_texture_ids.push_back(overlay->texture.id());
-
-      // We query for *all* outstanding texture ids, even if we previously
-      // queried, as we will not hear back about things becoming available
-      // until after we query again.
-      gl_->ScheduleCALayerInUseQueryCHROMIUM(query_texture_count,
-                                             query_texture_ids.data());
-    }
-  } else {
-    // If a query is not needed to release the overlay buffers, we can assume
-    // that once a swap buffer has completed we can remove the oldest buffers
-    // from the queue, but only once we've swapped another frame afterward.
-    if (swapping_overlay_resources_.size() > 1) {
-      auto& read_lock_release_fence_overlay_locks =
-          read_lock_release_fence_overlay_locks_.emplace_back();
-      if (!release_fence.is_null()) {
-        auto read_lock_iter = std::partition(
-            swapping_overlay_resources_.front().begin(),
-            swapping_overlay_resources_.front().end(),
-            [](auto& lock) { return !lock->HasReadLockFence(); });
-        read_lock_release_fence_overlay_locks.insert(
-            read_lock_release_fence_overlay_locks.end(),
-            std::make_move_iterator(read_lock_iter),
-            std::make_move_iterator(swapping_overlay_resources_.front().end()));
-      }
-
-      DisplayResourceProviderGL::ScopedBatchReturnResources returner(
-          resource_provider());
-      swapping_overlay_resources_.pop_front();
-    }
-    // If |displayed_overlay_textures_| has a non-empty member that means we're
-    // sending RenderPassDrawQuads as an overlay. This is only supported for
-    // CALayers now, where |release_overlay_resources_after_gpu_query| will be
-    // true. In order to support them here, the OverlayTextures would need to
-    // move to |awaiting_release_overlay_textures_| and stay there until the
-    // ResourceFence that was in use for the frame they were submitted is
-    // passed.
-    DCHECK(displayed_overlay_textures_.empty());
-  }
-}
-
-void GLRenderer::BuffersPresented() {
-  if (!read_lock_release_fence_overlay_locks_.empty())
-    read_lock_release_fence_overlay_locks_.pop_front();
-}
-
-void GLRenderer::DidReceiveTextureInUseResponses(
-    const gpu::TextureInUseResponses& responses) {
-  DCHECK(settings_->release_overlay_resources_after_gpu_query);
-  DisplayResourceProviderGL::ScopedBatchReturnResources returner(
-      resource_provider());
-  for (const gpu::TextureInUseResponse& response : responses) {
-    if (response.in_use)
-      continue;
-
-    // Returned texture ids may be for resources from clients of the
-    // display compositor, in |swapped_and_acked_overlay_resources_|. In that
-    // case we remove the lock from the map, allowing them to be returned to the
-    // client if the resource has been deleted from the
-    // DisplayResourceProviderGL.
-    if (swapped_and_acked_overlay_resources_.erase(response.texture))
-      continue;
-    // If not, then they would be a RenderPass copy texture, which is held in
-    // |awaiting_release_overlay_textures_|. We move it back to the available
-    // texture list to use it for the next frame.
-    auto it = std::find_if(
-        awaiting_release_overlay_textures_.begin(),
-        awaiting_release_overlay_textures_.end(),
-        [&response](const std::unique_ptr<OverlayTexture>& overlay) {
-          return overlay->texture.id() == response.texture;
-        });
-    if (it != awaiting_release_overlay_textures_.end()) {
-      // Mark the OverlayTexture as newly returned to the available set.
-      (*it)->frames_waiting_for_reuse = 0;
-      available_overlay_textures_.push_back(std::move(*it));
-      awaiting_release_overlay_textures_.erase(it);
-    }
-  }
-}
-
-void GLRenderer::BindFramebufferToOutputSurface() {
-  current_framebuffer_texture_ = nullptr;
-  output_surface_->BindFramebuffer();
-  tint_gl_composited_content_ = debug_settings_->tint_composited_content;
-  if (overdraw_feedback_) {
-    // Output surfaces that require an external stencil test should not allow
-    // overdraw feedback by setting |supports_stencil| to false.
-    DCHECK(!output_surface_->HasExternalStencilTest());
-    SetupOverdrawFeedback();
-    SetStencilEnabled(true);
-  } else if (output_surface_->HasExternalStencilTest()) {
-    output_surface_->ApplyExternalStencil();
-    SetStencilEnabled(true);
-  } else {
-    SetStencilEnabled(false);
-  }
-}
-
-void GLRenderer::BindFramebufferToTexture(
-    const AggregatedRenderPassId render_pass_id) {
-  tint_gl_composited_content_ = false;
-  gl_->BindFramebuffer(GL_FRAMEBUFFER, offscreen_framebuffer_id_);
-
-  auto contents_texture_it = render_pass_textures_.find(render_pass_id);
-  current_framebuffer_texture_ = &contents_texture_it->second;
-  GLuint texture_id = current_framebuffer_texture_->id();
-  DCHECK(texture_id);
-  gl_->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
-                            texture_id, 0);
-  if (overdraw_feedback_) {
-    if (!offscreen_stencil_renderbuffer_id_)
-      gl_->GenRenderbuffers(1, &offscreen_stencil_renderbuffer_id_);
-    if (current_framebuffer_texture_->size() !=
-        offscreen_stencil_renderbuffer_size_) {
-      gl_->BindRenderbuffer(GL_RENDERBUFFER,
-                            offscreen_stencil_renderbuffer_id_);
-      gl_->RenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8,
-                               current_framebuffer_texture_->size().width(),
-                               current_framebuffer_texture_->size().height());
-      gl_->BindRenderbuffer(GL_RENDERBUFFER, 0);
-      offscreen_stencil_renderbuffer_size_ =
-          current_framebuffer_texture_->size();
-    }
-    gl_->FramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
-                                 GL_RENDERBUFFER,
-                                 offscreen_stencil_renderbuffer_id_);
-  }
-
-#if EXPENSIVE_DCHECKS_ARE_ON()
-  DCHECK(gl_->CheckFramebufferStatus(GL_FRAMEBUFFER) ==
-             GL_FRAMEBUFFER_COMPLETE ||
-         IsContextLost());
-#endif  // EXPENSIVE_DCHECKS_ARE_ON()
-
-  if (overdraw_feedback_) {
-    SetupOverdrawFeedback();
-    SetStencilEnabled(true);
-  } else {
-    SetStencilEnabled(false);
-  }
-}
-
-void GLRenderer::SetScissorTestRect(const gfx::Rect& scissor_rect) {
-  EnsureScissorTestEnabled();
-
-  // Don't unnecessarily ask the context to change the scissor, because it
-  // may cause undesired GPU pipeline flushes.
-  if (scissor_rect == scissor_rect_)
-    return;
-
-  scissor_rect_ = scissor_rect;
-  FlushTextureQuadCache(SHARED_BINDING);
-  gl_->Scissor(scissor_rect.x(), scissor_rect.y(), scissor_rect.width(),
-               scissor_rect.height());
-}
-
-void GLRenderer::SetViewport() {
-  gl_->Viewport(current_window_space_viewport_.x(),
-                current_window_space_viewport_.y(),
-                current_window_space_viewport_.width(),
-                current_window_space_viewport_.height());
-}
-
-void GLRenderer::InitializeSharedObjects() {
-  TRACE_EVENT0("viz", "GLRenderer::InitializeSharedObjects");
-
-  // Create an FBO for doing offscreen rendering.
-  gl_->GenFramebuffers(1, &offscreen_framebuffer_id_);
-
-  shared_geometry_ =
-      std::make_unique<StaticGeometryBinding>(gl_, QuadVertexRect());
-  clipped_geometry_ = std::make_unique<DynamicGeometryBinding>(gl_);
-}
-
-void GLRenderer::PrepareGeometry(BoundGeometry binding) {
-  if (binding == bound_geometry_) {
-    return;
-  }
-
-  switch (binding) {
-    case SHARED_BINDING:
-      shared_geometry_->PrepareForDraw();
-      break;
-    case CLIPPED_BINDING:
-      clipped_geometry_->PrepareForDraw();
-      break;
-    case NO_BINDING:
-      break;
-  }
-  bound_geometry_ = binding;
-}
-
-void GLRenderer::SetUseProgram(const ProgramKey& program_key_no_color,
-                               const gfx::ColorSpace& src_color_space,
-                               const gfx::ColorSpace& dst_color_space,
-                               bool adjust_src_white_level,
-                               absl::optional<gfx::HDRMetadata> hdr_metadata) {
-  DCHECK(dst_color_space.IsValid());
-  gfx::ColorSpace adjusted_src_color_space = src_color_space;
-
-  ProgramKey program_key = program_key_no_color;
-  const gfx::ColorTransform* color_transform =
-      GetColorTransform(adjusted_src_color_space, dst_color_space);
-  program_key.SetColorTransform(color_transform);
-
-  bool has_output_color_matrix = false;
-  if (program_key.type() != ProgramType::PROGRAM_TYPE_SOLID_COLOR)
-    has_output_color_matrix = HasOutputColorMatrix();
-  program_key.set_has_output_color_matrix(has_output_color_matrix);
-
-  // Create and set the program if needed.
-  std::unique_ptr<Program>& program = program_cache_[program_key];
-  if (!program) {
-    program = std::make_unique<Program>();
-    program->Initialize(output_surface_->context_provider(), program_key);
-  }
-  DCHECK(program);
-  if (current_program_ != program.get()) {
-    current_program_ = program.get();
-    gl_->UseProgram(current_program_->program());
-  }
-  if (!current_program_->initialized()) {
-    DCHECK(IsContextLost());
-    return;
-  }
-
-  // Set uniforms that are common to all programs.
-  if (current_program_->sampler_location() != -1)
-    gl_->Uniform1i(current_program_->sampler_location(), 0);
-  if (current_program_->viewport_location() != -1) {
-    float viewport[4] = {
-        static_cast<float>(current_window_space_viewport_.x()),
-        static_cast<float>(current_window_space_viewport_.y()),
-        static_cast<float>(current_window_space_viewport_.width()),
-        static_cast<float>(current_window_space_viewport_.height()),
-    };
-    gl_->Uniform4fv(current_program_->viewport_location(), 1, viewport);
-  }
-
-  if (has_output_color_matrix) {
-    DCHECK_NE(current_program_->output_color_matrix_location(), -1);
-    float matrix[16];
-    output_surface_->color_matrix().getColMajor(matrix);
-    gl_->UniformMatrix4fv(current_program_->output_color_matrix_location(), 1,
-                          false, matrix);
-  }
-}
-
-const Program* GLRenderer::GetProgramIfInitialized(
-    const ProgramKey& desc) const {
-  const auto found = program_cache_.find(desc);
-  if (found == program_cache_.end())
-    return nullptr;
-  return found->second.get();
-}
-
-const gfx::ColorTransform* GLRenderer::GetColorTransform(
-    const gfx::ColorSpace& src,
-    const gfx::ColorSpace& dst) {
-  ColorTransformKey key;
-  key.src = src;
-  key.dst = dst;
-  key.sdr_max_luminance_nits =
-      current_frame()->display_color_spaces.GetSDRMaxLuminanceNits();
-  std::unique_ptr<gfx::ColorTransform>& transform = color_transform_cache_[key];
-  if (!transform) {
-    gfx::ColorTransform::Options options;
-    options.tone_map_pq_and_hlg_to_sdr = !dst.IsHDR();
-    options.sdr_max_luminance_nits = key.sdr_max_luminance_nits;
-    transform = gfx::ColorTransform::NewColorTransform(src, dst, options);
-  }
-  return transform.get();
-}
-
-void GLRenderer::CleanupSharedObjects() {
-  shared_geometry_ = nullptr;
-
-  gl_->ReleaseShaderCompiler();
-  for (auto& iter : program_cache_)
-    iter.second->Cleanup(gl_);
-  program_cache_.clear();
-  color_transform_cache_.clear();
-
-  if (offscreen_framebuffer_id_)
-    gl_->DeleteFramebuffers(1, &offscreen_framebuffer_id_);
-
-  if (offscreen_stencil_renderbuffer_id_)
-    gl_->DeleteRenderbuffers(1, &offscreen_stencil_renderbuffer_id_);
-}
-
-void GLRenderer::ReinitializeGLState() {
-  is_scissor_enabled_ = false;
-  scissor_rect_ = gfx::Rect();
-  stencil_shadow_ = false;
-  blend_shadow_ = true;
-  current_program_ = nullptr;
-
-  RestoreGLState();
-}
-
-void GLRenderer::RestoreGLStateAfterSkia() {
-  // After using Skia we need to disable vertex attributes we don't use
-  int attribs_count = output_surface_->context_provider()
-                          ->ContextCapabilities()
-                          .max_vertex_attribs;
-  for (int i = 0; i < attribs_count; i++)
-    gl_->DisableVertexAttribArray(i);
-
-  RestoreGLState();
-}
-
-void GLRenderer::RestoreGLState() {
-  // This restores the current GLRenderer state to the GL context.
-  bound_geometry_ = NO_BINDING;
-  PrepareGeometry(SHARED_BINDING);
-
-  gl_->Disable(GL_DEPTH_TEST);
-  gl_->Disable(GL_CULL_FACE);
-  gl_->ColorMask(true, true, true, true);
-  gl_->BlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
-  gl_->ActiveTexture(GL_TEXTURE0);
-
-  if (current_program_)
-    gl_->UseProgram(current_program_->program());
-
-  if (stencil_shadow_)
-    gl_->Enable(GL_STENCIL_TEST);
-  else
-    gl_->Disable(GL_STENCIL_TEST);
-
-  if (blend_shadow_)
-    gl_->Enable(GL_BLEND);
-  else
-    gl_->Disable(GL_BLEND);
-
-  if (is_scissor_enabled_)
-    gl_->Enable(GL_SCISSOR_TEST);
-  else
-    gl_->Disable(GL_SCISSOR_TEST);
-
-  gl_->Scissor(scissor_rect_.x(), scissor_rect_.y(), scissor_rect_.width(),
-               scissor_rect_.height());
-}
-
-bool GLRenderer::IsContextLost() {
-  return gl_->GetGraphicsResetStatusKHR() != GL_NO_ERROR;
-}
-
-#if BUILDFLAG(IS_APPLE)
-void GLRenderer::ScheduleCALayers() {
-  // The use of OverlayTextures for RenderPasses is only supported on the code
-  // paths for |release_overlay_resources_after_gpu_query| at the moment. See
-  // SwapBuffersComplete for notes on the missing support for other paths. This
-  // method uses ScheduleRenderPassDrawQuad to send RenderPass outputs as
-  // overlays, so it can only be used because this setting is true.
-  if (!settings_->release_overlay_resources_after_gpu_query)
-    return;
-
-  scoped_refptr<CALayerOverlaySharedState> shared_state;
-
-  for (const CALayerOverlay& ca_layer_overlay : current_frame()->overlay_list) {
-    if (ca_layer_overlay.rpdq) {
-      std::unique_ptr<OverlayTexture> overlay_texture =
-          ScheduleRenderPassDrawQuad(&ca_layer_overlay);
-      if (overlay_texture)
-        awaiting_swap_overlay_textures_.push_back(std::move(overlay_texture));
-      shared_state = nullptr;
-      continue;
-    }
-
-    ResourceId contents_resource_id = ca_layer_overlay.contents_resource_id;
-    unsigned texture_id = 0;
-    if (contents_resource_id) {
-      pending_overlay_resources_.push_back(
-          std::make_unique<DisplayResourceProviderGL::ScopedOverlayLockGL>(
-              resource_provider(), contents_resource_id));
-      texture_id = pending_overlay_resources_.back()->texture_id();
-    }
-    GLfloat contents_rect[4] = {
-        ca_layer_overlay.contents_rect.x(), ca_layer_overlay.contents_rect.y(),
-        ca_layer_overlay.contents_rect.width(),
-        ca_layer_overlay.contents_rect.height(),
-    };
-    GLfloat bounds_rect[4] = {
-        ca_layer_overlay.bounds_rect.x(), ca_layer_overlay.bounds_rect.y(),
-        ca_layer_overlay.bounds_rect.width(),
-        ca_layer_overlay.bounds_rect.height(),
-    };
-    GLboolean is_clipped = ca_layer_overlay.shared_state->is_clipped;
-    GLfloat clip_rect[4] = {ca_layer_overlay.shared_state->clip_rect.x(),
-                            ca_layer_overlay.shared_state->clip_rect.y(),
-                            ca_layer_overlay.shared_state->clip_rect.width(),
-                            ca_layer_overlay.shared_state->clip_rect.height()};
-
-    const gfx::RectF& rect =
-        ca_layer_overlay.shared_state->rounded_corner_bounds.rect();
-    GLfloat rounded_corner_bounds[5] = {
-        rect.x(), rect.y(), rect.width(), rect.height(),
-        ca_layer_overlay.shared_state->rounded_corner_bounds.GetSimpleRadius()};
-
-    GLint sorting_context_id =
-        ca_layer_overlay.shared_state->sorting_context_id;
-    GLfloat transform[16];
-    ca_layer_overlay.shared_state->transform.matrix().getColMajor(transform);
-    unsigned filter = ca_layer_overlay.filter;
-
-    if (ca_layer_overlay.shared_state != shared_state) {
-      shared_state = ca_layer_overlay.shared_state;
-      gl_->ScheduleCALayerSharedStateCHROMIUM(
-          ca_layer_overlay.shared_state->opacity, is_clipped, clip_rect,
-          rounded_corner_bounds, sorting_context_id, transform);
-    }
-    gl_->ScheduleCALayerCHROMIUM(
-        texture_id, contents_rect, ca_layer_overlay.background_color,
-        ca_layer_overlay.edge_aa_mask, bounds_rect, filter);
-  }
-
-  ReduceAvailableOverlayTextures();
-}
-#endif  // BUILDFLAG(IS_APPLE)
-
-#if BUILDFLAG(IS_WIN)
-void GLRenderer::ScheduleDCLayers() {
-  for (DCLayerOverlay& dc_layer_overlay : current_frame()->overlay_list) {
-    DCHECK_EQ(DCLayerOverlay::kNumResources, 2u);
-    GLuint texture_ids[DCLayerOverlay::kNumResources] = {};
-    for (size_t i = 0; i < DCLayerOverlay::kNumResources; i++) {
-      ResourceId resource_id = dc_layer_overlay.resources[i];
-      if (resource_id == kInvalidResourceId)
-        break;
-      pending_overlay_resources_.push_back(
-          std::make_unique<DisplayResourceProviderGL::ScopedOverlayLockGL>(
-              resource_provider(), resource_id));
-      texture_ids[i] = pending_overlay_resources_.back()->texture_id();
-    }
-    DCHECK(texture_ids[0]);
-    // TODO(sunnyps): Set color space in renderer like we do for tiles.
-    gl_->SetColorSpaceMetadataCHROMIUM(
-        texture_ids[0], dc_layer_overlay.color_space.AsGLColorSpace());
-
-    int z_order = dc_layer_overlay.z_order;
-    const gfx::Rect& content_rect = dc_layer_overlay.content_rect;
-    const gfx::Rect& quad_rect = dc_layer_overlay.quad_rect;
-    DCHECK(dc_layer_overlay.transform.IsFlat());
-    const auto& matrix = dc_layer_overlay.transform.matrix();
-    bool is_clipped = dc_layer_overlay.clip_rect.has_value();
-    const gfx::Rect& clip_rect =
-        dc_layer_overlay.clip_rect.value_or(gfx::Rect());
-    unsigned protected_video_type =
-        static_cast<unsigned>(dc_layer_overlay.protected_video_type);
-
-    gl_->ScheduleDCLayerCHROMIUM(
-        texture_ids[0], texture_ids[1], z_order, content_rect.x(),
-        content_rect.y(), content_rect.width(), content_rect.height(),
-        quad_rect.x(), quad_rect.y(), quad_rect.width(), quad_rect.height(),
-        matrix.rc(0, 0), matrix.rc(0, 1), matrix.rc(1, 0), matrix.rc(1, 1),
-        matrix.rc(0, 3), matrix.rc(1, 3), is_clipped, clip_rect.x(),
-        clip_rect.y(), clip_rect.width(), clip_rect.height(),
-        protected_video_type);
-  }
-}
-#endif  // BUILDFLAG(IS_WIN)
-
-#if BUILDFLAG(IS_ANDROID) || defined(USE_OZONE)
-void GLRenderer::ScheduleOverlays() {
-  if (current_frame()->overlay_list.empty())
-    return;
-
-  OverlayCandidateList& overlays = current_frame()->overlay_list;
-  for (const auto& overlay_candidate : overlays) {
-    pending_overlay_resources_.push_back(
-        std::make_unique<DisplayResourceProviderGL::ScopedOverlayLockGL>(
-            resource_provider(), overlay_candidate.resource_id));
-    unsigned texture_id = pending_overlay_resources_.back()->texture_id();
-
-    context_support_->ScheduleOverlayPlane(
-        overlay_candidate.plane_z_order, overlay_candidate.transform,
-        texture_id, ToNearestRect(overlay_candidate.display_rect),
-        overlay_candidate.uv_rect, !overlay_candidate.is_opaque,
-        overlay_candidate.gpu_fence_id);
-  }
-}
-#endif  // BUILDFLAG(IS_ANDROID) || defined(USE_OZONE)
-
-void GLRenderer::ScheduleOutputSurfaceAsOverlay() {
-  if (!current_frame()->output_surface_plane)
-    return;
-
-  // Initialize correct values to use an output surface as overlay candidate.
-  auto& overlay_candidate = *(current_frame()->output_surface_plane);
-  unsigned texture_id = output_surface_->GetOverlayTextureId();
-  DCHECK(texture_id || IsContextLost());
-  // Output surface is also z-order 0.
-  int plane_z_order = 0;
-
-  context_support_->ScheduleOverlayPlane(
-      plane_z_order, overlay_candidate.transform, texture_id,
-      ToNearestRect(overlay_candidate.display_rect), overlay_candidate.uv_rect,
-      overlay_candidate.enable_blending, overlay_candidate.gpu_fence_id);
-}
-
-#if BUILDFLAG(IS_APPLE)
-// This function draws the CompositorRenderPassDrawQuad into a temporary
-// texture/framebuffer, and then copies the result into an IOSurface. The
-// inefficient (but simple) way to do this would be to:
-//   1. Allocate a framebuffer the size of the screen.
-//   2. Draw using all the normal RPDQ draw logic.
-//
-// Instead, this method does the following:
-//   1. Configure parameters as if drawing to a framebuffer the size of the
-//   screen. This reuses most of the RPDQ draw logic.
-//   2. Update parameters to draw into a framebuffer only as large as needed.
-//   3. Fix shader uniforms that were broken by (2).
-//
-// Then:
-//   4. Allocate an IOSurface as the drawing destination.
-//   5. Draw the RPDQ.
-void GLRenderer::CopyRenderPassDrawQuadToOverlayResource(
-    const CALayerOverlay* ca_layer_overlay,
-    std::unique_ptr<OverlayTexture>* overlay_texture,
-    gfx::RectF* new_bounds) {
-  // Don't carry over any GL state from previous RenderPass draw operations.
-  ReinitializeGLState();
-  auto contents_texture_it =
-      render_pass_textures_.find(ca_layer_overlay->rpdq->render_pass_id);
-  DCHECK(contents_texture_it != render_pass_textures_.end());
-
-  // Configure parameters as if drawing to a framebuffer the size of the
-  // screen.
-  DrawRenderPassDrawQuadParams params;
-  params.quad = ca_layer_overlay->rpdq;
-  params.flip_texture = true;
-  params.contents_texture = &contents_texture_it->second;
-  params.quad_to_target_transform =
-      params.quad->shared_quad_state->quad_to_target_transform;
-  params.tex_coord_rect = params.quad->tex_coord_rect;
-
-  // Calculate projection and window matrices using InitializeViewport(). This
-  // requires creating a dummy DrawingFrame.
-  {
-    DrawingFrame dummy_frame;
-    gfx::Rect frame_rect(current_frame()->device_viewport_size);
-    force_drawing_frame_framebuffer_unflipped_ = true;
-    InitializeViewport(&dummy_frame, frame_rect, frame_rect, frame_rect.size());
-    force_drawing_frame_framebuffer_unflipped_ = false;
-    params.projection_matrix = dummy_frame.projection_matrix;
-    params.window_matrix = dummy_frame.window_matrix;
-  }
-
-  // Perform basic initialization with the screen-sized viewport.
-  if (!InitializeRPDQParameters(&params))
-    return;
-
-  if (!UpdateRPDQWithSkiaFilters(&params))
-    return;
-
-  // |params.dst_rect| now contain values that reflect a potentially increased
-  // size quad.
-  gfx::RectF updated_dst_rect = params.dst_rect;
-  gfx::Size dst_pixel_size = gfx::ToCeiledSize(updated_dst_rect.size());
-
-  int iosurface_width = dst_pixel_size.width();
-  int iosurface_height = dst_pixel_size.height();
-  if (!settings_->dont_round_texture_sizes_for_pixel_tests) {
-    // Round the size of the IOSurface to a multiple of 64 pixels. This reduces
-    // memory fragmentation. https://crbug.com/146070. This also allows
-    // IOSurfaces to be more easily reused during a resize operation.
-    int iosurface_multiple = 64;
-    iosurface_width =
-        cc::MathUtil::CheckedRoundUp(iosurface_width, iosurface_multiple);
-    iosurface_height =
-        cc::MathUtil::CheckedRoundUp(iosurface_height, iosurface_multiple);
-  }
-
-  *overlay_texture =
-      FindOrCreateOverlayTexture(params.quad->render_pass_id, iosurface_width,
-                                 iosurface_height, RootRenderPassColorSpace());
-  *new_bounds = gfx::RectF(updated_dst_rect.origin(),
-                           gfx::SizeF((*overlay_texture)->texture.size()));
-
-  // Calculate new projection and window matrices for a minimally sized viewport
-  // using InitializeViewport(). This requires creating a dummy DrawingFrame.
-  {
-    DrawingFrame dummy_frame;
-    force_drawing_frame_framebuffer_unflipped_ = true;
-    gfx::Rect frame_rect =
-        gfx::Rect(0, 0, updated_dst_rect.width(), updated_dst_rect.height());
-    InitializeViewport(&dummy_frame, frame_rect, frame_rect, frame_rect.size());
-    force_drawing_frame_framebuffer_unflipped_ = false;
-    params.projection_matrix = dummy_frame.projection_matrix;
-    params.window_matrix = dummy_frame.window_matrix;
-  }
-
-  // Calculate a new quad_to_target_transform.
-  params.quad_to_target_transform = gfx::Transform();
-  params.quad_to_target_transform.Translate(-updated_dst_rect.x(),
-                                            -updated_dst_rect.y());
-
-  // Antialiasing works by fading out content that is close to the edge of the
-  // viewport. All of these values need to be recalculated.
-  if (params.use_aa) {
-    current_window_space_viewport_ =
-        gfx::Rect(0, 0, updated_dst_rect.width(), updated_dst_rect.height());
-    gfx::Transform quad_rect_matrix;
-    QuadRectTransform(&quad_rect_matrix, params.quad_to_target_transform,
-                      updated_dst_rect);
-    params.contents_device_transform =
-        params.window_matrix * params.projection_matrix * quad_rect_matrix;
-    bool clipped = false;
-    params.contents_device_transform.FlattenTo2d();
-    gfx::QuadF device_layer_quad = cc::MathUtil::MapQuad(
-        params.contents_device_transform, SharedGeometryQuad(), &clipped);
-    LayerQuad device_layer_edges(device_layer_quad);
-    InflateAntiAliasingDistances(device_layer_quad, &device_layer_edges,
-                                 params.edge);
-  }
-
-  // Establish destination texture.
-  GLuint temp_fbo;
-  gl_->GenFramebuffers(1, &temp_fbo);
-  gl_->BindFramebuffer(GL_FRAMEBUFFER, temp_fbo);
-  gl_->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
-                            (*overlay_texture)->texture.target(),
-                            (*overlay_texture)->texture.id(), 0);
-  DCHECK(gl_->CheckFramebufferStatus(GL_FRAMEBUFFER) ==
-             GL_FRAMEBUFFER_COMPLETE ||
-         IsContextLost());
-
-  // Clear to 0 to ensure the background is transparent.
-  gl_->ClearColor(0, 0, 0, 0);
-  gl_->Clear(GL_COLOR_BUFFER_BIT);
-
-  UpdateRPDQTexturesForSampling(&params);
-  UpdateRPDQBlendMode(&params);
-  // The code in this method (CopyRenderPassDrawQuadToOverlayResource) is
-  // only called when we are drawing for the purpose of copying to
-  // a CALayerOverlay. In such cases, the CALayerOverlay applies rounded
-  // corners via CALayer parameters, so the shader-based rounded corners
-  // should be disabled here.
-  params.apply_shader_based_rounded_corner = false;
-  ChooseRPDQProgram(&params, (*overlay_texture)->texture.color_space());
-  UpdateRPDQUniforms(&params);
-
-  // Prior to drawing, set up the destination framebuffer and viewport.
-  gl_->BindFramebuffer(GL_FRAMEBUFFER, temp_fbo);
-  gl_->Viewport(0, 0, updated_dst_rect.width(), updated_dst_rect.height());
-
-  DrawRPDQ(params);
-  if (params.background_texture) {
-    gl_->DeleteTextures(1, &params.background_texture);
-    params.background_texture = 0;
-  }
-  gl_->DeleteFramebuffers(1, &temp_fbo);
-}
-
-std::unique_ptr<GLRenderer::OverlayTexture>
-GLRenderer::FindOrCreateOverlayTexture(
-    const AggregatedRenderPassId& render_pass_id,
-    int width,
-    int height,
-    const gfx::ColorSpace& color_space) {
-  // First try to use a texture for the same CompositorRenderPassId, to keep
-  // things more stable and less likely to clobber each others textures.
-  auto match_with_id = [&](const std::unique_ptr<OverlayTexture>& overlay) {
-    return overlay->render_pass_id == render_pass_id &&
-           overlay->texture.size().width() >= width &&
-           overlay->texture.size().height() >= height &&
-           overlay->texture.size().width() <= width * 2 &&
-           overlay->texture.size().height() <= height * 2;
-  };
-  auto it = std::find_if(available_overlay_textures_.begin(),
-                         available_overlay_textures_.end(), match_with_id);
-  if (it != available_overlay_textures_.end()) {
-    std::unique_ptr<OverlayTexture> result = std::move(*it);
-    available_overlay_textures_.erase(it);
-
-    result->render_pass_id = render_pass_id;
-    return result;
-  }
-
-  // Then fallback to trying other textures that still match.
-  auto match = [&](const std::unique_ptr<OverlayTexture>& overlay) {
-    return overlay->texture.size().width() >= width &&
-           overlay->texture.size().height() >= height &&
-           overlay->texture.size().width() <= width * 2 &&
-           overlay->texture.size().height() <= height * 2;
-  };
-  it = std::find_if(available_overlay_textures_.begin(),
-                    available_overlay_textures_.end(), match);
-  if (it != available_overlay_textures_.end()) {
-    std::unique_ptr<OverlayTexture> result = std::move(*it);
-    available_overlay_textures_.erase(it);
-
-    result->render_pass_id = render_pass_id;
-    return result;
-  }
-
-  // Make a new texture if we could not find a match. Sadtimes.
-  auto result = std::make_unique<OverlayTexture>();
-  result->texture = ScopedGpuMemoryBufferTexture(
-      output_surface_->context_provider(),
-      gfx::Size(width, height), color_space);
-  result->render_pass_id = render_pass_id;
-  return result;
-}
-
-void GLRenderer::ReduceAvailableOverlayTextures() {
-  // Overlay resources may get returned back to the compositor at varying rates,
-  // so we may get a number of resources returned at once, then none for a
-  // while. As such, we want to hold onto enough resources to not have to create
-  // any when none are released for a while. Emperical study by erikchen@ on
-  // crbug.com/636884 found that saving 5 spare textures per RenderPass was
-  // sufficient for important benchmarks. This seems to imply that the OS may
-  // hold up to 5 frames of textures before releasing them.
-  static const int kKeepCountPerRenderPass = 5;
-
-  // In order to accomodate the above requirements, we hold any released texture
-  // in the |available_overlay_textures_| set for up to 5 frames before
-  // discarding it.
-  for (const auto& overlay : available_overlay_textures_)
-    overlay->frames_waiting_for_reuse++;
-  base::EraseIf(available_overlay_textures_,
-                [](const std::unique_ptr<OverlayTexture>& overlay) {
-                  return overlay->frames_waiting_for_reuse >=
-                         kKeepCountPerRenderPass;
-                });
-}
-
-std::unique_ptr<GLRenderer::OverlayTexture>
-GLRenderer::ScheduleRenderPassDrawQuad(const CALayerOverlay* ca_layer_overlay) {
-  DCHECK(ca_layer_overlay->rpdq);
-
-  std::unique_ptr<OverlayTexture> overlay_texture;
-  gfx::RectF new_bounds;
-  CopyRenderPassDrawQuadToOverlayResource(ca_layer_overlay, &overlay_texture,
-                                          &new_bounds);
-  if (!overlay_texture)
-    return {};
-
-  GLfloat contents_rect[4] = {
-      ca_layer_overlay->contents_rect.x(), ca_layer_overlay->contents_rect.y(),
-      ca_layer_overlay->contents_rect.width(),
-      ca_layer_overlay->contents_rect.height(),
-  };
-  GLfloat bounds_rect[4] = {
-      new_bounds.x(), new_bounds.y(), new_bounds.width(), new_bounds.height(),
-  };
-  GLboolean is_clipped = ca_layer_overlay->shared_state->is_clipped;
-  GLfloat clip_rect[4] = {ca_layer_overlay->shared_state->clip_rect.x(),
-                          ca_layer_overlay->shared_state->clip_rect.y(),
-                          ca_layer_overlay->shared_state->clip_rect.width(),
-                          ca_layer_overlay->shared_state->clip_rect.height()};
-
-  const gfx::RectF& rect =
-      ca_layer_overlay->shared_state->rounded_corner_bounds.rect();
-  GLfloat rounded_corner_rect[5] = {
-      rect.x(), rect.y(), rect.width(), rect.height(),
-      ca_layer_overlay->shared_state->rounded_corner_bounds.GetSimpleRadius()};
-
-  GLint sorting_context_id = ca_layer_overlay->shared_state->sorting_context_id;
-  GLfloat gl_transform[16];
-  ca_layer_overlay->shared_state->transform.matrix().getColMajor(gl_transform);
-  unsigned filter = ca_layer_overlay->filter;
-
-  // The alpha has already been applied when copying the RPDQ to an IOSurface.
-  GLfloat alpha = 1;
-  gl_->ScheduleCALayerSharedStateCHROMIUM(alpha, is_clipped, clip_rect,
-                                          rounded_corner_rect,
-                                          sorting_context_id, gl_transform);
-  gl_->ScheduleCALayerCHROMIUM(overlay_texture->texture.id(), contents_rect,
-                               ca_layer_overlay->background_color,
-                               ca_layer_overlay->edge_aa_mask, bounds_rect,
-                               filter);
-  return overlay_texture;
-}
-#endif  // BUILDFLAG(IS_APPLE)
-
-void GLRenderer::SetupOverdrawFeedback() {
-  gl_->StencilFunc(GL_ALWAYS, 1, 0xffffffff);
-  // First two values are ignored as test always passes.
-  gl_->StencilOp(GL_KEEP, GL_KEEP, GL_INCR);
-  gl_->StencilMask(0xffffffff);
-}
-
-void GLRenderer::FlushOverdrawFeedback(const gfx::Rect& output_rect) {
-  DCHECK(stencil_shadow_);
-
-  // Test only, keep everything.
-  gl_->StencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
-
-  EnsureScissorTestDisabled();
-  SetBlendEnabled(true);
-
-  PrepareGeometry(SHARED_BINDING);
-
-  SetUseProgram(ProgramKey::DebugBorder(), gfx::ColorSpace::CreateSRGB(),
-                CurrentRenderPassColorSpace());
-
-  gfx::Transform render_matrix;
-  render_matrix.Translate(0.5 * output_rect.width() + output_rect.x(),
-                          0.5 * output_rect.height() + output_rect.y());
-  render_matrix.Scale(output_rect.width(), output_rect.height());
-  SetShaderMatrix(current_frame()->projection_matrix * render_matrix);
-
-  // Produce hinting for the amount of overdraw on screen for each pixel by
-  // drawing hint colors to the framebuffer based on the current stencil value.
-  struct {
-    int multiplier;
-    GLenum func;
-    GLint ref;
-    SkColor color;
-  } stencil_tests[] = {
-      {1, GL_EQUAL, 2, 0x2f0000ff},  // Blue: Overdrawn once.
-      {2, GL_EQUAL, 3, 0x2f00ff00},  // Green: Overdrawn twice.
-      {3, GL_EQUAL, 4, 0x3fff0000},  // Pink: Overdrawn three times.
-      {4, GL_LESS, 4, 0x7fff0000},   // Red: Overdrawn four or more times.
-  };
-
-  for (const auto& test : stencil_tests) {
-    gl_->StencilFunc(test.func, test.ref, 0xffffffff);
-    // Transparent color unless color-coding of overdraw is enabled.
-    SetShaderColor(debug_settings_->show_overdraw_feedback ? test.color : 0,
-                   1.f);
-    gl_->DrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, nullptr);
-  }
-}
-
-void GLRenderer::ProcessOverdrawFeedback(base::CheckedNumeric<int> surface_area,
-                                         unsigned occlusion_query) {
-  unsigned result = 0;
-  DCHECK(occlusion_query);
-  gl_->GetQueryObjectuivEXT(occlusion_query, GL_QUERY_RESULT_EXT, &result);
-  gl_->DeleteQueriesEXT(1, &occlusion_query);
-
-  // Report GPU overdraw as a percentage of |surface_area|.
-  TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("viz.overdraw"), "GPU Overdraw",
-                 (result * 100.0 /
-                  static_cast<int>(surface_area.ValueOrDefault(INT_MAX))));
-}
-
-void GLRenderer::UpdateRenderPassTextures(
-    const AggregatedRenderPassList& render_passes_in_draw_order,
-    const base::flat_map<AggregatedRenderPassId, RenderPassRequirements>&
-        render_passes_in_frame) {
-  // Collect RenderPass textures that should be deleted.
-  std::vector<AggregatedRenderPassId> passes_to_delete;
-  for (const auto& pair : render_pass_textures_) {
-    auto render_pass_it = render_passes_in_frame.find(pair.first);
-    if (render_pass_it == render_passes_in_frame.end()) {
-      passes_to_delete.push_back(pair.first);
-      continue;
-    }
-    const RenderPassRequirements& requirements = render_pass_it->second;
-    const ScopedRenderPassTexture& texture = pair.second;
-    bool size_appropriate =
-        texture.size().width() >= requirements.size.width() &&
-        texture.size().height() >= requirements.size.height();
-    bool mipmap_appropriate = !requirements.generate_mipmap || texture.mipmap();
-    if (!size_appropriate || !mipmap_appropriate)
-      passes_to_delete.push_back(pair.first);
-  }
-  // Delete RenderPass textures from the previous frame that will not be used
-  // again.
-  for (auto& pass_to_delete : passes_to_delete) {
-    auto rp_backdrop_texture_it =
-        render_pass_backdrop_textures_.find(pass_to_delete);
-    if (rp_backdrop_texture_it != render_pass_backdrop_textures_.end())
-      render_pass_backdrop_textures_.erase(pass_to_delete);
-    render_pass_textures_.erase(pass_to_delete);
-  }
-}
-
-ResourceFormat GLRenderer::CurrentRenderPassResourceFormat() const {
-  const auto& caps = output_surface_->context_provider()->ContextCapabilities();
-  if (CurrentRenderPassColorSpace().IsHDR()) {
-    // If a platform does not support half-float renderbuffers then it should
-    // not should request HDR rendering.
-    DCHECK(caps.texture_half_float_linear);
-    DCHECK(caps.color_buffer_half_float_rgba);
-    return RGBA_F16;
-  }
-  return PlatformColor::BestSupportedTextureFormat(caps);
-}
-
-bool GLRenderer::HasOutputColorMatrix() const {
-  const bool is_root_render_pass =
-      current_frame()->current_render_pass == current_frame()->root_render_pass;
-  const SkM44& output_color_matrix = output_surface_->color_matrix();
-  return is_root_render_pass && output_color_matrix != SkM44();
-}
-
-bool GLRenderer::CanUseFastSolidColorDraw(
-    const SolidColorDrawQuad* quad) const {
-  const SharedQuadState* sqs = quad->shared_quad_state;
-
-  if (!use_fast_path_solid_color_quad_)
-    return false;
-
-  // Mask filters require blending with the background, which is not possible
-  // with the glClear draw method.
-  if (!sqs->mask_filter_info.IsEmpty())
-    return false;
-
-  // 3D transforms need vertex computation in 3D and cannot be handled using
-  // glClear().
-  if (!sqs->quad_to_target_transform.IsFlat())
-    return false;
-
-  // glClear ignores stencil buffer.
-  if (stencil_shadow_)
-    return false;
-
-  // Any non axis aligned transform cannot be handled by glClear.
-  if (!sqs->quad_to_target_transform.Preserves2dAxisAlignment())
-    return false;
-
-  // When no blending is needed, glClear can be used.
-  SkBlendMode blend_mode = quad->shared_quad_state->blend_mode;
-  if (blend_mode == SkBlendMode::kSrc)
-    return true;
-
-  if (blend_mode == SkBlendMode::kSrcOver) {
-    // Blending will replace destination color and alpha if the quad is opaque.
-    if (SkColorGetA(quad->color) == 255 &&
-        quad->shared_quad_state->opacity >= 1.0f) {
-      return true;
-    }
-
-    // It is safe to use glClearColor with alpha blending when the render
-    // pass has transparent background and nothing has drawn to the same rect
-    // area because the blending happens against (0, 0, 0, 0) which is the same
-    // as replacing the destination color & alpha.
-    if (!current_frame()->current_render_pass->has_transparent_background)
-      return false;
-
-    gfx::RectF quad_rect_in_target(quad->visible_rect);
-    sqs->quad_to_target_transform.TransformRect(&quad_rect_in_target);
-    const gfx::Rect quad_rect_in_target_rounded =
-        gfx::ToRoundedRect(quad_rect_in_target);
-
-    // If the quad does not intersect any region that has already been drawn
-    // to, then blending is not an issue and fast draw path can be used.
-    for (const auto& rect : drawn_rects_)
-      if (quad_rect_in_target_rounded.Intersects(rect))
-        return false;
-    return true;
-  }
-
-  return false;
-}
-
-void GLRenderer::AllocateRenderPassResourceIfNeeded(
-    const AggregatedRenderPassId& render_pass_id,
-    const RenderPassRequirements& requirements) {
-  auto contents_texture_it = render_pass_textures_.find(render_pass_id);
-  if (contents_texture_it != render_pass_textures_.end()) {
-    DCHECK(gfx::Rect(contents_texture_it->second.size())
-               .Contains(gfx::Rect(requirements.size)));
-    return;
-  }
-
-  ScopedRenderPassTexture contents_texture(
-      output_surface_->context_provider(), requirements.size,
-      CurrentRenderPassResourceFormat(), CurrentRenderPassColorSpace(),
-      requirements.generate_mipmap);
-  render_pass_textures_[render_pass_id] = std::move(contents_texture);
-}
-
-bool GLRenderer::IsRenderPassResourceAllocated(
-    const AggregatedRenderPassId& render_pass_id) const {
-  auto texture_it = render_pass_textures_.find(render_pass_id);
-  return texture_it != render_pass_textures_.end();
-}
-
-gfx::Size GLRenderer::GetRenderPassBackingPixelSize(
-    const AggregatedRenderPassId& render_pass_id) {
-  auto texture_it = render_pass_textures_.find(render_pass_id);
-  DCHECK(texture_it != render_pass_textures_.end());
-  return texture_it->second.size();
-}
-
-GLRenderer::OverlayTexture::OverlayTexture() = default;
-GLRenderer::OverlayTexture::~OverlayTexture() = default;
-
-bool GLRenderer::ColorTransformKey::operator==(
-    const ColorTransformKey& other) const {
-  return src == other.src && dst == other.dst &&
-         sdr_max_luminance_nits == other.sdr_max_luminance_nits;
-}
-
-bool GLRenderer::ColorTransformKey::operator!=(
-    const ColorTransformKey& other) const {
-  return !(*this == other);
-}
-
-bool GLRenderer::ColorTransformKey::operator<(
-    const ColorTransformKey& other) const {
-  return std::tie(src, dst, sdr_max_luminance_nits) <
-         std::tie(other.src, other.dst, other.sdr_max_luminance_nits);
-}
-
-}  // namespace viz
diff --git a/components/viz/service/display/gl_renderer.h b/components/viz/service/display/gl_renderer.h
deleted file mode 100644
index f3106e1..0000000
--- a/components/viz/service/display/gl_renderer.h
+++ /dev/null
@@ -1,525 +0,0 @@
-// Copyright 2010 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 COMPONENTS_VIZ_SERVICE_DISPLAY_GL_RENDERER_H_
-#define COMPONENTS_VIZ_SERVICE_DISPLAY_GL_RENDERER_H_
-
-#include <map>
-#include <memory>
-#include <string>
-#include <unordered_map>
-#include <utility>
-#include <vector>
-
-#include "base/cancelable_callback.h"
-#include "base/containers/circular_deque.h"
-#include "base/containers/queue.h"
-#include "base/memory/raw_ptr.h"
-#include "build/build_config.h"
-#include "components/viz/common/gpu/context_cache_controller.h"
-#include "components/viz/common/quads/aggregated_render_pass_draw_quad.h"
-#include "components/viz/common/quads/compositor_render_pass_draw_quad.h"
-#include "components/viz/common/quads/debug_border_draw_quad.h"
-#include "components/viz/common/quads/solid_color_draw_quad.h"
-#include "components/viz/common/quads/tile_draw_quad.h"
-#include "components/viz/common/quads/yuv_video_draw_quad.h"
-#include "components/viz/service/display/direct_renderer.h"
-#include "components/viz/service/display/display_resource_provider_gl.h"
-#include "components/viz/service/display/gl_renderer_copier.h"
-#include "components/viz/service/display/gl_renderer_draw_cache.h"
-#include "components/viz/service/display/program_binding.h"
-#include "components/viz/service/display/scoped_gpu_memory_buffer_texture.h"
-#include "components/viz/service/display/sync_query_collection.h"
-#include "components/viz/service/display/texture_deleter.h"
-#include "components/viz/service/viz_service_export.h"
-#include "ui/gfx/geometry/quad_f.h"
-#include "ui/gfx/gpu_fence_handle.h"
-#include "ui/latency/latency_info.h"
-
-#if BUILDFLAG(IS_APPLE)
-#include "components/viz/service/display/ca_layer_overlay.h"
-#endif
-
-#if BUILDFLAG(IS_WIN)
-#include "components/viz/service/display/dc_layer_overlay.h"
-#endif
-
-namespace base {
-class SingleThreadTaskRunner;
-}
-
-namespace gpu {
-namespace gles2 {
-class GLES2Interface;
-}
-}  // namespace gpu
-
-namespace gfx {
-class RRectF;
-}
-
-namespace viz {
-
-class DynamicGeometryBinding;
-class GLRendererShaderTest;
-class OutputSurface;
-class ScopedRenderPassTexture;
-class StaticGeometryBinding;
-class StreamVideoDrawQuad;
-class TextureDrawQuad;
-
-// Class that handles drawing of composited render layers using GL.
-class VIZ_SERVICE_EXPORT GLRenderer : public DirectRenderer {
- public:
-  class ScopedUseGrContext;
-
-  GLRenderer(const RendererSettings* settings,
-             const DebugRendererSettings* debug_settings,
-             OutputSurface* output_surface,
-             DisplayResourceProviderGL* resource_provider,
-             OverlayProcessorInterface* overlay_processor,
-             scoped_refptr<base::SingleThreadTaskRunner> current_task_runner);
-
-  GLRenderer(const GLRenderer&) = delete;
-  GLRenderer& operator=(const GLRenderer&) = delete;
-
-  ~GLRenderer() override;
-
-  bool use_swap_with_bounds() const { return use_swap_with_bounds_; }
-
-  void SwapBuffers(SwapFrameData swap_frame_data) override;
-  void SwapBuffersSkipped() override;
-  void SwapBuffersComplete(gfx::GpuFenceHandle release_fence) override;
-  void BuffersPresented() override;
-
-  void DidReceiveTextureInUseResponses(
-      const gpu::TextureInUseResponses& responses) override;
-
-  virtual bool IsContextLost();
-
- protected:
-  void DidChangeVisibility() override;
-
-  bool stencil_enabled() const { return stencil_shadow_; }
-
-  bool CanPartialSwap() override;
-  void UpdateRenderPassTextures(
-      const AggregatedRenderPassList& render_passes_in_draw_order,
-      const base::flat_map<AggregatedRenderPassId, RenderPassRequirements>&
-          render_passes_in_frame) override;
-  void AllocateRenderPassResourceIfNeeded(
-      const AggregatedRenderPassId& render_pass_id,
-      const RenderPassRequirements& requirements) override;
-  bool IsRenderPassResourceAllocated(
-      const AggregatedRenderPassId& render_pass_id) const override;
-  gfx::Size GetRenderPassBackingPixelSize(
-      const AggregatedRenderPassId& render_pass_id) override;
-  void BindFramebufferToOutputSurface() override;
-  void BindFramebufferToTexture(
-      const AggregatedRenderPassId render_pass_id) override;
-  void SetScissorTestRect(const gfx::Rect& scissor_rect) override;
-  void PrepareSurfaceForPass(SurfaceInitializationMode initialization_mode,
-                             const gfx::Rect& render_pass_scissor) override;
-  void DoDrawQuad(const class DrawQuad*,
-                  const gfx::QuadF* draw_region) override;
-  void BeginDrawingFrame() override;
-  void FlushOverdrawFeedback(const gfx::Rect& output_rect) override;
-  void FinishDrawingFrame() override;
-  bool FlippedFramebuffer() const override;
-  bool FlippedRootFramebuffer() const;
-  void EnsureScissorTestEnabled() override;
-  void EnsureScissorTestDisabled() override;
-  void CopyDrawnRenderPass(const copy_output::RenderPassGeometry& geometry,
-                           std::unique_ptr<CopyOutputRequest> request) override;
-  void FinishDrawingQuadList() override;
-  void GenerateMipmap() override;
-
-  // Returns true if quad requires antialiasing and false otherwise.
-  static bool ShouldAntialiasQuad(const gfx::QuadF& device_layer_quad,
-                                  bool clipped,
-                                  bool force_aa);
-
-  // Inflate the quad and fill edge array for fragment shader.
-  // |local_quad| is set to inflated quad. |edge| array is filled with
-  // inflated quad's edge data.
-  static void SetupQuadForClippingAndAntialiasing(
-      const gfx::Transform& device_transform,
-      const DrawQuad* quad,
-      const gfx::QuadF* device_layer_quad,
-      const gfx::QuadF* clip_region,
-      gfx::QuadF* local_quad,
-      float edge[24]);
-  static void SetupRenderPassQuadForClippingAndAntialiasing(
-      const gfx::Transform& device_transform,
-      const AggregatedRenderPassDrawQuad* quad,
-      const gfx::QuadF* device_layer_quad,
-      const gfx::QuadF* clip_region,
-      gfx::QuadF* local_quad,
-      float edge[24]);
-
- private:
-  friend class GLRendererCopierPixelTest;
-  friend class GLRendererShaderPixelTest;
-  friend class GLRendererShaderTest;
-  friend class GLRendererTest;
-
-  using OverlayResourceLock =
-      std::unique_ptr<DisplayResourceProviderGL::ScopedOverlayLockGL>;
-  using OverlayResourceLockList = std::vector<OverlayResourceLock>;
-
-  // If a RenderPass is used as an overlay, we render the RenderPass with any
-  // effects into a texture for overlay use. We must keep the texture alive past
-  // the execution of SwapBuffers, and such textures are more expensive to make
-  // so we want to reuse them.
-  struct OverlayTexture {
-    OverlayTexture();
-    ~OverlayTexture();
-
-    AggregatedRenderPassId render_pass_id;
-    ScopedGpuMemoryBufferTexture texture;
-    int frames_waiting_for_reuse = 0;
-  };
-
-  struct DrawRenderPassDrawQuadParams;
-
-  // Returns the format to use for storage if copying from the current
-  // framebuffer. If the root renderpass is current, it uses the best matching
-  // format from the OutputSurface, otherwise it uses the best matching format
-  // from the texture being drawn to as the backbuffer.
-  GLenum GetFramebufferCopyTextureFormat();
-  void ReleaseRenderPassTextures();
-  enum BoundGeometry { NO_BINDING, SHARED_BINDING, CLIPPED_BINDING };
-  void PrepareGeometry(BoundGeometry geometry_to_bind);
-  void SetStencilEnabled(bool enabled);
-  void SetBlendEnabled(bool enabled);
-  bool blend_enabled() const { return blend_shadow_; }
-
-  // If any of the following functions returns false, then it means that drawing
-  // is not possible.
-  bool InitializeRPDQParameters(DrawRenderPassDrawQuadParams* params);
-  void UpdateRPDQShadersForBlending(DrawRenderPassDrawQuadParams* params);
-  bool UpdateRPDQWithSkiaFilters(DrawRenderPassDrawQuadParams* params);
-  void UpdateRPDQTexturesForSampling(DrawRenderPassDrawQuadParams* params);
-  void UpdateRPDQBlendMode(DrawRenderPassDrawQuadParams* params);
-  void ChooseRPDQProgram(DrawRenderPassDrawQuadParams* params,
-                         const gfx::ColorSpace& target_color_space);
-  void UpdateRPDQUniforms(DrawRenderPassDrawQuadParams* params);
-  void DrawRPDQ(const DrawRenderPassDrawQuadParams& params);
-
-  static void ToGLMatrix(float* gl_matrix, const gfx::Transform& transform);
-
-  void DiscardPixels();
-  void ClearFramebuffer();
-  void SetViewport();
-
-  void DrawDebugBorderQuad(const DebugBorderDrawQuad* quad);
-  static bool IsDefaultBlendMode(SkBlendMode blend_mode) {
-    return blend_mode == SkBlendMode::kSrcOver;
-  }
-  bool CanApplyBlendModeUsingBlendFunc(SkBlendMode blend_mode);
-  void ApplyBlendModeUsingBlendFunc(SkBlendMode blend_mode);
-  void RestoreBlendFuncToDefault(SkBlendMode blend_mode);
-
-  // Returns the rect that should be sampled from the backdrop texture to be
-  // backdrop filtered. This rect lives in window pixel space. The
-  // |backdrop_filter_bounds| output lives in the space of the output rect
-  // returned by this function. It will be used to clip the sampled backdrop
-  // texture. The |unclipped_rect| output is the unclipped (full) rect that the
-  // backdrop_filter should be applied to, in window pixel space.
-  gfx::Rect GetBackdropBoundingBoxForRenderPassQuad(
-      DrawRenderPassDrawQuadParams* params,
-      gfx::Transform* backdrop_filter_bounds_transform,
-      absl::optional<gfx::RRectF>* backdrop_filter_bounds,
-      gfx::Rect* unclipped_rect) const;
-
-  // Allocates and returns a texture id that contains a copy of the contents
-  // of the current RenderPass being drawn.
-  uint32_t GetBackdropTexture(const gfx::Rect& window_rect,
-                              float scale,
-                              GLenum* internal_format);
-
-  static bool ShouldApplyBackdropFilters(
-      const DrawRenderPassDrawQuadParams* params);
-
-  // Applies the backdrop filters to the backdrop that has been painted to this
-  // point, and returns it as an SkImage. Any opacity and/or "regular"
-  // (non-backdrop) filters will also be applied directly to the backdrop-
-  // filtered image at this point, so that the final result is as if the
-  // filtered backdrop image was painted as the starting point for this new
-  // stacking context, which would then be painted into its parent with opacity
-  // and filters applied. This is an approximation, but it should be close
-  // enough.
-  sk_sp<SkImage> ApplyBackdropFilters(
-      DrawRenderPassDrawQuadParams* params,
-      const gfx::Rect& unclipped_rect,
-      const absl::optional<gfx::RRectF>& backdrop_filter_bounds,
-      const gfx::Transform& backdrop_filter_bounds_transform);
-
-  // gl_renderer can bypass TileDrawQuads that fill the RenderPass
-  const DrawQuad* CanPassBeDrawnDirectly(
-      const AggregatedRenderPass* pass) override;
-
-  void DrawRenderPassQuad(const AggregatedRenderPassDrawQuad* quadi,
-                          const gfx::QuadF* clip_region);
-  void DrawRenderPassQuadInternal(DrawRenderPassDrawQuadParams* params);
-  void DrawSolidColorQuad(const SolidColorDrawQuad* quad,
-                          const gfx::QuadF* clip_region);
-  void DrawStreamVideoQuad(const StreamVideoDrawQuad* quad,
-                           const gfx::QuadF* clip_region);
-  void EnqueueTextureQuad(const TextureDrawQuad* quad,
-                          const gfx::QuadF* clip_region);
-  void FlushTextureQuadCache(BoundGeometry flush_binding);
-  void DrawTileQuad(const TileDrawQuad* quad, const gfx::QuadF* clip_region);
-  void DrawContentQuad(const ContentDrawQuadBase* quad,
-                       ResourceId resource_id,
-                       const gfx::QuadF* clip_region);
-  void DrawContentQuadAA(const ContentDrawQuadBase* quad,
-                         ResourceId resource_id,
-                         const gfx::Transform& device_transform,
-                         const gfx::QuadF& aa_quad,
-                         const gfx::QuadF* clip_region);
-  void DrawContentQuadNoAA(const ContentDrawQuadBase* quad,
-                           ResourceId resource_id,
-                           const gfx::QuadF* clip_region);
-  void DrawYUVVideoQuad(const YUVVideoDrawQuad* quad,
-                        const gfx::QuadF* clip_region);
-
-  void SetShaderOpacity(float opacity);
-  void SetShaderQuadF(const gfx::QuadF& quad);
-  void SetShaderMatrix(const gfx::Transform& transform);
-  void SetShaderColor(SkColor color, float opacity);
-  void SetShaderRoundedCorner(const gfx::RRectF& rounded_corner_bounds,
-                              const gfx::Transform& screen_transform);
-  void DrawQuadGeometryClippedByQuadF(const gfx::Transform& draw_transform,
-                                      const gfx::RectF& quad_rect,
-                                      const gfx::QuadF& clipping_region_quad,
-                                      const float uv[8]);
-  void DrawQuadGeometry(const gfx::Transform& projection_matrix,
-                        const gfx::Transform& draw_transform,
-                        const gfx::RectF& quad_rect);
-  void DrawQuadGeometryWithAA(const DrawQuad* quad,
-                              gfx::QuadF* local_quad,
-                              const gfx::Rect& tile_rect);
-
-  const gfx::QuadF& SharedGeometryQuad() const { return shared_geometry_quad_; }
-  const StaticGeometryBinding* SharedGeometry() const {
-    return shared_geometry_.get();
-  }
-
-  // If |dst_color_space| is invalid, then no color conversion (apart from YUV
-  // to RGB conversion) is performed. This explicit argument is available so
-  // that video color conversion can be enabled separately from general color
-  // conversion. If |adjust_src_white_level| is true, then the |src_color_space|
-  // white levels are adjusted to the display SDR white level so that no white
-  // level scaling happens. |src_hdr_metadata|, if available, is the mastering
-  // metadata associated to the source quad.
-  void SetUseProgram(
-      const ProgramKey& program_key,
-      const gfx::ColorSpace& src_color_space,
-      const gfx::ColorSpace& dst_color_space,
-      bool adjust_src_white_level = false,
-      absl::optional<gfx::HDRMetadata> src_hdr_metadata = absl::nullopt);
-
-  bool MakeContextCurrent();
-
-  void InitializeSharedObjects();
-  void CleanupSharedObjects();
-
-  void ReinitializeGLState();
-  void RestoreGLState();
-  void RestoreGLStateAfterSkia();
-
-  // TODO(weiliangc): Once the overlay processor could schedule overlays, remove
-  // these functions.
-  // Sends over output surface information as it is a overlay plane. This is
-  // used for BufferQueue. For non-BufferQueue cases, this function will do
-  // nothing.
-  void ScheduleOutputSurfaceAsOverlay();
-  // Schedule overlays sends overlay candidate to the GPU.
-#if BUILDFLAG(IS_ANDROID) || defined(USE_OZONE)
-  void ScheduleOverlays();
-#elif BUILDFLAG(IS_APPLE)
-  void ScheduleCALayers();
-
-  // Schedules the |ca_layer_overlay|, which is guaranteed to have a non-null
-  // |rpdq| parameter. Returns ownership of a GL texture that contains the
-  // output of the CompositorRenderPassDrawQuad.
-  std::unique_ptr<OverlayTexture> ScheduleRenderPassDrawQuad(
-      const CALayerOverlay* ca_layer_overlay);
-
-  // Copies the contents of the render pass draw quad, including filter effects,
-  // to a GL texture, returned in |overlay_texture|. The resulting texture may
-  // be larger than the CompositorRenderPassDrawQuad's output, in order to reuse
-  // existing textures. The new size and position is placed in |new_bounds|.
-  void CopyRenderPassDrawQuadToOverlayResource(
-      const CALayerOverlay* ca_layer_overlay,
-      std::unique_ptr<OverlayTexture>* overlay_texture,
-      gfx::RectF* new_bounds);
-  std::unique_ptr<OverlayTexture> FindOrCreateOverlayTexture(
-      const AggregatedRenderPassId& render_pass_id,
-      int width,
-      int height,
-      const gfx::ColorSpace& color_space);
-  void ReduceAvailableOverlayTextures();
-
-#elif BUILDFLAG(IS_WIN)
-  void ScheduleDCLayers();
-#endif
-
-  // Setup/flush all pending overdraw feedback to framebuffer.
-  void SetupOverdrawFeedback();
-
-  // Process overdraw feedback from query.
-  void ProcessOverdrawFeedback(base::CheckedNumeric<int> surface_area,
-                               unsigned query);
-  bool OverdrawTracingEnabled();
-
-  bool CompositeTimeTracingEnabled() override;
-  void AddCompositeTimeTraces(base::TimeTicks ready_timestamp) override;
-
-  ResourceFormat CurrentRenderPassResourceFormat() const;
-
-  bool HasOutputColorMatrix() const;
-
-  // Returns true if the given solid color draw quad can be safely drawn using
-  // the glClear function call.
-  bool CanUseFastSolidColorDraw(const SolidColorDrawQuad* quad) const;
-
-  DisplayResourceProviderGL* resource_provider() {
-    return static_cast<DisplayResourceProviderGL*>(resource_provider_);
-  }
-
-  // A map from RenderPass id to the texture used to draw the RenderPass from.
-  base::flat_map<AggregatedRenderPassId, ScopedRenderPassTexture>
-      render_pass_textures_;
-
-  // A map from RenderPass id to backdrop filter cache texture.
-  base::flat_map<AggregatedRenderPassId, sk_sp<SkImage>>
-      render_pass_backdrop_textures_;
-
-  // OverlayTextures that are free to be used in the next frame.
-  std::vector<std::unique_ptr<OverlayTexture>> available_overlay_textures_;
-  // OverlayTextures that have been set up for use but are waiting for
-  // SwapBuffers.
-  std::vector<std::unique_ptr<OverlayTexture>> awaiting_swap_overlay_textures_;
-  // OverlayTextures that have been swapped for display on the gpu. Each vector
-  // represents a single frame, and may be empty if none were used in that
-  // frame. Ordered from oldest to most recent frame.
-  std::vector<std::vector<std::unique_ptr<OverlayTexture>>>
-      displayed_overlay_textures_;
-  // OverlayTextures that we have replaced on the gpu but are awaiting
-  // confirmation that we can reuse them.
-  std::vector<std::unique_ptr<OverlayTexture>>
-      awaiting_release_overlay_textures_;
-
-  // Resources that have been sent to the GPU process, but not yet swapped.
-  OverlayResourceLockList pending_overlay_resources_;
-  // Resources that should be shortly swapped by the GPU process.
-  base::circular_deque<OverlayResourceLockList> swapping_overlay_resources_;
-
-  // Locks for overlays that have release fences and read lock fences.
-  base::circular_deque<OverlayResourceLockList>
-      read_lock_release_fence_overlay_locks_;
-
-  // Resources that the GPU process has finished swapping. The key is the
-  // texture id of the resource.
-  std::map<unsigned, OverlayResourceLock> swapped_and_acked_overlay_resources_;
-
-  // Query object, used to determine the number of sample drawn during a render
-  // pass.
-  unsigned occlusion_query_ = 0u;
-
-  unsigned offscreen_framebuffer_id_ = 0u;
-
-  std::unique_ptr<StaticGeometryBinding> shared_geometry_;
-  std::unique_ptr<DynamicGeometryBinding> clipped_geometry_;
-  gfx::QuadF shared_geometry_quad_;
-
-  // This will return nullptr if the requested program has not yet been
-  // initialized.
-  const Program* GetProgramIfInitialized(const ProgramKey& key) const;
-
-  std::unordered_map<ProgramKey, std::unique_ptr<Program>, ProgramKeyHash>
-      program_cache_;
-
-  const gfx::ColorTransform* GetColorTransform(const gfx::ColorSpace& src,
-                                               const gfx::ColorSpace& dst);
-  struct ColorTransformKey {
-    gfx::ColorSpace src;
-    gfx::ColorSpace dst;
-    float sdr_max_luminance_nits = 0.f;
-    bool operator==(const ColorTransformKey& other) const;
-    bool operator!=(const ColorTransformKey& other) const;
-    bool operator<(const ColorTransformKey& other) const;
-  };
-  std::map<ColorTransformKey, std::unique_ptr<gfx::ColorTransform>>
-      color_transform_cache_;
-
-  raw_ptr<gpu::gles2::GLES2Interface> gl_;
-  raw_ptr<gpu::ContextSupport> context_support_;
-  std::unique_ptr<ContextCacheController::ScopedVisibility> context_visibility_;
-  std::unique_ptr<ContextCacheController::ScopedBusy> context_busy_;
-
-  TextureDeleter texture_deleter_;
-  GLRendererCopier copier_;
-
-  gfx::Rect swap_buffer_rect_;
-  std::vector<gfx::Rect> swap_content_bounds_;
-  gfx::Rect scissor_rect_;
-  bool is_scissor_enabled_ = false;
-  bool stencil_shadow_ = false;
-  bool blend_shadow_ = false;
-  raw_ptr<const Program> current_program_ = nullptr;
-  TexturedQuadDrawCache draw_cache_;
-  int highp_threshold_cache_ = 0;
-
-  raw_ptr<ScopedRenderPassTexture> current_framebuffer_texture_;
-
-  SyncQueryCollection sync_queries_;
-  bool use_discard_framebuffer_ = false;
-  bool use_sync_query_ = false;
-  bool use_blend_equation_advanced_ = false;
-  bool use_blend_equation_advanced_coherent_ = false;
-  bool use_timer_query_ = false;
-  bool use_occlusion_query_ = false;
-  bool use_swap_with_bounds_ = false;
-  bool use_fast_path_solid_color_quad_ = false;
-  bool supports_multi_sampling_ = false;
-
-  // If true, tints all the composited content to red.
-  bool tint_gl_composited_content_ = true;
-
-#if BUILDFLAG(IS_APPLE)
-  // The method FlippedFramebuffer determines whether the framebuffer associated
-  // with a DrawingFrame is flipped. It makes the assumption that the
-  // DrawingFrame is being used as part of a render pass. If a DrawingFrame is
-  // not being used as part of a render pass, setting it here forces
-  // FlippedFramebuffer to return |true|.
-  bool force_drawing_frame_framebuffer_unflipped_ = false;
-#endif
-
-  BoundGeometry bound_geometry_;
-
-  unsigned offscreen_stencil_renderbuffer_id_ = 0;
-  gfx::Size offscreen_stencil_renderbuffer_size_;
-
-  unsigned num_triangles_drawn_ = 0;
-  bool prefer_draw_to_copy_ = false;
-
-  // A circular queue of to keep track of timer queries and their associated
-  // quad type as string.
-  base::queue<std::pair<unsigned, std::string>> timer_queries_;
-
-  // Keeps track of areas that have been drawn to in the current render pass.
-  std::vector<gfx::Rect> drawn_rects_;
-
-  // This may be null if the compositor is run on a thread without a
-  // MessageLoop.
-  scoped_refptr<base::SingleThreadTaskRunner> current_task_runner_;
-  base::WeakPtrFactory<GLRenderer> weak_ptr_factory_{this};
-};
-
-}  // namespace viz
-
-#endif  // COMPONENTS_VIZ_SERVICE_DISPLAY_GL_RENDERER_H_
diff --git a/components/viz/service/display/gl_renderer_copier.cc b/components/viz/service/display/gl_renderer_copier.cc
deleted file mode 100644
index bbfe5a75..0000000
--- a/components/viz/service/display/gl_renderer_copier.cc
+++ /dev/null
@@ -1,1298 +0,0 @@
-// Copyright 2017 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 "components/viz/service/display/gl_renderer_copier.h"
-
-#include <cstring>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/containers/cxx20_erase.h"
-#include "base/memory/raw_ptr.h"
-#include "base/process/memory.h"
-#include "base/threading/sequenced_task_runner_handle.h"
-#include "components/viz/common/frame_sinks/copy_output_request.h"
-#include "components/viz/common/frame_sinks/copy_output_result.h"
-#include "components/viz/common/frame_sinks/copy_output_util.h"
-#include "components/viz/common/gl_i420_converter.h"
-#include "components/viz/common/gl_nv12_converter.h"
-#include "components/viz/common/gl_scaler.h"
-#include "components/viz/common/gpu/context_provider.h"
-#include "components/viz/service/display/texture_deleter.h"
-#include "gpu/GLES2/gl2extchromium.h"
-#include "gpu/command_buffer/client/context_support.h"
-#include "gpu/command_buffer/client/gles2_interface.h"
-#include "gpu/command_buffer/client/shared_image_interface.h"
-#include "gpu/command_buffer/common/mailbox.h"
-#include "gpu/command_buffer/common/shared_image_usage.h"
-#include "gpu/command_buffer/common/sync_token.h"
-#include "third_party/libyuv/include/libyuv/planar_functions.h"
-#include "third_party/skia/include/core/SkBitmap.h"
-#include "third_party/skia/include/core/SkColorSpace.h"
-#include "third_party/skia/include/core/SkImageInfo.h"
-#include "ui/gfx/geometry/size.h"
-
-// Syntactic sugar to DCHECK that two sizes are equal.
-#define DCHECK_SIZE_EQ(a, b)                                \
-  DCHECK((a) == (b)) << #a " != " #b ": " << (a).ToString() \
-                     << " != " << (b).ToString()
-
-namespace viz {
-
-using ResultFormat = CopyOutputRequest::ResultFormat;
-using ResultDestination = CopyOutputRequest::ResultDestination;
-
-namespace {
-
-constexpr int kRGBABytesPerPixel = 4;
-
-// Returns the source property of the |request|, if it is set. Otherwise,
-// returns an empty token. This is needed because CopyOutputRequest will crash
-// if source() is called when !has_source().
-base::UnguessableToken SourceOf(const CopyOutputRequest& request) {
-  return request.has_source() ? request.source() : base::UnguessableToken();
-}
-
-// Creates a new texture, binds it to the GL_TEXTURE_2D target, and initializes
-// its default parameters.
-GLuint CreateDefaultTexture2D(gpu::gles2::GLES2Interface* gl) {
-  GLuint result = 0;
-  gl->GenTextures(1, &result);
-  gl->BindTexture(GL_TEXTURE_2D, result);
-  gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-  gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-  gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-  gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-  return result;
-}
-
-// Creates or re-creates a texture, only if needed, to ensure a texture of the
-// given |required| size is defined. |texture| and |size| are I/O parameters,
-// read to determine what to do and updated if any changes are made.
-void EnsureTextureDefinedWithSize(gpu::gles2::GLES2Interface* gl,
-                                  const gfx::Size& required,
-                                  GLuint* texture,
-                                  gfx::Size* size) {
-  if (*texture != 0 && *size == required)
-    return;
-  if (*texture == 0) {
-    *texture = CreateDefaultTexture2D(gl);
-  } else {
-    gl->BindTexture(GL_TEXTURE_2D, *texture);
-  }
-  gl->TexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, required.width(), required.height(),
-                 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
-  *size = required;
-}
-
-// Returns parameters for the scaler to scale/transform the image in the source
-// framebuffer to meet the requirements of the |request|.
-GLScaler::Parameters CreateScalerParameters(
-    const CopyOutputRequest& request,
-    const gfx::ColorSpace& source_color_space,
-    const gfx::ColorSpace& output_color_space,
-    bool flipped_source) {
-  GLScaler::Parameters params;
-
-  params.scale_from = request.scale_from();
-  params.scale_to = request.scale_to();
-  params.source_color_space = source_color_space;
-  params.output_color_space = output_color_space;
-  // For downscaling, use the GOOD quality setting (appropriate for
-  // thumbnailing); and, for upscaling, use the BEST quality.
-  const bool is_downscale_in_both_dimensions =
-      request.scale_to().x() < request.scale_from().x() &&
-      request.scale_to().y() < request.scale_from().y();
-  params.quality = is_downscale_in_both_dimensions
-                       ? GLScaler::Parameters::Quality::GOOD
-                       : GLScaler::Parameters::Quality::BEST;
-  params.is_flipped_source = flipped_source;
-
-  return params;
-}
-
-// Returns the specified offset in the form of a pointer for OpenGL's
-// `glReadPixels` call. This is not a valid memory address and the pointer
-// should never be dereferenced.
-uint8_t* GetOffsetPointer(int offset) {
-  uint8_t* result = reinterpret_cast<uint8_t*>(0);
-  result += offset;
-  return result;
-}
-
-}  // namespace
-
-GLRendererCopier::GLRendererCopier(ContextProvider* context_provider,
-                                   TextureDeleter* texture_deleter)
-    : context_provider_(context_provider), texture_deleter_(texture_deleter) {}
-
-GLRendererCopier::~GLRendererCopier() {
-  for (auto& entry : cache_)
-    entry.second->Free(context_provider_->ContextGL());
-}
-
-void GLRendererCopier::CopyFromTextureOrFramebuffer(
-    std::unique_ptr<CopyOutputRequest> request,
-    const copy_output::RenderPassGeometry& geometry,
-    GLenum internal_format,
-    GLuint framebuffer_texture,
-    const gfx::Size& framebuffer_texture_size,
-    bool flipped_source,
-    const gfx::ColorSpace& framebuffer_color_space) {
-  const gfx::Rect& result_rect = geometry.result_selection;
-
-  // If we can't convert |color_space| to a SkColorSpace for SkBitmap copy
-  // requests (e.g. PIECEWISE_HDR), fallback to a color transform to sRGB
-  // before returning the copy result.
-  gfx::ColorSpace dest_color_space = framebuffer_color_space;
-  if (!framebuffer_color_space.ToSkColorSpace() &&
-      request->result_format() == ResultFormat::RGBA &&
-      request->result_destination() == ResultDestination::kSystemMemory) {
-    dest_color_space = gfx::ColorSpace::CreateSRGB();
-  }
-  // Fast-Path: If no transformation is necessary and no new textures need to be
-  // generated, read-back directly from the currently-bound framebuffer.
-  if (request->result_format() == ResultFormat::RGBA &&
-      request->result_destination() == ResultDestination::kSystemMemory &&
-      framebuffer_color_space == dest_color_space && !request->is_scaled()) {
-    StartReadbackFromFramebuffer(std::move(request), geometry.readback_offset,
-                                 flipped_source, false, result_rect,
-                                 dest_color_space);
-    return;
-  }
-
-  gfx::Rect sampling_rect = geometry.sampling_bounds;
-
-  const base::UnguessableToken requester = SourceOf(*request);
-  std::unique_ptr<ReusableThings> things =
-      TakeReusableThingsOrCreate(requester);
-
-  // Determine the source texture: This is either the one attached to the
-  // framebuffer, or a copy made from the framebuffer. Its format will be the
-  // same as |internal_format|.
-  //
-  // TODO(crbug/767221): All of this (including some texture copies) wouldn't be
-  // necessary if we could query whether the currently-bound framebuffer has a
-  // texture attached to it, and just source from that texture directly (i.e.,
-  // using glGetFramebufferAttachmentParameteriv() and
-  // glGetTexLevelParameteriv(GL_TEXTURE_WIDTH/HEIGHT)).
-  GLuint source_texture;
-  gfx::Size source_texture_size;
-  if (framebuffer_texture != 0) {
-    source_texture = framebuffer_texture;
-    source_texture_size = framebuffer_texture_size;
-  } else {
-    auto* const gl = context_provider_->ContextGL();
-    if (things->fb_copy_texture == 0) {
-      things->fb_copy_texture = CreateDefaultTexture2D(gl);
-      things->fb_copy_texture_internal_format = static_cast<GLenum>(GL_NONE);
-      things->fb_copy_texture_size = gfx::Size();
-    } else {
-      gl->BindTexture(GL_TEXTURE_2D, things->fb_copy_texture);
-    }
-    if (things->fb_copy_texture_internal_format == internal_format &&
-        things->fb_copy_texture_size == sampling_rect.size()) {
-      // Copy the framebuffer pixels without redefining the texture.
-      gl->CopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, sampling_rect.x(),
-                            sampling_rect.y(), sampling_rect.width(),
-                            sampling_rect.height());
-    } else {
-      // Copy the framebuffer pixels into a newly-defined texture.
-      gl->CopyTexImage2D(GL_TEXTURE_2D, 0, internal_format, sampling_rect.x(),
-                         sampling_rect.y(), sampling_rect.width(),
-                         sampling_rect.height(), 0);
-      things->fb_copy_texture_internal_format = internal_format;
-      things->fb_copy_texture_size = sampling_rect.size();
-    }
-    source_texture = things->fb_copy_texture;
-    source_texture_size = sampling_rect.size();
-    sampling_rect.set_origin(gfx::Point());
-  }
-
-  // Revert the Y-flipping of the sampling rect coordinates for GLScaler, which
-  // always assumes the source offset is assuming a origin-at-top-left
-  // coordinate space.
-  if (flipped_source) {
-    sampling_rect.set_y(source_texture_size.height() - sampling_rect.bottom());
-  }
-
-  switch (request->result_format()) {
-    case ResultFormat::RGBA:
-
-      switch (request->result_destination()) {
-        case ResultDestination::kSystemMemory:
-          EnsureTextureDefinedWithSize(
-              context_provider_->ContextGL(), result_rect.size(),
-              &things->result_texture, &things->result_texture_size);
-          RenderResultTexture(*request, flipped_source, framebuffer_color_space,
-                              dest_color_space, source_texture,
-                              source_texture_size, sampling_rect, result_rect,
-                              things->result_texture, things.get());
-          StartReadbackFromTexture(std::move(request), result_rect,
-                                   dest_color_space, things.get());
-          break;
-        case ResultDestination::kNativeTextures:
-          RenderAndSendTextureResult(std::move(request), flipped_source,
-                                     framebuffer_color_space, dest_color_space,
-                                     source_texture, source_texture_size,
-                                     sampling_rect, result_rect, things.get());
-          break;
-      }
-
-      break;
-
-    case ResultFormat::I420_PLANES: {
-      // The optimized single-copy path, provided by GLPixelBufferI420Result,
-      // requires that the result be accessed via a task in the same task runner
-      // sequence as the GLRendererCopier. Since I420_PLANES requests are meant
-      // to be VIZ-internal, this is an acceptable limitation to enforce.
-      if (!request->SendsResultsInCurrentSequence()) {
-        request->set_result_task_runner(base::SequencedTaskRunnerHandle::Get());
-      }
-
-      const gfx::Rect aligned_rect = RenderI420Textures(
-          *request, flipped_source, framebuffer_color_space, source_texture,
-          source_texture_size, sampling_rect, result_rect, things.get());
-      StartI420ReadbackFromTextures(std::move(request), aligned_rect,
-                                    result_rect, things.get());
-      break;
-    }
-
-    case ResultFormat::NV12_PLANES: {
-      // The optimized single-copy path, provided by GLPixelBufferNV12Result,
-      // requires that the result be accessed via a task in the same task runner
-      // sequence as the GLRendererCopier. Since NV12_PLANES requests are meant
-      // to be VIZ-internal, this is an acceptable limitation to enforce.
-      if (!request->SendsResultsInCurrentSequence()) {
-        request->set_result_task_runner(base::SequencedTaskRunnerHandle::Get());
-      }
-
-      const gfx::Rect aligned_rect = RenderNV12Textures(
-          *request, flipped_source, framebuffer_color_space, source_texture,
-          source_texture_size, sampling_rect, result_rect, things.get());
-      StartNV12ReadbackFromTextures(std::move(request), aligned_rect,
-                                    result_rect, things.get());
-
-      break;
-    }
-  }
-
-  StashReusableThingsOrDelete(requester, std::move(things));
-}
-
-void GLRendererCopier::FreeUnusedCachedResources() {
-  ++purge_counter_;
-
-  // Purge all cache entries that should no longer be kept alive, freeing any
-  // resources they held.
-  const auto IsTooOld = [this](const decltype(cache_)::value_type& entry) {
-    return static_cast<int32_t>(purge_counter_ -
-                                entry.second->purge_count_at_last_use) >=
-           kKeepalivePeriod;
-  };
-  for (auto& entry : cache_) {
-    if (IsTooOld(entry))
-      entry.second->Free(context_provider_->ContextGL());
-  }
-  base::EraseIf(cache_, IsTooOld);
-}
-
-void GLRendererCopier::RenderResultTexture(
-    const CopyOutputRequest& request,
-    bool flipped_source,
-    const gfx::ColorSpace& source_color_space,
-    const gfx::ColorSpace& dest_color_space,
-    GLuint source_texture,
-    const gfx::Size& source_texture_size,
-    const gfx::Rect& sampling_rect,
-    const gfx::Rect& result_rect,
-    GLuint result_texture,
-    ReusableThings* things) {
-  DCHECK_EQ(request.result_format(), ResultFormat::RGBA);
-
-  GLScaler::Parameters params = CreateScalerParameters(
-      request, source_color_space, dest_color_space, flipped_source);
-
-  if (request.result_destination() == ResultDestination::kSystemMemory) {
-    // Render the result in top-down row order, and swizzle, within the GPU so
-    // these things don't have to be done, less efficiently, on the CPU later.
-    params.flip_output = flipped_source;
-    params.swizzle[0] =
-        ShouldSwapRedAndBlueForBitmapReadback() ? GL_BGRA_EXT : GL_RGBA;
-  } else {
-    // Texture results are always in bottom-up row order.
-    DCHECK_EQ(request.result_destination(), ResultDestination::kNativeTextures);
-    params.flip_output = !flipped_source;
-    DCHECK_EQ(params.swizzle[0], static_cast<GLenum>(GL_RGBA));
-  }
-
-  if (!things->scaler)
-    things->scaler = std::make_unique<GLScaler>(context_provider_);
-  if (!GLScaler::ParametersAreEquivalent(params, things->scaler->params())) {
-    const bool is_configured = things->scaler->Configure(params);
-    // GLRendererCopier should never use illegal or unsupported options, nor
-    // be using GLScaler with an invalid GL context.
-    DCHECK(is_configured);
-  }
-
-  const bool success = things->scaler->Scale(
-      source_texture, source_texture_size, sampling_rect.OffsetFromOrigin(),
-      result_texture, result_rect);
-  DCHECK(success);
-}
-
-gfx::Rect GLRendererCopier::RenderI420Textures(
-    const CopyOutputRequest& request,
-    bool flipped_source,
-    const gfx::ColorSpace& source_color_space,
-    GLuint source_texture,
-    const gfx::Size& source_texture_size,
-    const gfx::Rect& sampling_rect,
-    const gfx::Rect& result_rect,
-    ReusableThings* things) {
-  DCHECK_EQ(request.result_format(), ResultFormat::I420_PLANES);
-
-  auto* const gl = context_provider_->ContextGL();
-
-  // Compute required Y/U/V texture sizes and re-define them, if necessary. See
-  // class comments for GLI420Converter for an explanation of how planar data is
-  // packed into RGBA textures.
-  const gfx::Rect aligned_rect = GLI420Converter::ToAlignedRect(result_rect);
-  const gfx::Size required_luma_size(aligned_rect.width() / kRGBABytesPerPixel,
-                                     aligned_rect.height());
-  const gfx::Size required_chroma_size(required_luma_size.width() / 2,
-                                       required_luma_size.height() / 2);
-
-  EnsureTextureDefinedWithSize(gl, required_luma_size, &things->yuv_textures[0],
-                               &things->texture_sizes[0]);
-  EnsureTextureDefinedWithSize(gl, required_chroma_size,
-                               &things->yuv_textures[1],
-                               &things->texture_sizes[1]);
-  EnsureTextureDefinedWithSize(gl, required_chroma_size,
-                               &things->yuv_textures[2],
-                               &things->texture_sizes[2]);
-
-  GLI420Converter::Parameters params =
-      CreateScalerParameters(request, source_color_space,
-                             gfx::ColorSpace::CreateREC709(), flipped_source);
-  // I420 readback assumes content is in top-down row order. Also, set the
-  // output swizzle to match the readback format so that image bitmaps don't
-  // have to be byte-order-swizzled on the CPU later.
-  params.flip_output = flipped_source;
-  params.swizzle[0] = GetOptimalReadbackFormat();
-
-  if (!things->i420_converter) {
-    things->i420_converter =
-        std::make_unique<GLI420Converter>(context_provider_);
-  }
-  if (!GLI420Converter::ParametersAreEquivalent(
-          params, things->i420_converter->params())) {
-    const bool is_configured = things->i420_converter->Configure(params);
-    // GLRendererCopier should never use illegal or unsupported options, nor
-    // be using GLI420Converter with an invalid GL context.
-    DCHECK(is_configured);
-  }
-
-  const bool success = things->i420_converter->Convert(
-      source_texture, source_texture_size, sampling_rect.OffsetFromOrigin(),
-      aligned_rect, things->yuv_textures.data());
-  DCHECK(success);
-
-  return aligned_rect;
-}
-
-gfx::Rect GLRendererCopier::RenderNV12Textures(
-    const CopyOutputRequest& request,
-    bool flipped_source,
-    const gfx::ColorSpace& source_color_space,
-    GLuint source_texture,
-    const gfx::Size& source_texture_size,
-    const gfx::Rect& sampling_rect,
-    const gfx::Rect& result_rect,
-    ReusableThings* things) {
-  DCHECK_EQ(request.result_format(), ResultFormat::NV12_PLANES);
-
-  auto* const gl = context_provider_->ContextGL();
-
-  // Compute required Y/UV texture sizes and re-define them, if necessary. See
-  // class comments for GLNV12Converter for an explanation of how planar data is
-  // packed into RGBA textures.
-  const gfx::Rect aligned_rect = GLNV12Converter::ToAlignedRect(result_rect);
-
-  const gfx::Size required_luma_size(aligned_rect.width() / kRGBABytesPerPixel,
-                                     aligned_rect.height());
-  const gfx::Size required_chroma_size(required_luma_size.width(),
-                                       required_luma_size.height() / 2);
-
-  EnsureTextureDefinedWithSize(gl, required_luma_size, &things->yuv_textures[0],
-                               &things->texture_sizes[0]);
-
-  EnsureTextureDefinedWithSize(gl, required_chroma_size,
-                               &things->yuv_textures[1],
-                               &things->texture_sizes[1]);
-
-  GLNV12Converter::Parameters params =
-      CreateScalerParameters(request, source_color_space,
-                             gfx::ColorSpace::CreateREC709(), flipped_source);
-
-  // NV12 readback assumes content is in top-down row order. Also, set the
-  // output swizzle to match the readback format so that image bitmaps don't
-  // have to be byte-order-swizzled on the CPU later.
-  params.flip_output = flipped_source;
-  params.swizzle[0] = GetOptimalReadbackFormat();
-
-  if (!things->nv12_converter) {
-    things->nv12_converter =
-        std::make_unique<GLNV12Converter>(context_provider_);
-  }
-  if (!GLNV12Converter::ParametersAreEquivalent(
-          params, things->nv12_converter->params())) {
-    const bool is_configured = things->nv12_converter->Configure(params);
-    // GLRendererCopier should never use illegal or unsupported options, nor
-    // be using GLNV12Converter with an invalid GL context.
-    DCHECK(is_configured);
-  }
-
-  const bool success = things->nv12_converter->Convert(
-      source_texture, source_texture_size, sampling_rect.OffsetFromOrigin(),
-      aligned_rect, things->yuv_textures.data());
-  DCHECK(success);
-
-  return aligned_rect;
-}
-
-void GLRendererCopier::StartReadbackFromTexture(
-    std::unique_ptr<CopyOutputRequest> request,
-    const gfx::Rect& result_rect,
-    const gfx::ColorSpace& color_space,
-    ReusableThings* things) {
-  DCHECK_EQ(request->result_format(), ResultFormat::RGBA);
-  DCHECK_EQ(request->result_destination(), ResultDestination::kSystemMemory);
-
-  auto* const gl = context_provider_->ContextGL();
-  if (things->readback_framebuffer == 0) {
-    gl->GenFramebuffers(1, &things->readback_framebuffer);
-  }
-  gl->BindFramebuffer(GL_FRAMEBUFFER, things->readback_framebuffer);
-  gl->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
-                           things->result_texture, 0);
-  StartReadbackFromFramebuffer(std::move(request), gfx::Vector2d(), false,
-                               ShouldSwapRedAndBlueForBitmapReadback(),
-                               result_rect, color_space);
-}
-
-namespace {
-
-// This is the type of CopyOutputResult we send for RGBA readback. The
-// constructor is called during on GLRendererCopier::FinishReadPixelsWorkflow(),
-// thus it always have access to the GLContext. The ReadRGBAPlane and destructor
-// are called asynchronously, and thus might not have access to the GLContext if
-// it has been destroyed in the meantime. We use the WeakPtr to the
-// GLRendererCopier as an indicator that the GLContext is still alive. If the
-// access to the GLContext is lost, we treat the copy output as failed.
-class GLPixelBufferRGBAResult final : public CopyOutputResult {
- public:
-  GLPixelBufferRGBAResult(const gfx::Rect& result_rect,
-                          const gfx::ColorSpace& color_space,
-                          base::WeakPtr<GLRendererCopier> copier_weak_ptr,
-                          ContextProvider* context_provider,
-                          GLuint transfer_buffer,
-                          bool is_upside_down,
-                          bool swap_red_and_blue)
-      : CopyOutputResult(CopyOutputResult::Format::RGBA,
-                         CopyOutputResult::Destination::kSystemMemory,
-                         result_rect,
-                         /*needs_lock_for_bitmap=*/false),
-        color_space_(color_space),
-        copier_weak_ptr_(std::move(copier_weak_ptr)),
-        context_provider_(std::move(context_provider)),
-        transfer_buffer_(transfer_buffer),
-        is_upside_down_(is_upside_down),
-        swap_red_and_blue_(swap_red_and_blue) {}
-
-  ~GLPixelBufferRGBAResult() final {
-    if (transfer_buffer_ && copier_weak_ptr_) {
-      context_provider_->ContextGL()->DeleteBuffers(1, &transfer_buffer_);
-    }
-  }
-
-  bool ReadRGBAPlane(uint8_t* dest, int stride) const final {
-    // If the GLRendererCopier is gone, this implies the display compositor
-    // which contains the GLContext is gone. Regard this copy output readback as
-    // failed.
-    if (!copier_weak_ptr_)
-      return false;
-
-    const int src_bytes_per_row = size().width() * kRGBABytesPerPixel;
-    DCHECK_GE(stride, src_bytes_per_row);
-
-    // No need to read from GPU memory if a cached bitmap already exists.
-    if (rect().IsEmpty() || cached_bitmap()->readyToDraw())
-      return CopyOutputResult::ReadRGBAPlane(dest, stride);
-
-    auto* const gl = context_provider_->ContextGL();
-    gl->BindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, transfer_buffer_);
-    const uint8_t* pixels = static_cast<uint8_t*>(gl->MapBufferCHROMIUM(
-        GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, GL_READ_ONLY));
-    if (pixels) {
-      if (is_upside_down_) {
-        dest += (size().height() - 1) * stride;
-        stride = -stride;
-      }
-      const uint8_t* src = pixels;
-      if (swap_red_and_blue_) {
-        for (int y = 0; y < size().height();
-             ++y, src += src_bytes_per_row, dest += stride) {
-          for (int x = 0; x < kRGBABytesPerPixel * size().width();
-               x += kRGBABytesPerPixel) {
-            dest[x + 2] = src[x + 0];
-            dest[x + 1] = src[x + 1];
-            dest[x + 0] = src[x + 2];
-            dest[x + 3] = src[x + 3];
-          }
-        }
-      } else {
-        libyuv::CopyPlane(src, src_bytes_per_row, dest, stride,
-                          src_bytes_per_row, size().height());
-      }
-      gl->UnmapBufferCHROMIUM(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM);
-    }
-    gl->BindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, 0);
-    return !!pixels;
-  }
-
-  gfx::ColorSpace GetRGBAColorSpace() const final { return color_space_; }
-
-  // This method is always called on the same sequence as the GLRendererCopier.
-  // This method will be inside Viz and has access to the WeakPtr of the
-  // GLRendererCopier to check whether we still have the access to an alive
-  // GLContext.
-  const SkBitmap& AsSkBitmap() const final {
-    if (rect().IsEmpty())
-      return *cached_bitmap();  // Return "null" bitmap for empty result.
-
-    if (cached_bitmap()->readyToDraw())
-      return *cached_bitmap();
-
-    if (!copier_weak_ptr_)
-      return *cached_bitmap();
-
-    SkBitmap result_bitmap;
-    // size() was clamped to render pass or framebuffer size. If we can't
-    // allocate it then OOM.
-    auto info = SkImageInfo::MakeN32Premul(
-        size().width(), size().height(), GetRGBAColorSpace().ToSkColorSpace());
-    if (!result_bitmap.tryAllocPixels(info, info.minRowBytes()))
-      base::TerminateBecauseOutOfMemory(info.computeMinByteSize());
-
-    ReadRGBAPlane(static_cast<uint8_t*>(result_bitmap.getPixels()),
-                  result_bitmap.rowBytes());
-    *cached_bitmap() = result_bitmap;
-    // Now that we have a cached bitmap, no need to read from GPU memory
-    // anymore.
-    context_provider_->ContextGL()->DeleteBuffers(1, &transfer_buffer_);
-    transfer_buffer_ = 0;
-
-    return *cached_bitmap();
-  }
-
- private:
-  const gfx::ColorSpace color_space_;
-  base::WeakPtr<GLRendererCopier> copier_weak_ptr_;
-  raw_ptr<ContextProvider> context_provider_;
-  mutable GLuint transfer_buffer_;
-  const bool is_upside_down_;
-  const bool swap_red_and_blue_;
-};
-}  // namespace
-
-GLRendererCopier::ReadPixelsWorkflow::ReadPixelsWorkflow(
-    std::unique_ptr<CopyOutputRequest> copy_request,
-    const gfx::Vector2d& readback_offset,
-    bool flipped_source,
-    bool swap_red_and_blue,
-    const gfx::Rect& result_rect,
-    const gfx::ColorSpace& color_space,
-    ContextProvider* context_provider,
-    GLenum readback_format)
-    : copy_request(std::move(copy_request)),
-      flipped_source(flipped_source),
-      swap_red_and_blue(swap_red_and_blue),
-      result_rect(result_rect),
-      color_space(color_space),
-      context_provider_(context_provider) {
-  DCHECK(readback_format == GL_RGBA || readback_format == GL_BGRA_EXT);
-  DCHECK(context_provider_);
-  auto* const gl = context_provider_->ContextGL();
-
-  // Create a buffer for the pixel transfer.
-  gl->GenBuffers(1, &transfer_buffer);
-  gl->BindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, transfer_buffer);
-  gl->BufferData(
-      GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM,
-      (result_rect.size().GetCheckedArea() * kRGBABytesPerPixel).ValueOrDie(),
-      nullptr, GL_STREAM_READ);
-
-  // Execute an asynchronous read-pixels operation, with a query that triggers
-  // when Finish() should be run.
-  gl->GenQueriesEXT(1, &query_);
-  gl->BeginQueryEXT(GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM, query_);
-  gl->ReadPixels(readback_offset.x(), readback_offset.y(), result_rect.width(),
-                 result_rect.height(), readback_format, GL_UNSIGNED_BYTE,
-                 nullptr);
-  gl->EndQueryEXT(GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM);
-  gl->BindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, 0);
-}
-
-GLRendererCopier::ReadPixelsWorkflow::~ReadPixelsWorkflow() {
-  auto* const gl = context_provider_->ContextGL();
-  gl->DeleteQueriesEXT(1, &query_);
-  if (transfer_buffer)
-    gl->DeleteBuffers(1, &transfer_buffer);
-}
-
-// Callback for the asynchronous glReadPixels(). The pixels are read from the
-// transfer buffer, and a CopyOutputResult is sent to the requestor. This would
-// mark this workflow as finished, and the workflow will be cleared later.
-void GLRendererCopier::FinishReadPixelsWorkflow(ReadPixelsWorkflow* workflow) {
-  auto result = std::make_unique<GLPixelBufferRGBAResult>(
-      workflow->result_rect, workflow->color_space, weak_factory_.GetWeakPtr(),
-      context_provider_, workflow->transfer_buffer, workflow->flipped_source,
-      workflow->swap_red_and_blue);
-  workflow->transfer_buffer = 0;  // Ownerhip was transferred to the result.
-  if (!workflow->copy_request->SendsResultsInCurrentSequence()) {
-    // Force readback into a SkBitmap now, because after PostTask we don't
-    // have access to |context_provider_|.
-    auto scoped_bitmap = result->ScopedAccessSkBitmap();
-    auto bitmap = scoped_bitmap.bitmap();
-  }
-  workflow->copy_request->SendResult(std::move(result));
-  const auto it =
-      std::find_if(read_pixels_workflows_.begin(), read_pixels_workflows_.end(),
-                   [workflow](auto& ptr) { return ptr.get() == workflow; });
-  DCHECK(it != read_pixels_workflows_.end());
-  read_pixels_workflows_.erase(it);
-}
-
-void GLRendererCopier::StartReadbackFromFramebuffer(
-    std::unique_ptr<CopyOutputRequest> request,
-    const gfx::Vector2d& readback_offset,
-    bool flipped_source,
-    bool swapped_red_and_blue,
-    const gfx::Rect& result_rect,
-    const gfx::ColorSpace& color_space) {
-  DCHECK_EQ(request->result_format(), ResultFormat::RGBA);
-  DCHECK_EQ(request->result_destination(), ResultDestination::kSystemMemory);
-
-  read_pixels_workflows_.emplace_back(std::make_unique<ReadPixelsWorkflow>(
-      std::move(request), readback_offset, flipped_source,
-      ShouldSwapRedAndBlueForBitmapReadback() != swapped_red_and_blue,
-      result_rect, color_space, context_provider_, GetOptimalReadbackFormat()));
-  context_provider_->ContextSupport()->SignalQuery(
-      read_pixels_workflows_.back()->query(),
-      base::BindOnce(&GLRendererCopier::FinishReadPixelsWorkflow,
-                     weak_factory_.GetWeakPtr(),
-                     read_pixels_workflows_.back().get()));
-}
-
-void GLRendererCopier::RenderAndSendTextureResult(
-    std::unique_ptr<CopyOutputRequest> request,
-    bool flipped_source,
-    const gfx::ColorSpace& source_color_space,
-    const gfx::ColorSpace& dest_color_space,
-    GLuint source_texture,
-    const gfx::Size& source_texture_size,
-    const gfx::Rect& sampling_rect,
-    const gfx::Rect& result_rect,
-    ReusableThings* things) {
-  DCHECK_EQ(request->result_format(), ResultFormat::RGBA);
-  DCHECK_EQ(request->result_destination(), ResultDestination::kNativeTextures);
-
-  auto* sii = context_provider_->SharedImageInterface();
-  gpu::Mailbox mailbox = sii->CreateSharedImage(
-      ResourceFormat::RGBA_8888, result_rect.size(), dest_color_space,
-      kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType,
-      gpu::SHARED_IMAGE_USAGE_GLES2, gpu::kNullSurfaceHandle);
-  auto* gl = context_provider_->ContextGL();
-  gl->WaitSyncTokenCHROMIUM(sii->GenUnverifiedSyncToken().GetConstData());
-  GLuint texture = gl->CreateAndTexStorage2DSharedImageCHROMIUM(mailbox.name);
-  gl->BeginSharedImageAccessDirectCHROMIUM(
-      texture, GL_SHARED_IMAGE_ACCESS_MODE_READWRITE_CHROMIUM);
-  RenderResultTexture(*request, flipped_source, source_color_space,
-                      dest_color_space, source_texture, source_texture_size,
-                      sampling_rect, result_rect, texture, things);
-  gl->EndSharedImageAccessDirectCHROMIUM(texture);
-  gl->DeleteTextures(1, &texture);
-  gpu::SyncToken sync_token;
-  gl->GenSyncTokenCHROMIUM(sync_token.GetData());
-
-  // Create a callback that deletes what was created in this GL context.
-  // Note: There's no need to try to pool/re-use the result texture from here,
-  // since only clients that are trying to re-invent video capture would see any
-  // significant performance benefit. Instead, such clients should use the video
-  // capture services provided by VIZ.
-  CopyOutputResult::ReleaseCallbacks release_callbacks;
-  release_callbacks.push_back(
-      texture_deleter_->GetReleaseCallback(context_provider_.get(), mailbox));
-
-  request->SendResult(std::make_unique<CopyOutputTextureResult>(
-      CopyOutputResult::Format::RGBA, result_rect,
-      CopyOutputResult::TextureResult(mailbox, sync_token, dest_color_space),
-      std::move(release_callbacks)));
-}
-
-namespace {
-
-// Specialization of CopyOutputResult which reads I420 plane data from a GL
-// pixel buffer object, and automatically deletes the pixel buffer object at
-// destruction time. This provides an optimal one-copy data flow, from the pixel
-// buffer into client-provided memory.
-class GLPixelBufferI420Result final : public CopyOutputResult {
- public:
-  // |aligned_rect| identifies the region of result pixels in the pixel buffer,
-  // while the |result_rect| is the subregion that is exposed to the client.
-  GLPixelBufferI420Result(const gfx::Rect& aligned_rect,
-                          const gfx::Rect& result_rect,
-                          base::WeakPtr<GLRendererCopier> copier_weak_ptr,
-                          ContextProvider* context_provider,
-                          GLuint transfer_buffer)
-      : CopyOutputResult(CopyOutputResult::Format::I420_PLANES,
-                         CopyOutputResult::Destination::kSystemMemory,
-                         result_rect,
-                         /*needs_lock_for_bitmap=*/false),
-        aligned_rect_(aligned_rect),
-        copier_weak_ptr_(copier_weak_ptr),
-        context_provider_(context_provider),
-        transfer_buffer_(transfer_buffer) {
-    auto* const gl = context_provider_->ContextGL();
-    gl->BindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, transfer_buffer_);
-    pixels_ = static_cast<uint8_t*>(gl->MapBufferCHROMIUM(
-        GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, GL_READ_ONLY));
-    gl->BindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, 0);
-  }
-
-  ~GLPixelBufferI420Result() final {
-    if (copier_weak_ptr_) {
-      auto* const gl = context_provider_->ContextGL();
-      gl->BindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, transfer_buffer_);
-      gl->UnmapBufferCHROMIUM(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM);
-      gl->BindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, 0);
-      gl->DeleteBuffers(1, &transfer_buffer_);
-    }
-  }
-
-  bool ReadI420Planes(uint8_t* y_out,
-                      int y_out_stride,
-                      uint8_t* u_out,
-                      int u_out_stride,
-                      uint8_t* v_out,
-                      int v_out_stride) const final {
-    DCHECK_GE(y_out_stride, size().width());
-    const int chroma_row_bytes = (size().width() + 1) / 2;
-
-    DCHECK_GE(u_out_stride, chroma_row_bytes);
-    DCHECK_GE(v_out_stride, chroma_row_bytes);
-    if (!copier_weak_ptr_)
-      return false;
-
-    uint8_t* pixels = pixels_;
-    if (pixels) {
-      const int y_stride = aligned_rect_.width();
-      const gfx::Vector2d result_offset =
-          rect().OffsetFromOrigin() - aligned_rect_.OffsetFromOrigin();
-      const int y_start_offset =
-          result_offset.y() * y_stride + result_offset.x();
-      libyuv::CopyPlane(pixels + y_start_offset, y_stride, y_out, y_out_stride,
-                        size().width(), size().height());
-      pixels += y_stride * aligned_rect_.height();
-      const int chroma_stride = aligned_rect_.width() / 2;
-      const int chroma_start_offset =
-          ((result_offset.y() / 2) * chroma_stride) + (result_offset.x() / 2);
-      const int chroma_height = (size().height() + 1) / 2;
-      libyuv::CopyPlane(pixels + chroma_start_offset, chroma_stride, u_out,
-                        u_out_stride, chroma_row_bytes, chroma_height);
-      pixels += chroma_stride * (aligned_rect_.height() / 2);
-      libyuv::CopyPlane(pixels + chroma_start_offset, chroma_stride, v_out,
-                        v_out_stride, chroma_row_bytes, chroma_height);
-    }
-    return !!pixels;
-  }
-
- private:
-  const gfx::Rect aligned_rect_;
-  base::WeakPtr<GLRendererCopier> copier_weak_ptr_;
-  const raw_ptr<ContextProvider> context_provider_;
-  const GLuint transfer_buffer_;
-  raw_ptr<uint8_t> pixels_;
-};
-
-// Specialization of CopyOutputResult which reads NV12 plane data from a GL
-// pixel buffer object, and automatically deletes the pixel buffer object at
-// destruction time. This provides an optimal one-copy data flow, from the pixel
-// buffer into client-provided memory.
-class GLPixelBufferNV12Result final : public CopyOutputResult {
- public:
-  // |aligned_rect| identifies the region of result pixels in the pixel buffer,
-  // while the |result_rect| is the subregion that is exposed to the client.
-  GLPixelBufferNV12Result(const gfx::Rect& aligned_rect,
-                          const gfx::Rect& result_rect,
-                          base::WeakPtr<GLRendererCopier> copier_weak_ptr,
-                          ContextProvider* context_provider,
-                          GLuint transfer_buffer)
-      : CopyOutputResult(CopyOutputResult::Format::NV12_PLANES,
-                         CopyOutputResult::Destination::kSystemMemory,
-                         result_rect,
-                         /*needs_lock_for_bitmap=*/false),
-        aligned_rect_(aligned_rect),
-        copier_weak_ptr_(copier_weak_ptr),
-        context_provider_(context_provider),
-        transfer_buffer_(transfer_buffer) {
-    auto* const gl = context_provider_->ContextGL();
-    gl->BindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, transfer_buffer_);
-    pixels_ = static_cast<uint8_t*>(gl->MapBufferCHROMIUM(
-        GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, GL_READ_ONLY));
-    gl->BindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, 0);
-  }
-
-  ~GLPixelBufferNV12Result() final {
-    if (copier_weak_ptr_) {
-      auto* const gl = context_provider_->ContextGL();
-      gl->BindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, transfer_buffer_);
-      gl->UnmapBufferCHROMIUM(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM);
-      gl->BindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, 0);
-      gl->DeleteBuffers(1, &transfer_buffer_);
-    }
-  }
-
-  bool ReadNV12Planes(uint8_t* y_out,
-                      int y_out_stride,
-                      uint8_t* uv_out,
-                      int uv_out_stride) const final {
-    DCHECK_GE(y_out_stride, size().width());
-    const int chroma_row_bytes = 2 * ((size().width() + 1) / 2);
-    DCHECK_GE(uv_out_stride, chroma_row_bytes);
-    if (!copier_weak_ptr_)
-      return false;
-
-    uint8_t* pixels = pixels_;
-
-    if (pixels) {
-      const int y_stride = aligned_rect_.width();
-      const gfx::Vector2d result_offset =
-          rect().OffsetFromOrigin() - aligned_rect_.OffsetFromOrigin();
-      const int y_start_offset =
-          result_offset.y() * y_stride + result_offset.x();
-      libyuv::CopyPlane(pixels + y_start_offset, y_stride, y_out, y_out_stride,
-                        size().width(), size().height());
-      pixels += y_stride * aligned_rect_.height();
-      const int chroma_stride = aligned_rect_.width();
-      const int chroma_start_offset =
-          ((result_offset.y() / 2) * chroma_stride) +
-          2 * (result_offset.x() / 2);
-      const int chroma_height = (size().height() + 1) / 2;
-      libyuv::CopyPlane(pixels + chroma_start_offset, chroma_stride, uv_out,
-                        uv_out_stride, chroma_row_bytes, chroma_height);
-    }
-    return !!pixels;
-  }
-
- private:
-  const gfx::Rect aligned_rect_;
-  base::WeakPtr<GLRendererCopier> copier_weak_ptr_;
-  const raw_ptr<ContextProvider> context_provider_;
-  const GLuint transfer_buffer_;
-  raw_ptr<uint8_t> pixels_ = nullptr;
-};
-
-}  // namespace
-
-GLRendererCopier::ReadI420PlanesWorkflow::ReadI420PlanesWorkflow(
-    std::unique_ptr<CopyOutputRequest> copy_request,
-    const gfx::Rect& aligned_rect,
-    const gfx::Rect& result_rect,
-    base::WeakPtr<GLRendererCopier> copier_weak_ptr,
-    ContextProvider* context_provider)
-    : copy_request(std::move(copy_request)),
-      aligned_rect(aligned_rect),
-      result_rect(result_rect),
-      copier_weak_ptr_(copier_weak_ptr),
-      context_provider_(context_provider) {
-  // Create a buffer for the pixel transfer: A single buffer is used and will
-  // contain the Y plane, then the U plane, then the V plane.
-  auto* const gl = context_provider_->ContextGL();
-  gl->GenBuffers(1, &transfer_buffer);
-  gl->BindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, transfer_buffer);
-  base::CheckedNumeric<int> y_plane_bytes =
-      y_texture_size().GetCheckedArea() * kRGBABytesPerPixel;
-  base::CheckedNumeric<int> chroma_plane_bytes =
-      chroma_texture_size().GetCheckedArea() * kRGBABytesPerPixel;
-  gl->BufferData(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM,
-                 (y_plane_bytes + chroma_plane_bytes * 2).ValueOrDie(), nullptr,
-                 GL_STREAM_READ);
-  data_offsets_ = {0, y_plane_bytes.ValueOrDie(),
-                   (y_plane_bytes + chroma_plane_bytes).ValueOrDie()};
-  gl->BindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, 0);
-
-  // Generate the three queries used for determining when each of the plane
-  // readbacks has completed.
-  gl->GenQueriesEXT(3, queries.data());
-}
-
-void GLRendererCopier::ReadI420PlanesWorkflow::BindTransferBuffer() {
-  DCHECK_NE(transfer_buffer, 0u);
-  context_provider_->ContextGL()->BindBuffer(
-      GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, transfer_buffer);
-}
-
-void GLRendererCopier::ReadI420PlanesWorkflow::StartPlaneReadback(
-    int plane,
-    GLenum readback_format) {
-  DCHECK_NE(queries[plane], 0u);
-  auto* const gl = context_provider_->ContextGL();
-  gl->BeginQueryEXT(GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM, queries[plane]);
-  const gfx::Size& size = plane == 0 ? y_texture_size() : chroma_texture_size();
-  // Note: While a PIXEL_PACK_BUFFER is bound, OpenGL interprets the last
-  // argument to ReadPixels() as a byte offset within the buffer instead of
-  // an actual pointer in system memory.
-  uint8_t* offset_in_buffer = GetOffsetPointer(data_offsets_[plane]);
-  gl->ReadPixels(0, 0, size.width(), size.height(), readback_format,
-                 GL_UNSIGNED_BYTE, offset_in_buffer);
-  gl->EndQueryEXT(GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM);
-  context_provider_->ContextSupport()->SignalQuery(
-      queries[plane],
-      base::BindOnce(&GLRendererCopier::FinishReadI420PlanesWorkflow,
-                     copier_weak_ptr_, this, plane));
-}
-
-void GLRendererCopier::ReadI420PlanesWorkflow::UnbindTransferBuffer() {
-  context_provider_->ContextGL()->BindBuffer(
-      GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, 0);
-}
-
-GLRendererCopier::ReadI420PlanesWorkflow::~ReadI420PlanesWorkflow() {
-  auto* const gl = context_provider_->ContextGL();
-  if (transfer_buffer != 0)
-    gl->DeleteBuffers(1, &transfer_buffer);
-  for (GLuint& query : queries) {
-    if (query != 0)
-      gl->DeleteQueriesEXT(1, &query);
-  }
-}
-
-gfx::Size GLRendererCopier::ReadI420PlanesWorkflow::y_texture_size() const {
-  return gfx::Size(aligned_rect.width() / kRGBABytesPerPixel,
-                   aligned_rect.height());
-}
-
-gfx::Size GLRendererCopier::ReadI420PlanesWorkflow::chroma_texture_size()
-    const {
-  return gfx::Size(aligned_rect.width() / kRGBABytesPerPixel / 2,
-                   aligned_rect.height() / 2);
-}
-
-GLRendererCopier::ReadNV12PlanesWorkflow::ReadNV12PlanesWorkflow(
-    std::unique_ptr<CopyOutputRequest> copy_request,
-    const gfx::Rect& aligned_rect,
-    const gfx::Rect& result_rect,
-    base::WeakPtr<GLRendererCopier> copier_weak_ptr,
-    ContextProvider* context_provider)
-    : copy_request_(std::move(copy_request)),
-      aligned_rect_(aligned_rect),
-      result_rect_(result_rect),
-      copier_weak_ptr_(copier_weak_ptr),
-      context_provider_(context_provider) {
-  // Create a buffer for the pixel transfer: A single buffer is used and will
-  // contain the Y plane, then the UV plane.
-  auto* const gl = context_provider_->ContextGL();
-  gl->GenBuffers(1, &transfer_buffer_);
-  gl->BindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, transfer_buffer_);
-  base::CheckedNumeric<int> y_plane_bytes =
-      y_texture_size().GetCheckedArea() * kRGBABytesPerPixel;
-  base::CheckedNumeric<int> chroma_plane_bytes =
-      chroma_texture_size().GetCheckedArea() * kRGBABytesPerPixel;
-  gl->BufferData(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM,
-                 (y_plane_bytes + chroma_plane_bytes).ValueOrDie(), nullptr,
-                 GL_STREAM_READ);
-  data_offsets_ = {0, y_plane_bytes.ValueOrDie()};
-  gl->BindBuffer(GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, 0);
-
-  // Generate the two queries used for determining when each of the plane
-  // readbacks has completed.
-  gl->GenQueriesEXT(2, queries_.data());
-}
-
-void GLRendererCopier::ReadNV12PlanesWorkflow::BindTransferBuffer() {
-  DCHECK_NE(transfer_buffer_, 0u);
-  context_provider_->ContextGL()->BindBuffer(
-      GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, transfer_buffer_);
-}
-
-void GLRendererCopier::ReadNV12PlanesWorkflow::StartPlaneReadback(
-    int plane,
-    GLenum readback_format) {
-  DCHECK_NE(queries_[plane], 0u);
-  auto* const gl = context_provider_->ContextGL();
-  gl->BeginQueryEXT(GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM, queries_[plane]);
-  const gfx::Size& size = plane == 0 ? y_texture_size() : chroma_texture_size();
-  // Note: While a PIXEL_PACK_BUFFER is bound, OpenGL interprets the last
-  // argument to ReadPixels() as a byte offset within the buffer instead of
-  // an actual pointer in system memory.
-  uint8_t* offset_in_buffer = GetOffsetPointer(data_offsets_[plane]);
-  gl->ReadPixels(0, 0, size.width(), size.height(), readback_format,
-                 GL_UNSIGNED_BYTE, offset_in_buffer);
-  gl->EndQueryEXT(GL_ASYNC_PIXEL_PACK_COMPLETED_CHROMIUM);
-  context_provider_->ContextSupport()->SignalQuery(
-      queries_[plane],
-      base::BindOnce(&GLRendererCopier::FinishReadNV12PlanesWorkflow,
-                     copier_weak_ptr_, this, plane));
-}
-
-void GLRendererCopier::ReadNV12PlanesWorkflow::UnbindTransferBuffer() {
-  context_provider_->ContextGL()->BindBuffer(
-      GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM, 0);
-}
-
-GLRendererCopier::ReadNV12PlanesWorkflow::~ReadNV12PlanesWorkflow() {
-  auto* const gl = context_provider_->ContextGL();
-  if (transfer_buffer_ != 0)
-    gl->DeleteBuffers(1, &transfer_buffer_);
-  for (GLuint& query : queries_) {
-    if (query != 0)
-      gl->DeleteQueriesEXT(1, &query);
-  }
-}
-
-gfx::Size GLRendererCopier::ReadNV12PlanesWorkflow::y_texture_size() const {
-  return gfx::Size(aligned_rect_.width() / kRGBABytesPerPixel,
-                   aligned_rect_.height());
-}
-
-gfx::Size GLRendererCopier::ReadNV12PlanesWorkflow::chroma_texture_size()
-    const {
-  return gfx::Size(aligned_rect_.width() / kRGBABytesPerPixel,
-                   aligned_rect_.height() / 2);
-}
-
-void GLRendererCopier::StartI420ReadbackFromTextures(
-    std::unique_ptr<CopyOutputRequest> request,
-    const gfx::Rect& aligned_rect,
-    const gfx::Rect& result_rect,
-    ReusableThings* things) {
-  DCHECK_EQ(request->result_format(), ResultFormat::I420_PLANES);
-
-  auto* const gl = context_provider_->ContextGL();
-  if (things->yuv_readback_framebuffers[0] == 0) {
-    gl->GenFramebuffers(3, things->yuv_readback_framebuffers.data());
-  } else if (things->yuv_readback_framebuffers[2] == 0) {
-    gl->GenFramebuffers(1, &things->yuv_readback_framebuffers[2]);
-  }
-
-  // Execute three asynchronous read-pixels operations, one for each plane. The
-  // CopyOutputRequest is passed to the ReadI420PlanesWorkflow, which will send
-  // the CopyOutputResult once all readback operations are complete.
-  read_i420_workflows_.emplace_back(std::make_unique<ReadI420PlanesWorkflow>(
-      std::move(request), aligned_rect, result_rect, weak_factory_.GetWeakPtr(),
-      context_provider_));
-  ReadI420PlanesWorkflow* workflow = read_i420_workflows_.back().get();
-  workflow->BindTransferBuffer();
-  for (int plane = 0; plane < 3; ++plane) {
-    gl->BindFramebuffer(GL_FRAMEBUFFER,
-                        things->yuv_readback_framebuffers[plane]);
-    gl->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
-                             GL_TEXTURE_2D, things->yuv_textures[plane], 0);
-    workflow->StartPlaneReadback(plane, GetOptimalReadbackFormat());
-  }
-  workflow->UnbindTransferBuffer();
-}
-
-void GLRendererCopier::FinishReadI420PlanesWorkflow(
-    ReadI420PlanesWorkflow* workflow,
-    int plane) {
-  context_provider_->ContextGL()->DeleteQueriesEXT(1,
-                                                   &workflow->queries[plane]);
-  workflow->queries[plane] = 0;
-
-  // If all three readbacks have completed, send the result.
-  if (workflow->queries == std::array<GLuint, 3>{{0, 0, 0}}) {
-    workflow->copy_request->SendResult(
-        std::make_unique<GLPixelBufferI420Result>(
-            workflow->aligned_rect, workflow->result_rect,
-            weak_factory_.GetWeakPtr(), context_provider_,
-            workflow->transfer_buffer));
-    workflow->transfer_buffer = 0;  // Ownership was transferred to the result.
-    const auto it =
-        std::find_if(read_i420_workflows_.begin(), read_i420_workflows_.end(),
-                     [workflow](auto& ptr) { return ptr.get() == workflow; });
-    DCHECK(it != read_i420_workflows_.end());
-    read_i420_workflows_.erase(it);
-  }
-}
-
-void GLRendererCopier::StartNV12ReadbackFromTextures(
-    std::unique_ptr<CopyOutputRequest> request,
-    const gfx::Rect& aligned_rect,
-    const gfx::Rect& result_rect,
-    ReusableThings* things) {
-  DCHECK_EQ(request->result_format(), ResultFormat::NV12_PLANES);
-
-  auto* const gl = context_provider_->ContextGL();
-  if (things->yuv_readback_framebuffers[0] == 0)
-    gl->GenFramebuffers(2, things->yuv_readback_framebuffers.data());
-
-  // Execute two asynchronous read-pixels operations, one for each plane. The
-  // CopyOutputRequest is passed to the ReadNV12PlanesWorkflow, which will send
-  // the CopyOutputResult once all readback operations are complete.
-  read_nv12_workflows_.push_back(std::make_unique<ReadNV12PlanesWorkflow>(
-      std::move(request), aligned_rect, result_rect, weak_factory_.GetWeakPtr(),
-      context_provider_));
-  ReadNV12PlanesWorkflow* workflow = read_nv12_workflows_.back().get();
-  workflow->BindTransferBuffer();
-  for (int plane = 0; plane < 2; ++plane) {
-    gl->BindFramebuffer(GL_FRAMEBUFFER,
-                        things->yuv_readback_framebuffers[plane]);
-    gl->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
-                             GL_TEXTURE_2D, things->yuv_textures[plane], 0);
-    workflow->StartPlaneReadback(plane, GetOptimalReadbackFormat());
-  }
-  workflow->UnbindTransferBuffer();
-}
-
-void GLRendererCopier::FinishReadNV12PlanesWorkflow(
-    ReadNV12PlanesWorkflow* workflow,
-    int plane) {
-  GLuint query = workflow->query(plane);
-  context_provider_->ContextGL()->DeleteQueriesEXT(1, &query);
-  workflow->MarkQueryCompleted(plane);
-
-  // If both readbacks have completed, send the result.
-  if (workflow->IsCompleted()) {
-    workflow->TakeRequest()->SendResult(
-        std::make_unique<GLPixelBufferNV12Result>(
-            workflow->aligned_rect(), workflow->result_rect(),
-            weak_factory_.GetWeakPtr(), context_provider_,
-            workflow->TakeTransferBuffer()));
-    const auto it =
-        std::find_if(read_nv12_workflows_.begin(), read_nv12_workflows_.end(),
-                     [workflow](auto& ptr) { return ptr.get() == workflow; });
-    DCHECK(it != read_nv12_workflows_.end());
-    read_nv12_workflows_.erase(it);
-  }
-}
-
-std::unique_ptr<GLRendererCopier::ReusableThings>
-GLRendererCopier::TakeReusableThingsOrCreate(
-    const base::UnguessableToken& requester) {
-  if (!requester.is_empty()) {
-    const auto it = cache_.find(requester);
-    if (it != cache_.end()) {
-      auto things = std::move(it->second);
-      cache_.erase(it);
-      return things;
-    }
-  }
-
-  return std::make_unique<ReusableThings>();
-}
-
-void GLRendererCopier::StashReusableThingsOrDelete(
-    const base::UnguessableToken& requester,
-    std::unique_ptr<ReusableThings> things) {
-  if (requester.is_empty()) {
-    things->Free(context_provider_->ContextGL());
-  } else {
-    things->purge_count_at_last_use = purge_counter_;
-    cache_[requester] = std::move(things);
-  }
-}
-
-GLenum GLRendererCopier::GetOptimalReadbackFormat() {
-  if (optimal_readback_format_ != GL_NONE)
-    return optimal_readback_format_;
-
-  // Preconditions: GetOptimalReadbackFormat() requires a valid context and a
-  // complete framebuffer set up. The latter must be guaranteed by all possible
-  // callers of this method.
-  auto* const gl = context_provider_->ContextGL();
-  if (gl->GetGraphicsResetStatusKHR() != GL_NO_ERROR)
-    return GL_RGBA;  // No context: Just return a sane default.
-  DCHECK(gl->CheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE);
-
-  // If the GL implementation internally uses the GL_BGRA_EXT+GL_UNSIGNED_BYTE
-  // format+type combination, then consider that the optimal readback
-  // format+type. Otherwise, use GL_RGBA+GL_UNSIGNED_BYTE, which all platforms
-  // must support, per the GLES 2.0 spec.
-  GLint type = 0;
-  GLint readback_format = 0;
-  gl->GetIntegerv(GL_IMPLEMENTATION_COLOR_READ_TYPE, &type);
-  if (type == GL_UNSIGNED_BYTE)
-    gl->GetIntegerv(GL_IMPLEMENTATION_COLOR_READ_FORMAT, &readback_format);
-  if (readback_format != GL_BGRA_EXT)
-    readback_format = GL_RGBA;
-
-  optimal_readback_format_ = static_cast<GLenum>(readback_format);
-  return optimal_readback_format_;
-}
-
-bool GLRendererCopier::ShouldSwapRedAndBlueForBitmapReadback() {
-  const bool skbitmap_is_bgra = (kN32_SkColorType == kBGRA_8888_SkColorType);
-  const bool readback_will_be_bgra =
-      (GetOptimalReadbackFormat() == GL_BGRA_EXT);
-  return skbitmap_is_bgra != readback_will_be_bgra;
-}
-
-GLRendererCopier::ReusableThings::ReusableThings() = default;
-
-GLRendererCopier::ReusableThings::~ReusableThings() {
-  // Ensure all resources were freed by this point. Resources aren't explicity
-  // freed here, in the destructor, because some require access to the GL
-  // context. See Free().
-  DCHECK_EQ(fb_copy_texture, 0u);
-  DCHECK(!scaler);
-  DCHECK_EQ(result_texture, 0u);
-  DCHECK_EQ(readback_framebuffer, 0u);
-  DCHECK(!i420_converter);
-  constexpr std::array<GLuint, 3> kAllZeros = {0, 0, 0};
-  DCHECK(yuv_textures == kAllZeros);
-  DCHECK(yuv_readback_framebuffers == kAllZeros);
-}
-
-void GLRendererCopier::ReusableThings::Free(gpu::gles2::GLES2Interface* gl) {
-  if (fb_copy_texture != 0) {
-    gl->DeleteTextures(1, &fb_copy_texture);
-    fb_copy_texture = 0;
-    fb_copy_texture_internal_format = static_cast<GLenum>(GL_NONE);
-    fb_copy_texture_size = gfx::Size();
-  }
-  scaler.reset();
-  if (result_texture != 0) {
-    gl->DeleteTextures(1, &result_texture);
-    result_texture = 0;
-    result_texture_size = gfx::Size();
-  }
-  if (readback_framebuffer != 0) {
-    gl->DeleteFramebuffers(1, &readback_framebuffer);
-    readback_framebuffer = 0;
-  }
-
-  i420_converter.reset();
-  nv12_converter.reset();
-
-  if (yuv_textures[0] != 0) {
-    // We have some cached textures, check if there's 2 or 3 & delete them:
-    int num_textures = yuv_textures[2] != 0 ? 3 : 2;
-    gl->DeleteTextures(num_textures, yuv_textures.data());
-    yuv_textures = {0, 0, 0};
-    texture_sizes = {};
-  }
-  if (yuv_readback_framebuffers[0] != 0) {
-    // We have some cached readback buffers, check if there's 2 or 3 & delete
-    // them:
-    int num_readback_buffers = yuv_readback_framebuffers[2] != 0 ? 3 : 2;
-    gl->DeleteFramebuffers(num_readback_buffers,
-                           yuv_readback_framebuffers.data());
-    yuv_readback_framebuffers = {0, 0, 0};
-  }
-}
-
-}  // namespace viz
diff --git a/components/viz/service/display/gl_renderer_copier.h b/components/viz/service/display/gl_renderer_copier.h
deleted file mode 100644
index e0952de3..0000000
--- a/components/viz/service/display/gl_renderer_copier.h
+++ /dev/null
@@ -1,485 +0,0 @@
-// Copyright 2017 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 COMPONENTS_VIZ_SERVICE_DISPLAY_GL_RENDERER_COPIER_H_
-#define COMPONENTS_VIZ_SERVICE_DISPLAY_GL_RENDERER_COPIER_H_
-
-#include <stdint.h>
-
-#include <array>
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include "base/callback.h"
-#include "base/containers/flat_map.h"
-#include "base/memory/raw_ptr.h"
-#include "base/memory/ref_counted.h"
-#include "base/task/task_runner.h"
-#include "base/unguessable_token.h"
-#include "components/viz/service/viz_service_export.h"
-#include "ui/gfx/color_space.h"
-#include "ui/gfx/geometry/rect.h"
-#include "ui/gfx/geometry/size.h"
-
-namespace gfx {
-class ColorSpace;
-class Rect;
-class Vector2d;
-}  // namespace gfx
-
-namespace gpu {
-namespace gles2 {
-class GLES2Interface;
-}
-}  // namespace gpu
-
-namespace viz {
-
-class ContextProvider;
-class CopyOutputRequest;
-class GLI420Converter;
-class GLNV12Converter;
-class GLScaler;
-class TextureDeleter;
-
-namespace copy_output {
-struct RenderPassGeometry;
-}  // namespace copy_output
-
-// Helper class for GLRenderer that executes CopyOutputRequests using GL, to
-// perform texture copies/transformations and read back bitmaps. Also manages
-// the caching of resources needed to ensure efficient video performance.
-//
-// GLRenderer calls CopyFromTextureOrFramebuffer() to execute a
-// CopyOutputRequest. GLRendererCopier will examine the request and determine
-// the minimal amount of work needed to satisfy all the requirements of the
-// request.
-//
-// In many cases, interim GL objects (textures, framebuffers, etc.) must be
-// created as part of a multi-step process. When considering video performance
-// (i.e., a series of CopyOutputRequests from the same "source"), these interim
-// objects must be cached to prevent a significant performance penalty on some
-// GPU/drivers. GLRendererCopier manages such a cache and automatically frees
-// the objects when it detects that a stream of CopyOutputRequests from a given
-// "source" has ended.
-class VIZ_SERVICE_EXPORT GLRendererCopier {
- public:
-  // Define types to avoid pulling in command buffer GL headers, which conflict
-  // the ui/gl/gl_bindings.h
-  using GLuint = unsigned int;
-  using GLenum = unsigned int;
-
-  // |context_provider| and |texture_deleter| must outlive this instance.
-  GLRendererCopier(ContextProvider* context_provider,
-                   TextureDeleter* texture_deleter);
-
-  GLRendererCopier(const GLRendererCopier&) = delete;
-  GLRendererCopier& operator=(const GLRendererCopier&) = delete;
-
-  ~GLRendererCopier();
-
-  // Executes the |request|, copying from the currently-bound framebuffer of the
-  // given |internal_format|. |output_rect| is the RenderPass's output Rect in
-  // draw space, and is used to translate and clip the result selection Rect in
-  // the request. |framebuffer_texture| and |framebuffer_texture_size| are
-  // optional, but desired for performance: If provided, the texture might be
-  // used as the source, to avoid having to make a copy of the framebuffer.
-  // |flipped_source| is true (common case) if the framebuffer content is
-  // vertically flipped (bottom-up row order). |framebuffer_color_space|
-  // specifies the color space of the pixels in the framebuffer.
-  //
-  // This implementation may change a wide variety of GL state, such as texture
-  // and framebuffer bindings, shader programs, and related attributes; and so
-  // the caller must not make any assumptions about the state of the GL context
-  // after this call.
-  void CopyFromTextureOrFramebuffer(
-      std::unique_ptr<CopyOutputRequest> request,
-      const copy_output::RenderPassGeometry& geometry,
-      GLenum internal_format,
-      GLuint framebuffer_texture,
-      const gfx::Size& framebuffer_texture_size,
-      bool flipped_source,
-      const gfx::ColorSpace& framebuffer_color_space);
-
-  // Checks whether cached resources should be freed because recent copy
-  // activity is no longer using them. This should be called after a frame has
-  // finished drawing (after all copy requests have been executed).
-  void FreeUnusedCachedResources();
-
- private:
-  friend class GLRendererCopierTest;
-
-  // The collection of resources that might be cached over multiple copy
-  // requests from the same source. While executing a CopyOutputRequest, this
-  // struct is also used to pass around intermediate objects between operations.
-  struct VIZ_SERVICE_EXPORT ReusableThings {
-    // This is used to determine whether these things aren't being used anymore.
-    uint32_t purge_count_at_last_use = 0;
-
-    // Texture containing a copy of the source framebuffer, if the source
-    // framebuffer cannot be used directly.
-    GLuint fb_copy_texture = 0;
-    GLenum fb_copy_texture_internal_format = static_cast<GLenum>(0 /*GL_NONE*/);
-    gfx::Size fb_copy_texture_size;
-
-    // RGBA requests: Scaling, and texture/framebuffer for readback.
-    std::unique_ptr<GLScaler> scaler;
-    GLuint result_texture = 0;
-    gfx::Size result_texture_size;
-    GLuint readback_framebuffer = 0;
-
-    // I420_PLANES & NV12_PLANES requests: I420, NV12 scaling and format
-    // conversion, and textures+framebuffers for readback.
-    std::unique_ptr<GLI420Converter> i420_converter;
-    std::unique_ptr<GLNV12Converter> nv12_converter;
-    std::array<GLuint, 3> yuv_textures = {0, 0, 0};
-    std::array<gfx::Size, 3> texture_sizes;
-    std::array<GLuint, 3> yuv_readback_framebuffers = {0, 0, 0};
-
-    ReusableThings();
-
-    ReusableThings(const ReusableThings&) = delete;
-    ReusableThings& operator=(const ReusableThings&) = delete;
-
-    ~ReusableThings();
-
-    // Frees all the GL objects and scalers. This is in-lieu of a ReusableThings
-    // destructor because a valid GL context is required to free some of the
-    // objects.
-    void Free(gpu::gles2::GLES2Interface* gl);
-  };
-
-  // Manages the execution of one asynchronous framebuffer readback and contains
-  // all the relevant state needed to complete a copy request. The constructor
-  // initiates the operation, and the destructor cleans up all the GL objects
-  // created for this workflow. This class is owned by the GLRendererCopier, and
-  // GLRendererCopier is responsible for deleting this either after the workflow
-  // is finished, or when the GLRendererCopier is being destroyed.
-  struct ReadPixelsWorkflow {
-   public:
-    // Saves all revelant state and initiates the GL asynchronous read-pixels
-    // workflow.
-    ReadPixelsWorkflow(std::unique_ptr<CopyOutputRequest> copy_request,
-                       const gfx::Vector2d& readback_offset,
-                       bool flipped_source,
-                       bool swap_red_and_blue,
-                       const gfx::Rect& result_rect,
-                       const gfx::ColorSpace& color_space,
-                       ContextProvider* context_provider,
-                       GLenum readback_format);
-    ReadPixelsWorkflow(const ReadPixelsWorkflow&) = delete;
-
-    // The destructor is by the GLRendererCopier, either called after the
-    // workflow is finished or when GLRendererCopier is being destoryed.
-    ~ReadPixelsWorkflow();
-
-    GLuint query() const { return query_; }
-
-    const std::unique_ptr<CopyOutputRequest> copy_request;
-    const bool flipped_source;
-    const bool swap_red_and_blue;
-    const gfx::Rect result_rect;
-    const gfx::ColorSpace color_space;
-    GLuint transfer_buffer = 0;
-
-   private:
-    const raw_ptr<ContextProvider> context_provider_;
-    GLuint query_ = 0;
-  };
-
-  // Renders a scaled/transformed copy of a source texture according to the
-  // |request| parameters and other source characteristics. |result_texture|
-  // must be allocated/sized by the caller. For RGBA requests with destination
-  // set to system memory, the image content will be rendered in top-down row
-  // order and maybe red-blue swapped, to support efficient readback later on.
-  // For RGBA requests with ResultDestination::kNativeTextures set, the image
-  // content is always rendered Y-flipped (bottom-up row order).
-  void RenderResultTexture(const CopyOutputRequest& request,
-                           bool flipped_source,
-                           const gfx::ColorSpace& source_color_space,
-                           const gfx::ColorSpace& dest_color_space,
-                           GLuint source_texture,
-                           const gfx::Size& source_texture_size,
-                           const gfx::Rect& sampling_rect,
-                           const gfx::Rect& result_rect,
-                           GLuint result_texture,
-                           ReusableThings* things);
-
-  // Like the ReadPixelsWorkflow, except for I420 planes readback. Because there
-  // are three separate glReadPixels operations that may complete in any order,
-  // a ReadI420PlanesWorkflow will receive notifications from three separate "GL
-  // query" callbacks. It is only after all three operations have completed that
-  // a fully-assembled CopyOutputResult can be sent.
-  //
-  // See class comments for GLI420Converter for an explanation of how
-  // planar data is packed into RGBA textures.
-  struct ReadI420PlanesWorkflow {
-   public:
-    ReadI420PlanesWorkflow(std::unique_ptr<CopyOutputRequest> copy_request,
-                           const gfx::Rect& aligned_rect,
-                           const gfx::Rect& result_rect,
-                           base::WeakPtr<GLRendererCopier> copier_weak_ptr,
-                           ContextProvider* context_provider);
-
-    void BindTransferBuffer();
-    void StartPlaneReadback(int plane, GLenum readback_format);
-    void UnbindTransferBuffer();
-
-    ~ReadI420PlanesWorkflow();
-
-    const std::unique_ptr<CopyOutputRequest> copy_request;
-    const gfx::Rect aligned_rect;
-    const gfx::Rect result_rect;
-    GLuint transfer_buffer;
-    std::array<GLuint, 3> queries;
-
-   private:
-    gfx::Size y_texture_size() const;
-    gfx::Size chroma_texture_size() const;
-
-    base::WeakPtr<GLRendererCopier> copier_weak_ptr_;
-    const raw_ptr<ContextProvider> context_provider_;
-    std::array<int, 3> data_offsets_;
-  };
-
-  // Like the ReadPixelsWorkflow, except for NV12 planes readback. Because there
-  // are two separate glReadPixels operations that may complete in any order,
-  // a ReadNV12PlanesWorkflow will receive notifications from two separate "GL
-  // query" callbacks. It is only after all two operations have completed that
-  // a fully-assembled CopyOutputResult can be sent.
-  //
-  // See class comments for GLNV12Converter for an explanation of how planar
-  // data is packed into RGBA textures.
-  class ReadNV12PlanesWorkflow {
-   public:
-    ReadNV12PlanesWorkflow(std::unique_ptr<CopyOutputRequest> copy_request,
-                           const gfx::Rect& aligned_rect,
-                           const gfx::Rect& result_rect,
-                           base::WeakPtr<GLRendererCopier> copier_weak_ptr,
-                           ContextProvider* context_provider);
-    ~ReadNV12PlanesWorkflow();
-
-    void BindTransferBuffer();
-    void StartPlaneReadback(int plane, GLenum readback_format);
-    void UnbindTransferBuffer();
-
-    gfx::Rect aligned_rect() const { return aligned_rect_; }
-
-    gfx::Rect result_rect() const { return result_rect_; }
-
-    std::unique_ptr<CopyOutputRequest> TakeRequest() {
-      DCHECK(copy_request_);
-
-      return std::move(copy_request_);
-    }
-
-    GLuint TakeTransferBuffer() {
-      DCHECK(transfer_buffer_);
-
-      GLuint result = transfer_buffer_;
-      transfer_buffer_ = 0;
-      return result;
-    }
-
-    // Returns true if the workflow has completed (i.e. readback requests for
-    // all planes have finished).
-    bool IsCompleted() const {
-      return queries_ == std::array<GLuint, 2>{{0, 0}};
-    }
-
-    GLuint query(int plane) { return queries_[plane]; }
-
-    // Marks that a readback has completed for a given plane.
-    void MarkQueryCompleted(int plane) { queries_[plane] = 0; }
-
-   private:
-    gfx::Size y_texture_size() const;
-    gfx::Size chroma_texture_size() const;
-
-    std::unique_ptr<CopyOutputRequest> copy_request_;
-    const gfx::Rect aligned_rect_;
-    const gfx::Rect result_rect_;
-    GLuint transfer_buffer_;
-    std::array<GLuint, 2> queries_;
-
-    base::WeakPtr<GLRendererCopier> copier_weak_ptr_;
-    const raw_ptr<ContextProvider> context_provider_;
-    std::array<int, 2> data_offsets_;
-  };
-
-  // Similar to RenderResultTexture(), except also transform the image into I420
-  // format (a popular video format). Three textures, representing each of the
-  // Y/U/V planes (as described in GLI420Converter), are populated and their GL
-  // references placed in |things|. The image content is always rendered in
-  // top-down row order and swizzled (if needed), to support efficient readback
-  // later on.
-  //
-  // For alignment reasons, sometimes a slightly larger result will be provided,
-  // and the return Rect will indicate the actual bounds that were rendered
-  // (|result_rect|'s coordinate system). See StartI420ReadbackFromTextures()
-  // for more details.
-  gfx::Rect RenderI420Textures(const CopyOutputRequest& request,
-                               bool flipped_source,
-                               const gfx::ColorSpace& source_color_space,
-                               GLuint source_texture,
-                               const gfx::Size& source_texture_size,
-                               const gfx::Rect& sampling_rect,
-                               const gfx::Rect& result_rect,
-                               ReusableThings* things);
-
-  // Similar to RenderResultTexture(), except also transform the image into NV12
-  // format (a popular video format). Two textures, representing each of the
-  // Y/UV planes (as described in GLNV12Converter), are populated and their GL
-  // references placed in |things|. The image content is always rendered in
-  // top-down row order and swizzled (if needed), to support efficient readback
-  // later on.
-  //
-  // For alignment reasons, sometimes a slightly larger result will be provided,
-  // and the return Rect will indicate the actual bounds that were rendered
-  // (|result_rect|'s coordinate system). See StartNV12ReadbackFromTextures()
-  // for more details.
-  gfx::Rect RenderNV12Textures(const CopyOutputRequest& request,
-                               bool flipped_source,
-                               const gfx::ColorSpace& source_color_space,
-                               GLuint source_texture,
-                               const gfx::Size& source_texture_size,
-                               const gfx::Rect& sampling_rect,
-                               const gfx::Rect& result_rect,
-                               ReusableThings* things);
-
-  // Binds the |things->result_texture| to a framebuffer and calls
-  // StartReadbackFromFramebuffer(). This is only for RGBA requests with
-  // destination set to kSystemMemory.
-  // Assumes the image content is in top-down row order (and is red-blue swapped
-  // iff RenderResultTexture() would have done that).
-  void StartReadbackFromTexture(std::unique_ptr<CopyOutputRequest> request,
-                                const gfx::Rect& result_rect,
-                                const gfx::ColorSpace& color_space,
-                                ReusableThings* things);
-
-  // Processes the next phase of the copy request by starting readback from the
-  // currently-bound framebuffer into a pixel transfer buffer. |readback_offset|
-  // is the origin of the readback rect within the framebuffer, with
-  // |result_rect| providing the size of the readback rect. |flipped_source| is
-  // true if the framebuffer content is in bottom-up row order, and
-  // |swapped_red_and_blue| specifies whether the red and blue channels have
-  // been swapped. This method kicks-off an asynchronous glReadPixels()
-  // workflow.
-  void StartReadbackFromFramebuffer(std::unique_ptr<CopyOutputRequest> request,
-                                    const gfx::Vector2d& readback_offset,
-                                    bool flipped_source,
-                                    bool swapped_red_and_blue,
-                                    const gfx::Rect& result_rect,
-                                    const gfx::ColorSpace& color_space);
-
-  // Renders a scaled/transformed copy of a source texture similarly to
-  // RenderResultTexture, but packages up the result in a mailbox and sends it
-  // as the result to the CopyOutputRequest.
-  void RenderAndSendTextureResult(std::unique_ptr<CopyOutputRequest> request,
-                                  bool flipped_source,
-                                  const gfx::ColorSpace& source_color_space,
-                                  const gfx::ColorSpace& dest_color_space,
-                                  GLuint source_texture,
-                                  const gfx::Size& source_texture_size,
-                                  const gfx::Rect& sampling_rect,
-                                  const gfx::Rect& result_rect,
-                                  ReusableThings* things);
-
-  // Like StartReadbackFromTexture(), except that this processes the three Y/U/V
-  // result textures in |things| by using three framebuffers and three
-  // asynchronous readback operations. A single pixel transfer buffer is used to
-  // hold the results of all three readbacks (i.e., each plane starts at a
-  // different offset in the transfer buffer).
-  //
-  // |aligned_rect| is the Rect returned from the RenderI420Textures() call, and
-  // is required so that the CopyOutputResult sent at the end of this workflow
-  // will access the correct region of pixels.
-  void StartI420ReadbackFromTextures(std::unique_ptr<CopyOutputRequest> request,
-                                     const gfx::Rect& aligned_rect,
-                                     const gfx::Rect& result_rect,
-                                     ReusableThings* things);
-
-  // Like StartReadbackFromTexture(), except that this processes the two Y/UV
-  // result textures in |things| by using two framebuffers and two asynchronous
-  // readback operations. A single pixel transfer buffer is used to hold the
-  // results of both readbacks (i.e., each plane starts at a different offset in
-  // the transfer buffer).
-  //
-  // |aligned_rect| is the Rect returned from the RenderNV12Textures() call, and
-  // is required so that the CopyOutputResult sent at the end of this workflow
-  // will access the correct region of pixels.
-  void StartNV12ReadbackFromTextures(std::unique_ptr<CopyOutputRequest> request,
-                                     const gfx::Rect& aligned_rect,
-                                     const gfx::Rect& result_rect,
-                                     ReusableThings* things);
-
-  // Retrieves a cached ReusableThings instance for the given CopyOutputRequest
-  // source, or creates a new instance.
-  std::unique_ptr<ReusableThings> TakeReusableThingsOrCreate(
-      const base::UnguessableToken& requester);
-
-  // If |requester| is a valid UnguessableToken, this stashes the given
-  // ReusableThings instance in the cache for use in future CopyOutputRequests
-  // from the same requester. Otherwise, |things| is freed.
-  void StashReusableThingsOrDelete(const base::UnguessableToken& requester,
-                                   std::unique_ptr<ReusableThings> things);
-
-  // Queries the GL implementation to determine which is the more performance-
-  // optimal supported readback format: GL_RGBA or GL_BGRA_EXT, and memoizes the
-  // result for all future calls.
-  //
-  // Precondition: The GL context has a complete, bound framebuffer ready for
-  // readback.
-  GLenum GetOptimalReadbackFormat();
-
-  // Returns true if the red and blue channels should be swapped within the GPU,
-  // where such an operation has negligible cost, so that later the red-blue
-  // swap does not need to happen on the CPU (non-negligible cost).
-  bool ShouldSwapRedAndBlueForBitmapReadback();
-
-  void FinishReadPixelsWorkflow(ReadPixelsWorkflow*);
-  void FinishReadI420PlanesWorkflow(ReadI420PlanesWorkflow*, int plane);
-  void FinishReadNV12PlanesWorkflow(ReadNV12PlanesWorkflow* workflow,
-                                    int plane);
-
-  // Injected dependencies.
-  const raw_ptr<ContextProvider> context_provider_;
-  const raw_ptr<TextureDeleter> texture_deleter_;
-
-  // This increments by one for every call to FreeUnusedCachedResources(). It
-  // is meant to determine when cached resources should be freed because they
-  // are unlikely to see further use.
-  uint32_t purge_counter_ = 0;
-
-  // A cache of resources recently used in the execution of a stream of copy
-  // requests from the same source. Since this reflects the number of active
-  // video captures, it is expected to almost always be zero or one entry in
-  // size.
-  base::flat_map<base::UnguessableToken, std::unique_ptr<ReusableThings>>
-      cache_;
-
-  // This specifies whether the GPU+driver combination executes readback more
-  // efficiently using GL_RGBA or GL_BGRA_EXT format. This starts out as
-  // GL_NONE, which means "unknown," and will be determined at the time the
-  // first readback request is made.
-  GLenum optimal_readback_format_ = static_cast<GLenum>(0 /*GL_NONE*/);
-
-  // Purge cache entries that have not been used after this many calls to
-  // FreeUnusedCachedResources(). The choice of 60 is arbitrary, but on most
-  // platforms means that a somewhat-to-fully active compositor will cause
-  // things to be auto-purged after approx. 1-2 seconds of not being used.
-  static constexpr int kKeepalivePeriod = 60;
-
-  std::vector<std::unique_ptr<ReadPixelsWorkflow>> read_pixels_workflows_;
-  std::vector<std::unique_ptr<ReadI420PlanesWorkflow>> read_i420_workflows_;
-  std::vector<std::unique_ptr<ReadNV12PlanesWorkflow>> read_nv12_workflows_;
-
-  // Weak ptr to this class.
-  base::WeakPtrFactory<GLRendererCopier> weak_factory_{this};
-};
-
-}  // namespace viz
-
-#endif  // COMPONENTS_VIZ_SERVICE_DISPLAY_GL_RENDERER_COPIER_H_
diff --git a/components/viz/service/display/gl_renderer_draw_cache.cc b/components/viz/service/display/gl_renderer_draw_cache.cc
deleted file mode 100644
index 887eec8..0000000
--- a/components/viz/service/display/gl_renderer_draw_cache.cc
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2012 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 "components/viz/service/display/gl_renderer_draw_cache.h"
-
-namespace viz {
-
-TexturedQuadDrawCache::TexturedQuadDrawCache() = default;
-
-TexturedQuadDrawCache::~TexturedQuadDrawCache() = default;
-
-}  // namespace viz
diff --git a/components/viz/service/display/gl_renderer_draw_cache.h b/components/viz/service/display/gl_renderer_draw_cache.h
deleted file mode 100644
index eb85528..0000000
--- a/components/viz/service/display/gl_renderer_draw_cache.h
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2012 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 COMPONENTS_VIZ_SERVICE_DISPLAY_GL_RENDERER_DRAW_CACHE_H_
-#define COMPONENTS_VIZ_SERVICE_DISPLAY_GL_RENDERER_DRAW_CACHE_H_
-
-#include <vector>
-
-#include "components/viz/common/resources/resource_id.h"
-#include "components/viz/service/display/program_binding.h"
-#include "third_party/skia/include/core/SkColor.h"
-#include "ui/gfx/geometry/mask_filter_info.h"
-
-namespace viz {
-
-// Collects 4 floats at a time for easy upload to GL.
-struct Float4 {
-  float data[4];
-};
-
-// Collects 16 floats at a time for easy upload to GL.
-struct Float16 {
-  float data[16];
-};
-
-// A cache for storing textured quads to be drawn.  Stores the minimum required
-// data to tell if two back to back draws only differ in their transform. Quads
-// that only differ by transform may be coalesced into a single draw call.
-struct TexturedQuadDrawCache {
-  TexturedQuadDrawCache();
-
-  TexturedQuadDrawCache(const TexturedQuadDrawCache&) = delete;
-  TexturedQuadDrawCache& operator=(const TexturedQuadDrawCache&) = delete;
-
-  ~TexturedQuadDrawCache();
-
-  bool is_empty = true;
-
-  // Values tracked to determine if textured quads may be coalesced.
-  ProgramKey program_key;
-  ResourceId resource_id = kInvalidResourceId;
-  bool needs_blending = false;
-  bool nearest_neighbor = false;
-  SkColor background_color = 0;
-  gfx::MaskFilterInfo mask_filter_info;
-
-  // A cache for the coalesced quad data.
-  std::vector<Float4> uv_xform_data;
-  std::vector<float> vertex_opacity_data;
-  std::vector<Float16> matrix_data;
-
-  // Don't batch if tex clamp rect is given.
-  Float4 tex_clamp_rect_data;
-
-  // Video frames need special white level adjustment.
-  bool is_video_frame = false;
-};
-
-}  // namespace viz
-
-#endif  // COMPONENTS_VIZ_SERVICE_DISPLAY_GL_RENDERER_DRAW_CACHE_H_
diff --git a/components/viz/service/display/layer_quad.cc b/components/viz/service/display/layer_quad.cc
deleted file mode 100644
index d7349d8..0000000
--- a/components/viz/service/display/layer_quad.cc
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright 2011 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 "components/viz/service/display/layer_quad.h"
-
-#include <stddef.h>
-
-#include "base/check.h"
-#include "ui/gfx/geometry/quad_f.h"
-
-namespace viz {
-
-LayerQuad::Edge::Edge(const gfx::PointF& p, const gfx::PointF& q) {
-  if (p == q) {
-    degenerate_ = true;
-    return;
-  }
-  degenerate_ = false;
-  gfx::Vector2dF tangent(p.y() - q.y(), q.x() - p.x());
-  float cross2 = p.x() * q.y() - q.x() * p.y();
-
-  set(tangent.x(), tangent.y(), cross2);
-  scale(1.0f / tangent.Length());
-}
-
-gfx::PointF LayerQuad::Edge::Intersect(const LayerQuad::Edge& e) const {
-  DCHECK(!degenerate());
-  DCHECK(!e.degenerate());
-
-  return gfx::PointF((y() * e.z() - e.y() * z()) / (x() * e.y() - e.x() * y()),
-                     (x() * e.z() - e.x() * z()) / (e.x() * y() - x() * e.y()));
-}
-
-LayerQuad::LayerQuad(const gfx::QuadF& quad) {
-  // Create edges.
-  left_ = Edge(quad.p4(), quad.p1());
-  right_ = Edge(quad.p2(), quad.p3());
-  top_ = Edge(quad.p1(), quad.p2());
-  bottom_ = Edge(quad.p3(), quad.p4());
-
-  float sign = quad.IsCounterClockwise() ? -1 : 1;
-  left_.scale(sign);
-  right_.scale(sign);
-  top_.scale(sign);
-  bottom_.scale(sign);
-}
-
-LayerQuad::LayerQuad(const Edge& left,
-                     const Edge& top,
-                     const Edge& right,
-                     const Edge& bottom)
-    : left_(left), top_(top), right_(right), bottom_(bottom) {}
-
-gfx::QuadF LayerQuad::ToQuadF() const {
-  size_t num_degenerate_edges = left_.degenerate() + right_.degenerate() +
-                                top_.degenerate() + bottom_.degenerate();
-  if (num_degenerate_edges > 1) {
-    return gfx::QuadF();
-  }
-
-  if (left_.degenerate()) {
-    return gfx::QuadF(top_.Intersect(bottom_), top_.Intersect(right_),
-                      right_.Intersect(bottom_), bottom_.Intersect(top_));
-  }
-  if (right_.degenerate()) {
-    return gfx::QuadF(left_.Intersect(top_), top_.Intersect(bottom_),
-                      bottom_.Intersect(top_), bottom_.Intersect(left_));
-  }
-  if (top_.degenerate()) {
-    return gfx::QuadF(left_.Intersect(right_), right_.Intersect(left_),
-                      right_.Intersect(bottom_), bottom_.Intersect(left_));
-  }
-  if (bottom_.degenerate()) {
-    return gfx::QuadF(left_.Intersect(top_), top_.Intersect(right_),
-                      right_.Intersect(left_), left_.Intersect(right_));
-  }
-  return gfx::QuadF(left_.Intersect(top_), top_.Intersect(right_),
-                    right_.Intersect(bottom_), bottom_.Intersect(left_));
-}
-
-void LayerQuad::ToFloatArray(float flattened[12]) const {
-  if (left_.degenerate()) {
-    flattened[0] = bottom_.x();
-    flattened[1] = bottom_.y();
-    flattened[2] = bottom_.z();
-  } else {
-    flattened[0] = left_.x();
-    flattened[1] = left_.y();
-    flattened[2] = left_.z();
-  }
-  if (top_.degenerate()) {
-    flattened[3] = left_.x();
-    flattened[4] = left_.y();
-    flattened[5] = left_.z();
-  } else {
-    flattened[3] = top_.x();
-    flattened[4] = top_.y();
-    flattened[5] = top_.z();
-  }
-  if (right_.degenerate()) {
-    flattened[6] = top_.x();
-    flattened[7] = top_.y();
-    flattened[8] = top_.z();
-  } else {
-    flattened[6] = right_.x();
-    flattened[7] = right_.y();
-    flattened[8] = right_.z();
-  }
-  if (bottom_.degenerate()) {
-    flattened[9] = right_.x();
-    flattened[10] = right_.y();
-    flattened[11] = right_.z();
-  } else {
-    flattened[9] = bottom_.x();
-    flattened[10] = bottom_.y();
-    flattened[11] = bottom_.z();
-  }
-}
-
-}  // namespace viz
diff --git a/components/viz/service/display/layer_quad.h b/components/viz/service/display/layer_quad.h
deleted file mode 100644
index e6cd61fa..0000000
--- a/components/viz/service/display/layer_quad.h
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright 2011 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 COMPONENTS_VIZ_SERVICE_DISPLAY_LAYER_QUAD_H_
-#define COMPONENTS_VIZ_SERVICE_DISPLAY_LAYER_QUAD_H_
-
-#include "components/viz/service/viz_service_export.h"
-#include "ui/gfx/geometry/point_f.h"
-
-namespace gfx {
-class QuadF;
-}
-
-namespace viz {
-
-constexpr float kAntiAliasingInflateDistance = 0.5f;
-
-class VIZ_SERVICE_EXPORT LayerQuad {
- public:
-  class VIZ_SERVICE_EXPORT Edge {
-   public:
-    Edge() : x_(0), y_(0), z_(0), degenerate_(false) {}
-    Edge(const gfx::PointF& p, const gfx::PointF& q);
-
-    float x() const { return x_; }
-    float y() const { return y_; }
-    float z() const { return z_; }
-
-    void set_x(float x) { x_ = x; }
-    void set_y(float y) { y_ = y; }
-    void set_z(float z) { z_ = z; }
-    void set(float x, float y, float z) {
-      x_ = x;
-      y_ = y;
-      z_ = z;
-    }
-
-    void move_x(float dx) { x_ += dx; }
-    void move_y(float dy) { y_ += dy; }
-    void move_z(float dz) { z_ += dz; }
-    void move(float dx, float dy, float dz) {
-      x_ += dx;
-      y_ += dy;
-      z_ += dz;
-    }
-
-    void scale_x(float sx) { x_ *= sx; }
-    void scale_y(float sy) { y_ *= sy; }
-    void scale_z(float sz) { z_ *= sz; }
-    void scale(float sx, float sy, float sz) {
-      x_ *= sx;
-      y_ *= sy;
-      z_ *= sz;
-    }
-    void scale(float s) { scale(s, s, s); }
-
-    bool degenerate() const { return degenerate_; }
-
-    gfx::PointF Intersect(const Edge& e) const;
-
-   private:
-    float x_;
-    float y_;
-    float z_;
-    bool degenerate_;
-  };
-
-  LayerQuad(const Edge& left,
-            const Edge& top,
-            const Edge& right,
-            const Edge& bottom);
-  explicit LayerQuad(const gfx::QuadF& quad);
-
-  LayerQuad(const LayerQuad&) = delete;
-  LayerQuad& operator=(const LayerQuad&) = delete;
-
-  Edge left() const { return left_; }
-  Edge top() const { return top_; }
-  Edge right() const { return right_; }
-  Edge bottom() const { return bottom_; }
-
-  void InflateX(float dx) {
-    left_.move_z(dx);
-    right_.move_z(dx);
-  }
-  void InflateY(float dy) {
-    top_.move_z(dy);
-    bottom_.move_z(dy);
-  }
-  void Inflate(float d) {
-    InflateX(d);
-    InflateY(d);
-  }
-  void InflateAntiAliasingDistance() { Inflate(kAntiAliasingInflateDistance); }
-
-  gfx::QuadF ToQuadF() const;
-
-  void ToFloatArray(float flattened[12]) const;
-
- private:
-  Edge left_;
-  Edge top_;
-  Edge right_;
-  Edge bottom_;
-};
-
-}  // namespace viz
-
-#endif  // COMPONENTS_VIZ_SERVICE_DISPLAY_LAYER_QUAD_H_
diff --git a/components/viz/service/display/layer_quad_unittest.cc b/components/viz/service/display/layer_quad_unittest.cc
deleted file mode 100644
index 6de10f5..0000000
--- a/components/viz/service/display/layer_quad_unittest.cc
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2011 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 "components/viz/service/display/layer_quad.h"
-
-#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/gfx/geometry/quad_f.h"
-
-namespace viz {
-namespace {
-
-TEST(LayerQuadTest, QuadFConversion) {
-  gfx::PointF p1(-0.5f, -0.5f);
-  gfx::PointF p2(0.5f, -0.5f);
-  gfx::PointF p3(0.5f, 0.5f);
-  gfx::PointF p4(-0.5f, 0.5f);
-
-  gfx::QuadF quad_cw(p1, p2, p3, p4);
-  LayerQuad layer_quad_cw(quad_cw);
-  EXPECT_EQ(layer_quad_cw.ToQuadF(), quad_cw);
-
-  gfx::QuadF quad_ccw(p1, p4, p3, p2);
-  LayerQuad layer_quad_ccw(quad_ccw);
-  EXPECT_EQ(layer_quad_ccw.ToQuadF(), quad_ccw);
-}
-
-TEST(LayerQuadTest, Inflate) {
-  gfx::PointF p1(-0.5f, -0.5f);
-  gfx::PointF p2(0.5f, -0.5f);
-  gfx::PointF p3(0.5f, 0.5f);
-  gfx::PointF p4(-0.5f, 0.5f);
-
-  gfx::QuadF quad(p1, p2, p3, p4);
-  LayerQuad layer_quad(quad);
-  quad.Scale(2.f, 2.f);
-  layer_quad.Inflate(0.5f);
-  EXPECT_EQ(layer_quad.ToQuadF(), quad);
-}
-
-TEST(LayerQuadTest, Degenerate) {
-  gfx::QuadF quad;
-  gfx::PointF p1(1.0f, 1.0f);
-  gfx::PointF p2(0.0f, 1.0f);
-  gfx::PointF p3(1.0f, 0.0f);
-  gfx::QuadF triangle(p1, p2, p3, p1);
-
-  LayerQuad::Edge e1d(p1, p1);
-  LayerQuad::Edge e2d(p2, p2);
-  LayerQuad::Edge e2(p1, p2);
-  LayerQuad::Edge e3(p2, p3);
-  LayerQuad::Edge e4(p3, p1);
-  EXPECT_TRUE(e1d.degenerate());
-  EXPECT_TRUE(e2d.degenerate());
-  EXPECT_FALSE(e2.degenerate());
-  EXPECT_FALSE(e3.degenerate());
-  EXPECT_FALSE(e4.degenerate());
-
-  LayerQuad degenerate_quad(e1d, e2d, e2, e3);
-  // With more than one degenerate edge, we expect the quad to be zero.
-  EXPECT_EQ(quad, degenerate_quad.ToQuadF());
-
-  LayerQuad triangle_quad(e1d, e2, e3, e4);
-  // With only one degenerate edge, we expect the quad to be a triangle.
-  EXPECT_EQ(triangle, triangle_quad.ToQuadF());
-}
-
-}  // namespace
-}  // namespace viz
diff --git a/components/viz/service/display/program_binding.cc b/components/viz/service/display/program_binding.cc
deleted file mode 100644
index 488151c..0000000
--- a/components/viz/service/display/program_binding.cc
+++ /dev/null
@@ -1,301 +0,0 @@
-// Copyright 2011 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 "components/viz/service/display/program_binding.h"
-
-#include "base/logging.h"
-#include "base/trace_event/trace_event.h"
-#include "components/viz/service/display/geometry_binding.h"
-#include "gpu/GLES2/gl2extchromium.h"
-#include "gpu/command_buffer/client/gles2_interface.h"
-#include "ui/gfx/color_transform.h"
-
-using gpu::gles2::GLES2Interface;
-
-namespace viz {
-
-ProgramKey::ProgramKey() = default;
-
-ProgramKey::ProgramKey(const ProgramKey& other) = default;
-
-ProgramKey::~ProgramKey() = default;
-
-bool ProgramKey::operator==(const ProgramKey& other) const {
-  return type_ == other.type_ && precision_ == other.precision_ &&
-         sampler_ == other.sampler_ && blend_mode_ == other.blend_mode_ &&
-         aa_mode_ == other.aa_mode_ && is_opaque_ == other.is_opaque_ &&
-         premultiplied_alpha_ == other.premultiplied_alpha_ &&
-         has_background_color_ == other.has_background_color_ &&
-         has_tex_clamp_rect_ == other.has_tex_clamp_rect_ &&
-         mask_mode_ == other.mask_mode_ &&
-         mask_for_background_ == other.mask_for_background_ &&
-         has_color_matrix_ == other.has_color_matrix_ &&
-         yuv_alpha_texture_mode_ == other.yuv_alpha_texture_mode_ &&
-         uv_texture_mode_ == other.uv_texture_mode_ &&
-         color_conversion_mode_ == other.color_conversion_mode_ &&
-         color_transform_ == other.color_transform_ &&
-         has_output_color_matrix_ == other.has_output_color_matrix_ &&
-         has_rounded_corner_ == other.has_rounded_corner_;
-}
-
-bool ProgramKey::operator!=(const ProgramKey& other) const {
-  return !(*this == other);
-}
-
-// static
-ProgramKey ProgramKey::DebugBorder() {
-  ProgramKey result;
-  result.type_ = PROGRAM_TYPE_DEBUG_BORDER;
-  return result;
-}
-
-// static
-ProgramKey ProgramKey::SolidColor(AAMode aa_mode,
-                                  bool tint_color,
-                                  bool rounded_corner) {
-  ProgramKey result;
-  result.type_ = PROGRAM_TYPE_SOLID_COLOR;
-  result.aa_mode_ = aa_mode;
-  result.has_tint_color_matrix_ = tint_color;
-  result.has_rounded_corner_ = rounded_corner;
-  return result;
-}
-
-// static
-ProgramKey ProgramKey::Tile(TexCoordPrecision precision,
-                            SamplerType sampler,
-                            AAMode aa_mode,
-                            PremultipliedAlphaMode premultiplied_alpha,
-                            bool is_opaque,
-                            bool has_tex_clamp_rect,
-                            bool tint_color,
-                            bool rounded_corner) {
-  ProgramKey result;
-  result.type_ = PROGRAM_TYPE_TILE;
-  result.precision_ = precision;
-  result.sampler_ = sampler;
-  result.aa_mode_ = aa_mode;
-  result.is_opaque_ = is_opaque;
-  result.has_tex_clamp_rect_ = has_tex_clamp_rect;
-  result.has_tint_color_matrix_ = tint_color;
-  result.premultiplied_alpha_ = premultiplied_alpha;
-  result.has_rounded_corner_ = rounded_corner;
-  return result;
-}
-
-// static
-ProgramKey ProgramKey::Texture(TexCoordPrecision precision,
-                               SamplerType sampler,
-                               PremultipliedAlphaMode premultiplied_alpha,
-                               bool has_background_color,
-                               bool has_tex_clamp_rect,
-                               bool tint_color,
-                               bool rounded_corner) {
-  ProgramKey result;
-  result.type_ = PROGRAM_TYPE_TEXTURE;
-  result.precision_ = precision;
-  result.sampler_ = sampler;
-  result.premultiplied_alpha_ = premultiplied_alpha;
-  result.has_background_color_ = has_background_color;
-  result.has_tex_clamp_rect_ = has_tex_clamp_rect;
-  result.has_tint_color_matrix_ = tint_color;
-  result.has_rounded_corner_ = rounded_corner;
-  return result;
-}
-
-// static
-ProgramKey ProgramKey::RenderPass(TexCoordPrecision precision,
-                                  SamplerType sampler,
-                                  BlendMode blend_mode,
-                                  AAMode aa_mode,
-                                  MaskMode mask_mode,
-                                  bool mask_for_background,
-                                  bool has_color_matrix,
-                                  bool tint_color,
-                                  bool rounded_corner) {
-  ProgramKey result;
-  result.type_ = PROGRAM_TYPE_RENDER_PASS;
-  result.precision_ = precision;
-  result.sampler_ = sampler;
-  result.blend_mode_ = blend_mode;
-  result.aa_mode_ = aa_mode;
-  result.mask_mode_ = mask_mode;
-  result.mask_for_background_ = mask_for_background;
-  result.has_color_matrix_ = has_color_matrix;
-  result.has_tint_color_matrix_ = tint_color;
-  result.has_rounded_corner_ = rounded_corner;
-  return result;
-}
-
-// static
-ProgramKey ProgramKey::VideoStream(TexCoordPrecision precision,
-                                   bool rounded_corner) {
-  ProgramKey result;
-  result.type_ = PROGRAM_TYPE_VIDEO_STREAM;
-  result.precision_ = precision;
-  result.sampler_ = SAMPLER_TYPE_EXTERNAL_OES;
-  result.has_rounded_corner_ = rounded_corner;
-  return result;
-}
-
-// static
-ProgramKey ProgramKey::YUVVideo(TexCoordPrecision precision,
-                                SamplerType sampler,
-                                YUVAlphaTextureMode yuv_alpha_texture_mode,
-                                UVTextureMode uv_texture_mode,
-                                bool tint_color,
-                                bool rounded_corner) {
-  ProgramKey result;
-  result.type_ = PROGRAM_TYPE_YUV_VIDEO;
-  result.precision_ = precision;
-  result.sampler_ = sampler;
-  result.yuv_alpha_texture_mode_ = yuv_alpha_texture_mode;
-  DCHECK(yuv_alpha_texture_mode == YUV_NO_ALPHA_TEXTURE ||
-         yuv_alpha_texture_mode == YUV_HAS_ALPHA_TEXTURE);
-  result.uv_texture_mode_ = uv_texture_mode;
-  DCHECK(uv_texture_mode == UV_TEXTURE_MODE_UV ||
-         uv_texture_mode == UV_TEXTURE_MODE_U_V);
-  result.has_tint_color_matrix_ = tint_color;
-  result.has_rounded_corner_ = rounded_corner;
-  return result;
-}
-
-void ProgramKey::SetColorTransform(const gfx::ColorTransform* transform) {
-  color_transform_ = nullptr;
-  if (transform->IsIdentity()) {
-    color_conversion_mode_ = COLOR_CONVERSION_MODE_NONE;
-  } else {
-    color_conversion_mode_ = COLOR_CONVERSION_MODE_SHADER;
-    color_transform_ = transform;
-  }
-}
-
-ProgramBindingBase::ProgramBindingBase()
-    : program_(0),
-      vertex_shader_id_(0),
-      fragment_shader_id_(0),
-      initialized_(false) {}
-
-ProgramBindingBase::~ProgramBindingBase() {
-  // If you hit these asserts, you initialized but forgot to call Cleanup().
-  DCHECK(!program_);
-  DCHECK(!vertex_shader_id_);
-  DCHECK(!fragment_shader_id_);
-  DCHECK(!initialized_);
-}
-
-bool ProgramBindingBase::Init(GLES2Interface* context,
-                              const std::string& vertex_shader,
-                              const std::string& fragment_shader) {
-  TRACE_EVENT0("viz", "ProgramBindingBase::init");
-  vertex_shader_id_ = LoadShader(context, GL_VERTEX_SHADER, vertex_shader);
-  if (!vertex_shader_id_)
-    return false;
-
-  fragment_shader_id_ =
-      LoadShader(context, GL_FRAGMENT_SHADER, fragment_shader);
-  if (!fragment_shader_id_) {
-    context->DeleteShader(vertex_shader_id_);
-    vertex_shader_id_ = 0;
-    return false;
-  }
-
-  program_ =
-      CreateShaderProgram(context, vertex_shader_id_, fragment_shader_id_);
-  return !!program_;
-}
-
-bool ProgramBindingBase::Link(GLES2Interface* context) {
-  context->LinkProgram(program_);
-  CleanupShaders(context);
-  if (!program_)
-    return false;
-#ifndef NDEBUG
-  int linked = 0;
-  context->GetProgramiv(program_, GL_LINK_STATUS, &linked);
-  if (!linked) {
-    char buffer[1024] = "";
-    context->GetProgramInfoLog(program_, sizeof(buffer), nullptr, buffer);
-    DLOG(ERROR) << "Error compiling shader: " << buffer;
-    return false;
-  }
-#endif
-  return true;
-}
-
-void ProgramBindingBase::Cleanup(GLES2Interface* context) {
-  initialized_ = false;
-  if (!program_)
-    return;
-
-  DCHECK(context);
-  context->DeleteProgram(program_);
-  program_ = 0;
-
-  CleanupShaders(context);
-}
-
-unsigned ProgramBindingBase::LoadShader(GLES2Interface* context,
-                                        unsigned type,
-                                        const std::string& shader_source) {
-  unsigned shader = context->CreateShader(type);
-  if (!shader)
-    return 0u;
-
-  const char* shader_source_str[] = {shader_source.data()};
-  int shader_length[] = {static_cast<int>(shader_source.length())};
-  context->ShaderSource(shader, 1, shader_source_str, shader_length);
-  context->CompileShader(shader);
-#if EXPENSIVE_DCHECKS_ARE_ON()
-  int compiled = 0;
-  context->GetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
-  if (!compiled) {
-    char buffer[1024] = "";
-    context->GetShaderInfoLog(shader, sizeof(buffer), nullptr, buffer);
-    DLOG(ERROR) << "Error compiling shader: " << buffer
-                << "\n shader program: " << shader_source;
-    return 0u;
-  }
-#endif  // EXPENSIVE_DCHECKS_ARE_ON()
-  return shader;
-}
-
-unsigned ProgramBindingBase::CreateShaderProgram(GLES2Interface* context,
-                                                 unsigned vertex_shader,
-                                                 unsigned fragment_shader) {
-  unsigned program_object = context->CreateProgram();
-  if (!program_object)
-    return 0;
-
-  context->AttachShader(program_object, vertex_shader);
-  context->AttachShader(program_object, fragment_shader);
-
-  // Bind the common attrib locations.
-  context->BindAttribLocation(
-      program_object, GeometryBinding::PositionAttribLocation(), "a_position");
-  context->BindAttribLocation(
-      program_object, GeometryBinding::TexCoordAttribLocation(), "a_texCoord");
-  context->BindAttribLocation(program_object,
-                              GeometryBinding::TriangleIndexAttribLocation(),
-                              "a_index");
-
-  return program_object;
-}
-
-void ProgramBindingBase::CleanupShaders(GLES2Interface* context) {
-  if (vertex_shader_id_) {
-    context->DeleteShader(vertex_shader_id_);
-    vertex_shader_id_ = 0;
-  }
-  if (fragment_shader_id_) {
-    context->DeleteShader(fragment_shader_id_);
-    fragment_shader_id_ = 0;
-  }
-}
-
-bool ProgramBindingBase::IsContextLost(GLES2Interface* context) {
-  return context->GetGraphicsResetStatusKHR() != GL_NO_ERROR;
-}
-
-}  // namespace viz
diff --git a/components/viz/service/display/program_binding.h b/components/viz/service/display/program_binding.h
deleted file mode 100644
index b03673f..0000000
--- a/components/viz/service/display/program_binding.h
+++ /dev/null
@@ -1,480 +0,0 @@
-// Copyright 2011 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 COMPONENTS_VIZ_SERVICE_DISPLAY_PROGRAM_BINDING_H_
-#define COMPONENTS_VIZ_SERVICE_DISPLAY_PROGRAM_BINDING_H_
-
-#include <string>
-
-#include "base/check_op.h"
-#include "base/memory/raw_ptr.h"
-#include "build/build_config.h"
-#include "components/viz/common/gpu/context_provider.h"
-#include "components/viz/service/display/shader.h"
-#include "components/viz/service/viz_service_export.h"
-
-namespace gfx {
-class ColorTransform;
-}
-
-namespace gpu {
-namespace gles2 {
-class GLES2Interface;
-}
-}  // namespace gpu
-
-namespace viz {
-
-class VIZ_SERVICE_EXPORT ProgramBindingBase {
- public:
-  ProgramBindingBase();
-
-  ProgramBindingBase(const ProgramBindingBase&) = delete;
-  ProgramBindingBase& operator=(const ProgramBindingBase&) = delete;
-
-  ~ProgramBindingBase();
-
-  bool Init(gpu::gles2::GLES2Interface* context,
-            const std::string& vertex_shader,
-            const std::string& fragment_shader);
-  bool Link(gpu::gles2::GLES2Interface* context);
-  void Cleanup(gpu::gles2::GLES2Interface* context);
-
-  unsigned program() const { return program_; }
-  bool initialized() const { return initialized_; }
-
- protected:
-  unsigned LoadShader(gpu::gles2::GLES2Interface* context,
-                      unsigned type,
-                      const std::string& shader_source);
-  unsigned CreateShaderProgram(gpu::gles2::GLES2Interface* context,
-                               unsigned vertex_shader,
-                               unsigned fragment_shader);
-  void CleanupShaders(gpu::gles2::GLES2Interface* context);
-
-  bool IsContextLost(gpu::gles2::GLES2Interface* context);
-
-  unsigned program_;
-  unsigned vertex_shader_id_;
-  unsigned fragment_shader_id_;
-  bool initialized_;
-};
-
-enum ProgramType {
-  PROGRAM_TYPE_DEBUG_BORDER,
-  PROGRAM_TYPE_SOLID_COLOR,
-  PROGRAM_TYPE_TILE,
-  PROGRAM_TYPE_TEXTURE,
-  PROGRAM_TYPE_RENDER_PASS,
-  PROGRAM_TYPE_VIDEO_STREAM,
-  PROGRAM_TYPE_YUV_VIDEO,
-};
-
-class VIZ_SERVICE_EXPORT ProgramKey {
- public:
-  ProgramKey();
-  ProgramKey(const ProgramKey& other);
-  ~ProgramKey();
-
-  static ProgramKey DebugBorder();
-  static ProgramKey SolidColor(AAMode aa_mode,
-                               bool tint_color,
-                               bool rounded_corner);
-  static ProgramKey Tile(TexCoordPrecision precision,
-                         SamplerType sampler,
-                         AAMode aa_mode,
-                         PremultipliedAlphaMode premultiplied_alpha,
-                         bool is_opaque,
-                         bool has_tex_clamp_rect,
-                         bool tint_color,
-                         bool rounded_corner);
-  static ProgramKey Texture(TexCoordPrecision precision,
-                            SamplerType sampler,
-                            PremultipliedAlphaMode premultiplied_alpha,
-                            bool has_background_color,
-                            bool has_tex_clamp_rect,
-                            bool tint_color,
-                            bool rounded_corner);
-
-  // TODO(ccameron): Merge |mask_for_background| into MaskMode.
-  static ProgramKey RenderPass(TexCoordPrecision precision,
-                               SamplerType sampler,
-                               BlendMode blend_mode,
-                               AAMode aa_mode,
-                               MaskMode mask_mode,
-                               bool mask_for_background,
-                               bool has_color_matrix,
-                               bool tint_color,
-                               bool rounded_corner);
-  static ProgramKey VideoStream(TexCoordPrecision precision,
-                                bool rounded_corner);
-  static ProgramKey YUVVideo(TexCoordPrecision precision,
-                             SamplerType sampler,
-                             YUVAlphaTextureMode yuv_alpha_texture_mode,
-                             UVTextureMode uv_texture_mode,
-                             bool tint_color,
-                             bool rounded_corner);
-
-  bool operator==(const ProgramKey& other) const;
-  bool operator!=(const ProgramKey& other) const;
-
-  void SetColorTransform(const gfx::ColorTransform* transform);
-
-  bool has_output_color_matrix() const { return has_output_color_matrix_; }
-  void set_has_output_color_matrix(bool value) {
-    has_output_color_matrix_ = value;
-  }
-  TexCoordPrecision tex_coord_precision() const { return precision_; }
-
-  ProgramType type() const { return type_; }
-
- private:
-  friend struct ProgramKeyHash;
-  friend class Program;
-
-  ProgramType type_ = PROGRAM_TYPE_DEBUG_BORDER;
-  TexCoordPrecision precision_ = TEX_COORD_PRECISION_NA;
-  SamplerType sampler_ = SAMPLER_TYPE_NA;
-  BlendMode blend_mode_ = BLEND_MODE_NONE;
-  AAMode aa_mode_ = NO_AA;
-  bool is_opaque_ = false;
-
-  PremultipliedAlphaMode premultiplied_alpha_ = PREMULTIPLIED_ALPHA;
-  bool has_background_color_ = false;
-
-  MaskMode mask_mode_ = NO_MASK;
-  bool mask_for_background_ = false;
-  bool has_color_matrix_ = false;
-
-  YUVAlphaTextureMode yuv_alpha_texture_mode_ = YUV_NO_ALPHA_TEXTURE;
-  UVTextureMode uv_texture_mode_ = UV_TEXTURE_MODE_NA;
-
-  ColorConversionMode color_conversion_mode_ = COLOR_CONVERSION_MODE_NONE;
-  raw_ptr<const gfx::ColorTransform> color_transform_ = nullptr;
-
-  bool has_tex_clamp_rect_ = false;
-
-  bool has_output_color_matrix_ = false;
-  bool has_tint_color_matrix_ = false;
-  bool has_rounded_corner_ = false;
-};
-
-struct ProgramKeyHash {
-  size_t operator()(const ProgramKey& key) const {
-    return (static_cast<size_t>(key.type_) << 0) ^
-           (static_cast<size_t>(key.precision_) << 3) ^
-           (static_cast<size_t>(key.sampler_) << 6) ^
-           (static_cast<size_t>(key.blend_mode_) << 9) ^
-           (static_cast<size_t>(key.aa_mode_) << 15) ^
-           (static_cast<size_t>(key.is_opaque_) << 17) ^
-           (static_cast<size_t>(key.premultiplied_alpha_) << 19) ^
-           (static_cast<size_t>(key.has_background_color_) << 20) ^
-           (static_cast<size_t>(key.mask_mode_) << 21) ^
-           (static_cast<size_t>(key.mask_for_background_) << 22) ^
-           (static_cast<size_t>(key.has_color_matrix_) << 23) ^
-           (static_cast<size_t>(key.yuv_alpha_texture_mode_) << 24) ^
-           (static_cast<size_t>(key.uv_texture_mode_) << 25) ^
-           (static_cast<size_t>(key.color_conversion_mode_) << 26) ^
-           (static_cast<size_t>(key.has_tex_clamp_rect_) << 28) ^
-           (static_cast<size_t>(key.has_output_color_matrix_) << 29) ^
-           (static_cast<size_t>(key.has_tint_color_matrix_) << 30) ^
-           (static_cast<size_t>(key.has_rounded_corner_) << 31);
-  }
-};
-
-class VIZ_SERVICE_EXPORT Program : public ProgramBindingBase {
- public:
-  Program() {}
-
-  Program(const Program&) = delete;
-  Program& operator=(const Program&) = delete;
-
-  void Initialize(ContextProvider* context_provider, const ProgramKey& key) {
-    // Set parameters that are common to all sub-classes.
-    vertex_shader_.aa_mode_ = key.aa_mode_;
-    fragment_shader_.aa_mode_ = key.aa_mode_;
-    fragment_shader_.blend_mode_ = key.blend_mode_;
-    fragment_shader_.tex_coord_precision_ = key.precision_;
-    fragment_shader_.sampler_type_ = key.sampler_;
-    fragment_shader_.premultiply_alpha_mode_ = key.premultiplied_alpha_;
-    fragment_shader_.mask_mode_ = key.mask_mode_;
-    fragment_shader_.mask_for_background_ = key.mask_for_background_;
-    fragment_shader_.color_conversion_mode_ = key.color_conversion_mode_;
-    fragment_shader_.color_transform_ = key.color_transform_;
-    fragment_shader_.has_output_color_matrix_ = key.has_output_color_matrix_;
-    fragment_shader_.has_tint_color_matrix_ = key.has_tint_color_matrix_;
-    fragment_shader_.has_rounded_corner_ = key.has_rounded_corner_;
-
-    switch (key.type_) {
-      case PROGRAM_TYPE_DEBUG_BORDER:
-        InitializeDebugBorderProgram();
-        break;
-      case PROGRAM_TYPE_SOLID_COLOR:
-        InitializeSolidColorProgram(key);
-        break;
-      case PROGRAM_TYPE_TILE:
-        InitializeTileProgram(key);
-        break;
-      case PROGRAM_TYPE_TEXTURE:
-        InitializeTextureProgram(key);
-        break;
-      case PROGRAM_TYPE_RENDER_PASS:
-        InitializeRenderPassProgram(key);
-        break;
-      case PROGRAM_TYPE_VIDEO_STREAM:
-        InitializeVideoStreamProgram(key);
-        break;
-      case PROGRAM_TYPE_YUV_VIDEO:
-        InitializeYUVVideo(key);
-        break;
-    }
-    InitializeInternal(context_provider);
-  }
-
-  const VertexShader& vertex_shader() const { return vertex_shader_; }
-  const FragmentShader& fragment_shader() const { return fragment_shader_; }
-
-  // Functions for querying uniform locations.
-  int vertex_tex_transform_location() const {
-    return vertex_shader_.vertex_tex_transform_location_;
-  }
-  int tex_matrix_location() const {
-    return vertex_shader_.tex_matrix_location_;
-  }
-  int ya_tex_scale_location() const {
-    return vertex_shader_.ya_tex_scale_location_;
-  }
-  int ya_tex_offset_location() const {
-    return vertex_shader_.ya_tex_offset_location_;
-  }
-  int uv_tex_scale_location() const {
-    return vertex_shader_.uv_tex_scale_location_;
-  }
-  int uv_tex_offset_location() const {
-    return vertex_shader_.uv_tex_offset_location_;
-  }
-  int matrix_location() const { return vertex_shader_.matrix_location_; }
-  int vertex_opacity_location() const {
-    return vertex_shader_.vertex_opacity_location_;
-  }
-  int viewport_location() const { return vertex_shader_.viewport_location_; }
-  int edge_location() const { return vertex_shader_.edge_location_; }
-  int quad_location() const { return vertex_shader_.quad_location_; }
-
-  int sampler_location() const { return fragment_shader_.sampler_location_; }
-  int alpha_location() const { return fragment_shader_.alpha_location_; }
-  int color_location() const { return fragment_shader_.color_location_; }
-  int background_color_location() const {
-    return fragment_shader_.background_color_location_;
-  }
-  int fragment_tex_transform_location() const {
-    return fragment_shader_.fragment_tex_transform_location_;
-  }
-  int backdrop_location() const { return fragment_shader_.backdrop_location_; }
-  int backdrop_rect_location() const {
-    return fragment_shader_.backdrop_rect_location_;
-  }
-  int original_backdrop_location() const {
-    return fragment_shader_.original_backdrop_location_;
-  }
-  int mask_sampler_location() const {
-    return fragment_shader_.mask_sampler_location_;
-  }
-  int mask_tex_coord_scale_location() const {
-    return fragment_shader_.mask_tex_coord_scale_location_;
-  }
-  int mask_tex_coord_offset_location() const {
-    return fragment_shader_.mask_tex_coord_offset_location_;
-  }
-  int color_matrix_location() const {
-    return fragment_shader_.color_matrix_location_;
-  }
-  int color_offset_location() const {
-    return fragment_shader_.color_offset_location_;
-  }
-  int tex_clamp_rect_location() const {
-    return fragment_shader_.tex_clamp_rect_location_;
-  }
-  int y_texture_location() const {
-    return fragment_shader_.y_texture_location_;
-  }
-  int u_texture_location() const {
-    return fragment_shader_.u_texture_location_;
-  }
-  int v_texture_location() const {
-    return fragment_shader_.v_texture_location_;
-  }
-  int uv_texture_location() const {
-    return fragment_shader_.uv_texture_location_;
-  }
-  int a_texture_location() const {
-    return fragment_shader_.a_texture_location_;
-  }
-  int resource_multiplier_location() const {
-    return fragment_shader_.resource_multiplier_location_;
-  }
-  int resource_offset_location() const {
-    return fragment_shader_.resource_offset_location_;
-  }
-  int ya_clamp_rect_location() const {
-    return fragment_shader_.ya_clamp_rect_location_;
-  }
-  int uv_clamp_rect_location() const {
-    return fragment_shader_.uv_clamp_rect_location_;
-  }
-  int output_color_matrix_location() const {
-    return fragment_shader_.output_color_matrix_location_;
-  }
-  int tint_color_matrix_location() const {
-    return fragment_shader_.tint_color_matrix_location_;
-  }
-  int rounded_corner_rect_location() const {
-    return fragment_shader_.rounded_corner_rect_location_;
-  }
-  int rounded_corner_radius_location() const {
-    return fragment_shader_.rounded_corner_radius_location_;
-  }
-
-  const gfx::ColorTransform* color_transform_for_testing() const {
-    return fragment_shader_.color_transform_;
-  }
-
- private:
-  void InitializeDebugBorderProgram() {
-    // Initialize fragment program.
-    fragment_shader_.input_color_type_ = INPUT_COLOR_SOURCE_UNIFORM;
-    fragment_shader_.frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT;
-  }
-
-  void InitializeSolidColorProgram(const ProgramKey& key) {
-    // Initialize vertex program.
-    vertex_shader_.position_source_ = POSITION_SOURCE_ATTRIBUTE_INDEXED_UNIFORM;
-#if BUILDFLAG(IS_ANDROID)
-    if (key.aa_mode_ == NO_AA)
-      vertex_shader_.has_dummy_variables_ = true;
-#endif
-
-    // Initialize fragment program.
-    fragment_shader_.input_color_type_ = INPUT_COLOR_SOURCE_UNIFORM;
-    fragment_shader_.frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT;
-  }
-
-  void InitializeTileProgram(const ProgramKey& key) {
-    // Initialize vertex program.
-    vertex_shader_.position_source_ = POSITION_SOURCE_ATTRIBUTE_INDEXED_UNIFORM;
-    vertex_shader_.tex_coord_transform_ = TEX_COORD_TRANSFORM_VEC4;
-    vertex_shader_.tex_coord_source_ = TEX_COORD_SOURCE_ATTRIBUTE;
-
-    // Initialize fragment program.
-    fragment_shader_.has_tex_clamp_rect_ = key.has_tex_clamp_rect_;
-    if (key.is_opaque_) {
-      DCHECK_EQ(key.aa_mode_, NO_AA);
-      fragment_shader_.frag_color_mode_ = FRAG_COLOR_MODE_OPAQUE;
-    } else {
-      // TODO(ccameron): This branch shouldn't be needed (this is always
-      // BLEND_MODE_NONE).
-      if (key.aa_mode_ == NO_AA)
-        fragment_shader_.frag_color_mode_ = FRAG_COLOR_MODE_APPLY_BLEND_MODE;
-      fragment_shader_.has_uniform_alpha_ = true;
-    }
-    // AA changes the texture coordinate mode (affecting both shaders).
-    if (key.aa_mode_ == USE_AA) {
-      vertex_shader_.tex_coord_source_ = TEX_COORD_SOURCE_POSITION;
-      vertex_shader_.aa_mode_ = USE_AA;
-      fragment_shader_.has_rgba_fragment_tex_transform_ = true;
-      // Tiles that have AA do their own clamping.
-      DCHECK(!fragment_shader_.has_tex_clamp_rect_);
-    }
-  }
-
-  void InitializeTextureProgram(const ProgramKey& key) {
-    // Initialize vertex program.
-    vertex_shader_.tex_coord_source_ = TEX_COORD_SOURCE_ATTRIBUTE;
-    vertex_shader_.tex_coord_transform_ = TEX_COORD_TRANSFORM_VEC4;
-    vertex_shader_.has_vertex_opacity_ = true;
-    vertex_shader_.use_uniform_arrays_ = !key.has_tex_clamp_rect_;
-
-    // Initialize fragment program.
-    fragment_shader_.has_varying_alpha_ = true;
-    fragment_shader_.has_background_color_ = key.has_background_color_;
-    fragment_shader_.has_tex_clamp_rect_ = key.has_tex_clamp_rect_;
-  }
-
-  void InitializeRenderPassProgram(const ProgramKey& key) {
-    // Initialize vertex program.
-    if (key.aa_mode_ == NO_AA) {
-      vertex_shader_.tex_coord_source_ = TEX_COORD_SOURCE_ATTRIBUTE;
-      vertex_shader_.tex_coord_transform_ = TEX_COORD_TRANSFORM_VEC4;
-      vertex_shader_.has_vertex_opacity_ = true;
-      vertex_shader_.use_uniform_arrays_ = true;
-    } else {
-      vertex_shader_.position_source_ =
-          POSITION_SOURCE_ATTRIBUTE_INDEXED_UNIFORM;
-      vertex_shader_.tex_coord_source_ = TEX_COORD_SOURCE_POSITION;
-      vertex_shader_.tex_coord_transform_ = TEX_COORD_TRANSFORM_TRANSLATED_VEC4;
-    }
-
-    // Initialize fragment program.
-    fragment_shader_.frag_color_mode_ = FRAG_COLOR_MODE_APPLY_BLEND_MODE;
-    fragment_shader_.has_uniform_alpha_ = true;
-    fragment_shader_.has_color_matrix_ = key.has_color_matrix_;
-    if (key.mask_mode_ == HAS_MASK) {
-      fragment_shader_.ignore_sampler_type_ = true;
-    } else {
-      DCHECK(!key.mask_for_background_);
-    }
-  }
-
-  void InitializeVideoStreamProgram(const ProgramKey& key) {
-    vertex_shader_.tex_coord_source_ = TEX_COORD_SOURCE_ATTRIBUTE;
-    vertex_shader_.tex_coord_transform_ = TEX_COORD_TRANSFORM_MATRIX;
-    DCHECK_EQ(key.sampler_, SAMPLER_TYPE_EXTERNAL_OES);
-  }
-
-  void InitializeYUVVideo(const ProgramKey& key) {
-    vertex_shader_.tex_coord_source_ = TEX_COORD_SOURCE_ATTRIBUTE;
-    vertex_shader_.is_ya_uv_ = true;
-
-    fragment_shader_.input_color_type_ = INPUT_COLOR_SOURCE_YUV_TEXTURES;
-    fragment_shader_.has_uniform_alpha_ = true;
-    fragment_shader_.yuv_alpha_texture_mode_ = key.yuv_alpha_texture_mode_;
-    fragment_shader_.uv_texture_mode_ = key.uv_texture_mode_;
-  }
-
-  void InitializeInternal(ContextProvider* context_provider) {
-    DCHECK(context_provider);
-    DCHECK(!initialized_);
-
-    if (IsContextLost(context_provider->ContextGL()))
-      return;
-
-    if (!ProgramBindingBase::Init(context_provider->ContextGL(),
-                                  vertex_shader_.GetShaderString(),
-                                  fragment_shader_.GetShaderString())) {
-      DCHECK(IsContextLost(context_provider->ContextGL()));
-      return;
-    }
-
-    int base_uniform_index = 0;
-    vertex_shader_.Init(context_provider->ContextGL(), program_,
-                        &base_uniform_index);
-    fragment_shader_.Init(context_provider->ContextGL(), program_,
-                          &base_uniform_index);
-
-    // Link after binding uniforms
-    if (!Link(context_provider->ContextGL())) {
-      DCHECK(IsContextLost(context_provider->ContextGL()));
-      return;
-    }
-
-    initialized_ = true;
-  }
-
-  VertexShader vertex_shader_;
-  FragmentShader fragment_shader_;
-};
-
-}  // namespace viz
-
-#endif  // COMPONENTS_VIZ_SERVICE_DISPLAY_PROGRAM_BINDING_H_
diff --git a/components/viz/service/display/scoped_gpu_memory_buffer_texture.cc b/components/viz/service/display/scoped_gpu_memory_buffer_texture.cc
deleted file mode 100644
index e7968ed7..0000000
--- a/components/viz/service/display/scoped_gpu_memory_buffer_texture.cc
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright 2017 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 "components/viz/service/display/scoped_gpu_memory_buffer_texture.h"
-
-#include "base/check.h"
-#include "components/viz/common/gpu/context_provider.h"
-#include "components/viz/common/resources/resource_format.h"
-#include "components/viz/common/resources/resource_format_utils.h"
-#include "gpu/GLES2/gl2extchromium.h"
-#include "gpu/command_buffer/client/gles2_interface.h"
-#include "gpu/command_buffer/common/gpu_memory_buffer_support.h"
-
-namespace viz {
-
-ScopedGpuMemoryBufferTexture::ScopedGpuMemoryBufferTexture(
-    ContextProvider* context_provider,
-    const gfx::Size& size,
-    const gfx::ColorSpace& color_space)
-    : context_provider_(context_provider),
-      size_(size),
-      color_space_(color_space) {
-  DCHECK(context_provider_);
-
-  const auto& caps = context_provider->ContextCapabilities();
-  // This capability is needed to use TexStorage2DImageCHROMIUM, and should be
-  // known to be enabled before using an object of this type.
-  DCHECK(caps.texture_storage_image);
-
-  gpu::gles2::GLES2Interface* gl = context_provider_->ContextGL();
-  gl->GenTextures(1, &gl_id_);
-
-  gfx::BufferUsage usage = gfx::BufferUsage::SCANOUT;
-  ResourceFormat format = RGBA_8888;
-  gfx::BufferFormat buffer_format = BufferFormat(format);
-
-  target_ = gpu::GetBufferTextureTarget(usage, buffer_format, caps);
-
-  gl->BindTexture(target_, gl_id_);
-  gl->TexParameteri(target_, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-  gl->TexParameteri(target_, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-  gl->TexParameteri(target_, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-  gl->TexParameteri(target_, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-
-  gl->TexStorage2DImageCHROMIUM(
-      target_, TextureStorageFormat(format, caps.angle_rgbx_internal_format),
-      GL_SCANOUT_CHROMIUM, size_.width(), size_.height());
-  if (color_space_.IsValid()) {
-    gl->SetColorSpaceMetadataCHROMIUM(gl_id_, color_space_.AsGLColorSpace());
-  }
-  gl->BindTexture(target_, 0);
-}
-
-ScopedGpuMemoryBufferTexture::ScopedGpuMemoryBufferTexture() = default;
-
-ScopedGpuMemoryBufferTexture::~ScopedGpuMemoryBufferTexture() {
-  Free();
-}
-
-ScopedGpuMemoryBufferTexture::ScopedGpuMemoryBufferTexture(
-    ScopedGpuMemoryBufferTexture&& other)
-    : context_provider_(other.context_provider_),
-      gl_id_(other.gl_id_),
-      target_(other.target_),
-      size_(other.size_),
-      color_space_(other.color_space_) {
-  other.gl_id_ = 0;
-}
-
-ScopedGpuMemoryBufferTexture& ScopedGpuMemoryBufferTexture::operator=(
-    ScopedGpuMemoryBufferTexture&& other) {
-  DCHECK(!context_provider_ || !other.context_provider_ ||
-         context_provider_ == other.context_provider_);
-  if (this != &other) {
-    Free();
-    context_provider_ = other.context_provider_;
-    gl_id_ = other.gl_id_;
-    target_ = other.target_;
-    size_ = other.size_;
-    color_space_ = other.color_space_;
-
-    other.gl_id_ = 0;
-  }
-  return *this;
-}
-
-void ScopedGpuMemoryBufferTexture::Free() {
-  if (!gl_id_)
-    return;
-  gpu::gles2::GLES2Interface* gl = context_provider_->ContextGL();
-  gl->DeleteTextures(1, &gl_id_);
-  gl_id_ = 0;
-}
-
-}  // namespace viz
diff --git a/components/viz/service/display/scoped_gpu_memory_buffer_texture.h b/components/viz/service/display/scoped_gpu_memory_buffer_texture.h
deleted file mode 100644
index 1711224..0000000
--- a/components/viz/service/display/scoped_gpu_memory_buffer_texture.h
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2017 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 COMPONENTS_VIZ_SERVICE_DISPLAY_SCOPED_GPU_MEMORY_BUFFER_TEXTURE_H_
-#define COMPONENTS_VIZ_SERVICE_DISPLAY_SCOPED_GPU_MEMORY_BUFFER_TEXTURE_H_
-
-#include "base/memory/raw_ptr.h"
-#include "components/viz/service/viz_service_export.h"
-#include "ui/gfx/color_space.h"
-#include "ui/gfx/geometry/size.h"
-
-namespace viz {
-class ContextProvider;
-
-// ScopedGpuMemoryBufferTexture is a GL texture backed by a GL image and a
-// GpuMemoryBuffer, so that it can be used as an overlay.
-class VIZ_SERVICE_EXPORT ScopedGpuMemoryBufferTexture {
- public:
-  explicit ScopedGpuMemoryBufferTexture(ContextProvider* context_provider,
-                                        const gfx::Size& size,
-                                        const gfx::ColorSpace& color_space);
-
-  ScopedGpuMemoryBufferTexture();
-  ~ScopedGpuMemoryBufferTexture();
-
-  ScopedGpuMemoryBufferTexture(ScopedGpuMemoryBufferTexture&& other);
-  ScopedGpuMemoryBufferTexture& operator=(ScopedGpuMemoryBufferTexture&& other);
-
-  uint32_t id() const { return gl_id_; }
-  uint32_t target() const { return target_; }
-  const gfx::Size& size() const { return size_; }
-  const gfx::ColorSpace& color_space() const { return color_space_; }
-
- private:
-  void Free();
-
-  // The ContextProvider used to free the texture when this object is destroyed,
-  // so it must outlive this object.
-  raw_ptr<ContextProvider> context_provider_ = nullptr;
-  uint32_t gl_id_ = 0;
-  uint32_t target_ = 0;
-  gfx::Size size_;
-  gfx::ColorSpace color_space_;
-};
-
-}  // namespace viz
-
-#endif  // COMPONENTS_VIZ_SERVICE_DISPLAY_SCOPED_GPU_MEMORY_BUFFER_TEXTURE_H_
diff --git a/components/viz/service/display/scoped_render_pass_texture.cc b/components/viz/service/display/scoped_render_pass_texture.cc
deleted file mode 100644
index 9a66801..0000000
--- a/components/viz/service/display/scoped_render_pass_texture.cc
+++ /dev/null
@@ -1,127 +0,0 @@
-// Copyright 2017 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 "components/viz/service/display/scoped_render_pass_texture.h"
-
-#include <algorithm>
-
-#include "base/bits.h"
-#include "base/check.h"
-#include "components/viz/common/gpu/context_provider.h"
-#include "components/viz/common/resources/resource_format_utils.h"
-#include "gpu/GLES2/gl2extchromium.h"
-#include "gpu/command_buffer/client/gles2_interface.h"
-
-namespace viz {
-
-ScopedRenderPassTexture::ScopedRenderPassTexture() = default;
-
-ScopedRenderPassTexture::ScopedRenderPassTexture(
-    ContextProvider* context_provider,
-    const gfx::Size& size,
-    ResourceFormat format,
-    const gfx::ColorSpace& color_space,
-    bool mipmap)
-    : context_provider_(context_provider),
-      size_(size),
-      mipmap_(mipmap),
-      color_space_(color_space) {
-  DCHECK(context_provider_);
-  gpu::gles2::GLES2Interface* gl = context_provider_->ContextGL();
-  const gpu::Capabilities& caps = context_provider_->ContextCapabilities();
-  gl->GenTextures(1, &gl_id_);
-
-  gl->BindTexture(GL_TEXTURE_2D, gl_id_);
-  gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-  gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-  gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-  gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-
-  // This texture will be bound as a framebuffer, so optimize for that.
-  if (caps.texture_usage) {
-    gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_USAGE_ANGLE,
-                      GL_FRAMEBUFFER_ATTACHMENT_ANGLE);
-  }
-
-  if (caps.texture_storage) {
-    GLint levels = 1;
-    if (caps.texture_npot && mipmap_)
-      levels += base::bits::Log2Floor(std::max(size_.width(), size_.height()));
-
-    gl->TexStorage2DEXT(
-        GL_TEXTURE_2D, levels,
-        TextureStorageFormat(format, context_provider_->ContextCapabilities()
-                                         .angle_rgbx_internal_format),
-        size_.width(), size_.height());
-  } else {
-    DCHECK(GLSupportsFormat(format));
-    gl->TexImage2D(GL_TEXTURE_2D, 0, GLInternalFormat(format), size_.width(),
-                   size_.height(), 0, GLDataFormat(format), GLDataType(format),
-                   nullptr);
-  }
-}
-
-ScopedRenderPassTexture::~ScopedRenderPassTexture() {
-  Free();
-}
-
-ScopedRenderPassTexture::ScopedRenderPassTexture(
-    ScopedRenderPassTexture&& other) {
-  context_provider_ = other.context_provider_;
-  size_ = other.size_;
-  mipmap_ = other.mipmap_;
-  color_space_ = other.color_space_;
-  gl_id_ = other.gl_id_;
-  mipmap_state_ = other.mipmap_state_;
-
-  // When being moved, other will no longer hold this gl_id_.
-  other.gl_id_ = 0;
-}
-
-ScopedRenderPassTexture& ScopedRenderPassTexture::operator=(
-    ScopedRenderPassTexture&& other) {
-  if (this != &other) {
-    Free();
-    context_provider_ = other.context_provider_;
-    size_ = other.size_;
-    mipmap_ = other.mipmap_;
-    color_space_ = other.color_space_;
-    gl_id_ = other.gl_id_;
-    mipmap_state_ = other.mipmap_state_;
-
-    // When being moved, other will no longer hold this gl_id_.
-    other.gl_id_ = 0;
-  }
-  return *this;
-}
-
-void ScopedRenderPassTexture::Free() {
-  if (!gl_id_)
-    return;
-  gpu::gles2::GLES2Interface* gl = context_provider_->ContextGL();
-  gl->DeleteTextures(1, &gl_id_);
-  gl_id_ = 0;
-}
-
-void ScopedRenderPassTexture::BindForSampling() {
-  gpu::gles2::GLES2Interface* gl = context_provider_->ContextGL();
-  gl->BindTexture(GL_TEXTURE_2D, gl_id_);
-  switch (mipmap_state_) {
-    case INVALID:
-      break;
-    case GENERATE:
-      // TODO(crbug.com/803286): npot texture always return false on ubuntu
-      // desktop. The npot texture check is probably failing on desktop GL.
-      DCHECK(context_provider_->ContextCapabilities().texture_npot);
-      gl->GenerateMipmap(GL_TEXTURE_2D);
-      mipmap_state_ = VALID;
-      [[fallthrough]];
-    case VALID:
-      gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
-                        GL_LINEAR_MIPMAP_LINEAR);
-      break;
-  }
-}
-
-}  // namespace viz
diff --git a/components/viz/service/display/scoped_render_pass_texture.h b/components/viz/service/display/scoped_render_pass_texture.h
deleted file mode 100644
index da29d49b..0000000
--- a/components/viz/service/display/scoped_render_pass_texture.h
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright 2017 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 COMPONENTS_VIZ_SERVICE_DISPLAY_SCOPED_RENDER_PASS_TEXTURE_H_
-#define COMPONENTS_VIZ_SERVICE_DISPLAY_SCOPED_RENDER_PASS_TEXTURE_H_
-
-#include "base/memory/raw_ptr.h"
-#include "components/viz/common/resources/resource_format.h"
-#include "components/viz/service/viz_service_export.h"
-#include "third_party/khronos/GLES2/gl2.h"
-#include "ui/gfx/color_space.h"
-#include "ui/gfx/geometry/size.h"
-
-namespace viz {
-class ContextProvider;
-
-// ScopedRenderPassTexture is resource used inside the same GL context and will
-// not being sent into another process. So no need to create fence and mailbox
-// for these resources.
-class VIZ_SERVICE_EXPORT ScopedRenderPassTexture {
- public:
-  ScopedRenderPassTexture();
-  ScopedRenderPassTexture(ContextProvider* context_provider,
-                          const gfx::Size& size,
-                          ResourceFormat format,
-                          const gfx::ColorSpace& color_space,
-                          bool mipmap);
-  ~ScopedRenderPassTexture();
-
-  ScopedRenderPassTexture(ScopedRenderPassTexture&& other);
-  ScopedRenderPassTexture& operator=(ScopedRenderPassTexture&& other);
-  void BindForSampling();
-
-  GLuint id() const { return gl_id_; }
-  const gfx::Size& size() const { return size_; }
-  bool mipmap() const { return mipmap_; }
-  const gfx::ColorSpace& color_space() const { return color_space_; }
-  void set_generate_mipmap() { mipmap_state_ = GENERATE; }
-
- private:
-  void Free();
-
-  raw_ptr<ContextProvider> context_provider_ = nullptr;
-  // The GL texture id.
-  GLuint gl_id_ = 0;
-  // Size of the resource in pixels.
-  gfx::Size size_;
-  // When true, and immutable textures are used, this specifies to
-  // generate mipmaps at powers of 2.
-  bool mipmap_ = false;
-  // TODO(xing.xu): Remove this and set the color space when we draw the
-  // CompositorRenderPassDrawQuad.
-  gfx::ColorSpace color_space_;
-  enum MipmapState { INVALID, GENERATE, VALID };
-  MipmapState mipmap_state_ = INVALID;
-};
-
-}  // namespace viz
-
-#endif  // COMPONENTS_VIZ_SERVICE_DISPLAY_SCOPED_RENDER_PASS_TEXTURE_H_
diff --git a/components/viz/service/display/shader.cc b/components/viz/service/display/shader.cc
deleted file mode 100644
index e3ac6a9..0000000
--- a/components/viz/service/display/shader.cc
+++ /dev/null
@@ -1,1167 +0,0 @@
-// Copyright 2011 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 "components/viz/service/display/shader.h"
-
-#include <stddef.h>
-
-#include <algorithm>
-#include <utility>
-#include <vector>
-
-#include "base/check_op.h"
-#include "base/notreached.h"
-#include "base/strings/strcat.h"
-#include "base/strings/string_util.h"
-#include "base/strings/stringprintf.h"
-#include "components/viz/service/display/static_geometry_binding.h"
-#include "gpu/command_buffer/client/gles2_interface.h"
-#include "ui/gfx/color_transform.h"
-#include "ui/gfx/geometry/point.h"
-#include "ui/gfx/geometry/size.h"
-
-constexpr base::StringPiece StripLambda(base::StringPiece shader) {
-  // Must contain at least "[]() {}".
-  DCHECK_EQ(shader.substr(0, 6), "[]() {");
-  DCHECK_EQ(shader.back(), '}');
-  shader.remove_prefix(6);
-  shader.remove_suffix(1);
-  return shader;
-}
-
-// Shaders are passed in with lambda syntax, which tricks clang-format into
-// handling them correctly. StripLambda removes this.
-#define SHADER0(Src) StripLambda(#Src)
-
-#define HDR(x)        \
-  do {                \
-    header += x "\n"; \
-  } while (0)
-#define SRC(x)             \
-  do {                     \
-    source += "  " x "\n"; \
-  } while (0)
-
-using gpu::gles2::GLES2Interface;
-
-namespace viz {
-
-namespace {
-
-static void GetProgramUniformLocations(GLES2Interface* context,
-                                       unsigned program,
-                                       size_t count,
-                                       const char** uniforms,
-                                       int* locations,
-                                       int* base_uniform_index) {
-  for (size_t i = 0; i < count; i++) {
-    locations[i] = (*base_uniform_index)++;
-    context->BindUniformLocationCHROMIUM(program, locations[i], uniforms[i]);
-  }
-}
-
-static void SetFragmentTexCoordPrecision(TexCoordPrecision requested_precision,
-                                         std::string* shader_string) {
-  const char* prefix = "";
-  switch (requested_precision) {
-    case TEX_COORD_PRECISION_HIGH:
-      DCHECK_NE(shader_string->find("TexCoordPrecision"), std::string::npos);
-      prefix =
-          "#ifdef GL_FRAGMENT_PRECISION_HIGH\n"
-          "  #define TexCoordPrecision highp\n"
-          "#else\n"
-          "  #define TexCoordPrecision mediump\n"
-          "#endif\n";
-      break;
-    case TEX_COORD_PRECISION_MEDIUM:
-      DCHECK_NE(shader_string->find("TexCoordPrecision"), std::string::npos);
-      prefix = "#define TexCoordPrecision mediump\n";
-      break;
-    case TEX_COORD_PRECISION_NA:
-      DCHECK_EQ(shader_string->find("TexCoordPrecision"), std::string::npos);
-      DCHECK_EQ(shader_string->find("texture2D"), std::string::npos);
-      DCHECK_EQ(shader_string->find("texture2DRect"), std::string::npos);
-      break;
-    default:
-      NOTREACHED();
-      break;
-  }
-  const char* lut_prefix = "#define LutLookup texture2D\n";
-  shader_string->insert(0, prefix);
-  shader_string->insert(0, lut_prefix);
-}
-
-TexCoordPrecision TexCoordPrecisionRequired(GLES2Interface* context,
-                                            int* highp_threshold_cache,
-                                            int highp_threshold_min,
-                                            int x,
-                                            int y) {
-  if (*highp_threshold_cache == 0) {
-    // Initialize range and precision with minimum spec values for when
-    // GetShaderPrecisionFormat is a test stub.
-    // TODO(brianderson): Implement better stubs of GetShaderPrecisionFormat
-    // everywhere.
-    GLint range[2] = {14, 14};
-    GLint precision = 10;
-    context->GetShaderPrecisionFormat(GL_FRAGMENT_SHADER, GL_MEDIUM_FLOAT,
-                                      range, &precision);
-    *highp_threshold_cache = 1 << precision;
-  }
-
-  int highp_threshold = std::max(*highp_threshold_cache, highp_threshold_min);
-  if (x > highp_threshold || y > highp_threshold)
-    return TEX_COORD_PRECISION_HIGH;
-  return TEX_COORD_PRECISION_MEDIUM;
-}
-
-void SetFragmentSamplerType(SamplerType requested_type,
-                            std::string* shader_string) {
-  const char* prefix = nullptr;
-  switch (requested_type) {
-    case SAMPLER_TYPE_2D:
-      DCHECK_NE(shader_string->find("SamplerType"), std::string::npos);
-      DCHECK_NE(shader_string->find("TextureLookup"), std::string::npos);
-      prefix =
-          "#define SamplerType sampler2D\n"
-          "#define TextureLookup texture2D\n";
-      break;
-    case SAMPLER_TYPE_2D_RECT:
-      DCHECK_NE(shader_string->find("SamplerType"), std::string::npos);
-      DCHECK_NE(shader_string->find("TextureLookup"), std::string::npos);
-      prefix =
-          "#extension GL_ARB_texture_rectangle : require\n"
-          "#define SamplerType sampler2DRect\n"
-          "#define TextureLookup texture2DRect\n";
-      break;
-    case SAMPLER_TYPE_EXTERNAL_OES:
-      DCHECK_NE(shader_string->find("SamplerType"), std::string::npos);
-      DCHECK_NE(shader_string->find("TextureLookup"), std::string::npos);
-      prefix =
-          "#extension GL_OES_EGL_image_external : enable\n"
-          "#extension GL_NV_EGL_stream_consumer_external : enable\n"
-          "#define SamplerType samplerExternalOES\n"
-          "#define TextureLookup texture2D\n";
-      break;
-    case SAMPLER_TYPE_NA:
-      DCHECK_EQ(shader_string->find("SamplerType"), std::string::npos);
-      DCHECK_EQ(shader_string->find("TextureLookup"), std::string::npos);
-      return;
-    default:
-      NOTREACHED();
-      return;
-  }
-  shader_string->insert(0, prefix);
-}
-
-}  // namespace
-
-TexCoordPrecision TexCoordPrecisionRequired(GLES2Interface* context,
-                                            int* highp_threshold_cache,
-                                            int highp_threshold_min,
-                                            const gfx::Point& max_coordinate) {
-  return TexCoordPrecisionRequired(context, highp_threshold_cache,
-                                   highp_threshold_min, max_coordinate.x(),
-                                   max_coordinate.y());
-}
-
-TexCoordPrecision TexCoordPrecisionRequired(GLES2Interface* context,
-                                            int* highp_threshold_cache,
-                                            int highp_threshold_min,
-                                            const gfx::Size& max_size) {
-  return TexCoordPrecisionRequired(context, highp_threshold_cache,
-                                   highp_threshold_min, max_size.width(),
-                                   max_size.height());
-}
-
-VertexShader::VertexShader() {}
-
-void VertexShader::Init(GLES2Interface* context,
-                        unsigned program,
-                        int* base_uniform_index) {
-  std::vector<const char*> uniforms;
-  std::vector<int> locations;
-
-  switch (tex_coord_transform_) {
-    case TEX_COORD_TRANSFORM_NONE:
-      break;
-    case TEX_COORD_TRANSFORM_VEC4:
-    case TEX_COORD_TRANSFORM_TRANSLATED_VEC4:
-      uniforms.push_back("vertexTexTransform");
-      break;
-    case TEX_COORD_TRANSFORM_MATRIX:
-      uniforms.push_back("texMatrix");
-      break;
-  }
-  if (is_ya_uv_) {
-    uniforms.push_back("yaTexScale");
-    uniforms.push_back("yaTexOffset");
-    uniforms.push_back("uvTexScale");
-    uniforms.push_back("uvTexOffset");
-  }
-  uniforms.push_back("matrix");
-  if (has_vertex_opacity_)
-    uniforms.push_back("opacity");
-  if (aa_mode_ == USE_AA) {
-    uniforms.push_back("viewport");
-    uniforms.push_back("edge");
-  }
-  if (position_source_ == POSITION_SOURCE_ATTRIBUTE_INDEXED_UNIFORM)
-    uniforms.push_back("quad");
-
-  locations.resize(uniforms.size());
-
-  GetProgramUniformLocations(context, program, uniforms.size(), uniforms.data(),
-                             locations.data(), base_uniform_index);
-
-  size_t index = 0;
-  switch (tex_coord_transform_) {
-    case TEX_COORD_TRANSFORM_NONE:
-      break;
-    case TEX_COORD_TRANSFORM_VEC4:
-    case TEX_COORD_TRANSFORM_TRANSLATED_VEC4:
-      vertex_tex_transform_location_ = locations[index++];
-      break;
-    case TEX_COORD_TRANSFORM_MATRIX:
-      tex_matrix_location_ = locations[index++];
-      break;
-  }
-  if (is_ya_uv_) {
-    ya_tex_scale_location_ = locations[index++];
-    ya_tex_offset_location_ = locations[index++];
-    uv_tex_scale_location_ = locations[index++];
-    uv_tex_offset_location_ = locations[index++];
-  }
-  matrix_location_ = locations[index++];
-  if (has_vertex_opacity_)
-    vertex_opacity_location_ = locations[index++];
-  if (aa_mode_ == USE_AA) {
-    viewport_location_ = locations[index++];
-    edge_location_ = locations[index++];
-  }
-  if (position_source_ == POSITION_SOURCE_ATTRIBUTE_INDEXED_UNIFORM)
-    quad_location_ = locations[index++];
-}
-
-std::string VertexShader::GetShaderString() const {
-  // We unconditionally use highp in the vertex shader since
-  // we are unlikely to be vertex shader bound when drawing large quads.
-  // Also, some vertex shaders mutate the texture coordinate in such a
-  // way that the effective precision might be lower than expected.
-  std::string header = "#define TexCoordPrecision highp\n";
-  std::string source = "void main() {\n";
-
-  // Define the size of quads for attribute indexed uniform arrays.
-  if (use_uniform_arrays_) {
-    header += base::StringPrintf("#define NUM_QUADS %d\n",
-                                 StaticGeometryBinding::NUM_QUADS);
-  }
-
-  // Read the index variables.
-  if (use_uniform_arrays_ || has_vertex_opacity_ ||
-      position_source_ == POSITION_SOURCE_ATTRIBUTE_INDEXED_UNIFORM) {
-    HDR("attribute float a_index;");
-    SRC("// Compute indices for uniform arrays.");
-    SRC("int vertex_index = int(a_index);");
-    if (use_uniform_arrays_)
-      SRC("int quad_index = int(a_index * 0.25);");
-    SRC("");
-  }
-
-  // Read the position and compute gl_Position.
-  HDR("attribute TexCoordPrecision vec4 a_position;");
-  SRC("// Compute the position.");
-  switch (position_source_) {
-    case POSITION_SOURCE_ATTRIBUTE:
-      SRC("vec4 pos = a_position;");
-      break;
-    case POSITION_SOURCE_ATTRIBUTE_INDEXED_UNIFORM:
-      HDR("uniform TexCoordPrecision vec2 quad[4];");
-      SRC("vec4 pos = vec4(quad[vertex_index], a_position.z, a_position.w);");
-      break;
-  }
-    if (use_uniform_arrays_) {
-      HDR("uniform mat4 matrix[NUM_QUADS];");
-      SRC("gl_Position = matrix[quad_index] * pos;");
-    } else {
-      HDR("uniform mat4 matrix;");
-      SRC("gl_Position = matrix * pos;");
-    }
-
-  // Compute the anti-aliasing edge distances.
-  if (aa_mode_ == USE_AA) {
-    HDR("uniform TexCoordPrecision vec3 edge[8];");
-    HDR("uniform vec4 viewport;");
-    HDR("varying TexCoordPrecision vec4 edge_dist[2];  // 8 edge distances.");
-    SRC("// Compute anti-aliasing properties.\n");
-    SRC("vec2 ndc_pos = 0.5 * (1.0 + gl_Position.xy / gl_Position.w);");
-    SRC("vec3 screen_pos = vec3(viewport.xy + viewport.zw * ndc_pos, 1.0);");
-    SRC("edge_dist[0] = vec4(dot(edge[0], screen_pos),");
-    SRC("                    dot(edge[1], screen_pos),");
-    SRC("                    dot(edge[2], screen_pos),");
-    SRC("                    dot(edge[3], screen_pos)) * gl_Position.w;");
-    SRC("edge_dist[1] = vec4(dot(edge[4], screen_pos),");
-    SRC("                    dot(edge[5], screen_pos),");
-    SRC("                    dot(edge[6], screen_pos),");
-    SRC("                    dot(edge[7], screen_pos)) * gl_Position.w;");
-  }
-
-  // Read, transform, and write texture coordinates.
-  if (tex_coord_source_ != TEX_COORD_SOURCE_NONE) {
-    if (is_ya_uv_) {
-      HDR("varying TexCoordPrecision vec2 v_uvTexCoord;");
-      HDR("varying TexCoordPrecision vec2 v_yaTexCoord;");
-    } else {
-      HDR("varying TexCoordPrecision vec2 v_texCoord;");
-    }
-
-    SRC("// Compute texture coordinates.");
-    // Read coordinates.
-    switch (tex_coord_source_) {
-      case TEX_COORD_SOURCE_NONE:
-        break;
-      case TEX_COORD_SOURCE_POSITION:
-        SRC("vec2 texCoord = pos.xy;");
-        break;
-      case TEX_COORD_SOURCE_ATTRIBUTE:
-        HDR("attribute TexCoordPrecision vec2 a_texCoord;");
-        SRC("vec2 texCoord = a_texCoord;");
-        break;
-    }
-    // Transform coordinates (except YUV).
-    switch (tex_coord_transform_) {
-      case TEX_COORD_TRANSFORM_NONE:
-        break;
-      case TEX_COORD_TRANSFORM_TRANSLATED_VEC4:
-        SRC("texCoord = texCoord + vec2(0.5);");
-        [[fallthrough]];
-      case TEX_COORD_TRANSFORM_VEC4:
-        if (use_uniform_arrays_) {
-          HDR("uniform TexCoordPrecision vec4 vertexTexTransform[NUM_QUADS];");
-          SRC("TexCoordPrecision vec4 texTrans =");
-          SRC("    vertexTexTransform[quad_index];");
-          SRC("texCoord = texCoord * texTrans.zw + texTrans.xy;");
-        } else {
-          HDR("uniform TexCoordPrecision vec4 vertexTexTransform;");
-          SRC("texCoord = texCoord * vertexTexTransform.zw +");
-          SRC("           vertexTexTransform.xy;");
-        }
-        break;
-      case TEX_COORD_TRANSFORM_MATRIX:
-        HDR("uniform TexCoordPrecision mat4 texMatrix;");
-        SRC("texCoord = (texMatrix * vec4(texCoord.xy, 0.0, 1.0)).xy;");
-        break;
-    }
-    // Write the output texture coordinates.
-    if (is_ya_uv_) {
-      HDR("uniform TexCoordPrecision vec2 uvTexOffset;");
-      HDR("uniform TexCoordPrecision vec2 uvTexScale;");
-      HDR("uniform TexCoordPrecision vec2 yaTexOffset;");
-      HDR("uniform TexCoordPrecision vec2 yaTexScale;");
-      SRC("v_yaTexCoord = texCoord * yaTexScale + yaTexOffset;");
-      SRC("v_uvTexCoord = texCoord * uvTexScale + uvTexOffset;");
-    } else {
-      SRC("v_texCoord = texCoord;");
-    }
-  }
-
-  // Write varying vertex opacity.
-  if (has_vertex_opacity_) {
-    HDR("varying float v_alpha;");
-    if (use_uniform_arrays_) {
-      HDR("uniform float opacity[NUM_QUADS * 4];");
-    } else {
-      HDR("uniform float opacity[4];");
-    }
-    SRC("v_alpha = opacity[vertex_index];");
-  }
-
-  // Add cargo-culted dummy variables for Android.
-  if (has_dummy_variables_) {
-    HDR("uniform TexCoordPrecision vec2 dummy_uniform;");
-    HDR("varying TexCoordPrecision vec2 dummy_varying;");
-    SRC("dummy_varying = dummy_uniform;");
-  }
-
-  source += "}\n";
-  return header + source;
-}
-
-FragmentShader::FragmentShader() {}
-
-std::string FragmentShader::GetShaderString() const {
-  TexCoordPrecision precision = tex_coord_precision_;
-  // The AA shader values will use TexCoordPrecision.
-  if (aa_mode_ == USE_AA && precision == TEX_COORD_PRECISION_NA)
-    precision = TEX_COORD_PRECISION_MEDIUM;
-  std::string shader = GetShaderSource();
-  SetBlendModeFunctions(&shader);
-  SetRoundedCornerFunctions(&shader);
-  SetFragmentSamplerType(sampler_type_, &shader);
-  SetFragmentTexCoordPrecision(precision, &shader);
-  return shader;
-}
-
-void FragmentShader::Init(GLES2Interface* context,
-                          unsigned program,
-                          int* base_uniform_index) {
-  std::vector<const char*> uniforms;
-  std::vector<int> locations;
-  if (has_blend_mode()) {
-    uniforms.push_back("s_backdropTexture");
-    uniforms.push_back("s_originalBackdropTexture");
-    uniforms.push_back("backdropRect");
-  }
-  if (mask_mode_ != NO_MASK) {
-    uniforms.push_back("s_mask");
-    uniforms.push_back("maskTexCoordScale");
-    uniforms.push_back("maskTexCoordOffset");
-  }
-  if (has_color_matrix_) {
-    uniforms.push_back("colorMatrix");
-    uniforms.push_back("colorOffset");
-  }
-  if (has_uniform_alpha_)
-    uniforms.push_back("alpha");
-  if (has_background_color_)
-    uniforms.push_back("background_color");
-  if (has_tex_clamp_rect_)
-    uniforms.push_back("tex_clamp_rect");
-  switch (input_color_type_) {
-    case INPUT_COLOR_SOURCE_RGBA_TEXTURE:
-      uniforms.push_back("s_texture");
-      if (has_rgba_fragment_tex_transform_)
-        uniforms.push_back("fragmentTexTransform");
-      break;
-    case INPUT_COLOR_SOURCE_YUV_TEXTURES:
-      uniforms.push_back("y_texture");
-      if (uv_texture_mode_ == UV_TEXTURE_MODE_UV)
-        uniforms.push_back("uv_texture");
-      if (uv_texture_mode_ == UV_TEXTURE_MODE_U_V) {
-        uniforms.push_back("u_texture");
-        uniforms.push_back("v_texture");
-      }
-      if (yuv_alpha_texture_mode_ == YUV_HAS_ALPHA_TEXTURE)
-        uniforms.push_back("a_texture");
-      uniforms.push_back("ya_clamp_rect");
-      uniforms.push_back("uv_clamp_rect");
-      uniforms.push_back("resource_multiplier");
-      uniforms.push_back("resource_offset");
-      break;
-    case INPUT_COLOR_SOURCE_UNIFORM:
-      uniforms.push_back("color");
-      break;
-  }
-  if (has_output_color_matrix_)
-    uniforms.emplace_back("output_color_matrix");
-
-  if (has_tint_color_matrix_)
-    uniforms.emplace_back("tint_color_matrix");
-
-  if (has_rounded_corner_) {
-    uniforms.emplace_back("roundedCornerRect");
-    uniforms.emplace_back("roundedCornerRadius");
-  }
-
-  locations.resize(uniforms.size());
-
-  GetProgramUniformLocations(context, program, uniforms.size(), uniforms.data(),
-                             locations.data(), base_uniform_index);
-
-  size_t index = 0;
-  if (has_blend_mode()) {
-    backdrop_location_ = locations[index++];
-    original_backdrop_location_ = locations[index++];
-    backdrop_rect_location_ = locations[index++];
-  }
-  if (mask_mode_ != NO_MASK) {
-    mask_sampler_location_ = locations[index++];
-    mask_tex_coord_scale_location_ = locations[index++];
-    mask_tex_coord_offset_location_ = locations[index++];
-  }
-  if (has_color_matrix_) {
-    color_matrix_location_ = locations[index++];
-    color_offset_location_ = locations[index++];
-  }
-  if (has_uniform_alpha_)
-    alpha_location_ = locations[index++];
-  if (has_background_color_)
-    background_color_location_ = locations[index++];
-  if (has_tex_clamp_rect_)
-    tex_clamp_rect_location_ = locations[index++];
-  switch (input_color_type_) {
-    case INPUT_COLOR_SOURCE_RGBA_TEXTURE:
-      sampler_location_ = locations[index++];
-      if (has_rgba_fragment_tex_transform_)
-        fragment_tex_transform_location_ = locations[index++];
-      break;
-    case INPUT_COLOR_SOURCE_YUV_TEXTURES:
-      y_texture_location_ = locations[index++];
-      if (uv_texture_mode_ == UV_TEXTURE_MODE_UV)
-        uv_texture_location_ = locations[index++];
-      if (uv_texture_mode_ == UV_TEXTURE_MODE_U_V) {
-        u_texture_location_ = locations[index++];
-        v_texture_location_ = locations[index++];
-      }
-      if (yuv_alpha_texture_mode_ == YUV_HAS_ALPHA_TEXTURE)
-        a_texture_location_ = locations[index++];
-      ya_clamp_rect_location_ = locations[index++];
-      uv_clamp_rect_location_ = locations[index++];
-      resource_multiplier_location_ = locations[index++];
-      resource_offset_location_ = locations[index++];
-      break;
-    case INPUT_COLOR_SOURCE_UNIFORM:
-      color_location_ = locations[index++];
-      break;
-  }
-
-  if (has_output_color_matrix_)
-    output_color_matrix_location_ = locations[index++];
-
-  if (has_tint_color_matrix_)
-    tint_color_matrix_location_ = locations[index++];
-
-  if (has_rounded_corner_) {
-    rounded_corner_rect_location_ = locations[index++];
-    rounded_corner_radius_location_ = locations[index++];
-  }
-
-  DCHECK_EQ(index, locations.size());
-}
-
-void FragmentShader::SetRoundedCornerFunctions(
-    std::string* shader_string) const {
-  if (!has_rounded_corner_)
-    return;
-
-  static constexpr base::StringPiece kUniforms = SHADER0([]() {
-    uniform vec4 roundedCornerRect;
-    uniform vec4 roundedCornerRadius;
-  });
-
-  static constexpr base::StringPiece kFunctionRcUtility = SHADER0([]() {
-    // Returns a vector of size 4. Each component of a vector is set to 1 or 0
-    // representing whether |rcCoord| is a part of the respective corner or
-    // not.
-    // The component ordering is:
-    //     [Top left, Top right, Bottom right, Bottom left]
-    vec4 IsCorner(vec2 rcCoord) {
-      // Top left corner
-      if (rcCoord.x < roundedCornerRadius.x &&
-          rcCoord.y < roundedCornerRadius.x) {
-        return vec4(1.0, 0.0, 0.0, 0.0);
-      }
-
-      // Top right corner
-      if (rcCoord.x > roundedCornerRect.z - roundedCornerRadius.y &&
-          rcCoord.y < roundedCornerRadius.y) {
-        return vec4(0.0, 1.0, 0.0, 0.0);
-      }
-
-      // Bottom right corner
-      if (rcCoord.x > roundedCornerRect.z - roundedCornerRadius.z &&
-          rcCoord.y > roundedCornerRect.w - roundedCornerRadius.z) {
-        return vec4(0.0, 0.0, 1.0, 0.0);
-      }
-
-      // Bottom left corner
-      if (rcCoord.x < roundedCornerRadius.w &&
-          rcCoord.y > roundedCornerRect.w - roundedCornerRadius.w) {
-        return vec4(0.0, 0.0, 0.0, 1.0);
-      }
-      return vec4(0.0, 0.0, 0.0, 0.0);
-    }
-
-    // Returns the center of the rounded corner. |corner| holds the info on
-    // which corner the center is requested for.
-    vec2 GetCenter(vec4 corner, float radius) {
-      if (corner.x == 1.0) {
-        // Top left corner
-        return vec2(radius, radius);
-      } else if (corner.y == 1.0) {
-        // Top right corner
-        return vec2(roundedCornerRect.z - radius, radius);
-      } else if (corner.z == 1.0) {
-        // Bottom right corner
-        return vec2(roundedCornerRect.z - radius, roundedCornerRect.w - radius);
-      } else {
-        // Bottom left corner
-        return vec2(radius, roundedCornerRect.w - radius);
-      }
-    }
-  });
-
-  static constexpr base::StringPiece kFunctionApplyRoundedCorner =
-      SHADER0([]() {
-        vec4 ApplyRoundedCorner(vec4 src) {
-          vec2 rcCoord = gl_FragCoord.xy - roundedCornerRect.xy;
-
-          vec4 isCorner = IsCorner(rcCoord);
-
-          // Get the radius to use based on the corner this fragment lies in.
-          float r = dot(isCorner, roundedCornerRadius);
-
-          // If the radius is 0, then there is no rounded corner here. We can do
-          // an early return.
-          if (r == 0.0)
-            return src;
-
-          // Vector to the corner's center this fragment is in.
-          // Due to precision errors on android, this variable requires a highp.
-          // See https://crbug.com/1009322
-          RoundedCornerPrecision vec2 cornerCenter = GetCenter(isCorner, r);
-
-          // Vector from the center of the corner to the current fragment center
-          vec2 cxy = rcCoord - cornerCenter;
-
-          // Compute the distance of the fragment's center from the corner's
-          // center.
-          float fragDst = length(cxy);
-
-          float alpha = smoothstep(r - 1.0, r + 1.0, fragDst);
-          return vec4(0.0) * alpha + src * (1.0 - alpha);
-        }
-      });
-
-  std::string shader;
-  shader.reserve(shader_string->size() + 2048);
-  shader += "precision mediump float;";
-  shader +=
-      "\n#ifdef GL_FRAGMENT_PRECISION_HIGH\n"
-      "  #define RoundedCornerPrecision highp\n"
-      "#else\n"
-      "  #define RoundedCornerPrecision mediump\n"
-      "#endif\n";
-  base::StrAppend(&shader, {kUniforms, kFunctionRcUtility,
-                            kFunctionApplyRoundedCorner, *shader_string});
-  *shader_string = std::move(shader);
-}
-
-void FragmentShader::SetBlendModeFunctions(std::string* shader_string) const {
-  if (!has_blend_mode()) {
-    return;
-  }
-
-  static constexpr base::StringPiece kUniforms = SHADER0([]() {
-    uniform sampler2D s_backdropTexture;
-    uniform sampler2D s_originalBackdropTexture;
-    uniform TexCoordPrecision vec4 backdropRect;
-  });
-
-  base::StringPiece function_apply_blend_mode;
-  if (mask_for_background_) {
-    static constexpr base::StringPiece kFunctionApplyBlendMode = SHADER0([]() {
-      vec4 ApplyBlendMode(vec4 src, float mask) {
-        TexCoordPrecision vec2 bgTexCoord = gl_FragCoord.xy - backdropRect.xy;
-        bgTexCoord *= backdropRect.zw;
-        vec4 backdrop = texture2D(s_backdropTexture, bgTexCoord);
-        vec4 original_backdrop =
-            texture2D(s_originalBackdropTexture, bgTexCoord);
-        vec4 dst = mix(original_backdrop, backdrop, mask);
-        return Blend(src, dst);
-      }
-    });
-    function_apply_blend_mode = kFunctionApplyBlendMode;
-  } else {
-    static constexpr base::StringPiece kFunctionApplyBlendMode = SHADER0([]() {
-      vec4 ApplyBlendMode(vec4 src) {
-        TexCoordPrecision vec2 bgTexCoord = gl_FragCoord.xy - backdropRect.xy;
-        bgTexCoord *= backdropRect.zw;
-        vec4 dst = texture2D(s_backdropTexture, bgTexCoord);
-        return Blend(src, dst);
-      }
-    });
-    function_apply_blend_mode = kFunctionApplyBlendMode;
-  }
-
-  std::string shader;
-  shader.reserve(shader_string->size() + 1024);
-  shader += "precision mediump float;";
-  AppendHelperFunctions(&shader);
-  AppendBlendFunction(&shader);
-  base::StrAppend(&shader,
-                  {kUniforms, function_apply_blend_mode, *shader_string});
-  *shader_string = std::move(shader);
-}
-
-void FragmentShader::AppendHelperFunctions(std::string* buffer) const {
-  static constexpr base::StringPiece kFunctionHardLight = SHADER0([]() {
-    vec3 hardLight(vec4 src, vec4 dst) {
-      vec3 result;
-      result.r =
-          (2.0 * src.r <= src.a)
-              ? (2.0 * src.r * dst.r)
-              : (src.a * dst.a - 2.0 * (dst.a - dst.r) * (src.a - src.r));
-      result.g =
-          (2.0 * src.g <= src.a)
-              ? (2.0 * src.g * dst.g)
-              : (src.a * dst.a - 2.0 * (dst.a - dst.g) * (src.a - src.g));
-      result.b =
-          (2.0 * src.b <= src.a)
-              ? (2.0 * src.b * dst.b)
-              : (src.a * dst.a - 2.0 * (dst.a - dst.b) * (src.a - src.b));
-      result.rgb += src.rgb * (1.0 - dst.a) + dst.rgb * (1.0 - src.a);
-      return result;
-    }
-  });
-
-  static constexpr base::StringPiece kFunctionColorDodgeComponent =
-      SHADER0([]() {
-        float getColorDodgeComponent(float srcc, float srca, float dstc,
-                                     float dsta) {
-          if (0.0 == dstc)
-            return srcc * (1.0 - dsta);
-          float d = srca - srcc;
-          if (0.0 == d)
-            return srca * dsta + srcc * (1.0 - dsta) + dstc * (1.0 - srca);
-          d = min(dsta, dstc * srca / d);
-          return d * srca + srcc * (1.0 - dsta) + dstc * (1.0 - srca);
-        }
-      });
-
-  static constexpr base::StringPiece kFunctionColorBurnComponent =
-      SHADER0([]() {
-        float getColorBurnComponent(float srcc, float srca, float dstc,
-                                    float dsta) {
-          if (dsta == dstc)
-            return srca * dsta + srcc * (1.0 - dsta) + dstc * (1.0 - srca);
-          if (0.0 == srcc)
-            return dstc * (1.0 - srca);
-          float d = max(0.0, dsta - (dsta - dstc) * srca / srcc);
-          return srca * d + srcc * (1.0 - dsta) + dstc * (1.0 - srca);
-        }
-      });
-
-  static constexpr base::StringPiece kFunctionSoftLightComponentPosDstAlpha =
-      SHADER0([]() {
-        float getSoftLightComponent(float srcc, float srca, float dstc,
-                                    float dsta) {
-          if (2.0 * srcc <= srca) {
-            return (dstc * dstc * (srca - 2.0 * srcc)) / dsta +
-                   (1.0 - dsta) * srcc + dstc * (-srca + 2.0 * srcc + 1.0);
-          } else if (4.0 * dstc <= dsta) {
-            float DSqd = dstc * dstc;
-            float DCub = DSqd * dstc;
-            float DaSqd = dsta * dsta;
-            float DaCub = DaSqd * dsta;
-            return (-DaCub * srcc +
-                    DaSqd * (srcc - dstc * (3.0 * srca - 6.0 * srcc - 1.0)) +
-                    12.0 * dsta * DSqd * (srca - 2.0 * srcc) -
-                    16.0 * DCub * (srca - 2.0 * srcc)) /
-                   DaSqd;
-          } else {
-            return -sqrt(dsta * dstc) * (srca - 2.0 * srcc) - dsta * srcc +
-                   dstc * (srca - 2.0 * srcc + 1.0) + srcc;
-          }
-        }
-      });
-
-  static constexpr base::StringPiece kFunctionLum = SHADER0([]() {
-    float luminance(vec3 color) { return dot(vec3(0.3, 0.59, 0.11), color); }
-
-    vec3 set_luminance(vec3 hueSat, float alpha, vec3 lumColor) {
-      float diff = luminance(lumColor - hueSat);
-      vec3 outColor = hueSat + diff;
-      float outLum = luminance(outColor);
-      float minComp = min(min(outColor.r, outColor.g), outColor.b);
-      float maxComp = max(max(outColor.r, outColor.g), outColor.b);
-      if (minComp < 0.0 && outLum != minComp) {
-        outColor =
-            outLum + ((outColor - vec3(outLum, outLum, outLum)) * outLum) /
-                         (outLum - minComp);
-      }
-      if (maxComp > alpha && maxComp != outLum) {
-        outColor = outLum + ((outColor - vec3(outLum, outLum, outLum)) *
-                             (alpha - outLum)) /
-                                (maxComp - outLum);
-      }
-      return outColor;
-    }
-  });
-
-  static constexpr base::StringPiece kFunctionSat = SHADER0([]() {
-    float saturation(vec3 color) {
-      return max(max(color.r, color.g), color.b) -
-             min(min(color.r, color.g), color.b);
-    }
-
-    vec3 set_saturation_helper(float minComp, float midComp, float maxComp,
-                               float sat) {
-      if (minComp < maxComp) {
-        vec3 result;
-        result.r = 0.0;
-        result.g = sat * (midComp - minComp) / (maxComp - minComp);
-        result.b = sat;
-        return result;
-      } else {
-        return vec3(0, 0, 0);
-      }
-    }
-
-    vec3 set_saturation(vec3 hueLumColor, vec3 satColor) {
-      float sat = saturation(satColor);
-      if (hueLumColor.r <= hueLumColor.g) {
-        if (hueLumColor.g <= hueLumColor.b) {
-          hueLumColor.rgb = set_saturation_helper(hueLumColor.r, hueLumColor.g,
-                                                  hueLumColor.b, sat);
-        } else if (hueLumColor.r <= hueLumColor.b) {
-          hueLumColor.rbg = set_saturation_helper(hueLumColor.r, hueLumColor.b,
-                                                  hueLumColor.g, sat);
-        } else {
-          hueLumColor.brg = set_saturation_helper(hueLumColor.b, hueLumColor.r,
-                                                  hueLumColor.g, sat);
-        }
-      } else if (hueLumColor.r <= hueLumColor.b) {
-        hueLumColor.grb = set_saturation_helper(hueLumColor.g, hueLumColor.r,
-                                                hueLumColor.b, sat);
-      } else if (hueLumColor.g <= hueLumColor.b) {
-        hueLumColor.gbr = set_saturation_helper(hueLumColor.g, hueLumColor.b,
-                                                hueLumColor.r, sat);
-      } else {
-        hueLumColor.bgr = set_saturation_helper(hueLumColor.b, hueLumColor.g,
-                                                hueLumColor.r, sat);
-      }
-      return hueLumColor;
-    }
-  });
-
-  switch (blend_mode_) {
-    case BLEND_MODE_OVERLAY:
-    case BLEND_MODE_HARD_LIGHT:
-      buffer->append(kFunctionHardLight.data(), kFunctionHardLight.size());
-      return;
-    case BLEND_MODE_COLOR_DODGE:
-      buffer->append(kFunctionColorDodgeComponent.data(),
-                     kFunctionColorDodgeComponent.size());
-      return;
-    case BLEND_MODE_COLOR_BURN:
-      buffer->append(kFunctionColorBurnComponent.data(),
-                     kFunctionColorBurnComponent.size());
-      return;
-    case BLEND_MODE_SOFT_LIGHT:
-      buffer->append(kFunctionSoftLightComponentPosDstAlpha.data(),
-                     kFunctionSoftLightComponentPosDstAlpha.size());
-      return;
-    case BLEND_MODE_HUE:
-    case BLEND_MODE_SATURATION:
-      base::StrAppend(buffer, {kFunctionLum, kFunctionSat});
-      return;
-    case BLEND_MODE_COLOR:
-    case BLEND_MODE_LUMINOSITY:
-      buffer->append(kFunctionLum.data(), kFunctionLum.size());
-      return;
-    default:
-      return;
-  }
-}
-
-void FragmentShader::AppendBlendFunction(std::string* buffer) const {
-  *buffer +=
-      "vec4 Blend(vec4 src, vec4 dst) {"
-      "    vec4 result;";
-  base::StrAppend(
-      buffer, {GetBlendFunctionBodyForAlpha(), GetBlendFunctionBodyForRGB()});
-  *buffer +=
-      "    return result;"
-      "}";
-}
-
-base::StringPiece FragmentShader::GetBlendFunctionBodyForAlpha() const {
-  if (blend_mode_ == BLEND_MODE_DESTINATION_IN)
-    return "result.a = src.a * dst.a;";
-  else
-    return "result.a = src.a + (1.0 - src.a) * dst.a;";
-}
-
-base::StringPiece FragmentShader::GetBlendFunctionBodyForRGB() const {
-  switch (blend_mode_) {
-    case BLEND_MODE_NORMAL:
-      return "result.rgb = src.rgb + dst.rgb * (1.0 - src.a);";
-    case BLEND_MODE_DESTINATION_IN:
-      return "result.rgb = dst.rgb * src.a;";
-    case BLEND_MODE_SCREEN:
-      return "result.rgb = src.rgb + (1.0 - src.rgb) * dst.rgb;";
-    case BLEND_MODE_LIGHTEN:
-      return "result.rgb = max((1.0 - src.a) * dst.rgb + src.rgb,"
-             "                 (1.0 - dst.a) * src.rgb + dst.rgb);";
-    case BLEND_MODE_OVERLAY:
-      return "result.rgb = hardLight(dst, src);";
-    case BLEND_MODE_DARKEN:
-      return "result.rgb = min((1.0 - src.a) * dst.rgb + src.rgb,"
-             "                 (1.0 - dst.a) * src.rgb + dst.rgb);";
-    case BLEND_MODE_COLOR_DODGE:
-      return "result.r = getColorDodgeComponent(src.r, src.a, dst.r, dst.a);"
-             "result.g = getColorDodgeComponent(src.g, src.a, dst.g, dst.a);"
-             "result.b = getColorDodgeComponent(src.b, src.a, dst.b, dst.a);";
-    case BLEND_MODE_COLOR_BURN:
-      return "result.r = getColorBurnComponent(src.r, src.a, dst.r, dst.a);"
-             "result.g = getColorBurnComponent(src.g, src.a, dst.g, dst.a);"
-             "result.b = getColorBurnComponent(src.b, src.a, dst.b, dst.a);";
-    case BLEND_MODE_HARD_LIGHT:
-      return "result.rgb = hardLight(src, dst);";
-    case BLEND_MODE_SOFT_LIGHT:
-      return "if (0.0 == dst.a) {"
-             "  result.rgb = src.rgb;"
-             "} else {"
-             "  result.r = getSoftLightComponent(src.r, src.a, dst.r, dst.a);"
-             "  result.g = getSoftLightComponent(src.g, src.a, dst.g, dst.a);"
-             "  result.b = getSoftLightComponent(src.b, src.a, dst.b, dst.a);"
-             "}";
-    case BLEND_MODE_DIFFERENCE:
-      return "result.rgb = src.rgb + dst.rgb -"
-             "    2.0 * min(src.rgb * dst.a, dst.rgb * src.a);";
-    case BLEND_MODE_EXCLUSION:
-      return "result.rgb = dst.rgb + src.rgb - 2.0 * dst.rgb * src.rgb;";
-    case BLEND_MODE_MULTIPLY:
-      return "result.rgb = (1.0 - src.a) * dst.rgb +"
-             "    (1.0 - dst.a) * src.rgb + src.rgb * dst.rgb;";
-    case BLEND_MODE_HUE:
-      return "vec4 dstSrcAlpha = dst * src.a;"
-             "result.rgb ="
-             "    set_luminance(set_saturation(src.rgb * dst.a,"
-             "                                 dstSrcAlpha.rgb),"
-             "                  dstSrcAlpha.a,"
-             "                  dstSrcAlpha.rgb);"
-             "result.rgb += (1.0 - src.a) * dst.rgb + (1.0 - dst.a) * src.rgb;";
-    case BLEND_MODE_SATURATION:
-      return "vec4 dstSrcAlpha = dst * src.a;"
-             "result.rgb = set_luminance(set_saturation(dstSrcAlpha.rgb,"
-             "                                          src.rgb * dst.a),"
-             "                           dstSrcAlpha.a,"
-             "                           dstSrcAlpha.rgb);"
-             "result.rgb += (1.0 - src.a) * dst.rgb + (1.0 - dst.a) * src.rgb;";
-    case BLEND_MODE_COLOR:
-      return "vec4 srcDstAlpha = src * dst.a;"
-             "result.rgb = set_luminance(srcDstAlpha.rgb,"
-             "                           srcDstAlpha.a,"
-             "                           dst.rgb * src.a);"
-             "result.rgb += (1.0 - src.a) * dst.rgb + (1.0 - dst.a) * src.rgb;";
-    case BLEND_MODE_LUMINOSITY:
-      return "vec4 srcDstAlpha = src * dst.a;"
-             "result.rgb = set_luminance(dst.rgb * src.a,"
-             "                           srcDstAlpha.a,"
-             "                           srcDstAlpha.rgb);"
-             "result.rgb += (1.0 - src.a) * dst.rgb + (1.0 - dst.a) * src.rgb;";
-    case BLEND_MODE_NONE:
-      NOTREACHED();
-  }
-  return "result = vec4(1.0, 0.0, 0.0, 1.0);";
-}
-
-std::string FragmentShader::GetShaderSource() const {
-  std::string header = "precision mediump float;\n";
-  std::string source = "void main() {\n";
-
-  // Read the input into vec4 texColor.
-  switch (input_color_type_) {
-    case INPUT_COLOR_SOURCE_RGBA_TEXTURE:
-      if (ignore_sampler_type_)
-        HDR("uniform sampler2D s_texture;");
-      else
-        HDR("uniform SamplerType s_texture;");
-      HDR("varying TexCoordPrecision vec2 v_texCoord;");
-      if (has_rgba_fragment_tex_transform_) {
-        HDR("uniform TexCoordPrecision vec4 fragmentTexTransform;");
-        SRC("// Transformed texture lookup");
-        SRC("TexCoordPrecision vec2 texCoord =");
-        SRC("    clamp(v_texCoord, 0.0, 1.0) * fragmentTexTransform.zw +");
-        SRC("   fragmentTexTransform.xy;");
-        SRC("vec4 texColor = TextureLookup(s_texture, texCoord);");
-        DCHECK(!ignore_sampler_type_);
-        DCHECK(!has_tex_clamp_rect_);
-      } else {
-        SRC("// Texture lookup");
-        if (ignore_sampler_type_) {
-          SRC("vec4 texColor = texture2D(s_texture, v_texCoord);");
-          DCHECK(!has_tex_clamp_rect_);
-        } else {
-          SRC("TexCoordPrecision vec2 texCoord = v_texCoord;");
-          if (has_tex_clamp_rect_) {
-            HDR("uniform vec4 tex_clamp_rect;");
-            SRC("texCoord = max(tex_clamp_rect.xy,");
-            SRC("    min(tex_clamp_rect.zw, texCoord));");
-          }
-          SRC("vec4 texColor = TextureLookup(s_texture, texCoord);");
-        }
-      }
-      break;
-    case INPUT_COLOR_SOURCE_YUV_TEXTURES:
-      DCHECK(!has_tex_clamp_rect_);
-      // Compute the clamped texture coordinates for the YA and UV textures.
-      HDR("uniform SamplerType y_texture;");
-      SRC("// YUV texture lookup and conversion to RGB.");
-      SRC("vec2 ya_clamped =");
-      SRC("    max(ya_clamp_rect.xy, min(ya_clamp_rect.zw, v_yaTexCoord));");
-      SRC("vec2 uv_clamped =");
-      SRC("    max(uv_clamp_rect.xy, min(uv_clamp_rect.zw, v_uvTexCoord));");
-      // Read the Y and UV or U and V textures into |yuv|.
-      SRC("vec4 texColor;");
-      SRC("texColor.w = 1.0;");
-      SRC("texColor.x = TextureLookup(y_texture, ya_clamped).x;");
-      if (uv_texture_mode_ == UV_TEXTURE_MODE_UV) {
-        HDR("uniform SamplerType uv_texture;");
-        SRC("texColor.yz = TextureLookup(uv_texture, uv_clamped).xy;");
-      }
-      if (uv_texture_mode_ == UV_TEXTURE_MODE_U_V) {
-        HDR("uniform SamplerType u_texture;");
-        HDR("uniform SamplerType v_texture;");
-        SRC("texColor.y = TextureLookup(u_texture, uv_clamped).x;");
-        SRC("texColor.z = TextureLookup(v_texture, uv_clamped).x;");
-      }
-      if (yuv_alpha_texture_mode_ == YUV_HAS_ALPHA_TEXTURE)
-        HDR("uniform SamplerType a_texture;");
-      HDR("uniform vec4 ya_clamp_rect;");
-      HDR("uniform vec4 uv_clamp_rect;");
-      HDR("uniform float resource_multiplier;");
-      HDR("uniform float resource_offset;");
-      HDR("varying TexCoordPrecision vec2 v_yaTexCoord;");
-      HDR("varying TexCoordPrecision vec2 v_uvTexCoord;");
-      SRC("texColor.xyz -= vec3(resource_offset);");
-      SRC("texColor.xyz *= resource_multiplier;");
-      break;
-    case INPUT_COLOR_SOURCE_UNIFORM:
-      DCHECK(!ignore_sampler_type_);
-      DCHECK(!has_rgba_fragment_tex_transform_);
-      DCHECK(!has_tex_clamp_rect_);
-      HDR("uniform vec4 color;");
-      SRC("// Uniform color");
-      SRC("vec4 texColor = color;");
-      break;
-  }
-
-  // Apply color conversion.
-  switch (color_conversion_mode_) {
-    case COLOR_CONVERSION_MODE_SHADER:
-      header += color_transform_->GetShaderSource();
-      // Un-premultiply by alpha.
-      if (premultiply_alpha_mode_ != NON_PREMULTIPLIED_ALPHA) {
-        SRC("// un-premultiply alpha");
-        SRC("if (texColor.a > 0.0) texColor.rgb /= texColor.a;");
-      }
-      SRC("texColor.rgb = DoColorConversion(texColor.xyz);");
-      SRC("texColor.rgb *= texColor.a;");
-      break;
-    case COLOR_CONVERSION_MODE_NONE:
-      // Premultiply by alpha.
-      if (premultiply_alpha_mode_ == NON_PREMULTIPLIED_ALPHA) {
-        SRC("// Premultiply alpha");
-        SRC("texColor.rgb *= texColor.a;");
-      }
-      break;
-  }
-
-  // Apply the color matrix to texColor.
-  if (has_color_matrix_) {
-    HDR("uniform mat4 colorMatrix;");
-    HDR("uniform vec4 colorOffset;");
-    SRC("// Apply color matrix");
-    SRC("float nonZeroAlpha = max(texColor.a, 0.00001);");
-    SRC("texColor = vec4(texColor.rgb / nonZeroAlpha, nonZeroAlpha);");
-    SRC("texColor = colorMatrix * texColor + colorOffset;");
-    SRC("texColor.rgb *= texColor.a;");
-    SRC("texColor = clamp(texColor, 0.0, 1.0);");
-  }
-
-  // Read the mask texture.
-  if (mask_mode_ != NO_MASK) {
-    HDR("uniform SamplerType s_mask;");
-    HDR("uniform vec2 maskTexCoordScale;");
-    HDR("uniform vec2 maskTexCoordOffset;");
-    SRC("// Read the mask");
-    SRC("TexCoordPrecision vec2 maskTexCoord =");
-    SRC("    vec2(maskTexCoordOffset.x + v_texCoord.x * maskTexCoordScale.x,");
-    SRC("         maskTexCoordOffset.y + v_texCoord.y * maskTexCoordScale.y);");
-    SRC("vec4 maskColor = TextureLookup(s_mask, maskTexCoord);");
-  }
-
-  // Compute AA.
-  if (aa_mode_ == USE_AA) {
-    HDR("varying TexCoordPrecision vec4 edge_dist[2];  // 8 edge distances.");
-    SRC("// Compute AA");
-    SRC("vec4 d4 = min(edge_dist[0], edge_dist[1]);");
-    SRC("vec2 d2 = min(d4.xz, d4.yw);");
-    SRC("float aa = clamp(gl_FragCoord.w * min(d2.x, d2.y), 0.0, 1.0);");
-  }
-
-  // Apply background texture.
-  if (has_background_color_) {
-    HDR("uniform vec4 background_color;");
-    SRC("// Apply uniform background color blending");
-    SRC("texColor += background_color * (1.0 - texColor.a);");
-  }
-
-  // Finally apply the output color matrix to texColor.
-  if (has_output_color_matrix_) {
-    HDR("uniform mat4 output_color_matrix;");
-    SRC("// Apply the output color matrix");
-    SRC("texColor = output_color_matrix * texColor;");
-  }
-
-  // Tint the final color. Used for debugging composited content.
-  if (has_tint_color_matrix_) {
-    HDR("uniform mat4 tint_color_matrix;");
-    SRC("// Apply the tint color matrix");
-    SRC("texColor = tint_color_matrix * texColor;");
-  }
-
-  // Include header text for alpha.
-  if (has_uniform_alpha_) {
-    HDR("uniform float alpha;");
-  }
-  if (has_varying_alpha_) {
-    HDR("varying float v_alpha;");
-  }
-
-  // Apply uniform alpha, aa, varying alpha, and the mask.
-  if (has_varying_alpha_ || aa_mode_ == USE_AA || has_uniform_alpha_ ||
-      mask_mode_ != NO_MASK) {
-    SRC("// Apply alpha from uniform, varying, aa, and mask.");
-    std::string line = "  texColor = texColor";
-    if (has_varying_alpha_)
-      line += " * v_alpha";
-    if (has_uniform_alpha_)
-      line += " * alpha";
-    if (aa_mode_ == USE_AA)
-      line += " * aa";
-    if (mask_mode_ != NO_MASK)
-      line += " * maskColor.a";
-    if (yuv_alpha_texture_mode_ == YUV_HAS_ALPHA_TEXTURE)
-      line += " * TextureLookup(a_texture, ya_clamped).x";
-    line += ";\n";
-    source += line;
-  }
-
-  // Write the fragment color.
-  SRC("// Write the fragment color");
-  switch (frag_color_mode_) {
-    case FRAG_COLOR_MODE_DEFAULT:
-      DCHECK_EQ(blend_mode_, BLEND_MODE_NONE);
-      SRC("gl_FragColor = texColor;");
-      break;
-    case FRAG_COLOR_MODE_OPAQUE:
-      DCHECK_EQ(blend_mode_, BLEND_MODE_NONE);
-      SRC("gl_FragColor = vec4(texColor.rgb, 1.0);");
-      break;
-    case FRAG_COLOR_MODE_APPLY_BLEND_MODE:
-      if (!has_blend_mode()) {
-        SRC("gl_FragColor = texColor;");
-      } else if (mask_mode_ != NO_MASK) {
-        if (mask_for_background_)
-          SRC("gl_FragColor = ApplyBlendMode(texColor, maskColor.w);");
-        else
-          SRC("gl_FragColor = ApplyBlendMode(texColor);");
-      } else {
-        SRC("gl_FragColor = ApplyBlendMode(texColor);");
-      }
-      break;
-  }
-
-  if (has_rounded_corner_)
-    SRC("gl_FragColor = ApplyRoundedCorner(gl_FragColor);");
-
-  source += "}\n";
-
-  return header + source;
-}
-
-}  // namespace viz
diff --git a/components/viz/service/display/shader.h b/components/viz/service/display/shader.h
deleted file mode 100644
index 41d6a000..0000000
--- a/components/viz/service/display/shader.h
+++ /dev/null
@@ -1,324 +0,0 @@
-// Copyright 2011 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 COMPONENTS_VIZ_SERVICE_DISPLAY_SHADER_H_
-#define COMPONENTS_VIZ_SERVICE_DISPLAY_SHADER_H_
-
-#include <string>
-
-#include "base/memory/raw_ptr.h"
-#include "base/strings/string_piece.h"
-#include "components/viz/service/viz_service_export.h"
-
-namespace gfx {
-class ColorTransform;
-class Point;
-class Size;
-}  // namespace gfx
-
-namespace gpu {
-namespace gles2 {
-class GLES2Interface;
-}
-}  // namespace gpu
-
-namespace viz {
-
-enum TexCoordPrecision {
-  TEX_COORD_PRECISION_NA = 0,
-  TEX_COORD_PRECISION_MEDIUM = 1,
-  TEX_COORD_PRECISION_HIGH = 2,
-};
-
-// Texture coordinate sources for the vertex shader.
-enum TexCoordSource {
-  // Vertex shader does not populate a texture coordinate.
-  TEX_COORD_SOURCE_NONE,
-  // Texture coordinate is set to the untransformed position.
-  TEX_COORD_SOURCE_POSITION,
-  // Texture coordinate has its own attribute.
-  TEX_COORD_SOURCE_ATTRIBUTE,
-};
-
-// Texture coordinate transformation modes for the vertex shader.
-enum TexCoordTransform {
-  // Texture coordinates are not transformed.
-  TEX_COORD_TRANSFORM_NONE,
-  // Texture coordinates are transformed by a uniform vec4, scaling by zw and
-  // then translating by xy.
-  TEX_COORD_TRANSFORM_VEC4,
-  // Same as the above, but add vec2(0.5) to the texture coordinate first.
-  TEX_COORD_TRANSFORM_TRANSLATED_VEC4,
-  // Texture coordiantes are transformed by a uniform mat4.
-  TEX_COORD_TRANSFORM_MATRIX,
-};
-
-// Position source for the vertex shader.
-enum PositionSource {
-  // The position is read directly from the position attribute.
-  POSITION_SOURCE_ATTRIBUTE,
-  // The position is read by attribute index into a uniform array for xy, and
-  // getting zw from the attribute.
-  POSITION_SOURCE_ATTRIBUTE_INDEXED_UNIFORM,
-};
-
-enum AAMode {
-  NO_AA = 0,
-  USE_AA = 1,
-};
-
-enum PremultipliedAlphaMode {
-  PREMULTIPLIED_ALPHA = 0,
-  NON_PREMULTIPLIED_ALPHA = 1,
-};
-
-enum SamplerType {
-  SAMPLER_TYPE_NA = 0,
-  SAMPLER_TYPE_2D = 1,
-  SAMPLER_TYPE_2D_RECT = 2,
-  SAMPLER_TYPE_EXTERNAL_OES = 3,
-};
-
-enum BlendMode {
-  BLEND_MODE_NONE,
-  BLEND_MODE_NORMAL,
-  BLEND_MODE_DESTINATION_IN,
-  BLEND_MODE_SCREEN,
-  BLEND_MODE_OVERLAY,
-  BLEND_MODE_DARKEN,
-  BLEND_MODE_LIGHTEN,
-  BLEND_MODE_COLOR_DODGE,
-  BLEND_MODE_COLOR_BURN,
-  BLEND_MODE_HARD_LIGHT,
-  BLEND_MODE_SOFT_LIGHT,
-  BLEND_MODE_DIFFERENCE,
-  BLEND_MODE_EXCLUSION,
-  BLEND_MODE_MULTIPLY,
-  BLEND_MODE_HUE,
-  BLEND_MODE_SATURATION,
-  BLEND_MODE_COLOR,
-  BLEND_MODE_LUMINOSITY,
-  LAST_BLEND_MODE = BLEND_MODE_LUMINOSITY
-};
-
-enum InputColorSource {
-  // This includes RGB and RGBA textures.
-  INPUT_COLOR_SOURCE_RGBA_TEXTURE,
-  // This includes Y and either UV or U-and-V textures.
-  INPUT_COLOR_SOURCE_YUV_TEXTURES,
-  // A solid color specified as a uniform value.
-  INPUT_COLOR_SOURCE_UNIFORM,
-};
-
-enum UVTextureMode {
-  // Shader does not use YUV textures.
-  UV_TEXTURE_MODE_NA,
-  // UV plane is a single texture.
-  UV_TEXTURE_MODE_UV,
-  // U and V planes have separate textures.
-  UV_TEXTURE_MODE_U_V,
-};
-
-enum YUVAlphaTextureMode {
-  YUV_ALPHA_TEXTURE_MODE_NA,
-  YUV_NO_ALPHA_TEXTURE,
-  YUV_HAS_ALPHA_TEXTURE,
-};
-
-enum ColorConversionMode {
-  // No color conversion is performed.
-  COLOR_CONVERSION_MODE_NONE,
-  // Conversion is done analytically in the shader.
-  COLOR_CONVERSION_MODE_SHADER,
-};
-
-// TODO(ccameron): Merge this with BlendMode.
-enum FragColorMode {
-  FRAG_COLOR_MODE_DEFAULT,
-  FRAG_COLOR_MODE_OPAQUE,
-  FRAG_COLOR_MODE_APPLY_BLEND_MODE,
-};
-
-enum MaskMode {
-  NO_MASK = 0,
-  HAS_MASK = 1,
-};
-
-// Note: The highp_threshold_cache must be provided by the caller to make
-// the caching multi-thread/context safe in an easy low-overhead manner.
-// The caller must make sure to clear highp_threshold_cache to 0, so it can be
-// reinitialized, if a new or different context is used.
-VIZ_SERVICE_EXPORT TexCoordPrecision
-TexCoordPrecisionRequired(gpu::gles2::GLES2Interface* context,
-                          int* highp_threshold_cache,
-                          int highp_threshold_min,
-                          const gfx::Point& max_coordinate);
-
-VIZ_SERVICE_EXPORT TexCoordPrecision
-TexCoordPrecisionRequired(gpu::gles2::GLES2Interface* context,
-                          int* highp_threshold_cache,
-                          int highp_threshold_min,
-                          const gfx::Size& max_size);
-
-class VIZ_SERVICE_EXPORT VertexShader {
- public:
-  VertexShader();
-  void Init(gpu::gles2::GLES2Interface* context,
-            unsigned program,
-            int* base_uniform_index);
-  std::string GetShaderString() const;
-
- protected:
-  friend class Program;
-
-  // Use arrays of uniforms for matrix, texTransform, and opacity.
-  bool use_uniform_arrays_ = false;
-
-  PositionSource position_source_ = POSITION_SOURCE_ATTRIBUTE;
-  TexCoordSource tex_coord_source_ = TEX_COORD_SOURCE_NONE;
-  TexCoordTransform tex_coord_transform_ = TEX_COORD_TRANSFORM_NONE;
-
-  // Used only with TEX_COORD_TRANSFORM_VEC4.
-  int vertex_tex_transform_location_ = -1;
-
-  // Used only with TEX_COORD_TRANSFORM_MATRIX.
-  int tex_matrix_location_ = -1;
-
-  // Uniforms for YUV textures.
-  bool is_ya_uv_ = false;
-  int ya_tex_scale_location_ = -1;
-  int ya_tex_offset_location_ = -1;
-  int uv_tex_scale_location_ = -1;
-  int uv_tex_offset_location_ = -1;
-
-  // Matrix to transform the position.
-  int matrix_location_ = -1;
-
-  // Used only with POSITION_SOURCE_ATTRIBUTE_INDEXED_UNIFORM.
-  int quad_location_ = -1;
-
-  // Extra dummy variables to work around bugs on Android.
-  // TODO(ccameron): This is likley unneeded cargo-culting.
-  // http://crbug.com/240602
-  bool has_dummy_variables_ = false;
-
-  bool has_vertex_opacity_ = false;
-  int vertex_opacity_location_ = -1;
-
-  AAMode aa_mode_ = NO_AA;
-  int viewport_location_ = -1;
-  int edge_location_ = -1;
-};
-
-class VIZ_SERVICE_EXPORT FragmentShader {
- public:
-  FragmentShader(const FragmentShader&) = delete;
-  FragmentShader& operator=(const FragmentShader&) = delete;
-
-  virtual void Init(gpu::gles2::GLES2Interface* context,
-                    unsigned program,
-                    int* base_uniform_index);
-  std::string GetShaderString() const;
-
- protected:
-  FragmentShader();
-  virtual std::string GetShaderSource() const;
-  bool has_blend_mode() const { return blend_mode_ != BLEND_MODE_NONE; }
-
-  void SetBlendModeFunctions(std::string* shader_string) const;
-  void SetRoundedCornerFunctions(std::string* shader_string) const;
-
-  // Settings that are modified by sub-classes.
-  AAMode aa_mode_ = NO_AA;
-  bool has_varying_alpha_ = false;
-  PremultipliedAlphaMode premultiply_alpha_mode_ = PREMULTIPLIED_ALPHA;
-  FragColorMode frag_color_mode_ = FRAG_COLOR_MODE_DEFAULT;
-  InputColorSource input_color_type_ = INPUT_COLOR_SOURCE_RGBA_TEXTURE;
-
-  // Used only if |blend_mode_| is not BLEND_MODE_NONE.
-  int backdrop_location_ = -1;
-  int original_backdrop_location_ = -1;
-  int backdrop_rect_location_ = -1;
-
-  // Used only if |input_color_type_| is INPUT_COLOR_SOURCE_RGBA_TEXTURE.
-  bool has_rgba_fragment_tex_transform_ = false;
-  int sampler_location_ = -1;
-  int fragment_tex_transform_location_ = -1;
-
-  // Always use sampler2D and texture2D for the RGBA texture, regardless of the
-  // specified SamplerType.
-  // TODO(ccameron): Change GLRenderer to always specify the correct
-  // SamplerType.
-  bool ignore_sampler_type_ = false;
-
-  // Used only if |input_color_type_| is INPUT_COLOR_SOURCE_UNIFORM.
-  int color_location_ = -1;
-
-  MaskMode mask_mode_ = NO_MASK;
-  int mask_sampler_location_ = -1;
-  int mask_tex_coord_scale_location_ = -1;
-  int mask_tex_coord_offset_location_ = -1;
-
-  bool has_color_matrix_ = false;
-  int color_matrix_location_ = -1;
-  int color_offset_location_ = -1;
-
-  bool has_uniform_alpha_ = false;
-  int alpha_location_ = -1;
-
-  bool has_background_color_ = false;
-  int background_color_location_ = -1;
-
-  bool has_tex_clamp_rect_ = false;
-  int tex_clamp_rect_location_ = -1;
-
-  TexCoordPrecision tex_coord_precision_ = TEX_COORD_PRECISION_NA;
-  SamplerType sampler_type_ = SAMPLER_TYPE_NA;
-
-  BlendMode blend_mode_ = BLEND_MODE_NONE;
-  bool mask_for_background_ = false;
-
-  // YUV-only parameters.
-  YUVAlphaTextureMode yuv_alpha_texture_mode_ = YUV_ALPHA_TEXTURE_MODE_NA;
-  UVTextureMode uv_texture_mode_ = UV_TEXTURE_MODE_UV;
-
-  ColorConversionMode color_conversion_mode_ = COLOR_CONVERSION_MODE_NONE;
-  raw_ptr<const gfx::ColorTransform> color_transform_ = nullptr;
-
-  bool has_output_color_matrix_ = false;
-  int output_color_matrix_location_ = -1;
-
-  bool has_tint_color_matrix_ = false;
-  int tint_color_matrix_location_ = -1;
-
-  // YUV uniform locations.
-  int y_texture_location_ = -1;
-  int u_texture_location_ = -1;
-  int v_texture_location_ = -1;
-  int uv_texture_location_ = -1;
-  int a_texture_location_ = -1;
-  int ya_clamp_rect_location_ = -1;
-  int uv_clamp_rect_location_ = -1;
-
-  // Rounded corner locations
-  bool has_rounded_corner_ = false;
-  int rounded_corner_rect_location_ = -1;
-  int rounded_corner_radius_location_ = -1;
-
-  // The resource offset and multiplier to adjust for bit depth.
-  int resource_multiplier_location_ = -1;
-  int resource_offset_location_ = -1;
-
- private:
-  friend class Program;
-
-  void AppendHelperFunctions(std::string* buffer) const;
-  void AppendBlendFunction(std::string* buffer) const;
-  base::StringPiece GetBlendFunctionBodyForAlpha() const;
-  base::StringPiece GetBlendFunctionBodyForRGB() const;
-};
-
-}  // namespace viz
-
-#endif  // COMPONENTS_VIZ_SERVICE_DISPLAY_SHADER_H_
diff --git a/components/viz/service/display/shader_unittest.cc b/components/viz/service/display/shader_unittest.cc
deleted file mode 100644
index 6990cbf..0000000
--- a/components/viz/service/display/shader_unittest.cc
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright 2013 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 "components/viz/service/display/shader.h"
-
-#include "components/viz/test/test_context_provider.h"
-#include "components/viz/test/test_gles2_interface.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/gfx/geometry/point.h"
-#include "ui/gfx/geometry/size.h"
-
-namespace viz {
-
-TEST(ShaderTest, HighpThresholds) {
-  // The test gl always uses a mediump precision of 10 bits which
-  // corresponds to a native highp threshold of 2^10 = 1024
-  scoped_refptr<TestContextProvider> provider = TestContextProvider::Create();
-  provider->BindToCurrentThread();
-  gpu::gles2::GLES2Interface* test_gl = provider->ContextGL();
-
-  int threshold_cache = 0;
-  int threshold_min;
-  gfx::Point closePoint(512, 512);
-  gfx::Size smallSize(512, 512);
-  gfx::Point farPoint(2560, 2560);
-  gfx::Size bigSize(2560, 2560);
-
-  threshold_min = 0;
-  EXPECT_EQ(TEX_COORD_PRECISION_MEDIUM,
-            TexCoordPrecisionRequired(test_gl, &threshold_cache, threshold_min,
-                                      closePoint));
-  EXPECT_EQ(TEX_COORD_PRECISION_MEDIUM,
-            TexCoordPrecisionRequired(test_gl, &threshold_cache, threshold_min,
-                                      smallSize));
-  EXPECT_EQ(TEX_COORD_PRECISION_HIGH,
-            TexCoordPrecisionRequired(test_gl, &threshold_cache, threshold_min,
-                                      farPoint));
-  EXPECT_EQ(TEX_COORD_PRECISION_HIGH,
-            TexCoordPrecisionRequired(test_gl, &threshold_cache, threshold_min,
-                                      bigSize));
-
-  threshold_min = 3000;
-  EXPECT_EQ(TEX_COORD_PRECISION_MEDIUM,
-            TexCoordPrecisionRequired(test_gl, &threshold_cache, threshold_min,
-                                      closePoint));
-  EXPECT_EQ(TEX_COORD_PRECISION_MEDIUM,
-            TexCoordPrecisionRequired(test_gl, &threshold_cache, threshold_min,
-                                      smallSize));
-  EXPECT_EQ(TEX_COORD_PRECISION_MEDIUM,
-            TexCoordPrecisionRequired(test_gl, &threshold_cache, threshold_min,
-                                      farPoint));
-  EXPECT_EQ(TEX_COORD_PRECISION_MEDIUM,
-            TexCoordPrecisionRequired(test_gl, &threshold_cache, threshold_min,
-                                      bigSize));
-}
-
-}  // namespace viz
diff --git a/components/viz/service/display/skia_renderer.h b/components/viz/service/display/skia_renderer.h
index d690db4..c7bceb8 100644
--- a/components/viz/service/display/skia_renderer.h
+++ b/components/viz/service/display/skia_renderer.h
@@ -17,7 +17,6 @@
 #include "cc/cc_export.h"
 #include "components/viz/service/display/direct_renderer.h"
 #include "components/viz/service/display/display_resource_provider_skia.h"
-#include "components/viz/service/display/sync_query_collection.h"
 #include "components/viz/service/viz_service_export.h"
 #include "third_party/skia/include/core/SkCanvas.h"
 #include "ui/gfx/color_conversion_sk_filter_cache.h"
diff --git a/components/viz/service/display/static_geometry_binding.cc b/components/viz/service/display/static_geometry_binding.cc
deleted file mode 100644
index 1dc0e9b..0000000
--- a/components/viz/service/display/static_geometry_binding.cc
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright 2015 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 "components/viz/service/display/static_geometry_binding.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include "gpu/command_buffer/client/gles2_interface.h"
-#include "ui/gfx/geometry/rect_f.h"
-
-namespace viz {
-
-StaticGeometryBinding::StaticGeometryBinding(gpu::gles2::GLES2Interface* gl,
-                                             const gfx::RectF& quad_vertex_rect)
-    : gl_(gl), quad_vertices_vbo_(0), quad_elements_vbo_(0) {
-  GeometryBindingQuad quads[NUM_QUADS];
-  GeometryBindingQuadIndex quad_indices[NUM_QUADS];
-
-  static_assert(sizeof(GeometryBindingQuad) == 24 * sizeof(float),
-                "struct Quad should be densely packed");
-  static_assert(sizeof(GeometryBindingQuadIndex) == 6 * sizeof(uint16_t),
-                "struct QuadIndex should be densely packed");
-
-  for (size_t i = 0; i < NUM_QUADS; i++) {
-    GeometryBindingVertex v0 = {
-        {quad_vertex_rect.x(), quad_vertex_rect.bottom(), 0.0f},
-        {0.0f, 1.0f},
-        i * 4.0f + 0.0f};
-    GeometryBindingVertex v1 = {
-        {quad_vertex_rect.x(), quad_vertex_rect.y(), 0.0f},
-        {0.0f, 0.0f},
-        i * 4.0f + 1.0f};
-    GeometryBindingVertex v2 = {
-        {quad_vertex_rect.right(), quad_vertex_rect.y(), 0.0f},
-        {1.0f, 0.0f},
-        i * 4.0f + 2.0f};
-    GeometryBindingVertex v3 = {
-        {quad_vertex_rect.right(), quad_vertex_rect.bottom(), 0.0f},
-        {1.0f, 1.0f},
-        i * 4.0f + 3.0f};
-    GeometryBindingQuad x(v0, v1, v2, v3);
-    quads[i] = x;
-    GeometryBindingQuadIndex y(
-        static_cast<uint16_t>(0 + 4 * i), static_cast<uint16_t>(1 + 4 * i),
-        static_cast<uint16_t>(2 + 4 * i), static_cast<uint16_t>(3 + 4 * i),
-        static_cast<uint16_t>(0 + 4 * i), static_cast<uint16_t>(2 + 4 * i));
-    quad_indices[i] = y;
-  }
-
-  gl_->GenBuffers(1, &quad_vertices_vbo_);
-  gl_->GenBuffers(1, &quad_elements_vbo_);
-
-  gl_->BindBuffer(GL_ARRAY_BUFFER, quad_vertices_vbo_);
-  gl_->BufferData(GL_ARRAY_BUFFER, sizeof(GeometryBindingQuad) * NUM_QUADS,
-                  quads, GL_STATIC_DRAW);
-
-  gl_->BindBuffer(GL_ELEMENT_ARRAY_BUFFER, quad_elements_vbo_);
-  gl_->BufferData(GL_ELEMENT_ARRAY_BUFFER,
-                  sizeof(GeometryBindingQuadIndex) * NUM_QUADS, &quad_indices,
-                  GL_STATIC_DRAW);
-}
-
-StaticGeometryBinding::~StaticGeometryBinding() {
-  gl_->DeleteBuffers(1, &quad_vertices_vbo_);
-  gl_->DeleteBuffers(1, &quad_elements_vbo_);
-}
-
-void StaticGeometryBinding::PrepareForDraw() {
-  SetupGLContext(gl_, quad_elements_vbo_, quad_vertices_vbo_);
-}
-
-}  // namespace viz
diff --git a/components/viz/service/display/static_geometry_binding.h b/components/viz/service/display/static_geometry_binding.h
deleted file mode 100644
index 2a09459..0000000
--- a/components/viz/service/display/static_geometry_binding.h
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright 2015 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 COMPONENTS_VIZ_SERVICE_DISPLAY_STATIC_GEOMETRY_BINDING_H_
-#define COMPONENTS_VIZ_SERVICE_DISPLAY_STATIC_GEOMETRY_BINDING_H_
-
-#include "base/memory/raw_ptr.h"
-#include "components/viz/service/display/geometry_binding.h"
-#include "components/viz/service/viz_service_export.h"
-
-using gpu::gles2::GLES2Interface;
-
-namespace viz {
-
-class VIZ_SERVICE_EXPORT StaticGeometryBinding {
- public:
-  StaticGeometryBinding(gpu::gles2::GLES2Interface* gl,
-                        const gfx::RectF& quad_vertex_rect);
-
-  StaticGeometryBinding(const StaticGeometryBinding&) = delete;
-  StaticGeometryBinding& operator=(const StaticGeometryBinding&) = delete;
-
-  ~StaticGeometryBinding();
-
-  void PrepareForDraw();
-
-  enum {
-    NUM_QUADS = 9,
-  };
-
- private:
-  raw_ptr<gpu::gles2::GLES2Interface> gl_;
-
-  GLuint quad_vertices_vbo_;
-  GLuint quad_elements_vbo_;
-};
-
-}  // namespace viz
-
-#endif  // COMPONENTS_VIZ_SERVICE_DISPLAY_STATIC_GEOMETRY_BINDING_H_
diff --git a/components/viz/service/display/sync_query_collection.cc b/components/viz/service/display/sync_query_collection.cc
deleted file mode 100644
index 51a85c4..0000000
--- a/components/viz/service/display/sync_query_collection.cc
+++ /dev/null
@@ -1,151 +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 "components/viz/service/display/sync_query_collection.h"
-
-#include <utility>
-
-#include "base/logging.h"
-#include "base/memory/raw_ptr.h"
-#include "base/memory/weak_ptr.h"
-#include "cc/base/container_util.h"
-#include "components/viz/service/display/resource_fence.h"
-#include "gpu/GLES2/gl2extchromium.h"
-#include "gpu/command_buffer/client/gles2_interface.h"
-
-namespace viz {
-namespace {
-// Block or crash if the number of pending sync queries reach this high as
-// something is seriously wrong on the service side if this happens.
-const size_t kMaxPendingSyncQueries = 16;
-}  // anonymous namespace
-
-class SyncQuery {
- public:
-  explicit SyncQuery(gpu::gles2::GLES2Interface* gl)
-      : gl_(gl), query_id_(0u), is_pending_(false) {
-    gl_->GenQueriesEXT(1, &query_id_);
-  }
-
-  SyncQuery(const SyncQuery&) = delete;
-  SyncQuery& operator=(const SyncQuery&) = delete;
-
-  virtual ~SyncQuery() { gl_->DeleteQueriesEXT(1, &query_id_); }
-
-  scoped_refptr<ResourceFence> Begin() {
-    DCHECK(!IsPending());
-    // Invalidate weak pointer held by old fence.
-    weak_ptr_factory_.InvalidateWeakPtrs();
-    // Note: In case the set of drawing commands issued before End() do not
-    // depend on the query, defer BeginQueryEXT call until Set() is called and
-    // query is required.
-    return base::MakeRefCounted<Fence>(weak_ptr_factory_.GetWeakPtr());
-  }
-
-  void Set() {
-    if (is_pending_)
-      return;
-
-    // Note: BeginQueryEXT on GL_COMMANDS_COMPLETED_CHROMIUM is effectively a
-    // noop relative to GL, so it doesn't matter where it happens but we still
-    // make sure to issue this command when Set() is called (prior to issuing
-    // any drawing commands that depend on query), in case some future extension
-    // can take advantage of this.
-    gl_->BeginQueryEXT(GL_COMMANDS_COMPLETED_CHROMIUM, query_id_);
-    is_pending_ = true;
-  }
-
-  void End() {
-    if (!is_pending_)
-      return;
-
-    gl_->EndQueryEXT(GL_COMMANDS_COMPLETED_CHROMIUM);
-  }
-
-  bool IsPending() {
-    if (!is_pending_)
-      return false;
-
-    unsigned result_available = 1;
-    gl_->GetQueryObjectuivEXT(query_id_, GL_QUERY_RESULT_AVAILABLE_EXT,
-                              &result_available);
-    is_pending_ = !result_available;
-    return is_pending_;
-  }
-
-  void Wait() {
-    if (!is_pending_)
-      return;
-
-    unsigned result = 0;
-    gl_->GetQueryObjectuivEXT(query_id_, GL_QUERY_RESULT_EXT, &result);
-    is_pending_ = false;
-  }
-
- private:
-  class Fence : public ResourceFence {
-   public:
-    explicit Fence(base::WeakPtr<SyncQuery> query) : query_(query) {}
-
-    Fence(const Fence&) = delete;
-    Fence& operator=(const Fence&) = delete;
-
-    // ResourceFence implementation.
-    void Set() override {
-      DCHECK(query_);
-      query_->Set();
-    }
-    bool HasPassed() override { return !query_ || !query_->IsPending(); }
-
-   private:
-    ~Fence() override {}
-
-    base::WeakPtr<SyncQuery> query_;
-  };
-
-  raw_ptr<gpu::gles2::GLES2Interface> gl_;
-  unsigned query_id_;
-  bool is_pending_;
-  base::WeakPtrFactory<SyncQuery> weak_ptr_factory_{this};
-};
-
-SyncQueryCollection::SyncQueryCollection(gpu::gles2::GLES2Interface* gl)
-    : gl_(gl) {}
-
-SyncQueryCollection::~SyncQueryCollection() = default;
-SyncQueryCollection::SyncQueryCollection(SyncQueryCollection&&) = default;
-SyncQueryCollection& SyncQueryCollection::operator=(SyncQueryCollection&&) =
-    default;
-
-scoped_refptr<ResourceFence> SyncQueryCollection::StartNewFrame() {
-  // Block until oldest sync query has passed if the number of pending queries
-  // ever reach kMaxPendingSyncQueries.
-  if (pending_sync_queries_.size() >= kMaxPendingSyncQueries) {
-    LOG(ERROR) << "Reached limit of pending sync queries.";
-
-    pending_sync_queries_.front()->Wait();
-    DCHECK(!pending_sync_queries_.front()->IsPending());
-  }
-
-  while (!pending_sync_queries_.empty()) {
-    if (pending_sync_queries_.front()->IsPending())
-      break;
-
-    available_sync_queries_.push_back(cc::PopFront(&pending_sync_queries_));
-  }
-
-  current_sync_query_ = available_sync_queries_.empty()
-                            ? std::make_unique<SyncQuery>(gl_)
-                            : cc::PopFront(&available_sync_queries_);
-
-  return current_sync_query_->Begin();
-}
-
-void SyncQueryCollection::EndCurrentFrame() {
-  DCHECK(current_sync_query_);
-  current_sync_query_->End();
-  pending_sync_queries_.push_back(std::move(current_sync_query_));
-}
-
-}  // namespace viz
diff --git a/components/viz/service/display/sync_query_collection.h b/components/viz/service/display/sync_query_collection.h
deleted file mode 100644
index fd09cbb..0000000
--- a/components/viz/service/display/sync_query_collection.h
+++ /dev/null
@@ -1,42 +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 COMPONENTS_VIZ_SERVICE_DISPLAY_SYNC_QUERY_COLLECTION_H_
-#define COMPONENTS_VIZ_SERVICE_DISPLAY_SYNC_QUERY_COLLECTION_H_
-
-#include <memory>
-
-#include "base/containers/circular_deque.h"
-#include "base/memory/raw_ptr.h"
-#include "base/memory/ref_counted.h"
-
-namespace gpu {
-namespace gles2 {
-class GLES2Interface;
-}
-}  // namespace gpu
-
-namespace viz {
-class SyncQuery;
-class ResourceFence;
-
-class SyncQueryCollection {
- public:
-  explicit SyncQueryCollection(gpu::gles2::GLES2Interface* gl);
-  SyncQueryCollection(SyncQueryCollection&&);
-  SyncQueryCollection& operator=(SyncQueryCollection&&);
-  ~SyncQueryCollection();
-  scoped_refptr<ResourceFence> StartNewFrame();
-  void EndCurrentFrame();
-
- private:
-  base::circular_deque<std::unique_ptr<SyncQuery>> pending_sync_queries_;
-  base::circular_deque<std::unique_ptr<SyncQuery>> available_sync_queries_;
-  std::unique_ptr<SyncQuery> current_sync_query_;
-  raw_ptr<gpu::gles2::GLES2Interface> gl_;
-};
-
-}  // namespace viz
-
-#endif  // COMPONENTS_VIZ_SERVICE_DISPLAY_SYNC_QUERY_COLLECTION_H_
diff --git a/components/viz/service/display/texture_deleter.cc b/components/viz/service/display/texture_deleter.cc
deleted file mode 100644
index 76e2cf0b0..0000000
--- a/components/viz/service/display/texture_deleter.cc
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright 2013 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 "components/viz/service/display/texture_deleter.h"
-
-#include <stddef.h>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/location.h"
-#include "base/memory/weak_ptr.h"
-#include "base/task/bind_post_task.h"
-#include "base/task/single_thread_task_runner.h"
-#include "components/viz/common/gpu/context_provider.h"
-#include "gpu/command_buffer/client/shared_image_interface.h"
-#include "gpu/command_buffer/common/mailbox.h"
-#include "gpu/command_buffer/common/sync_token.h"
-
-namespace viz {
-
-static void DeleteTextureOnImplThread(
-    const scoped_refptr<ContextProvider>& context_provider,
-    const gpu::Mailbox& mailbox,
-    const gpu::SyncToken& sync_token,
-    bool is_lost) {
-  context_provider->SharedImageInterface()->DestroySharedImage(sync_token,
-                                                               mailbox);
-}
-
-TextureDeleter::TextureDeleter(
-    scoped_refptr<base::SingleThreadTaskRunner> task_runner)
-    : impl_task_runner_(std::move(task_runner)) {}
-
-TextureDeleter::~TextureDeleter() {
-  for (auto& callback : impl_callbacks_)
-    std::move(*callback).Run(gpu::SyncToken(), /*is_lost=*/true);
-}
-
-ReleaseCallback TextureDeleter::GetReleaseCallback(
-    scoped_refptr<ContextProvider> context_provider,
-    const gpu::Mailbox& mailbox) {
-  // This callback owns the |context_provider|. It must be destroyed on the impl
-  // thread. Upon destruction of this class, the callback must immediately be
-  // destroyed.
-  auto impl_callback = std::make_unique<ReleaseCallback>(base::BindOnce(
-      &DeleteTextureOnImplThread, std::move(context_provider), mailbox));
-
-  impl_callbacks_.push_back(std::move(impl_callback));
-
-  // The raw pointer to the impl-side callback is valid as long as this
-  // class is alive. So we guard it with a WeakPtr.
-  ReleaseCallback run_impl_callback = base::BindOnce(
-      &TextureDeleter::RunDeleteTextureOnImplThread,
-      weak_ptr_factory_.GetWeakPtr(), impl_callbacks_.back().get());
-
-  // Provide a callback for the main thread that posts back to the impl
-  // thread.
-  ReleaseCallback main_callback;
-  if (impl_task_runner_) {
-    main_callback =
-        base::BindPostTask(impl_task_runner_, std::move(run_impl_callback));
-  } else {
-    main_callback = std::move(run_impl_callback);
-  }
-
-  return main_callback;
-}
-
-void TextureDeleter::RunDeleteTextureOnImplThread(
-    ReleaseCallback* impl_callback,
-    const gpu::SyncToken& sync_token,
-    bool is_lost) {
-  for (size_t i = 0; i < impl_callbacks_.size(); ++i) {
-    if (impl_callbacks_[i].get() == impl_callback) {
-      // Run the callback, then destroy it here on the impl thread.
-      std::move(*impl_callbacks_[i]).Run(sync_token, is_lost);
-      impl_callbacks_.erase(impl_callbacks_.begin() + i);
-      return;
-    }
-  }
-
-  NOTREACHED() << "The Callback returned by GetDeleteCallback() was called "
-               << "more than once.";
-}
-
-}  // namespace viz
diff --git a/components/viz/service/display/texture_deleter.h b/components/viz/service/display/texture_deleter.h
deleted file mode 100644
index eadcd3d..0000000
--- a/components/viz/service/display/texture_deleter.h
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright 2013 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 COMPONENTS_VIZ_SERVICE_DISPLAY_TEXTURE_DELETER_H_
-#define COMPONENTS_VIZ_SERVICE_DISPLAY_TEXTURE_DELETER_H_
-
-#include <memory>
-#include <vector>
-
-#include "base/memory/weak_ptr.h"
-#include "components/viz/common/resources/release_callback.h"
-#include "components/viz/service/viz_service_export.h"
-
-namespace base {
-class SingleThreadTaskRunner;
-}
-
-namespace gpu {
-struct Mailbox;
-struct SyncToken;
-}
-
-namespace viz {
-class ContextProvider;
-
-class VIZ_SERVICE_EXPORT TextureDeleter {
- public:
-  // task_runner corresponds with the thread the delete task should be posted
-  // to. If null, the delete will happen on the calling thread.
-  explicit TextureDeleter(
-      scoped_refptr<base::SingleThreadTaskRunner> task_runner);
-
-  TextureDeleter(const TextureDeleter&) = delete;
-  TextureDeleter& operator=(const TextureDeleter&) = delete;
-
-  ~TextureDeleter();
-
-  // Returns a Callback that can be used as the ReleaseCallback for a
-  // |texture_id|. The ReleaseCallback can be passed to other threads and will
-  // destroy the texture, once it is run, on the impl thread. If the
-  // TextureDeleter is destroyed due to the compositor shutting down, then the
-  // ReleaseCallback will become a no-op and the texture will be deleted
-  // immediately on the impl thread, along with dropping the reference to the
-  // ContextProvider.
-  ReleaseCallback GetReleaseCallback(
-      scoped_refptr<ContextProvider> context_provider,
-      const gpu::Mailbox& mailbox);
-
- private:
-  // Runs the |impl_callback| to delete the texture and removes the callback
-  // from the |impl_callbacks_| list.
-  void RunDeleteTextureOnImplThread(ReleaseCallback* impl_callback,
-                                    const gpu::SyncToken& sync_token,
-                                    bool is_lost);
-
-  scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner_;
-  std::vector<std::unique_ptr<ReleaseCallback>> impl_callbacks_;
-  base::WeakPtrFactory<TextureDeleter> weak_ptr_factory_{this};
-};
-
-}  // namespace viz
-
-#endif  // COMPONENTS_VIZ_SERVICE_DISPLAY_TEXTURE_DELETER_H_
diff --git a/components/viz/service/display/texture_deleter_unittest.cc b/components/viz/service/display/texture_deleter_unittest.cc
deleted file mode 100644
index e1df082..0000000
--- a/components/viz/service/display/texture_deleter_unittest.cc
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright 2013 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 "components/viz/service/display/texture_deleter.h"
-
-#include <utility>
-
-#include "base/task/single_thread_task_runner.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "components/viz/common/resources/release_callback.h"
-#include "components/viz/test/test_context_provider.h"
-#include "gpu/command_buffer/client/shared_image_interface.h"
-#include "gpu/command_buffer/common/shared_image_usage.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/gfx/color_space.h"
-
-namespace viz {
-namespace {
-
-TEST(TextureDeleterTest, Destroy) {
-  auto deleter =
-      std::make_unique<TextureDeleter>(base::ThreadTaskRunnerHandle::Get());
-
-  scoped_refptr<TestContextProvider> context_provider =
-      TestContextProvider::Create();
-  context_provider->BindToCurrentThread();
-
-  auto* sii = context_provider->SharedImageInterface();
-
-  gpu::Mailbox mailbox = sii->CreateSharedImage(
-      ResourceFormat::RGBA_8888, gfx::Size(1, 1), gfx::ColorSpace(),
-      kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType,
-      gpu::SHARED_IMAGE_USAGE_GLES2, gpu::kNullSurfaceHandle);
-
-  EXPECT_TRUE(context_provider->HasOneRef());
-  EXPECT_EQ(1u, sii->shared_image_count());
-
-  ReleaseCallback cb = deleter->GetReleaseCallback(context_provider, mailbox);
-  EXPECT_FALSE(context_provider->HasOneRef());
-  EXPECT_EQ(1u, sii->shared_image_count());
-
-  // When the deleter is destroyed, it immediately drops its ref on the
-  // ContextProvider, and deletes the shared image.
-  deleter = nullptr;
-  EXPECT_TRUE(context_provider->HasOneRef());
-  EXPECT_EQ(0u, sii->shared_image_count());
-
-  // Run the scoped release callback before destroying it, but it won't do
-  // anything.
-  std::move(cb).Run(gpu::SyncToken(), false);
-}
-
-TEST(TextureDeleterTest, NullTaskRunner) {
-  auto deleter = std::make_unique<TextureDeleter>(nullptr);
-
-  scoped_refptr<TestContextProvider> context_provider =
-      TestContextProvider::Create();
-  context_provider->BindToCurrentThread();
-
-  auto* sii = context_provider->SharedImageInterface();
-
-  gpu::Mailbox mailbox = sii->CreateSharedImage(
-      ResourceFormat::RGBA_8888, gfx::Size(1, 1), gfx::ColorSpace(),
-      kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType,
-      gpu::SHARED_IMAGE_USAGE_GLES2, gpu::kNullSurfaceHandle);
-
-  EXPECT_TRUE(context_provider->HasOneRef());
-  EXPECT_EQ(1u, sii->shared_image_count());
-
-  ReleaseCallback cb = deleter->GetReleaseCallback(context_provider, mailbox);
-  EXPECT_FALSE(context_provider->HasOneRef());
-  EXPECT_EQ(1u, sii->shared_image_count());
-
-  std::move(cb).Run(gpu::SyncToken(), false);
-
-  // With no task runner the callback will immediately drops its ref on the
-  // ContextProvider and delete the shared image.
-  EXPECT_TRUE(context_provider->HasOneRef());
-  EXPECT_EQ(0u, sii->shared_image_count());
-}
-
-}  // namespace
-}  // namespace viz
diff --git a/components/viz/service/display_embedder/DEPS b/components/viz/service/display_embedder/DEPS
index 4988c8b2..6f48eb9 100644
--- a/components/viz/service/display_embedder/DEPS
+++ b/components/viz/service/display_embedder/DEPS
@@ -45,14 +45,12 @@
   "+ui/ozone/public",
 
   # TODO(danakj): Double check the layering for these dependencies.
-  "+components/viz/service/display/gl_renderer_copier.h",
   "+components/viz/service/display/overlay_processor.h",
   "+components/viz/service/display/overlay_processor_interface.h",
   "+components/viz/service/display/overlay_strategy_fullscreen.h",
   "+components/viz/service/display/overlay_strategy_single_on_top.h",
   "+components/viz/service/display/overlay_strategy_underlay_cast.h",
   "+components/viz/service/display/overlay_strategy_underlay.h",
-  "+components/viz/service/display/texture_deleter.h",
 ]
 
 specific_include_rules = {
diff --git a/components/viz/service/display_embedder/gl_output_surface.cc b/components/viz/service/display_embedder/gl_output_surface.cc
deleted file mode 100644
index 7e496db..0000000
--- a/components/viz/service/display_embedder/gl_output_surface.cc
+++ /dev/null
@@ -1,262 +0,0 @@
-// Copyright 2014 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 "components/viz/service/display_embedder/gl_output_surface.h"
-
-#include <utility>
-#include <vector>
-
-#include "base/bind.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "cc/base/math_util.h"
-#include "components/viz/common/frame_sinks/begin_frame_source.h"
-#include "components/viz/common/gpu/context_provider.h"
-#include "components/viz/service/display/output_surface_client.h"
-#include "components/viz/service/display/output_surface_frame.h"
-#include "components/viz/service/display/renderer_utils.h"
-#include "gpu/command_buffer/client/context_support.h"
-#include "gpu/command_buffer/client/gles2_interface.h"
-#include "gpu/command_buffer/common/swap_buffers_complete_params.h"
-#include "gpu/command_buffer/common/swap_buffers_flags.h"
-#include "gpu/config/gpu_feature_info.h"
-#include "ui/gfx/buffer_format_util.h"
-#include "ui/gfx/overlay_transform_utils.h"
-
-namespace viz {
-
-GLOutputSurface::GLOutputSurface(
-    scoped_refptr<VizProcessContextProvider> context_provider,
-    gpu::SurfaceHandle surface_handle)
-    : OutputSurface(context_provider),
-      viz_context_provider_(context_provider),
-      surface_handle_(surface_handle),
-      use_gpu_fence_(
-          context_provider->ContextCapabilities().chromium_gpu_fence &&
-          context_provider->ContextCapabilities()
-              .use_gpu_fences_for_overlay_planes) {
-  const auto& context_capabilities = context_provider->ContextCapabilities();
-  capabilities_.output_surface_origin = context_capabilities.surface_origin;
-  capabilities_.supports_stencil = context_capabilities.num_stencil_bits > 0;
-  // Since one of the buffers is used by the surface for presentation, there can
-  // be at most |num_surface_buffers - 1| pending buffers that the compositor
-  // can use.
-  capabilities_.pending_swap_params.max_pending_swaps =
-      context_capabilities.num_surface_buffers - 1;
-  capabilities_.supports_gpu_vsync = context_capabilities.gpu_vsync;
-  capabilities_.supports_dc_layers = context_capabilities.dc_layers;
-  capabilities_.supports_surfaceless = context_capabilities.surfaceless;
-  capabilities_.android_surface_control_feature_enabled =
-      context_provider->GetGpuFeatureInfo()
-          .status_values[gpu::GPU_FEATURE_TYPE_ANDROID_SURFACE_CONTROL] ==
-      gpu::kGpuFeatureStatusEnabled;
-  capabilities_.max_render_target_size = context_capabilities.max_texture_size;
-}
-
-GLOutputSurface::~GLOutputSurface() {
-  viz_context_provider_->SetUpdateVSyncParametersCallback(
-      UpdateVSyncParametersCallback());
-  viz_context_provider_->SetGpuVSyncCallback(GpuVSyncCallback());
-  if (gpu_fence_id_ > 0)
-    context_provider()->ContextGL()->DestroyGpuFenceCHROMIUM(gpu_fence_id_);
-}
-
-void GLOutputSurface::BindToClient(OutputSurfaceClient* client) {
-  DCHECK(client);
-  DCHECK(!client_);
-  client_ = client;
-}
-
-void GLOutputSurface::EnsureBackbuffer() {}
-
-void GLOutputSurface::DiscardBackbuffer() {
-  context_provider()->ContextGL()->DiscardBackbufferCHROMIUM();
-}
-
-void GLOutputSurface::BindFramebuffer() {
-  context_provider()->ContextGL()->BindFramebuffer(GL_FRAMEBUFFER, 0);
-}
-
-void GLOutputSurface::SetDrawRectangle(const gfx::Rect& rect) {
-  DCHECK(capabilities_.supports_dc_layers);
-
-  if (set_draw_rectangle_for_frame_)
-    return;
-  DCHECK(gfx::Rect(size_).Contains(rect));
-  DCHECK(has_set_draw_rectangle_since_last_resize_ ||
-         (gfx::Rect(size_) == rect));
-  set_draw_rectangle_for_frame_ = true;
-  has_set_draw_rectangle_since_last_resize_ = true;
-  context_provider()->ContextGL()->SetDrawRectangleCHROMIUM(
-      rect.x(), rect.y(), rect.width(), rect.height());
-}
-
-void GLOutputSurface::SetEnableDCLayers(bool enable) {
-  DCHECK(capabilities_.supports_dc_layers);
-  context_provider()->ContextGL()->SetEnableDCLayersCHROMIUM(enable);
-}
-
-void GLOutputSurface::Reshape(const ReshapeParams& params) {
-  size_ = params.size;
-  has_set_draw_rectangle_since_last_resize_ = false;
-  set_draw_rectangle_for_frame_ = false;
-  context_provider()->ContextGL()->ResizeCHROMIUM(
-      size_.width(), size_.height(), params.device_scale_factor,
-      params.color_space.AsGLColorSpace(),
-      gfx::AlphaBitsForBufferFormat(params.format));
-}
-
-void GLOutputSurface::SwapBuffers(OutputSurfaceFrame frame) {
-  DCHECK(context_provider_);
-
-  uint32_t flags = 0;
-  if (wants_vsync_parameter_updates_)
-    flags |= gpu::SwapBuffersFlags::kVSyncParams;
-
-  // The |swap_size| here should always be in the UI's logical screen space
-  // since it is forwarded to the client code which is unaware of the display
-  // transform optimization.
-  gfx::Size swap_size = ApplyDisplayInverse(gfx::Rect(size_)).size();
-  auto swap_callback = base::BindOnce(
-      &GLOutputSurface::OnGpuSwapBuffersCompleted,
-      weak_ptr_factory_.GetWeakPtr(), std::move(frame.latency_info),
-      frame.top_controls_visible_height_changed, swap_size);
-  gpu::ContextSupport::PresentationCallback presentation_callback;
-  presentation_callback = base::BindOnce(&GLOutputSurface::OnPresentation,
-                                         weak_ptr_factory_.GetWeakPtr());
-
-  set_draw_rectangle_for_frame_ = false;
-  if (frame.sub_buffer_rect) {
-    HandlePartialSwap(*frame.sub_buffer_rect, flags, std::move(swap_callback),
-                      std::move(presentation_callback));
-  } else if (!frame.content_bounds.empty()) {
-    context_provider_->ContextSupport()->SwapWithBounds(
-        frame.content_bounds, flags, std::move(swap_callback),
-        std::move(presentation_callback));
-  } else {
-    context_provider_->ContextSupport()->Swap(flags, std::move(swap_callback),
-                                              std::move(presentation_callback));
-  }
-}
-
-uint32_t GLOutputSurface::GetFramebufferCopyTextureFormat() {
-  auto* gl = static_cast<VizProcessContextProvider*>(context_provider());
-  return gl->GetCopyTextureInternalFormat();
-}
-
-bool GLOutputSurface::IsDisplayedAsOverlayPlane() const {
-  return false;
-}
-
-unsigned GLOutputSurface::GetOverlayTextureId() const {
-  return 0;
-}
-
-bool GLOutputSurface::HasExternalStencilTest() const {
-  return false;
-}
-
-void GLOutputSurface::ApplyExternalStencil() {}
-
-void GLOutputSurface::DidReceiveSwapBuffersAck(
-    const gfx::SwapResponse& response,
-    gfx::GpuFenceHandle release_fence) {
-  client_->DidReceiveSwapBuffersAck(response.timings, std::move(release_fence));
-}
-
-void GLOutputSurface::HandlePartialSwap(
-    const gfx::Rect& sub_buffer_rect,
-    uint32_t flags,
-    gpu::ContextSupport::SwapCompletedCallback swap_callback,
-    gpu::ContextSupport::PresentationCallback presentation_callback) {
-  context_provider_->ContextSupport()->PartialSwapBuffers(
-      sub_buffer_rect, flags, std::move(swap_callback),
-      std::move(presentation_callback));
-}
-
-void GLOutputSurface::OnGpuSwapBuffersCompleted(
-    std::vector<ui::LatencyInfo> latency_info,
-    bool top_controls_visible_height_changed,
-    const gfx::Size& pixel_size,
-    const gpu::SwapBuffersCompleteParams& params,
-    gfx::GpuFenceHandle release_fence) {
-  if (!params.texture_in_use_responses.empty())
-    client_->DidReceiveTextureInUseResponses(params.texture_in_use_responses);
-  if (!params.ca_layer_params.is_empty)
-    client_->DidReceiveCALayerParams(params.ca_layer_params);
-  DidReceiveSwapBuffersAck(params.swap_response, std::move(release_fence));
-
-  UpdateLatencyInfoOnSwap(params.swap_response, &latency_info);
-  latency_tracker_.OnGpuSwapBuffersCompleted(
-      std::move(latency_info), top_controls_visible_height_changed);
-
-  if (needs_swap_size_notifications_)
-    client_->DidSwapWithSize(pixel_size);
-}
-
-void GLOutputSurface::OnPresentation(
-    const gfx::PresentationFeedback& feedback) {
-  client_->DidReceivePresentationFeedback(feedback);
-}
-
-unsigned GLOutputSurface::UpdateGpuFence() {
-  if (!use_gpu_fence_)
-    return 0;
-
-  if (gpu_fence_id_ > 0)
-    context_provider()->ContextGL()->DestroyGpuFenceCHROMIUM(gpu_fence_id_);
-
-  gpu_fence_id_ = context_provider()->ContextGL()->CreateGpuFenceCHROMIUM();
-
-  return gpu_fence_id_;
-}
-
-void GLOutputSurface::SetNeedsSwapSizeNotifications(
-    bool needs_swap_size_notifications) {
-  needs_swap_size_notifications_ = needs_swap_size_notifications;
-}
-
-void GLOutputSurface::SetUpdateVSyncParametersCallback(
-    UpdateVSyncParametersCallback callback) {
-  wants_vsync_parameter_updates_ = !callback.is_null();
-  viz_context_provider_->SetUpdateVSyncParametersCallback(std::move(callback));
-}
-
-void GLOutputSurface::SetGpuVSyncCallback(GpuVSyncCallback callback) {
-  DCHECK(capabilities_.supports_gpu_vsync);
-  viz_context_provider_->SetGpuVSyncCallback(std::move(callback));
-}
-
-void GLOutputSurface::SetGpuVSyncEnabled(bool enabled) {
-  DCHECK(capabilities_.supports_gpu_vsync);
-  viz_context_provider_->SetGpuVSyncEnabled(enabled);
-}
-
-gfx::OverlayTransform GLOutputSurface::GetDisplayTransform() {
-  return gfx::OVERLAY_TRANSFORM_NONE;
-}
-
-gfx::Rect GLOutputSurface::ApplyDisplayInverse(const gfx::Rect& input) {
-  gfx::Transform display_inverse = gfx::OverlayTransformToTransform(
-      gfx::InvertOverlayTransform(GetDisplayTransform()), gfx::SizeF(size_));
-  return cc::MathUtil::MapEnclosedRectWith2dAxisAlignedTransform(
-      display_inverse, input);
-}
-
-base::ScopedClosureRunner GLOutputSurface::GetCacheBackBufferCb() {
-  return viz_context_provider_->GetCacheBackBufferCb();
-}
-
-gpu::SurfaceHandle GLOutputSurface::GetSurfaceHandle() const {
-  return surface_handle_;
-}
-
-void GLOutputSurface::SetFrameRate(float frame_rate) {
-  viz_context_provider_->ContextSupport()->SetFrameRate(frame_rate);
-}
-
-void GLOutputSurface::SetNeedsMeasureNextDrawLatency() {
-  viz_context_provider_->SetNeedsMeasureNextDrawLatency();
-}
-
-}  // namespace viz
diff --git a/components/viz/service/display_embedder/gl_output_surface.h b/components/viz/service/display_embedder/gl_output_surface.h
deleted file mode 100644
index 89ed788..0000000
--- a/components/viz/service/display_embedder/gl_output_surface.h
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright 2014 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 COMPONENTS_VIZ_SERVICE_DISPLAY_EMBEDDER_GL_OUTPUT_SURFACE_H_
-#define COMPONENTS_VIZ_SERVICE_DISPLAY_EMBEDDER_GL_OUTPUT_SURFACE_H_
-
-#include <memory>
-#include <vector>
-
-#include "base/callback_helpers.h"
-#include "base/memory/raw_ptr.h"
-#include "components/viz/common/display/update_vsync_parameters_callback.h"
-#include "components/viz/service/display/output_surface.h"
-#include "components/viz/service/display_embedder/viz_process_context_provider.h"
-#include "gpu/command_buffer/client/context_support.h"
-#include "ui/latency/latency_tracker.h"
-
-namespace viz {
-
-// An OutputSurface implementation that directly draws and
-// swaps to an actual GL surface.
-class GLOutputSurface : public OutputSurface {
- public:
-  GLOutputSurface(scoped_refptr<VizProcessContextProvider> context_provider,
-                  gpu::SurfaceHandle surface_handle);
-  ~GLOutputSurface() override;
-
-  // OutputSurface implementation
-  void BindToClient(OutputSurfaceClient* client) override;
-  void EnsureBackbuffer() override;
-  void DiscardBackbuffer() override;
-  void BindFramebuffer() override;
-  void SetDrawRectangle(const gfx::Rect& draw_rectangle) override;
-  void SetEnableDCLayers(bool enabled) override;
-  void Reshape(const ReshapeParams& params) override;
-  void SwapBuffers(OutputSurfaceFrame frame) override;
-  uint32_t GetFramebufferCopyTextureFormat() override;
-  bool IsDisplayedAsOverlayPlane() const override;
-  unsigned GetOverlayTextureId() const override;
-  bool HasExternalStencilTest() const override;
-  void ApplyExternalStencil() override;
-  unsigned UpdateGpuFence() override;
-  void SetNeedsSwapSizeNotifications(
-      bool needs_swap_size_notifications) override;
-  void SetUpdateVSyncParametersCallback(
-      UpdateVSyncParametersCallback callback) override;
-  void SetGpuVSyncCallback(GpuVSyncCallback callback) override;
-  void SetGpuVSyncEnabled(bool enabled) override;
-  void SetDisplayTransformHint(gfx::OverlayTransform transform) override {}
-  gfx::OverlayTransform GetDisplayTransform() override;
-  base::ScopedClosureRunner GetCacheBackBufferCb() override;
-
-  gpu::SurfaceHandle GetSurfaceHandle() const override;
-  void SetFrameRate(float frame_rate) override;
-  void SetNeedsMeasureNextDrawLatency() override;
-
- protected:
-  OutputSurfaceClient* client() const { return client_; }
-  ui::LatencyTracker* latency_tracker() { return &latency_tracker_; }
-  bool needs_swap_size_notifications() {
-    return needs_swap_size_notifications_;
-  }
-
-  // Called when a swap completion is signaled from ImageTransportSurface.
-  virtual void DidReceiveSwapBuffersAck(const gfx::SwapResponse& response,
-                                        gfx::GpuFenceHandle release_fence);
-
-  // Called in SwapBuffers() when a swap is determined to be partial. Subclasses
-  // might override this method because different platforms handle partial swaps
-  // differently.
-  virtual void HandlePartialSwap(
-      const gfx::Rect& sub_buffer_rect,
-      uint32_t flags,
-      gpu::ContextSupport::SwapCompletedCallback swap_callback,
-      gpu::ContextSupport::PresentationCallback presentation_callback);
-
- private:
-  // Called when a swap completion is signaled from ImageTransportSurface.
-  void OnGpuSwapBuffersCompleted(std::vector<ui::LatencyInfo> latency_info,
-                                 bool top_controls_visible_height_changed,
-                                 const gfx::Size& pixel_size,
-                                 const gpu::SwapBuffersCompleteParams& params,
-                                 gfx::GpuFenceHandle release_fence);
-  void OnPresentation(const gfx::PresentationFeedback& feedback);
-  void OnGpuVSync(base::TimeTicks vsync_time, base::TimeDelta vsync_interval);
-  gfx::Rect ApplyDisplayInverse(const gfx::Rect& input);
-
-  scoped_refptr<VizProcessContextProvider> viz_context_provider_;
-  raw_ptr<OutputSurfaceClient> client_ = nullptr;
-  bool wants_vsync_parameter_updates_ = false;
-  ui::LatencyTracker latency_tracker_;
-
-  const gpu::SurfaceHandle surface_handle_;
-
-  bool set_draw_rectangle_for_frame_ = false;
-  // True if the draw rectangle has been set at all since the last resize.
-  bool has_set_draw_rectangle_since_last_resize_ = false;
-  gfx::Size size_;
-  bool use_gpu_fence_;
-  unsigned gpu_fence_id_ = 0;
-  // Whether to send OutputSurfaceClient::DidSwapWithSize notifications.
-  bool needs_swap_size_notifications_ = false;
-
-  base::WeakPtrFactory<GLOutputSurface> weak_ptr_factory_{this};
-};
-
-}  // namespace viz
-
-#endif  // COMPONENTS_VIZ_SERVICE_DISPLAY_EMBEDDER_GL_OUTPUT_SURFACE_H_
diff --git a/components/viz/service/display_embedder/gl_output_surface_android.cc b/components/viz/service/display_embedder/gl_output_surface_android.cc
deleted file mode 100644
index 741facb..0000000
--- a/components/viz/service/display_embedder/gl_output_surface_android.cc
+++ /dev/null
@@ -1,26 +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 "components/viz/service/display_embedder/gl_output_surface_android.h"
-
-namespace viz {
-
-GLOutputSurfaceAndroid::GLOutputSurfaceAndroid(
-    scoped_refptr<VizProcessContextProvider> context_provider,
-    gpu::SurfaceHandle surface_handle)
-    : GLOutputSurface(context_provider, surface_handle) {}
-
-GLOutputSurfaceAndroid::~GLOutputSurfaceAndroid() = default;
-
-void GLOutputSurfaceAndroid::HandlePartialSwap(
-    const gfx::Rect& sub_buffer_rect,
-    uint32_t flags,
-    gpu::ContextSupport::SwapCompletedCallback swap_callback,
-    gpu::ContextSupport::PresentationCallback presentation_callback) {
-  DCHECK(sub_buffer_rect.IsEmpty());
-  context_provider_->ContextSupport()->CommitOverlayPlanes(
-      flags, std::move(swap_callback), std::move(presentation_callback));
-}
-
-}  // namespace viz
diff --git a/components/viz/service/display_embedder/gl_output_surface_android.h b/components/viz/service/display_embedder/gl_output_surface_android.h
deleted file mode 100644
index 8ad4a43..0000000
--- a/components/viz/service/display_embedder/gl_output_surface_android.h
+++ /dev/null
@@ -1,32 +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 COMPONENTS_VIZ_SERVICE_DISPLAY_EMBEDDER_GL_OUTPUT_SURFACE_ANDROID_H_
-#define COMPONENTS_VIZ_SERVICE_DISPLAY_EMBEDDER_GL_OUTPUT_SURFACE_ANDROID_H_
-
-#include "components/viz/service/display_embedder/gl_output_surface.h"
-
-namespace viz {
-class GLOutputSurfaceAndroid : public GLOutputSurface {
- public:
-  GLOutputSurfaceAndroid(
-      scoped_refptr<VizProcessContextProvider> context_provider,
-      gpu::SurfaceHandle surface_handle);
-
-  GLOutputSurfaceAndroid(const GLOutputSurfaceAndroid&) = delete;
-  GLOutputSurfaceAndroid& operator=(const GLOutputSurfaceAndroid&) = delete;
-
-  ~GLOutputSurfaceAndroid() override;
-
-  // GLOutputSurface implementation:
-  void HandlePartialSwap(
-      const gfx::Rect& sub_buffer_rect,
-      uint32_t flags,
-      gpu::ContextSupport::SwapCompletedCallback swap_callback,
-      gpu::ContextSupport::PresentationCallback presentation_callback) override;
-};
-
-}  // namespace viz
-
-#endif  // COMPONENTS_VIZ_SERVICE_DISPLAY_EMBEDDER_GL_OUTPUT_SURFACE_ANDROID_H_
diff --git a/components/viz/service/display_embedder/gl_output_surface_buffer_queue.cc b/components/viz/service/display_embedder/gl_output_surface_buffer_queue.cc
deleted file mode 100644
index 12fe6d4..0000000
--- a/components/viz/service/display_embedder/gl_output_surface_buffer_queue.cc
+++ /dev/null
@@ -1,309 +0,0 @@
-// Copyright 2016 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 "components/viz/service/display_embedder/gl_output_surface_buffer_queue.h"
-
-#include <utility>
-
-#include "base/bind.h"
-#include "base/command_line.h"
-#include "base/logging.h"
-#include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
-#include "components/viz/common/frame_sinks/begin_frame_source.h"
-#include "components/viz/common/gpu/context_provider.h"
-#include "components/viz/common/switches.h"
-#include "components/viz/service/display/output_surface_client.h"
-#include "components/viz/service/display/output_surface_frame.h"
-#include "gpu/GLES2/gl2extchromium.h"
-#include "gpu/command_buffer/client/context_support.h"
-#include "gpu/command_buffer/client/gles2_interface.h"
-#include "gpu/command_buffer/common/gpu_memory_buffer_support.h"
-#include "gpu/command_buffer/common/sync_token.h"
-#include "ui/gl/buffer_format_utils.h"
-#include "ui/gl/gl_enums.h"
-#include "ui/gl/gl_fence.h"
-
-namespace viz {
-
-GLOutputSurfaceBufferQueue::GLOutputSurfaceBufferQueue(
-    scoped_refptr<VizProcessContextProvider> context_provider,
-    gpu::SurfaceHandle surface_handle,
-    std::unique_ptr<BufferQueue> buffer_queue)
-    : GLOutputSurface(context_provider, surface_handle),
-      buffer_queue_(std::move(buffer_queue)) {
-  capabilities_.only_invalidates_damage_rect = false;
-  capabilities_.uses_default_gl_framebuffer = false;
-  capabilities_.output_surface_origin = gfx::SurfaceOrigin::kTopLeft;
-  // Set |max_pending_swaps| to 2 for buffer_queue, which aligns scheduling
-  // more closely with the previous surfaced behavior.
-  // With a surface, swap buffer ack used to return early, before actually
-  // presenting the back buffer, enabling the browser compositor to run ahead.
-  // BufferQueue implementation acks at the time of actual buffer swap, which
-  // shifts the start of the new frame forward relative to the old
-  // implementation.
-  capabilities_.pending_swap_params.max_pending_swaps = 2;
-  // GetCurrentFramebufferDamage will return an upper bound of the part of the
-  // buffer that needs to be recomposited.
-#if BUILDFLAG(IS_APPLE)
-  capabilities_.supports_target_damage = false;
-#else
-  capabilities_.supports_target_damage = true;
-#endif
-  // Force the number of max pending frames to one when the switch
-  // "double-buffer-compositing" is passed.
-  // This will keep compositing in double buffered mode assuming |buffer_queue_|
-  // allocates at most one additional buffer.
-  base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
-  if (command_line->HasSwitch(switches::kDoubleBufferCompositing)) {
-    capabilities_.pending_swap_params.max_pending_swaps = 1;
-    buffer_queue_->SetMaxBuffers(2);
-  }
-
-  // It is safe to pass a raw pointer to *this because |buffer_queue_| is fully
-  // owned and it doesn't use the SyncTokenProvider after it's destroyed.
-  DCHECK(buffer_queue_);
-  buffer_queue_->SetSyncTokenProvider(this);
-  context_provider_->ContextGL()->GenFramebuffers(1, &fbo_);
-}
-
-GLOutputSurfaceBufferQueue::~GLOutputSurfaceBufferQueue() {
-  auto* gl = context_provider_->ContextGL();
-  DCHECK_NE(0u, fbo_);
-  gl->DeleteFramebuffers(1, &fbo_);
-  if (stencil_buffer_)
-    gl->DeleteRenderbuffers(1, &stencil_buffer_);
-  for (const auto& buffer_texture : buffer_queue_textures_)
-    gl->DeleteTextures(1u, &buffer_texture.second);
-  buffer_queue_textures_.clear();
-  current_texture_ = 0u;
-  last_bound_texture_ = 0u;
-  last_bound_mailbox_.SetZero();
-
-  // Freeing the BufferQueue here ensures that *this is fully alive in case the
-  // BufferQueue needs the SyncTokenProvider functionality.
-  buffer_queue_.reset();
-  fbo_ = 0u;
-  stencil_buffer_ = 0u;
-}
-
-void GLOutputSurfaceBufferQueue::BindFramebuffer() {
-  auto* gl = context_provider_->ContextGL();
-  gl->BindFramebuffer(GL_FRAMEBUFFER, fbo_);
-
-  // If we have a |current_texture_|, it means we haven't swapped the buffer, so
-  // we're just wanting to rebind the GL framebuffer.
-  if (current_texture_)
-    return;
-
-  DCHECK(buffer_queue_);
-  gpu::SyncToken creation_sync_token;
-  gfx::GpuFenceHandle release_fence;
-  const gpu::Mailbox current_buffer =
-      buffer_queue_->GetCurrentBuffer(&creation_sync_token, &release_fence);
-  if (current_buffer.IsZero())
-    return;
-  gl->WaitSyncTokenCHROMIUM(creation_sync_token.GetConstData());
-  if (!release_fence.is_null()) {
-    auto fence = gfx::GpuFence(std::move(release_fence));
-    if (gl::GLFence::IsGpuFenceSupported()) {
-      auto id = gl->CreateClientGpuFenceCHROMIUM(fence.AsClientGpuFence());
-      gl->WaitGpuFenceCHROMIUM(id);
-      gl->DestroyGpuFenceCHROMIUM(id);
-    } else {
-      fence.Wait();
-    }
-  }
-  unsigned& buffer_texture = buffer_queue_textures_[current_buffer];
-  if (!buffer_texture) {
-    buffer_texture =
-        gl->CreateAndTexStorage2DSharedImageCHROMIUM(current_buffer.name);
-  }
-  current_texture_ = buffer_texture;
-  gl->BeginSharedImageAccessDirectCHROMIUM(
-      current_texture_, GL_SHARED_IMAGE_ACCESS_MODE_READWRITE_CHROMIUM);
-  gl->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
-                           texture_target_, current_texture_, 0);
-  last_bound_texture_ = current_texture_;
-  last_bound_mailbox_ = current_buffer;
-
-#if DCHECK_IS_ON() && BUILDFLAG(IS_CHROMEOS_ASH)
-  const GLenum result = gl->CheckFramebufferStatus(GL_FRAMEBUFFER);
-  if (result != GL_FRAMEBUFFER_COMPLETE)
-    DLOG(ERROR) << " Incomplete fb: " << gl::GLEnums::GetStringError(result);
-#endif
-
-  // Reshape() must be called to go from using a stencil buffer to not using it.
-  DCHECK(use_stencil_ || !stencil_buffer_);
-  if (use_stencil_ && !stencil_buffer_) {
-    gl->GenRenderbuffers(1, &stencil_buffer_);
-    CHECK_NE(stencil_buffer_, 0u);
-    gl->BindRenderbuffer(GL_RENDERBUFFER, stencil_buffer_);
-    gl->RenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8,
-                            reshape_size_.width(), reshape_size_.height());
-    gl->BindRenderbuffer(GL_RENDERBUFFER, 0);
-    gl->FramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
-                                GL_RENDERBUFFER, stencil_buffer_);
-  }
-}
-
-// We call this on every frame that a value changes, but changing the size once
-// we've allocated backing NativePixmapBufferQueue instances will cause a DCHECK
-// because Chrome never Reshape(s) after the first one from (0,0). NB: this
-// implies that screen size changes need to be plumbed differently. In
-// particular, we must create the native window in the size that the hardware
-// reports.
-void GLOutputSurfaceBufferQueue::Reshape(const ReshapeParams& params) {
-  reshape_size_ = params.size;
-  use_stencil_ = params.use_stencil;
-  GLOutputSurface::Reshape(params);
-  DCHECK(buffer_queue_);
-  const bool may_have_freed_buffers =
-      buffer_queue_->Reshape(params.size, params.color_space, params.format);
-  if (may_have_freed_buffers || (stencil_buffer_ && !params.use_stencil)) {
-    auto* gl = context_provider_->ContextGL();
-    gl->BindFramebuffer(GL_FRAMEBUFFER, fbo_);
-    if (stencil_buffer_) {
-      gl->FramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
-                                  GL_RENDERBUFFER, 0);
-      gl->DeleteRenderbuffers(1, &stencil_buffer_);
-      stencil_buffer_ = 0u;
-    }
-
-    // Note that |texture_target_| is initially set to 0, and so if it has not
-    // been set to a valid value, then no buffers have been allocated.
-    if (texture_target_ && may_have_freed_buffers) {
-      gl->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
-                               texture_target_, 0, 0);
-      for (const auto& buffer_texture : buffer_queue_textures_)
-        gl->DeleteTextures(1u, &buffer_texture.second);
-      buffer_queue_textures_.clear();
-      current_texture_ = 0u;
-      last_bound_texture_ = 0u;
-      last_bound_mailbox_.SetZero();
-    }
-  }
-
-  texture_target_ =
-      gpu::GetBufferTextureTarget(gfx::BufferUsage::SCANOUT, params.format,
-                                  context_provider_->ContextCapabilities());
-}
-
-void GLOutputSurfaceBufferQueue::SwapBuffers(OutputSurfaceFrame frame) {
-  DCHECK(buffer_queue_);
-
-  // TODO(rjkroege): What if swap happens again before DidReceiveSwapBuffersAck
-  // then it would see the wrong size?
-  DCHECK(reshape_size_ == frame.size);
-  swap_size_ = reshape_size_;
-
-  gfx::Rect damage_rect =
-      frame.sub_buffer_rect ? *frame.sub_buffer_rect : gfx::Rect(swap_size_);
-
-  // If the client is currently drawing, we first end access to the
-  // corresponding shared image. Then, we can swap the buffers. That way, we
-  // know that whatever GL commands GLOutputSurface::SwapBuffers() emits can
-  // access the shared image.
-  auto* gl = context_provider_->ContextGL();
-  if (current_texture_) {
-    gl->EndSharedImageAccessDirectCHROMIUM(current_texture_);
-    gl->BindFramebuffer(GL_FRAMEBUFFER, 0u);
-    current_texture_ = 0u;
-  }
-  buffer_queue_->SwapBuffers(damage_rect);
-  GLOutputSurface::SwapBuffers(std::move(frame));
-}
-
-gfx::Rect GLOutputSurfaceBufferQueue::GetCurrentFramebufferDamage() const {
-  return buffer_queue_->CurrentBufferDamage();
-}
-
-uint32_t GLOutputSurfaceBufferQueue::GetFramebufferCopyTextureFormat() {
-  return base::strict_cast<GLenum>(
-      gl::BufferFormatToGLInternalFormat(buffer_queue_->buffer_format()));
-}
-
-bool GLOutputSurfaceBufferQueue::IsDisplayedAsOverlayPlane() const {
-  return true;
-}
-
-unsigned GLOutputSurfaceBufferQueue::GetOverlayTextureId() const {
-  DCHECK(last_bound_texture_);
-  return last_bound_texture_;
-}
-
-gpu::Mailbox GLOutputSurfaceBufferQueue::GetOverlayMailbox() const {
-  return last_bound_mailbox_;
-}
-
-void GLOutputSurfaceBufferQueue::DidReceiveSwapBuffersAck(
-    const gfx::SwapResponse& response,
-    gfx::GpuFenceHandle release_fence) {
-  bool force_swap = false;
-  if (response.result == gfx::SwapResult::SWAP_NAK_RECREATE_BUFFERS) {
-    // Even through the swap failed, this is a fixable error so we can pretend
-    // it succeeded to the rest of the system.
-    buffer_queue_->FreeAllSurfaces();
-
-    // TODO(andrescj): centralize the logic that deletes the stencil buffer and
-    // the textures since we do this in multiple places.
-    auto* gl = context_provider_->ContextGL();
-    gl->BindFramebuffer(GL_FRAMEBUFFER, fbo_);
-    if (stencil_buffer_) {
-      gl->FramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
-                                  GL_RENDERBUFFER, 0);
-      gl->DeleteRenderbuffers(1, &stencil_buffer_);
-      stencil_buffer_ = 0u;
-    }
-
-    // Reshape() must have been called before we got here, so |texture_target_|
-    // should contain a valid value.
-    DCHECK(texture_target_);
-    gl->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
-                             texture_target_, 0, 0);
-    for (const auto& buffer_texture : buffer_queue_textures_)
-      gl->DeleteTextures(1u, &buffer_texture.second);
-    buffer_queue_textures_.clear();
-    current_texture_ = 0u;
-    last_bound_texture_ = 0u;
-    last_bound_mailbox_.SetZero();
-
-    force_swap = true;
-  }
-
-  buffer_queue_->PageFlipComplete(release_fence.Clone());
-  client()->DidReceiveSwapBuffersAck(response.timings,
-                                     std::move(release_fence));
-
-  if (force_swap)
-    client()->SetNeedsRedrawRect(gfx::Rect(swap_size_));
-}
-
-gpu::SyncToken GLOutputSurfaceBufferQueue::GenSyncToken() {
-  // This should only be called as long as the BufferQueue is alive. We cannot
-  // use |buffer_queue_| to detect this because in the dtor, |buffer_queue_|
-  // becomes nullptr before BufferQueue's dtor is called, so GenSyncToken()
-  // would be called after |buffer_queue_| is nullptr when in fact, the
-  // BufferQueue is still alive. Hence, we use |fbo_| to detect that the
-  // BufferQueue is still alive.
-  DCHECK(fbo_);
-  gpu::SyncToken sync_token;
-  context_provider_->ContextGL()->GenUnverifiedSyncTokenCHROMIUM(
-      sync_token.GetData());
-  return sync_token;
-}
-
-void GLOutputSurfaceBufferQueue::SetDisplayTransformHint(
-    gfx::OverlayTransform transform) {
-  display_transform_ = transform;
-
-  if (context_provider_)
-    context_provider_->ContextSupport()->SetDisplayTransform(transform);
-}
-
-gfx::OverlayTransform GLOutputSurfaceBufferQueue::GetDisplayTransform() {
-  return display_transform_;
-}
-
-}  // namespace viz
diff --git a/components/viz/service/display_embedder/gl_output_surface_buffer_queue.h b/components/viz/service/display_embedder/gl_output_surface_buffer_queue.h
deleted file mode 100644
index 10f9309..0000000
--- a/components/viz/service/display_embedder/gl_output_surface_buffer_queue.h
+++ /dev/null
@@ -1,107 +0,0 @@
-// Copyright 2016 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 COMPONENTS_VIZ_SERVICE_DISPLAY_EMBEDDER_GL_OUTPUT_SURFACE_BUFFER_QUEUE_H_
-#define COMPONENTS_VIZ_SERVICE_DISPLAY_EMBEDDER_GL_OUTPUT_SURFACE_BUFFER_QUEUE_H_
-
-#include <stdint.h>
-
-#include <memory>
-
-#include "base/containers/flat_map.h"
-#include "base/gtest_prod_util.h"
-#include "base/memory/weak_ptr.h"
-#include "components/viz/common/gpu/context_provider.h"
-#include "components/viz/service/display/output_surface.h"
-#include "components/viz/service/display_embedder/buffer_queue.h"
-#include "components/viz/service/display_embedder/gl_output_surface.h"
-#include "components/viz/service/display_embedder/viz_process_context_provider.h"
-#include "components/viz/service/viz_service_export.h"
-#include "gpu/command_buffer/common/mailbox.h"
-#include "ui/gfx/geometry/rect.h"
-#include "ui/gfx/geometry/size.h"
-#include "ui/gfx/native_widget_types.h"
-#include "ui/gfx/swap_result.h"
-#include "ui/gl/gl_surface.h"
-
-namespace viz {
-
-// An OutputSurface implementation that directly draws and swap to a GL
-// "buffer_queue" surface (aka one backed by a buffer managed explicitly).
-class VIZ_SERVICE_EXPORT GLOutputSurfaceBufferQueue
-    : public GLOutputSurface,
-      public BufferQueue::SyncTokenProvider {
- public:
-  GLOutputSurfaceBufferQueue(
-      scoped_refptr<VizProcessContextProvider> context_provider,
-      gpu::SurfaceHandle surface_handle,
-      std::unique_ptr<BufferQueue> buffer_queue);
-
-  GLOutputSurfaceBufferQueue(const GLOutputSurfaceBufferQueue&) = delete;
-  GLOutputSurfaceBufferQueue& operator=(const GLOutputSurfaceBufferQueue&) =
-      delete;
-
-  ~GLOutputSurfaceBufferQueue() override;
-
-  // BufferQueue::SyncTokenProvider implementation.
-  gpu::SyncToken GenSyncToken() override;
-
- protected:
-  // OutputSurface implementation.
-  void SetDisplayTransformHint(gfx::OverlayTransform transform) override;
-  gfx::OverlayTransform GetDisplayTransform() override;
-  void Reshape(const ReshapeParams& params) override;
-
- private:
-  FRIEND_TEST_ALL_PREFIXES(GLOutputSurfaceBufferQueueTest, HandleSwapNAK);
-
-  // OutputSurface implementation.
-  void BindFramebuffer() override;
-  void SwapBuffers(OutputSurfaceFrame frame) override;
-  gfx::Rect GetCurrentFramebufferDamage() const override;
-  uint32_t GetFramebufferCopyTextureFormat() override;
-  bool IsDisplayedAsOverlayPlane() const override;
-  unsigned GetOverlayTextureId() const override;
-  gpu::Mailbox GetOverlayMailbox() const override;
-
-  // GLOutputSurface:
-  void DidReceiveSwapBuffersAck(const gfx::SwapResponse& response,
-                                gfx::GpuFenceHandle release_fence) override;
-
-  std::unique_ptr<BufferQueue> buffer_queue_;
-
-  // |buffer_queue_textures_| caches the textures generated by consuming the
-  // SharedImage mailboxes from the |buffer_queue_| so that we don't have to
-  // generate a new texture every time a shared image is re-used.
-  base::flat_map<gpu::Mailbox, unsigned> buffer_queue_textures_;
-
-  // |current_texture_| is the texture currently being drawn to. It's one of
-  // |buffer_queue_textures_| or 0 if the client is not currently drawing (i.e.,
-  // we're not currently in between a BindFramebuffer()/SwapBuffers() pair).
-  // |last_bound_texture_| is the texture that was last bound to |fbo_|. It's
-  // also one of |buffer_queue_textures_| or 0 if no texture has been bound to
-  // |fbo_| or all the buffers in the buffer queue have been freed.
-  // |last_bound_mailbox_| is the mailbox corresponding to
-  // |last_bound_texture_|.
-  //
-  // TODO(andrescj): use an RAII pattern to scope access to |current_texture_|
-  // because it requires Begin/EndSharedImageAccessDirectCHROMIUM().
-  unsigned current_texture_ = 0u;
-  unsigned last_bound_texture_ = 0u;
-  gpu::Mailbox last_bound_mailbox_;
-  unsigned texture_target_ = 0u;
-
-  unsigned fbo_ = 0u;
-
-  bool use_stencil_ = false;
-  unsigned stencil_buffer_ = 0u;
-
-  gfx::OverlayTransform display_transform_ = gfx::OVERLAY_TRANSFORM_NONE;
-  gfx::Size reshape_size_;
-  gfx::Size swap_size_;
-};
-
-}  // namespace viz
-
-#endif  // COMPONENTS_VIZ_SERVICE_DISPLAY_EMBEDDER_GL_OUTPUT_SURFACE_BUFFER_QUEUE_H_
diff --git a/components/viz/service/display_embedder/gl_output_surface_buffer_queue_unittest.cc b/components/viz/service/display_embedder/gl_output_surface_buffer_queue_unittest.cc
deleted file mode 100644
index 6730a7cb..0000000
--- a/components/viz/service/display_embedder/gl_output_surface_buffer_queue_unittest.cc
+++ /dev/null
@@ -1,362 +0,0 @@
-// Copyright 2019 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 "components/viz/service/display_embedder/gl_output_surface_buffer_queue.h"
-
-#include <utility>
-#include <vector>
-
-#include "base/memory/raw_ptr.h"
-#include "components/viz/service/display/output_surface_client.h"
-#include "components/viz/service/display/output_surface_frame.h"
-#include "components/viz/service/display_embedder/buffer_queue.h"
-#include "components/viz/test/test_context_provider.h"
-#include "components/viz/test/test_context_support.h"
-#include "components/viz/test/test_gles2_interface.h"
-#include "gpu/command_buffer/common/command_buffer_id.h"
-#include "gpu/command_buffer/common/constants.h"
-#include "gpu/command_buffer/common/mailbox.h"
-#include "gpu/command_buffer/common/sync_token.h"
-#include "gpu/ipc/common/surface_handle.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/gfx/buffer_types.h"
-#include "ui/gfx/swap_result.h"
-
-using testing::_;
-using testing::DoAll;
-using testing::Eq;
-using testing::InSequence;
-using testing::Mock;
-using testing::Ne;
-using testing::NotNull;
-using testing::Pointee;
-using testing::Return;
-using testing::SetArgPointee;
-using testing::StrictMock;
-
-namespace viz {
-namespace {
-
-class TestVizProcessContextProvider : public VizProcessContextProvider {
- public:
-  TestVizProcessContextProvider(std::unique_ptr<TestContextSupport> support,
-                                std::unique_ptr<TestGLES2Interface> gl)
-      : support_(std::move(support)), context_gl_(std::move(gl)) {}
-  TestVizProcessContextProvider(const TestVizProcessContextProvider&) = delete;
-  TestVizProcessContextProvider& operator=(
-      const TestVizProcessContextProvider&) = delete;
-
-  // ContextProvider implementation.
-  gpu::gles2::GLES2Interface* ContextGL() override { return context_gl_.get(); }
-  gpu::ContextSupport* ContextSupport() override { return support_.get(); }
-  const gpu::Capabilities& ContextCapabilities() const override {
-    return gpu_capabilities_;
-  }
-
-  const gpu::GpuFeatureInfo& GetGpuFeatureInfo() const override {
-    return gpu_feature_info_;
-  }
-
-  void SetUpdateVSyncParametersCallback(
-      UpdateVSyncParametersCallback callback) override {}
-  void SetGpuVSyncCallback(GpuVSyncCallback callback) override {}
-  void SetGpuVSyncEnabled(bool enabled) override {}
-  bool UseRGB565PixelFormat() const override { return false; }
-  uint32_t GetCopyTextureInternalFormat() override { return 0u; }
-  base::ScopedClosureRunner GetCacheBackBufferCb() override {
-    return base::ScopedClosureRunner(base::DoNothing());
-  }
-
- protected:
-  ~TestVizProcessContextProvider() override = default;
-
- private:
-  std::unique_ptr<TestContextSupport> support_;
-  std::unique_ptr<TestGLES2Interface> context_gl_;
-  gpu::Capabilities gpu_capabilities_;
-  gpu::GpuFeatureInfo gpu_feature_info_;
-};
-
-class MockGLES2Interface : public TestGLES2Interface {
- public:
-  MockGLES2Interface() = default;
-  ~MockGLES2Interface() override = default;
-
-  MOCK_METHOD2(DeleteTextures, void(GLsizei, const GLuint*));
-  MOCK_METHOD2(BindFramebuffer, void(GLenum, GLuint));
-  MOCK_METHOD2(GenRenderbuffers, void(GLsizei, GLuint*));
-  MOCK_METHOD2(BindRenderbuffer, void(GLenum, GLuint));
-  MOCK_METHOD2(DeleteRenderbuffers, void(GLsizei n, const GLuint*));
-  MOCK_METHOD1(CreateAndTexStorage2DSharedImageCHROMIUM, GLuint(const GLbyte*));
-  MOCK_METHOD1(WaitSyncTokenCHROMIUM, void(const GLbyte*));
-  MOCK_METHOD2(BeginSharedImageAccessDirectCHROMIUM, void(GLuint, GLenum));
-  MOCK_METHOD1(EndSharedImageAccessDirectCHROMIUM, void(GLuint));
-};
-
-class MockBufferQueue : public BufferQueue {
- public:
-  MockBufferQueue() : BufferQueue(/*sii_=*/nullptr, gpu::kNullSurfaceHandle) {}
-  ~MockBufferQueue() override = default;
-
-  MOCK_METHOD2(GetCurrentBuffer,
-               gpu::Mailbox(gpu::SyncToken*, gfx::GpuFenceHandle*));
-  MOCK_CONST_METHOD0(CurrentBufferDamage, gfx::Rect());
-  MOCK_METHOD1(SwapBuffers, void(const gfx::Rect&));
-  MOCK_METHOD1(PageFlipComplete, void(gfx::GpuFenceHandle));
-  MOCK_METHOD0(FreeAllSurfaces, void());
-  MOCK_METHOD3(Reshape,
-               bool(const gfx::Size&,
-                    const gfx::ColorSpace&,
-                    gfx::BufferFormat));
-
-  MOCK_METHOD0(DoSetSyncTokenProvider, void());
-  void SetSyncTokenProvider(SyncTokenProvider* sync_token_provider) override {
-    BufferQueue::SetSyncTokenProvider(sync_token_provider);
-    DoSetSyncTokenProvider();
-  }
-};
-
-}  // namespace
-
-class GLOutputSurfaceBufferQueueTest : public ::testing::Test,
-                                       public OutputSurfaceClient {
- public:
-  GLOutputSurfaceBufferQueueTest() = default;
-  ~GLOutputSurfaceBufferQueueTest() override = default;
-
-  void SetUp() override {
-    auto buffer_queue = std::make_unique<StrictMock<MockBufferQueue>>();
-    buffer_queue_ = buffer_queue.get();
-
-    auto gles2_interface = std::make_unique<StrictMock<MockGLES2Interface>>();
-    gles2_interface_ = gles2_interface.get();
-
-    EXPECT_CALL(*buffer_queue_, DoSetSyncTokenProvider());
-    surface_ = std::make_unique<GLOutputSurfaceBufferQueue>(
-        base::MakeRefCounted<TestVizProcessContextProvider>(
-            std::make_unique<TestContextSupport>(), std::move(gles2_interface)),
-        gpu::kNullSurfaceHandle, std::move(buffer_queue));
-    surface_->BindToClient(this);
-
-    Mock::VerifyAndClearExpectations(gles2_interface_);
-    Mock::VerifyAndClearExpectations(buffer_queue_);
-  }
-
-  // OutputSurfaceClient implementation.
-  void DidReceiveSwapBuffersAck(const gfx::SwapTimings& timings,
-                                gfx::GpuFenceHandle release_fence) override {}
-  void SetNeedsRedrawRect(const gfx::Rect& damage_rect) override {}
-  void DidReceiveTextureInUseResponses(
-      const gpu::TextureInUseResponses& responses) override {}
-  void DidReceiveCALayerParams(
-      const gfx::CALayerParams& ca_layer_params) override {}
-  void DidSwapWithSize(const gfx::Size& pixel_size) override {}
-  void DidReceivePresentationFeedback(
-      const gfx::PresentationFeedback& feedback) override {}
-  void DidReceiveReleasedOverlays(
-      const std::vector<gpu::Mailbox>& released_overlays) override {}
-
- protected:
-  std::unique_ptr<OutputSurface> surface_;
-  raw_ptr<StrictMock<MockGLES2Interface>> gles2_interface_;
-  raw_ptr<StrictMock<MockBufferQueue>> buffer_queue_;
-};
-
-MATCHER_P(SyncTokenEqualTo, expected_sync_token, "") {
-  auto* actual_sync_token = reinterpret_cast<const gpu::SyncToken*>(arg);
-  return expected_sync_token == *actual_sync_token;
-}
-
-MATCHER_P(SharedImageEqualTo, expected_shared_image, "") {
-  gpu::Mailbox actual_shared_image;
-  actual_shared_image.SetName(arg);
-  return expected_shared_image == actual_shared_image;
-}
-
-// Make sure that the surface uses the buffer queue and the GL context correctly
-// when we request it to bind the framebuffer twice and then swap the buffer.
-TEST_F(GLOutputSurfaceBufferQueueTest, BindFramebufferAndSwap) {
-  const gpu::SyncToken fake_sync_token(
-      gpu::CommandBufferNamespace::GPU_IO,
-      gpu::CommandBufferId::FromUnsafeValue(567u),
-      /*release_count=*/5u);
-  const gpu::Mailbox fake_shared_image = gpu::Mailbox::GenerateForSharedImage();
-  constexpr GLuint kFakeTexture = 123u;
-  {
-    InSequence dummy_sequence;
-
-    // The first call to |surface_|->BindFramebuffer() should result in binding
-    // the GL framebuffer, requesting a new buffer, waiting on the corresponding
-    // sync token, and beginning read/write access to the shared image.
-    EXPECT_CALL(*gles2_interface_, BindFramebuffer(_, Ne(0u)));
-    EXPECT_CALL(*buffer_queue_, GetCurrentBuffer(NotNull(), NotNull()))
-        .WillOnce(DoAll(SetArgPointee<0>(fake_sync_token),
-                        Return(fake_shared_image)));
-    EXPECT_CALL(*gles2_interface_,
-                WaitSyncTokenCHROMIUM(SyncTokenEqualTo(fake_sync_token)));
-    EXPECT_CALL(*gles2_interface_, CreateAndTexStorage2DSharedImageCHROMIUM(
-                                       SharedImageEqualTo(fake_shared_image)))
-        .WillOnce(Return(kFakeTexture));
-    EXPECT_CALL(
-        *gles2_interface_,
-        BeginSharedImageAccessDirectCHROMIUM(
-            kFakeTexture, GL_SHARED_IMAGE_ACCESS_MODE_READWRITE_CHROMIUM));
-
-    // The second call to |surface_|->BindFramebuffer() should only result in
-    // binding the GL framebuffer because the underlying buffer hasn't been
-    // swapped.
-    EXPECT_CALL(*gles2_interface_, BindFramebuffer(_, Ne(0u)));
-
-    // Calling |surface_|->SwapBuffers() should result in ending read/write
-    // access to the underlying buffer and unbinding the GL framebuffer.
-    EXPECT_CALL(*gles2_interface_,
-                EndSharedImageAccessDirectCHROMIUM(kFakeTexture));
-    EXPECT_CALL(*gles2_interface_, BindFramebuffer(_, Eq(0u)));
-    EXPECT_CALL(*buffer_queue_, SwapBuffers(_));
-
-    // Destroying |surface_| should result in the deletion of the texture
-    // obtained from consuming the shared image.
-    EXPECT_CALL(*gles2_interface_,
-                DeleteTextures(1u, Pointee(Eq(kFakeTexture))));
-  }
-
-  surface_->BindFramebuffer();
-  surface_->BindFramebuffer();
-  surface_->SwapBuffers(OutputSurfaceFrame());
-}
-
-TEST_F(GLOutputSurfaceBufferQueueTest, EmptySwap) {
-  const gpu::SyncToken fake_sync_token(
-      gpu::CommandBufferNamespace::GPU_IO,
-      gpu::CommandBufferId::FromUnsafeValue(567u),
-      /*release_count=*/5u);
-  const gpu::Mailbox fake_shared_image = gpu::Mailbox::GenerateForSharedImage();
-  constexpr GLuint kFakeTexture = 123u;
-  {
-    InSequence dummy_sequence;
-
-    // The call to |surface_|->BindFramebuffer() should result in binding the GL
-    // framebuffer, requesting a new buffer, waiting on the corresponding sync
-    // token, and beginning read/write access to the shared image.
-    EXPECT_CALL(*gles2_interface_, BindFramebuffer(_, Ne(0u)));
-    EXPECT_CALL(*buffer_queue_, GetCurrentBuffer(NotNull(), NotNull()))
-        .WillOnce(DoAll(SetArgPointee<0>(fake_sync_token),
-                        Return(fake_shared_image)));
-    EXPECT_CALL(*gles2_interface_,
-                WaitSyncTokenCHROMIUM(SyncTokenEqualTo(fake_sync_token)));
-    EXPECT_CALL(*gles2_interface_, CreateAndTexStorage2DSharedImageCHROMIUM(
-                                       SharedImageEqualTo(fake_shared_image)))
-        .WillOnce(Return(kFakeTexture));
-    EXPECT_CALL(
-        *gles2_interface_,
-        BeginSharedImageAccessDirectCHROMIUM(
-            kFakeTexture, GL_SHARED_IMAGE_ACCESS_MODE_READWRITE_CHROMIUM));
-
-    // The first call to |surface_|->SwapBuffers() should result in ending
-    // read/write access to the underlying buffer and unbinding the GL
-    // framebuffer.
-    EXPECT_CALL(*gles2_interface_,
-                EndSharedImageAccessDirectCHROMIUM(kFakeTexture));
-    EXPECT_CALL(*gles2_interface_, BindFramebuffer(_, Eq(0u)));
-    EXPECT_CALL(*buffer_queue_, SwapBuffers(_));
-
-    // The two empty swaps should only result in telling the buffer queue to
-    // swap the buffers.
-    EXPECT_CALL(*buffer_queue_, SwapBuffers(_)).Times(2);
-
-    // Destroying |surface_| should result in the deletion of the texture
-    // obtained from consuming the shared image.
-    EXPECT_CALL(*gles2_interface_,
-                DeleteTextures(1u, Pointee(Eq(kFakeTexture))));
-  }
-  surface_->BindFramebuffer();
-  unsigned texture_for_first_buffer = surface_->GetOverlayTextureId();
-  EXPECT_GT(texture_for_first_buffer, 0u);
-  surface_->SwapBuffers(OutputSurfaceFrame());
-
-  // Now do two empty swaps (which don't call BindFramebuffer()).
-  EXPECT_EQ(texture_for_first_buffer, surface_->GetOverlayTextureId());
-  surface_->SwapBuffers(OutputSurfaceFrame());
-  EXPECT_EQ(texture_for_first_buffer, surface_->GetOverlayTextureId());
-  surface_->SwapBuffers(OutputSurfaceFrame());
-}
-
-// Make sure that receiving a swap NAK doesn't cause us to leak resources.
-TEST_F(GLOutputSurfaceBufferQueueTest, HandleSwapNAK) {
-  const gpu::SyncToken fake_sync_token(
-      gpu::CommandBufferNamespace::GPU_IO,
-      gpu::CommandBufferId::FromUnsafeValue(567u),
-      /*release_count=*/5u);
-  constexpr gfx::Size kBufferSize(100, 100);
-  const gpu::Mailbox fake_shared_image = gpu::Mailbox::GenerateForSharedImage();
-  constexpr GLuint kFakeTexture = 123u;
-  constexpr GLuint kFakeStencilBuffer = 456u;
-  {
-    InSequence dummy_sequence;
-
-    EXPECT_CALL(*buffer_queue_, Reshape(_, _, _)).WillOnce(Return(true));
-    EXPECT_CALL(*gles2_interface_, BindFramebuffer(_, Ne(0u)));
-
-    // The call to |surface_|->BindFramebuffer() should result in binding the GL
-    // framebuffer, requesting a new buffer, waiting on the corresponding sync
-    // token, beginning read/write access to the shared image, and creating a
-    // stencil buffer.
-    EXPECT_CALL(*gles2_interface_, BindFramebuffer(_, Ne(0u)));
-    EXPECT_CALL(*buffer_queue_, GetCurrentBuffer(NotNull(), NotNull()))
-        .WillOnce(DoAll(SetArgPointee<0>(fake_sync_token),
-                        Return(fake_shared_image)));
-
-    EXPECT_CALL(*gles2_interface_,
-                WaitSyncTokenCHROMIUM(SyncTokenEqualTo(fake_sync_token)));
-    EXPECT_CALL(*gles2_interface_, CreateAndTexStorage2DSharedImageCHROMIUM(
-                                       SharedImageEqualTo(fake_shared_image)))
-        .WillOnce(Return(kFakeTexture));
-    EXPECT_CALL(
-        *gles2_interface_,
-        BeginSharedImageAccessDirectCHROMIUM(
-            kFakeTexture, GL_SHARED_IMAGE_ACCESS_MODE_READWRITE_CHROMIUM));
-    EXPECT_CALL(*gles2_interface_, GenRenderbuffers(1u, NotNull()))
-        .WillOnce(SetArgPointee<1>(kFakeStencilBuffer));
-    EXPECT_CALL(*gles2_interface_,
-                BindRenderbuffer(GL_RENDERBUFFER, kFakeStencilBuffer));
-    EXPECT_CALL(*gles2_interface_, BindRenderbuffer(GL_RENDERBUFFER, 0u));
-
-    // Calling |surface_|->SwapBuffers() should result in ending read/write
-    // access to the underlying buffer and unbinding the GL framebuffer.
-    EXPECT_CALL(*gles2_interface_,
-                EndSharedImageAccessDirectCHROMIUM(kFakeTexture));
-    EXPECT_CALL(*gles2_interface_, BindFramebuffer(_, Eq(0u)));
-    EXPECT_CALL(*buffer_queue_, SwapBuffers(_));
-
-    // Receiving a swap NAK should result in the deletion of the texture
-    // obtained from consuming the shared image. It should also result in the
-    // deletion of the stencil buffer.
-    EXPECT_CALL(*buffer_queue_, FreeAllSurfaces());
-    EXPECT_CALL(*gles2_interface_, BindFramebuffer(_, Ne(0u)));
-    EXPECT_CALL(*gles2_interface_,
-                DeleteRenderbuffers(1u, Pointee(Eq(kFakeStencilBuffer))));
-    EXPECT_CALL(*gles2_interface_,
-                DeleteTextures(1u, Pointee(Eq(kFakeTexture))));
-    EXPECT_CALL(*buffer_queue_, PageFlipComplete(_));
-  }
-
-  OutputSurface::ReshapeParams reshape_params;
-  reshape_params.size = kBufferSize;
-  reshape_params.color_space = gfx::ColorSpace::CreateSRGB();
-  reshape_params.format = gfx::BufferFormat::BGRA_8888;
-  reshape_params.use_stencil = true;
-  surface_->Reshape(reshape_params);
-  surface_->BindFramebuffer();
-  OutputSurfaceFrame frame;
-  frame.size = kBufferSize;
-  surface_->SwapBuffers(std::move(frame));
-  gfx::SwapResponse swap_response{};
-  swap_response.result = gfx::SwapResult::SWAP_NAK_RECREATE_BUFFERS;
-  (static_cast<GLOutputSurfaceBufferQueue*>(surface_.get()))
-      ->DidReceiveSwapBuffersAck(swap_response,
-                                 /*release_fence=*/gfx::GpuFenceHandle());
-}
-
-}  // namespace viz
diff --git a/components/viz/service/display_embedder/gl_output_surface_chromeos.cc b/components/viz/service/display_embedder/gl_output_surface_chromeos.cc
deleted file mode 100644
index d3cc855..0000000
--- a/components/viz/service/display_embedder/gl_output_surface_chromeos.cc
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2019 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 "components/viz/service/display_embedder/gl_output_surface_chromeos.h"
-
-namespace viz {
-
-GLOutputSurfaceChromeOS::GLOutputSurfaceChromeOS(
-    scoped_refptr<VizProcessContextProvider> context_provider,
-    gpu::SurfaceHandle surface_handle)
-    : GLOutputSurface(context_provider, surface_handle) {}
-
-GLOutputSurfaceChromeOS::~GLOutputSurfaceChromeOS() = default;
-
-void GLOutputSurfaceChromeOS::SetDisplayTransformHint(
-    gfx::OverlayTransform transform) {
-  display_transform_ = transform;
-}
-
-gfx::OverlayTransform GLOutputSurfaceChromeOS::GetDisplayTransform() {
-  return display_transform_;
-}
-
-}  // namespace viz
diff --git a/components/viz/service/display_embedder/gl_output_surface_chromeos.h b/components/viz/service/display_embedder/gl_output_surface_chromeos.h
deleted file mode 100644
index 63ad613a..0000000
--- a/components/viz/service/display_embedder/gl_output_surface_chromeos.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2019 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 COMPONENTS_VIZ_SERVICE_DISPLAY_EMBEDDER_GL_OUTPUT_SURFACE_CHROMEOS_H_
-#define COMPONENTS_VIZ_SERVICE_DISPLAY_EMBEDDER_GL_OUTPUT_SURFACE_CHROMEOS_H_
-
-#include "components/viz/service/display_embedder/gl_output_surface.h"
-
-namespace viz {
-
-class GLOutputSurfaceChromeOS : public GLOutputSurface {
- public:
-  GLOutputSurfaceChromeOS(
-      scoped_refptr<VizProcessContextProvider> context_provider,
-      gpu::SurfaceHandle surface_handle);
-
-  GLOutputSurfaceChromeOS(const GLOutputSurfaceChromeOS&) = delete;
-  GLOutputSurfaceChromeOS& operator=(const GLOutputSurfaceChromeOS&) = delete;
-
-  ~GLOutputSurfaceChromeOS() override;
-
-  // GLOutputSurface:
-  void SetDisplayTransformHint(gfx::OverlayTransform transform) override;
-  gfx::OverlayTransform GetDisplayTransform() override;
-
- private:
-  gfx::OverlayTransform display_transform_ = gfx::OVERLAY_TRANSFORM_NONE;
-};
-
-}  // namespace viz
-
-#endif  // COMPONENTS_VIZ_SERVICE_DISPLAY_EMBEDDER_GL_OUTPUT_SURFACE_CHROMEOS_H_
diff --git a/components/viz/service/display_embedder/gl_output_surface_offscreen.cc b/components/viz/service/display_embedder/gl_output_surface_offscreen.cc
deleted file mode 100644
index 5de766dc..0000000
--- a/components/viz/service/display_embedder/gl_output_surface_offscreen.cc
+++ /dev/null
@@ -1,135 +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 "components/viz/service/display_embedder/gl_output_surface_offscreen.h"
-
-#include <stdint.h>
-
-#include <algorithm>
-#include <utility>
-#include <vector>
-
-#include "base/bind.h"
-#include "components/viz/common/resources/resource_format_utils.h"
-#include "components/viz/service/display/output_surface_client.h"
-#include "components/viz/service/display/output_surface_frame.h"
-#include "gpu/command_buffer/client/context_support.h"
-#include "gpu/command_buffer/client/gles2_interface.h"
-#include "gpu/command_buffer/client/shared_image_interface.h"
-#include "gpu/command_buffer/common/shared_image_usage.h"
-#include "third_party/khronos/GLES2/gl2.h"
-#include "third_party/khronos/GLES2/gl2ext.h"
-#include "ui/gfx/swap_result.h"
-#include "ui/gl/gl_utils.h"
-
-namespace viz {
-namespace {
-
-constexpr ResourceFormat kFboTextureFormat = RGBA_8888;
-
-}  // namespace
-
-GLOutputSurfaceOffscreen::GLOutputSurfaceOffscreen(
-    scoped_refptr<VizProcessContextProvider> context_provider)
-    : GLOutputSurface(context_provider, gpu::kNullSurfaceHandle) {}
-
-GLOutputSurfaceOffscreen::~GLOutputSurfaceOffscreen() {
-  DiscardBackbuffer();
-}
-
-void GLOutputSurfaceOffscreen::EnsureBackbuffer() {
-  if (size_.IsEmpty())
-    return;
-
-  if (!texture_id_) {
-    gpu::SharedImageInterface* sii = context_provider_->SharedImageInterface();
-    gpu::gles2::GLES2Interface* gl = context_provider_->ContextGL();
-
-    const int max_texture_size =
-        context_provider_->ContextCapabilities().max_texture_size;
-    gfx::Size texture_size(std::min(size_.width(), max_texture_size),
-                           std::min(size_.height(), max_texture_size));
-
-    const uint32_t flags = gpu::SHARED_IMAGE_USAGE_GLES2 |
-                           gpu::SHARED_IMAGE_USAGE_GLES2_FRAMEBUFFER_HINT |
-                           gpu::SHARED_IMAGE_USAGE_DISPLAY;
-
-    mailbox_ = sii->CreateSharedImage(
-        kFboTextureFormat, texture_size, color_space_, kTopLeft_GrSurfaceOrigin,
-        kPremul_SkAlphaType, flags, gpu::kNullSurfaceHandle);
-
-    // Ensure mailbox is valid before using it.
-    gl->WaitSyncTokenCHROMIUM(sii->GenUnverifiedSyncToken().GetConstData());
-
-    texture_id_ = gl->CreateAndTexStorage2DSharedImageCHROMIUM(mailbox_.name);
-
-    gl->GenFramebuffers(1, &fbo_);
-    gl->BindFramebuffer(GL_FRAMEBUFFER, fbo_);
-    gl->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
-                             GL_TEXTURE_2D, texture_id_, 0);
-  }
-}
-
-void GLOutputSurfaceOffscreen::DiscardBackbuffer() {
-  if (fbo_) {
-    gpu::gles2::GLES2Interface* gl = context_provider_->ContextGL();
-    gl->BindFramebuffer(GL_FRAMEBUFFER, fbo_);
-    gl->DeleteFramebuffers(1, &fbo_);
-    fbo_ = 0;
-  }
-
-  if (texture_id_) {
-    gpu::SharedImageInterface* sii = context_provider_->SharedImageInterface();
-    sii->DestroySharedImage(gpu::SyncToken(), mailbox_);
-    mailbox_.SetZero();
-    texture_id_ = 0;
-  }
-}
-
-void GLOutputSurfaceOffscreen::BindFramebuffer() {
-  if (!texture_id_) {
-    EnsureBackbuffer();
-  } else {
-    gpu::gles2::GLES2Interface* gl = context_provider_->ContextGL();
-    gl->BindFramebuffer(GL_FRAMEBUFFER, fbo_);
-  }
-}
-
-void GLOutputSurfaceOffscreen::Reshape(const ReshapeParams& params) {
-  size_ = params.size;
-  color_space_ = params.color_space;
-  DiscardBackbuffer();
-  EnsureBackbuffer();
-}
-
-void GLOutputSurfaceOffscreen::SwapBuffers(OutputSurfaceFrame frame) {
-  DCHECK_EQ(frame.size, size_);
-
-  gpu::gles2::GLES2Interface* gl = context_provider_->ContextGL();
-
-  gpu::SyncToken sync_token;
-  gl->GenUnverifiedSyncTokenCHROMIUM(sync_token.GetData());
-  context_provider_->ContextSupport()->SignalSyncToken(
-      sync_token,
-      base::BindOnce(&GLOutputSurfaceOffscreen::OnSwapBuffersComplete,
-                     weak_ptr_factory_.GetWeakPtr(),
-                     std::move(frame.latency_info)));
-}
-
-void GLOutputSurfaceOffscreen::OnSwapBuffersComplete(
-    std::vector<ui::LatencyInfo> latency_info) {
-  latency_tracker()->OnGpuSwapBuffersCompleted(std::move(latency_info));
-  // Swap timings are not available since for offscreen there is no Swap, just a
-  // SignalSyncToken. We use base::TimeTicks::Now() as an overestimate.
-  auto now = base::TimeTicks::Now();
-  client()->DidReceiveSwapBuffersAck({.swap_start = now},
-                                     /*release_fence=*/gfx::GpuFenceHandle());
-  client()->DidReceivePresentationFeedback(
-      gfx::PresentationFeedback(now, base::Milliseconds(16), /*flags=*/0));
-
-  if (needs_swap_size_notifications())
-    client()->DidSwapWithSize(size_);
-}
-
-}  // namespace viz
diff --git a/components/viz/service/display_embedder/gl_output_surface_offscreen.h b/components/viz/service/display_embedder/gl_output_surface_offscreen.h
deleted file mode 100644
index a9cef0b..0000000
--- a/components/viz/service/display_embedder/gl_output_surface_offscreen.h
+++ /dev/null
@@ -1,54 +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 COMPONENTS_VIZ_SERVICE_DISPLAY_EMBEDDER_GL_OUTPUT_SURFACE_OFFSCREEN_H_
-#define COMPONENTS_VIZ_SERVICE_DISPLAY_EMBEDDER_GL_OUTPUT_SURFACE_OFFSCREEN_H_
-
-#include <memory>
-#include <vector>
-
-#include "components/viz/common/frame_sinks/begin_frame_source.h"
-#include "components/viz/service/display_embedder/gl_output_surface.h"
-#include "components/viz/service/display_embedder/viz_process_context_provider.h"
-#include "components/viz/service/viz_service_export.h"
-#include "gpu/command_buffer/common/mailbox.h"
-#include "ui/gfx/color_space.h"
-
-namespace viz {
-
-// An OutputSurface implementation that draws and swaps to an offscreen GL
-// framebuffer.
-class VIZ_SERVICE_EXPORT GLOutputSurfaceOffscreen : public GLOutputSurface {
- public:
-  explicit GLOutputSurfaceOffscreen(
-      scoped_refptr<VizProcessContextProvider> context_provider);
-
-  GLOutputSurfaceOffscreen(const GLOutputSurfaceOffscreen&) = delete;
-  GLOutputSurfaceOffscreen& operator=(const GLOutputSurfaceOffscreen&) = delete;
-
-  ~GLOutputSurfaceOffscreen() override;
-
-  // OutputSurface implementation.
-  void EnsureBackbuffer() override;
-  void DiscardBackbuffer() override;
-  void BindFramebuffer() override;
-  void Reshape(const ReshapeParams& params) override;
-  void SwapBuffers(OutputSurfaceFrame frame) override;
-
- private:
-  void OnSwapBuffersComplete(std::vector<ui::LatencyInfo> latency_info);
-
-  gpu::Mailbox mailbox_;
-
-  uint32_t fbo_ = 0;
-  uint32_t texture_id_ = 0;
-  gfx::Size size_;
-  gfx::ColorSpace color_space_;
-
-  base::WeakPtrFactory<GLOutputSurfaceOffscreen> weak_ptr_factory_{this};
-};
-
-}  // namespace viz
-
-#endif  // COMPONENTS_VIZ_SERVICE_DISPLAY_EMBEDDER_GL_OUTPUT_SURFACE_OFFSCREEN_H_
diff --git a/components/viz/service/display_embedder/output_surface_provider.h b/components/viz/service/display_embedder/output_surface_provider.h
index 77d463e6..2e9453c1 100644
--- a/components/viz/service/display_embedder/output_surface_provider.h
+++ b/components/viz/service/display_embedder/output_surface_provider.h
@@ -28,8 +28,7 @@
   // of this should feed into the CreateOutputSurface function.
   virtual std::unique_ptr<DisplayCompositorMemoryAndTaskController>
   CreateGpuDependency(bool gpu_compositing,
-                      gpu::SurfaceHandle surface_handle,
-                      const RendererSettings& renderer_settings) = 0;
+                      gpu::SurfaceHandle surface_handle) = 0;
 
   // Creates a new OutputSurface for |surface_handle|. If creating an
   // OutputSurface fails this function will return null.
diff --git a/components/viz/service/display_embedder/output_surface_provider_impl.cc b/components/viz/service/display_embedder/output_surface_provider_impl.cc
index 8a277c6..555b911 100644
--- a/components/viz/service/display_embedder/output_surface_provider_impl.cc
+++ b/components/viz/service/display_embedder/output_surface_provider_impl.cc
@@ -20,14 +20,10 @@
 #include "components/viz/common/display/renderer_settings.h"
 #include "components/viz/common/frame_sinks/begin_frame_source.h"
 #include "components/viz/service/display/display_compositor_memory_and_task_controller.h"
-#include "components/viz/service/display_embedder/gl_output_surface.h"
-#include "components/viz/service/display_embedder/gl_output_surface_buffer_queue.h"
-#include "components/viz/service/display_embedder/gl_output_surface_offscreen.h"
 #include "components/viz/service/display_embedder/server_shared_bitmap_manager.h"
 #include "components/viz/service/display_embedder/skia_output_surface_dependency_impl.h"
 #include "components/viz/service/display_embedder/skia_output_surface_impl.h"
 #include "components/viz/service/display_embedder/software_output_surface.h"
-#include "components/viz/service/display_embedder/viz_process_context_provider.h"
 #include "components/viz/service/gl/gpu_service_impl.h"
 #include "gpu/command_buffer/client/gpu_memory_buffer_manager.h"
 #include "gpu/command_buffer/client/shared_memory_limits.h"
@@ -40,17 +36,11 @@
 #include "gpu/ipc/service/gpu_channel_manager_delegate.h"
 #include "gpu/ipc/service/image_transport_surface.h"
 #include "ui/base/ui_base_switches.h"
-#include "ui/gl/gl_context.h"
-#include "ui/gl/init/gl_factory.h"
 
 #if BUILDFLAG(IS_WIN)
 #include "components/viz/service/display_embedder/software_output_device_win.h"
 #endif
 
-#if BUILDFLAG(IS_ANDROID)
-#include "components/viz/service/display_embedder/gl_output_surface_android.h"
-#endif
-
 #if BUILDFLAG(IS_APPLE)
 #include "components/viz/service/display_embedder/software_output_device_mac.h"
 #include "ui/base/cocoa/remote_layer_api.h"
@@ -66,7 +56,6 @@
 #endif
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
-#include "components/viz/service/display_embedder/gl_output_surface_chromeos.h"
 #include "components/viz/service/display_embedder/output_surface_unified.h"
 #endif
 
@@ -101,23 +90,15 @@
 std::unique_ptr<DisplayCompositorMemoryAndTaskController>
 OutputSurfaceProviderImpl::CreateGpuDependency(
     bool gpu_compositing,
-    gpu::SurfaceHandle surface_handle,
-    const RendererSettings& renderer_settings) {
+    gpu::SurfaceHandle surface_handle) {
   if (!gpu_compositing)
     return nullptr;
 
-  if (renderer_settings.use_skia_renderer) {
-    gpu::ScopedAllowScheduleGpuTask allow_schedule_gpu_task;
-    auto skia_deps = std::make_unique<SkiaOutputSurfaceDependencyImpl>(
-        gpu_service_impl_, surface_handle);
-    return std::make_unique<DisplayCompositorMemoryAndTaskController>(
-        std::move(skia_deps));
-  } else {
-    DCHECK(task_executor_);
-    gpu::ScopedAllowScheduleGpuTask allow_schedule_gpu_task;
-    return std::make_unique<DisplayCompositorMemoryAndTaskController>(
-        task_executor_, image_factory_);
-  }
+  gpu::ScopedAllowScheduleGpuTask allow_schedule_gpu_task;
+  auto skia_deps = std::make_unique<SkiaOutputSurfaceDependencyImpl>(
+      gpu_service_impl_, surface_handle);
+  return std::make_unique<DisplayCompositorMemoryAndTaskController>(
+      std::move(skia_deps));
 }
 
 std::unique_ptr<OutputSurface> OutputSurfaceProviderImpl::CreateOutputSurface(
@@ -139,7 +120,7 @@
   if (!gpu_compositing) {
     output_surface = std::make_unique<SoftwareOutputSurface>(
         CreateSoftwareOutputDeviceForPlatform(surface_handle, display_client));
-  } else if (renderer_settings.use_skia_renderer) {
+  } else {
     DCHECK(gpu_dependency);
     {
       gpu::ScopedAllowScheduleGpuTask allow_schedule_gpu_task;
@@ -167,74 +148,6 @@
 #endif
       return nullptr;
     }
-  } else {
-    DCHECK(task_executor_);
-    DCHECK(gpu_dependency);
-
-    scoped_refptr<VizProcessContextProvider> context_provider;
-
-    // Retry creating and binding |context_provider| on transient failures.
-    gpu::ContextResult context_result = gpu::ContextResult::kTransientFailure;
-    while (context_result != gpu::ContextResult::kSuccess) {
-      // We are about to exit the GPU process so don't try to create a context.
-      // It will be recreated after the GPU process restarts. The same check
-      // also happens on the GPU thread before the context gets initialized
-      // there. If GPU process starts to exit after this check but before
-      // context initialization we'll encounter a transient error, loop and hit
-      // this check again.
-      if (gpu_channel_manager_delegate_->IsExiting())
-        return nullptr;
-
-      context_provider = base::MakeRefCounted<VizProcessContextProvider>(
-          task_executor_, surface_handle, gpu_memory_buffer_manager_.get(),
-          image_factory_, gpu_channel_manager_delegate_, gpu_dependency,
-          renderer_settings);
-      context_result = context_provider->BindToCurrentThread();
-
-#if BUILDFLAG(IS_ANDROID)
-      display_client->OnContextCreationResult(context_result);
-#endif
-
-      if (IsFatalOrSurfaceFailure(context_result)) {
-#if BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMECAST)
-        // GL compositing is expected to always work on Chrome OS so we should
-        // never encounter fatal context error. This could be an unrecoverable
-        // hardware error or a bug.
-        LOG(FATAL) << "Unexpected fatal context error";
-#elif !BUILDFLAG(IS_ANDROID)
-        gpu_service_impl_->DisableGpuCompositing();
-#endif
-        return nullptr;
-      }
-    }
-
-    if (surface_handle == gpu::kNullSurfaceHandle) {
-      output_surface = std::make_unique<GLOutputSurfaceOffscreen>(
-          std::move(context_provider));
-    } else if (context_provider->ContextCapabilities().surfaceless) {
-#if defined(USE_OZONE) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_ANDROID)
-      output_surface = std::make_unique<GLOutputSurfaceBufferQueue>(
-          std::move(context_provider), surface_handle,
-          std::make_unique<BufferQueue>(
-              context_provider->SharedImageInterface(), surface_handle));
-#else
-      NOTREACHED();
-#endif
-    } else {
-#if BUILDFLAG(IS_WIN)
-      output_surface = std::make_unique<GLOutputSurface>(
-          std::move(context_provider), surface_handle);
-#elif BUILDFLAG(IS_ANDROID)
-      output_surface = std::make_unique<GLOutputSurfaceAndroid>(
-          std::move(context_provider), surface_handle);
-#elif BUILDFLAG(IS_CHROMEOS_ASH)
-      output_surface = std::make_unique<GLOutputSurfaceChromeOS>(
-          std::move(context_provider), surface_handle);
-#else
-      output_surface = std::make_unique<GLOutputSurface>(
-          std::move(context_provider), surface_handle);
-#endif
-    }
   }
 
   return output_surface;
diff --git a/components/viz/service/display_embedder/output_surface_provider_impl.h b/components/viz/service/display_embedder/output_surface_provider_impl.h
index fa9bc45b5..0dd6a4d 100644
--- a/components/viz/service/display_embedder/output_surface_provider_impl.h
+++ b/components/viz/service/display_embedder/output_surface_provider_impl.h
@@ -56,8 +56,7 @@
 
   std::unique_ptr<DisplayCompositorMemoryAndTaskController> CreateGpuDependency(
       bool gpu_compositing,
-      gpu::SurfaceHandle surface_handle,
-      const RendererSettings& renderer_settings) override;
+      gpu::SurfaceHandle surface_handle) override;
 
   // OutputSurfaceProvider implementation.
   std::unique_ptr<OutputSurface> CreateOutputSurface(
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl_unittest.cc b/components/viz/service/display_embedder/skia_output_surface_impl_unittest.cc
index 3ad1b57..a44fbb46 100644
--- a/components/viz/service/display_embedder/skia_output_surface_impl_unittest.cc
+++ b/components/viz/service/display_embedder/skia_output_surface_impl_unittest.cc
@@ -75,15 +75,13 @@
 }
 
 void SkiaOutputSurfaceImplTest::SetUpSkiaOutputSurfaceImpl() {
-  RendererSettings settings;
-  settings.use_skia_renderer = true;
   auto skia_deps = std::make_unique<SkiaOutputSurfaceDependencyImpl>(
       GetGpuService(), gpu::kNullSurfaceHandle);
   display_controller_ =
       std::make_unique<DisplayCompositorMemoryAndTaskController>(
           std::move(skia_deps));
-  output_surface_ = SkiaOutputSurfaceImpl::Create(display_controller_.get(),
-                                                  settings, &debug_settings_);
+  output_surface_ = SkiaOutputSurfaceImpl::Create(
+      display_controller_.get(), RendererSettings(), &debug_settings_);
   output_surface_->BindToClient(&output_surface_client_);
 }
 
diff --git a/components/viz/service/display_embedder/viz_process_context_provider.cc b/components/viz/service/display_embedder/viz_process_context_provider.cc
deleted file mode 100644
index ed33d5f..0000000
--- a/components/viz/service/display_embedder/viz_process_context_provider.cc
+++ /dev/null
@@ -1,348 +0,0 @@
-// Copyright 2016 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 "components/viz/service/display_embedder/viz_process_context_provider.h"
-
-#include <stdint.h>
-
-#include <utility>
-
-#include "base/bind.h"
-#include "base/lazy_instance.h"
-#include "base/metrics/histogram_macros.h"
-#include "base/observer_list.h"
-#include "base/system/sys_info.h"
-#include "base/task/single_thread_task_runner.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "base/trace_event/memory_dump_manager.h"
-#include "build/build_config.h"
-#include "build/chromeos_buildflags.h"
-#include "components/viz/common/display/renderer_settings.h"
-#include "components/viz/common/gpu/context_lost_observer.h"
-#include "components/viz/common/gpu/context_lost_reason.h"
-#include "components/viz/common/resources/platform_color.h"
-#include "components/viz/common/viz_utils.h"
-#include "components/viz/service/display/display_compositor_memory_and_task_controller.h"
-#include "gpu/GLES2/gl2extchromium.h"
-#include "gpu/command_buffer/client/gles2_cmd_helper.h"
-#include "gpu/command_buffer/client/gles2_implementation.h"
-#include "gpu/command_buffer/client/raster_implementation_gles.h"
-#include "gpu/command_buffer/client/shared_memory_limits.h"
-#include "gpu/command_buffer/client/transfer_buffer.h"
-#include "gpu/config/gpu_feature_info.h"
-#include "gpu/config/gpu_preferences.h"
-#include "gpu/config/skia_limits.h"
-#include "gpu/ipc/common/surface_handle.h"
-#include "gpu/ipc/in_process_command_buffer.h"
-#include "gpu/skia_bindings/gles2_implementation_with_grcontext_support.h"
-#include "gpu/skia_bindings/grcontext_for_gles2_interface.h"
-#include "third_party/khronos/GLES2/gl2.h"
-#include "third_party/khronos/GLES2/gl2ext.h"
-#include "third_party/skia/include/gpu/GrDirectContext.h"
-#include "third_party/skia/include/gpu/gl/GrGLInterface.h"
-
-namespace viz {
-
-namespace {
-
-gpu::ContextCreationAttribs CreateAttributes(
-    bool requires_alpha_channel,
-    const RendererSettings& renderer_settings) {
-  gpu::ContextCreationAttribs attributes;
-  attributes.alpha_size = requires_alpha_channel ? 8 : -1;
-  attributes.depth_size = 0;
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-  // Chrome OS uses surfaceless when running on a real device and stencil
-  // buffers can then be added dynamically so supporting them does not have an
-  // impact on normal usage. If we are not running on a real Chrome OS device
-  // but instead on a workstation for development, then stencil support is
-  // useful as it allows the overdraw feedback debugging feature to be used.
-  attributes.stencil_size = 8;
-#else
-  attributes.stencil_size = 0;
-#endif
-  attributes.samples = 0;
-  attributes.sample_buffers = 0;
-  attributes.bind_generates_resource = false;
-  attributes.fail_if_major_perf_caveat = false;
-  attributes.lose_context_when_out_of_memory = true;
-
-#if BUILDFLAG(IS_ANDROID)
-  if (renderer_settings.color_space == gfx::ColorSpace::CreateSRGB()) {
-    attributes.color_space = gpu::COLOR_SPACE_SRGB;
-  } else if (renderer_settings.color_space ==
-             gfx::ColorSpace::CreateDisplayP3D65()) {
-    attributes.color_space = gpu::COLOR_SPACE_DISPLAY_P3;
-  } else {
-    // The browser only sends the above two color spaces.
-    NOTREACHED();
-  }
-
-  if (!requires_alpha_channel && PreferRGB565ResourcesForDisplay()) {
-    // See compositor_impl_android.cc for more information about this.
-    // It is inside GetCompositorContextAttributes().
-    attributes.alpha_size = 0;
-    attributes.red_size = 5;
-    attributes.green_size = 6;
-    attributes.blue_size = 5;
-  }
-
-  attributes.enable_swap_timestamps_if_supported = true;
-#endif  // BUILDFLAG(IS_ANDROID)
-
-  return attributes;
-}
-
-void UmaRecordContextLost(ContextLostReason reason) {
-  UMA_HISTOGRAM_ENUMERATION("GPU.ContextLost.DisplayCompositor", reason);
-}
-
-gpu::SharedMemoryLimits SharedMemoryLimitsForRendererSettings(
-    const RendererSettings& renderer_settings) {
-#if BUILDFLAG(IS_ANDROID)
-  return gpu::SharedMemoryLimits::ForDisplayCompositor(
-      renderer_settings.initial_screen_size);
-#else
-  return gpu::SharedMemoryLimits::ForDisplayCompositor();
-#endif
-}
-
-}  // namespace
-
-VizProcessContextProvider::VizProcessContextProvider(
-    gpu::CommandBufferTaskExecutor* task_executor,
-    gpu::SurfaceHandle surface_handle,
-    gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
-    gpu::ImageFactory* image_factory,
-    gpu::GpuChannelManagerDelegate* gpu_channel_manager_delegate,
-    DisplayCompositorMemoryAndTaskController* display_controller,
-    const RendererSettings& renderer_settings)
-    : attributes_(CreateAttributes(renderer_settings.requires_alpha_channel,
-                                   renderer_settings)) {
-  InitializeContext(std::move(task_executor), surface_handle,
-                    gpu_memory_buffer_manager, image_factory,
-                    gpu_channel_manager_delegate, display_controller,
-                    SharedMemoryLimitsForRendererSettings(renderer_settings));
-
-  if (context_result_ == gpu::ContextResult::kSuccess) {
-    // |gles2_implementation_| is owned here so bind an unretained pointer or
-    // there will be a circular reference preventing destruction.
-    gles2_implementation_->SetLostContextCallback(base::BindOnce(
-        &VizProcessContextProvider::OnContextLost, base::Unretained(this)));
-
-    base::trace_event::MemoryDumpManager::GetInstance()->RegisterDumpProvider(
-        this, "VizProcessContextProvider", base::ThreadTaskRunnerHandle::Get());
-  } else {
-    UmaRecordContextLost(CONTEXT_INIT_FAILED);
-  }
-}
-
-VizProcessContextProvider::VizProcessContextProvider() = default;
-
-VizProcessContextProvider::~VizProcessContextProvider() {
-  if (context_result_ == gpu::ContextResult::kSuccess) {
-    base::trace_event::MemoryDumpManager::GetInstance()->UnregisterDumpProvider(
-        this);
-  }
-
-  // cache_controller_ might ne nullptr if we failed to initialize
-  if (cache_controller_)
-    cache_controller_->SetGrContext(nullptr);
-}
-
-void VizProcessContextProvider::AddRef() const {
-  base::RefCountedThreadSafe<VizProcessContextProvider>::AddRef();
-}
-
-void VizProcessContextProvider::Release() const {
-  base::RefCountedThreadSafe<VizProcessContextProvider>::Release();
-}
-
-gpu::ContextResult VizProcessContextProvider::BindToCurrentThread() {
-  return context_result_;
-}
-
-gpu::gles2::GLES2Interface* VizProcessContextProvider::ContextGL() {
-  return gles2_implementation_.get();
-}
-
-gpu::ContextSupport* VizProcessContextProvider::ContextSupport() {
-  return gles2_implementation_.get();
-}
-
-class GrDirectContext* VizProcessContextProvider::GrContext() {
-  if (gr_context_)
-    return gr_context_->get();
-
-  size_t max_resource_cache_bytes;
-  size_t max_glyph_cache_texture_bytes;
-  gpu::DetermineGrCacheLimitsFromAvailableMemory(
-      &max_resource_cache_bytes, &max_glyph_cache_texture_bytes);
-
-  gr_context_ = std::make_unique<skia_bindings::GrContextForGLES2Interface>(
-      ContextGL(), ContextSupport(), ContextCapabilities(),
-      max_resource_cache_bytes, max_glyph_cache_texture_bytes);
-  cache_controller_->SetGrContext(gr_context_->get());
-  return gr_context_->get();
-}
-
-gpu::SharedImageInterface* VizProcessContextProvider::SharedImageInterface() {
-  return command_buffer_->GetSharedImageInterface();
-}
-
-ContextCacheController* VizProcessContextProvider::CacheController() {
-  return cache_controller_.get();
-}
-
-base::Lock* VizProcessContextProvider::GetLock() {
-  // Locking isn't supported on display compositor contexts.
-  return nullptr;
-}
-
-const gpu::Capabilities& VizProcessContextProvider::ContextCapabilities()
-    const {
-  return command_buffer_->GetCapabilities();
-}
-
-const gpu::GpuFeatureInfo& VizProcessContextProvider::GetGpuFeatureInfo()
-    const {
-  return command_buffer_->GetGpuFeatureInfo();
-}
-
-void VizProcessContextProvider::AddObserver(ContextLostObserver* obs) {
-  observers_.AddObserver(obs);
-}
-
-void VizProcessContextProvider::RemoveObserver(ContextLostObserver* obs) {
-  observers_.RemoveObserver(obs);
-}
-
-void VizProcessContextProvider::SetUpdateVSyncParametersCallback(
-    UpdateVSyncParametersCallback callback) {
-  command_buffer_->SetUpdateVSyncParametersCallback(std::move(callback));
-}
-
-void VizProcessContextProvider::SetGpuVSyncCallback(GpuVSyncCallback callback) {
-  command_buffer_->SetGpuVSyncCallback(std::move(callback));
-}
-
-void VizProcessContextProvider::SetGpuVSyncEnabled(bool enabled) {
-  command_buffer_->SetGpuVSyncEnabled(enabled);
-}
-
-bool VizProcessContextProvider::UseRGB565PixelFormat() const {
-  return attributes_.alpha_size == 0 && attributes_.red_size == 5 &&
-         attributes_.green_size == 6 && attributes_.blue_size == 5;
-}
-
-uint32_t VizProcessContextProvider::GetCopyTextureInternalFormat() {
-  return attributes_.alpha_size > 0 ? GL_RGBA : GL_RGB;
-}
-
-void VizProcessContextProvider::InitializeContext(
-    gpu::CommandBufferTaskExecutor* task_executor,
-    gpu::SurfaceHandle surface_handle,
-    gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
-    gpu::ImageFactory* image_factory,
-    gpu::GpuChannelManagerDelegate* gpu_channel_manager_delegate,
-    DisplayCompositorMemoryAndTaskController* display_controller,
-    const gpu::SharedMemoryLimits& mem_limits) {
-  const bool is_offscreen = surface_handle == gpu::kNullSurfaceHandle;
-  DCHECK(display_controller);
-  gpu_task_scheduler_helper_ = display_controller->gpu_task_scheduler();
-
-  command_buffer_ = std::make_unique<gpu::InProcessCommandBuffer>(
-      task_executor,
-      GURL("chrome://gpu/VizProcessContextProvider::InitializeContext"));
-  context_result_ = command_buffer_->Initialize(
-      /*surface=*/nullptr, is_offscreen, surface_handle, attributes_,
-      gpu_memory_buffer_manager, image_factory, gpu_channel_manager_delegate,
-      base::ThreadTaskRunnerHandle::Get(),
-      gpu_task_scheduler_helper_->GetTaskSequence(),
-      display_controller->controller_on_gpu(), nullptr, nullptr);
-  if (context_result_ != gpu::ContextResult::kSuccess) {
-    DLOG(ERROR) << "Failed to initialize InProcessCommmandBuffer";
-    return;
-  }
-
-  // Create the GLES2 helper, which writes the command buffer protocol.
-  gles2_helper_ =
-      std::make_unique<gpu::gles2::GLES2CmdHelper>(command_buffer_.get());
-  context_result_ = gles2_helper_->Initialize(mem_limits.command_buffer_size);
-  if (context_result_ != gpu::ContextResult::kSuccess) {
-    DLOG(ERROR) << "Failed to initialize GLES2CmdHelper";
-    return;
-  }
-
-  if (gpu_task_scheduler_helper_)
-    gpu_task_scheduler_helper_->Initialize(gles2_helper_.get());
-
-  transfer_buffer_ = std::make_unique<gpu::TransferBuffer>(gles2_helper_.get());
-
-  // Create the object exposing the OpenGL API.
-  gles2_implementation_ =
-      std::make_unique<skia_bindings::GLES2ImplementationWithGrContextSupport>(
-          gles2_helper_.get(), /*share_group=*/nullptr, transfer_buffer_.get(),
-          attributes_.bind_generates_resource,
-          attributes_.lose_context_when_out_of_memory,
-          /*support_client_side_arrays=*/false, command_buffer_.get());
-
-  context_result_ = gles2_implementation_->Initialize(mem_limits);
-  if (context_result_ != gpu::ContextResult::kSuccess) {
-    DLOG(ERROR) << "Failed to initialize GLES2Implementation";
-    return;
-  }
-
-  cache_controller_ = std::make_unique<ContextCacheController>(
-      gles2_implementation_.get(), base::ThreadTaskRunnerHandle::Get());
-
-  // TraceEndCHROMIUM is implicit when the context is destroyed
-  gles2_implementation_->TraceBeginCHROMIUM("VizCompositor",
-                                            "DisplayCompositor");
-}
-
-void VizProcessContextProvider::OnContextLost() {
-  for (auto& observer : observers_)
-    observer.OnContextLost();
-  if (gr_context_)
-    gr_context_->OnLostContext();
-
-  gpu::CommandBuffer::State state = command_buffer_->GetLastState();
-  UmaRecordContextLost(
-      GetContextLostReason(state.error, state.context_lost_reason));
-}
-
-bool VizProcessContextProvider::OnMemoryDump(
-    const base::trace_event::MemoryDumpArgs& args,
-    base::trace_event::ProcessMemoryDump* pmd) {
-  DCHECK_EQ(context_result_, gpu::ContextResult::kSuccess);
-  if (args.level_of_detail ==
-      base::trace_event::MemoryDumpLevelOfDetail::BACKGROUND) {
-    if (gr_context_)
-      gpu::raster::DumpBackgroundGrMemoryStatistics(gr_context_->get(), pmd);
-
-    // Early out, no need for more detail in a BACKGROUND dump.
-    return true;
-  }
-
-  gles2_implementation_->OnMemoryDump(args, pmd);
-  gles2_helper_->OnMemoryDump(args, pmd);
-
-  if (gr_context_) {
-    gpu::raster::DumpGrMemoryStatistics(
-        gr_context_->get(), pmd,
-        gles2_implementation_->ShareGroupTracingGUID());
-  }
-  return true;
-}
-
-base::ScopedClosureRunner VizProcessContextProvider::GetCacheBackBufferCb() {
-  return command_buffer_->GetCacheBackBufferCb();
-}
-
-void VizProcessContextProvider::SetNeedsMeasureNextDrawLatency() {
-  return command_buffer_->SetNeedsMeasureNextDrawLatency();
-}
-
-}  // namespace viz
diff --git a/components/viz/service/display_embedder/viz_process_context_provider.h b/components/viz/service/display_embedder/viz_process_context_provider.h
deleted file mode 100644
index 8ff0ccc..0000000
--- a/components/viz/service/display_embedder/viz_process_context_provider.h
+++ /dev/null
@@ -1,136 +0,0 @@
-// Copyright 2016 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 COMPONENTS_VIZ_SERVICE_DISPLAY_EMBEDDER_VIZ_PROCESS_CONTEXT_PROVIDER_H_
-#define COMPONENTS_VIZ_SERVICE_DISPLAY_EMBEDDER_VIZ_PROCESS_CONTEXT_PROVIDER_H_
-
-#include <stdint.h>
-
-#include <memory>
-
-#include "base/callback_helpers.h"
-#include "base/memory/raw_ptr.h"
-#include "base/observer_list.h"
-#include "base/trace_event/memory_dump_provider.h"
-#include "components/viz/common/display/update_vsync_parameters_callback.h"
-#include "components/viz/common/gpu/context_cache_controller.h"
-#include "components/viz/common/gpu/context_provider.h"
-#include "components/viz/common/gpu/gpu_vsync_callback.h"
-#include "components/viz/service/viz_service_export.h"
-#include "gpu/command_buffer/common/context_creation_attribs.h"
-#include "gpu/ipc/common/surface_handle.h"
-#include "gpu/ipc/gpu_task_scheduler_helper.h"
-#include "ui/gfx/native_widget_types.h"
-
-class GrDirectContext;
-
-namespace gpu {
-namespace gles2 {
-class GLES2CmdHelper;
-class GLES2Implementation;
-}  // namespace gles2
-class CommandBufferTaskExecutor;
-class GpuChannelManagerDelegate;
-class GpuMemoryBufferManager;
-class ImageFactory;
-class InProcessCommandBuffer;
-class TransferBuffer;
-struct SharedMemoryLimits;
-}  // namespace gpu
-
-namespace skia_bindings {
-class GrContextForGLES2Interface;
-}
-
-namespace viz {
-class ContextLostObserver;
-class DisplayCompositorMemoryAndTaskController;
-class GpuTaskSchedulerHelper;
-class RendererSettings;
-
-// A ContextProvider used in the viz process to setup an InProcessCommandBuffer
-// for the display compositor.
-class VIZ_SERVICE_EXPORT VizProcessContextProvider
-    : public base::RefCountedThreadSafe<VizProcessContextProvider>,
-      public ContextProvider,
-      public base::trace_event::MemoryDumpProvider {
- public:
-  VizProcessContextProvider(
-      gpu::CommandBufferTaskExecutor* task_executor,
-      gpu::SurfaceHandle surface_handle,
-      gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
-      gpu::ImageFactory* image_factory,
-      gpu::GpuChannelManagerDelegate* gpu_channel_manager_delegate,
-      DisplayCompositorMemoryAndTaskController* display_controller,
-      const RendererSettings& renderer_settings);
-
-  // ContextProvider implementation.
-  void AddRef() const override;
-  void Release() const override;
-  gpu::ContextResult BindToCurrentThread() override;
-  gpu::gles2::GLES2Interface* ContextGL() override;
-  gpu::ContextSupport* ContextSupport() override;
-  class GrDirectContext* GrContext() override;
-  gpu::SharedImageInterface* SharedImageInterface() override;
-  ContextCacheController* CacheController() override;
-  base::Lock* GetLock() override;
-  const gpu::Capabilities& ContextCapabilities() const override;
-  const gpu::GpuFeatureInfo& GetGpuFeatureInfo() const override;
-  void AddObserver(ContextLostObserver* obs) override;
-  void RemoveObserver(ContextLostObserver* obs) override;
-
-  virtual void SetUpdateVSyncParametersCallback(
-      UpdateVSyncParametersCallback callback);
-  virtual void SetGpuVSyncCallback(GpuVSyncCallback callback);
-  virtual void SetGpuVSyncEnabled(bool enabled);
-  virtual bool UseRGB565PixelFormat() const;
-
-  // Provides the GL internal format that should be used when calling
-  // glCopyTexImage2D() on the default framebuffer.
-  virtual uint32_t GetCopyTextureInternalFormat();
-
-  virtual base::ScopedClosureRunner GetCacheBackBufferCb();
-
-  void SetNeedsMeasureNextDrawLatency();
-
- protected:
-  friend class base::RefCountedThreadSafe<VizProcessContextProvider>;
-  VizProcessContextProvider();  // For testing only.
-  ~VizProcessContextProvider() override;
-
- private:
-  void InitializeContext(
-      gpu::CommandBufferTaskExecutor* task_executor,
-      gpu::SurfaceHandle surface_handle,
-      gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
-      gpu::ImageFactory* image_factory,
-      gpu::GpuChannelManagerDelegate* gpu_channel_manager_delegate,
-      DisplayCompositorMemoryAndTaskController* display_controller,
-      const gpu::SharedMemoryLimits& mem_limits);
-  void OnContextLost();
-
-  // base::trace_event::MemoryDumpProvider implementation.
-  bool OnMemoryDump(const base::trace_event::MemoryDumpArgs& args,
-                    base::trace_event::ProcessMemoryDump* pmd) override;
-
-  const gpu::ContextCreationAttribs attributes_;
-
-  // The |gpu_task_scheduler_helper_| has 1:1 relationship with the Display
-  // compositor.
-  raw_ptr<gpu::GpuTaskSchedulerHelper> gpu_task_scheduler_helper_;
-  std::unique_ptr<gpu::InProcessCommandBuffer> command_buffer_;
-  std::unique_ptr<gpu::gles2::GLES2CmdHelper> gles2_helper_;
-  std::unique_ptr<gpu::TransferBuffer> transfer_buffer_;
-  std::unique_ptr<gpu::gles2::GLES2Implementation> gles2_implementation_;
-  std::unique_ptr<ContextCacheController> cache_controller_;
-  gpu::ContextResult context_result_ = gpu::ContextResult::kSuccess;
-
-  std::unique_ptr<skia_bindings::GrContextForGLES2Interface> gr_context_;
-
-  base::ObserverList<ContextLostObserver>::Unchecked observers_;
-};
-
-}  // namespace viz
-
-#endif  // COMPONENTS_VIZ_SERVICE_DISPLAY_EMBEDDER_VIZ_PROCESS_CONTEXT_PROVIDER_H_
diff --git a/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.cc b/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.cc
index 4e38e0f..8eeb87e 100644
--- a/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.cc
+++ b/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.cc
@@ -81,7 +81,7 @@
   mojo::Remote<mojom::DisplayClient> display_client(
       std::move(params->display_client));
   auto display_controller = output_surface_provider->CreateGpuDependency(
-      params->gpu_compositing, params->widget, params->renderer_settings);
+      params->gpu_compositing, params->widget);
   auto output_surface = output_surface_provider->CreateOutputSurface(
       params->widget, params->gpu_compositing, display_client.get(),
       display_controller.get(), params->renderer_settings, debug_settings);
@@ -175,9 +175,7 @@
   auto* output_surface_ptr = output_surface.get();
 #endif
   gpu::SharedImageInterface* sii = nullptr;
-  if (output_surface->context_provider())
-    sii = output_surface->context_provider()->SharedImageInterface();
-  else if (display_controller)
+  if (display_controller)
     sii = display_controller->shared_image_interface();
 
   auto overlay_processor = OverlayProcessorInterface::CreateOverlayProcessor(
diff --git a/components/viz/test/test_in_process_context_provider.cc b/components/viz/test/test_in_process_context_provider.cc
index d083e8f..f08ddc7 100644
--- a/components/viz/test/test_in_process_context_provider.cc
+++ b/components/viz/test/test_in_process_context_provider.cc
@@ -40,8 +40,7 @@
 std::unique_ptr<gpu::GLInProcessContext> CreateGLInProcessContext(
     TestGpuMemoryBufferManager* gpu_memory_buffer_manager,
     TestImageFactory* image_factory,
-    scoped_refptr<base::SingleThreadTaskRunner> task_runner,
-    DisplayCompositorMemoryAndTaskController* display_controller) {
+    scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
   const bool is_offscreen = true;
   gpu::ContextCreationAttribs attribs;
   attribs.alpha_size = -1;
@@ -54,23 +53,13 @@
   attribs.enable_oop_rasterization = false;
 
   auto context = std::make_unique<gpu::GLInProcessContext>();
-  if (display_controller) {
-    auto result = context->Initialize(
-        TestGpuServiceHolder::GetInstance()->task_executor(), nullptr,
-        is_offscreen, gpu::kNullSurfaceHandle, attribs,
-        gpu::SharedMemoryLimits(), gpu_memory_buffer_manager, image_factory,
-        display_controller->gpu_task_scheduler(),
-        display_controller->controller_on_gpu(), std::move(task_runner));
+  auto result = context->Initialize(
+      TestGpuServiceHolder::GetInstance()->task_executor(), nullptr,
+      is_offscreen, gpu::kNullSurfaceHandle, attribs, gpu::SharedMemoryLimits(),
+      gpu_memory_buffer_manager, image_factory, nullptr, nullptr,
+      std::move(task_runner));
+  DCHECK_EQ(result, gpu::ContextResult::kSuccess);
 
-    DCHECK_EQ(result, gpu::ContextResult::kSuccess);
-  } else {
-    auto result = context->Initialize(
-        TestGpuServiceHolder::GetInstance()->task_executor(), nullptr,
-        is_offscreen, gpu::kNullSurfaceHandle, attribs,
-        gpu::SharedMemoryLimits(), gpu_memory_buffer_manager, image_factory,
-        nullptr, nullptr, std::move(task_runner));
-    DCHECK_EQ(result, gpu::ContextResult::kSuccess);
-  }
   return context;
 }
 
@@ -78,7 +67,7 @@
 
 std::unique_ptr<gpu::GLInProcessContext> CreateTestInProcessContext() {
   return CreateGLInProcessContext(nullptr, nullptr,
-                                  base::ThreadTaskRunnerHandle::Get(), nullptr);
+                                  base::ThreadTaskRunnerHandle::Get());
 }
 
 TestInProcessContextProvider::TestInProcessContextProvider(
@@ -105,13 +94,9 @@
   auto* holder = TestGpuServiceHolder::GetInstance();
 
   if (type_ == TestContextType::kGLES2) {
-    display_controller_ =
-        std::make_unique<DisplayCompositorMemoryAndTaskController>(
-            holder->task_executor(), &image_factory_);
-
-    gles2_context_ = CreateGLInProcessContext(
-        &gpu_memory_buffer_manager_, &image_factory_,
-        base::ThreadTaskRunnerHandle::Get(), display_controller_.get());
+    gles2_context_ =
+        CreateGLInProcessContext(&gpu_memory_buffer_manager_, &image_factory_,
+                                 base::ThreadTaskRunnerHandle::Get());
 
     caps_ = gles2_context_->GetCapabilities();
   } else {
diff --git a/components/viz/test/test_in_process_context_provider.h b/components/viz/test/test_in_process_context_provider.h
index 0478e80..de546b4 100644
--- a/components/viz/test/test_in_process_context_provider.h
+++ b/components/viz/test/test_in_process_context_provider.h
@@ -35,7 +35,6 @@
 }
 
 namespace viz {
-class DisplayCompositorMemoryAndTaskController;
 
 std::unique_ptr<gpu::GLInProcessContext> CreateTestInProcessContext();
 
@@ -88,7 +87,6 @@
   gpu::Capabilities caps_;
 
   // Used for GLES2 contexts only.
-  std::unique_ptr<DisplayCompositorMemoryAndTaskController> display_controller_;
   std::unique_ptr<gpu::GLInProcessContext> gles2_context_;
   std::unique_ptr<skia_bindings::GrContextForGLES2Interface> gr_context_;
 
diff --git a/components/viz/test/test_output_surface_provider.cc b/components/viz/test/test_output_surface_provider.cc
index 383e68fa8..6f54f3bb 100644
--- a/components/viz/test/test_output_surface_provider.cc
+++ b/components/viz/test/test_output_surface_provider.cc
@@ -18,8 +18,7 @@
 std::unique_ptr<DisplayCompositorMemoryAndTaskController>
 TestOutputSurfaceProvider::CreateGpuDependency(
     bool gpu_compositing,
-    gpu::SurfaceHandle surface_handle,
-    const RendererSettings& renderer_settings) {
+    gpu::SurfaceHandle surface_handle) {
   // The output surface doesn't have a real gpu thread, and there is no overlay
   // support.
   return nullptr;
diff --git a/components/viz/test/test_output_surface_provider.h b/components/viz/test/test_output_surface_provider.h
index f4b7e4b..f3d30c3 100644
--- a/components/viz/test/test_output_surface_provider.h
+++ b/components/viz/test/test_output_surface_provider.h
@@ -25,8 +25,7 @@
   // OutputSurfaceProvider implementation.
   std::unique_ptr<DisplayCompositorMemoryAndTaskController> CreateGpuDependency(
       bool gpu_compositing,
-      gpu::SurfaceHandle surface_handle,
-      const RendererSettings& renderer_settings) override;
+      gpu::SurfaceHandle surface_handle) override;
   std::unique_ptr<OutputSurface> CreateOutputSurface(
       gpu::SurfaceHandle surface_handle,
       bool gpu_compositing,
diff --git a/components/wifi/fake_wifi_service.cc b/components/wifi/fake_wifi_service.cc
index d60428f4..f429a58f 100644
--- a/components/wifi/fake_wifi_service.cc
+++ b/components/wifi/fake_wifi_service.cc
@@ -54,53 +54,51 @@
 }
 
 void FakeWiFiService::GetProperties(const std::string& network_guid,
-                                    base::DictionaryValue* properties,
+                                    base::Value::Dict* properties,
                                     std::string* error) {
   NetworkList::iterator network_properties = FindNetwork(network_guid);
   if (network_properties == networks_.end()) {
     *error = "Error.InvalidNetworkGuid";
     return;
   }
-  properties->Swap(network_properties->ToValue(false).get());
+  *properties = network_properties->ToValue(/*network_list=*/false);
 }
 
 void FakeWiFiService::GetManagedProperties(
     const std::string& network_guid,
-    base::DictionaryValue* managed_properties,
+    base::Value::Dict* managed_properties,
     std::string* error) {
   // Not implemented
   *error = kErrorWiFiService;
 }
 
 void FakeWiFiService::GetState(const std::string& network_guid,
-                               base::DictionaryValue* properties,
+                               base::Value::Dict* properties,
                                std::string* error) {
   NetworkList::iterator network_properties = FindNetwork(network_guid);
   if (network_properties == networks_.end()) {
     *error = "Error.InvalidNetworkGuid";
     return;
   }
-  properties->Swap(network_properties->ToValue(true).get());
+  *properties = network_properties->ToValue(/*network_list=*/true);
 }
 
-void FakeWiFiService::SetProperties(
-    const std::string& network_guid,
-    std::unique_ptr<base::DictionaryValue> properties,
-    std::string* error) {
+void FakeWiFiService::SetProperties(const std::string& network_guid,
+                                    base::Value::Dict properties,
+                                    std::string* error) {
   NetworkList::iterator network_properties = FindNetwork(network_guid);
   if (network_properties == networks_.end() ||
-      !network_properties->UpdateFromValue(*properties)) {
+      !network_properties->UpdateFromValue(properties)) {
     *error = "Error.DBusFailed";
   }
 }
 
-void FakeWiFiService::CreateNetwork(
-    bool shared,
-    std::unique_ptr<base::DictionaryValue> properties,
-    std::string* network_guid,
-    std::string* error) {
+void FakeWiFiService::CreateNetwork(bool shared,
+                                    base::Value::Dict properties,
+                                    std::string* network_guid,
+                                    std::string* error) {
   NetworkProperties network_properties;
-  if (network_properties.UpdateFromValue(*properties)) {
+  if (network_properties.UpdateFromValue(properties)) {
     network_properties.guid = network_properties.ssid;
     networks_.push_back(network_properties);
     *network_guid = network_properties.guid;
@@ -110,17 +108,14 @@
 }
 
 void FakeWiFiService::GetVisibleNetworks(const std::string& network_type,
-                                         base::ListValue* network_list,
-                                         bool include_details) {
+                                         bool include_details,
+                                         base::Value::List* network_list) {
   for (NetworkList::const_iterator it = networks_.begin();
        it != networks_.end();
        ++it) {
     if (network_type.empty() || network_type == onc::network_type::kAllTypes ||
         it->type == network_type) {
-      std::unique_ptr<base::DictionaryValue> network(
-          it->ToValue(!include_details));
-      network_list->GetList().Append(
-          base::Value::FromUniquePtrValue(std::move(network)));
+      network_list->Append(it->ToValue(/*network_list=*/!include_details));
     }
   }
 }
diff --git a/components/wifi/fake_wifi_service.h b/components/wifi/fake_wifi_service.h
index 768b144..b3b5301 100644
--- a/components/wifi/fake_wifi_service.h
+++ b/components/wifi/fake_wifi_service.h
@@ -29,24 +29,24 @@
       scoped_refptr<base::SequencedTaskRunner> task_runner) override;
   void UnInitialize() override;
   void GetProperties(const std::string& network_guid,
-                     base::DictionaryValue* properties,
+                     base::Value::Dict* properties,
                      std::string* error) override;
   void GetManagedProperties(const std::string& network_guid,
-                            base::DictionaryValue* managed_properties,
+                            base::Value::Dict* managed_properties,
                             std::string* error) override;
   void GetState(const std::string& network_guid,
-                base::DictionaryValue* properties,
+                base::Value::Dict* properties,
                 std::string* error) override;
   void SetProperties(const std::string& network_guid,
-                     std::unique_ptr<base::DictionaryValue> properties,
+                     base::Value::Dict properties,
                      std::string* error) override;
   void CreateNetwork(bool shared,
-                     std::unique_ptr<base::DictionaryValue> properties,
+                     base::Value::Dict properties,
                      std::string* network_guid,
                      std::string* error) override;
   void GetVisibleNetworks(const std::string& network_type,
-                          base::ListValue* network_list,
-                          bool include_details) override;
+                          bool include_details,
+                          base::Value::List* network_list) override;
   void RequestNetworkScan() override;
   void StartConnect(const std::string& network_guid,
                     std::string* error) override;
diff --git a/components/wifi/network_properties.cc b/components/wifi/network_properties.cc
index f1801abe..6171e71f0e 100644
--- a/components/wifi/network_properties.cc
+++ b/components/wifi/network_properties.cc
@@ -27,83 +27,80 @@
 NetworkProperties::~NetworkProperties() {
 }
 
-std::unique_ptr<base::DictionaryValue> NetworkProperties::ToValue(
-    bool network_list) const {
-  std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue());
+base::Value::Dict NetworkProperties::ToValue(bool network_list) const {
+  base::Value::Dict value;
 
-  value->SetStringPath(onc::network_config::kGUID, guid);
-  value->SetStringPath(onc::network_config::kName, name);
-  value->SetStringPath(onc::network_config::kConnectionState, connection_state);
+  value.Set(onc::network_config::kGUID, guid);
+  value.Set(onc::network_config::kName, name);
+  value.Set(onc::network_config::kConnectionState, connection_state);
   DCHECK(type == onc::network_type::kWiFi);
-  value->SetString(onc::network_config::kType, type);
+  value.Set(onc::network_config::kType, type);
 
   // For now, assume all WiFi services are connectable.
-  value->SetBoolPath(onc::network_config::kConnectable, true);
+  value.Set(onc::network_config::kConnectable, true);
 
-  base::DictionaryValue wifi;
-  wifi.SetStringPath(onc::wifi::kSecurity, security);
-  wifi.SetIntPath(onc::wifi::kSignalStrength, signal_strength);
+  base::Value::Dict wifi;
+  wifi.Set(onc::wifi::kSecurity, security);
+  wifi.Set(onc::wifi::kSignalStrength, static_cast<int>(signal_strength));
 
   // Network list expects subset of data.
   if (!network_list) {
     if (frequency != kFrequencyUnknown)
-      wifi.SetIntPath(onc::wifi::kFrequency, frequency);
-    base::ListValue frequency_list;
+      wifi.Set(onc::wifi::kFrequency, frequency);
+    base::Value::List frequency_list;
     for (FrequencySet::const_iterator it = this->frequency_set.begin();
          it != this->frequency_set.end();
          ++it) {
       frequency_list.Append(*it);
     }
-    if (!frequency_list.GetListDeprecated().empty())
-      wifi.SetPath(onc::wifi::kFrequencyList, std::move(frequency_list));
+    if (!frequency_list.empty()) {
+      wifi.Set(onc::wifi::kFrequencyList, std::move(frequency_list));
+    }
     if (!bssid.empty())
-      wifi.SetStringPath(onc::wifi::kBSSID, bssid);
-    wifi.SetStringPath(onc::wifi::kSSID, ssid);
-    wifi.SetStringPath(onc::wifi::kHexSSID,
-                       base::HexEncode(ssid.c_str(), ssid.size()));
+      wifi.Set(onc::wifi::kBSSID, bssid);
+    wifi.Set(onc::wifi::kSSID, ssid);
+    wifi.Set(onc::wifi::kHexSSID, base::HexEncode(ssid.c_str(), ssid.size()));
   }
-  value->SetPath(onc::network_type::kWiFi, std::move(wifi));
+  value.Set(onc::network_type::kWiFi, std::move(wifi));
 
   return value;
 }
 
-bool NetworkProperties::UpdateFromValue(const base::DictionaryValue& value) {
-  const base::DictionaryValue* wifi = nullptr;
-  std::string network_type;
+bool NetworkProperties::UpdateFromValue(const base::Value::Dict& value) {
+  const std::string* network_type =
+      value.FindString(onc::network_config::kType);
   // Get network type and make sure that it is WiFi (if specified).
-  if (value.GetString(onc::network_config::kType, &network_type)) {
-    if (network_type != onc::network_type::kWiFi)
+  if (network_type) {
+    if (*network_type != onc::network_type::kWiFi)
       return false;
-    type = network_type;
+    type = *network_type;
   }
-  if (value.GetDictionary(onc::network_type::kWiFi, &wifi)) {
-    const std::string* name_ptr =
-        value.FindStringPath(onc::network_config::kName);
+
+  const base::Value::Dict* wifi = value.FindDict(onc::network_type::kWiFi);
+  if (wifi) {
+    const std::string* name_ptr = value.FindString(onc::network_config::kName);
     if (name_ptr)
       name = *name_ptr;
-    const std::string* guid_ptr =
-        value.FindStringPath(onc::network_config::kGUID);
+    const std::string* guid_ptr = value.FindString(onc::network_config::kGUID);
     if (guid_ptr)
       guid = *guid_ptr;
     const std::string* connection_state_ptr =
-        value.FindStringPath(onc::network_config::kConnectionState);
+        value.FindString(onc::network_config::kConnectionState);
     if (connection_state_ptr)
       connection_state = *connection_state_ptr;
 
-    const std::string* security_ptr =
-        wifi->FindStringPath(onc::wifi::kSecurity);
+    const std::string* security_ptr = wifi->FindString(onc::wifi::kSecurity);
     if (security_ptr)
       security = *security_ptr;
-    const std::string* ssid_ptr = wifi->FindStringPath(onc::wifi::kSSID);
+    const std::string* ssid_ptr = wifi->FindString(onc::wifi::kSSID);
     if (ssid_ptr)
       ssid = *ssid_ptr;
-    const std::string* password_ptr =
-        wifi->FindStringPath(onc::wifi::kPassphrase);
+    const std::string* password_ptr = wifi->FindString(onc::wifi::kPassphrase);
     if (password_ptr)
       password = *password_ptr;
 
     absl::optional<bool> auto_connect_opt =
-        wifi->FindBoolKey(onc::wifi::kAutoConnect);
+        wifi->FindBool(onc::wifi::kAutoConnect);
     if (auto_connect_opt)
       auto_connect = *auto_connect_opt;
 
diff --git a/components/wifi/network_properties.h b/components/wifi/network_properties.h
index 07bfe1dc..89c2aea5 100644
--- a/components/wifi/network_properties.h
+++ b/components/wifi/network_properties.h
@@ -52,9 +52,9 @@
   Frequency frequency;
   FrequencySet frequency_set;
 
-  std::unique_ptr<base::DictionaryValue> ToValue(bool network_list) const;
+  base::Value::Dict ToValue(bool network_list) const;
   // Updates only properties set in |value|.
-  bool UpdateFromValue(const base::DictionaryValue& value);
+  bool UpdateFromValue(const base::Value::Dict& value);
   static std::string MacAddressAsString(const uint8_t mac_as_int[6]);
   static bool OrderByType(const NetworkProperties& l,
                           const NetworkProperties& r);
diff --git a/components/wifi/wifi_service.h b/components/wifi/wifi_service.h
index 4486a0d..bd5b68c2 100644
--- a/components/wifi/wifi_service.h
+++ b/components/wifi/wifi_service.h
@@ -48,7 +48,7 @@
   // Get Properties of network identified by |network_guid|. Populates
   // |properties| on success, |error| on failure.
   virtual void GetProperties(const std::string& network_guid,
-                             base::DictionaryValue* properties,
+                             base::Value::Dict* properties,
                              std::string* error) = 0;
 
   // Gets the merged properties of the network with id |network_guid| from the
@@ -56,7 +56,7 @@
   // the currently active settings. Populates |managed_properties| on success,
   // |error| on failure.
   virtual void GetManagedProperties(const std::string& network_guid,
-                                    base::DictionaryValue* managed_properties,
+                                    base::Value::Dict* managed_properties,
                                     std::string* error) = 0;
 
   // Get the cached read-only properties of the network with id |network_guid|.
@@ -65,13 +65,13 @@
   // returns a subset of the properties returned by |GetProperties|. Populates
   // |properties| on success, |error| on failure.
   virtual void GetState(const std::string& network_guid,
-                        base::DictionaryValue* properties,
+                        base::Value::Dict* properties,
                         std::string* error) = 0;
 
   // Set Properties of network identified by |network_guid|. Populates |error|
   // on failure.
   virtual void SetProperties(const std::string& network_guid,
-                             std::unique_ptr<base::DictionaryValue> properties,
+                             base::Value::Dict properties,
                              std::string* error) = 0;
 
   // Creates a new network configuration from |properties|. If |shared| is true,
@@ -79,15 +79,15 @@
   // network already exists, this will fail and populate |error|. On success
   // populates the |network_guid| of the new network.
   virtual void CreateNetwork(bool shared,
-                             std::unique_ptr<base::DictionaryValue> properties,
+                             base::Value::Dict properties,
                              std::string* network_guid,
                              std::string* error) = 0;
 
   // Get list of visible networks of |network_type| (one of onc::network_type).
   // Populates |network_list| on success.
   virtual void GetVisibleNetworks(const std::string& network_type,
-                                  base::ListValue* network_list,
-                                  bool include_details) = 0;
+                                  bool include_details,
+                                  base::Value::List* network_list) = 0;
 
   // Request network scan. Send |NetworkListChanged| event on completion.
   virtual void RequestNetworkScan() = 0;
diff --git a/components/wifi/wifi_service_fuchsia.cc b/components/wifi/wifi_service_fuchsia.cc
index 082c9735..2d5f594 100644
--- a/components/wifi/wifi_service_fuchsia.cc
+++ b/components/wifi/wifi_service_fuchsia.cc
@@ -24,35 +24,35 @@
   void UnInitialize() override { NOTIMPLEMENTED_LOG_ONCE(); }
 
   void GetProperties(const std::string& network_guid,
-                     base::DictionaryValue* properties,
+                     base::Value::Dict* properties,
                      std::string* error) override {
     *error = kErrorNotImplemented;
     NOTIMPLEMENTED_LOG_ONCE();
   }
 
   void GetManagedProperties(const std::string& network_guid,
-                            base::DictionaryValue* managed_properties,
+                            base::Value::Dict* managed_properties,
                             std::string* error) override {
     *error = kErrorNotImplemented;
     NOTIMPLEMENTED_LOG_ONCE();
   }
 
   void GetState(const std::string& network_guid,
-                base::DictionaryValue* properties,
+                base::Value::Dict* properties,
                 std::string* error) override {
     *error = kErrorNotImplemented;
     NOTIMPLEMENTED_LOG_ONCE();
   }
 
   void SetProperties(const std::string& network_guid,
-                     std::unique_ptr<base::DictionaryValue> properties,
+                     base::Value::Dict properties,
                      std::string* error) override {
     *error = kErrorNotImplemented;
     NOTIMPLEMENTED_LOG_ONCE();
   }
 
   void CreateNetwork(bool shared,
-                     std::unique_ptr<base::DictionaryValue> properties,
+                     base::Value::Dict properties,
                      std::string* network_guid,
                      std::string* error) override {
     *error = kErrorNotImplemented;
@@ -60,8 +60,8 @@
   }
 
   void GetVisibleNetworks(const std::string& network_type,
-                          base::ListValue* network_list,
-                          bool include_details) override {
+                          bool include_details,
+                          base::Value::List* network_list) override {
     NOTIMPLEMENTED_LOG_ONCE();
   }
 
diff --git a/components/wifi/wifi_service_mac.mm b/components/wifi/wifi_service_mac.mm
index b1366854..f4d75ea7 100644
--- a/components/wifi/wifi_service_mac.mm
+++ b/components/wifi/wifi_service_mac.mm
@@ -43,29 +43,29 @@
   void UnInitialize() override;
 
   void GetProperties(const std::string& network_guid,
-                     base::DictionaryValue* properties,
+                     base::Value::Dict* properties,
                      std::string* error) override;
 
   void GetManagedProperties(const std::string& network_guid,
-                            base::DictionaryValue* managed_properties,
+                            base::Value::Dict* managed_properties,
                             std::string* error) override;
 
   void GetState(const std::string& network_guid,
-                base::DictionaryValue* properties,
+                base::Value::Dict* properties,
                 std::string* error) override;
 
   void SetProperties(const std::string& network_guid,
-                     std::unique_ptr<base::DictionaryValue> properties,
+                     base::Value::Dict properties,
                      std::string* error) override;
 
   void CreateNetwork(bool shared,
-                     std::unique_ptr<base::DictionaryValue> properties,
+                     base::Value::Dict properties,
                      std::string* network_guid,
                      std::string* error) override;
 
   void GetVisibleNetworks(const std::string& network_type,
-                          base::ListValue* network_list,
-                          bool include_details) override;
+                          bool include_details,
+                          base::Value::List* network_list) override;
 
   void RequestNetworkScan() override;
 
@@ -155,7 +155,7 @@
   // Guid of last known connected network.
   std::string connected_network_guid_;
   // Temporary storage of network properties indexed by |network_guid|.
-  base::DictionaryValue network_properties_;
+  base::Value::Dict network_properties_;
 };
 
 WiFiServiceMac::WiFiServiceMac() : wlan_observer_(nil) {
@@ -189,7 +189,7 @@
 }
 
 void WiFiServiceMac::GetProperties(const std::string& network_guid,
-                                   base::DictionaryValue* properties,
+                                   base::Value::Dict* properties,
                                    std::string* error) {
   NetworkList::iterator it = FindNetwork(network_guid);
   if (it == networks_.end()) {
@@ -199,47 +199,42 @@
   }
 
   it->connection_state = GetNetworkConnectionState(network_guid);
-  std::unique_ptr<base::DictionaryValue> network(it->ToValue(false));
-  properties->Swap(network.get());
+  *properties = it->ToValue(/*network_list=*/false);
   DVLOG(1) << *properties;
 }
 
-void WiFiServiceMac::GetManagedProperties(
-    const std::string& network_guid,
-    base::DictionaryValue* managed_properties,
-    std::string* error) {
+void WiFiServiceMac::GetManagedProperties(const std::string& network_guid,
+                                          base::Value::Dict* managed_properties,
+                                          std::string* error) {
   *error = kErrorNotImplemented;
 }
 
 void WiFiServiceMac::GetState(const std::string& network_guid,
-                              base::DictionaryValue* properties,
+                              base::Value::Dict* properties,
                               std::string* error) {
   *error = kErrorNotImplemented;
 }
 
-void WiFiServiceMac::SetProperties(
-    const std::string& network_guid,
-    std::unique_ptr<base::DictionaryValue> properties,
-    std::string* error) {
-  base::DictionaryValue* existing_properties;
+void WiFiServiceMac::SetProperties(const std::string& network_guid,
+                                   base::Value::Dict properties,
+                                   std::string* error) {
   // If the network properties already exist, don't override previously set
   // properties, unless they are set in |properties|.
-  if (network_properties_.GetDictionaryWithoutPathExpansion(
-          network_guid, &existing_properties)) {
-    existing_properties->MergeDictionary(properties.get());
+  base::Value::Dict* existing_properties =
+      network_properties_.FindDict(network_guid);
+  if (existing_properties) {
+    existing_properties->Merge(properties);
   } else {
-    network_properties_.SetWithoutPathExpansion(network_guid,
-                                                std::move(properties));
+    network_properties_.Set(network_guid, std::move(properties));
   }
 }
 
-void WiFiServiceMac::CreateNetwork(
-    bool shared,
-    std::unique_ptr<base::DictionaryValue> properties,
-    std::string* network_guid,
-    std::string* error) {
+void WiFiServiceMac::CreateNetwork(bool shared,
+                                   base::Value::Dict properties,
+                                   std::string* network_guid,
+                                   std::string* error) {
   NetworkProperties network_properties;
-  if (!network_properties.UpdateFromValue(*properties)) {
+  if (!network_properties.UpdateFromValue(properties)) {
     *error = kErrorInvalidData;
     return;
   }
@@ -249,13 +244,13 @@
     *error = kErrorInvalidData;
     return;
   }
-  network_properties_.SetWithoutPathExpansion(guid, std::move(properties));
+  network_properties_.Set(guid, std::move(properties));
   *network_guid = guid;
 }
 
 void WiFiServiceMac::GetVisibleNetworks(const std::string& network_type,
-                                        base::ListValue* network_list,
-                                        bool include_details) {
+                                        bool include_details,
+                                        base::Value::List* network_list) {
   if (!network_type.empty() &&
       network_type != onc::network_type::kAllTypes &&
       network_type != onc::network_type::kWiFi) {
@@ -268,10 +263,7 @@
   for (NetworkList::const_iterator it = networks_.begin();
        it != networks_.end();
        ++it) {
-    std::unique_ptr<base::DictionaryValue> network(
-        it->ToValue(!include_details));
-    network_list->GetList().Append(
-        base::Value::FromUniquePtrValue(std::move(network)));
+    network_list->Append(it->ToValue(/*network_list=*/!include_details));
   }
 }
 
@@ -314,15 +306,15 @@
   }
 
   // Check whether WiFi Password is set in |network_properties_|.
-  base::DictionaryValue* properties;
-  base::DictionaryValue* wifi;
-  std::string passphrase;
+  base::Value::Dict* properties = network_properties_.FindDict(network_guid);
   NSString* ns_password = nil;
-  if (network_properties_.GetDictionaryWithoutPathExpansion(network_guid,
-                                                            &properties) &&
-      properties->GetDictionary(onc::network_type::kWiFi, &wifi) &&
-      wifi->GetString(onc::wifi::kPassphrase, &passphrase)) {
-    ns_password = base::SysUTF8ToNSString(passphrase);
+  if (properties) {
+    base::Value::Dict* wifi = properties->FindDict(onc::network_type::kWiFi);
+    if (wifi) {
+      const std::string* passphrase = wifi->FindString(onc::wifi::kPassphrase);
+      if (passphrase)
+        ns_password = base::SysUTF8ToNSString(*passphrase);
+    }
   }
 
   // Number of attempts to associate to network.
diff --git a/components/wifi/wifi_service_win.cc b/components/wifi/wifi_service_win.cc
index 1fd4a59..d9e0c98 100644
--- a/components/wifi/wifi_service_win.cc
+++ b/components/wifi/wifi_service_win.cc
@@ -199,29 +199,29 @@
   void UnInitialize() override;
 
   void GetProperties(const std::string& network_guid,
-                     base::DictionaryValue* properties,
+                     base::Value::Dict* properties,
                      std::string* error) override;
 
   void GetManagedProperties(const std::string& network_guid,
-                            base::DictionaryValue* managed_properties,
+                            base::Value::Dict* managed_properties,
                             std::string* error) override;
 
   void GetState(const std::string& network_guid,
-                base::DictionaryValue* properties,
+                base::Value::Dict* properties,
                 std::string* error) override;
 
   void SetProperties(const std::string& network_guid,
-                     std::unique_ptr<base::DictionaryValue> properties,
+                     base::Value::Dict properties,
                      std::string* error) override;
 
   void CreateNetwork(bool shared,
-                     std::unique_ptr<base::DictionaryValue> properties,
+                     base::Value::Dict properties,
                      std::string* network_guid,
                      std::string* error) override;
 
   void GetVisibleNetworks(const std::string& network_type,
-                          base::ListValue* network_list,
-                          bool include_details) override;
+                          bool include_details,
+                          base::Value::List* network_list) override;
 
   void RequestNetworkScan() override;
 
@@ -467,14 +467,14 @@
   GUID interface_guid_;
   // Temporary storage of network properties indexed by |network_guid|. Persist
   // only in memory.
-  base::DictionaryValue connect_properties_;
+  base::Value::Dict connect_properties_;
   // Preserved WLAN profile xml.
   std::map<std::string, std::string> saved_profiles_xml_;
   // Created WLAN Profiles, indexed by |network_guid|. Contains xml with TKIP
   // encryption type saved by |CreateNetwork| if applicable. Profile has to be
   // deleted if connection fails. Implicitly created profiles have to be deleted
   // if connection succeeds. Persist only in memory.
-  base::DictionaryValue created_profiles_;
+  base::Value::Dict created_profiles_;
   // Observer to get notified when network(s) have changed (e.g. connect).
   NetworkGuidListCallback networks_changed_observer_;
   // Observer to get notified when network list has changed (scan complete).
@@ -528,7 +528,7 @@
 }
 
 void WiFiServiceImpl::GetProperties(const std::string& network_guid,
-                                    base::DictionaryValue* properties,
+                                    base::Value::Dict* properties,
                                     std::string* error) {
   DWORD error_code = EnsureInitialized();
   if (CheckError(error_code, kErrorWiFiService, error))
@@ -538,7 +538,7 @@
   error_code = GetCurrentProperties(&connected_properties);
   if (error_code == ERROR_SUCCESS &&
       connected_properties.guid == network_guid) {
-    properties->Swap(connected_properties.ToValue(false).get());
+    *properties = connected_properties.ToValue(/*network_list=*/false);
     return;
   }
 
@@ -549,7 +549,7 @@
     if (it != network_list.end()) {
       DVLOG(1) << "Get Properties: " << network_guid << ":"
                   << it->connection_state;
-      properties->Swap(it->ToValue(false).get());
+      *properties = it->ToValue(/*network_list=*/false);
       return;
     }
     error_code = ERROR_NOT_FOUND;
@@ -560,53 +560,49 @@
 
 void WiFiServiceImpl::GetManagedProperties(
     const std::string& network_guid,
-    base::DictionaryValue* managed_properties,
+    base::Value::Dict* managed_properties,
     std::string* error) {
   CheckError(ERROR_CALL_NOT_IMPLEMENTED, kErrorWiFiService, error);
 }
 
 void WiFiServiceImpl::GetState(const std::string& network_guid,
-                               base::DictionaryValue* properties,
+                               base::Value::Dict* properties,
                                std::string* error) {
   CheckError(ERROR_CALL_NOT_IMPLEMENTED, kErrorWiFiService, error);
 }
 
-void WiFiServiceImpl::SetProperties(
-    const std::string& network_guid,
-    std::unique_ptr<base::DictionaryValue> properties,
-    std::string* error) {
+void WiFiServiceImpl::SetProperties(const std::string& network_guid,
+                                    base::Value::Dict properties,
+                                    std::string* error) {
   // Temporary preserve WiFi properties (desired frequency, wifi password) to
   // use in StartConnect.
-  DCHECK(properties);
-  if (!properties->HasKey(onc::network_type::kWiFi)) {
-    DVLOG(0) << "Missing WiFi properties:" << *properties;
+  if (!properties.Find(onc::network_type::kWiFi)) {
+    DVLOG(0) << "Missing WiFi properties:" << properties;
     *error = kErrorWiFiService;
     return;
   }
 
-  base::DictionaryValue* existing_properties;
   // If the network properties already exist, don't override previously set
   // properties, unless they are set in |properties|.
-  if (connect_properties_.GetDictionaryWithoutPathExpansion(
-          network_guid, &existing_properties)) {
-    existing_properties->MergeDictionary(properties.get());
+  base::Value::Dict* existing_properties =
+      connect_properties_.FindDict(network_guid);
+  if (existing_properties) {
+    existing_properties->Merge(properties);
   } else {
-    connect_properties_.SetWithoutPathExpansion(network_guid,
-                                                std::move(properties));
+    connect_properties_.Set(network_guid, std::move(properties));
   }
 }
 
-void WiFiServiceImpl::CreateNetwork(
-    bool shared,
-    std::unique_ptr<base::DictionaryValue> properties,
-    std::string* network_guid,
-    std::string* error) {
+void WiFiServiceImpl::CreateNetwork(bool shared,
+                                    base::Value::Dict properties,
+                                    std::string* network_guid,
+                                    std::string* error) {
   DWORD error_code = EnsureInitialized();
   if (CheckError(error_code, kErrorWiFiService, error))
     return;
 
   NetworkProperties network_properties;
-  if (!network_properties.UpdateFromValue(*properties)) {
+  if (!network_properties.UpdateFromValue(properties)) {
     CheckError(ERROR_INVALID_DATA, kErrorWiFiService, error);
     return;
   }
@@ -636,18 +632,18 @@
   }
 
   if (tkip_profile_xml != profile_xml) {
-    base::DictionaryValue tkip_profile;
-    tkip_profile.SetStringKey(kProfileXmlKey, tkip_profile_xml);
-    tkip_profile.SetBoolKey(kProfileSharedKey, shared);
-    created_profiles_.SetKey(network_properties.guid, std::move(tkip_profile));
+    base::Value::Dict tkip_profile;
+    tkip_profile.Set(kProfileXmlKey, tkip_profile_xml);
+    tkip_profile.Set(kProfileSharedKey, shared);
+    created_profiles_.Set(network_properties.guid, std::move(tkip_profile));
   }
 
   *network_guid = network_properties.guid;
 }
 
 void WiFiServiceImpl::GetVisibleNetworks(const std::string& network_type,
-                                         base::ListValue* network_list,
-                                         bool include_details) {
+                                         bool include_details,
+                                         base::Value::List* network_list) {
   if (!network_type.empty() &&
       network_type != onc::network_type::kAllTypes &&
       network_type != onc::network_type::kWiFi) {
@@ -663,10 +659,7 @@
       for (NetworkList::const_iterator it = networks.begin();
            it != networks.end();
            ++it) {
-        std::unique_ptr<base::DictionaryValue> network(
-            it->ToValue(!include_details));
-        network_list->GetList().Append(
-            base::Value::FromUniquePtrValue(std::move(network)));
+        network_list->Append(it->ToValue(/*network_list=*/!include_details));
       }
     }
   }
@@ -883,19 +876,20 @@
     LOG(ERROR) << kMaxAttempts << " attempts exceeded waiting for connect to "
                << network_guid;
 
-    base::Value* created_profile = created_profiles_.FindDictKey(network_guid);
+    base::Value::Dict* created_profile =
+        created_profiles_.FindDict(network_guid);
     // Check, whether this connection is using newly created profile.
     if (created_profile) {
       const std::string* tkip_profile_xml =
-          created_profile->FindStringKey(kProfileXmlKey);
+          created_profile->FindString(kProfileXmlKey);
       absl::optional<bool> shared =
-          created_profile->FindBoolKey(kProfileSharedKey);
+          created_profile->FindBool(kProfileSharedKey);
       // Check, if this connection there is alternative TKIP profile xml that
       // should be tried. If there is, then set it up and try to connect again.
       if (tkip_profile_xml && shared) {
         // Remove TKIP profile xml, so it will not be tried again.
-        created_profile->RemoveKey(kProfileXmlKey);
-        created_profile->RemoveKey(kProfileSharedKey);
+        created_profile->Remove(kProfileXmlKey);
+        created_profile->Remove(kProfileSharedKey);
         DWORD error_code = SetProfile(*shared, *tkip_profile_xml, true);
         if (error_code == ERROR_SUCCESS) {
           // Try to connect with new profile.
@@ -937,7 +931,7 @@
     if (error != ERROR_SUCCESS)
       LOG(ERROR) << error;
     // There is no need to keep created profile as network is connected.
-    created_profiles_.RemoveKey(network_guid);
+    created_profiles_.Remove(network_guid);
     // Restore previously suppressed notifications.
     enable_notify_network_changed_ = true;
     RestoreNwCategoryWizard();
@@ -1482,14 +1476,15 @@
 Frequency WiFiServiceImpl::GetFrequencyToConnect(
     const std::string& network_guid) const {
   // Check whether desired frequency is set in |connect_properties_|.
-  const base::DictionaryValue* properties;
-  if (connect_properties_.GetDictionaryWithoutPathExpansion(network_guid,
-                                                            &properties)) {
-    const base::DictionaryValue* wifi;
-    if (properties->GetDictionary(onc::network_type::kWiFi, &wifi)) {
-      int frequency;
-      if (wifi->GetInteger(onc::wifi::kFrequency, &frequency))
-        return GetNormalizedFrequency(frequency);
+  const base::Value::Dict* properties =
+      connect_properties_.FindDict(network_guid);
+  if (properties) {
+    const base::Value::Dict* wifi =
+        properties->FindDict(onc::network_type::kWiFi);
+    if (wifi) {
+      absl::optional<int> frequency = wifi->FindInt(onc::wifi::kFrequency);
+      if (frequency.has_value())
+        return GetNormalizedFrequency(*frequency);
     }
   }
   return kFrequencyAny;
@@ -1595,19 +1590,21 @@
     } else {
       // If network is available, but is not open security, then it cannot be
       // connected without profile, so return 'access denied' error.
-      std::unique_ptr<base::DictionaryValue> properties(
-          new base::DictionaryValue);
-      const base::DictionaryValue* wifi;
-      std::string wifi_security;
+      base::Value::Dict properties;
       std::string error_string;
-      GetProperties(network_guid, properties.get(), &error_string);
-      if (error_string.empty() &&
-          properties->GetDictionary(onc::network_type::kWiFi, &wifi) &&
-          wifi->GetString(onc::wifi::kSecurity, &wifi_security) &&
-          wifi_security != onc::wifi::kSecurityNone) {
-        error = ERROR_ACCESS_DENIED;
-        LOG(ERROR) << error;
-        return error;
+      GetProperties(network_guid, &properties, &error_string);
+      if (error_string.empty()) {
+        const base::Value::Dict* wifi =
+            properties.FindDict(onc::network_type::kWiFi);
+        if (wifi) {
+          const std::string* wifi_security =
+              wifi->FindString(onc::wifi::kSecurity);
+          if (wifi_security && *wifi_security != onc::wifi::kSecurityNone) {
+            error = ERROR_ACCESS_DENIED;
+            LOG(ERROR) << error;
+            return error;
+          }
+        }
       }
       WLAN_CONNECTION_PARAMETERS wlan_params = {
           wlan_connection_mode_discovery_unsecure,
@@ -1694,12 +1691,12 @@
 DWORD WiFiServiceImpl::DeleteCreatedProfile(const std::string& network_guid) {
   DWORD error_code = ERROR_SUCCESS;
   // Check, whether this connection is using new created profile, and remove it.
-  if (created_profiles_.HasKey(network_guid)) {
+  if (created_profiles_.contains(network_guid)) {
     // Connection has failed, so delete it.
     std::wstring profile_name = ProfileNameFromGUID(network_guid);
     error_code = WlanDeleteProfile_function_(client_, &interface_guid_,
                                              profile_name.c_str(), nullptr);
-    created_profiles_.RemoveKey(network_guid);
+    created_profiles_.Remove(network_guid);
   }
   return error_code;
 }
diff --git a/components/wifi/wifi_test.cc b/components/wifi/wifi_test.cc
index 1c305a3d..cd4db95 100644
--- a/components/wifi/wifi_test.cc
+++ b/components/wifi/wifi_test.cc
@@ -60,7 +60,7 @@
   void OnNetworksChanged(
       const WiFiService::NetworkGuidList& network_guid_list) {
     VLOG(0) << "Networks Changed: " << network_guid_list[0];
-    base::DictionaryValue properties;
+    base::Value::Dict properties;
     std::string error;
     wifi_service_->GetProperties(network_guid_list[0], &properties, &error);
     VLOG(0) << error << ":\n" << properties;
@@ -140,15 +140,16 @@
   wifi_service_->Initialize(executor.task_runner());
 
   if (parsed_command_line.HasSwitch("list")) {
-    base::ListValue network_list;
-    wifi_service_->GetVisibleNetworks(std::string(), &network_list, true);
+    base::Value::List network_list;
+    wifi_service_->GetVisibleNetworks(std::string(), /*include_details=*/true,
+                                      &network_list);
     VLOG(0) << network_list;
     return true;
   }
 
   if (parsed_command_line.HasSwitch("get_properties")) {
     if (network_guid.length() > 0) {
-      base::DictionaryValue properties;
+      base::Value::Dict properties;
       std::string error;
       wifi_service_->GetProperties(network_guid, &properties, &error);
       VLOG(0) << error << ":\n" << properties;
@@ -157,29 +158,28 @@
   }
 
   // Optional properties (frequency, password) to use for connect or create.
-  std::unique_ptr<base::DictionaryValue> properties(
-      new base::DictionaryValue());
+  base::Value::Dict properties;
 
   if (!frequency.empty()) {
     int value = 0;
     if (base::StringToInt(frequency, &value)) {
-      properties->SetInteger("WiFi.Frequency", value);
+      properties.Set("WiFi.Frequency", value);
       // fall through to connect.
     }
   }
 
   if (!password.empty())
-    properties->SetString("WiFi.Passphrase", password);
+    properties.Set("WiFi.Passphrase", password);
 
   if (!security.empty())
-    properties->SetString("WiFi.Security", security);
+    properties.Set("WiFi.Security", security);
 
   if (parsed_command_line.HasSwitch("create")) {
     if (!network_guid.empty()) {
       std::string error;
       std::string new_network_guid;
-      properties->SetString("WiFi.SSID", network_guid);
-      VLOG(0) << "Creating Network: " << *properties;
+      properties.Set("WiFi.SSID", network_guid);
+      VLOG(0) << "Creating Network: " << properties;
       wifi_service_->CreateNetwork(false, std::move(properties),
                                    &new_network_guid, &error);
       VLOG(0) << error << ":\n" << new_network_guid;
@@ -190,8 +190,8 @@
   if (parsed_command_line.HasSwitch("connect")) {
     if (!network_guid.empty()) {
       std::string error;
-      if (!properties->DictEmpty()) {
-        VLOG(0) << "Using connect properties: " << *properties;
+      if (!properties.empty()) {
+        VLOG(0) << "Using connect properties: " << properties;
         wifi_service_->SetProperties(network_guid, std::move(properties),
                                      &error);
       }
diff --git a/content/browser/accessibility/web_contents_accessibility_android.cc b/content/browser/accessibility/web_contents_accessibility_android.cc
index 23bc1fa..39cf81b 100644
--- a/content/browser/accessibility/web_contents_accessibility_android.cc
+++ b/content/browser/accessibility/web_contents_accessibility_android.cc
@@ -249,14 +249,11 @@
   }
 }
 
-jboolean WebContentsAccessibilityAndroid::IsEnabled(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj) {
+jboolean WebContentsAccessibilityAndroid::IsEnabled(JNIEnv* env) {
   return !!GetRootBrowserAccessibilityManager();
 }
 
 void WebContentsAccessibilityAndroid::Enable(JNIEnv* env,
-                                             const JavaParamRef<jobject>& obj,
                                              jboolean screen_reader_mode) {
   BrowserAccessibilityStateImpl* accessibility_state =
       BrowserAccessibilityStateImpl::GetInstance();
@@ -288,14 +285,12 @@
 
 void WebContentsAccessibilityAndroid::SetAllowImageDescriptions(
     JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& obj,
     jboolean allow_image_descriptions) {
   allow_image_descriptions_ = allow_image_descriptions;
 }
 
 void WebContentsAccessibilityAndroid::SetAXMode(
     JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
     jboolean screen_reader_mode,
     jboolean is_accessibility_enabled) {
   BrowserAccessibilityStateImpl* accessibility_state =
@@ -562,11 +557,9 @@
   return true;
 }
 
-bool WebContentsAccessibilityAndroid::OnHoverEventNoRenderer(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
-    jfloat x,
-    jfloat y) {
+bool WebContentsAccessibilityAndroid::OnHoverEventNoRenderer(JNIEnv* env,
+                                                             jfloat x,
+                                                             jfloat y) {
   gfx::PointF point = gfx::PointF(x, y);
   if (BrowserAccessibilityManagerAndroid* root_manager =
           GetRootBrowserAccessibilityManager()) {
@@ -622,16 +615,12 @@
 }
 
 base::android::ScopedJavaGlobalRef<jstring>
-WebContentsAccessibilityAndroid::GetSupportedHtmlElementTypes(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj) {
+WebContentsAccessibilityAndroid::GetSupportedHtmlElementTypes(JNIEnv* env) {
   InitSearchKeyToPredicateMapIfNeeded();
   return GetCanonicalJNIString(env, g_all_search_keys.Get());
 }
 
-jint WebContentsAccessibilityAndroid::GetRootId(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj) {
+jint WebContentsAccessibilityAndroid::GetRootId(JNIEnv* env) {
   if (BrowserAccessibilityManagerAndroid* root_manager =
           GetRootBrowserAccessibilityManager()) {
     auto* root =
@@ -642,26 +631,19 @@
   return -1;
 }
 
-jboolean WebContentsAccessibilityAndroid::IsNodeValid(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
-    jint unique_id) {
+jboolean WebContentsAccessibilityAndroid::IsNodeValid(JNIEnv* env,
+                                                      jint unique_id) {
   return GetAXFromUniqueID(unique_id) != NULL;
 }
 
-void WebContentsAccessibilityAndroid::HitTest(JNIEnv* env,
-                                              const JavaParamRef<jobject>& obj,
-                                              jint x,
-                                              jint y) {
+void WebContentsAccessibilityAndroid::HitTest(JNIEnv* env, jint x, jint y) {
   if (BrowserAccessibilityManagerAndroid* root_manager =
           GetRootBrowserAccessibilityManager())
     root_manager->HitTest(gfx::Point(x, y), /*request_id=*/0);
 }
 
-jboolean WebContentsAccessibilityAndroid::IsEditableText(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
-    jint unique_id) {
+jboolean WebContentsAccessibilityAndroid::IsEditableText(JNIEnv* env,
+                                                         jint unique_id) {
   BrowserAccessibilityAndroid* node = GetAXFromUniqueID(unique_id);
   if (!node)
     return false;
@@ -669,10 +651,8 @@
   return node->IsTextField();
 }
 
-jboolean WebContentsAccessibilityAndroid::IsFocused(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
-    jint unique_id) {
+jboolean WebContentsAccessibilityAndroid::IsFocused(JNIEnv* env,
+                                                    jint unique_id) {
   BrowserAccessibilityAndroid* node = GetAXFromUniqueID(unique_id);
   if (!node)
     return false;
@@ -682,7 +662,6 @@
 
 jint WebContentsAccessibilityAndroid::GetEditableTextSelectionStart(
     JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
     jint unique_id) {
   BrowserAccessibilityAndroid* node = GetAXFromUniqueID(unique_id);
   if (!node)
@@ -693,7 +672,6 @@
 
 jint WebContentsAccessibilityAndroid::GetEditableTextSelectionEnd(
     JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
     jint unique_id) {
   BrowserAccessibilityAndroid* node = GetAXFromUniqueID(unique_id);
   if (!node)
@@ -703,10 +681,8 @@
 }
 
 base::android::ScopedJavaLocalRef<jintArray>
-WebContentsAccessibilityAndroid::GetAbsolutePositionForNode(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
-    jint unique_id) {
+WebContentsAccessibilityAndroid::GetAbsolutePositionForNode(JNIEnv* env,
+                                                            jint unique_id) {
   BrowserAccessibilityManagerAndroid* root_manager =
       GetRootBrowserAccessibilityManager();
   if (!root_manager)
@@ -739,7 +715,7 @@
 
 void WebContentsAccessibilityAndroid::UpdateAccessibilityNodeInfoBoundsRect(
     JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
+    const ScopedJavaLocalRef<jobject>& obj,
     const JavaParamRef<jobject>& info,
     jint unique_id,
     BrowserAccessibilityAndroid* node) {
@@ -771,7 +747,6 @@
 
 jboolean WebContentsAccessibilityAndroid::UpdateCachedAccessibilityNodeInfo(
     JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
     const JavaParamRef<jobject>& info,
     jint unique_id) {
   BrowserAccessibilityManagerAndroid* root_manager =
@@ -783,6 +758,10 @@
   if (!node)
     return false;
 
+  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
+  if (obj.is_null())
+    return false;
+
   // Update cached nodes by providing new enclosing Rects
   UpdateAccessibilityNodeInfoBoundsRect(env, obj, info, unique_id, node);
 
@@ -802,7 +781,6 @@
 
 jboolean WebContentsAccessibilityAndroid::PopulateAccessibilityNodeInfo(
     JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
     const JavaParamRef<jobject>& info,
     jint unique_id) {
   if (!GetRootBrowserAccessibilityManager())
@@ -812,6 +790,10 @@
   if (!node)
     return false;
 
+  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
+  if (obj.is_null())
+    return false;
+
   bool is_root = !node->PlatformGetParent();
   if (!is_root) {
     auto* android_node =
@@ -940,7 +922,6 @@
 
 jboolean WebContentsAccessibilityAndroid::PopulateAccessibilityEvent(
     JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
     const JavaParamRef<jobject>& event,
     jint unique_id,
     jint event_type) {
@@ -948,6 +929,10 @@
   if (!node)
     return false;
 
+  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
+  if (obj.is_null())
+    return false;
+
   // We will always set boolean, classname, list and scroll attributes.
   Java_WebContentsAccessibilityImpl_setAccessibilityEventBaseAttributes(
       env, obj, event, node->IsChecked(), node->IsEnabled(),
@@ -982,9 +967,7 @@
   return true;
 }
 
-void WebContentsAccessibilityAndroid::Click(JNIEnv* env,
-                                            const JavaParamRef<jobject>& obj,
-                                            jint unique_id) {
+void WebContentsAccessibilityAndroid::Click(JNIEnv* env, jint unique_id) {
   BrowserAccessibilityAndroid* node = GetAXFromUniqueID(unique_id);
   if (!node)
     return;
@@ -1005,25 +988,20 @@
     node->manager()->DoDefaultAction(*node);
 }
 
-void WebContentsAccessibilityAndroid::Focus(JNIEnv* env,
-                                            const JavaParamRef<jobject>& obj,
-                                            jint unique_id) {
+void WebContentsAccessibilityAndroid::Focus(JNIEnv* env, jint unique_id) {
   BrowserAccessibilityAndroid* node = GetAXFromUniqueID(unique_id);
   if (node)
     node->manager()->SetFocus(*node);
 }
 
-void WebContentsAccessibilityAndroid::Blur(JNIEnv* env,
-                                           const JavaParamRef<jobject>& obj) {
+void WebContentsAccessibilityAndroid::Blur(JNIEnv* env) {
   if (BrowserAccessibilityManagerAndroid* root_manager =
           GetRootBrowserAccessibilityManager())
     root_manager->SetFocus(*root_manager->GetRoot());
 }
 
-void WebContentsAccessibilityAndroid::ScrollToMakeNodeVisible(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
-    jint unique_id) {
+void WebContentsAccessibilityAndroid::ScrollToMakeNodeVisible(JNIEnv* env,
+                                                              jint unique_id) {
   BrowserAccessibilityAndroid* node = GetAXFromUniqueID(unique_id);
   if (node) {
     node->manager()->ScrollToMakeVisible(
@@ -1033,7 +1011,6 @@
 
 void WebContentsAccessibilityAndroid::SetTextFieldValue(
     JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
     jint unique_id,
     const JavaParamRef<jstring>& value) {
   BrowserAccessibilityAndroid* node = GetAXFromUniqueID(unique_id);
@@ -1043,12 +1020,10 @@
   }
 }
 
-void WebContentsAccessibilityAndroid::SetSelection(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
-    jint unique_id,
-    jint start,
-    jint end) {
+void WebContentsAccessibilityAndroid::SetSelection(JNIEnv* env,
+                                                   jint unique_id,
+                                                   jint start,
+                                                   jint end) {
   BrowserAccessibilityAndroid* node = GetAXFromUniqueID(unique_id);
   if (node) {
     node->manager()->SetSelection(
@@ -1057,11 +1032,9 @@
   }
 }
 
-jboolean WebContentsAccessibilityAndroid::AdjustSlider(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
-    jint unique_id,
-    jboolean increment) {
+jboolean WebContentsAccessibilityAndroid::AdjustSlider(JNIEnv* env,
+                                                       jint unique_id,
+                                                       jboolean increment) {
   BrowserAccessibilityAndroid* node = GetAXFromUniqueID(unique_id);
   if (!node)
     return false;
@@ -1106,10 +1079,8 @@
   return false;
 }
 
-void WebContentsAccessibilityAndroid::ShowContextMenu(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
-    jint unique_id) {
+void WebContentsAccessibilityAndroid::ShowContextMenu(JNIEnv* env,
+                                                      jint unique_id) {
   BrowserAccessibilityAndroid* node = GetAXFromUniqueID(unique_id);
   if (node)
     node->manager()->ShowContextMenu(*node);
@@ -1117,7 +1088,6 @@
 
 jint WebContentsAccessibilityAndroid::FindElementType(
     JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
     jint start_id,
     const JavaParamRef<jstring>& element_type_str,
     jboolean forwards,
@@ -1182,7 +1152,6 @@
 
 jboolean WebContentsAccessibilityAndroid::NextAtGranularity(
     JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
     jint granularity,
     jboolean extend_selection,
     jint unique_id,
@@ -1200,6 +1169,9 @@
   int end_index = -1;
   if (root_manager->NextAtGranularity(granularity, cursor_index, node,
                                       &start_index, &end_index)) {
+    ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
+    if (obj.is_null())
+      return false;
     std::u16string text = node->GetTextContentUTF16();
     Java_WebContentsAccessibilityImpl_finishGranularityMoveNext(
         env, obj, base::android::ConvertUTF16ToJavaString(env, text),
@@ -1209,10 +1181,8 @@
   return false;
 }
 
-jint WebContentsAccessibilityAndroid::GetTextLength(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
-    jint unique_id) {
+jint WebContentsAccessibilityAndroid::GetTextLength(JNIEnv* env,
+                                                    jint unique_id) {
   BrowserAccessibilityAndroid* node = GetAXFromUniqueID(unique_id);
   if (!node)
     return -1;
@@ -1222,7 +1192,6 @@
 
 void WebContentsAccessibilityAndroid::AddSpellingErrorForTesting(
     JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
     jint unique_id,
     jint start_offset,
     jint end_offset) {
@@ -1252,7 +1221,6 @@
 
 jboolean WebContentsAccessibilityAndroid::PreviousAtGranularity(
     JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
     jint granularity,
     jboolean extend_selection,
     jint unique_id,
@@ -1270,6 +1238,9 @@
   int end_index = -1;
   if (root_manager->PreviousAtGranularity(granularity, cursor_index, node,
                                           &start_index, &end_index)) {
+    ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
+    if (obj.is_null())
+      return false;
     Java_WebContentsAccessibilityImpl_finishGranularityMovePrevious(
         env, obj,
         base::android::ConvertUTF16ToJavaString(env,
@@ -1282,7 +1253,6 @@
 
 void WebContentsAccessibilityAndroid::MoveAccessibilityFocus(
     JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
     jint old_unique_id,
     jint new_unique_id) {
   BrowserAccessibilityAndroid* old_node = GetAXFromUniqueID(old_unique_id);
@@ -1302,9 +1272,7 @@
     node->manager()->LoadInlineTextBoxes(*node);
 }
 
-bool WebContentsAccessibilityAndroid::IsSlider(JNIEnv* env,
-                                               const JavaParamRef<jobject>& obj,
-                                               jint unique_id) {
+bool WebContentsAccessibilityAndroid::IsSlider(JNIEnv* env, jint unique_id) {
   BrowserAccessibilityAndroid* node = GetAXFromUniqueID(unique_id);
   if (!node)
     return false;
@@ -1312,9 +1280,7 @@
   return node->GetRole() == ax::mojom::Role::kSlider;
 }
 
-void WebContentsAccessibilityAndroid::OnAutofillPopupDisplayed(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj) {
+void WebContentsAccessibilityAndroid::OnAutofillPopupDisplayed(JNIEnv* env) {
   BrowserAccessibilityManagerAndroid* root_manager =
       GetRootBrowserAccessibilityManager();
   if (!root_manager)
@@ -1345,18 +1311,14 @@
   g_element_hosting_autofill_popup_unique_id = android_node->unique_id();
 }
 
-void WebContentsAccessibilityAndroid::OnAutofillPopupDismissed(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj) {
+void WebContentsAccessibilityAndroid::OnAutofillPopupDismissed(JNIEnv* env) {
   g_element_hosting_autofill_popup_unique_id = -1;
   g_element_after_element_hosting_autofill_popup_unique_id = -1;
   DeleteAutofillPopupProxy();
 }
 
 jint WebContentsAccessibilityAndroid::
-    GetIdForElementAfterElementHostingAutofillPopup(
-        JNIEnv* env,
-        const JavaParamRef<jobject>& obj) {
+    GetIdForElementAfterElementHostingAutofillPopup(JNIEnv* env) {
   if (g_element_after_element_hosting_autofill_popup_unique_id == -1 ||
       !GetAXFromUniqueID(
           g_element_after_element_hosting_autofill_popup_unique_id))
@@ -1365,10 +1327,8 @@
   return g_element_after_element_hosting_autofill_popup_unique_id;
 }
 
-jboolean WebContentsAccessibilityAndroid::IsAutofillPopupNode(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
-    jint unique_id) {
+jboolean WebContentsAccessibilityAndroid::IsAutofillPopupNode(JNIEnv* env,
+                                                              jint unique_id) {
   auto* android_node =
       static_cast<BrowserAccessibilityAndroid*>(g_autofill_popup_proxy_node);
 
@@ -1376,7 +1336,6 @@
 }
 
 bool WebContentsAccessibilityAndroid::Scroll(JNIEnv* env,
-                                             const JavaParamRef<jobject>& obj,
                                              jint unique_id,
                                              int direction,
                                              bool is_page_scroll) {
@@ -1387,11 +1346,9 @@
   return node->Scroll(direction, is_page_scroll);
 }
 
-bool WebContentsAccessibilityAndroid::SetRangeValue(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
-    jint unique_id,
-    float value) {
+bool WebContentsAccessibilityAndroid::SetRangeValue(JNIEnv* env,
+                                                    jint unique_id,
+                                                    float value) {
   BrowserAccessibilityAndroid* node = GetAXFromUniqueID(unique_id);
   if (!node)
     return false;
@@ -1416,7 +1373,6 @@
 
 jboolean WebContentsAccessibilityAndroid::AreInlineTextBoxesLoaded(
     JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
     jint unique_id) {
   BrowserAccessibilityAndroid* node = GetAXFromUniqueID(unique_id);
   if (!node)
@@ -1425,22 +1381,18 @@
   return node->AreInlineTextBoxesLoaded();
 }
 
-void WebContentsAccessibilityAndroid::LoadInlineTextBoxes(
-    JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
-    jint unique_id) {
+void WebContentsAccessibilityAndroid::LoadInlineTextBoxes(JNIEnv* env,
+                                                          jint unique_id) {
   BrowserAccessibilityAndroid* node = GetAXFromUniqueID(unique_id);
   if (node)
     node->manager()->LoadInlineTextBoxes(*node);
 }
 
 base::android::ScopedJavaLocalRef<jintArray>
-WebContentsAccessibilityAndroid::GetCharacterBoundingBoxes(
-    JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& obj,
-    jint unique_id,
-    jint start,
-    jint len) {
+WebContentsAccessibilityAndroid::GetCharacterBoundingBoxes(JNIEnv* env,
+                                                           jint unique_id,
+                                                           jint start,
+                                                           jint len) {
   BrowserAccessibilityManagerAndroid* root_manager =
       GetRootBrowserAccessibilityManager();
   if (!root_manager)
@@ -1480,7 +1432,6 @@
 
 jboolean WebContentsAccessibilityAndroid::GetImageData(
     JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& obj,
     const base::android::JavaParamRef<jobject>& info,
     jint unique_id,
     jboolean has_sent_previous_request) {
@@ -1513,6 +1464,10 @@
     return false;
   }
 
+  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
+  if (obj.is_null())
+    return false;
+
   // If the image data has been retrieved from the image data url successfully,
   // then convert it to a Java byte array and add it in the Bundle extras of
   // the node, and return true.
diff --git a/content/browser/accessibility/web_contents_accessibility_android.h b/content/browser/accessibility/web_contents_accessibility_android.h
index 905910cf..58b6795 100644
--- a/content/browser/accessibility/web_contents_accessibility_android.h
+++ b/content/browser/accessibility/web_contents_accessibility_android.h
@@ -85,101 +85,59 @@
   void DeleteEarly(JNIEnv* env);
 
   // Global methods.
-  jboolean IsEnabled(JNIEnv* env,
-                     const base::android::JavaParamRef<jobject>& obj);
-  void Enable(JNIEnv* env,
-              const base::android::JavaParamRef<jobject>& obj,
-              jboolean screen_reader_mode);
+  jboolean IsEnabled(JNIEnv* env);
+  void Enable(JNIEnv* env, jboolean screen_reader_mode);
   void SetAXMode(JNIEnv* env,
-                 const base::android::JavaParamRef<jobject>& obj,
                  jboolean screen_reader_mode,
                  jboolean is_accessibility_enabled);
 
   base::android::ScopedJavaGlobalRef<jstring> GetSupportedHtmlElementTypes(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj);
+      JNIEnv* env);
 
-  void SetAllowImageDescriptions(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj,
-      jboolean allow_image_descriptions);
+  void SetAllowImageDescriptions(JNIEnv* env,
+                                 jboolean allow_image_descriptions);
 
   // Tree methods.
-  jint GetRootId(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj);
-  jboolean IsNodeValid(JNIEnv* env,
-                       const base::android::JavaParamRef<jobject>& obj,
-                       jint id);
+  jint GetRootId(JNIEnv* env);
+  jboolean IsNodeValid(JNIEnv* env, jint id);
 
-  void HitTest(JNIEnv* env,
-               const base::android::JavaParamRef<jobject>& obj,
-               jint x,
-               jint y);
+  void HitTest(JNIEnv* env, jint x, jint y);
 
   // Methods to get information about a specific node.
-  jboolean IsEditableText(JNIEnv* env,
-                          const base::android::JavaParamRef<jobject>& obj,
-                          jint id);
-  jboolean IsFocused(JNIEnv* env,
-                     const base::android::JavaParamRef<jobject>& obj,
-                     jint id);
-  jint GetEditableTextSelectionStart(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj,
-      jint id);
-  jint GetEditableTextSelectionEnd(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj,
-      jint id);
+  jboolean IsEditableText(JNIEnv* env, jint id);
+  jboolean IsFocused(JNIEnv* env, jint id);
+  jint GetEditableTextSelectionStart(JNIEnv* env, jint id);
+  jint GetEditableTextSelectionEnd(JNIEnv* env, jint id);
   base::android::ScopedJavaLocalRef<jintArray> GetAbsolutePositionForNode(
       JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj,
       jint unique_id);
 
   // Populate Java accessibility data structures with info about a node.
   jboolean UpdateCachedAccessibilityNodeInfo(
       JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj,
       const base::android::JavaParamRef<jobject>& info,
       jint id);
   jboolean PopulateAccessibilityNodeInfo(
       JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj,
       const base::android::JavaParamRef<jobject>& info,
       jint id);
   jboolean PopulateAccessibilityEvent(
       JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj,
       const base::android::JavaParamRef<jobject>& event,
       jint id,
       jint event_type);
 
   // Perform actions.
-  void Click(JNIEnv* env,
-             const base::android::JavaParamRef<jobject>& obj,
-             jint id);
-  void Focus(JNIEnv* env,
-             const base::android::JavaParamRef<jobject>& obj,
-             jint id);
-  void Blur(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj);
-  void ScrollToMakeNodeVisible(JNIEnv* env,
-                               const base::android::JavaParamRef<jobject>& obj,
-                               jint id);
+  void Click(JNIEnv* env, jint id);
+  void Focus(JNIEnv* env, jint id);
+  void Blur(JNIEnv* env);
+  void ScrollToMakeNodeVisible(JNIEnv* env, jint id);
   void SetTextFieldValue(JNIEnv* env,
-                         const base::android::JavaParamRef<jobject>& obj,
                          jint id,
                          const base::android::JavaParamRef<jstring>& value);
-  void SetSelection(JNIEnv* env,
-                    const base::android::JavaParamRef<jobject>& obj,
-                    jint id,
-                    jint start,
-                    jint end);
-  jboolean AdjustSlider(JNIEnv* env,
-                        const base::android::JavaParamRef<jobject>& obj,
-                        jint id,
-                        jboolean increment);
-  void ShowContextMenu(JNIEnv* env,
-                       const base::android::JavaParamRef<jobject>& obj,
-                       jint id);
+  void SetSelection(JNIEnv* env, jint id, jint start, jint end);
+  jboolean AdjustSlider(JNIEnv* env, jint id, jboolean increment);
+  void ShowContextMenu(JNIEnv* env, jint id);
 
   // Return the id of the next node in tree order in the direction given by
   // |forwards|, starting with |start_id|, that matches |element_type|,
@@ -190,7 +148,6 @@
   // around to the last element. This is used to expose the last HTML element
   // upon swiping backwards into a WebView.
   jint FindElementType(JNIEnv* env,
-                       const base::android::JavaParamRef<jobject>& obj,
                        jint start_id,
                        const base::android::JavaParamRef<jstring>& element_type,
                        jboolean forwards,
@@ -205,18 +162,15 @@
   // Java_BrowserAccessibilityManager_finishGranularityMove[NEXT/PREVIOUS]
   // with the result.
   jboolean NextAtGranularity(JNIEnv* env,
-                             const base::android::JavaParamRef<jobject>& obj,
                              jint granularity,
                              jboolean extend_selection,
                              jint id,
                              jint cursor_index);
-  jboolean PreviousAtGranularity(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj,
-      jint granularity,
-      jboolean extend_selection,
-      jint id,
-      jint cursor_index);
+  jboolean PreviousAtGranularity(JNIEnv* env,
+                                 jint granularity,
+                                 jboolean extend_selection,
+                                 jint id,
+                                 jint cursor_index);
 
   // Move accessibility focus. This sends a message to the renderer to
   // clear accessibility focus on the previous node and set accessibility
@@ -227,91 +181,56 @@
   // load inline text boxes for this node only, enabling more accurate
   // movement by granularities on this node.
   void MoveAccessibilityFocus(JNIEnv* env,
-                              const base::android::JavaParamRef<jobject>& obj,
                               jint old_unique_id,
                               jint new_unique_id);
 
   // Returns true if the object is a slider.
-  bool IsSlider(JNIEnv* env,
-                const base::android::JavaParamRef<jobject>& obj,
-                jint id);
+  bool IsSlider(JNIEnv* env, jint id);
 
   // Accessibility methods to support navigation for autofill popup.
-  void OnAutofillPopupDisplayed(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj);
-  void OnAutofillPopupDismissed(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj);
-  jint GetIdForElementAfterElementHostingAutofillPopup(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj);
-  jboolean IsAutofillPopupNode(JNIEnv* env,
-                               const base::android::JavaParamRef<jobject>& obj,
-                               jint id);
+  void OnAutofillPopupDisplayed(JNIEnv* env);
+  void OnAutofillPopupDismissed(JNIEnv* env);
+  jint GetIdForElementAfterElementHostingAutofillPopup(JNIEnv* env);
+  jboolean IsAutofillPopupNode(JNIEnv* env, jint id);
 
   // Scrolls any scrollable container by about 80% of one page in the
   // given direction, or 100% in the case of page scrolls.
-  bool Scroll(JNIEnv* env,
-              const base::android::JavaParamRef<jobject>& obj,
-              jint id,
-              int direction,
-              bool is_page_scroll);
+  bool Scroll(JNIEnv* env, jint id, int direction, bool is_page_scroll);
 
   // Sets value for range type nodes.
-  bool SetRangeValue(JNIEnv* env,
-                     const base::android::JavaParamRef<jobject>& obj,
-                     jint id,
-                     float value);
+  bool SetRangeValue(JNIEnv* env, jint id, float value);
 
   // Responds to a hover event without relying on the renderer for hit testing.
-  bool OnHoverEventNoRenderer(JNIEnv* env,
-                              const base::android::JavaParamRef<jobject>& obj,
-                              jfloat x,
-                              jfloat y);
+  bool OnHoverEventNoRenderer(JNIEnv* env, jfloat x, jfloat y);
 
   // Returns true if the given subtree has inline text box data, or if there
   // aren't any to load.
-  jboolean AreInlineTextBoxesLoaded(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj,
-      jint id);
+  jboolean AreInlineTextBoxesLoaded(JNIEnv* env, jint id);
 
   // Returns the length of the text node.
-  jint GetTextLength(JNIEnv* env,
-                     const base::android::JavaParamRef<jobject>& obj,
-                     jint id);
+  jint GetTextLength(JNIEnv* env, jint id);
 
   // Add a fake spelling error for testing spelling spannables.
-  void AddSpellingErrorForTesting(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj,
-      jint id,
-      jint start_offset,
-      jint end_offset);
+  void AddSpellingErrorForTesting(JNIEnv* env,
+                                  jint id,
+                                  jint start_offset,
+                                  jint end_offset);
 
   // Request loading inline text boxes for a given node.
-  void LoadInlineTextBoxes(JNIEnv* env,
-                           const base::android::JavaParamRef<jobject>& obj,
-                           jint id);
+  void LoadInlineTextBoxes(JNIEnv* env, jint id);
 
   // Get the bounds of each character for a given static text node,
   // starting from index |start| with length |len|. The resulting array
   // of ints is 4 times the length |len|, with the bounds being returned
   // as (left, top, right, bottom) in that order corresponding to a
   // android.graphics.RectF.
-  base::android::ScopedJavaLocalRef<jintArray> GetCharacterBoundingBoxes(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj,
-      jint id,
-      jint start,
-      jint len);
+  base::android::ScopedJavaLocalRef<jintArray>
+  GetCharacterBoundingBoxes(JNIEnv* env, jint id, jint start, jint len);
 
   // Get the image data for a given node. If no image data is available, this
   // will call through to |BrowserAccessibilityManager| to populate the data
   // asynchronously so the next time the method is called the data is ready.
   jboolean GetImageData(JNIEnv* env,
-                        const base::android::JavaParamRef<jobject>& obj,
                         const base::android::JavaParamRef<jobject>& info,
                         jint unique_id,
                         jboolean has_sent_previous_request);
@@ -319,10 +238,7 @@
   void UpdateFrameInfo(float page_scale);
 
   // Set a new max for TYPE_WINDOW_CONTENT_CHANGED events to fire.
-  void SetMaxContentChangedEventsToFireForTesting(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj,
-      jint maxEvents) {
+  void SetMaxContentChangedEventsToFireForTesting(JNIEnv* env, jint maxEvents) {
     // Consider a new |maxEvents| value of -1 to mean to reset to the default.
     if (maxEvents == -1) {
       max_content_changed_events_to_fire_ = kMaxContentChangedEventsToFire;
@@ -406,7 +322,7 @@
 
   void UpdateAccessibilityNodeInfoBoundsRect(
       JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& obj,
+      const base::android::ScopedJavaLocalRef<jobject>& obj,
       const base::android::JavaParamRef<jobject>& info,
       jint id,
       BrowserAccessibilityAndroid* node);
diff --git a/content/browser/attribution_reporting/attribution_internals_ui.cc b/content/browser/attribution_reporting/attribution_internals_ui.cc
index e99edc22c..e9473638 100644
--- a/content/browser/attribution_reporting/attribution_internals_ui.cc
+++ b/content/browser/attribution_reporting/attribution_internals_ui.cc
@@ -32,6 +32,8 @@
                           IDR_ATTRIBUTION_INTERNALS_JS);
   source->AddResourcePath("attribution_internals_table.js",
                           IDR_ATTRIBUTION_INTERNALS_TABLE_JS);
+  source->AddResourcePath("attribution_internals_table.html.js",
+                          IDR_ATTRIBUTION_INTERNALS_TABLE_HTML_JS);
   source->AddResourcePath("table_model.js",
                           IDR_ATTRIBUTION_INTERNALS_TABLE_MODEL_JS);
   source->AddResourcePath("attribution_internals.css",
diff --git a/content/browser/cross_origin_opener_policy_browsertest.cc b/content/browser/cross_origin_opener_policy_browsertest.cc
index fd80b02..a78630f 100644
--- a/content/browser/cross_origin_opener_policy_browsertest.cc
+++ b/content/browser/cross_origin_opener_policy_browsertest.cc
@@ -68,12 +68,21 @@
   return coop;
 }
 
-network::CrossOriginOpenerPolicy CoopSameOriginAllowPopupsPlusCoep() {
+network::CrossOriginOpenerPolicy CoopRestrictProperties() {
   network::CrossOriginOpenerPolicy coop;
-  coop.value = network::mojom::CrossOriginOpenerPolicyValue::
-      kSameOriginAllowPopupsPlusCoep;
-  coop.soap_by_default_value = network::mojom::CrossOriginOpenerPolicyValue::
-      kSameOriginAllowPopupsPlusCoep;
+  coop.value =
+      network::mojom::CrossOriginOpenerPolicyValue::kRestrictProperties;
+  coop.soap_by_default_value =
+      network::mojom::CrossOriginOpenerPolicyValue::kRestrictProperties;
+  return coop;
+}
+
+network::CrossOriginOpenerPolicy CoopRestrictPropertiesPlusCoep() {
+  network::CrossOriginOpenerPolicy coop;
+  coop.value =
+      network::mojom::CrossOriginOpenerPolicyValue::kRestrictPropertiesPlusCoep;
+  coop.soap_by_default_value =
+      network::mojom::CrossOriginOpenerPolicyValue::kRestrictPropertiesPlusCoep;
   return coop;
 }
 
@@ -223,12 +232,12 @@
 
 // Same as CrossOriginOpenerPolicyBrowserTest, but enable COOP:SOAPPC.
 // See https://crbug.com/1221127.
-class SameOriginAllowPopupsPlusCoepBrowserTest
+class CoopRestrictPropertiesBrowserTest
     : public CrossOriginOpenerPolicyBrowserTest {
  public:
-  SameOriginAllowPopupsPlusCoepBrowserTest() {
-    feature_list_.InitWithFeatures(
-        {network::features::kCoopSameOriginAllowPopupsPlusCoep}, {});
+  CoopRestrictPropertiesBrowserTest() {
+    feature_list_.InitWithFeatures({network::features::kCoopRestrictProperties},
+                                   {});
   }
 
  private:
@@ -3659,7 +3668,7 @@
                          kTestParams,
                          CrossOriginOpenerPolicyBrowserTest::DescribeParams);
 INSTANTIATE_TEST_SUITE_P(All,
-                         SameOriginAllowPopupsPlusCoepBrowserTest,
+                         CoopRestrictPropertiesBrowserTest,
                          kTestParams,
                          CrossOriginOpenerPolicyBrowserTest::DescribeParams);
 INSTANTIATE_TEST_SUITE_P(All,
@@ -4535,19 +4544,34 @@
   EXPECT_NE(group_4, group_1);
 }
 
-IN_PROC_BROWSER_TEST_P(SameOriginAllowPopupsPlusCoepBrowserTest,
-                       CoopSameOriginAllowPopupsPlusCoepIsParsed) {
+IN_PROC_BROWSER_TEST_P(CoopRestrictPropertiesBrowserTest,
+                       CoopRestrictPropertiesIsParsed) {
   GURL starting_page(https_server()->GetURL(
       "a.test",
       "/set-header"
-      "?cross-origin-opener-policy: same-origin-allow-popups"
-      "&cross-origin-embedder-policy: require-corp"));
+      "?cross-origin-opener-policy: restrict-properties"));
   EXPECT_TRUE(NavigateToURL(shell(), starting_page));
 
-  // Verify that COOP:SOAPPC was parsed, and that it correctly enabled cross
-  // origin isolation.
+  // Verify that COOP: restrict-properties was parsed.
   EXPECT_EQ(current_frame_host()->cross_origin_opener_policy(),
-            CoopSameOriginAllowPopupsPlusCoep());
+            CoopRestrictProperties());
+  EXPECT_FALSE(
+      current_frame_host()->GetSiteInstance()->IsCrossOriginIsolated());
+}
+
+IN_PROC_BROWSER_TEST_P(CoopRestrictPropertiesBrowserTest,
+                       CoopRestrictPropertiesPlusCoepIsParsed) {
+  GURL starting_page(
+      https_server()->GetURL("a.test",
+                             "/set-header"
+                             "?cross-origin-opener-policy: restrict-properties"
+                             "&cross-origin-embedder-policy: require-corp"));
+  EXPECT_TRUE(NavigateToURL(shell(), starting_page));
+
+  // Verify that COOP: restrict-properties was parsed along COEP, and that it
+  // correctly enabled cross origin isolation.
+  EXPECT_EQ(current_frame_host()->cross_origin_opener_policy(),
+            CoopRestrictPropertiesPlusCoep());
   EXPECT_TRUE(current_frame_host()->GetSiteInstance()->IsCrossOriginIsolated());
 }
 
diff --git a/content/browser/devtools/protocol/network_handler.cc b/content/browser/devtools/protocol/network_handler.cc
index 1def8f0..b8bec2d 100644
--- a/content/browser/devtools/protocol/network_handler.cc
+++ b/content/browser/devtools/protocol/network_handler.cc
@@ -2741,10 +2741,13 @@
     case network::mojom::CrossOriginOpenerPolicyValue::kSameOriginPlusCoep:
       return protocol::Network::CrossOriginOpenerPolicyValueEnum::
           SameOriginPlusCoep;
-    case network::mojom::CrossOriginOpenerPolicyValue::
-        kSameOriginAllowPopupsPlusCoep:
+    case network::mojom::CrossOriginOpenerPolicyValue::kRestrictProperties:
       return protocol::Network::CrossOriginOpenerPolicyValueEnum::
-          SameOriginAllowPopupsPlusCoep;
+          RestrictProperties;
+    case network::mojom::CrossOriginOpenerPolicyValue::
+        kRestrictPropertiesPlusCoep:
+      return protocol::Network::CrossOriginOpenerPolicyValueEnum::
+          RestrictPropertiesPlusCoep;
   }
 }
 protocol::Network::CrossOriginEmbedderPolicyValue
diff --git a/content/browser/fenced_frame/fenced_frame.cc b/content/browser/fenced_frame/fenced_frame.cc
index cdb0bf3..219c9e6 100644
--- a/content/browser/fenced_frame/fenced_frame.cc
+++ b/content/browser/fenced_frame/fenced_frame.cc
@@ -54,16 +54,10 @@
                                       /*page_delegate=*/web_contents_,
                                       FrameTree::Type::kFencedFrame)),
       mode_(mode) {
-  scoped_refptr<SiteInstance> site_instance;
-  if (owner_render_frame_host->GetSiteInstance()->IsGuest()) {
-    site_instance = SiteInstance::CreateForGuest(
-        owner_render_frame_host->GetBrowserContext(),
-        owner_render_frame_host->GetSiteInstance()
-            ->GetStoragePartitionConfig());
-  } else {
-    site_instance =
-        SiteInstance::Create(owner_render_frame_host->GetBrowserContext());
-  }
+  scoped_refptr<SiteInstance> site_instance =
+      SiteInstanceImpl::CreateForFencedFrame(
+          owner_render_frame_host->GetSiteInstance());
+
   // Note that even though this is happening in response to an event in the
   // renderer (i.e., the creation of a <fencedframe> element), we are still
   // putting `renderer_initiated_creation` as false. This is because that
diff --git a/content/browser/fenced_frame/fenced_frame_browsertest.cc b/content/browser/fenced_frame/fenced_frame_browsertest.cc
index b940005..e7e9c9bf 100644
--- a/content/browser/fenced_frame/fenced_frame_browsertest.cc
+++ b/content/browser/fenced_frame/fenced_frame_browsertest.cc
@@ -18,6 +18,7 @@
 #include "content/public/browser/frame_type.h"
 #include "content/public/browser/navigation_handle.h"
 #include "content/public/common/content_features.h"
+#include "content/public/common/content_switches.h"
 #include "content/public/test/browser_test.h"
 #include "content/public/test/browser_test_utils.h"
 #include "content/public/test/content_browser_test.h"
@@ -945,6 +946,167 @@
   fenced_frame_rfh->GetRenderWidgetHost()->ForwardMouseEvent(mouse_event);
 }
 
+IN_PROC_BROWSER_TEST_F(FencedFrameBrowserTest,
+                       ProcessAllocationWithFullSiteIsolation) {
+  ASSERT_TRUE(https_server()->Start());
+  IsolateAllSitesForTesting(base::CommandLine::ForCurrentProcess());
+  ASSERT_TRUE(AreAllSitesIsolatedForTesting());
+
+  const GURL main_url = https_server()->GetURL("a.test", "/title1.html");
+  const GURL same_site_fenced_frame_url =
+      https_server()->GetURL("a.test", "/fenced_frames/title1.html");
+  const GURL cross_site_fenced_frame_url =
+      https_server()->GetURL("b.test", "/fenced_frames/title1.html");
+
+  EXPECT_TRUE(NavigateToURL(shell(), main_url));
+
+  // Empty fenced frame document should have a different site instance, but
+  // should be in the same process as embedder.
+  RenderFrameHost* fenced_frame_rfh =
+      fenced_frame_test_helper().CreateFencedFrame(primary_main_frame_host(),
+                                                   GURL());
+  EXPECT_NE(fenced_frame_rfh->GetSiteInstance(),
+            primary_main_frame_host()->GetSiteInstance());
+  EXPECT_FALSE(fenced_frame_rfh->GetSiteInstance()->IsRelatedSiteInstance(
+      primary_main_frame_host()->GetSiteInstance()));
+  EXPECT_EQ(fenced_frame_rfh->GetProcess(),
+            primary_main_frame_host()->GetProcess());
+
+  // Same-site fenced frame document should be in the same process as embedder.
+  fenced_frame_rfh = fenced_frame_test_helper().NavigateFrameInFencedFrameTree(
+      fenced_frame_rfh, same_site_fenced_frame_url);
+  EXPECT_NE(fenced_frame_rfh->GetSiteInstance(),
+            primary_main_frame_host()->GetSiteInstance());
+  EXPECT_FALSE(fenced_frame_rfh->GetSiteInstance()->IsRelatedSiteInstance(
+      primary_main_frame_host()->GetSiteInstance()));
+  EXPECT_EQ(fenced_frame_rfh->GetProcess(),
+            primary_main_frame_host()->GetProcess());
+
+  // Cross-site fenced frame document should be in a different process from its
+  // embedder.
+  fenced_frame_rfh = fenced_frame_test_helper().NavigateFrameInFencedFrameTree(
+      fenced_frame_rfh, cross_site_fenced_frame_url);
+  EXPECT_NE(fenced_frame_rfh->GetProcess(),
+            primary_main_frame_host()->GetProcess());
+}
+
+IN_PROC_BROWSER_TEST_F(FencedFrameBrowserTest,
+                       CrossSiteFencedFramesShareProcess) {
+  ASSERT_TRUE(https_server()->Start());
+  IsolateAllSitesForTesting(base::CommandLine::ForCurrentProcess());
+  ASSERT_TRUE(AreAllSitesIsolatedForTesting());
+
+  const GURL main_url = https_server()->GetURL("a.test", "/title1.html");
+  const GURL same_site_fenced_frame_url =
+      https_server()->GetURL("a.test", "/fenced_frames/title1.html");
+  const GURL cross_site_fenced_frame_url =
+      https_server()->GetURL("b.test", "/fenced_frames/title1.html");
+
+  EXPECT_TRUE(NavigateToURL(shell(), main_url));
+
+  // Two fenced frames that are same-site with each other, and cross-site with
+  // the embedder should be in the same process. This happens due to the
+  // subframe process reuse policy which also applies to fenced frames (the
+  // second fenced frame will try to reuse an existing process that is locked to
+  // the same site).
+  RenderFrameHost* ff_rfh_1 = fenced_frame_test_helper().CreateFencedFrame(
+      primary_main_frame_host(), cross_site_fenced_frame_url);
+  RenderFrameHost* ff_rfh_2 = fenced_frame_test_helper().CreateFencedFrame(
+      primary_main_frame_host(), cross_site_fenced_frame_url);
+  EXPECT_NE(ff_rfh_1->GetSiteInstance(), ff_rfh_2->GetSiteInstance());
+  EXPECT_NE(ff_rfh_1->GetProcess(), primary_main_frame_host()->GetProcess());
+  EXPECT_EQ(ff_rfh_1->GetProcess(), ff_rfh_2->GetProcess());
+
+  // The cross-site fenced frame should be moved to the same process as embedder
+  // when navigated to same-site (similar to before).
+  ff_rfh_2 = fenced_frame_test_helper().NavigateFrameInFencedFrameTree(
+      ff_rfh_2, same_site_fenced_frame_url);
+  EXPECT_EQ(ff_rfh_2->GetProcess(), primary_main_frame_host()->GetProcess());
+}
+
+class FencedFrameWithSiteIsolationDisabledBrowserTest
+    : public FencedFrameBrowserTest {
+ public:
+  FencedFrameWithSiteIsolationDisabledBrowserTest() = default;
+  ~FencedFrameWithSiteIsolationDisabledBrowserTest() override = default;
+
+  void SetUpCommandLine(base::CommandLine* command_line) override {
+    FencedFrameBrowserTest::SetUpCommandLine(command_line);
+    command_line->AppendSwitch(switches::kDisableSiteIsolation);
+  }
+};
+
+IN_PROC_BROWSER_TEST_F(FencedFrameWithSiteIsolationDisabledBrowserTest,
+                       ProcessAllocationWithSiteIsolationDisabled) {
+  ASSERT_TRUE(https_server()->Start());
+  if (AreAllSitesIsolatedForTesting()) {
+    LOG(ERROR) << "Site isolation should be disabled for this test.";
+    return;
+  }
+
+  const GURL main_url = https_server()->GetURL("a.test", "/title1.html");
+  const GURL same_site_fenced_frame_url =
+      https_server()->GetURL("a.test", "/fenced_frames/title1.html");
+  const GURL cross_site_fenced_frame_url =
+      https_server()->GetURL("b.test", "/fenced_frames/title1.html");
+
+  EXPECT_TRUE(NavigateToURL(shell(), main_url));
+
+  // Empty fenced frame document should be in the same process as embedder.
+  RenderFrameHost* fenced_frame_rfh =
+      fenced_frame_test_helper().CreateFencedFrame(primary_main_frame_host(),
+                                                   GURL());
+  EXPECT_NE(fenced_frame_rfh->GetSiteInstance(),
+            primary_main_frame_host()->GetSiteInstance());
+  EXPECT_EQ(fenced_frame_rfh->GetProcess(),
+            primary_main_frame_host()->GetProcess());
+
+  // Same-site fenced frame document should be in the same process as embedder.
+  fenced_frame_rfh = fenced_frame_test_helper().NavigateFrameInFencedFrameTree(
+      fenced_frame_rfh, same_site_fenced_frame_url);
+  EXPECT_EQ(fenced_frame_rfh->GetProcess(),
+            primary_main_frame_host()->GetProcess());
+
+  // Cross-site fenced frame document should be in the same process as the
+  // embedder (with site isolation disabled).
+  fenced_frame_rfh = fenced_frame_test_helper().NavigateFrameInFencedFrameTree(
+      fenced_frame_rfh, cross_site_fenced_frame_url);
+  EXPECT_EQ(fenced_frame_rfh->GetProcess(),
+            primary_main_frame_host()->GetProcess());
+}
+
+IN_PROC_BROWSER_TEST_F(FencedFrameWithSiteIsolationDisabledBrowserTest,
+                       ProcessAllocationWithDynamicIsolatedOrigin) {
+  ASSERT_TRUE(https_server()->Start());
+  if (AreAllSitesIsolatedForTesting()) {
+    LOG(ERROR) << "Site isolation should be disabled for this test.";
+    return;
+  }
+  const GURL main_url = https_server()->GetURL("a.test", "/title1.html");
+  const GURL isolated_cross_site_fenced_frame_url =
+      https_server()->GetURL("isolated.b.test", "/fenced_frames/title1.html");
+  const GURL cross_site_fenced_frame_url =
+      https_server()->GetURL("c.test", "/fenced_frames/title1.html");
+
+  EXPECT_TRUE(NavigateToURL(shell(), main_url));
+
+  // Start isolating "isolated.b.test".
+  auto* policy = ChildProcessSecurityPolicyImpl::GetInstance();
+  policy->AddFutureIsolatedOrigins(
+      {url::Origin::Create(isolated_cross_site_fenced_frame_url)},
+      ChildProcessSecurityPolicy::IsolatedOriginSource::TEST);
+
+  RenderFrameHost* ff_rfh_1 = fenced_frame_test_helper().CreateFencedFrame(
+      primary_main_frame_host(), cross_site_fenced_frame_url);
+  RenderFrameHost* ff_rfh_2 = fenced_frame_test_helper().CreateFencedFrame(
+      primary_main_frame_host(), isolated_cross_site_fenced_frame_url);
+
+  // The c.test fenced frame should share a process with the embedder, but
+  // the isolated.b.test fenced frame should be in a different process.
+  EXPECT_EQ(ff_rfh_1->GetProcess(), primary_main_frame_host()->GetProcess());
+  EXPECT_NE(ff_rfh_2->GetProcess(), ff_rfh_1->GetProcess());
+}
+
 namespace {
 
 enum class FrameTypeWithOrigin {
diff --git a/content/browser/file_system_access/file_system_access_capacity_allocation_host_impl_unittest.cc b/content/browser/file_system_access/file_system_access_capacity_allocation_host_impl_unittest.cc
index f9aa4d02..17e531c 100644
--- a/content/browser/file_system_access/file_system_access_capacity_allocation_host_impl_unittest.cc
+++ b/content/browser/file_system_access/file_system_access_capacity_allocation_host_impl_unittest.cc
@@ -9,6 +9,7 @@
 #include "base/memory/scoped_refptr.h"
 #include "base/test/bind.h"
 #include "base/test/task_environment.h"
+#include "base/test/test_future.h"
 #include "base/types/pass_key.h"
 #include "content/browser/file_system_access/mock_file_system_access_permission_context.h"
 #include "content/public/test/browser_task_environment.h"
@@ -32,15 +33,9 @@
 int64_t RequestCapacityChangeSync(
     FileSystemAccessCapacityAllocationHostImpl* allocation_host,
     int64_t capacity_delta) {
-  int64_t granted_capacity;
-  base::RunLoop run_loop;
-  allocation_host->RequestCapacityChange(
-      capacity_delta,
-      base::BindLambdaForTesting([&](int64_t returned_granted_capacity) {
-        granted_capacity = returned_granted_capacity;
-        run_loop.Quit();
-      }));
-  run_loop.Run();
+  base::test::TestFuture<int64_t> future;
+  allocation_host->RequestCapacityChange(capacity_delta, future.GetCallback());
+  int64_t granted_capacity = future.Get();
   return granted_capacity;
 }
 
diff --git a/content/browser/file_system_access/file_system_access_directory_handle_impl_unittest.cc b/content/browser/file_system_access/file_system_access_directory_handle_impl_unittest.cc
index 7116ae7c..606e3447 100644
--- a/content/browser/file_system_access/file_system_access_directory_handle_impl_unittest.cc
+++ b/content/browser/file_system_access/file_system_access_directory_handle_impl_unittest.cc
@@ -15,6 +15,7 @@
 #include "base/run_loop.h"
 #include "base/test/bind.h"
 #include "base/test/task_environment.h"
+#include "base/test/test_future.h"
 #include "build/build_config.h"
 #include "components/services/storage/public/cpp/buckets/bucket_locator.h"
 #include "content/browser/file_system_access/file_system_access_write_lock_manager.h"
@@ -247,37 +248,28 @@
 TEST_F(FileSystemAccessDirectoryHandleImplTest, GetFile_NoReadAccess) {
   ASSERT_TRUE(base::WriteFile(dir_.GetPath().AppendASCII("filename"), "data"));
 
-  base::RunLoop loop;
-  denied_handle_->GetFile(
-      "filename", /*create=*/false,
-      base::BindLambdaForTesting(
-          [](blink::mojom::FileSystemAccessErrorPtr result,
-             mojo::PendingRemote<blink::mojom::FileSystemAccessFileHandle>
-                 file_handle) {
-            EXPECT_EQ(result->status,
-                      blink::mojom::FileSystemAccessStatus::kPermissionDenied);
-            EXPECT_FALSE(file_handle.is_valid());
-          })
-          .Then(loop.QuitClosure()));
-  loop.Run();
+  base::test::TestFuture<
+      blink::mojom::FileSystemAccessErrorPtr,
+      mojo::PendingRemote<blink::mojom::FileSystemAccessFileHandle>>
+      future;
+  denied_handle_->GetFile("filename", /*create=*/false, future.GetCallback());
+  EXPECT_EQ(future.Get<0>()->status,
+            blink::mojom::FileSystemAccessStatus::kPermissionDenied);
+  EXPECT_FALSE(future.Get<1>().is_valid());
 }
 
 TEST_F(FileSystemAccessDirectoryHandleImplTest, GetDirectory_NoReadAccess) {
   ASSERT_TRUE(base::CreateDirectory(dir_.GetPath().AppendASCII("dirname")));
 
-  base::RunLoop loop;
-  denied_handle_->GetDirectory(
-      "GetDirectory_NoReadAccess", /*create=*/false,
-      base::BindLambdaForTesting(
-          [](blink::mojom::FileSystemAccessErrorPtr result,
-             mojo::PendingRemote<blink::mojom::FileSystemAccessDirectoryHandle>
-                 dir_handle) {
-            EXPECT_EQ(result->status,
-                      blink::mojom::FileSystemAccessStatus::kPermissionDenied);
-            EXPECT_FALSE(dir_handle.is_valid());
-          })
-          .Then(loop.QuitClosure()));
-  loop.Run();
+  base::test::TestFuture<
+      blink::mojom::FileSystemAccessErrorPtr,
+      mojo::PendingRemote<blink::mojom::FileSystemAccessDirectoryHandle>>
+      future;
+  denied_handle_->GetDirectory("GetDirectory_NoReadAccess", /*create=*/false,
+                               future.GetCallback());
+  EXPECT_EQ(future.Get<0>()->status,
+            blink::mojom::FileSystemAccessStatus::kPermissionDenied);
+  EXPECT_FALSE(future.Get<1>().is_valid());
 }
 
 TEST_F(FileSystemAccessDirectoryHandleImplTest, GetEntries_NoReadAccess) {
@@ -306,16 +298,12 @@
 
   auto handle = GetHandleWithPermissions(dir, /*read=*/true, /*write=*/false);
 
-  base::RunLoop loop;
+  base::test::TestFuture<blink::mojom::FileSystemAccessErrorPtr> future;
   handle->Remove(
-      /*recurse=*/false,
-      base::BindLambdaForTesting([&dir](blink::mojom::FileSystemAccessErrorPtr
-                                            result) {
-        EXPECT_EQ(result->status,
-                  blink::mojom::FileSystemAccessStatus::kPermissionDenied);
-        EXPECT_TRUE(base::DirectoryExists(dir));
-      }).Then(loop.QuitClosure()));
-  loop.Run();
+      /*recurse=*/false, future.GetCallback());
+  EXPECT_EQ(future.Get()->status,
+            blink::mojom::FileSystemAccessStatus::kPermissionDenied);
+  EXPECT_TRUE(base::DirectoryExists(dir));
 }
 
 TEST_F(FileSystemAccessDirectoryHandleImplTest, Remove_HasWriteAccess) {
@@ -324,15 +312,11 @@
 
   auto handle = GetHandleWithPermissions(dir, /*read=*/true, /*write=*/true);
 
-  base::RunLoop loop;
+  base::test::TestFuture<blink::mojom::FileSystemAccessErrorPtr> future;
   handle->Remove(
-      /*recurse=*/false,
-      base::BindLambdaForTesting([&dir](blink::mojom::FileSystemAccessErrorPtr
-                                            result) {
-        EXPECT_EQ(result->status, blink::mojom::FileSystemAccessStatus::kOk);
-        EXPECT_FALSE(base::DirectoryExists(dir));
-      }).Then(loop.QuitClosure()));
-  loop.Run();
+      /*recurse=*/false, future.GetCallback());
+  EXPECT_EQ(future.Get()->status, blink::mojom::FileSystemAccessStatus::kOk);
+  EXPECT_FALSE(base::DirectoryExists(dir));
 }
 
 TEST_F(FileSystemAccessDirectoryHandleImplTest, RemoveEntry) {
@@ -351,20 +335,14 @@
     EXPECT_EQ(handle->GetChildURL(base_name, &file_url)->file_error,
               base::File::Error::FILE_OK);
 
-    base::RunLoop loop;
-    handle->RemoveEntry(
-        base_name,
-        /*recurse=*/false,
-        base::BindLambdaForTesting([&](blink::mojom::FileSystemAccessErrorPtr
-                                           result) {
-          EXPECT_EQ(result->status, blink::mojom::FileSystemAccessStatus::kOk);
-          EXPECT_FALSE(base::PathExists(file));
-          // The write lock acquired during the operation should be released by
-          // the time the callback runs.
-          EXPECT_TRUE(
-              manager_->TakeWriteLock(file_url, WriteLockType::kExclusive));
-        }).Then(loop.QuitClosure()));
-    loop.Run();
+    base::test::TestFuture<blink::mojom::FileSystemAccessErrorPtr> future;
+    handle->RemoveEntry(base_name,
+                        /*recurse=*/false, future.GetCallback());
+    EXPECT_EQ(future.Get()->status, blink::mojom::FileSystemAccessStatus::kOk);
+    EXPECT_FALSE(base::PathExists(file));
+    // The write lock acquired during the operation should be released by
+    // the time the callback runs.
+    EXPECT_TRUE(manager_->TakeWriteLock(file_url, WriteLockType::kExclusive));
   }
 
   // Acquire an exclusive lock on a file before removing to similate when the
@@ -378,18 +356,13 @@
         manager_->TakeWriteLock(file_url, WriteLockType::kExclusive);
     EXPECT_TRUE(write_lock);
 
-    base::RunLoop loop;
+    base::test::TestFuture<blink::mojom::FileSystemAccessErrorPtr> future;
     handle->RemoveEntry(base_name,
-                        /*recurse=*/false,
-                        base::BindLambdaForTesting(
-                            [&](blink::mojom::FileSystemAccessErrorPtr result) {
-                              EXPECT_EQ(result->status,
-                                        blink::mojom::FileSystemAccessStatus::
-                                            kNoModificationAllowedError);
-                              EXPECT_TRUE(base::PathExists(file));
-                            })
-                            .Then(loop.QuitClosure()));
-    loop.Run();
+                        /*recurse=*/false, future.GetCallback());
+    EXPECT_EQ(
+        future.Get()->status,
+        blink::mojom::FileSystemAccessStatus::kNoModificationAllowedError);
+    EXPECT_TRUE(base::PathExists(file));
   }
 
   // Acquire a shared lock on a file before removing to simulate when the file
@@ -403,16 +376,11 @@
     ASSERT_TRUE(write_lock);
     EXPECT_TRUE(write_lock->type() == WriteLockType::kShared);
 
-    base::RunLoop loop;
-    handle->RemoveEntry(
-        base_name,
-        /*recurse=*/false,
-        base::BindLambdaForTesting([&](blink::mojom::FileSystemAccessErrorPtr
-                                           result) {
-          EXPECT_EQ(result->status, blink::mojom::FileSystemAccessStatus::kOk);
-          EXPECT_FALSE(base::PathExists(file));
-        }).Then(loop.QuitClosure()));
-    loop.Run();
+    base::test::TestFuture<blink::mojom::FileSystemAccessErrorPtr> future;
+    handle->RemoveEntry(base_name,
+                        /*recurse=*/false, future.GetCallback());
+    EXPECT_EQ(future.Get()->status, blink::mojom::FileSystemAccessStatus::kOk);
+    EXPECT_FALSE(base::PathExists(file));
   }
 }
 
diff --git a/content/browser/file_system_access/file_system_access_file_handle_impl_unittest.cc b/content/browser/file_system_access/file_system_access_file_handle_impl_unittest.cc
index 2af0666..2c7038d 100644
--- a/content/browser/file_system_access/file_system_access_file_handle_impl_unittest.cc
+++ b/content/browser/file_system_access/file_system_access_file_handle_impl_unittest.cc
@@ -19,6 +19,7 @@
 #include "base/test/bind.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
+#include "base/test/test_future.h"
 #include "content/browser/file_system_access/fixed_file_system_access_permission_grant.h"
 #include "content/public/common/content_features.h"
 #include "content/public/test/browser_task_environment.h"
@@ -189,36 +190,34 @@
               base::StringPrintf("test.%d.crswap", i)));
     }
 
-    base::RunLoop loop;
+    base::test::TestFuture<
+        blink::mojom::FileSystemAccessErrorPtr,
+        mojo::PendingRemote<blink::mojom::FileSystemAccessFileWriter>>
+        future;
     handle_->CreateFileWriter(
         /*keep_existing_data=*/false,
-        /*auto_close=*/false,
-        base::BindLambdaForTesting(
-            [&](blink::mojom::FileSystemAccessErrorPtr result,
-                mojo::PendingRemote<blink::mojom::FileSystemAccessFileWriter>
-                    writer_remote) {
-              EXPECT_EQ(blink::mojom::FileSystemAccessStatus::kOk,
-                        result->status);
-              EXPECT_EQ("", ReadFile(swap_url));
-              writers.push_back(std::move(writer_remote));
-              loop.Quit();
-            }));
-    loop.Run();
+        /*auto_close=*/false, future.GetCallback());
+    blink::mojom::FileSystemAccessErrorPtr result;
+    mojo::PendingRemote<blink::mojom::FileSystemAccessFileWriter> writer_remote;
+    std::tie(result, writer_remote) = future.Take();
+    EXPECT_EQ(result->status, blink::mojom::FileSystemAccessStatus::kOk);
+    EXPECT_EQ("", ReadFile(swap_url));
+    writers.push_back(std::move(writer_remote));
   }
 
-  base::RunLoop loop;
+  base::test::TestFuture<
+      blink::mojom::FileSystemAccessErrorPtr,
+      mojo::PendingRemote<blink::mojom::FileSystemAccessFileWriter>>
+      future;
   handle_->CreateFileWriter(
       /*keep_existing_data=*/false,
-      /*auto_close=*/false,
-      base::BindLambdaForTesting(
-          [&](blink::mojom::FileSystemAccessErrorPtr result,
-              mojo::PendingRemote<blink::mojom::FileSystemAccessFileWriter>
-                  writer_remote) {
-            EXPECT_EQ(blink::mojom::FileSystemAccessStatus::kOperationFailed,
-                      result->status);
-            loop.Quit();
-          }));
-  loop.Run();
+      /*auto_close=*/false, future.GetCallback());
+  blink::mojom::FileSystemAccessErrorPtr result;
+  mojo::PendingRemote<blink::mojom::FileSystemAccessFileWriter> writer_remote;
+  std::tie(result, writer_remote) = future.Take();
+  EXPECT_EQ(result->status,
+            blink::mojom::FileSystemAccessStatus::kOperationFailed);
+  EXPECT_FALSE(writer_remote.is_valid());
 }
 
 TEST_F(FileSystemAccessFileHandleImplTest, Remove_NoWriteAccess) {
@@ -227,15 +226,11 @@
 
   auto handle = GetHandleWithPermissions(file, /*read=*/true, /*write=*/false);
 
-  base::RunLoop loop;
-  handle->Remove(
-      base::BindLambdaForTesting([&file](blink::mojom::FileSystemAccessErrorPtr
-                                             result) {
-        EXPECT_EQ(result->status,
-                  blink::mojom::FileSystemAccessStatus::kPermissionDenied);
-        EXPECT_TRUE(base::PathExists(file));
-      }).Then(loop.QuitClosure()));
-  loop.Run();
+  base::test::TestFuture<blink::mojom::FileSystemAccessErrorPtr> future;
+  handle->Remove(future.GetCallback());
+  EXPECT_EQ(future.Get()->status,
+            blink::mojom::FileSystemAccessStatus::kPermissionDenied);
+  EXPECT_TRUE(base::PathExists(file));
 }
 
 TEST_F(FileSystemAccessFileHandleImplTest, Remove_HasWriteAccess) {
@@ -244,15 +239,10 @@
 
   auto handle = GetHandleWithPermissions(file, /*read=*/true, /*write=*/true);
 
-  base::RunLoop loop;
-  handle->Remove(base::BindLambdaForTesting(
-                     [&file](blink::mojom::FileSystemAccessErrorPtr result) {
-                       EXPECT_EQ(result->status,
-                                 blink::mojom::FileSystemAccessStatus::kOk);
-                       EXPECT_FALSE(base::PathExists(file));
-                     })
-                     .Then(loop.QuitClosure()));
-  loop.Run();
+  base::test::TestFuture<blink::mojom::FileSystemAccessErrorPtr> future;
+  handle->Remove(future.GetCallback());
+  EXPECT_EQ(future.Get()->status, blink::mojom::FileSystemAccessStatus::kOk);
+  EXPECT_FALSE(base::PathExists(file));
 }
 
 TEST_F(FileSystemAccessFileHandleImplTest, GetSwapURL) {
@@ -288,47 +278,45 @@
 }
 
 TEST_F(FileSystemAccessAccessHandleTest, OpenAccessHandle) {
-  base::RunLoop loop;
-  handle_->OpenAccessHandle(
-      base::BindLambdaForTesting(
-          [&](blink::mojom::FileSystemAccessErrorPtr result,
-              blink::mojom::FileSystemAccessAccessHandleFilePtr file,
-              mojo::PendingRemote<
-                  blink::mojom::FileSystemAccessAccessHandleHost>
-                  access_handle_remote) {
-            EXPECT_EQ(result->status,
-                      blink::mojom::FileSystemAccessStatus::kOk);
-            // File should be valid and no incognito remote is needed.
-            EXPECT_TRUE(file->is_regular_file());
-            blink::mojom::FileSystemAccessRegularFilePtr regular_file =
-                std::move(file->get_regular_file());
-            EXPECT_TRUE(regular_file->os_file.IsValid());
-            EXPECT_EQ(regular_file->file_size, 0);
-            EXPECT_TRUE(regular_file->capacity_allocation_host.is_valid());
-            EXPECT_TRUE(access_handle_remote.is_valid());
-          })
-          .Then(loop.QuitClosure()));
-  loop.Run();
+  base::test::TestFuture<
+      blink::mojom::FileSystemAccessErrorPtr,
+      blink::mojom::FileSystemAccessAccessHandleFilePtr,
+      mojo::PendingRemote<blink::mojom::FileSystemAccessAccessHandleHost>>
+      future;
+  handle_->OpenAccessHandle(future.GetCallback());
+  blink::mojom::FileSystemAccessErrorPtr result;
+  blink::mojom::FileSystemAccessAccessHandleFilePtr file;
+  mojo::PendingRemote<blink::mojom::FileSystemAccessAccessHandleHost>
+      access_handle_remote;
+  std::tie(result, file, access_handle_remote) = future.Take();
+  EXPECT_EQ(result->status, blink::mojom::FileSystemAccessStatus::kOk);
+  // File should be valid and no incognito remote is needed.
+  EXPECT_TRUE(file->is_regular_file());
+  blink::mojom::FileSystemAccessRegularFilePtr regular_file =
+      std::move(file->get_regular_file());
+  EXPECT_TRUE(regular_file->os_file.IsValid());
+  EXPECT_EQ(regular_file->file_size, 0);
+  EXPECT_TRUE(regular_file->capacity_allocation_host.is_valid());
+  EXPECT_TRUE(access_handle_remote.is_valid());
 }
 
 TEST_F(FileSystemAccessAccessHandleIncognitoTest, OpenAccessHandle) {
-  base::RunLoop loop;
-  handle_->OpenAccessHandle(
-      base::BindLambdaForTesting(
-          [&](blink::mojom::FileSystemAccessErrorPtr result,
-              blink::mojom::FileSystemAccessAccessHandleFilePtr file,
-              mojo::PendingRemote<
-                  blink::mojom::FileSystemAccessAccessHandleHost>
-                  access_handle_remote) {
-            EXPECT_EQ(result->status,
-                      blink::mojom::FileSystemAccessStatus::kOk);
-            // Incognito remote should be valid and no file is needed.
-            EXPECT_TRUE(file->is_incognito_file_delegate());
-            EXPECT_TRUE(file->get_incognito_file_delegate().is_valid());
-            EXPECT_TRUE(access_handle_remote.is_valid());
-          })
-          .Then(loop.QuitClosure()));
-  loop.Run();
+  base::test::TestFuture<
+      blink::mojom::FileSystemAccessErrorPtr,
+      blink::mojom::FileSystemAccessAccessHandleFilePtr,
+      mojo::PendingRemote<blink::mojom::FileSystemAccessAccessHandleHost>>
+      future;
+  handle_->OpenAccessHandle(future.GetCallback());
+  blink::mojom::FileSystemAccessErrorPtr result;
+  blink::mojom::FileSystemAccessAccessHandleFilePtr file;
+  mojo::PendingRemote<blink::mojom::FileSystemAccessAccessHandleHost>
+      access_handle_remote;
+  std::tie(result, file, access_handle_remote) = future.Take();
+  EXPECT_EQ(result->status, blink::mojom::FileSystemAccessStatus::kOk);
+  // Incognito remote should be valid and no file is needed.
+  EXPECT_TRUE(file->is_incognito_file_delegate());
+  EXPECT_TRUE(file->get_incognito_file_delegate().is_valid());
+  EXPECT_TRUE(access_handle_remote.is_valid());
 }
 
 }  // namespace content
diff --git a/content/browser/file_system_access/file_system_access_file_writer_impl_unittest.cc b/content/browser/file_system_access/file_system_access_file_writer_impl_unittest.cc
index 9512d44..5cd0309 100644
--- a/content/browser/file_system_access/file_system_access_file_writer_impl_unittest.cc
+++ b/content/browser/file_system_access/file_system_access_file_writer_impl_unittest.cc
@@ -18,6 +18,7 @@
 #include "base/test/bind.h"
 #include "base/test/gmock_callback_support.h"
 #include "base/test/task_environment.h"
+#include "base/test/test_future.h"
 #include "content/browser/file_system_access/file_system_access_write_lock_manager.h"
 #include "content/browser/file_system_access/fixed_file_system_access_permission_grant.h"
 #include "content/browser/file_system_access/mock_file_system_access_permission_context.h"
@@ -223,55 +224,30 @@
       uint64_t position,
       mojo::ScopedDataPipeConsumerHandle data_pipe,
       uint64_t* bytes_written_out) {
-    base::RunLoop loop;
-    FileSystemAccessStatus result_out;
-    handle_->Write(position, std::move(data_pipe),
-                   base::BindLambdaForTesting(
-                       [&](blink::mojom::FileSystemAccessErrorPtr result,
-                           uint64_t bytes_written) {
-                         result_out = result->status;
-                         *bytes_written_out = bytes_written;
-                         loop.Quit();
-                       }));
-    loop.Run();
-    return result_out;
+    base::test::TestFuture<blink::mojom::FileSystemAccessErrorPtr, uint64_t>
+        future;
+    handle_->Write(position, std::move(data_pipe), future.GetCallback());
+    blink::mojom::FileSystemAccessErrorPtr result;
+    std::tie(result, *bytes_written_out) = future.Take();
+    return result->status;
   }
 
   FileSystemAccessStatus TruncateSync(uint64_t length) {
-    base::RunLoop loop;
-    FileSystemAccessStatus result_out;
-    handle_->Truncate(length,
-                      base::BindLambdaForTesting(
-                          [&](blink::mojom::FileSystemAccessErrorPtr result) {
-                            result_out = result->status;
-                            loop.Quit();
-                          }));
-    loop.Run();
-    return result_out;
+    base::test::TestFuture<blink::mojom::FileSystemAccessErrorPtr> future;
+    handle_->Truncate(length, future.GetCallback());
+    return future.Get()->status;
   }
 
   FileSystemAccessStatus CloseSync() {
-    base::RunLoop loop;
-    FileSystemAccessStatus result_out;
-    handle_->Close(base::BindLambdaForTesting(
-        [&](blink::mojom::FileSystemAccessErrorPtr result) {
-          result_out = result->status;
-          loop.Quit();
-        }));
-    loop.Run();
-    return result_out;
+    base::test::TestFuture<blink::mojom::FileSystemAccessErrorPtr> future;
+    handle_->Close(future.GetCallback());
+    return future.Get()->status;
   }
 
   FileSystemAccessStatus AbortSync() {
-    base::RunLoop loop;
-    FileSystemAccessStatus result_out;
-    handle_->Abort(base::BindLambdaForTesting(
-        [&](blink::mojom::FileSystemAccessErrorPtr result) {
-          result_out = result->status;
-          loop.Quit();
-        }));
-    loop.Run();
-    return result_out;
+    base::test::TestFuture<blink::mojom::FileSystemAccessErrorPtr> future;
+    handle_->Abort(future.GetCallback());
+    return future.Get()->status;
   }
 
   FileSystemAccessStatus WriteSync(uint64_t position,
@@ -649,13 +625,11 @@
   std::move(sb_callback)
       .Run(FileSystemAccessPermissionContext::AfterWriteCheckResult::kAllow);
 
-  base::RunLoop move_loop;
+  base::test::TestFuture<storage::FileSystemURL> future;
   test_file_system_backend_->SetOperationCreatedCallback(
-      base::BindLambdaForTesting([&](const storage::FileSystemURL& url) {
-        EXPECT_EQ(url, test_file_url_);
-        move_loop.Quit();
-      }));
-  move_loop.Run();
+      future.GetCallback<const storage::FileSystemURL&>());
+  EXPECT_EQ(future.Get(), test_file_url_);
+
   // About to start the move operation. Now destroy the writer. The
   // move will still complete, but make sure that quarantine was also
   // applied to the resulting file.
diff --git a/content/browser/file_system_access/file_system_access_handle_base_unittest.cc b/content/browser/file_system_access/file_system_access_handle_base_unittest.cc
index 14f8e24..9f5bd1a8 100644
--- a/content/browser/file_system_access/file_system_access_handle_base_unittest.cc
+++ b/content/browser/file_system_access/file_system_access_handle_base_unittest.cc
@@ -8,6 +8,7 @@
 #include "base/test/bind.h"
 #include "base/test/gmock_callback_support.h"
 #include "base/test/task_environment.h"
+#include "base/test/test_future.h"
 #include "components/services/storage/public/cpp/buckets/bucket_locator.h"
 #include "content/browser/file_system_access/mock_file_system_access_permission_grant.h"
 #include "content/public/test/browser_task_environment.h"
@@ -156,17 +157,13 @@
   EXPECT_CALL(*write_grant_, GetStatus())
       .WillOnce(testing::Return(PermissionStatus::GRANTED));
 
-  base::RunLoop loop;
+  base::test::TestFuture<blink::mojom::FileSystemAccessErrorPtr,
+                         PermissionStatus>
+      future;
   handle.DoRequestPermission(
-      /*writable=*/true,
-      base::BindLambdaForTesting(
-          [&](blink::mojom::FileSystemAccessErrorPtr error,
-              PermissionStatus result) {
-            EXPECT_EQ(blink::mojom::FileSystemAccessStatus::kOk, error->status);
-            EXPECT_EQ(PermissionStatus::GRANTED, result);
-            loop.Quit();
-          }));
-  loop.Run();
+      /*writable=*/true, future.GetCallback());
+  EXPECT_EQ(future.Get<0>()->status, blink::mojom::FileSystemAccessStatus::kOk);
+  EXPECT_EQ(future.Get<1>(), PermissionStatus::GRANTED);
 }
 
 TEST_F(FileSystemAccessHandleBaseTest, RequestWritePermission) {
@@ -198,17 +195,13 @@
         .WillOnce(testing::Return(PermissionStatus::GRANTED));
   }
 
-  base::RunLoop loop;
+  base::test::TestFuture<blink::mojom::FileSystemAccessErrorPtr,
+                         PermissionStatus>
+      future;
   handle.DoRequestPermission(
-      /*writable=*/true,
-      base::BindLambdaForTesting(
-          [&](blink::mojom::FileSystemAccessErrorPtr error,
-              PermissionStatus result) {
-            EXPECT_EQ(blink::mojom::FileSystemAccessStatus::kOk, error->status);
-            EXPECT_EQ(PermissionStatus::GRANTED, result);
-            loop.Quit();
-          }));
-  loop.Run();
+      /*writable=*/true, future.GetCallback());
+  EXPECT_EQ(future.Get<0>()->status, blink::mojom::FileSystemAccessStatus::kOk);
+  EXPECT_EQ(future.Get<1>(), PermissionStatus::GRANTED);
 }
 
 TEST_F(FileSystemAccessHandleBaseTest, GetParentURL_CustomBucketLocator) {
diff --git a/content/browser/file_system_access/file_system_access_manager_impl_unittest.cc b/content/browser/file_system_access/file_system_access_manager_impl_unittest.cc
index 8b2caa7..d3b2bb78 100644
--- a/content/browser/file_system_access/file_system_access_manager_impl_unittest.cc
+++ b/content/browser/file_system_access/file_system_access_manager_impl_unittest.cc
@@ -91,18 +91,18 @@
 // `std::string`.
 std::string ReadStringFromFileRemote(
     mojo::Remote<blink::mojom::FileSystemAccessFileHandle> file_remote) {
-  base::RunLoop await_get_blob;
+  base::test::TestFuture<blink::mojom::FileSystemAccessErrorPtr,
+                         base::File::Info, blink::mojom::SerializedBlobPtr>
+      future;
+  file_remote->AsBlob(future.GetCallback<blink::mojom::FileSystemAccessErrorPtr,
+                                         const base::File::Info&,
+                                         blink::mojom::SerializedBlobPtr>());
+  EXPECT_EQ(future.Get<0>()->status, blink::mojom::FileSystemAccessStatus::kOk);
+  blink::mojom::SerializedBlobPtr received_blob = std::get<2>(future.Take());
+  EXPECT_FALSE(received_blob.is_null());
+
   mojo::Remote<blink::mojom::Blob> blob;
-  file_remote->AsBlob(base::BindLambdaForTesting(
-      [&](blink::mojom::FileSystemAccessErrorPtr result,
-          const base::File::Info& info,
-          blink::mojom::SerializedBlobPtr received_blob) {
-        EXPECT_EQ(result->status, blink::mojom::FileSystemAccessStatus::kOk);
-        EXPECT_FALSE(received_blob.is_null());
-        blob.Bind(std::move(received_blob->blob));
-        await_get_blob.Quit();
-      }));
-  await_get_blob.Run();
+  blob.Bind(std::move(received_blob->blob));
 
   if (!blob) {
     return "";
@@ -182,15 +182,9 @@
 
   template <typename HandleType>
   PermissionStatus GetPermissionStatusSync(bool writable, HandleType* handle) {
-    PermissionStatus result;
-    base::RunLoop loop;
-    handle->GetPermissionStatus(
-        writable, base::BindLambdaForTesting([&](PermissionStatus status) {
-          result = status;
-          loop.Quit();
-        }));
-    loop.Run();
-    return result;
+    base::test::TestFuture<PermissionStatus> future;
+    handle->GetPermissionStatus(writable, future.GetCallback());
+    return future.Get();
   }
 
   mojo::Remote<blink::mojom::FileSystemAccessDirectoryHandle>
@@ -220,30 +214,19 @@
   FileSystemAccessTransferTokenImpl* SerializeAndDeserializeToken(
       mojo::PendingRemote<blink::mojom::FileSystemAccessTransferToken>
           token_remote) {
-    std::vector<uint8_t> serialized;
-    base::RunLoop serialize_loop;
+    base::test::TestFuture<std::vector<uint8_t>> serialize_future;
     manager_->SerializeHandle(
         std::move(token_remote),
-        base::BindLambdaForTesting([&](const std::vector<uint8_t>& bits) {
-          EXPECT_FALSE(bits.empty());
-          serialized = bits;
-          serialize_loop.Quit();
-        }));
-    serialize_loop.Run();
+        serialize_future.GetCallback<const std::vector<uint8_t>&>());
+    std::vector<uint8_t> serialized = serialize_future.Take();
+    EXPECT_FALSE(serialized.empty());
 
     manager_->DeserializeHandle(kTestStorageKey, serialized,
                                 token_remote.InitWithNewPipeAndPassReceiver());
-    base::RunLoop resolve_loop;
-    FileSystemAccessTransferTokenImpl* result;
-    manager_->ResolveTransferToken(
-        std::move(token_remote),
-        base::BindLambdaForTesting(
-            [&](FileSystemAccessTransferTokenImpl* token) {
-              result = token;
-              resolve_loop.Quit();
-            }));
-    resolve_loop.Run();
-    return result;
+    base::test::TestFuture<FileSystemAccessTransferTokenImpl*> resolve_future;
+    manager_->ResolveTransferToken(std::move(token_remote),
+                                   resolve_future.GetCallback());
+    return resolve_future.Get();
   }
 
   void GetEntryFromDataTransferTokenFileTest(
@@ -274,17 +257,10 @@
 
     // Attempt to resolve `token_remote` and store the resulting
     // FileSystemAccessFileHandle in `file_remote`.
-    base::RunLoop await_token_resolution;
-    blink::mojom::FileSystemAccessEntryPtr file_system_access_entry;
-    manager_remote_->GetEntryFromDataTransferToken(
-        std::move(token_remote),
-        base::BindLambdaForTesting([&](blink::mojom::FileSystemAccessEntryPtr
-                                           returned_file_system_access_entry) {
-          file_system_access_entry =
-              std::move(returned_file_system_access_entry);
-          await_token_resolution.Quit();
-        }));
-    await_token_resolution.Run();
+    base::test::TestFuture<blink::mojom::FileSystemAccessEntryPtr> future;
+    manager_remote_->GetEntryFromDataTransferToken(std::move(token_remote),
+                                                   future.GetCallback());
+    auto file_system_access_entry = future.Take();
 
     ASSERT_FALSE(file_system_access_entry.is_null());
     ASSERT_TRUE(file_system_access_entry->entry_handle->is_file());
@@ -324,17 +300,11 @@
 
     // Attempt to resolve `token_remote` and store the resulting
     // FileSystemAccessDirectoryHandle in `dir_remote`.
-    base::RunLoop await_token_resolution;
-    blink::mojom::FileSystemAccessEntryPtr file_system_access_entry;
+    base::test::TestFuture<blink::mojom::FileSystemAccessEntryPtr>
+        get_entry_future;
     manager_remote_->GetEntryFromDataTransferToken(
-        std::move(token_remote),
-        base::BindLambdaForTesting([&](blink::mojom::FileSystemAccessEntryPtr
-                                           returned_file_system_access_entry) {
-          file_system_access_entry =
-              std::move(returned_file_system_access_entry);
-          await_token_resolution.Quit();
-        }));
-    await_token_resolution.Run();
+        std::move(token_remote), get_entry_future.GetCallback());
+    auto file_system_access_entry = get_entry_future.Take();
 
     ASSERT_FALSE(file_system_access_entry.is_null());
     ASSERT_TRUE(file_system_access_entry->entry_handle->is_directory());
@@ -343,18 +313,14 @@
 
     // Use `dir_remote` to verify that dir_path contains a child called
     // expected_child_file_name.
-    base::RunLoop await_get_file;
-    dir_remote->GetFile(
-        expected_child_file_name, /*create=*/false,
-        base::BindLambdaForTesting(
-            [&](blink::mojom::FileSystemAccessErrorPtr result,
-                mojo::PendingRemote<blink::mojom::FileSystemAccessFileHandle>
-                    file_handle) {
-              await_get_file.Quit();
-              ASSERT_EQ(blink::mojom::FileSystemAccessStatus::kOk,
-                        result->status);
-            }));
-    await_get_file.Run();
+    base::test::TestFuture<
+        blink::mojom::FileSystemAccessErrorPtr,
+        mojo::PendingRemote<blink::mojom::FileSystemAccessFileHandle>>
+        get_file_future;
+    dir_remote->GetFile(expected_child_file_name, /*create=*/false,
+                        get_file_future.GetCallback());
+    ASSERT_EQ(get_file_future.Get<0>()->status,
+              blink::mojom::FileSystemAccessStatus::kOk);
   }
 
  protected:
@@ -402,18 +368,16 @@
 };
 
 TEST_F(FileSystemAccessManagerImplTest, GetSandboxedFileSystem_CreateBucket) {
+  base::test::TestFuture<
+      blink::mojom::FileSystemAccessErrorPtr,
+      mojo::PendingRemote<blink::mojom::FileSystemAccessDirectoryHandle>>
+      future;
+  manager_remote_->GetSandboxedFileSystem(future.GetCallback());
+  blink::mojom::FileSystemAccessErrorPtr get_fs_result;
   mojo::PendingRemote<blink::mojom::FileSystemAccessDirectoryHandle>
       directory_remote;
-  base::RunLoop loop;
-  manager_remote_->GetSandboxedFileSystem(base::BindLambdaForTesting(
-      [&](blink::mojom::FileSystemAccessErrorPtr result,
-          mojo::PendingRemote<blink::mojom::FileSystemAccessDirectoryHandle>
-              handle) {
-        EXPECT_EQ(blink::mojom::FileSystemAccessStatus::kOk, result->status);
-        directory_remote = std::move(handle);
-        loop.Quit();
-      }));
-  loop.Run();
+  std::tie(get_fs_result, directory_remote) = future.Take();
+  EXPECT_EQ(get_fs_result->status, blink::mojom::FileSystemAccessStatus::kOk);
   mojo::Remote<blink::mojom::FileSystemAccessDirectoryHandle> root(
       std::move(directory_remote));
   ASSERT_TRUE(root);
@@ -451,8 +415,8 @@
       handle_future;
   manager_->GetSandboxedFileSystem(binding_context, bucket->ToBucketLocator(),
                                    handle_future.GetCallback());
-  EXPECT_EQ(blink::mojom::FileSystemAccessStatus::kOk,
-            handle_future.Get<0>()->status);
+  EXPECT_EQ(handle_future.Get<0>()->status,
+            blink::mojom::FileSystemAccessStatus::kOk);
 
   mojo::Remote<blink::mojom::FileSystemAccessDirectoryHandle> root(
       std::move(std::get<1>(handle_future.Take())));
@@ -464,18 +428,16 @@
 }
 
 TEST_F(FileSystemAccessManagerImplTest, GetSandboxedFileSystem_Permissions) {
+  base::test::TestFuture<
+      blink::mojom::FileSystemAccessErrorPtr,
+      mojo::PendingRemote<blink::mojom::FileSystemAccessDirectoryHandle>>
+      future;
+  manager_remote_->GetSandboxedFileSystem(future.GetCallback());
+  blink::mojom::FileSystemAccessErrorPtr result;
   mojo::PendingRemote<blink::mojom::FileSystemAccessDirectoryHandle>
       directory_remote;
-  base::RunLoop loop;
-  manager_remote_->GetSandboxedFileSystem(base::BindLambdaForTesting(
-      [&](blink::mojom::FileSystemAccessErrorPtr result,
-          mojo::PendingRemote<blink::mojom::FileSystemAccessDirectoryHandle>
-              handle) {
-        EXPECT_EQ(blink::mojom::FileSystemAccessStatus::kOk, result->status);
-        directory_remote = std::move(handle);
-        loop.Quit();
-      }));
-  loop.Run();
+  std::tie(result, directory_remote) = future.Take();
+  EXPECT_EQ(result->status, blink::mojom::FileSystemAccessStatus::kOk);
   mojo::Remote<blink::mojom::FileSystemAccessDirectoryHandle> root(
       std::move(directory_remote));
   ASSERT_TRUE(root);
@@ -895,19 +857,16 @@
       GetHandleForDirectory(kDirectoryPath);
 
   mojo::Remote<blink::mojom::FileSystemAccessFileHandle> file_handle;
-  base::RunLoop get_file_loop;
-  directory_handle->GetFile(
-      kTestName, /*create=*/true,
-      base::BindLambdaForTesting(
-          [&](blink::mojom::FileSystemAccessErrorPtr result,
-              mojo::PendingRemote<blink::mojom::FileSystemAccessFileHandle>
-                  handle) {
-            get_file_loop.Quit();
-            ASSERT_EQ(blink::mojom::FileSystemAccessStatus::kOk,
-                      result->status);
-            file_handle.Bind(std::move(handle));
-          }));
-  get_file_loop.Run();
+  base::test::TestFuture<
+      blink::mojom::FileSystemAccessErrorPtr,
+      mojo::PendingRemote<blink::mojom::FileSystemAccessFileHandle>>
+      future;
+  directory_handle->GetFile(kTestName, /*create=*/true, future.GetCallback());
+  blink::mojom::FileSystemAccessErrorPtr result;
+  mojo::PendingRemote<blink::mojom::FileSystemAccessFileHandle> handle;
+  std::tie(result, handle) = future.Take();
+  ASSERT_EQ(result->status, blink::mojom::FileSystemAccessStatus::kOk);
+  file_handle.Bind(std::move(handle));
   ASSERT_TRUE(file_handle.is_bound());
 
   mojo::PendingRemote<blink::mojom::FileSystemAccessTransferToken> token_remote;
@@ -951,19 +910,17 @@
       GetHandleForDirectory(kDirectoryPath);
 
   mojo::Remote<blink::mojom::FileSystemAccessDirectoryHandle> child_handle;
-  base::RunLoop get_directory_loop;
-  directory_handle->GetDirectory(
-      kTestName, /*create=*/true,
-      base::BindLambdaForTesting(
-          [&](blink::mojom::FileSystemAccessErrorPtr result,
-              mojo::PendingRemote<blink::mojom::FileSystemAccessDirectoryHandle>
-                  handle) {
-            get_directory_loop.Quit();
-            ASSERT_EQ(blink::mojom::FileSystemAccessStatus::kOk,
-                      result->status);
-            child_handle.Bind(std::move(handle));
-          }));
-  get_directory_loop.Run();
+  base::test::TestFuture<
+      blink::mojom::FileSystemAccessErrorPtr,
+      mojo::PendingRemote<blink::mojom::FileSystemAccessDirectoryHandle>>
+      future;
+  directory_handle->GetDirectory(kTestName, /*create=*/true,
+                                 future.GetCallback());
+  blink::mojom::FileSystemAccessErrorPtr result;
+  mojo::PendingRemote<blink::mojom::FileSystemAccessDirectoryHandle> handle;
+  std::tie(result, handle) = future.Take();
+  ASSERT_EQ(result->status, blink::mojom::FileSystemAccessStatus::kOk);
+  child_handle.Bind(std::move(handle));
   ASSERT_TRUE(child_handle.is_bound());
 
   mojo::PendingRemote<blink::mojom::FileSystemAccessTransferToken> token_remote;
diff --git a/content/browser/file_system_access/file_system_chooser_unittest.cc b/content/browser/file_system_access/file_system_chooser_unittest.cc
index ac80c4d..d37b7ba7 100644
--- a/content/browser/file_system_access/file_system_chooser_unittest.cc
+++ b/content/browser/file_system_access/file_system_chooser_unittest.cc
@@ -9,10 +9,10 @@
 #include "base/callback_helpers.h"
 #include "base/containers/contains.h"
 #include "base/files/file_path.h"
-#include "base/run_loop.h"
 #include "base/stl_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/bind.h"
+#include "base/test/test_future.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "content/browser/file_system_access/file_system_chooser_test_helpers.h"
 #include "content/public/test/browser_task_environment.h"
@@ -32,8 +32,9 @@
   std::vector<FileSystemChooser::ResultEntry> SyncShowDialog(
       std::vector<blink::mojom::ChooseFileSystemEntryAcceptsOptionPtr> accepts,
       bool include_accepts_all) {
-    base::RunLoop loop;
-    std::vector<FileSystemChooser::ResultEntry> result;
+    base::test::TestFuture<blink::mojom::FileSystemAccessErrorPtr,
+                           std::vector<FileSystemChooser::ResultEntry>>
+        future;
     FileSystemChooser::CreateAndShow(
         /*web_contents=*/nullptr,
         FileSystemChooser::Options(ui::SelectFileDialog::SELECT_OPEN_FILE,
@@ -41,15 +42,8 @@
                                        std::move(accepts), include_accepts_all),
                                    std::u16string(), base::FilePath(),
                                    base::FilePath()),
-        base::BindLambdaForTesting(
-            [&](blink::mojom::FileSystemAccessErrorPtr,
-                std::vector<FileSystemChooser::ResultEntry> entries) {
-              result = std::move(entries);
-              loop.Quit();
-            }),
-        base::ScopedClosureRunner());
-    loop.Run();
-    return result;
+        future.GetCallback(), base::ScopedClosureRunner());
+    return std::get<1>(future.Take());
   }
 
  private:
diff --git a/content/browser/net/cross_origin_opener_policy_reporter.cc b/content/browser/net/cross_origin_opener_policy_reporter.cc
index d18d5073..7f6b528e 100644
--- a/content/browser/net/cross_origin_opener_policy_reporter.cc
+++ b/content/browser/net/cross_origin_opener_policy_reporter.cc
@@ -52,11 +52,13 @@
       return "same-origin";
     case network::mojom::CrossOriginOpenerPolicyValue::kSameOriginAllowPopups:
       return "same-origin-allow-popups";
+    case network::mojom::CrossOriginOpenerPolicyValue::kRestrictProperties:
+      return "restrict-properties";
     case network::mojom::CrossOriginOpenerPolicyValue::kSameOriginPlusCoep:
       return "same-origin-plus-coep";
     case network::mojom::CrossOriginOpenerPolicyValue::
-        kSameOriginAllowPopupsPlusCoep:
-      return "same-origin-allow-popups-plus-coep";
+        kRestrictPropertiesPlusCoep:
+      return "restrict-properties-plus-coep";
   }
 }
 
diff --git a/content/browser/renderer_host/compositor_impl_android.cc b/content/browser/renderer_host/compositor_impl_android.cc
index 9358fa7..30eec8a 100644
--- a/content/browser/renderer_host/compositor_impl_android.cc
+++ b/content/browser/renderer_host/compositor_impl_android.cc
@@ -915,7 +915,6 @@
   renderer_settings.highp_threshold_min = 2048;
   renderer_settings.requires_alpha_channel = requires_alpha_channel_;
   renderer_settings.initial_screen_size = display_props.GetSizeInPixel();
-  renderer_settings.use_skia_renderer = features::IsUsingSkiaRenderer();
   renderer_settings.color_space = display_color_spaces_.GetOutputColorSpace(
       gfx::ContentColorUsage::kHDR, requires_alpha_channel_);
 
diff --git a/content/browser/renderer_host/cross_origin_opener_policy_status.cc b/content/browser/renderer_host/cross_origin_opener_policy_status.cc
index 76e23f6..5ec4796 100644
--- a/content/browser/renderer_host/cross_origin_opener_policy_status.cc
+++ b/content/browser/renderer_host/cross_origin_opener_policy_status.cc
@@ -391,14 +391,8 @@
   network::CrossOriginOpenerPolicy& coop =
       response_head->parsed_headers->cross_origin_opener_policy;
 
-  // Base COOP class cannot include feature checking due to circular
-  // dependencies. Instead we check it from content and pass it back to the
-  // AugmentCoopWithCoep function.
-  bool is_coop_soap_plus_coep_enabled = base::FeatureList::IsEnabled(
-      network::features::kCoopSameOriginAllowPopupsPlusCoep);
   network::AugmentCoopWithCoep(
-      &coop, response_head->parsed_headers->cross_origin_embedder_policy,
-      is_coop_soap_plus_coep_enabled);
+      &coop, response_head->parsed_headers->cross_origin_embedder_policy);
 
   if (coop == network::CrossOriginOpenerPolicy())
     return;
diff --git a/content/browser/renderer_host/navigation_controller_impl_unittest.cc b/content/browser/renderer_host/navigation_controller_impl_unittest.cc
index 3aba4fa..7e3ad80 100644
--- a/content/browser/renderer_host/navigation_controller_impl_unittest.cc
+++ b/content/browser/renderer_host/navigation_controller_impl_unittest.cc
@@ -4559,6 +4559,8 @@
   std::unique_ptr<NavigationSimulator> navigation_simulator =
       NavigationSimulator::CreateRendererInitiated(kUrl2, fenced_frame_root);
   navigation_simulator->Commit();
+  fenced_frame_root = static_cast<RenderFrameHostImpl*>(
+      navigation_simulator->GetFinalRenderFrameHost());
 
   // Simulate the fenced frame receiving a request from a RenderFrameProxyHost
   // to navigate to `kTestRewriteURL`.
diff --git a/content/browser/renderer_host/navigation_request.cc b/content/browser/renderer_host/navigation_request.cc
index a712ef8..71d8807 100644
--- a/content/browser/renderer_host/navigation_request.cc
+++ b/content/browser/renderer_host/navigation_request.cc
@@ -3116,8 +3116,9 @@
     case network::mojom::CrossOriginOpenerPolicyValue::kSameOrigin:
     case network::mojom::CrossOriginOpenerPolicyValue::kSameOriginPlusCoep:
     case network::mojom::CrossOriginOpenerPolicyValue::kSameOriginAllowPopups:
+    case network::mojom::CrossOriginOpenerPolicyValue::kRestrictProperties:
     case network::mojom::CrossOriginOpenerPolicyValue::
-        kSameOriginAllowPopupsPlusCoep:
+        kRestrictPropertiesPlusCoep:
       should_header_value_trigger_isolation = true;
       break;
     case network::mojom::CrossOriginOpenerPolicyValue::kUnsafeNone:
@@ -7762,7 +7763,7 @@
        network::mojom::CrossOriginOpenerPolicyValue::kSameOriginPlusCoep) &&
       (coop_status().current_coop().value !=
        network::mojom::CrossOriginOpenerPolicyValue::
-           kSameOriginAllowPopupsPlusCoep)) {
+           kRestrictPropertiesPlusCoep)) {
     return WebExposedIsolationInfo::CreateNonIsolated();
   }
 
diff --git a/content/browser/renderer_host/navigator.cc b/content/browser/renderer_host/navigator.cc
index dfa1e9a..ccf890a5 100644
--- a/content/browser/renderer_host/navigator.cc
+++ b/content/browser/renderer_host/navigator.cc
@@ -77,8 +77,10 @@
       return WebFeature::kCrossOriginOpenerPolicySameOrigin;
     case CrossOriginOpenerPolicyValue::kSameOriginAllowPopups:
       return WebFeature::kCrossOriginOpenerPolicySameOriginAllowPopups;
+    case CrossOriginOpenerPolicyValue::kRestrictProperties:
+      return WebFeature::kCrossOriginOpenerPolicyRestrictProperties;
     case CrossOriginOpenerPolicyValue::kSameOriginPlusCoep:
-    case CrossOriginOpenerPolicyValue::kSameOriginAllowPopupsPlusCoep:
+    case CrossOriginOpenerPolicyValue::kRestrictPropertiesPlusCoep:
       return WebFeature::kCoopAndCoepIsolated;
   }
 }
@@ -94,8 +96,10 @@
     case CrossOriginOpenerPolicyValue::kSameOriginAllowPopups:
       return WebFeature::
           kCrossOriginOpenerPolicySameOriginAllowPopupsReportOnly;
+    case CrossOriginOpenerPolicyValue::kRestrictProperties:
+      return WebFeature::kCrossOriginOpenerPolicyRestrictPropertiesReportOnly;
     case CrossOriginOpenerPolicyValue::kSameOriginPlusCoep:
-    case CrossOriginOpenerPolicyValue::kSameOriginAllowPopupsPlusCoep:
+    case CrossOriginOpenerPolicyValue::kRestrictPropertiesPlusCoep:
       return WebFeature::kCoopAndCoepIsolatedReportOnly;
   }
 }
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc
index 0d2ea84..c0c99d3a 100644
--- a/content/browser/renderer_host/render_frame_host_impl.cc
+++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -2864,14 +2864,15 @@
   }
 
   // The initial empty document inherits its policy container from its creator.
-  // The creator is either its parent for iframes or its opener for new windows.
+  // The creator is either its parent for subframes and embedded frames, or its
+  // opener for new windows.
   //
   // Note 1: For normal document created from a navigation, the policy container
   // is computed from the NavigationRequest and assigned in
   // DidCommitNewDocument().
-
-  if (parent_) {
-    SetPolicyContainerHost(parent_->policy_container_host()->Clone());
+  if (GetParentOrOuterDocument()) {
+    SetPolicyContainerHost(
+        GetParentOrOuterDocument()->policy_container_host()->Clone());
   } else if (frame_tree_node_->opener()) {
     SetPolicyContainerHost(frame_tree_node_->opener()
                                ->current_frame_host()
@@ -7057,8 +7058,9 @@
         case network::mojom::CrossOriginOpenerPolicyValue::kUnsafeNone:
         case network::mojom::CrossOriginOpenerPolicyValue::
             kSameOriginAllowPopups:
+        case network::mojom::CrossOriginOpenerPolicyValue::kRestrictProperties:
         case network::mojom::CrossOriginOpenerPolicyValue::
-            kSameOriginAllowPopupsPlusCoep:
+            kRestrictPropertiesPlusCoep:
           break;
 
         // See https://html.spec.whatwg.org/C/#browsing-context-names (step 8)
diff --git a/content/browser/resources/attribution_reporting/BUILD.gn b/content/browser/resources/attribution_reporting/BUILD.gn
index 5a826cd1..3f1698a 100644
--- a/content/browser/resources/attribution_reporting/BUILD.gn
+++ b/content/browser/resources/attribution_reporting/BUILD.gn
@@ -2,11 +2,12 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-import("//tools/polymer/html_to_js.gni")
+import("//tools/polymer/html_to_wrapper.gni")
 import("//tools/typescript/ts_library.gni")
 
-html_to_js("web_components") {
-  js_files = [ "attribution_internals_table.ts" ]
+html_to_wrapper("html_wrapper_files") {
+  in_files = [ "attribution_internals_table.html" ]
+  template = "native"
 }
 
 # Copy (via creating sym links) all the other files into the same folder for
@@ -15,8 +16,9 @@
   deps = [ "//content/browser/attribution_reporting:mojo_bindings_webui_js" ]
   sources = [
     "$root_gen_dir/mojom-webui/content/browser/attribution_reporting/attribution_internals.mojom-webui.js",
-    "./attribution_internals.ts",
-    "./table_model.ts",
+    "attribution_internals.ts",
+    "attribution_internals_table.ts",
+    "table_model.ts",
   ]
   outputs = [ "$target_gen_dir/{{source_file_part}}" ]
 }
@@ -28,6 +30,7 @@
   in_files = [
     "attribution_internals.ts",
     "attribution_internals_table.ts",
+    "attribution_internals_table.html.ts",
     "table_model.ts",
     "attribution_internals.mojom-webui.js",
   ]
@@ -38,6 +41,6 @@
   definitions = [ "//tools/typescript/definitions/chrome_send.d.ts" ]
   extra_deps = [
     ":copy_files",
-    ":web_components",
+    ":html_wrapper_files",
   ]
 }
diff --git a/content/browser/resources/attribution_reporting/attribution_internals_table.ts b/content/browser/resources/attribution_reporting/attribution_internals_table.ts
index 97a86cf..3dca2d7 100644
--- a/content/browser/resources/attribution_reporting/attribution_internals_table.ts
+++ b/content/browser/resources/attribution_reporting/attribution_internals_table.ts
@@ -4,8 +4,8 @@
 
 import {assert} from 'chrome://resources/js/assert_ts.js';
 import {CustomElement} from 'chrome://resources/js/custom_element.js';
-import {getTrustedHTML} from 'chrome://resources/js/static_types.js';
 
+import {getTemplate} from './attribution_internals_table.html.js';
 import {TableModel} from './table_model.js';
 
 /**
@@ -36,7 +36,7 @@
  */
 export class AttributionInternalsTableElement<T> extends CustomElement {
   static override get template() {
-    return getTrustedHTML`{__html_template__}`;
+    return getTemplate();
   }
 
   private model_: TableModel<T>|null = null;
diff --git a/content/browser/site_instance_impl.cc b/content/browser/site_instance_impl.cc
index 9875c52..467325b 100644
--- a/content/browser/site_instance_impl.cc
+++ b/content/browser/site_instance_impl.cc
@@ -218,6 +218,34 @@
 }
 
 // static
+scoped_refptr<SiteInstanceImpl> SiteInstanceImpl::CreateForFencedFrame(
+    SiteInstanceImpl* embedder_site_instance) {
+  DCHECK(embedder_site_instance);
+  BrowserContext* browser_context = embedder_site_instance->GetBrowserContext();
+
+  if (embedder_site_instance->IsGuest()) {
+    return CreateForGuest(browser_context,
+                          embedder_site_instance->GetStoragePartitionConfig());
+  }
+
+  // Give the new fenced frame SiteInstance the same site url as its embedder's
+  // SiteInstance to allow it to reuse its embedder's process. We avoid doing
+  // this in the default SiteInstance case as the url will be invalid; process
+  // reuse will still happen below though, as the embedder's SiteInstance's
+  // process will not be locked to any site.
+  scoped_refptr<SiteInstanceImpl> site_instance =
+      base::WrapRefCounted(new SiteInstanceImpl(new BrowsingInstance(
+          browser_context, embedder_site_instance->GetWebExposedIsolationInfo(),
+          embedder_site_instance->IsGuest())));
+  if (!embedder_site_instance->IsDefaultSiteInstance()) {
+    site_instance->SetSite(embedder_site_instance->GetSiteInfo());
+  }
+  site_instance->ReuseCurrentProcessIfPossible(
+      embedder_site_instance->GetProcess());
+  return site_instance;
+}
+
+// static
 scoped_refptr<SiteInstanceImpl>
 SiteInstanceImpl::CreateReusableInstanceForTesting(
     BrowserContext* browser_context,
diff --git a/content/browser/site_instance_impl.h b/content/browser/site_instance_impl.h
index 04b8857..04d1907b 100644
--- a/content/browser/site_instance_impl.h
+++ b/content/browser/site_instance_impl.h
@@ -48,6 +48,8 @@
   static scoped_refptr<SiteInstanceImpl> CreateForGuest(
       BrowserContext* browser_context,
       const StoragePartitionConfig& partition_config);
+  static scoped_refptr<SiteInstanceImpl> CreateForFencedFrame(
+      SiteInstanceImpl* embedder_site_instance);
 
   // Similar to above, but creates an appropriate SiteInstance in a new
   // BrowsingInstance for a particular `url_info`. This is a more generic
diff --git a/content/browser/site_per_process_sad_frame_browsertest.cc b/content/browser/site_per_process_sad_frame_browsertest.cc
index d57ce19..35679d86 100644
--- a/content/browser/site_per_process_sad_frame_browsertest.cc
+++ b/content/browser/site_per_process_sad_frame_browsertest.cc
@@ -425,16 +425,17 @@
     SitePerProcessBrowserTestWithSadFrameTabReload,
     // TODO(crbug.com/1325478): Re-enable this test
     DISABLED_CrashedFencedframeVisibilityMetricsDuringParentLoad) {
-  // Since Fenced Frames should create a renderer per fenced frame, we
-  // do not need to explicitly change the site.
-  GURL main_url(
-      embedded_test_server()->GetURL("a.com", "/fenced_frames/title1.html"));
-  EXPECT_TRUE(NavigateToURL(
-      shell(), embedded_test_server()->GetURL("a.com", "/title1.html")));
+  GURL primary_url(embedded_test_server()->GetURL("a.com", "/title1.html"));
+  GURL child_url(
+      embedded_test_server()->GetURL("b.com", "/fenced_frames/title1.html"));
+  GURL grandchild_url(
+      embedded_test_server()->GetURL("c.com", "/fenced_frames/title1.html"));
+
+  EXPECT_TRUE(NavigateToURL(shell(), primary_url));
   RenderFrameHostImplWrapper primary_rfh(primary_main_frame_host());
   RenderFrameHostImplWrapper child_rfh(
       fenced_frame_test_helper().CreateFencedFrame(primary_rfh.get(),
-                                                   main_url));
+                                                   child_url));
   // Note that height and width follows the layout function in
   // content/test/data/cross_site_iframe_factory.html.
   EXPECT_TRUE(ExecJs(primary_rfh.get(), R"(
@@ -445,7 +446,8 @@
        ff.height = 1 * (110 + 30) + 50
        )"));
   RenderFrameHostImplWrapper grandchild_rfh(
-      fenced_frame_test_helper().CreateFencedFrame(child_rfh.get(), main_url));
+      fenced_frame_test_helper().CreateFencedFrame(child_rfh.get(),
+                                                   grandchild_url));
   // Note that height and width follows the layout function in
   // content/test/data/cross_site_iframe_factory.html.
   EXPECT_TRUE(ExecJs(child_rfh.get(), R"(
diff --git a/content/dev_ui_content_resources.grd b/content/dev_ui_content_resources.grd
index 0d15034..68146b80 100644
--- a/content/dev_ui_content_resources.grd
+++ b/content/dev_ui_content_resources.grd
@@ -19,6 +19,7 @@
       <include name="IDR_ATTRIBUTION_INTERNALS_JS" file="${root_gen_dir}/content/browser/resources/attribution_reporting/tsc/attribution_internals.js" use_base_dir="false" type="BINDATA" />
       <include name="IDR_ATTRIBUTION_INTERNALS_TABLE_MODEL_JS" file="${root_gen_dir}/content/browser/resources/attribution_reporting/tsc/table_model.js" use_base_dir="false" type="BINDATA" />
       <include name="IDR_ATTRIBUTION_INTERNALS_TABLE_JS" file="${root_gen_dir}/content/browser/resources/attribution_reporting/tsc/attribution_internals_table.js" use_base_dir="false" type="BINDATA" />
+      <include name="IDR_ATTRIBUTION_INTERNALS_TABLE_HTML_JS" file="${root_gen_dir}/content/browser/resources/attribution_reporting/tsc/attribution_internals_table.html.js" use_base_dir="false" type="BINDATA" />
       <include name="IDR_ATTRIBUTION_INTERNALS_CSS" file="browser/resources/attribution_reporting/attribution_internals.css" type="BINDATA" />
       <include name="IDR_ATTRIBUTION_INTERNALS_MOJOM_JS" file="${root_gen_dir}/mojom-webui/content/browser/attribution_reporting/attribution_internals.mojom-webui.js" use_base_dir="false" type="BINDATA" />
       <include name="IDR_GPU_BROWSER_BRIDGE_JS" file="browser/resources/gpu/browser_bridge.js" type="BINDATA" />
diff --git a/content/gpu/OWNERS b/content/gpu/OWNERS
index 559f954..81dfa3f2 100644
--- a/content/gpu/OWNERS
+++ b/content/gpu/OWNERS
@@ -6,3 +6,5 @@
 per-file browser_exposed_gpu_interfaces.*=file://ipc/SECURITY_OWNERS
 per-file gpu_child_thread_receiver_bindings.*=set noparent
 per-file gpu_child_thread_receiver_bindings.*=file://ipc/SECURITY_OWNERS
+per-file gpu_sandbox_hook_linux.*=set noparent
+per-file gpu_sandbox_hook_linux.*=file://sandbox/linux/OWNERS
diff --git a/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java b/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java
index 3d3c819..71ad64cc 100644
--- a/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java
+++ b/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java
@@ -435,8 +435,7 @@
         mCurrentRootId = View.NO_ID;
 
         mSupportedHtmlElementTypes =
-                WebContentsAccessibilityImplJni.get().getSupportedHtmlElementTypes(
-                        mNativeObj, WebContentsAccessibilityImpl.this);
+                WebContentsAccessibilityImplJni.get().getSupportedHtmlElementTypes(mNativeObj);
         mBroadcastReceiver = new BroadcastReceiver() {
             @Override
             public void onReceive(Context context, Intent intent) {
@@ -462,7 +461,7 @@
         // Set whether image descriptions should be enabled for this instance. We do not want
         // the feature to run in certain cases (e.g. WebView or Chrome Custom Tab).
         WebContentsAccessibilityImplJni.get().setAllowImageDescriptions(
-                mNativeObj, WebContentsAccessibilityImpl.this, mAllowImageDescriptions);
+                mNativeObj, mAllowImageDescriptions);
     }
 
     @CalledByNative
@@ -475,8 +474,7 @@
     }
 
     private boolean isEnabled() {
-        return isNativeInitialized() ? WebContentsAccessibilityImplJni.get().isEnabled(
-                       mNativeObj, WebContentsAccessibilityImpl.this)
+        return isNativeInitialized() ? WebContentsAccessibilityImplJni.get().isEnabled(mNativeObj)
                                      : false;
     }
 
@@ -495,14 +493,14 @@
     @VisibleForTesting
     @Override
     public void addSpellingErrorForTesting(int virtualViewId, int startOffset, int endOffset) {
-        WebContentsAccessibilityImplJni.get().addSpellingErrorForTesting(mNativeObj,
-                WebContentsAccessibilityImpl.this, virtualViewId, startOffset, endOffset);
+        WebContentsAccessibilityImplJni.get().addSpellingErrorForTesting(
+                mNativeObj, virtualViewId, startOffset, endOffset);
     }
 
     @VisibleForTesting
     public void setMaxContentChangedEventsToFireForTesting(int maxEvents) {
         WebContentsAccessibilityImplJni.get().setMaxContentChangedEventsToFireForTesting(
-                mNativeObj, WebContentsAccessibilityImpl.this, maxEvents);
+                mNativeObj, maxEvents);
     }
 
     @VisibleForTesting
@@ -726,8 +724,7 @@
         }
         if (!isEnabled()) {
             boolean screenReaderMode = BrowserAccessibilityState.screenReaderMode();
-            WebContentsAccessibilityImplJni.get().enable(
-                    mNativeObj, WebContentsAccessibilityImpl.this, screenReaderMode);
+            WebContentsAccessibilityImplJni.get().enable(mNativeObj, screenReaderMode);
             return null;
         }
 
@@ -774,8 +771,7 @@
         if (!isAccessibilityEnabled()) {
             return null;
         }
-        int rootId = WebContentsAccessibilityImplJni.get().getRootId(
-                mNativeObj, WebContentsAccessibilityImpl.this);
+        int rootId = WebContentsAccessibilityImplJni.get().getRootId(mNativeObj);
 
         if (virtualViewId == View.NO_ID) {
             return createNodeForHost(rootId);
@@ -793,7 +789,7 @@
                     AccessibilityNodeInfoCompat.obtain(mNodeInfoCache.get(virtualViewId));
 
             if (WebContentsAccessibilityImplJni.get().updateCachedAccessibilityNodeInfo(
-                        mNativeObj, WebContentsAccessibilityImpl.this, cachedNode, virtualViewId)) {
+                        mNativeObj, cachedNode, virtualViewId)) {
                 // After successfully re-populating this cached node, update the accessibility
                 // focus since this would not be included in the update call, and set the
                 // available actions accordingly, then return result.
@@ -827,7 +823,7 @@
             }
 
             if (WebContentsAccessibilityImplJni.get().populateAccessibilityNodeInfo(
-                        mNativeObj, WebContentsAccessibilityImpl.this, info, virtualViewId)) {
+                        mNativeObj, info, virtualViewId)) {
                 // After successfully populating this node, add it to our cache then return.
                 mNodeInfoCache.put(virtualViewId, AccessibilityNodeInfoCompat.obtain(info));
                 mNodeWasCreatedFromScratch++;
@@ -871,8 +867,7 @@
         if (!isAccessibilityEnabled()) return;
 
         // Update the AXMode based on screen reader status.
-        WebContentsAccessibilityImplJni.get().setAXMode(mNativeObj,
-                WebContentsAccessibilityImpl.this, newScreenReaderEnabledState,
+        WebContentsAccessibilityImplJni.get().setAXMode(mNativeObj, newScreenReaderEnabledState,
                 /* isAccessibilityEnabled= */ true);
 
         // Update the list of events we dispatch to enabled services.
@@ -976,8 +971,7 @@
         // We don't support any actions on the host view or nodes
         // that are not (any longer) in the tree.
         if (!isAccessibilityEnabled()
-                || !WebContentsAccessibilityImplJni.get().isNodeValid(
-                        mNativeObj, WebContentsAccessibilityImpl.this, virtualViewId)) {
+                || !WebContentsAccessibilityImplJni.get().isNodeValid(mNativeObj, virtualViewId)) {
             return false;
         }
 
@@ -1000,8 +994,8 @@
             sendAccessibilityEvent(
                     virtualViewId, AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED);
             if (mAccessibilityFocusId == virtualViewId) {
-                WebContentsAccessibilityImplJni.get().moveAccessibilityFocus(mNativeObj,
-                        WebContentsAccessibilityImpl.this, mAccessibilityFocusId, View.NO_ID);
+                WebContentsAccessibilityImplJni.get().moveAccessibilityFocus(
+                        mNativeObj, mAccessibilityFocusId, View.NO_ID);
                 mAccessibilityFocusId = View.NO_ID;
                 mAccessibilityFocusRect = null;
             }
@@ -1016,12 +1010,10 @@
             return true;
         } else if (action == ACTION_FOCUS.getId()) {
             if (!mView.hasFocus()) mView.requestFocus();
-            WebContentsAccessibilityImplJni.get().focus(
-                    mNativeObj, WebContentsAccessibilityImpl.this, virtualViewId);
+            WebContentsAccessibilityImplJni.get().focus(mNativeObj, virtualViewId);
             return true;
         } else if (action == ACTION_CLEAR_FOCUS.getId()) {
-            WebContentsAccessibilityImplJni.get().blur(
-                    mNativeObj, WebContentsAccessibilityImpl.this);
+            WebContentsAccessibilityImplJni.get().blur(mNativeObj);
             return true;
         } else if (action == ACTION_NEXT_HTML_ELEMENT.getId()) {
             if (arguments == null) return false;
@@ -1038,8 +1030,7 @@
             return jumpToElementType(virtualViewId, elementType, /*forwards*/ false,
                     /*canWrap*/ virtualViewId == mCurrentRootId);
         } else if (action == ACTION_SET_TEXT.getId()) {
-            if (!WebContentsAccessibilityImplJni.get().isEditableText(
-                        mNativeObj, WebContentsAccessibilityImpl.this, virtualViewId)) {
+            if (!WebContentsAccessibilityImplJni.get().isEditableText(mNativeObj, virtualViewId)) {
                 return false;
             }
             if (arguments == null) return false;
@@ -1048,15 +1039,13 @@
             if (bundleText == null) return false;
             String newText = bundleText.toString();
             WebContentsAccessibilityImplJni.get().setTextFieldValue(
-                    mNativeObj, WebContentsAccessibilityImpl.this, virtualViewId, newText);
+                    mNativeObj, virtualViewId, newText);
             // Match Android framework and set the cursor to the end of the text field.
-            WebContentsAccessibilityImplJni.get().setSelection(mNativeObj,
-                    WebContentsAccessibilityImpl.this, virtualViewId, newText.length(),
-                    newText.length());
+            WebContentsAccessibilityImplJni.get().setSelection(
+                    mNativeObj, virtualViewId, newText.length(), newText.length());
             return true;
         } else if (action == ACTION_SET_SELECTION.getId()) {
-            if (!WebContentsAccessibilityImplJni.get().isEditableText(
-                        mNativeObj, WebContentsAccessibilityImpl.this, virtualViewId)) {
+            if (!WebContentsAccessibilityImplJni.get().isEditableText(mNativeObj, virtualViewId)) {
                 return false;
             }
             int selectionStart = 0;
@@ -1065,8 +1054,8 @@
                 selectionStart = arguments.getInt(ACTION_ARGUMENT_SELECTION_START_INT);
                 selectionEnd = arguments.getInt(ACTION_ARGUMENT_SELECTION_END_INT);
             }
-            WebContentsAccessibilityImplJni.get().setSelection(mNativeObj,
-                    WebContentsAccessibilityImpl.this, virtualViewId, selectionStart, selectionEnd);
+            WebContentsAccessibilityImplJni.get().setSelection(
+                    mNativeObj, virtualViewId, selectionStart, selectionEnd);
             return true;
         } else if (action == ACTION_NEXT_AT_MOVEMENT_GRANULARITY.getId()) {
             if (arguments == null) return false;
@@ -1114,31 +1103,25 @@
             scrollToMakeNodeVisible(virtualViewId);
             return true;
         } else if (action == ACTION_CONTEXT_CLICK.getId() || action == ACTION_LONG_CLICK.getId()) {
-            WebContentsAccessibilityImplJni.get().showContextMenu(
-                    mNativeObj, WebContentsAccessibilityImpl.this, virtualViewId);
+            WebContentsAccessibilityImplJni.get().showContextMenu(mNativeObj, virtualViewId);
             return true;
         } else if (action == ACTION_SCROLL_UP.getId() || action == ACTION_PAGE_UP.getId()) {
-            return WebContentsAccessibilityImplJni.get().scroll(mNativeObj,
-                    WebContentsAccessibilityImpl.this, virtualViewId, ScrollDirection.UP,
-                    action == ACTION_PAGE_UP.getId());
+            return WebContentsAccessibilityImplJni.get().scroll(mNativeObj, virtualViewId,
+                    ScrollDirection.UP, action == ACTION_PAGE_UP.getId());
         } else if (action == ACTION_SCROLL_DOWN.getId() || action == ACTION_PAGE_DOWN.getId()) {
-            return WebContentsAccessibilityImplJni.get().scroll(mNativeObj,
-                    WebContentsAccessibilityImpl.this, virtualViewId, ScrollDirection.DOWN,
-                    action == ACTION_PAGE_DOWN.getId());
+            return WebContentsAccessibilityImplJni.get().scroll(mNativeObj, virtualViewId,
+                    ScrollDirection.DOWN, action == ACTION_PAGE_DOWN.getId());
         } else if (action == ACTION_SCROLL_LEFT.getId() || action == ACTION_PAGE_LEFT.getId()) {
-            return WebContentsAccessibilityImplJni.get().scroll(mNativeObj,
-                    WebContentsAccessibilityImpl.this, virtualViewId, ScrollDirection.LEFT,
-                    action == ACTION_PAGE_LEFT.getId());
+            return WebContentsAccessibilityImplJni.get().scroll(mNativeObj, virtualViewId,
+                    ScrollDirection.LEFT, action == ACTION_PAGE_LEFT.getId());
         } else if (action == ACTION_SCROLL_RIGHT.getId() || action == ACTION_PAGE_RIGHT.getId()) {
-            return WebContentsAccessibilityImplJni.get().scroll(mNativeObj,
-                    WebContentsAccessibilityImpl.this, virtualViewId, ScrollDirection.RIGHT,
-                    action == ACTION_PAGE_RIGHT.getId());
+            return WebContentsAccessibilityImplJni.get().scroll(mNativeObj, virtualViewId,
+                    ScrollDirection.RIGHT, action == ACTION_PAGE_RIGHT.getId());
         } else if (action == ACTION_SET_PROGRESS.getId()) {
             if (arguments == null) return false;
             if (!arguments.containsKey(ACTION_ARGUMENT_PROGRESS_VALUE)) return false;
-            return WebContentsAccessibilityImplJni.get().setRangeValue(mNativeObj,
-                    WebContentsAccessibilityImpl.this, virtualViewId,
-                    arguments.getFloat(ACTION_ARGUMENT_PROGRESS_VALUE));
+            return WebContentsAccessibilityImplJni.get().setRangeValue(
+                    mNativeObj, virtualViewId, arguments.getFloat(ACTION_ARGUMENT_PROGRESS_VALUE));
         } else if (action == ACTION_IME_ENTER.getId()) {
             if (mDelegate.getWebContents() != null) {
                 if (ImeAdapterImpl.fromWebContents(mDelegate.getWebContents()) != null) {
@@ -1160,16 +1143,14 @@
     public void onAutofillPopupDisplayed(View autofillPopupView) {
         if (isAccessibilityEnabled()) {
             mAutofillPopupView = autofillPopupView;
-            WebContentsAccessibilityImplJni.get().onAutofillPopupDisplayed(
-                    mNativeObj, WebContentsAccessibilityImpl.this);
+            WebContentsAccessibilityImplJni.get().onAutofillPopupDisplayed(mNativeObj);
         }
     }
 
     @Override
     public void onAutofillPopupDismissed() {
         if (isAccessibilityEnabled()) {
-            WebContentsAccessibilityImplJni.get().onAutofillPopupDismissed(
-                    mNativeObj, WebContentsAccessibilityImpl.this);
+            WebContentsAccessibilityImplJni.get().onAutofillPopupDismissed(mNativeObj);
             mAutofillPopupView = null;
         }
     }
@@ -1178,8 +1159,7 @@
     public void onAutofillPopupAccessibilityFocusCleared() {
         if (isAccessibilityEnabled()) {
             int id = WebContentsAccessibilityImplJni.get()
-                             .getIdForElementAfterElementHostingAutofillPopup(
-                                     mNativeObj, WebContentsAccessibilityImpl.this);
+                             .getIdForElementAfterElementHostingAutofillPopup(mNativeObj);
             if (id == 0) return;
 
             moveAccessibilityFocusToId(id);
@@ -1190,9 +1170,8 @@
     public void updateAXModeFromNativeAccessibilityState() {
         if (!isNativeInitialized()) return;
         // Update the AXMode based on screen reader status.
-        WebContentsAccessibilityImplJni.get().setAXMode(mNativeObj,
-                WebContentsAccessibilityImpl.this, BrowserAccessibilityState.screenReaderMode(),
-                isAccessibilityEnabled());
+        WebContentsAccessibilityImplJni.get().setAXMode(
+                mNativeObj, BrowserAccessibilityState.screenReaderMode(), isAccessibilityEnabled());
     }
 
     // Returns true if the hover event is to be consumed by accessibility feature.
@@ -1218,7 +1197,7 @@
 
         float x = event.getX() + mDelegate.getAccessibilityCoordinates().getScrollX();
         float y = event.getY() + mDelegate.getAccessibilityCoordinates().getScrollY();
-        return WebContentsAccessibilityImplJni.get().onHoverEventNoRenderer(mNativeObj, this, x, y);
+        return WebContentsAccessibilityImplJni.get().onHoverEventNoRenderer(mNativeObj, x, y);
     }
 
     @Override
@@ -1227,7 +1206,7 @@
 
         // Reset accessibility focus.
         WebContentsAccessibilityImplJni.get().moveAccessibilityFocus(
-                mNativeObj, WebContentsAccessibilityImpl.this, mAccessibilityFocusId, View.NO_ID);
+                mNativeObj, mAccessibilityFocusId, View.NO_ID);
         mAccessibilityFocusId = View.NO_ID;
         mAccessibilityFocusRect = null;
 
@@ -1260,9 +1239,8 @@
 
     private boolean jumpToElementType(
             int virtualViewId, String elementType, boolean forwards, boolean canWrap) {
-        int id = WebContentsAccessibilityImplJni.get().findElementType(mNativeObj,
-                WebContentsAccessibilityImpl.this, virtualViewId, elementType, forwards, canWrap,
-                elementType.isEmpty());
+        int id = WebContentsAccessibilityImplJni.get().findElementType(
+                mNativeObj, virtualViewId, elementType, forwards, canWrap, elementType.isEmpty());
         if (id == 0) return false;
 
         moveAccessibilityFocusToId(id);
@@ -1273,20 +1251,18 @@
     private void setGranularityAndUpdateSelection(int granularity) {
         mSelectionGranularity = granularity;
 
-        if (WebContentsAccessibilityImplJni.get().isEditableText(
-                    mNativeObj, WebContentsAccessibilityImpl.this, mAccessibilityFocusId)
+        if (WebContentsAccessibilityImplJni.get().isEditableText(mNativeObj, mAccessibilityFocusId)
                 && WebContentsAccessibilityImplJni.get().isFocused(
-                        mNativeObj, WebContentsAccessibilityImpl.this, mAccessibilityFocusId)) {
+                        mNativeObj, mAccessibilityFocusId)) {
             // If selection/cursor are "unassigned" (e.g. first user swipe), then assign as needed
             if (mSelectionStart == -1) {
                 mSelectionStart =
                         WebContentsAccessibilityImplJni.get().getEditableTextSelectionStart(
-                                mNativeObj, WebContentsAccessibilityImpl.this,
-                                mAccessibilityFocusId);
+                                mNativeObj, mAccessibilityFocusId);
             }
             if (mCursorIndex == -1) {
                 mCursorIndex = WebContentsAccessibilityImplJni.get().getEditableTextSelectionEnd(
-                        mNativeObj, WebContentsAccessibilityImpl.this, mAccessibilityFocusId);
+                        mNativeObj, mAccessibilityFocusId);
             }
         }
     }
@@ -1300,12 +1276,10 @@
         // default to selection start, which will be the position at the end of the last move
         if (extendSelection && mIsCurrentlyExtendingSelection) {
             return WebContentsAccessibilityImplJni.get().nextAtGranularity(mNativeObj,
-                    WebContentsAccessibilityImpl.this, mSelectionGranularity, extendSelection,
-                    virtualViewId, mCursorIndex);
+                    mSelectionGranularity, extendSelection, virtualViewId, mCursorIndex);
         } else {
             return WebContentsAccessibilityImplJni.get().nextAtGranularity(mNativeObj,
-                    WebContentsAccessibilityImpl.this, mSelectionGranularity, extendSelection,
-                    virtualViewId, mSelectionStart);
+                    mSelectionGranularity, extendSelection, virtualViewId, mSelectionStart);
         }
     }
 
@@ -1315,9 +1289,8 @@
         setGranularityAndUpdateSelection(granularity);
 
         // This calls finishGranularityMovePrevious when it's done.
-        return WebContentsAccessibilityImplJni.get().previousAtGranularity(mNativeObj,
-                WebContentsAccessibilityImpl.this, mSelectionGranularity, extendSelection,
-                virtualViewId, mCursorIndex);
+        return WebContentsAccessibilityImplJni.get().previousAtGranularity(
+                mNativeObj, mSelectionGranularity, extendSelection, virtualViewId, mCursorIndex);
     }
 
     @CalledByNative
@@ -1440,57 +1413,48 @@
         if (mDelegate.scrollToMakeNodeVisible(getAbsolutePositionForNode(virtualViewId))) return;
 
         mPendingScrollToMakeNodeVisible = true;
-        WebContentsAccessibilityImplJni.get().scrollToMakeNodeVisible(
-                mNativeObj, WebContentsAccessibilityImpl.this, virtualViewId);
+        WebContentsAccessibilityImplJni.get().scrollToMakeNodeVisible(mNativeObj, virtualViewId);
     }
 
     private void performClick(int virtualViewId) {
         if (mDelegate.performClick(getAbsolutePositionForNode(virtualViewId))) return;
 
-        WebContentsAccessibilityImplJni.get().click(
-                mNativeObj, WebContentsAccessibilityImpl.this, virtualViewId);
+        WebContentsAccessibilityImplJni.get().click(mNativeObj, virtualViewId);
     }
 
     private void setSelection(AccessibilityEvent selectionEvent) {
-        if (WebContentsAccessibilityImplJni.get().isEditableText(
-                    mNativeObj, WebContentsAccessibilityImpl.this, mSelectionNodeId)
-                && WebContentsAccessibilityImplJni.get().isFocused(
-                        mNativeObj, WebContentsAccessibilityImpl.this, mSelectionNodeId)) {
-            WebContentsAccessibilityImplJni.get().setSelection(mNativeObj,
-                    WebContentsAccessibilityImpl.this, mSelectionNodeId,
+        if (WebContentsAccessibilityImplJni.get().isEditableText(mNativeObj, mSelectionNodeId)
+                && WebContentsAccessibilityImplJni.get().isFocused(mNativeObj, mSelectionNodeId)) {
+            WebContentsAccessibilityImplJni.get().setSelection(mNativeObj, mSelectionNodeId,
                     selectionEvent.getFromIndex(), selectionEvent.getToIndex());
         }
     }
 
     private boolean scrollForward(int virtualViewId) {
-        if (WebContentsAccessibilityImplJni.get().isSlider(
-                    mNativeObj, WebContentsAccessibilityImpl.this, virtualViewId)) {
+        if (WebContentsAccessibilityImplJni.get().isSlider(mNativeObj, virtualViewId)) {
             return WebContentsAccessibilityImplJni.get().adjustSlider(
-                    mNativeObj, WebContentsAccessibilityImpl.this, virtualViewId, true);
+                    mNativeObj, virtualViewId, true);
         } else {
-            return WebContentsAccessibilityImplJni.get().scroll(mNativeObj,
-                    WebContentsAccessibilityImpl.this, virtualViewId, ScrollDirection.FORWARD,
-                    false);
+            return WebContentsAccessibilityImplJni.get().scroll(
+                    mNativeObj, virtualViewId, ScrollDirection.FORWARD, false);
         }
     }
 
     private boolean scrollBackward(int virtualViewId) {
-        if (WebContentsAccessibilityImplJni.get().isSlider(
-                    mNativeObj, WebContentsAccessibilityImpl.this, virtualViewId)) {
+        if (WebContentsAccessibilityImplJni.get().isSlider(mNativeObj, virtualViewId)) {
             return WebContentsAccessibilityImplJni.get().adjustSlider(
-                    mNativeObj, WebContentsAccessibilityImpl.this, virtualViewId, false);
+                    mNativeObj, virtualViewId, false);
         } else {
-            return WebContentsAccessibilityImplJni.get().scroll(mNativeObj,
-                    WebContentsAccessibilityImpl.this, virtualViewId, ScrollDirection.BACKWARD,
-                    false);
+            return WebContentsAccessibilityImplJni.get().scroll(
+                    mNativeObj, virtualViewId, ScrollDirection.BACKWARD, false);
         }
     }
 
     private boolean moveAccessibilityFocusToId(int newAccessibilityFocusId) {
         if (newAccessibilityFocusId == mAccessibilityFocusId) return false;
 
-        WebContentsAccessibilityImplJni.get().moveAccessibilityFocus(mNativeObj,
-                WebContentsAccessibilityImpl.this, mAccessibilityFocusId, newAccessibilityFocusId);
+        WebContentsAccessibilityImplJni.get().moveAccessibilityFocus(
+                mNativeObj, mAccessibilityFocusId, newAccessibilityFocusId);
 
         mAccessibilityFocusId = newAccessibilityFocusId;
         mAccessibilityFocusRect = null;
@@ -1502,11 +1466,11 @@
         mIsCurrentlyExtendingSelection = false;
         mSelectionStart = -1;
         mCursorIndex = WebContentsAccessibilityImplJni.get().getTextLength(
-                mNativeObj, WebContentsAccessibilityImpl.this, mAccessibilityFocusId);
+                mNativeObj, mAccessibilityFocusId);
         mSuppressNextSelectionEvent = false;
 
         if (WebContentsAccessibilityImplJni.get().isAutofillPopupNode(
-                    mNativeObj, WebContentsAccessibilityImpl.this, mAccessibilityFocusId)) {
+                    mNativeObj, mAccessibilityFocusId)) {
             mAutofillPopupView.requestFocus();
         }
 
@@ -1560,8 +1524,7 @@
         // then the virtual hierarchy doesn't exist in the view of the Android framework,
         // so should never send any events.
         if (!isAccessibilityEnabled() || !isFrameInfoInitialized()
-                || !WebContentsAccessibilityImplJni.get().isNodeValid(
-                        mNativeObj, WebContentsAccessibilityImpl.this, virtualViewId)) {
+                || !WebContentsAccessibilityImplJni.get().isNodeValid(mNativeObj, virtualViewId)) {
             return null;
         }
 
@@ -1571,8 +1534,8 @@
         if (eventType == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED) {
             event.setContentChangeTypes(AccessibilityEvent.CONTENT_CHANGE_TYPE_SUBTREE);
         }
-        if (!WebContentsAccessibilityImplJni.get().populateAccessibilityEvent(mNativeObj,
-                    WebContentsAccessibilityImpl.this, event, virtualViewId, eventType)) {
+        if (!WebContentsAccessibilityImplJni.get().populateAccessibilityEvent(
+                    mNativeObj, event, virtualViewId, eventType)) {
             event.recycle();
             return null;
         }
@@ -1690,8 +1653,7 @@
 
     @CalledByNative
     private void handleContentChanged(int id) {
-        int rootId = WebContentsAccessibilityImplJni.get().getRootId(
-                mNativeObj, WebContentsAccessibilityImpl.this);
+        int rootId = WebContentsAccessibilityImplJni.get().getRootId(mNativeObj);
         if (rootId != mCurrentRootId) {
             mCurrentRootId = rootId;
             sendAccessibilityEvent(View.NO_ID, AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED);
@@ -1985,19 +1947,17 @@
 
     protected boolean areInlineTextBoxesLoaded(int virtualViewId) {
         return WebContentsAccessibilityImplJni.get().areInlineTextBoxesLoaded(
-                mNativeObj, WebContentsAccessibilityImpl.this, virtualViewId);
+                mNativeObj, virtualViewId);
     }
 
     protected void loadInlineTextBoxes(int virtualViewId) {
-        WebContentsAccessibilityImplJni.get().loadInlineTextBoxes(
-                mNativeObj, WebContentsAccessibilityImpl.this, virtualViewId);
+        WebContentsAccessibilityImplJni.get().loadInlineTextBoxes(mNativeObj, virtualViewId);
     }
 
     protected int[] getCharacterBoundingBoxes(
             int virtualViewId, int positionInfoStartIndex, int positionInfoLength) {
-        return WebContentsAccessibilityImplJni.get().getCharacterBoundingBoxes(mNativeObj,
-                WebContentsAccessibilityImpl.this, virtualViewId, positionInfoStartIndex,
-                positionInfoLength);
+        return WebContentsAccessibilityImplJni.get().getCharacterBoundingBoxes(
+                mNativeObj, virtualViewId, positionInfoStartIndex, positionInfoLength);
     }
 
     protected CharSequence computeText(String text, boolean annotateAsLink, String language,
@@ -2107,7 +2067,7 @@
 
     private Rect getAbsolutePositionForNode(int virtualViewId) {
         int[] coords = WebContentsAccessibilityImplJni.get().getAbsolutePositionForNode(
-                mNativeObj, WebContentsAccessibilityImpl.this, virtualViewId);
+                mNativeObj, virtualViewId);
         if (coords == null) return null;
 
         return new Rect(coords[0], coords[1], coords[2], coords[3]);
@@ -2290,9 +2250,8 @@
     private void getImageData(int virtualViewId, AccessibilityNodeInfoCompat info) {
         boolean hasSentPreviousRequest = mImageDataRequestedNodes.contains(virtualViewId);
         // If the below call returns true, then image data has been set on the node.
-        if (!WebContentsAccessibilityImplJni.get().getImageData(mNativeObj,
-                    WebContentsAccessibilityImpl.this, info, virtualViewId,
-                    hasSentPreviousRequest)) {
+        if (!WebContentsAccessibilityImplJni.get().getImageData(
+                    mNativeObj, info, virtualViewId, hasSentPreviousRequest)) {
             // If the above call returns false, then the data was missing. The native-side code
             // will have started the asynchronous process to populate the image data if no previous
             // request has been sent. Add this |virtualViewId| to the list of requested nodes.
@@ -2373,96 +2332,66 @@
         long init(WebContentsAccessibilityImpl caller, WebContents webContents);
         long initWithAXTree(WebContentsAccessibilityImpl caller, long axTreePtr);
         void deleteEarly(long nativeWebContentsAccessibilityAndroid);
-        void onAutofillPopupDisplayed(
-                long nativeWebContentsAccessibilityAndroid, WebContentsAccessibilityImpl caller);
-        void onAutofillPopupDismissed(
-                long nativeWebContentsAccessibilityAndroid, WebContentsAccessibilityImpl caller);
+        void onAutofillPopupDisplayed(long nativeWebContentsAccessibilityAndroid);
+        void onAutofillPopupDismissed(long nativeWebContentsAccessibilityAndroid);
         int getIdForElementAfterElementHostingAutofillPopup(
-                long nativeWebContentsAccessibilityAndroid, WebContentsAccessibilityImpl caller);
-        int getRootId(
-                long nativeWebContentsAccessibilityAndroid, WebContentsAccessibilityImpl caller);
-        boolean isNodeValid(long nativeWebContentsAccessibilityAndroid,
-                WebContentsAccessibilityImpl caller, int id);
-        boolean isAutofillPopupNode(long nativeWebContentsAccessibilityAndroid,
-                WebContentsAccessibilityImpl caller, int id);
-        boolean isEditableText(long nativeWebContentsAccessibilityAndroid,
-                WebContentsAccessibilityImpl caller, int id);
-        boolean isFocused(long nativeWebContentsAccessibilityAndroid,
-                WebContentsAccessibilityImpl caller, int id);
-        int getEditableTextSelectionStart(long nativeWebContentsAccessibilityAndroid,
-                WebContentsAccessibilityImpl caller, int id);
-        int getEditableTextSelectionEnd(long nativeWebContentsAccessibilityAndroid,
-                WebContentsAccessibilityImpl caller, int id);
-        int[] getAbsolutePositionForNode(long nativeWebContentsAccessibilityAndroid,
-                WebContentsAccessibilityImpl caller, int id);
+                long nativeWebContentsAccessibilityAndroid);
+        int getRootId(long nativeWebContentsAccessibilityAndroid);
+        boolean isNodeValid(long nativeWebContentsAccessibilityAndroid, int id);
+        boolean isAutofillPopupNode(long nativeWebContentsAccessibilityAndroid, int id);
+        boolean isEditableText(long nativeWebContentsAccessibilityAndroid, int id);
+        boolean isFocused(long nativeWebContentsAccessibilityAndroid, int id);
+        int getEditableTextSelectionStart(long nativeWebContentsAccessibilityAndroid, int id);
+        int getEditableTextSelectionEnd(long nativeWebContentsAccessibilityAndroid, int id);
+        int[] getAbsolutePositionForNode(long nativeWebContentsAccessibilityAndroid, int id);
         boolean updateCachedAccessibilityNodeInfo(long nativeWebContentsAccessibilityAndroid,
-                WebContentsAccessibilityImpl caller, AccessibilityNodeInfoCompat info, int id);
+                AccessibilityNodeInfoCompat info, int id);
         boolean populateAccessibilityNodeInfo(long nativeWebContentsAccessibilityAndroid,
-                WebContentsAccessibilityImpl caller, AccessibilityNodeInfoCompat info, int id);
+                AccessibilityNodeInfoCompat info, int id);
         boolean populateAccessibilityEvent(long nativeWebContentsAccessibilityAndroid,
-                WebContentsAccessibilityImpl caller, AccessibilityEvent event, int id,
-                int eventType);
-        void click(long nativeWebContentsAccessibilityAndroid, WebContentsAccessibilityImpl caller,
-                int id);
-        void focus(long nativeWebContentsAccessibilityAndroid, WebContentsAccessibilityImpl caller,
-                int id);
-        void blur(long nativeWebContentsAccessibilityAndroid, WebContentsAccessibilityImpl caller);
-        void scrollToMakeNodeVisible(long nativeWebContentsAccessibilityAndroid,
-                WebContentsAccessibilityImpl caller, int id);
-        int findElementType(long nativeWebContentsAccessibilityAndroid,
-                WebContentsAccessibilityImpl caller, int startId, String elementType,
-                boolean forwards, boolean canWrapToLastElement, boolean useDefaultPredicate);
-        void setTextFieldValue(long nativeWebContentsAccessibilityAndroid,
-                WebContentsAccessibilityImpl caller, int id, String newValue);
-        void setSelection(long nativeWebContentsAccessibilityAndroid,
-                WebContentsAccessibilityImpl caller, int id, int start, int end);
+                AccessibilityEvent event, int id, int eventType);
+        void click(long nativeWebContentsAccessibilityAndroid, int id);
+        void focus(long nativeWebContentsAccessibilityAndroid, int id);
+        void blur(long nativeWebContentsAccessibilityAndroid);
+        void scrollToMakeNodeVisible(long nativeWebContentsAccessibilityAndroid, int id);
+        int findElementType(long nativeWebContentsAccessibilityAndroid, int startId,
+                String elementType, boolean forwards, boolean canWrapToLastElement,
+                boolean useDefaultPredicate);
+        void setTextFieldValue(long nativeWebContentsAccessibilityAndroid, int id, String newValue);
+        void setSelection(long nativeWebContentsAccessibilityAndroid, int id, int start, int end);
         boolean nextAtGranularity(long nativeWebContentsAccessibilityAndroid,
-                WebContentsAccessibilityImpl caller, int selectionGranularity,
-                boolean extendSelection, int id, int cursorIndex);
+                int selectionGranularity, boolean extendSelection, int id, int cursorIndex);
         boolean previousAtGranularity(long nativeWebContentsAccessibilityAndroid,
-                WebContentsAccessibilityImpl caller, int selectionGranularity,
-                boolean extendSelection, int id, int cursorIndex);
-        boolean adjustSlider(long nativeWebContentsAccessibilityAndroid,
-                WebContentsAccessibilityImpl caller, int id, boolean increment);
-        void moveAccessibilityFocus(long nativeWebContentsAccessibilityAndroid,
-                WebContentsAccessibilityImpl caller, int oldId, int newId);
-        boolean isSlider(long nativeWebContentsAccessibilityAndroid,
-                WebContentsAccessibilityImpl caller, int id);
-        boolean scroll(long nativeWebContentsAccessibilityAndroid,
-                WebContentsAccessibilityImpl caller, int id, int direction, boolean pageScroll);
-        boolean setRangeValue(long nativeWebContentsAccessibilityAndroid,
-                WebContentsAccessibilityImpl caller, int id, float value);
-        String getSupportedHtmlElementTypes(
-                long nativeWebContentsAccessibilityAndroid, WebContentsAccessibilityImpl caller);
-        void showContextMenu(long nativeWebContentsAccessibilityAndroid,
-                WebContentsAccessibilityImpl caller, int id);
-        boolean isEnabled(
-                long nativeWebContentsAccessibilityAndroid, WebContentsAccessibilityImpl caller);
-        void enable(long nativeWebContentsAccessibilityAndroid, WebContentsAccessibilityImpl caller,
-                boolean screenReaderMode);
-        void setAXMode(long nativeWebContentsAccessibilityAndroid,
-                WebContentsAccessibilityImpl caller, boolean screenReaderMode,
+                int selectionGranularity, boolean extendSelection, int id, int cursorIndex);
+        boolean adjustSlider(long nativeWebContentsAccessibilityAndroid, int id, boolean increment);
+        void moveAccessibilityFocus(
+                long nativeWebContentsAccessibilityAndroid, int oldId, int newId);
+        boolean isSlider(long nativeWebContentsAccessibilityAndroid, int id);
+        boolean scroll(long nativeWebContentsAccessibilityAndroid, int id, int direction,
+                boolean pageScroll);
+        boolean setRangeValue(long nativeWebContentsAccessibilityAndroid, int id, float value);
+        String getSupportedHtmlElementTypes(long nativeWebContentsAccessibilityAndroid);
+        void showContextMenu(long nativeWebContentsAccessibilityAndroid, int id);
+        boolean isEnabled(long nativeWebContentsAccessibilityAndroid);
+        void enable(long nativeWebContentsAccessibilityAndroid, boolean screenReaderMode);
+        void setAXMode(long nativeWebContentsAccessibilityAndroid, boolean screenReaderMode,
                 boolean isAccessibilityEnabled);
-        boolean areInlineTextBoxesLoaded(long nativeWebContentsAccessibilityAndroid,
-                WebContentsAccessibilityImpl caller, int id);
-        void loadInlineTextBoxes(long nativeWebContentsAccessibilityAndroid,
-                WebContentsAccessibilityImpl caller, int id);
-        int[] getCharacterBoundingBoxes(long nativeWebContentsAccessibilityAndroid,
-                WebContentsAccessibilityImpl caller, int id, int start, int len);
-        int getTextLength(long nativeWebContentsAccessibilityAndroid,
-                WebContentsAccessibilityImpl caller, int id);
-        void addSpellingErrorForTesting(long nativeWebContentsAccessibilityAndroid,
-                WebContentsAccessibilityImpl caller, int id, int startOffset, int endOffset);
-        void setMaxContentChangedEventsToFireForTesting(long nativeWebContentsAccessibilityAndroid,
-                WebContentsAccessibilityImpl caller, int maxEvents);
+        boolean areInlineTextBoxesLoaded(long nativeWebContentsAccessibilityAndroid, int id);
+        void loadInlineTextBoxes(long nativeWebContentsAccessibilityAndroid, int id);
+        int[] getCharacterBoundingBoxes(
+                long nativeWebContentsAccessibilityAndroid, int id, int start, int len);
+        int getTextLength(long nativeWebContentsAccessibilityAndroid, int id);
+        void addSpellingErrorForTesting(
+                long nativeWebContentsAccessibilityAndroid, int id, int startOffset, int endOffset);
+        void setMaxContentChangedEventsToFireForTesting(
+                long nativeWebContentsAccessibilityAndroid, int maxEvents);
         int getMaxContentChangedEventsToFireForTesting(long nativeWebContentsAccessibilityAndroid);
         void signalEndOfTestForTesting(long nativeWebContentsAccessibilityAndroid);
-        void setAllowImageDescriptions(long nativeWebContentsAccessibilityAndroid,
-                WebContentsAccessibilityImpl caller, boolean allowImageDescriptions);
-        boolean onHoverEventNoRenderer(long nativeWebContentsAccessibilityAndroid,
-                WebContentsAccessibilityImpl caller, float x, float y);
+        void setAllowImageDescriptions(
+                long nativeWebContentsAccessibilityAndroid, boolean allowImageDescriptions);
+        boolean onHoverEventNoRenderer(
+                long nativeWebContentsAccessibilityAndroid, float x, float y);
         boolean getImageData(long nativeWebContentsAccessibilityAndroid,
-                WebContentsAccessibilityImpl caller, AccessibilityNodeInfoCompat info, int id,
-                boolean hasSentPreviousRequest);
+                AccessibilityNodeInfoCompat info, int id, boolean hasSentPreviousRequest);
     }
 }
diff --git a/content/public/test/fenced_frame_test_util.cc b/content/public/test/fenced_frame_test_util.cc
index 6f075ae..46364d0ff 100644
--- a/content/public/test/fenced_frame_test_util.cc
+++ b/content/public/test/fenced_frame_test_util.cc
@@ -91,6 +91,8 @@
             ->child_at(fenced_frame_parent_rfh->child_count() - 1)
             ->current_frame_host());
   }
+  if (url.is_empty())
+    return fenced_frame_rfh;
   return NavigateFrameInFencedFrameTree(fenced_frame_rfh, url,
                                         expected_error_code);
 }
diff --git a/content/public/test/web_ui_browsertest_util.cc b/content/public/test/web_ui_browsertest_util.cc
index b3afa11..5b1d36a 100644
--- a/content/public/test/web_ui_browsertest_util.cc
+++ b/content/public/test/web_ui_browsertest_util.cc
@@ -151,8 +151,9 @@
           break;
         case network::mojom::CrossOriginOpenerPolicyValue::
             kSameOriginAllowPopups:
+        case network::mojom::CrossOriginOpenerPolicyValue::kRestrictProperties:
         case network::mojom::CrossOriginOpenerPolicyValue::
-            kSameOriginAllowPopupsPlusCoep:
+            kRestrictPropertiesPlusCoep:
           NOTIMPLEMENTED();
           break;
       }
diff --git a/content/test/gpu/gpu_tests/gpu_integration_test.py b/content/test/gpu/gpu_tests/gpu_integration_test.py
index bf34e506..e6ac3af 100644
--- a/content/test/gpu/gpu_tests/gpu_integration_test.py
+++ b/content/test/gpu/gpu_tests/gpu_integration_test.py
@@ -740,6 +740,10 @@
             gpu_device_tag = '%s-%s' % (gpu_vendor, gpu_device_id)
           if ii == 0 or gpu_vendor != 'intel':
             gpu_tags.extend([gpu_vendor, gpu_device_tag])
+            # This acts as a way to add expectations for both HD 630 and UHD 630
+            # GPUs without resorting to the more generic "intel" tag.
+            if gpu_device_tag in ('intel-0x5912', 'intel-0x3e92'):
+              gpu_tags.append('intel-hd-630-family')
       # all spaces and underscores in the tag will be replaced by dashes
       tags.extend([re.sub('[ _]', '-', tag) for tag in gpu_tags])
 
diff --git a/content/test/gpu/gpu_tests/pixel_test_pages.py b/content/test/gpu/gpu_tests/pixel_test_pages.py
index 93f1ebb..99ae7a2 100644
--- a/content/test/gpu/gpu_tests/pixel_test_pages.py
+++ b/content/test/gpu/gpu_tests/pixel_test_pages.py
@@ -390,16 +390,15 @@
       if mode == Mode.WEBGPU_SWIFTSHADER:
         base_name += '_WebGPUSwiftShader'
         webgpu_args += [
-            '--enable-features=UseSkiaRenderer,Vulkan',
-            '--use-webgpu-adapter=swiftshader'
+            '--enable-features=Vulkan', '--use-webgpu-adapter=swiftshader'
         ]
         video_frame_query_params = '?sourceType=sw_decoder'
       elif mode == Mode.VULKAN_SWIFTSHADER:
         base_name += '_VulkanSwiftShader'
         webgpu_args += [
-            '--enable-features=UseSkiaRenderer,Vulkan',
-            '--use-angle=swiftshader', '--use-vulkan=swiftshader',
-            '--use-webgpu-adapter=swiftshader', '--disable-vulkan-surface'
+            '--enable-features=Vulkan', '--use-angle=swiftshader',
+            '--use-vulkan=swiftshader', '--use-webgpu-adapter=swiftshader',
+            '--disable-vulkan-surface'
         ]
         video_frame_query_params = '?sourceType=sw_decoder'
 
diff --git a/content/test/gpu/gpu_tests/test_expectations/context_lost_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/context_lost_expectations.txt
index 3fa257f..c0ba2da 100644
--- a/content/test/gpu/gpu_tests/test_expectations/context_lost_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/context_lost_expectations.txt
@@ -25,8 +25,8 @@
 #         apple apple-apple-m1 apple-angle-metal-renderer:-apple-m1
 #         arm
 #         google google-0xffff
-#         intel intel-0xa2e intel-0xd26 intel-0xa011 intel-0x3e92 intel-0x3e9b
-#               intel-0x5912
+#         intel intel-hd-630-family intel-0xa2e intel-0xd26 intel-0xa011
+#               intel-0x3e92 intel-0x3e9b intel-0x5912
 #         nvidia nvidia-0xfe9 nvidia-0x1cb3 nvidia-0x2184
 #         qualcomm ]
 # Decoder
diff --git a/content/test/gpu/gpu_tests/test_expectations/gpu_process_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/gpu_process_expectations.txt
index d875dda4..17f6cf6 100644
--- a/content/test/gpu/gpu_tests/test_expectations/gpu_process_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/gpu_process_expectations.txt
@@ -25,8 +25,8 @@
 #         apple apple-apple-m1 apple-angle-metal-renderer:-apple-m1
 #         arm
 #         google google-0xffff
-#         intel intel-0xa2e intel-0xd26 intel-0xa011 intel-0x3e92 intel-0x3e9b
-#               intel-0x5912
+#         intel intel-hd-630-family intel-0xa2e intel-0xd26 intel-0xa011
+#               intel-0x3e92 intel-0x3e9b intel-0x5912
 #         nvidia nvidia-0xfe9 nvidia-0x1cb3 nvidia-0x2184
 #         qualcomm ]
 # Decoder
diff --git a/content/test/gpu/gpu_tests/test_expectations/hardware_accelerated_feature_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/hardware_accelerated_feature_expectations.txt
index 01e4676..e01fee0 100644
--- a/content/test/gpu/gpu_tests/test_expectations/hardware_accelerated_feature_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/hardware_accelerated_feature_expectations.txt
@@ -25,8 +25,8 @@
 #         apple apple-apple-m1 apple-angle-metal-renderer:-apple-m1
 #         arm
 #         google google-0xffff
-#         intel intel-0xa2e intel-0xd26 intel-0xa011 intel-0x3e92 intel-0x3e9b
-#               intel-0x5912
+#         intel intel-hd-630-family intel-0xa2e intel-0xd26 intel-0xa011
+#               intel-0x3e92 intel-0x3e9b intel-0x5912
 #         nvidia nvidia-0xfe9 nvidia-0x1cb3 nvidia-0x2184
 #         qualcomm ]
 # Decoder
diff --git a/content/test/gpu/gpu_tests/test_expectations/info_collection_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/info_collection_expectations.txt
index bc6593b..6aacf724 100644
--- a/content/test/gpu/gpu_tests/test_expectations/info_collection_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/info_collection_expectations.txt
@@ -25,8 +25,8 @@
 #         apple apple-apple-m1 apple-angle-metal-renderer:-apple-m1
 #         arm
 #         google google-0xffff
-#         intel intel-0xa2e intel-0xd26 intel-0xa011 intel-0x3e92 intel-0x3e9b
-#               intel-0x5912
+#         intel intel-hd-630-family intel-0xa2e intel-0xd26 intel-0xa011
+#               intel-0x3e92 intel-0x3e9b intel-0x5912
 #         nvidia nvidia-0xfe9 nvidia-0x1cb3 nvidia-0x2184
 #         qualcomm ]
 # Decoder
diff --git a/content/test/gpu/gpu_tests/test_expectations/maps_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/maps_expectations.txt
index 01e4676..e01fee0 100644
--- a/content/test/gpu/gpu_tests/test_expectations/maps_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/maps_expectations.txt
@@ -25,8 +25,8 @@
 #         apple apple-apple-m1 apple-angle-metal-renderer:-apple-m1
 #         arm
 #         google google-0xffff
-#         intel intel-0xa2e intel-0xd26 intel-0xa011 intel-0x3e92 intel-0x3e9b
-#               intel-0x5912
+#         intel intel-hd-630-family intel-0xa2e intel-0xd26 intel-0xa011
+#               intel-0x3e92 intel-0x3e9b intel-0x5912
 #         nvidia nvidia-0xfe9 nvidia-0x1cb3 nvidia-0x2184
 #         qualcomm ]
 # Decoder
diff --git a/content/test/gpu/gpu_tests/test_expectations/mediapipe_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/mediapipe_expectations.txt
index e73f76c..9369bb2 100644
--- a/content/test/gpu/gpu_tests/test_expectations/mediapipe_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/mediapipe_expectations.txt
@@ -25,8 +25,8 @@
 #         apple apple-apple-m1 apple-angle-metal-renderer:-apple-m1
 #         arm
 #         google google-0xffff
-#         intel intel-0xa2e intel-0xd26 intel-0xa011 intel-0x3e92 intel-0x3e9b
-#               intel-0x5912
+#         intel intel-hd-630-family intel-0xa2e intel-0xd26 intel-0xa011
+#               intel-0x3e92 intel-0x3e9b intel-0x5912
 #         nvidia nvidia-0xfe9 nvidia-0x1cb3 nvidia-0x2184
 #         qualcomm ]
 # Decoder
diff --git a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
index 7feae46..8ba2b982 100644
--- a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
@@ -25,8 +25,8 @@
 #         apple apple-apple-m1 apple-angle-metal-renderer:-apple-m1
 #         arm
 #         google google-0xffff
-#         intel intel-0xa2e intel-0xd26 intel-0xa011 intel-0x3e92 intel-0x3e9b
-#               intel-0x5912
+#         intel intel-hd-630-family intel-0xa2e intel-0xd26 intel-0xa011
+#               intel-0x3e92 intel-0x3e9b intel-0x5912
 #         nvidia nvidia-0xfe9 nvidia-0x1cb3 nvidia-0x2184
 #         qualcomm ]
 # Decoder
diff --git a/content/test/gpu/gpu_tests/test_expectations/power_measurement_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/power_measurement_expectations.txt
index 988133d4..9c43ade 100644
--- a/content/test/gpu/gpu_tests/test_expectations/power_measurement_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/power_measurement_expectations.txt
@@ -25,8 +25,8 @@
 #         apple apple-apple-m1 apple-angle-metal-renderer:-apple-m1
 #         arm
 #         google google-0xffff
-#         intel intel-0xa2e intel-0xd26 intel-0xa011 intel-0x3e92 intel-0x3e9b
-#               intel-0x5912
+#         intel intel-hd-630-family intel-0xa2e intel-0xd26 intel-0xa011
+#               intel-0x3e92 intel-0x3e9b intel-0x5912
 #         nvidia nvidia-0xfe9 nvidia-0x1cb3 nvidia-0x2184
 #         qualcomm ]
 # Decoder
diff --git a/content/test/gpu/gpu_tests/test_expectations/screenshot_sync_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/screenshot_sync_expectations.txt
index bb8b803..8ba8785 100644
--- a/content/test/gpu/gpu_tests/test_expectations/screenshot_sync_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/screenshot_sync_expectations.txt
@@ -25,8 +25,8 @@
 #         apple apple-apple-m1 apple-angle-metal-renderer:-apple-m1
 #         arm
 #         google google-0xffff
-#         intel intel-0xa2e intel-0xd26 intel-0xa011 intel-0x3e92 intel-0x3e9b
-#               intel-0x5912
+#         intel intel-hd-630-family intel-0xa2e intel-0xd26 intel-0xa011
+#               intel-0x3e92 intel-0x3e9b intel-0x5912
 #         nvidia nvidia-0xfe9 nvidia-0x1cb3 nvidia-0x2184
 #         qualcomm ]
 # Decoder
diff --git a/content/test/gpu/gpu_tests/test_expectations/trace_test_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/trace_test_expectations.txt
index ef07ac3..6ca7f5b3 100644
--- a/content/test/gpu/gpu_tests/test_expectations/trace_test_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/trace_test_expectations.txt
@@ -25,8 +25,8 @@
 #         apple apple-apple-m1 apple-angle-metal-renderer:-apple-m1
 #         arm
 #         google google-0xffff
-#         intel intel-0xa2e intel-0xd26 intel-0xa011 intel-0x3e92 intel-0x3e9b
-#               intel-0x5912
+#         intel intel-hd-630-family intel-0xa2e intel-0xd26 intel-0xa011
+#               intel-0x3e92 intel-0x3e9b intel-0x5912
 #         nvidia nvidia-0xfe9 nvidia-0x1cb3 nvidia-0x2184
 #         qualcomm ]
 # Decoder
diff --git a/content/test/gpu/gpu_tests/test_expectations/webcodecs_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webcodecs_expectations.txt
index 226fb81d..9939b9ad 100644
--- a/content/test/gpu/gpu_tests/test_expectations/webcodecs_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/webcodecs_expectations.txt
@@ -25,8 +25,8 @@
 #         apple apple-apple-m1 apple-angle-metal-renderer:-apple-m1
 #         arm
 #         google google-0xffff
-#         intel intel-0xa2e intel-0xd26 intel-0xa011 intel-0x3e92 intel-0x3e9b
-#               intel-0x5912
+#         intel intel-hd-630-family intel-0xa2e intel-0xd26 intel-0xa011
+#               intel-0x3e92 intel-0x3e9b intel-0x5912
 #         nvidia nvidia-0xfe9 nvidia-0x1cb3 nvidia-0x2184
 #         qualcomm ]
 # Decoder
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
index dc76a97..510c7df 100644
--- a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
@@ -25,8 +25,8 @@
 #         apple apple-apple-m1 apple-angle-metal-renderer:-apple-m1
 #         arm
 #         google google-0xffff
-#         intel intel-0xa2e intel-0xd26 intel-0xa011 intel-0x3e92 intel-0x3e9b
-#               intel-0x5912
+#         intel intel-hd-630-family intel-0xa2e intel-0xd26 intel-0xa011
+#               intel-0x3e92 intel-0x3e9b intel-0x5912
 #         nvidia nvidia-0xfe9 nvidia-0x1cb3 nvidia-0x2184
 #         qualcomm ]
 # Decoder
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
index 48e659d..509e516 100644
--- a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
@@ -25,8 +25,8 @@
 #         apple apple-apple-m1 apple-angle-metal-renderer:-apple-m1
 #         arm
 #         google google-0xffff
-#         intel intel-0xa2e intel-0xd26 intel-0xa011 intel-0x3e92 intel-0x3e9b
-#               intel-0x5912
+#         intel intel-hd-630-family intel-0xa2e intel-0xd26 intel-0xa011
+#               intel-0x3e92 intel-0x3e9b intel-0x5912
 #         nvidia nvidia-0xfe9 nvidia-0x1cb3 nvidia-0x2184
 #         qualcomm ]
 # Decoder
diff --git a/content/test/gpu/validate_tag_consistency.py b/content/test/gpu/validate_tag_consistency.py
index eeb693a..27f9765 100755
--- a/content/test/gpu/validate_tag_consistency.py
+++ b/content/test/gpu/validate_tag_consistency.py
@@ -38,8 +38,8 @@
 #         apple apple-apple-m1 apple-angle-metal-renderer:-apple-m1
 #         arm
 #         google google-0xffff
-#         intel intel-0xa2e intel-0xd26 intel-0xa011 intel-0x3e92 intel-0x3e9b
-#               intel-0x5912
+#         intel intel-hd-630-family intel-0xa2e intel-0xd26 intel-0xa011
+#               intel-0x3e92 intel-0x3e9b intel-0x5912
 #         nvidia nvidia-0xfe9 nvidia-0x1cb3 nvidia-0x2184
 #         qualcomm ]
 # Decoder
diff --git a/device/udev_linux/fake_udev_loader.cc b/device/udev_linux/fake_udev_loader.cc
index ed003351..6feff2c6 100644
--- a/device/udev_linux/fake_udev_loader.cc
+++ b/device/udev_linux/fake_udev_loader.cc
@@ -4,6 +4,8 @@
 
 #include "device/udev_linux/fake_udev_loader.h"
 
+#include <utility>
+
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/files/scoped_file.h"
@@ -13,6 +15,15 @@
   // empty
 };
 
+struct udev_list_entry {
+  explicit udev_list_entry(std::string name) : name(std::move(name)) {}
+  udev_list_entry(const udev_list_entry& other) = delete;
+  udev_list_entry& operator=(const udev_list_entry& other) = delete;
+
+  const std::string name;
+  udev_list_entry* next = nullptr;
+};
+
 struct udev_device {
   udev_device(std::string name,
               std::string syspath,
@@ -20,14 +31,21 @@
               absl::optional<std::string> devnode,
               absl::optional<std::string> devtype,
               std::map<std::string, std::string> sysattrs,
-              std::map<std::string, std::string> properties)
+              std::map<std::string, std::string> prop_map)
       : name(std::move(name)),
         syspath(std::move(syspath)),
         subsystem(std::move(subsystem)),
         devnode(std::move(devnode)),
         devtype(std::move(devtype)),
-        sysattrs(std::move(sysattrs)),
-        properties(std::move(properties)) {}
+        sysattrs(std::move(sysattrs)) {
+    properties = std::move(prop_map);
+    for (auto const& pair : properties) {
+      auto prop = std::make_unique<udev_list_entry>(pair.first);
+      if (!udev_prop_list.empty())
+        udev_prop_list.back()->next = prop.get();
+      udev_prop_list.push_back(std::move(prop));
+    }
+  }
   udev_device(const udev_device& other) = delete;
   udev_device& operator=(const udev_device& other) = delete;
 
@@ -38,15 +56,7 @@
   const absl::optional<std::string> devtype;
   std::map<std::string, std::string> sysattrs;
   std::map<std::string, std::string> properties;
-};
-
-struct udev_list_entry {
-  explicit udev_list_entry(std::string name) : name(std::move(name)) {}
-  udev_list_entry(const udev_list_entry& other) = delete;
-  udev_list_entry& operator=(const udev_list_entry& other) = delete;
-
-  const std::string name;
-  udev_list_entry* next = nullptr;
+  std::vector<std::unique_ptr<udev_list_entry>> udev_prop_list;
 };
 
 struct udev_enumerate {
@@ -160,6 +170,12 @@
   return nullptr;
 }
 
+udev_list_entry* FakeUdevLoader::udev_device_get_properties_list_entry(
+    struct udev_device* device) {
+  DCHECK(device);
+  return device->udev_prop_list.front().get();
+}
+
 const char* FakeUdevLoader::udev_device_get_property_value(udev_device* device,
                                                            const char* key) {
   DCHECK(device && key);
diff --git a/device/udev_linux/fake_udev_loader.h b/device/udev_linux/fake_udev_loader.h
index 641ebbd1..4c1e002c 100644
--- a/device/udev_linux/fake_udev_loader.h
+++ b/device/udev_linux/fake_udev_loader.h
@@ -42,6 +42,8 @@
       udev_device* device,
       const char* subsystem,
       const char* devtype) override;
+  udev_list_entry* udev_device_get_properties_list_entry(
+      struct udev_device* device) override;
   const char* udev_device_get_property_value(udev_device* device,
                                              const char* key) override;
   const char* udev_device_get_subsystem(udev_device* device) override;
diff --git a/device/udev_linux/udev.cc b/device/udev_linux/udev.cc
index b278292..57fd73b0 100644
--- a/device/udev_linux/udev.cc
+++ b/device/udev_linux/udev.cc
@@ -43,6 +43,11 @@
       udev_device, subsystem, devtype);
 }
 
+udev_list_entry* udev_device_get_properties_list_entry(
+    struct udev_device* udev_device) {
+  return UdevLoader::Get()->udev_device_get_properties_list_entry(udev_device);
+}
+
 const char* udev_device_get_property_value(udev_device* udev_device,
                                            const char* key) {
   return UdevLoader::Get()->udev_device_get_property_value(udev_device, key);
diff --git a/device/udev_linux/udev.h b/device/udev_linux/udev.h
index 65ff7b2..68a77cb 100644
--- a/device/udev_linux/udev.h
+++ b/device/udev_linux/udev.h
@@ -37,6 +37,8 @@
     udev_device* udev_device,
     const char* subsystem,
     const char* devtype);
+udev_list_entry* udev_device_get_properties_list_entry(
+    struct udev_device* udev_device);
 const char* udev_device_get_property_value(udev_device* udev_device,
                                            const char* key);
 const char* udev_device_get_subsystem(udev_device* udev_device);
diff --git a/device/udev_linux/udev0_loader.cc b/device/udev_linux/udev0_loader.cc
index 0c8ac949..530a80cb 100644
--- a/device/udev_linux/udev0_loader.cc
+++ b/device/udev_linux/udev0_loader.cc
@@ -49,6 +49,11 @@
       udev_device, subsystem, devtype);
 }
 
+udev_list_entry* Udev0Loader::udev_device_get_properties_list_entry(
+    struct udev_device* udev_device) {
+  return lib_loader_->udev_device_get_properties_list_entry(udev_device);
+}
+
 const char* Udev0Loader::udev_device_get_property_value(
     udev_device* udev_device,
     const char* key) {
diff --git a/device/udev_linux/udev0_loader.h b/device/udev_linux/udev0_loader.h
index f8f8f01..344c7aa 100644
--- a/device/udev_linux/udev0_loader.h
+++ b/device/udev_linux/udev0_loader.h
@@ -32,6 +32,8 @@
       udev_device* udev_device,
       const char* subsystem,
       const char* devtype) override;
+  udev_list_entry* udev_device_get_properties_list_entry(
+      struct udev_device* udev_device) override;
   const char* udev_device_get_property_value(udev_device* udev_device,
                                              const char* key) override;
   const char* udev_device_get_subsystem(udev_device* udev_device) override;
diff --git a/device/udev_linux/udev1_loader.cc b/device/udev_linux/udev1_loader.cc
index 48e4438..b9f66d3 100644
--- a/device/udev_linux/udev1_loader.cc
+++ b/device/udev_linux/udev1_loader.cc
@@ -45,6 +45,11 @@
       udev_device, subsystem, devtype);
 }
 
+udev_list_entry* Udev1Loader::udev_device_get_properties_list_entry(
+    struct udev_device* udev_device) {
+  return lib_loader_->udev_device_get_properties_list_entry(udev_device);
+}
+
 const char* Udev1Loader::udev_device_get_property_value(
     udev_device* udev_device,
     const char* key) {
diff --git a/device/udev_linux/udev1_loader.h b/device/udev_linux/udev1_loader.h
index 6eab388..49fb05f5 100644
--- a/device/udev_linux/udev1_loader.h
+++ b/device/udev_linux/udev1_loader.h
@@ -32,6 +32,8 @@
       udev_device* udev_device,
       const char* subsystem,
       const char* devtype) override;
+  udev_list_entry* udev_device_get_properties_list_entry(
+      struct udev_device* udev_device) override;
   const char* udev_device_get_property_value(udev_device* udev_device,
                                              const char* key) override;
   const char* udev_device_get_subsystem(udev_device* udev_device) override;
diff --git a/device/udev_linux/udev_loader.h b/device/udev_linux/udev_loader.h
index 684e3e2..a61fcb6 100644
--- a/device/udev_linux/udev_loader.h
+++ b/device/udev_linux/udev_loader.h
@@ -51,6 +51,8 @@
       udev_device* udev_device,
       const char* subsystem,
       const char* devtype) = 0;
+  virtual udev_list_entry* udev_device_get_properties_list_entry(
+      struct udev_device* udev_device) = 0;
   virtual const char* udev_device_get_property_value(udev_device* udev_device,
                                                      const char* key) = 0;
   virtual const char* udev_device_get_subsystem(udev_device* udev_device) = 0;
diff --git a/device/udev_linux/udev_unittest.cc b/device/udev_linux/udev_unittest.cc
index ae1fc3a..c07ae2d 100644
--- a/device/udev_linux/udev_unittest.cc
+++ b/device/udev_linux/udev_unittest.cc
@@ -3,11 +3,13 @@
 // found in the LICENSE file.
 
 #include "device/udev_linux/udev.h"
+#include <vector>
 
 #include "base/files/file_path.h"
 #include "device/udev_linux/fake_udev_loader.h"
 #include "device/udev_linux/udev_loader.h"
 
+#include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace device {
@@ -54,6 +56,46 @@
   EXPECT_TRUE(attr_value.empty());
 }
 
+TEST(UdevTest, GetFullSysPropertiesList) {
+  testing::FakeUdevLoader fake_udev;
+  std::map<std::string, std::string> props = {
+      {"TAGS", ":powerd:"},
+      {"DEVNAME", "/dev/dri/card0"},
+      {"DEVTYPE", "drm_minor"},
+      {"HOTPLUG", "1"},
+      {"USEC_INITIALIZED", "1234567"},
+      {"MINOR", "0"},
+      {"ID_PATH_TAG", "pci-0000_00_02_0"},
+      {"PROPERTY", "456"},
+      {"DEVPATH", "/devices/pci0000:00/0000:00:02.0/drm/card0"},
+      {"ID_PATH", "pci-0000:00:02.0"},
+      {"SUBSYSTEM", "drm"},
+      {"CONNECTOR", "123"},
+      {"MAJOR", "226"},
+      {"SEQNUM", "1234"},
+      {"ACTION", "change"}};
+  udev_device* device = fake_udev.AddFakeDevice(
+      /*name=*/"/dev/dri/card0",
+      /*syspath=*/"/devices/pci0000:00/0000:00:02.0/drm/card0",
+      /*subsystem=*/"drm", /*devnode=*/absl::nullopt, /*devtype=*/absl::nullopt,
+      /*sysattrs=*/{}, std::move(props));
+
+  udev_list_entry* prop_list = udev_device_get_properties_list_entry(device);
+  udev_list_entry* entry;
+  std::vector<std::string> output_prop_list;
+  udev_list_entry_foreach(entry, prop_list) {
+    output_prop_list.emplace_back(udev_list_entry_get_name(entry));
+  }
+
+  // Expect the properties to be sorted when enumerated.
+  EXPECT_THAT(
+      output_prop_list,
+      testing::UnorderedElementsAre(
+          "ACTION", "CONNECTOR", "DEVNAME", "DEVPATH", "DEVTYPE", "HOTPLUG",
+          "ID_PATH", "ID_PATH_TAG", "MAJOR", "MINOR", "PROPERTY", "SEQNUM",
+          "SUBSYSTEM", "TAGS", "USEC_INITIALIZED"));
+}
+
 TEST(UdevTest, GetSysAttrNoAttrs) {
   testing::FakeUdevLoader fake_udev;
   udev_device* device = fake_udev.AddFakeDevice(
diff --git a/docs/fuchsia/gtests.md b/docs/fuchsia/gtests.md
index 2253d642..b0da070 100644
--- a/docs/fuchsia/gtests.md
+++ b/docs/fuchsia/gtests.md
@@ -8,10 +8,8 @@
 
 1. deploy_<test_target_name>, for deploying the Fuchsia package onto a device
 2. run_<test_target_name>, for running the Fuchsia package on the device
-3. <test_target_name>, for running the Fuchsia package on the device
 
-The first two executables are found in ${OUTPUT_DIR}/bin whereas the last one
-will be found directly in the output directory.
+These executables are found in `${OUTPUT_DIR}/bin`.
 
 The aforementioned devices can be either emulators started by the scripts
 themselves, an existing emulator instance, or a physical device. To build a
@@ -25,7 +23,7 @@
 The test script brings up an emulator, runs the tests on it, and
 shuts the emulator down when finished.
 ```bash
-$ out/fuchsia/base_unittests
+$ out/fuchsia/bin/run_base_unittests
 ```
 
 The flag `--custom-image` can be used to specify the Fuchsia boot image used
@@ -33,12 +31,35 @@
 `--custom-image=workstation.qemu-x64-release` would run the test on a
 workstation image.
 
+## Run on a persistent emulated device from the Chromium three
+
+You can start a persistent emulator from the Chromium tree by running this command:
+
+```bash
+$ ./build/fuchsia/start_emulator.py
+```
+
+Part of the output should be:
+
+```
+2022-05-31 22:55:13,011:INFO:root:Emulator successfully started.\
+ You can now run Chrome Fuchsia tests with\
+ "-d --node-name fuchsia-5254-0063-5e7a" to target this emulator.
+```
+
+Once the emulator is running, you can run tests on this emulator instance by
+adding the command line arguments indicated above:
+
+```bash
+$ out/fuchsia/bin/run_base_unittests -d --node-name fuchsia-5254-0063-5e7a
+```
+
 ## Run on an physical device
 
 Note the `-d` flag, which is an alias for `--device`.
 
 ```bash
-$ out/fuchsia/base_unittests -d
+$ out/fuchsia/bin/run_base_unittests -d
 ```
 
 ## Run on a device paved with Fuchsia built from source
@@ -47,7 +68,7 @@
 the architecture of the Fuchsia output directory (x64==x64, arm64==arm64, etc.).
 
 ```bash
-$ out/fuchsia/base_unittests -d
+$ out/fuchsia/bin/run_base_unittests -d
 --fuchsia-out-dir=/path/to/fuchsia/outdir
 ```
 
@@ -63,7 +84,7 @@
 making your command lines much shorter:
 
 ```bash
-$ out/fuchsia/base_unittests -d
+$ out/fuchsia/bin/run_base_unittests -d
 ```
 
 ## Install on a device running Fuchsia built from source
@@ -86,8 +107,8 @@
 up the connection between the host and the remote device.
 
 ```bash
-$ out/fuchsia/base_unittests -d
---host=localhost --ssh-config=/path/to/ssh/config
+$ out/fuchsia/bin/run_base_unittests -d \
+  --host=localhost --ssh-config=/path/to/ssh/config
 ```
 
 ## Troubleshooting a test
diff --git a/docs/updater/functional_spec.md b/docs/updater/functional_spec.md
index 2f03680..bb0f2da 100644
--- a/docs/updater/functional_spec.md
+++ b/docs/updater/functional_spec.md
@@ -91,9 +91,6 @@
         *   If --tag is specified, --install is assumed.
     *   --handoff=...
         *   As --tag.
-    *   --install-from-out-dir
-        *   If specified, the program searches for an updater.runtime_deps file
-        *   and copies all such files to the install directory.
     *  --offlinedir=...
         *   Performs offline install, which means no update check or file
             download is performed against the server during installation.
diff --git a/extensions/browser/api/networking_private/networking_private_service_client.cc b/extensions/browser/api/networking_private/networking_private_service_client.cc
index 1bbffc0..1090df7 100644
--- a/extensions/browser/api/networking_private/networking_private_service_client.cc
+++ b/extensions/browser/api/networking_private/networking_private_service_client.cc
@@ -121,10 +121,10 @@
 void NetworkingPrivateServiceClient::GetProperties(
     const std::string& guid,
     PropertiesCallback callback) {
-  std::unique_ptr<base::DictionaryValue> properties(new base::DictionaryValue);
+  auto properties = std::make_unique<base::Value::Dict>();
   std::string* error = new std::string;
 
-  base::DictionaryValue* properties_ptr = properties.get();
+  base::Value::Dict* properties_ptr = properties.get();
   task_runner_->PostTaskAndReply(
       FROM_HERE,
       base::BindOnce(&WiFiService::GetProperties,
@@ -138,10 +138,10 @@
 void NetworkingPrivateServiceClient::GetManagedProperties(
     const std::string& guid,
     PropertiesCallback callback) {
-  std::unique_ptr<base::DictionaryValue> properties(new base::DictionaryValue);
+  auto properties = std::make_unique<base::Value::Dict>();
   std::string* error = new std::string;
 
-  base::DictionaryValue* properties_ptr = properties.get();
+  base::Value::Dict* properties_ptr = properties.get();
   task_runner_->PostTaskAndReply(
       FROM_HERE,
       base::BindOnce(&WiFiService::GetManagedProperties,
@@ -160,10 +160,10 @@
   service_callbacks->failure_callback = std::move(failure_callback);
   service_callbacks->get_properties_callback = std::move(success_callback);
 
-  std::unique_ptr<base::DictionaryValue> properties(new base::DictionaryValue);
+  auto properties = std::make_unique<base::Value::Dict>();
   std::string* error = new std::string;
 
-  base::DictionaryValue* properties_ptr = properties.get();
+  base::Value::Dict* properties_ptr = properties.get();
   task_runner_->PostTaskAndReply(
       FROM_HERE,
       base::BindOnce(&WiFiService::GetState,
@@ -192,9 +192,7 @@
       FROM_HERE,
       base::BindOnce(&WiFiService::SetProperties,
                      base::Unretained(wifi_service_.get()), guid,
-                     base::DictionaryValue::From(
-                         base::Value::ToUniquePtrValue(std::move(properties))),
-                     error),
+                     std::move(properties.GetDict()), error),
       base::BindOnce(&NetworkingPrivateServiceClient::AfterSetProperties,
                      weak_factory_.GetWeakPtr(), service_callbacks->id,
                      base::Owned(error)));
@@ -216,9 +214,7 @@
       FROM_HERE,
       base::BindOnce(&WiFiService::CreateNetwork,
                      base::Unretained(wifi_service_.get()), shared,
-                     base::DictionaryValue::From(
-                         base::Value::ToUniquePtrValue(std::move(properties))),
-                     network_guid, error),
+                     std::move(properties.GetDict()), network_guid, error),
       base::BindOnce(&NetworkingPrivateServiceClient::AfterCreateNetwork,
                      weak_factory_.GetWeakPtr(), service_callbacks->id,
                      base::Owned(network_guid), base::Owned(error)));
@@ -245,16 +241,16 @@
   service_callbacks->get_visible_networks_callback =
       std::move(success_callback);
 
-  std::unique_ptr<base::ListValue> networks(new base::ListValue);
+  auto networks = std::make_unique<base::Value::List>();
 
   // TODO(stevenjb/mef): Apply filters (configured, visible, limit).
 
-  base::ListValue* networks_ptr = networks.get();
+  base::Value::List* networks_ptr = networks.get();
   task_runner_->PostTaskAndReply(
       FROM_HERE,
       base::BindOnce(&WiFiService::GetVisibleNetworks,
                      base::Unretained(wifi_service_.get()), network_type,
-                     networks_ptr, false),
+                     /*include_details=*/false, networks_ptr),
       base::BindOnce(&NetworkingPrivateServiceClient::AfterGetVisibleNetworks,
                      weak_factory_.GetWeakPtr(), service_callbacks->id,
                      std::move(networks)));
@@ -386,19 +382,19 @@
 void NetworkingPrivateServiceClient::AfterGetProperties(
     PropertiesCallback callback,
     const std::string& network_guid,
-    std::unique_ptr<base::DictionaryValue> properties,
+    std::unique_ptr<base::Value::Dict> properties,
     const std::string* error) {
   if (!error->empty()) {
     std::move(callback).Run(absl::nullopt, *error);
     return;
   }
-  std::move(callback).Run(std::move(*properties), absl::nullopt);
+  std::move(callback).Run(base::Value(std::move(*properties)), absl::nullopt);
 }
 
 void NetworkingPrivateServiceClient::AfterGetState(
     ServiceCallbacksID callback_id,
     const std::string& network_guid,
-    std::unique_ptr<base::DictionaryValue> properties,
+    std::unique_ptr<base::Value::Dict> properties,
     const std::string* error) {
   ServiceCallbacks* service_callbacks = callbacks_map_.Lookup(callback_id);
   DCHECK(service_callbacks);
@@ -408,19 +404,21 @@
   } else {
     DCHECK(!service_callbacks->get_properties_callback.is_null());
     std::move(service_callbacks->get_properties_callback)
-        .Run(std::move(*properties));
+        .Run(base::Value(std::move(*properties)));
   }
   RemoveServiceCallbacks(callback_id);
 }
 
 void NetworkingPrivateServiceClient::AfterGetVisibleNetworks(
     ServiceCallbacksID callback_id,
-    std::unique_ptr<base::ListValue> networks) {
+    std::unique_ptr<base::Value::List> networks) {
   ServiceCallbacks* service_callbacks = callbacks_map_.Lookup(callback_id);
   DCHECK(service_callbacks);
   DCHECK(!service_callbacks->get_visible_networks_callback.is_null());
+  // TODO(https://crbug.com/1187001): Make callbacks take base::Value::List.
   std::move(service_callbacks->get_visible_networks_callback)
-      .Run(std::move(networks));
+      .Run(base::ListValue::From(
+          std::make_unique<base::Value>(std::move(*networks))));
   RemoveServiceCallbacks(callback_id);
 }
 
diff --git a/extensions/browser/api/networking_private/networking_private_service_client.h b/extensions/browser/api/networking_private/networking_private_service_client.h
index cf65197..5a030d5 100644
--- a/extensions/browser/api/networking_private/networking_private_service_client.h
+++ b/extensions/browser/api/networking_private/networking_private_service_client.h
@@ -140,11 +140,11 @@
   // Callback wrappers.
   void AfterGetProperties(PropertiesCallback callback,
                           const std::string& network_guid,
-                          std::unique_ptr<base::DictionaryValue> properties,
+                          std::unique_ptr<base::Value::Dict> properties,
                           const std::string* error);
   void AfterGetState(ServiceCallbacksID callback_id,
                      const std::string& network_guid,
-                     std::unique_ptr<base::DictionaryValue> properties,
+                     std::unique_ptr<base::Value::Dict> properties,
                      const std::string* error);
   void AfterSetProperties(ServiceCallbacksID callback_id,
                           const std::string* error);
@@ -152,7 +152,7 @@
                           const std::string* network_guid,
                           const std::string* error);
   void AfterGetVisibleNetworks(ServiceCallbacksID callback_id,
-                               std::unique_ptr<base::ListValue> networks);
+                               std::unique_ptr<base::Value::List> networks);
   void AfterStartConnect(ServiceCallbacksID callback_id,
                          const std::string* error);
   void AfterStartDisconnect(ServiceCallbacksID callback_id,
diff --git a/extensions/common/permissions/permissions_data.cc b/extensions/common/permissions/permissions_data.cc
index c03c4f0..5df44ac 100644
--- a/extensions/common/permissions/permissions_data.cc
+++ b/extensions/common/permissions/permissions_data.cc
@@ -552,10 +552,11 @@
   // URLPatternSet.
   runtime_lock_.AssertAcquired();
   if (context_id_.has_value()) {
-    // TODO(devlin): Eek! Despite the comment above, this actually creates a
-    // copy. Anecdotally, these lists may be very, very large. Fix this.
-    return GetDefaultPolicyBlockedHosts(context_id_.value()).MatchesURL(url) &&
-           !GetDefaultPolicyAllowedHosts(context_id_.value()).MatchesURL(url);
+    base::AutoLock lock(GetContextPermissionsLock());
+    const URLPatternAccessSet& default_policy_restrictions =
+        GetContextPermissions(*context_id_).default_policy_restrictions;
+    return default_policy_restrictions.blocked_hosts.MatchesURL(url) &&
+           !default_policy_restrictions.allowed_hosts.MatchesURL(url);
   }
 
   return policy_blocked_hosts_unsafe_.MatchesURL(url) &&
diff --git a/extensions/test/extension_test_message_listener.cc b/extensions/test/extension_test_message_listener.cc
index 15834e9..76e6b66 100644
--- a/extensions/test/extension_test_message_listener.cc
+++ b/extensions/test/extension_test_message_listener.cc
@@ -25,22 +25,6 @@
       extensions::TestApiObserverRegistry::GetInstance());
 }
 
-ExtensionTestMessageListener::ExtensionTestMessageListener(
-    const char* expected_message)
-    : ExtensionTestMessageListener(std::string(expected_message),
-                                   ReplyBehavior::kWontReply) {}
-
-ExtensionTestMessageListener::ExtensionTestMessageListener(
-    const std::string& expected_message,
-    bool will_reply)
-    : ExtensionTestMessageListener(
-          expected_message,
-          will_reply ? ReplyBehavior::kWillReply : ReplyBehavior::kWontReply) {}
-
-ExtensionTestMessageListener::ExtensionTestMessageListener(bool will_reply)
-    : ExtensionTestMessageListener(will_reply ? ReplyBehavior::kWillReply
-                                              : ReplyBehavior::kWontReply) {}
-
 ExtensionTestMessageListener::~ExtensionTestMessageListener() {
   DCHECK(!function_) << "MessageListener did not reply, but signaled it would.";
 }
diff --git a/extensions/test/extension_test_message_listener.h b/extensions/test/extension_test_message_listener.h
index d60005b9..0abb144 100644
--- a/extensions/test/extension_test_message_listener.h
+++ b/extensions/test/extension_test_message_listener.h
@@ -125,20 +125,6 @@
   // the specified `reply_behavior`.
   explicit ExtensionTestMessageListener(
       ReplyBehavior reply_behavior = ReplyBehavior::kWontReply);
-  // Temporary helper constructor. This disambiguates a caller like:
-  // ExtensionTestMessageListener listener("my message")
-  // Since otherwise it could either invoke the constructor above (by
-  // converting the const char* to a std::string) or the deprecated constructor
-  // below (by converting the const char* to a bool). This can be removed once
-  // the two constructors below are removed.
-  explicit ExtensionTestMessageListener(const char* expected_message);
-
-  // DEPRECATED.
-  // TODO(https://crbug.com/1324791): Convert all callers to the above
-  // constructors and remove these.
-  ExtensionTestMessageListener(const std::string& expected_message,
-                               bool will_reply);
-  explicit ExtensionTestMessageListener(bool will_reply);
 
   ~ExtensionTestMessageListener() override;
 
diff --git a/google_apis/gaia/core_account_id.cc b/google_apis/gaia/core_account_id.cc
index 0440b22..68c8543 100644
--- a/google_apis/gaia/core_account_id.cc
+++ b/google_apis/gaia/core_account_id.cc
@@ -5,6 +5,7 @@
 #include "google_apis/gaia/core_account_id.h"
 
 #include "base/check.h"
+#include "google_apis/gaia/gaia_auth_util.h"
 
 namespace {
 // Returns whether the string looks like an email (the test is
@@ -37,6 +38,16 @@
 }
 
 // static
+CoreAccountId CoreAccountId::FromRobotEmail(const std::string& robot_email) {
+  if (robot_email.empty())
+    return CoreAccountId();
+  DCHECK(gaia::IsGoogleRobotAccountEmail(robot_email))
+      << "Not a valid robot email [robot_email = " << robot_email << "]";
+  return CoreAccountId::FromString(robot_email);
+}
+
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+// static
 CoreAccountId CoreAccountId::FromEmail(const std::string& email) {
   if (email.empty())
     return CoreAccountId();
@@ -45,9 +56,10 @@
       << "Expected an email [actual = " << email << "]";
   return CoreAccountId::FromString(email);
 }
+#endif
 
 // static
-CoreAccountId CoreAccountId::FromString(const std::string value) {
+CoreAccountId CoreAccountId::FromString(const std::string& value) {
   CoreAccountId account_id;
   account_id.id_ = value;
   return account_id;
diff --git a/google_apis/gaia/core_account_id.h b/google_apis/gaia/core_account_id.h
index 43294c9..9eed6b40 100644
--- a/google_apis/gaia/core_account_id.h
+++ b/google_apis/gaia/core_account_id.h
@@ -10,6 +10,7 @@
 #include <vector>
 
 #include "build/build_config.h"
+#include "build/chromeos_buildflags.h"
 
 // Represent the id of an account for interaction with GAIA.
 //
@@ -57,16 +58,21 @@
   // Returns an empty CoreAccountId if |gaia_id| is empty.
   static CoreAccountId FromGaiaId(const std::string& gaia_id);
 
+  // Create a CoreAccountId object from an email of a robot account.
+  // Returns an empty CoreAccountId if |email| is empty.
+  static CoreAccountId FromRobotEmail(const std::string& robot_email);
+
+  // Create a CoreAccountId object from a string that was serialized via
+  // |CoreAccountId::ToString()|.
+  static CoreAccountId FromString(const std::string& value);
+
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+  // Only on ChromeOS, CoreAccountId objects may be created from Gaia emails.
+  //
   // Create a CoreAccountId object from an email.
   // Returns an empty CoreAccountId if |email| is empty.
   static CoreAccountId FromEmail(const std::string& email);
-
-  // Create a CoreAccountId object from a string that is either a gaia_id
-  // or an email.
-  //
-  // Note: This method only exits while the code is being migrated to
-  // use Gaia ID as the value of a CoreAccountId.
-  static CoreAccountId FromString(const std::string gaia_id_or_email);
+#endif
   // ---------------------------------------- ---------------------------------
 
   // --------------------------------------------------------------------------
diff --git a/google_apis/gaia/gaia_auth_util.cc b/google_apis/gaia/gaia_auth_util.cc
index 89001f0..3e4903b2 100644
--- a/google_apis/gaia/gaia_auth_util.cc
+++ b/google_apis/gaia/gaia_auth_util.cc
@@ -104,6 +104,12 @@
   return ExtractDomainName(SanitizeEmail(email)) == kGoogleDomain;
 }
 
+bool IsGoogleRobotAccountEmail(const std::string& email) {
+  std::string domain_name = gaia::ExtractDomainName(SanitizeEmail(email));
+  return base::EndsWith(domain_name, "gserviceaccount.com") ||
+         base::EndsWith(domain_name, "googleusercontent.com");
+}
+
 bool HasGaiaSchemeHostPort(const GURL& url) {
   const url::Origin& gaia_origin = GaiaUrls::GetInstance()->gaia_origin();
   CHECK(!gaia_origin.opaque());
diff --git a/google_apis/gaia/gaia_auth_util.h b/google_apis/gaia/gaia_auth_util.h
index e25061f..6295739 100644
--- a/google_apis/gaia/gaia_auth_util.h
+++ b/google_apis/gaia/gaia_auth_util.h
@@ -55,6 +55,9 @@
 // to be used sparingly since it ship Googler-only code to all users.
 bool IsGoogleInternalAccountEmail(const std::string& email);
 
+// Returns true if |email| correspnds to the email of a robot account.
+bool IsGoogleRobotAccountEmail(const std::string& email);
+
 // Mechanically compares the scheme, host, and port of the |url| against the
 // GAIA url in GaiaUrls. This means that this function will *not* work for
 // determining whether a frame with an "about:blank" URL or "blob:..." URL has
diff --git a/google_apis/gaia/gaia_auth_util_unittest.cc b/google_apis/gaia/gaia_auth_util_unittest.cc
index f1e90141..12c7c9c 100644
--- a/google_apis/gaia/gaia_auth_util_unittest.cc
+++ b/google_apis/gaia/gaia_auth_util_unittest.cc
@@ -135,6 +135,18 @@
   EXPECT_FALSE(AreEmailsSame("user@gmail.com", "foo@gmail.com"));
 }
 
+TEST(GaiaAuthUtilTest, IsGoogleRobotAccountEmail) {
+  EXPECT_FALSE(IsGoogleRobotAccountEmail(""));
+  EXPECT_FALSE(IsGoogleRobotAccountEmail("foo"));
+  EXPECT_FALSE(IsGoogleRobotAccountEmail("1234567890"));
+  EXPECT_FALSE(IsGoogleRobotAccountEmail("foo@gmail.com"));
+  EXPECT_FALSE(IsGoogleRobotAccountEmail("system.gserviceaccount.com"));
+  EXPECT_TRUE(IsGoogleRobotAccountEmail("foo@system.gserviceaccount.com"));
+  EXPECT_TRUE(IsGoogleRobotAccountEmail("foo@system.googleusercontent.com"));
+  EXPECT_TRUE(IsGoogleRobotAccountEmail("foo@System.Gserviceaccount.com"));
+  EXPECT_TRUE(IsGoogleRobotAccountEmail("foo@System.Googleusercontent.com"));
+}
+
 TEST(GaiaAuthUtilTest, GmailAndGooglemailAreSame) {
   EXPECT_TRUE(AreEmailsSame("foo@gmail.com", "foo@googlemail.com"));
   EXPECT_FALSE(AreEmailsSame("bar@gmail.com", "foo@googlemail.com"));
diff --git a/gpu/ipc/service/gpu_init.cc b/gpu/ipc/service/gpu_init.cc
index 37e2ce5..028d654f 100644
--- a/gpu/ipc/service/gpu_init.cc
+++ b/gpu/ipc/service/gpu_init.cc
@@ -171,11 +171,11 @@
 }
 
 #if BUILDFLAG(ENABLE_VULKAN)
-bool MatchGLRenderer(const GPUInfo& gpu_info, const std::string& patterns) {
+bool MatchGLInfo(const std::string& field, const std::string& patterns) {
   auto pattern_strings = base::SplitString(patterns, "|", base::TRIM_WHITESPACE,
                                            base::SPLIT_WANT_ALL);
   for (const auto& pattern : pattern_strings) {
-    if (base::MatchPattern(gpu_info.gl_renderer, pattern))
+    if (base::MatchPattern(field, pattern))
       return true;
   }
   return false;
@@ -962,12 +962,25 @@
   const base::FeatureParam<std::string> disable_patterns(
       &features::kVulkan, "disable_by_gl_renderer",
       "*Mali-G?? M*" /* https://crbug.com/1183702 */);
-  if (MatchGLRenderer(gpu_info_, disable_patterns.Get()))
+  if (MatchGLInfo(gpu_info_.gl_renderer, disable_patterns.Get()))
+    return false;
+
+  const base::FeatureParam<std::string> disable_driver_patterns(
+      &features::kVulkan, "disable_by_gl_driver",
+#if BUILDFLAG(IS_ANDROID)
+      "324.0|331.0|334.0|378.0|415.0|420.0|444.0" /* https://crbug.com/1246857
+                                                   */
+#else
+      ""
+#endif
+  );
+  if (MatchGLInfo(gpu_info_.gpu.driver_version, disable_driver_patterns.Get()))
     return false;
 
   const base::FeatureParam<std::string> force_enable_patterns(
       &features::kVulkan, "force_enable_by_gl_renderer", "");
-  forced_native |= MatchGLRenderer(gpu_info_, force_enable_patterns.Get());
+  forced_native |=
+      MatchGLInfo(gpu_info_.gl_renderer, force_enable_patterns.Get());
 
   const base::FeatureParam<std::string> enable_by_device_name(
       &features::kVulkan, "enable_by_device_name", "");
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg
index 32da08c3..c54dcd3 100644
--- a/infra/config/generated/luci/cr-buildbucket.cfg
+++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -9097,7 +9097,7 @@
       dimensions: "builder:Libfuzzer Upload iOS Catalyst Debug"
       dimensions: "cores:4"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
+      dimensions: "os:Mac-12"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
@@ -29767,7 +29767,6 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-fieldtrial-rel"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -30010,7 +30009,6 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-reclient"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -30259,7 +30257,6 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-simulator-cronet"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -30425,7 +30422,6 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-simulator-multi-window"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -30591,7 +30587,6 @@
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:ios-webkit-tot"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Mac-11"
       dimensions: "pool:luci.chromium.ci"
       exe {
         cipd_package: "infra/chromium/bootstrapper/${platform}"
diff --git a/infra/config/subprojects/chromium/ci/chromium.fuzz.star b/infra/config/subprojects/chromium/ci/chromium.fuzz.star
index baaf478..b0ded28 100644
--- a/infra/config/subprojects/chromium/ci/chromium.fuzz.star
+++ b/infra/config/subprojects/chromium/ci/chromium.fuzz.star
@@ -328,7 +328,7 @@
     cores = 4,
     executable = "recipe:chromium_libfuzzer",
     execution_timeout = 4 * time.hour,
-    os = os.MAC_11,
+    os = os.MAC_12,
     xcode = xcode.x13main,
 )
 
diff --git a/infra/config/subprojects/chromium/ci/chromium.fyi.star b/infra/config/subprojects/chromium/ci/chromium.fyi.star
index 2f163c8..6f9ba85c 100644
--- a/infra/config/subprojects/chromium/ci/chromium.fyi.star
+++ b/infra/config/subprojects/chromium/ci/chromium.fyi.star
@@ -74,7 +74,8 @@
 
 def fyi_ios_builder(*, name, **kwargs):
     kwargs.setdefault("cores", None)
-    kwargs.setdefault("os", os.MAC_11)
+    if kwargs.get("builderless", False):
+        kwargs.setdefault("os", os.MAC_11)
     kwargs.setdefault("xcode", xcode.x13main)
     return ci.builder(name = name, **kwargs)
 
diff --git a/ios/chrome/browser/browsing_data/BUILD.gn b/ios/chrome/browser/browsing_data/BUILD.gn
index 8c082b16..c0eb200 100644
--- a/ios/chrome/browser/browsing_data/BUILD.gn
+++ b/ios/chrome/browser/browsing_data/BUILD.gn
@@ -55,6 +55,7 @@
     "//ios/chrome/browser/autofill",
     "//ios/chrome/browser/bookmarks",
     "//ios/chrome/browser/browser_state",
+    "//ios/chrome/browser/crash_report",
     "//ios/chrome/browser/external_files",
     "//ios/chrome/browser/history",
     "//ios/chrome/browser/https_upgrades",
diff --git a/ios/chrome/browser/browsing_data/browsing_data_remover_impl.mm b/ios/chrome/browser/browsing_data/browsing_data_remover_impl.mm
index 101d818..3f8ad20f 100644
--- a/ios/chrome/browser/browsing_data/browsing_data_remover_impl.mm
+++ b/ios/chrome/browser/browsing_data/browsing_data_remover_impl.mm
@@ -42,6 +42,7 @@
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #include "ios/chrome/browser/browsing_data/browsing_data_features.h"
 #include "ios/chrome/browser/browsing_data/browsing_data_remove_mask.h"
+#include "ios/chrome/browser/crash_report/crash_helper.h"
 #include "ios/chrome/browser/external_files/external_file_remover.h"
 #include "ios/chrome/browser/external_files/external_file_remover_factory.h"
 #include "ios/chrome/browser/history/history_service_factory.h"
@@ -418,6 +419,8 @@
     if (language_histogram) {
       language_histogram->ClearHistory(delete_begin, delete_end);
     }
+
+    crash_helper::ClearReportsBetween(delete_begin, delete_end);
   }
 
   if (IsRemoveDataMaskSet(mask, BrowsingDataRemoveMask::REMOVE_PASSWORDS)) {
diff --git a/ios/chrome/browser/crash_report/crash_helper.h b/ios/chrome/browser/crash_report/crash_helper.h
index ac0cb67..159c3ade 100644
--- a/ios/chrome/browser/crash_report/crash_helper.h
+++ b/ios/chrome/browser/crash_report/crash_helper.h
@@ -5,6 +5,7 @@
 #ifndef IOS_CHROME_BROWSER_CRASH_REPORT_CRASH_HELPER_H_
 #define IOS_CHROME_BROWSER_CRASH_REPORT_CRASH_HELPER_H_
 
+#include "base/time/time.h"
 
 namespace crash_helper {
 
@@ -55,6 +56,9 @@
 // Resets the Breakpad configuration from the main bundle.
 void RestoreDefaultConfiguration();
 
+// Deletes any reports that were recorded or uploaded within the time range.
+void ClearReportsBetween(base::Time delete_begin, base::Time delete_end);
+
 }  // namespace crash_helper
 
 #endif  // IOS_CHROME_BROWSER_CRASH_REPORT_CRASH_HELPER_H_
diff --git a/ios/chrome/browser/crash_report/crash_helper.mm b/ios/chrome/browser/crash_report/crash_helper.mm
index b0a39c35..3b0a8c7 100644
--- a/ios/chrome/browser/crash_report/crash_helper.mm
+++ b/ios/chrome/browser/crash_report/crash_helper.mm
@@ -31,6 +31,7 @@
 #include "components/crash/core/common/reporter_running_ios.h"
 #include "ios/chrome/browser/chrome_paths.h"
 #import "ios/chrome/browser/crash_report/crash_report_user_application_state.h"
+#include "ios/chrome/browser/crash_report/crash_upload_list.h"
 #include "ios/chrome/browser/crash_report/features.h"
 #import "ios/chrome/browser/crash_report/main_thread_freeze_detector.h"
 #include "ios/chrome/common/app_group/app_group_constants.h"
@@ -363,4 +364,8 @@
   [[BreakpadController sharedInstance] setUploadingEnabled:NO];
 }
 
+void ClearReportsBetween(base::Time delete_begin, base::Time delete_end) {
+  ios::CreateCrashUploadList()->Clear(delete_begin, delete_end);
+}
+
 }  // namespace crash_helper
diff --git a/ios/chrome/browser/providers/context_menu/chromium_context_menu.mm b/ios/chrome/browser/providers/context_menu/chromium_context_menu.mm
index 8a5b1a5..6e033b62 100644
--- a/ios/chrome/browser/providers/context_menu/chromium_context_menu.mm
+++ b/ios/chrome/browser/providers/context_menu/chromium_context_menu.mm
@@ -14,7 +14,8 @@
 bool AddContextMenuElements(NSMutableArray<UIMenuElement*>* menu_elements,
                             ChromeBrowserState* browser_state,
                             web::WebState* web_state,
-                            web::ContextMenuParams params) {
+                            web::ContextMenuParams params,
+                            UIViewController* presentingViewController) {
   // Chromium does not add elements to the context menu.
   return false;
 }
diff --git a/ios/chrome/browser/ui/authentication/cells/signin_promo_view.h b/ios/chrome/browser/ui/authentication/cells/signin_promo_view.h
index 8905643..2579016 100644
--- a/ios/chrome/browser/ui/authentication/cells/signin_promo_view.h
+++ b/ios/chrome/browser/ui/authentication/cells/signin_promo_view.h
@@ -28,6 +28,7 @@
 @property(nonatomic, weak) id<SigninPromoViewDelegate> delegate;
 @property(nonatomic, assign) SigninPromoViewMode mode;
 @property(nonatomic, strong, readonly) UIImageView* imageView;
+@property(nonatomic, strong, readonly) UILabel* titleLabel;
 @property(nonatomic, strong, readonly) UILabel* textLabel;
 @property(nonatomic, strong, readonly) UIButton* primaryButton;
 @property(nonatomic, strong, readonly) UIButton* secondaryButton;
@@ -39,6 +40,9 @@
 // |textLabel|.
 @property(nonatomic, assign, readonly) CGFloat horizontalPadding;
 
+// |YES| when the promo view layout is compact.
+@property(nonatomic, assign) BOOL compactLayout;
+
 // Designated initializer.
 - (instancetype)initWithFrame:(CGRect)frame NS_DESIGNATED_INITIALIZER;
 - (instancetype)initWithCoder:(NSCoder*)aDecoder NS_UNAVAILABLE;
@@ -48,6 +52,11 @@
 // cropped first). Must only be called in the "Warm State" mode.
 - (void)setProfileImage:(UIImage*)image;
 
+// Sets the image in |imageView|. This image will be used as an alternative to
+// the chromium icon in "Cold State" mode. This image will not use
+// CircularImageFromImage(), instead it will be shown as is.
+- (void)setNonProfileImage:(UIImage*)image;
+
 // Resets the view to be reused.
 - (void)prepareForReuse;
 
diff --git a/ios/chrome/browser/ui/authentication/cells/signin_promo_view.mm b/ios/chrome/browser/ui/authentication/cells/signin_promo_view.mm
index f2ada1d..583c16f 100644
--- a/ios/chrome/browser/ui/authentication/cells/signin_promo_view.mm
+++ b/ios/chrome/browser/ui/authentication/cells/signin_promo_view.mm
@@ -51,10 +51,15 @@
 @interface SigninPromoView ()
 // Re-declare as readwrite.
 @property(nonatomic, strong, readwrite) UIImageView* imageView;
+@property(nonatomic, strong, readwrite) UILabel* titleLabel;
 @property(nonatomic, strong, readwrite) UILabel* textLabel;
 @property(nonatomic, strong, readwrite) UIButton* primaryButton;
 @property(nonatomic, strong, readwrite) UIButton* secondaryButton;
 @property(nonatomic, strong, readwrite) UIButton* closeButton;
+// Contains the two main sections of the promo (image and Text).
+@property(nonatomic, strong) UIStackView* contentStackView;
+// Contains all the text elements of the promo (title,body and buttons).
+@property(nonatomic, strong) UIStackView* textVerticalStackView;
 @end
 
 @implementation SigninPromoView {
@@ -76,6 +81,17 @@
     _imageView.layer.masksToBounds = YES;
     _imageView.contentMode = UIViewContentModeScaleAspectFit;
 
+    // Create and setup title label.
+    _titleLabel = [[UILabel alloc] init];
+    _titleLabel.translatesAutoresizingMaskIntoConstraints = NO;
+    _titleLabel.numberOfLines = 0;
+    _titleLabel.textAlignment = NSTextAlignmentCenter;
+    _titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
+    _titleLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleTitle3];
+    _titleLabel.textColor = [UIColor colorNamed:kTextPrimaryColor];
+    // Title is hidden by default.
+    _titleLabel.hidden = YES;
+
     // Create and setup informative text label.
     _textLabel = [[UILabel alloc] init];
     _textLabel.translatesAutoresizingMaskIntoConstraints = NO;
@@ -126,16 +142,23 @@
                forControlEvents:UIControlEventTouchUpInside];
     _secondaryButton.pointerInteractionEnabled = YES;
 
-    // Vertical stackView containing all previous view.
-    UIStackView* verticalStackView =
-        [[UIStackView alloc] initWithArrangedSubviews:@[
-          _imageView, _textLabel, _primaryButton, _secondaryButton
-        ]];
-    verticalStackView.alignment = UIStackViewAlignmentCenter;
-    verticalStackView.axis = UILayoutConstraintAxisVertical;
-    verticalStackView.translatesAutoresizingMaskIntoConstraints = NO;
-    verticalStackView.spacing = kStackViewSubViewSpacing;
-    [self addSubview:verticalStackView];
+    _textVerticalStackView = [[UIStackView alloc] initWithArrangedSubviews:@[
+      _titleLabel, _textLabel, _primaryButton, _secondaryButton
+    ]];
+
+    _textVerticalStackView.alignment = UIStackViewAlignmentCenter;
+    _textVerticalStackView.axis = UILayoutConstraintAxisVertical;
+    _textVerticalStackView.translatesAutoresizingMaskIntoConstraints = NO;
+    _textVerticalStackView.spacing = kStackViewSubViewSpacing;
+
+    _contentStackView = [[UIStackView alloc]
+        initWithArrangedSubviews:@[ _imageView, _textVerticalStackView ]];
+    _contentStackView.alignment = UIStackViewAlignmentCenter;
+    _contentStackView.axis = UILayoutConstraintAxisVertical;
+    _contentStackView.translatesAutoresizingMaskIntoConstraints = NO;
+    _contentStackView.spacing = kStackViewSubViewSpacing;
+
+    [self addSubview:_contentStackView];
 
     // Create close button and adds it directly to self.
     _closeButton = [[UIButton alloc] init];
@@ -151,17 +174,16 @@
     [self addSubview:_closeButton];
 
     [NSLayoutConstraint activateConstraints:@[
-      // Vertical stack.
-      [verticalStackView.leadingAnchor
+      [_contentStackView.leadingAnchor
           constraintEqualToAnchor:self.leadingAnchor
                          constant:kStackViewHorizontalPadding],
-      [verticalStackView.trailingAnchor
+      [_contentStackView.trailingAnchor
           constraintEqualToAnchor:self.trailingAnchor
                          constant:-kStackViewHorizontalPadding],
-      [verticalStackView.topAnchor
+      [_contentStackView.topAnchor
           constraintEqualToAnchor:self.topAnchor
                          constant:kStackViewVerticalPadding],
-      [verticalStackView.bottomAnchor
+      [_contentStackView.bottomAnchor
           constraintEqualToAnchor:self.bottomAnchor
                          constant:-kStackViewVerticalPadding],
       // Image view.
@@ -177,6 +199,8 @@
       [_closeButton.widthAnchor
           constraintEqualToConstant:kCloseButtonWidthHeight],
     ]];
+    // Default layout.
+    _compactLayout = NO;
     // Default mode.
     _mode = SigninPromoViewModeNoAccounts;
     [self activateNoAccountsMode];
@@ -237,6 +261,39 @@
   self.imageView.image = CircularImageFromImage(image, kImageViewWidthHeight);
 }
 
+- (void)setNonProfileImage:(UIImage*)image {
+  DCHECK_EQ(_mode, SigninPromoViewModeNoAccounts);
+  DCHECK_EQ(kImageViewWidthHeight, image.size.width);
+  DCHECK_EQ(kImageViewWidthHeight, image.size.height);
+  self.imageView.image = image;
+}
+
+- (void)setCompactLayout:(BOOL)compactLayout {
+  if (compactLayout == _compactLayout)
+    return;
+  _compactLayout = compactLayout;
+  if (_compactLayout) {
+    _contentStackView.axis = UILayoutConstraintAxisVertical;
+    _textVerticalStackView.alignment = UIStackViewAlignmentLeading;
+    _textLabel.textAlignment = NSTextAlignmentNatural;
+    // In compact layout the primary button is plain.
+    _primaryButton.backgroundColor = nil;
+    [_primaryButton setTitleColor:[UIColor colorNamed:kBlueColor]
+                         forState:UIControlStateNormal];
+    _primaryButton.layer.cornerRadius = 0.0;
+    _primaryButton.clipsToBounds = NO;
+  } else {
+    _contentStackView.axis = UILayoutConstraintAxisHorizontal;
+    _textVerticalStackView.alignment = UIStackViewAlignmentCenter;
+    _textLabel.textAlignment = NSTextAlignmentCenter;
+    [_primaryButton setTitleColor:[UIColor colorNamed:kSolidButtonTextColor]
+                         forState:UIControlStateNormal];
+    _primaryButton.backgroundColor = [UIColor colorNamed:kBlueColor];
+    _primaryButton.layer.cornerRadius = kButtonCornerRadius;
+    _primaryButton.clipsToBounds = YES;
+  }
+}
+
 - (void)accessibilityPrimaryAction:(id)unused {
   [self.primaryButton sendActionsForControlEvents:UIControlEventTouchUpInside];
 }
diff --git a/ios/chrome/browser/ui/authentication/cells/signin_promo_view_configurator.h b/ios/chrome/browser/ui/authentication/cells/signin_promo_view_configurator.h
index 76cf3f9..dbf3afb 100644
--- a/ios/chrome/browser/ui/authentication/cells/signin_promo_view_configurator.h
+++ b/ios/chrome/browser/ui/authentication/cells/signin_promo_view_configurator.h
@@ -20,6 +20,8 @@
 // |userGivenName| and |userImage| have to be nil.
 // Otherwise |userEmail| and |userImage| can't be nil. |userImage| has to be to
 // the size of IdentityAvatarSize::SmallSize.
+// TODO(crbug.com/1328877): Consider adding a parameter for
+// SigninPromoViewStyle.
 - (instancetype)initWithSigninPromoViewMode:(SigninPromoViewMode)viewMode
                                   userEmail:(NSString*)userEmail
                               userGivenName:(NSString*)userGivenName
@@ -27,9 +29,15 @@
                              hasCloseButton:(BOOL)hasCloseButton
     NS_DESIGNATED_INITIALIZER;
 
-// Configures a sign-in promo view.
+// Configures a sign-in promo view with the default standard style.
+// TODO(crbug.com/1328877): Remove this method and replace usages with the
+// |configureSigninPromoView:WithStyle:|.
 - (void)configureSigninPromoView:(SigninPromoView*)signinPromoView;
 
+// Configure |signinPromoView| with the given |promoViewStyle| style.
+- (void)configureSigninPromoView:(SigninPromoView*)signinPromoView
+                       withStyle:(SigninPromoViewStyle)promoViewStyle;
+
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_AUTHENTICATION_CELLS_SIGNIN_PROMO_VIEW_CONFIGURATOR_H_
diff --git a/ios/chrome/browser/ui/authentication/cells/signin_promo_view_configurator.mm b/ios/chrome/browser/ui/authentication/cells/signin_promo_view_configurator.mm
index 7dba373..6a3b78c 100644
--- a/ios/chrome/browser/ui/authentication/cells/signin_promo_view_configurator.mm
+++ b/ios/chrome/browser/ui/authentication/cells/signin_promo_view_configurator.mm
@@ -105,4 +105,26 @@
   [signinPromoView setProfileImage:image];
 }
 
+- (void)configureSigninPromoView:(SigninPromoView*)signinPromoView
+                       withStyle:(SigninPromoViewStyle)promoViewStyle {
+  switch (promoViewStyle) {
+    case SigninPromoViewStyleStandard: {
+      signinPromoView.titleLabel.hidden = YES;
+      signinPromoView.compactLayout = NO;
+      [self configureSigninPromoView:signinPromoView];
+      return;
+    }
+    case SigninPromoViewStyleTitled: {
+      signinPromoView.titleLabel.hidden = NO;
+      signinPromoView.compactLayout = NO;
+      break;
+    }
+    case SigninPromoViewStyleTitledCompact: {
+      signinPromoView.titleLabel.hidden = NO;
+      signinPromoView.compactLayout = YES;
+      break;
+    }
+  }
+}
+
 @end
diff --git a/ios/chrome/browser/ui/authentication/cells/signin_promo_view_constants.h b/ios/chrome/browser/ui/authentication/cells/signin_promo_view_constants.h
index b1ecde7..8fe91919 100644
--- a/ios/chrome/browser/ui/authentication/cells/signin_promo_view_constants.h
+++ b/ios/chrome/browser/ui/authentication/cells/signin_promo_view_constants.h
@@ -17,6 +17,20 @@
   SigninPromoViewModeSyncWithPrimaryAccount,
 };
 
+typedef NS_ENUM(NSInteger, SigninPromoViewStyle) {
+  // Standard style used for most surfaces. It contains user avatar/ chromium
+  // logo, text body, rounded corners colored button and an optional secondary
+  // plain button, all stacked vertically.
+  SigninPromoViewStyleStandard,
+  // Full card style, content stacked vertically. Contains same content as the
+  // standard style in addition to a text title and allows for non-chromium logo
+  // image.
+  SigninPromoViewStyleTitled,
+  // Compact style, same content as titled style but the image is on the
+  // leading side of the promo instead of the top of the promo.
+  SigninPromoViewStyleTitledCompact,
+};
+
 extern NSString* const kSigninPromoViewId;
 extern NSString* const kSigninPromoPrimaryButtonId;
 extern NSString* const kSigninPromoSecondaryButtonId;
diff --git a/ios/chrome/browser/ui/authentication/cells/signin_promo_view_unittest.mm b/ios/chrome/browser/ui/authentication/cells/signin_promo_view_unittest.mm
index 13f39bc..ac035b16 100644
--- a/ios/chrome/browser/ui/authentication/cells/signin_promo_view_unittest.mm
+++ b/ios/chrome/browser/ui/authentication/cells/signin_promo_view_unittest.mm
@@ -78,3 +78,23 @@
   EXPECT_TRUE(
       [view.accessibilityLabel isEqualToString:expectedAccessibilityLabel]);
 }
+
+// Tests that signin is created on non-compact layout and that setting compact
+// layout changes the primary button styling.
+TEST_F(SigninPromoViewTest, CompactLayout) {
+  UIWindow* currentWindow = GetAnyKeyWindow();
+  SigninPromoView* view =
+      [[SigninPromoView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
+  view.mode = SigninPromoViewModeNoAccounts;
+  [currentWindow.rootViewController.view addSubview:view];
+  // Ensure that default layout is not compact.
+  EXPECT_FALSE(view.compactLayout);
+  // In full layout, the primary button is rounded with background color.
+  EXPECT_TRUE(view.primaryButton.backgroundColor);
+  EXPECT_GT(view.primaryButton.layer.cornerRadius, 0.0);
+
+  [view setCompactLayout:YES];
+  // In compact layout, the primary button is plain.
+  EXPECT_FALSE(view.primaryButton.backgroundColor);
+  EXPECT_EQ(view.primaryButton.layer.cornerRadius, 0.0);
+}
diff --git a/ios/chrome/browser/ui/context_menu/context_menu_configuration_provider.mm b/ios/chrome/browser/ui/context_menu/context_menu_configuration_provider.mm
index 0fb78caf..63561300 100644
--- a/ios/chrome/browser/ui/context_menu/context_menu_configuration_provider.mm
+++ b/ios/chrome/browser/ui/context_menu/context_menu_configuration_provider.mm
@@ -290,7 +290,8 @@
   // Insert any provided menu items. Do after Link and/or Image to allow
   // inserting at beginning or adding to end.
   ios::provider::AddContextMenuElements(
-      menuElements, self.browser->GetBrowserState(), webState, params);
+      menuElements, self.browser->GetBrowserState(), webState, params,
+      self.baseViewController);
 
   if (menuElements.count == 0) {
     return nil;
diff --git a/ios/chrome/browser/ui/fullscreen/fullscreen_egtest.mm b/ios/chrome/browser/ui/fullscreen/fullscreen_egtest.mm
index f650d01..6db5a25 100644
--- a/ios/chrome/browser/ui/fullscreen/fullscreen_egtest.mm
+++ b/ios/chrome/browser/ui/fullscreen/fullscreen_egtest.mm
@@ -341,8 +341,7 @@
 
 // Tests that the header is shown when a native page is loaded from a page where
 // the header was not seen before.
-// TODO(crbug.com/1329265): failing on waterfall
-- (void)DISABLED_testShowHeaderOnNativePageLoad {
+- (void)testShowHeaderOnNativePageLoad {
   std::map<GURL, std::string> responses;
   const GURL URL = web::test::HttpServer::MakeUrl("http://origin");
 
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_text_field_experimental.mm b/ios/chrome/browser/ui/omnibox/omnibox_text_field_experimental.mm
index bf18e67..5865500 100644
--- a/ios/chrome/browser/ui/omnibox/omnibox_text_field_experimental.mm
+++ b/ios/chrome/browser/ui/omnibox/omnibox_text_field_experimental.mm
@@ -490,6 +490,8 @@
   } else if ([self hasAutocompleteText]) {
     // Accept selection.
     [self acceptAutocompleteText];
+  } else {
+    [self becomeFirstResponder];
   }
 }
 
diff --git a/ios/chrome/browser/ui/settings/privacy/privacy_safe_browsing_coordinator.mm b/ios/chrome/browser/ui/settings/privacy/privacy_safe_browsing_coordinator.mm
index cd3f3ae..d30c66f 100644
--- a/ios/chrome/browser/ui/settings/privacy/privacy_safe_browsing_coordinator.mm
+++ b/ios/chrome/browser/ui/settings/privacy/privacy_safe_browsing_coordinator.mm
@@ -5,6 +5,8 @@
 #import "ios/chrome/browser/ui/settings/privacy/privacy_safe_browsing_coordinator.h"
 
 #include "base/mac/foundation_util.h"
+#import "base/metrics/user_metrics.h"
+#import "base/metrics/user_metrics_action.h"
 #import "components/strings/grit/components_strings.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #include "ios/chrome/browser/chrome_url_constants.h"
@@ -129,19 +131,25 @@
       IDS_IOS_SAFE_BROWSING_NO_PROTECTION_CONFIRMATION_DIALOG_CONFIRM);
   [self.alertCoordinator addItemWithTitle:actionTitle
                                    action:^{
+                                     base::RecordAction(base::UserMetricsAction(
+                                         "SafeBrowsing.Settings."
+                                         "DisableSafeBrowsingDialogConfirmed"));
                                      [weakSelf.mediator selectSettingItem:item];
                                      [weakSelf.alertCoordinator stop];
                                      weakSelf.alertCoordinator = nil;
                                    }
                                     style:UIAlertActionStyleDefault];
 
-  [self.alertCoordinator addItemWithTitle:l10n_util::GetNSString(IDS_CANCEL)
-                                   action:^{
-                                     [weakSelf.mediator selectSettingItem:nil];
-                                     [weakSelf.alertCoordinator stop];
-                                     weakSelf.alertCoordinator = nil;
-                                   }
-                                    style:UIAlertActionStyleCancel];
+  [self.alertCoordinator
+      addItemWithTitle:l10n_util::GetNSString(IDS_CANCEL)
+                action:^{
+                  base::RecordAction(base::UserMetricsAction(
+                      "SafeBrowsing.Settings.DisableSafeBrowsingDialogDenied"));
+                  [weakSelf.mediator selectSettingItem:nil];
+                  [weakSelf.alertCoordinator stop];
+                  weakSelf.alertCoordinator = nil;
+                }
+                 style:UIAlertActionStyleCancel];
 
   [self.alertCoordinator start];
 }
diff --git a/ios/chrome/browser/ui/settings/privacy/privacy_safe_browsing_egtest.mm b/ios/chrome/browser/ui/settings/privacy/privacy_safe_browsing_egtest.mm
new file mode 100644
index 0000000..b5c3ef9
--- /dev/null
+++ b/ios/chrome/browser/ui/settings/privacy/privacy_safe_browsing_egtest.mm
@@ -0,0 +1,32 @@
+// Copyright 2022 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 "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
+#import "ios/chrome/test/earl_grey/chrome_matchers.h"
+#import "ios/chrome/test/earl_grey/chrome_test_case.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+// Integration tests using the Privacy Safe Browsing settings screen.
+@interface PrivacySafeBrowsingTestCase : ChromeTestCase
+@end
+
+@implementation PrivacySafeBrowsingTestCase
+
+- (void)testOpenPrivacySafeBrowsingSettings {
+}
+
+#pragma mark - Helpers
+
+- (void)openPrivacySafeBrowsingSettings {
+  [ChromeEarlGreyUI openSettingsMenu];
+  [ChromeEarlGreyUI tapSettingsMenuButton:SettingsMenuPrivacyButton()];
+  NSString* safeBrowsingDialogLabel =
+      l10n_util::GetNSString(IDS_IOS_PRIVACY_SAFE_BROWSING_TITLE);
+  [ChromeEarlGreyUI tapPrivacyMenuButton:safeBrowsingDialogLabel];
+}
+
+@end
diff --git a/ios/chrome/browser/ui/settings/privacy/privacy_safe_browsing_mediator.mm b/ios/chrome/browser/ui/settings/privacy/privacy_safe_browsing_mediator.mm
index 8ace580f..d756456 100644
--- a/ios/chrome/browser/ui/settings/privacy/privacy_safe_browsing_mediator.mm
+++ b/ios/chrome/browser/ui/settings/privacy/privacy_safe_browsing_mediator.mm
@@ -6,6 +6,8 @@
 
 #include "base/auto_reset.h"
 #include "base/mac/foundation_util.h"
+#import "base/metrics/user_metrics.h"
+#import "base/metrics/user_metrics_action.h"
 #include "base/notreached.h"
 #include "components/prefs/pref_service.h"
 #include "components/safe_browsing/core/common/safe_browsing_prefs.h"
@@ -276,22 +278,32 @@
   ItemType type = static_cast<ItemType>(item.type);
   if (type == ItemTypeSafeBrowsingEnhancedProtection) {
     if ([self shouldItemTypeHaveCheckmark:type]) {
+      base::RecordAction(base::UserMetricsAction(
+          "SafeBrowsing.Settings.EnhancedProtectionExpandArrowClicked"));
       [self.handler showSafeBrowsingEnhancedProtection];
     } else {
+      base::RecordAction(base::UserMetricsAction(
+          "SafeBrowsing.Settings.EnhancedProtectionClicked"));
       [self selectSettingItem:item];
     }
   }
 
   if (type == ItemTypeSafeBrowsingStandardProtection) {
     if ([self shouldItemTypeHaveCheckmark:type]) {
+      base::RecordAction(base::UserMetricsAction(
+          "SafeBrowsing.Settings.StandardProtectionExpandArrowClicked"));
       [self.handler showSafeBrowsingStandardProtection];
     } else {
+      base::RecordAction(base::UserMetricsAction(
+          "SafeBrowsing.Settings.StandardProtectionClicked"));
       [self selectSettingItem:item];
     }
   }
 
   if (type == ItemTypeSafeBrowsingNoProtection &&
       ![self shouldItemTypeHaveCheckmark:type]) {
+    base::RecordAction(base::UserMetricsAction(
+        "SafeBrowsing.Settings.DisableSafeBrowsingClicked"));
     [self.handler showSafeBrowsingNoProtectionPopUp:item];
   }
 }
@@ -306,9 +318,13 @@
   ItemType type = static_cast<ItemType>(item.type);
   switch (type) {
     case ItemTypeSafeBrowsingEnhancedProtection:
+      base::RecordAction(base::UserMetricsAction(
+          "SafeBrowsing.Settings.EnhancedProtectionExpandArrowClicked"));
       [self.handler showSafeBrowsingEnhancedProtection];
       break;
     case ItemTypeSafeBrowsingStandardProtection:
+      base::RecordAction(base::UserMetricsAction(
+          "SafeBrowsing.Settings.StandardProtectionExpandArrowClicked"));
       [self.handler showSafeBrowsingStandardProtection];
       break;
     default:
diff --git a/ios/chrome/browser/ui/settings/privacy/privacy_table_view_controller.mm b/ios/chrome/browser/ui/settings/privacy/privacy_table_view_controller.mm
index 44f86e77..7ad84b8 100644
--- a/ios/chrome/browser/ui/settings/privacy/privacy_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/privacy/privacy_table_view_controller.mm
@@ -385,6 +385,8 @@
       [self.handler showClearBrowsingData];
       break;
     case ItemTypePrivacySafeBrowsing:
+      base::RecordAction(base::UserMetricsAction(
+          "SafeBrowsing.Settings.ShowedFromParentSettings"));
       [self.handler showSafeBrowsing];
       break;
     default:
diff --git a/ios/chrome/browser/ui/webui/policy/policy_ui_handler.mm b/ios/chrome/browser/ui/webui/policy/policy_ui_handler.mm
index e3af1422a..03b4c02 100644
--- a/ios/chrome/browser/ui/webui/policy/policy_ui_handler.mm
+++ b/ios/chrome/browser/ui/webui/policy/policy_ui_handler.mm
@@ -238,8 +238,7 @@
   // Given that it's usual for users to bring their own devices and the fact
   // that device names could expose personal information. We do not show
   // this field in Device Policy Box
-  if (machine_status->HasKey("machine"))
-    machine_status->RemoveKey("machine");
+  machine_status->RemoveKey("machine");
 
   base::DictionaryValue status;
   if (!machine_status->DictEmpty()) {
diff --git a/ios/chrome/test/providers/context_menu/test_context_menu.mm b/ios/chrome/test/providers/context_menu/test_context_menu.mm
index dac46f9..e5273542 100644
--- a/ios/chrome/test/providers/context_menu/test_context_menu.mm
+++ b/ios/chrome/test/providers/context_menu/test_context_menu.mm
@@ -14,7 +14,8 @@
 bool AddContextMenuElements(NSMutableArray<UIMenuElement*>* menu_elements,
                             ChromeBrowserState* browser_state,
                             web::WebState* web_state,
-                            web::ContextMenuParams params) {
+                            web::ContextMenuParams params,
+                            UIViewController* presentingViewController) {
   // No context menu elements added for tests.
   return false;
 }
diff --git a/ios/public/provider/chrome/browser/context_menu/context_menu_api.h b/ios/public/provider/chrome/browser/context_menu/context_menu_api.h
index 0983ae9..4b78733 100644
--- a/ios/public/provider/chrome/browser/context_menu/context_menu_api.h
+++ b/ios/public/provider/chrome/browser/context_menu/context_menu_api.h
@@ -23,7 +23,8 @@
 bool AddContextMenuElements(NSMutableArray<UIMenuElement*>* menu_elements,
                             ChromeBrowserState* browser_state,
                             web::WebState* web_state,
-                            web::ContextMenuParams params);
+                            web::ContextMenuParams params,
+                            UIViewController* presentingViewController);
 
 }  // namespace provider
 }  // namespace ios
diff --git a/media/base/media_switches.cc b/media/base/media_switches.cc
index 3071f55..0389be8 100644
--- a/media/base/media_switches.cc
+++ b/media/base/media_switches.cc
@@ -274,14 +274,11 @@
 #endif
 };
 
-#if BUILDFLAG(ENABLE_PLATFORM_HEVC) &&                                       \
-    (BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS) || \
-     BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX))
+#if BUILDFLAG(ENABLE_PLATFORM_HEVC)
 // Enables HEVC hardware accelerated decoding.
 const base::Feature kPlatformHEVCDecoderSupport{
     "PlatformHEVCDecoderSupport", base::FEATURE_DISABLED_BY_DEFAULT};
-#endif  // BUILDFLAG(ENABLE_PLATFORM_HEVC) && (IS_ANDROID || IS_WIN || IS_CROS
-        // || IS_MAC || IS_LINUX)
+#endif  // BUILDFLAG(ENABLE_PLATFORM_HEVC)
 
 // Only decode preload=metadata elements upon visibility.
 // TODO(crbug.com/879406): Remove this after M76 ships to stable
diff --git a/media/base/media_switches.h b/media/base/media_switches.h
index ea1d3b74..a984bede 100644
--- a/media/base/media_switches.h
+++ b/media/base/media_switches.h
@@ -180,12 +180,9 @@
 MEDIA_EXPORT extern const base::Feature kOverlayFullscreenVideo;
 MEDIA_EXPORT extern const base::Feature kPictureInPicture;
 MEDIA_EXPORT extern const base::Feature kPlatformAudioEncoder;
-#if BUILDFLAG(ENABLE_PLATFORM_HEVC) &&                                       \
-    (BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS) || \
-     BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX))
+#if BUILDFLAG(ENABLE_PLATFORM_HEVC)
 MEDIA_EXPORT extern const base::Feature kPlatformHEVCDecoderSupport;
-#endif  // BUILDFLAG(ENABLE_PLATFORM_HEVC) && (IS_ANDROID || IS_WIN || IS_CROS
-        // || IS_MAC || IS_LINUX)
+#endif  // BUILDFLAG(ENABLE_PLATFORM_HEVC)
 MEDIA_EXPORT extern const base::Feature kPlaybackSpeedButton;
 MEDIA_EXPORT extern const base::Feature kPreloadMediaEngagementData;
 MEDIA_EXPORT extern const base::Feature kPreloadMetadataLazyLoad;
diff --git a/media/base/video_codecs.cc b/media/base/video_codecs.cc
index be3270a..4af7ed4 100644
--- a/media/base/video_codecs.cc
+++ b/media/base/video_codecs.cc
@@ -723,59 +723,69 @@
     return false;
   }
 
-  if (profile) {
-    // Spec A.3.8
-    if (general_profile_idc == 11 ||
-        (general_profile_compatibility_flags & 1024)) {
-      *profile = HEVCPROFILE_HIGH_THROUGHPUT_SCREEN_EXTENDED;
-    }
-    // Spec H.11.1.2
-    if (general_profile_idc == 10 ||
-        (general_profile_compatibility_flags & 512)) {
-      *profile = HEVCPROFILE_SCALABLE_REXT;
-    }
-    // Spec A.3.7
-    if (general_profile_idc == 9 ||
-        (general_profile_compatibility_flags & 256)) {
-      *profile = HEVCPROFILE_SCREEN_EXTENDED;
-    }
-    // Spec I.11.1.1
-    if (general_profile_idc == 8 ||
-        (general_profile_compatibility_flags & 128)) {
-      *profile = HEVCPROFILE_3D_MAIN;
-    }
-    // Spec H.11.1.1
-    if (general_profile_idc == 7 ||
-        (general_profile_compatibility_flags & 64)) {
-      *profile = HEVCPROFILE_SCALABLE_MAIN;
-    }
-    // Spec G.11.1.1
-    if (general_profile_idc == 6 ||
-        (general_profile_compatibility_flags & 32)) {
-      *profile = HEVCPROFILE_MULTIVIEW_MAIN;
-    }
-    // Spec A.3.6
-    if (general_profile_idc == 5 ||
-        (general_profile_compatibility_flags & 16)) {
-      *profile = HEVCPROFILE_HIGH_THROUGHPUT;
-    }
-    // Spec A.3.5
-    if (general_profile_idc == 4 || (general_profile_compatibility_flags & 8)) {
-      *profile = HEVCPROFILE_REXT;
-    }
-    // Spec A.3.4
-    if (general_profile_idc == 3 || (general_profile_compatibility_flags & 4)) {
-      *profile = HEVCPROFILE_MAIN_STILL_PICTURE;
-    }
-    // Spec A.3.3
-    if (general_profile_idc == 2 || (general_profile_compatibility_flags & 2)) {
-      *profile = HEVCPROFILE_MAIN10;
-    }
-    // Spec A.3.2
-    if (general_profile_idc == 1 || (general_profile_compatibility_flags & 1)) {
-      *profile = HEVCPROFILE_MAIN;
-    }
+  VideoCodecProfile out_profile = VIDEO_CODEC_PROFILE_UNKNOWN;
+  // Spec A.3.8
+  if (general_profile_idc == 11 ||
+      (general_profile_compatibility_flags & 2048)) {
+    out_profile = HEVCPROFILE_HIGH_THROUGHPUT_SCREEN_EXTENDED;
   }
+  // Spec H.11.1.2
+  if (general_profile_idc == 10 ||
+      (general_profile_compatibility_flags & 1024)) {
+    out_profile = HEVCPROFILE_SCALABLE_REXT;
+  }
+  // Spec A.3.7
+  if (general_profile_idc == 9 || (general_profile_compatibility_flags & 512)) {
+    out_profile = HEVCPROFILE_SCREEN_EXTENDED;
+  }
+  // Spec I.11.1.1
+  if (general_profile_idc == 8 || (general_profile_compatibility_flags & 256)) {
+    out_profile = HEVCPROFILE_3D_MAIN;
+  }
+  // Spec H.11.1.1
+  if (general_profile_idc == 7 || (general_profile_compatibility_flags & 128)) {
+    out_profile = HEVCPROFILE_SCALABLE_MAIN;
+  }
+  // Spec G.11.1.1
+  if (general_profile_idc == 6 || (general_profile_compatibility_flags & 64)) {
+    out_profile = HEVCPROFILE_MULTIVIEW_MAIN;
+  }
+  // Spec A.3.6
+  if (general_profile_idc == 5 || (general_profile_compatibility_flags & 32)) {
+    out_profile = HEVCPROFILE_HIGH_THROUGHPUT;
+  }
+  // Spec A.3.5
+  if (general_profile_idc == 4 || (general_profile_compatibility_flags & 16)) {
+    out_profile = HEVCPROFILE_REXT;
+  }
+  // Spec A.3.3
+  // NOTICE: Do not change the order of below sections
+  if (general_profile_idc == 2 || (general_profile_compatibility_flags & 4)) {
+    out_profile = HEVCPROFILE_MAIN10;
+  }
+  // Spec A.3.2
+  // When general_profile_compatibility_flag[1] is equal to 1,
+  // general_profile_compatibility_flag[2] should be equal to 1 as well.
+  if (general_profile_idc == 1 || (general_profile_compatibility_flags & 2)) {
+    out_profile = HEVCPROFILE_MAIN;
+  }
+  // Spec A.3.4
+  // When general_profile_compatibility_flag[3] is equal to 1,
+  // general_profile_compatibility_flag[1] and
+  // general_profile_compatibility_flag[2] should be equal to 1 as well.
+  if (general_profile_idc == 3 || (general_profile_compatibility_flags & 8)) {
+    out_profile = HEVCPROFILE_MAIN_STILL_PICTURE;
+  }
+
+  if (out_profile == VIDEO_CODEC_PROFILE_UNKNOWN) {
+    DVLOG(1) << "Warning: unrecognized HEVC/H.265 general_profile_idc: "
+             << general_profile_idc << ", general_profile_compatibility_flags: "
+             << general_profile_compatibility_flags;
+    return false;
+  }
+
+  if (profile)
+    *profile = out_profile;
 
   uint8_t general_tier_flag;
   if (elem[3].size() > 0 && (elem[3][0] == 'L' || elem[3][0] == 'H')) {
diff --git a/media/base/video_codecs_unittest.cc b/media/base/video_codecs_unittest.cc
index c5ac4c5..0fd5f63 100644
--- a/media/base/video_codecs_unittest.cc
+++ b/media/base/video_codecs_unittest.cc
@@ -513,12 +513,94 @@
   // decimal-encoded number (between 0 and 31)
   EXPECT_TRUE(ParseHEVCCodecId("hvc1.0.6.L93.B0", &profile, &level_idc));
   EXPECT_TRUE(ParseHEVCCodecId("hvc1.31.6.L93.B0", &profile, &level_idc));
+  // Spec A.3.2
+  // When general_profile_compatibility_flag[1] is equal to 1,
+  // general_profile_compatibility_flag[2] should be equal to 1 as well.
   EXPECT_TRUE(ParseHEVCCodecId("hvc1.1.6.L93.B0", &profile, &level_idc));
   EXPECT_EQ(profile, HEVCPROFILE_MAIN);
-  EXPECT_TRUE(ParseHEVCCodecId("hvc1.2.2.L93.B0", &profile, &level_idc));
+  EXPECT_TRUE(ParseHEVCCodecId("hvc1.1.0.L93.B0", &profile, &level_idc));
+  EXPECT_EQ(profile, HEVCPROFILE_MAIN);
+  EXPECT_TRUE(ParseHEVCCodecId("hvc1.0.6.L93.B0", &profile, &level_idc));
+  EXPECT_EQ(profile, HEVCPROFILE_MAIN);
+  // Spec A.3.3
+  EXPECT_TRUE(ParseHEVCCodecId("hvc1.2.4.L93.B0", &profile, &level_idc));
   EXPECT_EQ(profile, HEVCPROFILE_MAIN10);
-  EXPECT_TRUE(ParseHEVCCodecId("hvc1.3.4.L93.B0", &profile, &level_idc));
+  EXPECT_TRUE(ParseHEVCCodecId("hvc1.2.0.L93.B0", &profile, &level_idc));
+  EXPECT_EQ(profile, HEVCPROFILE_MAIN10);
+  EXPECT_TRUE(ParseHEVCCodecId("hvc1.0.4.L93.B0", &profile, &level_idc));
+  EXPECT_EQ(profile, HEVCPROFILE_MAIN10);
+  // Spec A.3.4
+  // When general_profile_compatibility_flag[3] is equal to 1,
+  // general_profile_compatibility_flag[1] and
+  // general_profile_compatibility_flag[2] should be equal to 1 as well.
+  EXPECT_TRUE(ParseHEVCCodecId("hvc1.3.E.L93.B0", &profile, &level_idc));
   EXPECT_EQ(profile, HEVCPROFILE_MAIN_STILL_PICTURE);
+  EXPECT_TRUE(ParseHEVCCodecId("hvc1.0.E.L93.B0", &profile, &level_idc));
+  EXPECT_EQ(profile, HEVCPROFILE_MAIN_STILL_PICTURE);
+  EXPECT_TRUE(ParseHEVCCodecId("hvc1.3.0.L93.B0", &profile, &level_idc));
+  EXPECT_EQ(profile, HEVCPROFILE_MAIN_STILL_PICTURE);
+  // Spec A.3.5
+  EXPECT_TRUE(ParseHEVCCodecId("hvc1.4.10.L93.B0", &profile, &level_idc));
+  EXPECT_EQ(profile, HEVCPROFILE_REXT);
+  EXPECT_TRUE(ParseHEVCCodecId("hvc1.4.0.L93.B0", &profile, &level_idc));
+  EXPECT_EQ(profile, HEVCPROFILE_REXT);
+  EXPECT_TRUE(ParseHEVCCodecId("hvc1.0.10.L93.B0", &profile, &level_idc));
+  EXPECT_EQ(profile, HEVCPROFILE_REXT);
+  // Spec A.3.6
+  EXPECT_TRUE(ParseHEVCCodecId("hvc1.5.20.L93.B0", &profile, &level_idc));
+  EXPECT_EQ(profile, HEVCPROFILE_HIGH_THROUGHPUT);
+  EXPECT_TRUE(ParseHEVCCodecId("hvc1.5.0.L93.B0", &profile, &level_idc));
+  EXPECT_EQ(profile, HEVCPROFILE_HIGH_THROUGHPUT);
+  EXPECT_TRUE(ParseHEVCCodecId("hvc1.0.20.L93.B0", &profile, &level_idc));
+  EXPECT_EQ(profile, HEVCPROFILE_HIGH_THROUGHPUT);
+  // Spec G.11.1.1
+  EXPECT_TRUE(ParseHEVCCodecId("hvc1.6.40.L93.B0", &profile, &level_idc));
+  EXPECT_EQ(profile, HEVCPROFILE_MULTIVIEW_MAIN);
+  EXPECT_TRUE(ParseHEVCCodecId("hvc1.6.0.L93.B0", &profile, &level_idc));
+  EXPECT_EQ(profile, HEVCPROFILE_MULTIVIEW_MAIN);
+  EXPECT_TRUE(ParseHEVCCodecId("hvc1.0.40.L93.B0", &profile, &level_idc));
+  EXPECT_EQ(profile, HEVCPROFILE_MULTIVIEW_MAIN);
+  // Spec H.11.1.1
+  EXPECT_TRUE(ParseHEVCCodecId("hvc1.7.80.L93.B0", &profile, &level_idc));
+  EXPECT_EQ(profile, HEVCPROFILE_SCALABLE_MAIN);
+  EXPECT_TRUE(ParseHEVCCodecId("hvc1.7.0.L93.B0", &profile, &level_idc));
+  EXPECT_EQ(profile, HEVCPROFILE_SCALABLE_MAIN);
+  EXPECT_TRUE(ParseHEVCCodecId("hvc1.0.80.L93.B0", &profile, &level_idc));
+  EXPECT_EQ(profile, HEVCPROFILE_SCALABLE_MAIN);
+  // Spec I.11.1.1
+  EXPECT_TRUE(ParseHEVCCodecId("hvc1.8.100.L93.B0", &profile, &level_idc));
+  EXPECT_EQ(profile, HEVCPROFILE_3D_MAIN);
+  EXPECT_TRUE(ParseHEVCCodecId("hvc1.8.0.L93.B0", &profile, &level_idc));
+  EXPECT_EQ(profile, HEVCPROFILE_3D_MAIN);
+  EXPECT_TRUE(ParseHEVCCodecId("hvc1.0.100.L93.B0", &profile, &level_idc));
+  EXPECT_EQ(profile, HEVCPROFILE_3D_MAIN);
+  // Spec A.3.7
+  EXPECT_TRUE(ParseHEVCCodecId("hvc1.9.200.L93.B0", &profile, &level_idc));
+  EXPECT_EQ(profile, HEVCPROFILE_SCREEN_EXTENDED);
+  EXPECT_TRUE(ParseHEVCCodecId("hvc1.9.0.L93.B0", &profile, &level_idc));
+  EXPECT_EQ(profile, HEVCPROFILE_SCREEN_EXTENDED);
+  EXPECT_TRUE(ParseHEVCCodecId("hvc1.0.200.L93.B0", &profile, &level_idc));
+  EXPECT_EQ(profile, HEVCPROFILE_SCREEN_EXTENDED);
+  // Spec H.11.1.2
+  EXPECT_TRUE(ParseHEVCCodecId("hvc1.10.400.L93.B0", &profile, &level_idc));
+  EXPECT_EQ(profile, HEVCPROFILE_SCALABLE_REXT);
+  EXPECT_TRUE(ParseHEVCCodecId("hvc1.10.0.L93.B0", &profile, &level_idc));
+  EXPECT_EQ(profile, HEVCPROFILE_SCALABLE_REXT);
+  EXPECT_TRUE(ParseHEVCCodecId("hvc1.0.400.L93.B0", &profile, &level_idc));
+  EXPECT_EQ(profile, HEVCPROFILE_SCALABLE_REXT);
+  // Spec A.3.8
+  EXPECT_TRUE(ParseHEVCCodecId("hvc1.11.800.L93.B0", &profile, &level_idc));
+  EXPECT_EQ(profile, HEVCPROFILE_HIGH_THROUGHPUT_SCREEN_EXTENDED);
+  EXPECT_TRUE(ParseHEVCCodecId("hvc1.11.0.L93.B0", &profile, &level_idc));
+  EXPECT_EQ(profile, HEVCPROFILE_HIGH_THROUGHPUT_SCREEN_EXTENDED);
+  EXPECT_TRUE(ParseHEVCCodecId("hvc1.0.800.L93.B0", &profile, &level_idc));
+  EXPECT_EQ(profile, HEVCPROFILE_HIGH_THROUGHPUT_SCREEN_EXTENDED);
+
+  // Unmatched general_profile_idc and general_profile_compatibility_flags
+  EXPECT_FALSE(ParseHEVCCodecId("hvc1.12.1000.L93.B0", &profile, &level_idc));
+  EXPECT_FALSE(ParseHEVCCodecId("hvc1.12.0.L93.B0", &profile, &level_idc));
+  EXPECT_FALSE(ParseHEVCCodecId("hvc1.0.1000.L93.B0", &profile, &level_idc));
+
   EXPECT_FALSE(ParseHEVCCodecId("hvc1.-1.6.L93.B0", &profile, &level_idc));
   EXPECT_FALSE(ParseHEVCCodecId("hvc1.32.6.L93.B0", &profile, &level_idc));
   EXPECT_FALSE(ParseHEVCCodecId("hvc1.999.6.L93.B0", &profile, &level_idc));
diff --git a/media/cdm/win/media_foundation_cdm_util.cc b/media/cdm/win/media_foundation_cdm_util.cc
index 12e9402..6ab78f60 100644
--- a/media/cdm/win/media_foundation_cdm_util.cc
+++ b/media/cdm/win/media_foundation_cdm_util.cc
@@ -8,10 +8,10 @@
 #include <initguid.h>  // Needed for DEFINE_PROPERTYKEY to work properly.
 #include <mferror.h>
 #include <propkeydef.h>  // Needed for DEFINE_PROPERTYKEY.
-#include <propvarutil.h>
 
 #include "base/files/file_util.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/win/propvarutil.h"
 #include "base/win/scoped_propvariant.h"
 #include "media/base/win/mf_helpers.h"
 #include "media/cdm/cdm_paths.h"
diff --git a/mojo/public/tools/bindings/checks/mojom_attributes_check.py b/mojo/public/tools/bindings/checks/mojom_attributes_check.py
index fd15dfd..6b0c66c 100644
--- a/mojo/public/tools/bindings/checks/mojom_attributes_check.py
+++ b/mojo/public/tools/bindings/checks/mojom_attributes_check.py
@@ -81,9 +81,6 @@
 # TODO(https://crbug.com/1193875) empty this set and remove the allowlist.
 _STABLE_ONLY_ALLOWLISTED_ENUMS = {
     'crosapi.mojom.OptionalBool',
-    'crosapi.mojom.RequestActivityIconsStatus',
-    'crosapi.mojom.RequestTextSelectionActionsStatus',
-    'crosapi.mojom.RequestUrlHandlerListStatus',
     'crosapi.mojom.TriState',
 }
 
diff --git a/net/dns/host_resolver.h b/net/dns/host_resolver.h
index 8d7229c..bf866d77 100644
--- a/net/dns/host_resolver.h
+++ b/net/dns/host_resolver.h
@@ -56,6 +56,8 @@
 // See mock_host_resolver.h for test implementations.
 class NET_EXPORT HostResolver {
  public:
+  using Host = absl::variant<url::SchemeHostPort, HostPortPair>;
+
   // Handler for an individual host resolution request. Created by
   // HostResolver::CreateRequest().
   class ResolveHostRequest {
diff --git a/net/dns/host_resolver_manager.cc b/net/dns/host_resolver_manager.cc
index 582f8ff..d9b8f68 100644
--- a/net/dns/host_resolver_manager.cc
+++ b/net/dns/host_resolver_manager.cc
@@ -467,8 +467,7 @@
   return dict;
 }
 
-base::Value ToLogStringValue(
-    const absl::variant<url::SchemeHostPort, HostPortPair>& host) {
+base::Value ToLogStringValue(const HostResolver::Host& host) {
   if (absl::holds_alternative<url::SchemeHostPort>(host))
     return base::Value(absl::get<url::SchemeHostPort>(host).Serialize());
 
@@ -493,8 +492,7 @@
   return base::StringPiece();
 }
 
-base::StringPiece GetHostname(
-    const absl::variant<url::SchemeHostPort, HostPortPair>& host) {
+base::StringPiece GetHostname(const HostResolver::Host& host) {
   if (absl::holds_alternative<url::SchemeHostPort>(host)) {
     base::StringPiece hostname = absl::get<url::SchemeHostPort>(host).host();
     if (hostname.size() >= 2 && hostname.front() == '[' &&
@@ -521,7 +519,7 @@
   return absl::get<std::string>(host);
 }
 
-uint16_t GetPort(const absl::variant<url::SchemeHostPort, HostPortPair>& host) {
+uint16_t GetPort(const HostResolver::Host& host) {
   if (absl::holds_alternative<url::SchemeHostPort>(host)) {
     return absl::get<url::SchemeHostPort>(host).port();
   }
@@ -533,7 +531,7 @@
 // (or the query is explicitly for HTTPS). Otherwise DNS will not give different
 // results for the same hostname.
 absl::variant<url::SchemeHostPort, std::string> CreateHostForJobKey(
-    const absl::variant<url::SchemeHostPort, HostPortPair>& input,
+    const HostResolver::Host& input,
     DnsQueryType query_type) {
   if ((base::FeatureList::IsEnabled(features::kUseDnsHttpsSvcb) ||
        query_type == DnsQueryType::HTTPS) &&
@@ -605,7 +603,7 @@
       public base::LinkNode<HostResolverManager::RequestImpl> {
  public:
   RequestImpl(NetLogWithSource source_net_log,
-              absl::variant<url::SchemeHostPort, HostPortPair> request_host,
+              HostResolver::Host request_host,
               NetworkIsolationKey network_isolation_key,
               absl::optional<ResolveHostParameters> optional_parameters,
               base::WeakPtr<ResolveContext> resolve_context,
@@ -780,9 +778,7 @@
   // NetLog for the source, passed in HostResolver::Resolve.
   const NetLogWithSource& source_net_log() { return source_net_log_; }
 
-  const absl::variant<url::SchemeHostPort, HostPortPair>& request_host() const {
-    return request_host_;
-  }
+  const HostResolver::Host& request_host() const { return request_host_; }
 
   const NetworkIsolationKey& network_isolation_key() const {
     return network_isolation_key_;
@@ -890,7 +886,7 @@
 
   const NetLogWithSource source_net_log_;
 
-  const absl::variant<url::SchemeHostPort, HostPortPair> request_host_;
+  const HostResolver::Host request_host_;
   const NetworkIsolationKey network_isolation_key_;
   ResolveHostParameters parameters_;
   base::WeakPtr<ResolveContext> resolve_context_;
@@ -3215,7 +3211,7 @@
 
 std::unique_ptr<HostResolver::ResolveHostRequest>
 HostResolverManager::CreateRequest(
-    absl::variant<url::SchemeHostPort, HostPortPair> host,
+    HostResolver::Host host,
     NetworkIsolationKey network_isolation_key,
     NetLogWithSource net_log,
     absl::optional<ResolveHostParameters> optional_parameters,
diff --git a/net/dns/host_resolver_manager.h b/net/dns/host_resolver_manager.h
index fa8b5a7..9a20bf8 100644
--- a/net/dns/host_resolver_manager.h
+++ b/net/dns/host_resolver_manager.h
@@ -147,7 +147,7 @@
   // TODO(crbug.com/1022059): Use the HostCache out of the ResolveContext
   // instead of passing it separately.
   std::unique_ptr<HostResolver::ResolveHostRequest> CreateRequest(
-      absl::variant<url::SchemeHostPort, HostPortPair> host,
+      HostResolver::Host host,
       NetworkIsolationKey network_isolation_key,
       NetLogWithSource net_log,
       absl::optional<ResolveHostParameters> optional_parameters,
diff --git a/net/dns/mock_host_resolver.cc b/net/dns/mock_host_resolver.cc
index 75b7e7e..6ac17d0a 100644
--- a/net/dns/mock_host_resolver.cc
+++ b/net/dns/mock_host_resolver.cc
@@ -72,16 +72,14 @@
 // TTL for the successful resolutions. Failures are not cached.
 const unsigned kCacheEntryTTLSeconds = 60;
 
-base::StringPiece GetScheme(
-    const absl::variant<url::SchemeHostPort, HostPortPair>& endpoint) {
+base::StringPiece GetScheme(const HostResolver::Host& endpoint) {
   DCHECK(absl::holds_alternative<url::SchemeHostPort>(endpoint));
   return absl::get<url::SchemeHostPort>(endpoint).scheme();
 }
 
 // In HostPortPair format (no brackets around IPv6 literals) purely for
 // compatibility with IPAddress::AssignFromIPLiteral().
-base::StringPiece GetHostname(
-    const absl::variant<url::SchemeHostPort, HostPortPair>& endpoint) {
+base::StringPiece GetHostname(const HostResolver::Host& endpoint) {
   if (absl::holds_alternative<url::SchemeHostPort>(endpoint)) {
     base::StringPiece hostname =
         absl::get<url::SchemeHostPort>(endpoint).host();
@@ -96,8 +94,7 @@
   return absl::get<HostPortPair>(endpoint).host();
 }
 
-uint16_t GetPort(
-    const absl::variant<url::SchemeHostPort, HostPortPair>& endpoint) {
+uint16_t GetPort(const HostResolver::Host& endpoint) {
   if (absl::holds_alternative<url::SchemeHostPort>(endpoint))
     return absl::get<url::SchemeHostPort>(endpoint).port();
 
@@ -106,7 +103,7 @@
 }
 
 absl::variant<url::SchemeHostPort, std::string> GetCacheHost(
-    const absl::variant<url::SchemeHostPort, HostPortPair>& endpoint) {
+    const HostResolver::Host& endpoint) {
   if (absl::holds_alternative<url::SchemeHostPort>(endpoint))
     return absl::get<url::SchemeHostPort>(endpoint);
 
@@ -136,7 +133,7 @@
 class MockHostResolverBase::RequestImpl
     : public HostResolver::ResolveHostRequest {
  public:
-  RequestImpl(absl::variant<url::SchemeHostPort, HostPortPair> request_endpoint,
+  RequestImpl(Host request_endpoint,
               const NetworkIsolationKey& network_isolation_key,
               const absl::optional<ResolveHostParameters>& optional_parameters,
               base::WeakPtr<MockHostResolverBase> resolver)
@@ -314,10 +311,7 @@
     std::move(callback_).Run(error);
   }
 
-  const absl::variant<url::SchemeHostPort, HostPortPair>& request_endpoint()
-      const {
-    return request_endpoint_;
-  }
+  const Host& request_endpoint() const { return request_endpoint_; }
 
   const NetworkIsolationKey& network_isolation_key() const {
     return network_isolation_key_;
@@ -375,7 +369,7 @@
     return corrected;
   }
 
-  const absl::variant<url::SchemeHostPort, HostPortPair> request_endpoint_;
+  const Host request_endpoint_;
   const NetworkIsolationKey network_isolation_key_;
   const ResolveHostParameters parameters_;
   RequestPriority priority_;
@@ -519,7 +513,7 @@
 
 const MockHostResolverBase::RuleResolver::RuleResult&
 MockHostResolverBase::RuleResolver::Resolve(
-    const absl::variant<url::SchemeHostPort, HostPortPair>& request_endpoint,
+    const Host& request_endpoint,
     DnsQueryTypeSet request_types,
     HostResolverSource request_source) const {
   for (const auto& rule : rules_) {
@@ -749,7 +743,7 @@
 }
 
 int MockHostResolverBase::LoadIntoCache(
-    const absl::variant<url::SchemeHostPort, HostPortPair>& endpoint,
+    const Host& endpoint,
     const NetworkIsolationKey& network_isolation_key,
     const absl::optional<ResolveHostParameters>& optional_parameters) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
@@ -954,7 +948,7 @@
 }
 
 int MockHostResolverBase::ResolveFromIPLiteralOrCache(
-    const absl::variant<url::SchemeHostPort, HostPortPair>& endpoint,
+    const Host& endpoint,
     const NetworkIsolationKey& network_isolation_key,
     DnsQueryType dns_query_type,
     HostResolverFlags flags,
diff --git a/net/dns/mock_host_resolver.h b/net/dns/mock_host_resolver.h
index 7b26026..fb00c7b7 100644
--- a/net/dns/mock_host_resolver.h
+++ b/net/dns/mock_host_resolver.h
@@ -154,11 +154,9 @@
     RuleResolver(RuleResolver&&);
     RuleResolver& operator=(RuleResolver&&);
 
-    const RuleResult& Resolve(
-        const absl::variant<url::SchemeHostPort, HostPortPair>&
-            request_endpoint,
-        DnsQueryTypeSet request_types,
-        HostResolverSource request_source) const;
+    const RuleResult& Resolve(const Host& request_endpoint,
+                              DnsQueryTypeSet request_types,
+                              HostResolverSource request_source) const;
 
     void ClearRules();
 
@@ -286,7 +284,7 @@
   // Preloads the cache with what would currently be the result of a request
   // with the given parameters. Returns the net error of the cached result.
   int LoadIntoCache(
-      const absl::variant<url::SchemeHostPort, HostPortPair>& endpoint,
+      const Host& endpoint,
       const NetworkIsolationKey& network_isolation_key,
       const absl::optional<ResolveHostParameters>& optional_parameters);
 
@@ -402,7 +400,7 @@
   // Resolve as IP or from |cache_| return cached error or
   // DNS_CACHE_MISS if failed.
   int ResolveFromIPLiteralOrCache(
-      const absl::variant<url::SchemeHostPort, HostPortPair>& endpoint,
+      const Host& endpoint,
       const NetworkIsolationKey& network_isolation_key,
       DnsQueryType dns_query_type,
       HostResolverFlags flags,
diff --git a/net/http/transport_security_state_static.json b/net/http/transport_security_state_static.json
index 4daa172..86f4d6b 100644
--- a/net/http/transport_security_state_static.json
+++ b/net/http/transport_security_state_static.json
@@ -1492,7 +1492,6 @@
     { "name": "samizdat.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "sslmate.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "steventress.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "tekshrek.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "temehu.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "tobias-kluge.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "vortexhobbies.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -1577,8 +1576,6 @@
     { "name": "onedot.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "powerplannerapp.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ru-sprachstudio.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "slidebatch.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "smartship.co.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "southside-crew.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "tickopa.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "wieninternational.at", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -3875,7 +3872,6 @@
     { "name": "npmcdn.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "opsbears.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "otchecker.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "penfold.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "pgmann.cf", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "pier28.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "piligrimname.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -4445,7 +4441,6 @@
     { "name": "gosuland.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "guguke.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "hacker.one", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "haucke.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "hdm.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "hds-lan.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "henriksen.is", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -4457,7 +4452,6 @@
     { "name": "ikvts.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "interaffairs.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "isitamor.pm", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "jamesconroyfinn.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "kanna.cf", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "kilobyte22.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "komoju.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -4551,7 +4545,6 @@
     { "name": "vfdworld.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "viperdns.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "w.wiki", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "wevolver.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "wf-hosting.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "wfh.ovh", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "wfh.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -4908,7 +4901,6 @@
     { "name": "xdd.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "xiangweiqing.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "xkviz.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "xuexb.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "xwaretech.info", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "y-s.pw", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "youcontrol.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -5270,7 +5262,6 @@
     { "name": "am3.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ambiente.one", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ancientkarma.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "andreaboero.it", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "andrewmichaud.beer", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "andrewmichaud.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "anitaalbersen.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -5752,7 +5743,6 @@
     { "name": "lunarift.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "luther.fi", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "luukklene.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "lv0.it", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "lzzr.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "macchaberrycream.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "maddin.ga", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -5847,7 +5837,6 @@
     { "name": "notadd.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ntbs.pro", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "nuxer.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "nyan.it", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "octav.name", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "octothorpe.club", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ollie.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -5927,11 +5916,9 @@
     { "name": "rapenroer.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "rauros.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "raydan.space", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "rbensch.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "reachr.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "reactivarte.es", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "readonly.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "rednsx.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "regionale.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "regmyr.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "reisyukaku.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -6087,7 +6074,6 @@
     { "name": "trik.es", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "trollscave.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "trustmeimfancy.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "tsumi.it", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "tty.space", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "tuvalie.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "uat-activesg.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -6410,7 +6396,6 @@
     { "name": "jamesmorrison.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "janokacer.sk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "jaot.info", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "jasonrobinson.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "jasperhammink.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "javalestari.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "jayschulman.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -6554,7 +6539,6 @@
     { "name": "payfreez.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "pear2pear.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "peervpn.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "pennyapp.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "perot.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "petchart.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "petravdbos.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -7114,7 +7098,6 @@
     { "name": "coinessa.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "comfortticket.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "comparamejor.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "compareandrecycle.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "comparetravelinsurance.com.au", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "contarkos.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cookinglife.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -7439,7 +7422,6 @@
     { "name": "uplinklabs.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "uptic.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "us-immigration.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "uscitizenship.info", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "useresponse.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "usimmigration.us", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "usitcolours.bg", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -8157,7 +8139,6 @@
     { "name": "directebanking.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "discipul.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "disposable.link", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "dixiediner.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "dizihocasi.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "djlive.pl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "djxmmx.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -9466,7 +9447,6 @@
     { "name": "stagingjobshq.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "stahl.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "starmusic.ga", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "stash.ai", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "stateofexception.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "static.or.at", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "stationnementdenuit.ca", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -11375,7 +11355,6 @@
     { "name": "raphael.li", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "rastreador.com.es", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "readism.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "readmeeatmedrinkme.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "rebekaesgabor.online", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "refitplanner.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "rentbrowser.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -12205,7 +12184,6 @@
     { "name": "ixio.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "jadopado.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "jakereynolds.co", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "jamesf.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "jamesgreenfield.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "jamourtney.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "janverlaan.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -13296,7 +13274,6 @@
     { "name": "cafe-murr.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "beehive42.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "condosforcash.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "collectosaurus.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "beehive42.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "centrojovencuenca.es", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "chint.ai", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -13350,7 +13327,6 @@
     { "name": "cuvva.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cuvva.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cuvva.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "cuvva.insure", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cuvva.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cuvva.us", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "convert.im", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -14450,7 +14426,6 @@
     { "name": "supersonnig-festival.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "sweep-me.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "tbuchloh.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "studybay.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "tetrarch.co", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "studio-panic.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "solariiknight.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -16747,7 +16722,6 @@
     { "name": "feuerwerksmanufaktur.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "hardtfrieden.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "howsyourhealth.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "herecsrymy.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "head-shop.lt", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "https.jetzt", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "helup.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -19769,7 +19743,6 @@
     { "name": "remonttitekniikka.fi", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "proteinnuts.sk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "rechtsanwalt-koeppen-feucht.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "qirinus.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "respectmyprivacy.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "pastdream.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "resortohshima.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -20509,7 +20482,6 @@
     { "name": "bloomzoomy.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "boatme.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "bocamo.it", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "booq.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "boozinyan.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "bottaerisposta.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "bracho.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -22183,7 +22155,6 @@
     { "name": "donateway.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "dorquelle.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "dostavkakurierom.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "dotconnor.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "dotkniseandroida.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "doubleup.com.au", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "dr-www.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -22266,7 +22237,6 @@
     { "name": "embroidered-stuff.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "emi.im", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "emirichardson.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "emmehair.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "empathogen.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "empathogens.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "emperor-penguin.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -23106,7 +23076,6 @@
     { "name": "lsquo.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "lszj.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ltls.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "ltu.social", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "lubomirkazakov.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "lucasgymnastics.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "lucy.science", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -23419,7 +23388,6 @@
     { "name": "neverwetturkey.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "newfiepedia.ca", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "newknd.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "news47ell.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "newserumforskin.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "nextads.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "nextgenthemes.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -23474,7 +23442,6 @@
     { "name": "nzstudy.ac.nz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "oasis-conference.org.nz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "oberhof.co", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "oberhofdrinks.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "oberhofjuice.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "observatory.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "obyvateleceska.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -23514,7 +23481,6 @@
     { "name": "opcenter.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "open-desk.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "openevic.info", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "openfir.st", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "openings.ninja", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "openitforum.pl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "openrainbow.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -24194,7 +24160,6 @@
     { "name": "system.cf", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "system12.pl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "szyndler.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "tagesmutter-in-bilm.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "taishon.nagoya", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "taiyouko-hatuden.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "takemoto-ped.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -24732,7 +24697,6 @@
     { "name": "22scc.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "55scc.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "605508.cc", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "9ss6.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "6w6.la", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "8833445.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "3xx.link", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -24770,7 +24734,6 @@
     { "name": "adventureswithlillie.ca", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "adzuna.sg", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "abn-consultants.ie", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "0005.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "affordablepapers.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "africantourer.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "3778xl.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -26560,7 +26523,6 @@
     { "name": "negativzinsen.info", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "nicoleoquendo.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "michaeln.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "nishisbma.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "nexus-exit.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "nifume.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "nodariweb.com.ar", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -26793,7 +26755,6 @@
     { "name": "plumpie.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "proctorio.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "pornomens.be", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "potatopro.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "pardnoy.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "plutopia.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "poeg.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -28167,7 +28128,6 @@
     { "name": "cyclingjunkies.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "crowdbox.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ctliu.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "compucastell.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "compredietlight.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "copshop.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "controlautocom.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -28526,7 +28486,6 @@
     { "name": "imoner.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "illuxat.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "hostarea51.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "increasetestosteronelevels.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "infotainworld.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "img.ovh", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "igi.codes", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -28721,7 +28680,6 @@
     { "name": "linkage.ph", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "loqyu.co", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "leclaire.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "lowt.us", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "lovelytimes.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "licence-registry.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "luenwarneke.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -29429,7 +29387,6 @@
     { "name": "swisswebhelp.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "tjl.rocks", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "titanlab.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "thomasetsophie.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "tomticket.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "timbishopartist.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "thuisverpleging-meerdael.be", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -30498,7 +30455,6 @@
     { "name": "nijikata.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "nkautoservice.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "nosyu.pe.kr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "nova-wd.org.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "noyocenter.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "nuamooreaindonesia.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "obamalibrary.gov", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -30811,7 +30767,6 @@
     { "name": "onelawsuit.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "papatest24.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "pik.bzh", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "politeiaudesa.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "psw-consulting.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "quizionic.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "rclsm.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -30964,7 +30919,6 @@
     { "name": "barrera.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "barriofut.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "bartzutow.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "basedonline.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "batiburrillo.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "batteryservice.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "baychimo.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -31176,7 +31130,6 @@
     { "name": "diejanssens.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "dietagespresse.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "diggable.co", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "digicert.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "directtwosolutions.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "direwolfsoftware.ca", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "discount24.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -33832,7 +33785,6 @@
     { "name": "mclinflatables.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mcsinflatables.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mdbouncycastlehirelondon.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mdoering.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mdxdave.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "medicinskavranje.edu.rs", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "medwaybouncycastlehire.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -34985,7 +34937,6 @@
     { "name": "webanker.sh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "webdesignplayground.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "webmotelli.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "websvetaines.lt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "weebsr.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wejumall.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "westhillselectrical.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -35009,7 +34960,6 @@
     { "name": "xuntaosms.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yallamotor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yhwj.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "yibin0831.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yoga-sky.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yubicodemo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zabukovnik.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -35070,7 +35020,6 @@
     { "name": "b1.work", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bankmilhas.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "barsil.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "beforesunrise.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bella.network", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bgfashion.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bingcheung.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -36677,7 +36626,6 @@
     { "name": "gruenderwoche-dresden.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "grumpygamers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gumannp.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "guoliang.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gutschein-spezialist.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "h1z1swap.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ha-kunamatata.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -38093,7 +38041,6 @@
     { "name": "nabytek-valmo.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "namaanakperempuan.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "naphogar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "nashvillelidsurgery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ncc-efm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ncc-efm.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nccemail.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -38686,7 +38633,6 @@
     { "name": "firstinnovationltd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fishexport.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fixingscrews.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "flamet.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "flowcount.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "flyer.tools", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fogpublishingph.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -38948,7 +38894,6 @@
     { "name": "plegro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pleiades.com.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pma-iss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "poffenhouse.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "polanda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "polish-dictionary.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "polish-flag.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -39334,7 +39279,6 @@
     { "name": "cpd-education.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "croeder.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "croncron.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "crownpoint.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cursosgratuitos.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cyberatlantis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cybercareers.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -41113,7 +41057,6 @@
     { "name": "suurhelsinki.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "swerve-media-testbed-03.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sydneylawnandturf.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "taskutark.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tatilmix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tebodental.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "techinsurance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -42334,7 +42277,6 @@
     { "name": "orbu.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "oryva.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "overwall.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "p-fent.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "packetdigital.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "paolo565.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "paradais-sphynx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -50308,7 +50250,6 @@
     { "name": "job-ofertas.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jobsnet.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "joeyvanvenrooij.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "joshuameunier.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "journalism-schools.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "joynadvisors.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "joysinventingblog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -50752,7 +50693,6 @@
     { "name": "worca.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "worcade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "workeria-personal.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "woti.dedyn.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "writer24.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wunschzettel.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wuwuwu.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -51983,7 +51923,6 @@
     { "name": "eta.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "euroflora.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "euroflora.mobi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "eventide.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "evergreenmichigan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "everythinq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "examplesu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -52023,7 +51962,6 @@
     { "name": "francoisbelangerboisclair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "frasesconemocion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "freemanlogistics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "freizeitbad-riff.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "freundinnen-ausflug.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "freundinnen-kurzurlaub.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "freundinnen-urlaub.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -52123,7 +52061,6 @@
     { "name": "iodev.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "iowaent.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "isc2chapter-cny.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "itsuitsyou.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ivsign.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "iwantexchange.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jackassofalltrades.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -52660,7 +52597,6 @@
     { "name": "wheresbuzz.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "whitehats.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "whoami.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "whoisdhh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "whysoslow.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "windforme.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "winter-auszeit.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -53106,7 +53042,6 @@
     { "name": "edit.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "educatek.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "educationmalaysia.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "edwarddekker.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "edwinmattiacci.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ehcommerce.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ehseller.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -53309,7 +53244,6 @@
     { "name": "immarypoppinsyall.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "immersa.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "impera.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "incore.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "inessoftsec.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "inethost.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "informations-echafaudages.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -54200,7 +54134,6 @@
     { "name": "antennistaroma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "antroposboutique.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "apbank.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "arnakdanielian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "asirviablog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "australianairbrushedtattoos.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "australiantemporarytattoos.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -55145,7 +55078,6 @@
     { "name": "teganlaw.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "teganlaw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tekniksnack.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "telco.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "telegram.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tenkdigitalt.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tepautotuning.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -58059,7 +57991,6 @@
     { "name": "harrisconsulting.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "herba-belgie.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "homecompost.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "horgenberg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hummingbird.services", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "huoqibaike.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hydradigital.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -59248,7 +59179,6 @@
     { "name": "nectir-staging.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nectir.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nemausus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "nengzhen.com.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "net-combo-ja.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "netframe.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nextcom.digital", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -59843,7 +59773,6 @@
     { "name": "kowabit.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "krommo.pe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kulopo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "kutip.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "labanote.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lecannabis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "legendcatz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -60457,7 +60386,6 @@
     { "name": "718227.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "718772.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "721167.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "722201.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "726162.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "726176.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "762116.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -60644,7 +60572,6 @@
     { "name": "commlabindia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "comparewatch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "compartirtrenmesaave.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "connectivia.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "controlvoltage.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cooperativa-je.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "corkerscrisps.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -61712,7 +61639,6 @@
     { "name": "mentecuriosa.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "meridianoshop.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mezzehuis.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "microlz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mistine.com.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mistine.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mobydog.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -62296,7 +62222,6 @@
     { "name": "midi-ctes.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mikemooresales.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "minmaxgame.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mistinecn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mm4447761.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mojt.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "monsecretariat.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -63338,7 +63263,6 @@
     { "name": "cezdent.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chestercountypediatrics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chestercountyroboticsurgery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "chip.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cinema.paris", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ckventura.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cliffbreak.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -63370,7 +63294,6 @@
     { "name": "dogforum.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dominik.st", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "doppeleinhorn.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "dotrel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "drghomi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "drpetersenobgynal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "drtristanberry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -63883,7 +63806,6 @@
     { "name": "salaire-minimum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "salt-documentary.blog", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sample-site.click", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "saucelabs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "scale.milano.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "schweingehabt.expert", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "scienceofpeople.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -64512,7 +64434,6 @@
     { "name": "redchip.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "redjuice.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "residence-donatello.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "resumelab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "richardlangham.plumbing", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "richelelahaise.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rioxmarketing.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -65651,10 +65572,8 @@
     { "name": "gulcinulutuna.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hawaiiwho.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "healthfitapp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "heinrich-kleyer-schule.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hereticle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "herrschaftlich-durch-dresden.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "hks-ffm.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hotvideosgalleries.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hudognik.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hunngard.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -65688,7 +65607,6 @@
     { "name": "kbet168.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kensyou.network", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kill.trade", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "kleyer.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "klumba.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kommx.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kriptoworld.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -65728,7 +65646,6 @@
     { "name": "mattadams.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mediation-mv.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "merza.is", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "method.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mfsquad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mickgrimesgamingpodcast.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "model.earth", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -66479,7 +66396,6 @@
     { "name": "patriciaandpaul.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "patrikzk.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pcprkolo.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "pentechealth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "phive.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "physiobiggerawaters.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "physiobroadbeach.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -66811,7 +66727,6 @@
     { "name": "blueeyedmaid.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bluetomatographics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "blumando.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bodybuilding.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bodycaredirect.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bolalocobrews.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bolamarela.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -67183,7 +67098,6 @@
     { "name": "428northampton.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "456666365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "52dashboard.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "66.tn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "7214.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "7214.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "8207d88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -67735,7 +67649,6 @@
     { "name": "3178eee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "333b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "3344985.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "335a.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "33b58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "33n13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "348663.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -69286,7 +69199,6 @@
     { "name": "pivotanimation.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pizzariapartiupizza.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pj21k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "pj21m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pjshop.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "planeta-remontika.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "playingvideojuegos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -71369,7 +71281,6 @@
     { "name": "tech-techno.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "technicalproblem.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "technosapien.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tecnikan.com.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "teleradio.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "terrorblast.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tesdrole.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -71584,7 +71495,6 @@
     { "name": "yak-host.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yamal-online.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yardesign.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ybvip789.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yeti.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yourloan.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yura.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -72113,7 +72023,6 @@
     { "name": "roy-buehring.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rps-auto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rubblerock.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "sa68.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sam66.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sand66.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sanderstech.solutions", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -72746,7 +72655,6 @@
     { "name": "fitnesskarate.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "flixstats.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "food4healthybones.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "frasesdodia.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ftnpower.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fullreggaetonrd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "getinsuranceanywhere.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -73260,7 +73168,6 @@
     { "name": "terselubung.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "theedisoncapital.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "therudeworkout.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "thierrymazue.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tiochambita.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "toddlerleaf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tokky.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -73373,7 +73280,6 @@
     { "name": "camshowplace.to", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "canobag.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "carding.team", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "cas-chauxdefonds.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "celcelulares.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chalupalokovka.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chefkoch.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -73564,7 +73470,6 @@
     { "name": "plandegralba.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "plasticosbiobasados.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "plusreed.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "politsei.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pragata.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "prgrmmr.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "profiservis.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -73953,7 +73858,6 @@
     { "name": "webkindergarten.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wikpa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "williamshomeheat.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "windmyroof.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wingchunboxtribe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "womenshealthadvocate.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xaver.su", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74511,7 +74415,6 @@
     { "name": "okkhor52.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "olive.my", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ollies.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "oneartyminute.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "onlytrong.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "onpointplugins.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "optiekdemeester.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -75531,7 +75434,6 @@
     { "name": "officiants.wedding", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "onlinevergidanismani.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "orablanket.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "otherlandlabs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ounage.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ozli.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pablovaldiviesoar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -75584,7 +75486,6 @@
     { "name": "shixuen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "shotsleeve.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "shulyaka.org.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "simbamail.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sinanaydemir.com.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sneakersmexs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sofaclean.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -77703,7 +77604,6 @@
     { "name": "19990zz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "1datatec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "2y3x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "5i.gs", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "608vets.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "88740b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "a2ch.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -81341,7 +81241,6 @@
     { "name": "outingexpert.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "oyk19bgxj8ljpete71edj2tes-9i4oai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "palatetotable.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "panavision.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "paradisestore.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pasito.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "patystation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -81372,7 +81271,6 @@
     { "name": "ps5ssd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "punjabprime.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pupsikstudio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "pybtex.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pyramid-it.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "q-m.design", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "q-m.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -82400,7 +82298,6 @@
     { "name": "transparentpng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "travelepoch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tripsided.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "trisolaris.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "trixiebooru.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "truesplendid.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "truyentranh24.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -82539,7 +82436,6 @@
     { "name": "zijinbor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zipextractor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zlonov.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zmessages.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zoisfinefood.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zombie.cam", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "077969.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -82648,7 +82544,6 @@
     { "name": "g0158.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gestionadministrativevirtuelle.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gestionadministrativevirtuelle.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "gestionadministrativevirtuelle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "getyourdata.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "glovementor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "go-girlonly.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -83100,7 +82995,6 @@
     { "name": "pyhello.world", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "qdstationary.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "qdstationery.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "qliving.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "quiq-url.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "radarequation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rany.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -84259,7 +84153,6 @@
     { "name": "xn--pascal-klsch-cjb.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xoan.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xotictrends.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "xtom.support", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xyj22.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yachtcita.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yatai18.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -84434,7 +84327,6 @@
     { "name": "bricomium.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "brigade-electronics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "brooklyntheborough.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "brunoamaral.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "buffalowdown.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "burdine-andersoninc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "businessgram.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -84833,7 +84725,6 @@
     { "name": "jorritstollman.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jskarzin.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jumpnplay.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "just4new.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "k88231.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kanzlei-hhh.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kaplanco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -84904,7 +84795,6 @@
     { "name": "liuqiao.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "liuqiaolovecaonali.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "loaded.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "lock-expert.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "looneytunesdashgame.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lordusa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lostproperty.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -85197,7 +85087,6 @@
     { "name": "sceventures.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "schorel.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "schrok.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "schweininchen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "scrapcarremovalmississauga.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "seadrive.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "secluded.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -85721,7 +85610,6 @@
     { "name": "dubrovnikfoodtours.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dudedood.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "duhini.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "dutchplayers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dynadns.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "e-alink.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "e-alive.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -86406,7 +86294,6 @@
     { "name": "ut5s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "utopique.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "v-bokhorst.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "vaccinatiespecialist.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vak-pobeda.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "valentinog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "valioncolonialcompany.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -89748,7 +89635,6 @@
     { "name": "matthewthode.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "maxcleaning.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "maxley.yachts", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "medart-media.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "medcartoon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "metasolutions.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "meww.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -94022,7 +93908,6 @@
     { "name": "johannes-schaefer.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "johncook.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "johnwinter.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "joifur.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jolette-hernandez.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "joletteperu.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jonatan.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -94854,7 +94739,6 @@
     { "name": "mardigrasnapkins.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mare-sylt.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "marga-marga.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "margaridamendessilva.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "maria-kirilenko.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mariachisdequito.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mariaisabel.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -102682,7 +102566,6 @@
     { "name": "kralchat.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kronos-crm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kronos-web.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ktd-design.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "l30019.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "languageatplay.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "laptopnewbie.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -102848,7 +102731,6 @@
     { "name": "reidrice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "renfis.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "resolutesystems.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "retohaeberli.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rexcutty.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "riderchris.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rileystar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -103466,7 +103348,6 @@
     { "name": "teplo-russia.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "termodej.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tescomobile.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "teslasuit.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "theboltway.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thehomemademasks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "theocoffee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -104328,7 +104209,6 @@
     { "name": "officecode.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ofo.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "onedollar.fund", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "onemac.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "openid.net.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "opil.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "optimumcoffeesv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -104430,7 +104310,6 @@
     { "name": "thenova.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "theunleashedpet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thevitpro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "thierrymazue.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thinxtream.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tianbo1088.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tianbo1998.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -105171,7 +105050,6 @@
     { "name": "hemopet.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hemp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hemsfoods.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "hifiaudio.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hindigalaxy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hiracar.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hope21.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -106466,7 +106344,6 @@
     { "name": "theeliteneet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thefireandthefreaks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thefooddictator.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "theguerrilla.agency", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "themindpedia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "theoldnews.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thepaperlion.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -106979,7 +106856,6 @@
     { "name": "snowboard-break.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "solarlider.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sonnenbergharrison.law", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "southessexstatus.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "spacelandpark.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stad.gent", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stanzolo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -108415,7 +108291,6 @@
     { "name": "heijmans.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "helloappservices.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "heraa.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "herefordlighthouse.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "herf.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "herjj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "herq.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -109050,7 +108925,6 @@
     { "name": "osmarks.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "outdoorlearningmap.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "packliberte.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "pae.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "palulu-products.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "paru-design.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pediatricdentistsdaculaga.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -109252,7 +109126,6 @@
     { "name": "bensjamtracks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bestantidandruffshampoo.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "betawi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bhacit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "binproz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bitcoinissafe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "blankhang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -110594,7 +110467,6 @@
     { "name": "icycanada.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ienergizer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ifworlddesignguide.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "igcb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "iiij.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ikwilhuren.nu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "incotive.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -110975,7 +110847,6 @@
     { "name": "sepakbola.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "serasa.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "serpempire.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "sertasimmons.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sertkayagroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sexhab.guru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sexonv.mobi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -111096,7 +110967,6 @@
     { "name": "tradees.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "trailblazercommunitygroups.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "trendingaffords.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tribealive.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "trinitysurfaces.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tuningcarautopecas.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tunnelbroker.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -111346,7 +111216,6 @@
     { "name": "harimata.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "helloclearly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "helminger-lrs.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "henkverlinde.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "highdeserttinyhomes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "homeinet.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hrseoservice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -111431,7 +111300,6 @@
     { "name": "mide.gob.do", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "miltau.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "miltau.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mindera.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "miniso.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "missouriheatingcoolingadvice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "missyapartman.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -111513,7 +111381,6 @@
     { "name": "sharpyspawn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sinkholerepairsflorida.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sky-cargo.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "slashorg.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "snrat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "solofajas.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "spendable.money", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -111558,7 +111425,6 @@
     { "name": "tujardin.casa", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tukebab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tutorials.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "twidy.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ucphotography.net.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "urologyspecialistspc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vante.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -111585,7 +111451,6 @@
     { "name": "wellandwealthy.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "which-reviews.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wimtec.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "windowcleaningexperts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wiska.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wiska.co.kr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wiska.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -111842,7 +111707,6 @@
     { "name": "michaelwmckinney.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mission-gesundheit.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mixify.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mmzztt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "moosikapp.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "msphotographics.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mvcconstruction.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -112130,7 +111994,6 @@
     { "name": "dieselfiltersonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "digi-tec.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dijitalzade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "direct.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "directeca.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "diysonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "djanemagbrasil.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -112518,7 +112381,6 @@
     { "name": "aubepine-restaurant.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "baaradvies.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "babygearessentials.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "beancount.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "belive.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bereikbaargent.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bestestquote.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -113301,7 +113163,6 @@
     { "name": "2-euromuenzen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "3dagentur.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "4peace.gent", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "aalvarezs.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "abandoned.photo", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aboticaprodutosnaturais.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "abplive.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -113583,7 +113444,6 @@
     { "name": "lindbladcruises.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "liuqiao.pp.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "livinglab.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "lligwy.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "loackerbusiness.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lucasferraz.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lumpov.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -113639,7 +113499,6 @@
     { "name": "openarchivaris.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "orionadvisor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "oshens.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ov-chipkaart.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pampers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "passgamer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pastelpixels.studio", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -114708,7 +114567,6 @@
     { "name": "anliting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "anthony.games", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "anthro.asia", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "aperto-nota.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aperto.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "app-cinveninfostream-qa.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "arabicdress.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -114758,7 +114616,6 @@
     { "name": "ccaj.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "celebrationoflifeplanning.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "centralitasbaratas.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "chaturbates.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chriseldon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cintaraso.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cipies.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -115882,7 +115739,6 @@
     { "name": "adarsvidler.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "advercarte.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aebba.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "aelieve.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "afterhaven.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "agitmedia.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "agrotender.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -116407,7 +116263,6 @@
     { "name": "sellbit.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sempoctet.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sendpulse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "sepenggal.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sergal.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sergal.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "servicesurgence24h.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -117284,7 +117139,6 @@
     { "name": "mo-vvs.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mobizat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "modaadesso.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "modded.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "modelflight.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "modenuit.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "moer.tel", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -123113,7 +122967,6 @@
     { "name": "onair.ovh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ondav.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ondrejsramek.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "onefinebaby.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "onejourney.global", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "onestopmedicalsupplies.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "onetestatatime.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -123500,7 +123353,6 @@
     { "name": "tranquilityselfcatering.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "translationsfirm.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "travelknowledge.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "travelmademedoit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "travelstrokes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "traveltains.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "trayvonren.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -124465,7 +124317,6 @@
     { "name": "entrevistadesucesso.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "enythoracicsurgery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eo-literaturo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "epicteller.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "epopia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eravurnet.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ericsaadeonline.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -126652,7 +126503,6 @@
     { "name": "liveevents.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "livemosspointe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "localcleann.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "lokoo.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lokusec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lowies.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lugandbezel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -126968,7 +126818,6 @@
     { "name": "unblockit.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "unemployment.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "unified.show", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "unium.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "unium.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "uplandsnacks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "upr.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -127840,7 +127689,6 @@
     { "name": "fireintheholevideos.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "firmennie-crossovki.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "firmfoundationsconsulting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "first-legion.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fitandslimmerbody.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fitanu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fitodifesa.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -128717,7 +128565,6 @@
     { "name": "pastorello.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "patchagency.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "patentu.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "patience.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "patientup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "patrickcontainerrotator.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "patrikjohan.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -130245,7 +130092,6 @@
     { "name": "hometeamns.sg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "homitov.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "horotoday.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "hostelaciones.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hotbeats.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hotelvisegrad.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "housing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -131284,7 +131130,6 @@
     { "name": "e-pns.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "e-skalniak.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "e34club.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "eandata.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "earthsong.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eaton-daitron.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eax.ninja", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -131293,7 +131138,6 @@
     { "name": "educationplannerbc.ac", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "egzotique.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "elblogdezoe.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "elevated-esthetics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "elmejorcortapelos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "elnababy.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "emlaknabzi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -131811,7 +131655,6 @@
     { "name": "prosperityprojectaz.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "proxybay.how", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pti-property.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "puzzleswaps.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "qitzune.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rabbitcare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "railsimulator.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -131849,7 +131692,6 @@
     { "name": "scaffoldingsandton.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "schatderer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "schumacher-at-home.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "schworak.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "scloud.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "scommessenonaams.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "scootermalagarental.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -131884,7 +131726,6 @@
     { "name": "sitiocasabranca.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sivutoimisto.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "skinnybitch99.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "skipbinsforhire.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "smashbylaney.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "soccerbetwinner.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "socseti.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -133551,7 +133392,6 @@
     { "name": "lumsdens.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lumweb.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lunalya.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "lunaplasticsurgery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "luxurythatlasts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "macrotech.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "madoucefrance.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -134761,7 +134601,6 @@
     { "name": "irareturners.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ironcage.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ironitekstil.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "irr52.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "irscouponsest.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "israelcareersest.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "isystem.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -135378,7 +135217,6 @@
     { "name": "zonarumbera.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zotan.systems", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zufuribita.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "101android.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "12it.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "1sociaaldomein.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "1stchoicelodging.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -135724,7 +135562,6 @@
     { "name": "scscanada.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "secondlifebullcowslave.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sender.party", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "serpuhof.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "servilonjas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sgtool.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "shadebarandgrillnh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -135821,7 +135658,6 @@
     { "name": "woms.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wrmh343.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xampusolid.cat", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "xn-----7kckegeaw8apdfn0d9a0j.xn--p1ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xn--b1ag9a.xn--p1ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xn--mitenlyttit-s8aad6xf.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xn--mitenlyttyt-s8aad6xg.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -136373,7 +136209,6 @@
     { "name": "onderka.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "onebiz.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "onefile.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "onetwolighting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "online-english.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "onlineyos.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "openrainbow.ae", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -136938,7 +136773,6 @@
     { "name": "datingru.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dc7342.im", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dealsmagnet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "deborahhumble.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "debtsolution.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "deepsingh.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "deepsoulutions.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -137488,7 +137322,6 @@
     { "name": "szotkowski.fun", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "szyldmax.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tagid.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tak-it.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "takesrv.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "talktobabes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tamistuff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -138583,7 +138416,6 @@
     { "name": "freeauction.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "freebiofuels.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "freechatlines.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "freediomatiq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "freedirectory.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "freeformconstruction.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "freeo.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -140573,7 +140405,6 @@
     { "name": "yugiohthenextgeneration.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yummycouple.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yus-azaria.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zadd.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zakachat-temi.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zakes.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zaorejas.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -141303,7 +141134,6 @@
     { "name": "sysstate.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "systemische-praxis-darmstadt.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "szinezdmagad.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tabletopwealth.reviews", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tarus.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tbatr.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "teacherquotes.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -141430,7 +141260,6 @@
     { "name": "4filtre.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "50hertz.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "66814.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "7daystrader.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aad-gp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "abcine.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "abctwenty.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -142799,12 +142628,9 @@
     { "name": "begonias.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "begundal.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bejo.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bejo.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bejo.kz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bejoandes.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bejoindonesia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bejoseeds.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bejosemillas.com.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "beko.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "belaradio.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "belayarus.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -143662,22 +143488,15 @@
     { "name": "bejo.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bejo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bejo.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bejo.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bejo.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bejo.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bejo.hr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bejo.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bejo.ma", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bejo.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bejo.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bejo.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bejo.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bejo.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bejo.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bejo.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bejo.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bejogt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bejoindia.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bejoitalia.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bejosamen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "beran.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -143758,7 +143577,6 @@
     { "name": "brix-central.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "brokeinkorea.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "brokensword.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bruno-hoenel.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "build38.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bulindir.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bulldog-buss.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -146114,7 +145932,6 @@
     { "name": "blackcountrymusicband.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "blankgeneration.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "boardoftheworld.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "boatseller.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bolele.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "boleleboyz.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "botdiril.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -147222,7 +147039,6 @@
     { "name": "veovo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "verify.gov.sg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vet24hour.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "vgoroden.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vgoweb.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "viamax.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vietnam-fishing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -147280,7 +147096,6 @@
     { "name": "abbuc.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "abgame.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "abminv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "accurx.nhs.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "acrylicstyle.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "actualprogressivevotersguide.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "adacoins.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -147665,7 +147480,6 @@
     { "name": "lindanblog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ling2030.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "linkagencia.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "linuxhostingdelhi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "linuxhostingindia.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "liquid.network", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "liveatliveoakapts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -147947,7 +147761,6 @@
     { "name": "tf2pickup.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thaisurveys.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thecache.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "thefatlosspuzzle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thehempcretecompany.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thekitchenprofessor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "theroams.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -148234,7 +148047,6 @@
     { "name": "harrisonassessments.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "harrisonassessments.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "health360.bh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "hiddencafebcn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hieucd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hivemind.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hivemindsystems.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -148522,7 +148334,6 @@
     { "name": "xgameshst.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xn--9kqw7o.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xn--b-tqa.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "xn--bruno-hnel-kcb.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xn--l3cb0bbcf6ezc4a7e.th", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xpansiv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yeetix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -148549,7 +148360,6 @@
     { "name": "83i.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "960server.net.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "a-systems.ru.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "aave.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "acerostrevino.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "adhidrm.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ae.edu.rs", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -149023,7 +148833,6 @@
     { "name": "rustytub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rxcarbon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rybakova.coach", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "safevnet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sainsburysbusinessdirect.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "salome-c.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sarasotaplasticsurgery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -149428,7 +149237,6 @@
     { "name": "myrtlebeachdogtrainers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nationsreportcard.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "naturheilkunde-sabine-klein.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "nayifat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "neteye.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nextsulting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nielsensaskiagaantrouwen.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -150106,7 +149914,6 @@
     { "name": "opnx.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "optome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "opus-labs.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "orbitum.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "order.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "orevan.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "orevan.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -150642,7 +150449,6 @@
     { "name": "elevenbeta.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "elmo.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "elrond.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "emocionestlp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "empirelevel.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ender3.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "enderman.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -150660,7 +150466,6 @@
     { "name": "europejob.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "evenbijproaten.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "everisland.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "evitacion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "exterminator.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eylif.is", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ezsun.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -150824,7 +150629,6 @@
     { "name": "katiekatcreations.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "katzelkraft.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kaushal.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "kehrle.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kelyan.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kendall.productions", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kesen.asia", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -151225,8 +151029,6 @@
     { "name": "tpala-pg.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "trading-academy.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tranmerelectric.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "trastornoevitacion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "trastornolimite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "travelback.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "troplo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "troubleshooting.tools", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -151261,7 +151063,6 @@
     { "name": "vineripenutrition.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "virgil.gg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "virginpulse.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "vise.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "visitnamibia.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "visittci.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vivaelmusculo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -151869,7 +151670,6 @@
     { "name": "pfabel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pilomateriali.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pinaryucel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "pineriver.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "piw.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "planchasvertical.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "planium.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -151902,7 +151702,6 @@
     { "name": "quniko.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "qxbbt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "qxwwly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "qxxlw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ralfrachinger.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "random-stat.work", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "realestatenewstv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -152094,7 +151893,6 @@
     { "name": "vanheede.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "variance.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vaultlabs1226.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "vcudu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "velopinion.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "veobas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vgxcontactcenter.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -152490,7 +152288,6 @@
     { "name": "forumfi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "forward-proxy.email", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "foto-verslui.lt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "francisbaconnet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "freshuk.co.il", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "frogstage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "frontendmentor.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -152671,7 +152468,6 @@
     { "name": "marcorubiol.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mariansalzman.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "marineecologyfiji.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "markitee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "markvsingleton.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "martinploug.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "matanza.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -152767,7 +152563,6 @@
     { "name": "opuspremiumfilms.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "orangeturtle.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "orientelectronic.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ornz.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "osteriabellavista.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "otpbd.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "outloudradio.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -152927,7 +152722,6 @@
     { "name": "smartnoob.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "smmpanelbul.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "smstorems.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "snowcalmth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "solucioneswebbc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sosyalat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "soulpetrol.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -152945,7 +152739,6 @@
     { "name": "stethostalk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stetsed.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stmaryskutztown.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "stoeckel.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stonesgarden.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "storageshedsnc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "storeisrael.co.il", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -153069,7 +152862,6 @@
     { "name": "vyre.ovh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "waf.sexy", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "waitabu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "walrusntiny.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wapresri.go.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "waterbassoon.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "waterborefiji.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -153437,7 +153229,6 @@
     { "name": "oxizonia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "panamasportsfactory.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "paycaptain.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "paylocal.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pentopolimer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pergam.by", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pergam.kz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -154412,7 +154203,6 @@
     { "name": "alturiak.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "altview.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alvaro-smith.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "alvinhu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "always28.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "amadispa.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "amandamaedesign.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -154436,7 +154226,6 @@
     { "name": "amzinfotech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "anachronaeon.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "analytics-media.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "anandsah.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "anarchie-in-lippe.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ancardukids.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "andfaraway.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -154639,7 +154428,6 @@
     { "name": "aylesbury.church", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aysima.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "azimps.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "azonicinfotech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "azquality.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "azurpedia.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "b-institute.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -154849,7 +154637,6 @@
     { "name": "bongbongmarcos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bonitaslecturas.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bonsai-uk.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "boogboi.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "book-excursion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bookgeek.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "boomtheme.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -155367,7 +155154,6 @@
     { "name": "das-efx.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dasabomobil.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dashhelpme.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "dasler.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "data-privacy.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "datamarket.com.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "datenretter.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -155768,7 +155554,6 @@
     { "name": "eugenioruberto.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eurobattle.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eurococos.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "eurodontic.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eurohouse.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "euskalstakepool.win", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eustaquio.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -155836,7 +155621,6 @@
     { "name": "familietandarts.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "famousandfaded.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fanaticosdehectorlavoeenperu.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "fanjingbo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fans-darkangel.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fantasypartyrental.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fantasysports.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -157106,7 +156890,6 @@
     { "name": "libertino.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "libertyga.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "liblogo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "licaoz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lichtplatformnsvv.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "liewyongxin.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lifelock.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -157240,7 +157023,6 @@
     { "name": "lyxel-staging.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "m-em.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "m-producties.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "m2onlinecasino.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "m5industries.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "maarja.edu.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "macchinetedesche.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -157556,7 +157338,6 @@
     { "name": "muenzenforum.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "muhammadlukman.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "muhammadmunif.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mukasa.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mulderfamilie.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mulroymediation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "multiconsumos.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -157988,7 +157769,6 @@
     { "name": "quantum5.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "quatern.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "quatuor-courtage.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "quaydental.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "quebeccat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "quebeccats.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "queirozmiotto.adv.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -159314,14 +159094,12 @@
     { "name": "webpkgcache.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "webradio-maroc.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "webrats.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "webserverindia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "webstar.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "webtech.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "webtorrent.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "webwweb.com.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wecareplatform.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wedcha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "wedelrahill.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wedot.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "weisskircher.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wekan.hopto.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -159687,10 +159465,7 @@
     { "name": "7thcircledesigns.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "802hao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "803hao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "805hao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "807hao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "808mao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "809hao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "80kittens.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "888806.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "97m.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -159833,7 +159608,6 @@
     { "name": "andantepiano.studio", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "anders-suites.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "andre-baum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "andreaseracleous.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "andreeapasat.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "andrewfergusonbooks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "andriano.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -159969,7 +159743,6 @@
     { "name": "barth-herzberger.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "baseballcrank.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "basmacioglu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bastakka.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "batiim.co.il", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "batkhonjon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "batkonjon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -160190,7 +159963,6 @@
     { "name": "castan-dichtungstechnik.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cataclysmal.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "catawiki.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "catcatnya.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cathelp.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cathelp.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cathelp.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -160210,7 +159982,6 @@
     { "name": "centrum-bz.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cepapk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ceramahit.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ceremonybikes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cfnewsinfra.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cfpa.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cfpb.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -160294,7 +160065,6 @@
     { "name": "communebouteille.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "communitymvp.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "comodastore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "comparendossimit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "comprising.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "computerinsider-ec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "computing.land", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -160369,7 +160139,6 @@
     { "name": "ctfacialplasticsurgery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ctmlightning.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cuegee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "cupcake.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cupcakestatus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cupcakestatus.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "curiousspoonfoods.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -160455,7 +160224,6 @@
     { "name": "digital-agency360.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "digitaldruck-kw.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "digitalmahleracademy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "digitren.co.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dinly.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "directholidaysme.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dirhami.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -160547,7 +160315,6 @@
     { "name": "dumeng.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dungchata.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "duquess.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "durandeau.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "duurzaamgww.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dvbtmap.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dvgsites.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -160744,7 +160511,6 @@
     { "name": "firstqa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fisa.net.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fishfive.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "fishlore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fishman.idv.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fitasdobonfim.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fitgirl-repacks.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -160763,7 +160529,6 @@
     { "name": "flowheater.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "flowinity.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "flws.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "flysoft.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fm2021.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fmsn.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fnet.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -160792,7 +160557,6 @@
     { "name": "franconia.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "francystore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "frankelod.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "frankfu.ltd", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "frauenhaut.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "frederikbethkeviolins.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "freeadvertisingexchange.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -160880,7 +160644,6 @@
     { "name": "gironde-tourisme.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "git.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "githubindia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "githubuniverse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "givemeoffer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gizmogrind.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gkdworld.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -160898,7 +160661,6 @@
     { "name": "goddamnwinnebago.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "goenkop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "goes-engineers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "gogna.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "goldfavela.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "golf-alto-adige.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gomarket33.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -161285,7 +161047,6 @@
     { "name": "kathrynread.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "katjapratschke.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kaustubhk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "kawayii.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kaylassmoothies.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kaylielaw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kazzylen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -161378,7 +161139,6 @@
     { "name": "kryptonowosci.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kryptorebels.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kshop.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "kuairead.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kubahgalvalum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kubeofficebooth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kubevocalbooth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -161559,7 +161319,6 @@
     { "name": "marocallo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "martec.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "martinfresow.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "martinpohl.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "masdull.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "maso-corto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "massanews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -161706,11 +161465,9 @@
     { "name": "mtfwiki.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mu00.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "muchoruidoacademy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "muhabbet.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mujerfy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mukenamewah.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "multiversonoticias.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mun-celoricodebasto.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "musacomo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "musasionline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "music-heart.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -161736,7 +161493,6 @@
     { "name": "nafhomes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nalles.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "namastemarketingacademy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "namesmaker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "namoro.com.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nano.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nascentmaker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -161817,7 +161573,6 @@
     { "name": "notsoape.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "novalevante.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "novi-marof.hr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "novlets.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "novparket.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nowhairtime.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "noy.cat", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -161858,7 +161613,6 @@
     { "name": "odinpl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "odonata-editions.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ofamdakar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "offermagnet.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "oge.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "oggyp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ogot.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -162022,7 +161776,6 @@
     { "name": "ownyourfamily.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "oxinarf.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "oxos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "oxydac.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "oyensglobal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "oymy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "oyunnetwork.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -162310,7 +162063,6 @@
     { "name": "portalutil.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "portfolio-anish.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "portfoliorlr.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "portraitemperor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "portsona.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "post-victoria.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "potatoinspirations.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -162590,7 +162342,6 @@
     { "name": "scpsl.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "scrammliveescape.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "script-sign.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "scripty.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "se2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "seagulls-luebeck.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "seanbright.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -162835,7 +162586,6 @@
     { "name": "takarabrig.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "takito.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "talhoscruzarte.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "talklee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "taniawizualizacja.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "taogames.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tapisdemarche.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -162857,7 +162607,6 @@
     { "name": "tearihome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tecfix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "techfuturae.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "techideations.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "techieshideaway.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "technogps.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "technowikis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -162896,7 +162645,6 @@
     { "name": "thebinarystrategy.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "theblackravens.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "theblink.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "thebluered.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thebodyshop.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thebosshub.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thecityofrefugemin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -163076,7 +162824,6 @@
     { "name": "vidanuevaparaelmundo.plus", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vidulo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "viirujateippi.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "vikalbino.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "villa-christina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "villnoesser-tal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vinacocha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -163114,7 +162861,6 @@
     { "name": "wackerton.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wadsana.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wahl-co.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "wallaralogistics.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wallartista.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wallers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wallets.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -163172,7 +162918,6 @@
     { "name": "windybank.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "winghamelectrical.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "winoptical.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "wipro.com.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wir-pflegen-zuhause.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wir-pflegen-zuhause.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wir-pflegen-zuhause.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -163259,7 +163004,6 @@
     { "name": "yogaportalen.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yonistap.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yorkacademy.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "youivt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "young-hands.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "youraudiobooks.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "youremailexpert.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -163302,7 +163046,6 @@
     { "name": "zr-dienstleistungen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zsofit.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zucalgrappe.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zuffel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zummoricambi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zumturm.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zwhblog.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -163445,7 +163188,6 @@
     { "name": "amdental.lv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "amperapark.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "anabijou.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "andreo.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "angkapaito.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aniababan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "anonybus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -163573,7 +163315,6 @@
     { "name": "ccaa.gg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ccaag.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ccaag.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ccdcoe.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cdeeply.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cedarmanagementgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "celtigafutbolclub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -163638,7 +163379,6 @@
     { "name": "cwgadvisors.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cybrix.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "daganghalal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "damicoline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "daymail.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dcvc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "debbiesblog.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -163655,7 +163395,6 @@
     { "name": "digbin.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "digital-echo.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "digitaladl.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "digwiz.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dimensions-ohs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "distilled.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dividendos.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -163714,7 +163453,6 @@
     { "name": "elithus.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "elle.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "elnidovoyages.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "elron.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eltoroweakly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "emprendepedia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "enefitvolt.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -163785,7 +163523,6 @@
     { "name": "frarossi.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fraserleonardart.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fraud.sbs", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "freave.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "frendle.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fssolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fstpn.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -163966,13 +163703,11 @@
     { "name": "jonainhetwild.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jonathandaleswindle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jonizatorywody24.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "jopestkil.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "josegpt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "joserecetas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jpennyltd.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jupiteram.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jurnalfm.md", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "kaitseministeerium.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kalaharifeis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kalmarbilder.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kanal-c.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -163980,7 +163715,6 @@
     { "name": "kaninchenartikel.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kappow.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "karmaniametal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "kawuk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kayeperry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kazuno-jc.or.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "keeb.supplies", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -164012,7 +163746,6 @@
     { "name": "kopyandsonslandscaping.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "koso.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "koujiao.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "kra.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kredi-hesaplama.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kriener.photography", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kristymiley.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -164133,7 +163866,6 @@
     { "name": "miimhort.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mikerichards.email", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mikiclinic-sendai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mil.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mimercaito.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "minecraft-servers.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "minlly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -164299,7 +164031,6 @@
     { "name": "praxisbiel.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "presentaline.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "presentationsteknik.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "president.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pridecorpuschristi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "primefinancial.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "privacy.forsale", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -164364,7 +164095,6 @@
     { "name": "rexvin.co.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rezidencezdanice.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "riacanada.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "riigikogu.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "riksby.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rintisnews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rishikeshan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -164393,7 +164123,6 @@
     { "name": "san-leonardo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "san-vigilio-marebbe.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sankt-kassian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "saresegur.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "savant-dagen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sayhanabi.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "scanningpens.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -164516,7 +164245,6 @@
     { "name": "talentplatform.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "talentplatform.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "talentsplit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tallinn-airport.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tasawehala.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "taubenartikel.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "taufers.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -164618,7 +164346,6 @@
     { "name": "val-casies.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "valdega.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "valdultimo.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "valitsus.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "valum.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vasogroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "veritone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -164645,7 +164372,6 @@
     { "name": "vizirinvestimentos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vizyonpara.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vkusniy.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "vm.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vocomo.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vogt.works", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "volkistore.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -164822,7 +164548,6 @@
     { "name": "bellcomp.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "berete.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bevcrushesit.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bialamydlarnia.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "birnenhain.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bl0ck.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "blankspade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -164879,7 +164604,6 @@
     { "name": "crosslink.ae", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "crrapi.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ctm.community", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "cutaquigusa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cvhunter.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dacooninternational.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "damesly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -164975,7 +164699,6 @@
     { "name": "global-motherboard.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "goathub.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gockelsee.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "golden-squad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "goodbits.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "goodday.finance", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "goodsfromfactory.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -165008,7 +164731,6 @@
     { "name": "hostcsr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "http418.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "htzopremasrbija.co.rs", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "i0856.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ibarakisenkyohikaku.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "idcrawl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "igamingnyheder.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -165346,6 +165068,6886 @@
     { "name": "zolw.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zorgonderwijsnu.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zulybot.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "100fss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "100fss.marketing", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "123-ticketsystem.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "215advisors.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "27lx.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "31fss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "31fss.marketing", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "31fss.support", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "31fsspo.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "325fss.marketing", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "355fss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "365labs.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3dicomviewer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3niu59.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "42fss.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "502fss.marketing", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "50fss.marketing", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "51fss.marketing", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "52fss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "52fss.marketing", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "52itt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "55fss.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "5minutemystery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "6-bros.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "61fss.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "71fss.marketing", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "77online.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "800bar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "800email.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "800live.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "800ok.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "800sports.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "800tea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "800tutor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "800web.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "811fsspentagon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "82fss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "82fss.marketing", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "88bill.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8link.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8show.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "8time.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "90minut.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "91beauty.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "91fashion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "95107.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "95500.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "95518.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "95559.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "95700.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "95828.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "9588.com.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "95996.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "96181.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "96200.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "96220.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "96229.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "96316.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "96448.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "96577.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "96605.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "96606.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "96607.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "968860.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "96896.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "96961.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "99dog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "a24dmng.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "a2zva.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aapant.org.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aaronr.digital", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "abas-erp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "acosa.com.gt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "acosa.com.hn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "acosa.com.sv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "adapt-iq.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "adapt-iq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "adbexcavation.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "adlerpapier.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "adreana.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "adshooter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "adsmodels.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aenes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "afalina-hotel.su", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "afiawealth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agalexusfix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agalia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agastia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agenciaonnmarketing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agerich.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agoodnews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agpp.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agrabah.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agressief.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agrifoglio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agrohim.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agroma.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ahjy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ahlsenutbildning.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ahoghill.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ahqf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ahrora.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ai-genit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aichou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aide.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aiding.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aidong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aifeng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aiffee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aiglow.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aikio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aimara.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aimeisi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aimplas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ainaishi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ainong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aiqinggu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aiqingli.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airalarm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airdeer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airformosa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airfoto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airgreen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airgundepot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airism.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlegend.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlesson.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airporttour.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airupdate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airventuri.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aishima.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aisun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aiwriter.tools", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aiwujiwu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aizhuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ajaxified.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "akayu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aksesuarai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aktueller.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alcatrazz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alendronato.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alexandrin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alfakir.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alfed.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alhakim.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alhas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alhora.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ali360.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aliads.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aliauction.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alibiz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alicafe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alidanbao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aligift.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alihard.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alilog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aliloulan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alimade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alimate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alipad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alisearch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alitalk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alitudi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alitv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alkame.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "allbetnet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "allcomic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "allegreto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "allemanniamarburg.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "allerheiligenkirmes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "allgauer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "allhonest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "allianceguide.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alljoy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "allpatch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alltak.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "almeidaesilvaseguros.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aloneg.ovh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alpinisti.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alsharkest.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alstromeria.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "altbau.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "altruizm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "amambebe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "amaranthus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "amargura.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "amarilys.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "amarrada.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "amarylis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ambaci.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ambiancewindowcoverings.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "amburgo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "amenajare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "amenhotep.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "americanjihad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "americanroyalty.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "americapavilion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "amfitheater.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "amicon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "amiez.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "amuzante.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "analvision.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anbei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ancaebacia.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ancofe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anctm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "andain.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "andefang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "andorrana.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "andrewsfss.marketing", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "androidmafia.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "andromaca.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aneamia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anfei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "angeben.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "angel-wing.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "angelhaken.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "angelmilk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "angeltalks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "angesehen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "angolo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anguo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anhangabau.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "animelo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aniss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anivideo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anjixin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ankam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ankarama.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ankeney.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anlian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anlongte.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "annelida.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "annemieke.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anochecer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anoria.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anpin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anrufen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anscheinend.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ansha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anshun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anteng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anthai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anticas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "antidroga.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "antiforce.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "antifurt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "antilight.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "antishake.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "antispams.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "antonmcclure.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "antragsformular.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "antropico.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "antsirabe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "antsstore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "any6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anyfinder.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anylook.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anyma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aohao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aolipu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aomi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aorui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aoshiya.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aosika.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "apasta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "apeas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "apiana.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "apklatte.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aporellos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "apostillas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "apparelfashion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "appelhof.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "appeller.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "applecool.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "appledna.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "appleedu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "applefeel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "applesin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "appletoy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "appletreelanewm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aprilian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aqila.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arabcan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arabclip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arabeyes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arais.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aratu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arbautocare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arborfield.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arbousier.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arbschg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arcanoid.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arcmarine.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arefly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arenover.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "argental.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "argentas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "argentyna.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arieseni.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arino.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arious.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arisoft.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arkadien.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arktomato.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "armman.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arrabal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arrier.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arrowad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arsta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "artbees.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "artcentar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arte3d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arteid.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "artemislena.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "artemovsk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "artfight.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "artpublic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "artsdays.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "artsmeet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "artsong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "artsound.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aruite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "asatahvieh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "asiabasket.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "asiabuyer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "asiabyte.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "asiacan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "asiaceo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "asiagps.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "asiaimage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "asiancolor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "asianpavilion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "asianray.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "asianstudent.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "asianyuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "asiaos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "asiaparking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "asiapavilion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "asiashine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "asiasign.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "asiaviews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "asiayuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "asilomar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "askartza.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "askimsin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "asklawyersforjustice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "askollelectric.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "asmirandah.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "asodia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aspirecig.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "assendelft.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "astano.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aswish.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "athabascau.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "atlah.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "atlassen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "atlusnet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "atomzcorp.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "atonibai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "attiliospagnolo.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "auberson.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aucem.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "audioaudit.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "audiobone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aufbewahren.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aufnehmen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aufschieben.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "augenfarbe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "augenklappe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "augmedia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "augura.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "auqi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aurielle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ausfin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ausgesprochen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ausim.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ausruestungen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aussagen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "australianfries.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "austsun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "author.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "authorwise.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "autoankaufen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "autoanzeige.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "autoapk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "autobelt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "autocollimation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "autocollimators.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "autocost.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "autodach.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "autodalas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "autodekor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "autoesa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "autoglascenter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "autografer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "autoidc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "autokeskus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "autokeyboard.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "automacro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "automeeting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "automuse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "automv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "autonomicbalance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "autopacking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "autopet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "autopod.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "autoporn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "autoprince.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "autoproof.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "autumnmanor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "avelecollege.edu.ws", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "avhunter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "avianotravel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "avisodeprivacidad.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "avlover.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "avoidfire.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "avtorrent.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "avtoskorost.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "awardtraining.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "awing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "axe-formation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "axinfo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "axzq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aybak.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ayomi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ayunas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "azami.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "azirha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "azmun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "azreal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aztekium.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b3b4.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baardagaam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "babaka.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "babycaring.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "babycn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "babynamen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "babyroad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "babysface.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bacam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "backbleche.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "backcolor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "backfront.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bacteri.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "badekappen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "badematten.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baginfo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bags4all.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bagtea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bagteria.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bagui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bagun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bahami.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baiask.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baibaby.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baichat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baichen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baieye.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baieyes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baifin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baifutong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bailiang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bailide.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baimail.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baimap.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baimoney.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baipay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baiqiuen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baishitie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baishuiyang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baispace.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baitalk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baiwen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bakirelik.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bakj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bakmaskin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "balconnet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "balsara.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bambooplywood.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bamboostage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bamdad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bananavi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bandeaux.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bandjoun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "banensite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bangxiaobao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bankingadvisors.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bankofanhui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bankofbohai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bankofguilin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bankofgulf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bankofhaikou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bankofhainan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bankofhankou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bankofharbin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bankofhubei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bankoflanzhou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bankofliaoning.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bankofshaanxi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bankofyunnan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "banori.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baobaoxiong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baobiao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baochen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baodaiji.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baodiao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baogongfu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baoguai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baohong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baohu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baolu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baomin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baoqiang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baoshijie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baoshun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baoshuo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baowei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baoyao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baoyou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baoyude.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baozhuo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "barattolo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "barichara.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "barrafranca.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "basano.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "basechina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bashkimi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "basshill.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bassus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bastun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bateer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baterfly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "batlan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "batmobile.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "batswana.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baubeach.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bauschlosser.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baxian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bayrischzell.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bbtk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bdty.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "be-craft.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bealefss.marketing", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beautifulmeetrich.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beautycabin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beautyforce.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beautyinn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beautyrepair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beautyunion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "becauseyou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beconstructive.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bedingungen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bedrijfskunde.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bedrijfswagen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bedruckung.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bedskill.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beeinfo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beelight.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beerflower.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beerre.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beforethelaw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "befragung.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "begabungen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "begagnade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "behandelt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beholding.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "behrami.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beibadao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beichen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beide.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beiduofu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beijingcbd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beijingcloud.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beijingit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beijiquan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beingpeace.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beistelltisch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beiwei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beiyongjin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bekanntgabe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "belas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "belfeld.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bellowsafs.marketing", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bemand.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bemarried.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bencana.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "benedicthanshenwang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bengcao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bengke.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bennachie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "benrun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bentina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "benxin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "berechnen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "berezovka.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bertuah.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bertudung.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bescherung.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "besearch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "besir.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beskiden.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "besonderheit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bestehen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bestir.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bestlifek9training.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bestuurskunde.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet4cash.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bet66.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "betrouwbarewifi.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beurteilt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beveragecan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bewegungs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bewegungszeit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bewerbungshilfe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beyondcentury.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beyondcloud.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beyondspacetime.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beyondtailor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beziehungsweise.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bfty.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bfxb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bhangarh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bianchina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "biankong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bianya.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "biberonshop.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bieren.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bieten.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "biffo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bigbrake.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bigbury.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bigfold.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bigland.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bigmore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bigsolar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bilian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bilirrubina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bilkovita.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "billingsgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bilmerker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bimozhiyan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "binaires.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "binbag.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bingbao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bingchunmoli.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "binggun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bingliben.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bingning.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bingpo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bingren.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bingxuerong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bingyan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bingyou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "binimage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "binyi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bioenvision.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "biologychina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bioopto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bioreader.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "birao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "biret.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "birini.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bitkikoruma.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bitower.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bitrust.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "biztositok.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bj5.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bjbybbs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bjcbd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bjcw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bjlcp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bjshare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bjxhm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bjxx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bjydf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "blatino.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "blobby.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bloggeramt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "blogguide.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "blogsalon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "blogthedata.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bloodmeter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "blueit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bluelover.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bluemonte.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "blueoceanbrain.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bluescape.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bluetime.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "blumentee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bobiao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bobrubin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bodhionline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bodycare.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bodyecology.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bodypad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bohaibank.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bondchina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bonoto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bonsaitree.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bonusemail.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bookb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bookborrowing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bookfirm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bookmynames.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "booksky.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "boomstyle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "boostup.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "boraclub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bore.lt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "boreart.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bosmina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bosniaks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bostan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "boste.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "botenstoff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "botsa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "boufen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bouwstenen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "boxspace.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "boynet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bra360.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "brainbus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "brainfirm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "brandfoto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "brandjapan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "brandsmonitor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "brandtaiwan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "brandweerrooster.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "breadlabs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "breloque.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bremsscheiben.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "brentonico.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "brianm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "brightlux.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "brightonncmachine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "brightthink.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "brittni.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "broker4u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "brotaufstriche.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "brugia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "brunhild.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bsht.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bsjt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bswears.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bsyy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "btbp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "btking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bttrade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "btwj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bubblemedia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "buckglobal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "budexpo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "buildfood.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bulbidea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bullair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "burdin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "burewala.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "burlingameparentsclub.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "businessbus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "busuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "butom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "buychip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "buyunion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "buzzspace.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bvblaboratory.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bycatch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "c-ncap.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "c3gaming.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "caball.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cablare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cabotagem.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cabrils.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cabsc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "caccc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cachechina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "caciulata.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cactusdentrepair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cadoneghe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cafeandtea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cafeapple.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cafebeauty.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cafemoment.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cafesi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cafetaste.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cafevs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cagao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "caian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "caidao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "caifan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "caihongcun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "caihuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "caijiaosuo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "caikuai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "caimin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "caipiao.com.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "caiqingchong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "caiqu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cairan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cairui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "caishi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "caishikou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "caixiu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "caiyi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "caiyou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "caiyue.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "caizhi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cakecake.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cakechina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cakes2u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "calavos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "calbuco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "californiabalsamic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "calumnias.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "camagro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "camcolle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "camelos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "camerakid.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "camluck.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "campeador.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "campno.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "camtu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "camuri.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "canadapavilion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "candyone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "caneasy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cangbiao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cangcang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cantesting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "canwashing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "canxun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "caopanshou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "caoshanhu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "caoshe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "caoyao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "caozuo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "capitalwin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "caralina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "caramelldansen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "caramplifier.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "carbontransaction.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cardexpo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cardmates.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "care-pack.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "caremind.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "caretoyou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "carfamily.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "carpostal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "carsmate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "carsvans.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cartbag.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "carwind.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "casabasika.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "casafan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "caschys.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "casetech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "casiam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "caside.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "casilina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "casinool.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "casuallab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "catam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "catchname.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "catchnames.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "catcut.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "catepol.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "catjoy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "catlive.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cayxaden.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cbcembalagens.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cbdchina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cbond.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cccfair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ccdy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ccmec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ccoic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cdbc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cdkj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cdko.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cdnpage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ceauto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cebing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cecargo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cechem.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cecic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cecw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "celogistics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cemade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cemarks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cenerentola.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "centreport.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cerine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "certificadoras.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "certly.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cettic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cfpic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cgpa-de.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chabowang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chaicao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chaifa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chainsworks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chamate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "changfeng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "changheng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "changk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "changyun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chanjian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chanque.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chanxue.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chanxun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chaoheng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chaohongji.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chaojia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chaojin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chaoliu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chaowaimen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chaowu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chaoyansuo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "charitychina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "charmmy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chasti.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chatier.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chaval.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "che365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cheapcall.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cheapdot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chebei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "checkfake.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cheeyun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cheiranthus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chejing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chekucoffee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chem360.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chemei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chemikalie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chengshang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chengxin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chenpeng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chenpian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chenputon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chenqiang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chenqin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chenshijia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cherrad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chezhidao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "china360.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "china5a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinaabroad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinaaero.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinaangel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinaantivirus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinaarticle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinaasc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinaassurance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinabaskets.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinabath.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinabattle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinabbn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinabelt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinabeverage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinabiology.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinabobo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinaboxer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinaboxes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinacake.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinacba.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinacbd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinaccd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinacheck.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinacheers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinacheese.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinaclaw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinaclinic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinaclone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinacol.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinacolour.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinacreation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinacrew.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinactn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinacx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinacycle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinadear.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinadecor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinademand.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinadesigned.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinadiy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinadoing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinadrilling.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinaduty.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinaeb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinafan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinafeel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinaforex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinafuxing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinagear.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinagenerator.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinagi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinagift.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinagps.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinaguarantee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinagym.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinahat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinahd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinahdd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinahear.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinahero.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinahitech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinahoop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinahost.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinahs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinahy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinaie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinaipv6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinajm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinakennel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinakungfu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinalighter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinalike.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinalocation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinalr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinamatch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinamaterials.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinamem.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinameter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinamo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinamobiles.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinamtv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinaneed.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinanp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinanurse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinaopera.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinaov.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinapan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinapear.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinapec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinapm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinapoly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinaposition.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinapps.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinaprices.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinaprofit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinapsych.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinaqc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinaql.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinaqueue.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinarally.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinaray.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinareinsurance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinarisk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinasand.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinasay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinasays.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinascarf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinasemi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinaseminar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinaspa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinasteed.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinatcx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinatendering.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinating.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinatone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinatouch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinatractor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinatraining.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinauniv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinava.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinavac.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinavast.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinavb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinavirus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinavod.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinavr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinawalk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinawalking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinawaterproof.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinawave.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinaway.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinaways.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinawicker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinazq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinazs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chindy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chineo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinesefu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinesefuture.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinesegov.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chineseled.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinesemiss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chinesermb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chineseyuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chipmore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chipsecurity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chipview.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chirpset.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chituwang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chiuvete.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chizhai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chngold.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "choas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chocolatespring.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chongban.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chongdianwei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chongjili.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chongshang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chongtianlu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chongyou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chorio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chouchouweb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chouwawa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chpsy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "christiancleva.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chuangjia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chuangku.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chuangtong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chuanhuo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chuanku.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chuanlu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chuanneng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chuantou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chuanxinlian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chuanzhi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chucungui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chudou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chuguobang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chuifengji.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chukao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chunchun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chunshan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chuxun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chuyi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chuying.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ciachina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cibacopa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ciboria.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cicai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ciekawi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ciele.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cifoto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cihaf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ciit-software.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ciit.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cijf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ciji.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cilat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cin.net.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cindy.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ciochina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "circuitchina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "circuitexpo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cisalpina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cit-net.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "citinet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cityfilter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "citypac.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cityplayers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "citysight.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "civland.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cjspace.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "claimfuture.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "clashclub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "classic.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "clearrave.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "clep.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cleverfinger.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "click2customer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "clicktoprofit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "clickvisits.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "clicoclick.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "climall.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "climatetax.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "clipshare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cliptech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "clonal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cloudadult.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cloudbool.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "clouddisks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cloudfirm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cloudfortune.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cloudkeyboard.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cloudlocation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cloudshredder.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "clujeanul.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cmalet-avocat.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cmcbank.co.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cmew.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cmrnn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cmssite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cn5000.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cn9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cnab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cnads.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cnauto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cnbbn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cnbooks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cncolor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cncsys.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cncycle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cneic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cnemail.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cnfilms.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cnftp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cngene.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cngf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cniec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cnipm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cnipv6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cnisp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cnitc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cnjx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cnks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cnlaser.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cnloan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cnmade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cnmilk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cnnurse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cnopera.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cnoptics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cnpawn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cnpets.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cnphotos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cnpolice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cnpro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cnproject.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cnread.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cnreader.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cnregister.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cnrisk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cnrose.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cnsol.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cnteach.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cntop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cntoy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cnvideo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cnvision.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cnwebmaster.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cnwow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "co2air.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "co2checker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "coassessment.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cobquecura.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cocinaconalegria.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cocue.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "coday.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "codegroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "codenetwork.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "codigosmart.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "codziennie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "coffee3d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "coffeebreak.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cofidur.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "colabore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "collin.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "collinlove.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "color100.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "colorfultree.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "colorrock.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "colorroof.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "colorwindow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "comandate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "commentaar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "commonmap.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "communiquons.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "computermaus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "computermedicine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "comucomu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "comunism.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "comunitas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "concernment.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "condensacion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "configcat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "conflictspecialist.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "congye.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "conse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "consideratio.blog", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "consideratio.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "consideratio.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "consideratio.tax", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "consultantscompany.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "consultum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "contactangle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "continuenow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "contraves.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "control.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "conumdrum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "conventioncamp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "convertidos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "coogarden.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cookridge.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "coolala.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "coolcan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "coolexpo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "coolleader.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "coolplus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "coolscan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "coolvc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "copiermarket.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "copperio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "copperminegallery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "copychina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "copydown.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "copygreen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "copypast.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "corecore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "coredroid.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "corgal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "coronach.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "corribee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "coscol.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cosms.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "costantina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "costurin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cosynest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cotich.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "countercloud.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "countrygrid.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "coupa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "coursegolf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cousot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cpm-steuerberater.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cpm-steuerberater.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cpm-steuerberater.support", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cpumate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cqbrand.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cqep.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cqgj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cqrb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cqweb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "crackaway.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "crackroot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cracky.art", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cracky.win", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "craibstone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "crazyfire.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "creamless.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "creativeconsult.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "creativefocus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "creditbeijing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "creditshanghai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "creditstandard.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "crimeapress.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "crland.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "crone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "crosschina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "crossdresscontest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "crossgar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "crual.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cruisescentral.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cruisescentre.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cryers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cryptenet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "csapa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cse-uniserve.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "csedu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "csolar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cstdc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "csuchen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "csvclub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "csvstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "csw.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ctichina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ctjk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ctrips.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ctsacentral.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cuarentena.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cucciolo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cuide.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cuidie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cuifeng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cukipott.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "culate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "culiu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cuppen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cuppen.marketing", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cuppen.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cuppen.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cuppen.support", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cushaw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cvrn.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cxfund.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cxhl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cybelle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cyberdns.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cyberoa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cyjm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cytn.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "czdh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "czyc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dabaixiong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dacangku.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dachet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dadongfang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dafengche.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dafengding.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dafong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dag.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dagudong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dahuanxi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dahuimao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dahuocang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dahuojia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "daian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "daigang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "daigong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "daijin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dailyjoy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dailyvpn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dakotas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dakucha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "damanlv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "damgan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "danbao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "danbaotong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dancehome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "danglas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "danielwayman.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "daodaoquan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "daojian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "daole.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "daomo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "daoxiangchun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "daqq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "darkraver.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "darksin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "darlen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dasfest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dasgelbe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dashucha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dataoguan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "datashock.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dataunion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "datenflatrate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "datenserver.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "datf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "datian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "datuanyuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "davidcraft.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dawushan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "daxuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dazhele.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dazzabutch.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dbpolska.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ddmsolutions.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "de-ooyevaar.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "de-ooyevaar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "de-ooyevaar.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "de-ooyevaar.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "deallix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "debiao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "debitcloud.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "debricked.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "debyte.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dechan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "deckungsbeitrag.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "decolour.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "decory.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "decreto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dedns.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "deedoo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "defret.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "degrey.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "deindustry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dejie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dekameron.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "deklink.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "delifoodbar24.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dellie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "deluxeweb.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "demaecan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "demoband.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "demochina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "demodulation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "demok.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dengyaping.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dengyt.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "denmead.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "deooyevaar.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "deooyevaar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "deooyevaar.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "deooyevaar.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "deooyevaar.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "depanneuse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "depilazione.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "der-beste-schumpeter-vortrag.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dermatit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dermatolog-ivanova.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "derou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dershanesi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "derunsheng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "desand.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "desant.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "designedinchina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "designer.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "designfine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "designtagebuch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "desiunderground.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "desize.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "desteptarea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "developname.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "devestate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "devphp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dezun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dh-leasing.si", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dhire.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dhlaser.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dialoguelab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dialtouch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dianyitong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dianzhao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dianzipan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "didelikarpiai.lt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "diefan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dieka.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dieku.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dielottozahlende.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "diemutter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "diersheng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "diexiu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "digf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "digiedu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "digieducation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "digiency.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "digijoy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "digiscrap.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "digiscrap.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "digitaleuro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dingguagua.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dinghuo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dingni.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dingyue.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "diplobel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "direct2store.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "disasterinspector.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "discomix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "discordapp.gay", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "discoverkeesler.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "discoverkeesler.marketing", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "discoveryfarms.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "diskmark.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "displaymat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dispute.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ditemi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ditian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "diuk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "diychina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "diyed.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "diyland.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dizun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "djdown.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dlatego.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dlgf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dlwx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dlzc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dmartpreneur.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dmforcesupport.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dmforcesupport.marketing", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dmfss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dmfss.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dnfirm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dns0.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dnsfog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dnsspeed.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dochina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dodaf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "doeasy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dofaith.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dog2day.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dogbusiness.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dogchina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "doghome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dojoy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dokcar.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dokume.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "domach.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "domainedu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "domainforvalidation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "domainshow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "domainwing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "domainwings.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "domainwish.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "domestic.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dominiks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dominque.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "domt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dondre.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dongfangliang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dongfengling.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dongyao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dongzhen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dongzuo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "donice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "donics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "door6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dormeuse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "doserver.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dotfirm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dotkich.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "downarea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "downporn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "downput.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dr-mgeorgieva.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "drainflow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "drawup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "drdomain.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dreamj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dreamphreak.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dreamwind.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dresswave.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "drhosting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "driftworld.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "driveblog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "driverhome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "drsurvey.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "drugstore.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "drupi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dtfy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dthinker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dtky.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dualpack.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dualpad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dualsimadapter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "duanyong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "duijiangji.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dule.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "duocang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "duochuang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "duoxing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "duqu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "durkopp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dutchmed.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "duyue.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dv.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dvbag.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dwarkin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dwgconverter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dydr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dysgeusia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dysplasie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dywt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dzhi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dziewice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "e-shang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "e-shobai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "e8v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eachdns.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eaglerun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "earlypet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "earthandenvironment.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "earthcouture.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "earthwork.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eastboat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eastdragon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "easternad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eastflower.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eastos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eastsafe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eaststation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "easttea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "easttime.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "easttrip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eastunion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eastvisa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eastweek.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "easy2find.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "easy2get.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "easy2see.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "easyapache.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "easybeach.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "easydone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "easyenjoy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "easygoods.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "easygsm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "easyjoy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "easymarch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "easynginx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "easyps.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "easyrelax.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "easyrevise.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "easytoon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "easytoy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "easyunion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "easyvisitor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "easywafer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eatsea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ebiene.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ebohr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "echoshine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "echotest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "echung.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eciba.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eclipsemechanical.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ecoceutics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ecoefficience.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ecofree.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ecostress.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ecovegetable.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ectj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ectools.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ectrader.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ecuashop.ec", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eczanesi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "edatech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "edgecase.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "editan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "editorial.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "edmot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "educatorretirementsolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "edugeek.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eduplant.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "efedrina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "effektivitet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "effluvium.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "egipat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "egitim.academy", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eglinlife.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "egyptour.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ehmann.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ehuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eighttime.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "einberufung.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "einbildung.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "einigen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eitat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ejiao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ekimov.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ekophone.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ekstremno.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ekwador.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "elbaradei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "elbienestar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "elcigaro.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "elcomat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "elecfair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "electrical.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "electricgatemotorboksburg.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "electroredes.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "elegantperfume.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "elektrikal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "elevanhairdressing.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ellierider.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "elmod.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eloksal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "elshop1eu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "emancipator.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "emapgo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "emater.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "emlakvar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "emocionado.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "emocje.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "emolar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "emperator.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "emporiosemalcool.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "emptyfields.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "emrin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "emuma.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "enchong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "encryptphp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "endireita.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "endland.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "endog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "enduo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "energetyczny.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "energysand.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "engineeringinsurance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "england360.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "englandairportcars.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "engleza.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "engster.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "enhai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "enjoybasketball.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "enjoyfish.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "enjoyled.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ennd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "enoenergy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "enoteca.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "entrepreneurresources.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "envelopemachine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "environmentguard.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "environmentsave.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eoliene.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eomall.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eozoon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "epavape.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "epistole.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "epistula.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "epochcg.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eqinfo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "equilibratura.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ercio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "erhaben.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eriador.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "erkrankung.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "erogirls.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eromanga.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "erotikos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ervamate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "escarpe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "escif.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "esden.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eshizuoka.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "esmoker.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "espaider.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "esparreguera.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "esphera.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "estudosdavida.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "etablissement.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "etherdream.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ettela.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "euaaaio.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eudream.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eufair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eufic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eufriend.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "euhospital.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "euidc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eulenberg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eunow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eurobulb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eurocheers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eurochrie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eurocure.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eurodart.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "euroecho.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eurofee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eurohear.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "euroidc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eurokid.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eurokiss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "euromas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "euromobi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "europansion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "europavilion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "europubs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "euroregister.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eurosight.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "euroslim.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eurosnap.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eurosos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eurowave.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eurowish.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eushow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "euwind.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "euwings.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "euyacht.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "evaluasi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "evangerion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "evendesign.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "event-trac.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eventfoto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "evermed.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eversightwealth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "everybodymedia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "everyboss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "everyrisk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "exactgold.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "exactlibris.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "excel-group.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "excelsis.rs", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "exchangeidea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "excimerlaser.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eximworld.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "existieren.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "exmould.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "exotic.report", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "exploreit.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "expoking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "expoplan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "expoqueen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "expuse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "extraconsult.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "exueli.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eyas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eyecare-center.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eyemagics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eyesome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ezvpn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "f88vip58.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "f88vip67.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "facemos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "faceside.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fachinformatiker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "factorypark.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "facvest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "faildesk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fairauctions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fairbroker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fairchildfun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fairchildfun.marketing", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fairchildfun.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fairfacts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fairstore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fairuse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "faithblog.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fakao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fakecheck.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "falaknuma.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "falcoin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "falicov.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fallens-home.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "famare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "familienberatung.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "familleenfete.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fancywood.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fandoucheng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fangan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fanghexie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fangjingdian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fangqun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fangshu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fangzai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fangzao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fangzhou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fanlongduan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fanshishang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fantoy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fanzhe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fanzhuang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fapin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "faq4mobiles.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "faradi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "farfood.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "farheen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "farmerspring.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "faroukchi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "farsonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fascisti.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fashang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fastpcr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fatball.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fatdress.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fatumagro.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fatuta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "faul.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "faulkners.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fauxreal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fawave.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "faxineira.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "faxion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fazendo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fazeya.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fazilka.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fcit-tems.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fcunion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "featurefarmer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "featurerequest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "federtasche.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fedprint.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "feedfilter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "feedstuff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "feelclear.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "feelhd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "feelquality.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "feelsolar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "feetschool.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "feibiaowang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "feicheng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "feider.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "feijiuwuzi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "feini.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "feisheng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "feiu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "feixiang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "feixing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "feiye.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "feiyong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fenghao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fenghwa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fengjingqu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fengle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fengnao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fengshang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fengshou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fengshuo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fengxue.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fengxun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fengyu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fengyue.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fenicios.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fenquandujia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fenye.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ferrandi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ferred.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ferretplus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ferryroad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ferrysmart.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ferter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fesztivalok.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ffwm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ffxigil.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fiberoptical.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ficksahne.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fiec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fieldmark.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "filaos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "filapedia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "filastrocca.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fileghost.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "filiera.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "filmocean.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "filmschina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "finanalysis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fincadecafeloscolibries.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "findtm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "finemake.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fineranch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fingerreader.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fionna.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fireprint.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fireservicerota.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "firmaet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "firmenanwalt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "firmendb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "firstchina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "firstpalace.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "firstpapers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "firstpencil.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "firstpub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "firstvod.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fiscan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fishingcat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fishingvision.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fishkinet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fishtool.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fitmommyinheels.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fitnessgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fiumefreddo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fixapc.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fizeau.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fjfund.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flaite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flamen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flamez.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flashbus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flashunion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flaszka.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fliessestrich.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flohmarkte.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "floneo.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "florante.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flotille.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flower123.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flowerabc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flowerandbee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flowercan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flowersays.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flowersline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flowertea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flowerwhisper.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fltic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flushfree.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flybicycle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flycolor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flygaming.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flyinghope.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flyingmodel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flyingspace.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flyingtips.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flyingvisit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flyloop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flymeter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flythink.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flyvisit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flywish.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fmath.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "foamball.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "foammedia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "foamproduct.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "focometer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "focusboy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "focuspack.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "foerderland.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fogguru.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fokusi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "followu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fondation-vinci.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fonepro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fonoassorbenti.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "foodrink.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "footanglais.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "footballforfuture.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "footlettuce.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "forblood.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "forboy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "foreclosuresecrets.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "forestfog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "forex4all.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "forexiran.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "forexman.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "forexrate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "forexsalon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "forexswing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "forge.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "forkid.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fortsetzungfolgt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fortune-healing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fotasia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fotoballon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fotohall.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fotologue.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fotoside.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fotoverkauf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "foundryhome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "foundryplanet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "four-thirds.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "foursense.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "foxspirit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "foxterrior.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "foxue.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "foyou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fragt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "framedia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "franja.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "frankcoviello.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "frankling.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fratia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fraudcare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fraudproof.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "freakmobile.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "free2find.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "free2live.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "free360.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "freeeu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "freeexplorer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "freeidc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "freemanwealth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "freemat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fregatten.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "freibetrag.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "freienbach.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fremde.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "frenzmail.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "frequenting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "friedhoff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "friendsky.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "friendsline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "frischgepresst.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "frisure.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "froip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fromnews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "frontiersinflight.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "frontwings.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "frukost.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ftinfo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ftkj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fucai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fuguo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fuhai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fujimurado.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fulaishan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fulgurant.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fulihua.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fullclaim.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fullgoal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fullintel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fullpet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fullsafe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fullsolar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fullwise.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fumei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "funchina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fundingpartner.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fundingpartner.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fundingpartner.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fundschina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "funkeln.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "funnyisland.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fuoriporta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fupeng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fuqiang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "furrytail.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fuseta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fussballdaten.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fustang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "futao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "futurefeel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "futurenewsforyou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fuyao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fuzhi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fuzhouair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fuzhu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fxkj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fxzj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fxzl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fyfd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fyjs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fyxs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fzen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fzinfo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fzsj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "g-case.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "g-equip.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "g654.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "g684.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gadzetomania.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gagagaga.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gaidashi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gaitianli.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gaiye.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "galblaas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "galeria-reisen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gallagherperformance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gallerytube.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gallesproperties.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "galspop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gameafrica.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gamepunk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gameregion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gamesaid.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gamesbar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gangli.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gangneng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ganneng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gaochan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gaodu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gaojiahuishou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gaomai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gaopuda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gaoruan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gaotong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gaoxin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gaoyao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gaoyu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "garagen-crew.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gardeningtool.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "garnetnv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gartenanlage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gasar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gasdruck.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gastgeberin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gate4you.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gbchina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gbfoundation.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gbinfo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gbrowse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gbsapri.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gc-pfalz.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gc4hr.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gclpower.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gdhd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gebaeude-braun.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gecken.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gedon.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "geesthof.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gefreut.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "geheimtipp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "geigenbogen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gekozen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "geland.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gelangte.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gelsemium.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gemeen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gemeinderat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gemeinwesen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gemind.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gemisi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "genecopy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gengra.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "genialkochen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gentouch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "genuwine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "geodesic-tents.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "georges.nu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gerasimos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "germancargo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "germancorbo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "germankid.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "germanpavilion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "germanpay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "germanwedding.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "germanymade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "germanypavilion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "germanypay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "germanyquality.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gesec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gesellig.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "geshang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "get4me.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "getplus.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gettrust.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "getword.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gewaltlos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "geyouhui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "geyoutuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gezhuang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ghimaging.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ghope.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ghoshal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ghostmarket.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ghprinting.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ghzq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "giantcat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gianturl.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "giatrakos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "giemsa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "giford.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "giftcrown.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "giftpower.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "giftpremium.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "giftprinting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gigaway.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gimahhot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gintian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "giordan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "giradiscos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gis360.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gitmek.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "giusyesabatino.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gjirokastra.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gkj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "glass365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "glasschneider.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "glasses3d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "glastenbury.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "glaswerk-mellenbach.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "glatten.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "glitery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "globalimmigrationafrica.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "globaltrucking.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "glorymark.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "glosarios.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "glyphosat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "go2biz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "go2save.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "go2store.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "godblessus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "godblessusa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "godloveme.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "godstart.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gofront.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gogeeks.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gold9999.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goldcaster.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "golddeer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goldenjoy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goldenpay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goldhabour.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goldjaguar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goldkid.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goldround.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goldwagon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goldwish.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "golftaiwan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gomdl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gomoon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gongdelin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gongqiuxinxi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gongsiren.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gonls.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goodbargin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goodbbs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goodbenefit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goodcarbon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goodcarbons.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goodcoat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goodcollection.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goodcotton.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goodeditor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goodenvironment.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goodface.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goodfame.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goodfarm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goodfeeling.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goodfirst.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goodflip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goodfonts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goodfox.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goodgrease.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goodled.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goodmineral.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goodpad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goodpawn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goodpig.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goodproof.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goodschain.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goodtea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goodteach.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goodtour.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goodwhois.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gorce.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gorodskoy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gotomap.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goudafu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gougengduo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goupiao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goushuang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gousou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goutui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gouwen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goyoyo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gpsbag.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gpsking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gpskit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gqms.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gracze.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gradinarit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "grahamedgecombe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "grainmills.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "grammark.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gramywszachy.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "granadella.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "granddi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "grandmass.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "grandshipping.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "grandwill.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "graphenecompany.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "grapheneenergy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "grapheneindustry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "graphenepower.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "graphenesolution.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "grapixo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "graureiher.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gravenhage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gravide.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "graviditeten.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gravimeter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gravirpro.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "greatchemical.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "greateuro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "green5g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "greenconcern.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "greencups.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "greengdp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "greenhandy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "greenmath.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "greenmongolia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "greennappy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "greenparcel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "greenphp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "greenvillas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "greenwelcome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gregston.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "greifzange.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "grenzach.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "grillcoffee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "grizelda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "grnbank.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "groeten.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "grosspay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "groundscale.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "grow100.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gruenwedels-restaurant.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gruvan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gruzija.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "grzelka.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "grzesiak.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gstehlik.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gtzq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guangku.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guangquan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guangri.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guangshen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guangsheng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guangsteel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guangzhoutower.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guangzhu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guanhai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guanhuai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guanjiapo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guanlu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guanquan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guanxiong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guardiagrele.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gubernur.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gubia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gudao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gudonghui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gugao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guideline-pro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guigen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guitarchops.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gulfcan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gulshankumar.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gumeng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gummischlauch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guncao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gunting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guoai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guoda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guodongdou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guohuo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guoqiu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guorenzhang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guoyang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guozheng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guozhenhao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guozu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guping.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gurnick.edu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gusli.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gusto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gutenbergschule.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gutscheinconnection.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guxin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guyi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guzun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gxcic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gxmzb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gxsat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gxsd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gygps.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gymnasien.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gyql.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gzdh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gzfair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gzfund.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gzhl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gznow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gzrf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gzstny.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hababy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "habous.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hacico.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hadget.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hadotifpc.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hafedh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hahongchang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "haichan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "haichuang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "haidelong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "haifun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "haigao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "haigua.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "haihuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "haihui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "haikoubank.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "haikouwan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "haililai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hainanair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hainanjifan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hainantour.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hainu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "haiqiang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hairfalls.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hairson.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "haishishanmeng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "haisou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hakao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "halmide.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "halogod.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hamarang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hamasu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hamate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hamburga.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hamedi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hamorrhoiden.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hanasakigani.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hancl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "handcity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "handfeel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "handimage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "handpack.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "handpiece.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "handschuhfach.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "handsome-samurai.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "handtest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "handwell.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hangbai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hangkei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hangoff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hangqin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hangqing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hangshi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hangtu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hanguo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hangzhoubank.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hanham.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hanscare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hansee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hanzun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "haochilao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "haodadang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "haofeng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "haogong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "haohaidong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "haohui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "haojiehaodai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "haojiehaohuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "haojun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "haoke.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "haomi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "haomin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "haoming.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "haoshijia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "haoxiangchi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "haoyan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "haozhuangtai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hapiao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "happy-watches.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "happyeden.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "happyfitness.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "happyktv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "happyphp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "haqi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "haramiler.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "harborttagning.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "harbourring.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hardfirm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hardjump.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hardpay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hardplay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "harghita.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hargita.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "harmonytour.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "harrisonphotography.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hascan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hatelabo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hatsoft.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hatsukoi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hatsweb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hausarzt-nw.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hausarzt-nw.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hautemarne.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "havle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hawit-steuerberatung.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hawit-steuerberatung.support", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hayatuna.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hazare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hb315.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hbfund.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hblike.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hbqx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hbradio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hbshop.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hddoor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hdunited.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "headdisplay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "headsoft.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "healthhopper.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "healthmedication.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hearchina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "heartwing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hebeea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hebit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "heimgarten.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "heisses.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hejiahuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "heliman.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hellfish.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hellomac.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hellopet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "help360.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hemphopper.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hengchu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hengchuang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hengeloschebieren.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hengri.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hengwa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hengzhan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "henmei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hensin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "herbisan.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "herecafe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hermessenger.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hername.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "heroway.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "herzi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "herzlichen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "herzlos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "heshen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hexag.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hexene.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hexis.hr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hfjt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hfwk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hhkg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hi5g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hi6g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hibeijing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hicrown.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hiddensource.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hidemaru.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "highendtalk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "highname.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "highneed.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "highshow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "highsun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "highthink.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "highwell.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "higsm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hiinternational.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hijyen-belgesi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hikid.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hillcottagessuffolk.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hineck.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hipda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hirechina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hiromi.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hisound.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hisource.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hisself.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hisu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hitoy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hkav.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hkd.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hkde.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hkdns.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hkfair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hkfront.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hkline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hkmade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hksfc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hlav.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hnfda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hnfund.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hnzq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hoatai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hobbykreativ.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hobbysfinden.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hochzeiteinladung.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hokende.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hokia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hokusetsu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "holeshoes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hollomanfss.marketing", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hollywell.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "holori.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "holystar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "holzhauser.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "home33.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "homebush.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "homerfund.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "honeng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "honeyday.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "honeyking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "honeypotcloud.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hongjinlong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hongkongmade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "honglu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hongmeiwang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hongneng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hongqingting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hongshengtong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hongshunde.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hongtao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hongwai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hongxiaodou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hongxue.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hongzhuanchang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "honva.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hoofdsteden.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "horata.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hornada.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "horsechina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "horselife.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hostde.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hostfog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hostingformula.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hostingru.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hostingtalks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hotanswer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hotarticle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hotaruakane.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hotbbs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hotdig.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hotdns.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hotel-navis.hr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hoteltrend.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hotelturbo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hotentry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hotfilter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hotforum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hotgis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hotisp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hotmms.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hotnovel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hotrider.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hottrick.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hotwhois.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hotworm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "houban.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "houdou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "houniaozu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "housefund.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "housten.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "howave.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "howlite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "howway.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hr100.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hrbroker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hrbust.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hrknuddel.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hrpark.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hrsec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "htdq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "htxx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huabang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huachuang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huading.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huahuahua.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huaiming.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huajuapan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huakan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huaken.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huameng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huamianhu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huanchong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huandeng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huangrun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huangtai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huanju.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huanqiuxing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huanxu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huanyu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huapont.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huarenda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huashifen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huaying.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hubeibank.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hugefilm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huhaobo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huichengche.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huichengda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huichun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huicui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huiguniang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huijiao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huijun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huimeili.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huimin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huimou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huinong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huiqun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huirengu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huiri.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huiruan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huirun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huist.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huiton.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huizhijia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huluhulu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "humaniora.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hunanbank.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hungmedia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hunhun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hunjia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hunmeng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hunyin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huomei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huoxing.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huoyou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huozhen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hurbo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hustenmittel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hutianyi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hutongyou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huwaiquan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "huxian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hxbank.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hxchem.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hxdsj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hxse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hyds.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hyperjewel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hzib.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hzsx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "i-cup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ialomita.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ibesa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ibyen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "icfree.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "icieducation.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "icompassion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "icpcb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "icphone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "icreader.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ictrade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "icy.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "idall.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "idbm.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "idcgo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ideapanda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ideasdeals.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "idisl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "idsusa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ieach.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ifasfest2022.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ifixture.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ifpma.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ifuns.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "igaku.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "iglessydopena.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ignacy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ihainan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ihres.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ihrname.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "iimpress.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ilkmat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ilosaarirock.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ilovebee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ilovechina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ilovepig.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "imageagent.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "imageboom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "imagefort.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "imagegarden.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "imagehood.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "imageink.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "imagepak.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "imagesbank.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "imaginativesolution.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "imajjeans.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "imanol.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "imbis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "imepita.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "impcomp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "improvehome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "impulsiveness.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "imutter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "in2app.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "increse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "indiada.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "indiangolf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "indianpet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "indiantea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "indiasec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "indomarine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "inecho.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "info4all.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "infobeta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "infocart.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "infonavi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "inform24.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "informationcost.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "informika.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "infort.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "infoticker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "infowaywebsolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "iniitian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "inkking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "inmini.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "innenraumgestaltung.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "innerhtml.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "insankamil.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "insercion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "inshave.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "insidedomain.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "insideprint.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "insql.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "instantperson.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "integrieren.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "inteligenta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "intelligentagents.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "interhr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "interise.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "intermessage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "internetbrand.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "internethand.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "internetwing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "interparticle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "interpret.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "intimint.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "into4d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "intocloud.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "intranasal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "invest-into.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "investmap.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "invoicely.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ionita.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ip-kameri.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ipameri.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "iphonerecycling.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "iplscore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ipnrt.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ipv6china.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "iqsuperman.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "iraklio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "iranvpn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "iratten.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ircube.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "irreality.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "islam360.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "islamchina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "islamhotels.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "islamsky.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ismaskine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ismet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "isomaker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "israw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "it-inzhener.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "itaguai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "italianerd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "italyclub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "italymade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "itauba.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "itbar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "itbeijing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "itbj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "itechcom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "itfarmer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "itfj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "itfounder.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "itidc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "itll.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "itmoto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "itomasa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "itopen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "itren.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "itse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "itself.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "itt-shop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ittm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ittreservations.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ittspangdahlem.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "iune.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "iwaiting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "j-sen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "j-storm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "j2se.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jablanac.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jabrah.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jacitara.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jackcon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jackiestp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jade360.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jadmaker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jahanhost.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jailolo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jakoo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jakubek.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jalajala.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jamat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jankurtz.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "japanesechess.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "japanesespring.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "japannic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "japanpack.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "japanpacking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "japanpet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "japanspring.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jasonf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "javaca.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "javatraining.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "javlin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jbcharleston.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jcgp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jdcw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jeewanmantra.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jenry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jeudy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jeweils.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jforest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jhby.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jhcd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jiachang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jiahong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jiajiafu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jialing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jianbai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jianbao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jiandong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jiangao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jiangdao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jianghong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jiangrun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jiangshun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jianhong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jianing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jianmao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jianshangjia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jianshenjiaolian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jiansu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jianxiong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jianzan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jiaofei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jiaohuanji.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jiaopeng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jiaoxia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jiaozhun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jiate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jiatemei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jiaze.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jiazhun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jichuang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jichuangbao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jiechu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jiedao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jiehunlifu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jieli.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jieneng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jienengdeng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jienika.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jienuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jier.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jiezhan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jigou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jijinchaoshi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jikiden.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jilintv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jimage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jimix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jinbanshou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jinfei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jinfukang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jinggou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jingjinbao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jingku.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jingpin.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jingren.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jingshishang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jingtu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jingzhun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jinhaitang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jinhangdao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jinhuaham.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jinlimei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jinliufu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jinnong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jinrongda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jinrongka.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jinshayu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jinsui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jintanglang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jinwb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jinweida.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jinyantang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jiongku.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jiqiren.la", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jishiduo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jishou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jiuchen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jiujia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jiuxue.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jiuzhou.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jiuzuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jizushan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jjmm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jlkg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jmlegrand.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jmtrv.com.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jobsoul.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jocafil.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "joeone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jogosfutebolhoje.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jogou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "johanesburgo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jojoportal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jokic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "joline.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "joshgrancell.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jostedalsbreen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "joybuck.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "joybull.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "joycompany.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "joyindex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "joyking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "joytoday.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "joytouch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jpgraph.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jpngamerswiki.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jrkyushu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jrodekake.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jsfee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jsrd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jszb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jtjn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jtlsoftware.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "judian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "juexue.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jugendfrei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jugendpresse-hessen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jugglery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "juheqi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jumenglai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jump4life.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "junen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "juneshow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "juneville.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "junhi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "junkudo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "junsheng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "junte.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "junzhan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jurados.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jurathek.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jurina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jushang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jushen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "justindianporn.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "justspa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jwds.blog", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jwds.support", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jxfund.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jxkg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jxtour.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jybj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jz.lc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jzgf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jzpc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "k-den.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kabarr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kadifekale.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kadini.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kaefa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kaibisheng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kaidi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kaiduo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kailecai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kaime.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kaipeng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kairuitan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kaishen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kaitong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kaitseliit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kaixi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kaizhi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kakarotto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kakeng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kaling.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kalottlyrikal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kaltendin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kaltmiete.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kaluwa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kamanjab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kambal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kamishiro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kampuste.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kamudi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kamusen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kangce.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kangde.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kangguo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kangmeijia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kangneng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kangning.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kangwanda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kangxing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kangzao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kangzi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kano.fan", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kantai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kaogong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kaoshi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kaozhong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kapian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kapine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kaputelefon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "karadzic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kardiak.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "karels.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "karfreitag.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "karlis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "karnegi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "karyou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kasapi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kasendorf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kashs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kashta-svgeorgi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kasitime.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kassapa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kassian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kasumu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "katah.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "katalogen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "katanya.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "katcenter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "katjuscha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "katprint.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kavinchauhan.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kebiao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kedao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kedoutuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kefou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "keguo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "keguomei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kekedou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kemeida.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kenca.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kendier.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kennerley.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kennt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kenyabus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "keper.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "keppner.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "keralamurals.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kerkhoven.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kerstdagen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kespa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ketnoitre.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ketupat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "keyfriend.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kezhun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kfzgewerbe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "khalass.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kichhoat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kidiu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kidsgam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "killfire.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kilwa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kimaindia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kimerald.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kimonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kinanta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kinderenglisch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kindery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kindlylive.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kineticit.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kingboom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kingbyte.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kingcan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kingceramic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kingera.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kinghope.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kinghwa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kingjoy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kingkiss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kinglife.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kingmate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kingmould.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kingroot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kingsky.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kingsnow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kingtreasure.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kingyard.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kinichi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kinse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kintoki.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kisat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kitabin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kitteh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kiyoharu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kjeller.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kkcomcon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kksshop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kksshop.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kladka.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "klape.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kleinlich.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kmelektronik.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "knallgas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kneten.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kniffo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "knightclub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kobachi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kodjo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "koerbe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "koforidua.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kohlenmonoxid.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kohorta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kokwatersport.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kollegie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "komerc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kometaups.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kommuniziert.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "konfo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kong.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kongping.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kongqi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kongxi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "koniu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kontaktlos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kontonummern.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "konvas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "koopmansamenwerking.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kopanel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kopfhaut.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kopplung.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "koreabar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "koreacan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "koreadns.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "koreaec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "koreancan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "koreanhouse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "koreashow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "koreasun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "korttipeli.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kosuzume.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kot.gay", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kotlety.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kotsuru.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "koubie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "koucha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kouris.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kouroussa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "krabber.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kraftfahrzeug.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "krajobrazy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "krautsalat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kreiden.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "krempe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kroliki.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ksgemeinde.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ktosexy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ku-ku.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kuaiba.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kuaide.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kuaideng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kuaifu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kuaihua.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kuaijia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kuaijian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kuaike.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kuaise.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kuaishai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kuaisuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kuaixiaopin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kuaizhao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kuaizhuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kuanheng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kuanneng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kuanpu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kuanshi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kubetsu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kuchiran.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kudelskisecurity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kuhang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kuida.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kujiong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kukin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kuluma.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kument.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kumoi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kumran.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kunchan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kundenstimmen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kunsanfss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kunyit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kunzha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kupit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kurial.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kurum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kuwabara.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kuzhan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kuzhina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kwansei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kyllburg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kyusaku.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "laaldea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lab-recherche-environnement.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "labcontrol.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lacatolica.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lacht.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ladycandy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ladychina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ladydrink.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ladyspa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ladystreet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "laflota.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lahella.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "laibo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "laideshi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "laipigou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lakeice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lakenheathfss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lakenheathfss.marketing", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lakenheathfss.support", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lalababy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lalatina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lalcora.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lamalla.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lambek.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "laminado.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lamula.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lan4you.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "landiy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "landmaker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "landpower.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "landshop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "landstep.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "landstrasse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "landtender.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "landun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lanelane.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "langmei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "languageispower.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lanjian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lanren.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lantai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "laodafang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "laodongli.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "laodou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "laohuo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "laonianren.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "laoshaoye.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "laoshijing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "laozhengxing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "laserdr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lasersec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "laspilas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lastchancestore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lastenrad-gifhorn.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "latchlink.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "latexbedding.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "latinolatino.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "latrinite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "laumat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lauthai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lavideo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lavoretti.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lawal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lazynet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ldts.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "le-therapeute.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "leading.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "leadmed.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "leadseal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "leadtour.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "leadtrend.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "leafpad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "learndoj.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "learndrive.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "learnmba.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "learnsurf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lebesgue.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lecang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lecheng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lecsafe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ledboss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "leding.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "leduo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "leehk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "legacktem.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "legalventure.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "legardeur.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "legendtour.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "legioiedifrancy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lehrte.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "leicaclub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "leics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lejazz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lejiangnan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lemzarcapital.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lengkujia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lengnuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lengqiji.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lenneth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lenstest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lentuo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "leola.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "leonardostart.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "leonidova.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lepad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lephone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "leplayer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "leqing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "leslhassadeluminia.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "letai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lethus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "levalbuterol.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "levathan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "leyangyang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "leyouyou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lezhe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "liangce.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "liangdun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "liange.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "liangke.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "liangmian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "liangneng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "liangpu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "liankao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lianmei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lianmi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lianqiao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lianrong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "liansuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "liantao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lianxin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "liaoqu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "liaotian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "liaoyou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lidenghai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "liechun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "liegu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "liehu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "liesun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "liet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lifeatthemax.graphics", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lifeatthemax.marketing", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lifeatthemax.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lifepub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "liftwatch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ligapolska.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lightinglamp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lightingstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lightmatrix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lightred.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ligou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "liina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "likeall.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "limid.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lindapark.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lindernational.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lindin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "line12.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "linefire.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "linenhire.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "linetea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "linewish.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lingdun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "linghouse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "linghun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lingnong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lingwa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "linjie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "linju.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "linkai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "linkfuture.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "linuos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "linux-techie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "linuxfan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "linxiaji.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lipice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "liqiao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lirpa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lishizhen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lisme.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "listen.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "litao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "littery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "littlecash.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "liubai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "liucheng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "liunian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "liuquanju.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "liuyuanyuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "livada.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "livealarm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "livefussball.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "liveryman.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "livetsgoda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "livewood.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lixiaoshuang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lixu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "liyong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lizhu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "llcj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "loador.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "loanandgo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "locallure.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "localtour.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "locationcloud.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "locknote.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lofthotel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "logisticschina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "logrotate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "loliloli.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lomat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lompat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "longbright.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "longburn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "longcare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "longfengchengxiang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "longjing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "longlu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "longmashe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "longmenzhen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "longtanhu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "longting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "longwig.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lordhanuman.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lorib.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lorimar.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "losperone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lostroyanos.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lostwing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lostwood.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lotsynergy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lottome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lotussport.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "louvered.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "louyu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lovelyone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "loverday.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lovershop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "loversky.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "loveyouhome.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lowesttax.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lowwatch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lubei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lubrary.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lucky7s.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "luckyap.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "luckyfeel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "luckyhat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "luckymarks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lucrez.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "luftschloss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "luguang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "luhaifeng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "luhaitong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "luiza-fashion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lumpofsugar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lunaburner.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "luolao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lurun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lutricia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "luxin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "luyan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "luyisi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "luzha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "luzheng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lvkao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lvshilou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lvup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lvyi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lwwz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lyyb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "m.ac", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "macai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "macchinetta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "machados.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "machchina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "maclayer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "macroblog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "macroleader.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "macrowisdom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "madeforfuture.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "madeinchn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "madeinfuture.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "madeinthefuture.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "madrasas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mafiatown.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mafikeng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "magaganda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "magbrand.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "magdas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "magentazorg.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "magfoto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "magicbra.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "magicchina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "magicic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "magicpet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "magnosautos.ng", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "magschool.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mahalla.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "maharashtrian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mahari.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "maijisen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mail263.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mailyard.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "maimea.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mainspy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mainworks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "maishai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "maisong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "majdanpek.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "majorat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "makaka.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "makalon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "makecom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "makefirst.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "malanhua.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "malatown.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "malavoi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "malinau.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "malkuth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "malsu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mamacoolinar.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mambruk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "maminky.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mammatus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mamontovas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mamusi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mamuti.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mangrenanmo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "maniak.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "manimi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "maninfo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "maning.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mankee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "manouba.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mansourah.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mansyur.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mantanweb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "manuele.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "manycheap.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "manygifts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "maofang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mapleader.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mappen24.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "maqun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "marcab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "marcheuparis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "marfuri.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "marife.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mario420.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "markdorf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "marketingfact.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "marriagetip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "marsrepublic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "martinmeier.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "maschen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "masharphomecooking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mashu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "masite.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "maskavo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "masped.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "massage360.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "masterkong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mastodonperu.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "matejka.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "matelaslatex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "materialscity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "matlabhelper.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "matomeplus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "matureheart.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "maulia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "maunabo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "maussan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "maxcoffee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "maxdeposit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "maxfee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "maxforum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "maxiforum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "maxkit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "maxsee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "maxue.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "maxwinner.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mayinglong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mayknow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mazurskie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mbrental.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mccarthystonefoundation.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mccsquantico.marketing", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mcdonalds.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mcescher.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mcgillsbuses.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "md5checker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meatbeyond.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mebeltorg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meblowy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mechanic.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mechatrolink.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mechnet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meciuri.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meclip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "medienhandbuch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mediniti.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meditbe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mediumvoyant.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "medza.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meetadult.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meetblack.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meethr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meettrade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meetworld.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "megaopto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "megapanel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "megashine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meichuang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meichuniang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meierjia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meign.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meileke.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meining.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meinkonto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meint.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meiruike.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meishao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meisheng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meishun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meisie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "melanggar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meldknop.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "melnikova.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "melsungenonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "melulu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "memoryoflight.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "menghao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "menglecheng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "menja.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "menlogov-admin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "menschenfresser.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "menuchina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "menucost.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "menumagic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "menwai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "merine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "merkava.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mesagne.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mesense.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meskalin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "messines.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "metafest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "metalcan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "metalpackage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "metalpacking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "metaprivatewealth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "methol.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meuluxomultimarcas.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meuscabeloscacheados.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mezica.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mfavis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mfmarquesantos.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "miangua.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mianhu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "miaobo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "miaofan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "miaohe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "miaohua.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "miaolian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "miaomiaodian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "miaopu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "miaosheng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "miaoshi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "miaosi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "miaosuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "miaoti.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "miaowei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "miaoxian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "michalszotkowski.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mietgutachten.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "miitec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mijp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mikuru.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "milaneziadvocacia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "milika.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "militarypumps.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "milkcrown.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "millenari.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "millenniumark.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "millionmark.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mimada.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mimura.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "minbai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "minecity.fun", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "minestealth.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "minghai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mingjun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mingmingde.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mingtong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "minifocus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "minigold.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mininurse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "minnekort.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mipiao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mirandakids.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "misilmeri.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "misri.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "miteru.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mitsubishi-motors.com.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mjcstsul2022.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mkl.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mmbase.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mmfarm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mmfish.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "moakler.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mobilerainbow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mobtube.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mochet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mocomoco.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "modeblog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "modeopfer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "moegi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mogadiscio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mohrs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mohrss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "moirre.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mokykla.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "moldcam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "molddesigner.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "molimao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "moller.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "monachium.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mondnacht.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "moneymiss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "moneyspeaking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "monkeychip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "monoboom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mononet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "monopoint.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "monosecret.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "monowalk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "montejomoving.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "montha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "moodyfssrequest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "moongreen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "moonhosting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "moonrice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "moorhen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mopw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "morawin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "morchella.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "more2see.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "more4ham.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "morepixels.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "morethanmiles.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "morgu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "morhen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "morillos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mortgageabroad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mosebacke.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mostav.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mostcom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mostgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "motards.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "motherherb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "motoidea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "motordearranque.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "motorman.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "motueka.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "moucha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mouldmarket.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mousetouch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "moute.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "movieswork.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "movingfingers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mpinfo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mptri.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mqtv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mrqq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "msomsanime.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mthfgon.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "muchtv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mufeng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "muhanga.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "muiderberg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mullahs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mullica.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "multibands.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "multicomm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "multidrug.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "multiftp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "multihoster.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "multirisk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "multiwind.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "multiwinds.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "multiwoods.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mungen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "munic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "murighiol.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "murmeltiere.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "musicalibre.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "musikclub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "musikern.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "musipan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "muslim360.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "muslimchina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "musta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mutari.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mutecity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mutsen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mutualine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "my-host.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "myarentcar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mybread.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mybulletin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mycba.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mycgc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "myconcern.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "myconvert.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mycourtesy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mycpc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mydiving.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "myec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "myfirework.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "myfireworks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "myfr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mygmbh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mygpu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "myhell.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "myhostings.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "myhurlburt.marketing", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "myhurt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "myidc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "myinvisibleknapsack.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "myjrq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mylighter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mylost.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mymad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mymedal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mymovein.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mynte.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "myoptical.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mypaste.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mysakura.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "myselling.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "myshaping.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mysorry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mysteryplay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mysurfhostel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mytailors.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mytasty.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "myunraid.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mywilling.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mywings.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "myworry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mzzq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "n4all.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "naarhuis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nachdenkseiten.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nachnahme.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nachteile.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nachum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nadesico.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nafhroaviano.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nafil.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nailsshop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "naita.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "najamudin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "namesun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "namkwong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "namusu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nanhuo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nanjingroad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nanjingstreet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nanjizhou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nankeyiyuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nanlian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nanofe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nanoking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nanxincang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nanyuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nanziyiyuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "naoxiu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "napcafe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "napervilleweather.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "narben.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "narcisme.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "narios.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "narodnjaci.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nartyaustria.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "narusasu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nas-redes-sociais.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nashoucai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nasimi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "naszakasa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "natgo.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nationalisp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "natropath.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "natural.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "natureleads.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "naveah.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "navigation.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "navkan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nbtax.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ncastillo.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ncnz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ndcancercoalition.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ndcancercoalition.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ndkn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "neapol.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nechu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "negin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "neighbour.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "neiranji.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nekochan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nellislife.marketing", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nelmondo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nengda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nengjin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nengli.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nengshang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nensyu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "neoeclectic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "neogrowth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "neoportal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "neotoric.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nerdevice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nerdrush.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nervecomputing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nervehosting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nervepay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nerveux.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "neshtata.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nestbau.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nestsystem.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "net001.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "net007.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "netbroker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "netcapitals.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "netcattle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "netempresas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "netfairy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "netfever.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "netjes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "netken.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "netled.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "netmarry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "netmm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "netmv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "netobur.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "netolice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "netpub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "netpurity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nettender.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nettopics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "netvod.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "netwings.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "network13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "neuber-it.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "neurenberg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "neuroleptika.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "neuwertig.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "new4all.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newage.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newcandle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newdistance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newelectronic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newexcel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newfate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newferry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newhour.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "neworient.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "neworiental.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newpoly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newportal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newpower.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newrelax.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "news4me.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newtags.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newworldedu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newzen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nextcloudcn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nextregistration.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nft-dev-web.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nft-qa-web.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nft-uat-web.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nftsarmor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nftsshield.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "niaoren.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nicebbs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nicecarbon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "niceceo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "niceherbs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "niceking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nicepaint.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nicepc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "niceriver.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "niceteam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nicetest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nichong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nicolasfriedli.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nidiya.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nielian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nieuwnieuws.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nigah.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nigc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nihai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "niit-mts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "niit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nikako.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nimfa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ninepower.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ningbai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ningcheng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ningnu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "niusou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "njtw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nmgks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nndd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nnnovel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "no1hosting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "no8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "noadd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nobco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nocinco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nocountry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nodaka.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "noenglish.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nofeeling.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nofund.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nohohon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "noidlikes.coffee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "noips.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nokton.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nonggongshang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nongling.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nongtai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nongxin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "norato.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "noresi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "norheim.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "north22.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "northernair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "northstand.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "norwayfashion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "noskov.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "notorious.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "notyour.chat", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nounai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nourin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "novaer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "novantaphotonics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nowhelp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nowsave.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nqhomeinsurance.gov.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nuanqipian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nuevodia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nuinui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nukka.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "numerli.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nur-test.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nux.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nvziyiyuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nykf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "oaksclub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "obcina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "oberbekleidung.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "oberg.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "obleke.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "obqvi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "octroi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "odakyu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "offer.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "office4less.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "officebaby.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "officemoney.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "officeol.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "official.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "offsale.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ofiara.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ogrodzenie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ohikkoshi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "oiyou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "okaukuejo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "okayair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "okcase.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "okeb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "okecie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "oklove.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "okoro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "oksay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "oktoplus.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "okweld.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "okwork.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "okzf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "oleggio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "oliete.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "omedetou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "omniarts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "omniclimate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "onderwereld.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "onebread.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "oneeight.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "onejoy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "oneled.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "onich.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "online-learning.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "onlinecoating.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "onlinesim.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "onlinesz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "onlycafe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "onlychip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "onlyfeel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "onlyflower.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "onlymagazine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "onlypcb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "onlyperson.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "onlypic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "onlytouch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "opendocu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "openeu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "openfast.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "openred.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "openregion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "opernball.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "opick.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "opid.my.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "opticalchina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "opticalmeasure.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "opticalproduct.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "opticalvalley.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "opticstest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "opticway.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "optiinstrument.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "optimizer.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "optojapan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "optokorea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "optyka.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "optymizm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "oquee.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "orange100.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "orangeoffice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "orchitech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ordinarygirl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ordonnancement.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "orendatattoo.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "organicchateau.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "organicfishery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "organicmanic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "orgasmos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "orges.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "orientalfund.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "orientalview.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "orilliacdc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "orize.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ortsmitte.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "osakidetza.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "osegredo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "osiu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ossso.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ostatni.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ostroumov.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "otakara.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ottapalam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ottenberg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ottenere.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "oudenburg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ourec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ourislam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ourracing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ourradio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "owdeutschland.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "owfactory.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "owndomain.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "owndomains.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ownhost.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ownhosting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ownpet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ownsky.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "oxydac.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "p4.pm", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pack4you.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "packchina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "packingmedia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "packingtech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "padamu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "paging.blog", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "paieska.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "paifangquan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "paint4me.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "paishen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pake.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "palama.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "palestyna.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "palife.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "palmkid.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "palmsky.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "palucamoveis.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pamoko.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pamulang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "panaceainfosec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pandainfo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pandesign.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pando-market.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pandorasale.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pandyland.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "panegyric.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pangdou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "panthee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pantswalker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "papagaj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "papagayos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "papatek.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "papercase.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "papershome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "parametar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "parantes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "parasi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pario.li", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "parisnormandyimmobilier.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "parkall.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "parkingland.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "parkinglane.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "parkingmedia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "parkleader.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "parkmore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "parmenide.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "parnumaa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "parsam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "parteneriat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "partneroffice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "partnersed.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "paslog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "passenger.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pastbuy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "paswa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pateko.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pathfinder.kiwi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "patmond.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pawb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pawnchina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pawsafer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "paybyfinger.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "paybyvoice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "paycommission.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "paypension.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pazeamor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pbaby.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pcbar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pcbdesigner.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pcbird.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pcbtrade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pcera.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pcfun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pchand.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pclover.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pcmedik.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pcrid.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pcsec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "peaca.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "peacesky.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "peakchina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pearserver.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pecchina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pedrola.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pelant.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pembhi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pendencia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "penglai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pengrun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pensen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "peoplesfood.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "peopleupdate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pereyda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "perfectaccount.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "perfectlace.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "perfumecentre.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "permadi.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "perreiraproperties.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pesail.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "petchina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "petclaws.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pethick.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "petidea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "petjapan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "petpie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "petro.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "petrol.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "petsidea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pettownrecife.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pfirsich.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pfron.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "phalcon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pharrel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "phiidf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "phoenixcargo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "phonesky.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "photoair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "photocon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "photoelastic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "photoeyes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "photohard.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "photonicsjapan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "photonicskorea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "phpbox.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "phpcheck.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "phpday.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "phpfan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "phpfans.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "phpline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "phpmate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "phpobfuscator.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "phpunit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "phpwin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "physio-koenigsee.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pianzaihuang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "piaofang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "piaolaoda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "piaoshang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "piapia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pibao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "picatavocat.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "picdo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pickchina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pickerl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "picture4u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "piekarnia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "piekne.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pieksa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pigejixie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pijian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pingbanche.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pingbandiannao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pinjian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pinjiushi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pinkshow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pinoyworld.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "piratenpartei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pirmas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pirofire.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "piroscafo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pisarze.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "piuttosto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "piyue.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pjy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "planetafm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "plart.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "plasticcan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "playdisc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "plclub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pleadings.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pleaseoffer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "plmchina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "plumbingseattle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "plusinn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pmmagazin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pochan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pochard.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pocketdocument.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pocketec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pocztex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pojiezhe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pokaza.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pokazywarka.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pokerfrage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "polchat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "polski-dentysta-birmingham.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "polvamaa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "poly-daitron.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "polyarny.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "polycargo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "polygas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "polyshoes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "polystaff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "polystorm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "polywoven.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pomadas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pondoland.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "popcar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "portaaporta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "portalgeo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "portalsmdc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "portes-imaginaire.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "portfelj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "portglenone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "porumbel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "positioncloud.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "posteridea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "potrosac.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "poupi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "powercoder.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "powerfort.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "powerht.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "powerinn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "powerladies.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "powerleader.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "powerspoke.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "powervalley.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ppfcalculator.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "praful.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "prawer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "prchal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pregatire.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "prematur.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "premiery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "prepub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "presscad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "presseecho.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "presshawk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "prestec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "prester.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "prettybed.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "prettycoffee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "prettyrun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "prettytour.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "prevale.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "priceok.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "prices4u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pricesuggestion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "priedieu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "prieten.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "priez.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "primeman.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "primit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "primorac.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "primorsk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "primorski.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "prismjoy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "prisonbird.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "privacyway.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "private.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "privatecolor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "privateexpert.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pro-moed.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "proacksecurity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "proantab.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "profese.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "programshow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "prometteur.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "promocionais.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "propertyslovenia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "propulse.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "proteinaceous.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "proton.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "prywatnie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "przekazy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "przybysz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "psii.global", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "psiint.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "psikotest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pspshare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pstool.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pttgc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "publiccache.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "publiccdn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pucrio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "puiying.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pukavik.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pulem.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pupsic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pura-terra.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pureftpd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pushan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pusignan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "puur-memorie.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "puzhao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pxq1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pyotr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pyramydair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pytania.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "q-cup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "q-gen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qcchina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qdfz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qdkx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qdnh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qfamily.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qgtv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qhmj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qiabu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qianfan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qiangshen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qiangsheng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qiangxiangou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qianhang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qianlong.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qianmu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qianpi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qianshuo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qianzhanggui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qiaojiashan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qiaolegou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qiaosi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qiaosou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qiaowu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qiapin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qiayuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qicaixiang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qicaiyunnan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qicang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qidong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qifei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qihc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qilianshan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qinde.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qingdu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qingjie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qingkuai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qingsha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qingwatai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qinhuangshan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qinianzhiyang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qinshen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qinxu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qiongmai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qiongmeng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qipaiba.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qipaishan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qisas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qishu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qiuke.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qiupi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qiuyiwenyao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qixiong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qlsh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qmeeting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qnck.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qqclub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qtao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qtoy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "quaman.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "quande.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "quanmei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "quanpan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "quanqu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "quanquan.com.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "quanshe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "quansong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "quantemplate.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "quantto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "quanyou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "quanyuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "quarantined.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "quban.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qudong.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "queencdn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "querodireito.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "querycat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "quickdog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "quickengine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "quickpin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "quicktree.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "quietbed.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "quiten.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qunce.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qunkong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "quyuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qysh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "radionikkei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "radiovale.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "radstake.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "raidnet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rainband.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rainbowheart.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rainchina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rakor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rammin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "randleman.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ranelagh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rangong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rankseo.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "raonic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rapid4all.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rapidall.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rappisexshop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rat.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ratenkauf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rathenow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ratinger.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ratusca.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rayphone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rcyy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "reachfree.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "readbar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "real2000.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "real3d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "reality.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "realmake.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "reaven.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "reccel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "recinzione.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "recoilbox.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "recyclebar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "redac.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "redconsultant.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "redcursor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "reddj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "reddrops.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "redfairy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "redfan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "redfilter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "redgermany.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "redlinux.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "redloan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "redpink.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "redrescue.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "redschool.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "redseasons.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "redtime.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "redtrip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "redusa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "redvpn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "reenasky.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "refood.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "refuelmcconnell.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "refuelmcconnell.marketing", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "regidores.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "registercenter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "registry.quebec", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "reguladordevoltagem.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rehena.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rehiring.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rehon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "reifeisen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "reiseguiden.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "reisevista.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "relaxtea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "relaxtone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "releas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "relei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "relock.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "remsoft.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "renavam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rencia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "renkang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rennbahnen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "renovationen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "renshi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "renshoubaoxian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "renshouxian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rensou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "renyang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "renyou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "repan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "repong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "represa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "reqie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "reshipi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "resimi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "resolutewealthmanagement.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "resthof.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "restinga.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "restspace.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "revisando.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rewardadvantage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rewei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rewolucja.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rfgadvisory.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rfgadvisorywealth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rhblood.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rhovanion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "richbag.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "richstore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "riecht-besser.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "riesenrad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rihui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ringde.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ringen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ringerhut.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rinkhockey.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rioto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "riskchina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "risko.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "risong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ritian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ritonavir.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ritrium.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ritsen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "riveroakaa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rixiu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rizer.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rmfund.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "roadbridge.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "roaders.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "roadlamp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rockplan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rodoanel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rodrigamer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "romaria.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "romatel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ron.com.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rongbang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rongling.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ronshen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "roquetaillade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rosemarry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rosetime.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rostory.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rougong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rougucha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rouniu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "roushu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rouvroy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rouzhi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rowis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "roxhillmedia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "royal5858.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "royal6868.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "royalstone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "royaltherme.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "royalthermes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rozenmaiden.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rpower.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rszm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rt-inc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rttreservations.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rtvdrenthe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ruanbiao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ruanmeng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ruateresa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ruchem.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ruecommune.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ruefach.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ruffy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ruhong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ruianda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ruicheng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ruifu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ruijian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ruimao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ruimei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ruiyate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rulota.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "runcitadel.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "runfang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rungie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "runlide.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "runqiao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "runtian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ruokalista.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ruolan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ruoman.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ruris.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ruschina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rushfood.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rusweb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ruthai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ruyan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ryancmassey.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sacerdos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sacio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sadducee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sadkowski.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "saelen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "safeback.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "safechina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "safefly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "safepilots.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "saferpaw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "safetymatter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sagam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sagrera.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "saguri.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sahek.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "saidui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "saimachang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "saintfun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sainthall.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "saiqiang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "saiquan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "saisao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "saitu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sallyheerenveen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "salon-yuan.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "saltprint.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "salway.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sambiloto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sameip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "samnanger.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "samodelki.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "samoti.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "samsunghalfmarathon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "samtak.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "samudranesia.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "san0j.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sanbadao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sanbaishan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sanchine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sanchit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sancraft.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sandgroper.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sanditong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sandrah.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sandres.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sandset.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sandytech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sanfengqiao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sangai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sangmei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sangpu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sanguo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sangxia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "saniku.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sanlg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sanlitun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sanoa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sanpower.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "santom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sanxiabank.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sanyuanli.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "saochang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "saponaria.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "saporita.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sarahmoon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "saraphim.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sardenha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sarsat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sasuhina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sasusaku.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "satanta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "satiran.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "satuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "save360.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "savemyexams.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "savvystagingaz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sawontv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sayaman.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "saybay24.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sayhere.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "scaloni.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "scandesk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "scatterd.im", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "scatternet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "scdmx.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "schadenersatz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "schalldaempfer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "schattig.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "schaurig.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "scheggia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "schiriportal.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "schluckt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "schnippering.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "schockwellenreiter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "schoolvpn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "schottenrock.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "schuim.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "schulzentrum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "schutzhuelle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "scienceway.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "screenpower.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "scriptrock.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "scutere.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "scytart.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sdbc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sdmed.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sdpay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sdzp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "seabooking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "seabull.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "seafishing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "seagrace.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "seal-tite.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "seaqueen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "searchbt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "searchraider.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "season5.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "seasonhouse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "seberi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sebewaing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "secdaemons.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "secretofmana.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "securecan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sedam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "seegate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "seeonee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sefiller.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "seflow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "segcl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "seherezada.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sekku.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "selectingredient.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "selldesign.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "selldomain.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sellhost.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sellvitamin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sellvpn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sellvps.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "selv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "semaru.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "semati.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "semiha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "semistar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "senbil.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sendgoods.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "seninle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "seniorsuite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "seniya.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "senlida.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "senrui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sens-en-eveil.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "senye.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "seriennummern.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "serigrafia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "serioushost.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "serioussex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "serou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "serserim.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "servechina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "serverpc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "serx.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sesriem.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sesuatu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "settembre.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "settimomilanese.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "seuche.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sewcloud.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sexdisk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sexexplorer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sexfeel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sexnext.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sexplaza.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sfchina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sfmyc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sgnec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sgplus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sguardi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shaanxibank.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shackleton.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shadingyu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shahadah.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shaichang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shaidan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shaike.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shaixuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shalala.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shancun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shandianyou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shandonggold.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shandun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shangduan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shanghaiair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shanghaibull.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shanghaicis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shanghaicloud.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shanghao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shangling.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shangmai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shangqingyin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shangqu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shangyibao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shangyun.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shanhetao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shanxiu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shaobin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shaoguang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shaoneng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shaoning.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shaori.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shaoxing.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shaoyongfeng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shaping.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sharedreview.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sharkpc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sharptruth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shaygan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shcsystems.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shelflation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shende.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shendy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shengchanli.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shenggao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shengguangdian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shengkun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shenglue.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shengnong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shengteng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shengxinfu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shengyangtai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shengzhuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shenlian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shenpang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shensun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shenwai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shenye.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shgy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shidax.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shider.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shiduo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shigotoarimasu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shijichuang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shile.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shinesun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shinmai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shinru.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shipinhuiyi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shipinmoxing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shipmedia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shippingmark.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shiralee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shiti.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shitu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shiwen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shiwu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shobon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shockprotect.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shonengahosha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shopmenu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shopsnear.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shoujidang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shoumaiji.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shoumi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shoushui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shouzhongyou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shqd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shsec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shssl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shtex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shuaijia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shuajia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shuangde.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shuanghong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shuangjia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shuangjian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shuangli.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shuangrenjian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shuanke.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shuikong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shuirun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shuishangyou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shuishou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shuiyaojing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shuiyu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shuizu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shujian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shuling.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shumatong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shunbao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shunlian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shunlin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shunyu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shuoban.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shuokao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shuotang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shuozhe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shusong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shutoko.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shuxun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shxyt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sicherheitsdatenblatt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sikisi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "siliconcompany.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "siluette.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "silvergrand.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "silveris.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "silverwhale.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "simapo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "simbadda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "simoon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "simplefruit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "simplybird.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "simtouch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "since1979.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sing4you.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "singaporefranchise.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "singershow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "singledoor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinobeauty.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinobond.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinocard.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinoceramics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinocloud.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinocredit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinodiy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinodna.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinoexpo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinofair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinofurniture.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinogate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinoge.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinogem.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinogis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinoherb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinohorse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinohorses.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinoicp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinoinfo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinoinsure.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinoiptv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinoisp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinokid.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinolaser.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinolaws.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinolife.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinologistic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinolook.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinoluck.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinomet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinooa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinooptics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinopatent.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinopicture.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinoplastics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinopoint.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinorient.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinorisk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinosale.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinosat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinosight.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinosilicon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinosports.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinotouch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinovalue.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinovideo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinovisa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinovpn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinowave.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinowin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sinsin.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sirnas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sitecost.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sitefromzero.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "siteincubator.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "siten.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "siterepublic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "siteua.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sitrust.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "siyuetian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sjfss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sjfss.marketing", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sjukdomar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "skeptisch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "skruen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "skrypty.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "skyfirm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "skyislam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "skyknow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "skymaker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "skymass.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "skypioneer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "slaveflash.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sleeping360.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sleestak.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "slientnight.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "slikovnice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "slipmatt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "slipshade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "slobsbeer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sloopautonoordholland.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sloticagames.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "slovenskej.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "slowmove.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "slowtraveller.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "smallpark.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "smallpleasure.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "smallrain.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "smartem.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "smartguardzone.kr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "smartlandapartments.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "smfan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "smicro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "smiec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "smilingdream.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "smsdoor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "smsnic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "smspuls.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "smsshop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "smstree.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "smt123.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "smtcinema.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "smutny.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "smygehuk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sneakview.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "snorerx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "snowfood.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "snowly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sns-tg.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "so6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "soccerforfuture.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "soface.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sofirm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "softbus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "softchinese.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "softcrack.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "softheal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "softsauna.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "soim.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sokuyomi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "solarni.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "solidshare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "solutico.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "somovie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "songhui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "songshu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "songyan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sorent.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sosote.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "souchong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sougen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "souhuoche.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "soulan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "soumu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "soundshop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "soundsoap.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "soute.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "southspring.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "souxiu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "soy.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "spa365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "spaceboot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "spacemeter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "spaconsultants.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "spahiu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "spainoliveoil.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "spanbilt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "spark.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "spartour.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "spaturbo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "spavanje.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "spearson.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "special.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "specialistdoctor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "speedcrown.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "speedlearning.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "speeduse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "speedzone.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "spermageil.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "spherometer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "spicymemory.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "spiel77.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "spisanie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "spojrzenie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "spomen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sponichi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sportro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sportslim.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "spotkania.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "springsnow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sprintwork.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "spritzt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sprizzo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "spruche.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "spthk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sqec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "squaredtechnologies.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "srochno.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "srsbusiness.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "srzero.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ssepec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sskamo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sskb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sskduesseldorf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sslsites.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stadtsteinach.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stannary.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "starken.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "starlong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "startparadies.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stategrid.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stayman.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "staysound.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stbmedia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "steamcafe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "steinbach.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stellios.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sten.photography", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stepgate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sternatia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sternenkinder.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sternschnuppe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "steroidswiki.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sterowniki.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sterydy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stiliste.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stilling.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stimage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stimula.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stock2000.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stockfly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stolarstwo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stomatologiczne.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stonedimension.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stonedwarf5.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stonelegend.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stonesandmore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stonesworks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stoneup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stopthief.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "store123.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "storme.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stornieren.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "storyauto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "straftaten.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "straja.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stramproy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "strazburg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "streetbasketball.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "streetvideo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stremiz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stressfreiheit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "strongervision.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stronghermoney.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stroynet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "studiu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stunfisk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stupava.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stupidcomputer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stylebymax.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stzq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "submeta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "subwalk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "successor.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "suchbegriffe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "suchseite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sudcaliforniano.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sugarappointment.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "suhang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "suizas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sujitang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sukma.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sumate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sumdata.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sumut.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "suncheck.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "suneli.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sunjie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sunnybar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sunnyclub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sunnydeal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sunpo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sunwik.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sunwukong.com.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "suochong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "suomessa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "suomija.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "suoyi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "super0.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "super800.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "superbbs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "superbdomain.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "superccd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "superdan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "superemployer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "superidc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "supermare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "superpole.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "supervod.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "superwing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "supremehat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "surfplan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "surun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "surveygator.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "susteel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sustine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "suzannejauchius.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "suzhehui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "svampbob.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sviatzoo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "swabia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sweetbroom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sweethope.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "swfencrypt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "swiatzdrowia.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "swingwomenswellness.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "swissing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "switchboard.lgbt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sxfund.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sxpx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sxrw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sxwb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sychev.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "syfund.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "symbolisch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "syoboi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "syrcb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "system64.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "szam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "szax.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "szcm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "szdsj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "szegeden.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "szerbia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "szerelmes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "szfilm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sziluett.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "szky.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "szpub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "szpv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "szqz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "szrb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "szse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "szsec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "szw-hessen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "szyszkowitz.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tabletek.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tagbin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tagesgeldnews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "taggeru.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tagscloud.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tagsten.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tahrim.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "taidou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "taijiang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "taikou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tailorshirt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "taims.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tairuide.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "taitin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "taiwancan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "taiwancpa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "taiwanexcellence.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "taiwannic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "taiwanplaza.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "taiwanprize.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "taiwanstudy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "taixin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "takhshlaw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "taksirat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "talleyupconsult.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tallycompany.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tambahan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tambiet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tamboras.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tamsi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tamuda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tanacsok.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tanaria.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tangiblesnft.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tangwei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tangzhou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tankdeckel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tanmi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tanud.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "taochongqing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "taodujia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "taoge.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "taogengdi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "taohaiwai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "taojiaqi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "taojiehun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "taojifen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "taojijin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "taojiudian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "taokorea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "taokuaidi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "taoqicheng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "taoqu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "taoshai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "taoshengyi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "taoshishang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "taoshiyi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "taotaiwan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "taotoa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "taoweifang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "taozhaopin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tarancon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tarbawi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tarence.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "targetpad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tarifen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tarilian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tariqat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tasktrek.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tastechina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tastetasty.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tasuma.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tatangalar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tataru.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tattoochina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tauchkurs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tauris.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tdht.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "teaandcafe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "teachingfinance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "teacompany.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "teafire.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "teamboomer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "teamrising.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "teamtruth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "teamtuning.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "teapub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tearaid.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "teaunion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "teban.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tech4founders.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "techcad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "techcomp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "techiseasy.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "technician.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "technodemarkt.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "technolojik.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "techopark.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "techtag.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tedroche.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tehillimforall.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tehranmarket.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "teilwert.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tekme.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tekson.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tel400.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "telecomhelp.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "telescopi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "telesport.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "telexpo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "telhotel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "teljoy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "telohagopor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "temama.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "temat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tematu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tembisa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tempconverter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "temuduga.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tenderbar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tenebra.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tengdafeng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tengdi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tengfu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tenghui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tengtai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tenham.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tenli.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tenlong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tennisversand.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tenro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tensimeter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tentou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tentsuppliers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tenuo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tenzan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "terapista.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "terial.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "terramundi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "terun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "testic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "testing.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "testtable.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tezuo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tgenotary.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thackers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thailandtip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thaimassages.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thaiwind.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thaiwriter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thecarriagerooms.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thelawnandsprinklerguys.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thelematics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thepenn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thermostiefel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "theweald.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thewisdomtrust.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thinkandcode.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thinkdomain.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thinkfortune.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thinkglasses.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thinkguard.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thinkhappiness.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thinkingclub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thinkmaking.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thinknext.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thinkoffer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thinktip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thiocyanate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "threatint.com.cy", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thundertalk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thyrosol.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tianbiao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tianherun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tianjie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tianling.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tiannong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tianqia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tianqiu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tiansha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tianshenghe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tiantuo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tianxin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tianxiu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tianyong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tianzun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tiaoji.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tiaoping.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tiaoseban.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tiaosepan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tiberia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tibetair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ticai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tidaipin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tidenews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tieli.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tierforum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tiewang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tieyun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tiffanie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tigerengine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tigerfocus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tigin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tikom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tilpa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "timbertreasure.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "timbertreasures.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "timefinger.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "timeregion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "timeway.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "timeword.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "timmit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tingla.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tingrou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tinhay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tinkerliving.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tintable.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tintfilm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tinyc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tipaza.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tipcon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tipness.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tipocambio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "titaniumconsulting.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tizhen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tizimin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tjck.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tjdx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tjec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tjeea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tjjt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tjzq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tmbservis.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "toachina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "toberich.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tockwith.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "todayer.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "todayfund.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "todayname.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "toendra.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "toetsenbord.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tohkan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tohoko.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "toifa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "toiyeuem.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tokyo-pack.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tokyocare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tokyopack.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "toldos.curitiba.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tomask.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tombari.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tomislava.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tomotech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tompay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tomq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tongchunyuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tongka.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tonglv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tongxinfu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tongxuncheng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tonwaren.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tonypandy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "toonippo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tooro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "top800.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "topav.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "topbright.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "topchip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "topclaim.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "topdisco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "topessence.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "topfest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "topgod.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "topktv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "topolcany.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "topoptics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "toppawn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "topregion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "topsas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "topspeak.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "topuv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "topwarez.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "topweapon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "topwonder.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "topyouth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "torchiarolo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "torchmc.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tornano.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "toshikazu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "totalbooking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "totalcotton.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "totalitglobal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "totole.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "touchfinger.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "touchfm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "touchfuture.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "touchhome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "touchs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "toufu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tourismusstudium.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tousu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "touteslestherapies.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "touzhuji.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "townvilla.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "toyer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "toyshowthemusical.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "toysunion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tpetrov.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "trabajoen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "traderjobs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tradeyep.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tradingarchitecture.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "trahk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "trainingchannel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tranbjerg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "trandafiri.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "transcurrent.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "transparency.org.pk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "transparenti.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "transporturi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "trapics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "travelclear.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "travellingwithflipflops.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "travuscka.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "treasurechina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "treff24.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "trekanten.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "trekkingindia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "trescinco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tridoor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "trige.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "trinken.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tripass.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "triplepower.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "trisound.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tristi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tritiumcompany.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tritower.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "trochilus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "trofish.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tropiano.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tropicoco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "troubleshooting.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "troubleshootyourvehicle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "truck123.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "truecamera.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "truethink.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tsee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tshu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tsmax.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tsukai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tsuris.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tuandao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tuanke.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tubchair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tubercolosi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tudas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tuerqi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tuica.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tuiyi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tunnelvpn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tuoersuo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tuolaosuo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tupeng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "turbovm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "turkenburg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tuxtepec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tvadd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tvfusion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tvregion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tvrelax.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "twav.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "twbbs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "twbiz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "twfund.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "twhealth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "twpay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "twreg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "twtb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "txtb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "txwm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tyhw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tynews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tzby.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tzimisce.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "uasaumur.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ubigeo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ucartz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "uchiha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ucscard.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ufochina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ufuna.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ukrainka.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ukrbiz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ukstone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ulaganja.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ulceration.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ultrabay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ultraboot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ultrafree.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ultraseven.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ultratrend.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ultraweight.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ultrazoom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "umhlanga.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "umumi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "umweltwissen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "un-nft.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "unaligned.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "uncitral.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "under6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "undercover.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "underseal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "undip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "unganisha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "unheated.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "uniassit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "unicoffee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "uniearn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "unifeeds.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "unifei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "unijne.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "unijoy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "unikbio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "unionbenefit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "uniongain.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "unionlab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "unireach.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "unisee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "unisight.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "universalo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "universidadean.edu.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "uniword.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "unlimittech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "unmik.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "unremoved.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "unsubscribes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "untiefen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "unveilturkey.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "unwahr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "upguard.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "upmusic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "uptimeinfo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "urbantech.ws", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "urlaub.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "urluno.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "usaport.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "usawish.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "usedhandy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "userad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "uu1024.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "uuzc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "uyoung.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vaanga.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vaff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "valeriya.life", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "valivalcoach.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "valivalcommerce.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "valmadrera.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "valtio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "valueflow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vandenbergfss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vandring.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vanjava.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vanthink.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vantv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vasaconsulting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vatazhok.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vbeem.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vcsea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vcwill.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vefk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "veiligheidsschoenen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "velico.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vellant.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "venetien.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "venida.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ventania.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ventosport.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "verdreht.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "verenpaine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "verfolgung.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vergehen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vergleichmachtreich.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "verlassen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vermutlich.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "verotiedot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "verticalmindventures.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "verychat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "verygraphic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "verylove.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "verylover.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "veses.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vessentys.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "veterquimica.pe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "viacar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "victoriait.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "victoriait.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vidamusic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "videoshqip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "viditube.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vielli.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "viewip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vigasio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vimperator.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vinci-foundation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vinci-gestion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vinci-gestion.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vinnellarabia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vinoffice.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vipcan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "virtualaxes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "virtualchecker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "virutasdejamon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "virutasjamon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vision4tomorrow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "visionengine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "visionnext.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "visionpeak.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "visionwithoutlimits.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "visitexpo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vitalcity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vitaminok.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vittuone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vledder.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vodchina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "voetpunttwente.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vogatore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "voice4u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "voicechina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "voidnet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "volarewealth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "volarikcapital.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "volja.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "volt360.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vorarlberger.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vorleger.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vorticism.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vpnfog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vpnsite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vpntiger.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vrac-drive.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vracdrive.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vsbt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vulgai.re", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vurdering.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "w2ang.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "w3china.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wadin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wagne.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wahlrecht.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wahrhaftigkeit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "waide.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "waidu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "waihuibao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "waijingdi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "waimaidao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "waitlisting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wakeon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "waldkirchen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "walkchina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "walkhard.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "walkpad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "walshy.fail", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wanbiao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wangbaohe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wangcaigou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wangcan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wangdian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wanghuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wanghuitong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wanghuo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wangji.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wangjiaohui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wangju.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wangkao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wangkuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wangpai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wangpeng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wangpu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wangxuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wangyibao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wanjiadenghuo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wanjuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wanjuhui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wannianqing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wanpi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wanpingkou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wanquanhe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wanziqianhong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wararu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "warezguru.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "warily.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "warrs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wasgeht.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "watchdomain.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "watcheswonders.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "watchglee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "watchsky.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "watchzoom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "waterkloof.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "waterlabeq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "waterproducer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "watersweet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wavecharge.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "waveestetic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "waysport.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wazeibra.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wball.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wdhj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wdrmaus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "weathercare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "weavecloud.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "weavedreams.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "weaveindia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "web-sparkle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "webbeggar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "webcertificate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "webdisclaimer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "webera.lt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "webiz.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "webmotion.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "webprince.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "websitecontrol.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "websmartz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wecanfootball.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wedabout.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "weddingcelebrants.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "weddingsinbloom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wedelia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "weedtshirts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "weiban.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "weidun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "weiduo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "weightloss365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "weilai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "weilebao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "weimu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "weirou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "weishitong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "weitergehen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "weiyong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "weizhe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wellget.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wellproof.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wenfangsibao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wenjiao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wenjie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wenkong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wenkui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wenming.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wenrui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wenshi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wentura.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wenxi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wenxiao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wenyu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wenzhoufund.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "werist.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "werkenbijmagentazorg.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "werockyou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wertschatz-kommunikation.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "westcool.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "westlook.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "westrange.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "westtrip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "westtrust.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "weterynarz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wetnoodles.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wewin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "whampoa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "whitecontact.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "whitemanfss.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "whoiscare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "whoisdna.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "whqy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "whyparking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "whyseo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "whysoft.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wiederum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wierszyki.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wificloud.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wifiguard.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wiin.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wiiplay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wikimedium.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "willkommen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "willpeace.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "willshine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "willstore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "winboot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wincompany.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "windgreen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "windmolens.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "windowschina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "windpad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "windschott.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wingbo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wingsung.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "winner.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "winport.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "winreal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "winsound.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wintable.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wio.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wirelesswatcher.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wiseedu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wisestars.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wisetag.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wishedu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wishway.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wizjoner.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wobler.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wocang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wochentag.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wodzie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wojsko.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wolkenlos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "womanpub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "womart.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "womenofficersofindia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wonderbase.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "woodboy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "woqing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "workshop-spf.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "workshop-sync.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "worldcupcafe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "worldvm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "woyi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wpoznaniu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wptrigone.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wpunited.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wranglerworld.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wrightpattfss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wronki.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wsdac.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wta1000.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wucaishi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wuchangyu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wudangkungfu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wufenzhong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wuhua.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wuhugang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wulandari.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wulianshan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wunong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wushuadianji.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wuyan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wuzhishan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wyprzedaz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wzfund.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wzyb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x-sun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xaira.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xali.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xbeyond.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xbkf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xenosaga.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xfkj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xfqz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xfyq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xgcf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xhacker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xhby.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiancar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiande.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiangchao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiangdan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiangduo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiangduoduo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiangji.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiangjiaojixie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiangjiugui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiangpishu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiangquan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiangshui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiangsi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiangzhi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xianji.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xianmifang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xianrui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xianshang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiansiniao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiansou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xianteng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiantourism.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xianwei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xianweiyuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiaobawang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiaobian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiaobiao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiaochandi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiaochanqu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiaodaoxiaoxi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiaode.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiaoguanggao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiaohongmao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiaoke.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiaokeche.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiaoku.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiaolongxia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiaoneng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiaoping.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiaose.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiaoshou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiaotong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiaoyima.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiayimiao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xibing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiduo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiduolai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiehou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xigaodi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xijing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xikelai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xilanhua.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xilingele.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xinbai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xinban.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xinchang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xinchengda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xindongfang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xingdafeng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xinghong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xingkete.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xinglue.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xingmi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xingmu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xingshi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xingzhibao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xinhongqiao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xinkai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xinlehui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xinmama.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xinmou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xinnongbao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xinre.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xinrui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xinxiong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xinyetong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xinyongtong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xinzun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiongqi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xipiao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiqiahui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xishe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xishu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiucheng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiuhua.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiuniang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xiuqu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xixiashan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xjfund.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xjtvs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xjzw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xktv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xlover.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xlwf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xmfund.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xmklm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xmltv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xmrz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xmzq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--3iqa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--45qv91bb1m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--7br21al8r.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--7ou01x.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--7rsu4u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--bvs24c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--czr859l.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--eqr523b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--fcto26h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--fjq86k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--g5ty9l6v8b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--gtv031d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--hlrx03e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--hxt814e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--klyv21c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--ozvt97h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--pbt66g5b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--ruq84v.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--sjtz88d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--u2u172g.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--vzyp7a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--ykqxsg6sqp4cd861a.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--yny21h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--z1xm83a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xnoise.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xqtv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xtchem.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xtny.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xtopic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xttv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xuancui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xuanshantang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xudun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xuecheng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xuegou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xuemiao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xueyou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xugong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xujiacun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xujin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xunchong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xundong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xunhuanniu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xunjia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xunlie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xunlin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xunpay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xutv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xykh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yabaolu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yabolan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yacity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yadeju.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yaden.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yadmin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yakin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yakir.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yalian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yamasi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yameng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yaming.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yangchai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yangchong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yangcongtou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yangfan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yangjun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yangnong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yangsen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yangyun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yanhui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yanjing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yannan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yannanfei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yanpei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yanxieshi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yanyun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yaomao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yaoting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yaoyin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yaozhuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yaping.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yaqiang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yasad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yashop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yaspace.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yaymaker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yazhi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ybtv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ybzy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ycbw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ycck.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ydwmw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ydyq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yeahidea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yeahwho.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yedaxue.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yellowname.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yellowplane.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yerros.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yesika.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yesin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yesmotel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yesport.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yessite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yessky.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yetv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yhgy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yiguan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yijiuhuanxin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yikun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yilishen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yimengyuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yindang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yingjibao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yingkai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yingpin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yingzhiwen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yinquan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yinyouyuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yiqixiang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yirunda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yirunjia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yishimei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yisin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yiyao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yiyaotong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yiyiyuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yiyouqian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yiyuyan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yizhilu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yjxd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ylanan.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ymrz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ynec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ynfund.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ynnews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yogachina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yogamatte.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yokotafss.marketing", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yokusuru.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yolo.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yonathan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yondaime.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yonghun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yongjie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yongliu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yongren.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yongxingyuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yongzhong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yooneunhye.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "youchang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "youdejia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "youdontneedipv6.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "youjian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "youjigongchang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "youjipin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "youjishiwu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "youlemei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "youngshine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "youngster.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "youngswift.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "youqu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yourco2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yourforceserver.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yourforcesupport.events", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yourforcesupport.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yourforcesupport.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yourideal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yousheng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "youtube-notify.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "youyouqiu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "youzhigong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "youzhijia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yptx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ysound.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ystea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yuanbiao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yuanchandi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yuanchanqu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yuange.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yuanliang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yuanshou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yuanwei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yuanyuanyuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yuanzhong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yucejia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yuejiangnan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yuejiu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yueliangshan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yuelushan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yueqiuche.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yuer.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yuewu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yuezhang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yujiangshan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yujing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yungang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yunliao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yunnanbaiyao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yunnei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yunnong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yunpeng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yuntongbao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yunwei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yunzhai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yuren.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yushui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yuteng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yutian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yuxinglong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yuyandi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yuyanxue.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yuyin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yuyingou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yxfy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yxzb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yytd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yzfc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yzst.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yztv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zadnje.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zafree.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zagarolo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zagrabg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zahn-frankl.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zahorak.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zajebancija.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zajian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zaluan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zamuro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zangjing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zaoqi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zaoxing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zarafshan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zartrosa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zastore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zattevrienden.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zatzat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zbxa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zcgf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zdaz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zdlab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zdrowotne.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zearalenone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zeedieren.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zeezout.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zekerbewegenhengelo.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zendhost.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zenlong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zerofactory.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zeropet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zeropress.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zerrissen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zetapotential.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zeyer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zfgjj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zgcbc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zgedu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zggk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zgnq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zgsmc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zgsx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zgys.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhaijia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhaijibian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhaisou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhangfan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhangfeng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhanghao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhangze.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhanpai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhanzou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhaodiao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhaokuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhaoxinxi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhaso.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhcg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhekoujia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhekoujie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhenbianshu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhengkao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhengli.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhenglian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhengmai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhengpai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhengqian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhengwei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhengyi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhenjia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhenjian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhennong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhenqiang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zherang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhewang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhibeizhen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhifangda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhihai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhihui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhikang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhikao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhiku.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhikuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhile.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhili.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhiliang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhiligu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhiqiao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhiqu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhiquan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhirun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhishi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhitian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhiyun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhizao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhongchi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhongchong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhongjianjian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhongpeng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhongshen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhongshuai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhongxia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhouqu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhuangpei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhuanjia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhuanma.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhuanshun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhubuqi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhufutong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhugeliang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhuiqiu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhunqian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhunrun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhunxing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhuofu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhuojing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhuoke.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhuoyue.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhushikou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhuyuming.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zichan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ziethen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zifangzi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zigang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zimbabue.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ziming.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zineb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zipgraphics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zitadel.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zitadel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ziwu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zixiamen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zjcm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zjfund.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zjpv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zjtax.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zjwb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zlate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zlatniretriver.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zlinfo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zmmc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zonedirector.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zonfa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zongguan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zoomcdn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zoomlink.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zoomsight.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zoomsky.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zoosnet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zosco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zouque.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zouyou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zpdyj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zrozumienie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zryh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zset.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zsoltsandor.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ztchina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zttv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zuale.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zuanbaika.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zuancheng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zuichongqing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zuidong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zuinin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zuinvsheng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zuipinyin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zuishanghai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zuisichuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zuiwuxia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zukam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zukunfts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zukunftspolitik.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zunjie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zunming.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zuoshan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zushang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zustellung.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zuzun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zwerggarnelen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zycjd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zydb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zyhouse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     // END OF 1-YEAR BULK HSTS ENTRIES
 
     // Only eTLD+1 domains can be submitted automatically to hstspreload.org,
diff --git a/pdf/document_metadata.h b/pdf/document_metadata.h
index 615912b..6092be5 100644
--- a/pdf/document_metadata.h
+++ b/pdf/document_metadata.h
@@ -64,10 +64,6 @@
   // Attachment Annotations" of the ISO 32000-1:2008 spec).
   bool has_attachments = false;
 
-  // Whether the document is tagged (see section 14.8 "Tagged PDF" of the ISO
-  // 32000-1:2008 spec).
-  bool tagged = false;
-
   // The type of form contained in the document.
   FormType form_type = FormType::kNone;
 
diff --git a/pdf/metrics_handler.cc b/pdf/metrics_handler.cc
index 6e191d5..649c0613 100644
--- a/pdf/metrics_handler.cc
+++ b/pdf/metrics_handler.cc
@@ -22,14 +22,6 @@
   kMaxValue = kYes,
 };
 
-// These values are persisted to logs. Entries should not be renumbered and
-// numeric values should never be reused.
-enum class PdfIsTagged {
-  kNo = 0,
-  kYes = 1,
-  kMaxValue = kYes,
-};
-
 }  // namespace
 
 MetricsHandler::MetricsHandler() = default;
@@ -51,8 +43,6 @@
   base::UmaHistogramEnumeration(
       "PDF.HasAttachment", metadata.has_attachments ? PdfHasAttachment::kYes
                                                     : PdfHasAttachment::kNo);
-  base::UmaHistogramEnumeration(
-      "PDF.IsTagged", metadata.tagged ? PdfIsTagged::kYes : PdfIsTagged::kNo);
   base::UmaHistogramEnumeration("PDF.FormType", metadata.form_type);
 }
 
diff --git a/pdf/pdf_view_web_plugin_unittest.cc b/pdf/pdf_view_web_plugin_unittest.cc
index 3cdc776..e1932056 100644
--- a/pdf/pdf_view_web_plugin_unittest.cc
+++ b/pdf/pdf_view_web_plugin_unittest.cc
@@ -1171,7 +1171,6 @@
       metadata().page_count = 13u;
       metadata().linearized = true;
       metadata().has_attachments = true;
-      metadata().tagged = true;
       metadata().form_type = FormType::kAcroForm;
       metadata().title = "Title";
       metadata().author = "Author";
diff --git a/pdf/pdfium/pdfium_engine.cc b/pdf/pdfium/pdfium_engine.cc
index c015d4b0..b46a692 100644
--- a/pdf/pdfium/pdfium_engine.cc
+++ b/pdf/pdfium/pdfium_engine.cc
@@ -62,7 +62,6 @@
 #include "third_party/pdfium/public/cpp/fpdf_scopers.h"
 #include "third_party/pdfium/public/fpdf_annot.h"
 #include "third_party/pdfium/public/fpdf_attachment.h"
-#include "third_party/pdfium/public/fpdf_catalog.h"
 #include "third_party/pdfium/public/fpdf_ext.h"
 #include "third_party/pdfium/public/fpdf_fwlevent.h"
 #include "third_party/pdfium/public/fpdf_ppo.h"
@@ -4075,7 +4074,6 @@
   doc_metadata_.page_count = pages_.size();
   doc_metadata_.linearized = IsLinearized();
   doc_metadata_.has_attachments = !doc_attachment_info_list_.empty();
-  doc_metadata_.tagged = FPDFCatalog_IsTagged(doc());
   doc_metadata_.form_type = static_cast<FormType>(FPDF_GetFormType(doc()));
 
   // Document information dictionary entries
diff --git a/remoting/host/remote_open_url/remote_open_url_client_delegate_win.cc b/remoting/host/remote_open_url/remote_open_url_client_delegate_win.cc
index 9a70846..74bc84f75 100644
--- a/remoting/host/remote_open_url/remote_open_url_client_delegate_win.cc
+++ b/remoting/host/remote_open_url/remote_open_url_client_delegate_win.cc
@@ -6,8 +6,6 @@
 
 #include <windows.h>
 
-#include <shlwapi.h>
-
 #include <ios>
 #include <string>
 
@@ -17,6 +15,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/win/current_module.h"
 #include "base/win/default_apps_util.h"
+#include "base/win/shlwapi.h"
 #include "remoting/base/logging.h"
 #include "remoting/base/user_settings.h"
 #include "remoting/host/remote_open_url/remote_open_url_constants.h"
diff --git a/services/network/public/cpp/cross_origin_opener_policy.cc b/services/network/public/cpp/cross_origin_opener_policy.cc
index 652fcda..ad08d91 100644
--- a/services/network/public/cpp/cross_origin_opener_policy.cc
+++ b/services/network/public/cpp/cross_origin_opener_policy.cc
@@ -60,41 +60,25 @@
 
 // [spec]: https://html.spec.whatwg.org/C/#obtain-coop
 void AugmentCoopWithCoep(CrossOriginOpenerPolicy* coop,
-                         const CrossOriginEmbedderPolicy& coep,
-                         bool is_coop_soap_plus_coep_enabled) {
-  // COOP:
-  //
+                         const CrossOriginEmbedderPolicy& coep) {
   // [spec]: 4.1.2. If coep's value is compatible with cross-origin isolation,
   //                then set policy's value to "same-origin-plus-COEP".
+
+  // "COOP: same-origin" case.
   if (coop->value == mojom::CrossOriginOpenerPolicyValue::kSameOrigin &&
       CompatibleWithCrossOriginIsolated(coep.value)) {
     coop->value = mojom::CrossOriginOpenerPolicyValue::kSameOriginPlusCoep;
-  }
-
-  // COOP: SOAPPC case.
-  if (is_coop_soap_plus_coep_enabled &&
-      coop->value ==
-          mojom::CrossOriginOpenerPolicyValue::kSameOriginAllowPopups &&
-      CompatibleWithCrossOriginIsolated(coep.value)) {
-    coop->value =
-        mojom::CrossOriginOpenerPolicyValue::kSameOriginAllowPopupsPlusCoep;
-  }
-
-  // COOP: SOAP by default
-  if (coop->soap_by_default_value ==
-          mojom::CrossOriginOpenerPolicyValue::kSameOrigin &&
-      CompatibleWithCrossOriginIsolated(coep.value)) {
     coop->soap_by_default_value =
         mojom::CrossOriginOpenerPolicyValue::kSameOriginPlusCoep;
   }
 
-  // COOP: SOAP by default SOAPPC case.
-  if (is_coop_soap_plus_coep_enabled &&
-      coop->soap_by_default_value ==
-          mojom::CrossOriginOpenerPolicyValue::kSameOriginAllowPopups &&
+  // "COOP: restrict-properties" case.
+  if (coop->value == mojom::CrossOriginOpenerPolicyValue::kRestrictProperties &&
       CompatibleWithCrossOriginIsolated(coep.value)) {
+    coop->value =
+        mojom::CrossOriginOpenerPolicyValue::kRestrictPropertiesPlusCoep;
     coop->soap_by_default_value =
-        mojom::CrossOriginOpenerPolicyValue::kSameOriginAllowPopupsPlusCoep;
+        mojom::CrossOriginOpenerPolicyValue::kRestrictPropertiesPlusCoep;
   }
 
   // COOP-Report-Only:
@@ -110,14 +94,13 @@
         mojom::CrossOriginOpenerPolicyValue::kSameOriginPlusCoep;
   }
 
-  // COOP-Report-Only: SOAPPC case.
-  if (is_coop_soap_plus_coep_enabled &&
-      coop->report_only_value ==
-          mojom::CrossOriginOpenerPolicyValue::kSameOriginAllowPopups &&
+  // COOP: restrict-properties report-only case.
+  if (coop->report_only_value ==
+          mojom::CrossOriginOpenerPolicyValue::kRestrictProperties &&
       (CompatibleWithCrossOriginIsolated(coep.value) ||
        CompatibleWithCrossOriginIsolated(coep.report_only_value))) {
     coop->report_only_value =
-        mojom::CrossOriginOpenerPolicyValue::kSameOriginAllowPopupsPlusCoep;
+        mojom::CrossOriginOpenerPolicyValue::kRestrictPropertiesPlusCoep;
   }
 }
 
diff --git a/services/network/public/cpp/cross_origin_opener_policy.h b/services/network/public/cpp/cross_origin_opener_policy.h
index 7dd3b6de..97a808b 100644
--- a/services/network/public/cpp/cross_origin_opener_policy.h
+++ b/services/network/public/cpp/cross_origin_opener_policy.h
@@ -43,8 +43,7 @@
 
 COMPONENT_EXPORT(NETWORK_CPP_BASE)
 void AugmentCoopWithCoep(CrossOriginOpenerPolicy* coop,
-                         const CrossOriginEmbedderPolicy& coep,
-                         bool is_coop_soap_plus_coep_enabled);
+                         const CrossOriginEmbedderPolicy& coep);
 
 }  // namespace network
 
diff --git a/services/network/public/cpp/cross_origin_opener_policy_parser.cc b/services/network/public/cpp/cross_origin_opener_policy_parser.cc
index 48f4c9f..afc786f 100644
--- a/services/network/public/cpp/cross_origin_opener_policy_parser.cc
+++ b/services/network/public/cpp/cross_origin_opener_policy_parser.cc
@@ -21,6 +21,7 @@
     "Cross-Origin-Opener-Policy-Report-Only";
 constexpr char kSameOrigin[] = "same-origin";
 constexpr char kSameOriginAllowPopups[] = "same-origin-allow-popups";
+constexpr char kRestrictProperties[] = "restrict-properties";
 constexpr char kUnsafeNone[] = "unsafe-none";
 constexpr char kReportTo[] = "report-to";
 
@@ -52,6 +53,14 @@
             mojom::CrossOriginOpenerPolicyValue::kSameOriginAllowPopups;
       }
     }
+    if (base::FeatureList::IsEnabled(features::kCoopRestrictProperties) &&
+        policy_item == kRestrictProperties) {
+      *value = mojom::CrossOriginOpenerPolicyValue::kRestrictProperties;
+      if (soap_by_default_value) {
+        *soap_by_default_value =
+            mojom::CrossOriginOpenerPolicyValue::kRestrictProperties;
+      }
+    }
     if (policy_item == kUnsafeNone) {
       *value = mojom::CrossOriginOpenerPolicyValue::kUnsafeNone;
       if (soap_by_default_value) {
diff --git a/services/network/public/cpp/cross_origin_opener_policy_parser_unittest.cc b/services/network/public/cpp/cross_origin_opener_policy_parser_unittest.cc
index f1adce4..ae72f8e 100644
--- a/services/network/public/cpp/cross_origin_opener_policy_parser_unittest.cc
+++ b/services/network/public/cpp/cross_origin_opener_policy_parser_unittest.cc
@@ -16,31 +16,23 @@
 
 namespace network {
 
-class CrossOriginOpenerPolicyTest : public ::testing::Test,
-                                    public ::testing::WithParamInterface<bool> {
-};
-
-TEST_P(CrossOriginOpenerPolicyTest, Parse) {
+TEST(CrossOriginOpenerPolicyTest, Parse) {
   base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndEnableFeature(features::kCrossOriginOpenerPolicy);
-
-  // This allows us to test COOP: Same-Origin-Allow-Popups-Plus-Coep.
-  // The feature is currently off by default, but is passed to
-  // AugmentCoopWithCoep through a boolean, which is simulated here.
-  // See https://crbug.com/1221127 for details on the feature.
-  bool is_coop_soap_plus_coep_enabled = GetParam();
+  scoped_feature_list.InitWithFeatures(
+      {features::kCrossOriginOpenerPolicy, features::kCoopRestrictProperties},
+      {});
 
   using mojom::CrossOriginOpenerPolicyValue;
   constexpr auto kSameOrigin = CrossOriginOpenerPolicyValue::kSameOrigin;
   constexpr auto kSameOriginAllowPopups =
       CrossOriginOpenerPolicyValue::kSameOriginAllowPopups;
+  constexpr auto kRestrictProperties =
+      CrossOriginOpenerPolicyValue::kRestrictProperties;
   constexpr auto kUnsafeNone = CrossOriginOpenerPolicyValue::kUnsafeNone;
   constexpr auto kSameOriginPlusCoep =
       CrossOriginOpenerPolicyValue::kSameOriginPlusCoep;
-  auto kSameOriginAllowPopupsPlusCoepIfEnabled =
-      is_coop_soap_plus_coep_enabled
-          ? CrossOriginOpenerPolicyValue::kSameOriginAllowPopupsPlusCoep
-          : CrossOriginOpenerPolicyValue::kSameOriginAllowPopups;
+  constexpr auto kRestrictPropertiesPlusCoep =
+      CrossOriginOpenerPolicyValue::kRestrictPropertiesPlusCoep;
   constexpr auto kCoepNone = mojom::CrossOriginEmbedderPolicyValue::kNone;
   constexpr auto kCoepCorp =
       mojom::CrossOriginEmbedderPolicyValue::kRequireCorp;
@@ -64,10 +56,11 @@
       {"same-origin-allow-popups", kCoepNone, kNoHeader, kCoepNone, kNoEndpoint,
        kSameOriginAllowPopups, kSameOriginAllowPopups, kNoEndpoint,
        kUnsafeNone},
+      {"restrict-properties", kCoepNone, kNoHeader, kCoepNone, kNoEndpoint,
+       kRestrictProperties, kRestrictProperties, kNoEndpoint, kUnsafeNone},
       {"unsafe-none", kCoepNone, kNoHeader, kCoepNone, kNoEndpoint, kUnsafeNone,
-       kUnsafeNone,
+       kUnsafeNone, kNoEndpoint, kUnsafeNone},
 
-       kNoEndpoint, kUnsafeNone},
       // Leading whitespaces.
       {"   same-origin", kCoepNone, kNoHeader, kCoepNone, kNoEndpoint,
        kSameOrigin, kSameOrigin, kNoEndpoint, kUnsafeNone},
@@ -193,27 +186,25 @@
        kSameOrigin, kNoEndpoint, kUnsafeNone},
       // reporting Same-origin with COEP
       {kNoHeader, kCoepCorp, "same-origin", kCoepNone, kNoEndpoint, kUnsafeNone,
-       kSameOriginAllowPopupsPlusCoepIfEnabled, kNoEndpoint,
-       kSameOriginPlusCoep},
+       kSameOriginAllowPopups, kNoEndpoint, kSameOriginPlusCoep},
       // reporting Same-origin with reporting COEP
       {kNoHeader, kCoepNone, "same-origin", kCoepCorp, kNoEndpoint, kUnsafeNone,
        kSameOriginAllowPopups, kNoEndpoint, kSameOriginPlusCoep},
-      // Same-origin-allow-popups with COEP
-      {"same-origin-allow-popups", kCoepCorp, kNoHeader, kCoepNone, kNoEndpoint,
-       kSameOriginAllowPopupsPlusCoepIfEnabled,
-       kSameOriginAllowPopupsPlusCoepIfEnabled, kNoEndpoint, kUnsafeNone},
-      // Same-origin-allow-popups with report only COEP
-      {"same-origin-allow-popups", kCoepNone, kNoHeader, kCoepCorp, kNoEndpoint,
-       kSameOriginAllowPopups, kSameOriginAllowPopups, kNoEndpoint,
+      // restrict-properties with COEP
+      {"restrict-properties", kCoepCorp, kNoHeader, kCoepNone, kNoEndpoint,
+       kRestrictPropertiesPlusCoep, kRestrictPropertiesPlusCoep, kNoEndpoint,
        kUnsafeNone},
-      // reporting Same-origin-allow-popups with COEP
-      {kNoHeader, kCoepCorp, "same-origin-allow-popups", kCoepNone, kNoEndpoint,
-       kUnsafeNone, kSameOriginAllowPopupsPlusCoepIfEnabled, kNoEndpoint,
-       kSameOriginAllowPopupsPlusCoepIfEnabled},
-      // reporting Same-origin-allow-popups with reporting COEP
-      {kNoHeader, kCoepNone, "same-origin-allow-popups", kCoepCorp, kNoEndpoint,
+      // restrict-properties with report only COEP
+      {"restrict-properties", kCoepNone, kNoHeader, kCoepCorp, kNoEndpoint,
+       kRestrictProperties, kRestrictProperties, kNoEndpoint, kUnsafeNone},
+      // reporting restrict-properties with COEP
+      {kNoHeader, kCoepCorp, "restrict-properties", kCoepNone, kNoEndpoint,
        kUnsafeNone, kSameOriginAllowPopups, kNoEndpoint,
-       kSameOriginAllowPopupsPlusCoepIfEnabled},
+       kRestrictPropertiesPlusCoep},
+      // reporting restrict-properties with reporting COEP
+      {kNoHeader, kCoepNone, "restrict-properties", kCoepCorp, kNoEndpoint,
+       kUnsafeNone, kSameOriginAllowPopups, kNoEndpoint,
+       kRestrictPropertiesPlusCoep},
   };
 
   for (const auto& test_case : kTestCases) {
@@ -244,7 +235,7 @@
     network::CrossOriginEmbedderPolicy coep;
     coep.value = test_case.coep_value;
     coep.report_only_value = test_case.coep_report_only_value;
-    AugmentCoopWithCoep(&coop, coep, is_coop_soap_plus_coep_enabled);
+    AugmentCoopWithCoep(&coop, coep);
 
     EXPECT_EQ(test_case.expected_endpoint, coop.reporting_endpoint);
     EXPECT_EQ(test_case.expected_policy, coop.value);
@@ -256,8 +247,6 @@
   }
 }
 
-INSTANTIATE_TEST_SUITE_P(All, CrossOriginOpenerPolicyTest, testing::Bool());
-
 TEST(CrossOriginOpenerPolicyTest, Default) {
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitAndEnableFeature(features::kCrossOriginOpenerPolicy);
diff --git a/services/network/public/cpp/features.cc b/services/network/public/cpp/features.cc
index 081e8d7..ba42058 100644
--- a/services/network/public/cpp/features.cc
+++ b/services/network/public/cpp/features.cc
@@ -77,12 +77,13 @@
 const base::Feature kCrossOriginOpenerPolicyByDefault{
     "CrossOriginOpenerPolicyByDefault", base::FEATURE_DISABLED_BY_DEFAULT};
 
-// Introduce a new COOP value, Same-Origin-Opener-Policy-Plus-Coep, which grants
-// cross-origin isolation. This used mainly for testing the process model and
-// should not be enabled in any production code.
-// See https://crbug.com/1221127.
-const base::Feature kCoopSameOriginAllowPopupsPlusCoep{
-    "CoopSameOriginAllowPopupsPlusCoep", base::FEATURE_DISABLED_BY_DEFAULT};
+// Introduce a new COOP value: restrict-properties. It restricts window
+// properties that can be accessed by other pages. This also grants
+// crossOriginIsolated if coupled with an appropriate COEP header.
+// This used solely for testing the process model and should not be enabled in
+// any production code. See https://crbug.com/1221127.
+const base::Feature kCoopRestrictProperties{"CoopRestrictProperties",
+                                            base::FEATURE_DISABLED_BY_DEFAULT};
 
 // Enables or defaults splittup up server (not proxy) entries in the
 // HttpAuthCache.
diff --git a/services/network/public/cpp/features.h b/services/network/public/cpp/features.h
index 4222ac17..b5599ca 100644
--- a/services/network/public/cpp/features.h
+++ b/services/network/public/cpp/features.h
@@ -34,7 +34,7 @@
 COMPONENT_EXPORT(NETWORK_CPP)
 extern const base::Feature kCrossOriginOpenerPolicyByDefault;
 COMPONENT_EXPORT(NETWORK_CPP)
-extern const base::Feature kCoopSameOriginAllowPopupsPlusCoep;
+extern const base::Feature kCoopRestrictProperties;
 COMPONENT_EXPORT(NETWORK_CPP)
 extern const base::Feature kSplitAuthCacheByNetworkIsolationKey;
 COMPONENT_EXPORT(NETWORK_CPP)
diff --git a/services/network/public/mojom/cross_origin_opener_policy.mojom b/services/network/public/mojom/cross_origin_opener_policy.mojom
index b2a8320..f649d39 100644
--- a/services/network/public/mojom/cross_origin_opener_policy.mojom
+++ b/services/network/public/mojom/cross_origin_opener_policy.mojom
@@ -51,25 +51,30 @@
 
 // Cross-Origin-Opener-Policy enum representing parsed values.
 enum CrossOriginOpenerPolicyValue {
-  // Severs the opener relationship with openers/opened documents that are not
-  // same-origin.
-  kSameOrigin,
+  // No restriction is applied, the relationship is kept with openers and
+  // opened documents.
+  kUnsafeNone,
 
   // Severs the opener relationship with openers that are not same-origin while
   // keeping the relationship with opened documents, provided they don't have a
   // Cross-Origin-Opener-Policy themselves.
   kSameOriginAllowPopups,
 
-  // No restriction is applied, the relationship is kept with openers and
-  // opened documents.
-  kUnsafeNone,
+  // Severs the opener relationship with openers/opened documents that are not
+  // same-origin.
+  kSameOrigin,
 
-  // Same origin with Cross-Origin-Embedder-Policy: require-corp.
+  // COOP: same-origin with a COEP value compatible with crossOriginIsolation.
   kSameOriginPlusCoep,
 
-  // Same origin allow popups with Cross-Origin-Embedder-Policy: require-corp.
-  // Reserved for testing only at this stage. See https://crbug.com/1221127.
-  kSameOriginAllowPopupsPlusCoep,
+  // Restrict which window properties other pages can interact with and vice
+  // versa. Access of "closed" and "postMessage" remains possible across
+  // openers.
+  kRestrictProperties,
+
+  // COOP: restrict-properties with a COEP value compatible with
+  // crossOriginIsolation.
+  kRestrictPropertiesPlusCoep,
 };
 
 // Cross-Origin-Opener-Policy enum representing parsed values.
diff --git a/services/viz/privileged/mojom/compositing/renderer_settings.mojom b/services/viz/privileged/mojom/compositing/renderer_settings.mojom
index e14c091..6072567 100644
--- a/services/viz/privileged/mojom/compositing/renderer_settings.mojom
+++ b/services/viz/privileged/mojom/compositing/renderer_settings.mojom
@@ -18,7 +18,6 @@
   bool release_overlay_resources_after_gpu_query;
   bool should_clear_root_render_pass;
   int32 slow_down_compositing_scale_factor;
-  bool use_skia_renderer;
   bool auto_resize_output_surface;
   bool requires_alpha_channel;
 
diff --git a/services/viz/privileged/mojom/compositing/renderer_settings_mojom_traits.cc b/services/viz/privileged/mojom/compositing/renderer_settings_mojom_traits.cc
index 4a524238..19398e8 100644
--- a/services/viz/privileged/mojom/compositing/renderer_settings_mojom_traits.cc
+++ b/services/viz/privileged/mojom/compositing/renderer_settings_mojom_traits.cc
@@ -43,7 +43,6 @@
   out->highp_threshold_min = data.highp_threshold_min();
   out->slow_down_compositing_scale_factor =
       data.slow_down_compositing_scale_factor();
-  out->use_skia_renderer = data.use_skia_renderer();
   out->auto_resize_output_surface = data.auto_resize_output_surface();
   out->requires_alpha_channel = data.requires_alpha_channel();
 
diff --git a/services/viz/privileged/mojom/compositing/renderer_settings_mojom_traits.h b/services/viz/privileged/mojom/compositing/renderer_settings_mojom_traits.h
index 615288e..803d957 100644
--- a/services/viz/privileged/mojom/compositing/renderer_settings_mojom_traits.h
+++ b/services/viz/privileged/mojom/compositing/renderer_settings_mojom_traits.h
@@ -89,10 +89,6 @@
     return input.slow_down_compositing_scale_factor;
   }
 
-  static bool use_skia_renderer(const viz::RendererSettings& input) {
-    return input.use_skia_renderer;
-  }
-
   static bool auto_resize_output_surface(const viz::RendererSettings& input) {
     return input.auto_resize_output_surface;
   }
diff --git a/services/viz/privileged/mojom/mojom_traits_unittest.cc b/services/viz/privileged/mojom/mojom_traits_unittest.cc
index 151da95..b9d84d9 100644
--- a/services/viz/privileged/mojom/mojom_traits_unittest.cc
+++ b/services/viz/privileged/mojom/mojom_traits_unittest.cc
@@ -27,7 +27,6 @@
   input.should_clear_root_render_pass = false;
   input.release_overlay_resources_after_gpu_query = true;
   input.highp_threshold_min = -1;
-  input.use_skia_renderer = true;
 
   RendererSettings output;
   mojom::RendererSettings::Deserialize(
@@ -44,7 +43,6 @@
   EXPECT_EQ(input.release_overlay_resources_after_gpu_query,
             output.release_overlay_resources_after_gpu_query);
   EXPECT_EQ(input.highp_threshold_min, output.highp_threshold_min);
-  EXPECT_EQ(input.use_skia_renderer, output.use_skia_renderer);
 }
 
 TEST_F(StructTraitsTest, DebugRendererSettings) {
diff --git a/testing/buildbot/chrome.json b/testing/buildbot/chrome.json
index badceb4a5..720de30 100644
--- a/testing/buildbot/chrome.json
+++ b/testing/buildbot/chrome.json
@@ -2520,29 +2520,6 @@
         "test_id_prefix": "ninja://ui/aura:aura_unittests/"
       },
       {
-        "args": [
-          "--enable-features=UseSkiaRenderer"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "skia_renderer_aura_unittests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04",
-              "pool": "chrome.tests",
-              "ssd": "0"
-            }
-          ],
-          "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "aura_unittests",
-        "test_id_prefix": "ninja://ui/aura:aura_unittests/"
-      },
-      {
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json
index 3f3a4cc..265aa6e 100644
--- a/testing/buildbot/chromium.chromiumos.json
+++ b/testing/buildbot/chromium.chromiumos.json
@@ -960,55 +960,6 @@
     "isolated_scripts": [
       {
         "args": [
-          "--jobs=1",
-          "--browser=cros-chrome",
-          "--extra-browser-args=--enable-features=UseSkiaRenderer",
-          "--remote=127.0.0.1",
-          "--remote-ssh-port=9222",
-          "--typ-max-failures=3"
-        ],
-        "ci_only": true,
-        "isolate_name": "telemetry_unittests",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "skia_renderer_telemetry_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86",
-              "kvm": "1",
-              "os": "Ubuntu-18.04",
-              "pool": "chromium.tests"
-            }
-          ],
-          "idempotent": false,
-          "named_caches": [
-            {
-              "name": "cros_vm",
-              "path": "magic_cros_vm_cache"
-            }
-          ],
-          "optional_dimensions": {
-            "60": [
-              {
-                "caches": "cros_vm"
-              }
-            ]
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 24
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_unittests/"
-      },
-      {
-        "args": [
           "--browser=cros-chrome",
           "--remote=127.0.0.1",
           "--remote-ssh-port=9222",
@@ -1667,27 +1618,6 @@
         "test_id_prefix": "ninja://ui/aura:aura_unittests/"
       },
       {
-        "args": [
-          "--enable-features=UseSkiaRenderer"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "skia_renderer_aura_unittests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "aura_unittests",
-        "test_id_prefix": "ninja://ui/aura:aura_unittests/"
-      },
-      {
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -3294,28 +3224,6 @@
         "test_id_prefix": "ninja://ui/aura:aura_unittests/"
       },
       {
-        "args": [
-          "--enable-features=UseSkiaRenderer"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "skia_renderer_aura_unittests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "aura_unittests",
-        "test_id_prefix": "ninja://ui/aura:aura_unittests/"
-      },
-      {
         "isolate_profile_data": true,
         "merge": {
           "args": [],
@@ -5753,21 +5661,21 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5096.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5097.0/test_ash_chrome"
         ],
         "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "interactive_ui_tests Lacros version skew testing ash 104.0.5096.0",
+        "name": "interactive_ui_tests Lacros version skew testing ash 104.0.5097.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v104.0.5096.0",
-              "revision": "version:104.0.5096.0"
+              "location": "lacros_version_skew_tests_v104.0.5097.0",
+              "revision": "version:104.0.5097.0"
             }
           ],
           "dimension_sets": [
@@ -5780,7 +5688,7 @@
         },
         "test": "interactive_ui_tests",
         "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/",
-        "variant_id": "Lacros version skew testing ash 104.0.5096.0"
+        "variant_id": "Lacros version skew testing ash 104.0.5097.0"
       },
       {
         "isolate_profile_data": true,
@@ -5918,21 +5826,21 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5096.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5097.0/test_ash_chrome"
         ],
         "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests Lacros version skew testing ash 104.0.5096.0",
+        "name": "lacros_chrome_browsertests Lacros version skew testing ash 104.0.5097.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v104.0.5096.0",
-              "revision": "version:104.0.5096.0"
+              "location": "lacros_version_skew_tests_v104.0.5097.0",
+              "revision": "version:104.0.5097.0"
             }
           ],
           "dimension_sets": [
@@ -5944,7 +5852,7 @@
         },
         "test": "lacros_chrome_browsertests",
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/",
-        "variant_id": "Lacros version skew testing ash 104.0.5096.0"
+        "variant_id": "Lacros version skew testing ash 104.0.5097.0"
       },
       {
         "args": [
@@ -6064,21 +5972,21 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5096.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5097.0/test_ash_chrome"
         ],
         "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 104.0.5096.0",
+        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 104.0.5097.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v104.0.5096.0",
-              "revision": "version:104.0.5096.0"
+              "location": "lacros_version_skew_tests_v104.0.5097.0",
+              "revision": "version:104.0.5097.0"
             }
           ],
           "dimension_sets": [
@@ -6090,7 +5998,7 @@
         },
         "test": "lacros_chrome_browsertests_run_in_series",
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/",
-        "variant_id": "Lacros version skew testing ash 104.0.5096.0"
+        "variant_id": "Lacros version skew testing ash 104.0.5097.0"
       },
       {
         "isolate_profile_data": true,
diff --git a/testing/buildbot/chromium.dawn.json b/testing/buildbot/chromium.dawn.json
index 7e4b780..00d475b4 100644
--- a/testing/buildbot/chromium.dawn.json
+++ b/testing/buildbot/chromium.dawn.json
@@ -219,7 +219,7 @@
           "--flag-specific=webgpu",
           "--initialize-webgpu-adapter-at-startup-timeout-ms=60000",
           "--no-xvfb",
-          "--additional-driver-flag=--enable-features=UseSkiaRenderer,Vulkan",
+          "--additional-driver-flag=--enable-features=Vulkan",
           "--git-revision=${got_revision}"
         ],
         "isolate_name": "webgpu_blink_web_tests",
@@ -257,7 +257,7 @@
           "--timeout-ms=30000",
           "--initialize-webgpu-adapter-at-startup-timeout-ms=60000",
           "--no-xvfb",
-          "--additional-driver-flag=--enable-features=UseSkiaRenderer,Vulkan",
+          "--additional-driver-flag=--enable-features=Vulkan",
           "--git-revision=${got_revision}"
         ],
         "isolate_name": "webgpu_blink_web_tests",
@@ -296,7 +296,7 @@
           "--browser=release",
           "--passthrough",
           "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_high_performance_gpu --enable-features=UseSkiaRenderer,Vulkan",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_high_performance_gpu --enable-features=Vulkan",
           "--retry-limit=3"
         ],
         "isolate_name": "telemetry_gpu_integration_test",
@@ -543,7 +543,7 @@
           "--flag-specific=webgpu",
           "--initialize-webgpu-adapter-at-startup-timeout-ms=60000",
           "--no-xvfb",
-          "--additional-driver-flag=--enable-features=UseSkiaRenderer,Vulkan",
+          "--additional-driver-flag=--enable-features=Vulkan",
           "--git-revision=${got_revision}"
         ],
         "isolate_name": "webgpu_blink_web_tests",
@@ -581,7 +581,7 @@
           "--timeout-ms=30000",
           "--initialize-webgpu-adapter-at-startup-timeout-ms=60000",
           "--no-xvfb",
-          "--additional-driver-flag=--enable-features=UseSkiaRenderer,Vulkan",
+          "--additional-driver-flag=--enable-features=Vulkan",
           "--git-revision=${got_revision}"
         ],
         "isolate_name": "webgpu_blink_web_tests",
@@ -620,7 +620,7 @@
           "--browser=release",
           "--passthrough",
           "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_high_performance_gpu --enable-features=UseSkiaRenderer,Vulkan",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_high_performance_gpu --enable-features=Vulkan",
           "--retry-limit=3"
         ],
         "isolate_name": "telemetry_gpu_integration_test",
@@ -656,7 +656,7 @@
           "--browser=release",
           "--passthrough",
           "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_high_performance_gpu --enable-features=UseSkiaRenderer,Vulkan",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_high_performance_gpu --enable-features=Vulkan",
           "--enable-dawn-backend-validation",
           "--retry-limit=3"
         ],
@@ -904,7 +904,7 @@
           "--flag-specific=webgpu",
           "--initialize-webgpu-adapter-at-startup-timeout-ms=60000",
           "--no-xvfb",
-          "--additional-driver-flag=--enable-features=UseSkiaRenderer,Vulkan",
+          "--additional-driver-flag=--enable-features=Vulkan",
           "--git-revision=${got_revision}"
         ],
         "isolate_name": "webgpu_blink_web_tests",
@@ -942,7 +942,7 @@
           "--timeout-ms=30000",
           "--initialize-webgpu-adapter-at-startup-timeout-ms=60000",
           "--no-xvfb",
-          "--additional-driver-flag=--enable-features=UseSkiaRenderer,Vulkan",
+          "--additional-driver-flag=--enable-features=Vulkan",
           "--git-revision=${got_revision}"
         ],
         "isolate_name": "webgpu_blink_web_tests",
@@ -981,7 +981,7 @@
           "--browser=release",
           "--passthrough",
           "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_high_performance_gpu --enable-features=UseSkiaRenderer,Vulkan",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_high_performance_gpu --enable-features=Vulkan",
           "--retry-limit=3"
         ],
         "isolate_name": "telemetry_gpu_integration_test",
@@ -1228,7 +1228,7 @@
           "--flag-specific=webgpu",
           "--initialize-webgpu-adapter-at-startup-timeout-ms=60000",
           "--no-xvfb",
-          "--additional-driver-flag=--enable-features=UseSkiaRenderer,Vulkan",
+          "--additional-driver-flag=--enable-features=Vulkan",
           "--git-revision=${got_revision}"
         ],
         "isolate_name": "webgpu_blink_web_tests",
@@ -1266,7 +1266,7 @@
           "--timeout-ms=30000",
           "--initialize-webgpu-adapter-at-startup-timeout-ms=60000",
           "--no-xvfb",
-          "--additional-driver-flag=--enable-features=UseSkiaRenderer,Vulkan",
+          "--additional-driver-flag=--enable-features=Vulkan",
           "--git-revision=${got_revision}"
         ],
         "isolate_name": "webgpu_blink_web_tests",
@@ -1305,7 +1305,7 @@
           "--browser=release",
           "--passthrough",
           "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_high_performance_gpu --enable-features=UseSkiaRenderer,Vulkan",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_high_performance_gpu --enable-features=Vulkan",
           "--retry-limit=3"
         ],
         "isolate_name": "telemetry_gpu_integration_test",
@@ -1341,7 +1341,7 @@
           "--browser=release",
           "--passthrough",
           "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_high_performance_gpu --enable-features=UseSkiaRenderer,Vulkan",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_high_performance_gpu --enable-features=Vulkan",
           "--enable-dawn-backend-validation",
           "--retry-limit=3"
         ],
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index d8608fe..9c66fad 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -1743,31 +1743,6 @@
       },
       {
         "args": [
-          "--enable-features=UseSkiaRenderer",
-          "--test-launcher-print-test-stdio=always"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "skia_renderer_aura_unittests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Ubuntu-20.04"
-            }
-          ],
-          "expiration": 10800,
-          "hard_timeout": 7200,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "aura_unittests",
-        "test_id_prefix": "ninja://ui/aura:aura_unittests/"
-      },
-      {
-        "args": [
           "--test-launcher-print-test-stdio=always"
         ],
         "merge": {
@@ -5690,7 +5665,7 @@
           "--test-launcher-bot-mode",
           "--test-launcher-jobs=1",
           "--test-launcher-filter-file=../../testing/buildbot/filters/vulkan.content_browsertests.filter",
-          "--enable-features=UseSkiaRenderer,UiGpuRasterization,Vulkan",
+          "--enable-features=UiGpuRasterization,Vulkan",
           "--use-vulkan=swiftshader",
           "--enable-gpu-rasterization",
           "--disable-software-compositing-fallback",
@@ -18326,104 +18301,6 @@
       {
         "args": [
           "--browser=cros-chrome",
-          "--extra-browser-args=--enable-features=UseSkiaRenderer",
-          "--remote=127.0.0.1",
-          "--remote-ssh-port=9222",
-          "--xvfb",
-          "--typ-max-failures=3"
-        ],
-        "ci_only": true,
-        "isolate_name": "telemetry_perf_unittests",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "skia_renderer_telemetry_perf_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86",
-              "kvm": "1",
-              "os": "Ubuntu-18.04",
-              "pool": "chromium.tests"
-            }
-          ],
-          "idempotent": false,
-          "named_caches": [
-            {
-              "name": "cros_vm",
-              "path": "magic_cros_vm_cache"
-            }
-          ],
-          "optional_dimensions": {
-            "60": [
-              {
-                "caches": "cros_vm"
-              }
-            ]
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 6
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_perf_unittests/"
-      },
-      {
-        "args": [
-          "--jobs=1",
-          "--browser=cros-chrome",
-          "--extra-browser-args=--enable-features=UseSkiaRenderer",
-          "--remote=127.0.0.1",
-          "--remote-ssh-port=9222",
-          "--typ-max-failures=3"
-        ],
-        "ci_only": true,
-        "isolate_name": "telemetry_unittests",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "skia_renderer_telemetry_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86",
-              "kvm": "1",
-              "os": "Ubuntu-18.04",
-              "pool": "chromium.tests"
-            }
-          ],
-          "idempotent": false,
-          "named_caches": [
-            {
-              "name": "cros_vm",
-              "path": "magic_cros_vm_cache"
-            }
-          ],
-          "optional_dimensions": {
-            "60": [
-              {
-                "caches": "cros_vm"
-              }
-            ]
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 24
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_unittests/"
-      },
-      {
-        "args": [
-          "--browser=cros-chrome",
           "--remote=127.0.0.1",
           "--remote-ssh-port=9222",
           "--xvfb",
@@ -19479,104 +19356,6 @@
       {
         "args": [
           "--browser=cros-chrome",
-          "--extra-browser-args=--enable-features=UseSkiaRenderer",
-          "--remote=127.0.0.1",
-          "--remote-ssh-port=9222",
-          "--xvfb",
-          "--typ-max-failures=3"
-        ],
-        "ci_only": true,
-        "isolate_name": "telemetry_perf_unittests",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "skia_renderer_telemetry_perf_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86",
-              "kvm": "1",
-              "os": "Ubuntu-18.04",
-              "pool": "chromium.tests"
-            }
-          ],
-          "idempotent": false,
-          "named_caches": [
-            {
-              "name": "cros_vm",
-              "path": "magic_cros_vm_cache"
-            }
-          ],
-          "optional_dimensions": {
-            "60": [
-              {
-                "caches": "cros_vm"
-              }
-            ]
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 6
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_perf_unittests/"
-      },
-      {
-        "args": [
-          "--jobs=1",
-          "--browser=cros-chrome",
-          "--extra-browser-args=--enable-features=UseSkiaRenderer",
-          "--remote=127.0.0.1",
-          "--remote-ssh-port=9222",
-          "--typ-max-failures=3"
-        ],
-        "ci_only": true,
-        "isolate_name": "telemetry_unittests",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "skia_renderer_telemetry_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86",
-              "kvm": "1",
-              "os": "Ubuntu-18.04",
-              "pool": "chromium.tests"
-            }
-          ],
-          "idempotent": false,
-          "named_caches": [
-            {
-              "name": "cros_vm",
-              "path": "magic_cros_vm_cache"
-            }
-          ],
-          "optional_dimensions": {
-            "60": [
-              {
-                "caches": "cros_vm"
-              }
-            ]
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 24
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_unittests/"
-      },
-      {
-        "args": [
-          "--browser=cros-chrome",
           "--remote=127.0.0.1",
           "--remote-ssh-port=9222",
           "--xvfb",
@@ -81054,28 +80833,6 @@
         "test_id_prefix": "ninja://ui/aura:aura_unittests/"
       },
       {
-        "args": [
-          "--enable-features=UseSkiaRenderer"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "skia_renderer_aura_unittests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "aura_unittests",
-        "test_id_prefix": "ninja://ui/aura:aura_unittests/"
-      },
-      {
         "isolate_profile_data": true,
         "merge": {
           "args": [],
@@ -85606,21 +85363,21 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5096.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5097.0/test_ash_chrome"
         ],
         "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "interactive_ui_tests Lacros version skew testing ash 104.0.5096.0",
+        "name": "interactive_ui_tests Lacros version skew testing ash 104.0.5097.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v104.0.5096.0",
-              "revision": "version:104.0.5096.0"
+              "location": "lacros_version_skew_tests_v104.0.5097.0",
+              "revision": "version:104.0.5097.0"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
@@ -85628,7 +85385,7 @@
         },
         "test": "interactive_ui_tests",
         "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/",
-        "variant_id": "Lacros version skew testing ash 104.0.5096.0"
+        "variant_id": "Lacros version skew testing ash 104.0.5097.0"
       },
       {
         "isolate_profile_data": true,
@@ -85741,28 +85498,28 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5096.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5097.0/test_ash_chrome"
         ],
         "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests Lacros version skew testing ash 104.0.5096.0",
+        "name": "lacros_chrome_browsertests Lacros version skew testing ash 104.0.5097.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v104.0.5096.0",
-              "revision": "version:104.0.5096.0"
+              "location": "lacros_version_skew_tests_v104.0.5097.0",
+              "revision": "version:104.0.5097.0"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
         "test": "lacros_chrome_browsertests",
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/",
-        "variant_id": "Lacros version skew testing ash 104.0.5096.0"
+        "variant_id": "Lacros version skew testing ash 104.0.5097.0"
       },
       {
         "args": [
@@ -85862,28 +85619,28 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5096.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5097.0/test_ash_chrome"
         ],
         "isolate_profile_data": true,
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 104.0.5096.0",
+        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 104.0.5097.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v104.0.5096.0",
-              "revision": "version:104.0.5096.0"
+              "location": "lacros_version_skew_tests_v104.0.5097.0",
+              "revision": "version:104.0.5097.0"
             }
           ],
           "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
         },
         "test": "lacros_chrome_browsertests_run_in_series",
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/",
-        "variant_id": "Lacros version skew testing ash 104.0.5096.0"
+        "variant_id": "Lacros version skew testing ash 104.0.5097.0"
       },
       {
         "isolate_profile_data": true,
@@ -87221,20 +86978,20 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5096.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5097.0/test_ash_chrome"
         ],
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "interactive_ui_tests Lacros version skew testing ash 104.0.5096.0",
+        "name": "interactive_ui_tests Lacros version skew testing ash 104.0.5097.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v104.0.5096.0",
-              "revision": "version:104.0.5096.0"
+              "location": "lacros_version_skew_tests_v104.0.5097.0",
+              "revision": "version:104.0.5097.0"
             }
           ],
           "dimension_sets": [
@@ -87248,7 +87005,7 @@
         },
         "test": "interactive_ui_tests",
         "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/",
-        "variant_id": "Lacros version skew testing ash 104.0.5096.0"
+        "variant_id": "Lacros version skew testing ash 104.0.5097.0"
       },
       {
         "merge": {
@@ -87386,20 +87143,20 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5096.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5097.0/test_ash_chrome"
         ],
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests Lacros version skew testing ash 104.0.5096.0",
+        "name": "lacros_chrome_browsertests Lacros version skew testing ash 104.0.5097.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v104.0.5096.0",
-              "revision": "version:104.0.5096.0"
+              "location": "lacros_version_skew_tests_v104.0.5097.0",
+              "revision": "version:104.0.5097.0"
             }
           ],
           "dimension_sets": [
@@ -87412,7 +87169,7 @@
         },
         "test": "lacros_chrome_browsertests",
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/",
-        "variant_id": "Lacros version skew testing ash 104.0.5096.0"
+        "variant_id": "Lacros version skew testing ash 104.0.5097.0"
       },
       {
         "args": [
@@ -87532,20 +87289,20 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5096.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5097.0/test_ash_chrome"
         ],
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 104.0.5096.0",
+        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 104.0.5097.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v104.0.5096.0",
-              "revision": "version:104.0.5096.0"
+              "location": "lacros_version_skew_tests_v104.0.5097.0",
+              "revision": "version:104.0.5097.0"
             }
           ],
           "dimension_sets": [
@@ -87558,7 +87315,7 @@
         },
         "test": "lacros_chrome_browsertests_run_in_series",
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/",
-        "variant_id": "Lacros version skew testing ash 104.0.5096.0"
+        "variant_id": "Lacros version skew testing ash 104.0.5097.0"
       },
       {
         "merge": {
@@ -89054,20 +88811,20 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5096.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5097.0/test_ash_chrome"
         ],
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "interactive_ui_tests Lacros version skew testing ash 104.0.5096.0",
+        "name": "interactive_ui_tests Lacros version skew testing ash 104.0.5097.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v104.0.5096.0",
-              "revision": "version:104.0.5096.0"
+              "location": "lacros_version_skew_tests_v104.0.5097.0",
+              "revision": "version:104.0.5097.0"
             }
           ],
           "dimension_sets": [
@@ -89081,7 +88838,7 @@
         },
         "test": "interactive_ui_tests",
         "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/",
-        "variant_id": "Lacros version skew testing ash 104.0.5096.0"
+        "variant_id": "Lacros version skew testing ash 104.0.5097.0"
       },
       {
         "merge": {
@@ -89219,20 +88976,20 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5096.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5097.0/test_ash_chrome"
         ],
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests Lacros version skew testing ash 104.0.5096.0",
+        "name": "lacros_chrome_browsertests Lacros version skew testing ash 104.0.5097.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v104.0.5096.0",
-              "revision": "version:104.0.5096.0"
+              "location": "lacros_version_skew_tests_v104.0.5097.0",
+              "revision": "version:104.0.5097.0"
             }
           ],
           "dimension_sets": [
@@ -89245,7 +89002,7 @@
         },
         "test": "lacros_chrome_browsertests",
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/",
-        "variant_id": "Lacros version skew testing ash 104.0.5096.0"
+        "variant_id": "Lacros version skew testing ash 104.0.5097.0"
       },
       {
         "args": [
@@ -89365,20 +89122,20 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5096.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5097.0/test_ash_chrome"
         ],
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 104.0.5096.0",
+        "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 104.0.5097.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v104.0.5096.0",
-              "revision": "version:104.0.5096.0"
+              "location": "lacros_version_skew_tests_v104.0.5097.0",
+              "revision": "version:104.0.5097.0"
             }
           ],
           "dimension_sets": [
@@ -89391,7 +89148,7 @@
         },
         "test": "lacros_chrome_browsertests_run_in_series",
         "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/",
-        "variant_id": "Lacros version skew testing ash 104.0.5096.0"
+        "variant_id": "Lacros version skew testing ash 104.0.5097.0"
       },
       {
         "merge": {
@@ -90126,20 +89883,20 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5096.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5097.0/test_ash_chrome"
         ],
         "merge": {
           "args": [],
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "interactive_ui_tests Lacros version skew testing ash 104.0.5096.0",
+        "name": "interactive_ui_tests Lacros version skew testing ash 104.0.5097.0",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v104.0.5096.0",
-              "revision": "version:104.0.5096.0"
+              "location": "lacros_version_skew_tests_v104.0.5097.0",
+              "revision": "version:104.0.5097.0"
             }
           ],
           "dimension_sets": [
@@ -90152,7 +89909,7 @@
         },
         "test": "interactive_ui_tests",
         "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/",
-        "variant_id": "Lacros version skew testing ash 104.0.5096.0"
+        "variant_id": "Lacros version skew testing ash 104.0.5097.0"
       }
     ]
   },
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json
index 9088d61..efab7cb 100644
--- a/testing/buildbot/chromium.gpu.fyi.json
+++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -4096,279 +4096,6 @@
       },
       {
         "args": [
-          "context_lost",
-          "--show-stdout",
-          "--browser=cros-chrome",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--log-level=0 --js-flags=--expose-gc --disable-features=UseSkiaRenderer",
-          "--remote=127.0.0.1",
-          "--remote-ssh-port=9222"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "gl_renderer_context_lost_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "cpu": "x86",
-              "kvm": "1",
-              "os": "Ubuntu-18.04",
-              "pool": "chromium.tests"
-            }
-          ],
-          "idempotent": false,
-          "named_caches": [
-            {
-              "name": "cros_vm",
-              "path": "magic_cros_vm_cache"
-            }
-          ],
-          "optional_dimensions": {
-            "60": [
-              {
-                "caches": "cros_vm"
-              }
-            ]
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
-          "gpu_process",
-          "--show-stdout",
-          "--browser=cros-chrome",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--log-level=0 --js-flags=--expose-gc --disable-features=UseSkiaRenderer",
-          "--remote=127.0.0.1",
-          "--remote-ssh-port=9222"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "gl_renderer_gpu_process_launch_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "cpu": "x86",
-              "kvm": "1",
-              "os": "Ubuntu-18.04",
-              "pool": "chromium.tests"
-            }
-          ],
-          "idempotent": false,
-          "named_caches": [
-            {
-              "name": "cros_vm",
-              "path": "magic_cros_vm_cache"
-            }
-          ],
-          "optional_dimensions": {
-            "60": [
-              {
-                "caches": "cros_vm"
-              }
-            ]
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
-          "hardware_accelerated_feature",
-          "--show-stdout",
-          "--browser=cros-chrome",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--log-level=0 --js-flags=--expose-gc --disable-features=UseSkiaRenderer",
-          "--remote=127.0.0.1",
-          "--remote-ssh-port=9222"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "gl_renderer_hardware_accelerated_feature_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "cpu": "x86",
-              "kvm": "1",
-              "os": "Ubuntu-18.04",
-              "pool": "chromium.tests"
-            }
-          ],
-          "idempotent": false,
-          "named_caches": [
-            {
-              "name": "cros_vm",
-              "path": "magic_cros_vm_cache"
-            }
-          ],
-          "optional_dimensions": {
-            "60": [
-              {
-                "caches": "cros_vm"
-              }
-            ]
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
-          "maps",
-          "--show-stdout",
-          "--browser=cros-chrome",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--log-level=0 --js-flags=--expose-gc --disable-features=UseSkiaRenderer",
-          "--dont-restore-color-profile-after-test",
-          "--test-machine-name",
-          "${buildername}",
-          "--remote=127.0.0.1",
-          "--remote-ssh-port=9222",
-          "--git-revision=${got_revision}"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "gl_renderer_maps_pixel_tests",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "cpu": "x86",
-              "kvm": "1",
-              "os": "Ubuntu-18.04",
-              "pool": "chromium.tests"
-            }
-          ],
-          "idempotent": false,
-          "named_caches": [
-            {
-              "name": "cros_vm",
-              "path": "magic_cros_vm_cache"
-            }
-          ],
-          "optional_dimensions": {
-            "60": [
-              {
-                "caches": "cros_vm"
-              }
-            ]
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
-          "pixel",
-          "--show-stdout",
-          "--browser=cros-chrome",
-          "--passthrough",
-          "-v",
-          "--extra-browser-args=--log-level=0 --js-flags=--expose-gc --disable-features=UseSkiaRenderer",
-          "--dont-restore-color-profile-after-test",
-          "--test-machine-name",
-          "${buildername}",
-          "--remote=127.0.0.1",
-          "--remote-ssh-port=9222",
-          "--git-revision=${got_revision}"
-        ],
-        "isolate_name": "telemetry_gpu_integration_test",
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "gl_renderer_pixel_skia_gold_tests",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "should_retry_with_patch": false,
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "containment_type": "AUTO",
-          "dimension_sets": [
-            {
-              "cpu": "x86",
-              "kvm": "1",
-              "os": "Ubuntu-18.04",
-              "pool": "chromium.tests"
-            }
-          ],
-          "idempotent": false,
-          "named_caches": [
-            {
-              "name": "cros_vm",
-              "path": "magic_cros_vm_cache"
-            }
-          ],
-          "optional_dimensions": {
-            "60": [
-              {
-                "caches": "cros_vm"
-              }
-            ]
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/"
-      },
-      {
-        "args": [
           "gpu_process",
           "--show-stdout",
           "--browser=cros-chrome",
@@ -8230,7 +7957,7 @@
           "--browser=release",
           "--passthrough",
           "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-vulkan=native --disable-vulkan-fallback-to-gl-for-testing --enable-features=UseSkiaRenderer,Vulkan --use-gl=angle --use-angle=gl --use-cmd-decoder=passthrough",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-vulkan=native --disable-vulkan-fallback-to-gl-for-testing --enable-features=Vulkan --use-gl=angle --use-angle=gl --use-cmd-decoder=passthrough",
           "--dont-restore-color-profile-after-test",
           "--test-machine-name",
           "${buildername}",
@@ -9354,7 +9081,7 @@
           "--browser=release",
           "--passthrough",
           "-v",
-          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-vulkan=native --disable-vulkan-fallback-to-gl-for-testing --enable-features=UseSkiaRenderer,Vulkan --use-gl=angle --use-angle=gl --use-cmd-decoder=passthrough",
+          "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-vulkan=native --disable-vulkan-fallback-to-gl-for-testing --enable-features=Vulkan --use-gl=angle --use-angle=gl --use-cmd-decoder=passthrough",
           "--dont-restore-color-profile-after-test",
           "--test-machine-name",
           "${buildername}",
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json
index e10bbc0a..b48a299 100644
--- a/testing/buildbot/chromium.memory.json
+++ b/testing/buildbot/chromium.memory.json
@@ -3565,28 +3565,6 @@
       },
       {
         "args": [
-          "--enable-features=UseSkiaRenderer",
-          "--test-launcher-print-test-stdio=always"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "skia_renderer_aura_unittests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-18.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "aura_unittests",
-        "test_id_prefix": "ninja://ui/aura:aura_unittests/"
-      },
-      {
-        "args": [
           "--test-launcher-print-test-stdio=always"
         ],
         "merge": {
@@ -5433,29 +5411,6 @@
       },
       {
         "args": [
-          "--enable-features=UseSkiaRenderer",
-          "--test-launcher-print-test-stdio=always"
-        ],
-        "merge": {
-          "args": [],
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "skia_renderer_aura_unittests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "aura_unittests",
-        "test_id_prefix": "ninja://ui/aura:aura_unittests/"
-      },
-      {
-        "args": [
           "--test-launcher-print-test-stdio=always"
         ],
         "merge": {
@@ -9509,7 +9464,7 @@
           "--test-launcher-bot-mode",
           "--test-launcher-jobs=1",
           "--test-launcher-filter-file=../../testing/buildbot/filters/vulkan.content_browsertests.filter",
-          "--enable-features=UseSkiaRenderer,UiGpuRasterization,Vulkan",
+          "--enable-features=UiGpuRasterization,Vulkan",
           "--use-vulkan=swiftshader",
           "--enable-gpu-rasterization",
           "--disable-software-compositing-fallback",
diff --git a/testing/buildbot/mixins.pyl b/testing/buildbot/mixins.pyl
index 094f266..7a38a27 100644
--- a/testing/buildbot/mixins.pyl
+++ b/testing/buildbot/mixins.pyl
@@ -1145,7 +1145,7 @@
       ],
       'linux_args': [
         '--no-xvfb',
-        '--additional-driver-flag=--enable-features=UseSkiaRenderer,Vulkan',
+        '--additional-driver-flag=--enable-features=Vulkan',
       ],
     },
     'merge': {
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl
index d6bada06..2ffeafab 100644
--- a/testing/buildbot/test_suite_exceptions.pyl
+++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -2808,46 +2808,6 @@
       },
     }
   },
-  # TODO(crbug.com/1202958): Remove these when SkiaRenderer is fully shipped
-  # on Chrome OS.
-  'skia_renderer_telemetry_perf_unittests': {
-    'remove_from': [
-      # Not enough capacity.
-      'chromeos-betty-pi-arc-chrome',
-      'chromeos-betty-pi-arc-chrome-dchecks',
-      # it sometimes flakily times out.
-      'chromeos-amd64-generic-rel',
-    ],
-    'modifications': {
-      'chromeos-amd64-generic-rel': {
-        'ci_only': True,
-      },
-      'chromeos-amd64-generic-rel (goma cache silo)': {
-        'ci_only': True,
-      },
-      'chromeos-amd64-generic-rel (reclient)': {
-        'ci_only': True,
-      },
-    },
-  },
-  'skia_renderer_telemetry_unittests': {
-    'remove_from': [
-      # Not enough capacity.
-      'chromeos-betty-pi-arc-chrome',
-      'chromeos-betty-pi-arc-chrome-dchecks',
-    ],
-    'modifications': {
-      'chromeos-amd64-generic-rel': {
-        'ci_only': True,
-      },
-      'chromeos-amd64-generic-rel (goma cache silo)': {
-        'ci_only': True,
-      },
-      'chromeos-amd64-generic-rel (reclient)': {
-        'ci_only': True,
-      },
-    },
-  },
   'snapshot_unittests': {
     'modifications': {
       'fuchsia-fyi-arm64-dbg': {
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl
index 3b6f6a4..5e50873 100644
--- a/testing/buildbot/test_suites.pyl
+++ b/testing/buildbot/test_suites.pyl
@@ -658,48 +658,6 @@
     },
 
     'chromeos_isolated_scripts': {
-      # TODO(crbug.com/1202958): Remove these SkiaRenderer variants when
-      # SkiaRenderer is shipped by default on Chrome OS.
-      'skia_renderer_telemetry_perf_unittests': {
-        'isolate_name': 'telemetry_perf_unittests',
-        'args': [
-          '--browser=cros-chrome',
-          '--extra-browser-args=--enable-features=UseSkiaRenderer',
-          '$$MAGIC_SUBSTITUTION_ChromeOSTelemetryRemote',
-          '--xvfb',
-          # 3 is arbitrary, but if we're having more than 3 of these tests
-          # fail in a single shard, then something is probably wrong, so fail
-          # fast.
-          '--typ-max-failures=3',
-        ],
-        'swarming': {
-          'idempotent': False,  # https://crbug.com/549140
-          'shards': 6,
-        },
-        'mixins': [
-          'has_native_resultdb_integration',
-        ],
-      },
-      'skia_renderer_telemetry_unittests': {
-        'isolate_name': 'telemetry_unittests',
-        'args': [
-          '--jobs=1',
-          '--browser=cros-chrome',
-          '--extra-browser-args=--enable-features=UseSkiaRenderer',
-          '$$MAGIC_SUBSTITUTION_ChromeOSTelemetryRemote',
-          # 3 is arbitrary, but if we're having more than 3 of these tests
-          # fail in a single shard, then something is probably wrong, so fail
-          # fast.
-          '--typ-max-failures=3',
-        ],
-        'swarming': {
-          'idempotent': False,  # https://crbug.com/549140
-          'shards': 24,
-        },
-        'mixins': [
-          'has_native_resultdb_integration',
-        ],
-      },
       'telemetry_perf_unittests': {
         'args': [
           '--browser=cros-chrome',
@@ -2762,7 +2720,7 @@
           '--retry-limit=3',
         ],
         'linux_args': [
-          '--extra-browser-args=--enable-features=UseSkiaRenderer,Vulkan',
+          '--extra-browser-args=--enable-features=Vulkan',
         ],
         'mixins': [
           'has_native_resultdb_integration',
@@ -2780,7 +2738,7 @@
           '--retry-limit=3',
         ],
         'linux_args': [
-          '--extra-browser-args=--enable-features=UseSkiaRenderer,Vulkan',
+          '--extra-browser-args=--enable-features=Vulkan',
         ],
         'mixins': [
           'has_native_resultdb_integration',
@@ -2799,7 +2757,7 @@
           '--retry-limit=3',
         ],
         'linux_args': [
-          '--extra-browser-args=--enable-features=UseSkiaRenderer,Vulkan',
+          '--extra-browser-args=--enable-features=Vulkan',
         ],
         'mixins': [
           'has_native_resultdb_integration',
@@ -2931,7 +2889,7 @@
           '--test-launcher-bot-mode',
           '--test-launcher-jobs=1',
           '--test-launcher-filter-file=../../testing/buildbot/filters/vulkan.content_browsertests.filter',
-          '--enable-features=UseSkiaRenderer,UiGpuRasterization,Vulkan',
+          '--enable-features=UiGpuRasterization,Vulkan',
           '--use-vulkan=swiftshader',
           '--enable-gpu-rasterization',
           '--disable-software-compositing-fallback',
@@ -2943,79 +2901,6 @@
       },
     },
 
-    # TODO(crbug.com/1202958): Remove all gpu_gl_renderer_* targets when
-    # SkiaRenderer is shipped on all platforms.
-    'gpu_gl_renderer_full_telemetry_tests': {
-      'gl_renderer_context_lost_tests': {
-        'telemetry_test_name': 'context_lost',
-        'args': [
-          '--extra-browser-args=--disable-features=UseSkiaRenderer',
-        ],
-        'chromeos_args': [
-          '$$MAGIC_SUBSTITUTION_ChromeOSTelemetryRemote',
-        ],
-        'mixins': [
-          'has_native_resultdb_integration',
-        ],
-      },
-      'gl_renderer_gpu_process_launch_tests': {
-        'telemetry_test_name': 'gpu_process',
-        'args': [
-          '--extra-browser-args=--disable-features=UseSkiaRenderer',
-        ],
-        'chromeos_args': [
-          '$$MAGIC_SUBSTITUTION_ChromeOSTelemetryRemote',
-        ],
-        'mixins': [
-          'has_native_resultdb_integration',
-        ],
-      },
-      'gl_renderer_hardware_accelerated_feature_tests': {
-        'telemetry_test_name': 'hardware_accelerated_feature',
-        'args': [
-          '--extra-browser-args=--disable-features=UseSkiaRenderer',
-        ],
-        'chromeos_args': [
-          '$$MAGIC_SUBSTITUTION_ChromeOSTelemetryRemote',
-        ],
-        'mixins': [
-          'has_native_resultdb_integration',
-        ],
-      },
-      'gl_renderer_maps_pixel_tests': {
-        'telemetry_test_name': 'maps',
-        'args': [
-          '--dont-restore-color-profile-after-test',
-          '--test-machine-name',
-          '${buildername}',
-          '--extra-browser-args=--disable-features=UseSkiaRenderer',
-        ],
-        'chromeos_args': [
-          '$$MAGIC_SUBSTITUTION_ChromeOSTelemetryRemote',
-        ],
-        'mixins': [
-          'has_native_resultdb_integration',
-          'skia_gold_test',
-        ],
-      },
-      'gl_renderer_pixel_skia_gold_tests': {
-        'telemetry_test_name': 'pixel',
-        'args': [
-          '--dont-restore-color-profile-after-test',
-          '--test-machine-name',
-          '${buildername}',
-          '--extra-browser-args=--disable-features=UseSkiaRenderer',
-        ],
-        'chromeos_args': [
-          '$$MAGIC_SUBSTITUTION_ChromeOSTelemetryRemote',
-        ],
-        'mixins': [
-          'has_native_resultdb_integration',
-          'skia_gold_test',
-        ],
-      },
-    },
-
     'gpu_gles2_conform_gtests': {
       # The gles2_conform_tests are closed-source and deliberately only
       # run on the FYI waterfall and the optional tryservers.
@@ -3241,7 +3126,7 @@
           '--dont-restore-color-profile-after-test',
           '--test-machine-name',
           '${buildername}',
-          '--extra-browser-args=--use-vulkan=native --disable-vulkan-fallback-to-gl-for-testing --enable-features=UseSkiaRenderer,Vulkan --use-gl=angle --use-angle=gl --use-cmd-decoder=passthrough',
+          '--extra-browser-args=--use-vulkan=native --disable-vulkan-fallback-to-gl-for-testing --enable-features=Vulkan --use-gl=angle --use-angle=gl --use-cmd-decoder=passthrough',
         ],
         'android_args': [
           # TODO(crbug.com/1093085): Remove this once we fix the tests.
@@ -4184,24 +4069,6 @@
       },
     },
 
-    # TODO(crbug.com/1202958): Remove this when SkiaRenderer is fully shipped
-    # on Chrome OS.
-    'linux_chromeos_skia_renderer_specific_gtests': {
-      # TODO(b/195938162): Re-enable this when animation tests are deflaked.
-      # 'skia_renderer_ash_unittests': {
-      #   'test': 'ash_unittests',
-      #   'args': [
-      #     '--enable-features=UseSkiaRenderer',
-      #   ],
-      # },
-      'skia_renderer_aura_unittests': {
-        'test': 'aura_unittests',
-        'args': [
-          '--enable-features=UseSkiaRenderer',
-        ],
-      },
-    },
-
     'linux_chromeos_specific_gtests': {
       # Chrome OS only.
       'ash_components_unittests': {},
@@ -6443,7 +6310,6 @@
       'gpu_validating_telemetry_tests',
       'gpu_webcodecs_telemetry_test',
       'gpu_webgl_conformance_validating_telemetry_tests',
-      'gpu_gl_renderer_full_telemetry_tests',
       # Large amounts of WebGL/WebGL2 tests are failing due to issues that are
       # possibly related to other CrOS issues that are already reported.
       # TODO(crbug.com/1080424): Try enabling these again once some of the
@@ -6709,7 +6575,6 @@
       'chromium_gtests_for_linux_and_chromeos_only',
       'chromium_gtests_for_win_and_linux_only',
       'linux_chromeos_lacros_gtests',
-      'linux_chromeos_skia_renderer_specific_gtests',
       'linux_chromeos_specific_gtests',
       'linux_flavor_specific_chromium_gtests',
       'non_android_chromium_gtests',
@@ -6723,7 +6588,6 @@
       'chromium_gtests_for_win_and_linux_only',
       'linux_chromeos_lacros_gtests',
       'linux_chromeos_oobe_specific_tests',
-      'linux_chromeos_skia_renderer_specific_gtests',
       'linux_chromeos_specific_gtests',
       'linux_flavor_specific_chromium_gtests',
       'non_android_chromium_gtests',
@@ -6739,7 +6603,6 @@
       'chromium_gtests_for_linux_and_chromeos_only',
       'chromium_gtests_for_win_and_linux_only',
       'linux_chromeos_lacros_gtests',
-      'linux_chromeos_skia_renderer_specific_gtests',
       'linux_chromeos_specific_gtests',
       'linux_chromeos_browser_tests_require_lacros',
       'linux_flavor_specific_chromium_gtests',
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl
index 70590ccb..1131b876 100644
--- a/testing/buildbot/variants.pyl
+++ b/testing/buildbot/variants.pyl
@@ -22,15 +22,15 @@
   },
   'LACROS_VERSION_SKEW_CANARY': {
     'args': [
-      '--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5096.0/test_ash_chrome',
+      '--ash-chrome-path-override=../../lacros_version_skew_tests_v104.0.5097.0/test_ash_chrome',
     ],
-    'identifier': 'Lacros version skew testing ash 104.0.5096.0',
+    'identifier': 'Lacros version skew testing ash 104.0.5097.0',
     'swarming': {
       'cipd_packages': [
         {
           'cipd_package': 'chromium/testing/linux-ash-chromium/x86_64/ash.zip',
-          'location': 'lacros_version_skew_tests_v104.0.5096.0',
-          'revision': 'version:104.0.5096.0',
+          'location': 'lacros_version_skew_tests_v104.0.5097.0',
+          'revision': 'version:104.0.5097.0',
         },
       ],
     },
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 191ceea..179d10b 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -6692,6 +6692,25 @@
             ]
         }
     ],
+    "PrivacyGuide2": [
+        {
+            "platforms": [
+                "linux",
+                "windows",
+                "chromeos",
+                "chromeos_lacros",
+                "mac"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "PrivacyGuide2"
+                    ]
+                }
+            ]
+        }
+    ],
     "PrivacyPreservingPrefetchProxy": [
         {
             "platforms": [
diff --git a/third_party/blink/public/devtools_protocol/browser_protocol.pdl b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
index a851381d..0230f78 100644
--- a/third_party/blink/public/devtools_protocol/browser_protocol.pdl
+++ b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
@@ -6312,9 +6312,10 @@
     enum
       SameOrigin
       SameOriginAllowPopups
+      RestrictProperties
       UnsafeNone
       SameOriginPlusCoep
-      SameOriginAllowPopupsPlusCoep
+      RestrictPropertiesPlusCoep
 
   experimental type CrossOriginOpenerPolicyStatus extends object
     properties
diff --git a/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom b/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
index 5c7349a1..1f2fa93 100644
--- a/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
+++ b/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
@@ -3572,6 +3572,8 @@
   kCSSLegacyTransformOrigin = 4251,
   kCSSLegacyBorderImage = 4252,
   kCSSLegacyBorderImageWidth = 4253,
+  kCrossOriginOpenerPolicyRestrictProperties = 4254,
+  kCrossOriginOpenerPolicyRestrictPropertiesReportOnly = 4255,
 
   // Add new features immediately above this line. Don't change assigned
   // numbers of any item, and don't reuse removed slots.
diff --git a/third_party/blink/public/platform/web_media_player_client.h b/third_party/blink/public/platform/web_media_player_client.h
index b1e3b6a5..0e0c07f 100644
--- a/third_party/blink/public/platform/web_media_player_client.h
+++ b/third_party/blink/public/platform/web_media_player_client.h
@@ -76,6 +76,14 @@
     kAudioTrackKindCommentary
   };
 
+  // Reason for a PausePlayback call, for better diagnostic messages.
+  enum class PauseReason {
+    kUnknown,
+    kBackgroundVideoOptimization,
+    kSuspendedPlayerIdleTimeout,
+    kRemotePlayStateChange,
+  };
+
   static const int kMediaRemotingStopNoText = -1;
 
   virtual void NetworkStateChanged() = 0;
@@ -165,7 +173,7 @@
   virtual void ResumePlayback() = 0;
 
   // Request the player to pause playback.
-  virtual void PausePlayback() = 0;
+  virtual void PausePlayback(PauseReason) = 0;
 
   // Notify the client that the media player started playing content.
   virtual void DidPlayerStartPlaying() = 0;
diff --git a/third_party/blink/renderer/bindings/core/v8/script_cache_consumer.cc b/third_party/blink/renderer/bindings/core/v8/script_cache_consumer.cc
index 70363f2d..da6cb5a 100644
--- a/third_party/blink/renderer/bindings/core/v8/script_cache_consumer.cc
+++ b/third_party/blink/renderer/bindings/core/v8/script_cache_consumer.cc
@@ -86,9 +86,9 @@
       "v8.deserializeOnBackground", TRACE_ID_LOCAL(this),
       TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, "data",
       [&](perfetto::TracedValue context) {
-        inspector_deserialize_script_event::Data(
-            std::move(context), script_resource_identifier_,
-            script_url_string_.IsolatedCopy());
+        inspector_deserialize_script_event::Data(std::move(context),
+                                                 script_resource_identifier_,
+                                                 script_url_string_);
       });
 
   // Run the cache consumption task.
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 f852e13..def29fa 100644
--- a/third_party/blink/renderer/bindings/core/v8/script_streamer.cc
+++ b/third_party/blink/renderer/bindings/core/v8/script_streamer.cc
@@ -1109,6 +1109,7 @@
 v8::ScriptCompiler::StreamedSource* BackgroundInlineScriptStreamer::Source(
     v8::ScriptType expected_type) {
   TRACE_EVENT0("blink", "BackgroundInlineScriptStreamer::Source");
+  SCOPED_UMA_HISTOGRAM_TIMER_MICROS("WebCore.Scripts.InlineStreamerWaitTime");
   DCHECK(IsMainThread());
   DCHECK_EQ(expected_type, v8::ScriptType::kClassic);
   // Make sure the script has finished compiling in the background. See comment
diff --git a/third_party/blink/renderer/bindings/core/v8/source_location.cc b/third_party/blink/renderer/bindings/core/v8/source_location.cc
index fbb05ac..3b9ccb71 100644
--- a/third_party/blink/renderer/bindings/core/v8/source_location.cc
+++ b/third_party/blink/renderer/bindings/core/v8/source_location.cc
@@ -201,9 +201,8 @@
 
 std::unique_ptr<SourceLocation> SourceLocation::Clone() const {
   return base::WrapUnique(new SourceLocation(
-      url_.IsolatedCopy(), function_.IsolatedCopy(), line_number_,
-      column_number_, stack_trace_ ? stack_trace_->clone() : nullptr,
-      script_id_));
+      url_, function_, line_number_, column_number_,
+      stack_trace_ ? stack_trace_->clone() : nullptr, script_id_));
 }
 
 std::unique_ptr<v8_inspector::protocol::Runtime::API::StackTrace>
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_wasm_response_extensions.cc b/third_party/blink/renderer/bindings/core/v8/v8_wasm_response_extensions.cc
index 9a4c7cb..b4664d06 100644
--- a/third_party/blink/renderer/bindings/core/v8/v8_wasm_response_extensions.cc
+++ b/third_party/blink/renderer/bindings/core/v8/v8_wasm_response_extensions.cc
@@ -75,9 +75,9 @@
                       const String& cache_storage_cache_name,
                       scoped_refptr<base::SingleThreadTaskRunner> task_runner,
                       ExecutionContext* execution_context)
-      : response_url_(response_url.IsolatedCopy()),
+      : response_url_(response_url),
         response_time_(response_time),
-        cache_storage_cache_name_(cache_storage_cache_name.IsolatedCopy()),
+        cache_storage_cache_name_(cache_storage_cache_name),
         main_thread_task_runner_(std::move(task_runner)),
         execution_context_(execution_context) {}
 
@@ -144,9 +144,9 @@
     DCHECK(main_thread_task_runner_.get());
     main_thread_task_runner_->PostTask(
         FROM_HERE, ConvertToBaseOnceCallback(WTF::CrossThreadBindOnce(
-                       &SendCachedData, response_url_.IsolatedCopy(),
-                       response_time_, cache_storage_cache_name_.IsolatedCopy(),
-                       execution_context_, std::move(serialized_data))));
+                       &SendCachedData, response_url_, response_time_,
+                       cache_storage_cache_name_, execution_context_,
+                       std::move(serialized_data))));
   }
 
   void SetBuffer(scoped_refptr<CachedMetadata> cached_module) {
diff --git a/third_party/blink/renderer/build/scripts/core/css/css_properties.py b/third_party/blink/renderer/build/scripts/core/css/css_properties.py
index afdf0e5..93b784b 100755
--- a/third_party/blink/renderer/build/scripts/core/css/css_properties.py
+++ b/third_party/blink/renderer/build/scripts/core/css/css_properties.py
@@ -39,6 +39,8 @@
         'Only longhands can be valid_for_cue [%s]' % name
     assert not prop['valid_for_marker'] or prop['is_longhand'], \
         'Only longhands can be valid_for_marker [%s]' % name
+    assert not prop['valid_for_highlight_legacy'] or prop['is_longhand'], \
+        'Only longhands can be valid_for_highlight_legacy [%s]' % name
     assert not prop['valid_for_highlight'] or prop['is_longhand'], \
         'Only longhands can be valid_for_highlight [%s]' % name
     assert not prop['is_internal'] or prop['computable'] is None, \
diff --git a/third_party/blink/renderer/build/scripts/core/css/properties/templates/css_properties.h.tmpl b/third_party/blink/renderer/build/scripts/core/css/properties/templates/css_properties.h.tmpl
index 282e1c3d..86f97cfb 100644
--- a/third_party/blink/renderer/build/scripts/core/css/properties/templates/css_properties.h.tmpl
+++ b/third_party/blink/renderer/build/scripts/core/css/properties/templates/css_properties.h.tmpl
@@ -61,6 +61,7 @@
   (property.is_highlight_colors and 'kHighlightColors' or ''),
   (property.is_visited_highlight_colors and 'kVisitedHighlightColors' or ''),
   (property.tree_scoped_value and 'kTreeScopedValue' or ''),
+  (property.valid_for_highlight_legacy and 'kValidForHighlightLegacy' or ''),
   (property.valid_for_highlight and 'kValidForHighlight' or ''),
   (property.logical_property_group and 'kInLogicalPropertyGroup' or ''),
 ] | reject('==', '') | join(' | ') %}
diff --git a/third_party/blink/renderer/core/clipboard/clipboard_utilities_win.cc b/third_party/blink/renderer/core/clipboard/clipboard_utilities_win.cc
index 9136bbfe..3d19660c 100644
--- a/third_party/blink/renderer/core/clipboard/clipboard_utilities_win.cc
+++ b/third_party/blink/renderer/core/clipboard/clipboard_utilities_win.cc
@@ -29,8 +29,6 @@
 #include "third_party/blink/renderer/platform/wtf/text/string_builder.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
 
-#include <shlwapi.h>
-
 namespace blink {
 
 void ReplaceNewlinesWithWindowsStyleNewlines(String& str) {
diff --git a/third_party/blink/renderer/core/css/css_properties.json5 b/third_party/blink/renderer/core/css/css_properties.json5
index c24bf91..ae22f5e 100644
--- a/third_party/blink/renderer/core/css/css_properties.json5
+++ b/third_party/blink/renderer/core/css/css_properties.json5
@@ -490,6 +490,18 @@
       valid_type: "bool",
     },
 
+    // - valid_for_highlight_legacy: true
+    //
+    // Theoretically matches
+    // https://drafts.csswg.org/css-pseudo-4/#highlight-styling,
+    // but includes additional properties for compatibility reasons.
+    // Used when RuntimeEnabledFeatures::HighlightInheritanceEnabled()
+    // is not enabled.
+    valid_for_highlight_legacy: {
+      default: false,
+      valid_type: "bool",
+    },
+
     // - valid_for_highlight: true
     //
     // https://drafts.csswg.org/css-pseudo-4/#highlight-styling
@@ -887,6 +899,7 @@
       valid_for_first_line: true,
       valid_for_cue: true,
       valid_for_marker: true,
+      valid_for_highlight_legacy: true,
       valid_for_highlight: true,
       valid_for_canvas_formatted_text: true,
       valid_for_canvas_formatted_text_run: true,
@@ -1250,7 +1263,7 @@
       keywords: ["auto", "none", "preserve-parent-color"],
       typedom_types: ["Keyword"],
       default_value: "auto",
-      valid_for_highlight: true,
+      valid_for_highlight_legacy: true,
       computable: false,
     },
     {
@@ -1526,6 +1539,7 @@
       valid_for_first_letter: true,
       valid_for_first_line: true,
       valid_for_cue: true,
+      valid_for_highlight_legacy: true,
       valid_for_highlight: true,
       is_background: true,
       is_highlight_colors: true,
@@ -2169,7 +2183,7 @@
       style_builder_custom_functions: ["initial", "inherit", "value"],
       keywords: ["auto", "currentcolor"],
       typedom_types: ["Keyword"],
-      valid_for_highlight: true,
+      valid_for_highlight_legacy: true,
     },
     {
       name: "clear",
@@ -2267,7 +2281,7 @@
       type_name: "Vector<AtomicString>",
       default_value: "Vector<AtomicString, 0>()",
       field_template: "external",
-      valid_for_highlight: true,
+      valid_for_highlight_legacy: true,
       computable: false,
     },
     {
@@ -2410,7 +2424,7 @@
       default_value: "auto",
       style_builder_custom_functions: ["initial", "inherit", "value"],
       typedom_types: ["Keyword"],
-      valid_for_highlight: true,
+      valid_for_highlight_legacy: true,
     },
     {
       name: "cx",
@@ -2503,6 +2517,7 @@
       style_builder_template_args: {
         initial_color: "ComputedStyleInitialValues::InitialFillPaint",
       },
+      valid_for_highlight_legacy: true,
       valid_for_highlight: true,
     },
     {
@@ -4265,6 +4280,7 @@
       style_builder_template_args: {
         initial_color: "ComputedStyleInitialValues::InitialStrokePaint",
       },
+      valid_for_highlight_legacy: true,
       valid_for_highlight: true,
     },
     {
@@ -4358,6 +4374,7 @@
       default_value: "UnzoomedLength(Length::Fixed(1))",
       converter: "ConvertUnzoomedLength",
       typedom_types: ["Length", "Percentage"],
+      valid_for_highlight_legacy: true,
       valid_for_highlight: true,
     },
     {
@@ -4453,6 +4470,7 @@
       valid_for_first_letter: true,
       valid_for_first_line: true,
       valid_for_cue: true,
+      valid_for_highlight_legacy: true,
       valid_for_highlight: true,
       supports_incremental_style: true,
       valid_for_canvas_formatted_text: true,
@@ -4471,6 +4489,7 @@
       valid_for_first_letter: true,
       valid_for_first_line: true,
       valid_for_cue: true,
+      valid_for_highlight_legacy: true,
       valid_for_highlight: true,
       valid_for_canvas_formatted_text: true,
       valid_for_canvas_formatted_text_run: true,
@@ -4488,6 +4507,7 @@
       valid_for_first_line: true,
       valid_for_cue: true,
       valid_for_marker: true,
+      valid_for_highlight_legacy: true,
       valid_for_highlight: true,
       valid_for_canvas_formatted_text: true,
       valid_for_canvas_formatted_text_run: true,
@@ -4503,6 +4523,7 @@
       valid_for_first_letter: true,
       valid_for_first_line: true,
       valid_for_cue: true,
+      valid_for_highlight_legacy: true,
       valid_for_highlight: true,
       valid_for_canvas_formatted_text: true,
       valid_for_canvas_formatted_text_run: true,
@@ -4522,6 +4543,7 @@
       typedom_types: ["Keyword", "Length", "Percentage"],
       valid_for_first_letter: true,
       valid_for_first_line: true,
+      valid_for_highlight_legacy: true,
       valid_for_highlight: true,
       computable: false,
       valid_for_canvas_formatted_text: true,
@@ -4583,6 +4605,7 @@
       valid_for_first_line: true,
       valid_for_cue: true,
       valid_for_marker: true,
+      valid_for_highlight_legacy: true,
       valid_for_highlight: true,
       valid_for_canvas_formatted_text: true,
       valid_for_canvas_formatted_text_run: true,
@@ -5411,6 +5434,7 @@
       converter: "ConvertStyleColor",
       style_builder_template: "color",
       valid_for_marker: true,
+      valid_for_highlight_legacy: true,
       valid_for_highlight: true,
     },
     {
@@ -5444,7 +5468,8 @@
       computed_style_custom_functions: ["getter"],
       converter: "ConvertStyleColor",
       style_builder_template: "color",
-      valid_for_highlight: true,
+      valid_for_highlight_legacy: true,
+      valid_for_highlight: true
     },
     {
       name: "-webkit-text-security",
@@ -5468,7 +5493,7 @@
       computed_style_custom_functions: ["getter"],
       converter: "ConvertStyleColor",
       style_builder_template: "color",
-      valid_for_highlight: true,
+      valid_for_highlight_legacy: true,
     },
     {
       name: "-webkit-text-stroke-width",
@@ -5479,7 +5504,7 @@
       default_value: "0",
       type_name: "float",
       converter: "ConvertTextStrokeWidth",
-      valid_for_highlight: true,
+      valid_for_highlight_legacy: true,
     },
     {
       name: "-webkit-transform-origin-x",
@@ -6890,6 +6915,7 @@
       valid_for_first_line: true,
       valid_for_cue: true,
       valid_for_marker: true,
+      valid_for_highlight_legacy: true,
       valid_for_highlight: true,
       is_visited_highlight_colors: true,
     },
@@ -6909,7 +6935,7 @@
       style_builder_template_args: {
         initial_color: "StyleAutoColor::AutoColor",
       },
-      valid_for_highlight: true,
+      valid_for_highlight_legacy: true,
     },
     {
       name: "-internal-visited-column-rule-color",
@@ -6942,6 +6968,7 @@
       valid_for_first_letter: true,
       valid_for_first_line: true,
       valid_for_cue: true,
+      valid_for_highlight_legacy: true,
       valid_for_highlight: true,
       is_visited_highlight_colors: true,
     },
@@ -7073,6 +7100,7 @@
       style_builder_template_args: {
         initial_color: "ComputedStyleInitialValues::InitialFillPaint",
       },
+      valid_for_highlight_legacy: true,
       valid_for_highlight: true,
     },
     {
@@ -7105,6 +7133,7 @@
       style_builder_template_args: {
         initial_color: "ComputedStyleInitialValues::InitialStrokePaint",
       },
+      valid_for_highlight_legacy: true,
       valid_for_highlight: true,
     },
     {
@@ -7122,6 +7151,7 @@
       valid_for_first_letter: true,
       valid_for_first_line: true,
       valid_for_cue: true,
+      valid_for_highlight_legacy: true,
       valid_for_highlight: true,
     },
     {
@@ -7137,6 +7167,7 @@
       computed_style_custom_functions: ["getter", "setter"],
       converter: "ConvertStyleColor",
       style_builder_template: "visited_color",
+      valid_for_highlight_legacy: true,
       valid_for_highlight: true,
     },
     {
@@ -7152,6 +7183,7 @@
       computed_style_custom_functions: ["getter", "setter"],
       converter: "ConvertStyleColor",
       style_builder_template: "visited_color",
+      valid_for_highlight_legacy: true,
       valid_for_highlight: true,
     },
     {
@@ -7167,6 +7199,7 @@
       computed_style_custom_functions: ["getter", "setter"],
       converter: "ConvertStyleColor",
       style_builder_template: "visited_color",
+      valid_for_highlight_legacy: true,
       valid_for_highlight: true,
     },
 
diff --git a/third_party/blink/renderer/core/css/properties/css_property.h b/third_party/blink/renderer/core/css/properties/css_property.h
index 6f9dfc8..5032999 100644
--- a/third_party/blink/renderer/core/css/properties/css_property.h
+++ b/third_party/blink/renderer/core/css/properties/css_property.h
@@ -25,7 +25,7 @@
 
 class CORE_EXPORT CSSProperty : public CSSUnresolvedProperty {
  public:
-  using Flags = uint32_t;
+  using Flags = uint64_t;
 
   static const CSSProperty& Get(CSSPropertyID);
 
@@ -65,7 +65,6 @@
   bool IsValidForFirstLine() const { return flags_ & kValidForFirstLine; }
   bool IsValidForCue() const { return flags_ & kValidForCue; }
   bool IsValidForMarker() const { return flags_ & kValidForMarker; }
-  bool IsValidForHighlight() const { return flags_ & kValidForHighlight; }
   bool IsValidForCanvasFormattedText() const {
     return flags_ & kValidForCanvasFormattedText;
   }
@@ -167,8 +166,10 @@
     kBorderRadius = 1 << 17,
     // Set if the property values are tree-scoped references.
     kTreeScopedValue = 1 << 18,
-    // https://drafts.csswg.org/css-pseudo-4/#highlight-styling
-    kValidForHighlight = 1 << 19,
+    // Similar to the list at
+    // https://drafts.csswg.org/css-pseudo-4/#highlight-styling, with some
+    // differences for compatibility reasons.
+    kValidForHighlightLegacy = 1 << 19,
     // https://drafts.csswg.org/css-logical/#logical-property-group
     kInLogicalPropertyGroup = 1 << 20,
     // https://drafts.csswg.org/css-pseudo-4/#first-line-styling
@@ -195,7 +196,9 @@
     // See valid_for_keyframes in css_properties.json5
     kValidForKeyframe = 1 << 30,
     // See valid_for_position_fallback in css_properties.json5
-    kValidForPositionFallback = 1u << 31,
+    kValidForPositionFallback = 1ull << 31,
+    // https://drafts.csswg.org/css-pseudo-4/#highlight-styling
+    kValidForHighlight = 1ull << 32,
   };
 
   constexpr CSSProperty(CSSPropertyID property_id,
diff --git a/third_party/blink/renderer/core/css/properties/longhands/variable.h b/third_party/blink/renderer/core/css/properties/longhands/variable.h
index b226ce19..34dfce5c 100644
--- a/third_party/blink/renderer/core/css/properties/longhands/variable.h
+++ b/third_party/blink/renderer/core/css/properties/longhands/variable.h
@@ -38,7 +38,8 @@
   explicit constexpr Variable(CSSProperty::Flags flags)
       : Longhand(CSSPropertyID::kVariable,
                  kProperty | kValidForFirstLetter | kValidForFirstLine |
-                     kValidForMarker | kValidForHighlight | flags,
+                     kValidForMarker | kValidForHighlightLegacy |
+                     kValidForHighlight | flags,
                  '\0') {}
 };
 
diff --git a/third_party/blink/renderer/core/css/resolver/cascade_expansion.cc b/third_party/blink/renderer/core/css/resolver/cascade_expansion.cc
index 78c9623..1ebce53 100644
--- a/third_party/blink/renderer/core/css/resolver/cascade_expansion.cc
+++ b/third_party/blink/renderer/core/css/resolver/cascade_expansion.cc
@@ -26,6 +26,8 @@
       return filter.Add(CSSProperty::kValidForFirstLine, false);
     case ValidPropertyFilter::kMarker:
       return filter.Add(CSSProperty::kValidForMarker, false);
+    case ValidPropertyFilter::kHighlightLegacy:
+      return filter.Add(CSSProperty::kValidForHighlightLegacy, false);
     case ValidPropertyFilter::kHighlight:
       return filter.Add(CSSProperty::kValidForHighlight, false);
   }
diff --git a/third_party/blink/renderer/core/css/resolver/cascade_expansion_test.cc b/third_party/blink/renderer/core/css/resolver/cascade_expansion_test.cc
index fc0edf54..4b6239d 100644
--- a/third_party/blink/renderer/core/css/resolver/cascade_expansion_test.cc
+++ b/third_party/blink/renderer/core/css/resolver/cascade_expansion_test.cc
@@ -479,13 +479,35 @@
   EXPECT_EQ(CSSPropertyID::kFontSize, e[0]->ref.GetProperty().PropertyID());
 }
 
+TEST_F(CascadeExpansionTest, FilterHighlightLegacy) {
+  MatchResult result;
+  result.FinishAddingUARules();
+  result.FinishAddingUserRules();
+  result.FinishAddingPresentationalHints();
+  result.AddMatchedProperties(
+      ParseDeclarationBlock("display:block;background-color:lime;forced-color-adjust:none"),
+      AddMatchedPropertiesOptions::Builder()
+          .SetValidPropertyFilter(ValidPropertyFilter::kHighlightLegacy)
+          .Build());
+  result.FinishAddingAuthorRulesForTreeScope(GetDocument());
+
+  auto e = ExpansionAt(result, 0);
+  ASSERT_EQ(3u, e.size());
+  EXPECT_EQ(CSSPropertyID::kBackgroundColor,
+            e[0]->ref.GetProperty().PropertyID());
+  EXPECT_EQ(CSSPropertyID::kInternalVisitedBackgroundColor,
+            e[1]->ref.GetProperty().PropertyID());
+  EXPECT_EQ(CSSPropertyID::kForcedColorAdjust,
+            e[2]->ref.GetProperty().PropertyID());
+}
+
 TEST_F(CascadeExpansionTest, FilterHighlight) {
   MatchResult result;
   result.FinishAddingUARules();
   result.FinishAddingUserRules();
   result.FinishAddingPresentationalHints();
   result.AddMatchedProperties(
-      ParseDeclarationBlock("display:block;background-color:lime;"),
+      ParseDeclarationBlock("display:block;background-color:lime;forced-color-adjust:none"),
       AddMatchedPropertiesOptions::Builder()
           .SetValidPropertyFilter(ValidPropertyFilter::kHighlight)
           .Build());
diff --git a/third_party/blink/renderer/core/css/resolver/style_resolver.cc b/third_party/blink/renderer/core/css/resolver/style_resolver.cc
index e6de793..265e657 100644
--- a/third_party/blink/renderer/core/css/resolver/style_resolver.cc
+++ b/third_party/blink/renderer/core/css/resolver/style_resolver.cc
@@ -967,6 +967,10 @@
 
     state.SetStyle(ComputedStyle::Clone(*state.ParentStyle()));
     state.Style()->SetInsideLink(state.ElementLinkState());
+    state.Style()->SetInForcedColorsMode(
+        style_request.originating_element_style->InForcedColorsMode());
+    state.Style()->SetForcedColorAdjust(
+        style_request.originating_element_style->ForcedColorAdjust());
   } else {
     scoped_refptr<ComputedStyle> style = CreateComputedStyle();
     style->InheritFrom(
@@ -1675,8 +1679,14 @@
     CascadeFilter filter;
     if (state.Style()->StyleType() == kPseudoIdMarker)
       filter = filter.Add(CSSProperty::kValidForMarker, false);
-    if (IsHighlightPseudoElement(state.Style()->StyleType()))
-      filter = filter.Add(CSSProperty::kValidForHighlight, false);
+    if (IsHighlightPseudoElement(state.Style()->StyleType())) {
+      if (RuntimeEnabledFeatures::HighlightInheritanceEnabled() ||
+          state.Style()->StyleType() == PseudoId::kPseudoIdHighlight) {
+        filter = filter.Add(CSSProperty::kValidForHighlight, false);
+      } else {
+        filter = filter.Add(CSSProperty::kValidForHighlightLegacy, false);
+      }
+    }
     filter = filter.Add(CSSProperty::kAnimation, true);
 
     cascade.Apply(filter);
diff --git a/third_party/blink/renderer/core/css/rule_set.cc b/third_party/blink/renderer/core/css/rule_set.cc
index 29defac..4c64cef 100644
--- a/third_party/blink/renderer/core/css/rule_set.cc
+++ b/third_party/blink/renderer/core/css/rule_set.cc
@@ -78,6 +78,13 @@
         return ValidPropertyFilter::kMarker;
       case CSSSelector::kPseudoSelection:
       case CSSSelector::kPseudoTargetText:
+      case CSSSelector::kPseudoGrammarError:
+      case CSSSelector::kPseudoSpellingError:
+        if (RuntimeEnabledFeatures::HighlightInheritanceEnabled())
+          return ValidPropertyFilter::kHighlight;
+        else
+          return ValidPropertyFilter::kHighlightLegacy;
+      case CSSSelector::kPseudoHighlight:
         return ValidPropertyFilter::kHighlight;
       default:
         break;
diff --git a/third_party/blink/renderer/core/css/rule_set.h b/third_party/blink/renderer/core/css/rule_set.h
index ace07df..eb2cab13 100644
--- a/third_party/blink/renderer/core/css/rule_set.h
+++ b/third_party/blink/renderer/core/css/rule_set.h
@@ -68,6 +68,12 @@
   // https://drafts.csswg.org/css-pseudo-4/#marker-pseudo are valid.
   kMarker,
   // Defined in a highlight pseudo-element scope like ::selection and
+  // ::target-text. Theoretically only properties listed in
+  // https://drafts.csswg.org/css-pseudo-4/#highlight-styling should be valid,
+  // but when RuntimeEnabledFeatures::HighlightInheritanceEnabled() is disabled
+  // we allow a different set of rules for compatibility reasons.
+  kHighlightLegacy,
+  // Defined in a highlight pseudo-element scope like ::selection and
   // ::target-text. Only properties listed in
   // https://drafts.csswg.org/css-pseudo-4/#highlight-styling are valid.
   kHighlight,
diff --git a/third_party/blink/renderer/core/exported/web_media_player_impl_unittest.cc b/third_party/blink/renderer/core/exported/web_media_player_impl_unittest.cc
index 44fa743..4c1e00e 100644
--- a/third_party/blink/renderer/core/exported/web_media_player_impl_unittest.cc
+++ b/third_party/blink/renderer/core/exported/web_media_player_impl_unittest.cc
@@ -168,7 +168,7 @@
   MOCK_METHOD0(OnPictureInPictureStateChange, void());
   MOCK_CONST_METHOD0(CouldPlayIfEnoughData, bool());
   MOCK_METHOD0(ResumePlayback, void());
-  MOCK_METHOD0(PausePlayback, void());
+  MOCK_METHOD1(PausePlayback, void(WebMediaPlayerClient::PauseReason));
   MOCK_METHOD0(DidPlayerStartPlaying, void());
   MOCK_METHOD1(DidPlayerPaused, void(bool));
   MOCK_METHOD1(DidPlayerMutedStatusChange, void(bool));
@@ -1967,7 +1967,10 @@
   ScheduleIdlePauseTimer();
   EXPECT_TRUE(IsIdlePauseTimerRunning());
 
-  EXPECT_CALL(client_, PausePlayback());
+  EXPECT_CALL(
+      client_,
+      PausePlayback(
+          WebMediaPlayerClient::PauseReason::kSuspendedPlayerIdleTimeout));
   FireIdlePauseTimer();
   base::RunLoop().RunUntilIdle();
 }
diff --git a/third_party/blink/renderer/core/html/forms/html_text_area_element.cc b/third_party/blink/renderer/core/html/forms/html_text_area_element.cc
index 491091a..4ec8d71c 100644
--- a/third_party/blink/renderer/core/html/forms/html_text_area_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_text_area_element.cc
@@ -513,6 +513,9 @@
     // Set the caret to the end of the text value except for initialize.
     unsigned end_of_string = value_.length();
     SetSelectionRange(end_of_string, end_of_string);
+  } else if (selection == TextControlSetValueSelection::kSetSelectionToStart) {
+    // Set the caret to the start of the text value.
+    SetSelectionRange(0, 0);
   } else if (is_clamp) {
     const unsigned end_of_string = value_.length();
     SetSelectionRange(std::min(end_of_string, selection_start),
@@ -727,7 +730,7 @@
   const auto& source_element = To<HTMLTextAreaElement>(source);
   SetValueCommon(source_element.Value(),
                  TextFieldEventBehavior::kDispatchNoEvent,
-                 TextControlSetValueSelection::kSetSelectionToEnd,
+                 TextControlSetValueSelection::kSetSelectionToStart,
                  source_element.GetAutofillState());
   is_dirty_ = source_element.is_dirty_;
   TextControlElement::CloneNonAttributePropertiesFrom(source, flag);
diff --git a/third_party/blink/renderer/core/html/forms/text_control_element.h b/third_party/blink/renderer/core/html/forms/text_control_element.h
index 1a86c6f..884cb80a 100644
--- a/third_party/blink/renderer/core/html/forms/text_control_element.h
+++ b/third_party/blink/renderer/core/html/forms/text_control_element.h
@@ -50,6 +50,7 @@
 };
 
 enum class TextControlSetValueSelection {
+  kSetSelectionToStart,
   kSetSelectionToEnd,
   kClamp,
   kDoNotSet,
diff --git a/third_party/blink/renderer/core/html/media/html_media_element.cc b/third_party/blink/renderer/core/html/media/html_media_element.cc
index b4fbf82..3c5d7f4f 100644
--- a/third_party/blink/renderer/core/html/media/html_media_element.cc
+++ b/third_party/blink/renderer/core/html/media/html_media_element.cc
@@ -4418,38 +4418,53 @@
 }
 
 void HTMLMediaElement::RejectScheduledPlayPromises() {
-  switch (play_promise_error_code_) {
-    case PlayPromiseError::kNotSupported:
-      return RejectPlayPromisesInternal(
-          DOMExceptionCode::kNotSupportedError,
-          "Failed to load because no supported source was found.");
-    case PlayPromiseError::kPaused_Unknown:
-      return RejectPlayPromisesInternal(
-          DOMExceptionCode::kAbortError,
-          "The play() request was interrupted because the media paused. "
-          "https://goo.gl/LdLk22");
-    case PlayPromiseError::kPaused_PauseCalled:
-      return RejectPlayPromisesInternal(
-          DOMExceptionCode::kAbortError,
-          "The play() request was interrupted by a call to pause(). "
-          "https://goo.gl/LdLk22");
-    case PlayPromiseError::kPaused_EndOfPlayback:
-      return RejectPlayPromisesInternal(
-          DOMExceptionCode::kAbortError,
-          "The play() request was interrupted by end of playback. "
-          "https://goo.gl/LdLk22");
-    case PlayPromiseError::kPaused_RemovedFromDocument:
-      return RejectPlayPromisesInternal(
-          DOMExceptionCode::kAbortError,
-          "The play() request was interrupted because the media was removed "
-          "from the document. https://goo.gl/LdLk22");
-    case PlayPromiseError::kPaused_AutoplayAutoPause:
-      return RejectPlayPromisesInternal(
-          DOMExceptionCode::kAbortError,
-          "The play() request was interrupted because autoplaying media was "
-          "auto-paused. https://goo.gl/LdLk22");
+  if (play_promise_error_code_ == PlayPromiseError::kNotSupported) {
+    RejectPlayPromisesInternal(
+        DOMExceptionCode::kNotSupportedError,
+        "Failed to load because no supported source was found.");
+    return;
   }
-  NOTREACHED();
+
+  const char* reason = "";
+  switch (play_promise_error_code_) {
+    case PlayPromiseError::kPaused_Unknown:
+      reason = " because the media paused";
+      break;
+    case PlayPromiseError::kPaused_PauseCalled:
+      reason = " by a call to pause()";
+      break;
+    case PlayPromiseError::kPaused_EndOfPlayback:
+      reason = " by end of playback";
+      break;
+    case PlayPromiseError::kPaused_RemovedFromDocument:
+      reason = " because the media was removed from the document";
+      break;
+    case PlayPromiseError::kPaused_AutoplayAutoPause:
+      reason = " because autoplaying background media was paused to save power";
+      break;
+    case PlayPromiseError::kPaused_BackgroundVideoOptimization:
+      reason = " because video-only background media was paused to save power";
+      break;
+    case PlayPromiseError::kPaused_SuspendedPlayerIdleTimeout:
+      reason = " because the player was been suspended and became idle";
+      break;
+    case PlayPromiseError::kPaused_RemotePlayStateChange:
+      reason = " by a pause request from a remote media player";
+      break;
+    case PlayPromiseError::kPaused_PauseRequestedByUser:
+      reason = " because a pause was requested by the user";
+      break;
+    case PlayPromiseError::kPaused_PauseRequestedInternally:
+      reason = " because a pause was requested by the browser";
+      break;
+    case PlayPromiseError::kNotSupported:
+      NOTREACHED();
+  }
+  RejectPlayPromisesInternal(
+      DOMExceptionCode::kAbortError,
+      String::Format(
+          "The play() request was interrupted%s. https://goo.gl/LdLk22",
+          reason));
 }
 
 void HTMLMediaElement::RejectPlayPromises(DOMExceptionCode code,
@@ -4569,8 +4584,20 @@
   PlayInternal();
 }
 
-void HTMLMediaElement::PausePlayback() {
-  PauseInternal(PlayPromiseError::kPaused_Unknown);
+void HTMLMediaElement::PausePlayback(PauseReason pause_reason) {
+  switch (pause_reason) {
+    case PauseReason::kUnknown:
+      return PauseInternal(PlayPromiseError::kPaused_Unknown);
+    case PauseReason::kBackgroundVideoOptimization:
+      return PauseInternal(
+          PlayPromiseError::kPaused_BackgroundVideoOptimization);
+    case PauseReason::kSuspendedPlayerIdleTimeout:
+      return PauseInternal(
+          PlayPromiseError::kPaused_SuspendedPlayerIdleTimeout);
+    case PauseReason::kRemotePlayStateChange:
+      return PauseInternal(PlayPromiseError::kPaused_RemotePlayStateChange);
+  }
+  NOTREACHED();
 }
 
 void HTMLMediaElement::DidPlayerStartPlaying() {
@@ -4669,7 +4696,9 @@
           frame, mojom::blink::UserActivationNotificationType::kInteraction);
     }
   }
-  PauseInternal(PlayPromiseError::kPaused_Unknown);
+  PauseInternal(triggered_by_user
+                    ? PlayPromiseError::kPaused_PauseRequestedByUser
+                    : PlayPromiseError::kPaused_PauseRequestedInternally);
 }
 
 void HTMLMediaElement::RequestSeekForward(base::TimeDelta seek_time) {
diff --git a/third_party/blink/renderer/core/html/media/html_media_element.h b/third_party/blink/renderer/core/html/media/html_media_element.h
index 2da15b7..6becfb8 100644
--- a/third_party/blink/renderer/core/html/media/html_media_element.h
+++ b/third_party/blink/renderer/core/html/media/html_media_element.h
@@ -120,6 +120,11 @@
     kPaused_EndOfPlayback,
     kPaused_RemovedFromDocument,
     kPaused_AutoplayAutoPause,
+    kPaused_BackgroundVideoOptimization,
+    kPaused_SuspendedPlayerIdleTimeout,
+    kPaused_RemotePlayStateChange,
+    kPaused_PauseRequestedByUser,
+    kPaused_PauseRequestedInternally,
   };
 
   bool IsMediaElement() const override { return true; }
@@ -518,7 +523,7 @@
   bool WasAutoplayInitiated() override;
   bool IsInAutoPIP() const override { return false; }
   void ResumePlayback() final;
-  void PausePlayback() final;
+  void PausePlayback(PauseReason) final;
   void DidPlayerStartPlaying() override;
   void DidPlayerPaused(bool stream_ended) override;
   void DidPlayerMutedStatusChange(bool muted) override;
diff --git a/third_party/blink/renderer/core/svg/svg_foreign_object_element.cc b/third_party/blink/renderer/core/svg/svg_foreign_object_element.cc
index 55e2b8fc..c89a8d2d2 100644
--- a/third_party/blink/renderer/core/svg/svg_foreign_object_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_foreign_object_element.cc
@@ -146,6 +146,14 @@
   return LayoutObjectFactory::CreateSVGForeignObject(*this, style, legacy);
 }
 
+bool SVGForeignObjectElement::TypeShouldForceLegacyLayout() const {
+  // As long as the foreignObject element itself creates a legacy layout object,
+  // we need to use legacy layout for the entire block formatting context
+  // established by the foreignObject. For simplicity, just force legacy for the
+  // entire subtree.
+  return !RuntimeEnabledFeatures::LayoutNGForeignObjectEnabled();
+}
+
 bool SVGForeignObjectElement::SelfHasRelativeLengths() const {
   return x_->CurrentValue()->IsRelative() || y_->CurrentValue()->IsRelative() ||
          width_->CurrentValue()->IsRelative() ||
diff --git a/third_party/blink/renderer/core/svg/svg_foreign_object_element.h b/third_party/blink/renderer/core/svg/svg_foreign_object_element.h
index 4c1133ea..9d85ef8 100644
--- a/third_party/blink/renderer/core/svg/svg_foreign_object_element.h
+++ b/third_party/blink/renderer/core/svg/svg_foreign_object_element.h
@@ -48,12 +48,7 @@
   void SvgAttributeChanged(const SvgAttributeChangedParams&) override;
 
   LayoutObject* CreateLayoutObject(const ComputedStyle&, LegacyLayout) override;
-
-  // As long as the foreignObject element itself creates a legacy layout object,
-  // we need to use legacy layout for the entire block formatting context
-  // established by the foreignObject. For simplicity, just force legacy for the
-  // entire subtree.
-  bool TypeShouldForceLegacyLayout() const override { return true; }
+  bool TypeShouldForceLegacyLayout() const override;
 
   bool SelfHasRelativeLengths() const override;
 
diff --git a/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms_test.cc b/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms_test.cc
index 0b7231d5..a7d3871f 100644
--- a/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms_test.cc
+++ b/third_party/blink/renderer/modules/mediastream/webmediaplayer_ms_test.cc
@@ -573,7 +573,7 @@
       const WebString& remote_device_friendly_name) override {}
   void MediaRemotingStopped(int error_code) override {}
   void ResumePlayback() override {}
-  void PausePlayback() override {}
+  void PausePlayback(PauseReason) override {}
   void DidPlayerStartPlaying() override {}
   void DidPlayerPaused(bool) override {}
   void DidPlayerMutedStatusChange(bool muted) override {}
diff --git a/third_party/blink/renderer/modules/scheduler/task_attribution_tracker_impl.cc b/third_party/blink/renderer/modules/scheduler/task_attribution_tracker_impl.cc
index 1ba9948..afcd09d 100644
--- a/third_party/blink/renderer/modules/scheduler/task_attribution_tracker_impl.cc
+++ b/third_party/blink/renderer/modules/scheduler/task_attribution_tracker_impl.cc
@@ -67,7 +67,7 @@
 
   absl::optional<TaskId> current_task_id = RunningTaskId(script_state);
   if (!current_task_id) {
-    // TODO(yoav): This should not happen, but does. See crbug.com/132687
+    // TODO(yoav): This should not happen, but does. See crbug.com/1326872.
     return AncestorStatus::kNotAncestor;
   }
   if (is_ancestor(current_task_id.value())) {
diff --git a/third_party/blink/renderer/modules/webcodecs/codec_logger.h b/third_party/blink/renderer/modules/webcodecs/codec_logger.h
index 5d3f9fd5..034c4487 100644
--- a/third_party/blink/renderer/modules/webcodecs/codec_logger.h
+++ b/third_party/blink/renderer/modules/webcodecs/codec_logger.h
@@ -9,10 +9,10 @@
 #include <string>
 
 #include "base/check.h"
+#include "base/location.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/sequence_checker.h"
 #include "media/base/media_log.h"
-#include "base/location.h"
 #include "media/base/media_util.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/renderer/core/dom/dom_exception.h"
@@ -72,9 +72,17 @@
     // This allows us to destroy |parent_media_log_| and stop logging,
     // without causing problems to |media_log_| users.
     media_log_ = parent_media_log_->Clone();
+
+    task_runner_ = task_runner;
   }
 
-  ~CodecLogger() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); }
+  ~CodecLogger() {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+    // media logs must be posted for destruction, since they can cause the
+    // garbage collector to trigger an immediate cleanup and delete the owning
+    // instance of |CodecLogger|.
+    task_runner_->DeleteSoon(FROM_HERE, std::move(parent_media_log_));
+  }
 
   void SendPlayerNameInformation(const ExecutionContext& context,
                                  std::string loadedAs) {
@@ -135,6 +143,9 @@
   // can be safely accessed, and whose raw pointer can be given callbacks.
   std::unique_ptr<media::MediaLog> media_log_;
 
+  // Keep task runner around for posting the media log to upon destruction.
+  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
+
   SEQUENCE_CHECKER(sequence_checker_);
 };
 
diff --git a/third_party/blink/renderer/platform/media/web_media_player_impl.cc b/third_party/blink/renderer/platform/media/web_media_player_impl.cc
index 36f6583..030a8e2a 100644
--- a/third_party/blink/renderer/platform/media/web_media_player_impl.cc
+++ b/third_party/blink/renderer/platform/media/web_media_player_impl.cc
@@ -2709,7 +2709,8 @@
     client_->ResumePlayback();
   } else if (state == media::MediaStatus::State::PAUSED && !Paused()) {
     DVLOG(1) << __func__ << " requesting PAUSE.";
-    client_->PausePlayback();
+    client_->PausePlayback(
+        WebMediaPlayerClient::PauseReason::kRemotePlayStateChange);
   }
 }
 #endif  // BUILDFLAG(IS_ANDROID)
@@ -3434,8 +3435,11 @@
 #endif
 
   // Idle timeout chosen arbitrarily.
-  background_pause_timer_.Start(FROM_HERE, base::Seconds(5), client_,
-                                &WebMediaPlayerClient::PausePlayback);
+  background_pause_timer_.Start(
+      FROM_HERE, base::Seconds(5),
+      base::BindOnce(
+          &WebMediaPlayerClient::PausePlayback, base::Unretained(client_),
+          WebMediaPlayerClient::PauseReason::kSuspendedPlayerIdleTimeout));
 }
 
 void WebMediaPlayerImpl::CreateWatchTimeReporter() {
@@ -3725,7 +3729,8 @@
   // client_->PausePlayback() will get `paused_when_hidden_` set to
   // false and UpdatePlayState() called, so set the flag to true after and then
   // return.
-  client_->PausePlayback();
+  client_->PausePlayback(
+      WebMediaPlayerClient::PauseReason::kBackgroundVideoOptimization);
   paused_when_hidden_ = true;
 }
 
diff --git a/third_party/blink/renderer/platform/widget/compositing/android_webview/synchronous_layer_tree_frame_sink.cc b/third_party/blink/renderer/platform/widget/compositing/android_webview/synchronous_layer_tree_frame_sink.cc
index b85fd6d..db18ae26 100644
--- a/third_party/blink/renderer/platform/widget/compositing/android_webview/synchronous_layer_tree_frame_sink.cc
+++ b/third_party/blink/renderer/platform/widget/compositing/android_webview/synchronous_layer_tree_frame_sink.cc
@@ -30,7 +30,6 @@
 #include "components/viz/service/display/output_surface_frame.h"
 #include "components/viz/service/display/overlay_processor_stub.h"
 #include "components/viz/service/display/software_output_device.h"
-#include "components/viz/service/display/texture_deleter.h"
 #include "components/viz/service/frame_sinks/compositor_frame_sink_support.h"
 #include "components/viz/service/frame_sinks/frame_sink_manager_impl.h"
 #include "gpu/command_buffer/client/context_support.h"
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 07eb4cb..3b0a432 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -862,6 +862,7 @@
 crbug.com/1299442 virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/parse-input-arguments-005.https.html [ Failure Pass ]
 crbug.com/1299442 virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/geometry-with-float-size.https.html [ Failure Pass ]
 crbug.com/1299442 virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/registered-property-interpolation-008.https.html [ Failure Pass ]
+crbug.com/1299442 [ Mac12 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/roundrect.https.html [ Failure Pass ]
 crbug.com/1299442 virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/geometry-border-image-001.https.html [ Failure Pass ]
 crbug.com/1299442 virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/geometry-background-image-tiled-003.https.html [ Failure Pass ]
 crbug.com/1299442 [ Mac11 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/hidpi/device-pixel-ratio.https.html [ Failure Pass ]
@@ -3417,7 +3418,6 @@
 crbug.com/626703 [ Mac11-arm64 ] external/wpt/upgrade-insecure-requests/gen/worker-module-data.http-rp/upgrade/websocket.https.html [ Skip Timeout ]
 crbug.com/626703 [ Mac11-arm64 ] external/wpt/websockets/binary/002.html?wss [ Skip Timeout ]
 crbug.com/626703 [ Mac11-arm64 ] external/wpt/websockets/stream/tentative/backpressure-send.any.serviceworker.html?wss [ Skip Timeout ]
-crbug.com/626703 [ Mac10.13 ] external/wpt/webrtc-encoded-transform/RTCPeerConnection-insertable-streams-simulcast.https.html [ Timeout ]
 crbug.com/626703 virtual/document-transition/wpt_internal/document-transition/content-with-transform-old-image.html [ Failure ]
 crbug.com/626703 [ Mac11-arm64 ] external/wpt/navigation-api/ordering-and-transition/navigate-cross-document-double.html [ Timeout ]
 crbug.com/626703 [ Mac11-arm64 ] external/wpt/websockets/Create-extensions-empty.any.html?wpt_flags=h2 [ Skip Timeout ]
@@ -3426,8 +3426,7 @@
 crbug.com/626703 virtual/prerender/wpt_internal/prerender/unload-on-prerender-main-frame-navigation.html [ Skip ]
 crbug.com/626703 virtual/prerender/wpt_internal/prerender/unload-on-prerender-remove-subframe.html [ Skip ]
 crbug.com/626703 virtual/prerender/wpt_internal/prerender/unload-on-prerender-same-origin-subframe-navigation.html [ Skip ]
-crbug.com/626703 [ Mac11-arm64 ] external/wpt/webrtc-encoded-transform/RTCPeerConnection-insertable-streams-simulcast.https.html [ Timeout ]
-crbug.com/626703 [ Mac12-arm64 ] external/wpt/webrtc-encoded-transform/RTCPeerConnection-insertable-streams-simulcast.https.html [ Timeout ]
+crbug.com/626703 [ Mac ] external/wpt/webrtc-encoded-transform/RTCPeerConnection-insertable-streams-simulcast.https.html [ Failure Pass Timeout ]
 # TODO(crbug.com/1315625): Re-enable this test
 crbug.com/626703 external/wpt/webrtc-encoded-transform/sframe-keys.https.html [ Skip ]
 crbug.com/626703 external/wpt/geolocation-API/getCurrentPosition_permission_allow.https.html [ Timeout ]
@@ -3445,7 +3444,6 @@
 crbug.com/626703 external/wpt/wasm/webapi/esm-integration/worker-import.tentative.html [ Timeout ]
 crbug.com/626703 external/wpt/wasm/webapi/esm-integration/worker.tentative.html [ Timeout ]
 crbug.com/626703 [ Linux ] external/wpt/resource-timing/object-not-found-adds-entry.html [ Timeout ]
-crbug.com/626703 [ Mac11 ] external/wpt/webrtc-encoded-transform/RTCPeerConnection-insertable-streams-simulcast.https.html [ Timeout ]
 crbug.com/626703 external/wpt/webrtc/RTCConfiguration-iceTransportPolicy.html [ Skip Timeout ]
 crbug.com/626703 [ Win10.20h2 ] external/wpt/webrtc/RTCDataChannel-bufferedAmount.html [ Crash ]
 crbug.com/626703 [ Win10.20h2 ] virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCDataChannel-bufferedAmount.html [ Crash ]
@@ -6022,6 +6020,8 @@
 crbug.com/1147859 [ Linux ] external/wpt/css/css-highlight-api/painting/* [ Failure ]
 crbug.com/1147859 [ Linux ] virtual/css-highlight-inheritance/external/wpt/css/css-highlight-api/painting/* [ Failure ]
 crbug.com/1147859 [ Linux ] paint/custom-highlight-only-inheritance.html [ Failure ]
+crbug.com/1147859 [ Linux ] virtual/forced-high-contrast-colors/external/wpt/forced-colors-mode/forced-colors-mode-53.html [ Failure ]
+crbug.com/1147859 [ Mac ] virtual/forced-high-contrast-colors/external/wpt/forced-colors-mode/forced-colors-mode-53.html [ Failure ]
 
 # Green Mac11 Test
 crbug.com/1201406 [ Mac11 ] http/tests/credentialmanagement/credentialscontainer-create-origins.html [ Crash Timeout ]
@@ -6249,7 +6249,7 @@
 crbug.com/1249176 [ Mac11-arm64 ] external/wpt/css/css-shapes/shape-outside/shape-image/shape-image-025.html [ Failure ]
 crbug.com/1249176 [ Mac11-arm64 ] external/wpt/css/css-shapes/shape-outside/shape-image/shape-image-004.html [ Failure Pass ]
 
-# Waterfall-only mac12-arm64 failures
+# Failures that surfaced on the mac12-arm64 waterfall
 crbug.com/1249176 [ Mac12-arm64 ] compositing/overflow/rotate-clip.html [ Failure ]
 crbug.com/1249176 [ Mac12-arm64 ] compositing/overflow/rotate-then-clip.html [ Failure ]
 crbug.com/1249176 [ Mac12-arm64 ] media/color-profile-video-seek.html [ Failure ]
@@ -6272,6 +6272,12 @@
 crbug.com/1249176 [ Mac12-arm64 ] virtual/exotic-color-space/images/yuv-decode-eligible/webp-no-color-profile-lossy.html [ Failure ]
 crbug.com/1249176 [ Mac12-arm64 ] virtual/gpu-rasterization/images/color-jpeg-with-color-profile.html [ Failure ]
 
+# Flakes that surfaced on the mac12 and mac12-arm64 waterfall
+crbug.com/1249176 [ Mac12 ] external/wpt/html/browsers/browsing-the-web/back-forward-cache/service-worker-controlled-after-restore.https.html [ Failure Pass ]
+crbug.com/1249176 [ Mac12-arm64 ] external/wpt/html/rendering/replaced-elements/embedded-content/cross-domain-iframe-in-multicol.sub.html [ Failure Pass ]
+crbug.com/1249176 [ Mac12 ] virtual/scroll-unification/plugins/plugin-remove-subframe.html [ Crash Pass ]
+crbug.com/1249176 [ Mac12-arm64 ] media/controls/overflow-menu-focus.html [ Failure Pass ]
+
 # Following tests timeout on mac11-arm64
 crbug.com/1249176 [ Mac11-arm64 ] http/tests/devtools/tracing/timeline-paint/paint-profiler-update.js [ Failure Timeout ]
 
@@ -6286,8 +6292,8 @@
 crbug.com/1249176 [ Mac12-arm64 ] http/tests/devtools/tracing/timeline-time/timeline-usertiming.js [ Failure Pass ]
 crbug.com/1249176 [ Mac11-arm64 ] external/wpt/resource-timing/nested-context-navigations-embed.html [ Failure Pass ]
 crbug.com/1249176 [ Mac12-arm64 ] external/wpt/resource-timing/nested-context-navigations-embed.html [ Failure Pass ]
-crbug.com/1249176 [ Mac11-arm64 ] http/tests/intersection-observer/cross-origin-iframe-with-nesting.html [ Pass Timeout ]
-crbug.com/1249176 [ Mac12-arm64 ] http/tests/intersection-observer/cross-origin-iframe-with-nesting.html [ Pass Timeout ]
+crbug.com/1249176 [ Mac11-arm64 ] http/tests/intersection-observer/cross-origin-iframe-with-nesting.html [ Failure Pass Timeout ]
+crbug.com/1249176 [ Mac12-arm64 ] http/tests/intersection-observer/cross-origin-iframe-with-nesting.html [ Failure Pass Timeout ]
 crbug.com/1249176 [ Mac11-arm64 ] media/controls/overflow-menu-always-visible.html [ Failure Pass ]
 crbug.com/1249176 [ Mac12-arm64 ] media/controls/overflow-menu-always-visible.html [ Failure Pass ]
 crbug.com/1249176 [ Mac11-arm64 ] paint/markers/document-markers-font-8px.html [ Failure Pass ]
@@ -6813,8 +6819,6 @@
 
 # Sheriff 2022-03-04
 crbug.com/1302856 [ Mac11-arm64 ] virtual/exotic-color-space/images/rgb-png-with-cmyk-color-profile.html [ Failure Pass ]
-crbug.com/1297587 [ Mac10.14 ] external/wpt/webrtc-encoded-transform/RTCPeerConnection-insertable-streams-simulcast.https.html [ Failure Pass Timeout ]
-crbug.com/1297587 [ Mac10.15 ] external/wpt/webrtc-encoded-transform/RTCPeerConnection-insertable-streams-simulcast.https.html [ Failure Pass Timeout ]
 
 crbug.com/1300352 http/tests/inspector-protocol/network/blocked-cookie-not-on-path.js [ Pass Timeout ]
 
diff --git a/third_party/blink/web_tests/external/wpt/forced-colors-mode/forced-colors-mode-53-ref.html b/third_party/blink/web_tests/external/wpt/forced-colors-mode/forced-colors-mode-53-ref.html
new file mode 100644
index 0000000..443bc216
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/forced-colors-mode/forced-colors-mode-53-ref.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Forced colors mode - Highlight pseudos use the originating element's forced colors state</title>
+<link rel="help" href="https://www.w3.org/TR/css-color-adjust-1/#forced-color-adjust-prop">
+<link rel="help" href="https://drafts.csswg.org/css-highlight-api-1/">
+<style>
+  span.forcedColors {
+    background-color: Highlight;
+    color: HighlightText;
+    text-decoration: underline;
+    text-decoration-color: CanvasText;
+    forced-color-adjust: none;
+  }
+
+  span.noForcedColors {
+    background-color: yellow;
+    color: blue;
+    text-decoration: underline;
+    text-decoration-color: orange;
+    forced-color-adjust: none;
+  }
+</style>
+<body>
+  <div><span class="forcedColors">This content doesn't have forced-color-adjust set at all</span></div>
+  <div><span class="noForcedColors">This content has forced-color-adjust:none on the originating element only</span></div>
+  <div><span class="forcedColors">This content has forced-color-adjust:none on the ::highlight pseudo only</span></div>
+  <div><span class="noForcedColors">This content has forced-color-adjust:none on the originating element and the ::highlight pseudo</span></div>
+</body>
diff --git a/third_party/blink/web_tests/external/wpt/forced-colors-mode/forced-colors-mode-53.html b/third_party/blink/web_tests/external/wpt/forced-colors-mode/forced-colors-mode-53.html
new file mode 100644
index 0000000..4726c4b
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/forced-colors-mode/forced-colors-mode-53.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Forced colors mode - Highlight pseudos use the originating element's forced colors state</title>
+<link rel="help" href="https://www.w3.org/TR/css-color-adjust-1/#forced-color-adjust-prop">
+<link rel="help" href="https://drafts.csswg.org/css-highlight-api-1/">
+<link rel=match href="forced-colors-mode-53-ref.html">
+<style>
+  span {
+    background-color: lightgray;
+    color: orange;
+  }
+
+  span::highlight(foo) {
+    background-color: yellow;
+    color: blue;
+    text-decoration: underline;
+    text-decoration-color: orange;
+  }
+
+  .fcaOriginating {
+    forced-color-adjust: none;
+  }
+
+  .fcaPseudo::highlight(foo) {
+    forced-color-adjust: none;
+  }
+</style>
+<body>
+  <div><span>This content doesn't have forced-color-adjust set at all</span></div>
+  <div><span class="fcaOriginating">This content has forced-color-adjust:none on the originating element only</span></div>
+  <div><span class="fcaPseudo">This content has forced-color-adjust:none on the ::highlight pseudo only</span></div>
+  <div><span class="fcaOriginating fcaPseudo">This content has forced-color-adjust:none on the originating element and the ::highlight pseudo</span></div>
+  <script>
+    const ranges = [];
+    document.querySelectorAll("div").forEach(div => {
+      const range = new Range();
+      range.setStart(div, 0);
+      range.setEnd(div, 1);
+      ranges.push(range);
+    })
+
+    CSS.highlights.set("foo", new Highlight(...ranges));
+  </script>
+</body>
diff --git a/third_party/blink/web_tests/media/picture-in-picture/detached-iframe.html b/third_party/blink/web_tests/media/picture-in-picture/detached-iframe.html
index 8372744..2f27964 100644
--- a/third_party/blink/web_tests/media/picture-in-picture/detached-iframe.html
+++ b/third_party/blink/web_tests/media/picture-in-picture/detached-iframe.html
@@ -4,7 +4,7 @@
 <script src="../../resources/testharnessreport.js"></script>
 <script src="../../resources/testdriver.js"></script>
 <script src="../../resources/testdriver-vendor.js"></script>
-<script src="../../external/wpt/picture-in-picture/resources/picture-in-picture-helpers.js"></script>
+<script src="resources/picture-in-picture-helpers.js"></script>
 <body></body>
 <script>
 promise_test(async t => {
diff --git a/third_party/blink/web_tests/media/picture-in-picture/picture-in-picture-enabled.html b/third_party/blink/web_tests/media/picture-in-picture/picture-in-picture-enabled.html
index d6091ea0..aed5e00c 100644
--- a/third_party/blink/web_tests/media/picture-in-picture/picture-in-picture-enabled.html
+++ b/third_party/blink/web_tests/media/picture-in-picture/picture-in-picture-enabled.html
@@ -4,7 +4,7 @@
 <script src="../../resources/testharnessreport.js"></script>
 <script src="../../resources/testdriver.js"></script>
 <script src="../../resources/testdriver-vendor.js"></script>
-<script src="../../external/wpt/picture-in-picture/resources/picture-in-picture-helpers.js"></script>
+<script src="resources/picture-in-picture-helpers.js"></script>
 <body></body>
 <script>
 promise_test(async t => {
diff --git a/third_party/blink/web_tests/media/picture-in-picture/resources/picture-in-picture-helpers.js b/third_party/blink/web_tests/media/picture-in-picture/resources/picture-in-picture-helpers.js
new file mode 100644
index 0000000..7561944a
--- /dev/null
+++ b/third_party/blink/web_tests/media/picture-in-picture/resources/picture-in-picture-helpers.js
@@ -0,0 +1,15 @@
+function loadVideo(activeDocument, sourceUrl) {
+  return new Promise((resolve, reject) => {
+    const document = activeDocument || window.document;
+    const video = document.createElement('video');
+    video.src = sourceUrl || getVideoURI('/media/movie_5');
+    video.onloadedmetadata = () => { resolve(video); };
+    video.onerror = error => { reject(error); };
+  });
+}
+
+// Calls requestPictureInPicture() in a context that's 'allowed to request PiP'.
+async function requestPictureInPictureWithTrustedClick(videoElement) {
+  await test_driver.bless('request Picture-in-Picture');
+  return videoElement.requestPictureInPicture();
+}
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/forms/textfieldselection/select-event-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/forms/textfieldselection/select-event-expected.txt
deleted file mode 100644
index 3940b927..0000000
--- a/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/forms/textfieldselection/select-event-expected.txt
+++ /dev/null
@@ -1,274 +0,0 @@
-This is a testharness.js-based test.
-Found 270 tests; 255 PASS, 15 FAIL, 0 TIMEOUT, 0 NOTRUN.
-PASS textarea: select()
-PASS textarea: select() a second time (must not fire select)
-PASS textarea: select() disconnected node
-PASS textarea: select() event queue
-FAIL textarea: select() twice in disconnected node (must fire select only once) assert_equals: expected 0 but got 6
-PASS textarea: selectionStart
-PASS textarea: selectionStart a second time (must not fire select)
-PASS textarea: selectionStart disconnected node
-PASS textarea: selectionStart event queue
-FAIL textarea: selectionStart twice in disconnected node (must fire select only once) assert_equals: expected 0 but got 6
-PASS textarea: selectionEnd
-PASS textarea: selectionEnd a second time (must not fire select)
-PASS textarea: selectionEnd disconnected node
-PASS textarea: selectionEnd event queue
-FAIL textarea: selectionEnd twice in disconnected node (must fire select only once) assert_equals: expected 0 but got 6
-PASS textarea: selectionDirection
-PASS textarea: selectionDirection a second time (must not fire select)
-PASS textarea: selectionDirection disconnected node
-PASS textarea: selectionDirection event queue
-FAIL textarea: selectionDirection twice in disconnected node (must fire select only once) assert_equals: expected 0 but got 6
-PASS textarea: setSelectionRange()
-PASS textarea: setSelectionRange() a second time (must not fire select)
-PASS textarea: setSelectionRange() disconnected node
-PASS textarea: setSelectionRange() event queue
-FAIL textarea: setSelectionRange() twice in disconnected node (must fire select only once) assert_equals: expected 0 but got 6
-PASS textarea: setRangeText()
-PASS textarea: setRangeText() a second time (must not fire select)
-PASS textarea: setRangeText() disconnected node
-PASS textarea: setRangeText() event queue
-FAIL textarea: setRangeText() twice in disconnected node (must fire select only once) assert_equals: expected 0 but got 15
-PASS textarea: selectionStart out of range
-PASS textarea: selectionStart out of range a second time (must not fire select)
-FAIL textarea: selectionStart out of range disconnected node assert_true: event didn't fire expected true got false
-FAIL textarea: selectionStart out of range event queue assert_true: event didn't fire expected true got false
-FAIL textarea: selectionStart out of range twice in disconnected node (must fire select only once) assert_equals: expected 0 but got 6
-PASS textarea: selectionEnd out of range
-PASS textarea: selectionEnd out of range a second time (must not fire select)
-FAIL textarea: selectionEnd out of range disconnected node assert_true: event didn't fire expected true got false
-FAIL textarea: selectionEnd out of range event queue assert_true: event didn't fire expected true got false
-FAIL textarea: selectionEnd out of range twice in disconnected node (must fire select only once) assert_equals: expected 0 but got 6
-PASS textarea: setSelectionRange out of range
-PASS textarea: setSelectionRange out of range a second time (must not fire select)
-FAIL textarea: setSelectionRange out of range disconnected node assert_true: event didn't fire expected true got false
-FAIL textarea: setSelectionRange out of range event queue assert_true: event didn't fire expected true got false
-FAIL textarea: setSelectionRange out of range twice in disconnected node (must fire select only once) assert_equals: expected 0 but got 6
-PASS input type text: select()
-PASS input type text: select() a second time (must not fire select)
-PASS input type text: select() disconnected node
-PASS input type text: select() event queue
-PASS input type text: select() twice in disconnected node (must fire select only once)
-PASS input type text: selectionStart
-PASS input type text: selectionStart a second time (must not fire select)
-PASS input type text: selectionStart disconnected node
-PASS input type text: selectionStart event queue
-PASS input type text: selectionStart twice in disconnected node (must fire select only once)
-PASS input type text: selectionEnd
-PASS input type text: selectionEnd a second time (must not fire select)
-PASS input type text: selectionEnd disconnected node
-PASS input type text: selectionEnd event queue
-PASS input type text: selectionEnd twice in disconnected node (must fire select only once)
-PASS input type text: selectionDirection
-PASS input type text: selectionDirection a second time (must not fire select)
-PASS input type text: selectionDirection disconnected node
-PASS input type text: selectionDirection event queue
-PASS input type text: selectionDirection twice in disconnected node (must fire select only once)
-PASS input type text: setSelectionRange()
-PASS input type text: setSelectionRange() a second time (must not fire select)
-PASS input type text: setSelectionRange() disconnected node
-PASS input type text: setSelectionRange() event queue
-PASS input type text: setSelectionRange() twice in disconnected node (must fire select only once)
-PASS input type text: setRangeText()
-PASS input type text: setRangeText() a second time (must not fire select)
-PASS input type text: setRangeText() disconnected node
-PASS input type text: setRangeText() event queue
-PASS input type text: setRangeText() twice in disconnected node (must fire select only once)
-PASS input type text: selectionStart out of range
-PASS input type text: selectionStart out of range a second time (must not fire select)
-PASS input type text: selectionStart out of range disconnected node
-PASS input type text: selectionStart out of range event queue
-PASS input type text: selectionStart out of range twice in disconnected node (must fire select only once)
-PASS input type text: selectionEnd out of range
-PASS input type text: selectionEnd out of range a second time (must not fire select)
-PASS input type text: selectionEnd out of range disconnected node
-PASS input type text: selectionEnd out of range event queue
-PASS input type text: selectionEnd out of range twice in disconnected node (must fire select only once)
-PASS input type text: setSelectionRange out of range
-PASS input type text: setSelectionRange out of range a second time (must not fire select)
-PASS input type text: setSelectionRange out of range disconnected node
-PASS input type text: setSelectionRange out of range event queue
-PASS input type text: setSelectionRange out of range twice in disconnected node (must fire select only once)
-PASS input type search: select()
-PASS input type search: select() a second time (must not fire select)
-PASS input type search: select() disconnected node
-PASS input type search: select() event queue
-PASS input type search: select() twice in disconnected node (must fire select only once)
-PASS input type search: selectionStart
-PASS input type search: selectionStart a second time (must not fire select)
-PASS input type search: selectionStart disconnected node
-PASS input type search: selectionStart event queue
-PASS input type search: selectionStart twice in disconnected node (must fire select only once)
-PASS input type search: selectionEnd
-PASS input type search: selectionEnd a second time (must not fire select)
-PASS input type search: selectionEnd disconnected node
-PASS input type search: selectionEnd event queue
-PASS input type search: selectionEnd twice in disconnected node (must fire select only once)
-PASS input type search: selectionDirection
-PASS input type search: selectionDirection a second time (must not fire select)
-PASS input type search: selectionDirection disconnected node
-PASS input type search: selectionDirection event queue
-PASS input type search: selectionDirection twice in disconnected node (must fire select only once)
-PASS input type search: setSelectionRange()
-PASS input type search: setSelectionRange() a second time (must not fire select)
-PASS input type search: setSelectionRange() disconnected node
-PASS input type search: setSelectionRange() event queue
-PASS input type search: setSelectionRange() twice in disconnected node (must fire select only once)
-PASS input type search: setRangeText()
-PASS input type search: setRangeText() a second time (must not fire select)
-PASS input type search: setRangeText() disconnected node
-PASS input type search: setRangeText() event queue
-PASS input type search: setRangeText() twice in disconnected node (must fire select only once)
-PASS input type search: selectionStart out of range
-PASS input type search: selectionStart out of range a second time (must not fire select)
-PASS input type search: selectionStart out of range disconnected node
-PASS input type search: selectionStart out of range event queue
-PASS input type search: selectionStart out of range twice in disconnected node (must fire select only once)
-PASS input type search: selectionEnd out of range
-PASS input type search: selectionEnd out of range a second time (must not fire select)
-PASS input type search: selectionEnd out of range disconnected node
-PASS input type search: selectionEnd out of range event queue
-PASS input type search: selectionEnd out of range twice in disconnected node (must fire select only once)
-PASS input type search: setSelectionRange out of range
-PASS input type search: setSelectionRange out of range a second time (must not fire select)
-PASS input type search: setSelectionRange out of range disconnected node
-PASS input type search: setSelectionRange out of range event queue
-PASS input type search: setSelectionRange out of range twice in disconnected node (must fire select only once)
-PASS input type tel: select()
-PASS input type tel: select() a second time (must not fire select)
-PASS input type tel: select() disconnected node
-PASS input type tel: select() event queue
-PASS input type tel: select() twice in disconnected node (must fire select only once)
-PASS input type tel: selectionStart
-PASS input type tel: selectionStart a second time (must not fire select)
-PASS input type tel: selectionStart disconnected node
-PASS input type tel: selectionStart event queue
-PASS input type tel: selectionStart twice in disconnected node (must fire select only once)
-PASS input type tel: selectionEnd
-PASS input type tel: selectionEnd a second time (must not fire select)
-PASS input type tel: selectionEnd disconnected node
-PASS input type tel: selectionEnd event queue
-PASS input type tel: selectionEnd twice in disconnected node (must fire select only once)
-PASS input type tel: selectionDirection
-PASS input type tel: selectionDirection a second time (must not fire select)
-PASS input type tel: selectionDirection disconnected node
-PASS input type tel: selectionDirection event queue
-PASS input type tel: selectionDirection twice in disconnected node (must fire select only once)
-PASS input type tel: setSelectionRange()
-PASS input type tel: setSelectionRange() a second time (must not fire select)
-PASS input type tel: setSelectionRange() disconnected node
-PASS input type tel: setSelectionRange() event queue
-PASS input type tel: setSelectionRange() twice in disconnected node (must fire select only once)
-PASS input type tel: setRangeText()
-PASS input type tel: setRangeText() a second time (must not fire select)
-PASS input type tel: setRangeText() disconnected node
-PASS input type tel: setRangeText() event queue
-PASS input type tel: setRangeText() twice in disconnected node (must fire select only once)
-PASS input type tel: selectionStart out of range
-PASS input type tel: selectionStart out of range a second time (must not fire select)
-PASS input type tel: selectionStart out of range disconnected node
-PASS input type tel: selectionStart out of range event queue
-PASS input type tel: selectionStart out of range twice in disconnected node (must fire select only once)
-PASS input type tel: selectionEnd out of range
-PASS input type tel: selectionEnd out of range a second time (must not fire select)
-PASS input type tel: selectionEnd out of range disconnected node
-PASS input type tel: selectionEnd out of range event queue
-PASS input type tel: selectionEnd out of range twice in disconnected node (must fire select only once)
-PASS input type tel: setSelectionRange out of range
-PASS input type tel: setSelectionRange out of range a second time (must not fire select)
-PASS input type tel: setSelectionRange out of range disconnected node
-PASS input type tel: setSelectionRange out of range event queue
-PASS input type tel: setSelectionRange out of range twice in disconnected node (must fire select only once)
-PASS input type url: select()
-PASS input type url: select() a second time (must not fire select)
-PASS input type url: select() disconnected node
-PASS input type url: select() event queue
-PASS input type url: select() twice in disconnected node (must fire select only once)
-PASS input type url: selectionStart
-PASS input type url: selectionStart a second time (must not fire select)
-PASS input type url: selectionStart disconnected node
-PASS input type url: selectionStart event queue
-PASS input type url: selectionStart twice in disconnected node (must fire select only once)
-PASS input type url: selectionEnd
-PASS input type url: selectionEnd a second time (must not fire select)
-PASS input type url: selectionEnd disconnected node
-PASS input type url: selectionEnd event queue
-PASS input type url: selectionEnd twice in disconnected node (must fire select only once)
-PASS input type url: selectionDirection
-PASS input type url: selectionDirection a second time (must not fire select)
-PASS input type url: selectionDirection disconnected node
-PASS input type url: selectionDirection event queue
-PASS input type url: selectionDirection twice in disconnected node (must fire select only once)
-PASS input type url: setSelectionRange()
-PASS input type url: setSelectionRange() a second time (must not fire select)
-PASS input type url: setSelectionRange() disconnected node
-PASS input type url: setSelectionRange() event queue
-PASS input type url: setSelectionRange() twice in disconnected node (must fire select only once)
-PASS input type url: setRangeText()
-PASS input type url: setRangeText() a second time (must not fire select)
-PASS input type url: setRangeText() disconnected node
-PASS input type url: setRangeText() event queue
-PASS input type url: setRangeText() twice in disconnected node (must fire select only once)
-PASS input type url: selectionStart out of range
-PASS input type url: selectionStart out of range a second time (must not fire select)
-PASS input type url: selectionStart out of range disconnected node
-PASS input type url: selectionStart out of range event queue
-PASS input type url: selectionStart out of range twice in disconnected node (must fire select only once)
-PASS input type url: selectionEnd out of range
-PASS input type url: selectionEnd out of range a second time (must not fire select)
-PASS input type url: selectionEnd out of range disconnected node
-PASS input type url: selectionEnd out of range event queue
-PASS input type url: selectionEnd out of range twice in disconnected node (must fire select only once)
-PASS input type url: setSelectionRange out of range
-PASS input type url: setSelectionRange out of range a second time (must not fire select)
-PASS input type url: setSelectionRange out of range disconnected node
-PASS input type url: setSelectionRange out of range event queue
-PASS input type url: setSelectionRange out of range twice in disconnected node (must fire select only once)
-PASS input type password: select()
-PASS input type password: select() a second time (must not fire select)
-PASS input type password: select() disconnected node
-PASS input type password: select() event queue
-PASS input type password: select() twice in disconnected node (must fire select only once)
-PASS input type password: selectionStart
-PASS input type password: selectionStart a second time (must not fire select)
-PASS input type password: selectionStart disconnected node
-PASS input type password: selectionStart event queue
-PASS input type password: selectionStart twice in disconnected node (must fire select only once)
-PASS input type password: selectionEnd
-PASS input type password: selectionEnd a second time (must not fire select)
-PASS input type password: selectionEnd disconnected node
-PASS input type password: selectionEnd event queue
-PASS input type password: selectionEnd twice in disconnected node (must fire select only once)
-PASS input type password: selectionDirection
-PASS input type password: selectionDirection a second time (must not fire select)
-PASS input type password: selectionDirection disconnected node
-PASS input type password: selectionDirection event queue
-PASS input type password: selectionDirection twice in disconnected node (must fire select only once)
-PASS input type password: setSelectionRange()
-PASS input type password: setSelectionRange() a second time (must not fire select)
-PASS input type password: setSelectionRange() disconnected node
-PASS input type password: setSelectionRange() event queue
-PASS input type password: setSelectionRange() twice in disconnected node (must fire select only once)
-PASS input type password: setRangeText()
-PASS input type password: setRangeText() a second time (must not fire select)
-PASS input type password: setRangeText() disconnected node
-PASS input type password: setRangeText() event queue
-PASS input type password: setRangeText() twice in disconnected node (must fire select only once)
-PASS input type password: selectionStart out of range
-PASS input type password: selectionStart out of range a second time (must not fire select)
-PASS input type password: selectionStart out of range disconnected node
-PASS input type password: selectionStart out of range event queue
-PASS input type password: selectionStart out of range twice in disconnected node (must fire select only once)
-PASS input type password: selectionEnd out of range
-PASS input type password: selectionEnd out of range a second time (must not fire select)
-PASS input type password: selectionEnd out of range disconnected node
-PASS input type password: selectionEnd out of range event queue
-PASS input type password: selectionEnd out of range twice in disconnected node (must fire select only once)
-PASS input type password: setSelectionRange out of range
-PASS input type password: setSelectionRange out of range a second time (must not fire select)
-PASS input type password: setSelectionRange out of range disconnected node
-PASS input type password: setSelectionRange out of range event queue
-PASS input type password: setSelectionRange out of range twice in disconnected node (must fire select only once)
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/platform/mac/external/wpt/html/semantics/forms/textfieldselection/select-event-expected.txt b/third_party/blink/web_tests/platform/mac/external/wpt/html/semantics/forms/textfieldselection/select-event-expected.txt
index 1caa1e0..818d91b 100644
--- a/third_party/blink/web_tests/platform/mac/external/wpt/html/semantics/forms/textfieldselection/select-event-expected.txt
+++ b/third_party/blink/web_tests/platform/mac/external/wpt/html/semantics/forms/textfieldselection/select-event-expected.txt
@@ -1,50 +1,50 @@
 This is a testharness.js-based test.
-Found 270 tests; 249 PASS, 21 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 270 tests; 264 PASS, 6 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS textarea: select()
 PASS textarea: select() a second time (must not fire select)
 PASS textarea: select() disconnected node
 PASS textarea: select() event queue
-FAIL textarea: select() twice in disconnected node (must fire select only once) assert_equals: expected 0 but got 6
+PASS textarea: select() twice in disconnected node (must fire select only once)
 PASS textarea: selectionStart
 PASS textarea: selectionStart a second time (must not fire select)
 PASS textarea: selectionStart disconnected node
 PASS textarea: selectionStart event queue
-FAIL textarea: selectionStart twice in disconnected node (must fire select only once) assert_equals: expected 0 but got 6
+PASS textarea: selectionStart twice in disconnected node (must fire select only once)
 PASS textarea: selectionEnd
 PASS textarea: selectionEnd a second time (must not fire select)
 PASS textarea: selectionEnd disconnected node
 PASS textarea: selectionEnd event queue
-FAIL textarea: selectionEnd twice in disconnected node (must fire select only once) assert_equals: expected 0 but got 6
+PASS textarea: selectionEnd twice in disconnected node (must fire select only once)
 PASS textarea: selectionDirection
 FAIL textarea: selectionDirection a second time (must not fire select) assert_unreached: the select event must not fire the second time Reached unreachable code
 PASS textarea: selectionDirection disconnected node
 PASS textarea: selectionDirection event queue
-FAIL textarea: selectionDirection twice in disconnected node (must fire select only once) assert_equals: expected 0 but got 6
+PASS textarea: selectionDirection twice in disconnected node (must fire select only once)
 PASS textarea: setSelectionRange()
 PASS textarea: setSelectionRange() a second time (must not fire select)
 PASS textarea: setSelectionRange() disconnected node
 PASS textarea: setSelectionRange() event queue
-FAIL textarea: setSelectionRange() twice in disconnected node (must fire select only once) assert_equals: expected 0 but got 6
+PASS textarea: setSelectionRange() twice in disconnected node (must fire select only once)
 PASS textarea: setRangeText()
 PASS textarea: setRangeText() a second time (must not fire select)
 PASS textarea: setRangeText() disconnected node
 PASS textarea: setRangeText() event queue
-FAIL textarea: setRangeText() twice in disconnected node (must fire select only once) assert_equals: expected 0 but got 15
+PASS textarea: setRangeText() twice in disconnected node (must fire select only once)
 PASS textarea: selectionStart out of range
 PASS textarea: selectionStart out of range a second time (must not fire select)
-FAIL textarea: selectionStart out of range disconnected node assert_true: event didn't fire expected true got false
-FAIL textarea: selectionStart out of range event queue assert_true: event didn't fire expected true got false
-FAIL textarea: selectionStart out of range twice in disconnected node (must fire select only once) assert_equals: expected 0 but got 6
+PASS textarea: selectionStart out of range disconnected node
+PASS textarea: selectionStart out of range event queue
+PASS textarea: selectionStart out of range twice in disconnected node (must fire select only once)
 PASS textarea: selectionEnd out of range
 PASS textarea: selectionEnd out of range a second time (must not fire select)
-FAIL textarea: selectionEnd out of range disconnected node assert_true: event didn't fire expected true got false
-FAIL textarea: selectionEnd out of range event queue assert_true: event didn't fire expected true got false
-FAIL textarea: selectionEnd out of range twice in disconnected node (must fire select only once) assert_equals: expected 0 but got 6
+PASS textarea: selectionEnd out of range disconnected node
+PASS textarea: selectionEnd out of range event queue
+PASS textarea: selectionEnd out of range twice in disconnected node (must fire select only once)
 PASS textarea: setSelectionRange out of range
 PASS textarea: setSelectionRange out of range a second time (must not fire select)
-FAIL textarea: setSelectionRange out of range disconnected node assert_true: event didn't fire expected true got false
-FAIL textarea: setSelectionRange out of range event queue assert_true: event didn't fire expected true got false
-FAIL textarea: setSelectionRange out of range twice in disconnected node (must fire select only once) assert_equals: expected 0 but got 6
+PASS textarea: setSelectionRange out of range disconnected node
+PASS textarea: setSelectionRange out of range event queue
+PASS textarea: setSelectionRange out of range twice in disconnected node (must fire select only once)
 PASS input type text: select()
 PASS input type text: select() a second time (must not fire select)
 PASS input type text: select() disconnected node
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/client-hints-meta.https.html b/third_party/blink/web_tests/wpt_internal/fenced_frame/client-hints-meta.https.html
new file mode 100644
index 0000000..de59457
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/client-hints-meta.https.html
@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<meta http-equiv="Accept-CH"
+      content="sec-ch-viewport-width, sec-ch-ua-reduced"/>
+<meta http-equiv="Feature-Policy"
+      content="ch-viewport-width *, ch-ua-reduced *"/>
+<title>Client hints in fenced frames test</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<script src="resources/utils.js"></script>
+<script src="resources/client-hints-common.sub.js"></script>
+<script src="/common/get-host-info.sub.js"></script>
+<script src="/common/utils.js"></script>
+<script src="/common/dispatcher/dispatcher.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+<body>
+<script>
+promise_test(async () => {
+  const key = token();
+  const url = generateURL('resources/client-hints-meta-inner.sub.https.html', [key]);
+  const remote_url = getRemoteOriginURL(url);
+  attachFencedFrame(remote_url);
+  const result = JSON.parse(await nextValueFromServer(key));
+
+  // We should not see client hints for the fenced frame root or subframes //
+  // within the fenced frame tree due to the reject-all permission policy used by
+  // fenced frames.
+  const headers = ['root-fenced-frame-headers', 'iframe-headers'];
+  const hints = [
+    'sec-ch-viewport-width', 'sec-ch-ua-reduced', 'sec-ch-ua-mobile',
+  ];
+  headers.forEach(header => {
+    hints.forEach(hint => {
+      assert_equals(result[header][hint], '');
+    });
+  });
+}, 'fenced frames not send client hints');
+</script>
+</body>
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/client-hints-meta-iframe-inner.sub.https.html b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/client-hints-meta-iframe-inner.sub.https.html
new file mode 100644
index 0000000..9afb5c6a
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/client-hints-meta-iframe-inner.sub.https.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<meta http-equiv="Accept-CH"
+      content="sec-ch-viewport-width, sec-ch-ua-reduced"/>
+<meta http-equiv="Feature-Policy"
+      content="ch-viewport-width *, ch-ua-reduced *"/>
+<title>Client Hint Echoing Iframe</title>
+<body>
+<script>
+window.parent.postMessage({'headers': {
+    'sec-ch-viewport-width': '{{header_or_default(sec-ch-viewport-width, )}}',
+    'sec-ch-ua-reduced': '{{header_or_default(sec-ch-ua-reduced, )}}',
+    'sec-ch-ua-mobile': '{{header_or_default(sec-ch-ua-mobile, )}}',
+}}, '*');
+</script>
+</body>
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/client-hints-meta-iframe-inner.sub.https.html.headers b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/client-hints-meta-iframe-inner.sub.https.html.headers
new file mode 100644
index 0000000..b7952e5
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/client-hints-meta-iframe-inner.sub.https.html.headers
@@ -0,0 +1,2 @@
+
+Supports-Loading-Mode: fenced-frame
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/client-hints-meta-inner.sub.https.html b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/client-hints-meta-inner.sub.https.html
new file mode 100644
index 0000000..b84f16f
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/client-hints-meta-inner.sub.https.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<meta http-equiv="Accept-CH"
+      content="sec-ch-viewport-width, sec-ch-ua-reduced"/>
+<meta http-equiv="Feature-Policy"
+      content="ch-viewport-width *, ch-ua-reduced *"/>
+<script src="/resources/testharness.js"></script>
+<script src="utils.js"></script>
+<title>Client Hints Helper</title>
+<body>
+<script type="module">
+const [key] = parseKeylist();
+let iframe = document.createElement('iframe');
+let p = new Promise((resolve, reject) => {
+  window.addEventListener('message', e => {
+    resolve(e.data);
+  });
+});
+iframe.src = 'client-hints-meta-iframe-inner.sub.https.html';
+document.body.appendChild(iframe);
+const response = await p;
+const result = {
+  'root-fenced-frame-headers': {
+    'sec-ch-viewport-width': '{{header_or_default(sec-ch-viewport-width, )}}',
+    'sec-ch-ua-reduced': '{{header_or_default(sec-ch-ua-reduced, )}}',
+    'sec-ch-ua-mobile': '{{header_or_default(sec-ch-ua-mobile, )}}',
+  },
+  'iframe-headers': response.headers,
+};
+writeValueToServer(key, JSON.stringify(result));
+</script>
+</body>
diff --git a/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/client-hints-meta-inner.sub.https.html.headers b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/client-hints-meta-inner.sub.https.html.headers
new file mode 100644
index 0000000..afe7b4f3
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/fenced_frame/resources/client-hints-meta-inner.sub.https.html.headers
@@ -0,0 +1,2 @@
+Supports-Loading-Mode: fenced-frame
+Access-Control-Allow-Origin: *
diff --git a/third_party/harfbuzz-ng/README.chromium b/third_party/harfbuzz-ng/README.chromium
index fee2be39..86a1c8d8 100644
--- a/third_party/harfbuzz-ng/README.chromium
+++ b/third_party/harfbuzz-ng/README.chromium
@@ -1,10 +1,10 @@
 Name: harfbuzz-ng
 Short Name: harfbuzz-ng
 URL: http://harfbuzz.org
-Version: 4.3.0-32
+Version: 4.3.0-114
 CPEPrefix: cpe:/a:harfbuzz_project:harfbuzz:4.3.0
-Date: 20220529
-Revision: d61b2074915cf5f8044dcb8e3dafc04b5b58c6b8
+Date: 20220601
+Revision: c88a6a9ec3c38793ec8b662362282e076e948943
 Security Critical: yes
 License: MIT
 License File: src/COPYING
diff --git a/third_party/r8/3pp/patches/0005-Disable-write-only-field-pruning.patch b/third_party/r8/3pp/patches/0005-Disable-write-only-field-pruning.patch
deleted file mode 100644
index fdce923..0000000
--- a/third_party/r8/3pp/patches/0005-Disable-write-only-field-pruning.patch
+++ /dev/null
@@ -1,2901 +0,0 @@
-From 208592c4e7021c5ddbfcc49d53aa5298b73cdd54 Mon Sep 17 00:00:00 2001
-From: Andrew Grieve <agrieve@chromium.org>
-Date: Wed, 25 May 2022 23:12:52 -0400
-Subject: [PATCH 5/5] Disable write-only field pruning.
-
-Bug: 1329389
----
- src/main/java/com/android/tools/r8/R8.java    |   9 +-
- .../r8/graph/AbstractAccessContexts.java      |   6 +-
- .../tools/r8/graph/FieldAccessInfo.java       |  16 +-
- .../graph/FieldAccessInfoCollectionImpl.java  |   4 -
- .../tools/r8/graph/FieldAccessInfoImpl.java   |  88 ++---
- .../analysis/proto/EnumLiteProtoShrinker.java |  11 +-
- .../GeneratedExtensionRegistryShrinker.java   |  17 +-
- .../proto/schema/ProtoEnqueuerExtension.java  |  30 +-
- .../BasicBlockInstructionListIterator.java    |  22 +-
- .../android/tools/r8/ir/code/FieldGet.java    |   5 -
- .../code/IRCodeInstructionListIterator.java   |   8 +-
- .../r8/ir/code/InstructionListIterator.java   |   5 +-
- .../LinearFlowInstructionListIterator.java    |   8 +-
- .../tools/r8/ir/conversion/IRBuilder.java     |   2 +-
- .../tools/r8/ir/conversion/IRConverter.java   |   6 +-
- .../r8/ir/conversion/IRToDexFinalizer.java    |   5 +-
- .../conversion/MethodConversionOptions.java   |  13 -
- .../r8/ir/conversion/StringSwitchRemover.java |   4 +
- .../tools/r8/ir/optimize/CodeRewriter.java    |  11 +-
- .../tools/r8/ir/optimize/DeadCodeRemover.java |   4 -
- .../assume/AssumeInfoLookup.java              |   7 +-
- .../shaking/EmptyEnqueuerDeferredTracing.java |  41 ---
- .../android/tools/r8/shaking/Enqueuer.java    | 211 +++---------
- .../r8/shaking/EnqueuerDeferredTracing.java   |  55 +---
- .../shaking/EnqueuerDeferredTracingImpl.java  | 282 ----------------
- .../EnqueuerDeferredTracingRewriter.java      | 228 -------------
- .../tools/r8/shaking/EnqueuerWorklist.java    | 310 +-----------------
- .../android/tools/r8/shaking/KeepInfo.java    |   8 -
- .../tools/r8/utils/InternalOptions.java       |   3 -
- .../utils/collections/ProgramMemberMap.java   |   6 +-
- .../internal/proto/Proto2ShrinkingTest.java   |   1 -
- .../tools/r8/ir/LinearFlowIteratorTest.java   |  12 +-
- .../staticizer/ClassStaticizerTest.java       |   3 +-
- .../regalloc/RegisterMoveSchedulerTest.java   |   8 +-
- ...lassReferencedFromFieldAnnotationTest.java |  22 +-
- ...ationAssertionHandlerKotlinSimpleTest.java |  81 -----
- .../tools/r8/shaking/InvalidTypesTest.java    |  54 +--
- .../r8/shaking/KeepClassMembersFieldTest.java |  37 ++-
- ...FieldsAllowShrinkingCompatibilityTest.java |   8 +-
- .../MergedFieldTypeTest.java                  |   6 +-
- .../KeptSingletonIsNotCyclicTest.java         |   4 +-
- 41 files changed, 241 insertions(+), 1420 deletions(-)
- delete mode 100644 src/main/java/com/android/tools/r8/shaking/EmptyEnqueuerDeferredTracing.java
- delete mode 100644 src/main/java/com/android/tools/r8/shaking/EnqueuerDeferredTracingImpl.java
- delete mode 100644 src/main/java/com/android/tools/r8/shaking/EnqueuerDeferredTracingRewriter.java
- delete mode 100644 src/test/java/com/android/tools/r8/rewrite/assertions/kotlinassertionhandlersimple/AssertionConfigurationAssertionHandlerKotlinSimpleTest.java
-
-diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
-index 5d07a1ca0..a20f6300b 100644
---- a/src/main/java/com/android/tools/r8/R8.java
-+++ b/src/main/java/com/android/tools/r8/R8.java
-@@ -400,11 +400,6 @@ public class R8 {
-           GenericSignatureCorrectnessHelper.createForInitialCheck(appView, genericContextBuilder)
-               .run(appView.appInfo().classes());
- 
--          // TODO(b/226539525): Implement enum lite proto shrinking as deferred tracing.
--          if (appView.options().protoShrinking().isEnumLiteProtoShrinkingEnabled()) {
--            appView.protoShrinker().enumLiteProtoShrinker.clearDeadEnumLiteMaps();
--          }
--
-           TreePruner pruner = new TreePruner(appViewWithLiveness);
-           DirectMappedDexApplication prunedApp = pruner.run(executorService);
- 
-@@ -421,6 +416,10 @@ public class R8 {
-                   appViewWithLiveness, appViewWithLiveness.appInfo().computeSubtypingInfo())
-               .run();
- 
-+          if (appView.options().protoShrinking().isEnumLiteProtoShrinkingEnabled()) {
-+            appView.protoShrinker().enumLiteProtoShrinker.clearDeadEnumLiteMaps();
-+          }
-+
-           AnnotationRemover annotationRemover =
-               annotationRemoverBuilder
-                   .build(appViewWithLiveness, removedClasses);
-diff --git a/src/main/java/com/android/tools/r8/graph/AbstractAccessContexts.java b/src/main/java/com/android/tools/r8/graph/AbstractAccessContexts.java
-index 3e180dfc9..616fcf5c6 100644
---- a/src/main/java/com/android/tools/r8/graph/AbstractAccessContexts.java
-+++ b/src/main/java/com/android/tools/r8/graph/AbstractAccessContexts.java
-@@ -58,10 +58,6 @@ public abstract class AbstractAccessContexts {
- 
-   abstract int getNumberOfAccessContexts();
- 
--  public final boolean hasAccesses() {
--    return !isEmpty();
--  }
--
-   public boolean isBottom() {
-     return false;
-   }
-@@ -70,7 +66,7 @@ public abstract class AbstractAccessContexts {
-     return false;
-   }
- 
--  public abstract boolean isEmpty();
-+  abstract boolean isEmpty();
- 
-   public ConcreteAccessContexts asConcrete() {
-     return null;
-diff --git a/src/main/java/com/android/tools/r8/graph/FieldAccessInfo.java b/src/main/java/com/android/tools/r8/graph/FieldAccessInfo.java
-index 34b3f2b80..2cd2be0be 100644
---- a/src/main/java/com/android/tools/r8/graph/FieldAccessInfo.java
-+++ b/src/main/java/com/android/tools/r8/graph/FieldAccessInfo.java
-@@ -20,32 +20,20 @@ public interface FieldAccessInfo {
- 
-   int getNumberOfWriteContexts();
- 
--  AbstractAccessContexts getReadsWithContexts();
--
--  AbstractAccessContexts getWritesWithContexts();
--
-   ProgramMethod getUniqueReadContext();
- 
--  boolean hasKnownReadContexts();
--
-   boolean hasKnownWriteContexts();
- 
-   void forEachIndirectAccess(Consumer<DexField> consumer);
- 
-   void forEachIndirectAccessWithContexts(BiConsumer<DexField, ProgramMethodSet> consumer);
- 
--  void forEachAccessContext(Consumer<ProgramMethod> consumer);
--
-   void forEachReadContext(Consumer<ProgramMethod> consumer);
- 
-   void forEachWriteContext(Consumer<ProgramMethod> consumer);
- 
-   boolean hasReflectiveAccess();
- 
--  boolean hasReflectiveRead();
--
--  boolean hasReflectiveWrite();
--
-   default boolean isAccessedFromMethodHandle() {
-     return isReadFromMethodHandle() || isWrittenFromMethodHandle();
-   }
-@@ -58,8 +46,6 @@ public interface FieldAccessInfo {
- 
-   boolean isReadFromMethodHandle();
- 
--  boolean isReadOnlyInMethodSatisfying(Predicate<ProgramMethod> predicate);
--
-   boolean isWritten();
- 
-   boolean isWrittenFromMethodHandle();
-@@ -68,5 +54,7 @@ public interface FieldAccessInfo {
- 
-   boolean isWrittenOnlyInMethodSatisfying(Predicate<ProgramMethod> predicate);
- 
-+  boolean isReadOnlyInMethodSatisfying(Predicate<ProgramMethod> predicate);
-+
-   boolean isWrittenOutside(DexEncodedMethod method);
- }
-diff --git a/src/main/java/com/android/tools/r8/graph/FieldAccessInfoCollectionImpl.java b/src/main/java/com/android/tools/r8/graph/FieldAccessInfoCollectionImpl.java
-index 8a8b9da47..439ef05ea 100644
---- a/src/main/java/com/android/tools/r8/graph/FieldAccessInfoCollectionImpl.java
-+++ b/src/main/java/com/android/tools/r8/graph/FieldAccessInfoCollectionImpl.java
-@@ -63,10 +63,6 @@ public class FieldAccessInfoCollectionImpl
-     infos.values().forEach(consumer);
-   }
- 
--  public void remove(DexField field) {
--    infos.remove(field);
--  }
--
-   @Override
-   public void removeIf(BiPredicate<DexField, FieldAccessInfoImpl> predicate) {
-     infos.entrySet().removeIf(entry -> predicate.test(entry.getKey(), entry.getValue()));
-diff --git a/src/main/java/com/android/tools/r8/graph/FieldAccessInfoImpl.java b/src/main/java/com/android/tools/r8/graph/FieldAccessInfoImpl.java
-index 8779817a4..0a7d218da 100644
---- a/src/main/java/com/android/tools/r8/graph/FieldAccessInfoImpl.java
-+++ b/src/main/java/com/android/tools/r8/graph/FieldAccessInfoImpl.java
-@@ -27,9 +27,8 @@ public class FieldAccessInfoImpl implements FieldAccessInfo {
-   public static int FLAG_IS_READ_FROM_ANNOTATION = 1 << 0;
-   public static int FLAG_IS_READ_FROM_METHOD_HANDLE = 1 << 1;
-   public static int FLAG_IS_WRITTEN_FROM_METHOD_HANDLE = 1 << 2;
--  public static int FLAG_HAS_REFLECTIVE_READ = 1 << 3;
--  public static int FLAG_HAS_REFLECTIVE_WRITE = 1 << 4;
--  public static int FLAG_IS_READ_FROM_RECORD_INVOKE_DYNAMIC = 1 << 5;
-+  public static int FLAG_HAS_REFLECTIVE_ACCESS = 1 << 3;
-+  public static int FLAG_IS_READ_FROM_RECORD_INVOKE_DYNAMIC = 1 << 4;
- 
-   // A direct reference to the definition of the field.
-   private DexField field;
-@@ -73,7 +72,6 @@ public class FieldAccessInfoImpl implements FieldAccessInfo {
-     return field;
-   }
- 
--  @Override
-   public AbstractAccessContexts getReadsWithContexts() {
-     return readsWithContexts;
-   }
-@@ -82,11 +80,6 @@ public class FieldAccessInfoImpl implements FieldAccessInfo {
-     this.readsWithContexts = readsWithContexts;
-   }
- 
--  @Override
--  public AbstractAccessContexts getWritesWithContexts() {
--    return writesWithContexts;
--  }
--
-   public void setWritesWithContexts(AbstractAccessContexts writesWithContexts) {
-     this.writesWithContexts = writesWithContexts;
-   }
-@@ -108,11 +101,6 @@ public class FieldAccessInfoImpl implements FieldAccessInfo {
-         : null;
-   }
- 
--  @Override
--  public boolean hasKnownReadContexts() {
--    return !readsWithContexts.isTop();
--  }
--
-   @Override
-   public boolean hasKnownWriteContexts() {
-     return !writesWithContexts.isTop();
-@@ -180,12 +168,6 @@ public class FieldAccessInfoImpl implements FieldAccessInfo {
-         });
-   }
- 
--  @Override
--  public void forEachAccessContext(Consumer<ProgramMethod> consumer) {
--    forEachReadContext(consumer);
--    forEachWriteContext(consumer);
--  }
--
-   @Override
-   public void forEachReadContext(Consumer<ProgramMethod> consumer) {
-     readsWithContexts.forEachAccessContext(consumer);
-@@ -198,39 +180,17 @@ public class FieldAccessInfoImpl implements FieldAccessInfo {
- 
-   @Override
-   public boolean hasReflectiveAccess() {
--    return hasReflectiveRead() || hasReflectiveWrite();
--  }
--
--  @Override
--  public boolean hasReflectiveRead() {
--    return (flags & FLAG_HAS_REFLECTIVE_READ) != 0;
--  }
--
--  public void setHasReflectiveRead() {
--    flags |= FLAG_HAS_REFLECTIVE_READ;
--  }
--
--  @Override
--  public boolean hasReflectiveWrite() {
--    return (flags & FLAG_HAS_REFLECTIVE_WRITE) != 0;
-+    return (flags & FLAG_HAS_REFLECTIVE_ACCESS) != 0;
-   }
- 
--  public void setHasReflectiveWrite() {
--    flags |= FLAG_HAS_REFLECTIVE_WRITE;
-+  public void setHasReflectiveAccess() {
-+    flags |= FLAG_HAS_REFLECTIVE_ACCESS;
-   }
- 
-   /** Returns true if this field is read by the program. */
-   @Override
-   public boolean isRead() {
--    return isReadDirectly() || isReadIndirectly();
--  }
--
--  private boolean isReadDirectly() {
--    return !readsWithContexts.isEmpty();
--  }
--
--  private boolean isReadIndirectly() {
--    return hasReflectiveRead()
-+    return !readsWithContexts.isEmpty()
-         || isReadFromAnnotation()
-         || isReadFromMethodHandle()
-         || isReadFromRecordInvokeDynamic();
-@@ -250,15 +210,15 @@ public class FieldAccessInfoImpl implements FieldAccessInfo {
-     return (flags & FLAG_IS_READ_FROM_METHOD_HANDLE) != 0;
-   }
- 
--  public void setReadFromMethodHandle() {
--    flags |= FLAG_IS_READ_FROM_METHOD_HANDLE;
--  }
--
-   @Override
-   public boolean isReadFromRecordInvokeDynamic() {
-     return (flags & FLAG_IS_READ_FROM_RECORD_INVOKE_DYNAMIC) != 0;
-   }
- 
-+  public void setReadFromMethodHandle() {
-+    flags |= FLAG_IS_READ_FROM_METHOD_HANDLE;
-+  }
-+
-   public void setReadFromRecordInvokeDynamic() {
-     flags |= FLAG_IS_READ_FROM_RECORD_INVOKE_DYNAMIC;
-   }
-@@ -267,28 +227,12 @@ public class FieldAccessInfoImpl implements FieldAccessInfo {
-     flags &= ~FLAG_IS_READ_FROM_RECORD_INVOKE_DYNAMIC;
-   }
- 
--  /**
--   * Returns true if this field is only read by methods for which {@param predicate} returns true.
--   */
--  @Override
--  public boolean isReadOnlyInMethodSatisfying(Predicate<ProgramMethod> predicate) {
--    return readsWithContexts.isAccessedOnlyInMethodSatisfying(predicate) && !isReadIndirectly();
--  }
--
-   /** Returns true if this field is written by the program. */
-   @Override
-   public boolean isWritten() {
--    return isWrittenDirectly() || isWrittenIndirectly();
--  }
--
--  private boolean isWrittenDirectly() {
-     return !writesWithContexts.isEmpty();
-   }
- 
--  private boolean isWrittenIndirectly() {
--    return hasReflectiveWrite() || isWrittenFromMethodHandle();
--  }
--
-   @Override
-   public boolean isWrittenFromMethodHandle() {
-     return (flags & FLAG_IS_WRITTEN_FROM_METHOD_HANDLE) != 0;
-@@ -312,7 +256,15 @@ public class FieldAccessInfoImpl implements FieldAccessInfo {
-    */
-   @Override
-   public boolean isWrittenOnlyInMethodSatisfying(Predicate<ProgramMethod> predicate) {
--    return writesWithContexts.isAccessedOnlyInMethodSatisfying(predicate) && !isWrittenIndirectly();
-+    return writesWithContexts.isAccessedOnlyInMethodSatisfying(predicate);
-+  }
-+
-+  /**
-+   * Returns true if this field is only read by methods for which {@param predicate} returns true.
-+   */
-+  @Override
-+  public boolean isReadOnlyInMethodSatisfying(Predicate<ProgramMethod> predicate) {
-+    return readsWithContexts.isAccessedOnlyInMethodSatisfying(predicate);
-   }
- 
-   /**
-@@ -320,7 +272,7 @@ public class FieldAccessInfoImpl implements FieldAccessInfo {
-    */
-   @Override
-   public boolean isWrittenOutside(DexEncodedMethod method) {
--    return writesWithContexts.isAccessedOutside(method) || isWrittenIndirectly();
-+    return writesWithContexts.isAccessedOutside(method);
-   }
- 
-   public boolean recordRead(DexField access, ProgramMethod context) {
-diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/EnumLiteProtoShrinker.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/EnumLiteProtoShrinker.java
-index e5278324d..6accb73ab 100644
---- a/src/main/java/com/android/tools/r8/ir/analysis/proto/EnumLiteProtoShrinker.java
-+++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/EnumLiteProtoShrinker.java
-@@ -86,14 +86,9 @@ public class EnumLiteProtoShrinker {
-       if (enumLite != null) {
-         DexEncodedField field =
-             enumLite.lookupField(createInternalValueMapField(enumLite.getType()));
--        if (field == null) {
--          return false;
--        }
--        if (appView.appInfo().isFieldRead(field)) {
--          return false;
--        }
--        return !appView.appInfo().isFieldWritten(field)
--            || appView.appInfo().isStaticFieldWrittenOnlyInEnclosingStaticInitializer(field);
-+        return field != null
-+            && appView.appInfo().isStaticFieldWrittenOnlyInEnclosingStaticInitializer(field)
-+            && !appView.appInfo().isFieldRead(field);
-       }
-     }
-     return false;
-diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedExtensionRegistryShrinker.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedExtensionRegistryShrinker.java
-index 66d04da00..88d1c4752 100644
---- a/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedExtensionRegistryShrinker.java
-+++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedExtensionRegistryShrinker.java
-@@ -14,7 +14,6 @@ import com.android.tools.r8.graph.DexProgramClass;
- import com.android.tools.r8.graph.DexType;
- import com.android.tools.r8.graph.FieldAccessInfo;
- import com.android.tools.r8.graph.FieldAccessInfoCollection;
--import com.android.tools.r8.graph.FieldResolutionResult;
- import com.android.tools.r8.graph.ProgramField;
- import com.android.tools.r8.graph.ProgramMethod;
- import com.android.tools.r8.ir.code.IRCode;
-@@ -232,18 +231,10 @@ public class GeneratedExtensionRegistryShrinker {
- 
-   public boolean isDeadProtoExtensionField(DexField fieldReference) {
-     AppInfoWithLiveness appInfo = appView.appInfo();
--    return isDeadProtoExtensionField(
--        appInfo.resolveField(fieldReference),
--        appInfo.getFieldAccessInfoCollection(),
--        appInfo.getKeepInfo());
--  }
--
--  public boolean isDeadProtoExtensionField(
--      FieldResolutionResult resolutionResult,
--      FieldAccessInfoCollection<?> fieldAccessInfoCollection,
--      KeepInfoCollection keepInfo) {
--    ProgramField field = resolutionResult.getSingleProgramField();
--    return field != null && isDeadProtoExtensionField(field, fieldAccessInfoCollection, keepInfo);
-+    ProgramField field = appInfo.resolveField(fieldReference).getSingleProgramField();
-+    return field != null
-+        && isDeadProtoExtensionField(
-+            field, appInfo.getFieldAccessInfoCollection(), appInfo.getKeepInfo());
-   }
- 
-   public boolean isDeadProtoExtensionField(
-diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoEnqueuerExtension.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoEnqueuerExtension.java
-index e84fc5a69..b3976c758 100644
---- a/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoEnqueuerExtension.java
-+++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoEnqueuerExtension.java
-@@ -384,7 +384,7 @@ public class ProtoEnqueuerExtension extends EnqueuerAnalysis {
-         }
- 
-         boolean valueStorageIsLive;
--        if (enqueuer.isFieldReferenced(valueStorage)) {
-+        if (enqueuer.isFieldLive(valueStorage)) {
-           if (enqueuer.isFieldRead(valueStorage)
-               || enqueuer.isFieldWrittenOutsideDefaultConstructor(valueStorage)
-               || reachesMapOrRequiredField(protoFieldInfo)) {
-@@ -392,13 +392,15 @@ public class ProtoEnqueuerExtension extends EnqueuerAnalysis {
-             // (i) optimize field reads into loading the default value of the field or (ii) remove
-             // field writes to proto fields that could be read using reflection by the proto
-             // library.
--            worklist.enqueueTraceReflectiveFieldAccessAction(valueStorage, dynamicMethod);
-+            enqueuer.registerReflectiveFieldAccess(valueStorage.getReference(), dynamicMethod);
-           }
-           valueStorageIsLive = true;
-         } else if (reachesMapOrRequiredField(protoFieldInfo)) {
-           // Map/required fields cannot be removed. Therefore, we mark such fields as both read and
-           // written such that we cannot optimize any field reads or writes.
--          worklist.enqueueTraceReflectiveFieldAccessAction(valueStorage, dynamicMethod);
-+          enqueuer.registerReflectiveFieldAccess(valueStorage.getReference(), dynamicMethod);
-+          worklist.enqueueMarkFieldAsReachableAction(
-+              valueStorage, dynamicMethod, KeepReason.reflectiveUseIn(dynamicMethod));
-           valueStorageIsLive = true;
-         } else {
-           valueStorageIsLive = false;
-@@ -412,7 +414,7 @@ public class ProtoEnqueuerExtension extends EnqueuerAnalysis {
-             newlyLiveField = protoFieldInfo.getOneOfCaseField(appView, protoMessageInfo);
-           } else if (protoFieldInfo.hasHazzerBitField(protoMessageInfo)) {
-             newlyLiveField = protoFieldInfo.getHazzerBitField(appView, protoMessageInfo);
--            worklist.enqueueTraceReflectiveFieldAccessAction(valueStorage, dynamicMethod);
-+            enqueuer.registerReflectiveFieldAccess(valueStorage.getReference(), dynamicMethod);
-           }
-         } else {
-           // For one-of fields, mark the one-of field as live if the one-of-case field is live, and
-@@ -421,13 +423,13 @@ public class ProtoEnqueuerExtension extends EnqueuerAnalysis {
-           if (protoFieldInfo.getType().isOneOf()) {
-             ProgramField oneOfCaseField =
-                 protoFieldInfo.getOneOfCaseField(appView, protoMessageInfo);
--            if (oneOfCaseField != null && enqueuer.isFieldReferenced(oneOfCaseField)) {
-+            if (oneOfCaseField != null && enqueuer.isFieldLive(oneOfCaseField)) {
-               newlyLiveField = valueStorage;
-             }
-           } else if (protoFieldInfo.hasHazzerBitField(protoMessageInfo)) {
-             ProgramField hazzerBitField =
-                 protoFieldInfo.getHazzerBitField(appView, protoMessageInfo);
--            if (hazzerBitField == null || !enqueuer.isFieldReferenced(hazzerBitField)) {
-+            if (hazzerBitField == null || !enqueuer.isFieldLive(hazzerBitField)) {
-               continue;
-             }
- 
-@@ -456,12 +458,15 @@ public class ProtoEnqueuerExtension extends EnqueuerAnalysis {
-                       && !writer.isStructurallyEqualTo(dynamicMethod);
-           if (enqueuer.isFieldWrittenInMethodSatisfying(
-               newlyLiveField, neitherDefaultConstructorNorDynamicMethod)) {
--            worklist.enqueueTraceReflectiveFieldReadAction(newlyLiveField, dynamicMethod);
-+            enqueuer.registerReflectiveFieldRead(newlyLiveField.getReference(), dynamicMethod);
-           }
- 
-           // Unconditionally register the hazzer and one-of proto fields as written from
-           // dynamicMethod().
--          worklist.enqueueTraceReflectiveFieldWriteAction(newlyLiveField, dynamicMethod);
-+          if (enqueuer.registerReflectiveFieldWrite(newlyLiveField.getReference(), dynamicMethod)) {
-+            worklist.enqueueMarkFieldAsReachableAction(
-+                newlyLiveField, dynamicMethod, KeepReason.reflectiveUseIn(dynamicMethod));
-+          }
-         }
-       }
- 
-@@ -492,7 +497,7 @@ public class ProtoEnqueuerExtension extends EnqueuerAnalysis {
-         // schema, and therefore we do need to trace the const-class instructions that will be
-         // emitted for it.
-         ProgramField valueStorage = protoFieldInfo.getValueStorage(appView, protoMessageInfo);
--        if (valueStorage != null && enqueuer.isFieldReferenced(valueStorage)) {
-+        if (valueStorage != null && enqueuer.isFieldLive(valueStorage)) {
-           for (ProtoObject object : objects) {
-             if (object.isProtoObjectFromStaticGet()) {
-               worklist.enqueueTraceStaticFieldRead(
-@@ -549,7 +554,7 @@ public class ProtoEnqueuerExtension extends EnqueuerAnalysis {
-       return;
-     }
- 
--    if (!enqueuer.isFieldReferenced(oneOfCaseField)) {
-+    if (!enqueuer.isFieldLive(oneOfCaseField)) {
-       return;
-     }
- 
-@@ -573,7 +578,10 @@ public class ProtoEnqueuerExtension extends EnqueuerAnalysis {
-       return;
-     }
- 
--    worklist.enqueueTraceReflectiveFieldWriteAction(oneOfField, dynamicMethod);
-+    if (enqueuer.registerReflectiveFieldWrite(oneOfField.getReference(), dynamicMethod)) {
-+      worklist.enqueueMarkFieldAsReachableAction(
-+          oneOfField, dynamicMethod, KeepReason.reflectiveUseIn(dynamicMethod));
-+    }
-   }
- 
-   /**
-diff --git a/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionListIterator.java b/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionListIterator.java
-index b9f07e33c..3525c5ff8 100644
---- a/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionListIterator.java
-+++ b/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionListIterator.java
-@@ -9,6 +9,7 @@ import static com.android.tools.r8.ir.analysis.type.Nullability.definitelyNotNul
- import static com.android.tools.r8.ir.analysis.type.Nullability.maybeNull;
- import static com.android.tools.r8.ir.code.DominatorTree.Assumption.MAY_HAVE_UNREACHABLE_BLOCKS;
- 
-+import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
- import com.android.tools.r8.graph.AppView;
- import com.android.tools.r8.graph.DebugLocalInfo;
- import com.android.tools.r8.graph.DexField;
-@@ -325,7 +326,8 @@ public class BasicBlockInstructionListIterator implements InstructionListIterato
-       removeOrReplaceByDebugLocalRead();
-       return true;
-     }
--    replaceCurrentInstructionWithNullCheck(appView, receiver);
-+    DexMethod getClassMethod = appView.dexItemFactory().objectMembers.getClass;
-+    replaceCurrentInstruction(new InvokeVirtual(getClassMethod, null, ImmutableList.of(receiver)));
-     return true;
-   }
- 
-@@ -405,20 +407,6 @@ public class BasicBlockInstructionListIterator implements InstructionListIterato
-     replaceCurrentInstruction(constString);
-   }
- 
--  @Override
--  public void replaceCurrentInstructionWithNullCheck(AppView<?> appView, Value object) {
--    if (current == null) {
--      throw new IllegalStateException();
--    }
--
--    assert current.hasUnusedOutValue();
--    assert !block.hasCatchHandlers() || current.instructionTypeCanThrow();
--
--    DexMethod getClassMethod = appView.dexItemFactory().objectMembers.getClass;
--    replaceCurrentInstruction(
--        InvokeVirtual.builder().setMethod(getClassMethod).setSingleArgument(object).build());
--  }
--
-   @Override
-   public void replaceCurrentInstructionWithStaticGet(
-       AppView<?> appView, IRCode code, DexField field, Set<Value> affectedValues) {
-@@ -504,7 +492,7 @@ public class BasicBlockInstructionListIterator implements InstructionListIterato
- 
-   @Override
-   public void replaceCurrentInstructionWithThrowNull(
--      AppView<?> appView,
-+      AppView<? extends AppInfoWithClassHierarchy> appView,
-       IRCode code,
-       ListIterator<BasicBlock> blockIterator,
-       Set<BasicBlock> blocksToRemove,
-@@ -586,7 +574,7 @@ public class BasicBlockInstructionListIterator implements InstructionListIterato
-                 // target.
-                 return;
-               }
--              if (appView.isSubtype(appView.dexItemFactory().npeType, guard).isFalse()) {
-+              if (!appView.appInfo().isSubtype(appView.dexItemFactory().npeType, guard)) {
-                 // TODO(christofferqa): Consider updating previous dominator tree instead of
-                 //   rebuilding it from scratch.
-                 DominatorTree dominatorTree = new DominatorTree(code, MAY_HAVE_UNREACHABLE_BLOCKS);
-diff --git a/src/main/java/com/android/tools/r8/ir/code/FieldGet.java b/src/main/java/com/android/tools/r8/ir/code/FieldGet.java
-index ec663fb16..aecb3eb82 100644
---- a/src/main/java/com/android/tools/r8/ir/code/FieldGet.java
-+++ b/src/main/java/com/android/tools/r8/ir/code/FieldGet.java
-@@ -5,15 +5,10 @@
- package com.android.tools.r8.ir.code;
- 
- import com.android.tools.r8.graph.DexField;
--import com.android.tools.r8.ir.analysis.type.TypeElement;
- 
- public interface FieldGet {
- 
-   DexField getField();
- 
--  TypeElement getOutType();
--
--  boolean hasUsedOutValue();
--
-   Value outValue();
- }
-diff --git a/src/main/java/com/android/tools/r8/ir/code/IRCodeInstructionListIterator.java b/src/main/java/com/android/tools/r8/ir/code/IRCodeInstructionListIterator.java
-index 912586942..21b9df5e0 100644
---- a/src/main/java/com/android/tools/r8/ir/code/IRCodeInstructionListIterator.java
-+++ b/src/main/java/com/android/tools/r8/ir/code/IRCodeInstructionListIterator.java
-@@ -5,6 +5,7 @@
- package com.android.tools.r8.ir.code;
- 
- import com.android.tools.r8.errors.Unimplemented;
-+import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
- import com.android.tools.r8.graph.AppView;
- import com.android.tools.r8.graph.DebugLocalInfo;
- import com.android.tools.r8.graph.DexField;
-@@ -88,11 +89,6 @@ public class IRCodeInstructionListIterator implements InstructionListIterator {
-     instructionIterator.replaceCurrentInstructionWithConstString(appView, code, value);
-   }
- 
--  @Override
--  public void replaceCurrentInstructionWithNullCheck(AppView<?> appView, Value object) {
--    instructionIterator.replaceCurrentInstructionWithNullCheck(appView, object);
--  }
--
-   @Override
-   public void replaceCurrentInstructionWithStaticGet(
-       AppView<?> appView, IRCode code, DexField field, Set<Value> affectedValues) {
-@@ -118,7 +114,7 @@ public class IRCodeInstructionListIterator implements InstructionListIterator {
- 
-   @Override
-   public void replaceCurrentInstructionWithThrowNull(
--      AppView<?> appView,
-+      AppView<? extends AppInfoWithClassHierarchy> appView,
-       IRCode code,
-       ListIterator<BasicBlock> blockIterator,
-       Set<BasicBlock> blocksToRemove,
-diff --git a/src/main/java/com/android/tools/r8/ir/code/InstructionListIterator.java b/src/main/java/com/android/tools/r8/ir/code/InstructionListIterator.java
-index 505507201..f1eab8920 100644
---- a/src/main/java/com/android/tools/r8/ir/code/InstructionListIterator.java
-+++ b/src/main/java/com/android/tools/r8/ir/code/InstructionListIterator.java
-@@ -5,6 +5,7 @@
- package com.android.tools.r8.ir.code;
- 
- import com.android.tools.r8.errors.Unimplemented;
-+import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
- import com.android.tools.r8.graph.AppView;
- import com.android.tools.r8.graph.DebugLocalInfo;
- import com.android.tools.r8.graph.DexField;
-@@ -143,8 +144,6 @@ public interface InstructionListIterator
-         appView, code, appView.dexItemFactory().createString(value));
-   }
- 
--  void replaceCurrentInstructionWithNullCheck(AppView<?> appView, Value object);
--
-   void replaceCurrentInstructionWithStaticGet(
-       AppView<?> appView, IRCode code, DexField field, Set<Value> affectedValues);
- 
-@@ -171,7 +170,7 @@ public interface InstructionListIterator
-    * @param affectedValues set passed where values depending on detached blocks will be added.
-    */
-   void replaceCurrentInstructionWithThrowNull(
--      AppView<?> appView,
-+      AppView<? extends AppInfoWithClassHierarchy> appView,
-       IRCode code,
-       ListIterator<BasicBlock> blockIterator,
-       Set<BasicBlock> blocksToRemove,
-diff --git a/src/main/java/com/android/tools/r8/ir/code/LinearFlowInstructionListIterator.java b/src/main/java/com/android/tools/r8/ir/code/LinearFlowInstructionListIterator.java
-index 093faf189..ffb5d2bf7 100644
---- a/src/main/java/com/android/tools/r8/ir/code/LinearFlowInstructionListIterator.java
-+++ b/src/main/java/com/android/tools/r8/ir/code/LinearFlowInstructionListIterator.java
-@@ -4,6 +4,7 @@
- 
- package com.android.tools.r8.ir.code;
- 
-+import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
- import com.android.tools.r8.graph.AppView;
- import com.android.tools.r8.graph.DebugLocalInfo;
- import com.android.tools.r8.graph.DexField;
-@@ -112,11 +113,6 @@ public class LinearFlowInstructionListIterator implements InstructionListIterato
-     currentBlockIterator.replaceCurrentInstructionWithConstString(appView, code, value);
-   }
- 
--  @Override
--  public void replaceCurrentInstructionWithNullCheck(AppView<?> appView, Value object) {
--    currentBlockIterator.replaceCurrentInstructionWithNullCheck(appView, object);
--  }
--
-   @Override
-   public void replaceCurrentInstructionWithStaticGet(
-       AppView<?> appView, IRCode code, DexField field, Set<Value> affectedValues) {
-@@ -138,7 +134,7 @@ public class LinearFlowInstructionListIterator implements InstructionListIterato
- 
-   @Override
-   public void replaceCurrentInstructionWithThrowNull(
--      AppView<?> appView,
-+      AppView<? extends AppInfoWithClassHierarchy> appView,
-       IRCode code,
-       ListIterator<BasicBlock> blockIterator,
-       Set<BasicBlock> blocksToRemove,
-diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java b/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
-index 85ac399b3..142f70eea 100644
---- a/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
-+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
-@@ -736,7 +736,7 @@ public class IRBuilder {
-       new TypeAnalysis(appView).narrowing(ir);
-     }
- 
--    if (conversionOptions.isStringSwitchConversionEnabled()) {
-+    if (appView.options().isStringSwitchConversionEnabled()) {
-       StringSwitchConverter.convertToStringSwitchInstructions(ir, appView.dexItemFactory());
-     }
- 
-diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
-index 0c255dad7..929c89a44 100644
---- a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
-+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
-@@ -906,7 +906,7 @@ public class IRConverter {
-     Timing timing = Timing.empty();
-     deadCodeRemover.run(code, timing);
-     method.setCode(
--        new IRToDexFinalizer(appView, deadCodeRemover)
-+        new IRToDexFinalizer(appView, codeRewriter, deadCodeRemover)
-             .finalizeCode(code, BytecodeMetadataProvider.empty(), timing),
-         appView);
-     if (Log.ENABLED) {
-@@ -1429,7 +1429,7 @@ public class IRConverter {
- 
-     previous = printMethod(code, "IR after outline handler (SSA)", previous);
- 
--    if (code.getConversionOptions().isStringSwitchConversionEnabled()) {
-+    if (stringSwitchRemover != null) {
-       // Remove string switches prior to canonicalization to ensure that the constants that are
-       // being introduced will be canonicalized if possible.
-       timing.begin("Remove string switch");
-@@ -1643,7 +1643,7 @@ public class IRConverter {
-     ProgramMethod method = code.context();
-     DexEncodedMethod definition = method.getDefinition();
-     method.setCode(
--        new IRToDexFinalizer(appView, deadCodeRemover)
-+        new IRToDexFinalizer(appView, codeRewriter, deadCodeRemover)
-             .finalizeCode(code, bytecodeMetadataProvider, timing),
-         appView);
-     markProcessed(code, feedback);
-diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRToDexFinalizer.java b/src/main/java/com/android/tools/r8/ir/conversion/IRToDexFinalizer.java
-index 4155003ec..70fd16a41 100644
---- a/src/main/java/com/android/tools/r8/ir/conversion/IRToDexFinalizer.java
-+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRToDexFinalizer.java
-@@ -26,9 +26,10 @@ public class IRToDexFinalizer extends IRFinalizer<DexCode> {
-   private final CodeRewriter codeRewriter;
-   private final InternalOptions options;
- 
--  public IRToDexFinalizer(AppView<?> appView, DeadCodeRemover deadCodeRemover) {
-+  public IRToDexFinalizer(
-+      AppView<?> appView, CodeRewriter codeRewriter, DeadCodeRemover deadCodeRemover) {
-     super(appView, deadCodeRemover);
--    this.codeRewriter = deadCodeRemover.getCodeRewriter();
-+    this.codeRewriter = codeRewriter;
-     this.options = appView.options();
-   }
- 
-diff --git a/src/main/java/com/android/tools/r8/ir/conversion/MethodConversionOptions.java b/src/main/java/com/android/tools/r8/ir/conversion/MethodConversionOptions.java
-index 038a2771c..472f83882 100644
---- a/src/main/java/com/android/tools/r8/ir/conversion/MethodConversionOptions.java
-+++ b/src/main/java/com/android/tools/r8/ir/conversion/MethodConversionOptions.java
-@@ -17,16 +17,12 @@ public abstract class MethodConversionOptions {
- 
-   public abstract boolean isPeepholeOptimizationsEnabled();
- 
--  public abstract boolean isStringSwitchConversionEnabled();
--
-   public static class MutableMethodConversionOptions extends MethodConversionOptions {
- 
-     private boolean enablePeepholeOptimizations = true;
--    private boolean enableStringSwitchConversion;
-     private boolean isGeneratingClassFiles;
- 
-     public MutableMethodConversionOptions(InternalOptions options) {
--      this.enableStringSwitchConversion = options.isStringSwitchConversionEnabled();
-       this.isGeneratingClassFiles = options.isGeneratingClassFiles();
-     }
- 
-@@ -35,10 +31,6 @@ public abstract class MethodConversionOptions {
-       enablePeepholeOptimizations = false;
-     }
- 
--    public void disableStringSwitchConversion() {
--      enableStringSwitchConversion = false;
--    }
--
-     public MutableMethodConversionOptions setIsGeneratingClassFiles(
-         boolean isGeneratingClassFiles) {
-       this.isGeneratingClassFiles = isGeneratingClassFiles;
-@@ -54,11 +46,6 @@ public abstract class MethodConversionOptions {
-     public boolean isPeepholeOptimizationsEnabled() {
-       return enablePeepholeOptimizations;
-     }
--
--    @Override
--    public boolean isStringSwitchConversionEnabled() {
--      return enableStringSwitchConversion;
--    }
-   }
- 
-   public static class ThrowingMethodConversionOptions extends MutableMethodConversionOptions {
-diff --git a/src/main/java/com/android/tools/r8/ir/conversion/StringSwitchRemover.java b/src/main/java/com/android/tools/r8/ir/conversion/StringSwitchRemover.java
-index ab6e97d8c..ecaeac24b 100644
---- a/src/main/java/com/android/tools/r8/ir/conversion/StringSwitchRemover.java
-+++ b/src/main/java/com/android/tools/r8/ir/conversion/StringSwitchRemover.java
-@@ -50,6 +50,10 @@ public class StringSwitchRemover {
-   private final IdentifierNameStringMarker identifierNameStringMarker;
-   private final ClassTypeElement stringType;
- 
-+  public StringSwitchRemover(AppView<?> appView) {
-+    this(appView, null);
-+  }
-+
-   StringSwitchRemover(AppView<?> appView, IdentifierNameStringMarker identifierNameStringMarker) {
-     this.appView = appView;
-     this.identifierNameStringMarker = identifierNameStringMarker;
-diff --git a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
-index afeb060e4..9c6521dfc 100644
---- a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
-+++ b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
-@@ -14,6 +14,7 @@ import com.android.tools.r8.dex.Constants;
- import com.android.tools.r8.errors.CompilationError;
- import com.android.tools.r8.errors.Unreachable;
- import com.android.tools.r8.graph.AccessControl;
-+import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
- import com.android.tools.r8.graph.AppView;
- import com.android.tools.r8.graph.DebugLocalInfo;
- import com.android.tools.r8.graph.DexClass;
-@@ -3040,6 +3041,12 @@ public class CodeRewriter {
-   // it with a block throwing a null value (which should result in NPE). Note that this throw is not
-   // expected to be ever reached, but is intended to satisfy verifier.
-   public void optimizeAlwaysThrowingInstructions(IRCode code) {
-+    if (!appView.appInfo().hasClassHierarchy()) {
-+      return;
-+    }
-+
-+    AppView<? extends AppInfoWithClassHierarchy> appViewWithClassHierarchy =
-+        appView.withClassHierarchy();
-     Set<Value> affectedValues = Sets.newIdentityHashSet();
-     Set<BasicBlock> blocksToRemove = Sets.newIdentityHashSet();
-     ListIterator<BasicBlock> blockIterator = code.listIterator();
-@@ -3089,7 +3096,7 @@ public class CodeRewriter {
-               }
-             }
-             instructionIterator.replaceCurrentInstructionWithThrowNull(
--                appView, code, blockIterator, blocksToRemove, affectedValues);
-+                appViewWithClassHierarchy, code, blockIterator, blocksToRemove, affectedValues);
-             continue;
-           }
-         }
-@@ -3125,7 +3132,7 @@ public class CodeRewriter {
-           instructionIterator.setInsertionPosition(invoke.getPosition());
-           instructionIterator.next();
-           instructionIterator.replaceCurrentInstructionWithThrowNull(
--              appView, code, blockIterator, blocksToRemove, affectedValues);
-+              appViewWithClassHierarchy, code, blockIterator, blocksToRemove, affectedValues);
-           instructionIterator.unsetInsertionPosition();
-         }
-       }
-diff --git a/src/main/java/com/android/tools/r8/ir/optimize/DeadCodeRemover.java b/src/main/java/com/android/tools/r8/ir/optimize/DeadCodeRemover.java
-index 92e653d3e..caacb269f 100644
---- a/src/main/java/com/android/tools/r8/ir/optimize/DeadCodeRemover.java
-+++ b/src/main/java/com/android/tools/r8/ir/optimize/DeadCodeRemover.java
-@@ -40,10 +40,6 @@ public class DeadCodeRemover {
-     this.codeRewriter = codeRewriter;
-   }
- 
--  public CodeRewriter getCodeRewriter() {
--    return codeRewriter;
--  }
--
-   public void run(IRCode code, Timing timing) {
-     timing.begin("Remove dead code");
- 
-diff --git a/src/main/java/com/android/tools/r8/ir/optimize/membervaluepropagation/assume/AssumeInfoLookup.java b/src/main/java/com/android/tools/r8/ir/optimize/membervaluepropagation/assume/AssumeInfoLookup.java
-index d207ac784..381ea11a4 100644
---- a/src/main/java/com/android/tools/r8/ir/optimize/membervaluepropagation/assume/AssumeInfoLookup.java
-+++ b/src/main/java/com/android/tools/r8/ir/optimize/membervaluepropagation/assume/AssumeInfoLookup.java
-@@ -4,7 +4,6 @@
- 
- package com.android.tools.r8.ir.optimize.membervaluepropagation.assume;
- 
--import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
- import com.android.tools.r8.graph.AppView;
- import com.android.tools.r8.graph.DexClassAndMember;
- import com.android.tools.r8.graph.DexClassAndMethod;
-@@ -32,10 +31,10 @@ public class AssumeInfoLookup {
-   }
- 
-   public static AssumeInfo lookupAssumeInfo(
--      AppView<? extends AppInfoWithClassHierarchy> appView, DexClassAndMember<?, ?> member) {
-+      AppView<AppInfoWithLiveness> appView, DexClassAndMember<?, ?> member) {
-     DexMember<?, ?> reference = member.getReference();
--    ProguardMemberRule assumeNoSideEffectsRule = appView.rootSet().noSideEffects.get(reference);
--    ProguardMemberRule assumeValuesRule = appView.rootSet().assumedValues.get(reference);
-+    ProguardMemberRule assumeNoSideEffectsRule = appView.appInfo().noSideEffects.get(reference);
-+    ProguardMemberRule assumeValuesRule = appView.appInfo().assumedValues.get(reference);
-     if (assumeNoSideEffectsRule == null && assumeValuesRule == null) {
-       return null;
-     }
-diff --git a/src/main/java/com/android/tools/r8/shaking/EmptyEnqueuerDeferredTracing.java b/src/main/java/com/android/tools/r8/shaking/EmptyEnqueuerDeferredTracing.java
-deleted file mode 100644
-index 2faf20b75..000000000
---- a/src/main/java/com/android/tools/r8/shaking/EmptyEnqueuerDeferredTracing.java
-+++ /dev/null
-@@ -1,41 +0,0 @@
--// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
--// for details. All rights reserved. Use of this source code is governed by a
--// BSD-style license that can be found in the LICENSE file.
--
--package com.android.tools.r8.shaking;
--
--import com.android.tools.r8.graph.DexField;
--import com.android.tools.r8.graph.FieldResolutionResult;
--import com.android.tools.r8.graph.ProgramField;
--import com.android.tools.r8.graph.ProgramMethod;
--import com.android.tools.r8.shaking.Enqueuer.FieldAccessKind;
--import com.android.tools.r8.shaking.Enqueuer.FieldAccessMetadata;
--import java.util.concurrent.ExecutorService;
--
--public class EmptyEnqueuerDeferredTracing extends EnqueuerDeferredTracing {
--
--  @Override
--  public boolean deferTracingOfFieldAccess(
--      DexField fieldReference,
--      FieldResolutionResult resolutionResult,
--      ProgramMethod context,
--      FieldAccessKind accessKind,
--      FieldAccessMetadata metadata) {
--    return false;
--  }
--
--  @Override
--  public boolean enqueueWorklistActions(EnqueuerWorklist worklist) {
--    return false;
--  }
--
--  @Override
--  public void rewriteApplication(ExecutorService executorService) {
--    // Intentionally empty.
--  }
--
--  @Override
--  public void notifyReflectiveFieldAccess(ProgramField field, ProgramMethod context) {
--    // Intentionally empty.
--  }
--}
-diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
-index f7d3e7422..10f971d76 100644
---- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
-+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
-@@ -10,7 +10,6 @@ import static com.android.tools.r8.ir.desugar.LambdaDescriptor.isLambdaMetafacto
- import static com.android.tools.r8.ir.desugar.itf.InterfaceMethodRewriter.Flavor.ExcludeDexResources;
- import static com.android.tools.r8.naming.IdentifierNameStringUtils.identifyIdentifier;
- import static com.android.tools.r8.naming.IdentifierNameStringUtils.isReflectionMethod;
--import static com.android.tools.r8.shaking.KeepInfo.Joiner.asFieldJoinerOrNull;
- import static com.android.tools.r8.utils.FunctionUtils.ignoreArgument;
- import static com.android.tools.r8.utils.MapUtils.ignoreKey;
- import static java.util.Collections.emptySet;
-@@ -127,10 +126,6 @@ import com.android.tools.r8.shaking.EnqueuerEvent.InstantiatedClassEnqueuerEvent
- import com.android.tools.r8.shaking.EnqueuerEvent.LiveClassEnqueuerEvent;
- import com.android.tools.r8.shaking.EnqueuerEvent.UnconditionalKeepInfoEvent;
- import com.android.tools.r8.shaking.EnqueuerWorklist.EnqueuerAction;
--import com.android.tools.r8.shaking.EnqueuerWorklist.TraceInstanceFieldReadAction;
--import com.android.tools.r8.shaking.EnqueuerWorklist.TraceInstanceFieldWriteAction;
--import com.android.tools.r8.shaking.EnqueuerWorklist.TraceStaticFieldReadAction;
--import com.android.tools.r8.shaking.EnqueuerWorklist.TraceStaticFieldWriteAction;
- import com.android.tools.r8.shaking.GraphReporter.KeepReasonWitness;
- import com.android.tools.r8.shaking.KeepInfoCollection.MutableKeepInfoCollection;
- import com.android.tools.r8.shaking.RootSetUtils.ConsequentRootSet;
-@@ -469,7 +464,7 @@ public class Enqueuer {
-     InternalOptions options = appView.options();
-     this.appInfo = appView.appInfo();
-     this.appView = appView.withClassHierarchy();
--    this.deferredTracing = EnqueuerDeferredTracing.create(appView, this, mode);
-+    this.deferredTracing = new EnqueuerDeferredTracing();
-     this.executorService = executorService;
-     this.subtypingInfo = subtypingInfo;
-     this.forceProguardCompatibility = options.forceProguardCompatibility;
-@@ -705,10 +700,6 @@ public class Enqueuer {
-     return classResolutionResult;
-   }
- 
--  public FieldAccessInfoCollectionImpl getFieldAccessInfoCollection() {
--    return fieldAccessInfoCollection;
--  }
--
-   public MutableKeepInfoCollection getKeepInfo() {
-     return keepInfo;
-   }
-@@ -717,28 +708,6 @@ public class Enqueuer {
-     return keepInfo.getClassInfo(clazz);
-   }
- 
--  public KeepFieldInfo getKeepInfo(ProgramField field) {
--    return keepInfo.getFieldInfo(field);
--  }
--
--  public boolean hasMinimumKeepInfoThatMatches(
--      ProgramField field, Predicate<KeepFieldInfo.Joiner> predicate) {
--    MinimumKeepInfoCollection minimumKeepInfoCollection =
--        dependentMinimumKeepInfo.getUnconditionalMinimumKeepInfoOrDefault(
--            MinimumKeepInfoCollection.empty());
--    KeepFieldInfo.Joiner minimumKeepInfo =
--        asFieldJoinerOrNull(minimumKeepInfoCollection.getOrDefault(field.getReference(), null));
--    return minimumKeepInfo != null && predicate.test(minimumKeepInfo);
--  }
--
--  public ObjectAllocationInfoCollectionImpl getObjectAllocationInfoCollection() {
--    return objectAllocationInfoCollection;
--  }
--
--  public EnqueuerWorklist getWorklist() {
--    return workList;
--  }
--
-   private void addLiveNonProgramType(
-       ClasspathOrLibraryClass clazz,
-       // TODO(b/216576191): Remove when tracking live library members.
-@@ -1010,39 +979,22 @@ public class Enqueuer {
-     return registerFieldAccess(field, context, true, false);
-   }
- 
--  public boolean registerReflectiveFieldRead(ProgramField field, ProgramMethod context) {
--    return registerFieldAccess(field.getReference(), context, true, true);
-+  public boolean registerReflectiveFieldRead(DexField field, ProgramMethod context) {
-+    return registerFieldAccess(field, context, true, true);
-   }
- 
-   public boolean registerFieldWrite(DexField field, ProgramMethod context) {
-     return registerFieldAccess(field, context, false, false);
-   }
- 
--  public boolean registerReflectiveFieldWrite(ProgramField field, ProgramMethod context) {
--    return registerFieldAccess(field.getReference(), context, false, true);
--  }
--
--  public void traceReflectiveFieldAccess(ProgramField field, ProgramMethod context) {
--    deferredTracing.notifyReflectiveFieldAccess(field, context);
--    boolean changed = registerReflectiveFieldRead(field, context);
--    changed |= registerReflectiveFieldWrite(field, context);
--    if (changed) {
--      markFieldAsReachable(field, context, KeepReason.reflectiveUseIn(context));
--    }
--  }
--
--  public void traceReflectiveFieldRead(ProgramField field, ProgramMethod context) {
--    deferredTracing.notifyReflectiveFieldAccess(field, context);
--    if (registerReflectiveFieldRead(field, context)) {
--      markFieldAsReachable(field, context, KeepReason.reflectiveUseIn(context));
--    }
-+  public boolean registerReflectiveFieldWrite(DexField field, ProgramMethod context) {
-+    return registerFieldAccess(field, context, false, true);
-   }
- 
--  public void traceReflectiveFieldWrite(ProgramField field, ProgramMethod context) {
--    deferredTracing.notifyReflectiveFieldAccess(field, context);
--    if (registerReflectiveFieldWrite(field, context)) {
--      markFieldAsReachable(field, context, KeepReason.reflectiveUseIn(context));
--    }
-+  public boolean registerReflectiveFieldAccess(DexField field, ProgramMethod context) {
-+    boolean changed = registerFieldAccess(field, context, true, true);
-+    changed |= registerFieldAccess(field, context, false, true);
-+    return changed;
-   }
- 
-   private boolean registerFieldAccess(
-@@ -1076,18 +1028,7 @@ public class Enqueuer {
-       return false;
-     }
-     if (isReflective) {
--      if (isRead) {
--        if (!info.hasReflectiveRead()) {
--          info.setHasReflectiveRead();
--          return true;
--        }
--      } else {
--        if (!info.hasReflectiveWrite()) {
--          info.setHasReflectiveWrite();
--          return true;
--        }
--      }
--      return false;
-+      info.setHasReflectiveAccess();
-     }
-     return isRead ? info.recordRead(field, context) : info.recordWrite(field, context);
-   }
-@@ -1275,7 +1216,7 @@ public class Enqueuer {
-       initClassReferences.put(
-           type, computeMinimumRequiredVisibilityForInitClassField(type, currentMethod.getHolder()));
- 
--      markTypeAsLive(clazz, currentMethod);
-+      markTypeAsLive(type, currentMethod);
-       markDirectAndIndirectClassInitializersAsLive(clazz);
-       return;
-     }
-@@ -1574,29 +1515,12 @@ public class Enqueuer {
-     boolean isWrite() {
-       return !isRead();
-     }
--
--    EnqueuerAction toEnqueuerAction(
--        DexField fieldReference, ProgramMethod context, FieldAccessMetadata metadata) {
--      switch (this) {
--        case INSTANCE_READ:
--          return new TraceInstanceFieldReadAction(fieldReference, context, metadata);
--        case INSTANCE_WRITE:
--          return new TraceInstanceFieldWriteAction(fieldReference, context, metadata);
--        case STATIC_READ:
--          return new TraceStaticFieldReadAction(fieldReference, context, metadata);
--        case STATIC_WRITE:
--          return new TraceStaticFieldWriteAction(fieldReference, context, metadata);
--        default:
--          throw new Unreachable();
--      }
--    }
-   }
- 
-   static class FieldAccessMetadata {
- 
--    private static int DEFERRED_MASK = 1;
--    private static int FROM_METHOD_HANDLE_MASK = 2;
--    private static int FROM_RECORD_METHOD_HANDLE_MASK = 4;
-+    private static int FROM_METHOD_HANDLE_MASK = 1;
-+    private static int FROM_RECORD_METHOD_HANDLE_MASK = 2;
- 
-     static FieldAccessMetadata DEFAULT = new FieldAccessMetadata(0);
-     static FieldAccessMetadata FROM_METHOD_HANDLE =
-@@ -1604,16 +1528,10 @@ public class Enqueuer {
-     static FieldAccessMetadata FROM_RECORD_METHOD_HANDLE =
-         new FieldAccessMetadata(FROM_RECORD_METHOD_HANDLE_MASK);
- 
--    private final FieldAccessMetadata deferred;
-     private final int flags;
- 
--    private FieldAccessMetadata(int flags) {
-+    FieldAccessMetadata(int flags) {
-       this.flags = flags;
--      this.deferred = isDeferred() ? this : new FieldAccessMetadata(flags | DEFERRED_MASK);
--    }
--
--    boolean isDeferred() {
--      return (flags & DEFERRED_MASK) != 0;
-     }
- 
-     boolean isFromMethodHandle() {
-@@ -1623,39 +1541,17 @@ public class Enqueuer {
-     boolean isFromRecordMethodHandle() {
-       return (flags & FROM_RECORD_METHOD_HANDLE_MASK) != 0;
-     }
--
--    public FieldAccessMetadata toDeferred() {
--      return deferred;
--    }
--
--    @Override
--    public boolean equals(Object obj) {
--      if (this == obj) {
--        return true;
--      }
--      if (obj == null || getClass() != obj.getClass()) {
--        return false;
--      }
--      FieldAccessMetadata metadata = (FieldAccessMetadata) obj;
--      return flags == metadata.flags;
--    }
--
--    @Override
--    public int hashCode() {
--      return flags;
--    }
-   }
- 
--  void traceInstanceFieldRead(
-+  private void traceInstanceFieldRead(
-       DexField fieldReference, ProgramMethod currentMethod, FieldAccessMetadata metadata) {
--    if (!metadata.isDeferred() && !registerFieldRead(fieldReference, currentMethod)) {
-+    if (!registerFieldRead(fieldReference, currentMethod)) {
-       return;
-     }
- 
-     FieldResolutionResult resolutionResult = resolveField(fieldReference, currentMethod);
-     if (deferredTracing.deferTracingOfFieldAccess(
-         fieldReference, resolutionResult, currentMethod, FieldAccessKind.INSTANCE_READ, metadata)) {
--      assert !metadata.isDeferred();
-       return;
-     }
- 
-@@ -1711,9 +1607,9 @@ public class Enqueuer {
-     traceInstanceFieldWrite(field, currentMethod, FieldAccessMetadata.FROM_METHOD_HANDLE);
-   }
- 
--  void traceInstanceFieldWrite(
-+  private void traceInstanceFieldWrite(
-       DexField fieldReference, ProgramMethod currentMethod, FieldAccessMetadata metadata) {
--    if (!metadata.isDeferred() && !registerFieldWrite(fieldReference, currentMethod)) {
-+    if (!registerFieldWrite(fieldReference, currentMethod)) {
-       return;
-     }
- 
-@@ -1724,7 +1620,6 @@ public class Enqueuer {
-         currentMethod,
-         FieldAccessKind.INSTANCE_WRITE,
-         metadata)) {
--      assert !metadata.isDeferred();
-       return;
-     }
- 
-@@ -1778,31 +1673,15 @@ public class Enqueuer {
-     traceStaticFieldRead(field, currentMethod, FieldAccessMetadata.FROM_METHOD_HANDLE);
-   }
- 
--  void traceStaticFieldRead(
-+  private void traceStaticFieldRead(
-       DexField fieldReference, ProgramMethod currentMethod, FieldAccessMetadata metadata) {
--    if (!metadata.isDeferred() && !registerFieldRead(fieldReference, currentMethod)) {
-+    if (!registerFieldRead(fieldReference, currentMethod)) {
-       return;
-     }
- 
-     FieldResolutionResult resolutionResult = resolveField(fieldReference, currentMethod);
--
--    if (appView.options().protoShrinking().enableGeneratedExtensionRegistryShrinking) {
--      // If it is a dead proto extension field, don't trace onwards.
--      boolean skipTracing =
--          appView.withGeneratedExtensionRegistryShrinker(
--              shrinker ->
--                  shrinker.isDeadProtoExtensionField(
--                      resolutionResult, fieldAccessInfoCollection, keepInfo),
--              false);
--      if (skipTracing) {
--        addDeadProtoTypeCandidate(resolutionResult.getSingleProgramField().getHolder());
--        return;
--      }
--    }
--
-     if (deferredTracing.deferTracingOfFieldAccess(
-         fieldReference, resolutionResult, currentMethod, FieldAccessKind.STATIC_READ, metadata)) {
--      assert !metadata.isDeferred();
-       return;
-     }
- 
-@@ -1833,6 +1712,18 @@ public class Enqueuer {
-             Log.verbose(getClass(), "Register Sget `%s`.", fieldReference);
-           }
- 
-+          // If it is a dead proto extension field, don't trace onwards.
-+          boolean skipTracing =
-+              appView.withGeneratedExtensionRegistryShrinker(
-+                  shrinker ->
-+                      shrinker.isDeadProtoExtensionField(
-+                          field, fieldAccessInfoCollection, keepInfo),
-+                  false);
-+          if (skipTracing) {
-+            addDeadProtoTypeCandidate(field.getHolder());
-+            return;
-+          }
-+
-           if (field.getReference() != fieldReference) {
-             // Mark the initial resolution holder as live. Note that this should only be done if
-             // the field
-@@ -1862,31 +1753,15 @@ public class Enqueuer {
-     traceStaticFieldWrite(field, currentMethod, FieldAccessMetadata.FROM_METHOD_HANDLE);
-   }
- 
--  void traceStaticFieldWrite(
-+  private void traceStaticFieldWrite(
-       DexField fieldReference, ProgramMethod currentMethod, FieldAccessMetadata metadata) {
--    if (!metadata.isDeferred() && !registerFieldWrite(fieldReference, currentMethod)) {
-+    if (!registerFieldWrite(fieldReference, currentMethod)) {
-       return;
-     }
- 
-     FieldResolutionResult resolutionResult = resolveField(fieldReference, currentMethod);
--
--    if (appView.options().protoShrinking().enableGeneratedExtensionRegistryShrinking) {
--      // If it is a dead proto extension field, don't trace onwards.
--      boolean skipTracing =
--          appView.withGeneratedExtensionRegistryShrinker(
--              shrinker ->
--                  shrinker.isDeadProtoExtensionField(
--                      resolutionResult, fieldAccessInfoCollection, keepInfo),
--              false);
--      if (skipTracing) {
--        addDeadProtoTypeCandidate(resolutionResult.getSingleProgramField().getHolder());
--        return;
--      }
--    }
--
-     if (deferredTracing.deferTracingOfFieldAccess(
-         fieldReference, resolutionResult, currentMethod, FieldAccessKind.STATIC_WRITE, metadata)) {
--      assert !metadata.isDeferred();
-       return;
-     }
- 
-@@ -1917,6 +1792,20 @@ public class Enqueuer {
-             Log.verbose(getClass(), "Register Sput `%s`.", fieldReference);
-           }
- 
-+          if (appView.options().protoShrinking().enableGeneratedExtensionRegistryShrinking) {
-+            // If it is a dead proto extension field, don't trace onwards.
-+            boolean skipTracing =
-+                appView.withGeneratedExtensionRegistryShrinker(
-+                    shrinker ->
-+                        shrinker.isDeadProtoExtensionField(
-+                            field, fieldAccessInfoCollection, keepInfo),
-+                    false);
-+            if (skipTracing) {
-+              addDeadProtoTypeCandidate(field.getHolder());
-+              return;
-+            }
-+          }
-+
-           if (field.getReference() != fieldReference) {
-             // Mark the initial resolution holder as live. Note that this should only be done if
-             // the field
-@@ -2006,7 +1895,7 @@ public class Enqueuer {
-     markTypeAsLive(clazz, graphReporter.reportClassReferencedFrom(clazz, context));
-   }
- 
--  void markTypeAsLive(DexProgramClass clazz, KeepReason reason) {
-+  private void markTypeAsLive(DexProgramClass clazz, KeepReason reason) {
-     assert clazz != null;
-     markTypeAsLive(
-         clazz,
-@@ -2377,7 +2266,7 @@ public class Enqueuer {
-             });
-   }
- 
--  void markDirectAndIndirectClassInitializersAsLive(DexProgramClass clazz) {
-+  private void markDirectAndIndirectClassInitializersAsLive(DexProgramClass clazz) {
-     if (clazz.isInterface()) {
-       // Accessing a static field or method on an interface does not trigger the class initializer
-       // of any parent interfaces.
-diff --git a/src/main/java/com/android/tools/r8/shaking/EnqueuerDeferredTracing.java b/src/main/java/com/android/tools/r8/shaking/EnqueuerDeferredTracing.java
-index 78abb5014..a09a35814 100644
---- a/src/main/java/com/android/tools/r8/shaking/EnqueuerDeferredTracing.java
-+++ b/src/main/java/com/android/tools/r8/shaking/EnqueuerDeferredTracing.java
-@@ -4,66 +4,45 @@
- 
- package com.android.tools.r8.shaking;
- 
--import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
--import com.android.tools.r8.graph.AppView;
- import com.android.tools.r8.graph.DexField;
- import com.android.tools.r8.graph.FieldResolutionResult;
--import com.android.tools.r8.graph.ProgramField;
- import com.android.tools.r8.graph.ProgramMethod;
- import com.android.tools.r8.shaking.Enqueuer.FieldAccessKind;
- import com.android.tools.r8.shaking.Enqueuer.FieldAccessMetadata;
--import com.android.tools.r8.shaking.Enqueuer.Mode;
--import com.android.tools.r8.utils.InternalOptions;
- import java.util.concurrent.ExecutionException;
- import java.util.concurrent.ExecutorService;
- 
--public abstract class EnqueuerDeferredTracing {
--
--  public static EnqueuerDeferredTracing create(
--      AppView<? extends AppInfoWithClassHierarchy> appView, Enqueuer enqueuer, Mode mode) {
--    if (mode.isInitialTreeShaking()) {
--      return empty();
--    }
--    InternalOptions options = appView.options();
--    if (!options.isOptimizing()
--        || !options.isShrinking()
--        || !options.enableEnqueuerDeferredTracing) {
--      return empty();
--    }
--    return new EnqueuerDeferredTracingImpl(appView, enqueuer, mode);
--  }
--
--  public static EmptyEnqueuerDeferredTracing empty() {
--    return new EmptyEnqueuerDeferredTracing();
--  }
-+public class EnqueuerDeferredTracing {
- 
-   /**
--   * @return true if the {@link Enqueuer} should not trace the given field reference.
--   *     <p>If for some reason the field reference should be traced after all, a worklist item will
--   *     be enqueued upon reaching a (preliminary) fixpoint in {@link
--   *     #enqueueWorklistActions(EnqueuerWorklist)}, which will cause tracing to continue.
-+   * Returns true if the {@link Enqueuer} should not trace the given field reference.
-+   *
-+   * <p>If for some reason the field reference should be traced after all, a worklist item can be
-+   * enqueued upon reaching a (preliminary) fixpoint in {@link
-+   * #enqueueWorklistActions(EnqueuerWorklist)}, which will cause tracing to continue.
-    */
--  public abstract boolean deferTracingOfFieldAccess(
-+  public boolean deferTracingOfFieldAccess(
-       DexField fieldReference,
-       FieldResolutionResult resolutionResult,
-       ProgramMethod context,
--      FieldAccessKind accessKind,
--      FieldAccessMetadata metadata);
-+      FieldAccessKind kind,
-+      FieldAccessMetadata metadata) {
-+    return false;
-+  }
- 
-   /**
-    * Called when the {@link EnqueuerWorklist} is empty, to allow additional tracing before ending
-    * tree shaking.
--   *
--   * @return true if any worklist items were enqueued.
-    */
--  public abstract boolean enqueueWorklistActions(EnqueuerWorklist worklist);
-+  public boolean enqueueWorklistActions(EnqueuerWorklist worklist) {
-+    return false;
-+  }
- 
-   /**
-    * Called when tree shaking has ended, to allow rewriting the application according to the tracing
-    * that has not been performed (e.g., rewriting of dead field instructions).
-    */
--  public abstract void rewriteApplication(ExecutorService executorService)
--      throws ExecutionException;
--
--  public abstract void notifyReflectiveFieldAccess(ProgramField field, ProgramMethod context);
-+  public void rewriteApplication(ExecutorService executorService) throws ExecutionException {
-+    // Intentionally empty.
-+  }
- }
-diff --git a/src/main/java/com/android/tools/r8/shaking/EnqueuerDeferredTracingImpl.java b/src/main/java/com/android/tools/r8/shaking/EnqueuerDeferredTracingImpl.java
-deleted file mode 100644
-index 85d14b91e..000000000
---- a/src/main/java/com/android/tools/r8/shaking/EnqueuerDeferredTracingImpl.java
-+++ /dev/null
-@@ -1,282 +0,0 @@
--// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
--// for details. All rights reserved. Use of this source code is governed by a
--// BSD-style license that can be found in the LICENSE file.
--
--package com.android.tools.r8.shaking;
--
--import static com.android.tools.r8.graph.DexProgramClass.asProgramClassOrNull;
--import static com.android.tools.r8.shaking.ObjectAllocationInfoCollectionUtils.mayHaveFinalizeMethodDirectlyOrIndirectly;
--import static com.android.tools.r8.utils.MapUtils.ignoreKey;
--
--import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
--import com.android.tools.r8.graph.AppView;
--import com.android.tools.r8.graph.Code;
--import com.android.tools.r8.graph.DexField;
--import com.android.tools.r8.graph.DexProgramClass;
--import com.android.tools.r8.graph.DexType;
--import com.android.tools.r8.graph.FieldAccessInfo;
--import com.android.tools.r8.graph.FieldAccessInfoCollectionImpl;
--import com.android.tools.r8.graph.FieldResolutionResult;
--import com.android.tools.r8.graph.ProgramField;
--import com.android.tools.r8.graph.ProgramMethod;
--import com.android.tools.r8.graph.bytecodemetadata.BytecodeMetadataProvider;
--import com.android.tools.r8.ir.code.IRCode;
--import com.android.tools.r8.ir.conversion.IRFinalizer;
--import com.android.tools.r8.ir.conversion.IRToCfFinalizer;
--import com.android.tools.r8.ir.conversion.IRToDexFinalizer;
--import com.android.tools.r8.ir.conversion.MethodConversionOptions.MutableMethodConversionOptions;
--import com.android.tools.r8.ir.optimize.membervaluepropagation.assume.AssumeInfo;
--import com.android.tools.r8.ir.optimize.membervaluepropagation.assume.AssumeInfoLookup;
--import com.android.tools.r8.shaking.Enqueuer.FieldAccessKind;
--import com.android.tools.r8.shaking.Enqueuer.FieldAccessMetadata;
--import com.android.tools.r8.shaking.Enqueuer.Mode;
--import com.android.tools.r8.shaking.EnqueuerWorklist.EnqueuerAction;
--import com.android.tools.r8.utils.InternalOptions;
--import com.android.tools.r8.utils.ThreadUtils;
--import com.android.tools.r8.utils.Timing;
--import com.android.tools.r8.utils.collections.ProgramFieldMap;
--import com.android.tools.r8.utils.collections.ProgramFieldSet;
--import com.android.tools.r8.utils.collections.ProgramMethodSet;
--import java.util.IdentityHashMap;
--import java.util.LinkedHashSet;
--import java.util.Map;
--import java.util.Set;
--import java.util.concurrent.ConcurrentHashMap;
--import java.util.concurrent.ExecutionException;
--import java.util.concurrent.ExecutorService;
--
--public class EnqueuerDeferredTracingImpl extends EnqueuerDeferredTracing {
--
--  private final AppView<? extends AppInfoWithClassHierarchy> appView;
--  private final Enqueuer enqueuer;
--  private final Mode mode;
--  private final InternalOptions options;
--
--  // Helper for rewriting code instances at the end of tree shaking.
--  private final EnqueuerDeferredTracingRewriter rewriter;
--
--  // Maps each field to the tracing actions that have been deferred for that field. This allows
--  // enqueuing previously deferred tracing actions into the worklist if a given field cannot be
--  // optimized after all.
--  private final ProgramFieldMap<Set<EnqueuerAction>> deferredEnqueuerActions =
--      ProgramFieldMap.create();
--
--  // A set of fields that are never eligible for pruning.
--  private final ProgramFieldSet ineligibleForPruning = ProgramFieldSet.create();
--
--  EnqueuerDeferredTracingImpl(
--      AppView<? extends AppInfoWithClassHierarchy> appView, Enqueuer enqueuer, Mode mode) {
--    this.appView = appView;
--    this.enqueuer = enqueuer;
--    this.mode = mode;
--    this.options = appView.options();
--    this.rewriter = new EnqueuerDeferredTracingRewriter(appView);
--  }
--
--  @Override
--  public boolean deferTracingOfFieldAccess(
--      DexField fieldReference,
--      FieldResolutionResult resolutionResult,
--      ProgramMethod context,
--      FieldAccessKind accessKind,
--      FieldAccessMetadata metadata) {
--    ProgramField field = resolutionResult.getSingleProgramField();
--    if (field == null) {
--      return false;
--    }
--
--    // Check if field access is consistent with the field access flags.
--    if (field.getAccessFlags().isStatic() != accessKind.isStatic()) {
--      return enqueueDeferredEnqueuerActions(field);
--    }
--
--    // If the access is from a reachability sensitive method, then bail out.
--    if (context.getHolder().getOrComputeReachabilitySensitive(appView)) {
--      return enqueueDeferredEnqueuerActions(field);
--    }
--
--    if (accessKind.isRead()) {
--      // If the value of the field is not guaranteed to be the default value, even if it is never
--      // assigned, then give up.
--      // TODO(b/205810841): Allow this by handling this in the corresponding IR rewriter.
--      AssumeInfo assumeInfo = AssumeInfoLookup.lookupAssumeInfo(appView, field);
--      if (assumeInfo != null && assumeInfo.hasReturnInfo()) {
--        return enqueueDeferredEnqueuerActions(field);
--      }
--      if (field.getAccessFlags().isStatic() && field.getDefinition().hasExplicitStaticValue()) {
--        return enqueueDeferredEnqueuerActions(field);
--      }
--    }
--
--    if (!isEligibleForPruning(field)) {
--      return enqueueDeferredEnqueuerActions(field);
--    }
--
--    // Field can be removed unless some other field access that has not yet been seen prohibits it.
--    // Record an EnqueuerAction that must be traced if that should happen.
--    EnqueuerAction deferredEnqueuerAction =
--        accessKind.toEnqueuerAction(fieldReference, context, metadata.toDeferred());
--    deferredEnqueuerActions
--        .computeIfAbsent(field, ignoreKey(LinkedHashSet::new))
--        .add(deferredEnqueuerAction);
--
--    // If the field is static, then the field access will trigger the class initializer of the
--    // field's holder. Therefore, we unconditionally trace the class initializer in this case.
--    // The corresponding IR rewriter will rewrite the field access into an init-class instruction.
--    if (accessKind.isStatic()) {
--      KeepReason reason =
--          enqueuer.getGraphReporter().reportClassReferencedFrom(field.getHolder(), context);
--      enqueuer.getWorklist().enqueueTraceTypeReferenceAction(field.getHolder(), reason);
--      enqueuer.getWorklist().enqueueTraceDirectAndIndirectClassInitializers(field.getHolder());
--    }
--
--    return true;
--  }
--
--  @Override
--  public void notifyReflectiveFieldAccess(ProgramField field, ProgramMethod context) {
--    enqueueDeferredEnqueuerActions(field);
--  }
--
--  private boolean isEligibleForPruning(ProgramField field) {
--    if (enqueuer.isFieldLive(field)) {
--      return false;
--    }
--
--    assert enqueuer.getKeepInfo(field).isBottom();
--    assert !enqueuer.getKeepInfo(field).isPinned(options);
--
--    FieldAccessInfo info = enqueuer.getFieldAccessInfoCollection().get(field.getReference());
--    if (info.hasReflectiveAccess()
--        || info.isAccessedFromMethodHandle()
--        || info.isReadFromAnnotation()
--        || info.isReadFromRecordInvokeDynamic()
--        || enqueuer.hasMinimumKeepInfoThatMatches(
--            field,
--            minimumKeepInfo ->
--                !minimumKeepInfo.isOptimizationAllowed()
--                    || !minimumKeepInfo.isShrinkingAllowed())) {
--      return false;
--    }
--
--    if (info.isWritten()) {
--      // If the assigned value may have an override of Object#finalize() then give up.
--      // Note that this check depends on the set of instantiated types, and must therefore be rerun
--      // when the enqueuer's fixpoint is reached.
--      if (field.getType().isReferenceType()) {
--        DexType fieldBaseType = field.getType().toBaseType(appView.dexItemFactory());
--        if (fieldBaseType.isClassType()
--            && mayHaveFinalizeMethodDirectlyOrIndirectly(
--                appView, fieldBaseType, enqueuer.getObjectAllocationInfoCollection())) {
--          return false;
--        }
--      }
--    }
--
--    // We always have precise knowledge of field accesses during tracing.
--    assert info.hasKnownReadContexts();
--    assert info.hasKnownWriteContexts();
--
--    DexType fieldType = field.getType();
--
--    // If the field is now both read and written, then we cannot optimize the field unless the field
--    // type is an uninstantiated class type.
--    if (info.getReadsWithContexts().hasAccesses() && info.getWritesWithContexts().hasAccesses()) {
--      if (!fieldType.isClassType()) {
--        return false;
--      }
--      DexProgramClass fieldTypeDefinition = asProgramClassOrNull(appView.definitionFor(fieldType));
--      if (fieldTypeDefinition == null
--          || enqueuer
--              .getObjectAllocationInfoCollection()
--              .isInstantiatedDirectlyOrHasInstantiatedSubtype(fieldTypeDefinition)) {
--        return false;
--      }
--    }
--
--    return !ineligibleForPruning.contains(field);
--  }
--
--  private boolean enqueueDeferredEnqueuerActions(ProgramField field) {
--    Set<EnqueuerAction> actions = deferredEnqueuerActions.remove(field);
--    if (actions != null) {
--      enqueuer.getWorklist().enqueueAll(actions);
--    }
--    ineligibleForPruning.add(field);
--    return false;
--  }
--
--  @Override
--  public boolean enqueueWorklistActions(EnqueuerWorklist worklist) {
--    return deferredEnqueuerActions.removeIf(
--        (field, worklistActions) -> {
--          if (isEligibleForPruning(field)) {
--            return false;
--          }
--          worklist.enqueueAll(worklistActions);
--          return true;
--        });
--  }
--
--  @Override
--  public void rewriteApplication(ExecutorService executorService) throws ExecutionException {
--    FieldAccessInfoCollectionImpl fieldAccessInfoCollection =
--        enqueuer.getFieldAccessInfoCollection();
--    ProgramMethodSet methodsToProcess = ProgramMethodSet.create();
--    Map<DexField, ProgramField> prunedFields = new IdentityHashMap<>();
--    deferredEnqueuerActions.forEach(
--        (field, ignore) -> {
--          FieldAccessInfo accessInfo = fieldAccessInfoCollection.get(field.getReference());
--          prunedFields.put(field.getReference(), field);
--          accessInfo.forEachAccessContext(methodsToProcess::add);
--          accessInfo.forEachIndirectAccess(reference -> prunedFields.put(reference, field));
--        });
--    deferredEnqueuerActions.clear();
--
--    // Rewrite application.
--    Map<DexProgramClass, ProgramMethodSet> initializedClassesWithContexts =
--        new ConcurrentHashMap<>();
--    ThreadUtils.processItems(
--        methodsToProcess,
--        method -> rewriteMethod(method, initializedClassesWithContexts, prunedFields),
--        executorService);
--
--    // Register new InitClass instructions.
--    initializedClassesWithContexts.forEach(
--        (clazz, contexts) ->
--            contexts.forEach(context -> enqueuer.traceInitClass(clazz.getType(), context)));
--    assert enqueuer.getWorklist().isEmpty();
--
--    // Prune field access info collection.
--    prunedFields.values().forEach(field -> fieldAccessInfoCollection.remove(field.getReference()));
--  }
--
--  private void rewriteMethod(
--      ProgramMethod method,
--      Map<DexProgramClass, ProgramMethodSet> initializedClassesWithContexts,
--      Map<DexField, ProgramField> prunedFields) {
--    // Build IR.
--    MutableMethodConversionOptions conversionOptions =
--        mode.isInitialTreeShaking()
--            ? new MutableMethodConversionOptions(options).setIsGeneratingClassFiles(true)
--            : new MutableMethodConversionOptions(options);
--    conversionOptions.disableStringSwitchConversion();
--
--    IRCode ir = method.buildIR(appView, conversionOptions);
--
--    // Rewrite the IR according to the tracing that has been deferred.
--    rewriter.rewriteCode(ir, initializedClassesWithContexts, prunedFields);
--
--    // Run dead code elimination.
--    rewriter.getCodeRewriter().optimizeAlwaysThrowingInstructions(ir);
--    rewriter.getDeadCodeRemover().run(ir, Timing.empty());
--
--    // Finalize to class files or dex.
--    IRFinalizer<?> finalizer =
--        conversionOptions.isGeneratingClassFiles()
--            ? new IRToCfFinalizer(appView, rewriter.getDeadCodeRemover())
--            : new IRToDexFinalizer(appView, rewriter.getDeadCodeRemover());
--    Code newCode = finalizer.finalizeCode(ir, BytecodeMetadataProvider.empty(), Timing.empty());
--    method.setCode(newCode, appView);
--  }
--}
-diff --git a/src/main/java/com/android/tools/r8/shaking/EnqueuerDeferredTracingRewriter.java b/src/main/java/com/android/tools/r8/shaking/EnqueuerDeferredTracingRewriter.java
-deleted file mode 100644
-index 79165d119..000000000
---- a/src/main/java/com/android/tools/r8/shaking/EnqueuerDeferredTracingRewriter.java
-+++ /dev/null
-@@ -1,228 +0,0 @@
--// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
--// for details. All rights reserved. Use of this source code is governed by a
--// BSD-style license that can be found in the LICENSE file.
--
--package com.android.tools.r8.shaking;
--
--import static com.android.tools.r8.ir.code.Opcodes.INSTANCE_GET;
--import static com.android.tools.r8.ir.code.Opcodes.INSTANCE_PUT;
--import static com.android.tools.r8.ir.code.Opcodes.STATIC_GET;
--import static com.android.tools.r8.ir.code.Opcodes.STATIC_PUT;
--import static com.android.tools.r8.utils.MapUtils.ignoreKey;
--
--import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
--import com.android.tools.r8.graph.AppView;
--import com.android.tools.r8.graph.DexField;
--import com.android.tools.r8.graph.DexProgramClass;
--import com.android.tools.r8.graph.ProgramField;
--import com.android.tools.r8.graph.ProgramMethod;
--import com.android.tools.r8.ir.analysis.type.TypeAnalysis;
--import com.android.tools.r8.ir.analysis.type.TypeElement;
--import com.android.tools.r8.ir.code.BasicBlock;
--import com.android.tools.r8.ir.code.BasicBlockIterator;
--import com.android.tools.r8.ir.code.FieldGet;
--import com.android.tools.r8.ir.code.IRCode;
--import com.android.tools.r8.ir.code.InitClass;
--import com.android.tools.r8.ir.code.InstanceFieldInstruction;
--import com.android.tools.r8.ir.code.InstanceGet;
--import com.android.tools.r8.ir.code.InstancePut;
--import com.android.tools.r8.ir.code.Instruction;
--import com.android.tools.r8.ir.code.InstructionListIterator;
--import com.android.tools.r8.ir.code.StaticGet;
--import com.android.tools.r8.ir.code.StaticPut;
--import com.android.tools.r8.ir.code.Value;
--import com.android.tools.r8.ir.optimize.CodeRewriter;
--import com.android.tools.r8.ir.optimize.DeadCodeRemover;
--import com.android.tools.r8.utils.collections.ProgramMethodSet;
--import com.google.common.collect.Sets;
--import java.util.Map;
--import java.util.Set;
--
--public class EnqueuerDeferredTracingRewriter {
--
--  private final AppView<? extends AppInfoWithClassHierarchy> appView;
--  private final CodeRewriter codeRewriter;
--  private final DeadCodeRemover deadCodeRemover;
--
--  EnqueuerDeferredTracingRewriter(AppView<? extends AppInfoWithClassHierarchy> appView) {
--    this.appView = appView;
--    this.codeRewriter = new CodeRewriter(appView);
--    this.deadCodeRemover = new DeadCodeRemover(appView, codeRewriter);
--  }
--
--  public CodeRewriter getCodeRewriter() {
--    return codeRewriter;
--  }
--
--  public DeadCodeRemover getDeadCodeRemover() {
--    return deadCodeRemover;
--  }
--
--  public void rewriteCode(
--      IRCode code,
--      Map<DexProgramClass, ProgramMethodSet> initializedClassesWithContexts,
--      Map<DexField, ProgramField> prunedFields) {
--    // TODO(b/205810841): Consider inserting assume instructions to reduce number of null checks.
--    // TODO(b/205810841): Consider running constant canonicalizer.
--    ProgramMethod context = code.context();
--
--    // Rewrite field instructions that reference a pruned field.
--    Set<Value> affectedValues = Sets.newIdentityHashSet();
--    BasicBlockIterator blockIterator = code.listIterator();
--    while (blockIterator.hasNext()) {
--      BasicBlock block = blockIterator.next();
--      InstructionListIterator instructionIterator = block.listIterator(code);
--      while (instructionIterator.hasNext()) {
--        Instruction instruction = instructionIterator.next();
--        switch (instruction.opcode()) {
--          case INSTANCE_GET:
--            rewriteInstanceGet(
--                code,
--                instructionIterator,
--                instruction.asInstanceGet(),
--                affectedValues,
--                prunedFields);
--            break;
--          case INSTANCE_PUT:
--            rewriteInstancePut(instructionIterator, instruction.asInstancePut(), prunedFields);
--            break;
--          case STATIC_GET:
--            rewriteStaticGet(
--                code,
--                instructionIterator,
--                instruction.asStaticGet(),
--                affectedValues,
--                context,
--                initializedClassesWithContexts,
--                prunedFields);
--            break;
--          case STATIC_PUT:
--            rewriteStaticPut(
--                code,
--                instructionIterator,
--                instruction.asStaticPut(),
--                context,
--                initializedClassesWithContexts,
--                prunedFields);
--            break;
--          default:
--            break;
--        }
--      }
--    }
--    if (!affectedValues.isEmpty()) {
--      new TypeAnalysis(appView).narrowing(affectedValues);
--    }
--  }
--
--  private void rewriteInstanceGet(
--      IRCode code,
--      InstructionListIterator instructionIterator,
--      InstanceGet instanceGet,
--      Set<Value> affectedValues,
--      Map<DexField, ProgramField> prunedFields) {
--    ProgramField prunedField = prunedFields.get(instanceGet.getField());
--    if (prunedField == null) {
--      return;
--    }
--
--    insertDefaultValueForFieldGet(
--        code, instructionIterator, instanceGet, affectedValues, prunedField);
--    removeOrReplaceInstanceFieldInstructionWithNullCheck(instructionIterator, instanceGet);
--  }
--
--  private void rewriteInstancePut(
--      InstructionListIterator instructionIterator,
--      InstancePut instancePut,
--      Map<DexField, ProgramField> prunedFields) {
--    ProgramField prunedField = prunedFields.get(instancePut.getField());
--    if (prunedField == null) {
--      return;
--    }
--
--    removeOrReplaceInstanceFieldInstructionWithNullCheck(instructionIterator, instancePut);
--  }
--
--  private void rewriteStaticGet(
--      IRCode code,
--      InstructionListIterator instructionIterator,
--      StaticGet staticGet,
--      Set<Value> affectedValues,
--      ProgramMethod context,
--      Map<DexProgramClass, ProgramMethodSet> initializedClassesWithContexts,
--      Map<DexField, ProgramField> prunedFields) {
--    ProgramField prunedField = prunedFields.get(staticGet.getField());
--    if (prunedField == null) {
--      return;
--    }
--
--    insertDefaultValueForFieldGet(
--        code, instructionIterator, staticGet, affectedValues, prunedField);
--    removeOrReplaceStaticFieldInstructionByInitClass(
--        code, instructionIterator, context, initializedClassesWithContexts, prunedField);
--  }
--
--  private void rewriteStaticPut(
--      IRCode code,
--      InstructionListIterator instructionIterator,
--      StaticPut staticPut,
--      ProgramMethod context,
--      Map<DexProgramClass, ProgramMethodSet> initializedClassesWithContexts,
--      Map<DexField, ProgramField> prunedFields) {
--    ProgramField prunedField = prunedFields.get(staticPut.getField());
--    if (prunedField == null) {
--      return;
--    }
--
--    removeOrReplaceStaticFieldInstructionByInitClass(
--        code, instructionIterator, context, initializedClassesWithContexts, prunedField);
--  }
--
--  private void insertDefaultValueForFieldGet(
--      IRCode code,
--      InstructionListIterator instructionIterator,
--      FieldGet fieldGet,
--      Set<Value> affectedValues,
--      ProgramField prunedField) {
--    if (fieldGet.hasUsedOutValue()) {
--      instructionIterator.previous();
--      Value replacement =
--          prunedField.getType().isReferenceType()
--              ? instructionIterator.insertConstNullInstruction(code, appView.options())
--              : instructionIterator.insertConstNumberInstruction(
--                  code, appView.options(), 0, fieldGet.getOutType());
--      fieldGet.outValue().replaceUsers(replacement, affectedValues);
--      instructionIterator.next();
--    }
--  }
--
--  private void removeOrReplaceInstanceFieldInstructionWithNullCheck(
--      InstructionListIterator instructionIterator, InstanceFieldInstruction fieldInstruction) {
--    if (fieldInstruction.object().isMaybeNull()) {
--      instructionIterator.replaceCurrentInstructionWithNullCheck(
--          appView, fieldInstruction.object());
--    } else {
--      instructionIterator.removeOrReplaceByDebugLocalRead();
--    }
--  }
--
--  private void removeOrReplaceStaticFieldInstructionByInitClass(
--      IRCode code,
--      InstructionListIterator instructionIterator,
--      ProgramMethod context,
--      Map<DexProgramClass, ProgramMethodSet> initializedClassesWithContexts,
--      ProgramField prunedField) {
--    if (prunedField.getHolder().classInitializationMayHaveSideEffectsInContext(appView, context)) {
--      instructionIterator.replaceCurrentInstruction(
--          InitClass.builder()
--              .setFreshOutValue(code, TypeElement.getInt())
--              .setType(prunedField.getHolderType())
--              .build());
--      initializedClassesWithContexts
--          .computeIfAbsent(prunedField.getHolder(), ignoreKey(ProgramMethodSet::createConcurrent))
--          .add(context);
--    } else {
--      instructionIterator.removeOrReplaceByDebugLocalRead();
--    }
--  }
--}
-diff --git a/src/main/java/com/android/tools/r8/shaking/EnqueuerWorklist.java b/src/main/java/com/android/tools/r8/shaking/EnqueuerWorklist.java
-index a09efe6ba..0efc4b58c 100644
---- a/src/main/java/com/android/tools/r8/shaking/EnqueuerWorklist.java
-+++ b/src/main/java/com/android/tools/r8/shaking/EnqueuerWorklist.java
-@@ -11,17 +11,12 @@ import com.android.tools.r8.graph.DexField;
- import com.android.tools.r8.graph.DexMethod;
- import com.android.tools.r8.graph.DexProgramClass;
- import com.android.tools.r8.graph.DexType;
--import com.android.tools.r8.graph.FieldAccessInfo;
- import com.android.tools.r8.graph.ProgramDefinition;
- import com.android.tools.r8.graph.ProgramField;
- import com.android.tools.r8.graph.ProgramMethod;
--import com.android.tools.r8.shaking.Enqueuer.FieldAccessKind;
--import com.android.tools.r8.shaking.Enqueuer.FieldAccessMetadata;
- import com.android.tools.r8.shaking.GraphReporter.KeepReasonWitness;
- import com.android.tools.r8.utils.Action;
- import com.android.tools.r8.utils.InternalOptions;
--import java.util.Collection;
--import java.util.Objects;
- import java.util.Queue;
- import java.util.concurrent.ConcurrentLinkedQueue;
- 
-@@ -246,19 +241,6 @@ public abstract class EnqueuerWorklist {
-     }
-   }
- 
--  static class TraceDirectAndIndirectClassInitializers extends EnqueuerAction {
--    private final DexProgramClass clazz;
--
--    TraceDirectAndIndirectClassInitializers(DexProgramClass clazz) {
--      this.clazz = clazz;
--    }
--
--    @Override
--    public void run(Enqueuer enqueuer) {
--      enqueuer.markDirectAndIndirectClassInitializersAsLive(clazz);
--    }
--  }
--
-   static class TraceInvokeDirectAction extends EnqueuerAction {
-     private final DexMethod invokedMethod;
-     // TODO(b/175854431): Avoid pushing context on worklist.
-@@ -320,199 +302,19 @@ public abstract class EnqueuerWorklist {
-     }
-   }
- 
--  static class TraceReflectiveFieldAccessAction extends EnqueuerAction {
--    private final ProgramField field;
-+  static class TraceStaticFieldReadAction extends EnqueuerAction {
-+    private final DexField field;
-+    // TODO(b/175854431): Avoid pushing context on worklist.
-     private final ProgramMethod context;
--    private final FieldAccessKind kind;
- 
--    TraceReflectiveFieldAccessAction(ProgramField field, ProgramMethod context) {
--      this(field, context, null);
--    }
--
--    TraceReflectiveFieldAccessAction(
--        ProgramField field, ProgramMethod context, FieldAccessKind kind) {
-+    TraceStaticFieldReadAction(DexField field, ProgramMethod context) {
-       this.field = field;
-       this.context = context;
--      this.kind = kind;
--    }
--
--    @Override
--    public void run(Enqueuer enqueuer) {
--      if (kind != null) {
--        if (kind.isRead()) {
--          enqueuer.traceReflectiveFieldRead(field, context);
--        } else {
--          enqueuer.traceReflectiveFieldWrite(field, context);
--        }
--      } else {
--        enqueuer.traceReflectiveFieldAccess(field, context);
--      }
--    }
--  }
--
--  static class TraceTypeReferenceAction extends EnqueuerAction {
--    private final DexProgramClass clazz;
--    private final KeepReason reason;
--
--    TraceTypeReferenceAction(DexProgramClass clazz, KeepReason reason) {
--      this.clazz = clazz;
--      this.reason = reason;
-     }
- 
-     @Override
-     public void run(Enqueuer enqueuer) {
--      enqueuer.markTypeAsLive(clazz, reason);
--    }
--  }
--
--  abstract static class TraceFieldAccessAction extends EnqueuerAction {
--    protected final DexField field;
--    // TODO(b/175854431): Avoid pushing context on worklist.
--    protected final ProgramMethod context;
--    protected final FieldAccessMetadata metadata;
--
--    TraceFieldAccessAction(DexField field, ProgramMethod context, FieldAccessMetadata metadata) {
--      this.field = field;
--      this.context = context;
--      this.metadata = metadata;
--    }
--
--    protected boolean baseEquals(TraceFieldAccessAction action) {
--      return field == action.field
--          && context.isStructurallyEqualTo(action.context)
--          && metadata.equals(action.metadata);
--    }
--
--    @Override
--    public boolean equals(Object obj) {
--      if (this == obj) {
--        return true;
--      }
--      if (obj == null || getClass() != obj.getClass()) {
--        return false;
--      }
--      TraceFieldAccessAction action = (TraceFieldAccessAction) obj;
--      return baseEquals(action);
--    }
--
--    @Override
--    public int hashCode() {
--      return Objects.hash(field, context.getReference(), metadata);
--    }
--  }
--
--  static class TraceInstanceFieldReadAction extends TraceFieldAccessAction {
--
--    TraceInstanceFieldReadAction(
--        DexField field, ProgramMethod context, FieldAccessMetadata metadata) {
--      super(field, context, metadata);
--    }
--
--    @Override
--    public void run(Enqueuer enqueuer) {
--      enqueuer.traceInstanceFieldRead(field, context, metadata);
--    }
--
--    @Override
--    public boolean equals(Object obj) {
--      if (this == obj) {
--        return true;
--      }
--      if (obj == null || getClass() != obj.getClass()) {
--        return false;
--      }
--      TraceInstanceFieldReadAction action = (TraceInstanceFieldReadAction) obj;
--      return baseEquals(action);
--    }
--
--    @Override
--    public int hashCode() {
--      return Objects.hash(field, context.getReference(), metadata);
--    }
--  }
--
--  static class TraceInstanceFieldWriteAction extends TraceFieldAccessAction {
--
--    TraceInstanceFieldWriteAction(
--        DexField field, ProgramMethod context, FieldAccessMetadata metadata) {
--      super(field, context, metadata);
--    }
--
--    @Override
--    public void run(Enqueuer enqueuer) {
--      enqueuer.traceInstanceFieldWrite(field, context, metadata);
--    }
--
--    @Override
--    public boolean equals(Object obj) {
--      if (this == obj) {
--        return true;
--      }
--      if (obj == null || getClass() != obj.getClass()) {
--        return false;
--      }
--      TraceInstanceFieldWriteAction action = (TraceInstanceFieldWriteAction) obj;
--      return baseEquals(action);
--    }
--
--    @Override
--    public int hashCode() {
--      return Objects.hash(field, context.getReference(), metadata);
--    }
--  }
--
--  static class TraceStaticFieldReadAction extends TraceFieldAccessAction {
--
--    TraceStaticFieldReadAction(
--        DexField field, ProgramMethod context, FieldAccessMetadata metadata) {
--      super(field, context, metadata);
--    }
--
--    @Override
--    public void run(Enqueuer enqueuer) {
--      enqueuer.traceStaticFieldRead(field, context, metadata);
--    }
--
--    @Override
--    public boolean equals(Object obj) {
--      if (this == obj) {
--        return true;
--      }
--      if (obj == null || getClass() != obj.getClass()) {
--        return false;
--      }
--      TraceStaticFieldReadAction action = (TraceStaticFieldReadAction) obj;
--      return baseEquals(action);
--    }
--  }
--
--  static class TraceStaticFieldWriteAction extends TraceFieldAccessAction {
--
--    TraceStaticFieldWriteAction(
--        DexField field, ProgramMethod context, FieldAccessMetadata metadata) {
--      super(field, context, metadata);
--    }
--
--    @Override
--    public void run(Enqueuer enqueuer) {
--      enqueuer.traceStaticFieldWrite(field, context, metadata);
--    }
--
--    @Override
--    public boolean equals(Object obj) {
--      if (this == obj) {
--        return true;
--      }
--      if (obj == null || getClass() != obj.getClass()) {
--        return false;
--      }
--      TraceStaticFieldWriteAction action = (TraceStaticFieldWriteAction) obj;
--      return baseEquals(action);
--    }
--
--    @Override
--    public int hashCode() {
--      return Objects.hash(field, context.getReference(), metadata);
-+      enqueuer.traceStaticFieldRead(field, context);
-     }
-   }
- 
-@@ -538,12 +340,6 @@ public abstract class EnqueuerWorklist {
- 
-   abstract EnqueuerWorklist nonPushable();
- 
--  final void enqueueAll(Collection<? extends EnqueuerAction> actions) {
--    actions.forEach(this::enqueue);
--  }
--
--  abstract void enqueue(EnqueuerAction action);
--
-   abstract boolean enqueueAssertAction(Action assertion);
- 
-   abstract void enqueueMarkReachableDirectAction(
-@@ -581,8 +377,6 @@ public abstract class EnqueuerWorklist {
-   public abstract void enqueueTraceConstClassAction(
-       DexType type, ProgramMethod context, boolean ignoreCompatRules);
- 
--  public abstract void enqueueTraceDirectAndIndirectClassInitializers(DexProgramClass clazz);
--
-   public abstract void enqueueTraceInvokeDirectAction(
-       DexMethod invokedMethod, ProgramMethod context);
- 
-@@ -591,19 +385,8 @@ public abstract class EnqueuerWorklist {
- 
-   public abstract void enqueueTraceNewInstanceAction(DexType type, ProgramMethod context);
- 
--  public abstract void enqueueTraceReflectiveFieldAccessAction(
--      ProgramField field, ProgramMethod context);
--
--  public abstract void enqueueTraceReflectiveFieldReadAction(
--      ProgramField field, ProgramMethod context);
--
--  public abstract void enqueueTraceReflectiveFieldWriteAction(
--      ProgramField field, ProgramMethod context);
--
-   public abstract void enqueueTraceStaticFieldRead(DexField field, ProgramMethod context);
- 
--  public abstract void enqueueTraceTypeReferenceAction(DexProgramClass clazz, KeepReason reason);
--
-   static class PushableEnqueuerWorkList extends EnqueuerWorklist {
- 
-     PushableEnqueuerWorkList(Enqueuer enqueuer) {
-@@ -615,11 +398,6 @@ public abstract class EnqueuerWorklist {
-       return new NonPushableEnqueuerWorklist(this);
-     }
- 
--    @Override
--    void enqueue(EnqueuerAction action) {
--      queue.add(action);
--    }
--
-     @Override
-     boolean enqueueAssertAction(Action assertion) {
-       if (InternalOptions.assertionsEnabled()) {
-@@ -713,11 +491,6 @@ public abstract class EnqueuerWorklist {
-       queue.add(new TraceConstClassAction(type, context, ignoreCompatRules));
-     }
- 
--    @Override
--    public void enqueueTraceDirectAndIndirectClassInitializers(DexProgramClass clazz) {
--      queue.add(new TraceDirectAndIndirectClassInitializers(clazz));
--    }
--
-     @Override
-     public void enqueueTraceInvokeDirectAction(DexMethod invokedMethod, ProgramMethod context) {
-       queue.add(new TraceInvokeDirectAction(invokedMethod, context));
-@@ -733,50 +506,9 @@ public abstract class EnqueuerWorklist {
-       queue.add(new TraceNewInstanceAction(type, context));
-     }
- 
--    @Override
--    public void enqueueTraceReflectiveFieldAccessAction(ProgramField field, ProgramMethod context) {
--      FieldAccessInfo info = enqueuer.getFieldAccessInfoCollection().get(field.getReference());
--      if (info == null || !info.hasReflectiveAccess()) {
--        queue.add(new TraceReflectiveFieldAccessAction(field, context));
--      }
--    }
--
--    @Override
--    public void enqueueTraceReflectiveFieldReadAction(ProgramField field, ProgramMethod context) {
--      FieldAccessInfo info = enqueuer.getFieldAccessInfoCollection().get(field.getReference());
--      if (info == null || !info.hasReflectiveRead()) {
--        queue.add(
--            new TraceReflectiveFieldAccessAction(
--                field,
--                context,
--                field.getAccessFlags().isStatic()
--                    ? FieldAccessKind.STATIC_READ
--                    : FieldAccessKind.INSTANCE_READ));
--      }
--    }
--
--    @Override
--    public void enqueueTraceReflectiveFieldWriteAction(ProgramField field, ProgramMethod context) {
--      FieldAccessInfo info = enqueuer.getFieldAccessInfoCollection().get(field.getReference());
--      if (info == null || !info.hasReflectiveWrite()) {
--        queue.add(
--            new TraceReflectiveFieldAccessAction(
--                field,
--                context,
--                field.getAccessFlags().isStatic()
--                    ? FieldAccessKind.STATIC_WRITE
--                    : FieldAccessKind.INSTANCE_WRITE));
--      }
--    }
--
-     @Override
-     public void enqueueTraceStaticFieldRead(DexField field, ProgramMethod context) {
--      queue.add(new TraceStaticFieldReadAction(field, context, FieldAccessMetadata.DEFAULT));
--    }
--
--    @Override
--    public void enqueueTraceTypeReferenceAction(DexProgramClass clazz, KeepReason reason) {
--      queue.add(new TraceTypeReferenceAction(clazz, reason));
-+      queue.add(new TraceStaticFieldReadAction(field, context));
-     }
-   }
- 
-@@ -791,11 +523,6 @@ public abstract class EnqueuerWorklist {
-       return this;
-     }
- 
--    @Override
--    void enqueue(EnqueuerAction action) {
--      throw attemptToEnqueue();
--    }
--
-     private Unreachable attemptToEnqueue() {
-       throw new Unreachable("Attempt to enqueue an action in a non pushable enqueuer work list.");
-     }
-@@ -886,11 +613,6 @@ public abstract class EnqueuerWorklist {
-       throw attemptToEnqueue();
-     }
- 
--    @Override
--    public void enqueueTraceDirectAndIndirectClassInitializers(DexProgramClass clazz) {
--      throw attemptToEnqueue();
--    }
--
-     @Override
-     public void enqueueTraceInvokeDirectAction(DexMethod invokedMethod, ProgramMethod context) {
-       throw attemptToEnqueue();
-@@ -906,29 +628,9 @@ public abstract class EnqueuerWorklist {
-       throw attemptToEnqueue();
-     }
- 
--    @Override
--    public void enqueueTraceReflectiveFieldAccessAction(ProgramField field, ProgramMethod context) {
--      throw attemptToEnqueue();
--    }
--
--    @Override
--    public void enqueueTraceReflectiveFieldReadAction(ProgramField field, ProgramMethod context) {
--      throw attemptToEnqueue();
--    }
--
--    @Override
--    public void enqueueTraceReflectiveFieldWriteAction(ProgramField field, ProgramMethod context) {
--      throw attemptToEnqueue();
--    }
--
-     @Override
-     public void enqueueTraceStaticFieldRead(DexField field, ProgramMethod context) {
-       throw attemptToEnqueue();
-     }
--
--    @Override
--    public void enqueueTraceTypeReferenceAction(DexProgramClass clazz, KeepReason reason) {
--      throw attemptToEnqueue();
--    }
-   }
- }
-diff --git a/src/main/java/com/android/tools/r8/shaking/KeepInfo.java b/src/main/java/com/android/tools/r8/shaking/KeepInfo.java
-index 9595b06a2..f48d65523 100644
---- a/src/main/java/com/android/tools/r8/shaking/KeepInfo.java
-+++ b/src/main/java/com/android/tools/r8/shaking/KeepInfo.java
-@@ -511,10 +511,6 @@ public abstract class KeepInfo<B extends Builder<B, K>, K extends KeepInfo<B, K>
-       return null;
-     }
- 
--    public static KeepFieldInfo.Joiner asFieldJoinerOrNull(Joiner<?, ?, ?> joiner) {
--      return joiner != null ? joiner.asFieldJoiner() : null;
--    }
--
-     public KeepMethodInfo.Joiner asMethodJoiner() {
-       return null;
-     }
-@@ -535,10 +531,6 @@ public abstract class KeepInfo<B extends Builder<B, K>, K extends KeepInfo<B, K>
-       return builder.isCheckDiscardedEnabled();
-     }
- 
--    public boolean isOptimizationAllowed() {
--      return builder.isOptimizationAllowed();
--    }
--
-     public boolean isShrinkingAllowed() {
-       return builder.isShrinkingAllowed();
-     }
-diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
-index 1d7f54c88..1e2a1ff9e 100644
---- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
-+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
-@@ -611,9 +611,6 @@ public class InternalOptions implements GlobalKeepInfoConfiguration {
-   // public boolean lookupLibraryBeforeProgram =
-   //     System.getProperty("com.android.tools.r8.lookupProgramBeforeLibrary") == null;
- 
--  public boolean enableEnqueuerDeferredTracing =
--      System.getProperty("com.android.tools.r8.disableEnqueuerDeferredTracing") == null;
--
-   public boolean loadAllClassDefinitions = false;
- 
-   // Whether or not to check for valid multi-dex builds.
-diff --git a/src/main/java/com/android/tools/r8/utils/collections/ProgramMemberMap.java b/src/main/java/com/android/tools/r8/utils/collections/ProgramMemberMap.java
-index 8292f1432..b14dd8606 100644
---- a/src/main/java/com/android/tools/r8/utils/collections/ProgramMemberMap.java
-+++ b/src/main/java/com/android/tools/r8/utils/collections/ProgramMemberMap.java
-@@ -71,10 +71,8 @@ public abstract class ProgramMemberMap<K extends ProgramMember<?, ?>, V> {
-     return backing.remove(wrap(member));
-   }
- 
--  public boolean removeIf(BiPredicate<K, V> predicate) {
--    return backing
--        .entrySet()
--        .removeIf(entry -> predicate.test(entry.getKey().get(), entry.getValue()));
-+  public void removeIf(BiPredicate<K, V> predicate) {
-+    backing.entrySet().removeIf(entry -> predicate.test(entry.getKey().get(), entry.getValue()));
-   }
- 
-   abstract Wrapper<K> wrap(K member);
-diff --git a/src/test/java/com/android/tools/r8/internal/proto/Proto2ShrinkingTest.java b/src/test/java/com/android/tools/r8/internal/proto/Proto2ShrinkingTest.java
-index 51acd6592..63dae9c99 100644
---- a/src/test/java/com/android/tools/r8/internal/proto/Proto2ShrinkingTest.java
-+++ b/src/test/java/com/android/tools/r8/internal/proto/Proto2ShrinkingTest.java
-@@ -23,7 +23,6 @@ import com.google.common.collect.ImmutableList;
- import com.google.common.collect.ImmutableSet;
- import java.nio.file.Path;
- import java.util.List;
--import org.junit.Ignore;
- import org.junit.Test;
- import org.junit.runner.RunWith;
- import org.junit.runners.Parameterized;
-diff --git a/src/test/java/com/android/tools/r8/ir/LinearFlowIteratorTest.java b/src/test/java/com/android/tools/r8/ir/LinearFlowIteratorTest.java
-index 9d4d133e3..f191b3ba4 100644
---- a/src/test/java/com/android/tools/r8/ir/LinearFlowIteratorTest.java
-+++ b/src/test/java/com/android/tools/r8/ir/LinearFlowIteratorTest.java
-@@ -111,9 +111,10 @@ public class LinearFlowIteratorTest extends TestBase {
-   public void nextWillContinueThroughGotoBlocks() throws Exception {
-     IRCode code = simpleCode();
-     InstructionListIterator it = new LinearFlowInstructionListIterator(code, code.entryBlock());
--    assertTrue(it.next().isArgument());
--    assertTrue(it.next().isConstNumber());
--    assertTrue(it.next().isThrow());
-+    it.next(); // Argument
-+    it.next(); // ConstNumber 0/NULL
-+    it.next(); // ArrayGet
-+    assert it.next().isReturn(); // Return
-   }
- 
-   @Test
-@@ -153,8 +154,9 @@ public class LinearFlowIteratorTest extends TestBase {
-     InstructionListIterator it = new LinearFlowInstructionListIterator(code, code.blocks.get(1));
-     Instruction current = it.previous();
-     assertTrue(current.isConstNumber() && current.getOutType().isReferenceType());
--    assertTrue(it.next().isConstNumber());
--    assertTrue(it.next().isThrow());
-+    it.next();
-+    current = it.next();
-+    assertTrue(current.isArrayGet());
-   }
- 
-   @Test
-diff --git a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizerTest.java b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizerTest.java
-index 9cd0f5ff4..cb8c9f51c 100644
---- a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizerTest.java
-+++ b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizerTest.java
-@@ -334,7 +334,8 @@ public class ClassStaticizerTest extends TestBase {
-             "DIRECT: void movetohost.HostConflictField.<init>()",
-             "STATIC: String movetohost.CandidateConflictField.bar(String)",
-             "STATIC: String movetohost.CandidateConflictField.foo()",
--            "STATIC: String movetohost.MoveToHostTestClass.next()"),
-+            "STATIC: String movetohost.MoveToHostTestClass.next()",
-+            "String movetohost.CandidateConflictField.field"),
-         references(clazz, "testConflictField", "void"));
- 
-     assertThat(inspector.clazz(CandidateConflictMethod.class), isPresent());
-diff --git a/src/test/java/com/android/tools/r8/ir/regalloc/RegisterMoveSchedulerTest.java b/src/test/java/com/android/tools/r8/ir/regalloc/RegisterMoveSchedulerTest.java
-index 2100549ea..712953929 100644
---- a/src/test/java/com/android/tools/r8/ir/regalloc/RegisterMoveSchedulerTest.java
-+++ b/src/test/java/com/android/tools/r8/ir/regalloc/RegisterMoveSchedulerTest.java
-@@ -7,6 +7,7 @@ import static org.junit.Assert.assertEquals;
- 
- import com.android.tools.r8.errors.Unimplemented;
- import com.android.tools.r8.graph.AppInfo;
-+import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
- import com.android.tools.r8.graph.AppView;
- import com.android.tools.r8.graph.DebugLocalInfo;
- import com.android.tools.r8.graph.DexApplication;
-@@ -111,11 +112,6 @@ public class RegisterMoveSchedulerTest {
-       throw new Unimplemented();
-     }
- 
--    @Override
--    public void replaceCurrentInstructionWithNullCheck(AppView<?> appView, Value object) {
--      throw new Unimplemented();
--    }
--
-     @Override
-     public void replaceCurrentInstructionWithStaticGet(
-         AppView<?> appView, IRCode code, DexField field, Set<Value> affectedValues) {
-@@ -135,7 +131,7 @@ public class RegisterMoveSchedulerTest {
- 
-     @Override
-     public void replaceCurrentInstructionWithThrowNull(
--        AppView<?> appView,
-+        AppView<? extends AppInfoWithClassHierarchy> appView,
-         IRCode code,
-         ListIterator<BasicBlock> blockIterator,
-         Set<BasicBlock> blocksToRemove,
-diff --git a/src/test/java/com/android/tools/r8/missingclasses/MissingClassReferencedFromFieldAnnotationTest.java b/src/test/java/com/android/tools/r8/missingclasses/MissingClassReferencedFromFieldAnnotationTest.java
-index c0c9739b9..71e9638c5 100644
---- a/src/test/java/com/android/tools/r8/missingclasses/MissingClassReferencedFromFieldAnnotationTest.java
-+++ b/src/test/java/com/android/tools/r8/missingclasses/MissingClassReferencedFromFieldAnnotationTest.java
-@@ -31,20 +31,13 @@ public class MissingClassReferencedFromFieldAnnotationTest extends MissingClasse
-   @Test(expected = CompilationFailedException.class)
-   public void testNoRules() throws Exception {
-     compileWithExpectedDiagnostics(
--        Main.class,
--        diagnostics -> inspectDiagnosticsWithNoRules(diagnostics, referencedFrom),
--        builder -> builder.addKeepClassAndMembersRules(Main.class));
-+        Main.class, diagnostics -> inspectDiagnosticsWithNoRules(diagnostics, referencedFrom));
-   }
- 
-   @Test
-   public void testDontWarnMainClass() throws Exception {
-     compileWithExpectedDiagnostics(
--        Main.class,
--        TestDiagnosticMessages::assertNoMessages,
--        builder ->
--            builder
--                .addDontWarn(MissingRuntimeAnnotation.class)
--                .addKeepClassAndMembersRules(Main.class));
-+        Main.class, TestDiagnosticMessages::assertNoMessages, addDontWarn(Main.class));
-   }
- 
-   @Test
-@@ -52,10 +45,7 @@ public class MissingClassReferencedFromFieldAnnotationTest extends MissingClasse
-     compileWithExpectedDiagnostics(
-         Main.class,
-         TestDiagnosticMessages::assertNoMessages,
--        builder ->
--            builder
--                .addDontWarn(MissingRuntimeAnnotation.class)
--                .addKeepClassAndMembersRules(Main.class));
-+        addDontWarn(MissingRuntimeAnnotation.class));
-   }
- 
-   @Test
-@@ -63,11 +53,7 @@ public class MissingClassReferencedFromFieldAnnotationTest extends MissingClasse
-     compileWithExpectedDiagnostics(
-         Main.class,
-         diagnostics -> inspectDiagnosticsWithIgnoreWarnings(diagnostics, referencedFrom),
--        builder ->
--            builder
--                .addIgnoreWarnings()
--                .addKeepClassAndMembersRules(Main.class)
--                .allowDiagnosticWarningMessages());
-+        addIgnoreWarnings());
-   }
- 
-   @Override
-diff --git a/src/test/java/com/android/tools/r8/rewrite/assertions/kotlinassertionhandlersimple/AssertionConfigurationAssertionHandlerKotlinSimpleTest.java b/src/test/java/com/android/tools/r8/rewrite/assertions/kotlinassertionhandlersimple/AssertionConfigurationAssertionHandlerKotlinSimpleTest.java
-deleted file mode 100644
-index aad753e5a..000000000
---- a/src/test/java/com/android/tools/r8/rewrite/assertions/kotlinassertionhandlersimple/AssertionConfigurationAssertionHandlerKotlinSimpleTest.java
-+++ /dev/null
-@@ -1,81 +0,0 @@
--// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
--// for details. All rights reserved. Use of this source code is governed by a
--// BSD-style license that can be found in the LICENSE file.
--
--package com.android.tools.r8.rewrite.assertions.kotlinassertionhandlersimple;
--
--import static org.hamcrest.CoreMatchers.equalTo;
--
--import com.android.tools.r8.KotlinCompilerTool.KotlinCompilerVersion;
--import com.android.tools.r8.KotlinTestParameters;
--import com.android.tools.r8.R8FullTestBuilder;
--import com.android.tools.r8.R8TestCompileResult;
--import com.android.tools.r8.TestParameters;
--import com.android.tools.r8.references.MethodReference;
--import com.android.tools.r8.references.Reference;
--import com.android.tools.r8.rewrite.assertions.AssertionConfigurationAssertionHandlerKotlinTestBase;
--import com.android.tools.r8.rewrite.assertions.assertionhandler.AssertionHandlers;
--import com.android.tools.r8.utils.StringUtils;
--import java.io.IOException;
--import java.nio.file.Path;
--import java.util.List;
--import org.junit.runner.RunWith;
--import org.junit.runners.Parameterized;
--
--@RunWith(Parameterized.class)
--public class AssertionConfigurationAssertionHandlerKotlinSimpleTest
--    extends AssertionConfigurationAssertionHandlerKotlinTestBase {
--
--  public AssertionConfigurationAssertionHandlerKotlinSimpleTest(
--      TestParameters parameters,
--      KotlinTestParameters kotlinParameters,
--      boolean kotlinStdlibAsClasspath,
--      boolean useJvmAssertions)
--      throws IOException {
--    super(parameters, kotlinParameters, kotlinStdlibAsClasspath, useJvmAssertions);
--  }
--
--  @Override
--  protected String getExpectedOutput() {
--    return StringUtils.lines(
--        "assertionHandler: simpleAssertion",
--        "assertionHandler: multipleAssertions 1",
--        "assertionHandler: multipleAssertions 2");
--  }
--
--  @Override
--  protected MethodReference getAssertionHandler() throws Exception {
--    return Reference.methodFromMethod(
--        AssertionHandlers.class.getMethod("assertionHandler", Throwable.class));
--  }
--
--  @Override
--  protected List<Path> getKotlinFiles() throws IOException {
--    return getKotlinFilesInTestPackage(getClass().getPackage());
--  }
--
--  @Override
--  protected String getTestClassName() {
--    return getClass().getPackage().getName() + ".AssertionSimpleKt";
--  }
--
--  @Override
--  protected void configureR8(R8FullTestBuilder builder) {
--    boolean referencesNotNull =
--        !kotlinParameters.is(KotlinCompilerVersion.KOTLINC_1_3_72)
--            && !kotlinStdlibAsLibrary
--            && !useJvmAssertions;
--    builder
--        .applyIf(referencesNotNull, b -> b.addDontWarn("org.jetbrains.annotations.NotNull"))
--        .allowDiagnosticWarningMessages(!kotlinStdlibAsLibrary);
--  }
--
--  @Override
--  protected void configureResultR8(R8TestCompileResult builder) {
--    builder.applyIf(
--        !kotlinStdlibAsLibrary,
--        result ->
--            result.assertAllWarningMessagesMatch(
--                equalTo("Resource 'META-INF/MANIFEST.MF' already exists.")));
--  }
--}
-diff --git a/src/test/java/com/android/tools/r8/shaking/InvalidTypesTest.java b/src/test/java/com/android/tools/r8/shaking/InvalidTypesTest.java
-index bb63e6fc8..fda8843bd 100644
---- a/src/test/java/com/android/tools/r8/shaking/InvalidTypesTest.java
-+++ b/src/test/java/com/android/tools/r8/shaking/InvalidTypesTest.java
-@@ -8,6 +8,7 @@ import static org.hamcrest.CoreMatchers.allOf;
- import static org.hamcrest.CoreMatchers.anyOf;
- import static org.hamcrest.CoreMatchers.containsString;
- import static org.hamcrest.CoreMatchers.equalTo;
-+import static org.hamcrest.core.IsNot.not;
- 
- import com.android.tools.r8.D8TestRunResult;
- import com.android.tools.r8.DXTestRunResult;
-@@ -70,6 +71,11 @@ public class InvalidTypesTest extends JasminTestBase {
- 
-           case DX:
-           case D8:
-+          case R8:
-+            if (parameters.isCfRuntime()) {
-+              assert compiler == Compiler.R8;
-+              return StringUtils.joinLines("Hello!", "Goodbye!", "");
-+            }
-             switch (parameters.getDexRuntimeVersion()) {
-               case V4_0_4:
-               case V4_4_4:
-@@ -98,14 +104,6 @@ public class InvalidTypesTest extends JasminTestBase {
-                 throw new Unreachable();
-             }
- 
--          case R8:
--            return StringUtils.joinLines(
--                "Hello!",
--                "Unexpected outcome of getstatic",
--                "Unexpected outcome of checkcast",
--                "Goodbye!",
--                "");
--
-           case PROGUARD:
-             return StringUtils.joinLines(
-                 "Hello!", "Unexpected outcome of checkcast", "Goodbye!", "");
-@@ -125,6 +123,10 @@ public class InvalidTypesTest extends JasminTestBase {
-       @Override
-       public String getExpectedOutput(
-           Compiler compiler, TestParameters parameters, boolean useInterface) {
-+        if (useInterface) {
-+          return StringUtils.joinLines("Hello!", "In verifiable method!", "Goodbye!", "");
-+        }
-+
-         switch (compiler) {
-           case R8:
-           case PROGUARD:
-@@ -133,9 +135,6 @@ public class InvalidTypesTest extends JasminTestBase {
-             return StringUtils.joinLines("Hello!", "In verifiable method!", "Goodbye!", "");
- 
-           default:
--            if (useInterface) {
--              return StringUtils.joinLines("Hello!", "In verifiable method!", "Goodbye!", "");
--            }
-             // The code fails with a verification error because the verifiableMethod() is being
-             // called on UnverifiableClass, which does not verify due to unverifiableMethod().
-             return StringUtils.joinLines("Hello!", "");
-@@ -330,12 +329,17 @@ public class InvalidTypesTest extends JasminTestBase {
-         break;
- 
-       case INVOKE_VERIFIABLE_METHOD_ON_UNVERIFIABLE_CLASS:
--        if (useInterface || compiler == Compiler.R8 || compiler == Compiler.PROGUARD) {
-+        if (useInterface) {
-           result.assertSuccessWithOutput(getExpectedOutput(compiler));
-         } else {
--          result
--              .assertFailureWithOutput(getExpectedOutput(compiler))
--              .assertFailureWithErrorThatMatches(getMatcherForExpectedError(compiler));
-+          if (compiler == Compiler.R8
-+              || compiler == Compiler.PROGUARD) {
-+            result.assertSuccessWithOutput(getExpectedOutput(compiler));
-+          } else {
-+            result
-+                .assertFailureWithOutput(getExpectedOutput(compiler))
-+                .assertFailureWithErrorThatMatches(getMatcherForExpectedError());
-+          }
-         }
-         break;
- 
-@@ -343,9 +347,18 @@ public class InvalidTypesTest extends JasminTestBase {
-         if (useInterface) {
-           result.assertSuccessWithOutput(getExpectedOutput(compiler));
-         } else {
--          result
--              .assertFailureWithOutput(getExpectedOutput(compiler))
--              .assertFailureWithErrorThatMatches(getMatcherForExpectedError(compiler));
-+          if (compiler == Compiler.R8) {
-+            result
-+                .assertFailureWithOutput(getExpectedOutput(compiler))
-+                .assertFailureWithErrorThatMatches(
-+                    allOf(
-+                        containsString("java.lang.NullPointerException"),
-+                        not(containsString("java.lang.VerifyError"))));
-+          } else {
-+            result
-+                .assertFailureWithOutput(getExpectedOutput(compiler))
-+                .assertFailureWithErrorThatMatches(getMatcherForExpectedError());
-+          }
-         }
-         break;
- 
-@@ -358,10 +371,7 @@ public class InvalidTypesTest extends JasminTestBase {
-     return mode.getExpectedOutput(compiler, parameters, useInterface);
-   }
- 
--  private Matcher<String> getMatcherForExpectedError(Compiler compiler) {
--    if (compiler == Compiler.R8 && mode == Mode.INVOKE_UNVERIFIABLE_METHOD) {
--      return containsString("java.lang.NullPointerException");
--    }
-+  private Matcher<String> getMatcherForExpectedError() {
-     if (parameters.isCfRuntime()) {
-       return allOf(
-           containsString("java.lang.VerifyError"),
-diff --git a/src/test/java/com/android/tools/r8/shaking/KeepClassMembersFieldTest.java b/src/test/java/com/android/tools/r8/shaking/KeepClassMembersFieldTest.java
-index 05cec263b..ff09c75a5 100644
---- a/src/test/java/com/android/tools/r8/shaking/KeepClassMembersFieldTest.java
-+++ b/src/test/java/com/android/tools/r8/shaking/KeepClassMembersFieldTest.java
-@@ -4,13 +4,14 @@
- 
- package com.android.tools.r8.shaking;
- 
--import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
--import static org.hamcrest.MatcherAssert.assertThat;
-+import static org.junit.Assert.assertFalse;
- 
- import com.android.tools.r8.TestBase;
- import com.android.tools.r8.TestParameters;
- import com.android.tools.r8.TestParametersCollection;
- import com.android.tools.r8.utils.StringUtils;
-+import com.android.tools.r8.utils.codeinspector.FoundFieldSubject;
-+import java.util.List;
- import org.junit.Test;
- import org.junit.runner.RunWith;
- import org.junit.runners.Parameterized;
-@@ -20,10 +21,11 @@ import org.junit.runners.Parameterized.Parameters;
- public class KeepClassMembersFieldTest extends TestBase {
- 
-   private static final String KEEP_RULE =
--      StringUtils.lines(
--          "-keepclassmembers,allowshrinking class " + Foo.class.getTypeName() + " {",
--          "  <fields>;",
--          "}");
-+      "-keepclassmembers,allowshrinking class"
-+          + " com.android.tools.r8.shaking.KeepClassMembersFieldTest$Foo {"
-+          + " <fields>; "
-+          + "}";
-+  private static final String EXPECTED_RESULT = StringUtils.lines("42");
- 
-   private final TestParameters parameters;
- 
-@@ -39,23 +41,32 @@ public class KeepClassMembersFieldTest extends TestBase {
-   @Test
-   public void testR8() throws Throwable {
-     testForR8(parameters.getBackend())
--        .addInnerClasses(getClass())
-+        .addProgramClasses(Foo.class, Bar.class)
-         .addKeepMainRule(Foo.class)
-         .addKeepRules(KEEP_RULE)
-         .setMinApi(parameters.getApiLevel())
-         .compile()
--        .inspect(
--            inspector ->
--                assertThat(inspector.clazz(Foo.class).uniqueFieldWithName("value"), isPresent()))
-         .run(parameters.getRuntime(), Foo.class)
--        .assertSuccessWithEmptyOutput();
-+        .inspect(
-+            inspector -> {
-+              List<FoundFieldSubject> foundFieldSubjects = inspector.clazz(Foo.class).allFields();
-+              // TODO(b/231555675): This should present
-+              assertFalse(inspector.clazz(Foo.class).uniqueFieldWithName("value").isPresent());
-+            })
-+        .assertSuccess();
-   }
- 
--  static class Bar {}
-+  static class Bar {
-+    @Override
-+    public String toString() {
-+      return "42";
-+    }
-+  }
- 
-   static class Foo {
-+    public Bar value = new Bar();
- 
--    Bar value = new Bar();
-+    Foo() {}
- 
-     public static void main(String[] args) {
-       new Foo();
-diff --git a/src/test/java/com/android/tools/r8/shaking/allowshrinking/KeepClassFieldsAllowShrinkingCompatibilityTest.java b/src/test/java/com/android/tools/r8/shaking/allowshrinking/KeepClassFieldsAllowShrinkingCompatibilityTest.java
-index e0e151aa4..314ea33e9 100644
---- a/src/test/java/com/android/tools/r8/shaking/allowshrinking/KeepClassFieldsAllowShrinkingCompatibilityTest.java
-+++ b/src/test/java/com/android/tools/r8/shaking/allowshrinking/KeepClassFieldsAllowShrinkingCompatibilityTest.java
-@@ -103,9 +103,11 @@ public class KeepClassFieldsAllowShrinkingCompatibilityTest extends TestBase {
-                 assertThat(bBar, not(isPresent()));
-               } else {
-                 assertThat(aFoo, isPresentAndRenamed(allowObfuscation));
--                assertThat(
--                    aBar, /*shrinker.isR8() ? isAbsent() : */
--                    isPresentAndRenamed(allowObfuscation));
-+                // TODO(b/171459868) It is inconsistent that the unused field A.bar is retained.
-+                //   This does not match the R8 behavior for an unused method, so there may be an
-+                //   optimization opportunity here.
-+                //   (See KeepClassMethodsAllowShrinkingCompatibilityTest regarding methods).
-+                assertThat(aBar, isPresentAndRenamed(allowObfuscation));
-                 assertThat(inspector.clazz(TestClass.class).mainMethod(), accessesField(aFoo));
-                 if (shrinker.isR8()) {
-                   assertThat(bFoo, not(isPresent()));
-diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedFieldTypeTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedFieldTypeTest.java
-index 8e4f9f43c..12c064356 100644
---- a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedFieldTypeTest.java
-+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/MergedFieldTypeTest.java
-@@ -65,16 +65,12 @@ public class MergedFieldTypeTest extends MergedTypeBaseTest {
- 
-       public static void main(String[] args) {
-         TestClass obj = new TestClass();
--        if (alwaysFalse()) {
-+        if (false) {
-           obj.field = new B();
-           System.out.println(obj.field);
-         }
-         System.out.print(obj.get().getClass().getName());
-       }
--
--      static boolean alwaysFalse() {
--        return false;
--      }
-     }
- 
-     public MergedFieldTypeWithCollisionTest(
-diff --git a/src/test/java/com/android/tools/r8/shaking/keptgraph/KeptSingletonIsNotCyclicTest.java b/src/test/java/com/android/tools/r8/shaking/keptgraph/KeptSingletonIsNotCyclicTest.java
-index f6f59ddcc..e65f24001 100644
---- a/src/test/java/com/android/tools/r8/shaking/keptgraph/KeptSingletonIsNotCyclicTest.java
-+++ b/src/test/java/com/android/tools/r8/shaking/keptgraph/KeptSingletonIsNotCyclicTest.java
-@@ -100,13 +100,13 @@ public class KeptSingletonIsNotCyclicTest extends TestBase {
-     // TestClass.foo is kept by TestClass.<init>.
-     QueryNode testFooFieldNode =
-         inspector.field(testFooFieldRef).assertPresent().assertKeptBy(testInit);
--    // The type Foo is kept by TestClass.<init> and TestClass.foo.
-+    // The type Foo is not kept by TestClass.<init>, but TestClass.foo.
-     QueryNode fooClassNode =
-         inspector
-             .clazz(fooClassRef)
-             .assertRenamed()
-             .assertKeptBy(testFooFieldNode)
--            .assertKeptBy(testInit);
-+            .assertNotKeptBy(testInit);
-     // Foo.<clinit> is kept by Foo
-     QueryNode fooClInit = inspector.method(fooClInitRef).assertPresent().assertKeptBy(fooClassNode);
-     // The type Foo is also kept by Foo.<clinit>
--- 
-2.36.1.255.ge46751e96f-goog
-
diff --git a/tools/binary_size/libsupersize/archive.py b/tools/binary_size/libsupersize/archive.py
index 9b785a2..573c3906 100644
--- a/tools/binary_size/libsupersize/archive.py
+++ b/tools/binary_size/libsupersize/archive.py
@@ -373,9 +373,10 @@
     apk_infolist = apk_file_manager.InfoList(apk_spec.apk_path)
     dex_total_size = sum(i.file_size for i in apk_infolist
                          if i.filename.endswith('.dex'))
-    add_syms(*apkanalyzer.CreateDexSymbols(apk_analyzer_results[container_name],
-                                           dex_total_size,
-                                           apk_spec.size_info_prefix))
+    if dex_total_size > 0:
+      add_syms(*apkanalyzer.CreateDexSymbols(
+          apk_analyzer_results[container_name], dex_total_size,
+          apk_spec.size_info_prefix))
   if pak_spec:
     add_syms(*_CreatePakSymbols(pak_spec=pak_spec,
                                 pak_id_map=pak_id_map,
@@ -745,7 +746,7 @@
 
 # Cache to prevent excess log messages.
 @functools.lru_cache
-def _DeduceAuxPaths(mapping_path, resources_pathmap_path, apk_prefix):
+def _DeduceMappingPath(mapping_path, apk_prefix):
   if apk_prefix:
     if not mapping_path:
       possible_mapping_path = apk_prefix + '.mapping'
@@ -755,6 +756,13 @@
       else:
         logging.warning('Could not find proguard mapping file at %s',
                         possible_mapping_path)
+  return mapping_path
+
+
+# Cache to prevent excess log messages.
+@functools.lru_cache
+def _DeducePathmapPath(resources_pathmap_path, apk_prefix):
+  if apk_prefix:
     if not resources_pathmap_path:
       possible_pathmap_path = apk_prefix + '.pathmap.txt'
       # This could be pointing to a stale pathmap file if path shortening was
@@ -766,7 +774,8 @@
         resources_pathmap_path = possible_pathmap_path
         logging.debug('Detected --resources-pathmap-file=%s',
                       resources_pathmap_path)
-  return mapping_path, resources_pathmap_path
+      # Path shortening is optional, so do not warn for missing file.
+  return resources_pathmap_path
 
 
 def _ReadMultipleArgsFromStream(lines, base_dir, err_prefix, on_config_error):
@@ -828,9 +837,11 @@
     apk_prefix = apk_prefix.replace('.minimal.apks', '.aab')
     apk_prefix = apk_prefix.replace('.apks', '.aab')
 
-  mapping_path, resources_pathmap_path = _DeduceAuxPaths(
-      sub_args.mapping_file, sub_args.resources_pathmap_file, apk_prefix)
-
+  mapping_path = None
+  if analyze_dex:
+    mapping_path = _DeduceMappingPath(sub_args.mapping_file, apk_prefix)
+  resources_pathmap_path = _DeducePathmapPath(sub_args.resources_pathmap_file,
+                                              apk_prefix)
   apk_spec = None
   if apk_prefix:
     apk_spec = ApkSpec(apk_path=apk_path,
diff --git a/tools/binary_size/libsupersize/testdata/Archive_MinimalApks.golden b/tools/binary_size/libsupersize/testdata/Archive_MinimalApks.golden
index 2d917686..48f934e4 100644
--- a/tools/binary_size/libsupersize/testdata/Archive_MinimalApks.golden
+++ b/tools/binary_size/libsupersize/testdata/Archive_MinimalApks.golden
@@ -187,12 +187,12 @@
 * 0 have source paths. Accounts for 0 bytes (0.0%).
 * 0 have a component assigned. Accounts for 0 bytes (0.0%).
 * 0 symbols have shared ownership.
-Section .dex: has 0.0% of 0 bytes accounted for from 0 symbols. 0 bytes are unaccounted for.
+Section .dex: 0 bytes from 0 symbols.
 * Padding accounts for 0 bytes (0.0%)
 * 0 have source paths. Accounts for 0 bytes (0.0%).
 * 0 have a component assigned. Accounts for 0 bytes (0.0%).
 * 0 symbols have shared ownership.
-Section .dex.method: has 0.0% of 0 bytes accounted for from 0 symbols. 0 bytes are unaccounted for.
+Section .dex.method: 0 bytes from 0 symbols.
 * Padding accounts for 0 bytes (0.0%)
 * 0 have source paths. Accounts for 0 bytes (0.0%).
 * 0 have a component assigned. Accounts for 0 bytes (0.0%).
@@ -296,12 +296,12 @@
 * 0 have source paths. Accounts for 0 bytes (0.0%).
 * 0 have a component assigned. Accounts for 0 bytes (0.0%).
 * 0 symbols have shared ownership.
-Section .dex: has 0.0% of 0 bytes accounted for from 0 symbols. 0 bytes are unaccounted for.
+Section .dex: 0 bytes from 0 symbols.
 * Padding accounts for 0 bytes (0.0%)
 * 0 have source paths. Accounts for 0 bytes (0.0%).
 * 0 have a component assigned. Accounts for 0 bytes (0.0%).
 * 0 symbols have shared ownership.
-Section .dex.method: has 0.0% of 0 bytes accounted for from 0 symbols. 0 bytes are unaccounted for.
+Section .dex.method: 0 bytes from 0 symbols.
 * Padding accounts for 0 bytes (0.0%)
 * 0 have source paths. Accounts for 0 bytes (0.0%).
 * 0 have a component assigned. Accounts for 0 bytes (0.0%).
@@ -349,12 +349,12 @@
 * 0 have source paths. Accounts for 0 bytes (0.0%).
 * 0 have a component assigned. Accounts for 0 bytes (0.0%).
 * 0 symbols have shared ownership.
-Section .dex: has 0.0% of 0 bytes accounted for from 0 symbols. 0 bytes are unaccounted for.
+Section .dex: 0 bytes from 0 symbols.
 * Padding accounts for 0 bytes (0.0%)
 * 0 have source paths. Accounts for 0 bytes (0.0%).
 * 0 have a component assigned. Accounts for 0 bytes (0.0%).
 * 0 symbols have shared ownership.
-Section .dex.method: has 0.0% of 0 bytes accounted for from 0 symbols. 0 bytes are unaccounted for.
+Section .dex.method: 0 bytes from 0 symbols.
 * Padding accounts for 0 bytes (0.0%)
 * 0 have source paths. Accounts for 0 bytes (0.0%).
 * 0 have a component assigned. Accounts for 0 bytes (0.0%).
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index cb083180..0c61ad9f 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -40232,6 +40232,9 @@
   <int value="4251" label="CSSLegacyTransformOrigin"/>
   <int value="4252" label="CSSLegacyBorderImage"/>
   <int value="4253" label="CSSLegacyBorderImageWidth"/>
+  <int value="4254" label="CrossOriginOpenerPolicyRestrictProperties"/>
+  <int value="4255"
+      label="CrossOriginOpenerPolicyRestrictPropertiesReportOnly"/>
 </enum>
 
 <enum name="FeaturePolicyAllowlistType">
@@ -82622,6 +82625,15 @@
   <int value="4" label="Available"/>
 </enum>
 
+<enum name="SafeBrowsingTailoredSecurityNotificationResult">
+  <int value="0" label="Unknown"/>
+  <int value="1" label="Shown"/>
+  <int value="2" label="AccountNotConsented"/>
+  <int value="3" label="EnhancedProtectionAlreadyEnabled"/>
+  <int value="4" label="NoWebContentsAvailable"/>
+  <int value="5" label="SafeBrowsingControlledByPolicy"/>
+</enum>
+
 <enum name="SafeBrowsingTailoredSecurityOutcome">
   <int value="0" label="Accepted"/>
   <int value="1" label="Dismissed"/>
diff --git a/tools/metrics/histograms/metadata/ash/histograms.xml b/tools/metrics/histograms/metadata/ash/histograms.xml
index 1b0f4ae..f184dc20 100644
--- a/tools/metrics/histograms/metadata/ash/histograms.xml
+++ b/tools/metrics/histograms/metadata/ash/histograms.xml
@@ -2221,7 +2221,7 @@
 </histogram>
 
 <histogram name="Ash.DragWindowFromShelf.PresentationTime.MaxLatency"
-    units="ms" expires_after="2022-05-30">
+    units="ms" expires_after="2023-05-30">
   <owner>tbarzic@chromium.org</owner>
   <owner>xdai@chromium.org</owner>
   <summary>
@@ -2446,7 +2446,7 @@
 </histogram>
 
 <histogram name="Ash.Login.Login.AuthMethod.Switched"
-    enum="AuthMethodSwitchType" expires_after="2022-06-29">
+    enum="AuthMethodSwitchType" expires_after="2023-06-29">
   <owner>emaamari@google.com</owner>
   <owner>cros-lurs@google.com</owner>
   <summary>
@@ -2582,7 +2582,7 @@
 </histogram>
 
 <histogram name="Ash.Media.CameraPrivacySwitch.Event"
-    enum="CameraPrivacySwitchEvent" expires_after="2022-05-01">
+    enum="CameraPrivacySwitchEvent" expires_after="2023-05-01">
   <owner>tbarzic@chromium.org</owner>
   <owner>gzadina@google.com</owner>
   <summary>
@@ -2600,7 +2600,7 @@
 </histogram>
 
 <histogram name="Ash.Media.CameraPrivacySwitch.TimeFromNotificationToOff"
-    units="5 seconds" expires_after="2022-05-01">
+    units="5 seconds" expires_after="2023-05-01">
   <owner>tbarzic@chromium.org</owner>
   <owner>gzadina@google.com</owner>
   <summary>
@@ -2701,7 +2701,7 @@
 </histogram>
 
 <histogram name="Ash.NightLight.AutoNightLightNotificationState"
-    enum="AshAutoNightLightNotificationState" expires_after="2022-05-01">
+    enum="AshAutoNightLightNotificationState" expires_after="2023-05-01">
   <owner>afakhry@chromium.org</owner>
   <owner>tclaiborne@chromium.org</owner>
   <summary>
@@ -3176,7 +3176,7 @@
 </histogram>
 
 <histogram base="true" name="Ash.Overview.WindowDrag.PresentationTime"
-    units="ms" expires_after="2022-05-30">
+    units="ms" expires_after="2023-05-30">
 <!-- Name completed by histogram_suffixes
      name="TabletOrClamshellMode" -->
 
@@ -3187,7 +3187,7 @@
 
 <histogram base="true"
     name="Ash.Overview.WindowDrag.PresentationTime.MaxLatency" units="ms"
-    expires_after="2022-05-30">
+    expires_after="2023-05-30">
 <!-- Name completed by histogram_suffixes
      name="TabletOrClamshellMode" -->
 
@@ -3602,7 +3602,7 @@
 </histogram>
 
 <histogram name="Ash.Shelf.Palette.Assistant.GestureType"
-    enum="AssistantGestureType" expires_after="2022-05-01">
+    enum="AssistantGestureType" expires_after="2023-05-01">
   <owner>amehfooz@chromium.org</owner>
   <owner>cros-status-area@google.com</owner>
   <owner>gzadina@chromium.org</owner>
@@ -4098,7 +4098,7 @@
 </histogram>
 
 <histogram name="Ash.SwipeDownDrag.Tab.PresentationTime.MaxLatency.TabletMode"
-    units="ms" expires_after="2022-06-30">
+    units="ms" expires_after="2023-06-30">
   <owner>xdai@chromium.org</owner>
   <owner>omrilio@chromium.org</owner>
   <summary>
@@ -4116,7 +4116,7 @@
 
 <histogram
     name="Ash.SwipeDownDrag.Window.PresentationTime.MaxLatency.TabletMode"
-    units="ms" expires_after="2022-06-30">
+    units="ms" expires_after="2023-06-30">
   <owner>xdai@chromium.org</owner>
   <owner>omrilio@chromium.org</owner>
   <summary>
@@ -4126,7 +4126,7 @@
 </histogram>
 
 <histogram name="Ash.SwipeDownDrag.Window.PresentationTime.TabletMode"
-    units="ms" expires_after="2022-06-30">
+    units="ms" expires_after="2023-06-30">
   <owner>xdai@chromium.org</owner>
   <owner>omrilio@chromium.org</owner>
   <summary>
@@ -4135,7 +4135,7 @@
 </histogram>
 
 <histogram name="Ash.SwipeHomeToOverviewGesture"
-    enum="SwipeHomeToOverviewResult" expires_after="2022-05-01">
+    enum="SwipeHomeToOverviewResult" expires_after="2023-05-01">
   <owner>andrewxu@chromium.org</owner>
   <owner>tbarzic@chromium.org</owner>
   <summary>
@@ -4456,7 +4456,7 @@
 </histogram>
 
 <histogram name="Ash.Wallpaper.Collection" enum="WallpaperCollection"
-    expires_after="2022-05-17">
+    expires_after="2023-05-17">
   <owner>jasontt@chromium.org</owner>
   <owner>assistive-eng@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/pdf/histograms.xml b/tools/metrics/histograms/metadata/pdf/histograms.xml
index 5d4e23b..c78988e 100644
--- a/tools/metrics/histograms/metadata/pdf/histograms.xml
+++ b/tools/metrics/histograms/metadata/pdf/histograms.xml
@@ -68,15 +68,6 @@
   </summary>
 </histogram>
 
-<histogram name="PDF.IsTagged" enum="BooleanIsTagged"
-    expires_after="2022-04-17">
-  <owner>nektar@chromium.org</owner>
-  <owner>thestig@chromium.org</owner>
-  <summary>
-    Tracks documents opened in the PDF viewer that are Tagged PDFs.
-  </summary>
-</histogram>
-
 <histogram name="PDF.LinkHighlightOverlapsInPage" units="overlaps"
     expires_after="2022-04-24">
   <obsolete>
diff --git a/tools/metrics/histograms/metadata/safe_browsing/histograms.xml b/tools/metrics/histograms/metadata/safe_browsing/histograms.xml
index 4cc1367a..44c79260 100644
--- a/tools/metrics/histograms/metadata/safe_browsing/histograms.xml
+++ b/tools/metrics/histograms/metadata/safe_browsing/histograms.xml
@@ -1959,6 +1959,20 @@
   </summary>
 </histogram>
 
+<histogram
+    name="SafeBrowsing.TailoredSecurity.SyncPromptEnabledNotificationResult"
+    enum="SafeBrowsingTailoredSecurityNotificationResult"
+    expires_after="2022-09-01">
+  <owner>jacastro@chromium.org</owner>
+  <owner>chrome-safebrowsing-alerts@google.com</owner>
+  <summary>
+    Records the result of trying to show the Chrome enhanced protection
+    opt-in/enabled notification to sync users. It is logged once each time
+    Chrome is informed that the account level enhanced protection bit has been
+    enabled.
+  </summary>
+</histogram>
+
 <histogram name="SafeBrowsing.TailoredSecurity.SyncPromptSkippedAlreadyEnabled"
     enum="BooleanSkipped" expires_after="2022-10-04">
   <owner>drubery@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/service/histograms.xml b/tools/metrics/histograms/metadata/service/histograms.xml
index 4e49af61..7fba727 100644
--- a/tools/metrics/histograms/metadata/service/histograms.xml
+++ b/tools/metrics/histograms/metadata/service/histograms.xml
@@ -1066,8 +1066,8 @@
 </histogram>
 
 <histogram name="ServiceWorkerCache.Cache.Browser.Match.Initialized" units="ms"
-    expires_after="2022-06-08">
-  <owner>wanderview@chromium.org</owner>
+    expires_after="2023-05-26">
+  <owner>ayui@chromium.org</owner>
   <owner>chrome-owp-storage@google.com</owner>
   <summary>
     The time to perform a 'match' operation on a given Cache when that cache is
@@ -1129,8 +1129,8 @@
 </histogram>
 
 <histogram name="ServiceWorkerCache.ListOriginsIndexValidity"
-    enum="CacheStorageIndexResult" expires_after="2022-06-08">
-  <owner>wanderview@chromium.org</owner>
+    enum="CacheStorageIndexResult" expires_after="2023-05-26">
+  <owner>ayui@chromium.org</owner>
   <owner>chrome-owp-storage@google.com</owner>
   <summary>
     The result from parsing and validating the index protobuf while calculating
@@ -1139,8 +1139,8 @@
 </histogram>
 
 <histogram name="ServiceWorkerCache.Scheduler.OperationDuration2" units="ms"
-    expires_after="2022-06-08">
-  <owner>wanderview@chromium.org</owner>
+    expires_after="2023-05-26">
+  <owner>ayui@chromium.org</owner>
   <owner>chrome-owp-storage@google.com</owner>
   <summary>
     The time in ms from when an operation is started until it completes. This
@@ -1150,8 +1150,8 @@
 </histogram>
 
 <histogram name="ServiceWorkerCache.Scheduler.QueueDuration2" units="ms"
-    expires_after="2022-06-08">
-  <owner>wanderview@chromium.org</owner>
+    expires_after="2023-05-26">
+  <owner>ayui@chromium.org</owner>
   <owner>chrome-owp-storage@google.com</owner>
   <summary>
     The time in ms from when an operation was queued until its task is posted.
@@ -1161,8 +1161,8 @@
 </histogram>
 
 <histogram name="ServiceWorkerCache.Scheduler.QueueLength" units="operations"
-    expires_after="2022-06-08">
-  <owner>wanderview@chromium.org</owner>
+    expires_after="2023-05-26">
+  <owner>ayui@chromium.org</owner>
   <owner>chrome-owp-storage@google.com</owner>
   <summary>
     The number of operations in the scheduling queue just before enqueuing a new
diff --git a/tools/metrics/histograms/metadata/tab/histograms.xml b/tools/metrics/histograms/metadata/tab/histograms.xml
index 811a1752..79a4c31 100644
--- a/tools/metrics/histograms/metadata/tab/histograms.xml
+++ b/tools/metrics/histograms/metadata/tab/histograms.xml
@@ -557,7 +557,7 @@
 </histogram>
 
 <histogram name="Tab.Preview.VideoCaptureDuration" units="ms"
-    expires_after="2022-07-01">
+    expires_after="2022-09-01">
   <owner>dfried@chromium.org</owner>
   <owner>collinbaker@chromium.org</owner>
   <summary>
@@ -873,7 +873,7 @@
 </histogram>
 
 <histogram name="TabHoverCards.LastTabHoverCardPreviewTime{TabCountMetrics}"
-    units="ms" expires_after="2022-07-01">
+    units="ms" expires_after="2022-09-01">
   <owner>dfried@chromium.org</owner>
   <owner>chrome-desktop-ui-sea@google.com</owner>
   <summary>
@@ -902,7 +902,7 @@
 </histogram>
 
 <histogram name="TabHoverCards.LastTabHoverCardViewedTime{TabCountMetrics}"
-    units="ms" expires_after="2022-07-01">
+    units="ms" expires_after="2022-09-01">
   <owner>dfried@chromium.org</owner>
   <owner>chrome-desktop-ui-sea@google.com</owner>
   <summary>
@@ -929,7 +929,7 @@
 </histogram>
 
 <histogram name="TabHoverCards.TabHoverCardPreviewTime{TabCountMetrics}"
-    units="ms" expires_after="2022-07-01">
+    units="ms" expires_after="2022-09-01">
   <owner>dfried@chromium.org</owner>
   <owner>chrome-desktop-ui-sea@google.com</owner>
   <summary>
@@ -958,7 +958,7 @@
 
 <histogram
     name="TabHoverCards.TabHoverCardsSeenBeforeTabSelection{TabCountMetrics}"
-    units="hover cards" expires_after="2022-07-01">
+    units="hover cards" expires_after="2022-09-01">
   <owner>dfried@chromium.org</owner>
   <owner>chrome-desktop-ui-sea@google.com</owner>
   <summary>
@@ -983,7 +983,7 @@
 </histogram>
 
 <histogram name="TabHoverCards.TabHoverCardViewedTime{TabCountMetrics}"
-    units="ms" expires_after="2022-07-01">
+    units="ms" expires_after="2022-09-01">
   <owner>dfried@chromium.org</owner>
   <owner>chrome-desktop-ui-sea@google.com</owner>
   <summary>
@@ -1011,7 +1011,7 @@
 
 <histogram
     name="TabHoverCards.TabPreviewsSeenBeforeTabSelection{TabCountMetrics}"
-    units="previews" expires_after="2022-07-01">
+    units="previews" expires_after="2022-09-01">
   <owner>dfried@chromium.org</owner>
   <owner>chrome-desktop-ui-sea@google.com</owner>
   <summary>
@@ -1037,7 +1037,7 @@
 </histogram>
 
 <histogram name="TabHoverCards.TimeSinceLastVisible" units="ms"
-    expires_after="2022-07-01">
+    expires_after="2022-09-01">
   <owner>corising@chromium.org</owner>
   <owner>chrome-desktop-ui-sea@google.com</owner>
   <summary>
@@ -2046,7 +2046,7 @@
 </histogram>
 
 <histogram name="Tabs.ScrubbedInInterval.KeyPress" units="tabs"
-    expires_after="2022-07-01">
+    expires_after="2022-09-01">
   <owner>corising@chromium.org</owner>
   <owner>chrome-desktop-ui-sea@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/web_core/histograms.xml b/tools/metrics/histograms/metadata/web_core/histograms.xml
index e9b8349e..53f1037 100644
--- a/tools/metrics/histograms/metadata/web_core/histograms.xml
+++ b/tools/metrics/histograms/metadata/web_core/histograms.xml
@@ -791,6 +791,19 @@
   <summary>Whether a deferred script was streamed or not.</summary>
 </histogram>
 
+<histogram name="WebCore.Scripts.InlineStreamerWaitTime" units="microseconds"
+    expires_after="2023-05-31">
+  <owner>cduvall@chromium.org</owner>
+  <owner>leszeks@chromium.org</owner>
+  <summary>
+    Records the time the main thread is blocked while waiting for an inline
+    script to finish compiling on a background thread. Recorded for each inline
+    script that is compiled on a background thread.
+
+    This histogram only records metrics on machines with high-resolution clocks.
+  </summary>
+</histogram>
+
 <histogram name="WebCore.Scripts.Other.NotStreamingReason"
     enum="NotStreamingReason" expires_after="2023-06-01">
   <owner>leszeks@chromium.org</owner>
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json
index 1d25daf..1dbcef3 100644
--- a/tools/perf/core/perfetto_binary_roller/binary_deps.json
+++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -5,24 +5,24 @@
             "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux_arm64/49b4b5dcbc312d8d2c3751cf29238b8efeb4e494/trace_processor_shell"
         },
         "win": {
-            "hash": "94b8f2a9f63756da5d4c02b61fc7713a34bb11eb",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/4b48d827d640f7c0b428c1662e1a0645c47e3b61/trace_processor_shell.exe"
+            "hash": "5d2e302a0724081bd9acfe06d4256776d5a659b4",
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/d55a1685ae00d37b13590430d7d916dc291da2cc/trace_processor_shell.exe"
         },
         "linux_arm": {
             "hash": "58893933be305d3bfe0a72ebebcacde2ac3ca893",
             "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux_arm/49b4b5dcbc312d8d2c3751cf29238b8efeb4e494/trace_processor_shell"
         },
         "mac": {
-            "hash": "2b6f7a6e49f927a36800ab549b2a2ffa1caa7740",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/4b48d827d640f7c0b428c1662e1a0645c47e3b61/trace_processor_shell"
+            "hash": "ea611c8243ca07c3a54d7ba1b0371ac7957e6533",
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/d55a1685ae00d37b13590430d7d916dc291da2cc/trace_processor_shell"
         },
         "mac_arm64": {
             "hash": "e1ad4861384b06d911a65f035317914b8cc975c6",
             "full_remote_path": "perfetto-luci-artifacts/v25.0/mac-arm64/trace_processor_shell"
         },
         "linux": {
-            "hash": "59b48b8f08e736364ee1f1e0f69752f5a9a7dd96",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/011475e0c2eed314436288d0a0dcfa5123212e83/trace_processor_shell"
+            "hash": "42ca3c37a2dfdb2c1ce5790a590b88ad7692ff0c",
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/d5024aeb5e2193961a66949b94c466784d6126b8/trace_processor_shell"
         }
     },
     "power_profile.sql": {
diff --git a/ui/accessibility/ax_node_data.h b/ui/accessibility/ax_node_data.h
index 75b8da0..8038113 100644
--- a/ui/accessibility/ax_node_data.h
+++ b/ui/accessibility/ax_node_data.h
@@ -25,10 +25,6 @@
 
 class AXTreeID;
 
-// If a node is not yet or no longer valid, its ID should have a value of
-// kInvalidAXNodeID.
-static constexpr AXNodeID kInvalidAXNodeID = 0;
-
 // Return true if |attr| should be interpreted as the id of another node
 // in the same tree.
 AX_BASE_EXPORT bool IsNodeIdIntAttribute(ax::mojom::IntAttribute attr);
diff --git a/ui/accessibility/ax_node_id_forward.h b/ui/accessibility/ax_node_id_forward.h
index 5cdaec4..8fdce95 100644
--- a/ui/accessibility/ax_node_id_forward.h
+++ b/ui/accessibility/ax_node_id_forward.h
@@ -12,6 +12,10 @@
 // Defines the type used for AXNode IDs.
 using AXNodeID = int32_t;
 
+// If a node is not yet or no longer valid, its ID should have a value of
+// kInvalidAXNodeID.
+static constexpr AXNodeID kInvalidAXNodeID = 0;
+
 }  // namespace ui
 
 #endif  // UI_ACCESSIBILITY_AX_NODE_ID_FORWARD_H_
diff --git a/ui/accessibility/ax_relative_bounds.h b/ui/accessibility/ax_relative_bounds.h
index 4af5f819..882d3502 100644
--- a/ui/accessibility/ax_relative_bounds.h
+++ b/ui/accessibility/ax_relative_bounds.h
@@ -12,6 +12,7 @@
 
 #include "ui/accessibility/ax_base_export.h"
 #include "ui/accessibility/ax_enums.mojom-forward.h"
+#include "ui/accessibility/ax_node_id_forward.h"
 #include "ui/gfx/geometry/rect_f.h"
 #include "ui/gfx/geometry/transform.h"
 
@@ -43,8 +44,9 @@
   std::string ToString() const;
 
   // The id of an ancestor node in the same AXTree that this object's
-  // bounding box is relative to, or -1 if there's no offset container.
-  int32_t offset_container_id;
+  // bounding box is relative to, or `kInvalidAXNodeID` if there's no offset
+  // container.
+  AXNodeID offset_container_id = kInvalidAXNodeID;
 
   // The relative bounding box of this node.
   gfx::RectF bounds;
diff --git a/ui/webui/resources/BUILD.gn b/ui/webui/resources/BUILD.gn
index fecb06a7..b91e6b0b 100644
--- a/ui/webui/resources/BUILD.gn
+++ b/ui/webui/resources/BUILD.gn
@@ -307,9 +307,12 @@
 
   in_files = [
     "cr_elements/cr_tab_box/cr_tab_box.ts",
+    "cr_elements/cr_tab_box/cr_tab_box.html.ts",
     "cr_elements/cr_tree/cr_tree.ts",
+    "cr_elements/cr_tree/cr_tree.html.ts",
     "cr_elements/cr_tree/cr_tree_base.ts",
     "cr_elements/cr_tree/cr_tree_item.ts",
+    "cr_elements/cr_tree/cr_tree_item.html.ts",
     "js/assert_ts.ts",
     "js/custom_element.ts",
   ]
diff --git a/ui/webui/resources/cr_elements/BUILD.gn b/ui/webui/resources/cr_elements/BUILD.gn
index 1c7bc71b..25d422e 100644
--- a/ui/webui/resources/cr_elements/BUILD.gn
+++ b/ui/webui/resources/cr_elements/BUILD.gn
@@ -6,7 +6,6 @@
 import("//third_party/closure_compiler/compile_js.gni")
 import("//tools/grit/preprocess_if_expr.gni")
 import("//tools/polymer/css_to_wrapper.gni")
-import("//tools/polymer/html_to_js.gni")
 import("//tools/polymer/html_to_wrapper.gni")
 import("//tools/polymer/polymer.gni")
 import("//ui/webui/resources/include_polymer.gni")
@@ -79,7 +78,12 @@
 preprocess_if_expr("preprocess_src_ts") {
   in_folder = "."
   out_folder = preprocess_folder
-  in_files = [ "cr_tree/cr_tree_base.ts" ]
+  in_files = [
+    "cr_tab_box/cr_tab_box.ts",
+    "cr_tree/cr_tree_base.ts",
+    "cr_tree/cr_tree_item.ts",
+    "cr_tree/cr_tree.ts",
+  ]
   if (include_polymer) {
     in_files += [
       "cr_a11y_announcer/cr_a11y_announcer.ts",
@@ -231,13 +235,13 @@
 # TS files are passed to a separate target so that they are not listed in the
 # |out_manifest|.
 preprocess_if_expr("preprocess_generated_ts") {
-  deps = [ ":custom_elements" ]
+  deps = [ ":html_wrapper_files_native" ]
   in_folder = target_gen_dir
   out_folder = preprocess_folder
   in_files = [
-    "cr_tab_box/cr_tab_box.ts",
-    "cr_tree/cr_tree.ts",
-    "cr_tree/cr_tree_item.ts",
+    "cr_tab_box/cr_tab_box.html.ts",
+    "cr_tree/cr_tree.html.ts",
+    "cr_tree/cr_tree_item.html.ts",
   ]
   if (include_polymer) {
     deps += [
@@ -390,10 +394,9 @@
   }
 }
 
-group("custom_elements") {
-  public_deps = [ ":web_components" ]
-  if (include_polymer) {
-    public_deps += [
+if (include_polymer) {
+  group("custom_elements") {
+    public_deps = [
       ":action_link_css_module",
       ":cr_actionable_row_style_module",
       ":cr_icons_css_module",
@@ -417,10 +420,10 @@
       "cr_toggle:cr_toggle_module",
       "policy:polymer3_elements",
     ]
-  }
 
-  if (is_chromeos) {
-    public_deps += [ "chromeos:polymer3_elements" ]
+    if (is_chromeos) {
+      public_deps += [ "chromeos:polymer3_elements" ]
+    }
   }
 }
 
@@ -464,6 +467,15 @@
   }
 }
 
+html_to_wrapper("html_wrapper_files_native") {
+  in_files = [
+    "cr_tab_box/cr_tab_box.html",
+    "cr_tree/cr_tree.html",
+    "cr_tree/cr_tree_item.html",
+  ]
+  template = "native"
+}
+
 if (include_polymer) {
   html_to_wrapper("html_wrapper_files") {
     in_files = [
@@ -490,9 +502,7 @@
       in_files += [ "cr_searchable_drop_down/cr_searchable_drop_down.html" ]
     }
   }
-}
 
-if (include_polymer) {
   css_to_wrapper("css_wrapper_files") {
     in_files = [
       "cr_nav_menu_item_style.css",
@@ -504,11 +514,3 @@
     ]
   }
 }
-
-html_to_js("web_components") {
-  js_files = [
-    "cr_tab_box/cr_tab_box.ts",
-    "cr_tree/cr_tree.ts",
-    "cr_tree/cr_tree_item.ts",
-  ]
-}
diff --git a/ui/webui/resources/cr_elements/cr_tab_box/cr_tab_box.html b/ui/webui/resources/cr_elements/cr_tab_box/cr_tab_box.html
index dd17fbe..b3a81f78 100644
--- a/ui/webui/resources/cr_elements/cr_tab_box/cr_tab_box.html
+++ b/ui/webui/resources/cr_elements/cr_tab_box/cr_tab_box.html
@@ -17,6 +17,12 @@
     padding-top: 14px;
   }
 
+  :host([sticky-tabs]) #tablist {
+    position: sticky;
+    top: 0;
+    z-index: var(--cr-tab-box-tabs-z-index, 1);
+  }
+
   #tablist ::slotted(*) {
     background: var(--tabs-background-color);
     border: 1px solid var(--tabs-background-color);
diff --git a/ui/webui/resources/cr_elements/cr_tab_box/cr_tab_box.ts b/ui/webui/resources/cr_elements/cr_tab_box/cr_tab_box.ts
index 8d627dca..1d92acf 100644
--- a/ui/webui/resources/cr_elements/cr_tab_box/cr_tab_box.ts
+++ b/ui/webui/resources/cr_elements/cr_tab_box/cr_tab_box.ts
@@ -5,11 +5,12 @@
 import {assert} from '../../js/assert_ts.js';
 import {FocusOutlineManager} from '../../js/cr/ui/focus_outline_manager.m.js';
 import {CustomElement} from '../../js/custom_element.js';
-import {getTrustedHTML} from '../../js/static_types.js';
+
+import {getTemplate} from './cr_tab_box.html.js';
 
 export class CrTabBoxElement extends CustomElement {
   static override get template() {
-    return getTrustedHTML`{__html_template__}`;
+    return getTemplate();
   }
 
   static get observedAttributes() {
@@ -27,6 +28,18 @@
     assert(tabs);
     this.tabs_ = tabs;
     this.tabs_.addEventListener('keydown', e => this.onKeydown_(e));
+    this.tabs_.addEventListener('click', (e: MouseEvent) => {
+      const tabs = this.getTabs_();
+      for (let i = 0; i < e.composedPath().length; i++) {
+        const el = e.composedPath()[i] as HTMLElement;
+        const index = tabs.findIndex(tab => tab === el);
+        if (index !== -1) {
+          this.setAttribute('selected-index', index.toString());
+          break;
+        }
+      }
+    });
+
     const panels = this.$<HTMLElement>('#tabpanels');
     assert(panels);
     this.panels_ = panels;
@@ -35,12 +48,6 @@
 
   connectedCallback() {
     this.setAttribute('selected-index', '0');
-
-    this.getTabs_().forEach((panel: Element, index: number) => {
-      panel.addEventListener('click', () => {
-        this.setAttribute('selected-index', index.toString());
-      });
-    });
   }
 
   attributeChangedCallback(name: string, _oldValue: string, newValue: string) {
diff --git a/ui/webui/resources/cr_elements/cr_tree/cr_tree.ts b/ui/webui/resources/cr_elements/cr_tree/cr_tree.ts
index 6c530f6..1e2619a 100644
--- a/ui/webui/resources/cr_elements/cr_tree/cr_tree.ts
+++ b/ui/webui/resources/cr_elements/cr_tree/cr_tree.ts
@@ -4,8 +4,8 @@
 
 import {assert, assertNotReached} from '../../js/assert_ts.js';
 import {isMac} from '../../js/cr.m.js';
-import {getTrustedHTML} from '../../js/static_types.js';
 
+import {getTemplate} from './cr_tree.html.js';
 import {CrTreeBaseElement} from './cr_tree_base.js';
 import {SELECTED_ATTR} from './cr_tree_item.js';
 
@@ -75,7 +75,7 @@
 
 export class CrTreeElement extends CrTreeBaseElement {
   static override get template() {
-    return getTrustedHTML`{__html_template__}`;
+    return getTemplate();
   }
 
   private selectedItem_: CrTreeBaseElement|null = null;
diff --git a/ui/webui/resources/cr_elements/cr_tree/cr_tree_item.ts b/ui/webui/resources/cr_elements/cr_tree/cr_tree_item.ts
index 1494610..19b6759 100644
--- a/ui/webui/resources/cr_elements/cr_tree/cr_tree_item.ts
+++ b/ui/webui/resources/cr_elements/cr_tree/cr_tree_item.ts
@@ -3,9 +3,9 @@
 // found in the LICENSE file.
 
 import {assert, assertNotReached} from '../../js/assert_ts.js';
-import {getTrustedHTML} from '../../js/static_types.js';
 
 import {CrTreeBaseElement, EXPANDED_ATTR} from './cr_tree_base.js';
+import {getTemplate} from './cr_tree_item.html.js';
 
 /**
  * @fileoverview cr-tree-item represents a node in a tree structure. Child items
@@ -40,7 +40,7 @@
 
 export class CrTreeItemElement extends CrTreeBaseElement {
   static override get template() {
-    return getTrustedHTML`{__html_template__}`;
+    return getTemplate();
   }
 
   static override get observedAttributes() {