Merge mozilla-central to mozilla-inbound. a=merge on a CLOSED TREE
authorRazvan Maries <rmaries@mozilla.com>
Tue, 09 Apr 2019 06:43:36 +0300
changeset 468490 063fb107a6aff7fd4e1acb6089df10e5d22ed4b5
parent 468489 6e0ac51de4d2738e105a1c9c97a07f605c624d69 (current diff)
parent 468440 9eb55c9bf557d9b683d4808620e26da6e242c4b0 (diff)
child 468491 481a37f3892a4c4414bf4a9353b2e93a31182726
push id35839
push usernerli@mozilla.com
push dateTue, 09 Apr 2019 09:56:52 +0000
treeherdermozilla-central@98b223de0543 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone68.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 mozilla-central to mozilla-inbound. a=merge on a CLOSED TREE
.eslintignore
testing/mochitest/gen_template.pl
testing/mochitest/static/chrome.template.txt
testing/mochitest/static/test.template.txt
testing/mochitest/static/th.template.txt
testing/mochitest/static/xhtml.template.txt
testing/mochitest/static/xul.template.txt
testing/web-platform/meta/MANIFEST.json
testing/web-platform/mozilla/meta/MANIFEST.json
--- a/.eslintignore
+++ b/.eslintignore
@@ -18,43 +18,44 @@ extensions/cookie/**
 extensions/spellcheck/**
 extensions/universalchardet/**
 image/**
 layout/**
 netwerk/cookie/test/browser/**
 netwerk/test/browser/**
 netwerk/test/mochitests/**
 netwerk/test/unit*/**
-tools/update-packaging/**
-xpfe/**
+startupcache/**
 
 # We currently have no js files in these directories, so we ignore them by
 # default to aid ESLint's performance.
 build/**
 config/**
 db/**
 embedding/**
 gradle/**
 hal/**
 mfbt/**
 mozglue/**
 nsprpub/**
 other-licenses/**
-startupcache/**
+xpfe/**
 
 # These directories only contain crashtests, but we still skip the whole
 # directory to aid performance.
 view/**
 
 # browser/ exclusions
 browser/app/**
 browser/branding/**/firefox-branding.js
 # Gzipped test file.
 browser/base/content/test/general/gZipOfflineChild.html
 browser/base/content/test/urlbar/file_blank_but_not_blank.html
+# Third-party code.
+browser/components/payments/res/vendor/*
 # Test files that are really json not js, and don't need to be linted.
 browser/components/sessionstore/test/unit/data/sessionstore_valid.js
 browser/components/sessionstore/test/unit/data/sessionstore_invalid.js
 # This file is split into two in order to keep it as a valid json file
 # for documentation purposes (policies.json) but to be accessed by the
 # code as a .jsm (schema.jsm)
 browser/components/enterprisepolicies/schemas/schema.jsm
 # generated & special files in cld2
@@ -149,17 +150,17 @@ devtools/client/webconsole/test/mochites
 devtools/client/webconsole/test/mochitest/code_bundle_invalidmap.js
 devtools/server/tests/unit/babel_and_browserify_script_with_source_map.js
 devtools/server/tests/unit/setBreakpoint*
 devtools/server/tests/unit/sourcemapped.js
 
 # devtools specific format test file
 devtools/server/tests/unit/xpcshell_debugging_script.js
 
-# dom/ exclusions
+# dom/ exclusions which should be removed (aka ESLint enabled)
 dom/animation/**
 dom/base/*.*
 dom/base/test/*.*
 dom/base/test/unit/test_serializers_entities*.js
 dom/base/test/unit_ipc/**
 dom/base/test/jsmodules/**
 dom/canvas/**
 dom/encoding/**
@@ -186,17 +187,16 @@ dom/push/**
 dom/quota/**
 dom/security/test/cors/**
 dom/security/test/csp/**
 dom/security/test/general/**
 dom/security/test/mixedcontentblocker/**
 dom/security/test/sri/**
 dom/serviceworkers/**
 dom/smil/**
-
 dom/tests/html/**
 dom/tests/mochitest/**
 dom/u2f/**
 dom/vr/**
 dom/webauthn/**
 dom/webgpu/**
 dom/websocket/**
 dom/workers/**
@@ -286,16 +286,20 @@ remote/test/demo.js
 # security/ exclusions (pref files).
 security/manager/ssl/security-prefs.js
 
 # NSS / taskcluster only.
 security/nss/**
 
 # services/ exclusions
 
+# Third party services
+services/common/kinto-http-client.js
+services/common/kinto-offline-client.js
+
 # Webpack-bundled library
 services/fxaccounts/FxAccountsPairingChannel.js
 
 # Uses `#filter substitution`
 services/sync/modules/constants.js
 services/sync/services-sync.js
 
 # Servo is imported.
@@ -332,38 +336,43 @@ testing/raptor/raptor/playback/scripts/c
 
 testing/web-platform/**
 testing/xpcshell/moz-http2/**
 testing/xpcshell/node-http2/**
 testing/xpcshell/dns-packet/**
 testing/xpcshell/node-ip/**
 
 
-# Third party services
-services/common/kinto-http-client.js
-services/common/kinto-offline-client.js
+# Third party.
+third_party/**
 
 # toolkit/ exclusions
-toolkit/content/widgets/wizard.xml
+
+# Ignore generated code from wasm-bindgen
+toolkit/components/extensions/profiler_get_symbols.js
 
 # Intentionally invalid JS
 toolkit/components/workerloader/tests/moduleF-syntax-error.js
 
-# Tests old non-star function generators
-toolkit/modules/tests/xpcshell/test_task.js
-
 # External code:
-browser/components/payments/res/vendor/*
 toolkit/components/reader/Readability.js
 toolkit/components/reader/JSDOMParser.js
 
 # Uses preprocessing
 toolkit/components/reader/Readerable.jsm
-toolkit/modules/AppConstants.jsm
+
+# Should be going away soon
+toolkit/content/widgets/wizard.xml
+
+# Uses preprocessing
 toolkit/mozapps/update/tests/data/xpcshellConstantsPP.js
-tools/tryselect/selectors/chooser/templates/chooser.html
+toolkit/modules/AppConstants.jsm
+
+# Tests old non-star function generators
+toolkit/modules/tests/xpcshell/test_task.js
 
 # Third party
 toolkit/modules/third_party/**
-third_party/**
+
+tools/tryselect/selectors/chooser/templates/chooser.html
 
-# Ignore generated code from wasm-bindgen
-toolkit/components/extensions/profiler_get_symbols.js
+# Ignore preprocessed *(P)refs.js files in update-packaging.
+tools/update-packaging/**/*refs.js
--- a/browser/components/urlbar/UrlbarController.jsm
+++ b/browser/components/urlbar/UrlbarController.jsm
@@ -289,17 +289,17 @@ class UrlbarController {
         if (event.ctrlKey || event.altKey) {
           break;
         }
         if (this.view.isOpen) {
           this.userSelectionBehavior = "arrow";
           this.view.selectBy(
             event.keyCode == KeyEvent.DOM_VK_PAGE_DOWN ||
             event.keyCode == KeyEvent.DOM_VK_PAGE_UP ?
-              5 : 1,
+              UrlbarUtils.PAGE_UP_DOWN_DELTA : 1,
             { reverse: event.keyCode == KeyEvent.DOM_VK_UP ||
                        event.keyCode == KeyEvent.DOM_VK_PAGE_UP });
         } else {
           if (this.keyEventMovesCaret(event)) {
             break;
           }
           this.input.startQuery();
         }
--- a/browser/components/urlbar/UrlbarUtils.jsm
+++ b/browser/components/urlbar/UrlbarUtils.jsm
@@ -105,16 +105,19 @@ var UrlbarUtils = {
   },
 
   // This defines icon locations that are common used in the UI.
   ICON: {
     // DEFAULT is defined lazily so it doesn't eagerly initialize PlacesUtils.
     SEARCH_GLASS: "chrome://browser/skin/search-glass.svg",
   },
 
+  // The number of results by which Page Up/Down move the selection.
+  PAGE_UP_DOWN_DELTA: 5,
+
   // IME composition states.
   COMPOSITION: {
     NONE: 1,
     COMPOSING: 2,
     COMMIT: 3,
     CANCELED: 4,
   },
 
--- a/browser/components/urlbar/tests/browser/browser.ini
+++ b/browser/components/urlbar/tests/browser/browser.ini
@@ -58,16 +58,17 @@ support-files = redirect_error.sjs
 [browser_removeUnsafeProtocolsFromURLBarPaste.js]
 subsuite = clipboard
 [browser_search_favicon.js]
 skip-if = true # Bug 1526222 - Doesn't currently work with QuantumBar
 [browser_searchTelemetry.js]
 support-files =
   searchSuggestionEngine.xml
   searchSuggestionEngine.sjs
+[browser_selectionKeyNavigation.js]
 [browser_stop_pending.js]
 support-files =
   slow-page.sjs
 [browser_switchTab_closesUrlbarPopup.js]
 [browser_switchTab_decodeuri.js]
 [browser_switchTab_override.js]
 skip-if = ((os == 'win') && verify && debug)
 [browser_switchToTab_closes_newtab.js]
new file mode 100644
--- /dev/null
+++ b/browser/components/urlbar/tests/browser/browser_selectionKeyNavigation.js
@@ -0,0 +1,139 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+// This test makes sure that the up/down, page-up/down, and tab keys properly
+// adjust the selection.  See also browser_caret_navigation.js.
+
+"use strict";
+
+const MAX_RESULTS = UrlbarPrefs.get("maxRichResults");
+
+add_task(async function init() {
+  for (let i = 0; i < MAX_RESULTS; i++) {
+    await PlacesTestUtils.addVisits("http://example.com/" + i);
+  }
+  registerCleanupFunction(async function() {
+    await PlacesUtils.history.clear();
+  });
+});
+
+add_task(async function downKey() {
+  await promiseAutocompleteResultPopup("exam", window, true);
+  Assert.equal(UrlbarTestUtils.getSelectedIndex(window), 0,
+               "The heuristic autofill result should be selected initially");
+  for (let i = 1; i < MAX_RESULTS; i++) {
+    EventUtils.synthesizeKey("KEY_ArrowDown");
+    Assert.equal(UrlbarTestUtils.getSelectedIndex(window), i);
+  }
+  EventUtils.synthesizeKey("KEY_ArrowDown");
+  let oneOffs = UrlbarTestUtils.getOneOffSearchButtons(window);
+  Assert.ok(oneOffs.selectedButton, "A one-off should now be selected");
+  while (oneOffs.selectedButton) {
+    EventUtils.synthesizeKey("KEY_ArrowDown");
+  }
+  Assert.equal(UrlbarTestUtils.getSelectedIndex(window), 0,
+               "The heuristic autofill result should be selected again");
+});
+
+add_task(async function upKey() {
+  await promiseAutocompleteResultPopup("exam", window, true);
+  Assert.equal(UrlbarTestUtils.getSelectedIndex(window), 0,
+               "The heuristic autofill result should be selected initially");
+  EventUtils.synthesizeKey("KEY_ArrowUp");
+  let oneOffs = UrlbarTestUtils.getOneOffSearchButtons(window);
+  Assert.ok(oneOffs.selectedButton, "A one-off should now be selected");
+  while (oneOffs.selectedButton) {
+    EventUtils.synthesizeKey("KEY_ArrowUp");
+  }
+  Assert.equal(UrlbarTestUtils.getSelectedIndex(window),
+               MAX_RESULTS - 1,
+               "The last result should be selected");
+  for (let i = 1; i < MAX_RESULTS; i++) {
+    EventUtils.synthesizeKey("KEY_ArrowUp");
+    Assert.equal(UrlbarTestUtils.getSelectedIndex(window),
+                 MAX_RESULTS - i - 1);
+  }
+});
+
+add_task(async function pageDownKey() {
+  await promiseAutocompleteResultPopup("exam", window, true);
+  Assert.equal(UrlbarTestUtils.getSelectedIndex(window), 0,
+               "The heuristic autofill result should be selected initially");
+  let pageCount = Math.ceil((MAX_RESULTS - 1) / UrlbarUtils.PAGE_UP_DOWN_DELTA);
+  for (let i = 0; i < pageCount; i++) {
+    EventUtils.synthesizeKey("KEY_PageDown");
+    Assert.equal(
+      UrlbarTestUtils.getSelectedIndex(window),
+      Math.min((i + 1) * UrlbarUtils.PAGE_UP_DOWN_DELTA, MAX_RESULTS - 1)
+    );
+  }
+  EventUtils.synthesizeKey("KEY_PageDown");
+  Assert.equal(UrlbarTestUtils.getSelectedIndex(window), 0,
+               "Page down at end should wrap around to first result");
+});
+
+add_task(async function pageUpKey() {
+  await promiseAutocompleteResultPopup("exam", window, true);
+  Assert.equal(UrlbarTestUtils.getSelectedIndex(window), 0,
+               "The heuristic autofill result should be selected initially");
+  EventUtils.synthesizeKey("KEY_PageUp");
+  Assert.equal(UrlbarTestUtils.getSelectedIndex(window), MAX_RESULTS - 1,
+               "Page up at start should wrap around to last result");
+  let pageCount = Math.ceil((MAX_RESULTS - 1) / UrlbarUtils.PAGE_UP_DOWN_DELTA);
+  for (let i = 0; i < pageCount; i++) {
+    EventUtils.synthesizeKey("KEY_PageUp");
+    Assert.equal(
+      UrlbarTestUtils.getSelectedIndex(window),
+      Math.max(MAX_RESULTS - 1 - ((i + 1) * UrlbarUtils.PAGE_UP_DOWN_DELTA), 0)
+    );
+  }
+});
+
+add_task(async function pageDownKeyShowsView() {
+  await promiseAutocompleteResultPopup("exam", window, true);
+  await UrlbarTestUtils.promisePopupClose(window);
+  EventUtils.synthesizeKey("KEY_PageDown");
+  await UrlbarTestUtils.promiseSearchComplete(window);
+  Assert.ok(UrlbarTestUtils.isPopupOpen(window));
+  Assert.equal(UrlbarTestUtils.getSelectedIndex(window), 0);
+});
+
+add_task(async function pageUpKeyShowsView() {
+  await promiseAutocompleteResultPopup("exam", window, true);
+  await UrlbarTestUtils.promisePopupClose(window);
+  EventUtils.synthesizeKey("KEY_PageUp");
+  await UrlbarTestUtils.promiseSearchComplete(window);
+  Assert.ok(UrlbarTestUtils.isPopupOpen(window));
+  Assert.equal(UrlbarTestUtils.getSelectedIndex(window), 0);
+});
+
+add_task(async function tabKey() {
+  await promiseAutocompleteResultPopup("exam", window, true);
+  Assert.equal(UrlbarTestUtils.getSelectedIndex(window), 0,
+               "The heuristic autofill result should be selected initially");
+  for (let i = 1; i < MAX_RESULTS; i++) {
+    EventUtils.synthesizeKey("KEY_Tab");
+    Assert.equal(UrlbarTestUtils.getSelectedIndex(window), i);
+  }
+  EventUtils.synthesizeKey("KEY_Tab");
+  Assert.equal(UrlbarTestUtils.getSelectedIndex(window), 0,
+               "The heuristic autofill result should be selected again");
+});
+
+add_task(async function tabKeyReverse() {
+  await promiseAutocompleteResultPopup("exam", window, true);
+  Assert.equal(UrlbarTestUtils.getSelectedIndex(window), 0,
+               "The heuristic autofill result should be selected initially");
+  for (let i = 1; i < MAX_RESULTS; i++) {
+    EventUtils.synthesizeKey("KEY_Tab", { shiftKey: true });
+    Assert.equal(UrlbarTestUtils.getSelectedIndex(window), MAX_RESULTS - i);
+  }
+});
+
+add_task(async function tabKeyBlur() {
+  await promiseAutocompleteResultPopup("exam", window, true);
+  await UrlbarTestUtils.promisePopupClose(window);
+  Assert.equal(document.activeElement, gURLBar.inputField);
+  EventUtils.synthesizeKey("KEY_Tab");
+  Assert.notEqual(document.activeElement, gURLBar.inputField);
+});
--- a/devtools/server/tests/unit/head_dbg.js
+++ b/devtools/server/tests/unit/head_dbg.js
@@ -318,20 +318,20 @@ var listener = {
       // Make sure we exit all nested event loops so that the test can finish.
       while (DebuggerServer
              && DebuggerServer.xpcInspector
              && DebuggerServer.xpcInspector.eventLoopNestLevel > 0) {
         DebuggerServer.xpcInspector.exitNestedEventLoop();
       }
 
       // In the world before bug 997440, exceptions were getting lost because of
-      // the arbitrary JSContext being used in nsXPCWrappedJSClass::CallMethod.
+      // the arbitrary JSContext being used in nsXPCWrappedJS::CallMethod.
       // In the new world, the wanderers have returned. However, because of the,
       // currently very-broken, exception reporting machinery in
-      // XPCWrappedJSClass these get reported as errors to the console, even if
+      // nsXPCWrappedJS these get reported as errors to the console, even if
       // there's actually JS on the stack above that will catch them.  If we
       // throw an error here because of them our tests start failing.  So, we'll
       // just dump the message to the logs instead, to make sure the information
       // isn't lost.
       dumpn("head_dbg.js observed a console message: " + string);
     } catch (_) {
       // Swallow everything to avoid console reentrancy errors. We did our best
       // to log above, but apparently that didn't cut it.
--- a/docshell/base/LoadContext.cpp
+++ b/docshell/base/LoadContext.cpp
@@ -18,23 +18,21 @@ namespace mozilla {
 NS_IMPL_ISUPPORTS(LoadContext, nsILoadContext, nsIInterfaceRequestor)
 
 LoadContext::LoadContext(nsIPrincipal* aPrincipal,
                          nsILoadContext* aOptionalBase)
     : mTopFrameElement(nullptr),
       mNestedFrameId(0),
       mIsContent(true),
       mUseRemoteTabs(false),
-      mUseTrackingProtection(false)
+      mUseTrackingProtection(false),
 #ifdef DEBUG
-      ,
-      mIsNotNull(true)
+      mIsNotNull(true),
 #endif
-{
-  mOriginAttributes = aPrincipal->OriginAttributesRef();
+      mOriginAttributes(aPrincipal->OriginAttributesRef()) {
   if (!aOptionalBase) {
     return;
   }
 
   MOZ_ALWAYS_SUCCEEDS(aOptionalBase->GetIsContent(&mIsContent));
   MOZ_ALWAYS_SUCCEEDS(aOptionalBase->GetUseRemoteTabs(&mUseRemoteTabs));
   MOZ_ALWAYS_SUCCEEDS(
       aOptionalBase->GetUseTrackingProtection(&mUseTrackingProtection));
--- a/docshell/base/LoadContext.h
+++ b/docshell/base/LoadContext.h
@@ -37,91 +37,83 @@ class LoadContext final : public nsILoad
   // SerializedLoadContext provided by child process.
   LoadContext(const IPC::SerializedLoadContext& aToCopy,
               dom::Element* aTopFrameElement, OriginAttributes& aAttrs)
       : mTopFrameElement(do_GetWeakReference(aTopFrameElement)),
         mNestedFrameId(0),
         mIsContent(aToCopy.mIsContent),
         mUseRemoteTabs(aToCopy.mUseRemoteTabs),
         mUseTrackingProtection(aToCopy.mUseTrackingProtection),
-        mOriginAttributes(aAttrs)
 #ifdef DEBUG
-        ,
-        mIsNotNull(aToCopy.mIsNotNull)
+        mIsNotNull(aToCopy.mIsNotNull),
 #endif
-  {
+        mOriginAttributes(aAttrs) {
   }
 
   // appId/inIsolatedMozBrowser arguments override those in
   // SerializedLoadContext provided by child process.
   LoadContext(const IPC::SerializedLoadContext& aToCopy,
               uint64_t aNestedFrameId, OriginAttributes& aAttrs)
       : mTopFrameElement(nullptr),
         mNestedFrameId(aNestedFrameId),
         mIsContent(aToCopy.mIsContent),
         mUseRemoteTabs(aToCopy.mUseRemoteTabs),
         mUseTrackingProtection(aToCopy.mUseTrackingProtection),
-        mOriginAttributes(aAttrs)
 #ifdef DEBUG
-        ,
-        mIsNotNull(aToCopy.mIsNotNull)
+        mIsNotNull(aToCopy.mIsNotNull),
 #endif
-  {
+        mOriginAttributes(aAttrs) {
   }
 
   LoadContext(dom::Element* aTopFrameElement, bool aIsContent,
               bool aUsePrivateBrowsing, bool aUseRemoteTabs,
               bool aUseTrackingProtection, const OriginAttributes& aAttrs)
       : mTopFrameElement(do_GetWeakReference(aTopFrameElement)),
         mNestedFrameId(0),
         mIsContent(aIsContent),
         mUseRemoteTabs(aUseRemoteTabs),
         mUseTrackingProtection(aUseTrackingProtection),
-        mOriginAttributes(aAttrs)
 #ifdef DEBUG
-        ,
-        mIsNotNull(true)
+        mIsNotNull(true),
 #endif
-  {
+        mOriginAttributes(aAttrs) {
     MOZ_DIAGNOSTIC_ASSERT(aUsePrivateBrowsing ==
                           (aAttrs.mPrivateBrowsingId > 0));
   }
 
   // Constructor taking reserved origin attributes.
   explicit LoadContext(OriginAttributes& aAttrs)
       : mTopFrameElement(nullptr),
         mNestedFrameId(0),
         mIsContent(false),
         mUseRemoteTabs(false),
         mUseTrackingProtection(false),
-        mOriginAttributes(aAttrs)
 #ifdef DEBUG
-        ,
-        mIsNotNull(true)
+        mIsNotNull(true),
 #endif
-  {
+        mOriginAttributes(aAttrs) {
   }
 
   // Constructor for creating a LoadContext with a given principal's appId and
   // browser flag.
   explicit LoadContext(nsIPrincipal* aPrincipal,
                        nsILoadContext* aOptionalBase = nullptr);
 
  private:
   ~LoadContext() {}
 
   nsWeakPtr mTopFrameElement;
   uint64_t mNestedFrameId;
   bool mIsContent;
   bool mUseRemoteTabs;
   bool mUseTrackingProtection;
-  OriginAttributes mOriginAttributes;
 #ifdef DEBUG
   bool mIsNotNull;
 #endif
+  OriginAttributes mOriginAttributes;
 };
 
 already_AddRefed<nsILoadContext> CreateLoadContext();
 already_AddRefed<nsILoadContext> CreatePrivateLoadContext();
 
 }  // namespace mozilla
 
 #endif  // LoadContext_h
--- a/docshell/base/nsDocShell.cpp
+++ b/docshell/base/nsDocShell.cpp
@@ -336,22 +336,20 @@ nsDocShell::nsDocShell(BrowsingContext* 
       mFailedLoadType(0),
       mFrameType(FRAME_TYPE_REGULAR),
       mPrivateBrowsingId(0),
       mDisplayMode(nsIDocShell::DISPLAY_MODE_BROWSER),
       mJSRunToCompletionDepth(0),
       mTouchEventsOverride(nsIDocShell::TOUCHEVENTS_OVERRIDE_NONE),
       mMetaViewportOverride(nsIDocShell::META_VIEWPORT_OVERRIDE_NONE),
       mFullscreenAllowed(CHECK_ATTRIBUTES),
-      mCreatingDocument(false)
+      mCreatingDocument(false),
 #ifdef DEBUG
-      ,
-      mInEnsureScriptEnv(false)
+      mInEnsureScriptEnv(false),
 #endif
-      ,
       mCreated(false),
       mAllowSubframes(true),
       mAllowPlugins(true),
       mAllowJavascript(true),
       mAllowMetaRedirects(true),
       mAllowImages(true),
       mAllowMedia(true),
       mAllowDNSPrefetch(true),
new file mode 100644
--- /dev/null
+++ b/dom/gamepad/GamepadRemapping.cpp
@@ -0,0 +1,239 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* 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/. */
+
+// Based on
+// https://cs.chromium.org/chromium/src/device/gamepad/gamepad_standard_mappings.h
+
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "mozilla/dom/GamepadRemapping.h"
+
+namespace mozilla {
+namespace dom {
+
+// Follow the canonical ordering recommendation for the "Standard Gamepad"
+// from https://www.w3.org/TR/gamepad/#remapping.
+enum CanonicalButtonIndex {
+  BUTTON_INDEX_PRIMARY,
+  BUTTON_INDEX_SECONDARY,
+  BUTTON_INDEX_TERTIARY,
+  BUTTON_INDEX_QUATERNARY,
+  BUTTON_INDEX_LEFT_SHOULDER,
+  BUTTON_INDEX_RIGHT_SHOULDER,
+  BUTTON_INDEX_LEFT_TRIGGER,
+  BUTTON_INDEX_RIGHT_TRIGGER,
+  BUTTON_INDEX_BACK_SELECT,
+  BUTTON_INDEX_START,
+  BUTTON_INDEX_LEFT_THUMBSTICK,
+  BUTTON_INDEX_RIGHT_THUMBSTICK,
+  BUTTON_INDEX_DPAD_UP,
+  BUTTON_INDEX_DPAD_DOWN,
+  BUTTON_INDEX_DPAD_LEFT,
+  BUTTON_INDEX_DPAD_RIGHT,
+  BUTTON_INDEX_META,
+  BUTTON_INDEX_COUNT
+};
+
+enum CanonicalAxisIndex {
+  AXIS_INDEX_LEFT_STICK_X,
+  AXIS_INDEX_LEFT_STICK_Y,
+  AXIS_INDEX_RIGHT_STICK_X,
+  AXIS_INDEX_RIGHT_STICK_Y,
+  AXIS_INDEX_COUNT
+};
+
+void FetchDpadFromAxis(uint32_t aIndex, double dir) {
+  bool up = false;
+  bool right = false;
+  bool down = false;
+  bool left = false;
+
+  // Dpad is mapped as a direction on one axis, where -1 is up and it
+  // increases clockwise to 1, which is up + left. It's set to a large (> 1.f)
+  // number when nothing is depressed, except on start up, sometimes it's 0.0
+  // for no data, rather than the large number.
+  if (dir != 0.0f) {
+    up = (dir >= -1.f && dir < -0.7f) || (dir >= .95f && dir <= 1.f);
+    right = dir >= -.75f && dir < -.1f;
+    down = dir >= -.2f && dir < .45f;
+    left = dir >= .4f && dir <= 1.f;
+  }
+
+  RefPtr<GamepadPlatformService> service =
+      GamepadPlatformService::GetParentService();
+  if (!service) {
+    return;
+  }
+
+  service->NewButtonEvent(aIndex, BUTTON_INDEX_DPAD_UP, up);
+  service->NewButtonEvent(aIndex, BUTTON_INDEX_DPAD_RIGHT, right);
+  service->NewButtonEvent(aIndex, BUTTON_INDEX_DPAD_DOWN, down);
+  service->NewButtonEvent(aIndex, BUTTON_INDEX_DPAD_LEFT, left);
+}
+
+class DefaultRemapper final : public GamepadRemapper {
+  public:
+    virtual uint32_t GetAxisCount() const override {
+      return numAxes;
+    }
+
+    virtual uint32_t GetButtonCount() const override {
+      return numButtons;
+    }
+
+    virtual void SetAxisCount(uint32_t aAxisCount) override {
+      numAxes = aAxisCount;
+    }
+
+    virtual void SetButtonCount(uint32_t aButtonCount) override {
+      numButtons = aButtonCount;
+    }
+
+    virtual void RemapAxisMoveEvent(uint32_t aIndex, uint32_t aAxis,
+                                  double aValue) const override {
+      RefPtr<GamepadPlatformService> service =
+          GamepadPlatformService::GetParentService();
+      if (!service) {
+        return;
+      }                             
+      service->NewAxisMoveEvent(aIndex, aAxis, aValue);
+    }
+
+    virtual void RemapButtonEvent(uint32_t aIndex, uint32_t aButton,
+                                  bool aPressed) const override {
+      RefPtr<GamepadPlatformService> service =
+          GamepadPlatformService::GetParentService();
+      if (!service) {
+        return;
+      }
+      service->NewButtonEvent(aIndex, aButton, aPressed);
+    }
+
+  private:
+    uint32_t numAxes;
+    uint32_t numButtons;
+};
+
+class Dualshock4Remapper final : public GamepadRemapper {
+ public:
+  virtual uint32_t GetAxisCount() const override { return AXIS_INDEX_COUNT; }
+
+  virtual uint32_t GetButtonCount() const override {
+    return DUALSHOCK_BUTTON_COUNT;
+  }
+
+  virtual GamepadMappingType GetMappingType() const override {
+    return GamepadMappingType::_empty;
+  }
+
+  virtual void RemapAxisMoveEvent(uint32_t aIndex, uint32_t aAxis,
+                                  double aValue) const override {
+    RefPtr<GamepadPlatformService> service =
+        GamepadPlatformService::GetParentService();
+    if (!service) {
+      return;
+    }
+
+    switch (aAxis) {
+      case 0:
+        service->NewAxisMoveEvent(aIndex, AXIS_INDEX_LEFT_STICK_X, aValue);
+        break;
+      case 1:
+        service->NewAxisMoveEvent(aIndex, AXIS_INDEX_LEFT_STICK_Y, aValue);
+        break;
+      case 2:
+        service->NewAxisMoveEvent(aIndex, AXIS_INDEX_RIGHT_STICK_X, aValue);
+        break;
+      case 3:
+        service->NewButtonEvent(aIndex, BUTTON_INDEX_LEFT_TRIGGER,
+                                aValue > 0.1f);
+        break;
+      case 4:
+        service->NewButtonEvent(aIndex, BUTTON_INDEX_RIGHT_TRIGGER,
+                                aValue > 0.1f);
+        break;
+      case 5:
+        service->NewAxisMoveEvent(aIndex, AXIS_INDEX_RIGHT_STICK_Y, aValue);
+        break;
+      case 9:
+        FetchDpadFromAxis(aIndex, aValue);
+        break;
+      default:
+        NS_WARNING(
+            nsPrintfCString(
+                "Axis idx '%d' doesn't support in Dualshock4Remapper().", aAxis)
+                .get());
+        break;
+    }
+  }
+
+  virtual void RemapButtonEvent(uint32_t aIndex, uint32_t aButton,
+                                bool aPressed) const override {
+    RefPtr<GamepadPlatformService> service =
+        GamepadPlatformService::GetParentService();
+    if (!service) {
+      return;
+    }
+
+    const std::vector<uint32_t> buttonMapping = {
+      BUTTON_INDEX_TERTIARY,
+      BUTTON_INDEX_PRIMARY,
+      BUTTON_INDEX_SECONDARY,
+      BUTTON_INDEX_QUATERNARY,
+      BUTTON_INDEX_LEFT_SHOULDER,
+      BUTTON_INDEX_RIGHT_SHOULDER,
+      BUTTON_INDEX_LEFT_TRIGGER,
+      BUTTON_INDEX_RIGHT_TRIGGER,
+      BUTTON_INDEX_BACK_SELECT,
+      BUTTON_INDEX_START,
+      BUTTON_INDEX_LEFT_THUMBSTICK,
+      BUTTON_INDEX_RIGHT_THUMBSTICK,
+      BUTTON_INDEX_META,
+      DUALSHOCK_BUTTON_TOUCHPAD
+    };
+
+    if (buttonMapping.size() <= aIndex) {
+      NS_WARNING(
+            nsPrintfCString(
+                "Button idx '%d' doesn't support in Dualshock4Remapper().",
+                aButton)
+                .get());
+      return;
+    }
+
+    service->NewButtonEvent(aIndex, buttonMapping[aButton], aPressed);
+  }
+
+ private:
+  enum Dualshock4Buttons {
+    DUALSHOCK_BUTTON_TOUCHPAD = BUTTON_INDEX_COUNT,
+    DUALSHOCK_BUTTON_COUNT
+  };
+};
+
+already_AddRefed<GamepadRemapper> GetGamepadRemapper(const uint16_t aVendorId,
+                                                     const uint16_t aProductId) {
+  const std::vector<GamepadRemappingData> remappingRules = {
+      {GamepadId::kSonyDualshock4, new Dualshock4Remapper()},
+      {GamepadId::kSonyDualshock4Slim, new Dualshock4Remapper()},
+      {GamepadId::kSonyDualshock4USBReceiver, new Dualshock4Remapper()}
+  };
+  const GamepadId id = static_cast<GamepadId>((aVendorId << 16) | aProductId);
+
+  for (uint32_t i = 0; i < remappingRules.size(); ++i) {
+    if (id == remappingRules[i].id) {
+      return do_AddRef(remappingRules[i].remapping.get());
+    }
+  }
+
+  static RefPtr<GamepadRemapper> defaultRemapper = new DefaultRemapper();
+  return do_AddRef(defaultRemapper.get());
+}
+
+}  // namespace dom
+}  // namespace mozilla
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/dom/gamepad/GamepadRemapping.h
@@ -0,0 +1,52 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* 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/. */
+
+#ifndef mozilla_dom_GamepadRemapping_h_
+#define mozilla_dom_GamepadRemapping_h_
+
+namespace mozilla {
+namespace dom {
+
+// GamepadId is (vendorId << 16) | productId)
+enum class GamepadId : uint32_t {
+  kSonyDualshock4 = 0x054c05c4,
+  kSonyDualshock4Slim = 0x054c09cc,
+  kSonyDualshock4USBReceiver = 0x054c0ba0,
+};
+
+class GamepadRemapper {
+  NS_INLINE_DECL_THREADSAFE_REFCOUNTING(GamepadRemapper)
+
+ public:
+  virtual uint32_t GetAxisCount() const = 0;
+  virtual uint32_t GetButtonCount() const = 0;
+  virtual void SetAxisCount(uint32_t aButtonCount) {}
+  virtual void SetButtonCount(uint32_t aButtonCount) {}
+  virtual GamepadMappingType GetMappingType() const {
+    return GamepadMappingType::Standard;
+  }
+  virtual void RemapAxisMoveEvent(uint32_t aIndex, uint32_t aAxis,
+                                  double aValue) const = 0;
+  virtual void RemapButtonEvent(uint32_t aIndex, uint32_t aButton,
+                                bool aPressed) const = 0;
+  
+ protected:
+  GamepadRemapper() = default;
+  virtual ~GamepadRemapper() = default;
+};
+
+struct GamepadRemappingData {
+  GamepadId id;
+  RefPtr<GamepadRemapper> remapping;
+};
+
+already_AddRefed<GamepadRemapper> GetGamepadRemapper(const uint16_t aVendorId,
+                                                     const uint16_t aProductId);
+
+}  // namespace dom
+}  // namespace mozilla
+
+#endif
--- a/dom/gamepad/moz.build
+++ b/dom/gamepad/moz.build
@@ -17,16 +17,17 @@ EXPORTS.mozilla.dom += [
     'Gamepad.h',
     'GamepadButton.h',
     'GamepadHapticActuator.h',
     'GamepadManager.h',
     'GamepadMonitoring.h',
     'GamepadPlatformService.h',
     'GamepadPose.h',
     'GamepadPoseState.h',
+    'GamepadRemapping.h',
     'GamepadServiceTest.h',
     'ipc/GamepadEventChannelChild.h',
     'ipc/GamepadEventChannelParent.h',
     'ipc/GamepadMessageUtils.h',
     'ipc/GamepadServiceType.h',
     'ipc/GamepadTestChannelChild.h',
     'ipc/GamepadTestChannelParent.h'
 ]
@@ -34,16 +35,17 @@ EXPORTS.mozilla.dom += [
 UNIFIED_SOURCES = [
     'Gamepad.cpp',
     'GamepadButton.cpp',
     'GamepadHapticActuator.cpp',
     'GamepadManager.cpp',
     'GamepadMonitoring.cpp',
     'GamepadPlatformService.cpp',
     'GamepadPose.cpp',
+    'GamepadRemapping.cpp',
     'GamepadServiceTest.cpp',
     'ipc/GamepadEventChannelChild.cpp',
     'ipc/GamepadEventChannelParent.cpp',
     'ipc/GamepadTestChannelChild.cpp',
     'ipc/GamepadTestChannelParent.cpp'
 ]
 
 if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa':
--- a/dom/gamepad/windows/WindowsGamepad.cpp
+++ b/dom/gamepad/windows/WindowsGamepad.cpp
@@ -26,24 +26,26 @@
 #include "mozilla/dom/GamepadPlatformService.h"
 
 namespace {
 
 using namespace mozilla;
 using namespace mozilla::dom;
 using mozilla::ArrayLength;
 
+// USB HID usage tables, page 1, 0x30 = X
+const uint32_t kAxisMinimumUsageNumber = 0x30;
 // USB HID usage tables, page 1 (Hat switch)
-const unsigned kUsageDpad = 0x39;
-// USB HID usage tables, page 1, 0x30 = X
-const unsigned kFirstAxis = 0x30;
+const uint32_t kDpadMinimumUsageNumber = 0x39;
+const uint32_t kAxesLengthCap = 16;
 
 // USB HID usage tables
-const unsigned kDesktopUsagePage = 0x1;
-const unsigned kButtonUsagePage = 0x9;
+const uint32_t kDesktopUsagePage = 0x1;
+const uint32_t kGameControlsUsagePage = 0x5;
+const uint32_t kButtonUsagePage = 0x9;
 
 // Multiple devices-changed notifications can be sent when a device
 // is connected, because USB devices consist of multiple logical devices.
 // Therefore, we wait a bit after receiving one before looking for
 // device changes.
 const uint32_t kDevicesChangedStableDelay = 200;
 // Both DirectInput and XInput are polling-driven here,
 // so we need to poll it periodically.
@@ -109,35 +111,38 @@ class Gamepad {
 
   // ID from the GamepadService, also used as the index into
   // WindowsGamepadService::mGamepads.
   int id;
 
   // Information about the physical device.
   unsigned numAxes;
   unsigned numButtons;
-  bool hasDpad;
-  HIDP_VALUE_CAPS dpadCaps;
 
   nsTArray<bool> buttons;
   struct axisValue {
     HIDP_VALUE_CAPS caps;
     double value;
+    bool active;
+
+    axisValue() = default;
+    explicit axisValue(const HIDP_VALUE_CAPS& aCaps)
+        : caps(aCaps), value(0.0f), active(true) {}
   };
   nsTArray<axisValue> axes;
 
+  RefPtr<GamepadRemapper> remapper;
+
   // Used during rescan to find devices that were disconnected.
   bool present;
 
-  Gamepad(uint32_t aNumAxes, uint32_t aNumButtons, bool aHasDpad,
-          GamepadType aType)
+  Gamepad(uint32_t aNumAxes, uint32_t aNumButtons, GamepadType aType)
       : type(aType),
         numAxes(aNumAxes),
         numButtons(aNumButtons),
-        hasDpad(aHasDpad),
         present(true) {
     buttons.SetLength(numButtons);
     axes.SetLength(numAxes);
   }
 
  private:
   Gamepad() {}
 };
@@ -202,55 +207,16 @@ bool GetPreparsedData(HANDLE handle, nsT
  * Given an axis value and a minimum and maximum range,
  * scale it to be in the range -1.0 .. 1.0.
  */
 double ScaleAxis(ULONG value, LONG min, LONG max) {
   return 2.0 * (value - min) / (max - min) - 1.0;
 }
 
 /*
- * Given a value from a d-pad (POV hat in USB HID terminology),
- * represent it as 4 buttons, one for each cardinal direction.
- */
-void UnpackDpad(LONG dpad_value, const Gamepad* gamepad,
-                nsTArray<bool>& buttons) {
-  const unsigned kUp = gamepad->numButtons - 4;
-  const unsigned kDown = gamepad->numButtons - 3;
-  const unsigned kLeft = gamepad->numButtons - 2;
-  const unsigned kRight = gamepad->numButtons - 1;
-
-  // Different controllers have different ways of representing
-  // "nothing is pressed", but they're all outside the range of values.
-  if (dpad_value < gamepad->dpadCaps.LogicalMin ||
-      dpad_value > gamepad->dpadCaps.LogicalMax) {
-    // Nothing is pressed.
-    return;
-  }
-
-  // Normalize value to start at 0.
-  int value = dpad_value - gamepad->dpadCaps.LogicalMin;
-
-  // Value will be in the range 0-7. The value represents the
-  // position of the d-pad around a circle, with 0 being straight up,
-  // 2 being right, 4 being straight down, and 6 being left.
-  if ((value < 2 || value > 6) && buttons.Length() > kUp) {
-    buttons[kUp] = true;
-  }
-  if ((value > 2 && value < 6) && buttons.Length() > kDown) {
-    buttons[kDown] = true;
-  }
-  if (value > 4 && buttons.Length() > kLeft) {
-    buttons[kLeft] = true;
-  }
-  if ((value > 0 && value < 4) && buttons.Length() > kRight) {
-    buttons[kRight] = true;
-  }
-}
-
-/*
  * Return true if this USB HID usage page and usage are of a type we
  * know how to handle.
  */
 bool SupportedUsage(USHORT page, USHORT usage) {
   for (unsigned i = 0; i < ArrayLength(kUsagePages); i++) {
     if (page == kUsagePages[i].usagePage && usage == kUsagePages[i].usage) {
       return true;
     }
@@ -460,18 +426,17 @@ bool WindowsGamepadService::ScanForXInpu
     }
     found = true;
     // See if this device is already present in our list.
     if (HaveXInputGamepad(i)) {
       continue;
     }
 
     // Not already present, add it.
-    Gamepad gamepad(kStandardGamepadAxes, kStandardGamepadButtons, true,
-                    kXInputGamepad);
+    Gamepad gamepad(kStandardGamepadAxes, kStandardGamepadButtons, kXInputGamepad);
     gamepad.userIndex = i;
     gamepad.state = state;
     gamepad.id = service->AddGamepad(
         "xinput", GamepadMappingType::Standard, GamepadHand::_empty,
         kStandardGamepadButtons, kStandardGamepadAxes,
         0);  // TODO: Bug 680289, implement gamepad haptics for Windows.
     mGamepads.AppendElement(gamepad);
   }
@@ -582,28 +547,33 @@ void WindowsGamepadService::CheckXInputC
                               -1.0 * state.Gamepad.sThumbRY / 32767.0);
   }
   gamepad.state = state;
 }
 
 // Used to sort a list of axes by HID usage.
 class HidValueComparator {
  public:
-  bool Equals(const HIDP_VALUE_CAPS& c1, const HIDP_VALUE_CAPS& c2) const {
-    return c1.UsagePage == c2.UsagePage &&
-           c1.Range.UsageMin == c2.Range.UsageMin;
+  bool Equals(const Gamepad::axisValue& c1,
+              const Gamepad::axisValue& c2) const {
+    return c1.caps.UsagePage == c2.caps.UsagePage &&
+           c1.caps.Range.UsageMin == c2.caps.Range.UsageMin;
   }
-  bool LessThan(const HIDP_VALUE_CAPS& c1, const HIDP_VALUE_CAPS& c2) const {
-    if (c1.UsagePage == c2.UsagePage) {
-      return c1.Range.UsageMin < c2.Range.UsageMin;
+  bool LessThan(const Gamepad::axisValue& c1,
+                const Gamepad::axisValue& c2) const {
+    if (c1.caps.UsagePage == c2.caps.UsagePage) {
+      return c1.caps.Range.UsageMin < c2.caps.Range.UsageMin;
     }
-    return c1.UsagePage < c2.UsagePage;
+    return c1.caps.UsagePage < c2.caps.UsagePage;
   }
 };
 
+// GetRawGamepad() processes its raw data from HID and
+// then trying to remapping buttons and axes based on
+// the mapping rules that are defined for different gamepad products.
 bool WindowsGamepadService::GetRawGamepad(HANDLE handle) {
   RefPtr<GamepadPlatformService> service =
       GamepadPlatformService::GetParentService();
   if (!service) {
     return true;
   }
 
   if (!mHID) {
@@ -652,17 +622,17 @@ bool WindowsGamepadService::GetRawGamepa
   // Product string is a human-readable name.
   // Per
   // http://msdn.microsoft.com/en-us/library/windows/hardware/ff539681%28v=vs.85%29.aspx
   // "For USB devices, the maximum string length is 126 wide characters (not
   // including the terminating NULL character)."
   wchar_t name[128] = {0};
   size = sizeof(name);
   nsTArray<char> gamepad_name;
-  HANDLE hid_handle = CreateFile(
+  const HANDLE hid_handle = CreateFile(
       devname.Elements(), GENERIC_READ | GENERIC_WRITE,
       FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
   if (hid_handle) {
     if (mHID.mHidD_GetProductString(hid_handle, &name, size)) {
       int bytes = WideCharToMultiByte(CP_UTF8, 0, name, -1, nullptr, 0, nullptr,
                                       nullptr);
       gamepad_name.SetLength(bytes);
       WideCharToMultiByte(CP_UTF8, 0, name, -1, gamepad_name.Elements(), bytes,
@@ -704,59 +674,58 @@ bool WindowsGamepadService::GetRawGamepa
   for (unsigned i = 0; i < count; i++) {
     // Each buttonCaps is typically a range of buttons.
     numButtons +=
         buttonCaps[i].Range.UsageMax - buttonCaps[i].Range.UsageMin + 1;
   }
 
   // Enumerate value caps, which represent axes and d-pads.
   count = caps.NumberInputValueCaps;
-  nsTArray<HIDP_VALUE_CAPS> valueCaps(count);
-  valueCaps.SetLength(count);
-  if (mHID.mHidP_GetValueCaps(HidP_Input, valueCaps.Elements(), &count,
+  nsTArray<HIDP_VALUE_CAPS> axisCaps(count);
+  axisCaps.SetLength(count);
+  if (mHID.mHidP_GetValueCaps(HidP_Input, axisCaps.Elements(), &count,
                               parsed) != HIDP_STATUS_SUCCESS) {
     return false;
   }
-  nsTArray<HIDP_VALUE_CAPS> axes;
-  // Sort the axes by usagePage and usage to expose a consistent ordering.
-  bool hasDpad;
-  HIDP_VALUE_CAPS dpadCaps;
+
+  size_t numAxes = 0;
+  nsTArray<Gamepad::axisValue> axes(kAxesLengthCap);
+  // We store these value caps and handle the dpad info in GamepadRemapper later.
+  axes.SetLength(kAxesLengthCap);
 
-  HidValueComparator comparator;
-  for (unsigned i = 0; i < count; i++) {
-    if (valueCaps[i].UsagePage == kDesktopUsagePage &&
-        valueCaps[i].Range.UsageMin == kUsageDpad
-        // Don't know how to handle d-pads that return weird values.
-        && valueCaps[i].LogicalMax - valueCaps[i].LogicalMin == 7) {
-      // d-pad gets special handling.
-      // Ostensibly HID devices can expose multiple d-pads, but this
-      // doesn't happen in practice.
-      hasDpad = true;
-      dpadCaps = valueCaps[i];
-      // Expose d-pad as 4 additional buttons.
-      numButtons += 4;
-    } else {
-      axes.InsertElementSorted(valueCaps[i], comparator);
+  // Looking for the exisiting ramapping rule.
+  RefPtr<GamepadRemapper> remapper =
+      GetGamepadRemapper(rdi.hid.dwVendorId, rdi.hid.dwProductId);
+  MOZ_ASSERT(remapper);
+
+  for (size_t i = 0; i < count; i++) {
+    const size_t axisIndex = axisCaps[i].Range.UsageMin - kAxisMinimumUsageNumber;
+    if (axisIndex < kAxesLengthCap && !axes[axisIndex].active) {
+      axes[axisIndex].caps = axisCaps[i];
+      axes[axisIndex].active = true;
+      numAxes = std::max(numAxes, axisIndex + 1);
     }
   }
 
-  uint32_t numAxes = axes.Length();
+  // Not already present, add it.
 
-  // Not already present, add it.
-  Gamepad gamepad(numAxes, numButtons, true, kRawInputGamepad);
-
+  remapper->SetAxisCount(numAxes);
+  remapper->SetButtonCount(numButtons);
+  Gamepad gamepad(numAxes, numButtons, kRawInputGamepad);
   gamepad.handle = handle;
 
   for (unsigned i = 0; i < gamepad.numAxes; i++) {
-    gamepad.axes[i].caps = axes[i];
+    gamepad.axes[i] = axes[i];
   }
 
-  gamepad.id = service->AddGamepad(gamepad_id, GamepadMappingType::_empty,
-                                   GamepadHand::_empty, gamepad.numButtons,
-                                   gamepad.numAxes, 0);
+  gamepad.remapper = remapper.forget();
+  gamepad.id =
+      service->AddGamepad(gamepad_id, gamepad.remapper->GetMappingType(),
+                          GamepadHand::_empty, gamepad.remapper->GetButtonCount(),
+                          gamepad.remapper->GetAxisCount(), 0);
   mGamepads.AppendElement(gamepad);
   return true;
 }
 
 bool WindowsGamepadService::HandleRawInput(HRAWINPUT handle) {
   if (!mHID) {
     return false;
   }
@@ -820,31 +789,19 @@ bool WindowsGamepadService::HandleRawInp
     //
     // Usage ID of 0 is reserved, so it should always be 1 or higher.
     if (NS_WARN_IF((usages[i] - 1u) >= buttons.Length())) {
       continue;
     }
     buttons[usages[i] - 1u] = true;
   }
 
-  if (gamepad->hasDpad) {
-    // Get d-pad position as 4 buttons.
-    ULONG value;
-    if (mHID.mHidP_GetUsageValue(HidP_Input, gamepad->dpadCaps.UsagePage, 0,
-                                 gamepad->dpadCaps.Range.UsageMin, &value,
-                                 parsed, (PCHAR)raw->data.hid.bRawData,
-                                 raw->data.hid.dwSizeHid) ==
-        HIDP_STATUS_SUCCESS) {
-      UnpackDpad(static_cast<LONG>(value), gamepad, buttons);
-    }
-  }
-
   for (unsigned i = 0; i < gamepad->numButtons; i++) {
     if (gamepad->buttons[i] != buttons[i]) {
-      service->NewButtonEvent(gamepad->id, i, buttons[i]);
+      gamepad->remapper->RemapButtonEvent(gamepad->id, i, buttons[i]);
       gamepad->buttons[i] = buttons[i];
     }
   }
 
   // Get all axis values.
   for (unsigned i = 0; i < gamepad->numAxes; i++) {
     double new_value;
     if (gamepad->axes[i].caps.LogicalMin < 0) {
@@ -867,17 +824,17 @@ bool WindowsGamepadService::HandleRawInp
               raw->data.hid.dwSizeHid) != HIDP_STATUS_SUCCESS) {
         continue;
       }
 
       new_value = ScaleAxis(value, gamepad->axes[i].caps.LogicalMin,
                             gamepad->axes[i].caps.LogicalMax);
     }
     if (gamepad->axes[i].value != new_value) {
-      service->NewAxisMoveEvent(gamepad->id, i, new_value);
+      gamepad->remapper->RemapAxisMoveEvent(gamepad->id, i, new_value);
       gamepad->axes[i].value = new_value;
     }
   }
 
   return true;
 }
 
 void WindowsGamepadService::Startup() { ScanForDevices(); }
--- a/dom/ipc/TabParent.cpp
+++ b/dom/ipc/TabParent.cpp
@@ -3286,96 +3286,99 @@ class FakeChannel final : public nsIChan
                           public nsILoadContext {
  public:
   FakeChannel(const nsCString& aUri, uint64_t aCallbackId, Element* aElement)
       : mCallbackId(aCallbackId), mElement(aElement) {
     NS_NewURI(getter_AddRefs(mUri), aUri);
   }
 
   NS_DECL_ISUPPORTS
+
 #define NO_IMPL \
   override { return NS_ERROR_NOT_IMPLEMENTED; }
-  NS_IMETHOD GetName(nsACString&) NO_IMPL NS_IMETHOD
-      IsPending(bool*) NO_IMPL NS_IMETHOD
-      GetStatus(nsresult*) NO_IMPL NS_IMETHOD
-      Cancel(nsresult) NO_IMPL NS_IMETHOD Suspend() NO_IMPL NS_IMETHOD
-      Resume() NO_IMPL NS_IMETHOD
-      GetLoadGroup(nsILoadGroup**) NO_IMPL NS_IMETHOD
-      SetLoadGroup(nsILoadGroup*) NO_IMPL NS_IMETHOD
-      SetLoadFlags(nsLoadFlags) NO_IMPL NS_IMETHOD
-      GetLoadFlags(nsLoadFlags*) NO_IMPL NS_IMETHOD
-      GetIsDocument(bool*) NO_IMPL NS_IMETHOD
-      GetOriginalURI(nsIURI**) NO_IMPL NS_IMETHOD
-      SetOriginalURI(nsIURI*) NO_IMPL NS_IMETHOD
-      GetURI(nsIURI** aUri) override {
+  NS_IMETHOD GetName(nsACString&) NO_IMPL;
+  NS_IMETHOD IsPending(bool*) NO_IMPL;
+  NS_IMETHOD GetStatus(nsresult*) NO_IMPL;
+  NS_IMETHOD Cancel(nsresult) NO_IMPL;
+  NS_IMETHOD Suspend() NO_IMPL;
+  NS_IMETHOD Resume() NO_IMPL;
+  NS_IMETHOD GetLoadGroup(nsILoadGroup**) NO_IMPL;
+  NS_IMETHOD SetLoadGroup(nsILoadGroup*) NO_IMPL;
+  NS_IMETHOD SetLoadFlags(nsLoadFlags) NO_IMPL;
+  NS_IMETHOD GetLoadFlags(nsLoadFlags*) NO_IMPL;
+  NS_IMETHOD GetIsDocument(bool*) NO_IMPL;
+  NS_IMETHOD GetOriginalURI(nsIURI**) NO_IMPL;
+  NS_IMETHOD SetOriginalURI(nsIURI*) NO_IMPL;
+  NS_IMETHOD GetURI(nsIURI** aUri) override {
     nsCOMPtr<nsIURI> copy = mUri;
     copy.forget(aUri);
     return NS_OK;
   }
-  NS_IMETHOD GetOwner(nsISupports**) NO_IMPL NS_IMETHOD
-      SetOwner(nsISupports*) NO_IMPL NS_IMETHOD
-      GetLoadInfo(nsILoadInfo** aLoadInfo) override {
+  NS_IMETHOD GetOwner(nsISupports**) NO_IMPL;
+  NS_IMETHOD SetOwner(nsISupports*) NO_IMPL;
+  NS_IMETHOD GetLoadInfo(nsILoadInfo** aLoadInfo) override {
     nsCOMPtr<nsILoadInfo> copy = mLoadInfo;
     copy.forget(aLoadInfo);
     return NS_OK;
   }
   NS_IMETHOD SetLoadInfo(nsILoadInfo* aLoadInfo) override {
     mLoadInfo = aLoadInfo;
     return NS_OK;
   }
   NS_IMETHOD GetNotificationCallbacks(
       nsIInterfaceRequestor** aRequestor) override {
     NS_ADDREF(*aRequestor = this);
     return NS_OK;
   }
-  NS_IMETHOD SetNotificationCallbacks(nsIInterfaceRequestor*) NO_IMPL NS_IMETHOD
-      GetSecurityInfo(nsISupports**) NO_IMPL NS_IMETHOD
-      GetContentType(nsACString&) NO_IMPL NS_IMETHOD
-      SetContentType(const nsACString&) NO_IMPL NS_IMETHOD
-      GetContentCharset(nsACString&) NO_IMPL NS_IMETHOD
-      SetContentCharset(const nsACString&) NO_IMPL NS_IMETHOD
-      GetContentLength(int64_t*) NO_IMPL NS_IMETHOD
-      SetContentLength(int64_t) NO_IMPL NS_IMETHOD
-      Open(nsIInputStream**) NO_IMPL NS_IMETHOD
-      AsyncOpen(nsIStreamListener*) NO_IMPL NS_IMETHOD
-      GetContentDisposition(uint32_t*) NO_IMPL NS_IMETHOD
-      SetContentDisposition(uint32_t) NO_IMPL NS_IMETHOD
-      GetContentDispositionFilename(nsAString&) NO_IMPL NS_IMETHOD
-      SetContentDispositionFilename(const nsAString&) NO_IMPL NS_IMETHOD
-      GetContentDispositionHeader(nsACString&) NO_IMPL NS_IMETHOD
-      OnAuthAvailable(nsISupports* aContext,
-                      nsIAuthInformation* aAuthInfo) override;
+  NS_IMETHOD SetNotificationCallbacks(nsIInterfaceRequestor*) NO_IMPL;
+  NS_IMETHOD GetSecurityInfo(nsISupports**) NO_IMPL;
+  NS_IMETHOD GetContentType(nsACString&) NO_IMPL;
+  NS_IMETHOD SetContentType(const nsACString&) NO_IMPL;
+  NS_IMETHOD GetContentCharset(nsACString&) NO_IMPL;
+  NS_IMETHOD SetContentCharset(const nsACString&) NO_IMPL;
+  NS_IMETHOD GetContentLength(int64_t*) NO_IMPL;
+  NS_IMETHOD SetContentLength(int64_t) NO_IMPL;
+  NS_IMETHOD Open(nsIInputStream**) NO_IMPL;
+  NS_IMETHOD AsyncOpen(nsIStreamListener*) NO_IMPL;
+  NS_IMETHOD GetContentDisposition(uint32_t*) NO_IMPL;
+  NS_IMETHOD SetContentDisposition(uint32_t) NO_IMPL;
+  NS_IMETHOD GetContentDispositionFilename(nsAString&) NO_IMPL;
+  NS_IMETHOD SetContentDispositionFilename(const nsAString&) NO_IMPL;
+  NS_IMETHOD GetContentDispositionHeader(nsACString&) NO_IMPL;
+  NS_IMETHOD OnAuthAvailable(nsISupports* aContext,
+                             nsIAuthInformation* aAuthInfo) override;
   NS_IMETHOD OnAuthCancelled(nsISupports* aContext, bool userCancel) override;
   NS_IMETHOD GetInterface(const nsIID& uuid, void** result) override {
     return QueryInterface(uuid, result);
   }
-  NS_IMETHOD GetAssociatedWindow(mozIDOMWindowProxy**) NO_IMPL NS_IMETHOD
-      GetTopWindow(mozIDOMWindowProxy**) NO_IMPL NS_IMETHOD
-      GetTopFrameElement(Element** aElement) override {
+  NS_IMETHOD GetAssociatedWindow(mozIDOMWindowProxy**) NO_IMPL;
+  NS_IMETHOD GetTopWindow(mozIDOMWindowProxy**) NO_IMPL;
+  NS_IMETHOD GetTopFrameElement(Element** aElement) override {
     nsCOMPtr<Element> elem = mElement;
     elem.forget(aElement);
     return NS_OK;
   }
-  NS_IMETHOD GetNestedFrameId(uint64_t*) NO_IMPL NS_IMETHOD
-      GetIsContent(bool*) NO_IMPL NS_IMETHOD
-      GetUsePrivateBrowsing(bool*) NO_IMPL NS_IMETHOD
-      SetUsePrivateBrowsing(bool) NO_IMPL NS_IMETHOD
-      SetPrivateBrowsing(bool) NO_IMPL NS_IMETHOD
-      GetIsInIsolatedMozBrowserElement(bool*) NO_IMPL NS_IMETHOD
-      GetScriptableOriginAttributes(JSContext*, JS::MutableHandleValue) NO_IMPL
-      NS_IMETHOD_(void)
-          GetOriginAttributes(mozilla::OriginAttributes& aAttrs) override {}
-  NS_IMETHOD GetUseRemoteTabs(bool*) NO_IMPL NS_IMETHOD
-      SetRemoteTabs(bool) NO_IMPL NS_IMETHOD
-      GetUseTrackingProtection(bool*) NO_IMPL NS_IMETHOD
-      SetUseTrackingProtection(bool) NO_IMPL
+  NS_IMETHOD GetNestedFrameId(uint64_t*) NO_IMPL;
+  NS_IMETHOD GetIsContent(bool*) NO_IMPL;
+  NS_IMETHOD GetUsePrivateBrowsing(bool*) NO_IMPL;
+  NS_IMETHOD SetUsePrivateBrowsing(bool) NO_IMPL;
+  NS_IMETHOD SetPrivateBrowsing(bool) NO_IMPL;
+  NS_IMETHOD GetIsInIsolatedMozBrowserElement(bool*) NO_IMPL;
+  NS_IMETHOD GetScriptableOriginAttributes(JSContext*,
+                                           JS::MutableHandleValue) NO_IMPL;
+  NS_IMETHOD_(void)
+  GetOriginAttributes(mozilla::OriginAttributes& aAttrs) override {}
+  NS_IMETHOD GetUseRemoteTabs(bool*) NO_IMPL;
+  NS_IMETHOD SetRemoteTabs(bool) NO_IMPL;
+  NS_IMETHOD GetUseTrackingProtection(bool*) NO_IMPL;
+  NS_IMETHOD SetUseTrackingProtection(bool) NO_IMPL;
 #undef NO_IMPL
 
-      protected : ~FakeChannel() {
-  }
+ protected:
+  ~FakeChannel() {}
 
   nsCOMPtr<nsIURI> mUri;
   uint64_t mCallbackId;
   nsCOMPtr<Element> mElement;
   nsCOMPtr<nsILoadInfo> mLoadInfo;
 };
 
 NS_IMPL_ISUPPORTS(FakeChannel, nsIChannel, nsIAuthPromptCallback, nsIRequest,
--- a/dom/media/gtest/moz.build
+++ b/dom/media/gtest/moz.build
@@ -19,49 +19,53 @@ UNIFIED_SOURCES += [
     'TestAudioCompactor.cpp',
     'TestAudioMixer.cpp',
     'TestAudioPacketizer.cpp',
     'TestAudioSegment.cpp',
     'TestAudioTrackEncoder.cpp',
     'TestBitWriter.cpp',
     'TestBlankVideoDataCreator.cpp',
     'TestBufferReader.cpp',
-    'TestCDMStorage.cpp',
     'TestDataMutex.cpp',
     'TestDriftCompensation.cpp',
-    'TestGMPCrossOrigin.cpp',
-    'TestGMPRemoveAndDelete.cpp',
     'TestGMPUtils.cpp',
     'TestGroupId.cpp',
     'TestIntervalSet.cpp',
-    'TestMediaDataDecoder.cpp',
-    'TestMediaDataEncoder.cpp',
     'TestMediaEventSource.cpp',
     'TestMediaMIMETypes.cpp',
-    'TestMP3Demuxer.cpp',
-    'TestMP4Demuxer.cpp',
     'TestOpusParser.cpp',
     'TestRust.cpp',
     'TestVideoSegment.cpp',
     'TestVideoUtils.cpp',
-    'TestVPXDecoding.cpp',
-    'TestWebMBuffered.cpp',
 ]
 
 if CONFIG['MOZ_WEBM_ENCODER']:
     UNIFIED_SOURCES += [
         'TestVideoTrackEncoder.cpp',
         'TestWebMWriter.cpp',
         'YUVBufferGenerator.cpp',
     ]
     LOCAL_INCLUDES += [
         '/gfx/2d/',
     ]
 
-if CONFIG['MOZ_WEBRTC']:
+if CONFIG['OS_TARGET'] != 'Android':
+    UNIFIED_SOURCES += [
+        'TestCDMStorage.cpp',
+        'TestGMPCrossOrigin.cpp',
+        'TestGMPRemoveAndDelete.cpp',
+        'TestMediaDataDecoder.cpp',
+        'TestMediaDataEncoder.cpp',
+        'TestMP3Demuxer.cpp',
+        'TestMP4Demuxer.cpp',
+        'TestVPXDecoding.cpp',
+        'TestWebMBuffered.cpp',
+    ]
+
+if CONFIG['MOZ_WEBRTC'] and CONFIG['OS_TARGET'] != 'Android':
     UNIFIED_SOURCES += [
         'TestAudioDeviceEnumerator.cpp',
         'TestVideoFrameConverter.cpp',
     ]
 
 TEST_HARNESS_FILES.gtest += [
     '../test/gizmo-frag.mp4',
     '../test/gizmo.mp4',
--- a/dom/media/gtest/mp4_demuxer/moz.build
+++ b/dom/media/gtest/mp4_demuxer/moz.build
@@ -1,20 +1,21 @@
 # -*- 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/.
 
 Library('mp4_demuxer_gtest')
 
-SOURCES += [
-    'TestInterval.cpp',
-    'TestParser.cpp',
-]
+if CONFIG['OS_TARGET'] != 'Android':
+    SOURCES += [
+        'TestInterval.cpp',
+        'TestParser.cpp',
+    ]
 
 TEST_HARNESS_FILES.gtest += [
     'test_case_1156505.mp4',
     'test_case_1181213.mp4',
     'test_case_1181215.mp4',
     'test_case_1181220.mp4',
     'test_case_1181223.mp4',
     'test_case_1181719.mp4',
@@ -43,17 +44,19 @@ TEST_HARNESS_FILES.gtest += [
     'test_case_1395244.mp4',
     'test_case_1410565.mp4',
     'test_case_1513651-2-sample-description-entries.mp4',
     'test_case_1519617-cenc-init-with-track_id-0.mp4',
     'test_case_1519617-track2-trafs-removed.mp4',
     'test_case_1519617-video-has-track_id-0.mp4',
 ]
 
-UNIFIED_SOURCES += ['TestMP4.cpp',]
+if CONFIG['OS_TARGET'] != 'Android':
+    UNIFIED_SOURCES += ['TestMP4.cpp',]
+
 TEST_HARNESS_FILES.gtest += [
     '../../test/street.mp4',
 ]
 LOCAL_INCLUDES += [
     '../../mp4',
     '/toolkit/components/telemetry/tests/gtest',
 ]
 
--- a/gfx/layers/apz/public/APZUpdater.h
+++ b/gfx/layers/apz/public/APZUpdater.h
@@ -154,16 +154,17 @@ class APZUpdater {
   bool UsingWebRenderUpdaterThread() const;
   static already_AddRefed<APZUpdater> GetUpdater(
       const wr::WrWindowId& aWindowId);
 
   void ProcessQueue();
 
  private:
   RefPtr<APZCTreeManager> mApz;
+  bool mDestroyed;
   bool mIsUsingWebRender;
 
   // Map from WRRoot id to WebRenderScrollData. This can only be touched on
   // the updater thread.
   std::unordered_map<WRRootId, WebRenderScrollData, WRRootId::HashFn>
       mScrollData;
 
   // Stores epoch state for a particular WRRoot id. This structure is only
--- a/gfx/layers/apz/src/APZUpdater.cpp
+++ b/gfx/layers/apz/src/APZUpdater.cpp
@@ -21,16 +21,17 @@ namespace layers {
 
 StaticMutex APZUpdater::sWindowIdLock;
 StaticAutoPtr<std::unordered_map<uint64_t, APZUpdater*>>
     APZUpdater::sWindowIdMap;
 
 APZUpdater::APZUpdater(const RefPtr<APZCTreeManager>& aApz,
                        bool aIsUsingWebRender)
     : mApz(aApz),
+      mDestroyed(false),
       mIsUsingWebRender(aIsUsingWebRender),
       mThreadIdLock("APZUpdater::ThreadIdLock"),
       mQueueLock("APZUpdater::QueueLock") {
   MOZ_ASSERT(aApz);
   mApz->SetUpdater(this);
 }
 
 APZUpdater::~APZUpdater() {
@@ -132,16 +133,17 @@ void APZUpdater::ProcessPendingTasks(con
 
 void APZUpdater::ClearTree(LayersId aRootLayersId) {
   MOZ_ASSERT(CompositorThreadHolder::IsInCompositorThread());
   RefPtr<APZUpdater> self = this;
   RunOnUpdaterThread(
       UpdaterQueueSelector(aRootLayersId, wr::RenderRoot::Default),
       NS_NewRunnableFunction("APZUpdater::ClearTree", [=]() {
         self->mApz->ClearTree();
+        self->mDestroyed = true;
 
         // Once ClearTree is called on the APZCTreeManager, we
         // are in a shutdown phase. After this point it's ok if
         // WebRender cannot get a hold of the updater via the
         // window id, and it's a good point to remove the mapping
         // and avoid leaving a dangling pointer to this object.
         StaticMutexAutoLock lock(sWindowIdLock);
         if (self->mWindowId) {
@@ -471,16 +473,18 @@ already_AddRefed<APZUpdater> APZUpdater:
     if (it != sWindowIdMap->end()) {
       updater = it->second;
     }
   }
   return updater.forget();
 }
 
 void APZUpdater::ProcessQueue() {
+  MOZ_ASSERT(!mDestroyed);
+
   {  // scope lock to check for emptiness
     MutexAutoLock lock(mQueueLock);
     if (mUpdaterQueue.empty()) {
       return;
     }
   }
 
   std::deque<QueuedTask> blockedTasks;
@@ -519,16 +523,33 @@ void APZUpdater::ProcessQueue() {
       // If this task is blocked, put it into the blockedTasks queue that
       // we will replace mUpdaterQueue with
       blockedTasks.push_back(task);
     } else {
       // Run and discard the task
       task.mRunnable->Run();
     }
   }
+
+  if (mDestroyed) {
+    // If we get here, then we must have just run the ClearTree task for
+    // this updater. There might be tasks in the queue from content subtrees
+    // of this window that are blocked due to stale epochs. This can happen
+    // if the tasks were queued after the root pipeline was removed in
+    // WebRender, which prevents scene builds (and therefore prevents us
+    // from getting updated epochs via CompleteSceneSwap). See bug 1465658
+    // comment 43 for some more context.
+    // To avoid leaking these tasks, we discard the contents of the queue.
+    // This happens during window shutdown so if we don't run the tasks it's
+    // not going to matter much.
+    MutexAutoLock lock(mQueueLock);
+    if (!mUpdaterQueue.empty()) {
+      mUpdaterQueue.clear();
+    }
+  }
 }
 
 APZUpdater::EpochState::EpochState() : mRequired{0}, mIsRoot(false) {}
 
 bool APZUpdater::EpochState::IsBlocked() const {
   // The root is a special case because we basically assume it is "visible"
   // even before it is built for the first time. This is because building the
   // scene automatically makes it visible, and we need to make sure the APZ
--- a/gfx/layers/apz/test/gtest/moz.build
+++ b/gfx/layers/apz/test/gtest/moz.build
@@ -1,27 +1,31 @@
 # -*- 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/.
 
 UNIFIED_SOURCES += [
-    'TestBasic.cpp',
     'TestEventRegions.cpp',
-    'TestGestureDetector.cpp',
     'TestHitTesting.cpp',
     'TestInputQueue.cpp',
     'TestPanning.cpp',
-    'TestPinching.cpp',
-    'TestScrollHandoff.cpp',
     'TestSnapping.cpp',
     'TestTreeManager.cpp',
 ]
 
+if CONFIG['OS_TARGET'] != 'Android':
+    UNIFIED_SOURCES += [
+        'TestBasic.cpp',
+        'TestGestureDetector.cpp',
+        'TestPinching.cpp',
+        'TestScrollHandoff.cpp',
+    ]
+
 include('/ipc/chromium/chromium-config.mozbuild')
 
 LOCAL_INCLUDES += [
     '/gfx/2d',
     '/gfx/layers',
     '/gfx/tests/gtest'  # for TestLayers.h, which is shared with the gfx gtests
 ]
 
--- a/gfx/layers/wr/WebRenderCommandBuilder.cpp
+++ b/gfx/layers/wr/WebRenderCommandBuilder.cpp
@@ -1078,37 +1078,39 @@ class WebRenderGroupData : public WebRen
   virtual UserDataType GetType() override { return UserDataType::eGroup; }
   static UserDataType Type() { return UserDataType::eGroup; }
 
   DIGroup mSubGroup;
   DIGroup mFollowingGroup;
 };
 
 static bool IsItemProbablyActive(nsDisplayItem* aItem,
-                                 nsDisplayListBuilder* aDisplayListBuilder);
+                                 nsDisplayListBuilder* aDisplayListBuilder,
+                                 bool aParentActive = true);
 
 static bool HasActiveChildren(const nsDisplayList& aList,
                               nsDisplayListBuilder* aDisplayListBuilder) {
   for (nsDisplayItem* i = aList.GetBottom(); i; i = i->GetAbove()) {
-    if (IsItemProbablyActive(i, aDisplayListBuilder)) {
+    if (IsItemProbablyActive(i, aDisplayListBuilder, false)) {
       return true;
     }
   }
   return false;
 }
 
 // This function decides whether we want to treat this item as "active", which
 // means that it's a container item which we will turn into a WebRender
 // StackingContext, or whether we treat it as "inactive" and include it inside
 // the parent blob image.
 //
 // We can't easily use GetLayerState because it wants a bunch of layers related
 // information.
 static bool IsItemProbablyActive(nsDisplayItem* aItem,
-                                 nsDisplayListBuilder* aDisplayListBuilder) {
+                                 nsDisplayListBuilder* aDisplayListBuilder,
+                                 bool aParentActive) {
   switch (aItem->GetType()) {
     case DisplayItemType::TYPE_TRANSFORM: {
       nsDisplayTransform* transformItem =
           static_cast<nsDisplayTransform*>(aItem);
       const Matrix4x4Flagged& t = transformItem->GetTransform();
       Matrix t2d;
       bool is2D = t.Is2D(&t2d);
       GP("active: %d\n", transformItem->MayBeAnimated(aDisplayListBuilder));
@@ -1123,16 +1125,23 @@ static bool IsItemProbablyActive(nsDispl
                                                   opacityItem->Frame(), false);
       GP("active: %d\n", active);
       return active || HasActiveChildren(*opacityItem->GetChildren(),
                                          aDisplayListBuilder);
     }
     case DisplayItemType::TYPE_FOREIGN_OBJECT: {
       return true;
     }
+    case DisplayItemType::TYPE_BLEND_MODE: {
+      /* BLEND_MODE needs to be active if it might have a previous sibling
+       * that is active. We use the activeness of the parent as a rough
+       * proxy for this situation. */
+      return aParentActive || HasActiveChildren(*aItem->GetChildren(),
+                                                aDisplayListBuilder);
+    }
     case DisplayItemType::TYPE_WRAP_LIST:
     case DisplayItemType::TYPE_PERSPECTIVE: {
       if (aItem->GetChildren()) {
         return HasActiveChildren(*aItem->GetChildren(), aDisplayListBuilder);
       }
       return false;
     }
     case DisplayItemType::TYPE_FILTER: {
--- a/gfx/tests/gtest/moz.build
+++ b/gfx/tests/gtest/moz.build
@@ -8,34 +8,38 @@ UNIFIED_SOURCES += [
     'gfxSurfaceRefCountTest.cpp',
     'MockWidget.cpp',
     'PolygonTestUtils.cpp',
     'TestArena.cpp',
     'TestArrayView.cpp',
     'TestBSPTree.cpp',
     'TestBufferRotation.cpp',
     'TestColorNames.cpp',
-    'TestCompositor.cpp',
-    'TestGfxPrefs.cpp',
     'TestGfxWidgets.cpp',
     'TestJobScheduler.cpp',
     'TestLayers.cpp',
     'TestMoz2D.cpp',
     'TestPolygon.cpp',
     'TestQcms.cpp',
-    'TestRect.cpp',
     'TestRegion.cpp',
     'TestSkipChars.cpp',
     'TestSwizzle.cpp',
-    'TestTextureCompatibility.cpp',
     'TestTextures.cpp',
     'TestTreeTraversal.cpp',
     'TestVsync.cpp',
 ]
 
+if CONFIG['OS_TARGET'] != 'Android':
+    UNIFIED_SOURCES += [
+        'TestCompositor.cpp',
+        'TestGfxPrefs.cpp',
+        'TestRect.cpp',
+        'TestTextureCompatibility.cpp',
+    ]
+
 UNIFIED_SOURCES += [ '/gfx/2d/unittest/%s' % p for p in [
     'TestBase.cpp',
     'TestBugs.cpp',
     'TestCairo.cpp',
     'TestPoint.cpp',
     'TestScaling.cpp',
 ]]
 
--- a/gfx/wr/webrender/src/display_list_flattener.rs
+++ b/gfx/wr/webrender/src/display_list_flattener.rs
@@ -1338,17 +1338,17 @@ impl<'a> DisplayListFlattener<'a> {
         let is_pipeline_root =
             self.sc_stack.last().map_or(true, |sc| sc.pipeline_id != pipeline_id);
         let frame_output_pipeline_id = if is_pipeline_root && self.output_pipelines.contains(&pipeline_id) {
             Some(pipeline_id)
         } else {
             None
         };
 
-        if is_pipeline_root && create_tile_cache {
+        if is_pipeline_root && create_tile_cache && self.config.enable_picture_caching {
             // we don't expect any nested tile-cache-enabled stacking contexts
             debug_assert!(!self.sc_stack.iter().any(|sc| sc.create_tile_cache));
         }
 
         // Get the transform-style of the parent stacking context,
         // which determines if we *might* need to draw this on
         // an intermediate surface for plane splitting purposes.
         let (parent_is_3d, extra_3d_instance) = match self.sc_stack.last_mut() {
--- a/image/test/gtest/moz.build
+++ b/image/test/gtest/moz.build
@@ -6,31 +6,35 @@
 
 Library('imagetest')
 
 UNIFIED_SOURCES = [
     'Common.cpp',
     'TestADAM7InterpolatingFilter.cpp',
     'TestAnimationFrameBuffer.cpp',
     'TestBlendAnimationFilter.cpp',
-    'TestContainers.cpp',
     'TestCopyOnWrite.cpp',
-    'TestDecoders.cpp',
-    'TestDecodeToSurface.cpp',
     'TestDeinterlacingFilter.cpp',
-    'TestFrameAnimator.cpp',
     'TestLoader.cpp',
-    'TestMetadata.cpp',
     'TestRemoveFrameRectFilter.cpp',
-    'TestSourceBuffer.cpp',
     'TestStreamingLexer.cpp',
-    'TestSurfaceCache.cpp',
     'TestSurfaceSink.cpp',
 ]
 
+if CONFIG['OS_TARGET'] != 'Android':
+    UNIFIED_SOURCES += [
+        'TestContainers.cpp',
+        'TestDecoders.cpp',
+        'TestDecodeToSurface.cpp',
+        'TestFrameAnimator.cpp',
+        'TestMetadata.cpp',
+        'TestSourceBuffer.cpp',
+        'TestSurfaceCache.cpp',
+    ]
+
 if CONFIG['MOZ_ENABLE_SKIA']:
     UNIFIED_SOURCES += [
         'TestDownscalingFilter.cpp',
         'TestSurfacePipeIntegration.cpp',
     ]
 
 SOURCES += [
     # Can't be unified because it manipulates the preprocessor environment.
--- a/ipc/glue/CrashReporterHost.cpp
+++ b/ipc/glue/CrashReporterHost.cpp
@@ -121,19 +121,19 @@ bool CrashReporterHost::FinalizeCrashRep
   if (mProcessType == GeckoProcessType_GMPlugin) {
     type.AssignLiteral("plugin");
   } else if (mProcessType == GeckoProcessType_Content) {
     type.AssignLiteral("content");
   } else {
     // This check will pick up some cases that will never happen (e.g. IPDL
     // unit tests), but that's OK.
     switch (mProcessType) {
-#define GECKO_PROCESS_TYPE(enum_name, string_name, xre_name) \
-  case GeckoProcessType_##enum_name:                         \
-    type.AssignLiteral(string_name);                         \
+#define GECKO_PROCESS_TYPE(enum_name, string_name, xre_name, bin_type) \
+  case GeckoProcessType_##enum_name:                                   \
+    type.AssignLiteral(string_name);                                   \
     break;
 #include "mozilla/GeckoProcessTypes.h"
 #undef GECKO_PROCESS_TYPE
       default:
         NS_ERROR("unknown process type");
         break;
     }
   }
@@ -194,19 +194,19 @@ void CrashReporterHost::NotifyCrashServi
       break;
   }
 
   if (aProcessType == GeckoProcessType_Plugin &&
       aCrashType == nsICrashService::CRASH_TYPE_HANG) {
     telemetryKey.AssignLiteral("pluginhang");
   } else {
     switch (aProcessType) {
-#define GECKO_PROCESS_TYPE(enum_name, string_name, xre_name) \
-  case GeckoProcessType_##enum_name:                         \
-    telemetryKey.AssignLiteral(string_name);                 \
+#define GECKO_PROCESS_TYPE(enum_name, string_name, xre_name, bin_type) \
+  case GeckoProcessType_##enum_name:                                   \
+    telemetryKey.AssignLiteral(string_name);                           \
     break;
 #include "mozilla/GeckoProcessTypes.h"
 #undef GECKO_PROCESS_TYPE
       // We can't really hit this, thanks to the above switch, but having it
       // here will placate the compiler.
       default:
         NS_ERROR("unknown process type");
         return;
--- a/ipc/glue/GeckoChildProcessHost.cpp
+++ b/ipc/glue/GeckoChildProcessHost.cpp
@@ -178,24 +178,21 @@ void GeckoChildProcessHost::Destroy() {
 
   using Value = HandlePromise::ResolveOrRejectValue;
   mDestroying = true;
   whenReady->Then(XRE_GetIOMessageLoop()->SerialEventTarget(), __func__,
                   [this](const Value&) { delete this; });
 }
 
 // static
-auto GeckoChildProcessHost::GetPathToBinary(FilePath& exePath,
-                                            GeckoProcessType processType)
-    -> BinaryPathType {
-  if (sRunSelfAsContentProc && (processType == GeckoProcessType_Content ||
-                                processType == GeckoProcessType_GPU ||
-                                processType == GeckoProcessType_VR ||
-                                processType == GeckoProcessType_RDD ||
-                                processType == GeckoProcessType_Socket)) {
+mozilla::BinPathType GeckoChildProcessHost::GetPathToBinary(FilePath& exePath,
+                                            GeckoProcessType processType) {
+  BinPathType pathType = XRE_GetChildProcBinPathType(processType);
+
+  if (pathType == BinPathType::Self) {
 #if defined(OS_WIN)
     wchar_t exePathBuf[MAXPATHLEN];
     if (!::GetModuleFileNameW(nullptr, exePathBuf, MAXPATHLEN)) {
       MOZ_CRASH("GetModuleFileNameW failed (FIXME)");
     }
 #  if defined(MOZ_SANDBOX)
     // We need to start the child process using the real path, so that the
     // sandbox policy rules will match for DLLs loaded from the bin dir after
@@ -208,17 +205,17 @@ auto GeckoChildProcessHost::GetPathToBin
     {
       exePath = FilePath::FromWStringHack(exePathBuf);
     }
 #elif defined(OS_POSIX)
     exePath = FilePath(CommandLine::ForCurrentProcess()->argv()[0]);
 #else
 #  error Sorry; target OS not supported yet.
 #endif
-    return BinaryPathType::Self;
+    return pathType;
   }
 
   if (ShouldHaveDirectoryService()) {
     MOZ_ASSERT(gGREBinPath);
 #ifdef OS_WIN
     exePath = FilePath(char16ptr_t(gGREBinPath));
 #elif MOZ_WIDGET_COCOA
     nsCOMPtr<nsIFile> childProcPath;
@@ -247,17 +244,17 @@ auto GeckoChildProcessHost::GetPathToBin
 #else
     exePath = FilePath(CommandLine::ForCurrentProcess()->argv()[0]);
 #endif
     exePath = exePath.DirName();
   }
 
   exePath = exePath.AppendASCII(MOZ_CHILD_PROCESS_NAME);
 
-  return BinaryPathType::PluginContainer;
+  return pathType;
 }
 
 #ifdef MOZ_WIDGET_COCOA
 class AutoCFTypeObject {
  public:
   explicit AutoCFTypeObject(CFTypeRef object) { mObject = object; }
   ~AutoCFTypeObject() { ::CFRelease(mObject); }
 
@@ -850,33 +847,33 @@ bool GeckoChildProcessHost::PerformAsync
     interpose.Append(path.get());
     interpose.AppendLiteral("/libplugin_child_interpose.dylib");
     mLaunchOptions->env_map["DYLD_INSERT_LIBRARIES"] = interpose.get();
 #    endif           // defined(OS_LINUX) || defined(OS_BSD)
   }
 #  endif  // defined(OS_POSIX)
 
   FilePath exePath;
-  BinaryPathType pathType = GetPathToBinary(exePath, mProcessType);
+  BinPathType pathType = GetPathToBinary(exePath, mProcessType);
 
   // remap the IPC socket fd to a well-known int, as the OS does for
   // STDOUT_FILENO, for example
   int srcChannelFd, dstChannelFd;
   channel().GetClientFileDescriptorMapping(&srcChannelFd, &dstChannelFd);
   mLaunchOptions->fds_to_remap.push_back(
       std::pair<int, int>(srcChannelFd, dstChannelFd));
 
   // no need for kProcessChannelID, the child process inherits the
   // other end of the socketpair() from us
 
   std::vector<std::string> childArgv;
 
   childArgv.push_back(exePath.value());
 
-  if (pathType == BinaryPathType::Self) {
+  if (pathType == BinPathType::Self) {
     childArgv.push_back("-contentproc");
   }
 
   childArgv.insert(childArgv.end(), aExtraOpts.begin(), aExtraOpts.end());
 
   if (mProcessType != GeckoProcessType_GMPlugin) {
     if (Omnijar::IsInitialized()) {
       // Make sure that child processes can find the omnijar
@@ -1035,17 +1032,17 @@ bool GeckoChildProcessHost::PerformAsync
       parent_send_port_memory, parent_send_port_memory_ack, false);
 
 #  endif  // MOZ_WIDGET_COCOA
 
 //--------------------------------------------------
 #elif defined(OS_WIN)  // defined(OS_POSIX)
 
   FilePath exePath;
-  BinaryPathType pathType = GetPathToBinary(exePath, mProcessType);
+  BinPathType pathType = GetPathToBinary(exePath, mProcessType);
 
 #  if defined(MOZ_SANDBOX) || defined(_ARM64_)
   const bool isGMP = mProcessType == GeckoProcessType_GMPlugin;
   const bool isWidevine = isGMP && Contains(aExtraOpts, "gmp-widevinecdm");
 #    if defined(_ARM64_)
   const bool isClearKey = isGMP && Contains(aExtraOpts, "gmp-clearkey");
   const bool isSandboxBroker =
       mProcessType == GeckoProcessType_RemoteSandboxBroker;
@@ -1056,17 +1053,17 @@ bool GeckoChildProcessHost::PerformAsync
     // So insert "i686" into the exePath.
     exePath = exePath.DirName().AppendASCII("i686").Append(exePath.BaseName());
   }
 #    endif  // if defined(_ARM64_)
 #  endif    // defined(MOZ_SANDBOX) || defined(_ARM64_)
 
   CommandLine cmdLine(exePath.ToWStringHack());
 
-  if (pathType == BinaryPathType::Self) {
+  if (pathType == BinPathType::Self) {
     cmdLine.AppendLooseValue(UTF8ToWide("-contentproc"));
   }
 
   cmdLine.AppendSwitchWithValue(switches::kProcessChannelID, channel_id());
 
   for (std::vector<std::string>::iterator it = aExtraOpts.begin();
        it != aExtraOpts.end(); ++it) {
     cmdLine.AppendLooseValue(UTF8ToWide(*it));
@@ -1348,18 +1345,16 @@ GeckoChildProcessHost::WhenProcessHandle
 
 void GeckoChildProcessHost::GetQueuedMessages(std::queue<IPC::Message>& queue) {
   // If this is called off the IO thread, bad things will happen.
   DCHECK(MessageLoopForIO::current());
   swap(queue, mQueue);
   // We expect the next listener to take over processing of our queue.
 }
 
-bool GeckoChildProcessHost::sRunSelfAsContentProc(false);
-
 #ifdef MOZ_WIDGET_ANDROID
 void GeckoChildProcessHost::LaunchAndroidService(
     const char* type, const std::vector<std::string>& argv,
     const base::file_handle_mapping_vector& fds_to_remap,
     ProcessHandle* process_handle) {
   MOZ_RELEASE_ASSERT((2 <= fds_to_remap.size()) && (fds_to_remap.size() <= 5));
   JNIEnv* const env = mozilla::jni::GetEnvForThread();
   MOZ_ASSERT(env);
--- a/ipc/glue/GeckoChildProcessHost.h
+++ b/ipc/glue/GeckoChildProcessHost.h
@@ -131,20 +131,16 @@ class GeckoChildProcessHost : public Chi
    * Must run on the IO thread.  Cause the OS process to exit and
    * ensure its OS resources are cleaned up.
    */
   void Join();
 
   // For bug 943174: Skip the EnsureProcessTerminated call in the destructor.
   void SetAlreadyDead();
 
-  static void EnableSameExecutableForContentProc() {
-    sRunSelfAsContentProc = true;
-  }
-
 #if defined(XP_MACOSX) && defined(MOZ_SANDBOX)
   // To allow filling a MacSandboxInfo from the child
   // process without an instance of RDDProcessHost.
   // Only needed for late-start sandbox enabling.
   static void StaticFillMacSandboxInfo(MacSandboxInfo& aInfo);
 
   // Start the sandbox from the child process.
   static bool StartMacSandbox(int aArgc, char** aArgv,
@@ -233,20 +229,18 @@ class GeckoChildProcessHost : public Chi
   // Does the actual work for AsyncLaunch; run in a thread pool
   // (or, on Windows, a dedicated thread).
   bool PerformAsyncLaunch(StringVector aExtraOpts);
 
   // Called on the I/O thread; creates channel, dispatches
   // PerformAsyncLaunch, and consolidates error handling.
   void RunPerformAsyncLaunch(StringVector aExtraOpts);
 
-  enum class BinaryPathType { Self, PluginContainer };
-
-  static BinaryPathType GetPathToBinary(FilePath& exePath,
-                                        GeckoProcessType processType);
+  static BinPathType GetPathToBinary(FilePath& exePath,
+                                     GeckoProcessType processType);
 
   // The buffer is passed to preserve its lifetime until we are done
   // with launching the sub-process.
   void GetChildLogName(const char* origLogName, nsACString& buffer);
 
   // In between launching the subprocess and handing off its IPC
   // channel, there's a small window of time in which *we* might still
   // be the channel listener, and receive messages.  That's bad
@@ -260,18 +254,16 @@ class GeckoChildProcessHost : public Chi
 #if defined(OS_LINUX)
   nsCString mTmpDirName;
 #endif
 
   mozilla::Atomic<bool> mDestroying;
 
   static uint32_t sNextUniqueID;
 
-  static bool sRunSelfAsContentProc;
-
 #if defined(MOZ_WIDGET_ANDROID)
   void LaunchAndroidService(
       const char* type, const std::vector<std::string>& argv,
       const base::file_handle_mapping_vector& fds_to_remap,
       ProcessHandle* process_handle);
 #endif  // defined(MOZ_WIDGET_ANDROID)
 };
 
--- a/js/src/frontend/BytecodeCompiler.cpp
+++ b/js/src/frontend/BytecodeCompiler.cpp
@@ -981,18 +981,24 @@ static bool CompileLazyFunctionImpl(JSCo
 
   if (lazy->isLikelyConstructorWrapper()) {
     script->setLikelyConstructorWrapper();
   }
   if (lazy->hasBeenCloned()) {
     script->setHasBeenCloned();
   }
 
+  FieldInitializers fieldInitializers = FieldInitializers::Invalid();
+  if (fun->kind() == JSFunction::FunctionKind::ClassConstructor) {
+    fieldInitializers = lazy->getFieldInitializers();
+  }
+
   BytecodeEmitter bce(/* parent = */ nullptr, &parser, pn->funbox(), script,
-                      lazy, pn->pn_pos, BytecodeEmitter::LazyFunction);
+                      lazy, pn->pn_pos, BytecodeEmitter::LazyFunction,
+                      fieldInitializers);
   if (!bce.init()) {
     return false;
   }
 
   if (!bce.emitFunctionScript(pn, BytecodeEmitter::TopLevelFunction::Yes)) {
     return false;
   }
 
--- a/js/src/frontend/BytecodeEmitter.cpp
+++ b/js/src/frontend/BytecodeEmitter.cpp
@@ -86,34 +86,31 @@ static bool ParseNodeRequiresSpecialLine
   // handling to avoid strange stepping behavior.
   // Functions usually shouldn't have location information (bug 1431202).
 
   ParseNodeKind kind = pn->getKind();
   return kind == ParseNodeKind::WhileStmt || kind == ParseNodeKind::ForStmt ||
          kind == ParseNodeKind::Function;
 }
 
-BytecodeEmitter::BytecodeEmitter(BytecodeEmitter* parent, SharedContext* sc,
-                                 HandleScript script,
-                                 Handle<LazyScript*> lazyScript,
-                                 uint32_t lineNum, EmitterMode emitterMode)
+BytecodeEmitter::BytecodeEmitter(
+    BytecodeEmitter* parent, SharedContext* sc, HandleScript script,
+    Handle<LazyScript*> lazyScript, uint32_t lineNum, EmitterMode emitterMode,
+    FieldInitializers fieldInitializers /* = FieldInitializers::Invalid() */)
     : sc(sc),
       cx(sc->cx_),
       parent(parent),
       script(cx, script),
       lazyScript(cx, lazyScript),
       code_(cx),
       notes_(cx),
       currentLine_(lineNum),
+      fieldInitializers_(fieldInitializers),
       atomIndices(cx->frontendCollectionPool()),
       firstLine(lineNum),
-      fieldInitializers_(parent
-                             ? parent->fieldInitializers_
-                             : lazyScript ? lazyScript->getFieldInitializers()
-                                          : FieldInitializers::Invalid()),
       numberList(cx),
       scopeList(cx),
       tryNoteList(cx),
       scopeNoteList(cx),
       resumeOffsetList(cx),
       emitterMode(emitterMode) {
   MOZ_ASSERT_IF(emitterMode == LazyFunction, lazyScript);
 
@@ -122,27 +119,31 @@ BytecodeEmitter::BytecodeEmitter(Bytecod
     numICEntries = sc->asFunctionBox()->function()->nargs() + 1;
   }
 }
 
 BytecodeEmitter::BytecodeEmitter(BytecodeEmitter* parent,
                                  BCEParserHandle* handle, SharedContext* sc,
                                  HandleScript script,
                                  Handle<LazyScript*> lazyScript,
-                                 uint32_t lineNum, EmitterMode emitterMode)
-    : BytecodeEmitter(parent, sc, script, lazyScript, lineNum, emitterMode) {
+                                 uint32_t lineNum, EmitterMode emitterMode,
+                                 FieldInitializers fieldInitializers)
+    : BytecodeEmitter(parent, sc, script, lazyScript, lineNum, emitterMode,
+                      fieldInitializers) {
   parser = handle;
 }
 
 BytecodeEmitter::BytecodeEmitter(BytecodeEmitter* parent,
                                  const EitherParser& parser, SharedContext* sc,
                                  HandleScript script,
                                  Handle<LazyScript*> lazyScript,
-                                 uint32_t lineNum, EmitterMode emitterMode)
-    : BytecodeEmitter(parent, sc, script, lazyScript, lineNum, emitterMode) {
+                                 uint32_t lineNum, EmitterMode emitterMode,
+                                 FieldInitializers fieldInitializers)
+    : BytecodeEmitter(parent, sc, script, lazyScript, lineNum, emitterMode,
+                      fieldInitializers) {
   ep_.emplace(parser);
   this->parser = ep_.ptr();
 }
 
 void BytecodeEmitter::initFromBodyPosition(TokenPos bodyPosition) {
   setScriptStartOffsetIfUnset(bodyPosition.begin);
   setFunctionBodyEndPos(bodyPosition.end);
 }
@@ -722,16 +723,22 @@ bool NonLocalExitControl::prepareForNonL
   auto flushPops = [&npops](BytecodeEmitter* bce) {
     if (npops && !bce->emitPopN(npops)) {
       return false;
     }
     npops = 0;
     return true;
   };
 
+  // If we are closing multiple for-of loops, the resulting FOR_OF_ITERCLOSE
+  // trynotes must be appropriately nested. Each FOR_OF_ITERCLOSE starts when
+  // we close the corresponding for-of iterator, and continues until the
+  // actual jump.
+  Vector<ptrdiff_t, 4> forOfIterCloseScopeStarts(bce_->cx);
+
   // Walk the nestable control stack and patch jumps.
   for (NestableControl* control = bce_->innermostNestableControl;
        control != target; control = control->enclosing()) {
     // Walk the scope stack and leave the scopes we entered. Leaving a scope
     // may emit administrative ops like JSOP_POPLEXICALENV but never anything
     // that manipulates the stack.
     for (; es != control->emitterScope(); es = es->enclosingInFrame()) {
       if (!leaveScope(es)) {
@@ -760,24 +767,27 @@ bool NonLocalExitControl::prepareForNonL
         break;
       }
 
       case StatementKind::ForOfLoop:
         if (emitIteratorClose) {
           if (!flushPops(bce_)) {
             return false;
           }
-
+          ptrdiff_t tryNoteStart = 0;
           ForOfLoopControl& loopinfo = control->as<ForOfLoopControl>();
           if (!loopinfo.emitPrepareForNonLocalJumpFromScope(
                   bce_, *es,
-                  /* isTarget = */ false)) {
+                  /* isTarget = */ false, &tryNoteStart)) {
             //      [stack] ...
             return false;
           }
+          if (!forOfIterCloseScopeStarts.append(tryNoteStart)) {
+            return false;
+          }
         } else {
           // The iterator next method, the iterator, and the current
           // value are on the stack.
           npops += 3;
         }
         break;
 
       case StatementKind::ForInLoop:
@@ -801,32 +811,45 @@ bool NonLocalExitControl::prepareForNonL
     }
   }
 
   if (!flushPops(bce_)) {
     return false;
   }
 
   if (target && emitIteratorCloseAtTarget && target->is<ForOfLoopControl>()) {
+    ptrdiff_t tryNoteStart = 0;
     ForOfLoopControl& loopinfo = target->as<ForOfLoopControl>();
     if (!loopinfo.emitPrepareForNonLocalJumpFromScope(bce_, *es,
-                                                      /* isTarget = */ true)) {
+                                                      /* isTarget = */ true,
+                                                      &tryNoteStart)) {
       //            [stack] ... UNDEF UNDEF UNDEF
       return false;
     }
+    if (!forOfIterCloseScopeStarts.append(tryNoteStart)) {
+      return false;
+    }
   }
 
   EmitterScope* targetEmitterScope =
       target ? target->emitterScope() : bce_->varEmitterScope;
   for (; es != targetEmitterScope; es = es->enclosingInFrame()) {
     if (!leaveScope(es)) {
       return false;
     }
   }
 
+  // Close FOR_OF_ITERCLOSE trynotes.
+  ptrdiff_t end = bce_->offset();
+  for (ptrdiff_t start : forOfIterCloseScopeStarts) {
+    if (!bce_->addTryNote(JSTRY_FOR_OF_ITERCLOSE, 0, start, end)) {
+      return false;
+    }
+  }
+
   return true;
 }
 
 }  // anonymous namespace
 
 bool BytecodeEmitter::emitGoto(NestableControl* target, JumpList* jumplist,
                                SrcNoteType noteType) {
   NonLocalExitControl nle(this, noteType == SRC_CONTINUE
@@ -2326,16 +2349,20 @@ bool BytecodeEmitter::emitSetThis(Binary
     //              [stack] NEWTHIS
     return false;
   }
   if (!noe.emitAssignment()) {
     //              [stack] NEWTHIS
     return false;
   }
 
+  if (!emitInitializeInstanceFields()) {
+    return false;
+  }
+
   return true;
 }
 
 bool BytecodeEmitter::defineHoistedTopLevelFunctions(ParseNode* body) {
   MOZ_ASSERT(inPrologue());
   MOZ_ASSERT(sc->isGlobalContext() || (sc->isEvalContext() && !sc->strict()));
   MOZ_ASSERT(body->is<LexicalScopeNode>() || body->is<ListNode>());
 
@@ -2457,16 +2484,20 @@ bool BytecodeEmitter::emitFunctionScript
                                          TopLevelFunction isTopLevel) {
   MOZ_ASSERT(inPrologue());
   ListNode* paramsBody = &funNode->body()->as<ListNode>();
   MOZ_ASSERT(paramsBody->isKind(ParseNodeKind::ParamsBody));
   FunctionBox* funbox = sc->asFunctionBox();
   AutoFrontendTraceLog traceLog(cx, TraceLogger_BytecodeEmission,
                                 parser->errorReporter(), funbox);
 
+  MOZ_ASSERT((fieldInitializers_.valid) ==
+             (funbox->function()->kind() ==
+              JSFunction::FunctionKind::ClassConstructor));
+
   setScriptStartOffsetIfUnset(paramsBody->pn_pos.begin);
 
   //                [stack]
 
   FunctionScriptEmitter fse(this, funbox, Some(paramsBody->pn_pos.begin),
                             Some(paramsBody->pn_pos.end));
   if (!fse.prepareForParameters()) {
     //              [stack]
@@ -2498,16 +2529,18 @@ bool BytecodeEmitter::emitFunctionScript
       return false;
     }
   }
 
   if (!fse.initScript()) {
     return false;
   }
 
+  script->setFieldInitializers(fieldInitializers_);
+
   return true;
 }
 
 bool BytecodeEmitter::emitDestructuringLHSRef(ParseNode* target,
                                               size_t* emitted) {
   *emitted = 0;
 
   if (target->isKind(ParseNodeKind::Spread)) {
@@ -5574,21 +5607,26 @@ bool BytecodeEmitter::emitFor(ForNode* f
   if (forNode->head()->isKind(ParseNodeKind::ForIn)) {
     return emitForIn(forNode, headLexicalEmitterScope);
   }
 
   MOZ_ASSERT(forNode->head()->isKind(ParseNodeKind::ForOf));
   return emitForOf(forNode, headLexicalEmitterScope);
 }
 
-MOZ_NEVER_INLINE bool BytecodeEmitter::emitFunction(FunctionNode* funNode,
-                                                    bool needsProto) {
+MOZ_NEVER_INLINE bool BytecodeEmitter::emitFunction(
+    FunctionNode* funNode, bool needsProto /* = false */,
+    ListNode* classContentsIfConstructor /* = nullptr */) {
   FunctionBox* funbox = funNode->funbox();
   RootedFunction fun(cx, funbox->function());
 
+  MOZ_ASSERT((classContentsIfConstructor != nullptr) ==
+             (funbox->function()->kind() ==
+              JSFunction::FunctionKind::ClassConstructor));
+
   //                [stack]
 
   FunctionEmitter fe(this, funbox, funNode->syntaxKind(),
                      funNode->functionIsHoisted()
                          ? FunctionEmitter::IsHoisted::Yes
                          : FunctionEmitter::IsHoisted::No);
 
   // Set the |wasEmitted| flag in the funbox once the function has been
@@ -5605,16 +5643,21 @@ MOZ_NEVER_INLINE bool BytecodeEmitter::e
 
   if (fun->isInterpreted()) {
     if (fun->isInterpretedLazy()) {
       if (!fe.emitLazy()) {
         //          [stack] FUN?
         return false;
       }
 
+      if (classContentsIfConstructor) {
+        fun->lazyScript()->setFieldInitializers(
+            setupFieldInitializers(classContentsIfConstructor));
+      }
+
       return true;
     }
 
     if (!fe.prepareForNonLazy()) {
       //            [stack]
       return false;
     }
 
@@ -5635,28 +5678,35 @@ MOZ_NEVER_INLINE bool BytecodeEmitter::e
     }
 
     EmitterMode nestedMode = emitterMode;
     if (nestedMode == BytecodeEmitter::LazyFunction) {
       MOZ_ASSERT(lazyScript->isBinAST());
       nestedMode = BytecodeEmitter::Normal;
     }
 
+    FieldInitializers fieldInitializers = FieldInitializers::Invalid();
+    if (classContentsIfConstructor) {
+      fieldInitializers = setupFieldInitializers(classContentsIfConstructor);
+    }
+
     BytecodeEmitter bce2(this, parser, funbox, script,
                          /* lazyScript = */ nullptr, funNode->pn_pos,
-                         nestedMode);
+                         nestedMode, fieldInitializers);
     if (!bce2.init()) {
       return false;
     }
 
     /* We measured the max scope depth when we parsed the function. */
     if (!bce2.emitFunctionScript(funNode, TopLevelFunction::No)) {
       return false;
     }
 
+    // fieldInitializers are copied to the JSScript inside BytecodeEmitter
+
     if (funbox->isLikelyConstructorWrapper()) {
       script->setLikelyConstructorWrapper();
     }
 
     if (!fe.emitNonLazyEnd()) {
       //            [stack] FUN?
       return false;
     }
@@ -7934,17 +7984,17 @@ bool BytecodeEmitter::emitCreateFieldKey
     //            [stack]
     return false;
   }
 
   return true;
 }
 
 bool BytecodeEmitter::emitCreateFieldInitializers(ListNode* obj) {
-  const FieldInitializers& fieldInitializers = fieldInitializers_;
+  FieldInitializers fieldInitializers = setupFieldInitializers(obj);
   MOZ_ASSERT(fieldInitializers.valid);
   size_t numFields = fieldInitializers.numFieldInitializers;
 
   if (numFields == 0) {
     return true;
   }
 
   // .initializers is a variable that stores an array of lambdas containing
@@ -7992,16 +8042,104 @@ bool BytecodeEmitter::emitCreateFieldIni
   if (!emit1(JSOP_POP)) {
     //            [stack] CTOR? OBJ
     return false;
   }
 
   return true;
 }
 
+const FieldInitializers& BytecodeEmitter::findFieldInitializersForCall() {
+  for (BytecodeEmitter* current = this; current; current = current->parent) {
+    if (current->sc->isFunctionBox()) {
+      FunctionBox* box = current->sc->asFunctionBox();
+      if (box->function()->kind() ==
+          JSFunction::FunctionKind::ClassConstructor) {
+        const FieldInitializers& fieldInitializers =
+            current->getFieldInitializers();
+        MOZ_ASSERT(fieldInitializers.valid);
+        return fieldInitializers;
+      }
+    }
+  }
+
+  for (ScopeIter si(innermostScope()); si; si++) {
+    if (si.scope()->is<FunctionScope>()) {
+      JSFunction* fun = si.scope()->as<FunctionScope>().canonicalFunction();
+      if (fun->kind() == JSFunction::FunctionKind::ClassConstructor) {
+        const FieldInitializers& fieldInitializers =
+            fun->isInterpretedLazy()
+                ? fun->lazyScript()->getFieldInitializers()
+                : fun->nonLazyScript()->getFieldInitializers();
+        MOZ_ASSERT(fieldInitializers.valid);
+        return fieldInitializers;
+      }
+    }
+  }
+
+  MOZ_CRASH("Constructor for field initializers not found.");
+}
+
+bool BytecodeEmitter::emitInitializeInstanceFields() {
+  const FieldInitializers& fieldInitializers = findFieldInitializersForCall();
+  size_t numFields = fieldInitializers.numFieldInitializers;
+
+  if (numFields == 0) {
+    return true;
+  }
+
+  if (!emitGetName(cx->names().dotInitializers)) {
+    //              [stack] ARRAY
+    return false;
+  }
+
+  for (size_t fieldIndex = 0; fieldIndex < numFields; fieldIndex++) {
+    if (fieldIndex < numFields - 1) {
+      // We DUP to keep the array around (it is consumed in the bytecode below)
+      // for next iterations of this loop, except for the last iteration, which
+      // avoids an extra POP at the end of the loop.
+      if (!emit1(JSOP_DUP)) {
+        //          [stack] ARRAY ARRAY
+        return false;
+      }
+    }
+
+    if (!emitNumberOp(fieldIndex)) {
+      //            [stack] ARRAY? ARRAY INDEX
+      return false;
+    }
+
+    // Don't use CALLELEM here, because the receiver of the call != the receiver
+    // of this getelem. (Specifically, the call receiver is `this`, and the
+    // receiver of this getelem is `.initializers`)
+    if (!emit1(JSOP_GETELEM)) {
+      //            [stack] ARRAY? FUNC
+      return false;
+    }
+
+    // This is guaranteed to run after super(), so we don't need TDZ checks.
+    if (!emitGetName(cx->names().dotThis)) {
+      //            [stack] ARRAY? FUNC THIS
+      return false;
+    }
+
+    if (!emitCall(JSOP_CALL_IGNORES_RV, 0)) {
+      //            [stack] ARRAY? RVAL
+      return false;
+    }
+
+    if (!emit1(JSOP_POP)) {
+      //            [stack] ARRAY?
+      return false;
+    }
+  }
+
+  return true;
+}
+
 // Using MOZ_NEVER_INLINE in here is a workaround for llvm.org/pr14047. See
 // the comment on emitSwitch.
 MOZ_NEVER_INLINE bool BytecodeEmitter::emitObject(ListNode* objNode) {
   if (!objNode->hasNonConstInitializer() && objNode->head() &&
       checkSingletonContext()) {
     return emitSingletonInitialiser(objNode);
   }
 
@@ -8482,47 +8620,29 @@ static MOZ_ALWAYS_INLINE FunctionNode* F
         return &method.method();
       }
     }
   }
 
   return nullptr;
 }
 
-class AutoResetFieldInitializers {
-  BytecodeEmitter* bce;
-  FieldInitializers oldFieldInfo;
-
- public:
-  AutoResetFieldInitializers(BytecodeEmitter* bce,
-                             FieldInitializers newFieldInfo)
-      : bce(bce), oldFieldInfo(bce->fieldInitializers_) {
-    bce->fieldInitializers_ = newFieldInfo;
-  }
-
-  ~AutoResetFieldInitializers() { bce->fieldInitializers_ = oldFieldInfo; }
-};
-
 // This follows ES6 14.5.14 (ClassDefinitionEvaluation) and ES6 14.5.15
 // (BindingClassDeclarationEvaluation).
 bool BytecodeEmitter::emitClass(
     ClassNode* classNode,
     ClassNameKind nameKind /* = ClassNameKind::BindingName */,
     HandleAtom nameForAnonymousClass /* = nullptr */) {
   MOZ_ASSERT((nameKind == ClassNameKind::InferredName) ==
              (nameForAnonymousClass != nullptr));
 
   ParseNode* heritageExpression = classNode->heritage();
   ListNode* classMembers = classNode->memberList();
   FunctionNode* constructor = FindConstructor(cx, classMembers);
 
-  // set this->fieldInitializers_
-  AutoResetFieldInitializers _innermostClassAutoReset(
-      this, setupFieldInitializers(classMembers));
-
   // If |nameKind != ClassNameKind::ComputedName|
   //                [stack]
   // Else
   //                [stack] NAME
 
   ClassEmitter ce(this);
   RootedAtom innerName(cx);
   ClassEmitter::Kind kind = ClassEmitter::Kind::Expression;
@@ -8572,17 +8692,17 @@ bool BytecodeEmitter::emitClass(
     }
   }
 
   // Stack currently has HOMEOBJ followed by optional HERITAGE. When HERITAGE
   // is not used, an implicit value of %FunctionPrototype% is implied.
   if (constructor) {
     bool needsHomeObject = constructor->funbox()->needsHomeObject();
     // HERITAGE is consumed inside emitFunction.
-    if (!emitFunction(constructor, isDerived)) {
+    if (!emitFunction(constructor, isDerived, classMembers)) {
       //            [stack] HOMEOBJ CTOR
       return false;
     }
     if (nameKind == ClassNameKind::InferredName) {
       if (!setFunName(constructor->funbox()->function(),
                       nameForAnonymousClass)) {
         return false;
       }
--- a/js/src/frontend/BytecodeEmitter.h
+++ b/js/src/frontend/BytecodeEmitter.h
@@ -145,16 +145,19 @@ struct MOZ_STACK_CLASS BytecodeEmitter {
 
   uint32_t lastSeparatorOffet_ = 0;
   uint32_t lastSeparatorLine_ = 0;
   uint32_t lastSeparatorColumn_ = 0;
 
   // switchToMain sets this to the bytecode offset of the main section.
   mozilla::Maybe<uint32_t> mainOffset_ = {};
 
+  /* field info for enclosing class */
+  const FieldInitializers fieldInitializers_;
+
  public:
   // Last jump target emitted.
   JumpTarget lastTarget = {-1 - ptrdiff_t(JSOP_JUMPTARGET_LENGTH)};
 
   // Private storage for parser wrapper. DO NOT REFERENCE INTERNALLY. May not be
   // initialized. Use |parser| instead.
   mozilla::Maybe<EitherParser> ep_ = {};
   BCEParserHandle* parser = nullptr;
@@ -171,18 +174,17 @@ struct MOZ_STACK_CLASS BytecodeEmitter {
   uint32_t bodyScopeIndex =
       UINT32_MAX; /* index into scopeList of the body scope */
 
   EmitterScope* varEmitterScope = nullptr;
   NestableControl* innermostNestableControl = nullptr;
   EmitterScope* innermostEmitterScope_ = nullptr;
   TDZCheckCache* innermostTDZCheckCache = nullptr;
 
-  /* field info for enclosing class */
-  FieldInitializers fieldInitializers_;
+  const FieldInitializers& getFieldInitializers() { return fieldInitializers_; }
 
 #ifdef DEBUG
   bool unstableEmitterScope = false;
 
   friend class AutoCheckUnstableEmitterScope;
 #endif
 
   EmitterScope* innermostEmitterScope() const {
@@ -249,79 +251,86 @@ struct MOZ_STACK_CLASS BytecodeEmitter {
   /*
    * Note that BytecodeEmitters are magic: they own the arena "top-of-stack"
    * space above their tempMark points. This means that you cannot alloc from
    * tempLifoAlloc and save the pointer beyond the next BytecodeEmitter
    * destruction.
    */
  private:
   // Internal constructor, for delegation use only.
-  BytecodeEmitter(BytecodeEmitter* parent, SharedContext* sc,
-                  HandleScript script, Handle<LazyScript*> lazyScript,
-                  uint32_t lineNum, EmitterMode emitterMode);
+  BytecodeEmitter(
+      BytecodeEmitter* parent, SharedContext* sc, HandleScript script,
+      Handle<LazyScript*> lazyScript, uint32_t lineNum, EmitterMode emitterMode,
+      FieldInitializers fieldInitializers = FieldInitializers::Invalid());
 
   void initFromBodyPosition(TokenPos bodyPosition);
 
   /*
    * Helper for reporting that we have insufficient args.  pluralizer
    * should be "s" if requiredArgs is anything other than "1" and ""
    * if requiredArgs is "1".
    */
   void reportNeedMoreArgsError(ParseNode* pn, const char* errorName,
                                const char* requiredArgs, const char* pluralizer,
                                const ListNode* argsList);
 
  public:
-  BytecodeEmitter(BytecodeEmitter* parent, BCEParserHandle* parser,
-                  SharedContext* sc, HandleScript script,
-                  Handle<LazyScript*> lazyScript, uint32_t lineNum,
-                  EmitterMode emitterMode = Normal);
+  BytecodeEmitter(
+      BytecodeEmitter* parent, BCEParserHandle* parser, SharedContext* sc,
+      HandleScript script, Handle<LazyScript*> lazyScript, uint32_t lineNum,
+      EmitterMode emitterMode = Normal,
+      FieldInitializers fieldInitializers = FieldInitializers::Invalid());
 
-  BytecodeEmitter(BytecodeEmitter* parent, const EitherParser& parser,
-                  SharedContext* sc, HandleScript script,
-                  Handle<LazyScript*> lazyScript, uint32_t lineNum,
-                  EmitterMode emitterMode = Normal);
+  BytecodeEmitter(
+      BytecodeEmitter* parent, const EitherParser& parser, SharedContext* sc,
+      HandleScript script, Handle<LazyScript*> lazyScript, uint32_t lineNum,
+      EmitterMode emitterMode = Normal,
+      FieldInitializers fieldInitializers = FieldInitializers::Invalid());
 
   template <typename Unit>
-  BytecodeEmitter(BytecodeEmitter* parent,
-                  Parser<FullParseHandler, Unit>* parser, SharedContext* sc,
-                  HandleScript script, Handle<LazyScript*> lazyScript,
-                  uint32_t lineNum, EmitterMode emitterMode = Normal)
+  BytecodeEmitter(
+      BytecodeEmitter* parent, Parser<FullParseHandler, Unit>* parser,
+      SharedContext* sc, HandleScript script, Handle<LazyScript*> lazyScript,
+      uint32_t lineNum, EmitterMode emitterMode = Normal,
+      FieldInitializers fieldInitializers = FieldInitializers::Invalid())
       : BytecodeEmitter(parent, EitherParser(parser), sc, script, lazyScript,
-                        lineNum, emitterMode) {}
+                        lineNum, emitterMode, fieldInitializers) {}
 
   // An alternate constructor that uses a TokenPos for the starting
   // line and that sets functionBodyEndPos as well.
-  BytecodeEmitter(BytecodeEmitter* parent, BCEParserHandle* parser,
-                  SharedContext* sc, HandleScript script,
-                  Handle<LazyScript*> lazyScript, TokenPos bodyPosition,
-                  EmitterMode emitterMode = Normal)
+  BytecodeEmitter(
+      BytecodeEmitter* parent, BCEParserHandle* parser, SharedContext* sc,
+      HandleScript script, Handle<LazyScript*> lazyScript,
+      TokenPos bodyPosition, EmitterMode emitterMode = Normal,
+      FieldInitializers fieldInitializers = FieldInitializers::Invalid())
       : BytecodeEmitter(parent, parser, sc, script, lazyScript,
                         parser->errorReporter().lineAt(bodyPosition.begin),
-                        emitterMode) {
+                        emitterMode, fieldInitializers) {
     initFromBodyPosition(bodyPosition);
   }
 
-  BytecodeEmitter(BytecodeEmitter* parent, const EitherParser& parser,
-                  SharedContext* sc, HandleScript script,
-                  Handle<LazyScript*> lazyScript, TokenPos bodyPosition,
-                  EmitterMode emitterMode = Normal)
+  BytecodeEmitter(
+      BytecodeEmitter* parent, const EitherParser& parser, SharedContext* sc,
+      HandleScript script, Handle<LazyScript*> lazyScript,
+      TokenPos bodyPosition, EmitterMode emitterMode = Normal,
+      FieldInitializers fieldInitializers = FieldInitializers::Invalid())
       : BytecodeEmitter(parent, parser, sc, script, lazyScript,
                         parser.errorReporter().lineAt(bodyPosition.begin),
-                        emitterMode) {
+                        emitterMode, fieldInitializers) {
     initFromBodyPosition(bodyPosition);
   }
 
   template <typename Unit>
-  BytecodeEmitter(BytecodeEmitter* parent,
-                  Parser<FullParseHandler, Unit>* parser, SharedContext* sc,
-                  HandleScript script, Handle<LazyScript*> lazyScript,
-                  TokenPos bodyPosition, EmitterMode emitterMode = Normal)
+  BytecodeEmitter(
+      BytecodeEmitter* parent, Parser<FullParseHandler, Unit>* parser,
+      SharedContext* sc, HandleScript script, Handle<LazyScript*> lazyScript,
+      TokenPos bodyPosition, EmitterMode emitterMode = Normal,
+      FieldInitializers fieldInitializers = FieldInitializers::Invalid())
       : BytecodeEmitter(parent, EitherParser(parser), sc, script, lazyScript,
-                        bodyPosition, emitterMode) {}
+                        bodyPosition, emitterMode, fieldInitializers) {}
 
   MOZ_MUST_USE bool init();
 
   template <typename T>
   T* findInnermostNestableControl() const;
 
   template <typename T, typename Predicate /* (T*) -> bool */>
   T* findInnermostNestableControl(Predicate predicate) const;
@@ -589,31 +598,34 @@ struct MOZ_STACK_CLASS BytecodeEmitter {
 
   MOZ_MUST_USE bool emitInternedScopeOp(uint32_t index, JSOp op);
   MOZ_MUST_USE bool emitInternedObjectOp(uint32_t index, JSOp op);
   MOZ_MUST_USE bool emitObjectOp(ObjectBox* objbox, JSOp op);
   MOZ_MUST_USE bool emitObjectPairOp(ObjectBox* objbox1, ObjectBox* objbox2,
                                      JSOp op);
   MOZ_MUST_USE bool emitRegExp(uint32_t index);
 
-  MOZ_NEVER_INLINE MOZ_MUST_USE bool emitFunction(FunctionNode* funNode,
-                                                  bool needsProto = false);
+  MOZ_NEVER_INLINE MOZ_MUST_USE bool emitFunction(
+      FunctionNode* funNode, bool needsProto = false,
+      ListNode* classContentsIfConstructor = nullptr);
   MOZ_NEVER_INLINE MOZ_MUST_USE bool emitObject(ListNode* objNode);
 
   MOZ_MUST_USE bool replaceNewInitWithNewObject(JSObject* obj,
                                                 ptrdiff_t offset);
 
   MOZ_MUST_USE bool emitHoistedFunctionsInList(ListNode* stmtList);
 
   MOZ_MUST_USE bool emitPropertyList(ListNode* obj, PropertyEmitter& pe,
                                      PropListType type);
 
   FieldInitializers setupFieldInitializers(ListNode* classMembers);
   MOZ_MUST_USE bool emitCreateFieldKeys(ListNode* obj);
   MOZ_MUST_USE bool emitCreateFieldInitializers(ListNode* obj);
+  const FieldInitializers& findFieldInitializersForCall();
+  MOZ_MUST_USE bool emitInitializeInstanceFields();
 
   // To catch accidental misuse, emitUint16Operand/emit3 assert that they are
   // not used to unconditionally emit JSOP_GETLOCAL. Variable access should
   // instead be emitted using EmitVarOp. In special cases, when the caller
   // definitely knows that a given local slot is unaliased, this function may be
   // used as a non-asserting version of emitUint16Operand.
   MOZ_MUST_USE bool emitLocalOp(JSOp op, uint32_t slot);
 
--- a/js/src/frontend/ForOfLoopControl.cpp
+++ b/js/src/frontend/ForOfLoopControl.cpp
@@ -69,17 +69,18 @@ bool ForOfLoopControl::emitEndCodeNeedin
     return false;
   }
 
   MOZ_ASSERT(slotFromTop == unsigned(bce->stackDepth - iterDepth_));
   if (!bce->emitDupAt(slotFromTop)) {
     //              [stack] ITER ... EXCEPTION ITER
     return false;
   }
-  if (!emitIteratorCloseInInnermostScope(bce, CompletionKind::Throw)) {
+  if (!emitIteratorCloseInInnermostScopeWithTryNote(bce,
+                                                    CompletionKind::Throw)) {
     return false;  // ITER ... EXCEPTION
   }
 
   if (!ifIteratorIsNotClosed.emitEnd()) {
     //              [stack] ITER ... EXCEPTION
     return false;
   }
 
@@ -105,17 +106,18 @@ bool ForOfLoopControl::emitEndCodeNeedin
     if (!ifGeneratorClosing.emitThen()) {
       //            [stack] ITER ... FTYPE FVALUE
       return false;
     }
     if (!bce->emitDupAt(slotFromTop + 1)) {
       //            [stack] ITER ... FTYPE FVALUE ITER
       return false;
     }
-    if (!emitIteratorCloseInInnermostScope(bce, CompletionKind::Normal)) {
+    if (!emitIteratorCloseInInnermostScopeWithTryNote(bce,
+                                                      CompletionKind::Normal)) {
       //            [stack] ITER ... FTYPE FVALUE
       return false;
     }
     if (!ifGeneratorClosing.emitEnd()) {
       //            [stack] ITER ... FTYPE FVALUE
       return false;
     }
   }
@@ -125,46 +127,47 @@ bool ForOfLoopControl::emitEndCodeNeedin
   }
 
   tryCatch_.reset();
   numYieldsAtBeginCodeNeedingIterClose_ = UINT32_MAX;
 
   return true;
 }
 
-bool ForOfLoopControl::emitIteratorCloseInInnermostScope(
+bool ForOfLoopControl::emitIteratorCloseInInnermostScopeWithTryNote(
     BytecodeEmitter* bce,
     CompletionKind completionKind /* = CompletionKind::Normal */) {
-  return emitIteratorCloseInScope(bce, *bce->innermostEmitterScope(),
-                                  completionKind);
+  ptrdiff_t start = bce->offset();
+  if (!emitIteratorCloseInScope(bce, *bce->innermostEmitterScope(),
+                                completionKind)) {
+    return false;
+  }
+  ptrdiff_t end = bce->offset();
+  return bce->addTryNote(JSTRY_FOR_OF_ITERCLOSE, 0, start, end);
 }
 
 bool ForOfLoopControl::emitIteratorCloseInScope(
     BytecodeEmitter* bce, EmitterScope& currentScope,
     CompletionKind completionKind /* = CompletionKind::Normal */) {
-  ptrdiff_t start = bce->offset();
-  if (!bce->emitIteratorCloseInScope(currentScope, iterKind_, completionKind,
-                                     allowSelfHosted_)) {
-    return false;
-  }
-  ptrdiff_t end = bce->offset();
-  return bce->addTryNote(JSTRY_FOR_OF_ITERCLOSE, 0, start, end);
+  return bce->emitIteratorCloseInScope(currentScope, iterKind_, completionKind,
+                                       allowSelfHosted_);
 }
 
 // Since we're in the middle of emitting code that will leave
 // |bce->innermostEmitterScope()|, passing the innermost emitter scope to
 // emitIteratorCloseInScope and looking up .generator there would be very,
 // very wrong.  We'd find .generator in the function environment, and we'd
 // compute a NameLocation with the correct slot, but we'd compute a
 // hop-count to the function environment that was too big.  At runtime we'd
 // either crash, or we'd find a user-controllable value in that slot, and
 // Very Bad Things would ensue as we reinterpreted that value as an
 // iterator.
 bool ForOfLoopControl::emitPrepareForNonLocalJumpFromScope(
-    BytecodeEmitter* bce, EmitterScope& currentScope, bool isTarget) {
+    BytecodeEmitter* bce, EmitterScope& currentScope, bool isTarget,
+    ptrdiff_t* tryNoteStart) {
   // Pop unnecessary value from the stack.  Effectively this means
   // leaving try-catch block.  However, the performing IteratorClose can
   // reach the depth for try-catch, and effectively re-enter the
   // try-catch block.
   if (!bce->emit1(JSOP_POP)) {
     //              [stack] NEXT ITER
     return false;
   }
@@ -185,16 +188,17 @@ bool ForOfLoopControl::emitPrepareForNon
     //              [stack] ITER UNDEF
     return false;
   }
   if (!bce->emit1(JSOP_SWAP)) {
     //              [stack] UNDEF ITER
     return false;
   }
 
+  *tryNoteStart = bce->offset();
   if (!emitIteratorCloseInScope(bce, currentScope, CompletionKind::Normal)) {
     //              [stack] UNDEF
     return false;
   }
 
   if (isTarget) {
     // At the level of the target block, there's bytecode after the
     // loop that will pop the next method, the iterator, and the
--- a/js/src/frontend/ForOfLoopControl.h
+++ b/js/src/frontend/ForOfLoopControl.h
@@ -68,25 +68,26 @@ class ForOfLoopControl : public LoopCont
 
  public:
   ForOfLoopControl(BytecodeEmitter* bce, int32_t iterDepth,
                    bool allowSelfHosted, IteratorKind iterKind);
 
   MOZ_MUST_USE bool emitBeginCodeNeedingIteratorClose(BytecodeEmitter* bce);
   MOZ_MUST_USE bool emitEndCodeNeedingIteratorClose(BytecodeEmitter* bce);
 
-  MOZ_MUST_USE bool emitIteratorCloseInInnermostScope(
+  MOZ_MUST_USE bool emitIteratorCloseInInnermostScopeWithTryNote(
       BytecodeEmitter* bce,
       CompletionKind completionKind = CompletionKind::Normal);
   MOZ_MUST_USE bool emitIteratorCloseInScope(
       BytecodeEmitter* bce, EmitterScope& currentScope,
       CompletionKind completionKind = CompletionKind::Normal);
 
   MOZ_MUST_USE bool emitPrepareForNonLocalJumpFromScope(
-      BytecodeEmitter* bce, EmitterScope& currentScope, bool isTarget);
+      BytecodeEmitter* bce, EmitterScope& currentScope, bool isTarget,
+      ptrdiff_t* tryNoteStart);
 };
 template <>
 inline bool NestableControl::is<ForOfLoopControl>() const {
   return kind_ == StatementKind::ForOfLoop;
 }
 
 } /* namespace frontend */
 } /* namespace js */
--- a/js/src/frontend/FunctionEmitter.cpp
+++ b/js/src/frontend/FunctionEmitter.cpp
@@ -471,18 +471,19 @@ bool FunctionScriptEmitter::prepareForBo
 
   if (funbox_->needsPromiseResult()) {
     if (!emitAsyncFunctionRejectPrologue()) {
       return false;
     }
   }
 
   if (funbox_->function()->kind() ==
-      JSFunction::FunctionKind::ClassConstructor) {
-    if (!emitInitializeInstanceFields()) {
+          JSFunction::FunctionKind::ClassConstructor &&
+      !funbox_->isDerivedClassConstructor()) {
+    if (!bce_->emitInitializeInstanceFields()) {
       //            [stack]
       return false;
     }
   }
 
 #ifdef DEBUG
   state_ = State::Body;
 #endif
@@ -593,73 +594,16 @@ bool FunctionScriptEmitter::emitExtraBod
       //            [stack]
       return false;
     }
   }
 
   return true;
 }
 
-bool FunctionScriptEmitter::emitInitializeInstanceFields() {
-  MOZ_ASSERT(bce_->fieldInitializers_.valid);
-  size_t numFields = bce_->fieldInitializers_.numFieldInitializers;
-
-  if (numFields == 0) {
-    return true;
-  }
-
-  if (!bce_->emitGetName(bce_->cx->names().dotInitializers)) {
-    //              [stack] ARRAY
-    return false;
-  }
-
-  for (size_t fieldIndex = 0; fieldIndex < numFields; fieldIndex++) {
-    if (fieldIndex < numFields - 1) {
-      // We DUP to keep the array around (it is consumed in the bytecode below)
-      // for next iterations of this loop, except for the last iteration, which
-      // avoids an extra POP at the end of the loop.
-      if (!bce_->emit1(JSOP_DUP)) {
-        //          [stack] ARRAY ARRAY
-        return false;
-      }
-    }
-
-    if (!bce_->emitNumberOp(fieldIndex)) {
-      //            [stack] ARRAY? ARRAY INDEX
-      return false;
-    }
-
-    // Don't use CALLELEM here, because the receiver of the call != the receiver
-    // of this getelem. (Specifically, the call receiver is `this`, and the
-    // receiver of this getelem is `.initializers`)
-    if (!bce_->emit1(JSOP_GETELEM)) {
-      //            [stack] ARRAY? FUNC
-      return false;
-    }
-
-    // This is guaranteed to run after super(), so we don't need TDZ checks.
-    if (!bce_->emitGetName(bce_->cx->names().dotThis)) {
-      //            [stack] ARRAY? FUNC THIS
-      return false;
-    }
-
-    if (!bce_->emitCall(JSOP_CALL_IGNORES_RV, 0)) {
-      //            [stack] ARRAY? RVAL
-      return false;
-    }
-
-    if (!bce_->emit1(JSOP_POP)) {
-      //            [stack] ARRAY?
-      return false;
-    }
-  }
-
-  return true;
-}
-
 bool FunctionScriptEmitter::emitEndBody() {
   MOZ_ASSERT(state_ == State::Body);
 
   //                [stack]
 
   if (funbox_->needsFinalYield()) {
     // If we fall off the end of a generator, do a final yield.
     bool needsIteratorResult = funbox_->needsIteratorResult();
--- a/js/src/frontend/FunctionEmitter.h
+++ b/js/src/frontend/FunctionEmitter.h
@@ -258,17 +258,16 @@ class MOZ_STACK_CLASS FunctionScriptEmit
   // WARNING: There shouldn't be any fallible operation for the function
   //          compilation after `initScript` call.
   //          See the comment inside JSScript::fullyInitFromEmitter for
   //          more details.
   MOZ_MUST_USE bool initScript();
 
  private:
   MOZ_MUST_USE bool emitExtraBodyVarScope();
-  MOZ_MUST_USE bool emitInitializeInstanceFields();
 
   // Async functions have implicit try-catch blocks to convert exceptions
   // into promise rejections.
   MOZ_MUST_USE bool emitAsyncFunctionRejectPrologue();
   MOZ_MUST_USE bool emitAsyncFunctionRejectEpilogue();
 };
 
 // Class for emitting function parameters.
--- a/js/src/frontend/Parser.cpp
+++ b/js/src/frontend/Parser.cpp
@@ -6886,25 +6886,25 @@ bool GeneralParser<ParseHandler, Unit>::
   AccessorType atype = ToAccessorType(propType);
   return handler_.addClassMethodDefinition(classMembers, propName, funNode,
                                            atype, isStatic);
 }
 
 template <class ParseHandler, typename Unit>
 bool GeneralParser<ParseHandler, Unit>::finishClassConstructor(
     const ParseContext::ClassStatement& classStmt, HandlePropertyName className,
-    uint32_t classStartOffset, uint32_t classEndOffset, size_t numFields,
-    ListNodeType& classMembers) {
+    HasHeritage hasHeritage, uint32_t classStartOffset, uint32_t classEndOffset,
+    size_t numFields, ListNodeType& classMembers) {
   // Fields cannot re-use the constructor obtained via JSOP_CLASSCONSTRUCTOR or
   // JSOP_DERIVEDCONSTRUCTOR due to needing to emit calls to the field
   // initializers in the constructor. So, synthesize a new one.
   if (classStmt.constructorBox == nullptr && numFields > 0) {
     // synthesizeConstructor assigns to classStmt.constructorBox
     FunctionNodeType synthesizedCtor =
-        synthesizeConstructor(className, classStartOffset);
+        synthesizeConstructor(className, classStartOffset, hasHeritage);
     if (!synthesizedCtor) {
       return false;
     }
 
     MOZ_ASSERT(classStmt.constructorBox != nullptr);
 
     // Note: the *function* has the name of the class, but the *property*
     // containing the function has the name "constructor"
@@ -6933,22 +6933,16 @@ bool GeneralParser<ParseHandler, Unit>::
 
     // Set the same information, but on the lazyScript.
     if (ctorbox->function()->isInterpretedLazy()) {
       ctorbox->function()->lazyScript()->setToStringEnd(classEndOffset);
 
       if (numFields > 0) {
         ctorbox->function()->lazyScript()->setHasThisBinding();
       }
-
-      // Field initializers can be retrieved if the class and constructor are
-      // being compiled at the same time, but we need to stash the field
-      // information if the constructor is being compiled lazily.
-      FieldInitializers fieldInfo(numFields);
-      ctorbox->function()->lazyScript()->setFieldInitializers(fieldInfo);
     }
   }
 
   return true;
 }
 
 template <class ParseHandler, typename Unit>
 typename ParseHandler::ClassNodeType
@@ -7081,18 +7075,19 @@ GeneralParser<ParseHandler, Unit>::class
     if (numFieldKeys > 0) {
       if (!noteDeclaredName(cx_->names().dotFieldKeys, DeclarationKind::Var,
                             namePos)) {
         return null();
       }
     }
 
     classEndOffset = pos().end;
-    if (!finishClassConstructor(classStmt, className, classStartOffset,
-                                classEndOffset, numFields, classMembers)) {
+    if (!finishClassConstructor(classStmt, className, hasHeritage,
+                                classStartOffset, classEndOffset, numFields,
+                                classMembers)) {
       return null();
     }
 
     if (className) {
       // The inner name is immutable.
       if (!noteDeclaredName(className, DeclarationKind::Const, namePos)) {
         return null();
       }
@@ -7135,18 +7130,21 @@ GeneralParser<ParseHandler, Unit>::class
 
   return handler_.newClass(nameNode, classHeritage, classBlock,
                            TokenPos(classStartOffset, classEndOffset));
 }
 
 template <class ParseHandler, typename Unit>
 typename ParseHandler::FunctionNodeType
 GeneralParser<ParseHandler, Unit>::synthesizeConstructor(
-    HandleAtom className, uint32_t classNameOffset) {
-  FunctionSyntaxKind functionSyntaxKind = FunctionSyntaxKind::ClassConstructor;
+    HandleAtom className, uint32_t classNameOffset, HasHeritage hasHeritage) {
+  FunctionSyntaxKind functionSyntaxKind =
+      hasHeritage == HasHeritage::Yes
+          ? FunctionSyntaxKind::DerivedClassConstructor
+          : FunctionSyntaxKind::ClassConstructor;
 
   // Create the function object.
   RootedFunction fun(cx_, newFunction(className, functionSyntaxKind,
                                       GeneratorKind::NotGenerator,
                                       FunctionAsyncKind::SyncFunction));
   if (!fun) {
     return null();
   }
@@ -7204,16 +7202,52 @@ GeneralParser<ParseHandler, Unit>::synth
   // One might expect a noteUsedName(".initializers") here. See comment in
   // GeneralParser<ParseHandler, Unit>::classDefinition on why it's not here.
 
   bool canSkipLazyClosedOverBindings = handler_.canSkipLazyClosedOverBindings();
   if (!pc_->declareFunctionThis(usedNames_, canSkipLazyClosedOverBindings)) {
     return null();
   }
 
+  if (hasHeritage == HasHeritage::Yes) {
+    NameNodeType thisName = newThisName();
+    if (!thisName) {
+      return null();
+    }
+
+    UnaryNodeType superBase =
+        handler_.newSuperBase(thisName, synthesizedBodyPos);
+    if (!superBase) {
+      return null();
+    }
+
+    ListNodeType arguments = handler_.newArguments(synthesizedBodyPos);
+    if (!arguments) {
+      return null();
+    }
+
+    CallNodeType superCall = handler_.newSuperCall(superBase, arguments, false);
+    if (!superCall) {
+      return null();
+    }
+
+    BinaryNodeType setThis = handler_.newSetThis(thisName, superCall);
+    if (!setThis) {
+      return null();
+    }
+
+    UnaryNodeType exprStatement =
+        handler_.newExprStatement(setThis, synthesizedBodyPos.end);
+    if (!exprStatement) {
+      return null();
+    }
+
+    handler_.addStatementToList(stmtList, exprStatement);
+  }
+
   auto initializerBody = finishLexicalScope(lexicalScope, stmtList);
   if (!initializerBody) {
     return null();
   }
   handler_.setBeginPosition(initializerBody, stmtList);
   handler_.setEndPosition(initializerBody, stmtList);
 
   handler_.setFunctionBody(funNode, initializerBody);
--- a/js/src/frontend/Parser.h
+++ b/js/src/frontend/Parser.h
@@ -1308,25 +1308,26 @@ class MOZ_STACK_CLASS GeneralParser : pu
   MOZ_MUST_USE bool classMember(
       YieldHandling yieldHandling, DefaultHandling defaultHandling,
       const ParseContext::ClassStatement& classStmt,
       HandlePropertyName className, uint32_t classStartOffset,
       HasHeritage hasHeritage, size_t& numFieldsWithInitializers,
       size_t& numFieldKeys, ListNodeType& classMembers, bool* done);
   MOZ_MUST_USE bool finishClassConstructor(
       const ParseContext::ClassStatement& classStmt,
-      HandlePropertyName className, uint32_t classStartOffset,
-      uint32_t classEndOffset, size_t numFieldsWithInitializers,
-      ListNodeType& classMembers);
+      HandlePropertyName className, HasHeritage hasHeritage,
+      uint32_t classStartOffset, uint32_t classEndOffset,
+      size_t numFieldsWithInitializers, ListNodeType& classMembers);
 
   FunctionNodeType fieldInitializerOpt(YieldHandling yieldHandling,
                                        HasHeritage hasHeritage, Node name,
                                        HandleAtom atom, size_t& numFieldKeys);
   FunctionNodeType synthesizeConstructor(HandleAtom className,
-                                         uint32_t classNameOffset);
+                                         uint32_t classNameOffset,
+                                         HasHeritage hasHeritage);
 
   bool checkBindingIdentifier(PropertyName* ident, uint32_t offset,
                               YieldHandling yieldHandling,
                               TokenKind hint = TokenKind::Limit);
 
   PropertyName* labelOrIdentifierReference(YieldHandling yieldHandling);
 
   PropertyName* labelIdentifier(YieldHandling yieldHandling) {
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/fields/super.js
@@ -0,0 +1,47 @@
+// |jit-test| --enable-experimental-fields
+
+class Base {
+}
+
+class C extends Base {
+  field;
+}
+new C();
+
+var D = class extends Base {
+  field;
+};
+new D();
+
+class E extends Base {
+  field;
+  constructor() {
+    super();
+  }
+};
+new E();
+
+class F extends Base {
+  constructor() {
+    super();
+  }
+  field;
+};
+new F();
+
+class G extends Base {
+  field2 = 2;
+  constructor() {
+    super();
+  }
+  field3 = 3;
+};
+new G();
+
+class H extends Base {
+  field = 2;
+  constructor() {
+    eval("super()");
+  }
+};
+new H();
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/for-of/throw-during-nested-break.js
@@ -0,0 +1,29 @@
+var progress = "";
+
+function* wrapNoThrow() {
+    let iter = {
+        [Symbol.iterator]() { return this; },
+        next() { return { value: 10, iter: false }; },
+        return() { progress += " throw"; throw "nonsense"; }
+    };
+    for (const i of iter)
+        yield i;
+}
+
+function foo() {
+    try {
+        var badIter = wrapNoThrow();
+        loop: for (var i of badIter) {
+            progress += "outerloop";
+            try {
+                for (i of [1,2,3]) {
+                    progress += " innerloop";
+                    break loop;
+                }
+            } catch (e) { progress += " BAD CATCH"; }
+        }
+    } catch (e) { progress += " goodcatch"; }
+}
+
+foo();
+assertEq(progress, "outerloop innerloop throw goodcatch");
--- a/js/src/tests/jstests.list
+++ b/js/src/tests/jstests.list
@@ -646,20 +646,16 @@ skip script test262/language/statements/
 skip script test262/language/statements/class/elements/regular-definitions-string-literal-names.js
 skip script test262/language/statements/class/elements/same-line-async-gen-literal-names-asi.js
 skip script test262/language/statements/class/elements/same-line-async-method-literal-names-asi.js
 skip script test262/language/statements/class/elements/same-line-gen-literal-names-asi.js
 skip script test262/language/statements/class/elements/same-line-method-literal-names-asi.js
 skip script test262/language/statements/class/elements/syntax/valid/grammar-fields-multi-line.js
 skip script test262/language/statements/class/elements/wrapped-in-sc-literal-names-asi.js
 
-# https://bugzilla.mozilla.org/show_bug.cgi?id=1534721
-skip script test262/language/expressions/class/elements/fields-run-once-on-double-super.js
-skip script test262/language/expressions/class/constructor-this-tdz-during-initializers.js
-
 # https://bugzilla.mozilla.org/show_bug.cgi?id=1542406
 skip script test262/language/expressions/class/elements/derived-cls-direct-eval-err-contains-supercall-1.js
 skip script test262/language/expressions/class/elements/derived-cls-direct-eval-err-contains-supercall-2.js
 skip script test262/language/expressions/class/elements/derived-cls-direct-eval-err-contains-supercall.js
 skip script test262/language/expressions/class/elements/derived-cls-direct-eval-err-contains-superproperty-1.js
 skip script test262/language/expressions/class/elements/derived-cls-direct-eval-err-contains-superproperty-2.js
 skip script test262/language/expressions/class/elements/derived-cls-indirect-eval-err-contains-supercall-1.js
 skip script test262/language/expressions/class/elements/derived-cls-indirect-eval-err-contains-supercall-2.js
--- a/js/src/vm/Interpreter.h
+++ b/js/src/vm/Interpreter.h
@@ -343,23 +343,63 @@ class MOZ_STACK_CLASS TryNoteIter {
        *
        *  To make this work, we use JSTRY_FOR_OF_ITERCLOSE try-notes,
        *  which cover the range of the abnormal completion. When
        *  looking up trynotes, a for-of iterclose note indicates that
        *  the enclosing for-of has just been terminated. As a result,
        *  trynotes within that for-of are no longer active. When we
        *  see a for-of-iterclose, we skip ahead in the trynotes list
        *  until we see the matching for-of.
+       *
+       *  Breaking out of multiple levels of for-of at once is handled
+       *  using nested FOR_OF_ITERCLOSE try-notes. Consider this code:
+       *
+       *  try {
+       *    loop: for (i of first) {
+       *      <A>
+       *      for (j of second) {
+       *        <B>
+       *        break loop; // <C1/2>
+       *      }
+       *    }
+       *  } catch {...}
+       *
+       *  Here is the mapping from various PCs to try-notes that we
+       *  want to return:
+       *
+       *        A     B     C1     C2
+       *        |     |     |      |
+       *        |     |     |  [---|---]     ForOfIterClose (outer)
+       *        |     | [---|------|---]     ForOfIterClose (inner)
+       *        |  [--X-----|------|----]    ForOf (inner)
+       *    [---X-----------X------|-----]   ForOf (outer)
+       *  [------------------------X------]  TryCatch
+       *
+       *  - At A, we find the outer for-of.
+       *  - At B, we find the inner for-of.
+       *  - At C1, we find one FOR_OF_ITERCLOSE, skip past one FOR_OF, and find
+       *    the outer for-of. (This occurs if an exception is thrown while
+       *    closing the inner iterator.)
+       *  - At C2, we find two FOR_OF_ITERCLOSE, skip past two FOR_OF, and reach
+       *    the outer try-catch. (This occurs if an exception is thrown while
+       *    closing the outer iterator.)
        */
       if (tn_->kind == JSTRY_FOR_OF_ITERCLOSE) {
+        uint32_t iterCloseDepth = 1;
         do {
           ++tn_;
           MOZ_ASSERT(tn_ != tnEnd_);
-          MOZ_ASSERT_IF(pcInRange(), tn_->kind != JSTRY_FOR_OF_ITERCLOSE);
-        } while (!(pcInRange() && tn_->kind == JSTRY_FOR_OF));
+          if (pcInRange()) {
+            if (tn_->kind == JSTRY_FOR_OF_ITERCLOSE) {
+              iterCloseDepth++;
+            } else if (tn_->kind == JSTRY_FOR_OF) {
+              iterCloseDepth--;
+            }
+          }
+        } while (iterCloseDepth > 0);
 
         // Advance to trynote following the enclosing for-of.
         continue;
       }
 
       /*
        * We have a note that covers the exception pc but we must check
        * whether the interpreter has already executed the corresponding
--- a/js/src/vm/JSScript.h
+++ b/js/src/vm/JSScript.h
@@ -1242,16 +1242,44 @@ class ScriptSourceObject : public Native
     PRIVATE_SLOT,
     RESERVED_SLOTS
   };
 };
 
 enum class GeneratorKind : bool { NotGenerator, Generator };
 enum class FunctionAsyncKind : bool { SyncFunction, AsyncFunction };
 
+struct FieldInitializers {
+#ifdef DEBUG
+  bool valid;
+#endif
+  // This struct will eventually have a vector of constant values for optimizing
+  // field initializers.
+  size_t numFieldInitializers;
+
+  explicit FieldInitializers(size_t numFieldInitializers)
+      :
+#ifdef DEBUG
+        valid(true),
+#endif
+        numFieldInitializers(numFieldInitializers) {
+  }
+
+  static FieldInitializers Invalid() { return FieldInitializers(); }
+
+ private:
+  FieldInitializers()
+      :
+#ifdef DEBUG
+        valid(false),
+#endif
+        numFieldInitializers(0) {
+  }
+};
+
 /*
  * NB: after a successful XDR_DECODE, XDRScript callers must do any required
  * subsequent set-up of owning function or script object and then call
  * CallNewScriptHook.
  */
 template <XDRMode mode>
 XDRResult XDRScript(XDRState<mode>* xdr, HandleScope enclosingScope,
                     HandleScriptSourceObject sourceObject, HandleFunction fun,
@@ -1355,16 +1383,18 @@ class alignas(JS::Value) PrivateScriptDa
     uint32_t offset;
     uint32_t length;
   };
 
   // Concrete Fields
   PackedOffsets packedOffsets = {};  // zeroes
   uint32_t nscopes = 0;
 
+  js::FieldInitializers fieldInitializers_ = js::FieldInitializers::Invalid();
+
   // Translate an offset into a concrete pointer.
   template <typename T>
   T* offsetToPointer(size_t offset) {
     uintptr_t base = reinterpret_cast<uintptr_t>(this);
     uintptr_t elem = base + offset;
     return reinterpret_cast<T*>(elem);
   }
 
@@ -1426,16 +1456,20 @@ class alignas(JS::Value) PrivateScriptDa
   // Fast tests for if array exists
   bool hasConsts() const { return packedOffsets.constsSpanOffset != 0; }
   bool hasObjects() const { return packedOffsets.objectsSpanOffset != 0; }
   bool hasTryNotes() const { return packedOffsets.tryNotesSpanOffset != 0; }
   bool hasScopeNotes() const { return packedOffsets.scopeNotesSpanOffset != 0; }
   bool hasResumeOffsets() const {
     return packedOffsets.resumeOffsetsSpanOffset != 0;
   }
+  void setFieldInitializers(FieldInitializers fieldInitializers) {
+    fieldInitializers_ = fieldInitializers;
+  }
+  const FieldInitializers& getFieldInitializers() { return fieldInitializers_; }
 
   // Allocate a new PrivateScriptData. Headers and GCPtrs are initialized.
   // The size of allocation is returned as an out parameter.
   static PrivateScriptData* new_(JSContext* cx, uint32_t nscopes,
                                  uint32_t nconsts, uint32_t nobjects,
                                  uint32_t ntrynotes, uint32_t nscopenotes,
                                  uint32_t nresumeoffsets, uint32_t* dataSize);
 
@@ -2278,16 +2312,26 @@ class JSScript : public js::gc::TenuredC
   bool hasMappedArgsObj() const {
     return hasFlag(ImmutableFlags::HasMappedArgsObj);
   }
 
   bool functionHasThisBinding() const {
     return hasFlag(ImmutableFlags::FunctionHasThisBinding);
   }
 
+  void setFieldInitializers(js::FieldInitializers fieldInitializers) {
+    MOZ_ASSERT(data_);
+    data_->setFieldInitializers(fieldInitializers);
+  }
+
+  const js::FieldInitializers& getFieldInitializers() const {
+    MOZ_ASSERT(data_);
+    return data_->getFieldInitializers();
+  }
+
   /*
    * Arguments access (via JSOP_*ARG* opcodes) must access the canonical
    * location for the argument. If an arguments object exists AND it's mapped
    * ('arguments' aliases formals), then all access must go through the
    * arguments object. Otherwise, the local slot is the canonical location for
    * the arguments. Note: if a formal is aliased through the scope chain, then
    * script->formalIsAliased and JSOP_*ARG* opcodes won't be emitted at all.
    */
@@ -2853,44 +2897,16 @@ class JSScript : public js::gc::TenuredC
 
 /* If this fails, add/remove padding within JSScript. */
 static_assert(
     sizeof(JSScript) % js::gc::CellAlignBytes == 0,
     "Size of JSScript must be an integral multiple of js::gc::CellAlignBytes");
 
 namespace js {
 
-struct FieldInitializers {
-#ifdef DEBUG
-  bool valid;
-#endif
-  // This struct will eventually have a vector of constant values for optimizing
-  // field initializers.
-  size_t numFieldInitializers;
-
-  explicit FieldInitializers(size_t numFieldInitializers)
-      :
-#ifdef DEBUG
-        valid(true),
-#endif
-        numFieldInitializers(numFieldInitializers) {
-  }
-
-  static FieldInitializers Invalid() { return FieldInitializers(); }
-
- private:
-  FieldInitializers()
-      :
-#ifdef DEBUG
-        valid(false),
-#endif
-        numFieldInitializers(0) {
-  }
-};
-
 // Variable-length data for LazyScripts. Contains vector of inner functions and
 // vector of captured property ids.
 class alignas(uintptr_t) LazyScriptData final {
  private:
   uint32_t numClosedOverBindings_ = 0;
   uint32_t numInnerFunctions_ = 0;
 
   FieldInitializers fieldInitializers_ = FieldInitializers::Invalid();
@@ -3265,19 +3281,19 @@ class LazyScript : public gc::TenuredCel
   }
   void setHasThisBinding() { setFlag(ImmutableFlags::FunctionHasThisBinding); }
 
   void setFieldInitializers(FieldInitializers fieldInitializers) {
     MOZ_ASSERT(lazyData_);
     lazyData_->fieldInitializers_ = fieldInitializers;
   }
 
-  FieldInitializers getFieldInitializers() const {
-    return lazyData_ ? lazyData_->fieldInitializers_
-                     : FieldInitializers::Invalid();
+  const FieldInitializers& getFieldInitializers() const {
+    MOZ_ASSERT(lazyData_);
+    return lazyData_->fieldInitializers_;
   }
 
   const char* filename() const { return scriptSource()->filename(); }
   uint32_t sourceStart() const { return sourceStart_; }
   uint32_t sourceEnd() const { return sourceEnd_; }
   uint32_t sourceLength() const { return sourceEnd_ - sourceStart_; }
   uint32_t toStringStart() const { return toStringStart_; }
   uint32_t toStringEnd() const { return toStringEnd_; }
--- a/js/xpconnect/src/XPCComponents.cpp
+++ b/js/xpconnect/src/XPCComponents.cpp
@@ -2221,17 +2221,17 @@ class WrappedJSHolder : public nsISuppor
 
  private:
   virtual ~WrappedJSHolder() {}
 };
 
 NS_IMPL_ADDREF(WrappedJSHolder)
 NS_IMPL_RELEASE(WrappedJSHolder)
 
-// nsINamed is always supported by nsXPCWrappedJSClass.
+// nsINamed is always supported by nsXPCWrappedJS::DelegatedQueryInterface().
 // We expose this interface only for the identity in telemetry analysis.
 NS_INTERFACE_TABLE_HEAD(WrappedJSHolder)
   if (aIID.Equals(NS_GET_IID(nsINamed))) {
     return mWrappedJS->QueryInterface(aIID, aInstancePtr);
   }
   NS_INTERFACE_TABLE0(WrappedJSHolder)
 NS_INTERFACE_TABLE_TAIL
 
--- a/js/xpconnect/src/XPCWrappedJS.cpp
+++ b/js/xpconnect/src/XPCWrappedJS.cpp
@@ -171,17 +171,17 @@ nsXPCWrappedJS::AggregatedQueryInterface
   // we don't want to do this check twice in one call in the normal case:
   // once in QueryInterface and once in DelegatedQueryInterface.
   if (aIID.Equals(NS_GET_IID(nsIXPConnectWrappedJS))) {
     NS_ADDREF(this);
     *aInstancePtr = (void*)static_cast<nsIXPConnectWrappedJS*>(this);
     return NS_OK;
   }
 
-  return nsXPCWrappedJSClass::DelegatedQueryInterface(this, aIID, aInstancePtr);
+  return DelegatedQueryInterface(aIID, aInstancePtr);
 }
 
 NS_IMETHODIMP
 nsXPCWrappedJS::QueryInterface(REFNSIID aIID, void** aInstancePtr) {
   if (nullptr == aInstancePtr) {
     MOZ_ASSERT(false, "null pointer");
     return NS_ERROR_NULL_POINTER;
   }
@@ -222,17 +222,17 @@ nsXPCWrappedJS::QueryInterface(REFNSIID 
 
   nsISupports* outer = GetAggregatedNativeObject();
   if (outer) {
     return outer->QueryInterface(aIID, aInstancePtr);
   }
 
   // else...
 
-  return nsXPCWrappedJSClass::DelegatedQueryInterface(this, aIID, aInstancePtr);
+  return DelegatedQueryInterface(aIID, aInstancePtr);
 }
 
 // For a description of nsXPCWrappedJS lifetime and reference counting, see
 // the comment at the top of this file.
 
 MozExternalRefCountType nsXPCWrappedJS::AddRef(void) {
   MOZ_RELEASE_ASSERT(NS_IsMainThread(),
                      "nsXPCWrappedJS::AddRef called off main thread");
@@ -324,23 +324,22 @@ nsresult nsXPCWrappedJS::GetNewOrUsed(JS
                                       nsXPCWrappedJS** wrapperResult) {
   // Do a release-mode assert against accessing nsXPCWrappedJS off-main-thread.
   MOZ_RELEASE_ASSERT(NS_IsMainThread(),
                      "nsXPCWrappedJS::GetNewOrUsed called off main thread");
 
   MOZ_RELEASE_ASSERT(js::GetContextCompartment(cx) ==
                      js::GetObjectCompartment(jsObj));
 
-  const nsXPTInterfaceInfo* info = nsXPCWrappedJSClass::GetInterfaceInfo(aIID);
+  const nsXPTInterfaceInfo* info = GetInterfaceInfo(aIID);
   if (!info) {
     return NS_ERROR_FAILURE;
   }
 
-  JS::RootedObject rootJSObj(cx,
-                             nsXPCWrappedJSClass::GetRootJSObject(cx, jsObj));
+  JS::RootedObject rootJSObj(cx, GetRootJSObject(cx, jsObj));
   if (!rootJSObj) {
     return NS_ERROR_FAILURE;
   }
 
   xpc::CompartmentPrivate* rootComp = xpc::CompartmentPrivate::Get(rootJSObj);
   MOZ_ASSERT(rootComp);
 
   // Find any existing wrapper.
@@ -361,17 +360,17 @@ nsresult nsXPCWrappedJS::GetNewOrUsed(JS
       wrapper.forget(wrapperResult);
       return NS_OK;
     }
   } else if (rootJSObj != jsObj) {
     // Make a new root wrapper, because there is no existing
     // root wrapper, and the wrapper we are trying to make isn't
     // a root.
     const nsXPTInterfaceInfo* rootInfo =
-        nsXPCWrappedJSClass::GetInterfaceInfo(NS_GET_IID(nsISupports));
+        GetInterfaceInfo(NS_GET_IID(nsISupports));
     if (!rootInfo) {
       return NS_ERROR_FAILURE;
     }
 
     root = new nsXPCWrappedJS(cx, rootJSObj, rootInfo, nullptr, &rv);
     if (NS_FAILED(rv)) {
       return rv;
     }
@@ -384,20 +383,17 @@ nsresult nsXPCWrappedJS::GetNewOrUsed(JS
   }
   wrapper.forget(wrapperResult);
   return NS_OK;
 }
 
 nsXPCWrappedJS::nsXPCWrappedJS(JSContext* cx, JSObject* aJSObj,
                                const nsXPTInterfaceInfo* aInfo,
                                nsXPCWrappedJS* root, nsresult* rv)
-    : mJSObj(aJSObj),
-      mInfo(aInfo),
-      mRoot(root ? root : this),
-      mNext(nullptr) {
+    : mJSObj(aJSObj), mInfo(aInfo), mRoot(root ? root : this), mNext(nullptr) {
   *rv = InitStub(mInfo->IID());
   // Continue even in the failure case, so that our refcounting/Destroy
   // behavior works correctly.
 
   // There is an extra AddRef to support weak references to wrappers
   // that are subject to finalization. See the top of the file for more
   // details.
   NS_ADDREF_THIS();
@@ -576,29 +572,16 @@ nsXPCWrappedJS* nsXPCWrappedJS::FindInhe
       return cur;
     }
   }
 
   return nullptr;
 }
 
 NS_IMETHODIMP
-nsXPCWrappedJS::CallMethod(uint16_t methodIndex, const nsXPTMethodInfo* info,
-                           nsXPTCMiniVariant* params) {
-  // Do a release-mode assert against accessing nsXPCWrappedJS off-main-thread.
-  MOZ_RELEASE_ASSERT(NS_IsMainThread(),
-                     "nsXPCWrappedJS::CallMethod called off main thread");
-
-  if (!IsValid()) {
-    return NS_ERROR_UNEXPECTED;
-  }
-  return nsXPCWrappedJSClass::CallMethod(this, methodIndex, info, params);
-}
-
-NS_IMETHODIMP
 nsXPCWrappedJS::GetInterfaceIID(nsIID** iid) {
   MOZ_ASSERT(iid, "bad param");
 
   *iid = GetIID().Clone();
   return NS_OK;
 }
 
 void nsXPCWrappedJS::SystemIsBeingShutDown() {
--- a/js/xpconnect/src/XPCWrappedJSClass.cpp
+++ b/js/xpconnect/src/XPCWrappedJSClass.cpp
@@ -91,35 +91,34 @@ class MOZ_STACK_CLASS AutoSavePendingRes
   ~AutoSavePendingResult() { mXPCContext->SetPendingResult(mSavedResult); }
 
  private:
   XPCJSContext* mXPCContext;
   nsresult mSavedResult;
 };
 
 // static
-const nsXPTInterfaceInfo*
-nsXPCWrappedJSClass::GetInterfaceInfo(REFNSIID aIID) {
+const nsXPTInterfaceInfo* nsXPCWrappedJS::GetInterfaceInfo(REFNSIID aIID) {
   const nsXPTInterfaceInfo* info = nsXPTInterfaceInfo::ByIID(aIID);
   if (!info) {
     return nullptr;
   }
 
   if (info->IsBuiltinClass() || !nsXPConnect::IsISupportsDescendant(info)) {
     return nullptr;
   }
 
   return info;
 }
 
 // static
-JSObject* nsXPCWrappedJSClass::CallQueryInterfaceOnJSObject(JSContext* cx,
-                                                            JSObject* jsobjArg,
-                                                            HandleObject scope,
-                                                            REFNSIID aIID) {
+JSObject* nsXPCWrappedJS::CallQueryInterfaceOnJSObject(JSContext* cx,
+                                                       JSObject* jsobjArg,
+                                                       HandleObject scope,
+                                                       REFNSIID aIID) {
   js::AssertSameCompartment(scope, jsobjArg);
 
   RootedObject jsobj(cx, jsobjArg);
   RootedValue arg(cx);
   RootedValue retval(cx);
   RootedObject retObj(cx);
   RootedValue fun(cx);
 
@@ -300,58 +299,62 @@ nsCString GetFunctionName(JSContext* cx,
   return displayName;
 }
 
 }  // anonymous namespace
 
 /***************************************************************************/
 
 // static
-nsresult nsXPCWrappedJSClass::DelegatedQueryInterface(nsXPCWrappedJS* self,
-                                                      REFNSIID aIID,
-                                                      void** aInstancePtr) {
+nsresult nsXPCWrappedJS::DelegatedQueryInterface(REFNSIID aIID,
+                                                 void** aInstancePtr) {
   if (aIID.Equals(NS_GET_IID(nsIXPConnectJSObjectHolder))) {
-    NS_ADDREF(self);
-    *aInstancePtr = (void*)static_cast<nsIXPConnectJSObjectHolder*>(self);
+    // This needs to call NS_ADDREF directly instead of using nsCOMPtr<>,
+    // because the latter does a QI in an assert, and we're already in a QI, so
+    // it would cause infinite recursion.
+    NS_ADDREF(this);
+    *aInstancePtr = (void*)static_cast<nsIXPConnectJSObjectHolder*>(this);
     return NS_OK;
   }
 
   // We can't have a cached wrapper.
   if (aIID.Equals(NS_GET_IID(nsWrapperCache))) {
     *aInstancePtr = nullptr;
     return NS_NOINTERFACE;
   }
 
   // QI on an XPCWrappedJS can run script, so we need an AutoEntryScript.
   // This is inherently Gecko-specific.
   // We check both nativeGlobal and nativeGlobal->GetGlobalJSObject() even
   // though we have derived nativeGlobal from the JS global, because we know
   // there are cases where this can happen. See bug 1094953.
-  RootedObject obj(RootingCx(), self->GetJSObject());
+  RootedObject obj(RootingCx(), GetJSObject());
   nsIGlobalObject* nativeGlobal = NativeGlobal(js::UncheckedUnwrap(obj));
   NS_ENSURE_TRUE(nativeGlobal, NS_ERROR_FAILURE);
   NS_ENSURE_TRUE(nativeGlobal->GetGlobalJSObject(), NS_ERROR_FAILURE);
   AutoEntryScript aes(nativeGlobal, "XPCWrappedJS QueryInterface",
                       /* aIsMainThread = */ true);
   XPCCallContext ccx(aes.cx());
   if (!ccx.IsValid()) {
     *aInstancePtr = nullptr;
     return NS_NOINTERFACE;
   }
 
-  // We passed the unwrapped object's global to AutoEntryScript so we now need
-  // to enter the realm corresponding with the (maybe wrapper) object.
-  RootedObject objScope(RootingCx(), self->GetJSObjectGlobal());
+  // We now need to enter the realm of the actual JSObject* we are pointing at.
+  // But that may be a cross-compartment wrapper and therefore not have a
+  // well-defined realm, so enter the realm of the global that we grabbed back
+  // when we started pointing to our JSObject*.
+  RootedObject objScope(RootingCx(), GetJSObjectGlobal());
   JSAutoRealm ar(aes.cx(), objScope);
 
   // We support nsISupportsWeakReference iff the root wrapped JSObject
   // claims to support it in its QueryInterface implementation.
   if (aIID.Equals(NS_GET_IID(nsISupportsWeakReference))) {
     // We only want to expose one implementation from our aggregate.
-    nsXPCWrappedJS* root = self->GetRootWrapper();
+    nsXPCWrappedJS* root = GetRootWrapper();
     RootedObject rootScope(ccx, root->GetJSObjectGlobal());
 
     // Fail if JSObject doesn't claim support for nsISupportsWeakReference
     if (!root->IsValid() || !CallQueryInterfaceOnJSObject(
                                 ccx, root->GetJSObject(), rootScope, aIID)) {
       *aInstancePtr = nullptr;
       return NS_NOINTERFACE;
     }
@@ -380,21 +383,21 @@ nsresult nsXPCWrappedJSClass::DelegatedQ
       }
       nsCOMPtr<nsISimpleEnumerator> res = new XPCWrappedJSIterator(jsEnum);
       res.forget(aInstancePtr);
       return NS_OK;
     }
   }
 
   // Checks for any existing wrapper explicitly constructed for this iid.
-  // This includes the current 'self' wrapper. This also deals with the
+  // This includes the current wrapper. This also deals with the
   // nsISupports case (for which it returns mRoot).
   // Also check if asking for an interface from which one of our wrappers
   // inherits.
-  if (nsXPCWrappedJS* sibling = self->FindOrFindInherited(aIID)) {
+  if (nsXPCWrappedJS* sibling = FindOrFindInherited(aIID)) {
     NS_ADDREF(sibling);
     *aInstancePtr = sibling->GetXPTCStub();
     return NS_OK;
   }
 
   // Check if the desired interface is a function interface. If so, we don't
   // want to QI, because the function almost certainly doesn't have a
   // QueryInterface property, and doesn't need one.
@@ -452,33 +455,32 @@ nsresult nsXPCWrappedJSClass::DelegatedQ
 
   // else...
   // no can do
   *aInstancePtr = nullptr;
   return NS_NOINTERFACE;
 }
 
 // static
-JSObject* nsXPCWrappedJSClass::GetRootJSObject(JSContext* cx,
-                                               JSObject* aJSObjArg) {
+JSObject* nsXPCWrappedJS::GetRootJSObject(JSContext* cx, JSObject* aJSObjArg) {
   RootedObject aJSObj(cx, aJSObjArg);
   RootedObject global(cx, JS::CurrentGlobalOrNull(cx));
   JSObject* result =
       CallQueryInterfaceOnJSObject(cx, aJSObj, global, NS_GET_IID(nsISupports));
   if (!result) {
     result = aJSObj;
   }
   return js::UncheckedUnwrap(result);
 }
 
 // static
-bool nsXPCWrappedJSClass::GetArraySizeFromParam(const nsXPTMethodInfo* method,
-                                                const nsXPTType& type,
-                                                nsXPTCMiniVariant* nativeParams,
-                                                uint32_t* result) {
+bool nsXPCWrappedJS::GetArraySizeFromParam(const nsXPTMethodInfo* method,
+                                           const nsXPTType& type,
+                                           nsXPTCMiniVariant* nativeParams,
+                                           uint32_t* result) {
   if (type.Tag() != nsXPTType::T_LEGACY_ARRAY &&
       type.Tag() != nsXPTType::T_PSTRING_SIZE_IS &&
       type.Tag() != nsXPTType::T_PWSTRING_SIZE_IS) {
     *result = 0;
     return true;
   }
 
   uint8_t argnum = type.ArgNum();
@@ -496,19 +498,20 @@ bool nsXPCWrappedJSClass::GetArraySizeFr
     *result = *(uint32_t*)nativeParams[argnum].val.p;
   } else {
     *result = nativeParams[argnum].val.u32;
   }
   return true;
 }
 
 // static
-bool nsXPCWrappedJSClass::GetInterfaceTypeFromParam(
-    const nsXPTMethodInfo* method, const nsXPTType& type,
-    nsXPTCMiniVariant* nativeParams, nsID* result) {
+bool nsXPCWrappedJS::GetInterfaceTypeFromParam(const nsXPTMethodInfo* method,
+                                               const nsXPTType& type,
+                                               nsXPTCMiniVariant* nativeParams,
+                                               nsID* result) {
   result->Clear();
 
   const nsXPTType& inner = type.InnermostType();
   if (inner.Tag() == nsXPTType::T_INTERFACE) {
     // Directly get IID from nsXPTInterfaceInfo.
     if (!inner.GetInterface()) {
       return false;
     }
@@ -536,19 +539,19 @@ bool nsXPCWrappedJSClass::GetInterfaceTy
     }
 
     *result = *(nsID*)ptr;
   }
   return true;
 }
 
 // static
-void nsXPCWrappedJSClass::CleanupOutparams(const nsXPTMethodInfo* info,
-                                           nsXPTCMiniVariant* nativeParams,
-                                           bool inOutOnly, uint8_t count) {
+void nsXPCWrappedJS::CleanupOutparams(const nsXPTMethodInfo* info,
+                                      nsXPTCMiniVariant* nativeParams,
+                                      bool inOutOnly, uint8_t count) {
   // clean up any 'out' params handed in
   for (uint8_t i = 0; i < count; i++) {
     const nsXPTParamInfo& param = info->GetParam(i);
     if (!param.IsOut()) {
       continue;
     }
 
     MOZ_ASSERT(param.IsIndirect(), "Outparams are always indirect");
@@ -572,20 +575,22 @@ void nsXPCWrappedJSClass::CleanupOutpara
     // Ensure our parameters are in a clean state. Complex values are always
     // handled by CleanupValue, and others have a valid null representation.
     if (!param.Type().IsComplex()) {
       param.Type().ZeroValue(nativeParams[i].val.p);
     }
   }
 }
 
-nsresult nsXPCWrappedJSClass::CheckForException(
-    XPCCallContext& ccx, AutoEntryScript& aes, HandleObject aObj,
-    const char* aPropertyName, const char* anInterfaceName,
-    Exception* aSyntheticException) {
+nsresult nsXPCWrappedJS::CheckForException(XPCCallContext& ccx,
+                                           AutoEntryScript& aes,
+                                           HandleObject aObj,
+                                           const char* aPropertyName,
+                                           const char* anInterfaceName,
+                                           Exception* aSyntheticException) {
   JSContext* cx = ccx.GetJSContext();
   MOZ_ASSERT(cx == aes.cx());
   RefPtr<Exception> xpc_exception = aSyntheticException;
   /* this one would be set by our error reporter */
 
   XPCJSContext* xpccx = ccx.GetContext();
 
   // Get this right away in case we do something below to cause JS code
@@ -730,65 +735,74 @@ nsresult nsXPCWrappedJSClass::CheckForEx
     // see if JS code signaled failure result without throwing exception
     if (NS_FAILED(pending_result)) {
       return pending_result;
     }
   }
   return NS_ERROR_FAILURE;
 }
 
-nsresult nsXPCWrappedJSClass::CallMethod(nsXPCWrappedJS* wrapper,
-                                         uint16_t methodIndex,
-                                         const nsXPTMethodInfo* info,
-                                         nsXPTCMiniVariant* nativeParams) {
+NS_IMETHODIMP
+nsXPCWrappedJS::CallMethod(uint16_t methodIndex, const nsXPTMethodInfo* info,
+                           nsXPTCMiniVariant* nativeParams) {
+  // Do a release-mode assert against accessing nsXPCWrappedJS off-main-thread.
+  MOZ_RELEASE_ASSERT(NS_IsMainThread(),
+                     "nsXPCWrappedJS::CallMethod called off main thread");
+
+  if (!IsValid()) {
+    return NS_ERROR_UNEXPECTED;
+  }
+
   Value* sp = nullptr;
   Value* argv = nullptr;
   uint8_t i;
   nsresult retval = NS_ERROR_FAILURE;
   bool success;
   bool readyToDoTheCall = false;
   nsID param_iid;
   bool foundDependentParam;
 
   // We're about to call into script via an XPCWrappedJS, so we need an
   // AutoEntryScript. This is probably Gecko-specific at this point, and
   // definitely will be when we turn off XPConnect for the web.
-  RootedObject obj(RootingCx(), wrapper->GetJSObject());
+  RootedObject obj(RootingCx(), GetJSObject());
   nsIGlobalObject* nativeGlobal = NativeGlobal(js::UncheckedUnwrap(obj));
   AutoEntryScript aes(nativeGlobal, "XPCWrappedJS method call",
                       /* aIsMainThread = */ true);
   XPCCallContext ccx(aes.cx());
   if (!ccx.IsValid()) {
     return retval;
   }
 
   JSContext* cx = ccx.GetJSContext();
 
   if (!cx || !info->IsReflectable()) {
     return NS_ERROR_FAILURE;
   }
 
-  const nsXPTInterfaceInfo* interfaceInfo = wrapper->GetInfo();
+  const nsXPTInterfaceInfo* interfaceInfo = GetInfo();
   JS::RootedId id(cx);
   const char* name;
   nsAutoCString symbolName;
   if (info->IsSymbol()) {
     info->GetSymbolDescription(cx, symbolName);
     name = symbolName.get();
     id = SYMBOL_TO_JSID(info->GetSymbol(cx));
   } else {
     name = info->GetName();
     if (!AtomizeAndPinJSString(cx, id.get(), name)) {
       return NS_ERROR_FAILURE;
     }
   }
 
-  // We passed the unwrapped object's global to AutoEntryScript so we now need
-  // to enter the realm corresponding with the (maybe wrapper) object.
-  RootedObject scope(cx, wrapper->GetJSObjectGlobal());
+  // We now need to enter the realm of the actual JSObject* we are pointing at.
+  // But that may be a cross-compartment wrapper and therefore not have a
+  // well-defined realm, so enter the realm of the global that we grabbed back
+  // when we started pointing to our JSObject*.
+  RootedObject scope(cx, GetJSObjectGlobal());
   JSAutoRealm ar(cx, scope);
 
   // [optional_argc] has a different calling convention, which we don't
   // support for JS-implemented components.
   if (info->WantsOptArgc()) {
     const char* str =
         "IDL methods marked with [optional_argc] may not "
         "be implemented in JS";
@@ -1085,18 +1099,18 @@ bool xpc::IsOutObject(JSContext* cx, JSO
   return js::GetObjectJSClass(obj) == &XPCOutParamClass;
 }
 
 JSObject* xpc::NewOutObject(JSContext* cx) {
   return JS_NewObject(cx, &XPCOutParamClass);
 }
 
 // static
-void nsXPCWrappedJSClass::DebugDump(const nsXPTInterfaceInfo* aInfo,
-                                    int16_t depth) {
+void nsXPCWrappedJS::DebugDumpInterfaceInfo(const nsXPTInterfaceInfo* aInfo,
+                                            int16_t depth) {
 #ifdef DEBUG
   depth--;
   XPC_LOG_ALWAYS(("nsXPTInterfaceInfo @ %p = ", aInfo));
   XPC_LOG_INDENT();
   const char* name = aInfo->Name();
   XPC_LOG_ALWAYS(("interface name is %s", name));
   char* iid = aInfo->IID().ToString();
   XPC_LOG_ALWAYS(("IID number is %s", iid ? iid : "invalid"));
--- a/js/xpconnect/src/xpcprivate.h
+++ b/js/xpconnect/src/xpcprivate.h
@@ -1585,68 +1585,16 @@ class XPCWrappedNative final : public ns
 ****************************************************************************
 *
 * Core classes for wrapped JSObject for use from native code...
 *
 ****************************************************************************
 ***************************************************************************/
 
 /*************************/
-// nsXPCWrappedJSClass contains a number of helper methods for using
-// nsXPTInterfaceInfo and nsXPCWrappedJS.
-
-class nsXPCWrappedJSClass final {
- public:
-  static const nsXPTInterfaceInfo* GetInterfaceInfo(REFNSIID aIID);
-
-  static void DebugDump(const nsXPTInterfaceInfo* aInfo, int16_t depth);
-
-  static nsresult DelegatedQueryInterface(nsXPCWrappedJS* self, REFNSIID aIID,
-                                          void** aInstancePtr);
-
-  static JSObject* GetRootJSObject(JSContext* cx, JSObject* aJSObj);
-
-  static nsresult CallMethod(nsXPCWrappedJS* wrapper, uint16_t methodIndex,
-                             const nsXPTMethodInfo* info,
-                             nsXPTCMiniVariant* params);
-
-  static JSObject* CallQueryInterfaceOnJSObject(JSContext* cx, JSObject* jsobj,
-                                                JS::HandleObject scope,
-                                                REFNSIID aIID);
-
- private:
-  // aObj is the nsXPCWrappedJS's object. We used this as the callee (or |this|
-  // if getter or setter).
-  // aSyntheticException, if not null, is the exception we should be using.
-  // If null, look for an exception on the JSContext hanging off the
-  // XPCCallContext.
-  static nsresult CheckForException(
-      XPCCallContext& ccx, mozilla::dom::AutoEntryScript& aes,
-      JS::HandleObject aObj, const char* aPropertyName,
-      const char* anInterfaceName,
-      mozilla::dom::Exception* aSyntheticException = nullptr);
-  nsXPCWrappedJSClass() = delete;
-  ~nsXPCWrappedJSClass() = delete;
-
-  static bool GetArraySizeFromParam(const nsXPTMethodInfo* method,
-                                    const nsXPTType& type,
-                                    nsXPTCMiniVariant* params,
-                                    uint32_t* result);
-
-  static bool GetInterfaceTypeFromParam(const nsXPTMethodInfo* method,
-                                        const nsXPTType& type,
-                                        nsXPTCMiniVariant* params,
-                                        nsID* result);
-
-  static void CleanupOutparams(const nsXPTMethodInfo* info,
-                               nsXPTCMiniVariant* nativeParams, bool inOutOnly,
-                               uint8_t count);
-};
-
-/*************************/
 // nsXPCWrappedJS is a wrapper for a single JSObject for use from native code.
 // nsXPCWrappedJS objects are chained together to represent the various
 // interface on the single underlying (possibly aggregate) JSObject.
 
 class nsXPCWrappedJS final : protected nsAutoXPTCStub,
                              public nsIXPConnectWrappedJSUnmarkGray,
                              public nsSupportsWeakReference,
                              public XPCRootSetElem {
@@ -1655,18 +1603,19 @@ class nsXPCWrappedJS final : protected n
   NS_DECL_NSIXPCONNECTJSOBJECTHOLDER
   NS_DECL_NSIXPCONNECTWRAPPEDJS
   NS_DECL_NSIXPCONNECTWRAPPEDJSUNMARKGRAY
   NS_DECL_NSISUPPORTSWEAKREFERENCE
 
   NS_DECL_CYCLE_COLLECTION_SKIPPABLE_CLASS_AMBIGUOUS(nsXPCWrappedJS,
                                                      nsIXPConnectWrappedJS)
 
+  // This method is defined in XPCWrappedJSClass.cpp to preserve VCS blame.
   NS_IMETHOD CallMethod(uint16_t methodIndex, const nsXPTMethodInfo* info,
-                        nsXPTCMiniVariant* params) override;
+                        nsXPTCMiniVariant* nativeParams) override;
 
   /*
    * This is rarely called directly. Instead one usually calls
    * XPCConvert::JSObject2NativeInterface which will handles cases where the
    * JS object is already a wrapped native or a DOM object.
    */
 
   static nsresult GetNewOrUsed(JSContext* cx, JS::HandleObject aJSObj,
@@ -1730,34 +1679,75 @@ class nsXPCWrappedJS final : protected n
                  "Only one aggregated native can be set");
       return;
     }
     mRoot->mOuter = aNative;
   }
 
   void TraceJS(JSTracer* trc);
 
+  // This method is defined in XPCWrappedJSClass.cpp to preserve VCS blame.
+  static void DebugDumpInterfaceInfo(const nsXPTInterfaceInfo* aInfo,
+                                     int16_t depth);
+
   size_t SizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf) const;
 
   virtual ~nsXPCWrappedJS();
 
  protected:
   nsXPCWrappedJS() = delete;
-  nsXPCWrappedJS(JSContext* cx, JSObject* aJSObj, const nsXPTInterfaceInfo* aInfo,
-                 nsXPCWrappedJS* root, nsresult* rv);
+  nsXPCWrappedJS(JSContext* cx, JSObject* aJSObj,
+                 const nsXPTInterfaceInfo* aInfo, nsXPCWrappedJS* root,
+                 nsresult* rv);
 
   bool CanSkip();
   void Destroy();
   void Unlink();
 
  private:
   JS::Compartment* Compartment() const {
     return js::GetObjectCompartment(mJSObj.unbarrieredGet());
   }
 
+  // These methods are defined in XPCWrappedJSClass.cpp to preserve VCS blame.
+  static const nsXPTInterfaceInfo* GetInterfaceInfo(REFNSIID aIID);
+
+  nsresult DelegatedQueryInterface(REFNSIID aIID, void** aInstancePtr);
+
+  static JSObject* GetRootJSObject(JSContext* cx, JSObject* aJSObj);
+
+  static JSObject* CallQueryInterfaceOnJSObject(JSContext* cx, JSObject* jsobj,
+                                                JS::HandleObject scope,
+                                                REFNSIID aIID);
+
+  // aObj is the nsXPCWrappedJS's object. We used this as the callee (or |this|
+  // if getter or setter).
+  // aSyntheticException, if not null, is the exception we should be using.
+  // If null, look for an exception on the JSContext hanging off the
+  // XPCCallContext.
+  static nsresult CheckForException(
+      XPCCallContext& ccx, mozilla::dom::AutoEntryScript& aes,
+      JS::HandleObject aObj, const char* aPropertyName,
+      const char* anInterfaceName,
+      mozilla::dom::Exception* aSyntheticException = nullptr);
+
+  static bool GetArraySizeFromParam(const nsXPTMethodInfo* method,
+                                    const nsXPTType& type,
+                                    nsXPTCMiniVariant* params,
+                                    uint32_t* result);
+
+  static bool GetInterfaceTypeFromParam(const nsXPTMethodInfo* method,
+                                        const nsXPTType& type,
+                                        nsXPTCMiniVariant* params,
+                                        nsID* result);
+
+  static void CleanupOutparams(const nsXPTMethodInfo* info,
+                               nsXPTCMiniVariant* nativeParams, bool inOutOnly,
+                               uint8_t count);
+
   JS::Heap<JSObject*> mJSObj;
   const nsXPTInterfaceInfo* const mInfo;
   nsXPCWrappedJS* mRoot;  // If mRoot != this, it is an owning pointer.
   nsXPCWrappedJS* mNext;
   nsCOMPtr<nsISupports> mOuter;  // only set in root
 };
 
 /***************************************************************************
--- a/layout/base/gtest/moz.build
+++ b/layout/base/gtest/moz.build
@@ -1,18 +1,20 @@
 # -*- 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/.
 
-UNIFIED_SOURCES += [
-    'TestAccessibleCaretEventHub.cpp',
-    'TestAccessibleCaretManager.cpp',
-]
+
+if CONFIG['OS_TARGET'] != 'Android':
+    UNIFIED_SOURCES += [
+        'TestAccessibleCaretEventHub.cpp',
+        'TestAccessibleCaretManager.cpp',
+    ]
 
 # THE MOCK_METHOD2 macro from gtest triggers this clang warning and it's hard
 # to work around, so we just ignore it.
 if CONFIG['CC_TYPE'] == 'clang':
   CXXFLAGS += ['-Wno-inconsistent-missing-override']
 
 include('/ipc/chromium/chromium-config.mozbuild')
 
--- a/layout/reftests/css-blending/reftest.list
+++ b/layout/reftests/css-blending/reftest.list
@@ -36,17 +36,17 @@ fuzzy-if(d2d||azureSkia||gtkWidget,0-1,0
 fuzzy-if(d2d||azureSkia||gtkWidget,0-10,0-4800) == background-blending-soft-light.html background-blending-soft-light-ref.svg
 
 fuzzy-if(azureSkia||d2d||gtkWidget,0-1,0-40000) == background-blending-image-color-959674.html background-blending-image-color-959674-ref.html
 
 #fuzzy due to inconsistencies in rounded rect cliping between parent and child; may be related to antialiasing. Between platforms, the max difference is the same, and the number of different pixels is either 36 or 37. (Win, Mac and Lin)
 fuzzy(0-65,0-53) == mix-blend-mode-952051.html mix-blend-mode-952051-ref.html
 
 fuzzy-if(d3d11,0-49,0-200) == mix-blend-mode-and-filter.html mix-blend-mode-and-filter-ref.html
-fuzzy-if(webrender,9-9,2531-2716) fuzzy-if(d3d11,0-1,0-5) == mix-blend-mode-and-filter.svg mix-blend-mode-and-filter-ref.svg
+fuzzy-if(d3d11,0-1,0-5) == mix-blend-mode-and-filter.svg mix-blend-mode-and-filter-ref.svg
 
 fuzzy(0-2,0-14400) == mix-blend-mode-child-of-blended-has-opacity.html mix-blend-mode-child-of-blended-has-opacity-ref.html
 
 == mix-blend-mode-nested-976533.html mix-blend-mode-nested-976533-ref.html
 == mix-blend-mode-culling-1207041.html mix-blend-mode-culling-1207041-ref.html
 == mix-blend-mode-dest-alpha-1135271.html mix-blend-mode-dest-alpha-1135271-ref.html
 == clipped-mixblendmode-containing-unclipped-stuff.html clipped-mixblendmode-containing-unclipped-stuff-ref.html
 fuzzy(0-1,0-6800) == clipped-opacity-containing-unclipped-mixblendmode.html clipped-opacity-containing-unclipped-mixblendmode-ref.html
new file mode 100644
--- /dev/null
+++ b/layout/reftests/svg/active-transform-blend-mode-ref.html
@@ -0,0 +1,8 @@
+<svg width=1000 height=1000>
+    <g style="transform: translateY(-2px) translateX(0px) translateZ(0px);">
+        <rect fill="#0000ff" height="93" width="32" x="100" y="163"></rect>
+    </g>
+    <g style="mix-blend-mode: multiply;">
+        <rect fill="#ff0000" height="93" width="32" x="100" y="161"></rect>
+    </g>
+</svg>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/svg/active-transform-blend-mode.html
@@ -0,0 +1,8 @@
+<svg width=1000 height=1000>
+    <g style="transform: translateY(-2px) translateX(0px) translateZ(0px); will-change: transform;">
+        <rect fill="#0000ff" height="93" width="32" x="100" y="163"></rect>
+    </g>
+    <g style="mix-blend-mode: multiply;">
+        <rect fill="#ff0000" height="93" width="32" x="100" y="161"></rect>
+    </g>
+</svg>
--- a/layout/reftests/svg/reftest.list
+++ b/layout/reftests/svg/reftest.list
@@ -48,16 +48,17 @@ skip-if(Android) == blend-lighten.svg bl
 #skip-if(Android) == blend-multiply-alpha.svg blend-multiply-alpha-ref.svg
 fuzzy-if(skiaContent,0-1,0-1600) skip-if(Android) == blend-multiply.svg blend-multiply-ref.svg
 == blend-normal.svg blend-normal-ref.svg
 #skip-if(Android) == blend-overlay.svg blend-overlay-ref.svg
 #skip-if(Android)  == blend-saturation.svg blend-saturation-ref.svg
 #skip-if(Android) == blend-screen.svg blend-screen-ref.svg
 #skip-if(Android) == blend-soft-light.svg blend-soft-light-ref.svg
 skip == blend-difference-stacking.html blend-difference-stacking-ref.html # bug 1458353
+== active-transform-blend-mode.html active-transform-blend-mode-ref.html
 
 fuzzy(0-11,0-7155) == blur-inside-clipPath.svg blur-inside-clipPath-ref.svg
 
 == border-radius-01.html pass.svg
 
 == clip-01.svg pass.svg
 == clip-02a.svg clip-02-ref.svg
 == clip-02b.svg clip-02-ref.svg
--- a/media/libcubeb/gtest/moz.build
+++ b/media/libcubeb/gtest/moz.build
@@ -7,17 +7,17 @@
 UNIFIED_SOURCES += [
 #  'test_duplex.cpp', # DISABLED: See bug 1314514.
 #  'test_record.cpp', # DISABLED: See bug 1314514.
 #  'test_overload_callback.cpp', # DISABLED: Times out in automation.
   'test_tone.cpp',
   'test_utils.cpp'
 ]
 
-if CONFIG['MOZ_PULSEAUDIO'] or CONFIG['OS_TARGET'] in ('Darwin', 'WINNT', 'Android'):
+if CONFIG['MOZ_PULSEAUDIO'] or CONFIG['OS_TARGET'] in ('Darwin', 'WINNT'):
   UNIFIED_SOURCES += [
     'test_resampler.cpp',
   ]
 
 if CONFIG['OS_TARGET'] != 'Android':
   UNIFIED_SOURCES += [
     'test_audio.cpp',
     'test_latency.cpp',
--- a/media/mtransport/test/moz.build
+++ b/media/mtransport/test/moz.build
@@ -2,19 +2,24 @@
 # 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/.
 
 include("/ipc/chromium/chromium-config.mozbuild")
 
 if CONFIG['OS_TARGET'] != 'WINNT':
+
+    if CONFIG['OS_TARGET'] != 'Android':
+        SOURCES += [
+            'ice_unittest.cpp',
+        ]
+
     SOURCES += [
         'buffered_stun_socket_unittest.cpp',
-        'ice_unittest.cpp',
         'multi_tcp_socket_unittest.cpp',
         'nrappkit_unittest.cpp',
         'proxy_tunnel_socket_unittest.cpp',
         'rlogconnector_unittest.cpp',
         'runnable_utils_unittest.cpp',
         'simpletokenbucket_unittest.cpp',
         'sockettransportservice_unittest.cpp',
         'stunserver.cpp',
--- a/moz.configure
+++ b/moz.configure
@@ -315,24 +315,24 @@ def check_objdir_backend_reuse(build_env
                     build_env.topobjdir, prev)
 
 
 option('--disable-gtest-in-build',
        help='Force disable building the gtest libxul during the build.',
        when='--enable-compile-environment')
 
 # Determine whether to build the gtest xul. This happens in automation
-# on Desktop platforms with the exception of Windows PGO, where linking
-# xul-gtest.dll takes too long.
+# on Android and Desktop platforms with the exception of Windows PGO, where
+# linking xul-gtest.dll takes too long.
 @depends('MOZ_PGO', build_project, target, 'MOZ_AUTOMATION', '--disable-gtest-in-build',
          enable_tests, when='--enable-compile-environment')
 def build_gtest(pgo, build_project, target, automation, enabled, enable_tests):
     if not enable_tests or not enabled:
         return None
-    if (automation and build_project == 'browser' and
+    if (automation and build_project in ('browser', 'mobile/android') and
         not (pgo and target.os == 'WINNT')):
         return True
 
 set_config('LINK_GTEST_DURING_COMPILE', build_gtest)
 
 # Localization
 # ==============================================================
 option('--enable-ui-locale', default='en-US',
--- a/netwerk/test/gtest/moz.build
+++ b/netwerk/test/gtest/moz.build
@@ -5,26 +5,30 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 UNIFIED_SOURCES += [
     'TestBufferedInputStream.cpp',
     'TestHeaders.cpp',
     'TestHttpAuthUtils.cpp',
     'TestIsValidIp.cpp',
     'TestMIMEInputStream.cpp',
-    'TestMozURL.cpp',
     'TestPACMan.cpp',
     'TestPartiallySeekableInputStream.cpp',
     'TestProtocolProxyService.cpp',
     'TestReadStreamToString.cpp',
-    'TestServerTimingHeader.cpp',
     'TestStandardURL.cpp',
     'TestURIMutator.cpp',
 ]
 
+if CONFIG['OS_TARGET'] != 'Android':
+    UNIFIED_SOURCES += [
+        'TestMozURL.cpp',
+        'TestServerTimingHeader.cpp',
+    ]
+
 TEST_HARNESS_FILES.gtest += [
     'urltestdata.json',
 ]
 
 TEST_DIRS += [
     'parse-ftp',
 ]
 
--- a/netwerk/test/gtest/parse-ftp/moz.build
+++ b/netwerk/test/gtest/parse-ftp/moz.build
@@ -1,17 +1,18 @@
 # -*- 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/.
 
-UNIFIED_SOURCES += [
-    'TestParseFTPList.cpp',
-]
+if CONFIG['OS_TARGET'] != 'Android':
+    UNIFIED_SOURCES += [
+        'TestParseFTPList.cpp',
+    ]
 
 TEST_HARNESS_FILES.gtest += [
     '3-guess.in',
     '3-guess.out',
     'C-VMold.in',
     'C-VMold.out',
     'C-zVM.in',
     'C-zVM.out',
--- a/package-lock.json
+++ b/package-lock.json
@@ -19,43 +19,43 @@
       "dev": true,
       "requires": {
         "chalk": "^2.0.0",
         "esutils": "^2.0.2",
         "js-tokens": "^4.0.0"
       }
     },
     "acorn": {
-      "version": "6.0.5",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.5.tgz",
-      "integrity": "sha512-i33Zgp3XWtmZBMNvCr4azvOFeWVw1Rk6p3hfi3LUDvIFraOMywb1kAtrbi+med14m4Xfpqm3zRZMT+c0FNE7kg==",
+      "version": "6.1.1",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz",
+      "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==",
       "dev": true
     },
     "acorn-jsx": {
       "version": "5.0.1",
       "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz",
       "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==",
       "dev": true
     },
     "ajv": {
-      "version": "6.6.2",
-      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.2.tgz",
-      "integrity": "sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g==",
+      "version": "6.10.0",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz",
+      "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==",
       "dev": true,
       "requires": {
         "fast-deep-equal": "^2.0.1",
         "fast-json-stable-stringify": "^2.0.0",
         "json-schema-traverse": "^0.4.1",
         "uri-js": "^4.2.2"
       }
     },
     "ansi-escapes": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz",
-      "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==",
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
+      "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==",
       "dev": true
     },
     "ansi-regex": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
       "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
       "dev": true
     },
@@ -72,86 +72,96 @@
       "version": "1.0.10",
       "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
       "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
       "dev": true,
       "requires": {
         "sprintf-js": "~1.0.2"
       }
     },
+    "aria-query": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz",
+      "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=",
+      "dev": true,
+      "requires": {
+        "ast-types-flow": "0.0.7",
+        "commander": "^2.11.0"
+      }
+    },
     "array-includes": {
       "version": "3.0.3",
       "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz",
       "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=",
       "dev": true,
       "requires": {
         "define-properties": "^1.1.2",
         "es-abstract": "^1.7.0"
       }
     },
+    "ast-types-flow": {
+      "version": "0.0.7",
+      "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
+      "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=",
+      "dev": true
+    },
     "astral-regex": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
       "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
       "dev": true
     },
+    "axobject-query": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.0.2.tgz",
+      "integrity": "sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww==",
+      "dev": true,
+      "requires": {
+        "ast-types-flow": "0.0.7"
+      }
+    },
     "balanced-match": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
       "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
       "dev": true
     },
     "brace-expansion": {
       "version": "1.1.11",
       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
       "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
       "dev": true,
       "requires": {
         "balanced-match": "^1.0.0",
         "concat-map": "0.0.1"
       }
     },
-    "caller-path": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz",
-      "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
-      "dev": true,
-      "requires": {
-        "callsites": "^0.2.0"
-      }
-    },
     "callsites": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz",
-      "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
       "dev": true
     },
     "chalk": {
-      "version": "2.4.1",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
-      "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
       "dev": true,
       "requires": {
         "ansi-styles": "^3.2.1",
         "escape-string-regexp": "^1.0.5",
         "supports-color": "^5.3.0"
       }
     },
     "chardet": {
       "version": "0.7.0",
       "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
       "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
       "dev": true
     },
-    "circular-json": {
-      "version": "0.3.3",
-      "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz",
-      "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==",
-      "dev": true
-    },
     "cli-cursor": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
       "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
       "dev": true,
       "requires": {
         "restore-cursor": "^2.0.0"
       }
@@ -172,35 +182,53 @@
       }
     },
     "color-name": {
       "version": "1.1.3",
       "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
       "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
       "dev": true
     },
+    "commander": {
+      "version": "2.20.0",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
+      "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==",
+      "dev": true
+    },
     "concat-map": {
       "version": "0.0.1",
       "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
       "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
       "dev": true
     },
+    "contains-path": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz",
+      "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=",
+      "dev": true
+    },
     "cross-spawn": {
       "version": "6.0.5",
       "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
       "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
       "dev": true,
       "requires": {
         "nice-try": "^1.0.4",
         "path-key": "^2.0.1",
         "semver": "^5.5.0",
         "shebang-command": "^1.2.0",
         "which": "^1.2.9"
       }
     },
+    "damerau-levenshtein": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz",
+      "integrity": "sha1-AxkcQyy27qFou3fzpV/9zLiXhRQ=",
+      "dev": true
+    },
     "debug": {
       "version": "4.1.1",
       "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
       "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
       "dev": true,
       "requires": {
         "ms": "^2.1.1"
       }
@@ -216,40 +244,32 @@
       "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
       "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
       "dev": true,
       "requires": {
         "object-keys": "^1.0.12"
       }
     },
     "doctrine": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
-      "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+      "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
       "dev": true,
       "requires": {
         "esutils": "^2.0.2"
       }
     },
     "dom-serializer": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz",
-      "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=",
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz",
+      "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==",
       "dev": true,
       "requires": {
-        "domelementtype": "~1.1.1",
-        "entities": "~1.1.1"
-      },
-      "dependencies": {
-        "domelementtype": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz",
-          "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=",
-          "dev": true
-        }
+        "domelementtype": "^1.3.0",
+        "entities": "^1.1.1"
       }
     },
     "domelementtype": {
       "version": "1.3.1",
       "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
       "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
       "dev": true
     },
@@ -267,22 +287,37 @@
       "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
       "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
       "dev": true,
       "requires": {
         "dom-serializer": "0",
         "domelementtype": "1"
       }
     },
+    "emoji-regex": {
+      "version": "7.0.3",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+      "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+      "dev": true
+    },
     "entities": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
       "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==",
       "dev": true
     },
+    "error-ex": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+      "dev": true,
+      "requires": {
+        "is-arrayish": "^0.2.1"
+      }
+    },
     "es-abstract": {
       "version": "1.13.0",
       "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz",
       "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==",
       "dev": true,
       "requires": {
         "es-to-primitive": "^1.2.0",
         "function-bind": "^1.1.1",
@@ -305,107 +340,277 @@
     },
     "escape-string-regexp": {
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
       "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
       "dev": true
     },
     "eslint": {
-      "version": "5.11.1",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.11.1.tgz",
-      "integrity": "sha512-gOKhM8JwlFOc2acbOrkYR05NW8M6DCMSvfcJiBB5NDxRE1gv8kbvxKaC9u69e6ZGEMWXcswA/7eKR229cEIpvg==",
+      "version": "5.16.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz",
+      "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==",
       "dev": true,
       "requires": {
         "@babel/code-frame": "^7.0.0",
-        "ajv": "^6.5.3",
+        "ajv": "^6.9.1",
         "chalk": "^2.1.0",
         "cross-spawn": "^6.0.5",
         "debug": "^4.0.1",
-        "doctrine": "^2.1.0",
-        "eslint-scope": "^4.0.0",
+        "doctrine": "^3.0.0",
+        "eslint-scope": "^4.0.3",
         "eslint-utils": "^1.3.1",
         "eslint-visitor-keys": "^1.0.0",
-        "espree": "^5.0.0",
+        "espree": "^5.0.1",
         "esquery": "^1.0.1",
         "esutils": "^2.0.2",
-        "file-entry-cache": "^2.0.0",
+        "file-entry-cache": "^5.0.1",
         "functional-red-black-tree": "^1.0.1",
         "glob": "^7.1.2",
         "globals": "^11.7.0",
         "ignore": "^4.0.6",
+        "import-fresh": "^3.0.0",
         "imurmurhash": "^0.1.4",
-        "inquirer": "^6.1.0",
-        "js-yaml": "^3.12.0",
+        "inquirer": "^6.2.2",
+        "js-yaml": "^3.13.0",
         "json-stable-stringify-without-jsonify": "^1.0.1",
         "levn": "^0.3.0",
-        "lodash": "^4.17.5",
+        "lodash": "^4.17.11",
         "minimatch": "^3.0.4",
         "mkdirp": "^0.5.1",
         "natural-compare": "^1.4.0",
         "optionator": "^0.8.2",
         "path-is-inside": "^1.0.2",
-        "pluralize": "^7.0.0",
         "progress": "^2.0.0",
         "regexpp": "^2.0.1",
-        "require-uncached": "^1.0.3",
         "semver": "^5.5.1",
         "strip-ansi": "^4.0.0",
         "strip-json-comments": "^2.0.1",
-        "table": "^5.0.2",
+        "table": "^5.2.3",
         "text-table": "^0.2.0"
       }
     },
+    "eslint-import-resolver-node": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz",
+      "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==",
+      "dev": true,
+      "requires": {
+        "debug": "^2.6.9",
+        "resolve": "^1.5.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        }
+      }
+    },
+    "eslint-module-utils": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.3.0.tgz",
+      "integrity": "sha512-lmDJgeOOjk8hObTysjqH7wyMi+nsHwwvfBykwfhjR1LNdd7C2uFJBvx4OpWYpXOw4df1yE1cDEVd1yLHitk34w==",
+      "dev": true,
+      "requires": {
+        "debug": "^2.6.8",
+        "pkg-dir": "^2.0.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        }
+      }
+    },
+    "eslint-plugin-babel": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-babel/-/eslint-plugin-babel-5.3.0.tgz",
+      "integrity": "sha512-HPuNzSPE75O+SnxHIafbW5QB45r2w78fxqwK3HmjqIUoPfPzVrq6rD+CINU3yzoDSzEhUkX07VUphbF73Lth/w==",
+      "dev": true,
+      "requires": {
+        "eslint-rule-composer": "^0.3.0"
+      }
+    },
+    "eslint-plugin-file-header": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-file-header/-/eslint-plugin-file-header-0.0.1.tgz",
+      "integrity": "sha512-Xe7veqG+8s99Msd/bFm6YDBnKaufgd/oE+uOXQqpadLGZSrb3t+iW5n7c2rcBfgZ9oGjhuXIL3IsH3a+U8oVNQ==",
+      "dev": true
+    },
+    "eslint-plugin-flowtype": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-3.6.0.tgz",
+      "integrity": "sha512-7wRfgzXteB9jswXreGG64FlOdscV4z4hIW2lS+mC5t1K2QQkUDh7A+95dB4nU7io8zIOq4cRpftF+41xvMCtiA==",
+      "dev": true,
+      "requires": {
+        "lodash": "^4.17.11"
+      }
+    },
     "eslint-plugin-html": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-html/-/eslint-plugin-html-5.0.0.tgz",
-      "integrity": "sha512-f7p/7YQdgQUFVAX3nB4dnMQbrDeTalcA01PDhuvTLk0ZadCwM4Pb+639SRuqEf1zMkIxckLY+ckCr0hVP5zl6A==",
+      "version": "5.0.3",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-html/-/eslint-plugin-html-5.0.3.tgz",
+      "integrity": "sha512-46ruAnp3jVQP/5Bi5eEIOooscjUTPFU3vxCxHe/OG6ORdM7Xv5c25/Nz9fAbHklzCpiXuIiH4/mV/XBkm7MINw==",
       "dev": true,
       "requires": {
         "htmlparser2": "^3.10.0"
       }
     },
+    "eslint-plugin-import": {
+      "version": "2.16.0",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.16.0.tgz",
+      "integrity": "sha512-z6oqWlf1x5GkHIFgrSvtmudnqM6Q60KM4KvpWi5ubonMjycLjndvd5+8VAZIsTlHC03djdgJuyKG6XO577px6A==",
+      "dev": true,
+      "requires": {
+        "contains-path": "^0.1.0",
+        "debug": "^2.6.9",
+        "doctrine": "1.5.0",
+        "eslint-import-resolver-node": "^0.3.2",
+        "eslint-module-utils": "^2.3.0",
+        "has": "^1.0.3",
+        "lodash": "^4.17.11",
+        "minimatch": "^3.0.4",
+        "read-pkg-up": "^2.0.0",
+        "resolve": "^1.9.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "doctrine": {
+          "version": "1.5.0",
+          "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
+          "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2",
+            "isarray": "^1.0.0"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        }
+      }
+    },
+    "eslint-plugin-jest": {
+      "version": "22.4.1",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-22.4.1.tgz",
+      "integrity": "sha512-gcLfn6P2PrFAVx3AobaOzlIEevpAEf9chTpFZz7bYfc7pz8XRv7vuKTIE4hxPKZSha6XWKKplDQ0x9Pq8xX2mg==",
+      "dev": true
+    },
+    "eslint-plugin-jsx-a11y": {
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.1.tgz",
+      "integrity": "sha512-cjN2ObWrRz0TTw7vEcGQrx+YltMvZoOEx4hWU8eEERDnBIU00OTq7Vr+jA7DFKxiwLNv4tTh5Pq2GUNEa8b6+w==",
+      "dev": true,
+      "requires": {
+        "aria-query": "^3.0.0",
+        "array-includes": "^3.0.3",
+        "ast-types-flow": "^0.0.7",
+        "axobject-query": "^2.0.2",
+        "damerau-levenshtein": "^1.0.4",
+        "emoji-regex": "^7.0.2",
+        "has": "^1.0.3",
+        "jsx-ast-utils": "^2.0.1"
+      }
+    },
     "eslint-plugin-mozilla": {
       "version": "file:tools/lint/eslint/eslint-plugin-mozilla",
       "dev": true,
       "requires": {
-        "htmlparser2": "3.10.0",
+        "htmlparser2": "3.10.1",
         "ini-parser": "0.0.2",
         "sax": "1.2.4"
       }
     },
     "eslint-plugin-no-unsanitized": {
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/eslint-plugin-no-unsanitized/-/eslint-plugin-no-unsanitized-3.0.2.tgz",
       "integrity": "sha512-JnwpoH8Sv4QOjrTDutENBHzSnyYtspdjtglYtqUtAHe6f6LLKqykJle+UwFPg23GGwt5hI3amS9CRDezW8GAww==",
       "dev": true
     },
+    "eslint-plugin-prettier": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.0.1.tgz",
+      "integrity": "sha512-/PMttrarPAY78PLvV3xfWibMOdMDl57hmlQ2XqFeA37wd+CJ7WSxV7txqjVPHi/AAFKd2lX0ZqfsOc/i5yFCSQ==",
+      "dev": true,
+      "requires": {
+        "prettier-linter-helpers": "^1.0.0"
+      }
+    },
     "eslint-plugin-react": {
-      "version": "7.12.2",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.12.2.tgz",
-      "integrity": "sha512-6F8uOJXOsWWWD3Mg8cvz4onsqEYp2LFZCFlgjaTAzbPLwqdwRCeK78unbuEaMXYPxq8paXCzTpoaDCwXBvC/gg==",
+      "version": "7.12.4",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.12.4.tgz",
+      "integrity": "sha512-1puHJkXJY+oS1t467MjbqjvX53uQ05HXwjqDgdbGBqf5j9eeydI54G3KwiJmWciQ0HTBacIKw2jgwSBSH3yfgQ==",
       "dev": true,
       "requires": {
         "array-includes": "^3.0.3",
         "doctrine": "^2.1.0",
         "has": "^1.0.3",
         "jsx-ast-utils": "^2.0.1",
         "object.fromentries": "^2.0.0",
         "prop-types": "^15.6.2",
         "resolve": "^1.9.0"
+      },
+      "dependencies": {
+        "doctrine": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+          "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+          "dev": true,
+          "requires": {
+            "esutils": "^2.0.2"
+          }
+        }
       }
     },
     "eslint-plugin-spidermonkey-js": {
       "version": "file:tools/lint/eslint/eslint-plugin-spidermonkey-js",
       "dev": true
     },
+    "eslint-rule-composer": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz",
+      "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==",
+      "dev": true
+    },
     "eslint-scope": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz",
-      "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==",
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz",
+      "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==",
       "dev": true,
       "requires": {
         "esrecurse": "^4.1.0",
         "estraverse": "^4.1.1"
       }
     },
     "eslint-utils": {
       "version": "1.3.1",
@@ -415,22 +620,22 @@
     },
     "eslint-visitor-keys": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
       "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==",
       "dev": true
     },
     "espree": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.0.tgz",
-      "integrity": "sha512-1MpUfwsdS9MMoN7ZXqAr9e9UKdVHDcvrJpyx7mm1WuQlx/ygErEQBzgi5Nh5qBHIoYweprhtMkTCb9GhcAIcsA==",
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz",
+      "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==",
       "dev": true,
       "requires": {
-        "acorn": "^6.0.2",
+        "acorn": "^6.0.7",
         "acorn-jsx": "^5.0.0",
         "eslint-visitor-keys": "^1.0.0"
       }
     },
     "esprima": {
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
       "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
@@ -478,16 +683,22 @@
       }
     },
     "fast-deep-equal": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
       "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
       "dev": true
     },
+    "fast-diff": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
+      "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==",
+      "dev": true
+    },
     "fast-json-stable-stringify": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
       "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
       "dev": true
     },
     "fast-levenshtein": {
       "version": "2.0.6",
@@ -500,37 +711,50 @@
       "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
       "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
       "dev": true,
       "requires": {
         "escape-string-regexp": "^1.0.5"
       }
     },
     "file-entry-cache": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz",
-      "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=",
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
+      "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
       "dev": true,
       "requires": {
-        "flat-cache": "^1.2.1",
-        "object-assign": "^4.0.1"
+        "flat-cache": "^2.0.1"
+      }
+    },
+    "find-up": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+      "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
+      "dev": true,
+      "requires": {
+        "locate-path": "^2.0.0"
       }
     },
     "flat-cache": {
-      "version": "1.3.4",
-      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz",
-      "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==",
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
+      "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
       "dev": true,
       "requires": {
-        "circular-json": "^0.3.1",
-        "graceful-fs": "^4.1.2",
-        "rimraf": "~2.6.2",
-        "write": "^0.2.1"
+        "flatted": "^2.0.0",
+        "rimraf": "2.6.3",
+        "write": "1.0.3"
       }
     },
+    "flatted": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.0.tgz",
+      "integrity": "sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==",
+      "dev": true
+    },
     "fs.realpath": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
       "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
       "dev": true
     },
     "function-bind": {
       "version": "1.1.1",
@@ -554,19 +778,19 @@
         "inflight": "^1.0.4",
         "inherits": "2",
         "minimatch": "^3.0.4",
         "once": "^1.3.0",
         "path-is-absolute": "^1.0.0"
       }
     },
     "globals": {
-      "version": "11.9.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz",
-      "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==",
+      "version": "11.11.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz",
+      "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==",
       "dev": true
     },
     "graceful-fs": {
       "version": "4.1.15",
       "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
       "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==",
       "dev": true
     },
@@ -586,28 +810,34 @@
       "dev": true
     },
     "has-symbols": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz",
       "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=",
       "dev": true
     },
+    "hosted-git-info": {
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz",
+      "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==",
+      "dev": true
+    },
     "htmlparser2": {
-      "version": "3.10.0",
-      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.0.tgz",
-      "integrity": "sha512-J1nEUGv+MkXS0weHNWVKJJ+UrLfePxRWpN3C9bEi9fLxL2+ggW94DQvgYVXsaT30PGwYRIZKNZXuyMhp3Di4bQ==",
+      "version": "3.10.1",
+      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz",
+      "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==",
       "dev": true,
       "requires": {
-        "domelementtype": "^1.3.0",
+        "domelementtype": "^1.3.1",
         "domhandler": "^2.3.0",
         "domutils": "^1.5.1",
         "entities": "^1.1.1",
         "inherits": "^2.0.1",
-        "readable-stream": "^3.0.6"
+        "readable-stream": "^3.1.1"
       }
     },
     "iconv-lite": {
       "version": "0.4.24",
       "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
       "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
       "dev": true,
       "requires": {
@@ -615,16 +845,26 @@
       }
     },
     "ignore": {
       "version": "4.0.6",
       "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
       "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
       "dev": true
     },
+    "import-fresh": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.0.0.tgz",
+      "integrity": "sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ==",
+      "dev": true,
+      "requires": {
+        "parent-module": "^1.0.0",
+        "resolve-from": "^4.0.0"
+      }
+    },
     "imurmurhash": {
       "version": "0.1.4",
       "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
       "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
       "dev": true
     },
     "inflight": {
       "version": "1.0.6",
@@ -644,53 +884,59 @@
     },
     "ini-parser": {
       "version": "0.0.2",
       "resolved": "https://registry.npmjs.org/ini-parser/-/ini-parser-0.0.2.tgz",
       "integrity": "sha1-+kF4flZ3Y7P/Zdel2alO23QHh+8=",
       "dev": true
     },
     "inquirer": {
-      "version": "6.2.1",
-      "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.1.tgz",
-      "integrity": "sha512-088kl3DRT2dLU5riVMKKr1DlImd6X7smDhpXUCkJDCKvTEJeRiXh0G132HG9u5a+6Ylw9plFRY7RuTnwohYSpg==",
+      "version": "6.2.2",
+      "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.2.tgz",
+      "integrity": "sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA==",
       "dev": true,
       "requires": {
-        "ansi-escapes": "^3.0.0",
-        "chalk": "^2.0.0",
+        "ansi-escapes": "^3.2.0",
+        "chalk": "^2.4.2",
         "cli-cursor": "^2.1.0",
         "cli-width": "^2.0.0",
-        "external-editor": "^3.0.0",
+        "external-editor": "^3.0.3",
         "figures": "^2.0.0",
-        "lodash": "^4.17.10",
+        "lodash": "^4.17.11",
         "mute-stream": "0.0.7",
         "run-async": "^2.2.0",
-        "rxjs": "^6.1.0",
+        "rxjs": "^6.4.0",
         "string-width": "^2.1.0",
         "strip-ansi": "^5.0.0",
         "through": "^2.3.6"
       },
       "dependencies": {
         "ansi-regex": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz",
-          "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==",
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
           "dev": true
         },
         "strip-ansi": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz",
-          "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==",
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
           "dev": true,
           "requires": {
-            "ansi-regex": "^4.0.0"
+            "ansi-regex": "^4.1.0"
           }
         }
       }
     },
+    "is-arrayish": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+      "dev": true
+    },
     "is-callable": {
       "version": "1.1.4",
       "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz",
       "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==",
       "dev": true
     },
     "is-date-object": {
       "version": "1.0.1",
@@ -723,32 +969,38 @@
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz",
       "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==",
       "dev": true,
       "requires": {
         "has-symbols": "^1.0.0"
       }
     },
+    "isarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+      "dev": true
+    },
     "isexe": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
       "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
       "dev": true
     },
     "js-tokens": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
       "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
       "dev": true
     },
     "js-yaml": {
-      "version": "3.12.0",
-      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz",
-      "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==",
+      "version": "3.13.1",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
+      "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
       "dev": true,
       "requires": {
         "argparse": "^1.0.7",
         "esprima": "^4.0.0"
       }
     },
     "json-schema-traverse": {
       "version": "0.4.1",
@@ -776,16 +1028,38 @@
       "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
       "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
       "dev": true,
       "requires": {
         "prelude-ls": "~1.1.2",
         "type-check": "~0.3.2"
       }
     },
+    "load-json-file": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
+      "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "parse-json": "^2.2.0",
+        "pify": "^2.0.0",
+        "strip-bom": "^3.0.0"
+      }
+    },
+    "locate-path": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+      "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+      "dev": true,
+      "requires": {
+        "p-locate": "^2.0.0",
+        "path-exists": "^3.0.0"
+      }
+    },
     "lodash": {
       "version": "4.17.11",
       "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
       "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
       "dev": true
     },
     "loose-envify": {
       "version": "1.4.0",
@@ -808,63 +1082,75 @@
       "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
       "dev": true,
       "requires": {
         "brace-expansion": "^1.1.7"
       }
     },
     "minimist": {
       "version": "0.0.8",
-      "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
       "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
       "dev": true
     },
     "mkdirp": {
       "version": "0.5.1",
-      "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
       "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
       "dev": true,
       "requires": {
         "minimist": "0.0.8"
       }
     },
     "ms": {
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
       "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
       "dev": true
     },
     "mute-stream": {
       "version": "0.0.7",
-      "resolved": "http://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
+      "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
       "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
       "dev": true
     },
     "natural-compare": {
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
       "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
       "dev": true
     },
     "nice-try": {
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
       "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
       "dev": true
     },
+    "normalize-package-data": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+      "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+      "dev": true,
+      "requires": {
+        "hosted-git-info": "^2.1.4",
+        "resolve": "^1.10.0",
+        "semver": "2 || 3 || 4 || 5",
+        "validate-npm-package-license": "^3.0.1"
+      }
+    },
     "object-assign": {
       "version": "4.1.1",
       "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
       "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
       "dev": true
     },
     "object-keys": {
-      "version": "1.0.12",
-      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz",
-      "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==",
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
       "dev": true
     },
     "object.fromentries": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.0.tgz",
       "integrity": "sha512-9iLiI6H083uiqUuvzyY6qrlmc/Gz8hLQFOcb/Ri/0xXFkSNS3ctV+CbE6yM2+AnkYfOB3dGjdzC0wrMLIhQICA==",
       "dev": true,
       "requires": {
@@ -903,23 +1189,71 @@
         "levn": "~0.3.0",
         "prelude-ls": "~1.1.2",
         "type-check": "~0.3.2",
         "wordwrap": "~1.0.0"
       }
     },
     "os-tmpdir": {
       "version": "1.0.2",
-      "resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
       "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
       "dev": true
     },
+    "p-limit": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+      "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+      "dev": true,
+      "requires": {
+        "p-try": "^1.0.0"
+      }
+    },
+    "p-locate": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+      "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
+      "dev": true,
+      "requires": {
+        "p-limit": "^1.1.0"
+      }
+    },
+    "p-try": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+      "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+      "dev": true
+    },
+    "parent-module": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+      "dev": true,
+      "requires": {
+        "callsites": "^3.0.0"
+      }
+    },
+    "parse-json": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+      "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+      "dev": true,
+      "requires": {
+        "error-ex": "^1.2.0"
+      }
+    },
+    "path-exists": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+      "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+      "dev": true
+    },
     "path-is-absolute": {
       "version": "1.0.1",
-      "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
       "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
       "dev": true
     },
     "path-is-inside": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
       "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
       "dev": true
@@ -931,90 +1265,135 @@
       "dev": true
     },
     "path-parse": {
       "version": "1.0.6",
       "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
       "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
       "dev": true
     },
-    "pluralize": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz",
-      "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==",
+    "path-type": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
+      "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
+      "dev": true,
+      "requires": {
+        "pify": "^2.0.0"
+      }
+    },
+    "pify": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+      "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
       "dev": true
     },
+    "pkg-dir": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
+      "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
+      "dev": true,
+      "requires": {
+        "find-up": "^2.1.0"
+      }
+    },
     "prelude-ls": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
       "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
       "dev": true
     },
+    "prettier-linter-helpers": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
+      "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
+      "dev": true,
+      "requires": {
+        "fast-diff": "^1.1.2"
+      }
+    },
     "progress": {
       "version": "2.0.3",
       "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
       "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
       "dev": true
     },
     "prop-types": {
-      "version": "15.6.2",
-      "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz",
-      "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==",
+      "version": "15.7.2",
+      "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz",
+      "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==",
       "dev": true,
       "requires": {
-        "loose-envify": "^1.3.1",
-        "object-assign": "^4.1.1"
+        "loose-envify": "^1.4.0",
+        "object-assign": "^4.1.1",
+        "react-is": "^16.8.1"
       }
     },
     "punycode": {
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
       "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
       "dev": true
     },
+    "react-is": {
+      "version": "16.8.6",
+      "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz",
+      "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==",
+      "dev": true
+    },
+    "read-pkg": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
+      "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
+      "dev": true,
+      "requires": {
+        "load-json-file": "^2.0.0",
+        "normalize-package-data": "^2.3.2",
+        "path-type": "^2.0.0"
+      }
+    },
+    "read-pkg-up": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
+      "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
+      "dev": true,
+      "requires": {
+        "find-up": "^2.0.0",
+        "read-pkg": "^2.0.0"
+      }
+    },
     "readable-stream": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.1.1.tgz",
-      "integrity": "sha512-DkN66hPyqDhnIQ6Jcsvx9bFjhw214O4poMBcIMgPVpQvNy9a0e0Uhg5SqySyDKAmUlwt8LonTBz1ezOnM8pUdA==",
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.3.0.tgz",
+      "integrity": "sha512-EsI+s3k3XsW+fU8fQACLN59ky34AZ14LoeVZpYwmZvldCFo0r0gnelwF2TcMjLor/BTL5aDJVBMkss0dthToPw==",
       "dev": true,
       "requires": {
         "inherits": "^2.0.3",
         "string_decoder": "^1.1.1",
         "util-deprecate": "^1.0.1"
       }
     },
     "regexpp": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz",
       "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==",
       "dev": true
     },
-    "require-uncached": {
-      "version": "1.0.3",
-      "resolved": "http://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz",
-      "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=",
-      "dev": true,
-      "requires": {
-        "caller-path": "^0.1.0",
-        "resolve-from": "^1.0.0"
-      }
-    },
     "resolve": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.9.0.tgz",
-      "integrity": "sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ==",
+      "version": "1.10.0",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz",
+      "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==",
       "dev": true,
       "requires": {
         "path-parse": "^1.0.6"
       }
     },
     "resolve-from": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz",
-      "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=",
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+      "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
       "dev": true
     },
     "restore-cursor": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
       "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
       "dev": true,
       "requires": {
@@ -1036,19 +1415,19 @@
       "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
       "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
       "dev": true,
       "requires": {
         "is-promise": "^2.1.0"
       }
     },
     "rxjs": {
-      "version": "6.3.3",
-      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz",
-      "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==",
+      "version": "6.4.0",
+      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz",
+      "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==",
       "dev": true,
       "requires": {
         "tslib": "^1.9.0"
       }
     },
     "safe-buffer": {
       "version": "5.1.2",
       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
@@ -1063,19 +1442,19 @@
     },
     "sax": {
       "version": "1.2.4",
       "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
       "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
       "dev": true
     },
     "semver": {
-      "version": "5.6.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
-      "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==",
+      "version": "5.7.0",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
+      "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
       "dev": true
     },
     "shebang-command": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
       "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
       "dev": true,
       "requires": {
@@ -1090,29 +1469,61 @@
     },
     "signal-exit": {
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
       "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
       "dev": true
     },
     "slice-ansi": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.0.0.tgz",
-      "integrity": "sha512-4j2WTWjp3GsZ+AOagyzVbzp4vWGtZ0hEZ/gDY/uTvm6MTxUfTUIsnMIFb1bn8o0RuXiqUw15H1bue8f22Vw2oQ==",
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
+      "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
       "dev": true,
       "requires": {
         "ansi-styles": "^3.2.0",
         "astral-regex": "^1.0.0",
         "is-fullwidth-code-point": "^2.0.0"
       }
     },
+    "spdx-correct": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz",
+      "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==",
+      "dev": true,
+      "requires": {
+        "spdx-expression-parse": "^3.0.0",
+        "spdx-license-ids": "^3.0.0"
+      }
+    },
+    "spdx-exceptions": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz",
+      "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==",
+      "dev": true
+    },
+    "spdx-expression-parse": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
+      "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
+      "dev": true,
+      "requires": {
+        "spdx-exceptions": "^2.1.0",
+        "spdx-license-ids": "^3.0.0"
+      }
+    },
+    "spdx-license-ids": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz",
+      "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==",
+      "dev": true
+    },
     "sprintf-js": {
       "version": "1.0.3",
-      "resolved": "http://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
       "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
       "dev": true
     },
     "string-width": {
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
       "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
       "dev": true,
@@ -1134,52 +1545,86 @@
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
       "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
       "dev": true,
       "requires": {
         "ansi-regex": "^3.0.0"
       }
     },
+    "strip-bom": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+      "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+      "dev": true
+    },
     "strip-json-comments": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
       "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
       "dev": true
     },
     "supports-color": {
       "version": "5.5.0",
       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
       "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
       "dev": true,
       "requires": {
         "has-flag": "^3.0.0"
       }
     },
     "table": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/table/-/table-5.1.1.tgz",
-      "integrity": "sha512-NUjapYb/qd4PeFW03HnAuOJ7OMcBkJlqeClWxeNlQ0lXGSb52oZXGzkO0/I0ARegQ2eUT1g2VDJH0eUxDRcHmw==",
+      "version": "5.2.3",
+      "resolved": "https://registry.npmjs.org/table/-/table-5.2.3.tgz",
+      "integrity": "sha512-N2RsDAMvDLvYwFcwbPyF3VmVSSkuF+G1e+8inhBLtHpvwXGw4QRPEZhihQNeEN0i1up6/f6ObCJXNdlRG3YVyQ==",
       "dev": true,
       "requires": {
-        "ajv": "^6.6.1",
+        "ajv": "^6.9.1",
         "lodash": "^4.17.11",
-        "slice-ansi": "2.0.0",
-        "string-width": "^2.1.1"
+        "slice-ansi": "^2.1.0",
+        "string-width": "^3.0.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+          "dev": true
+        },
+        "string-width": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+          "dev": true,
+          "requires": {
+            "emoji-regex": "^7.0.1",
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^5.1.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^4.1.0"
+          }
+        }
       }
     },
     "text-table": {
       "version": "0.2.0",
       "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
       "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
       "dev": true
     },
     "through": {
       "version": "2.3.8",
-      "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz",
+      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
       "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
       "dev": true
     },
     "tmp": {
       "version": "0.0.33",
       "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
       "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
       "dev": true,
@@ -1212,16 +1657,26 @@
       }
     },
     "util-deprecate": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
       "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
       "dev": true
     },
+    "validate-npm-package-license": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+      "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+      "dev": true,
+      "requires": {
+        "spdx-correct": "^3.0.0",
+        "spdx-expression-parse": "^3.0.0"
+      }
+    },
     "which": {
       "version": "1.3.1",
       "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
       "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
       "dev": true,
       "requires": {
         "isexe": "^2.0.0"
       }
@@ -1234,18 +1689,18 @@
     },
     "wrappy": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
       "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
       "dev": true
     },
     "write": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz",
-      "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=",
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
+      "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
       "dev": true,
       "requires": {
         "mkdirp": "^0.5.1"
       }
     }
   }
 }
--- a/package.json
+++ b/package.json
@@ -1,17 +1,24 @@
 {
   "name": "mozilla-central",
   "description": "This package file is for node modules used in mozilla-central",
   "repository": {},
   "license": "MPL-2.0",
   "dependencies": {},
   "devDependencies": {
-    "eslint": "5.11.1",
-    "eslint-plugin-html": "5.0.0",
+    "eslint": "5.16.0",
+    "eslint-plugin-babel": "5.3.0",
+    "eslint-plugin-file-header": "0.0.1",
+    "eslint-plugin-flowtype": "3.6.0",
+    "eslint-plugin-html": "5.0.3",
+    "eslint-plugin-import": "2.16.0",
+    "eslint-plugin-jest": "22.4.1",
+    "eslint-plugin-jsx-a11y": "6.2.1",
     "eslint-plugin-mozilla": "file:tools/lint/eslint/eslint-plugin-mozilla",
     "eslint-plugin-no-unsanitized": "3.0.2",
-    "eslint-plugin-react": "7.12.2",
+    "eslint-plugin-prettier": "3.0.1",
+    "eslint-plugin-react": "7.12.4",
     "eslint-plugin-spidermonkey-js": "file:tools/lint/eslint/eslint-plugin-spidermonkey-js"
   },
   "notes(private)": "We don't want to publish to npm, so this is marked as private",
   "private": true
 }
--- a/taskcluster/ci/source-test/coverity.yml
+++ b/taskcluster/ci/source-test/coverity.yml
@@ -1,9 +1,13 @@
 job-defaults:
+    # Run only on try and code-review tasks
+    # to avoid running Coverity SA on the whole codebase
+    run-on-projects:
+        - try
     platform: linux64/opt
     attributes:
         code-review: true
     worker-type:
         by-platform:
             linux64.*: aws-provisioner-v1/gecko-t-linux-xlarge
     worker:
         docker-image: {in-tree: debian7-amd64-build}
--- a/taskcluster/taskgraph/transforms/job/python_test.py
+++ b/taskcluster/taskgraph/transforms/job/python_test.py
@@ -34,16 +34,16 @@ defaults = {
 @run_job_using('docker-worker', 'python-test', schema=python_test_schema, defaults=defaults)
 @run_job_using('generic-worker', 'python-test', schema=python_test_schema, defaults=defaults)
 def configure_python_test(config, job, taskdesc):
     run = job['run']
     worker = job['worker']
 
     if worker['os'] == 'macosx' and run['python-version'] == 3:
         # OSX hosts can't seem to find python 3 on their own
-        run['python-version'] = '/usr/local/bin/python3'
+        run['python-version'] = '/tools/python36/bin/python3.6'
 
     # defer to the mach implementation
     run['mach'] = 'python-test --python {python-version} --subsuite {subsuite}'.format(**run)
     run['using'] = 'mach'
     del run['python-version']
     del run['subsuite']
     configure_taskdesc_for_run(config, job, taskdesc, worker['implementation'])
new file mode 100644
--- /dev/null
+++ b/testing/addtest.py
@@ -0,0 +1,111 @@
+
+from __future__ import absolute_import, unicode_literals, print_function
+
+import os
+import manifestparser
+
+
+class XpcshellCreator():
+    template_body = """/* Any copyright is dedicated to the Public Domain.
+http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+add_task(async function test_TODO() {
+  ok(true, "TODO: implement the test");
+});
+"""
+
+    def get_template_contents(self, suite, doc):
+        return self.template_body
+
+    def add_test(self, test, suite, doc):
+        content = self.get_template_contents(suite, doc)
+        with open(test, "w") as f:
+            f.write(content)
+
+        manifest_file = os.path.join(os.path.dirname(test), "xpcshell.ini")
+        filename = os.path.basename(test)
+
+        if not os.path.isfile(manifest_file):
+            print('Could not open manifest file {}'.format(manifest_file))
+            return
+        write_to_ini_file(manifest_file, filename)
+
+
+class MochitestCreator():
+    def get_template_contents(self, suite, doc):
+        mochitest_templates = os.path.abspath(
+            os.path.join(os.path.dirname(__file__), 'mochitest', 'static')
+        )
+        template_file_name = None
+        if suite == "mochitest-browser":
+            template_file_name = 'browser.template.txt'
+
+        if suite == "mochitest-plain":
+            template_file_name = 'plain{}.template.txt'.format(doc)
+
+        if suite == "mochitest-chrome":
+            template_file_name = 'chrome{}.template.txt'.format(doc)
+
+        if template_file_name is None:
+            return None
+
+        template_file = os.path.join(mochitest_templates, template_file_name)
+        if not os.path.isfile(template_file):
+            return None
+
+        with open(template_file) as f:
+            return f.read()
+
+    def add_test(self, test, suite, doc):
+        content = self.get_template_contents(suite, doc)
+        with open(test, "w") as f:
+            f.write(content)
+
+        # attempt to insert into the appropriate manifest
+        guessed_ini = {
+            "mochitest-plain": "mochitest.ini",
+            "mochitest-chrome": "chrome.ini",
+            "mochitest-browser": "browser.ini"
+        }[suite]
+        manifest_file = os.path.join(os.path.dirname(test), guessed_ini)
+        filename = os.path.basename(test)
+
+        if not os.path.isfile(manifest_file):
+            print('Could not open manifest file {}'.format(manifest_file))
+            return
+
+        write_to_ini_file(manifest_file, filename)
+
+
+def write_to_ini_file(manifest_file, filename):
+    # Insert a new test in the right place within a given manifest file
+    manifest = manifestparser.TestManifest(manifests=[manifest_file])
+    insert_before = None
+
+    if any(t['name'] == filename for t in manifest.tests):
+        print("{} is already in the manifest.".format(filename))
+        return
+
+    for test in manifest.tests:
+        if test.get('name') > filename:
+            insert_before = test.get('name')
+            break
+
+    with open(manifest_file, "r") as f:
+        contents = f.readlines()
+
+    filename = '[{}]\n'.format(filename)
+
+    if not insert_before:
+        contents.append(filename)
+    else:
+        insert_before = '[{}]'.format(insert_before)
+        for i in range(len(contents)):
+            if contents[i].startswith(insert_before):
+                contents.insert(i, filename)
+                break
+
+    with open(manifest_file, "w") as f:
+        f.write("".join(contents))
--- a/testing/mach_commands.py
+++ b/testing/mach_commands.py
@@ -78,17 +78,138 @@ def get_test_parser():
     parser.add_argument('extra_args', default=None, nargs=argparse.REMAINDER,
                         help="Extra arguments to pass to the underlying test command(s). "
                              "If an underlying command doesn't recognize the argument, it "
                              "will fail.")
     add_logging_group(parser)
     return parser
 
 
+ADD_TEST_SUPPORTED_SUITES = ['mochitest-chrome', 'mochitest-plain', 'mochitest-browser',
+                             'xpcshell']
+ADD_TEST_SUPPORTED_DOCS = ['js', 'html', 'xhtml', 'xul']
+
+
 @CommandProvider
+class AddTest(MachCommandBase):
+    @Command('addtest', category='testing',
+             description='Generate tests based on templates')
+    @CommandArgument('--suite',
+                     choices=ADD_TEST_SUPPORTED_SUITES,
+                     help='suite for the test (currently only mochitests and xpcshell '
+                          'are supported). If you pass a `test` argument this will be determined'
+                          'based on the filename and the folder it is in')
+    @CommandArgument('-o', '--overwrite',
+                     action='store_true',
+                     help='Overwrite an existing file if it exists.')
+    @CommandArgument('--doc',
+                     choices=ADD_TEST_SUPPORTED_DOCS,
+                     help='Document type for the test (if applicable).'
+                          'If you pass a `test` argument this will be determined'
+                          'based on the filename.')
+    @CommandArgument('test',
+                     nargs='?',
+                     help=('Test to create.'))
+    def addtest(self, suite=None, doc=None, overwrite=False, test=None):
+        if test:
+            if not overwrite and os.path.isfile(os.path.abspath(test)):
+                print("Error: can't generate a test that already exists:", test)
+                return 1
+
+            abs_test = os.path.abspath(test)
+            if doc is None:
+                doc = self.guess_doc(abs_test)
+            if suite is None:
+                guessed_suite, err = self.guess_suite(abs_test)
+                if err:
+                    print(err)
+                    return 1
+                suite = guessed_suite
+
+        else:
+            test = None
+            if doc is None:
+                doc = "html"
+
+        if not suite:
+            print("We couldn't automatically determine a suite. "
+                  "Please specify `--suite` with one of the following options:\n{}\n"
+                  "If you'd like to add support to a new suite, please file a bug "
+                  "blocking https://bugzilla.mozilla.org/show_bug.cgi?id=1540285."
+                  .format(ADD_TEST_SUPPORTED_SUITES))
+            return 1
+
+        if doc not in ADD_TEST_SUPPORTED_DOCS:
+            print("Error: invalid `doc`. Either pass in a test with a valid extension"
+                  "({}) or pass in the `doc` argument".format(ADD_TEST_SUPPORTED_DOCS))
+            return 1
+
+        from addtest import (
+            MochitestCreator,
+            XpcshellCreator,
+        )
+        creator = None
+        if suite == "xpcshell":
+            creator = XpcshellCreator()
+        elif suite in ("mochitest-browser", "mochitest-chrome", "mochitest-plain"):
+            creator = MochitestCreator()
+        else:
+            print("Sorry, `addtest` doesn't currently know how to add {}".format(suite))
+            return 1
+
+        if (test):
+            print("Adding a test at {} (suite `{}`)".format(test, suite))
+
+            adding_error = creator.add_test(test, suite, doc)
+
+            if adding_error:
+                print("Error adding test: {}".format(adding_error))
+                return 1
+
+            mach_command = TEST_SUITES[suite]["mach_command"]
+            print('Please make sure to add the new test to your commit. '
+                  'You can now run the test with:\n    ./mach {} {}'.format(mach_command, test))
+        else:
+            # write to stdout if you passed only suite and doc and not a file path
+            print(creator.get_template_contents(suite, doc))
+        return 0
+
+    def guess_doc(self, abs_test):
+        filename = os.path.basename(abs_test)
+        return os.path.splitext(filename)[1].strip(".")
+
+    def guess_suite(self, abs_test):
+        # If you pass a abs_test, try to detect the type based on the name
+        # and folder. This detection can be skipped if you pass the `type` arg.
+        err = None
+        guessed_suite = None
+        parent = os.path.dirname(abs_test)
+        filename = os.path.basename(abs_test)
+
+        has_browser_ini = os.path.isfile(os.path.join(parent, "browser.ini"))
+        has_chrome_ini = os.path.isfile(os.path.join(parent, "chrome.ini"))
+        has_plain_ini = os.path.isfile(os.path.join(parent, "mochitest.ini"))
+        has_xpcshell_ini = os.path.isfile(os.path.join(parent, "xpcshell.ini"))
+
+        if filename.startswith("test_") and has_xpcshell_ini and self.guess_doc(abs_test) == "js":
+            guessed_suite = "xpcshell"
+        else:
+            if filename.startswith("browser_") and has_browser_ini:
+                guessed_suite = "mochitest-browser"
+            elif filename.startswith("test_"):
+                if has_chrome_ini and has_plain_ini:
+                    err = ("Error: directory contains both a chrome.ini and mochitest.ini. "
+                           "Please set --suite=mochitest-chrome or --suite=mochitest-plain.")
+                elif has_chrome_ini:
+                    guessed_suite = "mochitest-chrome"
+                elif has_plain_ini:
+                    guessed_suite = "mochitest-plain"
+        return guessed_suite, err
+
+
 class Test(MachCommandBase):
     @Command('test', category='testing',
              description='Run tests (detects the kind of test and runs it).',
              parser=get_test_parser)
     def test(self, what, extra_args, **log_args):
         """Run tests from names or paths.
 
         mach test accepts arguments specifying which tests to run. Each argument
deleted file mode 100644
--- a/testing/mochitest/gen_template.pl
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/usr/bin/perl
-
-# This script makes mochitest test case templates. See
-# https://developer.mozilla.org/en-US/docs/Mochitest#Test_templates
-#
-# It takes two arguments:
-#
-#   -b:     a bugnumber
-#   -type:  template type. One of {plain|xhtml|xul|th|chrome|chromexul}.
-#           Defaults to th (testharness.js).
-#
-# For example, this command:
-#
-#  perl gen_template.pl -b 345876 -type xul
-#
-# writes a XUL test case template for bug 345876 to stdout.
-
-use FindBin;
-use Getopt::Long;
-GetOptions("b=i"=> \$bug_number,
-           "type:s"=> \$template_type);
-
-if ($template_type eq "xul") {
-  $template_type = "$FindBin::RealBin/static/xul.template.txt";
-} elsif ($template_type eq "xhtml") {
-  $template_type = "$FindBin::RealBin/static/xhtml.template.txt";
-} elsif ($template_type eq "chrome") {
-  $template_type = "$FindBin::RealBin/static/chrome.template.txt";
-} elsif ($template_type eq "chromexul") {
-  $template_type = "$FindBin::RealBin/static/chromexul.template.txt";
-} elsif ($template_type eq "plain") {
-  $template_type = "$FindBin::RealBin/static/test.template.txt";
-} else {
-  $template_type = "$FindBin::RealBin/static/th.template.txt";
-}
-
-open(IN,$template_type) or die("Failed to open myfile for reading.");
-while((defined(IN)) && ($line = <IN>)) {
-        $line =~ s/{BUGNUMBER}/$bug_number/g;
-        print STDOUT $line;
-}
-close(IN);
--- a/testing/mochitest/moz.build
+++ b/testing/mochitest/moz.build
@@ -99,17 +99,16 @@ TEST_HARNESS_FILES.testing.mochitest += 
     '/build/valgrind/x86_64-pc-linux-gnu.sup',
     '/netwerk/test/httpserver/httpd.js',
     'bisection.py',
     'browser-harness.xul',
     'browser-test.js',
     'chrome-harness.js',
     'chunkifyTests.js',
     'favicon.ico',
-    'gen_template.pl',
     'harness.xul',
     'leaks.py',
     'mach_test_package_commands.py',
     'manifest.webapp',
     'manifestLibrary.js',
     'mochitest_options.py',
     'nested_setup.js',
     'pywebsocket_wrapper.py',
new file mode 100644
--- /dev/null
+++ b/testing/mochitest/static/browser.template.txt
@@ -0,0 +1,8 @@
+/* Any copyright is dedicated to the Public Domain.
+   http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+add_task(async function test_TODO() {
+  ok(true, "TODO: implement the test");
+});
rename from testing/mochitest/static/chrome.template.txt
rename to testing/mochitest/static/chromehtml.template.txt
--- a/testing/mochitest/static/chrome.template.txt
+++ b/testing/mochitest/static/chromehtml.template.txt
@@ -1,31 +1,23 @@
 <!DOCTYPE HTML>
 <html>
-<!--
-https://bugzilla.mozilla.org/show_bug.cgi?id={BUGNUMBER}
--->
 <head>
   <meta charset="utf-8">
-  <title>Test for Bug {BUGNUMBER}</title>
-  <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
-  <link rel="stylesheet" type="text/css" href="chrome://global/skin"/>
+  <title><!-- TODO: insert title here --></title>
+  <script src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
+  <script src="chrome://mochikit/content/tests/SimpleTest/AddTask.js"></script>
   <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"/>
-  <script type="application/javascript">
-
-  /** Test for Bug {BUGNUMBER} **/
-
-
-
-
-
+  <script>
+    add_task(async function test_TODO() {
+      ok(true, "TODO: implement the test");
+    });
   </script>
 </head>
 <body>
-<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id={BUGNUMBER}">Mozilla Bug {BUGNUMBER}</a>
 <p id="display"></p>
 <div id="content" style="display: none">
 
 </div>
 <pre id="test">
 </pre>
 </body>
 </html>
new file mode 100644
--- /dev/null
+++ b/testing/mochitest/static/chromexhtml.template.txt
@@ -0,0 +1,23 @@
+<!DOCTYPE HTML>
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+  <meta charset="utf-8" />
+  <title><!-- TODO: insert title here --></title>
+  <script src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
+  <script src="chrome://mochikit/content/tests/SimpleTest/AddTask.js"></script>
+  <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"/>
+  <script><![CDATA[
+    add_task(async function test_TODO() {
+      ok(true, "TODO: implement the test");
+    });
+  ]]></script>
+</head>
+<body>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+</pre>
+</body>
+</html>
--- a/testing/mochitest/static/chromexul.template.txt
+++ b/testing/mochitest/static/chromexul.template.txt
@@ -1,26 +1,18 @@
 <?xml version="1.0"?>
 <?xml-stylesheet type="text/css" href="chrome://global/skin"?>
 <?xml-stylesheet type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"?>
-<!--
-https://bugzilla.mozilla.org/show_bug.cgi?id={BUGNUMBER}
--->
-<window title="Mozilla Bug {BUGNUMBER}"
+<window title="TODO: Insert title here"
         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-  <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/>
+  <script type="application/javascript"
+          src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js" />
+  <script type="application/javascript"
+          src="chrome://mochikit/content/tests/SimpleTest/AddTask.js" />
+  <script type="application/javascript"><![CDATA[
+    add_task(async function test_TODO() {
+      ok(true, "TODO: implement the test");
+    });
+  ]]></script>
 
-  <!-- test results are displayed in the html:body -->
   <body xmlns="http://www.w3.org/1999/xhtml">
-  <a href="https://bugzilla.mozilla.org/show_bug.cgi?id={BUGNUMBER}"
-     target="_blank">Mozilla Bug {BUGNUMBER}</a>
   </body>
-
-  <!-- test code goes here -->
-  <script type="application/javascript">
-  <![CDATA[
-  /** Test for Bug {BUGNUMBER} **/
-
-
-
-  ]]>
-  </script>
 </window>
rename from testing/mochitest/static/test.template.txt
rename to testing/mochitest/static/plainhtml.template.txt
--- a/testing/mochitest/static/test.template.txt
+++ b/testing/mochitest/static/plainhtml.template.txt
@@ -1,30 +1,20 @@
 <!DOCTYPE HTML>
 <html>
-<!--
-https://bugzilla.mozilla.org/show_bug.cgi?id={BUGNUMBER}
--->
 <head>
   <meta charset="utf-8">
-  <title>Test for Bug {BUGNUMBER}</title>
-  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <title><!-- TODO: insert title here --></title>
+  <script src="/tests/SimpleTest/SimpleTest.js"></script>
   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
-  <script type="application/javascript">
-
-  /** Test for Bug {BUGNUMBER} **/
-
-
-
-
-
+  <script>
+    ok(true, "TODO: implement the test");
   </script>
 </head>
 <body>
-<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id={BUGNUMBER}">Mozilla Bug {BUGNUMBER}</a>
 <p id="display"></p>
 <div id="content" style="display: none">
 
 </div>
 <pre id="test">
 </pre>
 </body>
 </html>
rename from testing/mochitest/static/xhtml.template.txt
rename to testing/mochitest/static/plainxhtml.template.txt
--- a/testing/mochitest/static/xhtml.template.txt
+++ b/testing/mochitest/static/plainxhtml.template.txt
@@ -1,29 +1,20 @@
+<!DOCTYPE HTML>
 <html xmlns="http://www.w3.org/1999/xhtml">
-<!--
-https://bugzilla.mozilla.org/show_bug.cgi?id={BUGNUMBER}
--->
 <head>
-  <title>Test for Bug {BUGNUMBER}</title>
-  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <meta charset="utf-8" />
+  <title><!-- TODO: insert title here --></title>
+  <script src="/tests/SimpleTest/SimpleTest.js"></script>
   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
-  <script type="application/javascript">
-  <![CDATA[
-
-  /** Test for Bug {BUGNUMBER} **/
-
-
-
-
-  ]]>
-</script>
+  <script><![CDATA[
+    ok(true, "TODO: implement the test");
+  ]]></script>
 </head>
 <body>
-<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id={BUGNUMBER}">Mozilla Bug {BUGNUMBER}</a>
 <p id="display"></p>
 <div id="content" style="display: none">
 
 </div>
 <pre id="test">
 </pre>
 </body>
 </html>
rename from testing/mochitest/static/xul.template.txt
rename to testing/mochitest/static/plainxul.template.txt
--- a/testing/mochitest/static/xul.template.txt
+++ b/testing/mochitest/static/plainxul.template.txt
@@ -1,28 +1,12 @@
 <?xml version="1.0"?>
 <?xml-stylesheet type="text/css" href="chrome://global/skin"?>
 <?xml-stylesheet type="text/css" href="/tests/SimpleTest/test.css"?>
-<!--
-https://bugzilla.mozilla.org/show_bug.cgi?id={BUGNUMBER}
--->
-<window title="Mozilla Bug {BUGNUMBER}"
+<window title="TODO: Insert title here"
         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-  <script type="application/javascript"
-          src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/>
-
-  <!-- test code goes here -->
-  <script type="application/javascript">
-  <![CDATA[
-
-  /** Test for Bug {BUGNUMBER} **/
-
-
-
-  ]]>
-  </script>
-
-  <!-- test results are displayed in the html:body -->
+  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <script type="application/javascript"><![CDATA[
+    ok(true, "TODO: implement the test");
+  ]]></script>
   <body xmlns="http://www.w3.org/1999/xhtml">
-  <a href="https://bugzilla.mozilla.org/show_bug.cgi?id={BUGNUMBER}"
-     target="_blank">Mozilla Bug {BUGNUMBER}</a>
   </body>
 </window>
deleted file mode 100644
--- a/testing/mochitest/static/th.template.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-<!DOCTYPE html>
-<meta charset=utf-8>
-<title>Test for ...</title>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<div id="log"></div>
-<script>
-test(function() {
-
-}, "Description");
-</script>
deleted file mode 100644
--- a/testing/web-platform/meta/MANIFEST.json
+++ /dev/null
@@ -1,671424 +0,0 @@
-{
- "items": {
-  "manual": {
-   "2dcontext/conformance-requirements/2d.coordinatespace-manual.html": [
-    [
-     "/2dcontext/conformance-requirements/2d.coordinatespace-manual.html",
-     {}
-    ]
-   ],
-   "2dcontext/drawing-paths-to-the-canvas/canvas_focus_drawFocusIfNeeded_AAPI_001-manual.html": [
-    [
-     "/2dcontext/drawing-paths-to-the-canvas/canvas_focus_drawFocusIfNeeded_AAPI_001-manual.html",
-     {}
-    ]
-   ],
-   "2dcontext/drawing-text-to-the-canvas/2d.text.draw.fill.basic-manual.html": [
-    [
-     "/2dcontext/drawing-text-to-the-canvas/2d.text.draw.fill.basic-manual.html",
-     {}
-    ]
-   ],
-   "2dcontext/drawing-text-to-the-canvas/2d.text.draw.fill.maxWidth.large-manual.html": [
-    [
-     "/2dcontext/drawing-text-to-the-canvas/2d.text.draw.fill.maxWidth.large-manual.html",
-     {}
-    ]
-   ],
-   "2dcontext/drawing-text-to-the-canvas/2d.text.draw.fill.rtl-manual.html": [
-    [
-     "/2dcontext/drawing-text-to-the-canvas/2d.text.draw.fill.rtl-manual.html",
-     {}
-    ]
-   ],
-   "2dcontext/drawing-text-to-the-canvas/2d.text.draw.kern.consistent-manual.html": [
-    [
-     "/2dcontext/drawing-text-to-the-canvas/2d.text.draw.kern.consistent-manual.html",
-     {}
-    ]
-   ],
-   "2dcontext/drawing-text-to-the-canvas/2d.text.draw.stroke.basic-manual.html": [
-    [
-     "/2dcontext/drawing-text-to-the-canvas/2d.text.draw.stroke.basic-manual.html",
-     {}
-    ]
-   ],
-   "2dcontext/shadows/2d.shadow.blur.high-manual.html": [
-    [
-     "/2dcontext/shadows/2d.shadow.blur.high-manual.html",
-     {}
-    ]
-   ],
-   "2dcontext/shadows/2d.shadow.blur.low-manual.html": [
-    [
-     "/2dcontext/shadows/2d.shadow.blur.low-manual.html",
-     {}
-    ]
-   ],
-   "FileAPI/BlobURL/test2-manual.html": [
-    [
-     "/FileAPI/BlobURL/test2-manual.html",
-     {}
-    ]
-   ],
-   "FileAPI/FileReader/test_errors-manual.html": [
-    [
-     "/FileAPI/FileReader/test_errors-manual.html",
-     {}
-    ]
-   ],
-   "FileAPI/FileReader/test_notreadableerrors-manual.html": [
-    [
-     "/FileAPI/FileReader/test_notreadableerrors-manual.html",
-     {}
-    ]
-   ],
-   "FileAPI/FileReader/test_securityerrors-manual.html": [
-    [
-     "/FileAPI/FileReader/test_securityerrors-manual.html",
-     {}
-    ]
-   ],
-   "FileAPI/filelist-section/filelist_multiple_selected_files-manual.html": [
-    [
-     "/FileAPI/filelist-section/filelist_multiple_selected_files-manual.html",
-     {}
-    ]
-   ],
-   "FileAPI/filelist-section/filelist_selected_file-manual.html": [
-    [
-     "/FileAPI/filelist-section/filelist_selected_file-manual.html",
-     {}
-    ]
-   ],
-   "FileAPI/idlharness-manual.html": [
-    [
-     "/FileAPI/idlharness-manual.html",
-     {}
-    ]
-   ],
-   "FileAPI/progress-manual.html": [
-    [
-     "/FileAPI/progress-manual.html",
-     {}
-    ]
-   ],
-   "FileAPI/reading-data-section/filereader_file-manual.html": [
-    [
-     "/FileAPI/reading-data-section/filereader_file-manual.html",
-     {}
-    ]
-   ],
-   "FileAPI/reading-data-section/filereader_file_img-manual.html": [
-    [
-     "/FileAPI/reading-data-section/filereader_file_img-manual.html",
-     {}
-    ]
-   ],
-   "FileAPI/url/url_createobjecturl_file-manual.html": [
-    [
-     "/FileAPI/url/url_createobjecturl_file-manual.html",
-     {}
-    ]
-   ],
-   "FileAPI/url/url_createobjecturl_file_img-manual.html": [
-    [
-     "/FileAPI/url/url_createobjecturl_file_img-manual.html",
-     {}
-    ]
-   ],
-   "accelerometer/Accelerometer_onerror-manual.https.html": [
-    [
-     "/accelerometer/Accelerometer_onerror-manual.https.html",
-     {}
-    ]
-   ],
-   "accelerometer/LinearAccelerationSensor-shake-threshold-manual.https.html": [
-    [
-     "/accelerometer/LinearAccelerationSensor-shake-threshold-manual.https.html",
-     {}
-    ]
-   ],
-   "accname/description_1.0_combobox-focusable-manual.html": [
-    [
-     "/accname/description_1.0_combobox-focusable-manual.html",
-     {}
-    ]
-   ],
-   "accname/description_from_content_of_describedby_element-manual.html": [
-    [
-     "/accname/description_from_content_of_describedby_element-manual.html",
-     {}
-    ]
-   ],
-   "accname/description_link-with-label-manual.html": [
-    [
-     "/accname/description_link-with-label-manual.html",
-     {}
-    ]
-   ],
-   "accname/description_test_case_557-manual.html": [
-    [
-     "/accname/description_test_case_557-manual.html",
-     {}
-    ]
-   ],
-   "accname/description_test_case_664-manual.html": [
-    [
-     "/accname/description_test_case_664-manual.html",
-     {}
-    ]
-   ],
-   "accname/description_test_case_665-manual.html": [
-    [
-     "/accname/description_test_case_665-manual.html",
-     {}
-    ]
-   ],
-   "accname/description_test_case_666-manual.html": [
-    [
-     "/accname/description_test_case_666-manual.html",
-     {}
-    ]
-   ],
-   "accname/description_test_case_772-manual.html": [
-    [
-     "/accname/description_test_case_772-manual.html",
-     {}
-    ]
-   ],
-   "accname/description_test_case_773-manual.html": [
-    [
-     "/accname/description_test_case_773-manual.html",
-     {}
-    ]
-   ],
-   "accname/description_test_case_774-manual.html": [
-    [
-     "/accname/description_test_case_774-manual.html",
-     {}
-    ]
-   ],
-   "accname/description_test_case_838-manual.html": [
-    [
-     "/accname/description_test_case_838-manual.html",
-     {}
-    ]
-   ],
-   "accname/description_test_case_broken_reference-manual.html": [
-    [
-     "/accname/description_test_case_broken_reference-manual.html",
-     {}
-    ]
-   ],
-   "accname/description_test_case_one_valid_reference-manual.html": [
-    [
-     "/accname/description_test_case_one_valid_reference-manual.html",
-     {}
-    ]
-   ],
-   "accname/description_title-same-element-manual.html": [
-    [
-     "/accname/description_title-same-element-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_1.0_combobox-focusable-alternative-manual.html": [
-    [
-     "/accname/name_1.0_combobox-focusable-alternative-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_1.0_combobox-focusable-manual.html": [
-    [
-     "/accname/name_1.0_combobox-focusable-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_checkbox-label-embedded-combobox-manual.html": [
-    [
-     "/accname/name_checkbox-label-embedded-combobox-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_checkbox-label-embedded-listbox-manual.html": [
-    [
-     "/accname/name_checkbox-label-embedded-listbox-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_checkbox-label-embedded-menu-manual.html": [
-    [
-     "/accname/name_checkbox-label-embedded-menu-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_checkbox-label-embedded-select-manual.html": [
-    [
-     "/accname/name_checkbox-label-embedded-select-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_checkbox-label-embedded-slider-manual.html": [
-    [
-     "/accname/name_checkbox-label-embedded-slider-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_checkbox-label-embedded-spinbutton-manual.html": [
-    [
-     "/accname/name_checkbox-label-embedded-spinbutton-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_checkbox-label-embedded-textbox-manual.html": [
-    [
-     "/accname/name_checkbox-label-embedded-textbox-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_checkbox-label-multiple-label-alternative-manual.html": [
-    [
-     "/accname/name_checkbox-label-multiple-label-alternative-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_checkbox-label-multiple-label-manual.html": [
-    [
-     "/accname/name_checkbox-label-multiple-label-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_checkbox-title-manual.html": [
-    [
-     "/accname/name_checkbox-title-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_file-label-embedded-combobox-manual.html": [
-    [
-     "/accname/name_file-label-embedded-combobox-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_file-label-embedded-menu-manual.html": [
-    [
-     "/accname/name_file-label-embedded-menu-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_file-label-embedded-select-manual.html": [
-    [
-     "/accname/name_file-label-embedded-select-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_file-label-embedded-slider-manual.html": [
-    [
-     "/accname/name_file-label-embedded-slider-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_file-label-embedded-spinbutton-manual.html": [
-    [
-     "/accname/name_file-label-embedded-spinbutton-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_file-label-inline-block-elements-manual.html": [
-    [
-     "/accname/name_file-label-inline-block-elements-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_file-label-inline-block-styles-manual.html": [
-    [
-     "/accname/name_file-label-inline-block-styles-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_file-label-inline-hidden-elements-manual.html": [
-    [
-     "/accname/name_file-label-inline-hidden-elements-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_file-label-owned-combobox-manual.html": [
-    [
-     "/accname/name_file-label-owned-combobox-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_file-label-owned-combobox-owned-listbox-manual.html": [
-    [
-     "/accname/name_file-label-owned-combobox-owned-listbox-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_file-title-manual.html": [
-    [
-     "/accname/name_file-title-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_from_content-manual.html": [
-    [
-     "/accname/name_from_content-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_from_content_of_label-manual.html": [
-    [
-     "/accname/name_from_content_of_label-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_from_content_of_labelledby_element-manual.html": [
-    [
-     "/accname/name_from_content_of_labelledby_element-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_from_content_of_labelledby_elements_one_of_which_is_hidden-manual.html": [
-    [
-     "/accname/name_from_content_of_labelledby_elements_one_of_which_is_hidden-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_heading-combobox-focusable-alternative-manual.html": [
-    [
-     "/accname/name_heading-combobox-focusable-alternative-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_image-title-manual.html": [
-    [
-     "/accname/name_image-title-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_link-mixed-content-manual.html": [
-    [
-     "/accname/name_link-mixed-content-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_link-with-label-manual.html": [
-    [
-     "/accname/name_link-with-label-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_password-label-embedded-combobox-manual.html": [
-    [
-     "/accname/name_password-label-embedded-combobox-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_password-label-embedded-menu-manual.html": [
-    [
-     "/accname/name_password-label-embedded-menu-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_password-label-embedded-select-manual.html": [
-    [
-     "/accname/name_password-label-embedded-select-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_password-label-embedded-slider-manual.html": [
-    [
-     "/accname/name_password-label-embedded-slider-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_password-label-embedded-spinbutton-manual.html": [
-    [
-     "/accname/name_password-label-embedded-spinbutton-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_password-title-manual.html": [
-    [
-     "/accname/name_password-title-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_radio-label-embedded-combobox-manual.html": [
-    [
-     "/accname/name_radio-label-embedded-combobox-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_radio-label-embedded-menu-manual.html": [
-    [
-     "/accname/name_radio-label-embedded-menu-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_radio-label-embedded-select-manual.html": [
-    [
-     "/accname/name_radio-label-embedded-select-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_radio-label-embedded-slider-manual.html": [
-    [
-     "/accname/name_radio-label-embedded-slider-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_radio-label-embedded-spinbutton-manual.html": [
-    [
-     "/accname/name_radio-label-embedded-spinbutton-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_radio-title-manual.html": [
-    [
-     "/accname/name_radio-title-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_539-manual.html": [
-    [
-     "/accname/name_test_case_539-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_540-manual.html": [
-    [
-     "/accname/name_test_case_540-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_541-manual.html": [
-    [
-     "/accname/name_test_case_541-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_543-manual.html": [
-    [
-     "/accname/name_test_case_543-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_544-manual.html": [
-    [
-     "/accname/name_test_case_544-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_545-manual.html": [
-    [
-     "/accname/name_test_case_545-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_546-manual.html": [
-    [
-     "/accname/name_test_case_546-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_547-manual.html": [
-    [
-     "/accname/name_test_case_547-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_548-manual.html": [
-    [
-     "/accname/name_test_case_548-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_549-manual.html": [
-    [
-     "/accname/name_test_case_549-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_550-manual.html": [
-    [
-     "/accname/name_test_case_550-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_551-manual.html": [
-    [
-     "/accname/name_test_case_551-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_552-manual.html": [
-    [
-     "/accname/name_test_case_552-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_553-manual.html": [
-    [
-     "/accname/name_test_case_553-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_556-manual.html": [
-    [
-     "/accname/name_test_case_556-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_557-manual.html": [
-    [
-     "/accname/name_test_case_557-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_558-manual.html": [
-    [
-     "/accname/name_test_case_558-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_559-manual.html": [
-    [
-     "/accname/name_test_case_559-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_560-manual.html": [
-    [
-     "/accname/name_test_case_560-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_561-manual.html": [
-    [
-     "/accname/name_test_case_561-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_562-manual.html": [
-    [
-     "/accname/name_test_case_562-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_563-manual.html": [
-    [
-     "/accname/name_test_case_563-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_564-manual.html": [
-    [
-     "/accname/name_test_case_564-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_565-manual.html": [
-    [
-     "/accname/name_test_case_565-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_566-manual.html": [
-    [
-     "/accname/name_test_case_566-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_596-manual.html": [
-    [
-     "/accname/name_test_case_596-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_597-manual.html": [
-    [
-     "/accname/name_test_case_597-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_598-manual.html": [
-    [
-     "/accname/name_test_case_598-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_599-manual.html": [
-    [
-     "/accname/name_test_case_599-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_600-manual.html": [
-    [
-     "/accname/name_test_case_600-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_601-manual.html": [
-    [
-     "/accname/name_test_case_601-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_602-manual.html": [
-    [
-     "/accname/name_test_case_602-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_603-manual.html": [
-    [
-     "/accname/name_test_case_603-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_604-manual.html": [
-    [
-     "/accname/name_test_case_604-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_605-manual.html": [
-    [
-     "/accname/name_test_case_605-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_606-manual.html": [
-    [
-     "/accname/name_test_case_606-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_607-manual.html": [
-    [
-     "/accname/name_test_case_607-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_608-manual.html": [
-    [
-     "/accname/name_test_case_608-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_609-manual.html": [
-    [
-     "/accname/name_test_case_609-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_610-manual.html": [
-    [
-     "/accname/name_test_case_610-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_611-manual.html": [
-    [
-     "/accname/name_test_case_611-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_612-manual.html": [
-    [
-     "/accname/name_test_case_612-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_613-manual.html": [
-    [
-     "/accname/name_test_case_613-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_614-manual.html": [
-    [
-     "/accname/name_test_case_614-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_615-manual.html": [
-    [
-     "/accname/name_test_case_615-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_616-manual.html": [
-    [
-     "/accname/name_test_case_616-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_617-manual.html": [
-    [
-     "/accname/name_test_case_617-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_618-manual.html": [
-    [
-     "/accname/name_test_case_618-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_619-manual.html": [
-    [
-     "/accname/name_test_case_619-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_620-manual.html": [
-    [
-     "/accname/name_test_case_620-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_621-manual.html": [
-    [
-     "/accname/name_test_case_621-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_659-manual.html": [
-    [
-     "/accname/name_test_case_659-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_660-manual.html": [
-    [
-     "/accname/name_test_case_660-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_661-manual.html": [
-    [
-     "/accname/name_test_case_661-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_662-manual.html": [
-    [
-     "/accname/name_test_case_662-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_663a-manual.html": [
-    [
-     "/accname/name_test_case_663a-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_721-manual.html": [
-    [
-     "/accname/name_test_case_721-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_723-manual.html": [
-    [
-     "/accname/name_test_case_723-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_724-manual.html": [
-    [
-     "/accname/name_test_case_724-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_725-manual.html": [
-    [
-     "/accname/name_test_case_725-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_726-manual.html": [
-    [
-     "/accname/name_test_case_726-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_727-manual.html": [
-    [
-     "/accname/name_test_case_727-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_728-manual.html": [
-    [
-     "/accname/name_test_case_728-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_729-manual.html": [
-    [
-     "/accname/name_test_case_729-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_730-manual.html": [
-    [
-     "/accname/name_test_case_730-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_731-manual.html": [
-    [
-     "/accname/name_test_case_731-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_733-manual.html": [
-    [
-     "/accname/name_test_case_733-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_734-manual.html": [
-    [
-     "/accname/name_test_case_734-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_735-manual.html": [
-    [
-     "/accname/name_test_case_735-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_736-manual.html": [
-    [
-     "/accname/name_test_case_736-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_737-manual.html": [
-    [
-     "/accname/name_test_case_737-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_738-manual.html": [
-    [
-     "/accname/name_test_case_738-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_739-manual.html": [
-    [
-     "/accname/name_test_case_739-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_740-manual.html": [
-    [
-     "/accname/name_test_case_740-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_741-manual.html": [
-    [
-     "/accname/name_test_case_741-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_742-manual.html": [
-    [
-     "/accname/name_test_case_742-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_743-manual.html": [
-    [
-     "/accname/name_test_case_743-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_744-manual.html": [
-    [
-     "/accname/name_test_case_744-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_745-manual.html": [
-    [
-     "/accname/name_test_case_745-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_746-manual.html": [
-    [
-     "/accname/name_test_case_746-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_747-manual.html": [
-    [
-     "/accname/name_test_case_747-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_748-manual.html": [
-    [
-     "/accname/name_test_case_748-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_749-manual.html": [
-    [
-     "/accname/name_test_case_749-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_750-manual.html": [
-    [
-     "/accname/name_test_case_750-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_751-manual.html": [
-    [
-     "/accname/name_test_case_751-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_752-manual.html": [
-    [
-     "/accname/name_test_case_752-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_753-manual.html": [
-    [
-     "/accname/name_test_case_753-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_754-manual.html": [
-    [
-     "/accname/name_test_case_754-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_755-manual.html": [
-    [
-     "/accname/name_test_case_755-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_756-manual.html": [
-    [
-     "/accname/name_test_case_756-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_757-manual.html": [
-    [
-     "/accname/name_test_case_757-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_758-manual.html": [
-    [
-     "/accname/name_test_case_758-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_759-manual.html": [
-    [
-     "/accname/name_test_case_759-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_760-manual.html": [
-    [
-     "/accname/name_test_case_760-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_761-manual.html": [
-    [
-     "/accname/name_test_case_761-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_test_case_762-manual.html": [
-    [
-     "/accname/name_test_case_762-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_text-label-embedded-combobox-manual.html": [
-    [
-     "/accname/name_text-label-embedded-combobox-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_text-label-embedded-menu-manual.html": [
-    [
-     "/accname/name_text-label-embedded-menu-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_text-label-embedded-select-manual.html": [
-    [
-     "/accname/name_text-label-embedded-select-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_text-label-embedded-slider-manual.html": [
-    [
-     "/accname/name_text-label-embedded-slider-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_text-label-embedded-spinbutton-manual.html": [
-    [
-     "/accname/name_text-label-embedded-spinbutton-manual.html",
-     {}
-    ]
-   ],
-   "accname/name_text-title-manual.html": [
-    [
-     "/accname/name_text-title-manual.html",
-     {}
-    ]
-   ],
-   "ambient-light/AmbientLightSensor_onerror-manual.https.html": [
-    [
-     "/ambient-light/AmbientLightSensor_onerror-manual.https.html",
-     {}
-    ]
-   ],
-   "annotation-model/annotations/annotationMusts-manual.html": [
-    [
-     "/annotation-model/annotations/annotationMusts-manual.html",
-     {}
-    ]
-   ],
-   "annotation-model/annotations/annotationOptionals-manual.html": [
-    [
-     "/annotation-model/annotations/annotationOptionals-manual.html",
-     {}
-    ]
-   ],
-   "annotation-model/annotations/annotationsAgentOptionals-manual.html": [
-    [
-     "/annotation-model/annotations/annotationsAgentOptionals-manual.html",
-     {}
-    ]
-   ],
-   "annotation-model/collections/collectionMusts-manual.html": [
-    [
-     "/annotation-model/collections/collectionMusts-manual.html",
-     {}
-    ]
-   ],
-   "annotation-model/collections/collectionOptionals-manual.html": [
-    [
-     "/annotation-model/collections/collectionOptionals-manual.html",
-     {}
-    ]
-   ],
-   "annotation-model/collections/pages/pageMusts-manual.html": [
-    [
-     "/annotation-model/collections/pages/pageMusts-manual.html",
-     {}
-    ]
-   ],
-   "annotation-model/collections/pages/pageOptionals-manual.html": [
-    [
-     "/annotation-model/collections/pages/pageOptionals-manual.html",
-     {}
-    ]
-   ],
-   "annotation-protocol/server/server-manual.html": [
-    [
-     "/annotation-protocol/server/server-manual.html",
-     {}
-    ]
-   ],
-   "annotation-vocab/01-validJSON-LD-manual.html": [
-    [
-     "/annotation-vocab/01-validJSON-LD-manual.html",
-     {}
-    ]
-   ],
-   "annotation-vocab/02-context-to-triples-manual.html": [
-    [
-     "/annotation-vocab/02-context-to-triples-manual.html",
-     {}
-    ]
-   ],
-   "annotation-vocab/03-graphs-are-isomorphic-manual.html": [
-    [
-     "/annotation-vocab/03-graphs-are-isomorphic-manual.html",
-     {}
-    ]
-   ],
-   "annotation-vocab/04-graphs-convert-lossless-manual.html": [
-    [
-     "/annotation-vocab/04-graphs-convert-lossless-manual.html",
-     {}
-    ]
-   ],
-   "annotation-vocab/05-ontology-parsed-as-valid-manual.html": [
-    [
-     "/annotation-vocab/05-ontology-parsed-as-valid-manual.html",
-     {}
-    ]
-   ],
-   "annotation-vocab/06-ontology-internally-consistent-manual.html": [
-    [
-     "/annotation-vocab/06-ontology-internally-consistent-manual.html",
-     {}
-    ]
-   ],
-   "audio-output/setSinkId-manual.https.html": [
-    [
-     "/audio-output/setSinkId-manual.https.html",
-     {}
-    ]
-   ],
-   "battery-status/battery-charging-manual.https.html": [
-    [
-     "/battery-status/battery-charging-manual.https.html",
-     {}
-    ]
-   ],
-   "battery-status/battery-discharging-manual.https.html": [
-    [
-     "/battery-status/battery-discharging-manual.https.html",
-     {}
-    ]
-   ],
-   "battery-status/battery-full-manual.https.html": [
-    [
-     "/battery-status/battery-full-manual.https.html",
-     {}
-    ]
-   ],
-   "battery-status/battery-plugging-in-manual.https.html": [
-    [
-     "/battery-status/battery-plugging-in-manual.https.html",
-     {}
-    ]
-   ],
-   "battery-status/battery-unplugging-manual.https.html": [
-    [
-     "/battery-status/battery-unplugging-manual.https.html",
-     {}
-    ]
-   ],
-   "clipboard-apis/async-write-dttext-read-dttext-manual.https.html": [
-    [
-     "/clipboard-apis/async-write-dttext-read-dttext-manual.https.html",
-     {}
-    ]
-   ],
-   "clipboard-apis/async-write-dttext-read-text-manual.https.html": [
-    [
-     "/clipboard-apis/async-write-dttext-read-text-manual.https.html",
-     {}
-    ]
-   ],
-   "clipboard-apis/async-write-text-read-dttext-manual.https.html": [
-    [
-     "/clipboard-apis/async-write-text-read-dttext-manual.https.html",
-     {}
-    ]
-   ],
-   "clipboard-apis/async-write-text-read-text-manual.https.html": [
-    [
-     "/clipboard-apis/async-write-text-read-text-manual.https.html",
-     {}
-    ]
-   ],
-   "clipboard-apis/copy-event-manual.html": [
-    [
-     "/clipboard-apis/copy-event-manual.html",
-     {}
-    ]
-   ],
-   "clipboard-apis/cut-event-manual.html": [
-    [
-     "/clipboard-apis/cut-event-manual.html",
-     {}
-    ]
-   ],
-   "clipboard-apis/paste-event-manual.html": [
-    [
-     "/clipboard-apis/paste-event-manual.html",
-     {}
-    ]
-   ],
-   "console/console-count-logging-manual.html": [
-    [
-     "/console/console-count-logging-manual.html",
-     {}
-    ]
-   ],
-   "console/console-countReset-logging-manual.html": [
-    [
-     "/console/console-countReset-logging-manual.html",
-     {}
-    ]
-   ],
-   "console/console-number-format-specifiers-symbol-manual.html": [
-    [
-     "/console/console-number-format-specifiers-symbol-manual.html",
-     {}
-    ]
-   ],
-   "console/console-string-format-specifier-symbol-manual.html": [
-    [
-     "/console/console-string-format-specifier-symbol-manual.html",
-     {}
-    ]
-   ],
-   "console/console-timing-logging-manual.html": [
-    [
-     "/console/console-timing-logging-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/alert-manual.html": [
-    [
-     "/core-aam/alert-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/alertdialog-manual.html": [
-    [
-     "/core-aam/alertdialog-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/application-manual.html": [
-    [
-     "/core-aam/application-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-atomic_false-manual.html": [
-    [
-     "/core-aam/aria-atomic_false-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-atomic_true-manual.html": [
-    [
-     "/core-aam/aria-atomic_true-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-autocomplete_both-manual.html": [
-    [
-     "/core-aam/aria-autocomplete_both-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-autocomplete_inline-manual.html": [
-    [
-     "/core-aam/aria-autocomplete_inline-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-autocomplete_list-manual.html": [
-    [
-     "/core-aam/aria-autocomplete_list-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-busy_false-manual.html": [
-    [
-     "/core-aam/aria-busy_false-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-busy_true-manual.html": [
-    [
-     "/core-aam/aria-busy_true-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-busy_value_changes-manual.html": [
-    [
-     "/core-aam/aria-busy_value_changes-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-checked_false_on_checkbox-manual.html": [
-    [
-     "/core-aam/aria-checked_false_on_checkbox-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-checked_false_on_menuitemradio-manual.html": [
-    [
-     "/core-aam/aria-checked_false_on_menuitemradio-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-checked_mixed-manual.html": [
-    [
-     "/core-aam/aria-checked_mixed-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-checked_true_on_checkbox-manual.html": [
-    [
-     "/core-aam/aria-checked_true_on_checkbox-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-checked_true_on_menuitemradio-manual.html": [
-    [
-     "/core-aam/aria-checked_true_on_menuitemradio-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-checked_value_changes-manual.html": [
-    [
-     "/core-aam/aria-checked_value_changes-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-colcount_new-manual.html": [
-    [
-     "/core-aam/aria-colcount_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-colindex_new-manual.html": [
-    [
-     "/core-aam/aria-colindex_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-colspan_new-manual.html": [
-    [
-     "/core-aam/aria-colspan_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-controls-manual.html": [
-    [
-     "/core-aam/aria-controls-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-current_value_changes-manual.html": [
-    [
-     "/core-aam/aria-current_value_changes-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-current_with_non-false_allowed_value_new-manual.html": [
-    [
-     "/core-aam/aria-current_with_non-false_allowed_value_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-current_with_unrecognized_value_new-manual.html": [
-    [
-     "/core-aam/aria-current_with_unrecognized_value_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-describedby-manual.html": [
-    [
-     "/core-aam/aria-describedby-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-details_new-manual.html": [
-    [
-     "/core-aam/aria-details_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-disabled_false-manual.html": [
-    [
-     "/core-aam/aria-disabled_false-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-disabled_true-manual.html": [
-    [
-     "/core-aam/aria-disabled_true-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-disabled_value_changes-manual.html": [
-    [
-     "/core-aam/aria-disabled_value_changes-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-dropeffect_copy-manual.html": [
-    [
-     "/core-aam/aria-dropeffect_copy-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-dropeffect_execute-manual.html": [
-    [
-     "/core-aam/aria-dropeffect_execute-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-dropeffect_link-manual.html": [
-    [
-     "/core-aam/aria-dropeffect_link-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-dropeffect_move-manual.html": [
-    [
-     "/core-aam/aria-dropeffect_move-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-dropeffect_none-manual.html": [
-    [
-     "/core-aam/aria-dropeffect_none-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-dropeffect_popup-manual.html": [
-    [
-     "/core-aam/aria-dropeffect_popup-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-dropeffect_value_changes-manual.html": [
-    [
-     "/core-aam/aria-dropeffect_value_changes-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-errormessage-manual.html": [
-    [
-     "/core-aam/aria-errormessage-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-expanded_false-manual.html": [
-    [
-     "/core-aam/aria-expanded_false-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-expanded_true-manual.html": [
-    [
-     "/core-aam/aria-expanded_true-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-expanded_value_changes-manual.html": [
-    [
-     "/core-aam/aria-expanded_value_changes-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-flowto-manual.html": [
-    [
-     "/core-aam/aria-flowto-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-grabbed_false-manual.html": [
-    [
-     "/core-aam/aria-grabbed_false-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-grabbed_true-manual.html": [
-    [
-     "/core-aam/aria-grabbed_true-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-grabbed_value_changes-manual.html": [
-    [
-     "/core-aam/aria-grabbed_value_changes-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-haspopup_dialog_new-manual.html": [
-    [
-     "/core-aam/aria-haspopup_dialog_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-haspopup_false-manual.html": [
-    [
-     "/core-aam/aria-haspopup_false-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-haspopup_listbox_new-manual.html": [
-    [
-     "/core-aam/aria-haspopup_listbox_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-haspopup_menu_new-manual.html": [
-    [
-     "/core-aam/aria-haspopup_menu_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-haspopup_tree_new-manual.html": [
-    [
-     "/core-aam/aria-haspopup_tree_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-haspopup_true-manual.html": [
-    [
-     "/core-aam/aria-haspopup_true-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-hidden_true-manual.html": [
-    [
-     "/core-aam/aria-hidden_true-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-hidden_true_when_element_is_focused_or_fires_event_new-manual.html": [
-    [
-     "/core-aam/aria-hidden_true_when_element_is_focused_or_fires_event_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-hidden_value_changes-manual.html": [
-    [
-     "/core-aam/aria-hidden_value_changes-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-invalid_false-manual.html": [
-    [
-     "/core-aam/aria-invalid_false-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-invalid_grammar-manual.html": [
-    [
-     "/core-aam/aria-invalid_grammar-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-invalid_spelling-manual.html": [
-    [
-     "/core-aam/aria-invalid_spelling-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-invalid_true-manual.html": [
-    [
-     "/core-aam/aria-invalid_true-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-invalid_value_changes-manual.html": [
-    [
-     "/core-aam/aria-invalid_value_changes-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-invalid_with_unrecognized_value_new-manual.html": [
-    [
-     "/core-aam/aria-invalid_with_unrecognized_value_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-keyshortcuts_new-manual.html": [
-    [
-     "/core-aam/aria-keyshortcuts_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-label-manual.html": [
-    [
-     "/core-aam/aria-label-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-labelledby-manual.html": [
-    [
-     "/core-aam/aria-labelledby-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-level_on_heading-manual.html": [
-    [
-     "/core-aam/aria-level_on_heading-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-level_on_non-heading-manual.html": [
-    [
-     "/core-aam/aria-level_on_non-heading-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-live_assertive-manual.html": [
-    [
-     "/core-aam/aria-live_assertive-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-live_off-manual.html": [
-    [
-     "/core-aam/aria-live_off-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-live_polite-manual.html": [
-    [
-     "/core-aam/aria-live_polite-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-modal_false_new-manual.html": [
-    [
-     "/core-aam/aria-modal_false_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-modal_true_new-manual.html": [
-    [
-     "/core-aam/aria-modal_true_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-multiline_false-manual.html": [
-    [
-     "/core-aam/aria-multiline_false-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-multiline_true-manual.html": [
-    [
-     "/core-aam/aria-multiline_true-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-multiselectable_false-manual.html": [
-    [
-     "/core-aam/aria-multiselectable_false-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-multiselectable_true-manual.html": [
-    [
-     "/core-aam/aria-multiselectable_true-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-orientation_horizontal-manual.html": [
-    [
-     "/core-aam/aria-orientation_horizontal-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-orientation_undefined_new-manual.html": [
-    [
-     "/core-aam/aria-orientation_undefined_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-orientation_vertical-manual.html": [
-    [
-     "/core-aam/aria-orientation_vertical-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-owns_may_need_manual_verification-manual.html": [
-    [
-     "/core-aam/aria-owns_may_need_manual_verification-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-placeholder_new-manual.html": [
-    [
-     "/core-aam/aria-placeholder_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-posinset-manual.html": [
-    [
-     "/core-aam/aria-posinset-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-pressed_false-manual.html": [
-    [
-     "/core-aam/aria-pressed_false-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-pressed_mixed-manual.html": [
-    [
-     "/core-aam/aria-pressed_mixed-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-pressed_true-manual.html": [
-    [
-     "/core-aam/aria-pressed_true-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-pressed_value_changes-manual.html": [
-    [
-     "/core-aam/aria-pressed_value_changes-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-readonly_false-manual.html": [
-    [
-     "/core-aam/aria-readonly_false-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-readonly_is_unspecified_on_gridcell_new-manual.html": [
-    [
-     "/core-aam/aria-readonly_is_unspecified_on_gridcell_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-readonly_true_on_checkbox-manual.html": [
-    [
-     "/core-aam/aria-readonly_true_on_checkbox-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-readonly_true_on_radiogroup-manual.html": [
-    [
-     "/core-aam/aria-readonly_true_on_radiogroup-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-readonly_true_on_textbox-manual.html": [
-    [
-     "/core-aam/aria-readonly_true_on_textbox-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-readonly_value_changes-manual.html": [
-    [
-     "/core-aam/aria-readonly_value_changes-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-relevant-manual.html": [
-    [
-     "/core-aam/aria-relevant-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-required_true-manual.html": [
-    [
-     "/core-aam/aria-required_true-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-required_value_changes-manual.html": [
-    [
-     "/core-aam/aria-required_value_changes-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-roledescription_is_empty_or_whitespace_characters_new-manual.html": [
-    [
-     "/core-aam/aria-roledescription_is_empty_or_whitespace_characters_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-roledescription_new-manual.html": [
-    [
-     "/core-aam/aria-roledescription_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-rowcount_new-manual.html": [
-    [
-     "/core-aam/aria-rowcount_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-rowindex_new-manual.html": [
-    [
-     "/core-aam/aria-rowindex_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-rowspan_new-manual.html": [
-    [
-     "/core-aam/aria-rowspan_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-selected_false-manual.html": [
-    [
-     "/core-aam/aria-selected_false-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-selected_true-manual.html": [
-    [
-     "/core-aam/aria-selected_true-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-setsize_-1_new-manual.html": [
-    [
-     "/core-aam/aria-setsize_-1_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-setsize_3-manual.html": [
-    [
-     "/core-aam/aria-setsize_3-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-sort_ascending-manual.html": [
-    [
-     "/core-aam/aria-sort_ascending-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-sort_descending-manual.html": [
-    [
-     "/core-aam/aria-sort_descending-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-sort_none-manual.html": [
-    [
-     "/core-aam/aria-sort_none-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-sort_other-manual.html": [
-    [
-     "/core-aam/aria-sort_other-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-valuemax-manual.html": [
-    [
-     "/core-aam/aria-valuemax-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-valuemin-manual.html": [
-    [
-     "/core-aam/aria-valuemin-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-valuenow-manual.html": [
-    [
-     "/core-aam/aria-valuenow-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-valuenow_value_changes-manual.html": [
-    [
-     "/core-aam/aria-valuenow_value_changes-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-valuetext-manual.html": [
-    [
-     "/core-aam/aria-valuetext-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/aria-valuetext_value_changes-manual.html": [
-    [
-     "/core-aam/aria-valuetext_value_changes-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/article-manual.html": [
-    [
-     "/core-aam/article-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/banner-manual.html": [
-    [
-     "/core-aam/banner-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/blockquote-manual.html": [
-    [
-     "/core-aam/blockquote-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/button_with_aria-haspopup_dialog_new-manual.html": [
-    [
-     "/core-aam/button_with_aria-haspopup_dialog_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/button_with_aria-haspopup_true-manual.html": [
-    [
-     "/core-aam/button_with_aria-haspopup_true-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/button_with_default_values_for_aria-pressed_and_aria-haspopup-manual.html": [
-    [
-     "/core-aam/button_with_default_values_for_aria-pressed_and_aria-haspopup-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/button_with_defined_value_for_aria-pressed-manual.html": [
-    [
-     "/core-aam/button_with_defined_value_for_aria-pressed-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/caption-manual.html": [
-    [
-     "/core-aam/caption-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/cell_new-manual.html": [
-    [
-     "/core-aam/cell_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/checkbox-manual.html": [
-    [
-     "/core-aam/checkbox-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/columnheader-manual.html": [
-    [
-     "/core-aam/columnheader-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/combobox-manual.html": [
-    [
-     "/core-aam/combobox-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/complementary-manual.html": [
-    [
-     "/core-aam/complementary-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/contentinfo-manual.html": [
-    [
-     "/core-aam/contentinfo-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/definition-manual.html": [
-    [
-     "/core-aam/definition-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/dialog-manual.html": [
-    [
-     "/core-aam/dialog-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/directory-manual.html": [
-    [
-     "/core-aam/directory-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/document-manual.html": [
-    [
-     "/core-aam/document-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/exclude_element_hidden_with_css_display_none-manual.html": [
-    [
-     "/core-aam/exclude_element_hidden_with_css_display_none-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/exclude_element_hidden_with_css_visibility_hidden-manual.html": [
-    [
-     "/core-aam/exclude_element_hidden_with_css_visibility_hidden-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/exclude_element_hidden_with_html5_hidden-manual.html": [
-    [
-     "/core-aam/exclude_element_hidden_with_html5_hidden-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/exclude_presentational_children_of_button-manual.html": [
-    [
-     "/core-aam/exclude_presentational_children_of_button-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/exclude_presentational_children_of_checkbox_new-manual.html": [
-    [
-     "/core-aam/exclude_presentational_children_of_checkbox_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/exclude_presentational_children_of_img-manual.html": [
-    [
-     "/core-aam/exclude_presentational_children_of_img-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/exclude_presentational_children_of_math-manual.html": [
-    [
-     "/core-aam/exclude_presentational_children_of_math-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/exclude_presentational_children_of_menuitemcheckbox_new-manual.html": [
-    [
-     "/core-aam/exclude_presentational_children_of_menuitemcheckbox_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/exclude_presentational_children_of_menuitemradio_new-manual.html": [
-    [
-     "/core-aam/exclude_presentational_children_of_menuitemradio_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/exclude_presentational_children_of_option_new-manual.html": [
-    [
-     "/core-aam/exclude_presentational_children_of_option_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/exclude_presentational_children_of_progressbar-manual.html": [
-    [
-     "/core-aam/exclude_presentational_children_of_progressbar-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/exclude_presentational_children_of_radio_new-manual.html": [
-    [
-     "/core-aam/exclude_presentational_children_of_radio_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/exclude_presentational_children_of_scrollbar-manual.html": [
-    [
-     "/core-aam/exclude_presentational_children_of_scrollbar-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/exclude_presentational_children_of_separator-manual.html": [
-    [
-     "/core-aam/exclude_presentational_children_of_separator-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/exclude_presentational_children_of_slider-manual.html": [
-    [
-     "/core-aam/exclude_presentational_children_of_slider-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/exclude_presentational_children_of_switch_new-manual.html": [
-    [
-     "/core-aam/exclude_presentational_children_of_switch_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/exclude_presentational_children_of_tab_new-manual.html": [
-    [
-     "/core-aam/exclude_presentational_children_of_tab_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/feed_new-manual.html": [
-    [
-     "/core-aam/feed_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/figure_new-manual.html": [
-    [
-     "/core-aam/figure_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/form-manual.html": [
-    [
-     "/core-aam/form-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/grid-manual.html": [
-    [
-     "/core-aam/grid-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/gridcell-manual.html": [
-    [
-     "/core-aam/gridcell-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/group-manual.html": [
-    [
-     "/core-aam/group-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/heading-manual.html": [
-    [
-     "/core-aam/heading-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/img-manual.html": [
-    [
-     "/core-aam/img-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/include_element_referenced_by_global_aria-controls-manual.html": [
-    [
-     "/core-aam/include_element_referenced_by_global_aria-controls-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/include_element_referenced_by_global_aria-describedby-manual.html": [
-    [
-     "/core-aam/include_element_referenced_by_global_aria-describedby-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/include_element_referenced_by_global_aria-details_new-manual.html": [
-    [
-     "/core-aam/include_element_referenced_by_global_aria-details_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/include_element_referenced_by_global_aria-errormessage_new-manual.html": [
-    [
-     "/core-aam/include_element_referenced_by_global_aria-errormessage_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/include_element_referenced_by_global_aria-flowto-manual.html": [
-    [
-     "/core-aam/include_element_referenced_by_global_aria-flowto-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/include_element_referenced_by_global_aria-labelledby-manual.html": [
-    [
-     "/core-aam/include_element_referenced_by_global_aria-labelledby-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/include_element_referenced_by_global_aria-owns-manual.html": [
-    [
-     "/core-aam/include_element_referenced_by_global_aria-owns-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/include_element_that_is_focusable-manual.html": [
-    [
-     "/core-aam/include_element_that_is_focusable-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/include_element_with_id_inside_element_with_aria-activedescendant-manual.html": [
-    [
-     "/core-aam/include_element_with_id_inside_element_with_aria-activedescendant-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/link-manual.html": [
-    [
-     "/core-aam/link-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/list-manual.html": [
-    [
-     "/core-aam/list-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/listbox_not_owned_by_or_child_of_combobox-manual.html": [
-    [
-     "/core-aam/listbox_not_owned_by_or_child_of_combobox-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/listbox_owned_by_or_child_of_combobox-manual.html": [
-    [
-     "/core-aam/listbox_owned_by_or_child_of_combobox-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/listitem-manual.html": [
-    [
-     "/core-aam/listitem-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/log-manual.html": [
-    [
-     "/core-aam/log-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/main-manual.html": [
-    [
-     "/core-aam/main-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/marquee-manual.html": [
-    [
-     "/core-aam/marquee-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/math-manual.html": [
-    [
-     "/core-aam/math-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/menu-manual.html": [
-    [
-     "/core-aam/menu-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/menu_child_of_menu_item-manual.html": [
-    [
-     "/core-aam/menu_child_of_menu_item-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/menubar-manual.html": [
-    [
-     "/core-aam/menubar-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/menuitem_not_owned_by_or_child_of_group-manual.html": [
-    [
-     "/core-aam/menuitem_not_owned_by_or_child_of_group-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/menuitem_owned_by_or_child_of_group-manual.html": [
-    [
-     "/core-aam/menuitem_owned_by_or_child_of_group-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/menuitemcheckbox-manual.html": [
-    [
-     "/core-aam/menuitemcheckbox-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/menuitemradio-manual.html": [
-    [
-     "/core-aam/menuitemradio-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/navigation-manual.html": [
-    [
-     "/core-aam/navigation-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/none_new-manual.html": [
-    [
-     "/core-aam/none_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/none_used_on_element_that_is_focused_or_fires_event-manual.html": [
-    [
-     "/core-aam/none_used_on_element_that_is_focused_or_fires_event-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/none_used_on_table_element_with_td_children_new-manual.html": [
-    [
-     "/core-aam/none_used_on_table_element_with_td_children_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/none_used_on_ul_element_with_li_children_new-manual.html": [
-    [
-     "/core-aam/none_used_on_ul_element_with_li_children_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/note-manual.html": [
-    [
-     "/core-aam/note-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/option_inside_combobox-manual.html": [
-    [
-     "/core-aam/option_inside_combobox-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/option_not_inside_combobox-manual.html": [
-    [
-     "/core-aam/option_not_inside_combobox-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/paragraph-manual.html": [
-    [
-     "/core-aam/paragraph-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/presentation-manual.html": [
-    [
-     "/core-aam/presentation-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/presentation_used_on_element_that_is_focused_or_fires_event-manual.html": [
-    [
-     "/core-aam/presentation_used_on_element_that_is_focused_or_fires_event-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/presentation_used_on_table_element_with_td_children_new-manual.html": [
-    [
-     "/core-aam/presentation_used_on_table_element_with_td_children_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/presentation_used_on_ul_element_with_li_children_new-manual.html": [
-    [
-     "/core-aam/presentation_used_on_ul_element_with_li_children_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/progressbar-manual.html": [
-    [
-     "/core-aam/progressbar-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/radio-manual.html": [
-    [
-     "/core-aam/radio-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/radiogroup-manual.html": [
-    [
-     "/core-aam/radiogroup-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/region_with_an_accessible_name_new-manual.html": [
-    [
-     "/core-aam/region_with_an_accessible_name_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/region_without_an_accessible_name_new-manual.html": [
-    [
-     "/core-aam/region_without_an_accessible_name_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/row_inside_treegrid-manual.html": [
-    [
-     "/core-aam/row_inside_treegrid-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/row_not_inside_treegrid-manual.html": [
-    [
-     "/core-aam/row_not_inside_treegrid-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/rowgroup-manual.html": [
-    [
-     "/core-aam/rowgroup-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/rowheader-manual.html": [
-    [
-     "/core-aam/rowheader-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/scrollbar-manual.html": [
-    [
-     "/core-aam/scrollbar-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/search-manual.html": [
-    [
-     "/core-aam/search-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/searchbox_new-manual.html": [
-    [
-     "/core-aam/searchbox_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/separator_focusable_new-manual.html": [
-    [
-     "/core-aam/separator_focusable_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/separator_non-focusable-manual.html": [
-    [
-     "/core-aam/separator_non-focusable-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/slider-manual.html": [
-    [
-     "/core-aam/slider-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/spinbutton-manual.html": [
-    [
-     "/core-aam/spinbutton-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/status-manual.html": [
-    [
-     "/core-aam/status-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/switch_new-manual.html": [
-    [
-     "/core-aam/switch_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/tab-manual.html": [
-    [
-     "/core-aam/tab-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/table_new-manual.html": [
-    [
-     "/core-aam/table_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/tablist-manual.html": [
-    [
-     "/core-aam/tablist-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/tabpanel-manual.html": [
-    [
-     "/core-aam/tabpanel-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/term_new-manual.html": [
-    [
-     "/core-aam/term_new-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/textbox_when_aria-multiline_is_false-manual.html": [
-    [
-     "/core-aam/textbox_when_aria-multiline_is_false-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/textbox_when_aria-multiline_is_true-manual.html": [
-    [
-     "/core-aam/textbox_when_aria-multiline_is_true-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/timer-manual.html": [
-    [
-     "/core-aam/timer-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/toolbar-manual.html": [
-    [
-     "/core-aam/toolbar-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/tooltip-manual.html": [
-    [
-     "/core-aam/tooltip-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/tree-manual.html": [
-    [
-     "/core-aam/tree-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/treegrid-manual.html": [
-    [
-     "/core-aam/treegrid-manual.html",
-     {}
-    ]
-   ],
-   "core-aam/treeitem-manual.html": [
-    [
-     "/core-aam/treeitem-manual.html",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-012.xht": [
-    [
-     "/css/CSS2/backgrounds/background-012.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-019.xht": [
-    [
-     "/css/CSS2/backgrounds/background-019.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-027.xht": [
-    [
-     "/css/CSS2/backgrounds/background-027.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-032.xht": [
-    [
-     "/css/CSS2/backgrounds/background-032.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-039.xht": [
-    [
-     "/css/CSS2/backgrounds/background-039.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-042.xht": [
-    [
-     "/css/CSS2/backgrounds/background-042.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-044.xht": [
-    [
-     "/css/CSS2/backgrounds/background-044.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-045.xht": [
-    [
-     "/css/CSS2/backgrounds/background-045.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-046.xht": [
-    [
-     "/css/CSS2/backgrounds/background-046.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-049.xht": [
-    [
-     "/css/CSS2/backgrounds/background-049.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-054.xht": [
-    [
-     "/css/CSS2/backgrounds/background-054.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-057.xht": [
-    [
-     "/css/CSS2/backgrounds/background-057.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-062.xht": [
-    [
-     "/css/CSS2/backgrounds/background-062.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-065.xht": [
-    [
-     "/css/CSS2/backgrounds/background-065.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-066.xht": [
-    [
-     "/css/CSS2/backgrounds/background-066.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-067.xht": [
-    [
-     "/css/CSS2/backgrounds/background-067.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-069.xht": [
-    [
-     "/css/CSS2/backgrounds/background-069.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-072.xht": [
-    [
-     "/css/CSS2/backgrounds/background-072.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-079.xht": [
-    [
-     "/css/CSS2/backgrounds/background-079.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-084.xht": [
-    [
-     "/css/CSS2/backgrounds/background-084.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-086.xht": [
-    [
-     "/css/CSS2/backgrounds/background-086.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-088.xht": [
-    [
-     "/css/CSS2/backgrounds/background-088.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-089.xht": [
-    [
-     "/css/CSS2/backgrounds/background-089.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-091.xht": [
-    [
-     "/css/CSS2/backgrounds/background-091.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-092.xht": [
-    [
-     "/css/CSS2/backgrounds/background-092.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-094.xht": [
-    [
-     "/css/CSS2/backgrounds/background-094.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-098.xht": [
-    [
-     "/css/CSS2/backgrounds/background-098.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-099.xht": [
-    [
-     "/css/CSS2/backgrounds/background-099.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-100.xht": [
-    [
-     "/css/CSS2/backgrounds/background-100.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-102.xht": [
-    [
-     "/css/CSS2/backgrounds/background-102.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-105.xht": [
-    [
-     "/css/CSS2/backgrounds/background-105.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-108.xht": [
-    [
-     "/css/CSS2/backgrounds/background-108.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-110.xht": [
-    [
-     "/css/CSS2/backgrounds/background-110.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-112.xht": [
-    [
-     "/css/CSS2/backgrounds/background-112.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-113.xht": [
-    [
-     "/css/CSS2/backgrounds/background-113.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-115.xht": [
-    [
-     "/css/CSS2/backgrounds/background-115.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-116.xht": [
-    [
-     "/css/CSS2/backgrounds/background-116.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-118.xht": [
-    [
-     "/css/CSS2/backgrounds/background-118.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-119.xht": [
-    [
-     "/css/CSS2/backgrounds/background-119.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-121.xht": [
-    [
-     "/css/CSS2/backgrounds/background-121.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-122.xht": [
-    [
-     "/css/CSS2/backgrounds/background-122.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-123.xht": [
-    [
-     "/css/CSS2/backgrounds/background-123.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-124.xht": [
-    [
-     "/css/CSS2/backgrounds/background-124.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-125.xht": [
-    [
-     "/css/CSS2/backgrounds/background-125.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-126.xht": [
-    [
-     "/css/CSS2/backgrounds/background-126.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-127.xht": [
-    [
-     "/css/CSS2/backgrounds/background-127.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-129.xht": [
-    [
-     "/css/CSS2/backgrounds/background-129.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-131.xht": [
-    [
-     "/css/CSS2/backgrounds/background-131.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-132.xht": [
-    [
-     "/css/CSS2/backgrounds/background-132.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-133.xht": [
-    [
-     "/css/CSS2/backgrounds/background-133.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-134.xht": [
-    [
-     "/css/CSS2/backgrounds/background-134.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-136.xht": [
-    [
-     "/css/CSS2/backgrounds/background-136.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-140.xht": [
-    [
-     "/css/CSS2/backgrounds/background-140.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-142.xht": [
-    [
-     "/css/CSS2/backgrounds/background-142.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-143.xht": [
-    [
-     "/css/CSS2/backgrounds/background-143.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-145.xht": [
-    [
-     "/css/CSS2/backgrounds/background-145.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-146.xht": [
-    [
-     "/css/CSS2/backgrounds/background-146.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-148.xht": [
-    [
-     "/css/CSS2/backgrounds/background-148.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-149.xht": [
-    [
-     "/css/CSS2/backgrounds/background-149.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-151.xht": [
-    [
-     "/css/CSS2/backgrounds/background-151.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-155.xht": [
-    [
-     "/css/CSS2/backgrounds/background-155.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-157.xht": [
-    [
-     "/css/CSS2/backgrounds/background-157.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-158.xht": [
-    [
-     "/css/CSS2/backgrounds/background-158.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-159.xht": [
-    [
-     "/css/CSS2/backgrounds/background-159.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-160.xht": [
-    [
-     "/css/CSS2/backgrounds/background-160.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-162.xht": [
-    [
-     "/css/CSS2/backgrounds/background-162.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-164.xht": [
-    [
-     "/css/CSS2/backgrounds/background-164.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-165.xht": [
-    [
-     "/css/CSS2/backgrounds/background-165.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-166.xht": [
-    [
-     "/css/CSS2/backgrounds/background-166.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-167.xht": [
-    [
-     "/css/CSS2/backgrounds/background-167.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-168.xht": [
-    [
-     "/css/CSS2/backgrounds/background-168.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-169.xht": [
-    [
-     "/css/CSS2/backgrounds/background-169.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-170.xht": [
-    [
-     "/css/CSS2/backgrounds/background-170.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-172.xht": [
-    [
-     "/css/CSS2/backgrounds/background-172.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-173.xht": [
-    [
-     "/css/CSS2/backgrounds/background-173.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-175.xht": [
-    [
-     "/css/CSS2/backgrounds/background-175.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-176.xht": [
-    [
-     "/css/CSS2/backgrounds/background-176.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-178.xht": [
-    [
-     "/css/CSS2/backgrounds/background-178.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-179.xht": [
-    [
-     "/css/CSS2/backgrounds/background-179.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-181.xht": [
-    [
-     "/css/CSS2/backgrounds/background-181.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-183.xht": [
-    [
-     "/css/CSS2/backgrounds/background-183.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-186.xht": [
-    [
-     "/css/CSS2/backgrounds/background-186.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-189.xht": [
-    [
-     "/css/CSS2/backgrounds/background-189.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-191.xht": [
-    [
-     "/css/CSS2/backgrounds/background-191.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-192.xht": [
-    [
-     "/css/CSS2/backgrounds/background-192.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-193.xht": [
-    [
-     "/css/CSS2/backgrounds/background-193.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-197.xht": [
-    [
-     "/css/CSS2/backgrounds/background-197.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-199.xht": [
-    [
-     "/css/CSS2/backgrounds/background-199.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-200.xht": [
-    [
-     "/css/CSS2/backgrounds/background-200.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-202.xht": [
-    [
-     "/css/CSS2/backgrounds/background-202.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-203.xht": [
-    [
-     "/css/CSS2/backgrounds/background-203.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-205.xht": [
-    [
-     "/css/CSS2/backgrounds/background-205.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-206.xht": [
-    [
-     "/css/CSS2/backgrounds/background-206.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-207.xht": [
-    [
-     "/css/CSS2/backgrounds/background-207.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-208.xht": [
-    [
-     "/css/CSS2/backgrounds/background-208.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-209.xht": [
-    [
-     "/css/CSS2/backgrounds/background-209.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-210.xht": [
-    [
-     "/css/CSS2/backgrounds/background-210.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-211.xht": [
-    [
-     "/css/CSS2/backgrounds/background-211.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-212.xht": [
-    [
-     "/css/CSS2/backgrounds/background-212.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-213.xht": [
-    [
-     "/css/CSS2/backgrounds/background-213.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-214.xht": [
-    [
-     "/css/CSS2/backgrounds/background-214.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-215.xht": [
-    [
-     "/css/CSS2/backgrounds/background-215.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-216.xht": [
-    [
-     "/css/CSS2/backgrounds/background-216.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-217.xht": [
-    [
-     "/css/CSS2/backgrounds/background-217.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-218.xht": [
-    [
-     "/css/CSS2/backgrounds/background-218.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-219.xht": [
-    [
-     "/css/CSS2/backgrounds/background-219.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-220.xht": [
-    [
-     "/css/CSS2/backgrounds/background-220.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-221.xht": [
-    [
-     "/css/CSS2/backgrounds/background-221.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-222.xht": [
-    [
-     "/css/CSS2/backgrounds/background-222.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-223.xht": [
-    [
-     "/css/CSS2/backgrounds/background-223.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-224.xht": [
-    [
-     "/css/CSS2/backgrounds/background-224.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-225.xht": [
-    [
-     "/css/CSS2/backgrounds/background-225.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-226.xht": [
-    [
-     "/css/CSS2/backgrounds/background-226.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-227.xht": [
-    [
-     "/css/CSS2/backgrounds/background-227.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-228.xht": [
-    [
-     "/css/CSS2/backgrounds/background-228.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-229.xht": [
-    [
-     "/css/CSS2/backgrounds/background-229.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-230.xht": [
-    [
-     "/css/CSS2/backgrounds/background-230.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-231.xht": [
-    [
-     "/css/CSS2/backgrounds/background-231.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-232.xht": [
-    [
-     "/css/CSS2/backgrounds/background-232.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-233.xht": [
-    [
-     "/css/CSS2/backgrounds/background-233.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-234.xht": [
-    [
-     "/css/CSS2/backgrounds/background-234.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-235.xht": [
-    [
-     "/css/CSS2/backgrounds/background-235.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-236.xht": [
-    [
-     "/css/CSS2/backgrounds/background-236.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-237.xht": [
-    [
-     "/css/CSS2/backgrounds/background-237.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-238.xht": [
-    [
-     "/css/CSS2/backgrounds/background-238.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-239.xht": [
-    [
-     "/css/CSS2/backgrounds/background-239.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-240.xht": [
-    [
-     "/css/CSS2/backgrounds/background-240.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-241.xht": [
-    [
-     "/css/CSS2/backgrounds/background-241.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-242.xht": [
-    [
-     "/css/CSS2/backgrounds/background-242.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-243.xht": [
-    [
-     "/css/CSS2/backgrounds/background-243.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-244.xht": [
-    [
-     "/css/CSS2/backgrounds/background-244.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-245.xht": [
-    [
-     "/css/CSS2/backgrounds/background-245.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-246.xht": [
-    [
-     "/css/CSS2/backgrounds/background-246.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-247.xht": [
-    [
-     "/css/CSS2/backgrounds/background-247.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-248.xht": [
-    [
-     "/css/CSS2/backgrounds/background-248.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-249.xht": [
-    [
-     "/css/CSS2/backgrounds/background-249.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-250.xht": [
-    [
-     "/css/CSS2/backgrounds/background-250.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-251.xht": [
-    [
-     "/css/CSS2/backgrounds/background-251.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-252.xht": [
-    [
-     "/css/CSS2/backgrounds/background-252.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-253.xht": [
-    [
-     "/css/CSS2/backgrounds/background-253.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-254.xht": [
-    [
-     "/css/CSS2/backgrounds/background-254.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-255.xht": [
-    [
-     "/css/CSS2/backgrounds/background-255.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-256.xht": [
-    [
-     "/css/CSS2/backgrounds/background-256.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-257.xht": [
-    [
-     "/css/CSS2/backgrounds/background-257.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-258.xht": [
-    [
-     "/css/CSS2/backgrounds/background-258.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-259.xht": [
-    [
-     "/css/CSS2/backgrounds/background-259.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-260.xht": [
-    [
-     "/css/CSS2/backgrounds/background-260.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-261.xht": [
-    [
-     "/css/CSS2/backgrounds/background-261.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-262.xht": [
-    [
-     "/css/CSS2/backgrounds/background-262.xht",
-     {}
-    ]
-   ],
-   "css/CSS2/backgrounds/background-263.xht": [
-    [
-     "/css/CSS2/backgrounds/background-263.xht&qu