Merge autoland to mozilla-central. a=merge
authorCosmin Sabou <csabou@mozilla.com>
Fri, 05 Oct 2018 12:57:02 +0300
changeset 495498 624bb3de2d559c1e6fbcab1a092dd1a202f1eef6
parent 495479 9f5ea3c3f1160fc88c53bd4d74ccc3b137c71896 (current diff)
parent 495497 44915a4e119d64ad5592c294f32414359611198a (diff)
child 495514 863c5a0642a84831b8ff3cac737c8657c70b05f1
push id9984
push userffxbld-merge
push dateMon, 15 Oct 2018 21:07:35 +0000
treeherdermozilla-beta@183d27ea8570 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone64.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge autoland to mozilla-central. a=merge
--- a/browser/base/content/test/static/browser_all_files_referenced.js
+++ b/browser/base/content/test/static/browser_all_files_referenced.js
@@ -163,16 +163,25 @@ var whitelist = [
   {file: "resource://gre/modules/Promise.jsm"},
   // Still used by WebIDE, which is going away but not entirely gone.
   {file: "resource://gre/modules/ZipUtils.jsm"},
   // Bug 1463225 (on Mac this is only used by a test)
   {file: "chrome://global/content/bindings/toolbar.xml",
    platforms: ["macosx"]},
   // Bug 1483277 (temporarily unreferenced)
   {file: "chrome://browser/content/browser.xhtml"},
+  // Bug 1494170
+  // (The references to these files are dynamically generated, so the test can't
+  // find the references)
+  {file: "chrome://devtools/skin/images/aboutdebugging-firefox-aurora.svg",
+   isFromDevTools: true},
+  {file: "chrome://devtools/skin/images/aboutdebugging-firefox-beta.svg",
+   isFromDevTools: true},
+  {file: "chrome://devtools/skin/images/aboutdebugging-firefox-release.svg",
+   isFromDevTools: true},
 ];
 
 whitelist = new Set(whitelist.filter(item =>
   ("isFromDevTools" in item) == isDevtools &&
   (!item.skipUnofficial || !AppConstants.MOZILLA_OFFICIAL) &&
   (!item.platforms || item.platforms.includes(AppConstants.platform))
 ).map(item => item.file));
 
--- a/devtools/client/aboutdebugging-new/src/actions/runtimes.js
+++ b/devtools/client/aboutdebugging-new/src/actions/runtimes.js
@@ -8,21 +8,23 @@ const { ADB } = require("devtools/shared
 const { DebuggerClient } = require("devtools/shared/client/debugger-client");
 const { DebuggerServer } = require("devtools/server/main");
 
 const Actions = require("./index");
 
 const {
   findRuntimeById,
 } = require("../modules/runtimes-state-helper");
+const { isSupportedDebugTarget } = require("../modules/debug-target-support");
 
 const {
   CONNECT_RUNTIME_FAILURE,
   CONNECT_RUNTIME_START,
   CONNECT_RUNTIME_SUCCESS,
+  DEBUG_TARGETS,
   DISCONNECT_RUNTIME_FAILURE,
   DISCONNECT_RUNTIME_START,
   DISCONNECT_RUNTIME_SUCCESS,
   RUNTIMES,
   UNWATCH_RUNTIME_FAILURE,
   UNWATCH_RUNTIME_START,
   UNWATCH_RUNTIME_SUCCESS,
   USB_RUNTIMES_UPDATED,
@@ -61,28 +63,48 @@ async function createClientForRuntime(ru
     return createNetworkClient(host, port);
   } else if (type === RUNTIMES.USB) {
     return createUSBClient(runtime.socketPath);
   }
 
   return null;
 }
 
+async function getRuntimeInfo(runtime, client) {
+  const { model, type } = runtime;
+  const deviceFront = await client.mainRoot.getFront("device");
+  const { brandName: name, channel, version } = await deviceFront.getDescription();
+  const icon =
+    (channel === "release" || channel === "beta" || channel === "aurora")
+      ? `chrome://devtools/skin/images/aboutdebugging-firefox-${ channel }.svg`
+      : "chrome://devtools/skin/images/aboutdebugging-firefox-nightly.svg";
+
+  return {
+    icon,
+    model,
+    name,
+    type,
+    version,
+  };
+}
+
 function connectRuntime(id) {
   return async (dispatch, getState) => {
     dispatch({ type: CONNECT_RUNTIME_START });
     try {
       const runtime = findRuntimeById(id, getState().runtimes);
       const client = await createClientForRuntime(runtime);
+      const info = await getRuntimeInfo(runtime, client);
 
       dispatch({
         type: CONNECT_RUNTIME_SUCCESS,
         runtime: {
           id,
           client,
+          info,
           type: runtime.type,
         }
       });
     } catch (e) {
       dispatch({ type: CONNECT_RUNTIME_FAILURE, error: e.message });
     }
   };
 }
@@ -119,19 +141,27 @@ function watchRuntime(id) {
         // THIS_FIREFOX connects and disconnects on the fly when opening the page.
         await dispatch(connectRuntime(RUNTIMES.THIS_FIREFOX));
       }
 
       // The selected runtime should already have a connected client assigned.
       const runtime = findRuntimeById(id, getState().runtimes);
       await dispatch({ type: WATCH_RUNTIME_SUCCESS, runtime });
 
-      dispatch(Actions.requestExtensions());
-      dispatch(Actions.requestTabs());
-      dispatch(Actions.requestWorkers());
+      if (isSupportedDebugTarget(runtime.type, DEBUG_TARGETS.EXTENSION)) {
+        dispatch(Actions.requestExtensions());
+      }
+
+      if (isSupportedDebugTarget(runtime.type, DEBUG_TARGETS.TAB)) {
+        dispatch(Actions.requestTabs());
+      }
+
+      if (isSupportedDebugTarget(runtime.type, DEBUG_TARGETS.WORKER)) {
+        dispatch(Actions.requestWorkers());
+      }
     } catch (e) {
       dispatch({ type: WATCH_RUNTIME_FAILURE, error: e.message });
     }
   };
 }
 
 function unwatchRuntime(id) {
   return async (dispatch, getState) => {
--- a/devtools/client/aboutdebugging-new/src/components/RuntimeInfo.js
+++ b/devtools/client/aboutdebugging-new/src/components/RuntimeInfo.js
@@ -1,41 +1,54 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 "use strict";
 
-const { PureComponent } = require("devtools/client/shared/vendor/react");
+const { createFactory, PureComponent } = require("devtools/client/shared/vendor/react");
 const dom = require("devtools/client/shared/vendor/react-dom-factories");
 const PropTypes = require("devtools/client/shared/vendor/react-prop-types");
 
+const FluentReact = require("devtools/client/shared/vendor/fluent-react");
+const Localized = createFactory(FluentReact.Localized);
+
 /**
  * This component displays runtime information.
  */
 class RuntimeInfo extends PureComponent {
   static get propTypes() {
     return {
       icon: PropTypes.string.isRequired,
+      model: PropTypes.string,
       name: PropTypes.string.isRequired,
       version: PropTypes.string.isRequired,
     };
   }
 
   render() {
-    const { icon, name, version } = this.props;
+    const { icon, model, name, version } = this.props;
 
     return dom.h1(
       {
         className: "runtime-info",
       },
       dom.img(
         {
           className: "runtime-info__icon",
           src: icon,
         }
       ),
-      `${ name } (${ version })`
+      Localized(
+        {
+          id: model ? "about-debugging-runtime-info-with-model"
+                    : "about-debugging-runtime-info",
+          $name: name,
+          $model: model,
+          $version: version,
+        },
+        dom.label({}, `${ name } on ${ model } (${ version })`)
+      )
     );
   }
 }
 
 module.exports = RuntimeInfo;
--- a/devtools/client/aboutdebugging-new/src/components/RuntimePage.js
+++ b/devtools/client/aboutdebugging-new/src/components/RuntimePage.js
@@ -18,154 +18,132 @@ const InspectAction = createFactory(requ
 const RuntimeInfo = createFactory(require("./RuntimeInfo"));
 const ServiceWorkerAction = createFactory(require("./debugtarget/ServiceWorkerAction"));
 const TabDetail = createFactory(require("./debugtarget/TabDetail"));
 const TemporaryExtensionAction = createFactory(require("./debugtarget/TemporaryExtensionAction"));
 const TemporaryExtensionInstaller =
   createFactory(require("./debugtarget/TemporaryExtensionInstaller"));
 const WorkerDetail = createFactory(require("./debugtarget/WorkerDetail"));
 
-const Services = require("Services");
 const { DEBUG_TARGET_PANE } = require("../constants");
+const { getCurrentRuntimeInfo } = require("../modules/runtimes-state-helper");
+const { isSupportedDebugTargetPane } = require("../modules/debug-target-support");
 
 class RuntimePage extends PureComponent {
   static get propTypes() {
     return {
       collapsibilities: PropTypes.object.isRequired,
       dispatch: PropTypes.func.isRequired,
       installedExtensions: PropTypes.arrayOf(PropTypes.object).isRequired,
       otherWorkers: PropTypes.arrayOf(PropTypes.object).isRequired,
+      runtimeInfo: PropTypes.object,
       serviceWorkers: PropTypes.arrayOf(PropTypes.object).isRequired,
       sharedWorkers: PropTypes.arrayOf(PropTypes.object).isRequired,
       tabs: PropTypes.arrayOf(PropTypes.object).isRequired,
       temporaryExtensions: PropTypes.arrayOf(PropTypes.object).isRequired,
     };
   }
 
+  renderDebugTargetPane(name, targets, actionComponent,
+                        detailComponent, paneKey, localizationId) {
+    const { collapsibilities, dispatch, runtimeInfo } = this.props;
+
+    if (!isSupportedDebugTargetPane(runtimeInfo.type, paneKey)) {
+      return null;
+    }
+
+    return Localized(
+      {
+        id: localizationId,
+        attrs: { name: true }
+      },
+      DebugTargetPane({
+        actionComponent,
+        collapsibilityKey: paneKey,
+        detailComponent,
+        dispatch,
+        isCollapsed: collapsibilities.get(paneKey),
+        name,
+        targets,
+      })
+    );
+  }
+
   render() {
     const {
-      collapsibilities,
       dispatch,
       installedExtensions,
       otherWorkers,
+      runtimeInfo,
       serviceWorkers,
       sharedWorkers,
       tabs,
       temporaryExtensions,
     } = this.props;
 
+    if (!runtimeInfo) {
+      // runtimeInfo can be null when the selectPage action navigates from a runtime A
+      // to a runtime B (between unwatchRuntime and watchRuntime).
+      return null;
+    }
+
     return dom.article(
       {
         className: "page js-runtime-page",
       },
-      RuntimeInfo({
-        icon: "chrome://branding/content/icon64.png",
-        name: Services.appinfo.name,
-        version: Services.appinfo.version,
-      }),
-      TemporaryExtensionInstaller({ dispatch }),
-      Localized(
-        {
-          id: "about-debugging-runtime-temporary-extensions",
-          attrs: { name: true }
-        },
-        DebugTargetPane({
-          actionComponent: TemporaryExtensionAction,
-          collapsibilityKey: DEBUG_TARGET_PANE.TEMPORARY_EXTENSION,
-          detailComponent: ExtensionDetail,
-          dispatch,
-          isCollapsed: collapsibilities.get(DEBUG_TARGET_PANE.TEMPORARY_EXTENSION),
-          name: "Temporary Extensions",
-          targets: temporaryExtensions,
-        })
-      ),
-      Localized(
-        {
-          id: "about-debugging-runtime-extensions",
-          attrs: { name: true }
-        },
-        DebugTargetPane({
-          actionComponent: InspectAction,
-          collapsibilityKey: DEBUG_TARGET_PANE.INSTALLED_EXTENSION,
-          detailComponent: ExtensionDetail,
-          dispatch,
-          isCollapsed: collapsibilities.get(DEBUG_TARGET_PANE.INSTALLED_EXTENSION),
-          name: "Extensions",
-          targets: installedExtensions,
-        })
-      ),
-      Localized(
-        {
-          id: "about-debugging-runtime-tabs",
-          attrs: { name: true }
-        },
-        DebugTargetPane({
-          actionComponent: InspectAction,
-          collapsibilityKey: DEBUG_TARGET_PANE.TAB,
-          detailComponent: TabDetail,
-          dispatch,
-          isCollapsed: collapsibilities.get(DEBUG_TARGET_PANE.TAB),
-          name: "Tabs",
-          targets: tabs
-        })
-      ),
-      Localized(
-        {
-          id: "about-debugging-runtime-service-workers",
-          attrs: { name: true }
-        },
-        DebugTargetPane({
-          actionComponent: ServiceWorkerAction,
-          collapsibilityKey: DEBUG_TARGET_PANE.SERVICE_WORKER,
-          detailComponent: WorkerDetail,
-          dispatch,
-          isCollapsed: collapsibilities.get(DEBUG_TARGET_PANE.SERVICE_WORKER),
-          name: "Service Workers",
-          targets: serviceWorkers
-        })
-      ),
-      Localized(
-        {
-          id: "about-debugging-runtime-shared-workers",
-          attrs: { name: true }
-        },
-        DebugTargetPane({
-          actionComponent: InspectAction,
-          collapsibilityKey: DEBUG_TARGET_PANE.SHARED_WORKER,
-          detailComponent: WorkerDetail,
-          dispatch,
-          isCollapsed: collapsibilities.get(DEBUG_TARGET_PANE.SHARED_WORKER),
-          name: "Shared Workers",
-          targets: sharedWorkers
-        })
-      ),
-      Localized(
-        {
-          id: "about-debugging-runtime-other-workers",
-          attrs: { name: true }
-        },
-        DebugTargetPane({
-          actionComponent: InspectAction,
-          collapsibilityKey: DEBUG_TARGET_PANE.OTHER_WORKER,
-          detailComponent: WorkerDetail,
-          dispatch,
-          isCollapsed: collapsibilities.get(DEBUG_TARGET_PANE.OTHER_WORKER),
-          name: "Other Workers",
-          targets: otherWorkers
-        })
-      ),
+      RuntimeInfo(runtimeInfo),
+      isSupportedDebugTargetPane(runtimeInfo.type, DEBUG_TARGET_PANE.TEMPORARY_EXTENSION)
+        ? TemporaryExtensionInstaller({ dispatch })
+        : null,
+      this.renderDebugTargetPane("Temporary Extensions",
+                                 temporaryExtensions,
+                                 TemporaryExtensionAction,
+                                 ExtensionDetail,
+                                 DEBUG_TARGET_PANE.TEMPORARY_EXTENSION,
+                                 "about-debugging-runtime-temporary-extensions"),
+      this.renderDebugTargetPane("Extensions",
+                                 installedExtensions,
+                                 InspectAction,
+                                 ExtensionDetail,
+                                 DEBUG_TARGET_PANE.INSTALLED_EXTENSION,
+                                 "about-debugging-runtime-extensions"),
+      this.renderDebugTargetPane("Tabs",
+                                 tabs,
+                                 InspectAction,
+                                 TabDetail,
+                                 DEBUG_TARGET_PANE.TAB,
+                                 "about-debugging-runtime-tabs"),
+      this.renderDebugTargetPane("Service Workers",
+                                 serviceWorkers,
+                                 ServiceWorkerAction,
+                                 WorkerDetail,
+                                 DEBUG_TARGET_PANE.SERVICE_WORKER,
+                                 "about-debugging-runtime-service-workers"),
+      this.renderDebugTargetPane("Shared Workers",
+                                 sharedWorkers,
+                                 InspectAction,
+                                 WorkerDetail,
+                                 DEBUG_TARGET_PANE.SHARED_WORKER,
+                                 "about-debugging-runtime-shared-workers"),
+      this.renderDebugTargetPane("Other Workers",
+                                 otherWorkers,
+                                 InspectAction,
+                                 WorkerDetail,
+                                 DEBUG_TARGET_PANE.OTHER_WORKER,
+                                 "about-debugging-runtime-other-workers"),
     );
   }
 }
 
 const mapStateToProps = state => {
   return {
     collapsibilities: state.ui.debugTargetCollapsibilities,
     installedExtensions: state.debugTargets.installedExtensions,
     otherWorkers: state.debugTargets.otherWorkers,
+    runtimeInfo: getCurrentRuntimeInfo(state.runtimes),
     serviceWorkers: state.debugTargets.serviceWorkers,
     sharedWorkers: state.debugTargets.sharedWorkers,
     tabs: state.debugTargets.tabs,
     temporaryExtensions: state.debugTargets.temporaryExtensions,
   };
 };
 
 module.exports = connect(mapStateToProps)(RuntimePage);
new file mode 100644
--- /dev/null
+++ b/devtools/client/aboutdebugging-new/src/modules/debug-target-support.js
@@ -0,0 +1,25 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+const { DEBUG_TARGETS, DEBUG_TARGET_PANE, RUNTIMES } = require("../constants");
+
+function isSupportedDebugTarget(runtimeType, debugTargetType) {
+  if (runtimeType === RUNTIMES.THIS_FIREFOX) {
+    return true;
+  }
+
+  return debugTargetType === DEBUG_TARGETS.TAB;
+}
+exports.isSupportedDebugTarget = isSupportedDebugTarget;
+
+function isSupportedDebugTargetPane(runtimeType, debugTargetPaneKey) {
+  if (runtimeType === RUNTIMES.THIS_FIREFOX) {
+    return true;
+  }
+
+  return debugTargetPaneKey === DEBUG_TARGET_PANE.TAB;
+}
+exports.isSupportedDebugTargetPane = isSupportedDebugTargetPane;
--- a/devtools/client/aboutdebugging-new/src/modules/moz.build
+++ b/devtools/client/aboutdebugging-new/src/modules/moz.build
@@ -1,11 +1,12 @@
 # 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/.
 
 DevToolsModules(
     'debug-target-collapsibilities.js',
+    'debug-target-support.js',
     'extensions-helper.js',
     'network-locations.js',
     'runtimes-state-helper.js',
     'usb-runtimes.js',
 )
--- a/devtools/client/aboutdebugging-new/src/modules/runtimes-state-helper.js
+++ b/devtools/client/aboutdebugging-new/src/modules/runtimes-state-helper.js
@@ -10,16 +10,22 @@ function getCurrentRuntime(runtimesState
 }
 exports.getCurrentRuntime = getCurrentRuntime;
 
 function getCurrentClient(runtimesState) {
   return getCurrentRuntime(runtimesState).client;
 }
 exports.getCurrentClient = getCurrentClient;
 
+function getCurrentRuntimeInfo(runtimesState) {
+  const runtime = getCurrentRuntime(runtimesState);
+  return runtime ? runtime.info : null;
+}
+exports.getCurrentRuntimeInfo = getCurrentRuntimeInfo;
+
 function findRuntimeById(id, runtimesState) {
   const allRuntimes = [
     ...runtimesState.networkRuntimes,
     ...runtimesState.thisFirefoxRuntimes,
     ...runtimesState.usbRuntimes,
   ];
   return allRuntimes.find(r => r.id === id);
 }
--- a/devtools/client/aboutdebugging-new/src/reducers/runtimes-state.js
+++ b/devtools/client/aboutdebugging-new/src/reducers/runtimes-state.js
@@ -63,23 +63,23 @@ function _updateRuntimeById(runtimeId, u
     return r;
   });
   return Object.assign({}, state, { [key]: updatedRuntimes });
 }
 
 function runtimesReducer(state = RuntimesState(), action) {
   switch (action.type) {
     case CONNECT_RUNTIME_SUCCESS: {
-      const { id, client } = action.runtime;
-      return _updateRuntimeById(id, { client }, state);
+      const { id, client, info } = action.runtime;
+      return _updateRuntimeById(id, { client, info }, state);
     }
 
     case DISCONNECT_RUNTIME_SUCCESS: {
       const { id } = action.runtime;
-      return _updateRuntimeById(id, { client: null }, state);
+      return _updateRuntimeById(id, { client: null, info: null }, state);
     }
 
     case NETWORK_LOCATIONS_UPDATED: {
       const { locations } = action;
       const networkRuntimes = locations.map(location => {
         return {
           id: location,
           name: location,
@@ -93,16 +93,17 @@ function runtimesReducer(state = Runtime
       return Object.assign({}, state, { selectedRuntimeId: null });
     }
 
     case USB_RUNTIMES_UPDATED: {
       const { runtimes } = action;
       const usbRuntimes = runtimes.map(runtime => {
         return {
           id: runtime.id,
+          model: runtime._model,
           name: runtime.name,
           socketPath: runtime._socketPath,
           type: RUNTIMES.USB,
         };
       });
       return Object.assign({}, state, { usbRuntimes });
     }
 
--- a/devtools/client/aboutdebugging-new/tmp-locale/en-US/aboutdebugging.notftl
+++ b/devtools/client/aboutdebugging-new/tmp-locale/en-US/aboutdebugging.notftl
@@ -162,8 +162,19 @@ about-debugging-worker-status-running = 
 
 # Displayed for service workers in runtime pages, for service workers in STOPPED state.
 about-debugging-worker-status-stopped = Stopped
 
 # Displayed for service workers in runtime pages, for service workers for which no
 # registration could be found yet. Only active registrations are visible from
 # about:debugging, so such service workers are considered as registering.
 about-debugging-worker-status-registering = Registering
+
+# Displayed for runtime info in runtime pages.
+# { $name } is brand name such as "Firefox Nightly"
+# { $version } is version such as "64.0a1"
+about-debugging-runtime-info = { $name } ({ $version })
+
+# Displayed for runtime info in runtime page when we display the model as well.
+# { $name } is brand name such as "Firefox Nightly"
+# { $version } is version such as "64.0a1"
+# { $model } is model name of device
+about-debugging-runtime-info-with-model = { $name } on { $model } ({ $version })
--- a/devtools/client/jar.mn
+++ b/devtools/client/jar.mn
@@ -109,17 +109,21 @@ devtools.jar:
     skin/images/arrowhead-left.svg (themes/images/arrowhead-left.svg)
     skin/images/arrowhead-down.svg (themes/images/arrowhead-down.svg)
     skin/images/arrowhead-up.svg (themes/images/arrowhead-up.svg)
     skin/images/breadcrumbs-divider.svg (themes/images/breadcrumbs-divider.svg)
     skin/images/filters.svg (themes/images/filters.svg)
     skin/images/filter-swatch.svg (themes/images/filter-swatch.svg)
     skin/images/aboutdebugging-collapse-icon.svg (themes/images/aboutdebugging-collapse-icon.svg)
     skin/images/aboutdebugging-connect-icon.svg (themes/images/aboutdebugging-connect-icon.svg)
+    skin/images/aboutdebugging-firefox-aurora.svg (themes/images/aboutdebugging-firefox-aurora.svg)
+    skin/images/aboutdebugging-firefox-beta.svg (themes/images/aboutdebugging-firefox-beta.svg)
     skin/images/aboutdebugging-firefox-logo.svg (themes/images/aboutdebugging-firefox-logo.svg)
+    skin/images/aboutdebugging-firefox-nightly.svg (themes/images/aboutdebugging-firefox-nightly.svg)
+    skin/images/aboutdebugging-firefox-release.svg (themes/images/aboutdebugging-firefox-release.svg)
     skin/images/aboutdebugging-globe-icon.svg (themes/images/aboutdebugging-globe-icon.svg)
     skin/images/fox-smiling.svg (themes/images/fox-smiling.svg)
     skin/images/grid.svg (themes/images/grid.svg)
     skin/images/angle-swatch.svg (themes/images/angle-swatch.svg)
     skin/images/pseudo-class.svg (themes/images/pseudo-class.svg)
     skin/images/controls.png (themes/images/controls.png)
     skin/images/controls@2x.png (themes/images/controls@2x.png)
     skin/images/copy.svg (themes/images/copy.svg)
new file mode 100644
--- /dev/null
+++ b/devtools/client/themes/images/aboutdebugging-firefox-aurora.svg
@@ -0,0 +1,4 @@
+<!-- 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/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 955.45 986.16"><defs><linearGradient id="linear-gradient" x1="-14371.64" y1="9293.53" x2="-14108.4" y2="9293.53" gradientTransform="matrix(0.76, 0.03, 0.05, -1.12, 11228.23, 11186.79)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#0083ff"/><stop offset="0.18" stop-color="#0096f6"/><stop offset="0.51" stop-color="#00b3e6"/><stop offset="0.79" stop-color="#00c6dd"/><stop offset="1" stop-color="#00ccda"/></linearGradient><linearGradient id="linear-gradient-2" x1="-541.3" y1="256.54" x2="-732.73" y2="882.77" gradientTransform="matrix(1, 0, 0, -1, 1081.94, 986.01)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#000f40" stop-opacity="0.6"/><stop offset="0.61" stop-color="#000f40" stop-opacity="0.18"/><stop offset="1" stop-color="#000f40" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-3" x1="540.64" y1="256.54" x2="349.2" y2="882.77" gradientTransform="matrix(1, 0, 0, -1, 0, 986.01)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#000f43" stop-opacity="0.4"/><stop offset="0.48" stop-color="#001962" stop-opacity="0.17"/><stop offset="1" stop-color="#002079" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-4" x1="-8570.46" y1="7439.08" x2="-8685.71" y2="7447.98" gradientTransform="matrix(1.22, 0.12, 0.12, -1.22, 10478.03, 10900.02)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#002275"/><stop offset="1" stop-color="#005fe7"/></linearGradient><linearGradient id="linear-gradient-5" x1="-8653.32" y1="7586.86" x2="-8545.37" y2="7698.98" gradientTransform="matrix(1.22, 0.12, 0.12, -1.22, 10478.03, 10900.02)" gradientUnits="userSpaceOnUse"><stop offset="0.05" stop-color="#005fe7"/><stop offset="0.19" stop-color="#005ce1"/><stop offset="0.38" stop-color="#0052cf"/><stop offset="0.6" stop-color="#0043b2"/><stop offset="0.84" stop-color="#002d8a"/><stop offset="0.95" stop-color="#002275"/></linearGradient><linearGradient id="linear-gradient-6" x1="-8856.78" y1="7335.52" x2="-8625.9" y2="7334.98" gradientTransform="matrix(1.22, 0.12, 0.12, -1.22, 10478.03, 10900.02)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#002079"/><stop offset="0.99" stop-color="#000f40"/></linearGradient><radialGradient id="radial-gradient" cx="584.1" cy="600.57" fx="717.5140400954007" fy="478.32765335281425" r="751.57" gradientTransform="matrix(1, 0, 0, -1, 0, 986.01)" gradientUnits="userSpaceOnUse"><stop offset="0.16" stop-color="#58c1ff"/><stop offset="0.24" stop-color="#4cb8ff"/><stop offset="0.39" stop-color="#2ea0ff"/><stop offset="0.54" stop-color="#0a84ff"/><stop offset="0.76" stop-color="#0060df"/><stop offset="0.8" stop-color="#0067de"/><stop offset="0.85" stop-color="#007bdd"/><stop offset="0.91" stop-color="#009cda"/><stop offset="0.98" stop-color="#00c8d7"/></radialGradient><linearGradient id="linear-gradient-7" x1="-7658.58" y1="9078.09" x2="-7729.61" y2="8279.7" gradientTransform="matrix(1.23, 0, 0, -1.22, 10201.91, 11050.28)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#00feff"/><stop offset="0.3" stop-color="#04c9ff"/><stop offset="0.61" stop-color="#0897ff"/><stop offset="0.77" stop-color="#0a84ff"/><stop offset="0.79" stop-color="#0a84ff" stop-opacity="0.93"/><stop offset="0.84" stop-color="#0a84ff" stop-opacity="0.76"/><stop offset="0.9" stop-color="#0a84ff" stop-opacity="0.49"/><stop offset="0.98" stop-color="#0a84ff" stop-opacity="0.11"/><stop offset="1" stop-color="#0a84ff" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-8" x1="-9129.99" y1="7770.74" x2="-8993.52" y2="7770.74" gradientTransform="matrix(1.22, 0.12, 0.12, -1.22, 10478.03, 10900.02)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#003eaa"/><stop offset="0.3" stop-color="#0054c5" stop-opacity="0.68"/><stop offset="0.78" stop-color="#0076ef" stop-opacity="0.19"/><stop offset="1" stop-color="#0083ff" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-9" x1="553.42" y1="650.09" x2="358.4" y2="653.09" gradientTransform="matrix(1, 0, 0, -1, 0, 986.01)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#00feff" stop-opacity="0.25"/><stop offset="0.54" stop-color="#2ddfff" stop-opacity="0.12"/><stop offset="1" stop-color="#58c1ff" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-10" x1="208.63" y1="2142.48" x2="90.81" y2="2394.32" gradientTransform="matrix(0.99, 0.1, 0.1, -0.99, -255.6, 2416.49)" gradientUnits="userSpaceOnUse"><stop offset="0.19" stop-color="#002275" stop-opacity="0.7"/><stop offset="0.63" stop-color="#009dc2" stop-opacity="0.36"/><stop offset="0.94" stop-color="#00feff" stop-opacity="0.1"/></linearGradient><linearGradient id="linear-gradient-11" x1="-43.75" y1="388.32" x2="50.36" y2="281.43" gradientTransform="matrix(0.99, 0.1, 0.1, -0.99, 223.54, 856.07)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#002275" stop-opacity="0.8"/><stop offset="0.07" stop-color="#002479" stop-opacity="0.74"/><stop offset="0.95" stop-color="#003eaa" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-12" x1="136.86" y1="206.19" x2="136.9" y2="259.62" gradientTransform="matrix(0.99, 0.1, 0.1, -0.99, 223.54, 856.07)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#002275" stop-opacity="0.6"/><stop offset="0.24" stop-color="#002275" stop-opacity="0.34"/><stop offset="0.49" stop-color="#002275" stop-opacity="0.15"/><stop offset="0.72" stop-color="#002275" stop-opacity="0.04"/><stop offset="0.93" stop-color="#002275" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-13" x1="569.33" y1="1064.11" x2="877.68" y2="374.6" gradientTransform="matrix(1, 0, 0, -1, 0, 986.01)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#00feff"/><stop offset="0.28" stop-color="#03dfff"/><stop offset="0.9" stop-color="#0992ff"/><stop offset="1" stop-color="#0a84ff"/></linearGradient><linearGradient id="linear-gradient-14" x1="680.88" y1="556.54" x2="536.1" y2="167.79" gradientTransform="matrix(1, 0, 0, -1, 0, 986.01)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#0060df"/><stop offset="0.09" stop-color="#0067e5" stop-opacity="0.81"/><stop offset="0.21" stop-color="#006eec" stop-opacity="0.59"/><stop offset="0.33" stop-color="#0075f2" stop-opacity="0.41"/><stop offset="0.46" stop-color="#007af7" stop-opacity="0.26"/><stop offset="0.58" stop-color="#007efa" stop-opacity="0.15"/><stop offset="0.71" stop-color="#0081fd" stop-opacity="0.06"/><stop offset="0.85" stop-color="#0082fe" stop-opacity="0.02"/><stop offset="1" stop-color="#0083ff" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-15" x1="640" y1="1020.28" x2="747.99" y2="109.82" gradientTransform="matrix(1, 0, 0, -1, 0, 986.01)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#75feff"/><stop offset="0.28" stop-color="#5adfff"/><stop offset="0.9" stop-color="#1692ff"/><stop offset="1" stop-color="#0a84ff"/></linearGradient><linearGradient id="linear-gradient-16" x1="735.59" y1="578.41" x2="653.1" y2="230.43" gradientTransform="matrix(1, 0, 0, -1, 0, 986.01)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#9ee7ff"/><stop offset="0.14" stop-color="#8cdbff" stop-opacity="0.88"/><stop offset="0.46" stop-color="#5ebdff" stop-opacity="0.57"/><stop offset="0.92" stop-color="#168cff" stop-opacity="0.08"/><stop offset="1" stop-color="#0a84ff" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-17" x1="649" y1="1002.59" x2="724.57" y2="429.48" gradientTransform="matrix(1, 0, 0, -1, 0, 986.01)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#00feff"/><stop offset="0.14" stop-color="#0bf7ff" stop-opacity="0.88"/><stop offset="0.46" stop-color="#26e4ff" stop-opacity="0.57"/><stop offset="0.92" stop-color="#51c6ff" stop-opacity="0.08"/><stop offset="1" stop-color="#58c1ff" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-18" x1="662.8" y1="968.07" x2="1060.94" y2="345.6" gradientTransform="matrix(1, 0, 0, -1, 0, 986.01)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#00feff"/><stop offset="0.14" stop-color="#01efff" stop-opacity="0.88"/><stop offset="0.46" stop-color="#04caff" stop-opacity="0.57"/><stop offset="0.92" stop-color="#098eff" stop-opacity="0.08"/><stop offset="1" stop-color="#0a84ff" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-19" x1="754.44" y1="521.58" x2="313.86" y2="178" href="#linear-gradient-16"/><linearGradient id="linear-gradient-20" x1="358.66" y1="754.08" x2="43.38" y2="513.58" href="#linear-gradient-18"/><linearGradient id="linear-gradient-21" x1="145.65" y1="859.21" x2="130.45" y2="726.91" href="#linear-gradient-18"/><linearGradient id="linear-gradient-22" x1="292.53" y1="562.84" x2="195.52" y2="368.82" href="#linear-gradient-18"/></defs><title>firefox-logo-developer-edition</title><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><g id="Layer_2-2" data-name="Layer 2"><g id="Fox_Lines_-_Outlined" data-name="Fox Lines - Outlined"><polygon points="916.77 436.39 896.46 368.8 838.37 258.88 771.93 188.65 701.38 138.15 640.13 114.04 566.64 87.83 445.64 80.1 369.34 93.91 307.08 113.11 196.61 177.94 127.56 255.17 63.9 358.86 38.86 447.1 34.18 580.97 58.05 672.25 110.71 776.17 147.85 826.37 199.21 873.58 263.35 917.09 342.45 951.59 474.81 967.17 543.93 969.1 646.22 940.21 737.65 889.89 796.48 839.57 842.09 785 906.58 658.41 920.82 571.82 916.77 436.39" style="fill:#061a58"/><polygon points="447.85 140.94 393.67 194.85 482.06 230.78 447.85 140.94" style="fill:#133691"/><polygon points="482.06 230.78 447.85 140.94 547.82 149.01 482.06 230.78" style="fill:#1943ae"/><polygon points="482.06 230.78 653.2 225.58 547.82 149.01 482.06 230.78" style="fill:#2053cf"/><polygon points="653.2 225.58 547.82 149.01 640.49 148.44 653.2 225.58" style="fill:#2660eb"/><polygon points="653.2 225.58 750.65 219.2 640.49 148.44 653.2 225.58" style="fill:#306dff"/><polygon points="750.65 219.2 640.49 148.44 695.25 142.59 750.65 219.2" style="fill:#235adb"/><polygon points="750.65 219.2 695.25 142.59 771.93 188.65 750.65 219.2" style="fill:#2660eb"/><polygon points="824.01 266.11 750.65 219.2 771.93 188.65 824.01 266.11" style="fill:#2053cf"/><polygon points="750.65 219.2 738.38 271.68 805.48 298.57 750.65 219.2" style="fill:#1c4abd"/><polygon points="750.65 219.2 824.01 266.11 805.48 298.57 750.65 219.2" style="fill:#1a46b4"/><polygon points="653.2 225.58 750.65 219.2 738.38 271.68 653.2 225.58" style="fill:#2660eb"/><polygon points="653.2 225.58 738.38 271.68 675.3 344.13 653.2 225.58" style="fill:#235adb"/><polygon points="653.2 225.58 576.21 295.46 675.3 344.13 653.2 225.58" style="fill:#1f51ca"/><polygon points="482.06 230.78 653.2 225.58 576.21 295.46 482.06 230.78" style="fill:#1f50c9"/><polygon points="675.3 344.13 738.38 271.68 784.98 362.3 675.3 344.13" style="fill:#2053cf"/><polygon points="738.38 271.68 784.98 362.3 805.48 298.57 738.38 271.68" style="fill:#1b48b9"/><polygon points="784.98 362.3 805.48 298.57 854.3 415.01 784.98 362.3" style="fill:#173fa5"/><polygon points="805.48 298.57 879.88 353.21 854.3 415.01 805.48 298.57" style="fill:#12348d"/><polygon points="805.48 298.57 879.88 353.21 824.01 266.11 805.48 298.57" style="fill:#143895"/><polygon points="824.01 266.11 838.37 258.88 879.88 353.21 824.01 266.11" style="fill:#0f2f82"/><polygon points="879.88 353.21 896.46 368.8 838.37 258.88 879.88 353.21" style="fill:#05154c"/><polygon points="824.01 266.11 838.37 258.88 771.93 188.65 824.01 266.11" style="fill:#163c9e"/><polygon points="913.04 489.2 896.46 368.8 916.77 436.39 912.77 489.2 913.04 489.2" style="fill:#051753"/><polygon points="879.88 353.21 913.04 489.2 896.46 368.8 879.88 353.21" style="fill:#061a57"/><polygon points="854.3 415.01 913.04 489.2 879.88 353.21 854.3 415.01" style="fill:#05154c"/><polygon points="912.77 489.2 916.77 436.39 920.82 571.82 913.04 489.2 912.77 489.2" style="fill:#081f63"/><polygon points="903.2 596.22 920.82 571.82 913.04 489.2 903.2 596.22" style="fill:#12348d"/><polygon points="906.58 658.41 892.49 665.22 920.82 571.82 906.58 658.41" style="fill:#123392"/><polygon points="892.49 665.22 920.82 571.82 903.2 596.22 892.49 665.22" style="fill:#0c2674"/><polygon points="903.2 596.22 913.04 489.2 882.86 524.9 903.2 596.22" style="fill:#081f63"/><polygon points="892.49 665.22 903.2 596.22 844.99 694.32 892.49 665.22" style="fill:#0f2f82"/><polygon points="854.3 415.01 913.04 489.2 882.86 524.9 854.3 415.01" style="fill:#061a57"/><polygon points="903.2 596.22 882.86 524.9 852.17 612.75 903.2 596.22" style="fill:#081e5f"/><polygon points="844.99 694.32 903.2 596.22 852.17 612.75 844.99 694.32" style="fill:#092167"/><polygon points="842.09 785 906.58 658.41 892.49 665.22 842.09 785" style="fill:#163aa2"/><polygon points="842.09 785 892.49 665.22 845.34 752.53 842.09 785" style="fill:#163aa2"/><polygon points="845.34 752.53 892.49 665.22 844.99 694.32 845.34 752.53" style="fill:#0e2b7e"/><polygon points="796.48 839.57 845.34 752.53 842.09 785 796.48 839.57" style="fill:#123392"/><polyline points="734.31 868.24 796.48 839.57 737.65 889.89 734.31 868.24" style="fill:#1a45b2"/><polygon points="796.48 839.57 845.34 752.53 734.31 868.24 796.48 839.57" style="fill:#123392"/><polygon points="734.31 868.24 737.65 889.89 685.8 905.97 734.31 868.24" style="fill:#133493"/><polygon points="646.22 940.21 685.8 905.97 737.65 889.89 646.22 940.21" style="fill:#1a45b2"/><polygon points="646.22 940.21 685.8 905.97 557.16 954.07 646.22 940.21" style="fill:#1a45b2"/><polygon points="543.93 969.1 646.22 940.21 557.16 954.07 543.93 969.1" style="fill:#1a45b2"/><polygon points="474.81 967.17 543.93 969.1 557.16 954.07 474.81 967.17" style="fill:#1a45b2"/><polygon points="342.45 951.59 334.9 939.52 474.81 967.17 342.45 951.59" style="fill:#1f51ca"/><polygon points="342.45 951.59 334.9 939.52 263.35 917.09 342.45 951.59" style="fill:#173fad"/><polygon points="199.21 873.58 147.85 826.37 263.35 917.09 199.21 873.58" style="fill:#173fad"/><polygon points="147.85 826.37 110.71 776.17 135.38 784.31 147.85 826.37" style="fill:#1b47b5"/><polygon points="147.85 826.37 263.35 917.09 225.57 868.79 147.85 826.37" style="fill:#163aa3"/><polygon points="147.85 826.37 225.57 868.79 135.38 784.31 147.85 826.37" style="fill:#173fad"/><polygon points="225.57 868.79 334.9 939.52 263.35 917.09 225.57 868.79" style="fill:#133595"/><polygon points="225.57 868.79 334.9 939.52 336.71 897.93 225.57 868.79" style="fill:#163ba4"/><polygon points="394.33 924.94 334.9 939.52 336.71 897.93 394.33 924.94" style="fill:#163aa2"/><polygon points="135.38 784.31 110.71 776.17 94.21 702.09 135.38 784.31" style="fill:#2053cf"/><polygon points="110.71 776.17 58.05 672.25 94.21 702.09 110.71 776.17" style="fill:#306dff"/><polyline points="40.73 560.38 94.21 702.09 58.05 672.25" style="fill:#1f51ca"/><polygon points="58.05 672.25 34.18 580.97 40.73 560.38 58.05 672.25" style="fill:#2257d7"/><polygon points="40.73 560.38 34.18 580.97 38.86 447.1 40.73 560.38" style="fill:#11318d"/><polygon points="63.9 358.86 80.28 352.77 38.86 447.1 63.9 358.86" style="fill:#0c2674"/><polygon points="38.86 447.1 70.22 441.25 80.28 352.77 38.86 447.1" style="fill:#102f88"/><polygon points="40.73 560.38 38.86 447.1 70.22 441.25 40.73 560.38" style="fill:#133595"/><polygon points="70.22 441.25 68.11 537.91 40.73 560.38 70.22 441.25" style="fill:#12328e"/><polygon points="127.56 255.17 80.28 352.77 63.9 358.86 127.56 255.17" style="fill:#0b2572"/><polygon points="127.56 255.17 187.95 197.36 196.61 177.94 127.56 255.17" style="fill:#020b2e"/><polygon points="196.61 177.94 268.46 142.13 187.95 197.36 196.61 177.94" style="fill:#092064"/><polyline points="196.61 177.94 307.08 113.11 268.46 142.13 196.61 177.94" style="fill:#030f41"/><polygon points="268.46 142.13 369.34 93.91 307.08 113.11 268.46 142.13" style="fill:#081e5f"/><polygon points="369.34 93.91 329.9 136.51 268.46 142.13 369.34 93.91" style="fill:#081f61"/><polygon points="329.9 136.51 423.87 98.83 369.34 93.91 329.9 136.51" style="fill:#0d2a78"/><polygon points="445.64 80.1 369.34 93.91 423.87 98.83 445.64 80.1" style="fill:#11338b"/><polyline points="517.8 97.89 423.87 98.83 445.64 80.1" style="fill:#153a99"/><polygon points="445.64 80.1 566.64 87.83 517.8 97.89 445.64 80.1" style="fill:#0d2a78"/><polygon points="517.8 97.89 566.64 87.83 640.13 114.04 517.8 97.89" style="fill:#2053ce"/><polygon points="695.25 142.59 640.13 114.04 701.38 138.15 695.25 142.59" style="fill:#1e4dc3"/><polygon points="695.25 142.59 701.38 138.15 771.93 188.65 695.25 142.59" style="fill:#1e4fc7"/><polygon points="334.9 939.52 474.81 967.17 394.33 924.94 334.9 939.52" style="fill:#1a45b2"/><polygon points="474.81 967.17 394.33 924.94 473.09 910.23 474.81 967.17" style="fill:#163aa2"/><polygon points="557.16 954.07 474.81 967.17 473.09 910.23 557.16 954.07" style="fill:#1a45b2"/><polygon points="557.16 954.07 473.09 910.23 588.95 879.02 557.16 954.07" style="fill:#1741aa"/><polyline points="685.8 905.97 557.16 954.07 588.95 879.02" style="fill:#1a45b2"/><polygon points="685.8 905.97 691.68 830.87 588.95 879.02 685.8 905.97" style="fill:#133493"/><polygon points="685.8 905.97 691.68 830.87 734.31 868.24 685.8 905.97" style="fill:#163aa2"/><polygon points="734.31 868.24 691.68 830.87 794.68 762.24 734.31 868.24" style="fill:#133493"/><polygon points="734.31 868.24 794.68 762.24 845.34 752.53 734.31 868.24" style="fill:#1a45b2"/><polygon points="845.34 752.53 844.99 694.32 794.68 762.24 845.34 752.53" style="fill:#092167"/><polyline points="640.13 114.04 640.49 148.44 695.25 142.59" style="fill:#2258d9"/><polygon points="640.49 148.44 640.13 114.04 517.8 97.89 640.49 148.44" style="fill:#2257d7"/><polygon points="517.8 97.89 547.82 149.01 640.49 148.44 517.8 97.89" style="fill:#2257d7"/><polygon points="517.8 97.89 547.82 149.01 447.85 140.94 517.8 97.89" style="fill:#1a46b3"/><polygon points="423.87 98.83 447.85 140.94 517.8 97.89 423.87 98.83" style="fill:#163c9f"/><polygon points="329.9 136.51 423.87 98.83 447.85 140.94 329.9 136.51" style="fill:#103186"/><polygon points="393.67 194.85 329.9 136.51 447.85 140.94 393.67 194.85" style="fill:#163c9e"/><polygon points="268.46 142.13 187.95 197.36 226.1 234.11 268.46 142.13" style="fill:#031043"/><polygon points="329.9 136.51 226.1 234.11 268.46 142.13 329.9 136.51" style="fill:#030f41"/><polygon points="226.1 234.11 292.33 245.16 329.9 136.51 226.1 234.11" style="fill:#05164e"/><polygon points="292.33 245.16 329.9 136.51 393.67 194.85 292.33 245.16" style="fill:#092064"/><polygon points="127.56 255.17 131.6 294.44 187.95 197.36 127.56 255.17" style="fill:#030f41"/><polygon points="80.28 352.77 127.56 255.17 131.6 294.44 80.28 352.77" style="fill:#091f64"/><polygon points="131.6 294.44 187.95 197.36 226.1 234.11 131.6 294.44" style="fill:#041345"/><polygon points="128.19 378.6 131.6 294.44 80.28 352.77 128.19 378.6" style="fill:#0a226b"/><polygon points="128.19 378.6 131.6 294.44 198.19 348.64 128.19 378.6" style="fill:#091f64"/><polygon points="198.19 348.64 226.1 234.11 131.6 294.44 198.19 348.64" style="fill:#061853"/><polygon points="198.19 348.64 226.1 234.11 292.33 245.16 198.19 348.64" style="fill:#030f42"/><polygon points="70.22 441.25 80.28 352.77 128.19 378.6 70.22 441.25" style="fill:#0b2572"/><polygon points="94.21 702.09 68.11 537.91 40.73 560.38 94.21 702.09" style="fill:#173da9"/><polygon points="135.38 784.31 94.21 702.09 138.33 708.3 135.38 784.31" style="fill:#1a45b2"/><polygon points="94.21 702.09 138.33 708.3 107.44 635.98 94.21 702.09" style="fill:#1741aa"/><polygon points="94.21 702.09 68.11 537.91 107.44 635.98 94.21 702.09" style="fill:#10308b"/><polygon points="135.38 784.31 181.75 793.26 138.33 708.3 135.38 784.31" style="fill:#123390"/><polygon points="135.38 784.31 225.57 868.79 181.75 793.26 135.38 784.31" style="fill:#133493"/><polygon points="225.57 868.79 258.2 837.33 181.75 793.26 225.57 868.79" style="fill:#1a45b2"/><polygon points="225.57 868.79 336.71 897.93 258.2 837.33 225.57 868.79" style="fill:#163aa2"/><polygon points="336.71 897.93 394.33 924.94 473.09 910.23 336.71 897.93" style="fill:#1a45b2"/><polygon points="336.71 897.93 374.38 818.85 473.09 910.23 336.71 897.93" style="fill:#123392"/><polygon points="68.11 537.91 132.48 537.82 70.22 441.25 68.11 537.91" style="fill:#102f87"/><polygon points="70.22 441.25 132.48 537.82 128.19 378.6 70.22 441.25" style="fill:#081f63"/><polygon points="68.11 537.91 107.44 635.98 132.48 537.82 68.11 537.91" style="fill:#163ba4"/><polygon points="107.44 635.98 132.48 537.82 163.61 615.38 107.44 635.98" style="fill:#11318c"/><polygon points="138.33 708.3 163.61 615.38 107.44 635.98 138.33 708.3" style="fill:#123390"/><polygon points="138.33 708.3 257.7 782.47 163.61 615.38 138.33 708.3" style="fill:#123392"/><polygon points="181.75 793.26 257.7 782.47 138.33 708.3 181.75 793.26" style="fill:#163aa2"/><polygon points="258.2 837.33 257.7 782.47 181.75 793.26 258.2 837.33" style="fill:#1741aa"/><polygon points="258.2 837.33 257.7 782.47 374.38 818.85 258.2 837.33" style="fill:#123392"/><polygon points="258.2 837.33 336.71 897.93 374.38 818.85 258.2 837.33" style="fill:#123392"/><polygon points="473.09 910.23 483 820.09 374.38 818.85 473.09 910.23" style="fill:#0e2b80"/><polygon points="473.09 910.23 483 820.09 588.95 879.02 473.09 910.23" style="fill:#143698"/><polygon points="588.95 879.02 584.83 777.69 483 820.09 588.95 879.02" style="fill:#0d2878"/><polygon points="588.95 879.02 584.83 777.69 691.68 830.87 588.95 879.02" style="fill:#123392"/><polygon points="584.83 777.69 650.94 717.65 691.68 830.87 584.83 777.69" style="fill:#081f63"/><polygon points="691.68 830.87 741.66 679.1 650.94 717.65 691.68 830.87" style="fill:#061a57"/><polygon points="794.68 762.24 691.68 830.87 741.66 679.1 794.68 762.24" style="fill:#0f2f82"/><polygon points="794.68 762.24 844.99 694.32 741.66 679.1 794.68 762.24" style="fill:#092167"/><polygon points="844.99 694.32 741.66 679.1 852.17 612.75 844.99 694.32" style="fill:#05164f"/><polyline points="882.86 524.9 810.95 473.57 852.17 612.75 882.86 524.9" style="fill:#051753"/><polygon points="882.86 524.9 854.3 415.01 810.95 473.57 882.86 524.9" style="fill:#031043"/><polygon points="741.66 679.1 852.17 612.75 745.06 564.94 741.66 679.1" style="fill:#031043"/><polygon points="741.66 679.1 641.5 577.61 650.94 717.65 741.66 679.1" style="fill:#030f41"/><polygon points="584.83 777.69 507.93 709.41 650.94 717.65 584.83 777.69" style="fill:#092167"/><polygon points="584.83 777.69 483 820.09 507.93 709.41 584.83 777.69" style="fill:#0f2f82"/><polygon points="374.38 818.85 483 820.09 348.75 732.05 374.38 818.85" style="fill:#123390"/><polygon points="374.38 818.85 348.75 732.05 257.7 782.47 374.38 818.85" style="fill:#0f2d84"/><polygon points="257.7 782.47 274.73 694.32 348.75 732.05 257.7 782.47" style="fill:#0e2b7e"/><polygon points="274.73 694.32 163.61 615.38 257.7 782.47 274.73 694.32" style="fill:#0f2e86"/><polygon points="483 820.09 507.93 709.41 348.75 732.05 483 820.09" style="fill:#081f63"/><polygon points="132.48 537.82 164.41 435.6 128.19 378.6 132.48 537.82" style="fill:#0a236c"/><polygon points="128.19 378.6 164.41 435.6 198.19 348.64 128.19 378.6" style="fill:#081f63"/><polygon points="198.19 348.64 338.33 307.68 292.33 245.16 198.19 348.64" style="fill:#05164e"/><polygon points="198.19 348.64 338.33 307.68 264.31 459.32 198.19 348.64" style="fill:#030f41"/><polygon points="741.66 679.1 641.5 577.61 745.06 564.94 741.66 679.1" style="fill:#05164f"/><polygon points="852.17 612.75 810.95 473.57 745.06 564.94 852.17 612.75" style="fill:#030f42"/><polygon points="650.94 717.65 536.4 606.6 641.5 577.61 650.94 717.65" style="fill:#030f41"/><polygon points="507.93 709.41 650.94 717.65 536.4 606.6 507.93 709.41" style="fill:#05164f"/><polygon points="507.93 709.41 429.6 645.45 536.4 606.6 507.93 709.41" style="fill:#031042"/><polygon points="810.95 473.57 854.3 415.01 784.98 362.3 810.95 473.57" style="fill:#0f2e82"/><polygon points="198.19 348.64 264.31 459.32 164.41 435.6 198.19 348.64" style="fill:#061853"/><polygon points="164.41 435.6 264.31 459.32 196.75 566.02 164.41 435.6" style="fill:#081f63"/><polygon points="338.33 307.68 393.67 194.85 292.33 245.16 338.33 307.68" style="fill:#081e5f"/><polyline points="196.75 566.02 164.41 435.6 132.48 537.82" style="fill:#091f64"/><polygon points="132.48 537.82 196.75 566.02 163.61 615.38 132.48 537.82" style="fill:#11318c"/><polygon points="196.75 566.02 274.73 694.32 163.61 615.38 196.75 566.02" style="fill:#0e2b7e"/><polygon points="274.73 694.32 285.15 539.09 196.75 566.02 274.73 694.32" style="fill:#092167"/><polygon points="274.73 694.32 429.6 645.45 285.15 539.09 274.73 694.32" style="fill:#061a57"/><polygon points="429.6 645.45 414.51 525.44 285.15 539.09 429.6 645.45" style="fill:#05164f"/><polygon points="536.4 606.6 429.6 645.45 414.51 525.44 536.4 606.6" style="fill:#041245"/><polygon points="414.51 525.44 523.74 484.47 536.4 606.6 414.51 525.44" style="fill:#030f42"/><polygon points="348.75 732.05 507.93 709.41 429.6 645.45 348.75 732.05" style="fill:#092167"/><polygon points="348.75 732.05 274.73 694.32 429.6 645.45 348.75 732.05" style="fill:#0c2674"/><polygon points="338.33 307.68 433.19 317.74 393.67 194.85 338.33 307.68" style="fill:#0c2771"/><polygon points="482.06 230.78 393.67 194.85 433.19 317.74 482.06 230.78" style="fill:#153a99"/><polygon points="482.06 230.78 576.21 295.46 433.19 317.74 482.06 230.78" style="fill:#163da0"/><polygon points="433.19 317.74 573.48 392.34 523.74 484.47 433.19 317.74" style="fill:#11338b"/><polygon points="573.48 392.34 576.21 295.46 433.19 317.74 573.48 392.34" style="fill:#163ca0"/><polygon points="573.48 392.34 576.21 295.46 675.3 344.13 573.48 392.34" style="fill:#1a45b2"/><polygon points="433.19 317.74 523.74 484.47 364.92 404.7 433.19 317.74" style="fill:#0c266e"/><polygon points="414.51 525.44 523.74 484.47 364.92 404.7 414.51 525.44" style="fill:#071b5c"/><polygon points="523.74 484.47 663.82 458.82 573.48 392.34 523.74 484.47" style="fill:#0f2f82"/><polygon points="675.3 344.13 663.82 458.82 573.48 392.34 675.3 344.13" style="fill:#1741aa"/><polygon points="675.3 344.13 741.42 434.17 663.82 458.82 675.3 344.13" style="fill:#153a99"/><polygon points="784.98 362.3 675.3 344.13 741.42 434.17 784.98 362.3" style="fill:#1945b1"/><polygon points="741.42 434.17 810.95 473.57 784.98 362.3 741.42 434.17" style="fill:#12338c"/><polygon points="745.06 564.94 810.95 473.57 741.42 434.17 745.06 564.94" style="fill:#081e60"/><polygon points="745.06 564.94 741.42 434.17 663.82 458.82 745.06 564.94" style="fill:#081e5f"/><polyline points="663.82 458.82 641.5 577.61 745.06 564.94" style="fill:#061a57"/><polygon points="523.74 484.47 663.82 458.82 641.5 577.61 523.74 484.47" style="fill:#031042"/><polygon points="536.4 606.6 641.5 577.61 523.74 484.47 536.4 606.6" style="fill:#05164f"/><polygon points="338.33 307.68 364.92 404.7 433.19 317.74 338.33 307.68" style="fill:#05174f"/><polygon points="338.33 307.68 264.31 459.32 364.92 404.7 338.33 307.68" style="fill:#061853"/><polygon points="364.92 404.7 285.15 539.09 414.51 525.44 364.92 404.7" style="fill:#030f41"/><polygon points="285.15 539.09 364.92 404.7 264.31 459.32 285.15 539.09" style="fill:#041245"/><polygon points="196.75 566.02 264.31 459.32 285.15 539.09 196.75 566.02" style="fill:#061a58"/><path d="M922.81,571.94v-.19h0l-4-135.4v-.48h0l-20.3-67.57h0v-.11l-.06-.14V368L840.14,258v-.05l-.07-.11-.07-.1v-.06l-.06-.07v-.05L773.5,187.28h0l-.12-.1-.09-.08h0l-70.52-50.48h-.07l-.15-.08-.15-.08h0L640.91,112.2h-.12L567.31,85.94h-.54l-121-7.72h-.48L369,91.94h-.25l-62.19,19.17h0l-.14.06-.16.07h-.08l-110.58,65h0l-.09.06-.08.06-.08.06-.07.05-.08.08-.06.06h0l-69,77.21h0v.12l-.06.09h0L62.2,357.81v.06l-.06.11,0,.12-.05.14v.06L37,446.54h0v.4h0l-4.86,134v.63h0L56,672.75h0v.07a1.08,1.08,0,0,0,.08.19h0v.1h0L108.77,777h0v0l.1.17h0L146,827.38h0v.06l.11.11.08.09,51.36,47.22.13.1.1.09,64.14,43.51h0l.15.09h.08l79.09,34.5h.08l.18.06h.31l132.37,15.58h.18l69.11,1.93h.07a1.27,1.27,0,0,0,.39,0h.14l102.29-28.89h.29l.12-.05h0l91.38-50.29h0l.15-.11h0l.12-.09h0L797.23,841l.06-.06.08-.07.07-.08h0l45.61-54.56h0a1.43,1.43,0,0,0,.16-.24l0-.09h0l64.49-126.59v-.09a.15.15,0,0,1,.07-.15v-.34l14.23-86.57h0V572A3.25,3.25,0,0,0,922.81,571.94ZM200.46,872l-13.3-12.23,29.92,23.5ZM394.6,922.85l-46.75-21.92,110.65,10Zm17-399.13-122.74,13,75.69-127.51ZM368.8,408.89l150,75.32L415.62,522.88Zm44,118.74L427,641.08,290.49,540.54Zm12.48,117.1L277,691.53l10-148.67ZM417,529.52l115,76.55L431.27,642.72Zm1.83-3.59L522,487.25l12,115.33ZM577.36,392.71,673,347.45,662.18,455.13Zm81.55,65-131.43,24,46.66-86.44ZM523.74,480.27,438.12,322.63l132.64,70.53Zm-4.8-.45L368,404l64.88-82.64ZM285.87,534l-19.23-73.62L359.5,410ZM273.16,687.88,199.8,567.18,283,541.85ZM423,649.65l-74.63,79.94L280,694.76Zm110.5-39.84-26.62,96.12-73.23-59.8ZM526.22,489l110.94,87.75-99,27.31Zm2.23-3.34,132.87-24.34L640.15,574ZM666.11,456l10.66-106.48,61.38,83.59Zm73.38-19.11,3.4,121.94-75.75-99ZM575.57,389.14l2.55-90.51,92.58,45.46Zm-4-.08L439.43,318.79l134.71-21ZM365.8,400.34,341,310l88.35,9.37Zm-3.23,3.36-93.73,50.88,69-141.26Zm-79.84,134-81.4,24.8,62.21-98.26ZM268,687.08l-101.63-72.2,30.32-45.15Zm8.2,10.23,68.3,34.81-84,46.52Zm153.6-49.13,73.35,59.89-149,21.2Zm107.65-37.8,108.26,105-135.17-7.79Zm2.87-2.78,99.36-27.4,8.93,132.4ZM665,463.59l76.39,99.79L644,575.3Zm78.56-25.94L808,474.21,746.89,559Zm.68-4.21,40-65.91,23.82,102Zm-2.94-2.87L679.82,346.9l101.91,16.89ZM579.73,295l72.16-65.5L672.6,340.57ZM437,315.13l45.78-81.46L571,294.26ZM341.38,306l51.89-105.81,37.07,115.25ZM264.13,455.12l-62.9-105.28,133.31-39ZM197.57,561,167.14,438.31l94,22.31Zm-33.51,50.13-27.9-69.51,57.6,25.27Zm108.46,84.08-15.75,81.54-87-154.56Zm75,39.8,23.87,80.82L262.76,782ZM505.34,711.8l-23.66,105-127.4-83.52Zm140.72,7.57L584.82,775l-71.25-63.26Zm-2.21-136.53,94.31,95.55L652.74,714.7Zm1.93-3.75L743,567.21l-3.2,107.15ZM810.19,478,849,609.16l-100.9-45Zm-22-110.79,63.33,48.15-39.6,53.5Zm-109-24.51L738,275.18l43.43,84.46Zm-2.65-3L655.93,229.33l79.29,42.91ZM576,292.92,488.2,232.6l159.61-4.86ZM433.69,312.77,396.88,198.32l82.32,33.47ZM338,303.84l-42.63-57.95,93.92-46.63Zm-3,2.72L204.46,344.73l87.72-96.42ZM260.16,456.28l-93.05-22.09,31.46-81ZM193.83,562.55,134.92,536.7,164.19,443ZM161,614.21l-50.67,18.58,22.59-88.55Zm91.14,162.44L140.65,707.38l23.61-86.78Zm113.5,41.56L260.18,835l-.46-49.79Zm-13.42-81.5,124,81.3-100.3-1.14Zm156.93-23.55,72,63.91L485.8,816.75Zm140.93,8,38,105.71L588.34,777.2Zm3.39-2.39,84.91-36.09L691.6,824.73ZM747,568l100.88,45L743.77,675.5Zm67.55-89.41,66,47.08L852.4,606.26Zm-.75-5.45,39.64-53.56,26.13,100.5ZM787.31,361.56l18.41-57.23L849.57,408.9Zm-2.77-4.47L742.6,275.52,803,299.73Zm-124.3-130,87.83-5.75L737,268.67Zm-173.91,1.53,61.84-76.9,99.11,72Zm-3.65-1.84-31.84-83.62,93,7.52Zm-4.13.39-81.34-33.06,49.86-49.61Zm-182.73,14L330.8,140l59.37,54.32ZM202,341.5l25.6-105.11,60.78,10.14Zm-38,89.7-32.84-51.68,63.46-27.15Zm-1.75,4.7-28.07,89.85-3.77-140ZM129.9,539.82,107,629.55,71.07,539.9Zm-59.74-3.91,1.92-88.09,56.73,88Zm90.5,82.68-22.75,83.63L110.1,637.13ZM252,781.27l-69.09,9.81L143.42,713.8Zm3.75,3.51.45,49.07-68.4-39.42ZM371,821.43l-35,73.41-72.88-56.25Zm4.08.74,92.41,85.55L339.75,896.19Zm4.53-1.26,101.22,1.15-9.23,84ZM583,780.64l3.86,94.9-99.23-55.19Zm4,.35L687.1,830.82l-96.26,45.12Zm155.27-97.26L792,761.66,695.39,826Zm3.46-2,95.69,14.1-46.59,62.9Zm1.78-3.78,102.35-61.44L843.18,692ZM882.67,531.51l18.07,63.4L855.38,609.6Zm-24-107.82,51.84,65.46-26.63,31.5ZM810.11,304.45l67.32,49.44L854.28,409.8Zm-69.4-34L751.57,224l48.49,70.19Zm-85.84-47-11.69-70.91,101.27,65Zm-4.44-2.37L553.92,151l84.87-.53ZM454.11,139.44l63-38.77,27,46Zm-60.5,52.65-58.34-53.37,107.91,4.05ZM291,242.91,230.41,232.8l95-89.27ZM197,345.1l-62-50.46,88-56.16Zm-2.63,3-64,27.4,3.12-77ZM130.29,530.73,72.74,441.46l53.58-57.91ZM105.36,636.17l-10.92,54.6L72.89,555.18Zm2.77,6.53,27,63.13-38.51-5.41Zm70,147.82-40.66-7.84L140,716Zm76.8,47.22L226,865.58l-38.78-66.85Zm3.45,2.23L327.7,893.5l-98.18-25.74ZM484.66,823.3l99,55.07L475.4,907.54Zm204.76,10.84L684,903.39l-89.31-24.85Zm99.35-65.56-55,96.54-38.82-34ZM843,700.33l.31,50.55-44,8.42Zm11-86.09,44.73-14.49-51,86Zm31-88.87,25.39-30-8.28,90ZM856.6,414.69l22.8-55.06,29.54,121.15ZM808.1,298l16-28,48.27,75.26Zm-2.78-3.19-47.38-68.58,63.39,40.53Zm-159-145,48-5.12,48.52,67.09ZM549,147l-26.42-45,108,44.49Zm-100.39-8.85-21.27-37.36,83.33-.83Zm-4.23.65-105-3.94L423,101.33ZM232.21,225.62,269.79,144l54.51-5Zm-6.75,5.1-34.36-33.1,72.51-49.74Zm-2.58,3.07-85.42,54.53,50.94-87.75ZM126.32,375.32,83.45,352.21,129.37,300ZM125,379.13,72.9,435.41l9-79.47ZM66.13,537l-22,18,23.71-95.77Zm.55,4.72L89.16,683l-46-122ZM136.26,710l-2.58,66.43-36-71.85Zm44.21,85L217,858l-75.2-70.41ZM334.64,899.4l-1.59,36.49-95.92-62.06Zm3.94,1.56,49.78,23.34L337,936.94Zm132.59,11.61,1.55,51.18-72.35-38ZM585.51,882l-29.34,69.3-77.6-40.47Zm4.6-.6,89.24,24.83L560.82,950.57ZM693.36,835l37.81,33.14-43,33.46ZM796,764l43.59-8.35L744,855.23Zm51.33-19.32-.3-49.27L887.2,670.8Zm3.54-56.31,48.81-82.25-9,57.84Zm62.24-177.62,5.69,60.47-12.9,17.87Zm-29.64-151.5,11.15,10.49,11.15,81Zm-56.53-92.39,10.49-5.28,30.34,68.94ZM753.52,218.6l18.42-26.44,45.09,67Zm-2.86-2.89-48-66.4,66.47,39.92Zm-108.2-69.49-.3-28.87,46.26,24Zm-4-.78L532.74,101.88,638.15,115.8ZM429.33,96.77l16.83-14.48L502,96Zm-91.92,34.57L370.14,96l45.26,4.08ZM329,134.59l-49.56,4.53,81.37-38.89ZM192.66,191.7l5.48-12.3,45.48-22.67ZM133,288.11l-3.31-32.17,49.47-47.36Zm-3.44,5.66-41,46.64,37.8-78ZM68.4,439.55l-26.19,4.89L76.8,365.67Zm-.87,4.23L42.48,545l-1.59-96.25Zm22.15,252L59.91,671.19,45.65,579.07Zm41.75,85.14-19-6.28L99.69,717.51Zm81.29,78.59L149.53,825l-10.14-34.19Zm11.52,10.85,27.36,35L168,839.63ZM234.47,877l87,56.28-56.92-17.84Zm159.59,50.13,67.6,35.47L344.15,939.31Zm81.13-13.48L550.87,953l-74.13,11.79Zm200.87-1.84-30.72,26.58L576.21,949.1Zm56.78-39.84,2.56,16.58-39.7,12.3Zm103-106.65L795.05,838l-52,24Zm11.39-12.13,27.36-50.66L845.41,772ZM905.1,597l10.33-14.3-16.6,54.74ZM915,489h0v-.09h0l-.15-1.06,1-13.56,1,35.11Zm-2.75-20L902,394l12.8,42.58Zm-30.7-117-18.86-42.86,26.39,49.94Zm-56.86-88.51-37.66-56,48,50.78Zm-125.82-121,2.52-1.82,29,20.73Zm-3.8-2.19L675.5,130.11l21.76,8.56ZM529.81,97.46,566.5,89.9l55.21,19.69Zm-12-1.62-50-12.31,83.76,5.35Zm-94.64.92-39-3.51,54.52-9.87Zm-137.5,34.91L308,114.91l35.94-11.08Zm-18.3,8.75L248,150.06l29.73-17.45Zm-81.13,55.77-22.94,22,26.23-29.34ZM78.8,351.19,68.64,355l39.62-64.53Zm-13.29,9.2,11-4.09L48.72,419.66ZM38.14,524.81l.58,35.27-2,6.41Zm1.91,44.28,10,64.83L36.26,581ZM92.41,703.2l12.89,57.86L64.16,679.89Zm41.35,82.69,9,30.11-26.64-36ZM333.59,941.21l3.73,6-39.1-17.05Zm10,8.51L339,942.38l85.06,16.81ZM552,956.92l-9,10.15-46.69-1.3Zm6.2-1,55.66-8.67-63.93,18.06Zm128.61-48.19,32.64-10.12-57.56,31.68ZM739.08,886l-2.56-16.61,47.7-22ZM842.4,761.86l-2.23,22.32L808.8,821.71ZM894,666.69l8.06-3.89-36.89,72.42Zm10.73-9.63-9,4.37,18.19-60Z" style="fill:#58c1ff;fill-opacity:0.30000001192092896"/><path d="M80,726.72c51.48,39.42,209.8,68.08,396.9,68.08s345.08-28.62,397-67.94" style="fill:none;stroke:#f9f9fa;stroke-linecap:round;stroke-miterlimit:10;stroke-width:6px"/><path d="M770.28,91.82c-23.95,27.88-35.1,90.64-10.82,154.26s61.5,49.8,84.7,114.67c30.62,85.6,16.37,200.59,16.37,200.59s36.82,106.6,62.47-6.64C979.79,342,770.28,144.2,770.28,91.82Z" style="fill:url(#linear-gradient)"/><path d="M810.67,803.89a245.54,245.54,0,0,1-30.12,18.18,702.48,702.48,0,0,0,38.3-63C828.31,748.6,837,738.42,844,727.42c3.44-5.41,7.31-12.08,11.42-19.82,24.92-44.9,52.4-117.56,53.18-192.2v-5.69A257.57,257.57,0,0,0,902.93,454c.2,1.43.38,2.86.56,4.29-.22-1.1-.41-2.21-.64-3.31.37,2,.66,4,1,6,5.09,43.22,1.47,85.37-16.68,116.45-.29.45-.58.88-.87,1.32,9.41-47.23,12.56-99.39,2.09-151.6,0,0-4.19-25.38-35.38-102.44C835,280.36,803.18,244,775,217.5c-24.69-30.55-47.11-51-59.47-64.06-25.82-27.19-36.64-47.57-41.09-60.87-3.85-1.93-53.14-49.81-57.05-51.63-21.51,33.35-89.16,137.67-57,235.15,14.58,44.17,51.47,90,90.07,115.74,1.69,1.94,23,25,33.09,77.16,10.45,53.85,5,95.86-16.54,158C641.73,681.5,577,735.38,516.3,740.89c-129.67,11.78-177.15-65.11-177.15-65.11,46.34,18.52,97.57,14.65,128.72-4.56,31.4-19.43,50.39-33.83,65.81-28.15,15.2,5.65,27.3-10.76,16.44-27.77a78.52,78.52,0,0,0-79.4-34.57c-31.43,5.11-60.23,30-101.41,5.89a82.13,82.13,0,0,1-7.73-5.06c-2.71-1.79,8.83,2.72,6.13.69-8-4.35-22.2-13.84-25.88-17.22-.61-.56,6.22,2.18,5.61,1.62-38.51-31.71-33.7-53.13-32.49-66.57,1-10.75,8-24.52,19.75-30.11,5.69,3.11,9.24,5.48,9.24,5.48s-2.43-5-3.74-7.58c.46-.2.9-.15,1.36-.34,4.66,2.25,15,8.1,20.41,11.67,7.07,5,9.33,9.44,9.33,9.44s1.86-1,.48-5.37c-.5-1.78-2.65-7.45-9.65-13.17h.44a81.61,81.61,0,0,1,11.87,8.24c2-7.18,5.53-14.68,4.75-28.09-.48-9.43-.26-11.87-1.92-15.51-1.49-3.13.83-4.35,3.42-1.1a32.65,32.65,0,0,0-2.21-7.4V426c3.23-11.24,68.25-40.46,73-43.88a67.2,67.2,0,0,0,19.13-20.8c3.62-5.76,6.34-13.85,7-26.11.36-8.84-3.76-14.73-69.51-21.62-18-1.77-28.53-14.8-34.53-26.82-1.09-2.59-2.21-4.94-3.33-7.28a57.31,57.31,0,0,1-2.56-8.43c10.75-30.87,28.81-57,55.37-76.7,1.45-1.32-5.78.34-4.34-1,1.69-1.54,12.71-6,14.79-7,2.54-1.2-10.88-6.9-22.73-5.51-12.07,1.36-14.63,2.8-21.07,5.53,2.67-2.66,11.17-6.15,9.18-6.13-13,2-29.18,9.56-43,18.12a10.66,10.66,0,0,1,.83-4.35c-6.44,2.73-22.26,13.79-26.87,23.14a44.19,44.19,0,0,0,.27-5.4,84.57,84.57,0,0,0-13.19,13.82l-.24.22c-37.36-15-70.23-16-98.05-9.28-6.09-6.11-9.06-1.64-22.91-32.07-.94-1.83.72,1.81,0,0-2.28-5.9,1.39,7.87,0,0-23.28,18.37-53.92,39.19-68.63,53.89-.18.59,17.16-4.9,0,0-6,1.72-5.6,5.28-6.51,37.5-.22,2.44,0,5.18-.22,7.38-11.75,15-19.75,27.64-22.78,34.21-15.19,26.18-31.93,67-48.15,131.55A334.2,334.2,0,0,1,75.2,398.62c-13.49,34.27-26.53,88.08-29.14,171a482.08,482.08,0,0,1,12.53-50.66A473,473,0,0,0,93.33,720c9.33,22.82,24.76,57.46,51,95.4,82.53,86.84,198.95,140.9,327.85,140.9C606.79,956.27,727.64,897.39,810.67,803.89Z" style="fill:url(#linear-gradient-2)"/><path d="M810.67,803.89a245.54,245.54,0,0,1-30.12,18.18,702.48,702.48,0,0,0,38.3-63C828.31,748.6,837,738.42,844,727.42c3.44-5.41,7.31-12.08,11.42-19.82,24.92-44.9,52.4-117.56,53.18-192.2v-5.69A257.57,257.57,0,0,0,902.93,454c.2,1.43.38,2.86.56,4.29-.22-1.1-.41-2.21-.64-3.31.37,2,.66,4,1,6,5.09,43.22,1.47,85.37-16.68,116.45-.29.45-.58.88-.87,1.32,9.41-47.23,12.56-99.39,2.09-151.6,0,0-4.19-25.38-35.38-102.44C835,280.36,803.18,244,775,217.5c-24.69-30.55-47.11-51-59.47-64.06-25.82-27.19-36.64-47.57-41.09-60.87-3.85-1.93-53.14-49.81-57.05-51.63-21.51,33.35-89.16,137.67-57,235.15,14.58,44.17,51.47,90,90.07,115.74,1.69,1.94,23,25,33.09,77.16,10.45,53.85,5,95.86-16.54,158C641.73,681.5,577,735.38,516.3,740.89c-129.67,11.78-177.15-65.11-177.15-65.11,46.34,18.52,97.57,14.65,128.72-4.56,31.4-19.43,50.39-33.83,65.81-28.15,15.2,5.65,27.3-10.76,16.44-27.77a78.52,78.52,0,0,0-79.4-34.57c-31.43,5.11-60.23,30-101.41,5.89a82.13,82.13,0,0,1-7.73-5.06c-2.71-1.79,8.83,2.72,6.13.69-8-4.35-22.2-13.84-25.88-17.22-.61-.56,6.22,2.18,5.61,1.62-38.51-31.71-33.7-53.13-32.49-66.57,1-10.75,8-24.52,19.75-30.11,5.69,3.11,9.24,5.48,9.24,5.48s-2.43-5-3.74-7.58c.46-.2.9-.15,1.36-.34,4.66,2.25,15,8.1,20.41,11.67,7.07,5,9.33,9.44,9.33,9.44s1.86-1,.48-5.37c-.5-1.78-2.65-7.45-9.65-13.17h.44a81.61,81.61,0,0,1,11.87,8.24c2-7.18,5.53-14.68,4.75-28.09-.48-9.43-.26-11.87-1.92-15.51-1.49-3.13.83-4.35,3.42-1.1a32.65,32.65,0,0,0-2.21-7.4V426c3.23-11.24,68.25-40.46,73-43.88a67.2,67.2,0,0,0,19.13-20.8c3.62-5.76,6.34-13.85,7-26.11.36-8.84-3.76-14.73-69.51-21.62-18-1.77-28.53-14.8-34.53-26.82-1.09-2.59-2.21-4.94-3.33-7.28a57.31,57.31,0,0,1-2.56-8.43c10.75-30.87,28.81-57,55.37-76.7,1.45-1.32-5.78.34-4.34-1,1.69-1.54,12.71-6,14.79-7,2.54-1.2-10.88-6.9-22.73-5.51-12.07,1.36-14.63,2.8-21.07,5.53,2.67-2.66,11.17-6.15,9.18-6.13-13,2-29.18,9.56-43,18.12a10.66,10.66,0,0,1,.83-4.35c-6.44,2.73-22.26,13.79-26.87,23.14a44.19,44.19,0,0,0,.27-5.4,84.57,84.57,0,0,0-13.19,13.82l-.24.22c-37.36-15-70.23-16-98.05-9.28-6.09-6.11-9.06-1.64-22.91-32.07-.94-1.83.72,1.81,0,0-2.28-5.9,1.39,7.87,0,0-23.28,18.37-53.92,39.19-68.63,53.89-.18.59,17.16-4.9,0,0-6,1.72-5.6,5.28-6.51,37.5-.22,2.44,0,5.18-.22,7.38-11.75,15-19.75,27.64-22.78,34.21-15.19,26.18-31.93,67-48.15,131.55A334.2,334.2,0,0,1,75.2,398.62c-13.49,34.27-26.53,88.08-29.14,171a482.08,482.08,0,0,1,12.53-50.66A473,473,0,0,0,93.33,720c9.33,22.82,24.76,57.46,51,95.4,82.53,86.84,198.95,140.9,327.85,140.9C606.79,956.27,727.64,897.39,810.67,803.89Z" style="fill:url(#linear-gradient-3)"/><path d="M711.1,867C874,848.14,946.1,680.3,853.48,677,769.85,674.3,634,875.87,711.1,867Z" style="fill:url(#linear-gradient-4)"/><path d="M865.21,642.68C977.26,577.47,948,436.6,948,436.6s-43.25,50.24-72.62,130.32C846.4,646.22,797.84,682.07,865.21,642.68Z" style="fill:url(#linear-gradient-5)"/><path d="M509.47,950.32C665.7,1000.17,800,877.1,717.21,836,642,798.93,435.32,926.75,509.47,950.32Z" style="fill:url(#linear-gradient-6)"/><path d="M638.58,21.68l.53-.57A1.8,1.8,0,0,0,638.58,21.68ZM876.85,702.49c3.8-5.36,8.94-22.53,13.48-30.21,27.58-44.52,27.78-80,27.78-80.84,16.66-83.22,15.15-117.2,4.9-180-8.25-50.6-44.32-123.09-75.57-158-32.2-36-9.51-24.25-40.69-50.52-27.33-30.29-53.82-60.29-68.25-72.36C634.22,43.35,636.57,24.84,638.58,21.68c-.34.37-.84.92-1.47,1.64-1.23-4.92-2.11-9.06-2.11-9.06s-57,57-69,152c-7.83,62,15.38,126.68,49,168a381.17,381.17,0,0,0,59,58h0c25.4,36.48,39.38,81.49,39.38,129.91,0,121.24-98.34,219.53-219.65,219.53a220.14,220.14,0,0,1-49.13-5.52c-57.24-10.91-90.29-39.78-106.77-59.38-9.45-11.23-13.46-19.42-13.46-19.42,51.28,18.37,108,14.53,142.47-4.52,34.75-19.26,55.77-33.55,72.84-27.92,16.82,5.61,30.21-10.67,18.2-27.54-11.77-16.85-42.4-41-87.88-34.29-34.79,5.07-66.66,29.76-112.24,5.84a92.59,92.59,0,0,1-8.55-5c-3-1.77,9.77,2.69,6.79.68-8.87-4.32-24.57-13.73-28.64-17.07-.68-.56,6.88,2.16,6.2,1.6-42.62-31.45-37.3-52.69-36-66,1.07-10.66,8.81-24.32,21.86-29.86,6.3,3.08,10.23,5.43,10.23,5.43s-2.69-4.92-4.14-7.51c.51-.19,1-.15,1.5-.34,5.16,2.23,16.58,8,22.59,11.57,7.83,4.95,10.32,9.36,10.32,9.36s2.06-1,.54-5.33c-.56-1.77-2.93-7.39-10.68-13.07h.48a91.65,91.65,0,0,1,13.13,8.17c2.19-7.12,6.12-14.56,5.25-27.86-.53-9.35-.28-11.78-2.12-15.39-1.65-3.1.92-4.31,3.78-1.09a29.87,29.87,0,0,0-2.44-7.34v-.24c3.57-11.14,75.53-40.12,80.77-43.51a70.12,70.12,0,0,0,21.17-20.63c4-5.72,7-13.73,7.75-25.89.25-5.48-1.44-9.82-20.5-14-11.44-2.49-29.14-4.91-56.43-7.47-19.9-1.76-31.58-14.68-38.21-26.6-1.21-2.57-2.45-4.9-3.68-7.22A53.41,53.41,0,0,1,355.9,256a158.47,158.47,0,0,1,61.28-76.06c1.6-1.31-6.4.33-4.8-1,1.87-1.52,14.06-5.93,16.37-6.92,2.81-1.19-12-6.84-25.16-5.47-13.36,1.35-16.19,2.78-23.32,5.49,3-2.64,12.37-6.1,10.16-6.08-14.4,2-32.3,9.48-47.6,18a9.75,9.75,0,0,1,.92-4.31c-7.13,2.71-24.64,13.67-29.73,23a39.79,39.79,0,0,0,.29-5.35,89,89,0,0,0-14.6,13.7l-.27.22c-41.3-14.95-77.69-15.91-108.44-9.2-6.74-6.06-17.57-15.23-32.89-45.4-1-1.82-1.6,3.75-2.4,2-6-13.81-9.55-36.44-9-52,0,0-12.32,5.61-22.51,29.06-1.89,4.21-3.11,6.54-4.32,8.87-.56.68,1.27-7.7,1-7.24-1.77,3-6.36,7.19-8.37,12.62-1.38,4-3.32,6.27-4.56,11.29l-.29.46c-.1-1.48.37-6.08,0-5.14a237,237,0,0,0-12.31,29.84c-5.49,18-11.88,42.61-12.89,74.57-.24,2.42,0,5.14-.25,7.32C69.2,283,60.34,295.54,57,302.06,40.18,328,21.66,368.49,3.71,432.52a319.8,319.8,0,0,1,28.54-50C17.32,416.51,2.89,469.88,0,552.05a437.48,437.48,0,0,1,13.87-50.24c-2.58,54.8,3.81,122.74,38.45,199.39,20.57,45.09,67.92,136.65,183.62,208.1h0s39.36,29.3,107,51.26c5,1.81,10.06,3.6,15.23,5.33q-2.43-1-4.71-2a484.42,484.42,0,0,0,138.8,20.4c175.18.15,226.85-70.2,226.85-70.2l-.51.38q3.71-3.48,7.14-7.26c-27.63,26.12-90.74,27.84-114.29,26,40.22-11.81,66.69-21.81,118.17-41.52q9-3.36,18.48-7.64l2-.94c1.25-.58,2.49-1.13,3.75-1.74a348.86,348.86,0,0,0,70.26-44c51.7-41.3,63-81.56,68.83-108.1-.82,2.54-3.37,8.47-5.17,12.32-13.31,28.48-42.84,46-74.91,61A689.46,689.46,0,0,0,855.3,740C865.77,729.65,869,713.41,876.85,702.49Z" style="fill:url(#radial-gradient)"/><path d="M813.92,801.24c21.08-23.24,40-49.82,54.35-80,36.9-77.58,94-206.58,49-341.31C881.77,273.48,833,215.25,771.11,158.38,670.56,66,642.48,24.78,642.48.26c0,0-116.09,129.41-65.74,264.38s153.46,130,221.68,270.87c80.27,165.74-64.95,346.61-185,397.24,7.35-1.63,267-60.38,280.61-208.88C893.68,726.6,887.83,767.67,813.92,801.24Z" style="fill:url(#linear-gradient-7)"/><path d="M477.59,319.63c.39-8.77-4.16-14.66-76.68-21.46-29.84-2.76-41.26-30.33-44.75-41.94-10.61,27.56-15,56.49-12.64,91.48,1.61,22.92,17,47.52,24.37,62,0,0,1.64-2.13,2.39-2.91,13.86-14.43,71.94-36.42,77.39-39.54C453.69,363.42,476.58,346.69,477.59,319.63Z" style="fill:url(#linear-gradient-8)"/><path d="M477.59,319.63c.39-8.77-4.16-14.66-76.68-21.46-29.84-2.76-41.26-30.33-44.75-41.94-10.61,27.56-15,56.49-12.64,91.48,1.61,22.92,17,47.52,24.37,62,0,0,1.64-2.13,2.39-2.91,13.86-14.43,71.94-36.42,77.39-39.54C453.69,363.42,476.58,346.69,477.59,319.63Z" style="fill:url(#linear-gradient-9)"/><path d="M158.31,156.73c-1-1.82-1.6,3.75-2.4,2-6-13.81-9.58-36.2-8.72-52,0,0-12.32,5.61-22.51,29.06-1.89,4.21-3.11,6.54-4.32,8.86-.56.68,1.27-7.7,1-7.24-1.77,3-6.36,7.19-8.35,12.38-1.65,4.24-3.35,6.52-4.61,11.77-.39,1.43.39-6.32,0-5.38C84.72,201.94,80.19,271.23,82.69,268.3,133.17,214.4,191,201.62,191,201.62c-6.15-4.53-19.53-17.63-32.7-44.89Z" style="fill:url(#linear-gradient-10)"/><path d="M349.84,720.36c-69.72-29.77-149-71.75-146-167.14C207.92,427.6,321,452.43,321,452.43c-4.27,1-15.68,9.16-19.72,17.82-4.27,10.83-12.07,35.28,11.55,60.9,37.09,40.19-76.2,95.36,98.66,199.57,4.41,2.4-41-1.43-61.64-10.36Z" style="fill:url(#linear-gradient-11)"/><path d="M325.07,657.76c49.44,17.21,107,14.19,141.52-4.86,23.09-12.85,52.7-33.43,70.92-28.35-15.78-6.24-27.73-9.15-42.1-9.86-2.45,0-5.38-.05-8-.32a138.21,138.21,0,0,0-15.76.86c-8.9.82-18.77,6.43-27.74,5.53-.48,0,8.7-3.77,8-3.61-4.75,1-9.92,1.21-15.37,1.88-3.47.39-6.45.82-9.89,1-103,8.73-190-55.81-190-55.81-7.41,25,33.17,74.3,88.52,93.57Z" style="fill:url(#linear-gradient-12)"/><path d="M813.74,801.9C917.9,699.63,970.6,575.32,948.32,435.9c0,0,8.9,71.5-24.85,144.63,16.21-71.39,18.1-160.11-25-252C841,205.89,746.45,141.37,710.35,114.45,655.66,73.66,633,32.13,632.57,23.55c-16.34,33.48-65.77,148.2-5.31,247,56.64,92.56,145.86,120,208.33,205C950.67,631.92,813.74,801.9,813.74,801.9Z" style="fill:url(#linear-gradient-13)"/><path d="M798.81,535.81c-36.4-75.2-81.84-108-124.81-143.55,5,7,6.23,9.47,9,14,37.83,40.32,93.61,138.66,53.11,262.11C659.88,900.74,355,791.31,323,760.58c12.93,134.49,238,198.84,384.6,111.63C791,793.26,858.47,659,798.81,535.81Z" style="fill:url(#linear-gradient-14)"/><path d="M814.12,686.64l.94-4.85c.32-1.75.75-3.6,1-5.61.61-4,1.38-8.47,1.87-13.43a237.9,237.9,0,0,0,1.48-35A223.29,223.29,0,0,0,813.6,584a232.05,232.05,0,0,0-17.42-48.75,336.56,336.56,0,0,0-29.59-49.81c-5.8-8.24-12.31-16.18-19.09-24.06S733.27,446,725.58,438.59,709.75,424,701.44,417s-16.85-14-25.36-21-17-14.14-25.3-21.61-16.23-15.28-23.73-23.51a243.77,243.77,0,0,1-20.75-26l-2.3-3.42c-.79-1.13-1.57-2.27-2.28-3.45l-4.37-7c-1.44-2.34-2.72-4.77-4.08-7.14l-2-3.57c-.66-1.2-1.24-2.43-1.86-3.64l-3.67-7.29c-1.14-2.46-2.22-4.94-3.34-7.4-2.31-4.88-4.12-9.94-6.13-14.88l-.74-1.86-.64-1.9-1.27-3.79c-.83-2.52-1.71-5-2.49-7.54l-2-7.63-1-3.8c-.36-1.26-.53-2.55-.8-3.82a212.28,212.28,0,0,1-3.8-59.83,261.53,261.53,0,0,1,10.19-53.46,310.75,310.75,0,0,1,17-44.06,373.62,373.62,0,0,1,18.17-33.81,366.73,366.73,0,0,1,24.69-36c2.56-3.27,5.11-6.43,7.66-9.35a1,1,0,0,1,1.31,0,1,1,0,0,1,.17,1.29c-2.42,2.81-5,6-7.55,9.3a376,376,0,0,0-43,70.76,309.24,309.24,0,0,0-16.54,43.94,256.66,256.66,0,0,0-9.66,53,213.15,213.15,0,0,0,4.27,58.87c.13.63.24,1.26.38,1.88l.49,1.86,1,3.73c.68,2.48,1.28,5,2,7.48l2.49,7.4,1.25,3.72c.41,1.24,1,2.45,1.42,3.67l2.94,7.35.74,1.84.82,1.81,1.64,3.63,1.64,3.64c.55,1.21,1.08,2.44,1.7,3.62l3.63,7.16a247.86,247.86,0,0,0,37.41,53.14c7.43,8.06,15.32,15.72,23.5,23.07s16.66,14.36,25.13,21.33,17,13.82,25.32,20.84,16.44,14.16,24.23,21.51,15.15,15,22.09,22.84a287.17,287.17,0,0,1,19.3,24.16,341.24,341.24,0,0,1,30,50.05l.79,1.55.72,1.58,1.44,3.14c.94,2.09,1.93,4.15,2.81,6.23l2.51,6.25L808.8,555c.39,1,.73,2.08,1.1,3.12l2.15,6.17c.37,1,.68,2,1,3.07l.91,3.07c.59,2,1.23,4,1.77,6.06l1.48,6A227.32,227.32,0,0,1,823.32,627,241.84,241.84,0,0,1,822,662.8c-1.06,10.17-2.69,18.44-3.92,24.66a282.32,282.32,0,0,1-9.88,35.23,298.31,298.31,0,0,1-12.74,30.91c-4.59,9.51-9.21,18.33-14,26.26l-1.73,3L778,785.72l-3.45,5.54c-2.34,3.55-4.57,7-6.77,10.15-4.42,6.36-8.57,12-12.3,16.73l-5.27,6.59-4.57,5.37-2,2.26-1.76,1.93q-1.64,1.8-2.79,3c-1.52,1.59-2.37,2.37-2.47,2.28s.57-1.07,1.94-2.88,3.49-4.39,6.08-7.84C749.93,822,757.43,812,766,799c2.08-3.28,4.3-6.7,6.51-10.34s4.5-7.43,6.7-11.46q6.82-12,13.38-26.17c1.06-2.37,2.2-4.74,3.23-7.2l3.12-7.46c2-5.08,4-10.27,5.8-15.67A292.34,292.34,0,0,0,814.12,686.64Z" style="fill:url(#linear-gradient-15)"/><path d="M739.36,650c.52-2.06,1.32-4.8,2-8.22s1.74-7.41,2.49-12c.4-2.29.87-4.71,1.29-7.26l1.11-8,.29-2.11.22-2.16.44-4.45c.14-1.51.32-3,.43-4.59l.28-4.75a262.14,262.14,0,0,0-.93-41.93l-.27-2.79-.37-2.79-.75-5.61c-.23-1.88-.61-3.74-.92-5.63s-.61-3.77-1-5.65l-1.17-5.64c-.2-.94-.38-1.89-.6-2.82l-.68-2.81-1.37-5.61-1.55-5.56a272.56,272.56,0,0,0-15.87-42.08,267.22,267.22,0,0,0-19.66-34.4c-3.27-4.92-6.59-9.3-9.61-13.26s-6-7.34-8.54-10.2l-1.86-2.06-.45-.5a1.5,1.5,0,0,1-.3-.4l-.18-.29-.64-1.08L679,401.57c-1.32-2.18-2.34-3.71-2.92-4.59-.8-1.19-1.6-2.35-2.36-3.45a1,1,0,0,1,.3-1.27.94.94,0,0,1,1.3.14c.77,1.07,1.59,2.24,2.43,3.46.65,1,1.75,2.59,3.14,4.85l2.31,3.82.64,1a.24.24,0,0,0,.09.11l.22.24.46.5,1.92,2.1a222.87,222.87,0,0,1,18.55,23.67,269.68,269.68,0,0,1,20,34.53A274,274,0,0,1,741.32,509l1.6,5.59,1.42,5.64.71,2.82.62,2.84,1.22,5.67c.39,1.89.69,3.79,1,5.68s.72,3.77,1,5.66l.8,5.65.39,2.81.29,2.81a264.72,264.72,0,0,1,1.26,42.32,258,258,0,0,1-3.87,33.84C747,635,746,639,745.29,642.53s-1.51,6.33-2.06,8.47l-1.66,6.3-1.86,6-1.8,5.72c-.63,1.85-1.27,3.64-1.9,5.38-2.54,6.94-5.14,13-7.49,17.84-4.71,9.79-8.32,15.14-8.77,14.89s2.33-6.26,6.35-16.34c2-5,4.28-11.11,6.57-18,.57-1.72,1.15-3.49,1.71-5.31l1.66-5.6,1.74-5.82Z" style="fill:url(#linear-gradient-16)"/><path d="M716.89,368.69c-2.35-1.89-5.54-4.37-9.35-7.54L701.31,356c-2.24-1.86-4.58-3.92-7.09-6.07a404.29,404.29,0,0,1-34.4-33.24,292.74,292.74,0,0,1-35.56-48c-1.31-2.31-2.66-4.62-4-7l-3.62-7.22-.91-1.81c-.29-.61-.55-1.24-.82-1.86l-1.63-3.74-1.63-3.75c-.51-1.26-1-2.55-1.45-3.83l-1.44-3.84c-.49-1.28-1-2.56-1.36-3.88L605,224l-2.1-8c-.37-1.32-.66-2.66-.94-4l-.85-4a223.53,223.53,0,0,1-4.1-32.31,249.74,249.74,0,0,1,.42-31.43A279.77,279.77,0,0,1,601.11,115c1.69-9.27,3.71-18,5.86-26.11A361.71,361.71,0,0,1,620.25,49c4.07-10.17,7.26-17,8.51-19.69.86-1.85,1.72-3.65,2.56-5.35a1,1,0,0,1,1.25-.35,1,1,0,0,1,.51,1.2c-.79,1.65-1.65,3.47-2.51,5.34C629.22,33,626,40,622,50.24a363.43,363.43,0,0,0-13,39.91A298,298,0,0,0,600,145a250.51,250.51,0,0,0-.18,31,222.27,222.27,0,0,0,4.27,31.68l.86,3.94.43,2,.52,1.95,2.11,7.79,2.48,7.67c.38,1.29.88,2.53,1.36,3.79l1.43,3.75c.49,1.25.93,2.51,1.45,3.74l1.62,3.66,1.61,3.65c.27.6.52,1.22.82,1.81l.9,1.77,3.58,7,3.91,6.79a290.31,290.31,0,0,0,35.21,47,402,402,0,0,0,34.17,32.77c2.51,2.13,4.85,4.18,7.09,6l6.26,5.13c3.82,3.17,7.07,5.68,9.47,7.62l26.81,21.21c8.08,6.44,15.15,12.25,20.91,17.2l7.67,6.72c2.2,2,4,3.78,5.55,5.22,3,2.89,4.51,4.56,4.33,4.76s-2.1-1.14-5.47-3.73L765,405.83l-21.46-16.5C735.35,383.09,726.32,376.21,716.89,368.69Z" style="fill:url(#linear-gradient-17)"/><path d="M925.73,401.72c-.5-1.87-1-4.07-1.73-6.54s-1.49-5.25-2.42-8.28l-1.51-4.73c-.52-1.65-1.07-3.36-1.71-5.1l-4-11.24-2.17-6.14-2.5-6.4-2.62-6.71c-.92-2.28-1.75-4.64-2.8-7L898,325c-2.29-5-4.76-10.1-7.25-15.38l-.94-2-1-2-2.06-4-4.19-8.06c-.69-1.37-1.45-2.71-2.22-4.05l-2.34-4-4.68-8.24-5.08-8.21-2.57-4.15c-.43-.69-.85-1.4-1.3-2.08l-1.38-2c-3.7-5.45-7.31-11.08-11.36-16.47-2-2.72-4-5.49-6-8.21l-6.3-8.15c-1.06-1.35-2.1-2.72-3.19-4.05l-3.32-4-6.69-8-7-7.79c-1.17-1.29-2.3-2.62-3.5-3.88l-3.59-3.8c-2.4-2.53-4.77-5.09-7.2-7.59l-7.37-7.42c-2.43-2.49-4.95-4.89-7.45-7.3s-5-4.83-7.5-7.19l-15.09-14c-10-9.2-19.77-18.32-29.12-27.29-18.7-17.93-35.79-35.19-50-51s-25.56-30.19-32.86-42a104.24,104.24,0,0,1-8-15.28,54.94,54.94,0,0,1-3-9.2,36.36,36.36,0,0,1-1-7.28,1,1,0,0,0-1-.84.91.91,0,0,0-1,.85V1a37.31,37.31,0,0,0,1,7.67,57.38,57.38,0,0,0,3.22,9.94,107.1,107.1,0,0,0,8.33,15.83,230.52,230.52,0,0,0,14,19.82c5.57,7.13,12,14.72,19.12,22.68,14.24,15.91,31.27,33.23,49.86,51.19,9.29,9,19,18.12,28.92,27.33l14.93,14,7.39,7.17c2.47,2.39,4.94,4.79,7.34,7.27l7.26,7.38,7.09,7.55,3.54,3.78c1.16,1.27,2.29,2.58,3.44,3.86l6.83,7.73,6.57,7.89,3.27,3.93c1.07,1.33,2.09,2.68,3.14,4l6.21,8c2,2.7,3.94,5.44,5.9,8.14,4,5.34,7.52,10.92,11.16,16.31,1.85,2.67,3.46,5.48,5.15,8.2l5,8.13,4.6,8.16c1.49,2.71,3.07,5.33,4.45,8l4.11,8,2,3.92c.68,1.3,1.34,2.59,1.93,3.9a545.2,545.2,0,0,1,23.28,55.87L914.51,378l.9,2.58.79,2.5,1.5,4.72c.93,3,1.68,5.8,2.41,8.28s1.23,4.7,1.74,6.6l.73,2.83.65,2.83,1.29,5.58c.73,3.71,1.57,7.32,2.16,10.9l1,5.29.8,5.19c.57,3.41.93,6.76,1.38,10,1.6,13,2.24,24.61,2.54,34.24.52,19.29-.2,30.75.45,30.8h0c.25,0,.71-2.93,1.26-8.34s1-13.29,1.09-23.12A307.49,307.49,0,0,0,925.73,401.72Z" style="fill:url(#linear-gradient-18)"/><path d="M577.29,723c1.42-.52,3-1.31,4.85-2.12l6.14-2.78,7.21-3.68,2-1,2-1.14,4.19-2.4c2.91-1.58,5.82-3.54,8.93-5.5s6.22-4.24,9.51-6.53c1.66-1.13,3.26-2.4,4.9-3.69l5-3.91,5-4.28c1.68-1.45,3.42-2.9,5-4.51l5-4.78c1.69-1.63,3.29-3.39,5-5.11l2.51-2.62c.84-.88,1.61-1.83,2.43-2.74l4.88-5.61a242.24,242.24,0,0,0,18-25.16,239.39,239.39,0,0,0,14.82-28.69,234.94,234.94,0,0,0,10.5-31.1,232.14,232.14,0,0,0,5.68-32.06c.41-5.35.94-10.64,1-15.9.23-5.25.11-10.45,0-15.57a236.67,236.67,0,0,0-2.93-29.45c-.69-4.68-1.68-9.19-2.58-13.59l-1.55-6.44c-.48-2.12-1.14-4.16-1.69-6.19l-.85-3c-.29-1-.62-2-.93-2.93l-1.83-5.67-2-5.37-1-2.59-1-2.49-2-4.8c-.67-1.54-1.37-3-2-4.46s-1.27-2.85-1.93-4.17l-1.93-3.83a211.15,211.15,0,0,0-10.73-18.7l-3.29-5a1,1,0,0,1,.15-1.11l.43-.16h-.49l.45-.16a.93.93,0,0,1,1.06.28l3.36,5a212.54,212.54,0,0,1,11.2,19.34,218.69,218.69,0,0,1,15.71,39.84c1.24,4.07,2.22,8.36,3.31,12.75l1.4,6.74c.25,1.14.46,2.29.65,3.45l.59,3.51a248.2,248.2,0,0,1,3.05,29.66l.18,7.79v3.94l-.09,4c0,5.3-.55,10.65-.91,16a219.8,219.8,0,0,1-49,118.39l-4.91,5.71c-.82.93-1.6,1.89-2.44,2.79l-2.53,2.66c-1.69,1.75-3.31,3.53-5,5.21l-5,4.93c-.85.79-1.65,1.62-2.51,2.37l-2.57,2.24-5,4.37-5.07,4c-1.67,1.3-3.27,2.63-5,3.78l-4.88,3.48c-.8.56-1.58,1.14-2.37,1.68L615,707.49c-3.17,2-6.11,4-9.08,5.66l-4.27,2.46-2,1.17c-.67.37-1.36.71-2,1.05l-7.39,3.79c-2.3,1.09-4.43,2-6.32,2.89s-3.55,1.67-5,2.21a205.44,205.44,0,0,1-33.27,10.63c-2.58.56-5.07,1.13-7.5,1.63L531,740.15l-3.35.54-3.24.36-6.06.64c-1.92.24-3.76.29-5.49.38l-4.87.22c-3,.18-5.62,0-7.73,0-4.22-.13-6.5-.34-6.5-.62s2.36-.57,6.64-.92c2.14-.18,4.76-.3,7.8-.7l4.87-.53,2.66-.28c.91-.1,1.84-.27,2.8-.41,3.81-.62,8-1.07,12.49-2l6.94-1.36,7.31-1.78A231.31,231.31,0,0,0,577.29,723Z" style="fill:url(#linear-gradient-19)"/><path d="M351.94,263c1-2.74,2.18-6,3.6-9.69s3.21-7.86,5.47-12.36a162.23,162.23,0,0,1,19.1-30.7A152.53,152.53,0,0,1,415,177.78c1.84-1.25,3.77-2.43,5.74-3.6l1.49-.86.54-.31.19-.1.32-.17h.09c.12,0,0,0-.06-.07h-.1l-.42-.09q-3.41-.72-6.93-1.23a126.12,126.12,0,0,0-29.7-.78,112.84,112.84,0,0,0-26.45,5.73,102,102,0,0,0-13.72,6c-4.56,2.42-9.26,5.06-14,7.77s-9.53,5.59-14.28,8.68c-1.2.76-2.38,1.55-3.56,2.35s-2.36,1.61-3.52,2.45a76.69,76.69,0,0,0-6.73,5.32c-.5.48-1,1-1.48,1.46l-.35.37-.39.47c-.09.15-.25.22-.3.42h-.17l-.09,0-.19.1-.69.37a3,3,0,0,1-.64.26c-.27.07-.56.33-.86.12l-1.51-.56-2.09-.74c-2.8-1-5.65-1.88-8.52-2.77Q278,205.69,269,203.64l-.79-.18-.85-.2a190.45,190.45,0,0,0-29.58-4.16,132,132,0,0,0-30.22,2.23c-5,.87-10,2-15,3.22s-9.91,2.68-14.8,4.23A239.93,239.93,0,0,0,149.18,220,209.57,209.57,0,0,0,99,252.6a177.19,177.19,0,0,0-19.89,20.65c-1.53,1.77-2.89,3.67-4.3,5.51s-2.71,3.75-4,5.63L66.89,290c-1.28,1.87-2.6,3.69-3.75,5.61l-7,11.19L49.8,317.89c-1.07,1.8-2,3.64-3,5.46L44,328.78c-.92,1.79-1.88,3.53-2.74,5.3l-2.54,5.26c-3.43,6.89-6.32,13.63-9.14,20-2.65,6.39-5.18,12.39-7.29,18.05s-4,10.9-5.76,15.66-3.11,9.09-4.27,12.91l-1.66,5.29-1.32,4.46c-.81,2.68-1.38,4.79-1.79,6.25-1,3.42-1.84,6.8-2.62,10a1,1,0,0,1-1.15.61A.92.92,0,0,1,3,431.48v0c.76-3.15,1.62-6.58,2.6-10.08.43-1.6,1-3.84,1.88-6.64l1.36-4.63,1.69-5.44c.59-2,1.27-4,2-6.22s1.48-4.52,2.33-6.95c1.73-4.84,3.57-10.18,5.8-15.87S25.3,363.85,28,357.41l4.35-9.84c.73-1.69,1.52-3.38,2.35-5.08l2.48-5.17L39.67,332l2.77-5.32,2.82-5.43c.48-.91.94-1.84,1.45-2.75l1.55-2.73c2.09-3.65,4.15-7.4,6.37-11.14l7-11.26c.58-1,1.22-1.89,1.86-2.82l1.92-2.81,3.89-5.67,2-2.86,2.11-2.8,2.13-2.81c.72-.93,1.49-1.83,2.24-2.75A181,181,0,0,1,97.91,250a204.59,204.59,0,0,1,23.81-18,230.67,230.67,0,0,1,26.75-14.8,240,240,0,0,1,58.82-18.93c5.09-.9,10.2-1.62,15.34-2.05,1.28-.11,2.57-.21,3.86-.27s2.58-.12,3.87-.14c2.58,0,5.14.08,7.7.13a194.48,194.48,0,0,1,30,4.12l.86.2.81.18q9.07,2,17.83,4.67c2.91.89,5.79,1.8,8.64,2.78l2.13.75.62.22c.11,0,.13.06.18,0l.1-.14.28-.34.41-.44c.54-.61,1.11-1.11,1.67-1.66a78.53,78.53,0,0,1,7-5.58c1.19-.86,2.38-1.71,3.59-2.51s2.4-1.63,3.61-2.4c4.81-3.15,9.64-6,14.39-8.81s9.43-5.39,14.09-7.89a104.82,104.82,0,0,1,14.19-6.25,116.45,116.45,0,0,1,27.36-6,129.84,129.84,0,0,1,30.39.7q3.62.51,7.13,1.23c.35.07,1.77.37,2.79.62s2.17.53,3.13.83l2.93.87,1.45.44.3.1.16,0H434l-.85.38-3.37,1.53-.84.38c-.28.13-.57.26-.77.37l-1.33.7-1.33.69-.66.35-.32.17-.18.1-1.43.83c-1,.54-1.88,1.13-2.81,1.7s-1.84,1.16-2.73,1.76a148.58,148.58,0,0,0-33.92,31.52,159.38,159.38,0,0,0-18.71,30c-2.22,4.44-3.86,8.6-5.41,12.24s-2.62,6.94-3.6,9.7a232.16,232.16,0,0,0-8.08,30A198.75,198.75,0,0,0,344,322.27a127.54,127.54,0,0,0,.92,25.09l.47,2.85c.15.94.3,1.87.54,2.79.44,1.83.8,3.64,1.32,5.37s.92,3.45,1.46,5.1,1,3.27,1.55,4.83A274.52,274.52,0,0,0,362,397.06c3.09,6.56,4.88,10.07,4.63,10.22s-2.53-3.27-6.14-9.81a212.22,212.22,0,0,1-13.21-29c-1.15-3.19-2.27-6.57-3.3-10.15-.52-1.79-1-3.65-1.44-5.52s-.73-3.87-1.11-5.87a131.29,131.29,0,0,1-1.09-25.76,189.56,189.56,0,0,1,3.59-28.37A227.44,227.44,0,0,1,351.94,263Z" style="fill:url(#linear-gradient-20)"/><g style="opacity:0.25"><path d="M915.07,657.63l2.85-6.3,4-9.2,4.75-11.72,2.52-6.71c.86-2.32,1.8-4.7,2.62-7.19,1.7-5,3.56-10.18,5.18-15.68.82-2.75,1.77-5.52,2.53-8.38l2.36-8.69c.85-2.92,1.46-5.92,2.17-8.93l1-4.53c.36-1.51.71-3,1-4.57l1.74-9.24.43-2.32.34-2.33.69-4.66c1-6.19,1.55-12.42,2.24-18.53.44-6.13,1-12.15,1.12-18,.46-11.7.34-22.7-.22-32.32a283.63,283.63,0,0,0-4.08-36.28c-.21-1.15-.43-2.28-.65-3.34a1,1,0,0,1,.77-1,.92.92,0,0,1,1.14.63h0c.23,1,.48,2.2.7,3.38a287,287,0,0,1,4.51,36.94c.13,2.42.32,4.92.4,7.5l.24,8c0,5.44.12,11.14-.13,17-.09,5.88-.58,11.93-1,18.08-.64,6.13-1.12,12.39-2.08,18.62l-.64,4.68-.32,2.34-.42,2.33-1.66,9.3c-.25,1.55-.6,3.08-.94,4.6l-1,4.56c-.69,3-1.28,6.05-2.1,9l-2.29,8.75c-.36,1.45-.79,2.86-1.21,4.26l-1.25,4.18-1.23,4.1-.61,2-.66,2-2.57,7.7a445.76,445.76,0,0,1-16.62,41.7c-11.91,26.19-23.65,43.64-24.6,43S903.6,682.92,915.07,657.63Z" style="fill:#fff"/></g><g style="opacity:0.25"><path d="M779.41,865.32c5-3,16.85-10,31.16-20.3l5.49-4,5.63-4.28,2.9-2.2,2.88-2.32,5.87-4.75,5.84-5c2-1.69,4-3.39,5.82-5.18s3.73-3.64,5.59-5.48,3.59-3.81,5.27-5.82a140,140,0,0,0,9.53-12.29,147.13,147.13,0,0,0,8-12.74,169.73,169.73,0,0,0,11.32-24.49A158.72,158.72,0,0,0,892.63,727c.15-1,.3-1.91.41-2.81a1,1,0,0,1,1.07-.74.92.92,0,0,1,.87,1v0c-.1.9-.23,1.88-.38,2.88a161.08,161.08,0,0,1-7.79,30.28,171.81,171.81,0,0,1-11.21,24.91,151.5,151.5,0,0,1-8,13,143.71,143.71,0,0,1-9.54,12.57c-1.68,2.06-3.51,4-5.29,6a78.84,78.84,0,0,1-5.63,5.64c-1.95,1.79-3.87,3.58-5.82,5.3l-5.81,5.12L829.67,835l-2.86,2.37-2.89,2.24L818.3,844c-1.85,1.4-3.7,2.72-5.48,4-14.29,10.46-26.22,17.71-31.39,20.8-20.72,12.39-37.24,18.66-37.67,17.61-.2-.47,3.73-2.72,10.19-6.37S769.43,871.27,779.41,865.32Z" style="fill:#fff"/></g><g style="opacity:0.25"><path d="M518.09,981.82l6.73-.27,9.74-.6c7.4-.51,16.5-1.28,26.66-2.52,1.27-.15,2.56-.27,3.86-.46l3.94-.57,8.15-1.18c2.77-.39,5.56-1,8.4-1.46s5.73-1,8.63-1.6l8.75-1.93,4.43-1c1.47-.35,2.93-.77,4.41-1.16l8.85-2.37c.74-.2,1.48-.38,2.21-.61l2.18-.7,4.36-1.41c2.9-1,5.82-1.82,8.68-2.85l8.49-3.14,4.19-1.56,4.1-1.67,8-3.29a270.77,270.77,0,0,0,28.13-14,118.17,118.17,0,0,0,19.1-13.55,49.59,49.59,0,0,0,8-8.69c.3-.46.61-.92.89-1.37a10.55,10.55,0,0,0,.72-1.36,1.05,1.05,0,0,1,1.22-.39c.55.15.71.64.56,1.2a8.18,8.18,0,0,1-.78,1.53,11.59,11.59,0,0,1-1,1.51,52.49,52.49,0,0,1-8.44,9.36,124.32,124.32,0,0,1-19.42,14,279.54,279.54,0,0,1-28.23,14.4l-8,3.37-4.09,1.72-4.19,1.6-8.45,3.2c-2.86,1-5.79,2-8.7,2.94l-4.38,1.46-2.19.73-2.22.63-8.87,2.47c-1.48.4-2.94.84-4.42,1.2l-4.43,1-8.77,2c-2.9.63-5.8,1.13-8.65,1.68s-5.65,1.13-8.42,1.55L569.66,981c-2.67.42-5.28.83-7.83,1.11-10.2,1.33-19.35,2.18-26.82,2.76l-9.87.67-6.89.3c-28,1.17-48.35-1.16-48.24-2.29S491.06,983,518.09,981.82Z" style="fill:#fff"/></g><path d="M155.86,160.77l-1.92-3.17c-.67-1.32-1.53-2.79-2.33-4.54A76.5,76.5,0,0,1,147,139.64,117.38,117.38,0,0,1,144,120q-.21-2.84-.31-5.89v-2.17h0l-.09.09-.09.1-.45.5c-1.5,1.68-3,3.43-4.56,5.24-4.08,4.77-8.43,10.15-12.83,16s-8.84,12.16-13,18.82c-2.14,3.3-4.08,6.77-6.06,10.21l-2.78,5.28c-.48.87-.9,1.77-1.31,2.67l-1.25,2.7a150.27,150.27,0,0,0-8,21.95c-2,7.28-3.66,14.35-4.93,20.92s-2.16,12.65-2.85,18c-1.33,10.61-1.78,18.1-1.91,20.49l-.16,3.35a1,1,0,0,1-1,.83.93.93,0,0,1-1-.85v0c0-1.06.07-2.21.12-3.39.12-2.63.5-10.29,1.76-21,.64-5.37,1.53-11.49,2.71-18.13s2.79-13.77,4.77-21.13a149.36,149.36,0,0,1,7.78-22.29l1.24-2.75.62-1.38.69-1.35,2.76-5.38c2-3.5,3.9-7,6-10.38,4.15-6.77,8.54-13.19,12.93-19.11s8.7-11.4,12.77-16.27c1.54-1.83,3.05-3.6,4.55-5.3l.68-.77,1.06-1.17,2.11-2.32,2.07-2.23,1-1.11.25-.26.12-.12v1c-.06,2.15-.18,4.38-.16,6.33V114q.1,2.94.33,5.7a113.79,113.79,0,0,0,3,18.89A72.43,72.43,0,0,0,155,151.33c.34.85.79,1.57,1.15,2.28l1.05,2,1.9,3.13c3.67,5.91,7.49,11.2,11,15.9s6.66,8.8,9.31,12.2c5.3,6.8,8.45,10.86,8,11.24s-4.4-3.19-10.36-9.65c-3-3.23-6.43-7.2-10.1-11.82A169.38,169.38,0,0,1,155.86,160.77Z" style="fill:url(#linear-gradient-21)"/><path d="M205.1,584.1c-.35-1.58-.67-3.73-1.13-6.35-.25-1.31-.43-2.74-.61-4.3l-.6-5a142.7,142.7,0,0,1,.09-25.65A151.74,151.74,0,0,1,209,511.5a99.91,99.91,0,0,1,6.59-16,81.94,81.94,0,0,1,22.32-26.87l3.43-2.59c1.14-.85,2.35-1.59,3.51-2.38l1.75-1.16c.59-.37,1.2-.71,1.79-1.07l3.56-2.09a81.56,81.56,0,0,1,28.77-8.82,122.24,122.24,0,0,1,22.47-.45c5.84.42,9.8,1.07,11.38,1.32,1.08.18,2.13.37,3.13.58a1,1,0,0,1-.39,1.92c-.94-.18-2-.35-3.06-.52-1.69-.25-5.7-.85-11.5-1.19a119.36,119.36,0,0,0-22.12.74A78.89,78.89,0,0,0,253,461.85c-2.26,1.39-4.63,2.69-6.85,4.28-1.11.78-2.29,1.49-3.37,2.35L239.51,471a78.82,78.82,0,0,0-21.08,26,97.19,97.19,0,0,0-6.17,15.5A148.72,148.72,0,0,0,206.55,543a139.8,139.8,0,0,0,.09,24.89l.61,4.86c.19,1.52.36,2.93.61,4.21.47,2.57.79,4.7,1.14,6.28,1.31,6.35,2.86,12.2,4.4,17.41s3.11,9.75,4.52,13.49c2.73,7.52,4.67,11.87,4.17,12.15s-3.37-3.86-6.85-11.32a132.29,132.29,0,0,1-5.42-13.49c-.86-2.62-1.78-5.38-2.53-8.31S205.8,587.26,205.1,584.1Z" style="fill:url(#linear-gradient-22)"/></g></g></g></g></svg>
new file mode 100644
--- /dev/null
+++ b/devtools/client/themes/images/aboutdebugging-firefox-beta.svg
@@ -0,0 +1,4 @@
+<!-- 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/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 961 984"><defs><radialGradient id="radial-gradient" cx="-14492.05" cy="9293.61" fx="-14520.816138719447" r="450.88" gradientTransform="matrix(0.76, 0.03, 0.05, -1.12, 11486.51, 11147.86)" gradientUnits="userSpaceOnUse"><stop offset="0.05" stop-color="#ffea00"/><stop offset="0.12" stop-color="#ffde00"/><stop offset="0.25" stop-color="#ffbf00"/><stop offset="0.43" stop-color="#ff8e00"/><stop offset="0.77" stop-color="#ff272d"/><stop offset="0.87" stop-color="#e0255a"/><stop offset="0.95" stop-color="#cc2477"/><stop offset="1" stop-color="#c42482"/></radialGradient><radialGradient id="radial-gradient-2" cx="-7586.92" cy="8863.48" r="791.23" gradientTransform="matrix(1.23, 0, 0, -1.23, 9957.22, 11055.45)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#00ccda"/><stop offset="0.22" stop-color="#0083ff"/><stop offset="0.26" stop-color="#007af9"/><stop offset="0.33" stop-color="#0060e8"/><stop offset="0.33" stop-color="#005fe7"/><stop offset="0.44" stop-color="#2639ad"/><stop offset="0.52" stop-color="#401e84"/><stop offset="0.57" stop-color="#4a1475"/></radialGradient><linearGradient id="linear-gradient" x1="540.64" y1="254.8" x2="349.2" y2="881.03" gradientTransform="matrix(1, 0, 0, -1, 0, 984)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#000f43" stop-opacity="0.4"/><stop offset="0.48" stop-color="#001962" stop-opacity="0.17"/><stop offset="1" stop-color="#002079" stop-opacity="0"/></linearGradient><radialGradient id="radial-gradient-3" cx="-8337.18" cy="7467.65" r="266.89" gradientTransform="matrix(1.22, 0.12, 0.12, -1.22, 10240.12, 10764.8)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ffea00"/><stop offset="0.5" stop-color="#ff272d"/><stop offset="1" stop-color="#c42482"/></radialGradient><radialGradient id="radial-gradient-4" cx="-8361.33" cy="7723.56" r="445.68" gradientTransform="matrix(1.22, 0.12, 0.12, -1.22, 10240.12, 10764.8)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ffe900"/><stop offset="0.16" stop-color="#ffaf0e"/><stop offset="0.32" stop-color="#ff7a1b"/><stop offset="0.47" stop-color="#ff4e26"/><stop offset="0.62" stop-color="#ff2c2e"/><stop offset="0.76" stop-color="#ff1434"/><stop offset="0.89" stop-color="#ff0538"/><stop offset="1" stop-color="#ff0039"/></radialGradient><radialGradient id="radial-gradient-5" cx="-8298.29" cy="7310.42" r="408.96" gradientTransform="matrix(1.22, 0.12, 0.12, -1.22, 10240.12, 10764.8)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ff272d"/><stop offset="0.5" stop-color="#c42482"/><stop offset="0.99" stop-color="#620700"/></radialGradient><radialGradient id="radial-gradient-6" cx="715.19" cy="589.96" fx="743.1665035759797" fy="576.1323859732546" r="782.18" gradientTransform="matrix(1, 0, 0, -1, 0, 984)" gradientUnits="userSpaceOnUse"><stop offset="0.16" stop-color="#ffea00"/><stop offset="0.23" stop-color="#ffde00"/><stop offset="0.37" stop-color="#ffbf00"/><stop offset="0.54" stop-color="#ff8e00"/><stop offset="0.76" stop-color="#ff272d"/><stop offset="0.8" stop-color="#f92433"/><stop offset="0.84" stop-color="#e91c45"/><stop offset="0.89" stop-color="#cf0e62"/><stop offset="0.94" stop-color="#b5007f"/></radialGradient><radialGradient id="radial-gradient-7" cx="656.34" cy="982.71" r="923.62" gradientTransform="matrix(1, 0, 0, -1, 0, 984)" gradientUnits="userSpaceOnUse"><stop offset="0.28" stop-color="#ffea00"/><stop offset="0.4" stop-color="#fd0"/><stop offset="0.63" stop-color="#ffba00"/><stop offset="0.86" stop-color="#ff9100"/><stop offset="0.93" stop-color="#ff6711"/><stop offset="0.99" stop-color="#ff4a1d"/></radialGradient><linearGradient id="linear-gradient-2" x1="-9022.89" y1="7636.68" x2="-8738.53" y2="7709.17" gradientTransform="matrix(1.22, 0.12, 0.12, -1.22, 10240.12, 10764.8)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#c42482" stop-opacity="0.5"/><stop offset="0.47" stop-color="#ff272d" stop-opacity="0.5"/><stop offset="0.49" stop-color="#ff2c2c" stop-opacity="0.51"/><stop offset="0.68" stop-color="#ff7a1a" stop-opacity="0.72"/><stop offset="0.83" stop-color="#ffb20d" stop-opacity="0.87"/><stop offset="0.94" stop-color="#ffd605" stop-opacity="0.96"/><stop offset="1" stop-color="#ffe302"/></linearGradient><linearGradient id="linear-gradient-3" x1="188.87" y1="2080.93" x2="134.3" y2="2220.78" gradientTransform="matrix(0.99, 0.1, 0.1, -0.99, -250.06, 2305.85)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#891551" stop-opacity="0.6"/><stop offset="1" stop-color="#c42482" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-4" x1="-38.43" y1="277.74" x2="55.68" y2="170.86" gradientTransform="matrix(0.99, 0.1, 0.1, -0.99, 229.07, 745.44)" gradientUnits="userSpaceOnUse"><stop offset="0.01" stop-color="#891551" stop-opacity="0.5"/><stop offset="0.48" stop-color="#ff272d" stop-opacity="0.5"/><stop offset="1" stop-color="#ff272d" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-5" x1="142.43" y1="93.37" x2="142.5" y2="168.15" gradientTransform="matrix(0.99, 0.1, 0.1, -0.99, 229.07, 745.44)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#c42482"/><stop offset="0.08" stop-color="#c42482" stop-opacity="0.81"/><stop offset="0.21" stop-color="#c42482" stop-opacity="0.57"/><stop offset="0.33" stop-color="#c42482" stop-opacity="0.36"/><stop offset="0.45" stop-color="#c42482" stop-opacity="0.2"/><stop offset="0.56" stop-color="#c42482" stop-opacity="0.09"/><stop offset="0.67" stop-color="#c42482" stop-opacity="0.02"/><stop offset="0.77" stop-color="#c42482" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-6" x1="620.52" y1="947.88" x2="926.18" y2="264.39" gradientTransform="matrix(1, 0, 0, -1, 0, 984)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#fff14f"/><stop offset="0.27" stop-color="#ffee4c"/><stop offset="0.45" stop-color="#ffe643"/><stop offset="0.61" stop-color="#ffd834"/><stop offset="0.76" stop-color="#ffc41e"/><stop offset="0.89" stop-color="#ffab02"/><stop offset="0.9" stop-color="#ffa900"/><stop offset="0.95" stop-color="#ffa000"/><stop offset="1" stop-color="#ff9100"/></linearGradient><linearGradient id="linear-gradient-7" x1="680.88" y1="554.79" x2="536.1" y2="166.04" gradientTransform="matrix(1, 0, 0, -1, 0, 984)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ff8e00"/><stop offset="0.04" stop-color="#ff8e00" stop-opacity="0.86"/><stop offset="0.08" stop-color="#ff8e00" stop-opacity="0.73"/><stop offset="0.13" stop-color="#ff8e00" stop-opacity="0.63"/><stop offset="0.18" stop-color="#ff8e00" stop-opacity="0.56"/><stop offset="0.23" stop-color="#ff8e00" stop-opacity="0.51"/><stop offset="0.28" stop-color="#ff8e00" stop-opacity="0.5"/><stop offset="0.39" stop-color="#ff8e00" stop-opacity="0.48"/><stop offset="0.52" stop-color="#ff8e00" stop-opacity="0.42"/><stop offset="0.68" stop-color="#ff8e00" stop-opacity="0.31"/><stop offset="0.84" stop-color="#ff8e00" stop-opacity="0.17"/><stop offset="1" stop-color="#ff8e00" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-8" x1="348" y1="163" x2="949" y2="163" gradientTransform="matrix(1, 0, 0, -1, 0, 984)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#04fcee"/><stop offset="1" stop-color="#23e832"/></linearGradient></defs><title>firefox-logo-beta</title><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><g id="Layer_2-2" data-name="Layer 2"><g id="BETA"><path d="M770.28,91.56c-23.94,27.88-35.09,90.64-10.81,154.25s61.49,49.8,84.7,114.68c30.62,85.6,16.37,200.59,16.37,200.59s36.81,106.6,62.47-6.64C979.79,341.74,770.28,143.94,770.28,91.56Z" style="fill:url(#radial-gradient)"/><path id="_Path_" data-name=" Path " d="M478.07,974.64c245.24,0,443.9-199.74,443.9-446s-198.66-446-443.66-446S34.65,282.32,34.65,528.61C34.18,775.14,233.07,974.64,478.07,974.64Z" style="fill:url(#radial-gradient-2)"/><path d="M810.67,803.64a245.54,245.54,0,0,1-30.12,18.18,707.66,707.66,0,0,0,38.3-63c9.46-10.47,18.12-20.65,25.19-31.65,3.43-5.41,7.31-12.08,11.41-19.82,24.92-44.9,52.41-117.57,53.18-192.21v-5.65a257.26,257.26,0,0,0-5.72-55.75c.2,1.43.38,2.86.56,4.29-.22-1.1-.41-2.21-.64-3.31.36,2,.66,4,1,6,5.1,43.22,1.47,85.37-16.68,116.45-.29.45-.58.88-.87,1.32,9.41-47.23,12.56-99.38,2.09-151.6,0,0-4.19-25.38-35.38-102.44-18-44.35-49.83-80.72-78-107.21-24.69-30.55-47.11-51-59.48-64.06-25.82-27.19-36.64-47.57-41.08-60.87-3.86-1.93-53.14-49.8-57-51.63-21.51,33.35-89.16,137.68-57,235.15,14.58,44.17,51.46,90,90.06,115.74,1.7,1.93,23,25,33.09,77.15,10.45,53.85,5,95.86-16.54,158C641.75,681.23,577,735.11,516.31,740.62c-129.67,11.78-177.14-65.11-177.14-65.11C385.5,694,436.73,690.16,467.89,671c31.4-19.43,50.39-33.83,65.81-28.15C548.86,648.43,561,632,550.1,615a78.5,78.5,0,0,0-79.4-34.57c-31.43,5.11-60.22,30-101.41,5.89a82.13,82.13,0,0,1-7.73-5.06c-2.71-1.78,8.83,2.72,6.13.69-8-4.36-22.2-13.84-25.88-17.22-.61-.56,6.22,2.18,5.61,1.62-38.51-31.71-33.7-53.14-32.49-66.57,1-10.75,8-24.52,19.75-30.11,5.69,3.11,9.24,5.48,9.24,5.48s-2.43-5-3.74-7.58c.46-.19.9-.15,1.36-.34,4.66,2.25,15,8.1,20.4,11.67,7.08,5,9.33,9.43,9.33,9.43s1.86-1,.49-5.37c-.51-1.78-2.65-7.45-9.66-13.18h.44A82.16,82.16,0,0,1,374.41,478c2-7.18,5.53-14.67,4.74-28.09-.47-9.43-.25-11.87-1.92-15.51-1.48-3.13.84-4.35,3.42-1.1a32.35,32.35,0,0,0-2.21-7.4v-.25c3.22-11.23,68.24-40.46,73-43.87A67.59,67.59,0,0,0,470.57,361c3.62-5.76,6.34-13.84,7-26.11.35-8.84-3.76-14.73-69.51-21.62-18-1.77-28.53-14.8-34.52-26.82-1.1-2.59-2.21-4.94-3.33-7.28a57.68,57.68,0,0,1-2.56-8.43c10.75-30.88,28.81-57,55.37-76.7,1.45-1.32-5.78.34-4.34-1,1.69-1.54,12.71-6,14.79-7,2.54-1.19-10.88-6.9-22.73-5.51-12.07,1.36-14.63,2.8-21.07,5.53,2.67-2.66,11.17-6.15,9.18-6.13-13,2-29.18,9.56-43,18.13a10.84,10.84,0,0,1,.84-4.35c-6.44,2.73-22.26,13.79-26.87,23.14a44.29,44.29,0,0,0,.27-5.4,84.17,84.17,0,0,0-13.19,13.82l-.25.22c-37.35-15-70.23-16-98-9.27-6.08-6.12-9.06-1.65-22.91-32.07-.94-1.84.73,1.81,0,0-2.27-5.9,1.39,7.87,0,0-23.28,18.37-53.92,39.19-68.62,53.89-.18.58,17.15-4.9,0,0-6,1.71-5.6,5.28-6.51,37.5-.22,2.44,0,5.18-.23,7.38-11.75,15-19.75,27.64-22.77,34.21-15.2,26.18-31.93,67-48.15,131.55A333,333,0,0,1,75.2,398.36c-13.49,34.27-26.53,88.08-29.14,170.95a484.57,484.57,0,0,1,12.53-50.66A473.24,473.24,0,0,0,93.33,719.71c9.33,22.82,24.76,57.46,51,95.4C226.9,902,343.31,956,472.21,956,606.79,956,727.64,897.13,810.67,803.64Z" style="fill:url(#linear-gradient)"/><path d="M711.1,866.71c162.87-18.86,235-186.7,142.38-190C769.85,674,634,875.61,711.1,866.71Z" style="fill:url(#radial-gradient-3)"/><path d="M865.21,642.42c112-65.21,82.84-206.08,82.84-206.08s-43.25,50.24-72.63,130.32C846.4,646,797.84,681.81,865.21,642.42Z" style="fill:url(#radial-gradient-4)"/><path d="M509.47,950.06C665.7,999.91,800,876.84,717.21,835.74,642,798.68,435.32,926.49,509.47,950.06Z" style="fill:url(#radial-gradient-5)"/><path d="M876.85,702.23c3.8-5.36,8.94-22.53,13.48-30.21,27.58-44.52,27.78-80,27.78-80.83C934.76,508,933.25,474,923,411.14c-8.25-50.6-44.32-123.09-75.57-158-32.2-36-9.52-24.25-40.69-50.52-27.33-30.29-53.83-60.29-68.26-72.36C634.22,43.09,636.57,24.58,638.58,21.42c-.34.37-.84.92-1.47,1.64C635.87,18.14,635,14,635,14s-57,57-69,152c-7.83,62,15.38,126.68,49,168a381.62,381.62,0,0,0,59,58h0c25.4,36.48,39.38,81.49,39.38,129.91,0,121.25-98.34,219.53-219.65,219.53a220.81,220.81,0,0,1-49.14-5.51C387.36,725,354.3,696.12,337.82,676.51c-9.45-11.23-13.46-19.42-13.46-19.42,51.28,18.37,108,14.53,142.46-4.52,34.75-19.26,55.78-33.54,72.84-27.91,16.82,5.6,30.21-10.67,18.2-27.54-11.77-16.84-42.4-41-87.88-34.29-34.79,5.07-66.66,29.76-112.24,5.85a97.34,97.34,0,0,1-8.55-5c-3-1.77,9.76,2.69,6.78.68-8.87-4.32-24.57-13.73-28.64-17.07-.68-.56,6.88,2.16,6.21,1.6-42.63-31.45-37.3-52.69-36-66,1.07-10.66,8.81-24.32,21.86-29.86,6.3,3.08,10.22,5.44,10.22,5.44s-2.69-4.92-4.14-7.52c.51-.19,1-.14,1.5-.34,5.17,2.24,16.58,8,22.59,11.57,7.83,4.95,10.32,9.36,10.32,9.36s2.06-1,.54-5.33c-.56-1.77-2.93-7.39-10.68-13.06l.48.05a89.38,89.38,0,0,1,13.13,8.17c2.19-7.12,6.12-14.56,5.26-27.86-.53-9.35-.29-11.78-2.13-15.39-1.64-3.1.93-4.31,3.79-1.08a30.4,30.4,0,0,0-2.45-7.35v-.24c3.57-11.14,75.53-40.12,80.77-43.51a70.24,70.24,0,0,0,21.17-20.63c4-5.72,7-13.73,7.75-25.9.25-5.48-1.44-9.81-20.49-14-11.44-2.49-29.14-4.91-56.44-7.48-19.9-1.75-31.57-14.67-38.21-26.6-1.21-2.56-2.44-4.89-3.68-7.22a53.41,53.41,0,0,1-2.83-8.36c11.9-30.62,31.89-56.5,61.28-76.06,1.6-1.31-6.4.33-4.8-1,1.87-1.53,14.06-5.93,16.37-6.92,2.81-1.19-12.05-6.84-25.16-5.47-13.36,1.35-16.2,2.78-23.33,5.49,3-2.64,12.37-6.1,10.16-6.08-14.4,2-32.29,9.48-47.59,18a9.59,9.59,0,0,1,.92-4.31c-7.13,2.71-24.64,13.68-29.73,22.95a38.21,38.21,0,0,0,.29-5.35,89,89,0,0,0-14.6,13.7l-.27.22C258.14,196,221.75,195,191,201.72c-6.73-6.06-17.56-15.22-32.89-45.4-1-1.81-1.6,3.76-2.4,2-6-13.81-9.55-36.44-9-52,0,0-12.32,5.61-22.52,29.06-1.89,4.21-3.1,6.54-4.32,8.86-.55.68,1.27-7.7,1-7.24-1.77,3-6.36,7.19-8.37,12.62-1.39,4-3.33,6.27-4.57,11.28l-.29.46c-.09-1.47.37-6.08,0-5.13A236.91,236.91,0,0,0,95.34,186c-5.49,18-11.88,42.61-12.89,74.57-.25,2.42,0,5.13-.25,7.31-13,14.84-21.86,27.4-25.2,33.92-16.81,26-35.33,66.44-53.28,130.46a319.29,319.29,0,0,1,28.53-50C17.32,416.25,2.89,469.62,0,551.8a436.92,436.92,0,0,1,13.87-50.24C11.29,556.36,17.68,624.3,52.32,701c20.57,45,67.92,136.6,183.62,208h0s39.36,29.3,107,51.26c5,1.81,10.06,3.6,15.23,5.33-1.62-.65-3.19-1.34-4.71-2A485.2,485.2,0,0,0,492.27,984c175.18.15,226.85-70.2,226.85-70.2l-.52.38q3.72-3.49,7.15-7.25C698.11,933,635,934.76,611.45,932.87c40.22-11.81,66.69-21.8,118.17-41.52q9-3.35,18.48-7.64c.68-.3,1.37-.62,2-.94,1.25-.58,2.49-1.13,3.75-1.74a348.86,348.86,0,0,0,70.26-44c51.71-41.29,63-81.55,68.83-108.09-.82,2.54-3.37,8.47-5.17,12.31-13.31,28.49-42.84,46-74.91,61a689.15,689.15,0,0,0,42.39-62.44C865.77,729.39,869,713.15,876.85,702.23Z" style="fill:url(#radial-gradient-6)"/><path d="M813.92,801c21.08-23.24,40-49.82,54.35-80,36.9-77.58,94-206.58,49-341.3C881.77,273.22,833,215,771.11,158.12,670.56,65.76,642.48,24.52,642.48,0c0,0-116.09,129.41-65.74,264.38s153.46,130,221.68,270.88c80.27,165.74-64.95,346.61-185,397.23,7.35-1.63,267-60.38,280.61-208.88C893.68,726.34,887.83,767.41,813.92,801Z" style="fill:url(#radial-gradient-7)"/><path d="M477.59,319.37c.4-8.77-4.15-14.66-76.68-21.46-29.84-2.76-41.26-30.33-44.75-41.94-10.61,27.56-15,56.49-12.63,91.48,1.61,22.92,17,47.52,24.37,62,0,0,1.63-2.13,2.39-2.91,13.86-14.43,71.93-36.42,77.39-39.54C453.69,363.16,476.58,346.44,477.59,319.37Z" style="fill:url(#linear-gradient-2)"/><path d="M158.31,156.47c-1-1.82-1.6,3.76-2.4,2-5.95-13.81-9.57-36.2-8.72-52,0,0-12.31,5.61-22.51,29.06-1.89,4.21-3.11,6.54-4.32,8.86-.56.68,1.27-7.7,1-7.24-1.77,3-6.35,7.19-8.34,12.38-1.65,4.24-3.35,6.51-4.62,11.77-.38,1.43.4-6.32.06-5.38C84.72,201.68,80.19,271,82.69,268,133.17,214.14,191,201.36,191,201.36c-6.15-4.53-19.52-17.62-32.7-44.89Z" style="fill:url(#linear-gradient-3)"/><path d="M349.84,720.1c-69.72-29.77-149-71.75-146-167.13C207.92,427.35,321,452.18,321,452.18c-4.27,1-15.68,9.16-19.72,17.82-4.27,10.82-12.07,35.27,11.55,60.89,37.09,40.2-76.2,95.36,98.66,199.57,4.41,2.4-41-1.43-61.64-10.36Z" style="fill:url(#linear-gradient-4)"/><path d="M325.07,657.5c49.45,17.21,107,14.19,141.53-4.85,23.08-12.86,52.7-33.44,70.92-28.36-15.78-6.23-27.73-9.15-42.1-9.86a69.59,69.59,0,0,1-8.05-.32,136,136,0,0,0-15.76.86c-8.89.82-18.76,6.44-27.73,5.54-.49,0,8.7-3.78,7.95-3.61-4.75,1-9.91,1.21-15.37,1.88-3.47.39-6.45.82-9.89,1-103,8.74-190-55.81-190-55.81-7.41,25,33.17,74.3,88.52,93.57Z" style="fill:url(#linear-gradient-5)"/><path d="M813.74,801.65c104.16-102.27,156.86-226.59,134.58-366,0,0,8.91,71.5-24.85,144.63,16.22-71.4,18.1-160.12-25-252C841,205.64,746.45,141.11,710.35,114.19,655.66,73.4,633,31.87,632.57,23.3c-16.34,33.47-65.76,148.2-5.31,247,56.64,92.57,145.87,120,208.33,205C950.67,631.67,813.74,801.65,813.74,801.65Z" style="fill:url(#linear-gradient-6)"/><path d="M798.81,535.55C762.41,460.35,717,427.55,674,392c5,7,6.23,9.47,9,14,37.83,40.32,93.61,138.66,53.11,262.11C659.88,900.48,355,791.06,323,760.32,335.93,894.81,561,959.16,707.6,872,791,793,858.47,658.79,798.81,535.55Z" style="fill:url(#linear-gradient-7)"/><image width="625" height="290" transform="translate(336 680)" href="data:image/png;base64,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" style="opacity:0.5;isolation:isolate"/><path d="M881,954H348V756a68,68,0,0,1,68-68H949V886A68,68,0,0,1,881,954Z" style="fill:url(#linear-gradient-8)"/><path d="M531.35,855.62c0,33.13-26.38,43.38-63,43.38H423V748.36h39.46c38.8,0,62.35,10.9,62.35,38.37,0,18.75-13.52,29.43-27.91,32.48C514.12,822.48,531.35,830.55,531.35,855.62Zm-79.57-86.11v40.76h17.65c15.7,0,25.95-7,25.95-21.14,0-15.26-10.47-19.62-30.09-19.62Zm49.48,85c0-18.1-12.86-24.2-29.65-24.2H451.78V877.4h16.78c19,0,32.7-3.91,32.7-22.87Z" style="fill:#002d3e"/><path d="M643.37,769.72H587.78V811.8h48.39v21.36H587.78v44.26h59.51V899H559V748.36h87.42Z" style="fill:#002d3e"/><path d="M771.78,771.25H732.54V899h-29V771.25H663V748.36H774.83Z" style="fill:#002d3e"/><path d="M854.16,864.12H804.24L794.87,899H765l46.87-150.64H847.4L894.06,899H863.54Zm-5.66-21.8-19.41-71.94-19.18,71.94Z" style="fill:#002d3e"/></g></g></g></g></svg>
new file mode 100644
--- /dev/null
+++ b/devtools/client/themes/images/aboutdebugging-firefox-nightly.svg
@@ -0,0 +1,4 @@
+<!-- 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/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 953.37 984"><defs><linearGradient id="linear-gradient" x1="-14706.28" y1="9250.14" x2="-14443.04" y2="9250.14" gradientTransform="matrix(0.76, 0.03, 0.05, -1.12, 11485.47, 11148)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#0083ff"/><stop offset="0.1" stop-color="#0092f8"/><stop offset="0.31" stop-color="#00abeb"/><stop offset="0.52" stop-color="#00bee1"/><stop offset="0.75" stop-color="#00c8dc"/><stop offset="1" stop-color="#00ccda"/></linearGradient><radialGradient id="radial-gradient" cx="-7588.66" cy="8866.53" r="791.23" gradientTransform="matrix(1.23, 0, 0, -1.22, 9958.21, 11048.11)" gradientUnits="userSpaceOnUse"><stop offset="0.02" stop-color="#005fe7"/><stop offset="0.18" stop-color="#0042b4"/><stop offset="0.32" stop-color="#002989"/><stop offset="0.4" stop-color="#002079"/><stop offset="0.47" stop-color="#131d78"/><stop offset="0.66" stop-color="#3b1676"/><stop offset="0.75" stop-color="#4a1475"/></radialGradient><linearGradient id="linear-gradient-2" x1="539.64" y1="254.8" x2="348.2" y2="881.03" gradientTransform="matrix(1, 0, 0, -1, 1, 984)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#000f43" stop-opacity="0.4"/><stop offset="0.48" stop-color="#001962" stop-opacity="0.17"/><stop offset="1" stop-color="#002079" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-3" x1="540.64" y1="254.8" x2="349.2" y2="881.03" gradientTransform="matrix(1, 0, 0, -1, 0, 984)" href="#linear-gradient-2"/><linearGradient id="linear-gradient-4" x1="-8367.12" y1="7348.87" x2="-8482.36" y2="7357.76" gradientTransform="matrix(1.22, 0.12, 0.12, -1.22, 10241.06, 10765.32)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#812cc9"/><stop offset="1" stop-color="#005fe7"/></linearGradient><linearGradient id="linear-gradient-5" x1="-8449.89" y1="7496.97" x2="-8341.94" y2="7609.09" gradientTransform="matrix(1.22, 0.12, 0.12, -1.22, 10241.06, 10765.32)" gradientUnits="userSpaceOnUse"><stop offset="0.05" stop-color="#005fe7"/><stop offset="0.18" stop-color="#065de6"/><stop offset="0.35" stop-color="#1856e1"/><stop offset="0.56" stop-color="#354adb"/><stop offset="0.78" stop-color="#5d3ad1"/><stop offset="0.95" stop-color="#812cc9"/></linearGradient><linearGradient id="linear-gradient-6" x1="-8653.41" y1="7245.3" x2="-8422.52" y2="7244.76" gradientTransform="matrix(1.22, 0.12, 0.12, -1.22, 10241.06, 10765.32)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#002079"/><stop offset="0.99" stop-color="#a238ff"/></linearGradient><radialGradient id="radial-gradient-2" cx="644.11" cy="599.83" fx="785.0454815336918" fy="470.6889181532662" r="793.95" gradientTransform="matrix(1, 0, 0, -1, 0, 984)" gradientUnits="userSpaceOnUse"><stop offset="0.2" stop-color="#00fdff"/><stop offset="0.26" stop-color="#0af1ff"/><stop offset="0.37" stop-color="#23d2ff"/><stop offset="0.52" stop-color="#4da0ff"/><stop offset="0.69" stop-color="#855bff"/><stop offset="0.77" stop-color="#a238ff"/><stop offset="0.81" stop-color="#a738fd"/><stop offset="0.86" stop-color="#b539f9"/><stop offset="0.9" stop-color="#cd39f1"/><stop offset="0.96" stop-color="#ee3ae6"/><stop offset="0.98" stop-color="#ff3be0"/></radialGradient><linearGradient id="linear-gradient-7" x1="-7458.97" y1="9093.17" x2="-7531.06" y2="8282.84" gradientTransform="matrix(1.23, 0, 0, -1.22, 9958.21, 11048.11)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#00ec00"/><stop offset="0.1" stop-color="#00e244"/><stop offset="0.22" stop-color="#00d694"/><stop offset="0.31" stop-color="#00cfc7"/><stop offset="0.35" stop-color="#00ccda"/><stop offset="0.42" stop-color="#0bc2dd" stop-opacity="0.92"/><stop offset="0.57" stop-color="#29a7e4" stop-opacity="0.72"/><stop offset="0.77" stop-color="#597df0" stop-opacity="0.4"/><stop offset="1" stop-color="#9448ff" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-8" x1="-8926.61" y1="7680.53" x2="-8790.14" y2="7680.53" gradientTransform="matrix(1.22, 0.12, 0.12, -1.22, 10241.06, 10765.32)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#005fe7"/><stop offset="0.46" stop-color="#0071f3" stop-opacity="0.51"/><stop offset="0.83" stop-color="#007efc" stop-opacity="0.14"/><stop offset="1" stop-color="#0083ff" stop-opacity="0"/></linearGradient><radialGradient id="radial-gradient-3" cx="-8914.62" cy="7721.05" r="165.97" gradientTransform="matrix(1.22, 0.12, 0.12, -1.22, 10241.06, 10765.32)" gradientUnits="userSpaceOnUse"><stop offset="0.63" stop-color="#ffe302" stop-opacity="0"/><stop offset="0.67" stop-color="#ffe302" stop-opacity="0.05"/><stop offset="0.75" stop-color="#ffe302" stop-opacity="0.19"/><stop offset="0.86" stop-color="#ffe302" stop-opacity="0.4"/><stop offset="0.99" stop-color="#ffe302" stop-opacity="0.7"/></radialGradient><linearGradient id="linear-gradient-9" x1="214.02" y1="2032.47" x2="96.19" y2="2284.31" gradientTransform="matrix(0.99, 0.1, 0.1, -0.99, -250.1, 2306.29)" gradientUnits="userSpaceOnUse"><stop offset="0.19" stop-color="#4a1475" stop-opacity="0.5"/><stop offset="0.62" stop-color="#2277ac" stop-opacity="0.23"/><stop offset="0.94" stop-color="#00ccda" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-10" x1="-38.44" y1="278.18" x2="55.67" y2="171.29" gradientTransform="matrix(0.99, 0.1, 0.1, -0.99, 229.04, 745.87)" gradientUnits="userSpaceOnUse"><stop offset="0.01" stop-color="#002079" stop-opacity="0.5"/><stop offset="1" stop-color="#0083ff" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-11" x1="142.45" y1="96.25" x2="142.5" y2="149.68" gradientTransform="matrix(0.99, 0.1, 0.1, -0.99, 229.04, 745.87)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#4a1475" stop-opacity="0.9"/><stop offset="0.18" stop-color="#6720a2" stop-opacity="0.6"/><stop offset="0.38" stop-color="#812acb" stop-opacity="0.34"/><stop offset="0.57" stop-color="#9332e8" stop-opacity="0.15"/><stop offset="0.76" stop-color="#9e36f9" stop-opacity="0.04"/><stop offset="0.93" stop-color="#a238ff" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-12" x1="620.52" y1="947.88" x2="926.18" y2="264.39" gradientTransform="matrix(1, 0, 0, -1, 0, 984)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#00ec00" stop-opacity="0"/><stop offset="0.28" stop-color="#00dc6d" stop-opacity="0.5"/><stop offset="0.5" stop-color="#00d1bb" stop-opacity="0.86"/><stop offset="0.6" stop-color="#00ccda"/><stop offset="0.68" stop-color="#04c9db"/><stop offset="0.75" stop-color="#0fc1df"/><stop offset="0.83" stop-color="#23b2e6"/><stop offset="0.9" stop-color="#3e9ef0"/><stop offset="0.98" stop-color="#6184fc"/><stop offset="0.99" stop-color="#6680fe"/></linearGradient><linearGradient id="linear-gradient-13" x1="680.88" y1="554.79" x2="536.1" y2="166.04" gradientTransform="matrix(1, 0, 0, -1, 0, 984)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#0083ff"/><stop offset="0.04" stop-color="#0083ff" stop-opacity="0.92"/><stop offset="0.14" stop-color="#0083ff" stop-opacity="0.71"/><stop offset="0.26" stop-color="#0083ff" stop-opacity="0.52"/><stop offset="0.37" stop-color="#0083ff" stop-opacity="0.36"/><stop offset="0.49" stop-color="#0083ff" stop-opacity="0.23"/><stop offset="0.61" stop-color="#0083ff" stop-opacity="0.13"/><stop offset="0.73" stop-color="#0083ff" stop-opacity="0.06"/><stop offset="0.86" stop-color="#0083ff" stop-opacity="0.01"/><stop offset="1" stop-color="#0083ff" stop-opacity="0"/></linearGradient></defs><title>firefox-logo-nightly</title><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><g id="Layer_2-2" data-name="Layer 2"><g id="Firefox"><path d="M770.28,91.56c-23.95,27.88-35.1,90.64-10.82,154.26s61.5,49.8,84.7,114.67c30.62,85.6,16.37,200.59,16.37,200.59s36.81,106.61,62.47-6.63C979.79,341.74,770.28,143.94,770.28,91.56Z" style="fill:url(#linear-gradient)"/><path id="_Path_" data-name=" Path " d="M476.92,972.83c245.24,0,443.9-199.74,443.9-446s-198.66-446-443.66-446S33.5,280.51,33.5,526.8C33,773.33,231.92,972.83,476.92,972.83Z" style="fill:url(#radial-gradient)"/><path d="M810.67,803.64a246.8,246.8,0,0,1-30.12,18.18,705.31,705.31,0,0,0,38.3-63c9.46-10.47,18.13-20.65,25.19-31.65,3.44-5.41,7.31-12.08,11.42-19.82,24.92-44.9,52.4-117.56,53.18-192.2v-5.66a257.25,257.25,0,0,0-5.71-55.75c.2,1.43.38,2.86.56,4.29-.22-1.1-.41-2.21-.64-3.31.37,2,.66,4,1,6,5.09,43.22,1.47,85.37-16.68,116.45-.29.45-.58.88-.87,1.32,9.41-47.23,12.56-99.39,2.09-151.6,0,0-4.19-25.38-35.38-102.44-18-44.35-49.83-80.72-78-107.21-24.69-30.55-47.11-51-59.47-64.06C689.72,126,678.9,105.61,674.45,92.31c-3.85-1.93-53.14-49.81-57.05-51.63-21.51,33.35-89.16,137.67-57,235.15,14.58,44.17,51.47,90,90.07,115.74,1.69,1.94,23,25,33.09,77.16,10.45,53.85,5,95.86-16.54,158C641.73,681.24,577,735.12,516.3,740.63c-129.67,11.78-177.15-65.11-177.15-65.11C385.49,694,436.72,690.17,467.87,671c31.4-19.43,50.39-33.83,65.81-28.15C548.86,648.43,561,632,550.1,615a78.5,78.5,0,0,0-79.4-34.57c-31.43,5.11-60.23,30-101.41,5.89a86.29,86.29,0,0,1-7.73-5.06c-2.71-1.79,8.83,2.72,6.13.69-8-4.35-22.2-13.84-25.88-17.22-.61-.56,6.22,2.18,5.61,1.62-38.51-31.71-33.7-53.13-32.49-66.57,1-10.75,8-24.52,19.75-30.11,5.69,3.11,9.24,5.48,9.24,5.48s-2.43-5-3.74-7.58c.46-.2.9-.15,1.36-.34,4.66,2.25,15,8.1,20.41,11.67,7.07,5,9.33,9.44,9.33,9.44s1.86-1,.48-5.37c-.5-1.78-2.65-7.45-9.65-13.17h.44A81.61,81.61,0,0,1,374.42,478c2-7.18,5.53-14.68,4.75-28.09-.48-9.43-.26-11.87-1.92-15.51-1.49-3.13.83-4.35,3.42-1.1a32.5,32.5,0,0,0-2.21-7.4v-.24c3.23-11.24,68.25-40.46,73-43.88A67.2,67.2,0,0,0,470.59,361c3.62-5.76,6.34-13.85,7-26.11.36-8.84-3.76-14.73-69.51-21.62-18-1.77-28.53-14.8-34.53-26.82-1.09-2.59-2.21-4.94-3.33-7.28a57.68,57.68,0,0,1-2.56-8.43c10.75-30.87,28.81-57,55.37-76.7,1.45-1.32-5.78.34-4.34-1,1.69-1.54,12.71-6,14.79-7,2.54-1.2-10.88-6.9-22.73-5.51-12.07,1.36-14.63,2.8-21.07,5.53,2.67-2.66,11.17-6.15,9.18-6.13-13,2-29.18,9.56-43,18.12a10.66,10.66,0,0,1,.83-4.35c-6.44,2.73-22.26,13.79-26.87,23.14a44.29,44.29,0,0,0,.27-5.4,84.17,84.17,0,0,0-13.19,13.82l-.24.22c-37.36-15-70.23-16-98.05-9.28-6.09-6.11-9.06-1.64-22.91-32.07-.94-1.83.72,1.81,0,0-2.28-5.9,1.39,7.87,0,0-23.28,18.37-53.92,39.19-68.63,53.89-.18.59,17.16-4.9,0,0-6,1.72-5.6,5.28-6.51,37.5-.22,2.44,0,5.18-.22,7.38-11.75,15-19.75,27.64-22.78,34.21-15.19,26.18-31.93,67-48.15,131.55A334.82,334.82,0,0,1,75.2,398.36C61.71,432.63,48.67,486.44,46.07,569.3A482.08,482.08,0,0,1,58.6,518.64,473,473,0,0,0,93.33,719.71c9.33,22.82,24.76,57.46,51,95.4C226.9,902,343.31,956,472.21,956,606.79,956,727.64,897.13,810.67,803.64Z" style="fill:url(#linear-gradient-2)"/><path d="M810.67,803.64a246.8,246.8,0,0,1-30.12,18.18,705.31,705.31,0,0,0,38.3-63c9.46-10.47,18.13-20.65,25.19-31.65,3.44-5.41,7.31-12.08,11.42-19.82,24.92-44.9,52.4-117.56,53.18-192.2v-5.66a257.25,257.25,0,0,0-5.71-55.75c.2,1.43.38,2.86.56,4.29-.22-1.1-.41-2.21-.64-3.31.37,2,.66,4,1,6,5.09,43.22,1.47,85.37-16.68,116.45-.29.45-.58.88-.87,1.32,9.41-47.23,12.56-99.39,2.09-151.6,0,0-4.19-25.38-35.38-102.44-18-44.35-49.83-80.72-78-107.21-24.69-30.55-47.11-51-59.47-64.06C689.72,126,678.9,105.61,674.45,92.31c-3.85-1.93-53.14-49.81-57.05-51.63-21.51,33.35-89.16,137.67-57,235.15,14.58,44.17,51.47,90,90.07,115.74,1.69,1.94,23,25,33.09,77.16,10.45,53.85,5,95.86-16.54,158C641.73,681.24,577,735.12,516.3,740.63c-129.67,11.78-177.15-65.11-177.15-65.11C385.49,694,436.72,690.17,467.87,671c31.4-19.43,50.39-33.83,65.81-28.15C548.86,648.43,561,632,550.1,615a78.5,78.5,0,0,0-79.4-34.57c-31.43,5.11-60.23,30-101.41,5.89a86.29,86.29,0,0,1-7.73-5.06c-2.71-1.79,8.83,2.72,6.13.69-8-4.35-22.2-13.84-25.88-17.22-.61-.56,6.22,2.18,5.61,1.62-38.51-31.71-33.7-53.13-32.49-66.57,1-10.75,8-24.52,19.75-30.11,5.69,3.11,9.24,5.48,9.24,5.48s-2.43-5-3.74-7.58c.46-.2.9-.15,1.36-.34,4.66,2.25,15,8.1,20.41,11.67,7.07,5,9.33,9.44,9.33,9.44s1.86-1,.48-5.37c-.5-1.78-2.65-7.45-9.65-13.17h.44A81.61,81.61,0,0,1,374.42,478c2-7.18,5.53-14.68,4.75-28.09-.48-9.43-.26-11.87-1.92-15.51-1.49-3.13.83-4.35,3.42-1.1a32.5,32.5,0,0,0-2.21-7.4v-.24c3.23-11.24,68.25-40.46,73-43.88A67.2,67.2,0,0,0,470.59,361c3.62-5.76,6.34-13.85,7-26.11.36-8.84-3.76-14.73-69.51-21.62-18-1.77-28.53-14.8-34.53-26.82-1.09-2.59-2.21-4.94-3.33-7.28a57.68,57.68,0,0,1-2.56-8.43c10.75-30.87,28.81-57,55.37-76.7,1.45-1.32-5.78.34-4.34-1,1.69-1.54,12.71-6,14.79-7,2.54-1.2-10.88-6.9-22.73-5.51-12.07,1.36-14.63,2.8-21.07,5.53,2.67-2.66,11.17-6.15,9.18-6.13-13,2-29.18,9.56-43,18.12a10.66,10.66,0,0,1,.83-4.35c-6.44,2.73-22.26,13.79-26.87,23.14a44.29,44.29,0,0,0,.27-5.4,84.17,84.17,0,0,0-13.19,13.82l-.24.22c-37.36-15-70.23-16-98.05-9.28-6.09-6.11-9.06-1.64-22.91-32.07-.94-1.83.72,1.81,0,0-2.28-5.9,1.39,7.87,0,0-23.28,18.37-53.92,39.19-68.63,53.89-.18.59,17.16-4.9,0,0-6,1.72-5.6,5.28-6.51,37.5-.22,2.44,0,5.18-.22,7.38-11.75,15-19.75,27.64-22.78,34.21-15.19,26.18-31.93,67-48.15,131.55A334.82,334.82,0,0,1,75.2,398.36C61.71,432.63,48.67,486.44,46.07,569.3A482.08,482.08,0,0,1,58.6,518.64,473,473,0,0,0,93.33,719.71c9.33,22.82,24.76,57.46,51,95.4C226.9,902,343.31,956,472.21,956,606.79,956,727.64,897.13,810.67,803.64Z" style="fill:url(#linear-gradient-3)"/><path d="M711.1,866.71c162.87-18.86,235-186.7,142.38-190C769.85,674,634,875.61,711.1,866.71Z" style="fill:url(#linear-gradient-4)"/><path d="M865.21,642.42C977.26,577.21,948,436.34,948,436.34s-43.25,50.24-72.62,130.32C846.4,646,797.84,681.81,865.21,642.42Z" style="fill:url(#linear-gradient-5)"/><path d="M509.47,950.06C665.7,999.91,800,876.84,717.21,835.74,642,798.68,435.32,926.49,509.47,950.06Z" style="fill:url(#linear-gradient-6)"/><path d="M638.58,21.42l.53-.57A1.7,1.7,0,0,0,638.58,21.42ZM876.85,702.23c3.8-5.36,8.94-22.53,13.48-30.21,27.58-44.52,27.78-80,27.78-80.84,16.66-83.22,15.15-117.2,4.9-180-8.25-50.6-44.32-123.09-75.57-158-32.2-36-9.51-24.25-40.69-50.52-27.33-30.29-53.82-60.29-68.25-72.36C634.22,43.09,636.57,24.58,638.58,21.42c-.34.37-.84.92-1.47,1.64C635.87,18.14,635,14,635,14s-57,57-69,152c-7.83,62,15.38,126.68,49,168a381.62,381.62,0,0,0,59,58h0c25.4,36.48,39.38,81.49,39.38,129.91,0,121.24-98.34,219.53-219.65,219.53a220.14,220.14,0,0,1-49.13-5.52c-57.24-10.92-90.3-39.8-106.78-59.41-9.45-11.23-13.46-19.42-13.46-19.42,51.28,18.37,108,14.53,142.47-4.52,34.75-19.26,55.77-33.55,72.84-27.92,16.82,5.61,30.21-10.67,18.2-27.54-11.77-16.85-42.4-41-87.88-34.29-34.79,5.07-66.66,29.76-112.24,5.84a97.34,97.34,0,0,1-8.55-5c-3-1.77,9.77,2.69,6.79.68-8.87-4.32-24.57-13.73-28.64-17.07-.68-.56,6.88,2.16,6.2,1.6-42.62-31.45-37.3-52.69-36-66,1.07-10.66,8.81-24.32,21.86-29.86,6.3,3.08,10.23,5.43,10.23,5.43s-2.69-4.92-4.14-7.51c.51-.19,1-.15,1.5-.34,5.16,2.23,16.58,8,22.59,11.57,7.83,4.95,10.32,9.36,10.32,9.36s2.06-1,.54-5.33c-.56-1.77-2.93-7.39-10.68-13.07h.48a91.65,91.65,0,0,1,13.13,8.17c2.19-7.12,6.12-14.56,5.25-27.86-.53-9.35-.28-11.78-2.12-15.39-1.65-3.1.92-4.31,3.78-1.09a29.73,29.73,0,0,0-2.44-7.34v-.24c3.57-11.14,75.53-40.12,80.77-43.51a70.24,70.24,0,0,0,21.17-20.63c4-5.72,7-13.73,7.75-25.89.25-5.48-1.44-9.82-20.5-14-11.44-2.49-29.14-4.91-56.43-7.47-19.9-1.76-31.58-14.68-38.21-26.6-1.21-2.57-2.45-4.9-3.68-7.22a53.41,53.41,0,0,1-2.83-8.36,158.47,158.47,0,0,1,61.28-76.06c1.6-1.31-6.4.33-4.8-1,1.87-1.52,14.06-5.93,16.37-6.92,2.81-1.19-12-6.84-25.16-5.47-13.36,1.35-16.19,2.78-23.32,5.49,3-2.64,12.37-6.1,10.16-6.08-14.4,2-32.3,9.48-47.6,18a9.72,9.72,0,0,1,.92-4.31c-7.13,2.71-24.64,13.67-29.73,23a39.79,39.79,0,0,0,.29-5.35,88.55,88.55,0,0,0-14.6,13.7l-.27.22C258.14,196,221.75,195,191,201.72c-6.74-6.06-17.57-15.23-32.89-45.4-1-1.82-1.6,3.75-2.4,2-6-13.81-9.55-36.44-9-52,0,0-12.32,5.61-22.51,29.06-1.89,4.21-3.11,6.54-4.32,8.87-.56.68,1.27-7.7,1-7.24-1.77,3-6.36,7.19-8.37,12.62-1.38,4-3.32,6.27-4.56,11.29l-.29.46c-.1-1.48.37-6.08,0-5.14A235.4,235.4,0,0,0,95.34,186c-5.49,18-11.88,42.61-12.89,74.57-.24,2.42,0,5.14-.25,7.32-13,14.83-21.86,27.39-25.2,33.91-16.81,26-35.33,66.44-53.29,130.46a319.35,319.35,0,0,1,28.54-50C17.32,416.25,2.89,469.62,0,551.8a436.92,436.92,0,0,1,13.87-50.24C11.29,556.36,17.68,624.3,52.32,701c20.57,45,67.92,136.6,183.62,208h0s39.36,29.3,107,51.26c5,1.81,10.06,3.6,15.23,5.33q-2.43-1-4.71-2A484.9,484.9,0,0,0,492.27,984c175.18.15,226.85-70.2,226.85-70.2l-.51.38q3.71-3.49,7.14-7.26c-27.64,26.08-90.75,27.84-114.3,26,40.22-11.81,66.69-21.81,118.17-41.52q9-3.36,18.48-7.64l2-.94c1.25-.58,2.49-1.13,3.75-1.74a349.3,349.3,0,0,0,70.26-44c51.7-41.3,63-81.56,68.83-108.1-.82,2.54-3.37,8.47-5.17,12.32-13.31,28.48-42.84,46-74.91,61a689.05,689.05,0,0,0,42.38-62.44C865.77,729.39,869,713.15,876.85,702.23Z" style="fill:url(#radial-gradient-2)"/><path d="M813.92,801c21.08-23.24,40-49.82,54.35-80,36.9-77.58,94-206.58,49-341.31C881.77,273.22,833,215,771.11,158.12,670.56,65.76,642.48,24.52,642.48,0c0,0-116.09,129.41-65.74,264.38s153.46,130,221.68,270.87c80.27,165.74-64.95,346.61-185,397.24,7.35-1.63,267-60.38,280.61-208.88C893.68,726.34,887.83,767.41,813.92,801Z" style="fill:url(#linear-gradient-7)"/><path d="M477.59,319.37c.39-8.77-4.16-14.66-76.68-21.46-29.84-2.76-41.26-30.33-44.75-41.94-10.61,27.56-15,56.49-12.64,91.48,1.61,22.92,17,47.52,24.37,62,0,0,1.64-2.13,2.39-2.91,13.86-14.43,71.94-36.42,77.39-39.54C453.69,363.16,476.58,346.44,477.59,319.37Z" style="fill:url(#linear-gradient-8)"/><path d="M477.59,319.37c.39-8.77-4.16-14.66-76.68-21.46-29.84-2.76-41.26-30.33-44.75-41.94-10.61,27.56-15,56.49-12.64,91.48,1.61,22.92,17,47.52,24.37,62,0,0,1.64-2.13,2.39-2.91,13.86-14.43,71.94-36.42,77.39-39.54C453.69,363.16,476.58,346.44,477.59,319.37Z" style="opacity:0.5;isolation:isolate;fill:url(#radial-gradient-3)"/><path d="M158.31,156.47c-1-1.82-1.6,3.75-2.4,2-6-13.81-9.58-36.2-8.72-52,0,0-12.32,5.61-22.51,29.06-1.89,4.21-3.11,6.54-4.32,8.86-.56.68,1.27-7.7,1-7.24-1.77,3-6.36,7.19-8.35,12.38-1.65,4.24-3.35,6.52-4.61,11.77-.39,1.43.39-6.32,0-5.38C84.72,201.68,80.19,271,82.69,268,133.17,214.14,191,201.36,191,201.36c-6.15-4.53-19.53-17.63-32.7-44.89Z" style="fill:url(#linear-gradient-9)"/><path d="M349.84,720.1c-69.72-29.77-149-71.75-146-167.14C207.92,427.35,321,452.18,321,452.18c-4.27,1-15.68,9.16-19.72,17.82-4.27,10.83-12.07,35.28,11.55,60.9,37.09,40.19-76.2,95.36,98.66,199.57,4.41,2.4-41-1.43-61.64-10.36Z" style="fill:url(#linear-gradient-10)"/><path d="M325.07,657.5c49.44,17.21,107,14.19,141.52-4.86,23.09-12.85,52.7-33.43,70.92-28.35-15.78-6.24-27.73-9.15-42.1-9.86-2.45,0-5.38,0-8-.32a136,136,0,0,0-15.76.86c-8.9.82-18.77,6.43-27.74,5.53-.48,0,8.7-3.77,8-3.61-4.75,1-9.92,1.21-15.37,1.88-3.47.39-6.45.82-9.89,1-103,8.73-190-55.81-190-55.81-7.41,25,33.17,74.3,88.52,93.57Z" style="opacity:0.5;isolation:isolate;fill:url(#linear-gradient-11)"/><path d="M813.74,801.65c104.16-102.27,156.86-226.58,134.58-366,0,0,8.9,71.5-24.85,144.63,16.21-71.39,18.1-160.11-25-252C841,205.64,746.45,141.11,710.35,114.19,655.66,73.4,633,31.87,632.57,23.3c-16.34,33.48-65.77,148.2-5.31,247,56.64,92.56,145.86,120,208.33,205C950.67,631.67,813.74,801.65,813.74,801.65Z" style="fill:url(#linear-gradient-12)"/><path d="M798.81,535.55C762.41,460.35,717,427.55,674,392c5,7,6.23,9.47,9,14,37.83,40.32,93.61,138.66,53.11,262.11C659.88,900.48,355,791.06,323,760.32,335.93,894.81,561,959.16,707.6,872,791,793,858.47,658.79,798.81,535.55Z" style="fill:url(#linear-gradient-13)"/></g></g></g></g></svg>
new file mode 100644
--- /dev/null
+++ b/devtools/client/themes/images/aboutdebugging-firefox-release.svg
@@ -0,0 +1,4 @@
+<!-- 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/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 953.37 984"><defs><radialGradient id="radial-gradient" cx="-14491.11" cy="9293.72" fx="-14519.875714136173" r="450.88" gradientTransform="matrix(0.76, 0.03, 0.05, -1.12, 11485.79, 11147.95)" gradientUnits="userSpaceOnUse"><stop offset="0.1" stop-color="#ffea00"/><stop offset="0.17" stop-color="#ffde00"/><stop offset="0.28" stop-color="#ffbf00"/><stop offset="0.43" stop-color="#ff8e00"/><stop offset="0.77" stop-color="#ff272d"/><stop offset="0.87" stop-color="#e0255a"/><stop offset="0.95" stop-color="#cc2477"/><stop offset="1" stop-color="#c42482"/></radialGradient><radialGradient id="radial-gradient-2" cx="-7587.48" cy="8863.48" r="791.23" gradientTransform="matrix(1.23, 0, 0, -1.23, 9957.91, 11055.45)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#00ccda"/><stop offset="0.22" stop-color="#0083ff"/><stop offset="0.26" stop-color="#007af9"/><stop offset="0.33" stop-color="#0060e8"/><stop offset="0.33" stop-color="#005fe7"/><stop offset="0.44" stop-color="#2639ad"/><stop offset="0.52" stop-color="#401e84"/><stop offset="0.57" stop-color="#4a1475"/></radialGradient><linearGradient id="linear-gradient" x1="540.64" y1="254.8" x2="349.2" y2="881.03" gradientTransform="matrix(1, 0, 0, -1, 0, 984)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#000f43" stop-opacity="0.4"/><stop offset="0.48" stop-color="#001962" stop-opacity="0.17"/><stop offset="1" stop-color="#002079" stop-opacity="0"/></linearGradient><radialGradient id="radial-gradient-3" cx="-8337.74" cy="7467.89" r="266.89" gradientTransform="matrix(1.22, 0.12, 0.12, -1.22, 10240.78, 10765.16)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ffea00"/><stop offset="0.5" stop-color="#ff272d"/><stop offset="1" stop-color="#c42482"/></radialGradient><radialGradient id="radial-gradient-4" cx="-8361.89" cy="7723.8" r="445.68" gradientTransform="matrix(1.22, 0.12, 0.12, -1.22, 10240.78, 10765.16)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ffe900"/><stop offset="0.16" stop-color="#ffaf0e"/><stop offset="0.32" stop-color="#ff7a1b"/><stop offset="0.47" stop-color="#ff4e26"/><stop offset="0.62" stop-color="#ff2c2e"/><stop offset="0.76" stop-color="#ff1434"/><stop offset="0.89" stop-color="#ff0538"/><stop offset="1" stop-color="#ff0039"/></radialGradient><radialGradient id="radial-gradient-5" cx="-8298.85" cy="7310.66" r="408.96" gradientTransform="matrix(1.22, 0.12, 0.12, -1.22, 10240.78, 10765.16)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ff272d"/><stop offset="0.5" stop-color="#c42482"/><stop offset="0.99" stop-color="#620700"/></radialGradient><radialGradient id="radial-gradient-6" cx="715.19" cy="589.96" fx="743.1665035759834" fy="576.1323859732546" r="782.18" gradientTransform="matrix(1, 0, 0, -1, 0, 984)" gradientUnits="userSpaceOnUse"><stop offset="0.16" stop-color="#ffea00"/><stop offset="0.23" stop-color="#ffde00"/><stop offset="0.37" stop-color="#ffbf00"/><stop offset="0.54" stop-color="#ff8e00"/><stop offset="0.76" stop-color="#ff272d"/><stop offset="0.8" stop-color="#f92433"/><stop offset="0.84" stop-color="#e91c45"/><stop offset="0.89" stop-color="#cf0e62"/><stop offset="0.94" stop-color="#b5007f"/></radialGradient><radialGradient id="radial-gradient-7" cx="670.34" cy="952.71" r="891.45" gradientTransform="matrix(1, 0, 0, -1, 0, 984)" gradientUnits="userSpaceOnUse"><stop offset="0.28" stop-color="#ffea00"/><stop offset="0.4" stop-color="#fd0"/><stop offset="0.63" stop-color="#ffba00"/><stop offset="0.86" stop-color="#ff9100"/><stop offset="0.93" stop-color="#ff6711"/><stop offset="0.99" stop-color="#ff4a1d"/></radialGradient><linearGradient id="linear-gradient-2" x1="-9023.45" y1="7636.92" x2="-8716.42" y2="7715.18" gradientTransform="matrix(1.22, 0.12, 0.12, -1.22, 10240.78, 10765.16)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#c42482" stop-opacity="0.5"/><stop offset="0.47" stop-color="#ff272d" stop-opacity="0.5"/><stop offset="0.49" stop-color="#ff2c2c" stop-opacity="0.51"/><stop offset="0.68" stop-color="#ff7a1a" stop-opacity="0.72"/><stop offset="0.83" stop-color="#ffb20d" stop-opacity="0.87"/><stop offset="0.94" stop-color="#ffd605" stop-opacity="0.96"/><stop offset="1" stop-color="#ffe302"/></linearGradient><linearGradient id="linear-gradient-3" x1="188.87" y1="2081.23" x2="134.3" y2="2221.08" gradientTransform="matrix(0.99, 0.1, 0.1, -0.99, -250.09, 2306.15)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#891551" stop-opacity="0.6"/><stop offset="1" stop-color="#c42482" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-4" x1="-38.43" y1="278.04" x2="55.68" y2="171.16" gradientTransform="matrix(0.99, 0.1, 0.1, -0.99, 229.04, 745.74)" gradientUnits="userSpaceOnUse"><stop offset="0.01" stop-color="#891551" stop-opacity="0.5"/><stop offset="0.48" stop-color="#ff272d" stop-opacity="0.5"/><stop offset="1" stop-color="#ff272d" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-5" x1="142.46" y1="93.68" x2="142.53" y2="168.46" gradientTransform="matrix(0.99, 0.1, 0.1, -0.99, 229.04, 745.74)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#c42482"/><stop offset="0.08" stop-color="#c42482" stop-opacity="0.81"/><stop offset="0.21" stop-color="#c42482" stop-opacity="0.57"/><stop offset="0.33" stop-color="#c42482" stop-opacity="0.36"/><stop offset="0.45" stop-color="#c42482" stop-opacity="0.2"/><stop offset="0.56" stop-color="#c42482" stop-opacity="0.09"/><stop offset="0.67" stop-color="#c42482" stop-opacity="0.02"/><stop offset="0.77" stop-color="#c42482" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-6" x1="620.52" y1="947.88" x2="926.18" y2="264.39" gradientTransform="matrix(1, 0, 0, -1, 0, 984)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#fff14f"/><stop offset="0.27" stop-color="#ffee4c"/><stop offset="0.45" stop-color="#ffe643"/><stop offset="0.61" stop-color="#ffd834"/><stop offset="0.76" stop-color="#ffc41e"/><stop offset="0.89" stop-color="#ffab02"/><stop offset="0.9" stop-color="#ffa900"/><stop offset="0.95" stop-color="#ffa000"/><stop offset="1" stop-color="#ff9100"/></linearGradient><linearGradient id="linear-gradient-7" x1="680.88" y1="554.79" x2="536.1" y2="166.04" gradientTransform="matrix(1, 0, 0, -1, 0, 984)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ff8e00"/><stop offset="0.04" stop-color="#ff8e00" stop-opacity="0.86"/><stop offset="0.08" stop-color="#ff8e00" stop-opacity="0.73"/><stop offset="0.13" stop-color="#ff8e00" stop-opacity="0.63"/><stop offset="0.18" stop-color="#ff8e00" stop-opacity="0.56"/><stop offset="0.23" stop-color="#ff8e00" stop-opacity="0.51"/><stop offset="0.28" stop-color="#ff8e00" stop-opacity="0.5"/><stop offset="0.39" stop-color="#ff8e00" stop-opacity="0.48"/><stop offset="0.52" stop-color="#ff8e00" stop-opacity="0.42"/><stop offset="0.68" stop-color="#ff8e00" stop-opacity="0.31"/><stop offset="0.84" stop-color="#ff8e00" stop-opacity="0.17"/><stop offset="1" stop-color="#ff8e00" stop-opacity="0"/></linearGradient></defs><title>firefox-logo</title><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><g id="Layer_2-2" data-name="Layer 2"><g id="Firefox_-_Large" data-name="Firefox - Large"><path d="M770.28,91.56c-23.95,27.88-35.1,90.64-10.82,154.26s61.5,49.8,84.7,114.67c30.62,85.6,16.37,200.59,16.37,200.59s36.81,106.61,62.47-6.63C979.79,341.74,770.28,143.94,770.28,91.56Z" style="fill:url(#radial-gradient)"/><path id="_Path_" data-name=" Path " d="M478.07,974.64c245.24,0,443.9-199.74,443.9-446s-198.66-446-443.66-446S34.65,282.32,34.65,528.61C34.18,775.14,233.07,974.64,478.07,974.64Z" style="fill:url(#radial-gradient-2)"/><path d="M810.67,803.64a246.8,246.8,0,0,1-30.12,18.18,705.31,705.31,0,0,0,38.3-63c9.46-10.47,18.13-20.65,25.19-31.65,3.44-5.41,7.31-12.08,11.42-19.82,24.92-44.9,52.4-117.56,53.18-192.2v-5.66a257.25,257.25,0,0,0-5.71-55.75c.2,1.43.38,2.86.56,4.29-.22-1.1-.41-2.21-.64-3.31.37,2,.66,4,1,6,5.09,43.22,1.47,85.37-16.68,116.45-.29.45-.58.88-.87,1.32,9.41-47.23,12.56-99.39,2.09-151.6,0,0-4.19-25.38-35.38-102.44-18-44.35-49.83-80.72-78-107.21-24.69-30.55-47.11-51-59.47-64.06C689.72,126,678.9,105.61,674.45,92.31c-3.85-1.93-53.14-49.81-57.05-51.63-21.51,33.35-89.16,137.67-57,235.15,14.58,44.17,51.47,90,90.07,115.74,1.69,1.94,23,25,33.09,77.16,10.45,53.85,5,95.86-16.54,158C641.73,681.24,577,735.12,516.3,740.63c-129.67,11.78-177.15-65.11-177.15-65.11C385.49,694,436.72,690.17,467.87,671c31.4-19.43,50.39-33.83,65.81-28.15C548.86,648.43,561,632,550.1,615a78.5,78.5,0,0,0-79.4-34.57c-31.43,5.11-60.23,30-101.41,5.89a86.29,86.29,0,0,1-7.73-5.06c-2.71-1.79,8.83,2.72,6.13.69-8-4.35-22.2-13.84-25.88-17.22-.61-.56,6.22,2.18,5.61,1.62-38.51-31.71-33.7-53.13-32.49-66.57,1-10.75,8-24.52,19.75-30.11,5.69,3.11,9.24,5.48,9.24,5.48s-2.43-5-3.74-7.58c.46-.2.9-.15,1.36-.34,4.66,2.25,15,8.1,20.41,11.67,7.07,5,9.33,9.44,9.33,9.44s1.86-1,.48-5.37c-.5-1.78-2.65-7.45-9.65-13.17h.44A81.61,81.61,0,0,1,374.42,478c2-7.18,5.53-14.68,4.75-28.09-.48-9.43-.26-11.87-1.92-15.51-1.49-3.13.83-4.35,3.42-1.1a32.5,32.5,0,0,0-2.21-7.4v-.24c3.23-11.24,68.25-40.46,73-43.88A67.2,67.2,0,0,0,470.59,361c3.62-5.76,6.34-13.85,7-26.11.36-8.84-3.76-14.73-69.51-21.62-18-1.77-28.53-14.8-34.53-26.82-1.09-2.59-2.21-4.94-3.33-7.28a57.68,57.68,0,0,1-2.56-8.43c10.75-30.87,28.81-57,55.37-76.7,1.45-1.32-5.78.34-4.34-1,1.69-1.54,12.71-6,14.79-7,2.54-1.2-10.88-6.9-22.73-5.51-12.07,1.36-14.63,2.8-21.07,5.53,2.67-2.66,11.17-6.15,9.18-6.13-13,2-29.18,9.56-43,18.12a10.66,10.66,0,0,1,.83-4.35c-6.44,2.73-22.26,13.79-26.87,23.14a44.29,44.29,0,0,0,.27-5.4,84.17,84.17,0,0,0-13.19,13.82l-.24.22c-37.36-15-70.23-16-98.05-9.28-6.09-6.11-9.06-1.64-22.91-32.07-.94-1.83.72,1.81,0,0-2.28-5.9,1.39,7.87,0,0-23.28,18.37-53.92,39.19-68.63,53.89-.18.59,17.16-4.9,0,0-6,1.72-5.6,5.28-6.51,37.5-.22,2.44,0,5.18-.22,7.38-11.75,15-19.75,27.64-22.78,34.21-15.19,26.18-31.93,67-48.15,131.55A334.82,334.82,0,0,1,75.2,398.36C61.71,432.63,48.67,486.44,46.07,569.3A482.08,482.08,0,0,1,58.6,518.64,473,473,0,0,0,93.33,719.71c9.33,22.82,24.76,57.46,51,95.4C226.9,902,343.31,956,472.21,956,606.79,956,727.64,897.13,810.67,803.64Z" style="fill:url(#linear-gradient)"/><path d="M711.1,866.71c162.87-18.86,235-186.7,142.38-190C769.85,674,634,875.61,711.1,866.71Z" style="fill:url(#radial-gradient-3)"/><path d="M865.21,642.42C977.26,577.21,948,436.34,948,436.34s-43.25,50.24-72.62,130.32C846.4,646,797.84,681.81,865.21,642.42Z" style="fill:url(#radial-gradient-4)"/><path d="M509.47,950.06C665.7,999.91,800,876.84,717.21,835.74,642,798.68,435.32,926.49,509.47,950.06Z" style="fill:url(#radial-gradient-5)"/><path d="M876.85,702.23c3.8-5.36,8.94-22.53,13.48-30.21,27.58-44.52,27.78-80,27.78-80.84,16.66-83.22,15.15-117.2,4.9-180-8.25-50.6-44.32-123.09-75.57-158-32.2-36-9.51-24.25-40.69-50.52-27.33-30.29-53.82-60.29-68.25-72.36C634.22,43.09,636.57,24.58,638.58,21.42c-.34.37-.84.92-1.47,1.64C635.87,18.14,635,14,635,14s-57,57-69,152c-7.83,62,15.38,126.68,49,168a381.62,381.62,0,0,0,59,58h0c25.4,36.48,39.38,81.49,39.38,129.91,0,121.24-98.34,219.53-219.65,219.53a220.14,220.14,0,0,1-49.13-5.52c-57.24-10.92-90.3-39.8-106.78-59.41-9.45-11.23-13.46-19.42-13.46-19.42,51.28,18.37,108,14.53,142.47-4.52,34.75-19.26,55.77-33.55,72.84-27.92,16.82,5.61,30.21-10.67,18.2-27.54-11.77-16.85-42.4-41-87.88-34.29-34.79,5.07-66.66,29.76-112.24,5.84a97.34,97.34,0,0,1-8.55-5c-3-1.77,9.77,2.69,6.79.68-8.87-4.32-24.57-13.73-28.64-17.07-.68-.56,6.88,2.16,6.2,1.6-42.62-31.45-37.3-52.69-36-66,1.07-10.66,8.81-24.32,21.86-29.86,6.3,3.08,10.23,5.43,10.23,5.43s-2.69-4.92-4.14-7.51c.51-.19,1-.15,1.5-.34,5.16,2.23,16.58,8,22.59,11.57,7.83,4.95,10.32,9.36,10.32,9.36s2.06-1,.54-5.33c-.56-1.77-2.93-7.39-10.68-13.07h.48a91.65,91.65,0,0,1,13.13,8.17c2.19-7.12,6.12-14.56,5.25-27.86-.53-9.35-.28-11.78-2.12-15.39-1.65-3.1.92-4.31,3.78-1.09a29.73,29.73,0,0,0-2.44-7.34v-.24c3.57-11.14,75.53-40.12,80.77-43.51a70.24,70.24,0,0,0,21.17-20.63c4-5.72,7-13.73,7.75-25.89.25-5.48-1.44-9.82-20.5-14-11.44-2.49-29.14-4.91-56.43-7.47-19.9-1.76-31.58-14.68-38.21-26.6-1.21-2.57-2.45-4.9-3.68-7.22a53.41,53.41,0,0,1-2.83-8.36,158.47,158.47,0,0,1,61.28-76.06c1.6-1.31-6.4.33-4.8-1,1.87-1.52,14.06-5.93,16.37-6.92,2.81-1.19-12-6.84-25.16-5.47-13.36,1.35-16.19,2.78-23.32,5.49,3-2.64,12.37-6.1,10.16-6.08-14.4,2-32.3,9.48-47.6,18a9.72,9.72,0,0,1,.92-4.31c-7.13,2.71-24.64,13.67-29.73,23a39.79,39.79,0,0,0,.29-5.35,88.55,88.55,0,0,0-14.6,13.7l-.27.22C258.14,196,221.75,195,191,201.72c-6.74-6.06-17.57-15.23-32.89-45.4-1-1.82-1.6,3.75-2.4,2-6-13.81-9.55-36.44-9-52,0,0-12.32,5.61-22.51,29.06-1.89,4.21-3.11,6.54-4.32,8.87-.56.68,1.27-7.7,1-7.24-1.77,3-6.36,7.19-8.37,12.62-1.38,4-3.32,6.27-4.56,11.29l-.29.46c-.1-1.48.37-6.08,0-5.14A235.4,235.4,0,0,0,95.34,186c-5.49,18-11.88,42.61-12.89,74.57-.24,2.42,0,5.14-.25,7.32-13,14.83-21.86,27.39-25.2,33.91-16.81,26-35.33,66.44-53.29,130.46a319.35,319.35,0,0,1,28.54-50C17.32,416.25,2.89,469.62,0,551.8a436.92,436.92,0,0,1,13.87-50.24C11.29,556.36,17.68,624.3,52.32,701c20.57,45,67.92,136.6,183.62,208h0s39.36,29.3,107,51.26c5,1.81,10.06,3.6,15.23,5.33q-2.43-1-4.71-2A484.9,484.9,0,0,0,492.27,984c175.18.15,226.85-70.2,226.85-70.2l-.51.38q3.71-3.49,7.14-7.26c-27.64,26.08-90.75,27.84-114.3,26,40.22-11.81,66.69-21.81,118.17-41.52q9-3.36,18.48-7.64l2-.94c1.25-.58,2.49-1.13,3.75-1.74a349.3,349.3,0,0,0,70.26-44c51.7-41.3,63-81.56,68.83-108.1-.82,2.54-3.37,8.47-5.17,12.32-13.31,28.48-42.84,46-74.91,61a689.05,689.05,0,0,0,42.38-62.44C865.77,729.39,869,713.15,876.85,702.23Z" style="fill:url(#radial-gradient-6)"/><path d="M813.92,801c21.08-23.24,40-49.82,54.35-80,36.9-77.58,94-206.58,49-341.31C881.77,273.22,833,215,771.11,158.12,670.56,65.76,642.48,24.52,642.48,0c0,0-116.09,129.41-65.74,264.38s153.46,130,221.68,270.87c80.27,165.74-64.95,346.61-185,397.24,7.35-1.63,267-60.38,280.61-208.88C893.68,726.34,887.83,767.41,813.92,801Z" style="fill:url(#radial-gradient-7)"/><path d="M477.59,319.37c.39-8.77-4.16-14.66-76.68-21.46-29.84-2.76-41.26-30.33-44.75-41.94-10.61,27.56-15,56.49-12.64,91.48,1.61,22.92,17,47.52,24.37,62,0,0,1.64-2.13,2.39-2.91,13.86-14.43,71.94-36.42,77.39-39.54C453.69,363.16,476.58,346.44,477.59,319.37Z" style="fill:url(#linear-gradient-2)"/><path d="M158.31,156.47c-1-1.82-1.6,3.75-2.4,2-6-13.81-9.58-36.2-8.72-52,0,0-12.32,5.61-22.51,29.06-1.89,4.21-3.11,6.54-4.32,8.86-.56.68,1.27-7.7,1-7.24-1.77,3-6.36,7.19-8.35,12.38-1.65,4.24-3.35,6.52-4.61,11.77-.39,1.43.39-6.32,0-5.38C84.72,201.68,80.19,271,82.69,268,133.17,214.14,191,201.36,191,201.36c-6.15-4.53-19.53-17.63-32.7-44.89Z" style="fill:url(#linear-gradient-3)"/><path d="M349.84,720.1c-69.72-29.77-149-71.75-146-167.14C207.92,427.35,321,452.18,321,452.18c-4.27,1-15.68,9.16-19.72,17.82-4.27,10.83-12.07,35.28,11.55,60.9,37.09,40.19-76.2,95.36,98.66,199.57,4.41,2.4-41-1.43-61.64-10.36Z" style="fill:url(#linear-gradient-4)"/><path d="M325.07,657.5c49.44,17.21,107,14.19,141.52-4.86,23.09-12.85,52.7-33.43,70.92-28.35-15.78-6.24-27.73-9.15-42.1-9.86-2.45,0-5.38,0-8-.32a136,136,0,0,0-15.76.86c-8.9.82-18.77,6.43-27.74,5.53-.48,0,8.7-3.77,8-3.61-4.75,1-9.92,1.21-15.37,1.88-3.47.39-6.45.82-9.89,1-103,8.73-190-55.81-190-55.81-7.41,25,33.17,74.3,88.52,93.57Z" style="fill:url(#linear-gradient-5)"/><path d="M813.74,801.65c104.16-102.27,156.86-226.58,134.58-366,0,0,8.9,71.5-24.85,144.63,16.21-71.39,18.1-160.11-25-252C841,205.64,746.45,141.11,710.35,114.19,655.66,73.4,633,31.87,632.57,23.3c-16.34,33.48-65.77,148.2-5.31,247,56.64,92.56,145.86,120,208.33,205C950.67,631.67,813.74,801.65,813.74,801.65Z" style="fill:url(#linear-gradient-6)"/><path d="M798.81,535.55C762.41,460.35,717,427.55,674,392c5,7,6.23,9.47,9,14,37.83,40.32,93.61,138.66,53.11,262.11C659.88,900.48,355,791.06,323,760.32,335.93,894.81,561,959.16,707.6,872,791,793,858.47,658.79,798.81,535.55Z" style="fill:url(#linear-gradient-7)"/></g></g></g></g></svg>
--- a/gfx/layers/AnimationHelper.cpp
+++ b/gfx/layers/AnimationHelper.cpp
@@ -549,25 +549,36 @@ ToAnimationValue(const Animatable& aAnim
 void
 AnimationHelper::SetAnimations(
   AnimationArray& aAnimations,
   InfallibleTArray<AnimData>& aAnimData,
   RefPtr<RawServoAnimationValue>& aBaseAnimationStyle)
 {
   for (uint32_t i = 0; i < aAnimations.Length(); i++) {
     Animation& animation = aAnimations[i];
-    // Adjust fill mode to fill forwards so that if the main thread is delayed
-    // in clearing this animation we don't introduce flicker by jumping back to
-    // the old underlying value
+    // Adjust fill mode so that if the main thread is delayed in clearing
+    // this animation we don't introduce flicker by jumping back to the old
+    // underlying value.
     switch (static_cast<dom::FillMode>(animation.fillMode())) {
       case dom::FillMode::None:
-        animation.fillMode() = static_cast<uint8_t>(dom::FillMode::Forwards);
+        if (animation.playbackRate() > 0) {
+          animation.fillMode() = static_cast<uint8_t>(dom::FillMode::Forwards);
+        } else if (animation.playbackRate() < 0) {
+          animation.fillMode() = static_cast<uint8_t>(dom::FillMode::Backwards);
+        }
         break;
       case dom::FillMode::Backwards:
-        animation.fillMode() = static_cast<uint8_t>(dom::FillMode::Both);
+        if (animation.playbackRate() > 0) {
+          animation.fillMode() = static_cast<uint8_t>(dom::FillMode::Both);
+        }
+        break;
+      case dom::FillMode::Forwards:
+        if (animation.playbackRate() < 0) {
+          animation.fillMode() = static_cast<uint8_t>(dom::FillMode::Both);
+        }
         break;
       default:
         break;
     }
 
     if (animation.baseStyle().type() != Animatable::Tnull_t) {
       aBaseAnimationStyle = ToAnimationValue(animation.baseStyle());
     }
--- a/gfx/webrender_bindings/RenderCompositorANGLE.cpp
+++ b/gfx/webrender_bindings/RenderCompositorANGLE.cpp
@@ -106,17 +106,20 @@ RenderCompositorANGLE::Initialize()
     gfxCriticalNote << "Waiting for handling device reset";
     return false;
   }
 
   // Update device if necessary.
   if (!SutdownEGLLibraryIfNecessary()) {
     return false;
   }
-  RenderThread::Get()->SharedGL();
+  if (!RenderThread::Get()->SharedGL()) {
+    gfxCriticalNote << "[WR] failed to get shared GL context.";
+    return false;
+  }
 
   mDevice = GetDeviceOfEGLDisplay();
 
   if (!mDevice) {
     gfxCriticalNote << "[WR] failed to get compositor device.";
     return false;
   }
 
--- a/gfx/webrender_bindings/src/bindings.rs
+++ b/gfx/webrender_bindings/src/bindings.rs
@@ -2548,19 +2548,19 @@ pub unsafe extern "C" fn wr_dec_ref_arc(
 // Update for the new blob image interface changes.
 //
 extern "C" {
      // TODO: figure out the API for tiled blob images.
      pub fn wr_moz2d_render_cb(blob: ByteSlice,
                                width: u32,
                                height: u32,
                                format: ImageFormat,
-                               tile_size: *const u16,
-                               tile_offset: *const TileOffset,
-                               dirty_rect: *const DeviceUintRect,
+                               tile_size: Option<&u16>,
+                               tile_offset: Option<&TileOffset>,
+                               dirty_rect: Option<&DeviceUintRect>,
                                output: MutByteSlice)
                                -> bool;
 }
 
 #[no_mangle]
 pub extern "C" fn wr_root_scroll_node_id() -> usize {
     // The PipelineId doesn't matter here, since we just want the numeric part of the id
     // produced for any given root reference frame.
--- a/gfx/webrender_bindings/src/moz2d_renderer.rs
+++ b/gfx/webrender_bindings/src/moz2d_renderer.rs
@@ -1,8 +1,16 @@
+#![deny(missing_docs)]
+
+//! Provides the webrender-side implementation of gecko blob images.
+//!
+//! Pretty much this is just a shim that calls back into Moz2DImageRenderer, but
+//! it also handles merging "partial" blob images (see `merge_blob_images`) and
+//! registering fonts found in the blob (see `prepare_request`).
+
 use webrender::api::*;
 use bindings::{ByteSlice, MutByteSlice, wr_moz2d_render_cb, ArcVecU8};
 use rayon::ThreadPool;
 use rayon::prelude::*;
 
 use std::collections::hash_map::HashMap;
 use std::collections::hash_map;
 use std::collections::btree_map::BTreeMap;
@@ -17,294 +25,366 @@ use std;
 use dwrote;
 
 #[cfg(target_os = "macos")]
 use foreign_types::ForeignType;
 
 #[cfg(not(any(target_os = "macos", target_os = "windows")))]
 use std::ffi::CString;
 
+/// Local print-debugging utility
 macro_rules! dlog {
     ($($e:expr),*) => { {$(let _ = $e;)*} }
     //($($t:tt)*) => { println!($($t)*) }
 }
 
-pub struct Moz2dBlobImageHandler {
-    workers: Arc<ThreadPool>,
-    blob_commands: HashMap<ImageKey, (Arc<BlobImageData>, Option<TileSize>)>,
-}
-
-fn option_to_nullable<T>(option: &Option<T>) -> *const T {
-    match option {
-        &Some(ref x) => { x as *const T }
-        &None => { ptr::null() }
+/// Debug prints a blob's item bounds, indicating whether the bounds are dirty or not.
+fn dump_bounds(blob: &[u8], dirty_rect: Box2d) {
+    let mut index = BlobReader::new(blob);
+    while index.reader.has_more() {
+        let e = index.read_entry();
+        dlog!("  {:?} {}", e.bounds,
+                 if e.bounds.contained_by(&dirty_rect) {
+                    "*"
+                 } else {
+                    ""
+                 }
+        );
     }
 }
 
-fn to_usize(slice: &[u8]) -> usize {
-    convert_from_bytes(slice)
+/// Debug prints a blob's metadata.
+fn dump_index(blob: &[u8]) -> () {
+    let mut index = BlobReader::new(blob);
+    // we might get an empty result here because sub groups are not tightly bound
+    // and we'll sometimes have display items that end up with empty bounds in
+    // the blob image.
+    while index.reader.has_more() {
+        let e = index.read_entry();
+        dlog!("result bounds: {} {} {:?}", e.end, e.extra_end, e.bounds);
+    }
 }
 
-fn convert_from_bytes<T>(slice: &[u8]) -> T {
-    assert!(mem::size_of::<T>() <= slice.len());
-    let mut ret: T;
-    unsafe {
-        ret = mem::uninitialized();
-        ptr::copy_nonoverlapping(slice.as_ptr(),
-                                 &mut ret as *mut T as *mut u8,
-                                 mem::size_of::<T>());
-    }
-    ret
+
+
+/// Handles the interpretation and rasterization of gecko-based (moz2d) WR blob images.
+pub struct Moz2dBlobImageHandler {
+    workers: Arc<ThreadPool>,
+    blob_commands: HashMap<ImageKey, BlobCommand>,
 }
 
-use std::slice;
+/// Transmute some bytes into a value.
+///
+/// Wow this is dangerous if non-POD values are read!
+/// FIXME: kill this with fire and/or do a super robust security audit
+unsafe fn convert_from_bytes<T>(slice: &[u8]) -> T {
+    assert!(mem::size_of::<T>() <= slice.len());
+    ptr::read(slice.as_ptr() as *const T)
+}
 
+/// Transmute a value into some bytes.
 fn convert_to_bytes<T>(x: &T) -> &[u8] {
     unsafe {
         let ip: *const T = x;
         let bp: *const u8 = ip as * const _;
-        slice::from_raw_parts(bp, mem::size_of::<T>())
+        ::std::slice::from_raw_parts(bp, mem::size_of::<T>())
     }
 }
 
-
+/// A simple helper for deserializing a bunch of transmuted POD data from bytes.
 struct BufReader<'a> {
+    /// The buffer to read from.
     buf: &'a[u8],
+    /// Where we currently are reading from.
     pos: usize,
 }
 
 impl<'a> BufReader<'a> {
+    /// Creates a reader over the given input.
     fn new(buf: &'a[u8]) -> BufReader<'a> {
         BufReader { buf: buf, pos: 0 }
     }
 
-    fn read<T>(&mut self) -> T {
+    /// Transmute-deserializes a value of type T from the stream.
+    ///
+    /// !!! SUPER DANGEROUS !!!
+    ///
+    /// To limit the scope of this unsafety, please don't call this directly.
+    /// Make a helper method for each whitelisted type.
+    unsafe fn read<T>(&mut self) -> T {
         let ret = convert_from_bytes(&self.buf[self.pos..]);
         self.pos += mem::size_of::<T>();
         ret
     }
 
+    /// Deserializes a BlobFont.
     fn read_blob_font(&mut self) -> BlobFont {
-        self.read()
+        unsafe { self.read::<BlobFont>() }
     }
 
+    /// Deserializes a usize.
     fn read_usize(&mut self) -> usize {
-        self.read()
+        unsafe { self.read::<usize>() }
     }
 
+    /// Deserializes a Box2d.
+    fn read_box(&mut self) -> Box2d {
+        unsafe { self.read::<Box2d>() }
+    }
+
+    /// Returns whether the buffer has more data to deserialize.
     fn has_more(&self) -> bool {
         self.pos < self.buf.len()
     }
 }
 
-/* Blob stream format:
- * { data[..], index[..], offset in the stream of the index array }
- *
- * An 'item' has 'data' and 'extra_data'
- *  - In our case the 'data' is the stream produced by DrawTargetRecording
- *    and the 'extra_data' includes things like webrender font keys
- *
- * The index is an array of entries of the following form:
- * { end, extra_end, bounds }
- *
- * - end is the offset of the end of an item's data
- *   an item's data goes from the begining of the stream or
- *   the begining of the last item til end
- * - extra_end is the offset of the end of an item's extra data
- *   an item's extra data goes from 'end' until 'extra_end'
- * - bounds is a set of 4 ints {x1, y1, x2, y2 }
- *
- * The offsets in the index should be monotonically increasing.
- *
- * Design rationale:
- *  - the index is smaller so we append it to the end of the data array
- *  during construction. This makes it more likely that we'll fit inside
- *  the data Vec
- *  - we use indices/offsets instead of sizes to avoid having to deal with any
- *  arithmetic that might overflow.
- */
-
-
+/// Reads the metadata of a blob image.
+///
+/// Blob stream format:
+/// { data[..], index[..], offset in the stream of the index array }
+///
+/// An 'item' has 'data' and 'extra_data'
+///  - In our case the 'data' is the stream produced by DrawTargetRecording
+///    and the 'extra_data' includes things like webrender font keys
+///
+/// The index is an array of entries of the following form:
+/// { end, extra_end, bounds }
+///
+/// - end is the offset of the end of an item's data
+///   an item's data goes from the begining of the stream or
+///   the begining of the last item til end
+/// - extra_end is the offset of the end of an item's extra data
+///   an item's extra data goes from 'end' until 'extra_end'
+/// - bounds is a set of 4 ints {x1, y1, x2, y2 }
+///
+/// The offsets in the index should be monotonically increasing.
+///
+/// Design rationale:
+///  - the index is smaller so we append it to the end of the data array
+///  during construction. This makes it more likely that we'll fit inside
+///  the data Vec
+///  - we use indices/offsets instead of sizes to avoid having to deal with any
+///  arithmetic that might overflow.
 struct BlobReader<'a> {
+    /// The buffer of the blob.
     reader: BufReader<'a>,
+    /// Where the buffer head is.
     begin: usize,
 }
 
+/// The metadata for each display item in a blob image (doesn't match the serialized layout).
+///
+/// See BlobReader above for detailed docs of the blob image format.
 struct Entry {
+    /// The bounds of the display item.
     bounds: Box2d,
+    /// Where the item's recorded drawing commands start.
     begin: usize,
+    /// Where the item's recorded drawing commands end, and its extra data starts.
     end: usize,
+    /// Where the item's extra data ends, and the next item's `begin`.
     extra_end: usize,
 }
 
 impl<'a> BlobReader<'a> {
+    /// Creates a new BlobReader for the given buffer.
     fn new(buf: &'a[u8]) -> BlobReader<'a> {
         // The offset of the index is at the end of the buffer.
         let index_offset_pos = buf.len()-mem::size_of::<usize>();
-        let index_offset = to_usize(&buf[index_offset_pos..]);
+        let index_offset = unsafe { convert_from_bytes::<usize>(&buf[index_offset_pos..]) };
 
         BlobReader { reader: BufReader::new(&buf[index_offset..index_offset_pos]), begin: 0 }
     }
 
+    /// Reads the next display item's metadata.
     fn read_entry(&mut self) -> Entry {
-        let end = self.reader.read();
-        let extra_end = self.reader.read();
-        let bounds = self.reader.read();
+        let end = self.reader.read_usize();
+        let extra_end = self.reader.read_usize();
+        let bounds = self.reader.read_box();
         let ret = Entry { begin: self.begin, end, extra_end, bounds };
         self.begin = extra_end;
         ret
     }
 }
 
-// This is used for writing new blob images.
-// In our case this is the result of merging an old one and a new one
+/// Writes new blob images.
+///
+/// In our case this is the result of merging an old one and a new one
 struct BlobWriter {
+    /// The buffer that the data and extra data for the items is accumulated.
     data: Vec<u8>,
+    /// The buffer that the metadata for the items is accumulated.
     index: Vec<u8>
 }
 
 impl BlobWriter {
+    /// Creates an empty BlobWriter.
     fn new() -> BlobWriter {
         BlobWriter { data: Vec::new(), index: Vec::new() }
     }
 
+    /// Writes a display item to the blob.
     fn new_entry(&mut self, extra_size: usize, bounds: Box2d, data: &[u8]) {
         self.data.extend_from_slice(data);
         // Write 'end' to the index: the offset where the regular data ends and the extra data starts.
         self.index.extend_from_slice(convert_to_bytes(&(self.data.len() - extra_size)));
         // Write 'extra_end' to the index: the offset where the extra data ends.
         self.index.extend_from_slice(convert_to_bytes(&self.data.len()));
         // XXX: we can aggregate these writes
         // Write the bounds to the index.
         self.index.extend_from_slice(convert_to_bytes(&bounds.x1));
         self.index.extend_from_slice(convert_to_bytes(&bounds.y1));
         self.index.extend_from_slice(convert_to_bytes(&bounds.x2));
         self.index.extend_from_slice(convert_to_bytes(&bounds.y2));
     }
 
+    /// Completes the blob image, producing a single buffer containing it.
     fn finish(mut self) -> Vec<u8> {
         // Append the index to the end of the buffer
         // and then append the offset to the beginning of the index.
         let index_begin = self.data.len();
         self.data.extend_from_slice(&self.index);
         self.data.extend_from_slice(convert_to_bytes(&index_begin));
         self.data
     }
 }
 
-
-// XXX: Do we want to allow negative values here or clamp to the image bounds?
 #[derive(Debug, Eq, PartialEq, Clone, Copy, Ord, PartialOrd)]
+#[repr(C)]
+/// A two-points representation of a rectangle.
 struct Box2d {
+    /// Top-left x
     x1: u32,
+    /// Top-left y
     y1: u32,
+    /// Bottom-right x
     x2: u32,
+    /// Bottom-right y
     y2: u32
 }
 
 impl Box2d {
+    /// Returns whether `self` is contained by `other` (inclusive).
     fn contained_by(&self, other: &Box2d) -> bool {
         self.x1 >= other.x1 &&
         self.x2 <= other.x2 &&
         self.y1 >= other.y1 &&
         self.y2 <= other.y2
     }
 }
 
 impl From<DeviceUintRect> for Box2d {
     fn from(rect: DeviceUintRect) -> Self {
         Box2d{ x1: rect.min_x(), y1: rect.min_y(), x2: rect.max_x(), y2: rect.max_y() }
     }
 }
 
-fn dump_blob_index(blob: &[u8], dirty_rect: Box2d) {
-    let mut index = BlobReader::new(blob);
-    while index.reader.has_more() {
-        let e = index.read_entry();
-        dlog!("  {:?} {}", e.bounds,
-                 if e.bounds.contained_by(&dirty_rect) {
-                    "*"
-                 } else {
-                    ""
-                 }
-        );
-    }
-}
-
-fn check_result(result: &[u8]) -> () {
-    let mut index = BlobReader::new(result);
-    // we might get an empty result here because sub groups are not tightly bound
-    // and we'll sometimes have display items that end up with empty bounds in
-    // the blob image.
-    while index.reader.has_more() {
-        let e = index.read_entry();
-        dlog!("result bounds: {} {} {:?}", e.end, e.extra_end, e.bounds);
-    }
-}
-
-// We use a BTree as a kind of multi-map, by appending an integer "cache_order" to the key.
-// This lets us use multiple items with matching bounds in the map and allows
-// us to fetch and remove them while retaining the ordering of the original list.
-
+/// Provides an API for looking up the display items in a blob image by bounds, yielding items
+/// with equal bounds in their original relative ordering.
+///
+/// This is used to implement `merge_blobs_images`.
+///
+/// We use a BTree as a kind of multi-map, by appending an integer "cache_order" to the key.
+/// This lets us use multiple items with matching bounds in the map and allows
+/// us to fetch and remove them while retaining the ordering of the original list.
 struct CachedReader<'a> {
+    /// Wrapped reader.
     reader: BlobReader<'a>,
+    /// Cached entries that have been read but not yet requested by our consumer.
     cache: BTreeMap<(Box2d, u32), Entry>,
+    /// The current number of internally read display items, used to preserve list order.
     cache_index_counter: u32
 }
 
 impl<'a> CachedReader<'a> {
-    fn new(buf: &'a[u8]) -> CachedReader {
-        CachedReader{reader:BlobReader::new(buf), cache: BTreeMap::new(), cache_index_counter: 0 }
+    /// Creates a new CachedReader.
+    pub fn new(buf: &'a[u8]) -> CachedReader {
+        CachedReader{ reader: BlobReader::new(buf), cache: BTreeMap::new(), cache_index_counter: 0 }
     }
 
+    /// Tries to find the given bounds in the cache of internally read items, removing it if found.
     fn take_entry_with_bounds_from_cache(&mut self, bounds: &Box2d) -> Option<Entry> {
         if self.cache.is_empty() {
             return None;
         }
 
-        let key_to_delete = match self.cache. range((Included((*bounds, 0u32)), Included((*bounds, std::u32::MAX)))).next() {
+        let key_to_delete = match self.cache.range((Included((*bounds, 0u32)), Included((*bounds, std::u32::MAX)))).next() {
             Some((&key, _)) => key,
             None => return None,
         };
 
         Some(self.cache.remove(&key_to_delete).expect("We just got this key from range, it needs to be present"))
     }
 
-    fn next_entry_with_bounds(&mut self, bounds: &Box2d, ignore_rect: &Box2d) -> Entry {
+    /// Yields the next item in the blob image with the given bounds.
+    ///
+    /// If the given bounds aren't found in the blob, this panics. `merge_blob_images` should
+    /// avoid this by construction if the blob images are well-formed.
+    pub fn next_entry_with_bounds(&mut self, bounds: &Box2d, ignore_rect: &Box2d) -> Entry {
         if let Some(entry) = self.take_entry_with_bounds_from_cache(bounds) {
             return entry;
         }
 
         loop {
+            // This will panic if we run through the whole list without finding our bounds.
             let old = self.reader.read_entry();
             if old.bounds == *bounds {
                 return old;
             } else if !old.bounds.contained_by(&ignore_rect) {
                 self.cache.insert((old.bounds, self.cache_index_counter), old);
                 self.cache_index_counter += 1;
             }
         }
     }
 }
 
-/* Merge a new partial blob image into an existing complete blob image.
-   All of the items not fully contained in the dirty_rect should match
-   in both new and old lists.
-   We continue to use the old content for these items.
-   Old items contained in the dirty_rect are dropped and new items
-   are retained.
-*/
+
+/// Merges a new partial blob image into an existing complete one.
+///
+/// A blob image represents a recording of the drawing commands needed to render
+/// (part of) a display list. A partial blob image is a diff between the old display
+/// list and a new one. It contains an entry for every display item in the new list, but
+/// the actual drawing commands are missing for any item that isn't strictly contained
+/// in the dirty rect. This is possible because not being contained in the dirty
+/// rect implies that the item is unchanged between the old and new list, so we can
+/// just grab the drawing commands from the old list.
+///
+/// The dirty rect strictly contains the bounds of every item that has been inserted
+/// into or deleted from the old list to create the new list. (For simplicity
+/// you may think of any other update as deleting and reinserting the item).
+///
+/// Partial blobs are based on gecko's "retained display list" system, and
+/// in particular rely on one key property: if two items have overlapping bounds
+/// and *aren't* contained in the dirty rect, then their relative order in both
+/// the old and new list will not change. This lets us uniquely identify a display
+/// item using only its bounds and relative order in the list.
+///
+/// That is, the first non-dirty item in the new list with bounds (10, 15, 100, 100)
+/// is *also* the first non-dirty item in the old list with those bounds.
+///
+/// Note that *every* item contained inside the dirty rect will be fully recorded in
+/// the new list, even if it is actually unchanged from the old list.
+///
+/// All of this together gives us a fairly simple merging algorithm: all we need
+/// to do is walk through the new (partial) list, determine which of the two lists
+/// has the recording for that item, and copy the recording into the result.
+///
+/// If an item is contained in the dirty rect, then the new list contains the
+/// correct recording for that item, so we always copy it from there. Otherwise, we find
+/// the first not-yet-copied item with those bounds in the old list and copy that.
+/// Any items found in the old list but not the new one can be safely assumed to
+/// have been deleted.
 fn merge_blob_images(old_buf: &[u8], new_buf: &[u8], dirty_rect: Box2d) -> Vec<u8> {
 
     let mut result = BlobWriter::new();
     dlog!("dirty rect: {:?}", dirty_rect);
     dlog!("old:");
-    dump_blob_index(old_buf, dirty_rect);
+    dump_bounds(old_buf, dirty_rect);
     dlog!("new:");
-    dump_blob_index(new_buf, dirty_rect);
+    dump_bounds(new_buf, dirty_rect);
 
     let mut old_reader = CachedReader::new(old_buf);
     let mut new_reader = BlobReader::new(new_buf);
 
     // Loop over both new and old entries merging them.
     // Both new and old must have the same number of entries that
     // overlap but are not contained by the dirty rect, and they
     // must be in the same order.
@@ -314,82 +394,105 @@ fn merge_blob_images(old_buf: &[u8], new
         if new.bounds.contained_by(&dirty_rect) {
             result.new_entry(new.extra_end - new.end, new.bounds, &new_buf[new.begin..new.extra_end]);
         } else {
             let old = old_reader.next_entry_with_bounds(&new.bounds, &dirty_rect);
             result.new_entry(old.extra_end - old.end, new.bounds, &old_buf[old.begin..old.extra_end])
         }
     }
 
+    // XXX: future work: ensure that items that have been deleted but aren't in the blob's visible
+    // rect don't affect the dirty rect -- this allows us to scroll content out of view while only
+    // updating the areas where items have been scrolled *into* view. This is very important for
+    // the performance of blobs that are larger than the viewport. When this is done this
+    // assertion will need to be modified to factor in the visible rect, or removed.
+
     // Ensure all remaining items will be discarded
     while old_reader.reader.reader.has_more() {
         let old = old_reader.reader.read_entry();
         dlog!("new bounds: {} {} {:?}", old.end, old.extra_end, old.bounds);
         assert!(old.bounds.contained_by(&dirty_rect));
     }
 
     assert!(old_reader.cache.is_empty());
 
     let result = result.finish();
-    check_result(&result);
+    dump_index(&result);
     result
 }
 
+/// A font used by a blob image.
 #[repr(C)]
 struct BlobFont {
+    /// The font key.
     font_instance_key: FontInstanceKey,
+    /// A pointer to the scaled font.
     scaled_font_ptr: u64,
 }
 
+/// A blob image and extra data provided by webrender on how to rasterize it.
+#[derive(Clone)]
+struct BlobCommand {
+    /// The blob.
+    data: Arc<BlobImageData>,
+    /// The size of the tiles to use in rasterization, if tiling should be used.
+    tile_size: Option<TileSize>,
+}
+
+/// Rasterizes gecko blob images.
 struct Moz2dBlobRasterizer {
+    /// Pool of rasterizers.
     workers: Arc<ThreadPool>,
-    blob_commands: HashMap<ImageKey, (Arc<BlobImageData>, Option<TileSize>)>,
+    /// Blobs to rasterize.
+    blob_commands: HashMap<ImageKey, BlobCommand>,
 }
 
 impl AsyncBlobImageRasterizer for Moz2dBlobRasterizer {
 
     fn rasterize(&mut self, requests: &[BlobImageParams]) -> Vec<(BlobImageRequest, BlobImageResult)> {
+        // All we do here is spin up our workers to callback into gecko to replay the drawing commands.
+
         struct Job {
             request: BlobImageRequest,
             descriptor: BlobImageDescriptor,
             commands: Arc<BlobImageData>,
             dirty_rect: Option<DeviceUintRect>,
             tile_size: Option<TileSize>,
         }
 
         let requests: Vec<Job> = requests.into_iter().map(|params| {
-            let commands = &self.blob_commands[&params.request.key];
-            let blob = Arc::clone(&commands.0);
+            let command = &self.blob_commands[&params.request.key];
+            let blob = Arc::clone(&command.data);
             Job {
                 request: params.request,
                 descriptor: params.descriptor,
                 commands: blob,
                 dirty_rect: params.dirty_rect,
-                tile_size: commands.1,
+                tile_size: command.tile_size,
             }
         }).collect();
 
-        self.workers.install(||{
+        self.workers.install(|| {
             requests.into_par_iter().map(|item| {
                 let descriptor = item.descriptor;
                 let buf_size = (descriptor.size.width
                     * descriptor.size.height
                     * descriptor.format.bytes_per_pixel()) as usize;
 
                 let mut output = vec![0u8; buf_size];
 
                 let result = unsafe {
                     if wr_moz2d_render_cb(
                         ByteSlice::new(&item.commands[..]),
                         descriptor.size.width,
                         descriptor.size.height,
                         descriptor.format,
-                        option_to_nullable(&item.tile_size),
-                        option_to_nullable(&item.request.tile),
-                        option_to_nullable(&item.dirty_rect),
+                        item.tile_size.as_ref(),
+                        item.request.tile.as_ref(),
+                        item.dirty_rect.as_ref(),
                         MutByteSlice::new(output.as_mut_slice()),
                     ) {
                         Ok(RasterizedBlobImage {
                             rasterized_rect: item.dirty_rect.unwrap_or(
                                 DeviceUintRect {
                                     origin: DeviceUintPoint::origin(),
                                     size: descriptor.size,
                                 }
@@ -403,29 +506,29 @@ impl AsyncBlobImageRasterizer for Moz2dB
 
                 (item.request, result)
             }).collect()
         })
     }
 }
 
 impl BlobImageHandler for Moz2dBlobImageHandler {
-    fn add(&mut self, key: ImageKey, data: Arc<BlobImageData>, tiling: Option<TileSize>) {
+    fn add(&mut self, key: ImageKey, data: Arc<BlobImageData>, tile_size: Option<TileSize>) {
         {
             let index = BlobReader::new(&data);
             assert!(index.reader.has_more());
         }
-        self.blob_commands.insert(key, (Arc::clone(&data), tiling));
+        self.blob_commands.insert(key, BlobCommand { data: Arc::clone(&data), tile_size });
     }
 
     fn update(&mut self, key: ImageKey, data: Arc<BlobImageData>, dirty_rect: Option<DeviceUintRect>) {
         match self.blob_commands.entry(key) {
             hash_map::Entry::Occupied(mut e) => {
-                let old_data = &mut e.get_mut().0;
-                *old_data = Arc::new(merge_blob_images(&old_data, &data,
+                let command = e.get_mut();
+                command.data = Arc::new(merge_blob_images(&command.data, &data,
                                                        dirty_rect.unwrap().into()));
             }
             _ => { panic!("missing image key"); }
         }
     }
 
     fn delete(&mut self, key: ImageKey) {
         self.blob_commands.remove(&key);
@@ -452,50 +555,54 @@ impl BlobImageHandler for Moz2dBlobImage
 
     fn prepare_resources(
         &mut self,
         resources: &BlobImageResources,
         requests: &[BlobImageParams]
     ) {
         for params in requests {
             let commands = &self.blob_commands[&params.request.key];
-            let blob = Arc::clone(&commands.0);
+            let blob = Arc::clone(&commands.data);
             self.prepare_request(&blob, resources);
         }
     }
 }
 
 use bindings::{WrFontKey, WrFontInstanceKey, WrIdNamespace};
 
 #[allow(improper_ctypes)] // this is needed so that rustc doesn't complain about passing the &Arc<Vec> to an extern function
 extern "C" {
     fn AddFontData(key: WrFontKey, data: *const u8, size: usize, index: u32, vec: &ArcVecU8);
     fn AddNativeFontHandle(key: WrFontKey, handle: *mut c_void, index: u32);
     fn DeleteFontData(key: WrFontKey);
     fn AddBlobFont(
         instance_key: WrFontInstanceKey,
         font_key: WrFontKey,
         size: f32,
-        options: *const FontInstanceOptions,
-        platform_options: *const FontInstancePlatformOptions,
+        options: Option<&FontInstanceOptions>,
+        platform_options: Option<&FontInstancePlatformOptions>,
         variations: *const FontVariation,
         num_variations: usize,
     );
     fn DeleteBlobFont(key: WrFontInstanceKey);
     fn ClearBlobImageResources(namespace: WrIdNamespace);
 }
 
 impl Moz2dBlobImageHandler {
+    /// Create a new BlobImageHandler with the given thread pool.
     pub fn new(workers: Arc<ThreadPool>) -> Self {
         Moz2dBlobImageHandler {
             blob_commands: HashMap::new(),
             workers: workers,
         }
     }
 
+    /// Does early preprocessing of a blob's resources.
+    ///
+    /// Currently just sets up fonts found in the blob.
     fn prepare_request(&self, blob: &[u8], resources: &BlobImageResources) {
         #[cfg(target_os = "windows")]
         fn process_native_font_handle(key: FontKey, handle: &NativeFontHandle) {
             let system_fc = dwrote::FontCollection::system();
             let font = system_fc.get_font_from_descriptor(handle).unwrap();
             let face = font.create_font_face();
             unsafe { AddNativeFontHandle(key, face.as_ptr() as *mut c_void, 0) };
         }
@@ -537,18 +644,18 @@ impl Moz2dBlobImageHandler {
                             }
                         }
                     }
                     unsafe {
                         AddBlobFont(
                             font.font_instance_key,
                             instance.font_key,
                             instance.size.to_f32_px(),
-                            option_to_nullable(&instance.options),
-                            option_to_nullable(&instance.platform_options),
+                            instance.options.as_ref(),
+                            instance.platform_options.as_ref(),
                             instance.variations.as_ptr(),
                             instance.variations.len(),
                         );
                     }
                 }
             }
         }
 
--- a/layout/style/URLExtraData.cpp
+++ b/layout/style/URLExtraData.cpp
@@ -31,18 +31,14 @@ URLExtraData::InitDummy()
 URLExtraData::ReleaseDummy()
 {
   sDummy = nullptr;
 }
 
 URLExtraData::~URLExtraData()
 {
   if (!NS_IsMainThread()) {
-    NS_ReleaseOnMainThreadSystemGroup("URLExtraData::mBaseURI",
-                                      mBaseURI.forget());
-    NS_ReleaseOnMainThreadSystemGroup("URLExtraData::mReferrer",
-                                      mReferrer.forget());
     NS_ReleaseOnMainThreadSystemGroup("URLExtraData::mPrincipal",
                                       mPrincipal.forget());
   }
 }
 
 } // namespace mozilla
--- a/layout/style/nsCSSValue.cpp
+++ b/layout/style/nsCSSValue.cpp
@@ -1399,26 +1399,18 @@ css::ImageValue::LoadImage(nsIDocument* 
   ImageLoader::LoadImage(GetURI(),
                          mExtraData->GetPrincipal(),
                          mExtraData->GetReferrer(),
                          mExtraData->GetReferrerPolicy(),
                          loadingDoc,
                          this,
                          mCORSMode);
 
-  // Register the image in the loading document, and in our document if it's
-  // different from the loading document.
-  imgRequestProxy* request =
-    loadingDoc->StyleImageLoader()->RegisterCSSImage(this);
-
-  if (aDocument != loadingDoc) {
-    request = aDocument->StyleImageLoader()->RegisterCSSImage(this);
-  }
-
-  return request;
+  // Register the image in the document that's using it.
+  return aDocument->StyleImageLoader()->RegisterCSSImage(this);
 }
 
 css::ImageValue::~ImageValue()
 {
   if (mLoadID != 0) {
     ImageLoader::DeregisterCSSImageFromAllLoaders(this);
   }
 }
--- a/mobile/android/base/java/org/mozilla/gecko/GeckoService.java
+++ b/mobile/android/base/java/org/mozilla/gecko/GeckoService.java
@@ -194,20 +194,24 @@ public abstract class GeckoService exten
 
         if (GeckoApplication.getRuntime() != null) {
             // Gecko has already been initialized, make sure it's using the
             // expected profile.
             return GeckoThread.canUseProfile(profileName,
                     profileDir != null ? new File(profileDir) : null);
         }
 
-        String args;
+        StringBuilder args = new StringBuilder();
         if (profileDir != null) {
-            args = "-profile " + profileDir;
-        } else {
-            args = "-P " + profileName;
+            args.append("-profile ").append(profileDir);
+        }
+        if (profileName != null) {
+            if (args.length() > 0) {
+                args.append(' ');
+            }
+            args.append("-P ").append(profileName);
         }
 
-        intent.putExtra(GeckoThread.EXTRA_ARGS, args);
+        intent.putExtra(GeckoThread.EXTRA_ARGS, args.toString());
         GeckoApplication.createRuntime(this, new SafeIntent(intent));
         return true;
     }
 }
--- a/mobile/android/components/FxAccountsPush.js
+++ b/mobile/android/components/FxAccountsPush.js
@@ -129,17 +129,17 @@ FxAccountsPush.prototype = {
       let decryptedMessage = plaintext ? _decoder.decode(plaintext) : "";
       EventDispatcher.instance.sendRequestForResult({
         type: "FxAccountsPush:ReceivedPushMessageToDecode:Response",
         message: decryptedMessage
       });
     })
     .catch(err => {
       Log.d("Error while decoding incoming message : " + err);
-      EventDispatcher.instance.sendRequest({
+      EventDispatcher.instance.sendRequestForResult({
         type: "FxAccountsPush:ReceivedPushMessageToDecode:Response",
         error: err.message || ""
       });
     });
   },
 
   // Copied from PushServiceAndroidGCM
   _messageAndHeaders(data) {
--- a/mobile/android/services/src/main/java/org/mozilla/gecko/fxa/devices/FxAccountDeviceRegistrator.java
+++ b/mobile/android/services/src/main/java/org/mozilla/gecko/fxa/devices/FxAccountDeviceRegistrator.java
@@ -54,17 +54,17 @@ public class FxAccountDeviceRegistrator 
 
   public static final String PUSH_SUBSCRIPTION_REPLY_BUNDLE_KEY_ERROR = "error";
   @VisibleForTesting
   static final long ERROR_GCM_DISABLED = 2154627078L; // = NS_ERROR_DOM_PUSH_GCM_DISABLED
 
   // The current version of the device registration, we use this to re-register
   // devices after we update what we send on device registration.
   @VisibleForTesting
-  static final Integer DEVICE_REGISTRATION_VERSION = 2;
+  static final Integer DEVICE_REGISTRATION_VERSION = 3;
 
   private static FxAccountDeviceRegistrator instance;
   private final WeakReference<Context> context;
 
   private FxAccountDeviceRegistrator(Context appContext) {
     this.context = new WeakReference<>(appContext);
   }
 
--- a/toolkit/content/moz.build
+++ b/toolkit/content/moz.build
@@ -24,16 +24,18 @@ if CONFIG['OS_TARGET'] == 'Android':
 if CONFIG['MOZ_INSTALL_TRACKING']:
     DEFINES['MOZ_INSTALL_TRACKING'] = 1
 
 if CONFIG['MOZ_BUILD_APP'] == 'mobile/android':
     DEFINES['MOZ_FENNEC'] = True
 
 JAR_MANIFESTS += ['jar.mn']
 
+SPHINX_TREES['toolkit_widgets'] = 'widgets/docs'
+
 DEFINES['TOPOBJDIR'] = TOPOBJDIR
 
 with Files('**'):
     BUG_COMPONENT = ('Toolkit', 'General')
 
 with Files('aboutTelemetry.*'):
     BUG_COMPONENT = ('Toolkit', 'Telemetry')
 
new file mode 100644
--- /dev/null
+++ b/toolkit/content/widgets/docs/index.rst
@@ -0,0 +1,10 @@
+===============
+Toolkit Widgets
+===============
+
+The ``/toolkit/content/widgets`` directory contains XBL bindings, Mozilla Custom Elements, and UA Widgets usable for all applications.
+
+.. toctree::
+  :maxdepth: 1
+
+  ua_widget
new file mode 100644
--- /dev/null
+++ b/toolkit/content/widgets/docs/ua_widget.rst
@@ -0,0 +1,48 @@
+UA Widgets
+==========
+
+Introduction
+------------
+
+UA Widgets are intended to be a replacement of our usage of XBL bindings in web content. These widgets run JavaScript inside extended principal per-origin sandboxes. They insert their own DOM inside of a special, closed Shadow Root inaccessible to the page, called a UA Widget Shadow Root.
+
+UA Widget lifecycle
+-------------------
+
+UA Widgets are generally constructed when the element is appended to the document and destroyed when the element is removed from the tree. Yet, in order to be fast, specialization was made to each of the widgets.
+
+When the element is appended to the tree, a chrome-only ``UAWidgetBindToTree`` event is dispatched and is caught by a frame script, namely UAWidgetsChild.
+
+UAWidgetsChild then grabs the sandbox for that origin (lazily creating it as needed), loads the script as needed, and initializes an instance by calling the JS constructor with a reference to the UA Widget Shadow Root created by the DOM. We will discuss the sandbox in the latter section.
+
+When the element is removed from the tree, ``UAWidgetUnbindFromTree`` is dispatched so UAWidgetsChild can destroy the widget, if it exists. If so, the UAWidgetsChild calls the ``destructor()`` method on the widget, causing the widget to destruct itself.
+
+When a UA Widget initializes, it should create its own DOM inside the passed UA Widget Shadow Root, including the ``<link>`` element necessary to load the stylesheet, add event listeners, etc. When destroyed (i.e. the destructor method is called), it should do the opposite.
+
+**Specialization**: for video controls, we do not want to do the work if the control is not needed (i.e. when the ``<video>`` or ``<audio>`` element has no "controls" attribute set), so we forgo dispatching the event from HTMLMediaElement in the BindToTree method. Instead, a ``UAWidgetAttributeChanged`` event will cause the sandbox and the widget instance to construct when the attribute is set to true. The same event is also responsible for triggering the ``onattributechange()`` method on UA Widgets if the widget is already initialized.
+
+The specialization does not apply to the lifecycle of the UA Widget Shadow Root. It is always constructed in order to suppress children of the DOM element from the web content from receiving a layout frame.
+
+UA Widget Shadow Root
+---------------------
+
+The UA Widget Shadow Root is a closed shadow root, with the UA Widget flag turned on. As a closed shadow root, it may not be accessed by other scripts. It is attached on host element which the spec disallow a shadow root to be attached.
+
+The UA Widget flag enables the security feature covered in the next section.
+
+The JavaScript sandbox
+----------------------
+
+The sandboxes created for UA Widgets are per-origin and set to the expanded principal. This allows the script to access other DOM APIs unavailable to the web content, while keeping its principal tied to the document origin. They are created as needed, backing the lifecycle of the UA Widgets as previously mentioned. These sandbox globals are not associated with any window object because they are shared across all same-origin documents. It is the job of the UA Widget script to hold and manage the references of the window and document objects the widget is being initiated on, by accessing them from the UA Widget Shadow Root instance passed.
+
+While the closed shadow root technically prevents content from accessing the contents, we want a stronger guarantee to protect against accidental leakage of references to the UA Widget shadow tree into content script. Access to the UA Widget DOM is restricted by having their reflectors set in the UA Widgets scope, as opposed to the normal scope. To accomplish this, we avoid having any script (UA Widget script included) getting a hold of the reference of any created DOM element before appending to the Shadow DOM. Once the element is in the Shadow DOM, the binding mechanism will put the reflector in the desired scope as it is being accessed.
+
+To avoid creating reflectors before DOM insertion, the available DOM interfaces is limited. For example, instead of ``createElement()`` and ``appendChild()``, the script would have to call ``createElementAndAppendChildAt()`` available on the UA Widget Shadow Root instance, to avoid receiving a reference to the DOM element and thus triggering the creation of its reflector in the wrong scope, before the element is properly associated with the UA Widget shadow tree. To find out the differences, search for ``Func="IsChromeOrXBLOrUAWidget"`` and ``Func="IsNotUAWidget"`` in in-tree WebIDL files.
+
+Other things to watch out for
+-----------------------------
+
+As part of the implementation of the Web Platform, it is important to make sure the web-observable characteristics of the widget correctly reflect what the script on the web expects.
+
+* Do not dispatch non-spec compliant events on the UA Widget Shadow Root host element, as event listeners in web content scripts can access them.
+* The layout and the dimensions of the widget should be ready by the time the constructor returns, since they can be detectable as soon as the content script gets the reference of the host element (i.e. when ``appendChild()`` returns). In order to make this easier we load ``<link>`` elements load chrome stylesheets synchronously when inside a UA Widget Shadow DOM.