Merge autoland to mozilla-central. a=merge
authorGurzau Raul <rgurzau@mozilla.com>
Mon, 11 Mar 2019 18:49:16 +0200
changeset 524346 6f32ec5e62e3a3b20d2c16e13f963981603768df
parent 524309 0bf136f3ac45ce5e1c5d76c9c89d2fed6d15d0c4 (current diff)
parent 524345 3ee7abf6d43275fe1d936df32a40bf010450d62d (diff)
child 524349 eb0a25f393aad44362b34f21173193f6f632d2eb
push id2032
push userffxbld-merge
push dateMon, 13 May 2019 09:36:57 +0000
treeherdermozilla-release@455c1065dcbe [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone67.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge autoland to mozilla-central. a=merge
js/src/builtin/Array.cpp
js/src/jit/CodeGenerator.cpp
js/src/vm/ArrayObject-inl.h
js/src/vm/Interpreter.cpp
js/src/vm/NativeObject-inl.h
js/src/vm/ProxyObject.cpp
js/src/vm/UnboxedObject.cpp
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -484,21 +484,21 @@ pref("browser.tabs.newanimations", false
 // Pref to control whether we use separate privileged content processes.
 #if defined(NIGHTLY_BUILD) && !defined(MOZ_ASAN)
 pref("browser.tabs.remote.separatePrivilegedContentProcess", true);
 #endif
 
 // Turn on HTTP response process selection.
 pref("browser.tabs.remote.useHTTPResponseProcessSelection", true);
 
-// Unload tabs on low-memory on nightly.
-#ifdef RELEASE_OR_BETA
+// Unload tabs on low-memory on nightly and beta.
+#ifdef EARLY_BETA_OR_EARLIER
+pref("browser.tabs.unloadOnLowMemory", true);
+#else
 pref("browser.tabs.unloadOnLowMemory", false);
-#else
-pref("browser.tabs.unloadOnLowMemory", true);
 #endif
 
 pref("browser.ctrlTab.recentlyUsedOrder", true);
 
 // By default, do not export HTML at shutdown.
 // If true, at shutdown the bookmarks in your menu and toolbar will
 // be exported as HTML to the bookmarks.html file.
 pref("browser.bookmarks.autoExportHTML",          false);
--- a/browser/base/content/test/keyboard/browser_toolbarKeyNav.js
+++ b/browser/base/content/test/keyboard/browser_toolbarKeyNav.js
@@ -6,16 +6,20 @@
 /**
  * Test browser toolbar keyboard navigation.
  * These tests assume the default browser configuration for toolbars unless
  * otherwise specified.
  */
 
 const PERMISSIONS_PAGE = "https://example.com/browser/browser/base/content/test/permissions/permissions.html";
 
+// The DevEdition has the DevTools button in the toolbar by default. Remove it
+// to prevent branch-specific rules what button should be focused.
+CustomizableUI.removeWidgetFromArea("developer-button");
+
 async function expectFocusAfterKey(aKey, aFocus, aAncestorOk = false) {
   let res = aKey.match(/^(Shift\+)?(?:(.)|(.+))$/);
   let shift = Boolean(res[1]);
   let key;
   if (res[2]) {
     key = res[2]; // Character.
   } else {
     key = "KEY_" + res[3]; // Tab, ArrowRight, etc.
@@ -225,8 +229,12 @@ add_task(async function testArrowsOverfl
     // Make sure the button is not reachable once it is invisible again.
     await expectFocusAfterKey("ArrowRight", "PanelUI-menu-button");
     CustomizableUI.reset();
     // Flush layout so its invisibility can be detected.
     document.getElementById("nav-bar-overflow-button").clientWidth;
     await expectFocusAfterKey("ArrowLeft", "sidebar-button");
   });
 });
+
+registerCleanupFunction(async function resetToolbar() {
+  await CustomizableUI.reset();
+});
--- a/browser/branding/aurora/pref/firefox-branding.js
+++ b/browser/branding/aurora/pref/firefox-branding.js
@@ -13,17 +13,17 @@ pref("app.update.interval", 28800); // 8
 pref("app.update.promptWaitTime", 691200);
 // URL user can browse to manually if for some reason all update installation
 // attempts fail.
 pref("app.update.url.manual", "https://www.mozilla.org/firefox/aurora/");
 // A default value for the "More information about this update" link
 // supplied in the "An update is available" page of the update wizard.
 pref("app.update.url.details", "https://www.mozilla.org/firefox/aurora/");
 
-pref("app.releaseNotesURL", "https://www.mozilla.org/%LOCALE%/firefox/%VERSION%/releasenotes/?utm_source=firefox-browser&utm_medium=firefox-browser&utm_campaign=whatsnew");
+pref("app.releaseNotesURL", "https://www.mozilla.org/%LOCALE%/firefox/%VERSION%beta/releasenotes/?utm_source=firefox-browser&utm_medium=firefox-browser&utm_campaign=whatsnew");
 
 // The number of days a binary is permitted to be old
 // without checking for an update.  This assumes that
 // app.update.checkInstallTime is true.
 pref("app.update.checkInstallTime.days", 2);
 
 // Give the user x seconds to reboot before showing a badge on the hamburger
 // button. default=4 days
--- a/browser/branding/official/pref/firefox-branding.js
+++ b/browser/branding/official/pref/firefox-branding.js
@@ -12,23 +12,23 @@ pref("app.update.promptWaitTime", 691200
 // app.update.url.manual: URL user can browse to manually if for some reason
 // all update installation attempts fail.
 // app.update.url.details: a default value for the "More information about this
 // update" link supplied in the "An update is available" page of the update
 // wizard.
 #if MOZ_UPDATE_CHANNEL == beta
 pref("app.update.url.manual", "https://www.mozilla.org/firefox/beta");
 pref("app.update.url.details", "https://www.mozilla.org/%LOCALE%/firefox/beta/notes");
+pref("app.releaseNotesURL", "https://www.mozilla.org/%LOCALE%/firefox/%VERSION%beta/releasenotes/?utm_source=firefox-browser&utm_medium=firefox-browser&utm_campaign=whatsnew");
 #else
 pref("app.update.url.manual", "https://www.mozilla.org/firefox/");
 pref("app.update.url.details", "https://www.mozilla.org/%LOCALE%/firefox/notes");
+pref("app.releaseNotesURL", "https://www.mozilla.org/%LOCALE%/firefox/%VERSION%/releasenotes/?utm_source=firefox-browser&utm_medium=firefox-browser&utm_campaign=whatsnew");
 #endif
 
-pref("app.releaseNotesURL", "https://www.mozilla.org/%LOCALE%/firefox/%VERSION%/releasenotes/?utm_source=firefox-browser&utm_medium=firefox-browser&utm_campaign=whatsnew");
-
 // The number of days a binary is permitted to be old
 // without checking for an update.  This assumes that
 // app.update.checkInstallTime is true.
 pref("app.update.checkInstallTime.days", 63);
 
 // Give the user x seconds to reboot before showing a badge on the hamburger
 // button. default=4 days
 pref("app.update.badgeWaitTime", 345600);
--- a/browser/components/urlbar/UrlbarInput.jsm
+++ b/browser/components/urlbar/UrlbarInput.jsm
@@ -916,19 +916,18 @@ class UrlbarInput {
     } catch (ex) {
       // This load can throw an exception in certain cases, which means
       // we'll want to replace the URL with the loaded URL:
       if (ex.result != Cr.NS_ERROR_LOAD_SHOWED_ERRORPAGE) {
         this.handleRevert();
       }
     }
 
-    // TODO This should probably be handed via input.
     // Ensure the start of the URL is visible for usability reasons.
-    // this.selectionStart = this.selectionEnd = 0;
+    this.selectionStart = this.selectionEnd = 0;
 
     this.closePopup();
   }
 
   /**
    * Determines where a URL/page should be opened.
    *
    * @param {Event} event the event triggering the opening.
--- a/browser/components/urlbar/tests/browser/browser.ini
+++ b/browser/components/urlbar/tests/browser/browser.ini
@@ -45,16 +45,17 @@ support-files =
 [browser_moz_action_link.js]
 [browser_new_tab_urlbar_reset.js]
 [browser_pasteAndGo.js]
 subsuite = clipboard
 [browser_populateAfterPushState.js]
 [browser_privateBrowsingWindowChange.js]
 skip-if = debug # Bug 1532034 - Leaks in debug mode.
 [browser_raceWithTabs.js]
+skip-if = os == "linux" # Bug 1533807
 [browser_redirect_error.js]
 support-files = redirect_error.sjs
 [browser_remotetab.js]
 [browser_removeUnsafeProtocolsFromURLBarPaste.js]
 subsuite = clipboard
 [browser_search_favicon.js]
 skip-if = true # Bug 1526222 - Doesn't currently work with QuantumBar
 [browser_searchTelemetry.js]
--- a/browser/components/urlbar/tests/legacy/browser.ini
+++ b/browser/components/urlbar/tests/legacy/browser.ini
@@ -68,16 +68,17 @@ skip-if = (os == "linux" || os == "mac")
 [../browser/browser_locationBarExternalLoad.js]
 [../browser/browser_moz_action_link.js]
 [../browser/browser_new_tab_urlbar_reset.js]
 [../browser/browser_pasteAndGo.js]
 subsuite = clipboard
 [../browser/browser_populateAfterPushState.js]
 [../browser/browser_privateBrowsingWindowChange.js]
 [../browser/browser_raceWithTabs.js]
+skip-if = os == "linux" # Bug 1533807
 [../browser/browser_redirect_error.js]
 support-files = ../browser/redirect_error.sjs
 [../browser/browser_remotetab.js]
 [../browser/browser_removeUnsafeProtocolsFromURLBarPaste.js]
 subsuite = clipboard
 [../browser/browser_search_favicon.js]
 [../browser/browser_searchTelemetry.js]
 support-files =
--- a/devtools/client/webconsole/components/App.js
+++ b/devtools/client/webconsole/components/App.js
@@ -45,16 +45,17 @@ class App extends Component {
       notifications: PropTypes.object,
       onFirstMeaningfulPaint: PropTypes.func.isRequired,
       serviceContainer: PropTypes.object.isRequired,
       closeSplitConsole: PropTypes.func.isRequired,
       jstermCodeMirror: PropTypes.bool,
       currentReverseSearchEntry: PropTypes.string,
       reverseSearchInputVisible: PropTypes.bool,
       reverseSearchInitialValue: PropTypes.string,
+      editorMode: PropTypes.bool,
     };
   }
 
   constructor(props) {
     super(props);
 
     this.onClick = this.onClick.bind(this);
     this.onPaste = this.onPaste.bind(this);
@@ -195,22 +196,26 @@ class App extends Component {
       attachRefToWebConsoleUI,
       webConsoleUI,
       notifications,
       onFirstMeaningfulPaint,
       serviceContainer,
       closeSplitConsole,
       jstermCodeMirror,
       reverseSearchInitialValue,
+      editorMode,
     } = this.props;
 
     const classNames = ["webconsole-app"];
     if (jstermCodeMirror) {
       classNames.push("jsterm-cm");
     }
+    if (editorMode) {
+      classNames.push("jsterm-editor");
+    }
 
     // Render the entire Console panel. The panel consists
     // from the following parts:
     // * FilterBar - Buttons & free text for content filtering
     // * Content - List of logs & messages
     // * NotificationBox - Notifications for JSTerm (self-xss warning at the moment)
     // * JSTerm - Input command line.
     // * ReverseSearchInput - Reverse search input.
@@ -237,16 +242,17 @@ class App extends Component {
             id: "webconsole-notificationbox",
             notifications,
           }),
           JSTerm({
             webConsoleUI,
             serviceContainer,
             onPaste: this.onPaste,
             codeMirrorEnabled: jstermCodeMirror,
+            editorMode,
           }),
           ReverseSearchInput({
             setInputValue: serviceContainer.setInputValue,
             focusInput: serviceContainer.focusInput,
             evaluateInput: serviceContainer.evaluateInput,
             initialValue: reverseSearchInitialValue,
           })
         ),
@@ -262,15 +268,16 @@ class App extends Component {
     );
   }
 }
 
 const mapStateToProps = state => ({
   notifications: getAllNotifications(state),
   reverseSearchInputVisible: state.ui.reverseSearchInputVisible,
   reverseSearchInitialValue: state.ui.reverseSearchInitialValue,
+  editorMode: state.ui.editor,
 });
 
 const mapDispatchToProps = dispatch => ({
   dispatch,
 });
 
 module.exports = connect(mapStateToProps, mapDispatchToProps)(App);
--- a/devtools/client/webconsole/components/JSTerm.js
+++ b/devtools/client/webconsole/components/JSTerm.js
@@ -74,16 +74,18 @@ class JSTerm extends Component {
       onPaste: PropTypes.func,
       codeMirrorEnabled: PropTypes.bool,
       // Update position in the history after executing an expression (action).
       updateHistoryPosition: PropTypes.func.isRequired,
       // Update autocomplete popup state.
       autocompleteUpdate: PropTypes.func.isRequired,
       // Data to be displayed in the autocomplete popup.
       autocompleteData: PropTypes.object.isRequired,
+      // Is the input in editor mode.
+      editorMode: PropTypes.bool,
     };
   }
 
   constructor(props) {
     super(props);
 
     const {
       webConsoleUI,
@@ -587,17 +589,21 @@ class JSTerm extends Component {
     if (!executeString) {
       return null;
     }
 
     // Append executed expression into the history list.
     this.props.appendToHistory(executeString);
 
     WebConsoleUtils.usageCount++;
-    this._setValue("");
+
+    if (!this.props.editorMode) {
+      this._setValue("");
+    }
+
     this.clearCompletion();
 
     let selectedNodeActor = null;
     const inspectorSelection = this.webConsoleUI.hud.getInspectorSelection();
     if (inspectorSelection && inspectorSelection.nodeFront) {
       selectedNodeActor = inspectorSelection.nodeFront.actorID;
     }
 
--- a/devtools/client/webconsole/constants.js
+++ b/devtools/client/webconsole/constants.js
@@ -60,16 +60,18 @@ const prefs = {
       NET: "filter.net",
       NETXHR: "filter.netxhr",
     },
     UI: {
       // Persist is only used by the webconsole.
       PERSIST: "devtools.webconsole.persistlog",
       // Max number of entries in history list.
       INPUT_HISTORY_COUNT: "devtools.webconsole.inputHistoryCount",
+      // Is editor mode enabled.
+      EDITOR: "devtools.webconsole.input.editor",
     },
     FEATURES: {
       // We use the same pref to enable the sidebar on webconsole and browser console.
       SIDEBAR_TOGGLE: "devtools.webconsole.sidebarToggle",
       JSTERM_CODE_MIRROR: "devtools.webconsole.jsterm.codeMirror",
     },
   },
 };
--- a/devtools/client/webconsole/reducers/ui.js
+++ b/devtools/client/webconsole/reducers/ui.js
@@ -26,16 +26,17 @@ const UiState = (overrides) => Object.fr
   networkMessageActiveTabId: PANELS.HEADERS,
   persistLogs: false,
   sidebarVisible: false,
   timestampsVisible: true,
   gripInSidebar: null,
   closeButtonVisible: false,
   reverseSearchInputVisible: false,
   reverseSearchInitialValue: "",
+  editor: false,
 }, overrides));
 
 function ui(state = UiState(), action) {
   switch (action.type) {
     case PERSIST_TOGGLE:
       return Object.assign({}, state, {persistLogs: !state.persistLogs});
     case TIMESTAMPS_TOGGLE:
       return Object.assign({}, state, {timestampsVisible: action.visible});
--- a/devtools/client/webconsole/store.js
+++ b/devtools/client/webconsole/store.js
@@ -66,16 +66,17 @@ function configureStore(webConsoleUI, op
       log: getBoolPref(PREFS.FILTER.LOG),
       css: getBoolPref(PREFS.FILTER.CSS),
       net: getBoolPref(PREFS.FILTER.NET),
       netxhr: getBoolPref(PREFS.FILTER.NETXHR),
     }),
     ui: UiState({
       networkMessageActiveTabId: "headers",
       persistLogs: getBoolPref(PREFS.UI.PERSIST),
+      editor: getBoolPref(PREFS.UI.EDITOR),
     }),
   };
 
   // Prepare middleware.
   const services = (options.services || {});
 
   const middleware = applyMiddleware(
     thunk.bind(null, {
--- a/devtools/client/webconsole/test/mochitest/browser.ini
+++ b/devtools/client/webconsole/test/mochitest/browser.ini
@@ -192,16 +192,17 @@ skip-if = verify
 [browser_jsterm_completion.js]
 [browser_jsterm_content_defined_helpers.js]
 [browser_jsterm_context_menu_labels.js]
 [browser_jsterm_copy_command.js]
 [browser_jsterm_ctrl_a_select_all.js]
 [browser_jsterm_ctrl_key_nav.js]
 skip-if = os != 'mac' # The tested ctrl+key shortcuts are OSX only
 [browser_jsterm_document_no_xray.js]
+[browser_jsterm_editor_execute.js]
 [browser_jsterm_error_docs.js]
 [browser_jsterm_error_outside_valid_range.js]
 [browser_jsterm_focus_reload.js]
 [browser_jsterm_helper_clear.js]
 [browser_jsterm_helper_dollar_dollar.js]
 [browser_jsterm_helper_dollar_x.js]
 [browser_jsterm_helper_dollar.js]
 [browser_jsterm_helper_help.js]
new file mode 100644
--- /dev/null
+++ b/devtools/client/webconsole/test/mochitest/browser_jsterm_editor_execute.js
@@ -0,0 +1,30 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+// Test that user input is not cleared when 'devtools.webconsole.input.editor'
+// is set to true.
+// See https://bugzilla.mozilla.org/show_bug.cgi?id=1519313
+
+"use strict";
+
+const TEST_URI = "data:text/html;charset=utf-8,Web Console test for bug 1519313";
+
+add_task(async function() {
+  await pushPref("devtools.webconsole.input.editor", true);
+  // Run test with legacy JsTerm
+  await pushPref("devtools.webconsole.jsterm.codeMirror", false);
+  await performTests();
+  // And then run it with the CodeMirror-powered one.
+  await pushPref("devtools.webconsole.jsterm.codeMirror", true);
+  await performTests();
+});
+
+async function performTests() {
+  const hud = await openNewTabAndConsole(TEST_URI);
+  const {jsterm} = hud;
+
+  const expression = `x = 10`;
+  setInputValue(hud, expression);
+  await jsterm.execute();
+  is(getInputValue(hud), expression, "input line is not cleared after submit");
+}
--- a/dom/media/webrtc/MediaEngineTabVideoSource.cpp
+++ b/dom/media/webrtc/MediaEngineTabVideoSource.cpp
@@ -340,49 +340,51 @@ void MediaEngineTabVideoSource::Draw() {
 
   RefPtr<layers::TextureClient> texture =
       rgbImage->GetTextureClient(/* aForwarder */ nullptr);
   if (!texture) {
     NS_WARNING("Failed to allocate TextureClient");
     return;
   }
 
-  layers::TextureClientAutoLock autoLock(texture,
-                                         layers::OpenMode::OPEN_WRITE_ONLY);
-  if (!autoLock.Succeeded()) {
-    NS_WARNING("Failed to lock TextureClient");
-    return;
-  }
+  {
+    layers::TextureClientAutoLock autoLock(texture,
+                                           layers::OpenMode::OPEN_WRITE_ONLY);
+    if (!autoLock.Succeeded()) {
+      NS_WARNING("Failed to lock TextureClient");
+      return;
+    }
 
-  RefPtr<gfx::DrawTarget> dt = texture->BorrowDrawTarget();
-  if (!dt || !dt->IsValid()) {
-    NS_WARNING("Failed to borrow DrawTarget");
-    return;
-  }
+    RefPtr<gfx::DrawTarget> dt = texture->BorrowDrawTarget();
+    if (!dt || !dt->IsValid()) {
+      NS_WARNING("Failed to borrow DrawTarget");
+      return;
+    }
 
-  if (mWindow) {
-    RefPtr<gfxContext> context = gfxContext::CreateOrNull(dt);
-    MOZ_ASSERT(context);  // already checked the draw target above
-    context->SetMatrix(context->CurrentMatrix().PreScale(
-        (((float)size.width) / mViewportWidth),
-        (((float)size.height) / mViewportHeight)));
+    if (mWindow) {
+      RefPtr<gfxContext> context = gfxContext::CreateOrNull(dt);
+      MOZ_ASSERT(context);  // already checked the draw target above
+      context->SetMatrix(context->CurrentMatrix().PreScale(
+          (((float)size.width) / mViewportWidth),
+          (((float)size.height) / mViewportHeight)));
 
-    nscolor bgColor = NS_RGB(255, 255, 255);
-    uint32_t renderDocFlags =
-        mScrollWithPage ? 0
-                        : (nsIPresShell::RENDER_IGNORE_VIEWPORT_SCROLLING |
-                           nsIPresShell::RENDER_DOCUMENT_RELATIVE);
-    nsRect r(nsPresContext::CSSPixelsToAppUnits((float)mViewportOffsetX),
-             nsPresContext::CSSPixelsToAppUnits((float)mViewportOffsetY),
-             nsPresContext::CSSPixelsToAppUnits((float)mViewportWidth),
-             nsPresContext::CSSPixelsToAppUnits((float)mViewportHeight));
-    NS_ENSURE_SUCCESS_VOID(
-        presShell->RenderDocument(r, renderDocFlags, bgColor, context));
-  } else {
-    dt->ClearRect(Rect(0, 0, size.width, size.height));
+      nscolor bgColor = NS_RGB(255, 255, 255);
+      uint32_t renderDocFlags =
+          mScrollWithPage ? 0
+                          : (nsIPresShell::RENDER_IGNORE_VIEWPORT_SCROLLING |
+                             nsIPresShell::RENDER_DOCUMENT_RELATIVE);
+      nsRect r(nsPresContext::CSSPixelsToAppUnits((float)mViewportOffsetX),
+               nsPresContext::CSSPixelsToAppUnits((float)mViewportOffsetY),
+               nsPresContext::CSSPixelsToAppUnits((float)mViewportWidth),
+               nsPresContext::CSSPixelsToAppUnits((float)mViewportHeight));
+      NS_ENSURE_SUCCESS_VOID(
+          presShell->RenderDocument(r, renderDocFlags, bgColor, context));
+    } else {
+      dt->ClearRect(Rect(0, 0, size.width, size.height));
+    }
   }
 
   MutexAutoLock lock(mMutex);
   mImage = rgbImage;
 }
 
 nsresult MediaEngineTabVideoSource::FocusOnSelectedSource(
     const RefPtr<const AllocationHandle>& aHandle) {
--- a/js/public/TrackedOptimizationInfo.h
+++ b/js/public/TrackedOptimizationInfo.h
@@ -198,16 +198,17 @@ namespace JS {
   _(CantInlineTooManyArgs)                        \
   _(CantInlineNeedsArgsObj)                       \
   _(CantInlineDebuggee)                           \
   _(CantInlineExceededDepth)                      \
   _(CantInlineExceededTotalBytecodeLength)        \
   _(CantInlineBigCaller)                          \
   _(CantInlineBigCallee)                          \
   _(CantInlineBigCalleeInlinedBytecodeLength)     \
+  _(CantInlineCrossRealm)                         \
   _(CantInlineNotHot)                             \
   _(CantInlineNotInDispatch)                      \
   _(CantInlineUnreachable)                        \
   _(CantInlineNativeBadForm)                      \
   _(CantInlineNativeBadType)                      \
   _(CantInlineNativeNoTemplateObj)                \
   _(CantInlineBound)                              \
   _(CantInlineNativeNoSpecialization)             \
--- a/js/src/builtin/Array.cpp
+++ b/js/src/builtin/Array.cpp
@@ -5,16 +5,17 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "builtin/Array-inl.h"
 
 #include "mozilla/ArrayUtils.h"
 #include "mozilla/CheckedInt.h"
 #include "mozilla/DebugOnly.h"
 #include "mozilla/MathAlgorithms.h"
+#include "mozilla/Maybe.h"
 #include "mozilla/TextUtils.h"
 
 #include <algorithm>
 
 #include "jsapi.h"
 #include "jsfriendapi.h"
 #include "jsnum.h"
 #include "jstypes.h"
@@ -52,16 +53,17 @@
 using namespace js;
 
 using mozilla::Abs;
 using mozilla::ArrayLength;
 using mozilla::CeilingLog2;
 using mozilla::CheckedInt;
 using mozilla::DebugOnly;
 using mozilla::IsAsciiDigit;
+using mozilla::Maybe;
 
 using JS::AutoCheckCannotGC;
 using JS::IsArrayAnswer;
 using JS::ToUint32;
 
 bool JS::IsArray(JSContext* cx, HandleObject obj, IsArrayAnswer* answer) {
   if (obj->is<ArrayObject>()) {
     *answer = IsArrayAnswer::Array;
@@ -3864,24 +3866,34 @@ bool js::array_construct(JSContext* cx, 
   MOZ_ASSERT(!args.isConstructing());
   MOZ_ASSERT(args.length() == 1);
   MOZ_ASSERT(args[0].isNumber());
   return ArrayConstructorImpl(cx, args, /* isConstructor = */ false);
 }
 
 ArrayObject* js::ArrayConstructorOneArg(JSContext* cx, HandleObjectGroup group,
                                         int32_t lengthInt) {
+  // Ion can call this with a group from a different realm when calling
+  // another realm's Array constructor.
+  Maybe<AutoRealm> ar;
+  if (cx->realm() != group->realm()) {
+    MOZ_ASSERT(cx->compartment() == group->compartment());
+    ar.emplace(cx, group);
+  }
+
   if (lengthInt < 0) {
     JS_ReportErrorNumberASCII(cx, GetErrorMessage, nullptr,
                               JSMSG_BAD_ARRAY_LENGTH);
     return nullptr;
   }
 
   uint32_t length = uint32_t(lengthInt);
-  return NewPartlyAllocatedArrayTryUseGroup(cx, group, length);
+  ArrayObject* res = NewPartlyAllocatedArrayTryUseGroup(cx, group, length);
+  MOZ_ASSERT_IF(res, res->realm() == group->realm());
+  return res;
 }
 
 static JSObject* CreateArrayPrototype(JSContext* cx, JSProtoKey key) {
   MOZ_ASSERT(key == JSProto_Array);
   RootedObject proto(
       cx, GlobalObject::getOrCreateObjectPrototype(cx, cx->global()));
   if (!proto) {
     return nullptr;
@@ -4322,23 +4334,33 @@ ArrayObject* js::NewCopiedArrayForCallin
     return nullptr;
   }
   return NewCopiedArrayTryUseGroup(cx, group, vp, length);
 }
 
 ArrayObject* js::NewArrayWithGroup(JSContext* cx, uint32_t length,
                                    HandleObjectGroup group,
                                    bool convertDoubleElements) {
+  // Ion can call this with a group from a different realm when calling
+  // another realm's Array constructor.
+  Maybe<AutoRealm> ar;
+  if (cx->realm() != group->realm()) {
+    MOZ_ASSERT(cx->compartment() == group->compartment());
+    ar.emplace(cx, group);
+  }
+
   ArrayObject* res = NewFullyAllocatedArrayTryUseGroup(cx, group, length);
   if (!res) {
     return nullptr;
   }
+
   if (convertDoubleElements) {
     res->setShouldConvertDoubleElements();
   }
+
   return res;
 }
 
 #ifdef DEBUG
 bool js::ArrayInfo(JSContext* cx, unsigned argc, Value* vp) {
   CallArgs args = CallArgsFromVp(argc, vp);
   RootedObject obj(cx);
 
--- a/js/src/builtin/TypedObject.cpp
+++ b/js/src/builtin/TypedObject.cpp
@@ -2312,17 +2312,17 @@ bool TypedObject::construct(JSContext* c
     JSContext* cx, js::gc::AllocKind kind, js::gc::InitialHeap heap,
     js::HandleShape shape, js::HandleObjectGroup group) {
   debugCheckNewObject(group, shape, kind, heap);
 
   const js::Class* clasp = group->clasp();
   MOZ_ASSERT(::IsTypedObjectClass(clasp));
 
   JSObject* obj =
-      js::Allocate<JSObject>(cx, kind, /* nDynamicSlots = */ 0, heap, clasp);
+      js::AllocateObject(cx, kind, /* nDynamicSlots = */ 0, heap, clasp);
   if (!obj) {
     return cx->alreadyReportedOOM();
   }
 
   TypedObject* tobj = static_cast<TypedObject*>(obj);
   tobj->initGroup(group);
   tobj->initShape(shape);
 
--- a/js/src/gc/Allocator.cpp
+++ b/js/src/gc/Allocator.cpp
@@ -20,21 +20,19 @@
 #include "gc/ArenaList-inl.h"
 #include "gc/Heap-inl.h"
 #include "gc/PrivateIterators-inl.h"
 #include "vm/JSObject-inl.h"
 
 using namespace js;
 using namespace gc;
 
-template <typename T, AllowGC allowGC /* = CanGC */>
-JSObject* js::Allocate(JSContext* cx, AllocKind kind, size_t nDynamicSlots,
-                       InitialHeap heap, const Class* clasp) {
-  static_assert(mozilla::IsConvertible<T*, JSObject*>::value,
-                "must be JSObject derived");
+template <AllowGC allowGC /* = CanGC */>
+JSObject* js::AllocateObject(JSContext* cx, AllocKind kind, size_t nDynamicSlots,
+                             InitialHeap heap, const Class* clasp) {
   MOZ_ASSERT(IsObjectAllocKind(kind));
   size_t thingSize = Arena::thingSize(kind);
 
   MOZ_ASSERT(thingSize == Arena::thingSize(kind));
   MOZ_ASSERT(thingSize >= sizeof(JSObject_Slots0));
   static_assert(
       sizeof(JSObject_Slots0) >= MinCellSize,
       "All allocations must be at least the allocator-imposed minimum size.");
@@ -72,26 +70,26 @@ JSObject* js::Allocate(JSContext* cx, Al
     if (!allowGC) {
       return nullptr;
     }
   }
 
   return GCRuntime::tryNewTenuredObject<allowGC>(cx, kind, thingSize,
                                                  nDynamicSlots);
 }
-template JSObject* js::Allocate<JSObject, NoGC>(JSContext* cx,
-                                                gc::AllocKind kind,
-                                                size_t nDynamicSlots,
-                                                gc::InitialHeap heap,
-                                                const Class* clasp);
-template JSObject* js::Allocate<JSObject, CanGC>(JSContext* cx,
-                                                 gc::AllocKind kind,
-                                                 size_t nDynamicSlots,
-                                                 gc::InitialHeap heap,
-                                                 const Class* clasp);
+template JSObject* js::AllocateObject<NoGC>(JSContext* cx,
+                                            gc::AllocKind kind,
+                                            size_t nDynamicSlots,
+                                            gc::InitialHeap heap,
+                                            const Class* clasp);
+template JSObject* js::AllocateObject<CanGC>(JSContext* cx,
+                                               gc::AllocKind kind,
+                                               size_t nDynamicSlots,
+                                               gc::InitialHeap heap,
+                                               const Class* clasp);
 
 // Attempt to allocate a new JSObject out of the nursery. If there is not
 // enough room in the nursery or there is an OOM, this method will return
 // nullptr.
 template <AllowGC allowGC>
 JSObject* GCRuntime::tryNewNurseryObject(JSContext* cx, size_t thingSize,
                                          size_t nDynamicSlots,
                                          const Class* clasp) {
@@ -172,17 +170,17 @@ JSString* GCRuntime::tryNewNurseryString
       return static_cast<JSString*>(
           cx->nursery().allocateString(cx->zone(), thingSize, kind));
     }
   }
   return nullptr;
 }
 
 template <typename StringAllocT, AllowGC allowGC /* = CanGC */>
-StringAllocT* js::AllocateString(JSContext* cx, InitialHeap heap) {
+StringAllocT* js::AllocateStringImpl(JSContext* cx, InitialHeap heap) {
   static_assert(mozilla::IsConvertible<StringAllocT*, JSString*>::value,
                 "must be JSString derived");
 
   AllocKind kind = MapTypeToFinalizeKind<StringAllocT>::kind;
   size_t size = sizeof(StringAllocT);
   MOZ_ASSERT(size == Arena::thingSize(kind));
   MOZ_ASSERT(size == sizeof(JSString) || size == sizeof(JSFatInlineString));
 
@@ -219,20 +217,20 @@ StringAllocT* js::AllocateString(JSConte
     }
   }
 
   return GCRuntime::tryNewTenuredThing<StringAllocT, allowGC>(cx, kind, size);
 }
 
 #define DECL_ALLOCATOR_INSTANCES(allocKind, traceKind, type, sizedType, \
                                  bgfinal, nursery, compact)             \
-  template type* js::AllocateString<type, NoGC>(JSContext * cx,         \
-                                                InitialHeap heap);      \
-  template type* js::AllocateString<type, CanGC>(JSContext * cx,        \
-                                                 InitialHeap heap);
+  template type* js::AllocateStringImpl<type, NoGC>(JSContext * cx,     \
+                                                    InitialHeap heap);  \
+  template type* js::AllocateStringImpl<type, CanGC>(JSContext * cx,    \
+                                                     InitialHeap heap);
 FOR_EACH_NURSERY_STRING_ALLOCKIND(DECL_ALLOCATOR_INSTANCES)
 #undef DECL_ALLOCATOR_INSTANCES
 
 template <typename T, AllowGC allowGC /* = CanGC */>
 T* js::Allocate(JSContext* cx) {
   static_assert(!mozilla::IsConvertible<T*, JSObject*>::value,
                 "must not be JSObject derived");
   static_assert(
--- a/js/src/gc/Allocator.h
+++ b/js/src/gc/Allocator.h
@@ -12,54 +12,59 @@
 #include "js/RootingAPI.h"
 
 class JSFatInlineString;
 
 namespace js {
 
 struct Class;
 
-// Allocate a new GC thing. After a successful allocation the caller must
-// fully initialize the thing before calling any function that can potentially
-// trigger GC. This will ensure that GC tracing never sees junk values stored
-// in the partially initialized thing.
-
+// Allocate a new GC thing that's not a JSObject or a string.
+//
+// After a successful allocation the caller must fully initialize the thing
+// before calling any function that can potentially trigger GC. This will ensure
+// that GC tracing never sees junk values stored in the partially initialized
+// thing.
 template <typename T, AllowGC allowGC = CanGC>
 T* Allocate(JSContext* cx);
 
-// Use for JSObject. A longer signature that includes additional information in
-// support of various optimizations. If dynamic slots are requested they will be
-// allocated and the pointer stored directly in |NativeObject::slots_|.
-template <typename, AllowGC allowGC = CanGC>
-JSObject* Allocate(JSContext* cx, gc::AllocKind kind, size_t nDynamicSlots,
-                   gc::InitialHeap heap, const Class* clasp);
+// Allocate a JSObject.
+//
+// A longer signature that includes additional information in support of various
+// optimizations. If dynamic slots are requested they will be allocated and the
+// pointer stored directly in |NativeObject::slots_|.
+template <AllowGC allowGC = CanGC>
+JSObject* AllocateObject(JSContext* cx, gc::AllocKind kind, size_t nDynamicSlots,
+                         gc::InitialHeap heap, const Class* clasp);
 
 // Internal function used for nursery-allocatable strings.
 template <typename StringAllocT, AllowGC allowGC = CanGC>
-StringAllocT* AllocateString(JSContext* cx, gc::InitialHeap heap);
+StringAllocT* AllocateStringImpl(JSContext* cx, gc::InitialHeap heap);
 
+// Allocate a string.
+//
 // Use for nursery-allocatable strings. Returns a value cast to the correct
 // type.
 template <typename StringT, AllowGC allowGC = CanGC>
-StringT* Allocate(JSContext* cx, gc::InitialHeap heap) {
-  return static_cast<StringT*>(js::AllocateString<JSString, allowGC>(cx, heap));
+StringT* AllocateString(JSContext* cx, gc::InitialHeap heap) {
+  return static_cast<StringT*>(AllocateStringImpl<JSString, allowGC>(cx, heap));
 }
 
 // Specialization for JSFatInlineString that must use a different allocation
 // type. Note that we have to explicitly specialize for both values of AllowGC
 // because partial function specialization is not allowed.
 template <>
-inline JSFatInlineString* Allocate<JSFatInlineString, CanGC>(
+inline JSFatInlineString* AllocateString<JSFatInlineString, CanGC>(
     JSContext* cx, gc::InitialHeap heap) {
   return static_cast<JSFatInlineString*>(
-      js::AllocateString<JSFatInlineString, CanGC>(cx, heap));
+      js::AllocateStringImpl<JSFatInlineString, CanGC>(cx, heap));
 }
 
 template <>
-inline JSFatInlineString* Allocate<JSFatInlineString, NoGC>(
+inline JSFatInlineString* AllocateString<JSFatInlineString, NoGC>(
     JSContext* cx, gc::InitialHeap heap) {
   return static_cast<JSFatInlineString*>(
-      js::AllocateString<JSFatInlineString, NoGC>(cx, heap));
+      js::AllocateStringImpl<JSFatInlineString, NoGC>(cx, heap));
 }
 
 }  // namespace js
 
 #endif  // gc_Allocator_h
--- a/js/src/jit/BaselineIC.cpp
+++ b/js/src/jit/BaselineIC.cpp
@@ -3663,18 +3663,19 @@ static bool TryAttachCallStub(JSContext*
       JitSpew(JitSpew_BaselineIC,
               "  Megamorphic Call_Native stubs. TODO: add Call_AnyNative!");
       return true;
     }
 
     bool isCrossRealm = cx->realm() != fun->realm();
 
     RootedObject templateObject(cx);
-    if (MOZ_LIKELY(!isSpread && !isSuper && !isCrossRealm)) {
+    if (MOZ_LIKELY(!isSpread && !isSuper)) {
       CallArgs args = CallArgsFromVp(argc, vp);
+      AutoRealm ar(cx, fun);
       if (!GetTemplateObjectForNative(cx, fun, args, &templateObject)) {
         return false;
       }
       MOZ_ASSERT_IF(templateObject,
                     !templateObject->group()
                          ->maybePreliminaryObjectsDontCheckGeneration());
     }
 
--- a/js/src/jit/CodeGenerator.cpp
+++ b/js/src/jit/CodeGenerator.cpp
@@ -2397,22 +2397,22 @@ void CreateDependentString::generate(Mac
     masm.PopRegsInMask(regsToSave);
   }
 
   masm.bind(&done);
 }
 
 static void* AllocateString(JSContext* cx) {
   AutoUnsafeCallWithABI unsafe;
-  return js::Allocate<JSString, NoGC>(cx, js::gc::TenuredHeap);
+  return js::AllocateString<JSString, NoGC>(cx, js::gc::TenuredHeap);
 }
 
 static void* AllocateFatInlineString(JSContext* cx) {
   AutoUnsafeCallWithABI unsafe;
-  return js::Allocate<JSFatInlineString, NoGC>(cx, js::gc::TenuredHeap);
+  return js::AllocateString<JSFatInlineString, NoGC>(cx, js::gc::TenuredHeap);
 }
 
 void CreateDependentString::generateFallback(MacroAssembler& masm) {
   JitSpew(JitSpew_Codegen,
           "# Emitting CreateDependentString fallback (encoding=%s)",
           (encoding_ == CharEncoding::Latin1 ? "Latin-1" : "Two-Byte"));
 
   LiveRegisterSet regsToSave(RegisterSet::Volatile());
@@ -2438,18 +2438,18 @@ void CreateDependentString::generateFall
 
     masm.jump(&joins_[kind]);
   }
 }
 
 static void* CreateMatchResultFallbackFunc(JSContext* cx, gc::AllocKind kind,
                                            size_t nDynamicSlots) {
   AutoUnsafeCallWithABI unsafe;
-  return js::Allocate<JSObject, NoGC>(cx, kind, nDynamicSlots, gc::DefaultHeap,
-                                      &ArrayObject::class_);
+  return js::AllocateObject<NoGC>(cx, kind, nDynamicSlots, gc::DefaultHeap,
+                                  &ArrayObject::class_);
 }
 
 static void CreateMatchResultFallback(MacroAssembler& masm, Register object,
                                       Register temp1, Register temp2,
                                       const TemplateObject& templateObject,
                                       Label* fail) {
   JitSpew(JitSpew_Codegen, "# Emitting CreateMatchResult fallback");
 
--- a/js/src/jit/IonBuilder.cpp
+++ b/js/src/jit/IonBuilder.cpp
@@ -405,16 +405,22 @@ IonBuilder::InliningDecision IonBuilder:
                       "but Tracelogger cannot do that yet.");
   }
 
   if (!target->isInterpreted()) {
     trackOptimizationOutcome(TrackedOutcome::CantInlineNotInterpreted);
     return DontInline(nullptr, "Non-interpreted target");
   }
 
+  // Never inline scripted cross-realm calls.
+  if (target->realm() != script()->realm()) {
+    trackOptimizationOutcome(TrackedOutcome::CantInlineCrossRealm);
+    return DontInline(nullptr, "Cross-realm call");
+  }
+
   if (info().analysisMode() != Analysis_DefiniteProperties) {
     // If |this| or an argument has an empty resultTypeSet, don't bother
     // inlining, as the call is currently unreachable due to incomplete type
     // information. This does not apply to the definite properties analysis,
     // in that case we want to inline anyway.
 
     if (callInfo.thisArg()->emptyResultTypeSet()) {
       trackOptimizationOutcome(TrackedOutcome::CantInlineUnreachable);
@@ -4260,22 +4266,16 @@ MDefinition* IonBuilder::patchInlinedRet
 IonBuilder::InliningDecision IonBuilder::makeInliningDecision(
     JSObject* targetArg, CallInfo& callInfo) {
   // When there is no target, inlining is impossible.
   if (targetArg == nullptr) {
     trackOptimizationOutcome(TrackedOutcome::CantInlineNoTarget);
     return InliningDecision_DontInline;
   }
 
-  // Don't inline (native or scripted) cross-realm calls.
-  Realm* targetRealm = JS::GetObjectRealmOrNull(targetArg);
-  if (!targetRealm || targetRealm != script()->realm()) {
-    return InliningDecision_DontInline;
-  }
-
   // Inlining non-function targets is handled by inlineNonFunctionCall().
   if (!targetArg->is<JSFunction>()) {
     return InliningDecision_Inline;
   }
 
   JSFunction* target = &targetArg->as<JSFunction>();
 
   // Never inline during the arguments usage analysis.
--- a/js/src/jit/IonBuilder.h
+++ b/js/src/jit/IonBuilder.h
@@ -707,17 +707,17 @@ class IonBuilder : public MIRGenerator,
   // Native inlining helpers.
   // The typeset for the return value of our function.  These are
   // the types it's been observed returning in the past.
   TemporaryTypeSet* getInlineReturnTypeSet();
   // The known MIR type of getInlineReturnTypeSet.
   MIRType getInlineReturnType();
 
   // Array natives.
-  InliningResult inlineArray(CallInfo& callInfo);
+  InliningResult inlineArray(CallInfo& callInfo, Realm* targetRealm);
   InliningResult inlineArrayIsArray(CallInfo& callInfo);
   InliningResult inlineArrayPopShift(CallInfo& callInfo,
                                      MArrayPopShift::Mode mode);
   InliningResult inlineArrayPush(CallInfo& callInfo);
   InliningResult inlineArraySlice(CallInfo& callInfo);
   InliningResult inlineArrayJoin(CallInfo& callInfo);
 
   // Boolean natives.
--- a/js/src/jit/MCallOptimize.cpp
+++ b/js/src/jit/MCallOptimize.cpp
@@ -44,16 +44,182 @@ using mozilla::AssertedCast;
 using mozilla::Maybe;
 
 using JS::DoubleNaNValue;
 using JS::TrackedOutcome;
 
 namespace js {
 namespace jit {
 
+// Returns true if |native| can be inlined cross-realm. Especially inlined
+// natives that can allocate objects or throw exceptions shouldn't be inlined
+// cross-realm without a careful analysis because we might use the wrong realm!
+//
+// Note that self-hosting intrinsics are never called cross-realm. See the
+// MOZ_CRASH below.
+//
+// If you are adding a new inlinable native, the safe thing is to |return false|
+// here.
+static bool CanInlineCrossRealm(InlinableNative native) {
+  switch (native) {
+    case InlinableNative::MathAbs:
+    case InlinableNative::MathFloor:
+    case InlinableNative::MathCeil:
+    case InlinableNative::MathRound:
+    case InlinableNative::MathClz32:
+    case InlinableNative::MathSqrt:
+    case InlinableNative::MathATan2:
+    case InlinableNative::MathHypot:
+    case InlinableNative::MathMax:
+    case InlinableNative::MathMin:
+    case InlinableNative::MathPow:
+    case InlinableNative::MathImul:
+    case InlinableNative::MathFRound:
+    case InlinableNative::MathTrunc:
+    case InlinableNative::MathSign:
+    case InlinableNative::MathSin:
+    case InlinableNative::MathTan:
+    case InlinableNative::MathCos:
+    case InlinableNative::MathExp:
+    case InlinableNative::MathLog:
+    case InlinableNative::MathASin:
+    case InlinableNative::MathATan:
+    case InlinableNative::MathACos:
+    case InlinableNative::MathLog10:
+    case InlinableNative::MathLog2:
+    case InlinableNative::MathLog1P:
+    case InlinableNative::MathExpM1:
+    case InlinableNative::MathCosH:
+    case InlinableNative::MathSinH:
+    case InlinableNative::MathTanH:
+    case InlinableNative::MathACosH:
+    case InlinableNative::MathASinH:
+    case InlinableNative::MathATanH:
+    case InlinableNative::MathCbrt:
+    case InlinableNative::Boolean:
+      return true;
+
+    case InlinableNative::Array:
+      // Cross-realm case handled by inlineArray.
+      return true;
+
+    case InlinableNative::MathRandom:
+      // RNG state is per-realm.
+      return false;
+
+    case InlinableNative::IntlGuardToCollator:
+    case InlinableNative::IntlGuardToDateTimeFormat:
+    case InlinableNative::IntlGuardToNumberFormat:
+    case InlinableNative::IntlGuardToPluralRules:
+    case InlinableNative::IntlGuardToRelativeTimeFormat:
+    case InlinableNative::IsRegExpObject:
+    case InlinableNative::RegExpMatcher:
+    case InlinableNative::RegExpSearcher:
+    case InlinableNative::RegExpTester:
+    case InlinableNative::RegExpPrototypeOptimizable:
+    case InlinableNative::RegExpInstanceOptimizable:
+    case InlinableNative::GetFirstDollarIndex:
+    case InlinableNative::IntrinsicNewArrayIterator:
+    case InlinableNative::IntrinsicNewStringIterator:
+    case InlinableNative::IntrinsicNewRegExpStringIterator:
+    case InlinableNative::IntrinsicStringReplaceString:
+    case InlinableNative::IntrinsicStringSplitString:
+    case InlinableNative::IntrinsicUnsafeSetReservedSlot:
+    case InlinableNative::IntrinsicUnsafeGetReservedSlot:
+    case InlinableNative::IntrinsicUnsafeGetObjectFromReservedSlot:
+    case InlinableNative::IntrinsicUnsafeGetInt32FromReservedSlot:
+    case InlinableNative::IntrinsicUnsafeGetStringFromReservedSlot:
+    case InlinableNative::IntrinsicUnsafeGetBooleanFromReservedSlot:
+    case InlinableNative::IntrinsicIsCallable:
+    case InlinableNative::IntrinsicIsConstructor:
+    case InlinableNative::IntrinsicToObject:
+    case InlinableNative::IntrinsicIsObject:
+    case InlinableNative::IntrinsicIsCrossRealmArrayConstructor:
+    case InlinableNative::IntrinsicToInteger:
+    case InlinableNative::IntrinsicToString:
+    case InlinableNative::IntrinsicIsConstructing:
+    case InlinableNative::IntrinsicSubstringKernel:
+    case InlinableNative::IntrinsicGuardToArrayIterator:
+    case InlinableNative::IntrinsicGuardToMapIterator:
+    case InlinableNative::IntrinsicGuardToSetIterator:
+    case InlinableNative::IntrinsicGuardToStringIterator:
+    case InlinableNative::IntrinsicGuardToRegExpStringIterator:
+    case InlinableNative::IntrinsicObjectHasPrototype:
+    case InlinableNative::IntrinsicFinishBoundFunctionInit:
+    case InlinableNative::IntrinsicIsPackedArray:
+    case InlinableNative::IntrinsicGuardToMapObject:
+    case InlinableNative::IntrinsicGetNextMapEntryForIterator:
+    case InlinableNative::IntrinsicGuardToSetObject:
+    case InlinableNative::IntrinsicGetNextSetEntryForIterator:
+    case InlinableNative::IntrinsicGuardToArrayBuffer:
+    case InlinableNative::IntrinsicArrayBufferByteLength:
+    case InlinableNative::IntrinsicPossiblyWrappedArrayBufferByteLength:
+    case InlinableNative::IntrinsicGuardToSharedArrayBuffer:
+    case InlinableNative::IntrinsicIsTypedArrayConstructor:
+    case InlinableNative::IntrinsicIsTypedArray:
+    case InlinableNative::IntrinsicIsPossiblyWrappedTypedArray:
+    case InlinableNative::IntrinsicPossiblyWrappedTypedArrayLength:
+    case InlinableNative::IntrinsicTypedArrayLength:
+    case InlinableNative::IntrinsicTypedArrayByteOffset:
+    case InlinableNative::IntrinsicTypedArrayElementShift:
+    case InlinableNative::IntrinsicSetDisjointTypedElements:
+    case InlinableNative::IntrinsicObjectIsTypedObject:
+    case InlinableNative::IntrinsicObjectIsTransparentTypedObject:
+    case InlinableNative::IntrinsicObjectIsOpaqueTypedObject:
+    case InlinableNative::IntrinsicObjectIsTypeDescr:
+    case InlinableNative::IntrinsicTypeDescrIsSimpleType:
+    case InlinableNative::IntrinsicTypeDescrIsArrayType:
+    case InlinableNative::IntrinsicSetTypedObjectOffset:
+    case InlinableNative::IntrinsicArrayIteratorPrototypeOptimizable:
+      MOZ_CRASH("Unexpected cross-realm intrinsic call");
+
+    case InlinableNative::TestBailout:
+    case InlinableNative::TestAssertFloat32:
+    case InlinableNative::TestAssertRecoveredOnBailout:
+      // Testing functions, not worth inlining cross-realm.
+      return false;
+
+    case InlinableNative::ArrayIsArray:
+    case InlinableNative::ArrayJoin:
+    case InlinableNative::ArrayPop:
+    case InlinableNative::ArrayShift:
+    case InlinableNative::ArrayPush:
+    case InlinableNative::ArraySlice:
+    case InlinableNative::AtomicsCompareExchange:
+    case InlinableNative::AtomicsExchange:
+    case InlinableNative::AtomicsLoad:
+    case InlinableNative::AtomicsStore:
+    case InlinableNative::AtomicsAdd:
+    case InlinableNative::AtomicsSub:
+    case InlinableNative::AtomicsAnd:
+    case InlinableNative::AtomicsOr:
+    case InlinableNative::AtomicsXor:
+    case InlinableNative::AtomicsIsLockFree:
+    case InlinableNative::ReflectGetPrototypeOf:
+    case InlinableNative::String:
+    case InlinableNative::StringCharCodeAt:
+    case InlinableNative::StringFromCharCode:
+    case InlinableNative::StringFromCodePoint:
+    case InlinableNative::StringCharAt:
+    case InlinableNative::StringToLowerCase:
+    case InlinableNative::StringToUpperCase:
+    case InlinableNative::Object:
+    case InlinableNative::ObjectCreate:
+    case InlinableNative::ObjectIs:
+    case InlinableNative::ObjectToString:
+    case InlinableNative::TypedArrayConstructor:
+      // Default to false for most natives.
+      return false;
+
+    case InlinableNative::Limit:
+      break;
+  }
+  MOZ_CRASH("Unknown native");
+}
+
 IonBuilder::InliningResult IonBuilder::inlineNativeCall(CallInfo& callInfo,
                                                         JSFunction* target) {
   MOZ_ASSERT(target->isNative());
 
   if (!optimizationInfo().inlineNative()) {
     trackOptimizationOutcome(TrackedOutcome::CantInlineDisabledIon);
     return InliningStatus_NotInlined;
   }
@@ -86,20 +252,27 @@ IonBuilder::InliningResult IonBuilder::i
       return InliningStatus_NotInlined;
     }
   }
 
   if (isWasmCall) {
     return inlineWasmCall(callInfo, target);
   }
 
-  switch (InlinableNative inlNative = target->jitInfo()->inlinableNative) {
+  InlinableNative inlNative = target->jitInfo()->inlinableNative;
+
+  if (target->realm() != script()->realm() && !CanInlineCrossRealm(inlNative)) {
+    trackOptimizationOutcome(TrackedOutcome::CantInlineCrossRealm);
+    return InliningStatus_NotInlined;
+  }
+
+  switch (inlNative) {
     // Array natives.
     case InlinableNative::Array:
-      return inlineArray(callInfo);
+      return inlineArray(callInfo, target->realm());
     case InlinableNative::ArrayIsArray:
       return inlineArrayIsArray(callInfo);
     case InlinableNative::ArrayJoin:
       return inlineArrayJoin(callInfo);
     case InlinableNative::ArrayPop:
       return inlineArrayPopShift(callInfo, MArrayPopShift::Pop);
     case InlinableNative::ArrayShift:
       return inlineArrayPopShift(callInfo, MArrayPopShift::Shift);
@@ -420,16 +593,18 @@ IonBuilder::InliningResult IonBuilder::i
   MDefinition* thisArg = callInfo.thisArg();
   TemporaryTypeSet* thisTypes = thisArg->resultTypeSet();
   MOZ_ASSERT(callInfo.argc() == 0);
 
   if (!thisTypes) {
     return InliningStatus_NotInlined;
   }
 
+  // Note: target might be a cross-realm native!
+
   // Try to optimize typed array lengths.
   if (TypedArrayObject::isOriginalLengthGetter(native)) {
     if (thisTypes->forAllClasses(constraints(), IsTypedArrayClass) !=
         TemporaryTypeSet::ForAllResult::ALL_TRUE) {
       return InliningStatus_NotInlined;
     }
 
     MInstruction* length = addTypedArrayLength(thisArg);
@@ -475,25 +650,29 @@ IonBuilder::InliningResult IonBuilder::i
   return InliningStatus_NotInlined;
 }
 
 IonBuilder::InliningResult IonBuilder::inlineNonFunctionCall(CallInfo& callInfo,
                                                              JSObject* target) {
   // Inline a call to a non-function object, invoking the object's call or
   // construct hook.
 
-  MOZ_ASSERT(target->nonCCWRealm() == script()->realm());
-
   // Don't inline if we're constructing and new.target != callee. This can
   // happen with Reflect.construct or derived class constructors.
   if (callInfo.constructing() && callInfo.getNewTarget() != callInfo.fun()) {
     trackOptimizationOutcome(TrackedOutcome::CantInlineUnexpectedNewTarget);
     return InliningStatus_NotInlined;
   }
 
+  Realm* targetRealm = JS::GetObjectRealmOrNull(target);
+  if (!targetRealm || targetRealm != script()->realm()) {
+    trackOptimizationOutcome(TrackedOutcome::CantInlineCrossRealm);
+    return InliningStatus_NotInlined;
+  }
+
   if (callInfo.constructing() &&
       target->constructHook() == TypedObject::construct) {
     return inlineConstructTypedObject(callInfo, &target->as<TypeDescr>());
   }
 
   return InliningStatus_NotInlined;
 }
 
@@ -528,31 +707,37 @@ IonBuilder::InliningResult IonBuilder::i
 
   MMathFunction* ins =
       MMathFunction::New(alloc(), callInfo.getArg(0), function);
   current->add(ins);
   current->push(ins);
   return InliningStatus_Inlined;
 }
 
-IonBuilder::InliningResult IonBuilder::inlineArray(CallInfo& callInfo) {
+IonBuilder::InliningResult IonBuilder::inlineArray(CallInfo& callInfo,
+                                                   Realm* targetRealm) {
   uint32_t initLength = 0;
 
   JSObject* templateObject =
       inspector->getTemplateObjectForNative(pc, ArrayConstructor);
   // This is shared by ArrayConstructor and array_construct (std_Array).
   if (!templateObject) {
     templateObject = inspector->getTemplateObjectForNative(pc, array_construct);
   }
 
   if (!templateObject) {
     trackOptimizationOutcome(TrackedOutcome::CantInlineNativeNoTemplateObj);
     return InliningStatus_NotInlined;
   }
 
+  if (templateObject->nonCCWRealm() != targetRealm) {
+    trackOptimizationOutcome(TrackedOutcome::CantInlineCrossRealm);
+    return InliningStatus_NotInlined;
+  }
+
   // Multiple arguments imply array initialization, not just construction.
   if (callInfo.argc() >= 2) {
     initLength = callInfo.argc();
 
     TypeSet::ObjectKey* key = TypeSet::ObjectKey::get(templateObject);
     if (!key->unknownProperties()) {
       HeapTypeSetKey elemTypes = key->property(JSID_VOID);
 
@@ -4135,24 +4320,28 @@ IonBuilder::InliningResult IonBuilder::i
   current->push(ins);
 
   return InliningStatus_Inlined;
 }
 
 IonBuilder::InliningResult IonBuilder::inlineWasmCall(CallInfo& callInfo,
                                                       JSFunction* target) {
   MOZ_ASSERT(target->isWasmOptimized());
-  MOZ_ASSERT(target->realm() == script()->realm());
 
   // Don't inline wasm constructors.
   if (callInfo.constructing()) {
     trackOptimizationOutcome(TrackedOutcome::CantInlineNativeBadForm);
     return InliningStatus_NotInlined;
   }
 
+  if (target->realm() != script()->realm()) {
+    trackOptimizationOutcome(TrackedOutcome::CantInlineCrossRealm);
+    return InliningStatus_NotInlined;
+  }
+
   wasm::Instance& inst = wasm::ExportedFunctionToInstance(target);
   uint32_t funcIndex = inst.code().getFuncIndex(target);
 
   auto bestTier = inst.code().bestTier();
   const wasm::FuncExport& funcExport =
       inst.metadata(bestTier).lookupFuncExport(funcIndex);
   const wasm::FuncType& sig = funcExport.funcType();
 
--- a/js/src/rust/Cargo.toml
+++ b/js/src/rust/Cargo.toml
@@ -3,10 +3,16 @@ name = "jsrust"
 version = "0.1.0"
 authors = ["The Spidermonkey developers"]
 
 [lib]
 name = "jsrust"
 crate-type = ["staticlib"]
 path = "lib.rs"
 
+[features]
+cranelift_x86 = ['jsrust_shared/cranelift_x86']
+cranelift_arm32 = ['jsrust_shared/cranelift_arm32']
+cranelift_arm64 = ['jsrust_shared/cranelift_arm64']
+cranelift_none = ['jsrust_shared/cranelift_none']
+
 [dependencies]
 jsrust_shared = { path = "./shared" }
--- a/js/src/rust/moz.build
+++ b/js/src/rust/moz.build
@@ -1,15 +1,26 @@
 # -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
 # vim: set filetype=python:
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
-RustLibrary('jsrust')
+features = []
+
+if CONFIG['JS_CODEGEN_X64'] or CONFIG['JS_CODEGEN_X86']:
+    features += ['cranelift_x86']
+elif CONFIG['JS_CODEGEN_ARM']:
+    features += ['cranelift_arm32']
+elif CONFIG['JS_CODEGEN_ARM64']:
+    features += ['cranelift_arm64']
+else:
+    features += ['cranelift_none']
+
+RustLibrary('jsrust', features)
 
 CONFIGURE_SUBST_FILES += ['extra-bindgen-flags']
 
 if CONFIG['JS_SHARED_LIBRARY']:
     FINAL_LIBRARY = 'js'
 
 if CONFIG['OS_ARCH'] == 'Darwin':
     # The Rust standard library references libresolv on macOS, so we need to
--- a/js/src/rust/shared/Cargo.toml
+++ b/js/src/rust/shared/Cargo.toml
@@ -7,11 +7,17 @@ authors = ["The Spidermonkey developers"
 crate-type = ["rlib"]
 name = "jsrust_shared"
 path = "lib.rs"
 
 [dependencies]
 baldrdash = { path = "../../wasm/cranelift" }
 mozilla-central-workspace-hack = { path = "../../../../build/workspace-hack" }
 
+[features]
+cranelift_x86 = ['baldrdash/cranelift_x86']
+cranelift_arm32 = ['baldrdash/cranelift_arm32']
+cranelift_arm64 = ['baldrdash/cranelift_arm64']
+cranelift_none = ['baldrdash/cranelift_none']
+
 # Uncomment this to enable perf support in release mode.
 #[profile.release]
 #debug = true
--- a/js/src/vm/ArrayObject-inl.h
+++ b/js/src/vm/ArrayObject-inl.h
@@ -43,17 +43,17 @@ inline void ArrayObject::setLength(JSCon
   MOZ_ASSERT_IF(group->hasUnanalyzedPreliminaryObjects(),
                 heap == js::gc::TenuredHeap);
 
   // Arrays can use their fixed slots to store elements, so can't have shapes
   // which allow named properties to be stored in the fixed slots.
   MOZ_ASSERT(shape->numFixedSlots() == 0);
 
   size_t nDynamicSlots = dynamicSlotsCount(0, shape->slotSpan(), clasp);
-  JSObject* obj = js::Allocate<JSObject>(cx, kind, nDynamicSlots, heap, clasp);
+  JSObject* obj = js::AllocateObject(cx, kind, nDynamicSlots, heap, clasp);
   if (!obj) {
     return nullptr;
   }
 
   ArrayObject* aobj = static_cast<ArrayObject*>(obj);
   aobj->initGroup(group);
   aobj->initShape(shape);
   // NOTE: Dynamic slots are created internally by Allocate<JSObject>.
--- a/js/src/vm/Caches-inl.h
+++ b/js/src/vm/Caches-inl.h
@@ -68,18 +68,18 @@ inline NativeObject* NewObjectCache::new
     }
   }
 
   if (cx->runtime()->gc.upcomingZealousGC()) {
     return nullptr;
   }
 
   NativeObject* obj = static_cast<NativeObject*>(
-      Allocate<JSObject, NoGC>(cx, entry->kind,
-                               /* nDynamicSlots = */ 0, heap, group->clasp()));
+      AllocateObject<NoGC>(cx, entry->kind, /* nDynamicSlots = */ 0,
+                           heap, group->clasp()));
   if (!obj) {
     return nullptr;
   }
 
   copyCachedToObject(obj, templateObj, entry->kind);
 
   if (group->clasp()->shouldDelayMetadataBuilder()) {
     cx->realm()->setObjectPendingMetadata(cx, obj);
--- a/js/src/vm/Interpreter.cpp
+++ b/js/src/vm/Interpreter.cpp
@@ -5232,16 +5232,17 @@ JSObject* js::CreateThisWithTemplate(JSC
   }
 
   return NewObjectOperationWithTemplate(cx, templateObject);
 }
 
 JSObject* js::NewArrayOperation(JSContext* cx, HandleScript script,
                                 jsbytecode* pc, uint32_t length,
                                 NewObjectKind newKind /* = GenericObject */) {
+  MOZ_ASSERT(*pc == JSOP_NEWARRAY);
   MOZ_ASSERT(newKind != SingletonObject);
 
   RootedObjectGroup group(cx);
   if (ObjectGroup::useSingletonForAllocationSite(script, pc, JSProto_Array)) {
     newKind = SingletonObject;
   } else {
     group = ObjectGroup::allocationSiteGroup(cx, script, pc, JSProto_Array);
     if (!group) {
--- a/js/src/vm/JSFunction-inl.h
+++ b/js/src/vm/JSFunction-inl.h
@@ -108,18 +108,17 @@ inline JSFunction* CloneFunctionObjectIf
 
   const js::Class* clasp = group->clasp();
   MOZ_ASSERT(clasp->isJSFunction());
 
   static constexpr size_t NumDynamicSlots = 0;
   MOZ_ASSERT(dynamicSlotsCount(shape->numFixedSlots(), shape->slotSpan(),
                                clasp) == NumDynamicSlots);
 
-  JSObject* obj =
-      js::Allocate<JSObject>(cx, kind, NumDynamicSlots, heap, clasp);
+  JSObject* obj = js::AllocateObject(cx, kind, NumDynamicSlots, heap, clasp);
   if (!obj) {
     return cx->alreadyReportedOOM();
   }
 
   NativeObject* nobj = static_cast<NativeObject*>(obj);
   nobj->initGroup(group);
   nobj->initShape(shape);
 
--- a/js/src/vm/NativeObject-inl.h
+++ b/js/src/vm/NativeObject-inl.h
@@ -483,17 +483,17 @@ inline bool NativeObject::isInWholeCellB
 
   const js::Class* clasp = group->clasp();
   MOZ_ASSERT(clasp->isNative());
   MOZ_ASSERT(!clasp->isJSFunction(), "should use JSFunction::create");
 
   size_t nDynamicSlots =
       dynamicSlotsCount(shape->numFixedSlots(), shape->slotSpan(), clasp);
 
-  JSObject* obj = js::Allocate<JSObject>(cx, kind, nDynamicSlots, heap, clasp);
+  JSObject* obj = js::AllocateObject(cx, kind, nDynamicSlots, heap, clasp);
   if (!obj) {
     return cx->alreadyReportedOOM();
   }
 
   NativeObject* nobj = static_cast<NativeObject*>(obj);
   nobj->initGroup(group);
   nobj->initShape(shape);
   // NOTE: Dynamic slots are created internally by Allocate<JSObject>.
--- a/js/src/vm/ProxyObject.cpp
+++ b/js/src/vm/ProxyObject.cpp
@@ -182,18 +182,18 @@ void ProxyObject::nuke() {
 
     MOZ_ASSERT(group->realm() == realm);
     realm->newProxyCache.add(group, shape);
   }
 
   gc::InitialHeap heap = GetInitialHeap(newKind, clasp);
   debugCheckNewObject(group, shape, allocKind, heap);
 
-  JSObject* obj = js::Allocate<JSObject>(cx, allocKind, /* nDynamicSlots = */ 0,
-                                         heap, clasp);
+  JSObject* obj = js::AllocateObject(cx, allocKind, /* nDynamicSlots = */ 0,
+                                     heap, clasp);
   if (!obj) {
     return cx->alreadyReportedOOM();
   }
 
   ProxyObject* pobj = static_cast<ProxyObject*>(obj);
   pobj->initGroup(group);
   pobj->initShape(shape);
 
--- a/js/src/vm/StringType-inl.h
+++ b/js/src/vm/StringType-inl.h
@@ -154,17 +154,17 @@ template <js::AllowGC allowGC>
 MOZ_ALWAYS_INLINE JSRope* JSRope::new_(
     JSContext* cx,
     typename js::MaybeRooted<JSString*, allowGC>::HandleType left,
     typename js::MaybeRooted<JSString*, allowGC>::HandleType right,
     size_t length, js::gc::InitialHeap heap) {
   if (!validateLength(cx, length)) {
     return nullptr;
   }
-  JSRope* str = js::Allocate<JSRope, allowGC>(cx, heap);
+  JSRope* str = js::AllocateString<JSRope, allowGC>(cx, heap);
   if (!str) {
     return nullptr;
   }
   str->init(cx, left, right, length);
   return str;
 }
 
 MOZ_ALWAYS_INLINE void JSDependentString::init(JSContext* cx,
@@ -215,25 +215,25 @@ MOZ_ALWAYS_INLINE JSLinearString* JSDepe
                : js::NewInlineString<char16_t>(cx, base, start, length);
   }
 
   if (baseArg->isExternal() && !baseArg->ensureFlat(cx)) {
     return nullptr;
   }
 
   JSDependentString* str =
-      js::Allocate<JSDependentString, js::NoGC>(cx, js::gc::DefaultHeap);
+      js::AllocateString<JSDependentString, js::NoGC>(cx, js::gc::DefaultHeap);
   if (str) {
     str->init(cx, baseArg, start, length);
     return str;
   }
 
   js::RootedLinearString base(cx, baseArg);
 
-  str = js::Allocate<JSDependentString>(cx, js::gc::DefaultHeap);
+  str = js::AllocateString<JSDependentString>(cx, js::gc::DefaultHeap);
   if (!str) {
     return nullptr;
   }
   str->init(cx, base, start, length);
   return str;
 }
 
 MOZ_ALWAYS_INLINE void JSFlatString::init(const char16_t* chars,
@@ -257,17 +257,17 @@ MOZ_ALWAYS_INLINE JSFlatString* JSFlatSt
   if (!validateLength(cx, length)) {
     return nullptr;
   }
 
   JSFlatString* str;
   if (cx->zone()->isAtomsZone()) {
     str = js::Allocate<js::NormalAtom, allowGC>(cx);
   } else {
-    str = js::Allocate<JSFlatString, allowGC>(cx, js::gc::DefaultHeap);
+    str = js::AllocateString<JSFlatString, allowGC>(cx, js::gc::DefaultHeap);
   }
   if (!str) {
     return nullptr;
   }
 
   if (!str->isTenured()) {
     // The chars pointer is only considered to be handed over to this
     // function on a successful return. If the following registration
@@ -303,26 +303,26 @@ inline js::PropertyName* JSFlatString::t
 }
 
 template <js::AllowGC allowGC>
 MOZ_ALWAYS_INLINE JSThinInlineString* JSThinInlineString::new_(JSContext* cx) {
   if (cx->zone()->isAtomsZone()) {
     return (JSThinInlineString*)(js::Allocate<js::NormalAtom, allowGC>(cx));
   }
 
-  return js::Allocate<JSThinInlineString, allowGC>(cx, js::gc::DefaultHeap);
+  return js::AllocateString<JSThinInlineString, allowGC>(cx, js::gc::DefaultHeap);
 }
 
 template <js::AllowGC allowGC>
 MOZ_ALWAYS_INLINE JSFatInlineString* JSFatInlineString::new_(JSContext* cx) {
   if (cx->zone()->isAtomsZone()) {
     return (JSFatInlineString*)(js::Allocate<js::FatInlineAtom, allowGC>(cx));
   }
 
-  return js::Allocate<JSFatInlineString, allowGC>(cx, js::gc::DefaultHeap);
+  return js::AllocateString<JSFatInlineString, allowGC>(cx, js::gc::DefaultHeap);
 }
 
 template <>
 MOZ_ALWAYS_INLINE JS::Latin1Char* JSThinInlineString::init<JS::Latin1Char>(
     size_t length) {
   MOZ_ASSERT(lengthFits<JS::Latin1Char>(length));
   setLengthAndFlags(length, INIT_THIN_INLINE_FLAGS | LATIN1_CHARS_BIT);
   return d.inlineStorageLatin1;
--- a/js/src/vm/UnboxedObject.cpp
+++ b/js/src/vm/UnboxedObject.cpp
@@ -841,17 +841,17 @@ NativeObject* UnboxedPlainObject::conver
   MOZ_ASSERT(clasp == &UnboxedPlainObject::class_);
 
   MOZ_ASSERT(CanBeFinalizedInBackground(kind, clasp));
   kind = GetBackgroundAllocKind(kind);
 
   debugCheckNewObject(group, /* shape = */ nullptr, kind, heap);
 
   JSObject* obj =
-      js::Allocate<JSObject>(cx, kind, /* nDynamicSlots = */ 0, heap, clasp);
+      js::AllocateObject(cx, kind, /* nDynamicSlots = */ 0, heap, clasp);
   if (!obj) {
     return cx->alreadyReportedOOM();
   }
 
   UnboxedObject* uobj = static_cast<UnboxedObject*>(obj);
   uobj->initGroup(group);
 
   MOZ_ASSERT(clasp->shouldDelayMetadataBuilder());
--- a/js/src/wasm/cranelift/Cargo.toml
+++ b/js/src/wasm/cranelift/Cargo.toml
@@ -3,20 +3,30 @@ name = "baldrdash"
 version = "0.1.0"
 authors = ["The Spidermonkey and Cranelift developers"]
 
 [lib]
 crate-type = ["rlib"]
 name = "baldrdash"
 
 [dependencies]
-cranelift-codegen = "0.29.0"
+cranelift-codegen = { version = "0.29.0", default-features = false }
 cranelift-wasm = "0.29.0"
 target-lexicon = "0.2.0"
 log = { version = "0.4.6", default-features = false, features = ["release_max_level_info"] }
 env_logger = "0.5.6"
 
 [build-dependencies]
 bindgen = {version = "0.43", default-features = false} # disable `logging` to reduce code size
 
+[features]
+default = ['cranelift-codegen/std']
+cranelift_x86 = ['cranelift-codegen/x86']
+cranelift_arm32 = ['cranelift-codegen/arm32']
+cranelift_arm64 = ['cranelift-codegen/arm64']
+
+# The "none" support is a lie (so far): Cranelift has to include support for
+# one ISA at the moment, so request to include support for a small one: riscv.
+cranelift_none = ['cranelift-codegen/riscv']
+
 # Uncomment this to enable perf support in release mode.
 #[profile.release]
 #debug = true
--- a/js/xpconnect/tests/chrome/test_xrayToJS.xul
+++ b/js/xpconnect/tests/chrome/test_xrayToJS.xul
@@ -237,21 +237,18 @@ https://bugzilla.mozilla.org/show_bug.cg
 
   gPrototypeProperties['Function'] =
     ["constructor", "toSource", "toString", "apply", "call", "bind",
      "length", "name", "arguments", "caller", Symbol.hasInstance];
   gConstructorProperties['Function'] = constructorProps([])
 
   gPrototypeProperties['RegExp'] =
     ["constructor", "toSource", "toString", "compile", "exec", "test",
-     Symbol.match, Symbol.replace, Symbol.search, Symbol.split,
+     Symbol.match, Symbol.matchAll, Symbol.replace, Symbol.search, Symbol.split,
      "flags", "global", "ignoreCase", "multiline", "source", "sticky", "unicode"];
-  if (isNightlyBuild) {
-    gPrototypeProperties['RegExp'].push(Symbol.matchAll);
-  }
   gConstructorProperties['RegExp'] =
     constructorProps(["input", "lastMatch", "lastParen",
                       "leftContext", "rightContext", "$1", "$2", "$3", "$4",
                       "$5", "$6", "$7", "$8", "$9", "$_", "$&", "$+",
                       "$`", "$'", Symbol.species])
 
   gPrototypeProperties['Promise'] =
     ["constructor", "catch", "then", "finally", Symbol.toStringTag];
--- a/layout/base/PresShell.cpp
+++ b/layout/base/PresShell.cpp
@@ -7755,72 +7755,74 @@ nsresult PresShell::EventHandler::Dispat
   MOZ_ASSERT(aEvent);
   MOZ_ASSERT(aEventStatus);
 
   // 1. Give event to event manager for pre event state changes and
   //    generation of synthetic events.
   nsresult rv = aEventStateManager->PreHandleEvent(
       GetPresContext(), aEvent, mPresShell->mCurrentEventFrame,
       mPresShell->mCurrentEventContent, aEventStatus, aOverrideClickTarget);
+  if (NS_FAILED(rv)) {
+    return rv;
+  }
 
   // 2. Give event to the DOM for third party and JS use.
-  if (NS_SUCCEEDED(rv)) {
-    bool wasHandlingKeyBoardEvent = nsContentUtils::IsHandlingKeyBoardEvent();
-    if (aEvent->mClass == eKeyboardEventClass) {
-      nsContentUtils::SetIsHandlingKeyBoardEvent(true);
-    }
-    // If EventStateManager or something wants reply from remote process and
-    // needs to win any other event listeners in chrome, the event is both
-    // stopped its propagation and marked as "waiting reply from remote
-    // process".  In this case, PresShell shouldn't dispatch the event into
-    // the DOM tree because they don't have a chance to stop propagation in
-    // the system event group.  On the other hand, if its propagation is not
-    // stopped, that means that the event may be reserved by chrome.  If it's
-    // reserved by chrome, the event shouldn't be sent to any remote
-    // processes.  In this case, PresShell needs to dispatch the event to
-    // the DOM tree for checking if it's reserved.
-    if (aEvent->IsAllowedToDispatchDOMEvent() &&
-        !(aEvent->PropagationStopped() &&
-          aEvent->IsWaitingReplyFromRemoteProcess())) {
-      MOZ_ASSERT(nsContentUtils::IsSafeToRunScript(),
-                 "Somebody changed aEvent to cause a DOM event!");
-      nsPresShellEventCB eventCB(mPresShell);
-      if (nsIFrame* target = mPresShell->GetCurrentEventFrame()) {
-        if (target->OnlySystemGroupDispatch(aEvent->mMessage)) {
-          aEvent->StopPropagation();
-        }
-      }
-      if (aEvent->mClass == eTouchEventClass) {
-        DispatchTouchEventToDOM(aEvent, aEventStatus, &eventCB, aTouchIsNew);
-      } else {
-        DispatchEventToDOM(aEvent, aEventStatus, &eventCB);
-      }
-    }
-
-    nsContentUtils::SetIsHandlingKeyBoardEvent(wasHandlingKeyBoardEvent);
-
-    if (aEvent->mMessage == ePointerUp || aEvent->mMessage == ePointerCancel) {
-      // Implicitly releasing capture for given pointer.
-      // ePointerLostCapture should be send after ePointerUp or
-      // ePointerCancel.
-      WidgetPointerEvent* pointerEvent = aEvent->AsPointerEvent();
-      MOZ_ASSERT(pointerEvent);
-      PointerEventHandler::ReleasePointerCaptureById(pointerEvent->pointerId);
-      PointerEventHandler::CheckPointerCaptureState(pointerEvent);
-    }
-
-    // 3. Give event to event manager for post event state changes and
-    //    generation of synthetic events.
-    if (!mPresShell->IsDestroying() && NS_SUCCEEDED(rv)) {
-      rv = aEventStateManager->PostHandleEvent(
-          GetPresContext(), aEvent, mPresShell->GetCurrentEventFrame(),
-          aEventStatus, aOverrideClickTarget);
-    }
-  }
-  return rv;
+  bool wasHandlingKeyBoardEvent = nsContentUtils::IsHandlingKeyBoardEvent();
+  if (aEvent->mClass == eKeyboardEventClass) {
+    nsContentUtils::SetIsHandlingKeyBoardEvent(true);
+  }
+  // If EventStateManager or something wants reply from remote process and
+  // needs to win any other event listeners in chrome, the event is both
+  // stopped its propagation and marked as "waiting reply from remote
+  // process".  In this case, PresShell shouldn't dispatch the event into
+  // the DOM tree because they don't have a chance to stop propagation in
+  // the system event group.  On the other hand, if its propagation is not
+  // stopped, that means that the event may be reserved by chrome.  If it's
+  // reserved by chrome, the event shouldn't be sent to any remote
+  // processes.  In this case, PresShell needs to dispatch the event to
+  // the DOM tree for checking if it's reserved.
+  if (aEvent->IsAllowedToDispatchDOMEvent() &&
+      !(aEvent->PropagationStopped() &&
+        aEvent->IsWaitingReplyFromRemoteProcess())) {
+    MOZ_ASSERT(nsContentUtils::IsSafeToRunScript(),
+               "Somebody changed aEvent to cause a DOM event!");
+    nsPresShellEventCB eventCB(mPresShell);
+    if (nsIFrame* target = mPresShell->GetCurrentEventFrame()) {
+      if (target->OnlySystemGroupDispatch(aEvent->mMessage)) {
+        aEvent->StopPropagation();
+      }
+    }
+    if (aEvent->mClass == eTouchEventClass) {
+      DispatchTouchEventToDOM(aEvent, aEventStatus, &eventCB, aTouchIsNew);
+    } else {
+      DispatchEventToDOM(aEvent, aEventStatus, &eventCB);
+    }
+  }
+
+  nsContentUtils::SetIsHandlingKeyBoardEvent(wasHandlingKeyBoardEvent);
+
+  if (aEvent->mMessage == ePointerUp || aEvent->mMessage == ePointerCancel) {
+    // Implicitly releasing capture for given pointer.
+    // ePointerLostCapture should be send after ePointerUp or
+    // ePointerCancel.
+    WidgetPointerEvent* pointerEvent = aEvent->AsPointerEvent();
+    MOZ_ASSERT(pointerEvent);
+    PointerEventHandler::ReleasePointerCaptureById(pointerEvent->pointerId);
+    PointerEventHandler::CheckPointerCaptureState(pointerEvent);
+  }
+
+  if (mPresShell->IsDestroying()) {
+    return NS_OK;
+  }
+
+  // 3. Give event to event manager for post event state changes and
+  //    generation of synthetic events.
+  return aEventStateManager->PostHandleEvent(
+      GetPresContext(), aEvent, mPresShell->GetCurrentEventFrame(),
+      aEventStatus, aOverrideClickTarget);
 }
 
 bool PresShell::EventHandler::PrepareToDispatchEvent(WidgetEvent* aEvent) {
   if (!aEvent->IsTrusted()) {
     return false;
   }
 
   if (aEvent->IsUserAction()) {
--- a/layout/painting/nsDisplayList.cpp
+++ b/layout/painting/nsDisplayList.cpp
@@ -2750,31 +2750,27 @@ already_AddRefed<LayerManager> nsDisplay
     // we don't need to worry about END_NO_COMPOSITE.
     if (aBuilder->WillComputePluginGeometry()) {
       flags = LayerManager::END_NO_REMOTE_COMPOSITE;
     }
   }
 
   MaybeSetupTransactionIdAllocator(layerManager, presContext);
 
-  // Store the existing layer builder to reinstate it on return.
-  FrameLayerBuilder* oldBuilder = layerManager->GetLayerBuilder();
-  FrameLayerBuilder* layerBuilder = nullptr;
-
   bool sent = false;
   if (aFlags & PAINT_IDENTICAL_DISPLAY_LIST) {
     sent = layerManager->EndEmptyTransaction(flags);
   }
 
   if (!sent) {
-    layerBuilder =
+    FrameLayerBuilder* layerBuilder =
         BuildLayers(aBuilder, layerManager, aFlags, widgetTransaction);
 
     if (!layerBuilder) {
-      layerManager->SetUserData(&gLayerManagerLayerBuilder, oldBuilder);
+      layerManager->SetUserData(&gLayerManagerLayerBuilder, nullptr);
       return nullptr;
     }
 
     // If this is the content process, we ship plugin geometry updates over with
     // layer updates, so calculate that now before we call EndTransaction.
     nsRootPresContext* rootPresContext = presContext->GetRootPresContext();
     if (rootPresContext && XRE_IsContentProcess()) {
       if (aBuilder->WillComputePluginGeometry()) {
@@ -2832,17 +2828,17 @@ already_AddRefed<LayerManager> nsDisplay
         presContext->NotifyInvalidation(layerManager->GetLastTransactionId(),
                                         bounds);
       }
     } else if (shouldInvalidate) {
       view->GetViewManager()->InvalidateView(view);
     }
   }
 
-  layerManager->SetUserData(&gLayerManagerLayerBuilder, oldBuilder);
+  layerManager->SetUserData(&gLayerManagerLayerBuilder, nullptr);
   return layerManager.forget();
 }
 
 nsDisplayItem* nsDisplayList::RemoveBottom() {
   nsDisplayItem* item = mSentinel.mAbove;
   if (!item) return nullptr;
   mSentinel.mAbove = item->mAbove;
   if (item == mTop) {
--- a/mobile/android/app/src/main/res/xml/search_widget_info.xml
+++ b/mobile/android/app/src/main/res/xml/search_widget_info.xml
@@ -7,13 +7,12 @@
 <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
     android:configure="org.mozilla.gecko.search.SearchWidgetConfigurationActivity"
     android:initialLayout="@layout/widget_search_default_col_layout"
     android:minWidth="360dp"
     android:minHeight="40dp"
     android:minResizeWidth="64dp"
     android:minResizeHeight="40dp"
     android:previewImage="@drawable/search_widget_preview"
-    android:resizeMode="horizontal"
-    android:updatePeriodMillis="300000">
+    android:resizeMode="horizontal">
 
 </appwidget-provider>
 
--- a/mobile/android/base/java/org/mozilla/gecko/LauncherActivity.java
+++ b/mobile/android/base/java/org/mozilla/gecko/LauncherActivity.java
@@ -7,16 +7,17 @@ package org.mozilla.gecko;
 
 import android.app.Activity;
 import android.app.PendingIntent;
 import android.appwidget.AppWidgetManager;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
 import android.net.Uri;
+import android.os.Build;
 import android.os.Bundle;
 import android.support.annotation.NonNull;
 import android.support.customtabs.CustomTabsIntent;
 import android.util.Log;
 
 import org.mozilla.gecko.home.HomeConfig;
 import org.mozilla.gecko.mma.MmaDelegate;
 import org.mozilla.gecko.search.SearchWidgetConfigurationActivity;
@@ -225,17 +226,17 @@ public class LauncherActivity extends Ac
                     // the user can actually set a default browser (Bug 1312686).
                     final Intent changeDefaultApps = new Intent("android.settings.MANAGE_DEFAULT_APPS_SETTINGS");
                     startActivity(changeDefaultApps);
                 } else {
                     dispatchUrlIntent(SUMO_DEFAULT_BROWSER);
                 }
                 break;
             case LINK_SEARCH_WIDGET:
-                if (AppConstants.Versions.feature26Plus) {
+                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                     AppWidgetManager appWidgetManager = getApplicationContext().getSystemService(AppWidgetManager.class);
                     ComponentName componentName = new ComponentName(this, SearchWidgetProvider.class);
 
                     if (appWidgetManager != null && appWidgetManager.isRequestPinAppWidgetSupported()) {
                         // Create the PendingIntent object only if your app needs to be notified
                         // that the user allowed the widget to be pinned. Note that, if the pinning
                         // operation fails, your app isn't notified.
                         Intent pinnedWidgetCallbackIntent = new Intent(getApplicationContext(), SearchWidgetConfigurationActivity.class);
--- a/netwerk/dns/DNS.cpp
+++ b/netwerk/dns/DNS.cpp
@@ -325,20 +325,16 @@ AddrInfo::AddrInfo(const AddrInfo *src) 
 
   for (auto element = src->mAddresses.getFirst(); element;
        element = element->getNext()) {
     AddAddress(new NetAddrElement(*element));
   }
 }
 
 AddrInfo::~AddrInfo() {
-  NetAddrElement *addrElement;
-  while ((addrElement = mAddresses.popLast())) {
-    delete addrElement;
-  }
 }
 
 void AddrInfo::AddAddress(NetAddrElement *address) {
   MOZ_ASSERT(address, "Cannot add the address to an uninitialized list");
 
   mAddresses.insertBack(address);
 }
 
--- a/netwerk/dns/DNS.h
+++ b/netwerk/dns/DNS.h
@@ -7,16 +7,17 @@
 #ifndef DNS_h_
 #define DNS_h_
 
 #include "nscore.h"
 #include "nsString.h"
 #include "prio.h"
 #include "prnetdb.h"
 #include "plstr.h"
+#include "nsISupportsImpl.h"
 #include "mozilla/LinkedList.h"
 #include "mozilla/MemoryReporting.h"
 
 #if !defined(XP_WIN)
 #  include <arpa/inet.h>
 #endif
 
 #ifdef XP_WIN
@@ -118,46 +119,48 @@ class NetAddrElement : public LinkedList
   explicit NetAddrElement(const PRNetAddr *prNetAddr);
   NetAddrElement(const NetAddrElement &netAddr);
   ~NetAddrElement();
 
   NetAddr mAddress;
 };
 
 class AddrInfo {
+  NS_INLINE_DECL_THREADSAFE_REFCOUNTING(AddrInfo)
+
  public:
   // Creates an AddrInfo object.
   explicit AddrInfo(const nsACString &host, const PRAddrInfo *prAddrInfo,
                     bool disableIPv4, bool filterNameCollision,
                     const nsACString &cname);
 
   // Creates a basic AddrInfo object (initialize only the host, cname and TRR
   // type).
   explicit AddrInfo(const nsACString &host, const nsACString &cname,
                     unsigned int TRRType);
 
   // Creates a basic AddrInfo object (initialize only the host and TRR status).
   explicit AddrInfo(const nsACString &host, unsigned int TRRType);
-  ~AddrInfo();
 
   explicit AddrInfo(const AddrInfo *src);  // copy
 
   void AddAddress(NetAddrElement *address);
 
   size_t SizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf) const;
 
   nsCString mHostName;
   nsCString mCanonicalName;
   uint32_t ttl;
   static const uint32_t NO_TTL_DATA = (uint32_t)-1;
 
-  LinkedList<NetAddrElement> mAddresses;
+  AutoCleanLinkedList<NetAddrElement> mAddresses;
   unsigned int IsTRR() { return mFromTRR; }
 
  private:
+  ~AddrInfo();
   unsigned int mFromTRR;
 };
 
 // Copies the contents of a PRNetAddr to a NetAddr.
 // Does not do a ptr safety check!
 void PRNetAddrToNetAddr(const PRNetAddr *prAddr, NetAddr *addr);
 
 // Copies the contents of a NetAddr to a PRNetAddr.
--- a/netwerk/dns/GetAddrInfo.cpp
+++ b/netwerk/dns/GetAddrInfo.cpp
@@ -272,24 +272,24 @@ static MOZ_ALWAYS_INLINE nsresult
 
   nsAutoCString canonName;
   if (aFlags & nsHostResolver::RES_CANON_NAME) {
     canonName.Assign(PR_GetCanonNameFromAddrInfo(prai));
   }
 
   bool filterNameCollision =
       !(aFlags & nsHostResolver::RES_ALLOW_NAME_COLLISION);
-  nsAutoPtr<AddrInfo> ai(new AddrInfo(aCanonHost, prai, disableIPv4,
+  RefPtr<AddrInfo> ai(new AddrInfo(aCanonHost, prai, disableIPv4,
                                       filterNameCollision, canonName));
   PR_FreeAddrInfo(prai);
   if (ai->mAddresses.isEmpty()) {
     return NS_ERROR_UNKNOWN_HOST;
   }
 
-  *aAddrInfo = ai.forget();
+  ai.forget(aAddrInfo);
 
   return NS_OK;
 }
 
 //////////////////////////////////////
 // COMMON/PLATFORM INDEPENDENT CODE //
 //////////////////////////////////////
 nsresult GetAddrInfoInit() {
--- a/netwerk/dns/TRR.cpp
+++ b/netwerk/dns/TRR.cpp
@@ -871,17 +871,17 @@ nsresult TRR::DohDecode(nsCString &aHost
     return NS_ERROR_FAILURE;
   }
   return NS_OK;
 }
 
 nsresult TRR::ReturnData() {
   if (mType != TRRTYPE_TXT) {
     // create and populate an AddrInfo instance to pass on
-    nsAutoPtr<AddrInfo> ai(new AddrInfo(mHost, mType));
+    RefPtr<AddrInfo> ai(new AddrInfo(mHost, mType));
     DOHaddr *item;
     uint32_t ttl = AddrInfo::NO_TTL_DATA;
     while ((item = static_cast<DOHaddr *>(mDNS.mAddresses.popFirst()))) {
       PRNetAddr prAddr;
       NetAddrToPRNetAddr(&item->mNet, &prAddr);
       auto *addrElement = new NetAddrElement(&prAddr);
       ai->AddAddress(addrElement);
       if (item->mTtl < ttl) {
@@ -890,17 +890,17 @@ nsresult TRR::ReturnData() {
         // lowest number.
         ttl = item->mTtl;
       }
     }
     ai->ttl = ttl;
     if (!mHostResolver) {
       return NS_ERROR_FAILURE;
     }
-    (void)mHostResolver->CompleteLookup(mRec, NS_OK, ai.forget(), mPB,
+    (void)mHostResolver->CompleteLookup(mRec, NS_OK, ai, mPB,
                                         mOriginSuffix);
     mHostResolver = nullptr;
     mRec = nullptr;
   } else {
     (void)mHostResolver->CompleteLookupByType(mRec, NS_OK, &mTxt, mTxtTtl, mPB);
   }
   return NS_OK;
 }
@@ -910,17 +910,17 @@ nsresult TRR::FailData(nsresult error) {
     return NS_ERROR_FAILURE;
   }
 
   if (mType == TRRTYPE_TXT) {
     (void)mHostResolver->CompleteLookupByType(mRec, error, nullptr, 0, mPB);
   } else {
     // create and populate an TRR AddrInfo instance to pass on to signal that
     // this comes from TRR
-    AddrInfo *ai = new AddrInfo(mHost, mType);
+    RefPtr<AddrInfo> ai = new AddrInfo(mHost, mType);
 
     (void)mHostResolver->CompleteLookup(mRec, error, ai, mPB, mOriginSuffix);
   }
 
   mHostResolver = nullptr;
   mRec = nullptr;
   return NS_OK;
 }
--- a/netwerk/dns/TRRService.cpp
+++ b/netwerk/dns/TRRService.cpp
@@ -607,17 +607,17 @@ void TRRService::TRRIsOkay(enum TrrOkay 
 AHostResolver::LookupStatus TRRService::CompleteLookup(
     nsHostRecord *rec, nsresult status, AddrInfo *aNewRRSet, bool pb,
     const nsACString &aOriginSuffix) {
   // this is an NS check for the TRR blacklist or confirmationNS check
 
   MOZ_ASSERT(NS_IsMainThread());
   MOZ_ASSERT(!rec);
 
-  nsAutoPtr<AddrInfo> newRRSet(aNewRRSet);
+  RefPtr<AddrInfo> newRRSet(aNewRRSet);
   MOZ_ASSERT(newRRSet && newRRSet->IsTRR() == TRRTYPE_NS);
 
 #ifdef DEBUG
   {
     MutexAutoLock lock(mLock);
     MOZ_ASSERT(!mConfirmer || (mConfirmationState == CONFIRM_TRYING));
   }
 #endif
--- a/netwerk/dns/nsHostResolver.cpp
+++ b/netwerk/dns/nsHostResolver.cpp
@@ -292,17 +292,16 @@ AddrHostRecord::AddrHostRecord(const nsH
       mTrrAUsed(INIT),
       mTrrAAAAUsed(INIT),
       mTrrLock("AddrHostRecord.mTrrLock"),
       mBlacklistedCount(0) {}
 
 AddrHostRecord::~AddrHostRecord() {
   mCallbacks.clear();
   Telemetry::Accumulate(Telemetry::DNS_BLACKLIST_COUNT, mBlacklistedCount);
-  delete addr_info;
 }
 
 bool AddrHostRecord::Blacklisted(NetAddr *aQuery) {
   // must call locked
   LOG(("Checking blacklist for host [%s], host record [%p].\n", host.get(),
        this));
 
   // skip the string conversion for the common case of no blacklist
@@ -1004,19 +1003,16 @@ nsresult nsHostResolver::ResolveHost(con
 
             LOG(("  Trying AF_UNSPEC entry for host [%s] af: %s.\n", host.get(),
                  (af == PR_AF_INET) ? "AF_INET" : "AF_INET6"));
 
             // We need to lock in case any other thread is reading
             // addr_info.
             MutexAutoLock lock(addrRec->addr_info_lock);
 
-            // XXX: note that this actually leaks addr_info.
-            // For some reason, freeing the memory causes a crash in
-            // nsDNSRecord::GetNextAddr - see bug 1422173
             addrRec->addr_info = nullptr;
             if (unspecRec->negative) {
               rec->negative = unspecRec->negative;
               rec->CopyExpirationTimesAndFlagsFrom(unspecRec);
             } else if (addrUnspecRec->addr_info) {
               // Search for any valid address in the AF_UNSPEC entry
               // in the cache (not blacklisted and from the right
               // family).
@@ -1686,19 +1682,17 @@ nsHostResolver::LookupStatus nsHostResol
   MutexAutoLock lock(mLock);
   MOZ_ASSERT(rec);
   MOZ_ASSERT(rec->pb == pb);
   MOZ_ASSERT(rec->IsAddrRecord());
 
   RefPtr<AddrHostRecord> addrRec = do_QueryObject(rec);
   MOZ_ASSERT(addrRec);
 
-  // newRRSet needs to be taken into the hostrecord (which will then own it)
-  // or deleted on early return.
-  nsAutoPtr<AddrInfo> newRRSet(aNewRRSet);
+  RefPtr<AddrInfo> newRRSet(aNewRRSet);
 
   bool trrResult = newRRSet && newRRSet->IsTRR();
 
   if (addrRec->mResolveAgain && (status != NS_ERROR_ABORT) && !trrResult) {
     LOG(("nsHostResolver record %p resolve again due to flushcache\n",
          addrRec.get()));
     addrRec->mResolveAgain = false;
     return LOOKUP_RESOLVEAGAIN;
@@ -1743,17 +1737,17 @@ nsHostResolver::LookupStatus nsHostResol
       addrRec->mFirstTRRresult = status;
       if (NS_FAILED(status)) {
         return LOOKUP_OK;  // wait for outstanding
       }
 
       // There's another TRR complete pending. Wait for it and keep
       // this RRset around until then.
       MOZ_ASSERT(!addrRec->mFirstTRR && newRRSet);
-      addrRec->mFirstTRR = newRRSet;  // autoPtr.swap()
+      addrRec->mFirstTRR.swap(newRRSet);  // autoPtr.swap()
       MOZ_ASSERT(addrRec->mFirstTRR && !newRRSet);
 
       if (addrRec->mDidCallbacks || addrRec->mResolverMode == MODE_SHADOW) {
         return LOOKUP_OK;
       }
 
       if (addrRec->mTrrA && (!gTRRService || !gTRRService->EarlyAAAA())) {
         // This is an early AAAA with a pending A response. Allowed
@@ -1769,17 +1763,17 @@ nsHostResolver::LookupStatus nsHostResol
 
     } else {
       // no more outstanding TRRs
       // If mFirstTRR is set, merge those addresses into current set!
       if (addrRec->mFirstTRR) {
         if (NS_SUCCEEDED(status)) {
           merge_rrset(newRRSet, addrRec->mFirstTRR);
         } else {
-          newRRSet = addrRec->mFirstTRR;  // transfers
+          newRRSet.swap(addrRec->mFirstTRR);  // transfers
         }
         addrRec->mFirstTRR = nullptr;
       }
 
       if (NS_FAILED(addrRec->mFirstTRRresult) && NS_FAILED(status) &&
           (addrRec->mFirstTRRresult != NS_ERROR_UNKNOWN_HOST) &&
           (status != NS_ERROR_UNKNOWN_HOST)) {
         // the errors are not failed resolves, that means
@@ -1818,17 +1812,17 @@ nsHostResolver::LookupStatus nsHostResol
   }
 
   // update record fields.  We might have a addrRec->addr_info already if a
   // previous lookup result expired and we're reresolving it or we get
   // a late second TRR response.
   // note that we don't update the addr_info if this is trr shadow results
   if (!mShutdown && !(trrResult && addrRec->mResolverMode == MODE_SHADOW)) {
     MutexAutoLock lock(addrRec->addr_info_lock);
-    nsAutoPtr<AddrInfo> old_addr_info;
+    RefPtr<AddrInfo> old_addr_info;
     if (different_rrset(addrRec->addr_info, newRRSet)) {
       LOG(("nsHostResolver record %p new gencnt\n", addrRec.get()));
       old_addr_info = addrRec->addr_info;
       addrRec->addr_info = newRRSet.forget();
       addrRec->addr_info_gencnt++;
     } else {
       if (addrRec->addr_info && newRRSet) {
         addrRec->addr_info->ttl = newRRSet->ttl;
@@ -2033,17 +2027,17 @@ size_t nsHostResolver::SizeOfIncludingTh
 
 void nsHostResolver::ThreadFunc() {
   LOG(("DNS lookup thread - starting execution.\n"));
 
 #if defined(RES_RETRY_ON_FAILURE)
   nsResState rs;
 #endif
   RefPtr<AddrHostRecord> rec;
-  AddrInfo *ai = nullptr;
+  RefPtr<AddrInfo> ai;
 
   do {
     if (!rec) {
       RefPtr<AddrHostRecord> tmpRec;
       if (!GetHostToLookup(getter_AddRefs(tmpRec))) {
         break;  // thread shutdown signal
       }
       // GetHostToLookup() returns an owning reference
@@ -2054,20 +2048,20 @@ void nsHostResolver::ThreadFunc() {
     LOG1(("DNS lookup thread - Calling getaddrinfo for host [%s].\n",
           rec->host.get()));
 
     TimeStamp startTime = TimeStamp::Now();
     bool getTtl = rec->mGetTtl;
     TimeDuration inQueue = startTime - rec->mNativeStart;
     uint32_t ms = static_cast<uint32_t>(inQueue.ToMilliseconds());
     Telemetry::Accumulate(Telemetry::DNS_NATIVE_QUEUING, ms);
-    nsresult status = GetAddrInfo(rec->host, rec->af, rec->flags, &ai, getTtl);
+    nsresult status = GetAddrInfo(rec->host, rec->af, rec->flags, getter_AddRefs(ai), getTtl);
 #if defined(RES_RETRY_ON_FAILURE)
     if (NS_FAILED(status) && rs.Reset()) {
-      status = GetAddrInfo(rec->host, rec->af, rec->flags, &ai, getTtl);
+      status = GetAddrInfo(rec->host, rec->af, rec->flags, getter_AddRefs(ai), getTtl);
     }
 #endif
 
     {  // obtain lock to check shutdown and manage inter-module telemetry
       MutexAutoLock lock(mLock);
 
       if (!mShutdown) {
         TimeDuration elapsed = TimeStamp::Now() - startTime;
--- a/netwerk/dns/nsHostResolver.h
+++ b/netwerk/dns/nsHostResolver.h
@@ -176,17 +176,17 @@ class AddrHostRecord final : public nsHo
    * nsDNSService2 class.  |addr| doesn't change after it has been
    * assigned a value.  only the resolver worker thread modifies
    * nsHostRecord (and only in nsHostResolver::CompleteLookup);
    * the other threads just read it.  therefore the resolver worker
    * thread doesn't need to lock when reading |addr_info|.
    */
   Mutex addr_info_lock;
   int addr_info_gencnt; /* generation count of |addr_info| */
-  mozilla::net::AddrInfo *addr_info;
+  RefPtr<mozilla::net::AddrInfo> addr_info;
   mozilla::UniquePtr<mozilla::net::NetAddr> addr;
 
   // hold addr_info_lock when calling the blacklist functions
   bool Blacklisted(mozilla::net::NetAddr *query);
   void ResetBlacklist();
   void ReportUnusable(mozilla::net::NetAddr *addr);
 
   size_t SizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf) const override;
@@ -217,17 +217,17 @@ class AddrHostRecord final : public nsHo
   static DnsPriority GetPriority(uint16_t aFlags);
 
   // When the lookups of this record started and their durations
   mozilla::TimeStamp mTrrStart;
   mozilla::TimeStamp mNativeStart;
   mozilla::TimeDuration mTrrDuration;
   mozilla::TimeDuration mNativeDuration;
 
-  nsAutoPtr<mozilla::net::AddrInfo> mFirstTRR;  // partial TRR storage
+  RefPtr<mozilla::net::AddrInfo> mFirstTRR;  // partial TRR storage
   nsresult mFirstTRRresult;
 
   uint8_t mTRRSuccess;     // number of successful TRR responses
   uint8_t mNativeSuccess;  // number of native lookup responses
 
   uint16_t mNative : 1;   // true if this record is being resolved "natively",
                           // which means that it is either on the pending queue
                           // or owned by one of the worker threads. */
--- a/remote/Connection.jsm
+++ b/remote/Connection.jsm
@@ -13,19 +13,39 @@ XPCOMUtils.defineLazyGetter(this, "log",
 XPCOMUtils.defineLazyServiceGetter(this, "UUIDGen", "@mozilla.org/uuid-generator;1", "nsIUUIDGenerator");
 
 class Connection {
   constructor(transport) {
     this.id = UUIDGen.generateUUID().toString();
     this.transport = transport;
 
     this.transport.hooks = this;
-    this.onmessage = () => {};
+    this.transport.ready();
+
+    this.defaultSession = null;
+    this.sessions = new Map();
+  }
 
-    this.transport.ready();
+  /**
+   * Register a new Session to forward the messages to.
+   * Session without any `id` attribute will be considered to be the
+   * default one, to which messages without `sessionId` attribute are
+   * forwarded to. Only one such session can be registered.
+   *
+   * @param Session session
+   */
+  registerSession(session) {
+    if (!session.id) {
+      if (this.defaultSession) {
+        throw new Error("Default session is already set on Connection," +
+                        "can't register another one.");
+      }
+      this.defaultSession = session;
+    }
+    this.sessions.set(session.id, session);
   }
 
   send(message) {
     log.trace(`<-(connection ${this.id}) ${JSON.stringify(message)}`);
     this.transport.send(message);
   }
 
   error(id, e) {
@@ -46,25 +66,38 @@ class Connection {
   // transport hooks
 
   onPacket(packet) {
     log.trace(`(connection ${this.id})-> ${JSON.stringify(packet)}`);
 
     let message = {id: null};
     try {
       message = this.deserialize(packet);
-      this.onmessage.call(null, message);
+      const { sessionId } = packet;
+      if (!sessionId) {
+        if (!this.defaultSession) {
+          throw new Error(`Connection is missing a default Session.`);
+        }
+        this.defaultSession.onMessage(message);
+      } else {
+        const session = this.sessions.get(sessionId);
+        if (!session) {
+          throw new Error(`Session '${sessionId}' doesn't exists.`);
+        }
+        session.onMessage(message);
+      }
     } catch (e) {
       log.warn(e);
       this.error(message.id, e);
     }
   }
 
   close() {
     this.transport.close();
+    this.sessions.clear();
   }
 
   onClosed(status) {}
 
   toString() {
     return `[object Connection ${this.id}]`;
   }
 }
--- a/remote/WindowManager.jsm
+++ b/remote/WindowManager.jsm
@@ -1,15 +1,16 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 "use strict";
 
 var EXPORTED_SYMBOLS = [
+  "TabManager",
   "TabObserver",
   "WindowObserver",
 ];
 
 const {DOMContentLoadedPromise} = ChromeUtils.import("chrome://remote/content/Sync.jsm");
 const {EventEmitter} = ChromeUtils.import("resource://gre/modules/EventEmitter.jsm");
 const {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");
 
@@ -138,8 +139,20 @@ class TabObserver {
     window.addEventListener("TabOpen", ({target}) => this.onTabOpen(target));
     window.addEventListener("TabClose", ({target}) => this.onTabClose(target));
   }
 
   onWindowClose(window) {
     // TODO(ato): Is TabClose fired when the window closes?
   }
 }
+
+var TabManager = {
+  addTab() {
+    const window = Services.wm.getMostRecentWindow("navigator:browser");
+    const { gBrowser } = window;
+    const tab = gBrowser.addTab("about:blank", {
+      triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal(),
+    });
+    gBrowser.selectedTab = tab;
+    return tab;
+  },
+};
--- a/remote/domains/ContentProcessDomains.jsm
+++ b/remote/domains/ContentProcessDomains.jsm
@@ -6,11 +6,16 @@
 
 var EXPORTED_SYMBOLS = ["ContentProcessDomains"];
 
 const {XPCOMUtils} = ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
 
 const ContentProcessDomains = {};
 
 XPCOMUtils.defineLazyModuleGetters(ContentProcessDomains, {
+  Emulation: "chrome://remote/content/domains/content/Emulation.jsm",
   Log: "chrome://remote/content/domains/content/Log.jsm",
+  Network: "chrome://remote/content/domains/content/Network.jsm",
   Page: "chrome://remote/content/domains/content/Page.jsm",
+  Performance: "chrome://remote/content/domains/content/Performance.jsm",
+  Runtime: "chrome://remote/content/domains/content/Runtime.jsm",
+  Security: "chrome://remote/content/domains/content/Security.jsm",
 });
copy from remote/domains/ContentProcessDomains.jsm
copy to remote/domains/content/Emulation.jsm
--- a/remote/domains/ContentProcessDomains.jsm
+++ b/remote/domains/content/Emulation.jsm
@@ -1,16 +1,16 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 "use strict";
 
-var EXPORTED_SYMBOLS = ["ContentProcessDomains"];
+var EXPORTED_SYMBOLS = ["Emulation"];
 
-const {XPCOMUtils} = ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
+const {ContentProcessDomain} = ChromeUtils.import("chrome://remote/content/domains/ContentProcessDomain.jsm");
 
-const ContentProcessDomains = {};
+class Emulation extends ContentProcessDomain {
+  // commands
 
-XPCOMUtils.defineLazyModuleGetters(ContentProcessDomains, {
-  Log: "chrome://remote/content/domains/content/Log.jsm",
-  Page: "chrome://remote/content/domains/content/Page.jsm",
-});
+  setDeviceMetricsOverride() {}
+  setTouchEmulationEnabled() {}
+}
copy from remote/domains/ContentProcessDomains.jsm
copy to remote/domains/content/Network.jsm
--- a/remote/domains/ContentProcessDomains.jsm
+++ b/remote/domains/content/Network.jsm
@@ -1,16 +1,34 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 "use strict";
 
-var EXPORTED_SYMBOLS = ["ContentProcessDomains"];
+var EXPORTED_SYMBOLS = ["Network"];
+
+const {ContentProcessDomain} = ChromeUtils.import("chrome://remote/content/domains/ContentProcessDomain.jsm");
 
-const {XPCOMUtils} = ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
+class Network extends ContentProcessDomain {
+  constructor(session) {
+    super(session);
+    this.enabled = false;
+  }
+
+  destructor() {
+    this.disable();
+  }
 
-const ContentProcessDomains = {};
+  // commands
 
-XPCOMUtils.defineLazyModuleGetters(ContentProcessDomains, {
-  Log: "chrome://remote/content/domains/content/Log.jsm",
-  Page: "chrome://remote/content/domains/content/Page.jsm",
-});
+  async enable() {
+    if (!this.enabled) {
+      this.enabled = true;
+    }
+  }
+
+  disable() {
+    if (this.enabled) {
+      this.enabled = false;
+    }
+  }
+}
--- a/remote/domains/content/Page.jsm
+++ b/remote/domains/content/Page.jsm
@@ -62,30 +62,48 @@ class Page extends ContentProcessDomain 
       triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal(),
     };
     this.docShell.QueryInterface(Ci.nsIWebNavigation);
     this.docShell.loadURI(url, opts);
 
     return {frameId: "42"};
   }
 
+  getFrameTree() {
+    return {
+      frameTree: {
+        frame: {
+          // id, parentId
+        },
+        childFrames: [],
+      },
+    };
+  }
+
+  setLifecycleEventsEnabled() {}
+  addScriptToEvaluateOnNewDocument() {}
+  createIsolatedWorld() {}
+
   url() {
     return this.content.location.href;
   }
 
   handleEvent({type}) {
     const timestamp = Date.now();
 
     switch (type) {
     case "DOMContentLoaded":
       this.emit("Page.domContentEventFired", {timestamp});
       break;
 
     case "pageshow":
       this.emit("Page.loadEventFired", {timestamp});
+      // XXX this should most likely be sent differently
+      this.emit("Page.navigatedWithinDocument", {timestamp});
+      this.emit("Page.frameStoppedLoading", {timestamp});
       break;
     }
   }
 }
 
 function transitionToLoadFlag(transitionType) {
   switch (transitionType) {
   case "reload":
copy from remote/domains/ContentProcessDomains.jsm
copy to remote/domains/content/Performance.jsm
--- a/remote/domains/ContentProcessDomains.jsm
+++ b/remote/domains/content/Performance.jsm
@@ -1,16 +1,34 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 "use strict";
 
-var EXPORTED_SYMBOLS = ["ContentProcessDomains"];
+var EXPORTED_SYMBOLS = ["Performance"];
+
+const {ContentProcessDomain} = ChromeUtils.import("chrome://remote/content/domains/ContentProcessDomain.jsm");
 
-const {XPCOMUtils} = ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
+class Performance extends ContentProcessDomain {
+  constructor(session) {
+    super(session);
+    this.enabled = false;
+  }
+
+  destructor() {
+    this.disable();
+  }
 
-const ContentProcessDomains = {};
+  // commands
 
-XPCOMUtils.defineLazyModuleGetters(ContentProcessDomains, {
-  Log: "chrome://remote/content/domains/content/Log.jsm",
-  Page: "chrome://remote/content/domains/content/Page.jsm",
-});
+  async enable() {
+    if (!this.enabled) {
+      this.enabled = true;
+    }
+  }
+
+  disable() {
+    if (this.enabled) {
+      this.enabled = false;
+    }
+  }
+}
copy from remote/domains/ContentProcessDomains.jsm
copy to remote/domains/content/Runtime.jsm
--- a/remote/domains/ContentProcessDomains.jsm
+++ b/remote/domains/content/Runtime.jsm
@@ -1,16 +1,34 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 "use strict";
 
-var EXPORTED_SYMBOLS = ["ContentProcessDomains"];
+var EXPORTED_SYMBOLS = ["Runtime"];
+
+const {ContentProcessDomain} = ChromeUtils.import("chrome://remote/content/domains/ContentProcessDomain.jsm");
 
-const {XPCOMUtils} = ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
+class Runtime extends ContentProcessDomain {
+  constructor(session) {
+    super(session);
+    this.enabled = false;
+  }
+
+  destructor() {
+    this.disable();
+  }
 
-const ContentProcessDomains = {};
+  // commands
 
-XPCOMUtils.defineLazyModuleGetters(ContentProcessDomains, {
-  Log: "chrome://remote/content/domains/content/Log.jsm",
-  Page: "chrome://remote/content/domains/content/Page.jsm",
-});
+  async enable() {
+    if (!this.enabled) {
+      this.enabled = true;
+    }
+  }
+
+  disable() {
+    if (this.enabled) {
+      this.enabled = false;
+    }
+  }
+}
copy from remote/domains/ContentProcessDomains.jsm
copy to remote/domains/content/Security.jsm
--- a/remote/domains/ContentProcessDomains.jsm
+++ b/remote/domains/content/Security.jsm
@@ -1,16 +1,34 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 "use strict";
 
-var EXPORTED_SYMBOLS = ["ContentProcessDomains"];
+var EXPORTED_SYMBOLS = ["Security"];
+
+const {ContentProcessDomain} = ChromeUtils.import("chrome://remote/content/domains/ContentProcessDomain.jsm");
 
-const {XPCOMUtils} = ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
+class Security extends ContentProcessDomain {
+  constructor(session) {
+    super(session);
+    this.enabled = false;
+  }
+
+  destructor() {
+    this.disable();
+  }
 
-const ContentProcessDomains = {};
+  // commands
 
-XPCOMUtils.defineLazyModuleGetters(ContentProcessDomains, {
-  Log: "chrome://remote/content/domains/content/Log.jsm",
-  Page: "chrome://remote/content/domains/content/Page.jsm",
-});
+  async enable() {
+    if (!this.enabled) {
+      this.enabled = true;
+    }
+  }
+
+  disable() {
+    if (this.enabled) {
+      this.enabled = false;
+    }
+  }
+}
--- a/remote/domains/parent/Target.jsm
+++ b/remote/domains/parent/Target.jsm
@@ -2,19 +2,88 @@
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 "use strict";
 
 var EXPORTED_SYMBOLS = ["Target"];
 
 const {Domain} = ChromeUtils.import("chrome://remote/content/domains/Domain.jsm");
+const {TabManager} = ChromeUtils.import("chrome://remote/content/WindowManager.jsm");
+const {TabSession} = ChromeUtils.import("chrome://remote/content/sessions/TabSession.jsm");
+
+let sessionIds = 1;
 
 class Target extends Domain {
+  constructor(session) {
+    super(session);
+
+    this.onTargetCreated = this.onTargetCreated.bind(this);
+  }
+
   getBrowserContexts() {
     return {
       browserContextIds: [],
     };
   }
 
   setDiscoverTargets({ discover }) {
+    const { targets } = this.session.target;
+    if (discover) {
+      targets.on("connect", this.onTargetCreated);
+    } else {
+      targets.off("connect", this.onTargetCreated);
+    }
   }
+
+  onTargetCreated(eventName, target) {
+    this.emit("Target.targetCreated", {
+      targetInfo: {
+        browserContextId: target.id,
+        targetId: target.id,
+        type: "page",
+      },
+    });
+  }
+
+  async createTarget(a, b) {
+    const tab = TabManager.addTab();
+    const browser = tab.linkedBrowser;
+
+    // Wait for the related target to be created
+    const target = await new Promise(resolve => {
+      const { targets } = this.session.target;
+      const listener = (eventName, target) => {
+        if (target.browser == browser) {
+          targets.off("connect", listener);
+          resolve(target);
+        }
+      };
+      targets.on("connect", listener);
+    });
+
+    return {
+      targetId: target.id,
+    };
+  }
+
+  attachToTarget({ targetId }) {
+    const { targets } = this.session.target;
+    const target = targets.getById(targetId);
+    if (!target) {
+      return new Error(`Unable to find target with id '${targetId}'`);
+    }
+
+    const session = new TabSession(this.session.connection, target, sessionIds++);
+    this.emit("Target.attachedToTarget", {
+      targetInfo: {
+        type: "page",
+      },
+      sessionId: session.id,
+    });
+
+    return {
+      sessionId: session.id,
+    };
+  }
+
+  setAutoAttach() {}
 }
--- a/remote/jar.mn
+++ b/remote/jar.mn
@@ -26,18 +26,23 @@ remote.jar:
   content/targets/Targets.jsm (targets/Targets.jsm)
 
   # domains
   content/domains/Domain.jsm (domains/Domain.jsm)
   content/domains/Domains.jsm (domains/Domains.jsm)
   content/domains/ContentProcessDomain.jsm (domains/ContentProcessDomain.jsm)
   content/domains/ContentProcessDomains.jsm (domains/ContentProcessDomains.jsm)
   content/domains/ParentProcessDomains.jsm (domains/ParentProcessDomains.jsm)
+  content/domains/content/Emulation.jsm (domains/content/Emulation.jsm)
   content/domains/content/Log.jsm (domains/content/Log.jsm)
+  content/domains/content/Network.jsm (domains/content/Network.jsm)
   content/domains/content/Page.jsm (domains/content/Page.jsm)
+  content/domains/content/Performance.jsm (domains/content/Performance.jsm)
+  content/domains/content/Runtime.jsm (domains/content/Runtime.jsm)
+  content/domains/content/Security.jsm (domains/content/Security.jsm)
   content/domains/parent/Browser.jsm (domains/parent/Browser.jsm)
   content/domains/parent/Target.jsm (domains/parent/Target.jsm)
 
   # transport layer
   content/server/HTTPD.jsm (../netwerk/test/httpserver/httpd.js)
   content/server/Packet.jsm (server/Packet.jsm)
   content/server/Socket.jsm (server/Socket.jsm)
   content/server/Stream.jsm (server/Stream.jsm)
--- a/remote/sessions/Session.jsm
+++ b/remote/sessions/Session.jsm
@@ -21,17 +21,17 @@ const {formatError} = ChromeUtils.import
 class Session {
   constructor(connection, target, id) {
     this.connection = connection;
     this.target = target;
     this.id = id;
 
     this.destructor = this.destructor.bind(this);
 
-    this.connection.onmessage = this.onMessage.bind(this);
+    this.connection.registerSession(this);
     this.connection.transport.on("close", this.destructor);
 
     this.domains = new Domains(this, ParentProcessDomains);
   }
 
   destructor() {
     this.domains.clear();
   }
--- a/remote/targets/Targets.jsm
+++ b/remote/targets/Targets.jsm
@@ -60,16 +60,25 @@ class Targets {
     }
   }
 
   get size() {
     return this._targets.size;
   }
 
   /**
+   * Get Target instance by target id
+   *
+   * @param int id Target id
+   */
+  getById(id) {
+    return this._targets.get(id);
+  }
+
+  /**
    * Get the Target instance for the main process.
    * This target is a singleton and only exposes a subset of domains.
    */
   getMainProcessTarget() {
     if (!this.mainProcessTarget) {
       this.mainProcessTarget = new MainProcessTarget(this);
       this.emit("connect", this.mainProcessTarget);
     }
--- a/remote/test/puppeteer-demo.js
+++ b/remote/test/puppeteer-demo.js
@@ -11,10 +11,14 @@
 /* global require */
 
 const puppeteer = require("puppeteer");
 
 console.log("Calling puppeteer.connect");
 puppeteer.connect({ browserURL: "http://localhost:9000"}).then(async browser => {
   console.log("Connect success!");
 
+  const page = await browser.newPage();
+  console.log("page", !!page);
+  await page.goto("https://www.mozilla.org/");
+
   return browser.close();
 });
--- a/remote/test/unit/test_Session.js
+++ b/remote/test/unit/test_Session.js
@@ -1,16 +1,21 @@
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
 const {Session} = ChromeUtils.import("chrome://remote/content/sessions/Session.jsm");
 
-const connection = {onmessage: () => {}};
+const connection = {
+  registerSession: () => {},
+  transport: {
+    on: () => {},
+  },
+};
 
 class MockTarget {
   constructor() {
   }
 
   get browsingContext() {
     return {id: 42};
   }
--- a/security/manager/ssl/StaticHPKPins.h
+++ b/security/manager/ssl/StaticHPKPins.h
@@ -1146,9 +1146,9 @@ static const TransportSecurityPreload kP
   { "za.search.yahoo.com", false, true, false, -1, &kPinset_yahoo },
   { "zh.search.yahoo.com", false, true, false, -1, &kPinset_yahoo },
 };
 
 // Pinning Preload List Length = 484;
 
 static const int32_t kUnknownId = -1;
 
-static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1560431526439000);
+static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1560774076545000);
--- a/security/manager/ssl/nsSTSPreloadList.inc
+++ b/security/manager/ssl/nsSTSPreloadList.inc
@@ -3,17 +3,17 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 /*****************************************************************************/
 /* This is an automatically generated file. If you're not                    */
 /* nsSiteSecurityService.cpp, you shouldn't be #including it.                */
 /*****************************************************************************/
 
 #include <stdint.h>
-const PRTime gPreloadListExpirationTime = INT64_C(1562850721827000);
+const PRTime gPreloadListExpirationTime = INT64_C(1563193272486000);
 %%
 0-1.party, 1
 000books.net, 1
 00100010.net, 1
 0010100.net, 1
 00120012.net, 1
 00130013.net, 1
 00140014.net, 1
@@ -29,17 +29,16 @@ 00550055.net, 1
 00660066.net, 1
 007-preisvergleich.de, 1
 00770077.net, 1
 007kf.com, 1
 008207.com, 1
 008251.com, 1
 008253.com, 1
 008271.com, 1
-0086286.com, 1
 00880088.net, 1
 00990099.net, 1
 009p.com, 1
 00dani.me, 1
 00f.net, 1
 00wbf.com, 1
 0100dev.com, 0
 0100dev.nl, 0
@@ -350,16 +349,18 @@ 133846.xyz, 1
 1359826938.rsc.cdn77.org, 1
 135vv.com, 1
 136774.com, 1
 136814.com, 1
 136824.com, 1
 136924.com, 1
 137724.com, 1
 13826145000.com, 1
+1391kj.com, 1
+1395kj.com, 1
 13th-dover.uk, 1
 141145.com, 1
 143533.com, 1
 143633.com, 1
 143733.com, 1
 143933.com, 1
 1453914078.rsc.cdn77.org, 1
 145433.com, 1
@@ -515,17 +516,16 @@ 200fcw.com, 1
 2012.ovh, 1
 2018.wales, 1
 20188088.com, 1
 2048-spiel.de, 1
 2048game.co.uk, 1
 2083236893.com, 1
 20at.com, 1
 20denier.com, 1
-20zq.com, 1
 215dy.net, 1
 21sthammersmith.org.uk, 1
 21stnc.com, 1
 21stnc.us, 1
 21x9.org, 1
 2206p.com, 1
 222001.com, 1
 22d.io, 1
@@ -583,16 +583,17 @@ 2600edinburgh.org, 1
 2600hq.com, 1
 260887.com, 1
 263.info, 1
 2718282.net, 1
 27728522.com, 1
 28-industries.com, 1
 281180.de, 1
 2858958.com, 1
+286.com, 1
 288game.net, 1
 28peaks.com, 1
 28spots.net, 1
 291167.xyz, 1
 2912.nl, 1
 29227.com, 1
 2948.ca, 1
 297computers.com, 1
@@ -655,16 +656,17 @@ 3056999.com, 1
 309422.com, 1
 30hzcollective.com, 1
 310422.com, 1
 313422.com, 1
 314022.com, 1
 314122.com, 1
 314322.com, 1
 314522.com, 1
+314553.com, 1
 314622.com, 1
 314633.com, 1
 314922.com, 1
 314chan.org, 1
 315422.com, 1
 316433.com, 1
 319422.com, 1
 319k3.com, 1
@@ -747,16 +749,17 @@ 356433.com, 1
 357maelai.co, 1
 360-staffing.com, 1
 360live.fr, 1
 360rail.nl, 1
 360vrs.com, 1
 360woodworking.com, 1
 361171.com, 1
 361173.com, 1
+364553.com, 1
 365365.com, 1
 365beautyworld.com, 1
 365daysreview.com, 1
 365healthworld.com, 1
 365propertybuyer.co.uk, 0
 365skulls.com, 1
 367553.com, 1
 367556.com, 1
@@ -784,16 +787,17 @@ 38sihu.com, 0
 390422.com, 1
 392422.com, 1
 393335.ml, 1
 393422.com, 1
 394022.com, 1
 394122.com, 1
 394322.com, 1
 394522.com, 1
+394553.com, 1
 394622.com, 1
 394922.com, 1
 396422.com, 1
 398.info, 1
 39sihu.com, 0
 3aandl.com, 1
 3ags.de, 1
 3amtoolbox.se, 1
@@ -870,16 +874,17 @@ 4096b.com, 1
 4096bit.de, 0
 40acts.org.uk, 1
 41-where.com, 1
 411416.com, 1
 41199.com, 1
 411film.com, 1
 411movie.com, 1
 411quest.com, 1
+414553.com, 1
 41844.de, 1
 41studio.com, 1
 41where.com, 1
 420java.com, 1
 42ch.com, 1
 42day.info, 1
 42l.fr, 1
 42t.ru, 1
@@ -892,16 +897,17 @@ 442887.com, 1
 442jz.com, 0
 443887.com, 1
 443jz.com, 0
 444887.com, 1
 445887.com, 1
 44sec.com, 1
 451.ooo, 1
 4553.com, 1
+4553s.com, 1
 4553vip.com, 1
 46fa.com, 1
 4706666.com, 1
 4716666.com, 1
 4726666.com, 1
 4736666.com, 1
 4756666.com, 1
 4786666.com, 1
@@ -1157,16 +1163,17 @@ 656088.com, 1
 659422.com, 1
 65d88.com, 1
 66136.com, 1
 6616fc.com, 1
 662607.xyz, 1
 6633445.com, 1
 6652566.com, 1
 6660111.ru, 1
+6664553.com, 1
 666618.cc, 1
 666668722.com, 1
 666omg.com, 1
 6677.us, 1
 668825.vip, 1
 66bwf.com, 1
 670422.com, 1
 671422.com, 1
@@ -1295,30 +1302,28 @@ 818bwf.com, 1
 818da.com, 1
 81uc.com, 1
 8211p.com, 1
 8212p.com, 1
 8213p.com, 1
 8214p.com, 1
 8215p.com, 1
 8216p.com, 1
-82ty.com, 1
 8349822.com, 1
 848jz.com, 1
 850226.com, 1
 8522.com, 1
 8522club.com, 1
 8522hk.com, 1
 8522ph.com, 1
 8522top.com, 1
 8522tw.com, 1
 8522usa.com, 1
 85383838.com, 1
 8560.be, 1
-86286286.com, 1
 86499.com, 1
 8649955.com, 1
 8649966.com, 1
 8649977.com, 1
 8688fc.com, 1
 86metro.ru, 1
 8722.am, 1
 8722am.com, 1
@@ -1547,16 +1552,17 @@ 98laba.net, 0
 9906753.net, 1
 9918883.com, 1
 9933445.com, 1
 9950p.com, 1
 99599.fi, 1
 99599.net, 1
 998081.com, 1
 998sa.com, 1
+9994553.com, 1
 9998722.com, 1
 99998522.com, 1
 99999822.com, 1
 999998722.com, 1
 999salon.co, 1
 999salon.com, 1
 99buffets.com, 1
 99rst.org, 1
@@ -1650,16 +1656,17 @@ ab-photography.nl, 1
 ab288.com, 1
 ab2888.cn, 1
 ab28s.com, 1
 abaapplianceservice.com, 1
 abaaustin.com, 1
 ababyco.com.hr, 1
 abacusbouncycastle.co.uk, 1
 abacustech.co.jp, 1
+abaev.uk, 1
 abandonedmines.gov, 1
 abasalehngo.com, 1
 abasky.net, 1
 abateroad66.it, 1
 abbadabbabouncycastles.co.uk, 1
 abbas.ch, 1
 abbotsparties.co.uk, 1
 abbottscastles.co.uk, 1
@@ -1824,17 +1831,16 @@ accessacab.co.uk, 1
 accessauto-occasions.be, 1
 accessgaragedoors.com, 1
 accessibility.gov, 1
 accesskeycloning.com, 1
 accessmy.net, 1
 accessoirescheveuxchic.com, 1
 accessoripersmartphone.it, 1
 acchicocchi.com, 1
-acchikocchi.org, 1
 accme.co, 1
 accolade.com.br, 1
 accoladescreens.com.au, 1
 accord-application.com, 1
 accordiondoor.com, 1
 account.bbc.com, 1
 accounts.firefox.com, 1
 accounts.google.com, 1
@@ -1928,17 +1934,16 @@ acquistareviagragenericoitalia.net, 0
 acraft.org, 1
 acrealux.lu, 1
 acrepairgeorgetown.com, 1
 acrepairhutto.com, 1
 acrepairroundrocktx.com, 1
 acrevalue.com, 1
 acriticismlab.org, 1
 acrolife.cz, 1
-acroso.me, 1
 across.ml, 1
 acrossgw.com, 1
 acrosstheblvd.com, 1
 acroyoga-nuernberg.de, 1
 acrylbilder-acrylmalerei.de, 1
 acrylicwifi.com, 1
 acsbbs.org, 1
 acsc.gov.au, 1
@@ -2325,17 +2330,16 @@ affpass.com, 1
 affping.com, 1
 affvps.net, 1
 afghan.dating, 1
 afgn.com.ua, 1
 afi-business-consulting.com, 1
 aficionados.com.br, 1
 afinadoronline.com.br, 1
 afinaudio.com, 1
-afinterio.com, 1
 aflam4you.tv, 1
 aflamtorrent.com, 1
 aflfreebets.com, 1
 aflowershop.ca, 1
 afmtevents.com, 1
 afp548.com, 1
 afri.cc, 1
 africa.dating, 1
@@ -2526,22 +2530,22 @@ aikido-club-limburg.de, 1
 aikido-kiel.de, 1
 aikido-linz.at, 1
 aikido-wels.at, 1
 ailitonia.com, 1
 ailitonia.xyz, 1
 aimax.com, 1
 aimd.tech, 1
 aimeeandalec.com, 1
-aimerworld.com, 0
 aimgroup.co.tz, 1
 aimi-salon.com, 1
 aimonline.nl, 1
 aimotive.com, 1
 aimrom.org, 1
+aimstoreglobal.com, 1
 aintevenmad.ch, 1
 ainutrition.co.uk, 1
 ainvest.de, 1
 aioboot.com, 1
 aiois.com, 1
 aipbarcelona.com, 1
 aiphyron.com, 1
 air-craftglass.com, 1
@@ -3021,16 +3025,17 @@ allns.fr, 1
 allo-credit.ch, 1
 allofthestops.com, 1
 allontanamentovolatili.it, 1
 allontanamentovolatili.milano.it, 1
 alloutatl.com, 1
 alloutofgum.com, 1
 alloutsec.com, 1
 alloverthehill.com, 1
+allplayer.tk, 1
 allpointsblog.com, 1
 allpointsheating.com, 1
 allproptonline.com, 1
 allrad-buck.de, 1
 allram.one, 1
 allroundpvp.net, 1
 allroundtechnology.com, 1
 allroundtechnology.nl, 1
@@ -3218,17 +3223,16 @@ amalficoastchauffeur.com, 1
 amalfilapiazzetta.it, 1
 amalfipositanoboatrental.com, 1
 amalfirock.it, 1
 amalfitabula.it, 1
 amaliagamis.com, 1
 amanatrustbooks.org.uk, 1
 amandadamsphotography.com, 1
 amandasage.ca, 1
-amanet.ro, 1
 amani-kinderdorf.de, 1
 amaranthus.com.ph, 1
 amardham.org, 1
 amaresq.com, 1
 amartinz.at, 1
 amateri.com, 1
 amateurchef.co.uk, 1
 amateurradionotes.com, 1
@@ -3280,17 +3284,16 @@ american.dating, 1
 americandetour.com, 1
 americanfoundationbr.com, 1
 americanindiancoc.org, 1
 americanindiannursing.com, 1
 americanmediainstitute.com, 1
 americasbasementcontractor.com, 1
 americasdirector.com, 1
 americkykongres.cz, 1
-amerigroup.com, 1
 ameriikanpoijat.org, 1
 amerika-forum.de, 1
 amerimex.cc, 1
 ames.gq, 1
 amesgen.de, 1
 amesvacuumrepair.com, 1
 amethystcards.co.uk, 1
 amethystdevelopment.co.uk, 1
@@ -3713,17 +3716,17 @@ antennista.tv, 1
 antennistaroma.it, 1
 antennisti.milano.it, 1
 antennisti.roma.it, 1
 anteprima.info, 1
 antfie.com, 1
 anthedesign.fr, 1
 anthisis.tv, 1
 anthony.codes, 1
-anthonycarbonaro.com, 1
+anthonycarbonaro.com, 0
 anthonyellis.com, 1
 anthonyfontanez.com, 1
 anthonygaidot.fr, 1
 anthonyvadala.me, 1
 anthropoid.ca, 1
 anti-bible.com, 1
 anti-radar.org, 1
 antiaz.com, 1
@@ -4048,16 +4051,17 @@ archlinux.org, 1
 archmediamarketing.com, 1
 archoit.org, 0
 archsec.info, 1
 arckr.com, 1
 arclandholdings.com.au, 1
 arcobalabs.ca, 1
 arcridge.ca, 1
 arctic.gov, 1
+arctica.io, 1
 arcueil-cachan.fr, 0
 arcusnova.de, 1
 ardadanal.com, 1
 ardor.noip.me, 1
 ardtrade.ru, 1
 area3.org, 1
 area4pro.com, 1
 areaclienti.net, 1
@@ -4695,17 +4699,16 @@ aurorarecordings.com, 1
 auroware.com, 1
 auroz.tech, 1
 auroz.video, 1
 aus-ryugaku.info, 1
 ausec.ch, 1
 ausmwoid.de, 1
 auspicacious.org, 1
 ausrecord.com, 1
-ausschreibungen-suedtirol.it, 1
 aussiefunadvisor.com, 1
 aussieservicedown.com, 1
 aussiestoresonline.com, 1
 austenplumbing.com, 1
 austin-pearce.com, 1
 austin-security-cameras.com, 1
 austincardiac.com, 1
 austinheap.com, 0
@@ -4893,17 +4896,18 @@ avnavi.jp, 1
 avnet.ws, 1
 avocadooo.stream, 1
 avocode.com, 1
 avonlearningcampus.com, 1
 avonture.be, 1
 avova.de, 1
 avpres.net, 1
 avptp.org, 1
-avqueen.cn, 1
+avqueen.cn, 0
+avs-building-services.co.uk, 1
 avso.pw, 1
 avsox.com, 1
 avspot.net, 1
 avtek.pl, 1
 avticket.ru, 0
 avtobania.pro, 1
 avtoforex.ru, 1
 avtogara-isperih.com, 1
@@ -4983,17 +4987,16 @@ aylavblog.com, 1
 aylesburycastlehire.co.uk, 1
 aymerick.fr, 1
 aymericlagier.com, 1
 ayon.group, 1
 ayothemes.com, 1
 ayrohq.com, 1
 ayrshirebouncycastlehire.co.uk, 1
 ayumi.network, 1
-ayumindev.net, 1
 ayumix3.xyz, 1
 ayurveda-mantry.com, 1
 ayurveda101.com, 0
 az-moga.bg, 1
 az-vinyl-boden.de, 1
 az.search.yahoo.com, 0
 azabani.com, 1
 azadliq.info, 1
@@ -5253,17 +5256,16 @@ bagelsbakery.com, 0
 bageluncle.com, 1
 baggy.me.uk, 1
 bagheera.me.uk, 1
 baglu.com, 0
 bagni-chimici.roma.it, 1
 bagnichimici.roma.it, 1
 bagsofbounce.co.uk, 1
 bagspecialist.nl, 1
-bagstage.de, 1
 bagwrap.com, 1
 bah.im, 0
 bahaiprayers.io, 1
 bahnbonus-praemienwelt.de, 1
 bahnenimbild.de, 1
 bahnenimbild.eu, 1
 bahnhelden.de, 1
 bahninrotweissrot.at, 1
@@ -5367,16 +5369,17 @@ banes.ch, 1
 bangdream.ga, 1
 bangkok-dark-night.com, 1
 bangkok.dating, 1
 bangkokcity.de, 1
 bangorfederal.com, 0
 bangridho.com, 1
 bangumi.co, 1
 bangyu.wang, 1
+banham.co.uk, 0
 banham.com, 1
 bani99.com, 1
 banjostringiz.com, 1
 bank, 1
 bank.simple.com, 0
 bankanswers.gov, 1
 bankbranchlocator.com, 1
 bankcardoffer.com, 1
@@ -5741,17 +5744,16 @@ bedamedia.com, 1
 bedandbreakfast.dk, 1
 bedandbreakfasteuropa.com, 1
 bedandbreakfasthoekvanholland.com, 1
 bedels.nl, 1
 bedfordnissanparts.com, 1
 bedlingtonterrier.com.br, 1
 bedouille.com, 1
 bedrijfsfotoreportages.nl, 1
-bedrijfshulpverleningfriesland.nl, 1
 bedrocklinux.org, 1
 bedste10.dk, 1
 bee-creative.nl, 1
 bee-line.org.uk, 1
 bee-removal-dublin.com, 1
 bee-social.it, 1
 bee.clothing, 1
 bee.supply, 1
@@ -5796,16 +5798,17 @@ beeswax-orgone.com, 1
 beetgroup.id, 1
 beethoveninlove.com, 1
 beetman.net, 1
 beeutifulparties.co.uk, 1
 beexfit.com, 1
 beezkneezcastles.co.uk, 1
 beeznest.com, 1
 befoodsafe.gov, 1
+beforesunrise.de, 1
 beforeyoueatoc.com, 1
 beframed.ch, 1
 befreewifi.info, 1
 befundonline.de, 1
 begabungsfoerderung.info, 1
 begbie.com, 1
 beginner.nl, 1
 beginwp.top, 1
@@ -5915,17 +5918,18 @@ benhaney.com, 1
 benhartmann.de, 1
 benhavenarchives.org, 1
 benjamin-hering.com, 1
 benjamin-horvath.com, 1
 benjamin-suess.de, 1
 benjamin.pe, 1
 benjaminbedard.com, 1
 benjaminblack.net, 1
-benjamindietrich.com, 1
+benjamindietrich.com, 0
+benjamindietrich.de, 1
 benjaminjurke.com, 1
 benjaminkopelke.com, 1
 benjaminpiquet.fr, 1
 benjamins.com, 1
 benjaminvasel.de, 1
 benjii.me, 1
 benjijaldoner.nl, 1
 benleemd.com, 1
@@ -6037,17 +6041,16 @@ bertsmithvwparts.com, 1
 beryl.net, 1
 berz.one, 1
 besb.io, 1
 besb66.club, 1
 besb66.me, 1
 besb66.ninja, 1
 besb66.rocks, 1
 besb66.us, 1
-beschriftung-metz.de, 1
 bescover.com, 1
 beserberg.tk, 1
 beslider.com, 1
 besnik.de, 0
 besole.ch, 1
 bespaarenergie.click, 1
 bespaarnu.click, 1
 bespokebathrooms.com.au, 1
@@ -6260,16 +6263,17 @@ bgeo.io, 1
 bgfashion.net, 1
 bgfoto.info, 1
 bghost.xyz, 1
 bgkoleda.bg, 1
 bgmn.me, 1
 bgp.ee, 1
 bgp.space, 1
 bgr34.cz, 1
+bgs-game.com, 1
 bgtgames.com, 1
 bgtoyou.com, 1
 bguidinger.com, 1
 bgwfans.com, 1
 bh-oberland.de, 1
 bh.sb, 1
 bharath-g.in, 1
 bhodisoft.com, 1
@@ -7206,17 +7210,16 @@ bookreport.ga, 1
 booksearch.jp, 1
 booksinthefridge.at, 1
 booksouthafrica.travel, 1
 booktoan.com, 1
 booktracker-org.appspot.com, 1
 bookwitty.social, 1
 bookzaga.com, 1
 bool.be, 1
-boombv.com, 1
 boomersurf.com, 1
 boomshelf.com, 1
 boomshelf.org, 1
 boomvm.pw, 1
 boonbox.com, 1
 booox.biz, 1
 booox.cc, 1
 booox.info, 1
@@ -7403,16 +7406,17 @@ bouncymacs.co.uk, 1
 bouncyrainbows.co.uk, 1
 bouncytime.co.uk, 1
 bouncywouncy.co.uk, 1
 bound2bounce.co.uk, 1
 boundarybrighton.com, 1
 bountiful.gov, 1
 bountyfactory.io, 1
 bourasse.fr, 1
+bourdon.fr.eu.org, 1
 bournefun.co.uk, 1
 bourqu.in, 1
 bourse-aux-jouets.org, 0
 bourse-aux-vetements.org, 0
 bourse-puericulture.org, 0
 boutiqueguenaelleverdin.com, 1
 boutoncoupdepoing.fr, 1
 bouw.live, 1
@@ -7666,17 +7670,16 @@ brightside.com, 1
 brightworkcreative.com, 1
 brigidaarie.com, 1
 brigittebutt.tk, 1
 brilliantbouncyfun.co.uk, 1
 brilliantproductions.co.nz, 1
 brimspark.com, 1
 brimspark.systems, 1
 brinkhu.is, 1
-brinkmann.one, 1
 brio-shop.ch, 1
 brio-ukraine.store, 1
 briograce.com.mx, 1
 brioukraine.store, 1
 brisbanelogistics.com.au, 1
 bristebein.com, 1
 bristolandwestonsuperbounce.com, 1
 britanniacateringyeovil.co.uk, 1
@@ -7821,25 +7824,23 @@ bt780.com, 1
 bta.lv, 0
 btc2secure.com, 1
 btcarmory.com, 1
 btcbolsa.com, 1
 btcontract.com, 1
 btcp.space, 1
 btcpop.co, 1
 btine.tk, 1
-btio.pw, 0
 btku.org, 1
 btnissanparts.com, 1
 btorrent.xyz, 1
 btrb.ml, 1
 btsapem.com, 1
 btshe.net, 1
 btsoft.eu, 1
-btsow.com, 0
 bttc.co.uk, 1
 btth.live, 1
 btth.pl, 1
 btth.tv, 1
 btth.xyz, 1
 bttorj45.com, 1
 bturboo.com, 1
 buayacorp.com, 1
@@ -8012,17 +8013,16 @@ burzum.ch, 1
 busanhs.bid, 1
 buscandolosmejores.com, 1
 buserror.cn, 1
 bushbaby.com, 1
 bushcraftfriends.com, 1
 busindre.com, 1
 business-garden.com, 1
 business.facebook.com, 0
-businessadviceperth.com.au, 0
 businessamongus.com, 1
 businesscentermarin.ch, 1
 businessesdirectory.eu, 1
 businessetmarketing.com, 1
 businessfactors.de, 1
 businessfurs.info, 1
 businesshub.cz, 0
 businessimmigration-eu.com, 1
@@ -8039,17 +8039,16 @@ busold.ws, 1
 bustabit.com, 1
 bustadice.com, 1
 bustup-tips.com, 1
 busuttil.org.uk, 1
 busybee360.com, 1
 busyon.cloud, 1
 butarque.es, 1
 buthowdoyoubuygroceries.com, 1
-butikpris.se, 1
 butikvip.ru, 1
 butlerfm.dk, 1
 butt.repair, 1
 butteramotors.com, 1
 buttermilk.cf, 1
 buttonline.ch, 1
 buttonrun.com, 1
 butts-are.cool, 1
@@ -8368,17 +8367,16 @@ calmtech.com, 1
 calories.org, 1
 calotte-academy.com, 1
 calrotaract.org, 1
 calvin.my, 1
 calvinallen.net, 0
 calypso-tour.net, 1
 calypsohost.net, 1
 calyxengineers.com, 1
-calyxinstitute.org, 0
 calzadonline1-latam.com, 1
 calzadonline1.com, 1
 camara360grados.com, 1
 camaradivisas.com, 1
 camaras.uno, 1
 camarilloelectric.com, 1
 camarilloelectrical.com, 1
 camarilloexteriorlighting.com, 1
@@ -9788,17 +9786,17 @@ circlebox.rocks, 1
 circu.ml, 1
 circulatedigital.com, 1
 circule.cc, 1
 cirfi.com, 1
 ciri.com.co, 1
 cirrus0.de, 1
 cirujanooral.com, 1
 cisa.gov, 1
-ciscodude.net, 1
+ciscodude.net, 0
 cisoaid.com, 1
 cisofy.com, 1
 cispeo.org, 1
 ciss.ltd, 1
 cistitguru.ru, 1
 cisum-cycling.com, 1
 cisy.me, 1
 citadelnet.works, 1
@@ -10394,17 +10392,16 @@ colcomm.com, 1
 coldaddy.com, 1
 coldawn.com, 0
 coldcardwallet.com, 1
 coldfff.com, 1
 coldhak.ca, 1
 coldiario.com, 1
 coldlasers.org, 1
 coldstreamcreekfarm.com, 1
-colectivointerconductual.com, 1
 colegiocierp.com.br, 0
 colemak.com, 1
 colengo.com, 1
 colf.online, 1
 colibris.xyz, 1
 colinchartier.com, 1
 colincogle.name, 1
 colinsnaith.co.uk, 1
@@ -10491,17 +10488,16 @@ combron.nl, 1
 comchezmeme.com, 1
 comcol.nl, 1
 comdotgame.com, 1
 comdurav.com, 1
 comeals.com, 1
 comedyhuis.nl, 1
 comefollowme2016.com, 1
 comeoishii.com, 1
-comercialdragon.com, 1
 comercialtpv.com, 1
 comercialtrading.eu, 1
 comerford.net, 1
 comestoarra.com, 1
 cometbot.cf, 1
 cometcache.com, 1
 cometonovascotia.ca, 1
 comevius.com, 1
@@ -10934,16 +10930,17 @@ corpulantcoffee.com, 1
 corpulent.coffee, 1
 corpulentcoffee.com, 1
 corpuschristisouthriver.org, 1
 corpusslayer.com, 1
 corrbee.com, 1
 correct.cf, 1
 correcthorse.cf, 1
 correctiv.org, 1
+correctpaardbatterijnietje.nl, 1
 correiodovale.com.br, 1
 corrick.io, 1
 corrupted.io, 1
 corsa-b.uk, 1
 corscanplus.com, 1
 corsectra.com, 1
 corsihaccpsicurezzalavoro.it, 1
 corso-antincendio.org, 1
@@ -10962,17 +10959,16 @@ coslinker.com, 1
 cosmechic.fr, 1
 cosmekaitori.jp, 1
 cosmetic-surgery-prices.co.uk, 1
 cosmeticappraisal.com, 1
 cosmeticasimple.com, 1
 cosmeticos-naturales.com, 1
 cosmiatria.pe, 1
 cosmicnavigator.com, 1
-cosmintataru.ro, 1
 cosmodacollection.com, 1
 cosmofunnel.com, 1
 cosmundi.de, 1
 cosni.co, 1
 cosplayer.com, 1
 cospol.ch, 1
 costa-rica-reisen.de, 1
 costablanca.villas, 1
@@ -11069,16 +11065,17 @@ cplus.me, 1
 cplusplus.se, 1
 cppan.org, 1
 cppressinc.com, 1
 cpqcol.gov.co, 1
 cprheartcenter.com, 1
 cprnearme.com, 1
 cpsc.gov, 1
 cpsq.fr, 1
+cptoon.com, 1
 cpu.biz.tr, 1
 cpvmatch.eu, 1
 cpy.pt, 1
 cqn.ch, 1
 cr.search.yahoo.com, 0
 cr0nus.net, 1
 cr9499.com, 1
 cra-bank.com, 1
@@ -11466,16 +11463,17 @@ ctliu.com, 1
 ctnguyen.de, 1
 ctnguyen.net, 1
 ctns.de, 1
 ctoforhire.com.au, 1
 ctomp.io, 0
 ctoresms.com, 1
 ctpe.net, 1
 ctr.id, 1
+ctrl.blog, 1
 ctrld.me, 1
 cu247secure.ie, 1
 cub-bouncingcastles.co.uk, 1
 cubaal.com, 1
 cube-cloud.com, 1
 cube.builders, 1
 cube.la, 1
 cubebot.io, 1
@@ -11609,17 +11607,16 @@ cve-le-carrousel.ch, 1
 cviip.ca, 1
 cviip.com, 1
 cvjd.me, 1
 cvl.ch, 1
 cvlibrary.co.uk, 1
 cvmu.jp, 1
 cvr.dk, 1
 cvtemplatemaster.com, 1
-cvursache.com, 1
 cvutdecin.cz, 1
 cvv.cn, 1
 cw-bw.de, 0
 cw.center, 1
 cwagner.me, 1
 cwbrtrust.ca, 1
 cwc.gov, 1
 cwgaming.co.uk, 1
@@ -11805,17 +11802,16 @@ da-sh.cc, 1
 da.hn, 1
 da42foripad.com, 1
 daallexx.eu, 1
 dabasstacija.lv, 1
 dabblegoat.com, 1
 dabneydriveanimalhospital.com, 1
 dabuttonfactory.com, 1
 dachb0den.net, 1
-dachdecker-ranzenberger.de, 1
 dachdeckermeister-egon-weiss.de, 1
 dachtechnik-windschuettl.de, 1
 daciaforum.nl, 1
 daciamodellen.nl, 1
 dadadani.xyz, 1
 daddybio.com, 1
 daddyfinger.me, 1
 dado.fr, 1
@@ -12105,17 +12101,17 @@ dasteichwerk.at, 1
 dasug.de, 1
 dat4u.de, 1
 data-detox.com, 1
 data-detox.de, 1
 data-wing.ga, 0
 data.bayern, 1
 data.gov, 1
 data.govt.nz, 1
-data.haus, 1
+data.haus, 0
 data.world, 1
 data3w.nl, 1
 databeam.de, 1
 databionix.com, 1
 databutlr.com, 1
 databutlr.net, 1
 datacalle.com, 1
 datacandy.com, 1
@@ -12401,17 +12397,16 @@ deanjerkovich.com, 1
 deanmorgan.org, 1
 deano-s.co.uk, 1
 deanosplace.net, 1
 deanpearce.net, 1
 dearfcc.com, 1
 dearfcc.net, 1
 dearfcc.org, 1
 dearktiel.nl, 1
-dearly.com, 1
 dearnevalleybouncycastles.co.uk, 1
 deathberry.ddns.net, 1
 deathofspring.com, 1
 deathy.ro, 1
 debarrasantony.com, 1
 debarrasasnieressurseine.com, 1
 debarrasboulognebillancourt.com, 1
 debarrasclichy.com, 1
@@ -12428,17 +12423,16 @@ debrusoft.ch, 1
 debt.com, 1
 debtrecycling.com.au, 1
 debuemon.com, 1
 debuis.nl, 1
 dec6.gc.ca, 1
 decaffeinated.io, 1
 decalquai.ch, 1
 decay24.de, 1
-dechat.nl, 1
 decher.de, 1
 decidetreatment.org, 1
 decimatechnologies.eu, 1
 decis.fr, 1
 decisivetactics.com, 1
 deckbuilderamerica.com, 1
 declivitas.com, 1
 decoating.pl, 1
@@ -13125,17 +13119,17 @@ digitaldashboard.gov, 1
 digitaldatacenter.net, 1
 digitaldeli.com, 1
 digitaldeli.org, 1
 digitaldeli.tv, 1
 digitaldeli.us, 1
 digitaldeliarchive.com, 1
 digitaldem.it, 1
 digitalehandtekeningen.nl, 1
-digitaleoverheid.nl, 1
+digitaleoverheid.nl, 0
 digitaletanker.com, 1
 digitalewelten.de, 1
 digitalezukunft-hagen.de, 1
 digitalezukunft.nrw, 1
 digitalfishfun.com, 1
 digitalfury.co.uk, 1
 digitalfuturenow.com, 1
 digitalgov.gov, 0
@@ -13339,17 +13333,16 @@ dist-it.com, 1
 dist.torproject.org, 0
 disti.com, 1
 distiduffer.org, 1
 distillery.com, 1
 distinctdesign2009.com, 1
 distinctivephotography.com.au, 1
 distinguishedprisoner.com, 1
 distracteddriving.gov, 1
-distribuidoracristal.com.br, 1
 distribuidoraplus.com, 1
 distribuidorveterinario.es, 1
 distrilogservices.com, 1
 distro.fr, 1
 ditch.ch, 1
 ditelbat.com, 1
 diti.me, 1
 ditisabc.nl, 1
@@ -13374,28 +13367,28 @@ dividendz.net, 1
 divinasaiamodas.com.br, 1
 divinegames.studio, 1
 divineglowinghealth.com, 1
 divinemercyparishvld.com, 1
 diving.photo, 1
 divingwithnic.com, 1
 divisuite.com, 1
 divorcelawyersformen.com, 1
+divorciosmurcia.com, 1
 diwei.vip, 1
 dixi.fi, 1
 dixibox.com, 1
 dixmag.com, 1
 diybook.at, 1
 diycc.org, 1
 diymediahome.org, 1
 diyosun.com, 1
 diysec.tk, 1
 diytechguides.com, 1
 diyvideoeditor.com, 1
-dizalty.tv, 1
 dizzie.org, 1
 dizzieforums.com, 1
 dizzythewizard.co.uk, 1
 dj-leszwolle.nl, 1
 dj-x.info, 1
 dj3dub.com, 1
 djangobirthday.com, 1
 djangogolf.com, 1
@@ -13523,17 +13516,16 @@ dobrisan.ro, 1
 dobsnet.net, 1
 doc.ai, 1
 doc.python.org, 1
 doc.to, 0
 doc8643.com, 1
 docabo.ch, 1
 docassure.de, 1
 docbox.ch, 1
-doceamoraviverbem.com, 1
 docemeldoces.com, 1
 dochimera.com, 1
 dochitaceahlau.ro, 1
 dockerbook.com, 0
 dockerm.com, 1
 dockerup.net, 1
 doclassworks.com, 1
 docline.gov, 1
@@ -14186,17 +14178,16 @@ dsgnet.hu, 1
 dsgvo.name, 1
 dshield.org, 1
 dsm5.com, 1
 dsmjs.com, 1
 dsmnet.org, 1
 dso-imaging.co.uk, 1
 dso-izlake.si, 1
 dsol.hu, 1
-dssale.com, 1
 dstamou.de, 1
 dstat.cc, 1
 dsteiner.at, 1
 dstvinstallalberton.co.za, 1
 dstvinstalledenvale.co.za, 1
 dstvinstallfourways.co.za, 1
 dstvinstallglenvista.co.za, 1
 dstvinstalljohannesburg.co.za, 1
@@ -14328,16 +14319,17 @@ dustri.org, 1
 dustycloth.com, 1
 dustygroove.com, 1
 dustyro.se, 1
 dustyspokesbnb.ca, 1
 dustywilson.com, 1
 dutch.desi, 1
 dutch1.nl, 1
 dutchdare.nl, 1
+dutchessuganda.com, 1
 dutchfoodie.nl, 1
 dutchforkrunners.com, 1
 dutchrank.nl, 1
 dutchsailors.com, 1
 dutchwanderers.nl, 1
 dutchweballiance.nl, 1
 duval.paris, 1
 duyao.de, 0
@@ -14667,17 +14659,17 @@ echofoxtrot.co, 1
 echoit.net, 1
 echoit.net.au, 1
 echoit.services, 1
 echopaper.com, 1
 echorecovery.org, 1
 echosim.io, 1
 echosixmonkey.com, 1
 echosystem.fr, 1
-echoteam.gq, 1
+echoteam.gq, 0
 echoteen.com, 1
 echoworld.ch, 1
 echternach-immobilien.de, 1
 echtes-hutzelbrot.de, 1
 echtgeld-casinos.de, 1
 ecir.pro, 1
 ecir.ru, 1
 ecirtam.net, 1
@@ -14708,17 +14700,16 @@ ecohostingservices.uk, 1
 ecolala.my, 1
 ecole-attalens.ch, 1
 ecole-iaf.fr, 1
 ecoledusabbat.org, 1
 ecolemathurincordier.com, 1
 ecombustibil.ro, 1
 ecomia.dk, 1
 ecompen.co.za, 1
-ecomycie.com, 1
 econativa.pt, 1
 economiafinanzas.com, 1
 economias.pt, 1
 economic-sanctions.com, 1
 economicinclusion.gov, 1
 economics-colleges.com, 1
 economiefidu.ch, 1
 economies.ch, 1
@@ -14745,17 +14736,17 @@ ectora.com, 1
 ecuinformacion.com, 1
 ecupcafe.com, 0
 ecuteam.com, 0
 ecxforum.com, 1
 ed.gs, 1
 ed4becky.net, 1
 edakoe.ru, 1
 edanni.io, 1
-edas.info, 0
+edas.info, 1
 edd-miles.com, 1
 eddesign.ch, 1
 eddmil.es, 1
 eddokloosterman.com, 1
 eddyn.net, 1
 edeca.net, 1
 edehsa.com, 1
 edeka-jbl-treueaktion.de, 1
@@ -14769,17 +14760,16 @@ edgecustomersportal.com, 1
 edgedynasty.com, 1
 edgefantasy.com, 1
 edgeservices.co.uk, 1
 edgetalk.net, 1
 edgevelder.com, 1
 edh.email, 1
 edhesive.com, 1
 edholm.pub, 1
-edhrealtor.com, 1
 edi-gate.com, 1
 edi-gate.de, 1
 edibarcode.com, 1
 edicct.com, 1
 edilane.com, 1
 edilane.de, 1
 edilservizi.it, 1
 edilservizivco.it, 1
@@ -14978,17 +14968,16 @@ eifelindex.de, 0
 eigenbubi.de, 1
 eigenpul.se, 1
 eigenpulse.com, 1
 eighty-aid.com, 1
 eightyfour.ca, 1
 eightysoft.de, 1
 eigpropertyauctions.co.uk, 1
 eihaikyo.com, 1
-eika.as, 1
 eikounoayumi.jp, 1
 eilandprojectkeukens.nl, 1
 eilhan.com, 1
 eimacs.com, 1
 einaros.is, 1
 einfachbahn.de, 1
 einfachmaldiefressehalten.de, 1
 einheft.info, 1
@@ -15026,17 +15015,16 @@ ekawaiishop.com, 1
 ekb-avia.ru, 1
 ekd.de, 1
 ekeblock.com, 1
 ekedc.com, 1
 ekedp.com, 1
 eklepka.com, 1
 eklitzke.org, 1
 ekobudisantoso.net, 1
-ekodevices.com, 1
 ekokontakt.cz, 1
 ekonbenefits.com, 1
 ekong366.com, 1
 ekostecki.de, 1
 ekostrateg.com, 1
 ekouniejow.pl, 1
 ekpj.jp, 1
 ekpyroticfrood.net, 1
@@ -16137,17 +16125,16 @@ et-inf.de, 1
 eta.cz, 1
 etaes.eu, 1
 etajerka-spb.ru, 1
 etaoinwu.win, 1
 etasigmaphi.org, 1
 etath.com, 1
 etax.com.au, 1
 etccooperative.org, 1
-etch.co, 1
 etd-glasfaser.de, 1
 etda.or.th, 1
 etduvindemoselle.fr, 1
 etech-solution.com, 1
 etech-solution.net, 1
 etech-solutions.com, 1
 etechsolution.net, 1
 eteesheet.com, 1
@@ -16534,16 +16521,17 @@ exploravacations.in, 1
 explorebigideas.com, 1
 exploremonero.com, 1
 exploringenderby.com, 1
 expmind.co.in, 1
 expo-america.ru, 1
 expo-asia.ru, 1
 expo-europe.ru, 1
 expo-larionov.org, 1
+exponentialnews.net, 1
 expoort.co.uk, 1
 expoort.com, 1
 expoort.com.br, 1
 expoort.es, 1
 expoort.fr, 1
 expoort.it, 1
 expopodium.com, 1
 exporta.cz, 1
@@ -16903,16 +16891,17 @@ fantraxhq.com, 1
 fanvoice.com, 1
 fanyina.cn, 1
 fanyina.com, 1
 fanyue123.tk, 1
 fanz.pro, 1
 fanzhencha.com, 1
 fanzlive.com, 1
 fap.no, 1
+fapplepie.com, 1
 faq.ie, 1
 faq.lookout.com, 0
 fara.gov, 1
 faradji.nu, 1
 faradome.ws, 1
 faradrive.ir, 1
 faraonplay5.com, 1
 faraonplay7.com, 1
@@ -17220,17 +17209,16 @@ ferrolatino.ch, 1
 ferrone.ru, 1
 ferrousmoon.com, 1
 ferry.tw, 1
 ferticare.pt, 1
 fertila.de, 1
 festaprylar.se, 1
 festival-tipps.com, 1
 festivaljapon.com, 1
-festx.co.za, 1
 fetch.co.uk, 1
 fetchease.com, 1
 fetclips.se, 1
 fetlife.com, 1
 fettlaus.de, 1
 feudalisten.de, 1
 feudaltactics.com, 1
 feuerhuhn.de, 1
@@ -17331,17 +17319,16 @@ figshare.com, 1
 figurasdelinguagem.com.br, 1
 figure.nz, 1
 figuurzagers.nl, 0
 fiilr.com, 1
 fiix.io, 1
 fijnefeestdageneneengelukkignieuwjaar.nl, 1
 fijnewoensdag.nl, 1
 fiken.no, 1
-fikriwildannugraha.com, 1
 fikst.com, 1
 fil-tec-rixen.com, 1
 fil.fi, 1
 filamentia.nl, 1
 filanthropystar.org, 1
 filaretihairlove.gr, 1
 file-cloud.eu, 1
 file-pdf.it, 1
@@ -17351,17 +17338,16 @@ filehash.de, 1
 fileio.io, 1
 files.from-me.org, 1
 filesense.com, 1
 fileservicios.com.ar, 1
 filestar.io, 1
 filestartest.io, 1
 filetransfer.one, 1
 filezilla-project.org, 1
-filezilla.cn, 1
 filhin.es, 1
 filhodohomem.com, 1
 filhomes.ph, 1
 fili.com, 1
 filidorwiese.nl, 1
 filiio.com, 1
 filingsmadeeasy.com, 1
 filip-prochazka.com, 0
@@ -17773,17 +17759,17 @@ flucky.xyz, 1
 fluffycloud.de, 1
 fluggesellschaft.de, 1
 flugplatz-edvc.de, 1
 fluhrers.de, 1
 fluidmeterusa.com, 1
 fluids.ac.uk, 1
 fluitbeurt.nl, 1
 flumble.nl, 1
-flunschi.goip.de, 0
+flunschi.goip.de, 1
 fluoxetine.net, 1
 flurp.de, 0
 flushlife.com, 1
 fluteandpianoteaching.co.uk, 1
 flux.healthcare, 1
 fluxent.de, 0
 fluxfingers.net, 1
 fluxforge.com, 1
@@ -18196,17 +18182,16 @@ freakyawesome.solutions, 1
 freakyawesome.world, 1
 freakyawesome.yoga, 1
 frebi.org, 1
 frebib.co.uk, 1
 frebib.com, 1
 frebib.me, 1
 frebib.net, 1
 freddieonfire.tk, 0
-freddyfazbearspizzeria.com, 1
 freddysfuncastles.co.uk, 1
 fredericcote.com, 1
 frederik-braun.com, 0
 frederikschoell.de, 0
 frederikvig.com, 1
 fredliang.cn, 1
 fredloya.com, 1
 fredriksslaktforskning.se, 1
@@ -18498,17 +18483,16 @@ ftng.se, 1
 ftptest.net, 1
 ftrsecure.com, 1
 ftv.re, 1
 fu-li88.com, 1
 fu-li88.net, 1
 fu898.top, 1
 fuantaishenhaimuli.net, 1
 fuchsy.com, 1
-fuciam.com.co, 1
 fuck-your-false-positive.de, 1
 fuckav.ru, 1
 fuckcf.cf, 1
 fuckcie.com, 1
 fucklife.ch, 1
 fuckobr.com, 1
 fuckobr.net, 1
 fuckobr.org, 1
@@ -18606,17 +18590,16 @@ funtasticinflatablesdurham.co.uk, 1
 funtime-inflatables.co.uk, 1
 funtime.com.ua, 1
 funtime.kiev.ua, 1
 funtimeentertainment.co.uk, 1
 funtimesbouncycastles.co.uk, 1
 fur.red, 1
 furcdn.net, 1
 furcity.me, 1
-furgetmeknot.org, 1
 furgo.love, 1
 furi.ga, 1
 furigana.info, 1
 furikake.xyz, 1
 furkancaliskan.com, 1
 furkot.com, 1
 furkot.de, 1
 furkot.es, 1
@@ -19054,17 +19037,16 @@ gboys.net, 1
 gbs-uk.com, 1
 gc-mc.de, 1
 gc.gy, 1
 gc.net, 1
 gc.ru.net, 1
 gcbit.dk, 1
 gcfadvisors.com, 1
 gcgeeks.com.au, 1
-gcguild.net, 1
 gchq.wtf, 1
 gcoded.de, 1
 gcodetools.com, 1
 gcs-ventures.com, 1
 gcsepod.com, 1
 gd88.cc, 1
 gdax.com, 1
 gdb-tutorial.net, 1
@@ -19114,16 +19096,17 @@ geekbundle.org, 0
 geekclubbooks.com, 1
 geekeffect.co.uk, 1
 geeklair.net, 1
 geeklan.co.uk, 1
 geekles.net, 1
 geeknik.com, 1
 geekpad.com, 1
 geeks.berlin, 1
+geeks.lgbt, 1
 geeks.one, 0
 geekshirts.cz, 1
 geekthis.de, 1
 geektopia.es, 1
 geekwhack.org, 1
 geekwithabudget.com, 1
 geekwu.org, 1
 geekystudios.us, 1
@@ -19441,17 +19424,16 @@ ggss.cf, 1
 ggx.us, 1
 gh16.com.ar, 1
 gha.st, 1
 ghaglund.se, 1
 ghettonetflix.de, 1
 ghfip.com.au, 1
 ghini.com, 1
 ghislainphu.fr, 1
-ghost-legion.com, 1
 ghostblog.info, 0
 ghostcir.com, 1
 ghou.me, 1
 ghowell.io, 1
 ghrelinblocker.info, 1
 ghrelinblocker.org, 1
 ghuntley.com, 0
 giac.org, 1
@@ -19496,17 +19478,16 @@ gifzilla.net, 0
 gig-raiffeisen.de, 1
 gig.ru, 0
 giga.nl, 1
 gigabitz.pw, 1
 gigacog.com, 1
 gigantism.com, 1
 gigawa.lt, 1
 giggletotz.co.uk, 1
-gigime.com, 1
 gigin.eu, 1
 gigin.me, 1
 gigis-pizzeria.de, 1
 gigis.cloud, 1
 gigiscloud.servebeer.com, 1
 giglink.club, 1
 gigolodavid.be, 1
 gigseekr.com, 1
@@ -19581,17 +19562,16 @@ github.com, 1
 githubapp.com, 1
 githubber.com, 1
 githubber.tv, 1
 gitla.in, 1
 gitstuff.tk, 1
 gittigidiyor.com, 1
 gittr.ch, 1
 giuem.com, 1
-giulianosdeli.com, 1
 giunchi.net, 1
 giuseppemacario.men, 1
 give2charity.co, 1
 give2charityapp.com, 1
 giveattheoffice.org, 0
 giveaways.ph, 1
 giveme.online, 1
 given2.com, 1
@@ -19777,16 +19757,17 @@ goarmy.eu, 1
 goatbot.xyz, 1
 goatcloud.com, 1
 gobarrelroll.com, 1
 goblinsatwork.com, 1
 goblintears.com, 1
 gobouncy.co.uk, 1
 gobouncy.com, 1
 gobranding.com.vn, 1
+gocardless.com, 1
 gocher.me, 1
 gochu.se, 1
 gocleanerslondon.co.uk, 1
 god-clan.hu, 1
 god-esb.com, 1
 godattributes.com, 1
 godaxen.tv, 1
 godbo9.cc, 1
@@ -19878,17 +19859,16 @@ gomelphoto.com, 1
 gommista.roma.it, 1
 gondawa.com, 1
 gondelvaartdwarsgracht.nl, 1
 gongjianwei.com, 1
 gongjuhao.com, 1
 gonx.dk, 0
 gonzalesca.gov, 1
 goo.gl, 1
-good-tips.pro, 1
 good588.com, 1
 gooday.life, 1
 gooddomainna.me, 1
 goodfeels.net, 1
 goodhealthtv.com, 1
 goodiesoftware.xyz, 1
 goodquote.gq, 1
 goodryb.top, 1
@@ -19946,27 +19926,25 @@ gospelvestcination.de, 1
 gostaffer.com, 1
 gostargazing.co.uk, 1
 gostest.org, 0
 gostudy.net, 1
 gosu.pro, 1
 gosuland.org, 1
 got-tty.de, 1
 goteborgsklassikern.se, 1
-gotech.com.eg, 0
 gothamlimo.com, 1
 gothic.dating, 1
 gotirupati.com, 0
 gotmalk.org, 0
 goto.google.com, 1
 goto.msk.ru, 1
 goto.world, 1
 goto10.se, 1
 gotomi.info, 1
-gotowned.org, 0
 gotoxy.at, 1
 gotrail.fr, 1
 gottfridsberg.org, 1
 goudenharynck.be, 1
 goufaan.com, 1
 gouforit.com, 1
 goukon.ru, 1
 gouldcooksey.com, 1
@@ -20078,17 +20056,16 @@ graniteind.com, 1
 grannys-stats.com, 1
 grannyshouse.de, 1
 grantcooper.com, 1
 grantdb.ca, 1
 granth.io, 1
 grantmorrison.net, 1
 grantplatform.com, 1
 grantsplatform.com, 1
-granular.ag, 1
 grapee.jp, 1
 grapeintentions.com, 1
 grapevine.is, 1
 graph.org, 1
 graphcommons.com, 1
 graphene.software, 1
 graphic-schools.com, 1
 graphic-shot.com, 1
@@ -20189,18 +20166,16 @@ greenteamtwente.nl, 1
 greenwaylog.net, 1
 greenwithdecor.com, 1
 greer.ru, 1
 greg.red, 1
 gregbrimble.com, 1
 greger.me, 1
 greggsfoundation.org.uk, 1
 gregmartyn.com, 1
-gregmarziomedia-dev.com, 1
-gregmarziomedia.com, 1
 gregmilton.com, 1
 gregmilton.org, 1
 gregmote.com, 1
 grego.pt, 1
 gregoirow.be, 1
 gregorians.org, 1
 gregorkofler.com, 1
 gregory-kramer.fr, 1
@@ -20240,17 +20215,17 @@ grid.studio, 1
 gridle.io, 1
 gridsmartercities.com, 1
 griechische-pfoetchen.de, 1
 griecopelino.com, 1
 griefheart.com, 1
 grieg-gaarden.no, 1
 grieg.com, 1
 grieg.net, 1
-grieg.no, 1
+grieg.no, 0
 grieg.org, 1
 griegfoundation.no, 1
 grieglogistics.no, 1
 griegshipbrokers.com, 1
 griegshipbrokers.no, 1
 griesser2.de, 1
 grifomarchetti.com, 1
 grillen-darf-nicht-gesund-sein.de, 1
@@ -20369,16 +20344,17 @@ gtlfsonlinepay.com, 1
 gtmasterclub.it, 0
 gtmetrix.com, 1
 gtn-pravda.ru, 1
 gtoepfer.de, 1
 gtopala.com, 1
 gtopala.net, 1
 gtour.info, 0
 gtravers-basketmaker.co.uk, 1
+gtts.space, 1
 gtxbbs.com, 1
 gtxmail.de, 1
 guadagnare.info, 1
 guajars.cl, 1
 guannan.net.cn, 1
 guanyembadalona.org, 1
 guanzhong.ca, 1
 guardian360.nl, 1
@@ -20505,17 +20481,16 @@ gvwgroup.com, 1
 gw2efficiency.com, 1
 gw2treasures.com, 1
 gw2zone.net, 1
 gwerder.net, 1
 gwhois.org, 1
 gwrtech.com, 1
 gwsec.co.uk, 1
 gwynfryncottages.com, 1
-gx3.cn, 1
 gxgx.org, 1
 gxlrx.net, 1
 gxmyqy.net, 1
 gyara.moe, 1
 gyas.nl, 1
 gymagine.ch, 1
 gymbunny.de, 1
 gymhero.me, 1
@@ -20981,17 +20956,16 @@ haverstack.com, 1
 havetherelationshipyouwant.com, 1
 hawaar.com, 1
 hawaiianchoice.com, 1
 hawawa.kr, 1
 hawaya.com, 1
 hawk-la.com, 1
 hawkeyeinsight.com, 1
 hawkinsonkiaparts.com, 1
-hawkofgeorgia.com, 1
 hawkon.dk, 1
 hawksguild.com, 1
 hawksracing.de, 1
 hax.to, 1
 haxdroid.com, 1
 haxo.nl, 0
 haxx.hu, 1
 hayai.space, 1
@@ -21059,16 +21033,17 @@ healthandskinbeauty.com, 1
 healthcare.gov, 0
 healthcultureexpo.com, 1
 healthdata.gov, 1
 healtheffectsofasbestos.com, 1
 healthery.com, 1
 healthfinder.gov, 1
 healthfoam.com, 1
 healthgames.co.uk, 1
+healthiercompany.com, 1
 healthiergenerations.co.uk, 1
 healthit.gov, 1
 healthmatchapp.com, 1
 healthplansamerica.org, 1
 healthstar-dev.io, 1
 healthstar.io, 1
 healththoroughfare.com, 1
 healthy-map.com, 1
@@ -21106,16 +21081,17 @@ heartyapp.com, 1
 heartyapp.tw, 1
 heartycraft.com, 1
 heatershop.co.uk, 1
 heatingandairconditioningdallastx.com, 1
 heatingpartswarehouse.co.uk, 1
 heavenlyseals.com, 1
 heavenlysmokenc.com, 1
 heavensattic.co.uk, 1
+heavensinferno.net, 1
 heavyequipments.org, 1
 hebamme-cranio.ch, 1
 hebergeurssd.com, 1
 heberut.gov, 1
 hebikhiv.nl, 1
 hebingying.cn, 1
 hebocon.nl, 1
 hec-espace-entreprise.ch, 1
@@ -21769,17 +21745,16 @@ hongzu.cc, 1
 hongzuwang.com, 1
 hongzuzhibo.com, 1
 honkhonk.net, 1
 honkion.net, 1
 honoka-seitai.jp, 1
 honoka.tech, 1
 honovere.de, 1
 hontoir.eu, 1
-hoodiecrow.com, 1
 hoodoo.io, 1
 hoodoo.tech, 1
 hoodtrader.com, 1
 hoofddorp-centraal.nl, 1
 hookany.com, 1
 hookbin.com, 1
 hookupndate.com, 1
 hoooc.com, 1
@@ -22296,16 +22271,17 @@ hybridworx.org, 1
 hybrydowe-samochody.pl, 1
 hybula.com, 1
 hycken.com, 1
 hyckenberg.com, 1
 hyderabadonlinegifts.com, 1
 hydra.zone, 1
 hydrante.ch, 1
 hydrasolutions.de, 1
+hydro17.com, 1
 hydroagro.pl, 1
 hydrocloud.net, 1
 hydrographicsocietybenelux.eu, 1
 hydronicheatingaustralia.com.au, 1
 hydroturbine.info, 1
 hydrozone.fr, 1
 hyec.jp, 1
 hygo.com, 1
@@ -22361,26 +22337,27 @@ i-office.com.vn, 1
 i-proswiss.com, 1
 i-red.info, 1
 i-scream.space, 1
 i-sports.cz, 1
 i-stats.net, 1
 i-telligence.de, 1
 i-verbi.it, 1
 i00.eu, 1
-i1314.gdn, 1
+i1314.gdn, 0
 i1place.com, 1
 i2b.ro, 1
 i2gether.org.uk, 1
 i2verify.com, 1
 i4m1k0su.com, 1
 i5y.co.uk, 1
 i5y.org, 1
 i66.me, 1
 i879.com, 1
+i95.me, 0
 i9s.in, 1
 ia.cafe, 1
 ia.net, 1
 ia1000.com, 1
 iaco.li, 1
 iactu.info, 1
 iadttaveras.com, 1
 iaeste.no, 1
@@ -22462,17 +22439,16 @@ ibpsrecruitment.co.in, 1
 ibrainmedicine.org, 1
 ibrom.eu, 1
 ibron.co, 0
 ibsafrica.co.za, 1
 ibsglobal.co.za, 1
 ibsociety.com, 1
 ibstyle.tk, 1
 ibuki.run, 1
-ibutikk.no, 1
 ibwc.gov, 1
 ibykos.com, 1
 ic-lighting.com.au, 1
 ic-spares.com, 1
 ic3.gov, 1
 icafecash.com, 1
 icanhasht.ml, 1
 icanhazpass.com, 1
@@ -22501,17 +22477,16 @@ ichbinein.org, 1
 ichbinkeinreh.de, 1
 ichmachdas.net, 1
 ickerseashop.com, 1
 iclart.com, 1
 iclinic.ua, 1
 icloudlogin.com, 1
 icmhd.ch, 1
 icmp2018.org, 1
-icnc.ga, 0
 icnsoft.cf, 1
 icnsoft.ga, 1
 icnsoft.ml, 1
 icnsoft.org, 1
 icobench.com, 1
 icodeconnect.com, 1
 icoh.it, 1
 iconomi.net, 1
@@ -22543,16 +22518,17 @@ id.fedoraproject.org, 0
 id.mayfirst.org, 0
 id.search.yahoo.com, 0
 id7.fr, 1
 idaeus.eu, 1
 idahoansforliberty.net, 1
 idarv.com, 1
 idaspis.com, 1
 idatha.de, 1
+idblab.tk, 1
 idbs.com, 1
 idc-business.be, 1
 idc.yn.cn, 1
 idconsult.nl, 1
 idcrane.com, 1
 iddconnect.com, 1
 iddconnect.org, 1
 ideadozz.hu, 1
@@ -23387,17 +23363,16 @@ insinuator.net, 1
 insistel.com, 1
 insofttransfer.com, 1
 insolent.ch, 1
 insolved.com, 1
 insouciant.org, 1
 insping.com, 1
 inspiratienodig.nl, 1
 inspirationalquotesuk.co.uk, 1
-inspired-creations.co.za, 1
 inspired-lua.org, 1
 inspiredlife.fun, 1
 inspiredrealtyinc.com, 1
 insrt.uk, 1
 insside.net, 1
 instafind.nl, 1
 instafuckfriend.com, 1
 instagram-atom.appspot.com, 1
@@ -23487,16 +23462,17 @@ intencje.pl, 1
 intensifyrsvp.com.au, 1
 inter-corporate.com, 1
 inter-culinarium.com, 1
 interabbit.com, 1
 interaffairs.com, 1
 interaktiva.fi, 1
 interasistmen.se, 1
 interchangedesign.com, 1
+interchanges.io, 1
 intercom.com, 1
 intercom.io, 1
 interessengemeinschaft-pregelstrasse.tk, 1
 interessiert-uns.net, 1
 interfloraservices.co.uk, 1
 interfug.de, 1
 intergenx.co.uk, 1
 intergenx.com, 1
@@ -23869,16 +23845,17 @@ iskaron.de, 1
 iskaz.rs, 1
 iskkk.com, 1
 iskkk.net, 1
 iskogen.nu, 1
 islam.si, 1
 islamicmarkets.com, 1
 islamonline.net, 1
 islandhosting.com, 1
+islandinthenet.com, 1
 islandlakeil.gov, 1
 islavolcan.cl, 1
 isletech.net, 1
 isliada.org, 1
 islief.com, 1
 islightdown.today, 1
 islykaithecutest.cf, 1
 islykaithecutest.ml, 1
@@ -24009,16 +23986,17 @@ itdashboard.gov, 1
 itds-consulting.com, 1
 itds-consulting.cz, 1
 itds-consulting.eu, 1
 itecor.net, 1
 iteecafe.hu, 1
 iteha.de, 1
 iteke.ml, 1
 iteke.tk, 1
+iteli.eu, 1
 iterader.com, 1
 iterror.co, 1
 itesign.de, 1
 itfh.eu, 1
 itfix.cz, 1
 itforge.nl, 1
 itgirls.rs, 1
 ithakama.com, 1
@@ -25584,16 +25562,17 @@ karguine.in, 1
 karhm.com, 1
 karhukamera.com, 1
 karina.gd, 1
 karit.nz, 1
 karjala-ski.ru, 1
 karlbowden.com, 1
 karlic.net, 1
 karlin.run, 1
+karlis-kavacis.id.lv, 1
 karlloch.de, 1
 karlproctor.co.uk, 1
 karlsmithmn.org, 1
 karlzotter.com, 1
 karmaassurance.ca, 1
 karmabaker.com, 1
 karmaflux.com, 1
 karmainsurance.ca, 1
@@ -26194,16 +26173,18 @@ kiwi.wiki, 1
 kiwipayment.com, 1
 kiwipayments.com, 1
 kiwiplace.com, 1
 kix.moe, 1
 kiyotatsu.com, 1
 kizomba.info, 1
 kizzycode.de, 1
 kj-prince.com, 1
+kj1396.net, 1
+kj1397.com, 1
 kjaer.io, 1
 kjarni.cc, 1
 kjarrval.is, 1
 kjchernov.info, 1
 kjellner.com, 1
 kjelltitulaer.com, 1
 kjellvn.net, 1
 kjmedia.dk, 1
@@ -26581,17 +26562,16 @@ kozawa.tokyo, 1
 kozmik.co, 1
 kozuch.biz, 1
 kpfanworld.com, 1
 kpforme.org, 1
 kpinvest.eu, 1
 kplasticsurgery.com, 1
 kplnet.net, 1
 kpop.re, 1
-kpopsource.com, 1
 kpumuk.info, 1
 kpvpn.com, 1
 kpx1.de, 1
 kr.search.yahoo.com, 0
 kr0n.dk, 1
 krachtinverbinding.nl, 1
 kradalby.no, 1
 kraft.blog, 1
@@ -27285,17 +27265,16 @@ lauensteiner.de, 0
 laufpix.de, 1
 lauftreff-himmelgeist.de, 1
 laughinggrapepublishing.com, 1
 laukstein.com, 1
 launayflorian.net, 1
 launcher-minecraft.com, 1
 launchkey.com, 0
 launchmylifend.com, 1
-launchpad-app2.com, 1
 launchpadder2.com, 1
 laupv.online, 1
 lauraandwill.wedding, 0
 lauraenvoyage.fr, 1
 laurakashiwase.com, 1
 lauraofrank.com, 1
 lauraohagan.com, 1
 laurasplacefamilysupport.org.au, 1
@@ -27391,17 +27370,16 @@ lce-events.com, 1
 lcgaj.com, 1
 lcht.ch, 0
 lclarkpdx.com, 1
 lcrmscp.gov, 1
 lcti.biz, 1
 lcx.cc, 1
 lcy.cat, 1
 lcy.im, 0
-lcy.moe, 1
 ld-begunjscica.si, 1
 ldc.com.br, 0
 ldcraft.pw, 1
 ldjb.jp, 1
 ldsun.com, 1
 ldvsoft.net, 0
 le-bar.org, 1
 le-blog.ch, 1
@@ -27423,17 +27401,16 @@ leadbook.ru, 1
 leadbox.cz, 1
 leaderoftheresistance.com, 0
 leaderoftheresistance.net, 0
 leadership9.com, 1
 leadgenie.me, 1
 leadinfo.com, 1
 leadplan.ru, 1
 leadquest.nl, 1
-leaf-consulting.de, 1
 leafandseed.co.uk, 1
 leafans.tk, 0
 leafinote.com, 1
 leafland.co.nz, 1
 leakedminecraft.net, 1
 leakforums.net, 1
 leaks.directory, 1
 leamsigc.com, 0
@@ -27453,17 +27430,16 @@ learning-id.com, 1
 learningis1.st, 1
 learninglaw.com, 1
 learningman.top, 1
 learnlux.com, 1
 learnpianogreece.com, 1
 learnplayground.com, 1
 learntale.com, 1
 learnthetruth.tk, 1
-learntube.cz, 1
 leaseit24.com, 1
 leaseit24.de, 1
 leaseourthings.com, 1
 leaseplan.com, 1
 leasit.at, 1
 leasit.de, 1
 leastsignificantbit.de, 1
 leatam.fr, 1
@@ -27597,23 +27573,23 @@ lemouillour.fr, 1
 lemuslimpost.com, 1
 lenagroben.de, 1
 lenalio.fr, 1
 lenaneva.ru, 1
 lence.net, 1
 lendahandmissionteams.org, 1
 lendingclub.com, 1
 lenget.com, 1
+lenguajedeprogramacion.com, 1
 lengyelnyelvoktatas.hu, 1
 lengyelul.hu, 1
 lengzzz.com, 1
 lenidh.de, 1
 leninalbertop.com.ve, 1
 lenkunz.me, 1
-lennier.info, 1
 lennyobez.be, 1
 lenostech.gr, 1
 lenou.nl, 1
 lenr-forum.com, 1
 lensdoctor.com, 1
 lenspirations.com, 1
 lensual.space, 1
 lenuagebauche.org, 1
@@ -27719,17 +27695,16 @@ letsdebug.net, 1
 letsdocode.com, 1
 letsencrypt-for-cpanel.com, 1
 letsflyinto.space, 1
 letsgame.nl, 1
 letsgetchecked.com, 1
 letsgetintouch.com, 1
 letsgowhilewereyoung.com, 1
 letshome.mx, 1
-letskick.ru, 1
 letsnet.org, 1
 letson.me, 1
 letsorganise.uk, 1
 letspartyrugby.co.uk, 1
 letsprint3d.net, 1
 letssackcancer.org, 1
 letstalkcounseling.com, 1
 letterbox-online.de, 1
@@ -28018,17 +27993,16 @@ limawi.io, 1
 limberg.me, 1
 limbo.services, 1
 limelabs.de, 1
 limelabs.io, 1
 limeres.com, 1
 limereslaw.com, 1
 limitededitioncomputers.com, 1
 limitededitionsolutions.com, 1
-limitxyz.com, 1
 limn.me, 1
 limoairporttoronto.net, 1
 limousineservicezurich.com, 1
 limpid.nl, 1
 limules.ch, 1
 limx.win, 1
 lin.fi, 1
 linaklein.de, 1
@@ -28055,17 +28029,16 @@ linden.me, 1
 lindeskar.se, 1
 lindnerhof-taktik.de, 1
 lindnerhof.info, 1
 lindo.ru, 1
 lindon.pw, 1
 lindsayanderson.com, 1
 lindsaygorski.com, 1
 lindskogen.se, 1
-lindy.co, 0
 line-wise.com, 1
 line.biz, 1
 line.co.nz, 1
 lineageos.org, 1
 linearaudio.net, 1
 linearaudio.nl, 1
 linearmap.com, 1
 lingeriesilhouette.com, 1
@@ -28537,17 +28510,16 @@ loket.nl, 1
 lolcorp.pl, 1
 lolcow.farm, 1
 lolhax.org, 1
 loli.com, 1
 loli.net, 1
 loli.pet, 1
 loli.ski, 1
 loli.tube, 1
-loli.vip, 1
 loli.world, 1
 loliblogs.cf, 1
 loliblogs.ga, 1
 loliblogs.gq, 1
 loliblogs.ml, 1
 lolibrary.org, 1
 lolic.xyz, 1
 lolicon.eu, 1
@@ -28715,16 +28687,17 @@ lovemiku.info, 1
 lovemomiji.com, 1
 lovenwishes.com, 1
 loveph.one, 1
 lover-bg.com, 1
 loverepublic.ru, 1
 lovesmagical.com, 1
 lovesupremefestival.com, 1
 lovetravel360.com, 1
+lovevape.co, 1
 loveysa.ch, 1
 lovg.ren, 1
 lovingearth.co, 1
 lovingthermo.com, 1
 lovizaim.ru, 1
 low-diets.com, 1
 lowbidders.com, 1
 lowcostwire.com.au, 1
@@ -28736,17 +28709,16 @@ lowson.ca, 1
 lowt.us, 1
 loyaleco.it, 1
 loyaltech.ch, 1
 loyaltyondemand.club, 1
 loyaltyondemand.eu, 1
 lp-support.nl, 1
 lpacademy.com.br, 1
 lpbk-bethel.de, 0
-lprcommunity.co.za, 1
 lpt-nebreziny.eu, 1
 lq.hr, 1
 lra-cloud.de, 1
 lrdo.net, 1
 lrhstsa.com, 1
 lriese.ch, 1
 lrssystems.com, 1
 ls-alarm.de, 1
@@ -28940,17 +28912,16 @@ luukdebruincv.nl, 1
 luukklene.nl, 1
 luuppi.fi, 1
 luv.asn.au, 1
 luvare.com, 1
 luvbridal.com.au, 1
 luvplay.co.uk, 1
 luxcraft.eng.br, 1
 luxecalendar.com, 1
-luxescreenprotector.nl, 0
 luxfosdecoenterprise.com, 1
 luxsci.com, 1
 luxurynsight.net, 0
 luxurytimepieces.net, 1
 luxuryweddingsindonesia.com, 1
 luxusnivoucher.cz, 1
 luxusnyvoucher.sk, 1
 luxvacuos.net, 1
@@ -29182,16 +29153,17 @@ magicalcircuslv.com, 1
 magicamulet.me, 1
 magicball.co, 1
 magicbroccoli.de, 1
 magiccards.info, 1
 magicdaysomagh.co.uk, 1
 magicdlp.com, 1
 magicjudges.org, 1
 magiclen.org, 1
+magicsms.pl, 1
 magicspaceninjapirates.de, 1
 magictable.com, 1
 magicvodi.at, 1
 magilio.com, 1
 magnacarebroker.com, 1
 magnacumlaude.co, 1
 magnate.co, 1
 magneticanvil.com, 1
@@ -29724,16 +29696,17 @@ marqperso.ch, 1
 marquepersonnelle.ch, 1
 marqueswines.co.uk, 1
 marrai.de, 1
 marriage-shrine.jp, 1
 marrickvilleapartments.com.au, 1
 marron-dietrecipe.com, 1
 marsanvet.com, 1
 marsatapp.com, 1
+marsble.com, 0
 marseillekiteclub.com, 1
 marshallford.me, 1
 marshallscastles.com, 1
 marshallwilson.com, 1
 marshmallow.co, 1
 marshmallow.com, 1
 marshyplay.live, 1
 marsikelektro.cz, 1
@@ -29780,17 +29753,16 @@ marxmyths.org, 1
 marycliffpress.com, 1
 maryeclark.com, 1
 maryeileen90.party, 1
 maryhaze.net, 1
 maryjaneroach.com, 1
 maryjruggles.com, 1
 marykatrinaphotography.com, 1
 marylandbasementandcrawlspacewaterproofing.com, 1
-marzio.co.za, 1
 masarik.sh, 1
 masatotaniguchi.jp, 1
 masautonomo.com, 1
 masayahost.com, 1
 masaze-hanka.cz, 1
 mascorazon.com, 1
 mascosolutions.com, 1
 masdillah.com, 1
@@ -30779,16 +30751,17 @@ michael.band, 1
 michaelasawyer.com, 1
 michaelband.co, 1
 michaelband.com, 1
 michaelcullen.name, 1
 michaeleichorn.com, 1
 michaelhrehor.com, 1
 michaeliscorp.com, 1
 michaelismold.com, 1
+michaelizquierdo.com, 1
 michaeljdennis.com, 1
 michaelkuchta.me, 1
 michaell.io, 1
 michaell.xyz, 1
 michaelleibundgut.com, 1
 michaelloveys.com, 1
 michaelpelletterie.it, 1
 michaelpfrommer.de, 1
@@ -30899,16 +30872,17 @@ miguelmenendez.pro, 1
 miguelmoura.com, 1
 miguia.tv, 1
 mihgroup.eu.org, 1
 mihgroup.net, 1
 mihijoesdislexico.es, 1
 mihnea.net, 1
 mijcorijneveld.nl, 1
 mijn-financien.be, 1
+mijnetickets.nl, 0
 mijnetz.nl, 1
 mijnkerstkaarten.be, 1
 mijnkinderkleding.com, 1
 mijnpartijhandel.nl, 1
 mijnreisoverzicht.nl, 1
 mijnsite.ovh, 1
 mijnstembureau.nl, 1
 mijntelefoonboek.com, 1
@@ -31224,16 +31198,17 @@ mittagonggardencentre.com.au, 1
 mittagonghomestead.com.au, 1
 mittbolan.se, 1
 mittelunsachlich.de, 1
 mittenofficesystems.com, 1
 mitylite.com, 1
 mitzpettel.com, 1
 miui-germany.de, 1
 miukimodafeminina.com, 1
+mivestuariolaboral.com, 1
 mivzak.im, 1
 mivzakim.biz, 1
 mivzakim.cf, 1
 mivzakim.ga, 1
 mivzakim.gq, 1
 mivzakim.info, 1
 mivzakim.ml, 1
 mivzakim.mobi, 1
@@ -31423,17 +31398,16 @@ mocking-bird.org, 1
 mococo.co.uk, 1
 mocurio.com, 1
 modafinil.com, 1
 modafinil.net, 1
 modafinil.wiki, 1
 modafo.com, 1
 modalogi.com, 1
 modalrakyat.com, 1
-modav.org, 1
 modcasts.video, 1
 modded-minecraft-server-list.com, 1
 modding-forum.com, 1
 modding-welt.com, 1
 mode-hautnah.de, 1
 mode-individuell.de, 1
 modecaso.com, 1
 modehaus-marionk.de, 1
@@ -31691,16 +31665,17 @@ moppy.org, 1
 mopxing.com, 1
 mora.pl, 1
 morbatex.com, 1
 morbiceramicindustry.com, 1
 morbitzer.de, 1
 morbius.cz, 1
 morbotron.com, 1
 morchino.ch, 1
+morchstore.com, 1
 mordrum.com, 1
 more-hikkoshi.com, 1
 more-terrain.de, 1
 moreal.co, 1
 moreapp.co.uk, 1
 morenci.ch, 1
 moreniche.com, 1
 morepablo.com, 1
@@ -31934,17 +31909,17 @@ mspnocsupport.com, 1
 mspsocial.net, 1
 msquadrat.de, 1
 msroot.de, 1
 mssora.com, 1
 mssys.de, 1
 mstdn.blue, 1
 mstdn.club, 1
 mstdn.fr, 1
-mstdn.io, 1
+mstdn.io, 0
 mstdn.onl, 0
 mstdn.vodka, 1
 msuess.me, 1
 msuna.net, 1
 msv-limpezas.pt, 1
 msx.org, 1
 msz-fotografie.de, 1
 mszavodumiru.cz, 1
@@ -32526,17 +32501,17 @@ myrnabiondo.com.br, 1
 myrotvorets.center, 1
 myrotvorets.news, 1
 myrp.co, 1
 myruststats.com, 1
 mysad.de, 1
 mysber.ru, 1
 myschoolphoto.org, 1
 myseatime.com, 1
-mysecretcase.com, 0
+mysecretcase.com, 1
 mysectools.org, 1
 myself5.de, 1
 myseo.ga, 1
 myserv.one, 1
 myservice.store, 0
 myservicearl.com, 1
 mysexydate24.com, 1
 mysignal.com, 1
@@ -32844,33 +32819,31 @@ natecraun.net, 0
 natehobi.com, 1
 natgeofreshwater.com, 1
 nathaliebaron.ch, 1
 nathaliebaroncoaching.ch, 1
 nathaliedijkxhoorn.com, 1
 nathaliedijkxhoorn.nl, 1
 nathan.io, 1
 nathan.ovh, 1
-nathanaeldawe.com, 1
 nathankonopinski.com, 1
 nathanmfarrugia.com, 1
 nathansmetana.com, 1
 nathumarket.com.br, 1
 nation-contracting.com.hk, 1
 nationalbank.gov, 1
 nationalbanknet.gov, 1
 nationalcentereg.org, 1
 nationalcprfoundation.com, 1
 nationalcrimecheck.com.au, 1
 nationalhomequotes.com, 1
 nationalmall.gov, 1
 nationalmap.gov, 1
 nationalpassportservice.info, 1
 nationalpriorities.org, 1
-nationaltaxprep.com, 1
 nationaltrails.ru, 1
 nationwiderealtyinvestors.com, 1
 natives-team.ch, 1
 nativitynj.org, 1
 nativs.ch, 1
 natlec.com, 1
 natropie.pl, 1
 natsumihoshino.com, 1
@@ -33529,17 +33502,17 @@ niallator.com, 1
 nibb13.tech, 1
 nibo.blog, 1
 nic.goog, 1
 nic.gov, 1
 nic.how, 1
 nic.soy, 1
 nic.xn--q9jyb4c, 1
 nice.ch, 1
-niceb5y.net, 0
+niceb5y.net, 1
 niceguyit.biz, 1
 nicesco.re, 1
 nicesleepo.com, 1
 nicestudio.co.il, 0
 nichi.co, 1
 nichijou.com, 1
 nicholasperkins.io, 1
 nicholaspruss.com, 1
@@ -33628,17 +33601,16 @@ nigger.racing, 1
 niggo.eu, 1
 night2stay.cn, 1
 night2stay.com, 1
 night2stay.de, 1
 night2stay.fr, 1
 night2stay.ru, 1
 nightfirec.at, 1
 nightfirecat.com, 1
-nightmoose.org, 1
 nightsi.de, 1
 nightstand.io, 1
 nightwinds.tk, 1
 nihilistan.tk, 1
 nihon-no-sake.net, 1
 nihseniorhealth.gov, 0
 nihtek.in, 1
 nii2.org, 1
@@ -33753,16 +33725,17 @@ nl3ehv.nl, 1
 nlap.ca, 0
 nlbewustgezond.nl, 1
 nlegall.fr, 1
 nlfant.eu, 1
 nllboard.co.uk, 1
 nlleisure.co.uk, 1
 nlm.gov, 1
 nlt.by, 0
+nmd.so, 1
 nmmlp.org, 1
 nmnd.de, 1
 nmontag.com, 1
 nn.cz, 1
 nna774.net, 1
 nnqc.nl, 1
 no-ip.cz, 1
 no-xice.com, 1
@@ -34011,16 +33984,17 @@ notoriousdev.com, 1
 nototema.com, 1
 notsafefor.work, 1
 nottres.com, 1
 noudjalink.nl, 1
 nourishandnestle.com, 1
 noustique.com, 1
 nova-dess.ch, 1
 nova-it.pl, 1
+nova-kultura.org, 1
 nova-wd.org.uk, 1
 nova.live, 1
 novabench.com, 1
 novacal.ga, 1
 novacoast.com, 0
 novadermis.es, 1
 novafreixo.pt, 1
 novaiguacu.net.br, 1
@@ -34191,16 +34165,17 @@ nusatrip-api.com, 1
 nussadoclub.org, 1
 nut.services, 1
 nutikell.com, 1
 nutleyeducationalfoundation.org, 1
 nutleyef.org, 1
 nutpanda.com, 1
 nutra-creations.com, 1
 nutri-spec.me, 1
+nutricaovegana.com, 1
 nutriciametabolics-shop.de, 1
 nutridieta.com, 1
 nutrieduca.com, 1
 nutrifyyourself.com, 1
 nutripedia.gr, 1
 nutrishop.com, 1
 nutrition.gov, 1
 nuttyveg.com, 1
@@ -34325,17 +34300,16 @@ obligacjekk.pl, 1
 oboeta.com, 1
 obono.at, 1
 obrienswine.ie, 1
 obrobka-zdjec.pl, 1
 obs.group, 1
 obscur.us, 1
 obscureware.xyz, 1
 observatory.se, 1
-observer.name, 1
 obsessharness.com, 1
 obsidianirc.net, 1
 obsproject.com, 1
 obtima.org, 1
 obud.cz, 1
 obxlistings.com, 1
 obyvateleceska.cz, 1
 obzoroff.info, 1
@@ -34434,17 +34408,16 @@ oenings.eu, 1
 oes.org.gt, 1
 oessi.eu, 1
 of2m.fr, 1
 ofcampuslausanne.ch, 1
 ofda.gov, 1
 ofertasadsl.com, 1
 ofertino.es, 1
 ofertolino.fr, 1
-off-the-clock.us, 1
 offandonagain.org, 1
 offbyinfinity.com, 1
 offenekommune.de, 1
 offenes-deutschland.de, 1
 offersgame.com, 1
 offertegiuste.com, 1
 offfbynight.be, 1
 offgames.io, 1
@@ -34714,17 +34687,16 @@ onedrive.com, 1
 onedrive.live.com, 0
 onee3.org, 1
 onefour.ga, 0
 oneheartbali.church, 1
 oneidentity.me, 1
 oneindex.tk, 1
 oneiroi.co.uk, 1
 onelawsuit.com, 1
-onemeter.com, 1
 onemid.net, 1
 onemoonmedia.de, 1
 oneononeonone.de, 1
 oneononeonone.tv, 1
 onepercentrentals.com, 1
 onepointsafeband.ca, 1
 onepointsafeband.com, 1
 onepointzero.com, 1
@@ -35157,29 +35129,26 @@ osmani-gebaeudereinigung.de, 1
 osmanlitorunu.com, 1
 osmosis.org, 1
 osmre.gov, 1
 osnova.cz, 1
 osobliwydom.pl, 1
 osolutionscorp.com, 1
 osomjournal.org, 1
 ospf.sk, 1
-osprecos.com.br, 1
-osprecos.pt, 1
 ospree.me, 1
 osquery.io, 1
 ostachstore.com, 1
 ostan-collections.net, 1
 osterkraenzchen.de, 1
 ostgotamusiken.se, 1
 osti.gov, 1
 ostimwebyazilim.com, 1
 ostr.io, 1
 ostrov8.com, 1
-osusume-houhou.com, 1
 osuszanie-krakow.pl, 1
 osuszanie-radom.pl, 1
 osuszanie-warszawa.pl, 1
 oswalds.co.uk, 1
 oswaldsmillaudio.com, 1
 oswbouncycastles.co.uk, 1
 osx86spain.com, 1
 oszri.hu, 1
@@ -35249,16 +35218,17 @@ outdoorlightinghiddenhills.com, 1
 outdoorlightinglakesherwood.com, 1
 outdoorlightingmalibu.com, 1
 outdoorlightingmoorpark.com, 1
 outdoorlightingnewburypark.com, 1
 outdoorlightingoakpark.com, 1
 outdoorlightingsimivalley.com, 1
 outdoorlightingthousandoaks.com, 1
 outdoorlightingwestlakevillage.com, 1
+outerlimitsdigital.com, 1
 outetc.com, 1
 outfit-weimar.eu, 1
 outgress.com, 1
 outincanberra.com.au, 1
 outka.xyz, 1
 outline.ski, 1
 outlookonthedesktop.com, 1
 outofcontrol.ca, 1
@@ -35451,17 +35421,16 @@ pagina394.com.br, 1
 paginaweb4u.com, 1
 pagure.io, 1
 pagure.org, 1
 pahae.de, 0
 pahealthbilling.com, 1
 pahlawanpulsa.com, 1
 pahub.io, 1
 paichai.space, 0
-paigejulianne.com, 1
 paincareehr.com, 1
 paindata.dk, 1
 painefamily.co.uk, 1
 painosso.org, 1
 paint-it.pink, 1
 paintball-ljubljana.si, 1
 paintball-shop.sk, 1
 paintcolorsbysue.com, 1
@@ -35728,16 +35697,17 @@ passabook.com, 1
 passcod.name, 1
 passendonderwijs.nl, 0
 passfilesafe.com, 1
 passfoto-deinfoto.ch, 1
 passieposse.nl, 1
 passionatefoodie.co.uk, 1
 passionatehorsemanship.com, 1
 passionatelife.com.au, 1
+passionebenessere.com, 1
 passionpictures.eu, 1
 passions-art.com, 1
 passover-fun.com, 1
 passphrase.today, 1
 passport.yandex.by, 1
 passport.yandex.com, 1
 passport.yandex.com.tr, 1
 passport.yandex.kz, 1
@@ -35825,17 +35795,16 @@ patsyforyou.ch, 1
 patsytoforyou.ch, 1
 pattonfanatic.com, 1
 pattuka.com, 1
 pattyliao.com, 1
 paudley.ca, 1
 paudley.com, 1
 paudley.org, 1
 paul-barton.co.uk, 1
-paul-bronski.de, 1
 paul.reviews, 1
 pauladamsmith.com, 1
 paulbakaus.com, 1
 paulbdelaat.nl, 1
 paulbramhall.uk, 1
 paulchen.at, 1
 paulcooper.me.uk, 1
 pauldev.co, 1
@@ -35873,17 +35842,16 @@ paveljanda.com, 1
 pavelrebrov.com, 1
 pavelstriz.cz, 1
 pavio.org, 1
 paw.cloud, 1
 paw.pt, 1
 pawel-international.com, 1
 pawelnazaruk.com, 1
 pawelurbanek.com, 1
-pawfriends.org.za, 1
 pawsomebox.co.uk, 1
 pawspuppy.com, 1
 pawsr.us, 1
 pawsru.org, 1
 paxchecker.com, 1
 paxerahealth.com, 1
 pay-online.in, 1
 pay.gov, 1
@@ -36074,17 +36042,17 @@ pelican.ie, 1
 peliweb.com, 1
 pellet.pordenone.it, 1
 pelletizermill.com, 1
 pelletsprice.com, 1
 pelopogrund.com, 1
 pelopoplot.com, 1
 pelotonimports.com, 1
 pemagrid.org, 1
-pemborongbangunan.id, 1
+pemborongbangunan.id, 0
 pems.gov.au, 1
 pen-sec.de, 1
 penaugustin.com, 1
 pencepay.com, 1
 pencil2d.org, 1
 pencillab.cn, 1
 pendriveapps.com, 1
 penetrationstest.se, 1
@@ -36125,17 +36093,16 @@ peoplesguardian.org, 1
 pepeelektro.sk, 1
 peperstraat.online, 1
 pepfar.gov, 1
 pepgrid.net, 1
 peplog.nl, 1
 pepme.net, 1
 peppelmedi.fi, 1
 pepstaff.net, 1
-pepwaterproofing.com, 1
 pequenosfavoritos.com.br, 0
 per-olsson.se, 1
 pera.gs, 1
 perala.me, 1
 peraparker.cz, 1
 percolate.com, 1
 percraft.com, 1
 percy.io, 1
@@ -37497,17 +37464,16 @@ praxis-familienglueck.de, 1
 praxis-odermath.de, 1
 praxistipp24.com, 1
 prayerrequest.com, 1
 prazeresdavida.com.br, 1
 prc.gov, 1
 pre-lean-consulting.de, 1
 precedecaritas.com.br, 1
 precept.uk.com, 1
-preciosde.es, 1
 preciouslife.fr, 1
 preciscx.com, 1
 preciseassemblies.com, 1
 precision.st, 1
 precisiondigital-llc.com, 1
 precisionmachineservice.com, 1
 precisionventures.com, 1
 precode.eu, 1
@@ -37554,16 +37520,17 @@ prenatalgeboortekaartjes.nl, 1
 prepadefi.fr, 1
 prepaid-cards.xyz, 1
 prepaid-voip.nl, 1
 prepaidgirl.com, 1
 prepaidkredietkaart.be, 1
 prepare-job-hunting.com, 1
 preparetheword.com, 0
 prepavesale.fr, 1
+preposted.com, 1
 preprodfan.gov, 1
 presbee.com, 1
 presbvm.org, 1
 presbyterian-colleges.com, 1
 prescotonline.co.uk, 1
 present-m.com, 1
 presentationmedia.com, 1
 preserveourhillcountry.org, 1
@@ -37927,16 +37894,17 @@ prostohobby.ru, 1
 prostoporno.net, 1
 prostoporno.sexy, 1
 prostoporno.video, 1
 prostoporno.vip, 1
 prostye-recepty.com, 1
 prosurveillancegear.com, 1
 prot.ch, 1
 proteapower.co.za, 1
+protech.ge, 1
 protectedreport.com, 1
 protectem.de, 1
 protectoraanimalesalicante.org, 1
 protectr.de, 1
 protege.moi, 1
 protegetudescanso.com, 1
 protein-riegel-test.de, 1
 protempore.fr, 1
@@ -38067,17 +38035,18 @@ psychoco.net, 0
 psychologie-hofner.at, 1
 psychotechnique.be, 1
 psychotechnique.ch, 1
 psychotechniquetest.fr, 1
 psychotherapie-kp.de, 1
 psycolleges.com, 1
 psydix.org, 1
 psyk.yt, 1
-psylab.cc, 1
+psylab.re, 1
+psylab.vip, 1
 psynapse.net.au, 1
 psytrance-pro.com, 1
 pt-d.ru, 1
 pt-server.de, 1
 pt.im, 1
 ptal.eu, 1
 ptasiepodroze.eu, 1
 ptbi.org.pl, 1
@@ -38363,17 +38332,16 @@ qoor.io, 1
 qotw.net, 1
 qpcna.org, 1
 qponverzum.hu, 1
 qq-navi.com, 1
 qq885.com, 1
 qqiao.me, 1
 qqj.net, 1
 qqrss.com, 1
-qqvips.com, 1
 qr-city.org, 1
 qr.cl, 1
 qrbird.com, 1
 qrcontagion.com, 1
 qrlfinancial.com, 1
 qrpatrol.com, 1
 qrpth.eu, 1
 qruiser.com, 1
@@ -38489,17 +38457,16 @@ quire.io, 1
 quirkytravelguy.com, 1
 quisido.com, 1
 quitarlasmanchasde.com, 1
 quitimes.com, 1
 quizogames.com, 1
 qul.link, 1
 quli.nl, 0
 qunzi.la, 1
-qunzi.org, 1
 quocdesign.ch, 1
 quote.gq, 1
 quoteidiot.com, 1
 quotev.com, 1
 quovadisaustria.com, 1
 quppa.net, 1
 quuz.org, 1
 qvg.company, 1
@@ -38589,17 +38556,16 @@ radartek.com, 1
 radcube.hu, 1
 radegundisfest.de, 1
 radfieldhomecare.co.uk, 1
 radfieldhomecarefranchising.co.uk, 1
 radical.org, 1
 radicaloptimism.org, 1
 radins.com, 1
 radio-pulsar.eu, 1
-radio-utopie.de, 0
 radio1.ie, 1
 radioactivenetwork.xyz, 1
 radioafibra.com.br, 1
 radiobox.net, 1
 radiocommande-industrielle.fr, 1
 radiocommg.com.br, 1
 radiocomsaocarlos.com.br, 1
 radiofmimagen.net, 1
@@ -38758,17 +38724,16 @@ raoul-kieffer.net, 1
 rap4ever.org, 1
 rapdogg.com, 1
 rapenroer.com, 1
 rapenroer.nl, 1
 raphael.li, 1
 raphaeladdile.com, 1
 raphaelcasazza.ch, 1
 raphaelmoura.ddns.net, 1
-raphaelschmid.eu, 1
 raphrfg.com, 1
 rapidapp.io, 1
 rapidflow.io, 1
 rapidhubs.com, 1
 rapidminer.com, 1
 rapido.nu, 1
 rapidoo.com.br, 1
 rapidshit.net, 1
@@ -38883,17 +38848,16 @@ rcmurphy.com, 1
 rcnitrotalk.com, 1
 rcoliveira.com, 1
 rcraigmurphy.com, 1
 rcraigmurphy.net, 1
 rcsolutions.nl, 1
 rct.sk, 1
 rct.uk, 1
 rctalk.com, 1
-rcx.io, 1
 rdactive.de, 1
 rdactive.net, 1
 rdcdesign.com, 1
 rdfencingandgates.co.uk, 1
 rdfproject.it, 1
 rdfz.tech, 1
 rdh.asia, 1
 rdjb2b.com, 1
@@ -39304,17 +39268,16 @@ remaimodern.org, 1
 remain.london, 1
 remambo.jp, 1
 remarketable.org, 1
 remax.at, 1
 remeb.de, 1
 remedi.tokyo, 1
 remedionaturales.com, 1
 remedioparaherpes.com, 1
-remedios-caserospara.com, 1
 remedyrecoverymat.com, 1
 remejeanne.com, 1
 remembermidi.sytes.net, 1
 rememberthemilk.com, 0
 remi-saurel.com, 1
 remiafon.com, 1
 remilner.co.uk, 1
 remini.cz, 1
@@ -39585,16 +39548,17 @@ rhaegal.me, 1
 rhd-instruments.com, 1
 rhd-instruments.de, 1
 rhees.nl, 1
 rheinneckarmetal.com, 1
 rheinturm.nrw, 1
 rheocube.com, 1
 rhese.net, 1
 rhetorical.ml, 1
+rhetthenckel.com, 1
 rheuma-online.de, 1
 rhevelo.com, 1
 rhinelander.ca, 1
 rhinobase.net, 0
 rhinoceroses.org, 1
 rhnet.at, 1
 rhodenmanorcattery.co.uk, 1
 rhodes.ml, 1
@@ -40239,17 +40203,16 @@ rssr.ddns.net, 1
 rssr.se, 1
 rstsecuritygroup.co.uk, 1
 rsttraining.co.uk, 1
 rsvaachen.de, 1
 rsync.eu, 0
 rt22.ch, 1
 rtate.ca, 1
 rtate.se, 1
-rtc.fun, 1
 rtcx.net, 1
 rtd.uk.com, 0
 rte.eu, 1
 rte.radio, 1
 rte2fm.ie, 1
 rteaertel.ie, 1
 rtechservices.io, 1
 rteguide.ie, 1
@@ -40415,17 +40378,16 @@ rvoigt.eu, 1
 rvolve.net, 1
 rvsa2bevestigingen.nl, 1
 rvsa4bevestigingen.nl, 1
 rvsbevestigingen.nl, 1
 rvsuitlaatdelen.nl, 1
 rw.search.yahoo.com, 0
 rwgamernl.ml, 1
 rwky.net, 1
-rws-cc.com, 1
 rws-vertriebsportal.de, 1
 rwx.ovh, 1
 rxbn.de, 1
 rxbusiness.com, 1
 rxcheck.com, 1
 rxgroup.io, 1
 rxguide.nl, 1
 rxight.com, 1
@@ -40442,17 +40404,16 @@ ryansmithphotography.com, 1
 ryazan-region.ru, 1
 rybox.info, 1
 rychlikoderi.cz, 1
 rydermais.tk, 1
 ryejuice.sytes.net, 1
 rylore.com, 1
 rynekpierwotny.pl, 1
 rynkebo.dk, 1
-ryois.me, 1
 rys.pw, 1
 rythgs.co, 0
 ryu22e.org, 1
 ryuanerin.kr, 1
 ryuu.es, 1
 ryzex.de, 1
 ryzhov.me, 1
 rzentarzewski.net, 1
@@ -40545,16 +40506,17 @@ safar.sk, 1
 safaritenten.nl, 1
 safcstore.com, 1
 safe.moe, 1
 safe.space, 1
 safebaseflorida.com, 1
 safebasements.com, 1
 safebasementsnorthdakota.com, 1
 safebasementsofindiana.com, 1
+safebuyerscheme.co.uk, 1
 safecar.gov, 1
 safeex.com, 1
 safegold.ca, 1
 safegroup.pl, 1
 safeguardcommerce.com, 1
 safeguardhosting.ca, 1
 safeinfra.nl, 1
 safeitup.se, 1
@@ -40656,16 +40618,17 @@ sajtoskal.hu, 1
 sakaki.anime.my, 0
 sakamichi.moe, 1
 sakerhetskopiering.nu, 1
 sakostacloud.de, 1
 saksonski-szlak-parowozow.pl, 1
 sakura-paris.org, 1
 sakura.zone, 1
 sakuracdn.com, 1
+sakuracommunity.com, 1
 sakuraplay.com, 1
 salamon-it.de, 0
 salandalairconditioning.com, 1
 salde.net, 1
 sale4ru.ru, 1
 saleaks.org, 1
 salearnership.co.za, 1
 saleduck.at, 1
@@ -40748,25 +40711,27 @@ samgrayson.me, 1
 samhuri.net, 1
 samifar.in, 1
 samizdat.cz, 1
 samkelleher.com, 1
 saml-gateway.org, 1
 samlamac.com, 1
 samlaw.co.nz, 1
 samlivogarv.dk, 1
+samm.com.au, 1
 sammamish--locksmith.com, 1
 sammyjohnson.com, 1
 sammyservers.com, 1
 sammyservers.net, 1
 sammyslimos.com, 1
 samnya.cn, 1
 samorazvitie.ru, 1
 samp.im, 1
 samplefashion.nl, 1
+samri.pt, 1
 samrobertson.co.uk, 1
 samshouseofspaghetti.net, 1
 samsonova.de, 1
 samsungmobile.it, 1
 samsungxoa.com, 1
 samtalen.nl, 1
 samuelkeeley.com, 1
 samuellaulhau.fr, 0
@@ -40785,17 +40750,17 @@ sanantoniolocksmithinc.com, 1
 sanantoniolocksmithtx.com, 1
 sanasport.cz, 1
 sanasport.sk, 1
 sanatorii-sverdlovskoy-oblasti.ru, 1
 sanatorionosti.com.ar, 1
 sanatrans.com, 1
 sanbornteam.com, 1
 sancdz.com, 1
-sanchez.adv.br, 1
+sanchez.adv.br, 0
 sand-islets.de, 1
 sandalj.com, 1
 sandbagexpress.com, 1
 sandbox.mydigipass.com, 0
 sandboxfp.com, 1
 sandburner.net, 1
 sander.sh, 1
 sanderdorigo.nl, 1
@@ -40878,17 +40843,16 @@ sapporobeer.com, 1
 sapprendre.ch, 1
 saprima.de, 1
 sapuncheta.com, 1
 saputra.org, 1
 saq.com, 1
 sarabara.com, 1
 sarahbeckettharpist.com, 1
 sarahboydrealty.com, 1
-sarahcorliss.com, 1
 sarahlicity.co.uk, 1
 sarahlicity.me.uk, 1
 sarahplusdrei.de, 1
 sarahs-roestcafe.de, 0
 sarahsecret.de, 1
 sarahvictor.co.uk, 1
 sarahwellington.com, 1
 sarahwikeley.co.uk, 1
@@ -41090,17 +41054,17 @@ scheduleme.io, 1
 scheemadigital.com, 1
 schefczyk.com, 1
 schefczyk.de, 1
 schefczyk.eu, 1
 schefczyk.net, 1
 scheidtweiler.de, 1
 scheinlichter.de, 1
 schelberts.de, 1
-scheldestromen.nl, 0
+scheldestromen.nl, 1
 schellevis.net, 1
 schemingmind.com, 1
 schenkes.de, 0
 scherfke.de, 1
 scheuchenstuel.at, 1
 schgroup.com, 1
 schier.info, 1
 schil.li, 1
@@ -41139,17 +41103,16 @@ schmitt-max.com, 1
 schmitt.ws, 1
 schmitz.link, 1
 schnapke.name, 1
 schneeketten-ratgeber.de, 1
 schnegg.name, 1
 schneidr.de, 1
 schneids.me, 1
 schnellno.de, 1
-schnellsuche.de, 1
 schnouki.net, 1
 schnuckenhof-wesseloh.de, 1
 schnyder-werbung.ch, 1
 schoeck-elektro.de, 1
 schoeller.click, 1
 schoenstatt-fathers.link, 1
 schoenstatt-fathers.us, 1
 schoenstatt.link, 1
@@ -41272,29 +41235,29 @@ sciototownship-oh.gov, 1
 scistarter.com, 1
 scitopia.me, 1
 scitopia.net, 1
 scity88.com, 1
 sckc.stream, 0
 sclns.co, 1
 scm-2017.org, 1
 scohetal.de, 1
-scontogiusto.com, 1
 scoolcode.com, 1
 scoop6.co.uk, 1
 scootaloo.co.uk, 1
 scooterservis.com, 1
 scootfleet.com, 1
 scorerealtygroup.com, 1
 scorobudem.ru, 1
 scorp13.com, 1
 scorpowines.com, 1
 scottah.com, 1
 scottainslie.me.uk, 1
 scottgalvin.com, 1
+scottgthomas.com, 1
 scotthelme.co.uk, 1
 scottipc.com, 1
 scottishcu.org, 1
 scottishseniorsgolf.com, 1
 scottlanderkingman.com, 1
 scottmay.id.au, 1
 scottseditaacting.com, 1
 scottspainting.com, 1
@@ -41736,17 +41699,16 @@ seniorhomepurchaseprogram.com, 1
 seniorhost.net, 1
 seniors.singles, 1
 senmendai-reform.com, 1
 sennase.net, 1
 senobio.com, 1
 senorcontento.com, 1
 senorporno.com, 1
 sens2lavie.com, 1
-sensavi.ua, 1
 sense.hamburg, 1
 sensebridge.com, 1
 sensebridge.net, 1
 senseict.com.au, 1
 sensepixel.com, 1
 senshudo.tv, 1
 sensoft-int.com, 1
 sensoft-int.net, 1
@@ -41800,16 +41762,17 @@ seotools.asia, 1
 seoul.dating, 1
 seouniversity.org, 1
 seovision.se, 1
 seowebexpert.co.uk, 1
 seowordpress.pl, 1
 sepalandseed.com, 1
 seproco.com, 1
 septakkordeon.de, 1
+septentrionalist.org, 1
 septfinance.ch, 1
 septicrepairspecialists.com, 1
 septillion.cn, 1
 septs.blog, 1
 sequatchiecounty-tn.gov, 1
 sequatchiecountytn.gov, 1
 sequencing.com, 1
 sequiturs.com, 1
@@ -42302,17 +42265,16 @@ shopcoupons.co.id, 1
 shopcoupons.my, 1
 shopcoupons.ph, 1
 shopcoupons.sg, 1
 shopdongho.com, 1
 shopfinale.com, 1
 shophisway.com, 1
 shopific.co, 1
 shopific.com, 1
-shopify.com, 1
 shopifycloud.com, 1
 shopkini.com, 1
 shoplandia.co, 1
 shopperexperts.com, 1
 shopperexpertss.com, 1
 shopping24.de, 1
 shoppingandreviews.it, 1
 shoppr.dk, 1
@@ -42600,17 +42562,16 @@ silverwind.io, 1
 silvesrom.ro, 1
 silvester-mitterschida.de, 1
 silvine.xyz, 1
 silvistefi.com, 1
 silvobeat.blog, 1
 silvobeat.com, 1
 sim-karten.net, 1
 sim-minaoshi.jp, 1
-sim-sim.appspot.com, 1
 sim-usa.mobi, 1
 sim4seed.org, 1
 simam.de, 1
 simark.ca, 1
 simbeton.nl, 1
 simbolo.co.uk, 0
 simeonoff.ninja, 1
 simetal.ch, 1
@@ -42682,16 +42643,17 @@ simpliby.com, 1
 simplicitypvp.net, 1
 simplidesigns.nl, 1
 simplifylivelove.com, 1
 simplithai.com, 1
 simply.black, 1
 simply.scot, 1
 simplycharlottemason.com, 1
 simplycloud.de, 1
+simplyenak.com, 1
 simplyfixit.co.uk, 1
 simplyhelen.de, 1
 simplylifetips.com, 0
 simplylovejesus.com, 1
 simplymozzo.se, 1
 simplyregister.net, 1
 simplystudio.com, 1
 simplytiles.com, 1
@@ -42736,17 +42698,16 @@ sinronet.com, 1
 sinsastudio.com, 1
 sint-joris.nl, 1
 sintaxis.org, 1
 sinterama.biz, 1
 sinusitis-bronchitis.ch, 1
 sioeckes.hu, 1
 sion.info, 1
 sipc.org, 1
-sipstix.co.za, 1
 sipyuru.com, 1
 sipyuru.lk, 1
 siqi.wang, 1
 siratalmustaqim.com, 1
 siraweb.org, 1
 sirbouncealotcastles.co.uk, 1
 sirbouncelot.co.uk, 1
 sirchuk.net, 1
@@ -42756,17 +42717,16 @@ sirencallofficial.com, 1
 sirenslove.com, 1
 sirihouse.com, 1
 siriuspup.com, 1
 sirtaptap.com, 1
 sirtuins.com, 1
 sirvoy.com, 1
 siselectrom.com, 1
 siseministeerium.ee, 1
-sisiengineers.gq, 1
 sisseastumine.ee, 1
 sistel.es, 1
 sistem-maklumat.com, 1
 sistem-maklumat.com.my, 1
 sistemhane.com, 1
 sistemos.net, 1
 sistemy48.ru, 0
 sistimiki-anaparastasi.gr, 1
@@ -42936,16 +42896,17 @@ skydrive.live.com, 0
 skyeeverest.tk, 1
 skyem.co.uk, 0
 skyfone.cz, 1
 skyger.cz, 1
 skyingo.net, 1
 skylarker.org, 1
 skylgenet.nl, 1
 skylightcreative.com.au, 1
+skyline.tw, 1
 skylinertech.com, 1
 skylineservers.com, 1
 skylocker.net, 1
 skyloisirs.ch, 1
 skyn3t.in, 1
 skynet233.ch, 1
 skynethk.com, 1
 skynetnetwork.eu.org, 1
@@ -43416,17 +43377,16 @@ softwerk-edv.de, 1
 sogola.com, 1
 sogravatas.net.br, 1
 sogutma.com.tr, 1
 sohamroy.me, 1
 soia.ca, 1
 soinvett.com, 1
 sojingle.net, 1
 sokaissues.info, 1
-sokche.com, 1
 sokietech.com, 1
 sokkenhoek.nl, 1
 sokolkarvina.cz, 1
 sokouchousa.net, 1
 sol-computers.es, 1
 sol24.net, 1
 solacyre.ch, 1
 solanum-games.com, 1
@@ -43547,16 +43507,17 @@ sopra.tk, 1
 soquee.net, 1
 sor.so, 1
 soraharu.com, 1
 soraiaschneider.com.br, 1
 sorakumo.jp, 1
 sorcix.com, 1
 sorellecollection.com.au, 1
 soren.xyz, 1
+sorenstudios.com, 1
 sorincocorada.ro, 1
 sorn.service.gov.uk, 1
 sorrowfulunfounded.com, 1
 sortaweird.net, 0
 sortesim.com.br, 1
 soruly.com, 1
 sorz.org, 1
 sos-elettricista.it, 1
@@ -43705,17 +43666,16 @@ sparkbase.cn, 1
 sparkforautism.org, 1
 sparklatvia.lv, 1
 sparklebastard.com, 1
 sparkresearch.net, 1
 sparkwood.org, 1
 sparkz.no, 1
 sparprofi.at, 1
 sparta-en.org, 1
-sparta-solutions.de, 0
 spartaconsulting.fi, 1
 spartacuslife.com, 1
 spartaermelo.nl, 1
 spartantheatre.org, 1
 sparumzuege.de, 1
 spasicilia.it, 1
 spatzenwerkstatt.de, 1
 spawn.cz, 1
@@ -43887,17 +43847,16 @@ sportxt.ru, 1
 spot-lumiere-led.com, 1
 spotfake.news, 1
 spotlightsrule.com, 1
 spotrebitelskecentrum.sk, 1
 spotsee.io, 1
 spotswoodvet.com, 1
 spottedpenguin.co.uk, 1
 spotterpix.de, 1
-spotty.tech, 1
 spotupload.com, 1
 spotypal.com, 1
 sppin.fr, 1
 spr.id.au, 1
 sprachfreudehoch3.de, 1
 sprax2013.de, 1
 sprayforce.com, 1
 spreadsheetgear.com, 1
@@ -43906,17 +43865,16 @@ spreadthenews.eu, 1
 spree.co.za, 1
 spreed.me, 1
 spricknet.de, 1
 springerundpartner.de, 1
 springfieldbricks.com, 1
 springhillmaine.com, 1
 springsoffthegrid.com, 1
 springtxcarpetcleaning.com, 1
-sprinklermanohio.com, 1
 spritmonitor.de, 1
 spritsail.io, 1
 spro.in, 1
 sprock.io, 0
 sproktz.com, 1
 spron.in, 1
 sproutways.com, 1
 sprucecreekclubs.com, 1
@@ -43982,17 +43940,16 @@ srihash.org, 1
 srinivasan.io, 1
 sritest.io, 1
 sro.center, 1
 srpx.de, 1
 srrdb.com, 1
 srroddy.com, 1
 srun.in, 1
 srv.so, 1
-srv.solutions, 1
 srvc.io, 1
 srvonfire.com, 1
 ss.com, 1
 ss.lazio.it, 1
 ss.lt, 1
 ss.lv, 1
 ss.ua, 1
 ss64.com, 1
@@ -44067,17 +44024,16 @@ stackhub.cc, 1
 stacklasvegas.com, 1
 stackpath.com, 1
 stackptr.com, 1
 stacktile.io, 0
 stackunderflow.com, 1
 staddlestonesbowness.co.uk, 1
 stadionmanager.com, 1
 stadm.com, 1
-stadsbygd.info, 1
 stadt-apotheke-muensingen.de, 1
 stadtbauwerk.at, 0
 stadtbuecherei-bad-wurzach.de, 1
 stadterneuerung-hwb.de, 1
 stadtgartenla.com, 1
 stadtkapelle-oehringen.de, 1
 stadtpapa.de, 1
 stadtplan-ilmenau.de, 1
@@ -44142,16 +44098,17 @@ starcomproj.com, 1
 stardanceacademy.net, 1
 starease.com, 1
 starease.net, 1
 stareplanymiast.pl, 1
 starflix.uk, 1
 starfm.de, 1
 starfriend.ru, 1
 stargarder-jungs.de, 1
+stargate365.com, 1
 stargatelrp.co.uk, 1
 stargazer.de, 1
 stari.co, 1
 starina.ru, 1
 starka.st, 1
 starkbim.com, 1
 starking.net.cn, 1
 starlim.co.in, 1
@@ -44238,17 +44195,16 @@ stclementreligioused.org, 1
 stcplasticsurgery.com, 1
 stcu.org, 0
 std-home-test.com, 1
 stdemianabookstore.org, 1
 stderr.cc, 1
 stdev.org, 1
 stdev.top, 1
 stdrc.cc, 0
-steakhaus-zumdorfbrunnen.de, 1
 steakovercooked.com, 1
 stealingheather.com, 1
 stealsaga.net, 1
 steam-route-saxony.com, 1
 steamdb.info, 1
 steamerrors.com, 1
 steamgifts.com, 1
 steamhours.com, 1
@@ -44378,16 +44334,17 @@ stevengoodpaster.com, 1
 stevenhumphrey.uk, 1
 stevenkwan.me, 1
 stevenroddis.com, 1
 stevens.se, 0
 stevenski.com, 0
 steventress.com, 1
 steventruesdell.com, 1
 stevenwooding.com, 1
+stevenz.net, 1
 stevenz.science, 1
 stevenz.xyz, 1
 stevereedmp.co.uk, 1
 stevesdrivingschooltyneside.com, 1
 stevezheng.cf, 1
 stevezheng.tk, 1
 stewartswines.com, 1
 stewpolley.com, 0
@@ -44532,19 +44489,17 @@ stopmodacruel.org, 1
 stopoverconnections.com, 1
 stopthethyroidmadness.com, 1
 stopthinkconnect.jp, 1
 storageideas.uk, 1
 stordbatlag.no, 1
 store10.de, 0
 storedsafe.com, 1
 storeit.co.uk, 1
-storeprice.co.uk, 1
 storgom.ua, 0
-storillo.com, 1
 storm-family.com, 1
 stormi.io, 1
 stormwatcher.org, 1
 storvann.net, 1
 storvann.no, 1
 storycollective.film, 1
 storycollective.nl, 1
 storyland.ie, 1
@@ -44716,16 +44671,17 @@ studiostudio.net, 1
 studiosus-gruppenreisen.com, 1
 studiosus.com, 1
 studiotheatrestains.fr, 1
 studiovaud.com, 1
 studipro-formation.fr, 1
 studipro-marketing.fr, 1
 studisys.net, 1
 studium.cz, 1
+studlan.no, 0
 studport.rv.ua, 1
 studyin.jp, 1
 studying-neet.com, 1
 studyspy.ac.nz, 1
 studytactics.com, 1
 studytale.com, 1
 stuetzredli.ch, 1
 stuffi.fr, 1
@@ -44831,17 +44787,16 @@ suisui.stream, 1
 suitesapp.com, 1
 suitocracy.com, 1
 sujal.com, 1
 sujatadev.in, 1
 sujoydhar.in, 1
 suka.moe, 1
 suke3.jp, 1
 suki.moe, 1
-suko.pe, 1
 sukoyakapp.com, 1
 sukrie.net, 1
 suksit.com, 1
 sulek.eu, 1
 sullenholland.nl, 1
 suluvir.com, 1
 sumguy.com, 1
 summa.eu, 0
@@ -44937,17 +44892,17 @@ superenduro.net, 1
 superguide.com.au, 1
 superhappiness.com, 1
 superhome.com.au, 1
 superidropulitrice.com, 1
 superkonsult.se, 1
 superlandnetwork.de, 1
 supermae.pt, 1
 supermarx.nl, 1
-supermercadosdia.com.ar, 0
+supermercadosdia.com.ar, 1
 supermercato24.it, 1
 supermil.ch, 1
 supern0va.net, 1
 supernaut.info, 1
 supernt.lt, 1
 superpase.com, 1
 supersahnetorten.de, 1
 supersec.es, 1
@@ -45191,17 +45146,16 @@ swyn.net, 1
 sx3.no, 1
 sx8.ovh, 1
 sxistolithos.gr, 1
 sy-anduril.de, 1
 sy24.ru, 1
 syajvo.if.ua, 0
 syakonavi.com, 1
 syamutodon.xyz, 1
-syamuwatching.xyz, 1
 sycamorememphis.org, 1
 sychov.pro, 1
 sydney-sehen.com, 1
 sydney.dating, 1
 sydneyhelicopters.com.au, 1
 sydneylawnandturf.com.au, 1
 syenar.net, 1
 syezd.com.au, 1
@@ -45405,17 +45359,16 @@ taglioepiega.it, 1
 tagnull.de, 1
 tagpay.com, 1
 tagungsraum-usedom.de, 1
 tagungsraum-zinnowitz.de, 1
 tahavu.com, 1
 taherian.me, 1
 tahmintr.com, 1
 tahosa.co, 1
-tahosalodge.org, 1
 tai-in.com, 1
 tai-in.net, 1
 taichi-jade.com, 1
 taidu.news, 1
 taiklus.lt, 1
 tailpuff.net, 0
 tails.boum.org, 1
 taim.io, 1
@@ -45523,17 +45476,17 @@ tangoalpha.co.uk, 1
 tangsisi.com, 1
 tangyue.date, 1
 tangzhao.net, 1
 tanhit.com, 1
 taniafitness.co.uk, 1
 taniafitness.com, 1
 tanie-uslugi-ksiegowe.pl, 1
 taniku-succulent.com, 1
-tankionlinenow.ru, 1
+tankionlinenow.ru, 0
 tankpassen-vergelijken.nl, 1
 tankski.co.uk, 1
 tannenhof-moelln.de, 1
 tannerryan.ca, 1
 tannerwilliamson.com, 1
 tannerwj.com, 1
 tansuya.jp, 1
 tantalos.nl, 1
@@ -46014,22 +45967,24 @@ teplomash24.ru, 1
 tequilazor.com, 1
 terabyte.services, 1
 terabyteharddrive.net, 1
 terabyteit.co.uk, 1
 teracloud.at, 1
 teranacreative.com, 1
 teraservice.eu, 1
 teriiphotography.com, 1
+teriyakisecret.com, 1
 terlindung.com, 1
 termee.com, 1
 terminalvelocity.co.nz, 1
 termino.eu, 1
 terminsrakning.se, 1
 termitemounds.org, 1
+termitinitus.org, 1
 termografiranje.si, 1
 termux.com, 1
 terpotiz.net, 1
 terra-x.net, 1
 terra.fitness, 1
 terrab.de, 0
 terracloud.de, 0
 terraelectronica.ru, 1
@@ -46330,17 +46285,17 @@ thedroneely.com, 1
 thedrunkencabbage.com, 1
 thedutchmarketers.com, 1
 thedword.xyz, 1
 theebookkeepers.co.za, 1
 theeducationchannel.info, 1
 theeducationdirectory.org, 1
 theeffingyogablog.com, 1
 theeighthbit.com, 0
-theel0ja.info, 0
+theel0ja.info, 1
 theel0ja.ovh, 1
 theemasphere.com, 1
 theender.net, 1
 theepankar.com, 1
 theepiclounge.com, 1
 theevergreen.me, 1
 theeverycompany.com, 1
 theexpatriate.de, 1
@@ -46420,16 +46375,17 @@ theinternationalgeekconspiracy.eu, 1
 theissue.com.au, 1
 theitsage.com, 0
 thejacksoninstitute.com.au, 1
 thekev.in, 1
 thekeymusic.com, 1
 thekeytobusiness.co.uk, 1
 thekindplate.ca, 1
 thekingofhate.com, 0
+thekovnerfoundation.org, 1
 thelaimlife.com, 1
 thelanscape.com, 1
 thelastbeach.top, 1
 thelastsurprise.com, 1
 thelatedcult.com, 1
 thelearningenterprise.co.uk, 1
 thelefthand.org, 1
 thelegionshirley.co.uk, 1
@@ -46438,17 +46394,16 @@ thelinuxspace.com, 1
 thelinuxtree.net, 1
 thelittlecraft.com, 1
 thelittlejewel.com, 1
 thelocals.ru, 1
 thelonelyones.co.uk, 1
 thelonious.nl, 1
 thelostyankee.com, 1
 thelounge.chat, 1
-themacoaching.nl, 1
 themallards.info, 1
 themarshallproject.org, 1
 themeaudit.com, 1
 themecraft.studio, 1
 themefoxx.com, 1
 themerchandiser.net, 1
 themeridianway.com, 1
 themesurgeons.net, 1
@@ -46716,17 +46671,16 @@ thiscloudiscrap.com, 0
 thiscode.works, 1
 thisdot.site, 1
 thisfreelife.gov, 1
 thisisgrey.com, 1
 thisishugo.com, 1
 thisistechtoday.com, 1
 thisisthefinalact.com, 1
 thisistheserver.com, 1
-thisistranquility.life, 1
 thisiswhywemom.com, 1
 thismatter.com, 1
 thismumdoesntknowbest.com, 1
 thisoldearth.com, 1
 thisserver.dontexist.net, 1
 thistleandleaves.com, 1
 thitruongsi.com, 1
 thm.vn, 1
@@ -46919,16 +46873,17 @@ tiliaze.eu, 1
 tiliaze.info, 1
 tiliaze.net, 1
 tilikum.io, 1
 till.im, 1
 tillberg.us, 1
 tilleysbouncycastles.co.uk, 1
 tillseasyscore.com, 1
 tilman.ninja, 1
+tilosp.de, 1
 tilta.com, 1
 tiltedwindmillcrafts.com, 1
 tim-demisch.de, 1
 timbarlotta.com, 1
 timberkel.com, 1
 timbers.space, 1
 timbishopartist.com, 1
 timbrado.com, 1
@@ -46988,17 +46943,16 @@ tindallriley.co.uk, 1
 tinf15b4.de, 1
 tinfoilsecurity.com, 0
 tinfoleak.com, 1
 tinhchattrangda.vn, 1
 tink.network, 1
 tinker.career, 1
 tinkerbeast.com, 1
 tinkerboard.org, 1
-tinkerers-trunk.co.za, 1
 tinkertry.com, 1
 tinlc.org, 1
 tinte24.de, 1
 tintencenter.com, 1
 tintenfix.net, 1
 tintenfux.de, 1
 tintenland.de, 1
 tintenprofi.de, 1
@@ -47058,17 +47012,16 @@ titli.fr, 1
 titouan.co, 0
 tittelbach.at, 1
 titusetcompagnies.net, 1
 tivido.nl, 1
 tiwag.at, 1
 tixeconsulting.com, 1
 tixify.com, 1
 tjampoer.com, 1
-tjandpals.com, 1
 tjcuk.co.uk, 1
 tjenestetorvet.dk, 1
 tjkcastles.uk, 1
 tjl.rocks, 1
 tjp.ch, 1
 tjs.me, 1
 tjsbouncycastles.co.uk, 1
 tju.me, 1
@@ -47109,27 +47062,25 @@ tmberg.ga, 1
 tmberg.gq, 1
 tmberg.ml, 1
 tmberg.tk, 1
 tmc.com.mt, 1
 tmcpromotions.co.uk, 1
 tmcreationweb.com, 1
 tmd.cool, 1
 tmdb.biz, 1
-tmdc.ddns.net, 1
 tmf.ru, 1
 tmhr.moe, 1
 tmi-products.eu, 1
 tmi-produkter.se, 1
 tmin.cf, 1
 tmm.cx, 1
 tmonitoring.com, 1
 tmpraider.net, 1
 tmpsantos.com.br, 1
-tmsdiesel.com, 1
 tmtopup.com, 1
 tn0.club, 1
 tnb-plattform.de, 1
 tndentalwellness.com, 1
 tnes.dk, 1
 tniad.mil.id, 0
 tnl.cloud, 1
 tnonline.net, 1
@@ -48218,16 +48169,17 @@ tusksol.com, 1
 tutanota.com, 1
 tuto-craft.com, 1
 tutoragency.org, 1
 tutorat-tect.org, 1
 tutorialehtml.com, 1
 tutorialinux.com, 1
 tutorio.ga, 1
 tutorme.com, 1
+tuts4you.com, 1
 tuttimundi.org, 1
 tuttoandroid.net, 1
 tuvangoicuoc.com, 1
 tuversionplus.com, 1
 tuwaner.com, 1
 tuxcloud.net, 1
 tuxflow.de, 0
 tuxgeo.com, 0
@@ -48334,16 +48286,17 @@ tycho.org, 1
 tycom.cz, 1
 tycyc88.com, 1
 tyil.work, 1
 tykeplay.com, 1
 tykoon.com, 1
 tyler.rs, 1
 tylerdavies.net, 1
 tylerfreedman.com, 1
+tylerharcourt.ca, 1
 tylerharcourt.com, 1
 tylerharcourt.net, 1
 tylerharcourt.org, 1
 tylermade.net, 1
 tyleromeara.com, 1
 tylerschmidtke.com, 1
 typcn.com, 1
 type1joe.com, 1
@@ -48445,17 +48398,16 @@ uchargeapp.com, 1
 uchiha.ml, 1
 uclf.de, 1
 uclip.club, 1
 ucppe.org, 1
 ucrdatatool.gov, 1
 uctarna.online, 1
 udancy.com, 1
 udbhav.me, 1
-uddhabhaldar.com, 1
 uddi.ng, 1
 udo-luetkemeier.de, 1
 udomain.net, 1
 udp.sh, 0
 udruga-point.hr, 1
 udsocial.com, 1
 udvoukocek.eu, 1
 ueba1085.jp, 1
@@ -48856,16 +48808,17 @@ url.rw, 0
 urlakite.com, 1
 urlaub-busreisen.de, 1
 urlaub-leitner.at, 1
 urlgot.com, 1
 urlscan.io, 1
 urltell.com, 1
 urltodomain.com, 1
 urnes.org, 1
+urology.wiki, 1
 urown.net, 1
 ursa-minor-beta.org, 1
 ursae.co, 1
 urspringer.de, 1
 ursuslibris.hu, 1
 urth.org, 1
 uruguay-experience.com, 1
 urukproject.org, 1
@@ -49062,16 +49015,17 @@ valesdigital.com, 1
 valiant.finance, 1
 validatis.com, 1
 validator.nu, 1
 validbrands.com, 1
 valika.ee, 1
 valimised.ee, 1
 valis.sx, 1
 valkohattu.fi, 1
+valkor.pro, 1
 valkova.net, 1
 vallei-veluwe.nl, 1
 valleyautofair.com, 1
 valleyautoloan.com, 1
 valleycode.net, 1
 valleydalecottage.com.au, 1
 valleyshop.ca, 1
 vallutaja.eu, 1
@@ -49578,17 +49532,16 @@ viikko.ga, 1
 viikko.gq, 1
 viikko.ml, 1
 vijay-international.com, 1
 vijverbenodigdheden.nl, 1
 vik.im, 1
 vikalbino.com.br, 1
 vikalpgupta.com, 1
 vikapaula.com, 1
-vikasbabyworld.de, 0
 vikashkumar.me, 1
 vikaviktoria.com, 1
 viking-style.ru, 1
 vikings.net, 1
 viktorbarzin.me, 1
 viktorprevaric.eu, 1
 viku.fi, 1
 vila-eden.cz, 1
@@ -49635,16 +49588,17 @@ vincible.space, 1
 vinciconps4.it, 1
 vinciladislessia.it, 1
 vincitraining.com, 1
 vindipoker.dk, 1
 vinesauce.info, 1
 vinetalk.net, 1
 vinetech.co.nz, 1
 vingt.me, 1
+vinicius.sl, 0
 vinigas.com, 1
 vinilosdecorativos.net, 1
 vinistas.com, 1
 vinkt.eu, 1
 vinner.com.au, 1
 vinnie.gq, 1
 vinnyandchristina.com, 1
 vinnyvidivici.com, 1
@@ -49989,17 +49943,16 @@ vozami.com, 1
 vpc-display.com, 1
 vpn.black, 1
 vpn.ht, 1
 vpnpro.com, 1
 vpnservice.nl, 1
 vpsao.org, 1
 vpsboard.com, 1
 vpsdream.dk, 1
-vpsou.com, 1
 vpsport.ch, 1
 vpsproj.dynu.net, 1
 vpsvz.cloud, 1
 vpsvz.net, 1
 vragenvanproust.nl, 1
 vrandopulo.ru, 1
 vrcholovka.cz, 1
 vrcinvestigations.com, 1
@@ -50249,17 +50202,17 @@ wangql.net, 1
 wangqr.org, 1
 wangqr.tk, 1
 wangriwu.com, 1
 wangtanzhang.com, 1
 wangwenbo.cn, 0
 wangwill.me, 1
 wangyubao.cn, 1
 wangyue.blog, 1
-wangzuan168.cc, 1
+wangzuan168.cc, 0
 wanlieyan.com, 1
 wanmen.org, 1
 wannaridecostarica.com, 1
 wanquanojbk.com, 0
 wanvi.net, 0
 wanybug.cf, 1
 wanybug.com, 1
 wanybug.ga, 1
@@ -50272,16 +50225,17 @@ wapa.gov, 1
 wapazewddamcdocmanui6001.azurewebsites.net, 1
 wapazewrdamcdocmanui6001.azurewebsites.net, 1
 wapenon.com, 1
 wapgu.cc, 1
 wapking.co, 1
 wapoolandspa.com, 1
 warcraftjournal.org, 1
 wardow.com, 1
+wardsegers.be, 1
 wardslager.com, 1
 warebouncycastles.co.uk, 1
 warekit.io, 1
 warekon.com, 1
 warekon.dk, 1
 warenits.at, 0
 warenmedia.com, 1
 warfield.org.uk, 1
@@ -50320,17 +50274,16 @@ wasil.org, 1
 waslh.com, 1
 wasserburg.dk, 1
 wasserspucker.de, 1
 wassibauer.com, 1
 wassim.is, 1
 wastrel.ch, 1
 watashi.bid, 1
 watch-wiki.org, 1
-watchcom.org.za, 1
 watchcow.org, 1
 watchface.watch, 1
 watchfreeonline.co.uk, 1
 watchonline.al, 1
 watchparts-and-tools-okayama.co.jp, 1
 watchstyle.com, 1
 watchweasel.com, 1
 water-addict.com, 1
@@ -50352,17 +50305,16 @@ waterworkscondos.com, 1
 watfordjc.uk, 1
 watoo.tech, 1
 watsonwork.me, 1
 wattmaedchen.de, 1
 watvindtnederland.com, 1
 waukeect.com, 1
 wav-productions.com, 1
 wave.is, 1
-wave.red, 1
 wavengine.com, 1
 wavesboardshop.com, 1
 wavesoftime.com, 1
 waveum.com, 1
 wawak.pl, 1
 waxdramatic.com, 1
 waxlrs.com, 1
 wayfair.de, 1
@@ -50808,17 +50760,16 @@ werktor.com, 1
 werktor.net, 1
 werkz.io, 1
 wermeester.com, 1
 werner-ema.de, 1
 werpo.com.ar, 1
 wertheimer-burgrock.de, 1
 wertpapiertreuhand.de, 1
 werwolf-live.de, 1
-wesayyesprogram.com, 1
 wesecom.com, 1
 wesell.asia, 1
 weserv.nl, 1
 wesleycabus.be, 1
 wesleywarnell.com, 1
 wesoco.de, 1
 wespeakgeek.co.za, 1
 wesreportportal.com, 1
@@ -51313,17 +51264,16 @@ wiz.at, 1
 wiz.biz, 1
 wiz.farm, 1
 wizard.gov, 1
 wizardbouncycastles.co.uk, 1
 wizardmeow.xin, 1
 wizzair.com, 1
 wizzley.com, 1
 wizznab.tk, 1
-wizzr.nl, 1
 wj0666.com, 1
 wjbolles.com, 1
 wjcainc.com, 1
 wjci.com, 1
 wje-online.de, 1
 wjg.ca, 1
 wjg.dk, 1
 wjglerum.nl, 1
@@ -51428,16 +51378,17 @@ wonderhowto.com, 1
 wonderlandmovies.de, 1
 wondermags.com, 1
 wonghome.net, 1
 wooc.org, 1
 wood-crafted.co.uk, 1
 wood-crafted.uk, 1
 woodbury.io, 1
 woodcoin.org, 1
+woodenson.com, 1
 woodev.us, 1
 woodinvillesepticservice.net, 1
 woodlandboys.com, 1
 woodlandhillselectrical.com, 1
 woodlandsmetro.church, 0
 woodlandsvale.uk, 1
 woodlandwindows.com, 1
 woodomat.com, 1
@@ -51746,17 +51697,16 @@ www.amazon.com.mx, 1
 www.amazon.de, 1
 www.amazon.es, 1
 www.amazon.fr, 1
 www.amazon.it, 1
 www.amazon.nl, 1
 www.apollo-auto.com, 1
 www.banking.co.at, 0
 www.braintreepayments.com, 0
-www.calyxinstitute.org, 0
 www.capitainetrain.com, 0
 www.cnet.com, 1
 www.dropbox.com, 1
 www.dropcam.com, 0
 www.entropia.de, 0
 www.eternalgoth.co.uk, 1
 www.etsy.com, 1
 www.evernote.com, 0
@@ -51910,17 +51860,16 @@ xbyl23.com, 0
 xbyl26.com, 0
 xbyl39.com, 0
 xbyl63.com, 0
 xbyl71.com, 0
 xbyl78.com, 0
 xbyl82.com, 0
 xbyl91.com, 0
 xceedgaming.com, 1
-xcelerator.ninja, 1
 xcentricmold.com, 1
 xchangeinfo.com, 1
 xcler8.com, 1
 xclirion-support.de, 1
 xcmfu.com, 1
 xcompany.one, 1
 xcorpsolutions.com, 1
 xcvb.xyz, 1
@@ -52017,17 +51966,17 @@ xiliant.com, 0
 xilkoi.net, 0
 xilou.org, 1
 ximble.com, 1
 ximbo.net, 1
 xin-in.com, 1
 xin-in.net, 1
 xinbo270.com, 0
 xinbo676.com, 0
-xinboyule.com, 1
+xinboyule.com, 0
 xing-in.net, 1
 xing.ml, 1
 xinj.com, 1
 xinlandm.com, 1
 xinnixdeuren-shop.be, 1
 xinsane.com, 1
 xinu.xyz, 1
 xinuspeed.com, 1
@@ -52579,16 +52528,17 @@ yeu.io, 1
 yex.nz, 1
 yex.trade, 1
 yeyi.site, 1
 yezishurb.site, 1
 yfengs.moe, 1
 yggdar.ga, 1
 ygobbs.com, 1
 ygrene.com, 1
+ygreneworks.com, 1
 yh56787.com, 1
 yh599.cc, 1
 yh64678.com, 1
 yh66656.com, 1
 yh66689.com, 1
 yh811.com, 1
 yh88890.com, 1
 yh98768.com, 1
@@ -53032,17 +52982,16 @@ zanzo.cz, 1
 zaoext.com, 1
 zap-mag.ru, 1
 zapier.com, 1
 zapmaster14.com, 1
 zappbuildapps.com, 1
 zarabiaj.com, 1
 zargescases.co.uk, 1
 zarmarket.org, 1
-zarpo.com.br, 1
 zary.me, 1
 zatsepin.by, 1
 zaufanatrzeciastrona.pl, 1
 zavec.com.ec, 1
 zavedu.org, 1
 zavetaji.lv, 1
 zawo-electric.de, 1
 zayna.eu, 1
@@ -53075,17 +53024,16 @@ zdymak.by, 1
 ze3kr.com, 1
 zeadaniel.com, 1
 zeal-and.jp, 1
 zeal-interior.com, 1
 zealworks.jp, 1
 zeb.fun, 1
 zebbra.ro, 1
 zebedeescastles.co.uk, 1
-zebulon.fr, 1
 zeds-official.com, 1
 zeebrieshoekvanholland.nl, 1
 zeel.com, 1
 zeelynk.com, 1
 zeestraten.nl, 1
 zeetoppers.nl, 1
 zeguigui.com, 1
 zehdenick-bleibt-bunt.de, 1
@@ -53188,17 +53136,17 @@ zhangsidan.com, 1
 zhangwendao.com, 1
 zhangxuhu.com, 1
 zhangyuhao.com, 1
 zhangzifan.com, 0
 zhaochen.xyz, 1
 zhaoeq.com, 1
 zhaofeng.li, 1
 zhaopage.com, 1
-zhaoxixiangban.cc, 1
+zhaoxixiangban.cc, 0
 zhcexo.com, 1
 zhdd.pl, 1
 zhen-chen.com, 1
 zhengjie.com, 1
 zhengouwu.com, 1
 zhenic.ir, 1
 zhenyan.org, 1
 zhi.ci, 1
@@ -53451,16 +53399,17 @@ zup.me, 1
 zupago.com, 1
 zupago.pe, 1
 zuppy.pm, 1
 zuralski.net, 1
 zurgl.com, 0
 zusjesvandenbos.nl, 1
 zuviel.space, 1
 zuzumba.es, 1
+zvejonys.lt, 1
 zvps.uk, 1
 zvxr.net, 1
 zvz.im, 1
 zwartendijkstalling.nl, 1
 zwembadheeten.nl, 1
 zwergenfeste.ch, 1
 zwerimex.com, 1
 zwierslanguagetraining.nl, 1
--- a/services/settings/RemoteSettingsClient.jsm
+++ b/services/settings/RemoteSettingsClient.jsm
@@ -26,18 +26,18 @@ ChromeUtils.defineModuleGetter(this, "Ut
 
 XPCOMUtils.defineLazyGlobalGetters(this, ["fetch"]);
 
 // IndexedDB name.
 const DB_NAME = "remote-settings";
 
 const TELEMETRY_COMPONENT = "remotesettings";
 
-const INVALID_SIGNATURE = "Invalid content signature";
-const MISSING_SIGNATURE = "Missing signature";
+const INVALID_SIGNATURE_MSG = "Invalid content signature";
+const MISSING_SIGNATURE_MSG = "Missing signature";
 
 XPCOMUtils.defineLazyPreferenceGetter(this, "gServerURL",
                                       "services.settings.server");
 XPCOMUtils.defineLazyPreferenceGetter(this, "gChangesPath",
                                       "services.settings.changes.path");
 XPCOMUtils.defineLazyPreferenceGetter(this, "gVerifySignature",
                                       "services.settings.verify_signature", true);
 
@@ -80,17 +80,17 @@ class ClientEnvironment extends ClientEn
  * @returns {Promise<{String, String}>}
  */
 async function fetchCollectionSignature(bucket, collection, expectedTimestamp) {
   const client = new KintoHttpClient(gServerURL);
   const { signature: signaturePayload } = await client.bucket(bucket)
     .collection(collection)
     .getData({ query: { _expected: expectedTimestamp } });
   if (!signaturePayload) {
-    throw new Error(MISSING_SIGNATURE);
+    throw new Error(MISSING_SIGNATURE_MSG);
   }
   const { x5u, signature } = signaturePayload;
   const certChainResponse = await fetch(x5u);
   const certChain = await certChainResponse.text();
 
   return { signature, certChain };
 }
 
@@ -263,102 +263,101 @@ class RemoteSettingsClient extends Event
       },
     });
     if (changes.length === 0) {
       throw new Error(`Unknown collection "${this.identifier}"`);
     }
     // According to API, there will be one only (fail if not).
     const [{ last_modified: expectedTimestamp }] = changes;
 
-    return this.maybeSync(expectedTimestamp, options);
+    return this.maybeSync(expectedTimestamp, { ...options, trigger: "forced" });
   }
 
   /**
    * Synchronize the local database with the remote server, **only if necessary**.
    *
    * @param {int}    expectedTimestamp the lastModified date (on the server) for the remote collection.
    *                                   This will be compared to the local timestamp, and will be used for
    *                                   cache busting if local data is out of date.
    * @param {Object} options           additional advanced options.
    * @param {bool}   options.loadDump  load initial dump from disk on first sync (default: true)
+   * @param {string} options.trigger   label to identify what triggered this sync (eg. ``"timer"``, default: `"manual"`)
    * @return {Promise}                 which rejects on sync or process failure.
    */
-  async maybeSync(expectedTimestamp, options = { loadDump: true }) {
+  async maybeSync(expectedTimestamp, options = { loadDump: true, trigger: "manual" }) {
     const { loadDump, trigger } = options;
 
     let reportStatus = null;
     try {
-      const collection = await this.openCollection();
-      // Synchronize remote data into a local Sqlite DB.
-      let collectionLastModified = await collection.db.getLastModified();
+      // Synchronize remote data into a local DB using Kinto.
+      const kintoCollection = await this.openCollection();
+      let collectionLastModified = await kintoCollection.db.getLastModified();
 
       // If there is no data currently in the collection, attempt to import
       // initial data from the application defaults.
       // This allows to avoid synchronizing the whole collection content on
       // cold start.
       if (!collectionLastModified && loadDump) {
         try {
           await RemoteSettingsWorker.importJSONDump(this.bucketName, this.collectionName);
-          collectionLastModified = await collection.db.getLastModified();
+          collectionLastModified = await kintoCollection.db.getLastModified();
         } catch (e) {
           // Report but go-on.
           Cu.reportError(e);
         }
       }
 
       // If the data is up to date, there's no need to sync. We still need
       // to record the fact that a check happened.
       if (expectedTimestamp <= collectionLastModified) {
         reportStatus = UptakeTelemetry.STATUS.UP_TO_DATE;
         return;
       }
 
-      // If there is a `signerName` and collection signing is enforced, add a
-      // hook for incoming changes that validates the signature.
+      // If signature verification is enabled, then add a synchronization hook
+      // for incoming changes that validates the signature.
       if (this.signerName && gVerifySignature) {
-        collection.hooks["incoming-changes"] = [async (payload, collection) => {
+        kintoCollection.hooks["incoming-changes"] = [async (payload, collection) => {
           await this._validateCollectionSignature(payload.changes,
                                                   payload.lastModified,
                                                   collection,
                                                   { expectedTimestamp });
           // In case the signature is valid, apply the changes locally.
           return payload;
         }];
       }
 
-      // Fetch changes from server.
       let syncResult;
       try {
-        // Server changes have priority during synchronization.
+        // Fetch changes from server, and make sure we overwrite local data.
         const strategy = Kinto.syncStrategy.SERVER_WINS;
-        syncResult = await collection.sync({ remote: gServerURL, strategy, expectedTimestamp });
-        const { ok } = syncResult;
-        if (!ok) {
+        syncResult = await kintoCollection.sync({ remote: gServerURL, strategy, expectedTimestamp });
+        if (!syncResult.ok) {
           // With SERVER_WINS, there cannot be any conflicts, but don't silent it anyway.
           throw new Error("Synced failed");
         }
       } catch (e) {
-        if (e.message.includes(INVALID_SIGNATURE)) {
+        if (e.message.includes(INVALID_SIGNATURE_MSG)) {
           // Signature verification failed during synchronization.
           reportStatus = UptakeTelemetry.STATUS.SIGNATURE_ERROR;
           // If sync fails with a signature error, it's likely that our
           // local data has been modified in some way.
           // We will attempt to fix this by retrieving the whole
           // remote collection.
           try {
-            syncResult = await this._retrySyncFromScratch(collection, expectedTimestamp);
+            syncResult = await this._retrySyncFromScratch(kintoCollection, expectedTimestamp);
           } catch (e) {
             // If the signature fails again, or if an error occured during wiping out the
             // local data, then we report it as a *signature retry* error.
             reportStatus = UptakeTelemetry.STATUS.SIGNATURE_RETRY_ERROR;
             throw e;
           }
         } else {
           // The sync has thrown, it can be related to metadata, network or a general error.
-          if (e.message == MISSING_SIGNATURE) {
+          if (e.message == MISSING_SIGNATURE_MSG) {
             // Collection metadata has no signature info, no need to retry.
             reportStatus = UptakeTelemetry.STATUS.SIGNATURE_ERROR;
           } else if (/unparseable/.test(e.message)) {
             reportStatus = UptakeTelemetry.STATUS.PARSE_ERROR;
           } else if (/NetworkError/.test(e.message)) {
             reportStatus = UptakeTelemetry.STATUS.NETWORK_ERROR;
           } else if (/Timeout/.test(e.message)) {
             reportStatus = UptakeTelemetry.STATUS.TIMEOUT_ERROR;
@@ -367,18 +366,18 @@ class RemoteSettingsClient extends Event
           } else if (/Backoff/.test(e.message)) {
             reportStatus = UptakeTelemetry.STATUS.BACKOFF;
           } else {
             reportStatus = UptakeTelemetry.STATUS.SYNC_ERROR;
           }
           throw e;
         }
       }
-
-      const filteredSyncResult = await this._filterSyncResult(collection, syncResult);
+      // Filter the synchronization results using `filterFunc` (ie. JEXL).
+      const filteredSyncResult = await this._filterSyncResult(kintoCollection, syncResult);
       // If every changed entry is filtered, we don't even fire the event.
       if (filteredSyncResult) {
         try {
           await this.emit("sync", { data: filteredSyncResult });
         } catch (e) {
           reportStatus = UptakeTelemetry.STATUS.APPLY_ERROR;
           throw e;
         }
@@ -434,17 +433,17 @@ class RemoteSettingsClient extends Event
                                                                      remoteRecords,
                                                                      timestamp);
     const verifier = Cc["@mozilla.org/security/contentsignatureverifier;1"]
       .createInstance(Ci.nsIContentSignatureVerifier);
     if (!verifier.verifyContentSignature(serialized,
                                          "p384ecdsa=" + signature,
                                          certChain,
                                          this.signerName)) {
-      throw new Error(INVALID_SIGNATURE + ` (${bucket}/${collection})`);
+      throw new Error(`${INVALID_SIGNATURE_MSG} (${bucket}/${collection})`);
     }
   }
 
   /**
    * Fetch the whole list of records from the server, verify the signature again
    * and then compute a synchronization result as if the diff-based sync happened.
    * And eventually, wipe out the local data.
    *
--- a/services/settings/RemoteSettingsComponents.jsm
+++ b/services/settings/RemoteSettingsComponents.jsm
@@ -14,12 +14,12 @@ ChromeUtils.defineModuleGetter(this, "Re
 var RemoteSettingsTimer = function() {};
 RemoteSettingsTimer.prototype = {
   QueryInterface: ChromeUtils.generateQI([Ci.nsITimerCallback]),
   classID: Components.ID("{5e756573-234a-49ea-bbe4-59ec7a70657d}"),
   contractID: "@mozilla.org/services/settings;1",
 
   // By default, this timer fires once every 24 hours. See the "services.settings.poll_interval" pref.
   notify(timer) {
-    RemoteSettings.pollChanges()
+    RemoteSettings.pollChanges({ trigger: "timer" })
       .catch(e => Cu.reportError(e));
   },
 };
--- a/services/settings/remote-settings.js
+++ b/services/settings/remote-settings.js
@@ -148,20 +148,20 @@ function remoteSettingsFunction() {
     return null;
   }
 
   /**
    * Main polling method, called by the ping mechanism.
    *
    * @param {Object} options
 .  * @param {Object} options.expectedTimestamp (optional) The expected timestamp to be received — used by servers for cache busting.
+   * @param {string} options.trigger           (optional) label to identify what triggered this sync (eg. ``"timer"``, default: `"manual"`)
    * @returns {Promise} or throws error if something goes wrong.
    */
-  remoteSettings.pollChanges = async ({ expectedTimestamp } = {}) => {
-    const trigger = expectedTimestamp ? "broadcast" : "timer";
+  remoteSettings.pollChanges = async ({ expectedTimestamp, trigger = "manual" } = {}) => {
     const telemetryArgs = {
       source: TELEMETRY_SOURCE,
       trigger,
     };
 
     // Check if the server backoff time is elapsed.
     if (gPrefs.prefHasUserValue(PREF_SETTINGS_SERVER_BACKOFF)) {
       const backoffReleaseTime = gPrefs.getCharPref(PREF_SETTINGS_SERVER_BACKOFF);
@@ -219,17 +219,17 @@ function remoteSettingsFunction() {
     // Record new update time and the difference between local and server time.
     // Negative clockDifference means local time is behind server time
     // by the absolute of that value in seconds (positive means it's ahead)
     const clockDifference = Math.floor((Date.now() - serverTimeMillis) / 1000);
     gPrefs.setIntPref(PREF_SETTINGS_CLOCK_SKEW_SECONDS, clockDifference);
     const checkedServerTimeInSeconds = Math.round(serverTimeMillis / 1000);
     gPrefs.setIntPref(PREF_SETTINGS_LAST_UPDATE, checkedServerTimeInSeconds);
 
-
+    // Should the clients try to load JSON dump? (mainly disabled in tests)
     const loadDump = gPrefs.getBoolPref(PREF_SETTINGS_LOAD_DUMP, true);
 
     // Iterate through the collections version info and initiate a synchronization
     // on the related remote settings client.
     let firstError;
     for (const change of changes) {
       const { bucket, collection, last_modified } = change;
 
@@ -321,11 +321,11 @@ function remoteSettingsFunction() {
 
   return remoteSettings;
 }
 
 var RemoteSettings = remoteSettingsFunction();
 
 var remoteSettingsBroadcastHandler = {
   async receivedBroadcastMessage(data, broadcastID) {
-    return RemoteSettings.pollChanges({ expectedTimestamp: data });
+    return RemoteSettings.pollChanges({ expectedTimestamp: data, trigger: "broadcast" });
   },
 };
--- a/taskcluster/docker/funsize-update-generator/Pipfile
+++ b/taskcluster/docker/funsize-update-generator/Pipfile
@@ -4,8 +4,9 @@ python_version = '3.6'
 [packages]
 aiohttp = "*"
 datadog = "*"
 mar = "*"
 redo = "*"
 requests = "*"
 scriptworker = "*"
 sh = "*"
+awscli = "*"
--- a/taskcluster/docker/funsize-update-generator/Pipfile.lock
+++ b/taskcluster/docker/funsize-update-generator/Pipfile.lock
@@ -1,12 +1,12 @@
 {
     "_meta": {
         "hash": {
-            "sha256": "f584ed9df8ff32e7bbc95a3e15a5222b17a3a8ce87d2a3f6a70b93dec6fa3ca8"
+            "sha256": "8ae855f2ef3d4d9dcaa6dd796ee176980724e8215eea64494710ef603cadd3c5"
         },
         "pipfile-spec": 6,
         "requires": {
             "python_version": "3.6"
         },
         "sources": [
             {
                 "name": "pypi",
@@ -67,28 +67,43 @@
         },
         "attrs": {
             "hashes": [
                 "sha256:69c0dbf2ed392de1cb5ec704444b08a5ef81680a61cb899dc08127123af36a79",
                 "sha256:f0b870f674851ecbfbbbd364d6b5cbdff9dcedbc7f3f5e18a6891057f21fe399"
             ],
             "version": "==19.1.0"
         },
+        "awscli": {
+            "hashes": [
+                "sha256:06f97a0eb6811d01d635fdee4f7cb78a49a43b92a71a4497c5f9e4ff83ca1af6",
+                "sha256:23e74b3f9afca7f7fdd27f889109d0069901136bdf34ca84a82de8910668c328"
+            ],
+            "index": "pypi",
+            "version": "==1.16.121"
+        },
         "backports.lzma": {
             "hashes": [
                 "sha256:50829db66f0445442f6c796bba0ca62d1f87f54760c4682b6d1489e729a43744"
             ],
             "version": "==0.0.13"
         },
+        "botocore": {
+            "hashes": [
+                "sha256:6af473c52d5e3e7ff82de5334e9fee96b2d5ec2df5d78bc00cd9937e2573a7a8",
+                "sha256:9f5123c7be704b17aeacae99b5842ab17bda1f799dd29134de8c70e0a50a45d7"
+            ],
+            "version": "==1.12.111"
+        },
         "certifi": {
             "hashes": [
-                "sha256:47f9c83ef4c0c621eaef743f133f09fa8a74a9b75f037e8624f83bd1b6626cb7",
-                "sha256:993f830721089fef441cdfeb4b2c8c9df86f0c63239f06bd025a76a7daddb033"
+                "sha256:59b7658e26ca9c7339e00f8f4636cdfe59d34fa37b9b04f6f9e9926b3cece1a5",
+                "sha256:b26104d6835d1f5e49452a26eb2ff87fe7090b89dfcaee5ea2212697e1e1d7ae"
             ],
-            "version": "==2018.11.29"
+            "version": "==2019.3.9"
         },
         "cffi": {
             "hashes": [
                 "sha256:00b97afa72c233495560a0793cdc86c2571721b4271c0667addc83c417f3d90f",
                 "sha256:0ba1b0c90f2124459f6966a10c03794082a2f3985cd699d7d63c4a8dae113e11",
                 "sha256:0bffb69da295a4fc3349f2ec7cbe16b8ba057b0a593a92cbe8396e535244ee9d",
                 "sha256:21469a2b1082088d11ccd79dd84157ba42d940064abbfa59cf5f024c19cf4891",
                 "sha256:2e4812f7fa984bf1ab253a40f1f4391b604f7fc424a3e21f7de542a7f8f7aedf",
@@ -127,16 +142,23 @@
         },
         "click": {
             "hashes": [
                 "sha256:2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13",
                 "sha256:5b94b49521f6456670fdb30cd82a4eca9412788a93fa6dd6df72c94d5a8ff2d7"
             ],
             "version": "==7.0"
         },
+        "colorama": {
+            "hashes": [
+                "sha256:463f8483208e921368c9f306094eb6f725c6ca42b0f97e313cb5d5512459feda",
+                "sha256:48eb22f4f8461b1df5734a074b57042430fb06e1d61bd1e11b078c0fe6d7a1f1"
+            ],
+            "version": "==0.3.9"
+        },
         "construct": {
             "hashes": [
                 "sha256:2271a0efd0798679dea825ff47e22a4c550456a5db0ba8baa82f7eae0af0118c"
             ],
             "version": "==2.9.45"
         },
         "cryptography": {
             "hashes": [
@@ -159,20 +181,21 @@
                 "sha256:d4afbb0840f489b60f5a580a41a1b9c3622e08ecb5eec8614d4fb4cd914c4460",
                 "sha256:d9ed28030797c00f4bc43c86bf819266c76a5ea61d006cd4078a93ebf7da6bfd",
                 "sha256:e603aa7bb52e4e8ed4119a58a03b60323918467ef209e6ff9db3ac382e5cf2c6"
             ],
             "version": "==2.6.1"
         },
         "datadog": {
             "hashes": [
-                "sha256:cbaa6b4b2b88fd552605e6730f60d5437017bb76d6b701432eaafbc983735b79"
+                "sha256:9487480fd4b5898b665384f95eeb0cbca4ec998bb58224b7bb60fff3978191ad",
+                "sha256:d28251dd28f51f27e942bb23fe15349e5223aef75246a94ff7233fb174b74bb9"
             ],
             "index": "pypi",
-            "version": "==0.26.0"
+            "version": "==0.27.0"
         },
         "decorator": {
             "hashes": [
                 "sha256:33cd704aea07b4c28b3eb2c97d288a06918275dac0ecebdaf1bc8a48d98adb9e",
                 "sha256:cabb249f4710888a2fc0e13e9a16c343d932033718ff62e1e9bc93a9d3a9122b"
             ],
             "version": "==4.3.2"
         },
@@ -185,16 +208,24 @@
         },
         "dictdiffer": {
             "hashes": [
                 "sha256:b6eed4cf74ed31ae9646257a9f802bb09e545ca817d5c0119d747b6a05b6a22d",
                 "sha256:cc398dc26600cdb9519b2c768157333a0967b24d64c3913077dd0794274395da"
             ],
             "version": "==0.7.2"
         },
+        "docutils": {
+            "hashes": [
+                "sha256:02aec4bd92ab067f6ff27a38a38a41173bf01bed8f89157768c1573f53e474a6",
+                "sha256:51e64ef2ebfb29cae1faa133b3710143496eca21c530f3f71424d77687764274",
+                "sha256:7a4bd47eaf6596e1295ecb11361139febe29b084a87bf005bf899f9a42edc3c6"
+            ],
+            "version": "==0.14"
+        },
         "frozendict": {
             "hashes": [
                 "sha256:774179f22db2ef8a106e9c38d4d1f8503864603db08de2e33be5b778230f6e45"
             ],
             "version": "==1.2"
         },
         "github3.py": {
             "hashes": [
@@ -212,16 +243,23 @@
         },
         "idna-ssl": {
             "hashes": [
                 "sha256:a933e3bb13da54383f9e8f35dc4f9cb9eb9b3b78c6b36f311254d6d0d92c6c7c"
             ],
             "markers": "python_version < '3.7'",
             "version": "==1.1.0"
         },
+        "jmespath": {
+            "hashes": [
+                "sha256:3720a4b1bd659dd2eecad0666459b9788813e032b83e7ba58578e48254e0a0e6",
+                "sha256:bde2aef6f44302dfb30320115b17d030798de8c4110e28d5cf6cf91a7a31074c"
+            ],
+            "version": "==0.9.4"
+        },
         "json-e": {
             "hashes": [
                 "sha256:d2914f785d93ecc4f0b2ad6e3f2791f33327eaa740a3c4917d68a9a485dd282d"
             ],
             "version": "==3.0.0"
         },
         "jsonschema": {
             "hashes": [
@@ -242,20 +280,20 @@
                 "sha256:1939df482f2d3f6221405da00d6286d77d2dd60d372a0fd37532a8f00544f64f",
                 "sha256:5d2904a063f0da625e37515fa9eb340082e69fa1c00fdbeb82d28b7ff3c51e28"
             ],
             "index": "pypi",
             "version": "==3.1.0"
         },
         "mohawk": {
             "hashes": [
-                "sha256:b3f85ffa93a5c7d2f9cc591246ef9f8ac4a9fa716bfd5bae0377699a2d89d78c",
-                "sha256:e98b331d9fa9ece7b8be26094cbe2d57613ae882133cc755167268a984bc0ab3"
+                "sha256:aa57e6626a6ea323ab714779f23734de1d1feca8cb6fc00b65e65ce115c1696a",
+                "sha256:fca4e34d8f5492f1c33141c98b96e168a089e5692ce65fb747e4bb613f5fe552"
             ],
-            "version": "==0.3.4"
+            "version": "==1.0.0"
         },
         "multidict": {
             "hashes": [
                 "sha256:024b8129695a952ebd93373e45b5d341dbb87c17ce49637b34000093f243dd4f",
                 "sha256:041e9442b11409be5e4fc8b6a97e4bcead758ab1e11768d1e69160bdde18acc3",
                 "sha256:045b4dd0e5f6121e6f314d81759abd2c257db4634260abcfe0d3f7083c4908ef",
                 "sha256:047c0a04e382ef8bd74b0de01407e8d8632d7d1b4db6f2561106af812a68741b",
                 "sha256:068167c2d7bbeebd359665ac4fff756be5ffac9cda02375b5c5a7c4777038e73",
@@ -295,16 +333,34 @@
         },
         "ptyprocess": {
             "hashes": [
                 "sha256:923f299cc5ad920c68f2bc0bc98b75b9f838b93b599941a6b63ddbc2476394c0",
                 "sha256:d7cc528d76e76342423ca640335bd3633420dc1366f258cb31d05e865ef5ca1f"
             ],
             "version": "==0.6.0"
         },
+        "pyasn1": {
+            "hashes": [
+                "sha256:061442c60842f6d11051d4fdae9bc197b64bd41573a12234a753a0cb80b4f30b",
+                "sha256:0ee2449bf4c4e535823acc25624c45a8b454f328d59d3f3eeb82d3567100b9bd",
+                "sha256:5f9fb05c33e53b9a6ee3b1ed1d292043f83df465852bec876e93b47fd2df7eed",
+                "sha256:65201d28e081f690a32401e6253cca4449ccacc8f3988e811fae66bd822910ee",
+                "sha256:79b336b073a52fa3c3d8728e78fa56b7d03138ef59f44084de5f39650265b5ff",
+                "sha256:8ec20f61483764de281e0b4aba7d12716189700debcfa9e7935780850bf527f3",
+                "sha256:9458d0273f95d035de4c0d5e0643f25daba330582cc71bb554fe6969c015042a",
+                "sha256:98d97a1833a29ca61cd04a60414def8f02f406d732f9f0bcb49f769faff1b699",
+                "sha256:b00d7bfb6603517e189d1ad76967c7e805139f63e43096e5f871d1277f50aea5",
+                "sha256:b06c0cfd708b806ea025426aace45551f91ea7f557e0c2d4fbd9a4b346873ce0",
+                "sha256:d14d05984581770333731690f5453efd4b82e1e5d824a1d7976b868a2e5c38e8",
+                "sha256:da2420fe13a9452d8ae97a0e478adde1dee153b11ba832a95b223a2ba01c10f7",
+                "sha256:da6b43a8c9ae93bc80e2739efb38cc776ba74a886e3e9318d65fe81a8b8a2c6e"
+            ],
+            "version": "==0.4.5"
+        },
         "pycparser": {
             "hashes": [
                 "sha256:a988718abfad80b6b157acce7bf130a30876d27603738ac39f140993246b25b3"
             ],
             "version": "==2.19"
         },
         "pyrsistent": {
             "hashes": [
@@ -312,16 +368,17 @@
             ],
             "version": "==0.14.11"
         },
         "python-dateutil": {
             "hashes": [
                 "sha256:7e6584c74aeed623791615e26efd690f29817a27c73085b78e4bad02493df2fb",
                 "sha256:c89805f6f4d64db21ed966fda138f8a5ed7a4fdbc1a8ee329ce1b74e3c74da9e"
             ],
+            "markers": "python_version >= '2.7'",
             "version": "==2.8.0"
         },
         "python-gnupg": {
             "hashes": [
                 "sha256:45daf020b370bda13a1429c859fcdff0b766c0576844211446f9266cae97fb0e",
                 "sha256:85c231850a0275c9722f06e34b45a22510b83a6a6e88f93b5ae32ba04c95056c"
             ],
             "version": "==0.4.4"
@@ -339,37 +396,51 @@
                 "sha256:d5eef459e30b09f5a098b9cea68bebfeb268697f78d647bd255a085371ac7f3f",
                 "sha256:e01d3203230e1786cd91ccfdc8f8454c8069c91bee3962ad93b87a4b2860f537",
                 "sha256:e170a9e6fcfd19021dd29845af83bb79236068bf5fd4df3327c1be18182b2531"
             ],
             "version": "==3.13"
         },
         "redo": {
             "hashes": [
-                "sha256:29159a717454e1f276c7c509b81357e167a0b9218c68adf8ca8b0499363877ad",
-                "sha256:703603d61b4ae7fa14a9dce3db22d8789284e99be997f558137612e847ead3cb"
+                "sha256:36784bf8ae766e14f9db0e377ccfa02835d648321d2007b6ae0bf4fd612c0f94",
+                "sha256:71161cb0e928d824092a5f16203939bbc0867ce4c4685db263cf22c3ae7634a8"
             ],
             "index": "pypi",
-            "version": "==2.0.2"
+            "version": "==2.0.3"
         },
         "requests": {
             "hashes": [
                 "sha256:502a824f31acdacb3a35b6690b5fbf0bc41d63a24a45c4004352b0242707598e",
                 "sha256:7bf2a778576d825600030a110f3c0e3e8edc51dfaafe1c146e39a2027784957b"
             ],
             "index": "pypi",
             "version": "==2.21.0"
         },
+        "rsa": {
+            "hashes": [
+                "sha256:25df4e10c263fb88b5ace923dd84bf9aa7f5019687b5e55382ffcdb8bede9db5",
+                "sha256:43f682fea81c452c98d09fc316aae12de6d30c4b5c84226642cf8f8fd1c93abd"
+            ],
+            "version": "==3.4.2"
+        },
+        "s3transfer": {
+            "hashes": [
+                "sha256:7b9ad3213bff7d357f888e0fab5101b56fa1a0548ee77d121c3a3dbfbef4cb2e",
+                "sha256:f23d5cb7d862b104401d9021fc82e5fa0e0cf57b7660a1331425aab0c691d021"
+            ],
+            "version": "==0.2.0"
+        },
         "scriptworker": {
             "hashes": [
-                "sha256:7b3db12bf468473b1549c05b5cc78effd8c89d7721dcb889ca45e971ba21252a",
-                "sha256:a23b02e86f4ee10e293cc2c5e4b7becd25c5e075286daab0a28d14dc945a810a"
+                "sha256:9ee316ec0c7540149e53b175634736cd1900c4c14c0d461eb32ce832c77d44f1",
+                "sha256:d16e7a08d5b00687242252a00e59007babab62e00057a0f16654a3105867db33"
             ],
             "index": "pypi",
-            "version": "==20.0.1"
+            "version": "==22.0.0"
         },
         "sh": {
             "hashes": [
                 "sha256:ae3258c5249493cebe73cb4e18253a41ed69262484bad36fdb3efcb8ad8870bb",
                 "sha256:b52bf5833ed01c7b5c5fb73a7f71b3d98d48e9b9b8764236237bdc7ecae850fc"
             ],
             "index": "pypi",
             "version": "==1.12.14"
@@ -378,27 +449,27 @@
             "hashes": [
                 "sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c",
                 "sha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73"
             ],
             "version": "==1.12.0"
         },
         "slugid": {
             "hashes": [
-                "sha256:6dab3c7eef0bb423fb54cb7752e0f466ddd0ee495b78b763be60e8a27f69e779"
+                "sha256:a950d98b72691178bdd4d6c52743c4a2aa039207cf7a97d71060a111ff9ba297",
+                "sha256:aec8b0e01c4ad32e38e12d609eab3ec912fd129aaf6b2ded0199b56a5f8fd67c"
             ],
-            "version": "==1.0.7"
+            "version": "==2.0.0"
         },
         "taskcluster": {
             "hashes": [
-                "sha256:48ecd4898c7928deddfb34cb1cfe2b2505c68416e6c503f8a7f3dd0572425e96",
-                "sha256:6d5cf7bdbc09dc48b2d376b418b95c1c157a2d359c4b6b231c1fb14a323c0cc5",
-                "sha256:e409fce7a72808e4f87dc7baca7a79d8b64d5c5045264b9e197c120cc40e219b"
+                "sha256:979beeeaa9d24d99a91a05d86c81b5b2bd43defe8fe9d4a775960004bb144314",
+                "sha256:e8f8e311e071cd0d2f36af136003cb87b09e87fde4a4bea98467334d6f2d5590"
             ],
-            "version": "==6.0.0"
+            "version": "==7.0.0"
         },
         "taskcluster-urls": {
             "hashes": [
                 "sha256:18dcaa9c2412d34ff6c78faca33f0dd8f2384e3f00a98d5832c62d6d664741f0",
                 "sha256:2aceab7cf5b1948bc197f2e5e50c371aa48181ccd490b8bada00f1e3baf0c5cc",
                 "sha256:74bd2110b5daaebcec5e1d287bf137b61cb8cf6b2d8f5f2b74183e32bc4e7c87"
             ],
             "version": "==11.0.0"
@@ -420,16 +491,17 @@
             ],
             "version": "==3.0.0"
         },
         "urllib3": {
             "hashes": [
                 "sha256:61bf29cada3fc2fbefad4fdf059ea4bd1b4a86d2b6d15e1c7c0b582b9752fe39",
                 "sha256:de9529817c93f27c8ccbfead6985011db27bd0ddfcdb2d86f3f663385c6a9c22"
             ],
+            "markers": "python_version >= '3.4'",
             "version": "==1.24.1"
         },
         "yarl": {
             "hashes": [
                 "sha256:024ecdc12bc02b321bc66b41327f930d1c2c543fa9a561b39861da9388ba7aa9",
                 "sha256:2f3010703295fbe1aec51023740871e64bb9664c789cba5a6bdf404e93f7568f",
                 "sha256:3890ab952d508523ef4881457c4099056546593fa05e93da84c7250516e632eb",
                 "sha256:3e2724eb9af5dc41648e5bb304fcf4891adc33258c6e14e2a7414ea32541e320",
--- a/taskcluster/docker/funsize-update-generator/scripts/mbsdiff_hook.sh
+++ b/taskcluster/docker/funsize-update-generator/scripts/mbsdiff_hook.sh
@@ -20,16 +20,18 @@ CACHE_THRESHOLD=500000
 NAMESPACE='releng.releases.partials'
 if [ -e "${HOME}/.dogrc" ]
 then
     METRIC_CMD="$(command -v dog)"
 else
     METRIC_CMD="echo"
 fi
 METRIC_PARAMS="--type gauge --no_host"
+S3_CACHE_HITS=0
+S3_CACHE_MISSES=0
 
 if [ -n "${BRANCH}" ]
 then
     if [ -n "${TAGS}" ]; then TAGS="${TAGS},"; fi
     TAGS="${TAGS}branch:${BRANCH}"
 fi
 if [ -n "${PLATFORM}" ]
 then
@@ -111,28 +113,30 @@ get_patch(){
             return 0
         fi
     fi
     # If not in the local cache, we might find it remotely.
 
     if [ -n "${AWS_BUCKET_NAME}" ]; then
         BUCKET_PATH="s3://${AWS_BUCKET_NAME}${sha_from}/${sha_to}/${s3_filename}"
         if aws s3 ls "${BUCKET_PATH}"; then
+            ((S3_CACHE_HITS++))
             # shellcheck disable=SC2086,SC2090
             ${METRIC_CMD} metric post "${NAMESPACE}.s3_cache.hit" "${S3_CACHE_HITS}" ${METRIC_PARAMS} ${TAGS}
             echo "s3 cache hits now ${S3_CACHE_HITS}"
             if aws s3 cp "${BUCKET_PATH}" "${destination_file}"; then
                 echo "Successful retrieved ${destination_file} from s3://${AWS_BUCKET_NAME}"
                 return 0
             else
                 echo "Failed to retrieve ${destination_file} from s3://${AWS_BUCKET_NAME}"
                 return 1
             fi
         # Not found, fall through to default error
         else
+            ((S3_CACHE_MISSES++))
             # shellcheck disable=SC2086,SC2090
             ${METRIC_CMD} metric post "${NAMESPACE}.s3_cache.miss" "${S3_CACHE_MISSES}" ${METRIC_PARAMS} ${TAGS}
         fi
     fi
     return 1
 }
 
 OPTIND=1
--- a/toolkit/components/reader/AboutReader.jsm
+++ b/toolkit/components/reader/AboutReader.jsm
@@ -117,16 +117,35 @@ var AboutReader = function(mm, win, arti
 
   this._setupLineHeightButtons();
 
   if (win.speechSynthesis && Services.prefs.getBoolPref("narrate.enabled")) {
     new NarrateControls(mm, win, this._languagePromise);
   }
 
   this._loadArticle();
+
+  let dropdown = this._toolbarElement;
+
+  let elemL10nMap = {
+    ".minus-button": "minus",
+    ".plus-button": "plus",
+    ".content-width-minus-button": "contentwidthminus",
+    ".content-width-plus-button": "contentwidthplus",
+    ".line-height-minus-button": "lineheightminus",
+    ".line-height-plus-button": "lineheightplus",
+    ".light-button": "colorschemelight",
+    ".dark-button": "colorschemedark",
+    ".sepia-button": "colorschemesepia",
+  };
+
+  for (let [selector, stringID] of Object.entries(elemL10nMap)) {
+    dropdown.querySelector(selector).setAttribute("title",
+      gStrings.GetStringFromName("aboutReader.toolbar." + stringID));
+  }
 };
 
 AboutReader.prototype = {
   _BLOCK_IMAGES_SELECTOR: ".content p > img:only-child, " +
                           ".content p > a:only-child > img:only-child, " +
                           ".content .wp-caption img, " +
                           ".content figure img",
 
--- a/toolkit/components/telemetry/Events.yaml
+++ b/toolkit/components/telemetry/Events.yaml
@@ -1006,17 +1006,17 @@ uptake.remotecontent.result:
       - remotesettings
       - normandy
     extra_keys:
       source: >
         A label to distinguish what is being pulled or updated in the component (eg. recipe id,
         settings collection name, ...).
       trigger: >
         A label to distinguish what triggered the polling/fetching of remote content (eg. "broadcast",
-        "timer")
+        "timer", "forced", "manual")
     bug_numbers:
       - 1517469
     record_in_processes: ["main"]
     release_channel_collection: opt-out
     expiry_version: never
     notification_emails:
       - mleplatre@mozilla.com
       - bens-directs@mozilla.com
--- a/toolkit/components/telemetry/docs/collection/uptake.rst
+++ b/toolkit/components/telemetry/docs/collection/uptake.rst
@@ -79,17 +79,17 @@ Example:
    UptakeTelemetry.report(COMPONENT, status, { source: UPDATE_SOURCE });
 
 
 Additional Event Info
 '''''''''''''''''''''
 
 The Event API allows to report additional information. We support the following optional fields:
 
-- ``trigger``: A label to distinguish what triggered the polling/fetching of remote content (eg. ``"broadcast"``, ``"timer"``)
+- ``trigger``: A label to distinguish what triggered the polling/fetching of remote content (eg. ``"broadcast"``, ``"timer"``, ``"forced"``, ``"manual"``)
 
 .. code-block:: js
 
    UptakeTelemetry.report(component, status, { source, trigger: "timer" });
 
 
 Use-cases
 ---------
--- a/toolkit/library/gtest/rust/Cargo.toml
+++ b/toolkit/library/gtest/rust/Cargo.toml
@@ -10,16 +10,20 @@ bindgen = ["gkrust-shared/bindgen"]
 servo = ["gkrust-shared/servo"]
 quantum_render = ["gkrust-shared/quantum_render"]
 cubeb-remoting = ["gkrust-shared/cubeb-remoting"]
 cubeb_pulse_rust = ["gkrust-shared/cubeb_pulse_rust"]
 gecko_debug = ["gkrust-shared/gecko_debug"]
 simd-accel = ["gkrust-shared/simd-accel"]
 moz_memory = ["gkrust-shared/moz_memory"]
 spidermonkey_rust = ["gkrust-shared/spidermonkey_rust"]
+cranelift_x86 = ["gkrust-shared/cranelift_x86"]
+cranelift_arm32 = ["gkrust-shared/cranelift_arm32"]
+cranelift_arm64 = ["gkrust-shared/cranelift_arm64"]
+cranelift_none = ["gkrust-shared/cranelift_none"]
 gecko_profiler = ["gkrust-shared/gecko_profiler"]
 gecko_profiler_parse_elf = ["gkrust-shared/gecko_profiler_parse_elf"]
 
 [dependencies]
 bench-collections-gtest = { path = "../../../../xpcom/rust/gtest/bench-collections" }
 mp4parse-gtest = { path = "../../../../dom/media/gtest" }
 nsstring-gtest = { path = "../../../../xpcom/rust/gtest/nsstring" }
 xpcom-gtest = { path = "../../../../xpcom/rust/gtest/xpcom" }
--- a/toolkit/library/rust/Cargo.toml
+++ b/toolkit/library/rust/Cargo.toml
@@ -10,16 +10,20 @@ bindgen = ["gkrust-shared/bindgen"]
 servo = ["gkrust-shared/servo"]
 quantum_render = ["gkrust-shared/quantum_render"]
 cubeb-remoting = ["gkrust-shared/cubeb-remoting"]
 cubeb_pulse_rust = ["gkrust-shared/cubeb_pulse_rust"]
 gecko_debug = ["gkrust-shared/gecko_debug"]
 simd-accel = ["gkrust-shared/simd-accel"]
 moz_memory = ["gkrust-shared/moz_memory"]
 spidermonkey_rust = ["gkrust-shared/spidermonkey_rust"]
+cranelift_x86 = ["gkrust-shared/cranelift_x86"]
+cranelift_arm32 = ["gkrust-shared/cranelift_arm32"]
+cranelift_arm64 = ["gkrust-shared/cranelift_arm64"]
+cranelift_none = ["gkrust-shared/cranelift_none"]
 gecko_profiler = ["gkrust-shared/gecko_profiler"]
 gecko_profiler_parse_elf = ["gkrust-shared/gecko_profiler_parse_elf"]
 
 [dependencies]
 gkrust-shared = { path = "shared" }
 mozilla-central-workspace-hack = { path = "../../../build/workspace-hack" }
 
 [dev-dependencies]
--- a/toolkit/library/rust/gkrust-features.mozbuild
+++ b/toolkit/library/rust/gkrust-features.mozbuild
@@ -23,14 +23,22 @@ if CONFIG['MOZ_RUST_SIMD']:
 if (CONFIG['OS_ARCH'] == 'Linux' and CONFIG['OS_TARGET'] != 'Android') or CONFIG['OS_ARCH'] == 'Darwin' or (CONFIG['OS_ARCH'] == 'WINNT' and CONFIG['CPU_ARCH'] != 'aarch64'):
     gkrust_features += ['cubeb-remoting']
 
 if CONFIG['MOZ_MEMORY']:
     gkrust_features += ['moz_memory']
 
 if CONFIG['ENABLE_WASM_CRANELIFT']:
     gkrust_features += ['spidermonkey_rust']
+    if CONFIG['JS_CODEGEN_X86'] or CONFIG['JS_CODEGEN_X64']:
+        gkrust_features += ['cranelift_x86']
+    elif CONFIG['JS_CODEGEN_ARM']:
+        gkrust_features += ['cranelift_arm32']
+    elif CONFIG['JS_CODEGEN_ARM64']:
+        gkrust_features += ['cranelift_arm64']
+    else:
+        gkrust_features += ['cranelift_none']
 
 if CONFIG['MOZ_GECKO_PROFILER']:
     gkrust_features += ['gecko_profiler']
 
 if CONFIG['MOZ_GECKO_PROFILER_PARSE_ELF']:
     gkrust_features += ['gecko_profiler_parse_elf']
--- a/toolkit/library/rust/shared/Cargo.toml
+++ b/toolkit/library/rust/shared/Cargo.toml
@@ -42,16 +42,20 @@ bindgen = ["geckoservo/bindgen"]
 servo = ["geckoservo"]
 quantum_render = ["webrender_bindings"]
 cubeb-remoting = ["cubeb-sys", "audioipc-client", "audioipc-server"]
 cubeb_pulse_rust = ["cubeb-sys", "cubeb-pulse"]
 gecko_debug = ["geckoservo/gecko_debug", "nsstring/gecko_debug"]
 simd-accel = ["encoding_c/simd-accel", "encoding_glue/simd-accel"]
 moz_memory = ["mp4parse_capi/mp4parse_fallible"]
 spidermonkey_rust = ["jsrust_shared"]
+cranelift_x86 = ["jsrust_shared/cranelift_x86"]
+cranelift_arm32 = ["jsrust_shared/cranelift_arm32"]
+cranelift_arm64 = ["jsrust_shared/cranelift_arm64"]
+cranelift_none = ["jsrust_shared/cranelift_none"]
 gecko_profiler = ["profiler_helper"]
 gecko_profiler_parse_elf = ["profiler_helper/parse_elf"]
 
 [lib]
 path = "lib.rs"
 test = false
 doctest = false
 bench = false
--- a/toolkit/locales/en-US/chrome/global/aboutReader.properties
+++ b/toolkit/locales/en-US/chrome/global/aboutReader.properties
@@ -41,8 +41,19 @@ aboutReader.toolbar.close=Close Reader V
 aboutReader.toolbar.typeControls=Type controls
 
 # These are used for the Reader View toolbar button and the menuitem within the
 # View menu.
 readerView.enter=Enter Reader View
 readerView.enter.accesskey=R
 readerView.close=Close Reader View
 readerView.close.accesskey=R
+
+# These are used as tooltips in Type Control
+aboutReader.toolbar.minus = Decrease Font Size
+aboutReader.toolbar.plus = Increase Font Size
+aboutReader.toolbar.contentwidthminus = Decrease Content Width
+aboutReader.toolbar.contentwidthplus = Increase Content Width
+aboutReader.toolbar.lineheightminus = Decrease Line Height
+aboutReader.toolbar.lineheightplus = Increase Line Height
+aboutReader.toolbar.colorschemelight = Color Scheme Light
+aboutReader.toolbar.colorschemedark = Color Scheme Dark
+aboutReader.toolbar.colorschemesepia = Color Scheme Sepia