Merge inbound to mozilla-central. a=merge
authorCsoregi Natalia <ncsoregi@mozilla.com>
Thu, 10 May 2018 19:42:51 +0300
changeset 417721 17db33b6a124422d43a9f518bea1bc62a698126b
parent 417644 92ba1ca3bc76c0ddf6535c8687786c58b42777f1 (current diff)
parent 417720 635bea9e749d77888d28f422c7ef4b1862e078c4 (diff)
child 417743 d302824da0ead41934b676d0c9bf85ede465a9dd
child 417761 fccad2fc0cd2f53cca55b315ed9ef78a74314b50
push id33977
push userncsoregi@mozilla.com
push dateThu, 10 May 2018 16:43:24 +0000
treeherdermozilla-central@17db33b6a124 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone62.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 inbound to mozilla-central. a=merge
media/libyuv/clang_x86_asm.patch
media/libyuv/cpu_id.patch
media/libyuv/libyuv/cleanup_links.py
media/libyuv/libyuv/gyp_libyuv
media/libyuv/libyuv/source/rotate_dspr2.cc
media/libyuv/libyuv/source/row_dspr2.cc
media/libyuv/libyuv/source/scale_dspr2.cc
media/libyuv/libyuv/tools_libyuv/autoroller/roll_deps.py
media/libyuv/libyuv/tools_libyuv/autoroller/unittests/roll_deps_test.py
media/libyuv/libyuv/tools_libyuv/get_landmines.py
media/libyuv/libyuv/tools_libyuv/valgrind/libyuv_tests.py
media/libyuv/libyuv/tools_libyuv/valgrind/libyuv_tests.sh
media/libyuv/libyuv/util/convert.cc
media/libyuv/row_any.patch
testing/marionette/harness/marionette_harness/www/hidden.html
--- a/accessible/tests/mochitest/autocomplete.js
+++ b/accessible/tests/mochitest/autocomplete.js
@@ -108,24 +108,17 @@ AutoCompleteSearch.prototype =
   startSearch(aSearchString, aSearchParam, aPreviousResult, aListener) {
     var result = this.allResults.getAutoCompleteResultFor(aSearchString);
     aListener.onSearchResult(this, result);
   },
 
   stopSearch() {},
 
   // nsISupports implementation
-  QueryInterface(iid) {
-    if (iid.equals(nsISupports) ||
-        iid.equals(nsIFactory) ||
-        iid.equals(nsIAutoCompleteSearch))
-      return this;
-
-    throw Cr.NS_ERROR_NO_INTERFACE;
-  },
+  QueryInterface: ChromeUtils.generateQI(["nsIFactory", "nsIAutoCompleteSearch"]),
 
   // nsIFactory implementation
   createInstance(outer, iid) {
     return this.QueryInterface(iid);
   },
 
   // Search name. Used by AutoCompleteController.
   name: null,
@@ -183,20 +176,14 @@ AutoCompleteResult.prototype =
 
   getFinalCompleteValueAt(aIndex) {
     return this.getValueAt(aIndex);
   },
 
   removeValueAt(aRowIndex, aRemoveFromDb) {},
 
   // nsISupports implementation
-  QueryInterface(iid) {
-    if (iid.equals(nsISupports) ||
-        iid.equals(nsIAutoCompleteResult))
-      return this;
-
-    throw Cr.NS_ERROR_NO_INTERFACE;
-  },
+  QueryInterface: ChromeUtils.generateQI(["nsIAutoCompleteResult"]),
 
   // Data
   values: null,
   comments: null
 };
new file mode 100644
--- /dev/null
+++ b/browser/app/LaunchUnelevated.cpp
@@ -0,0 +1,161 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
+
+#include "LaunchUnelevated.h"
+
+#include "mozilla/CmdLineAndEnvUtils.h"
+#include "mozilla/mscom/COMApartmentRegion.h"
+#include "mozilla/RefPtr.h"
+#include "nsWindowsHelpers.h"
+
+// For _bstr_t and _variant_t
+#include <comdef.h>
+#include <comutil.h>
+
+#include <windows.h>
+#include <exdisp.h>
+#include <objbase.h>
+#include <servprov.h>
+#include <shlobj.h>
+#include <shobjidl.h>
+
+namespace mozilla {
+
+// If we're running at an elevated integrity level, re-run ourselves at the
+// user's normal integrity level. We do this by locating the active explorer
+// shell, and then asking it to do a ShellExecute on our behalf. We do it this
+// way to ensure that the child process runs as the original user in the active
+// session; an elevated process could be running with different credentials than
+// those of the session.
+// See https://blogs.msdn.microsoft.com/oldnewthing/20131118-00/?p=2643
+
+bool
+LaunchUnelevated(int aArgc, wchar_t* aArgv[])
+{
+  // We require a single-threaded apartment to talk to Explorer.
+  mscom::STARegion sta;
+  if (!sta.IsValid()) {
+    return false;
+  }
+
+  // NB: Explorer is a local server, not an inproc server
+  RefPtr<IShellWindows> shellWindows;
+  HRESULT hr = ::CoCreateInstance(CLSID_ShellWindows, nullptr,
+                                  CLSCTX_LOCAL_SERVER, IID_IShellWindows,
+                                  getter_AddRefs(shellWindows));
+  if (FAILED(hr)) {
+    return false;
+  }
+
+  // 1. Find the shell view for the desktop.
+  _variant_t loc(CSIDL_DESKTOP);
+  _variant_t empty;
+  long hwnd;
+  RefPtr<IDispatch> dispDesktop;
+  hr = shellWindows->FindWindowSW(&loc, &empty, SWC_DESKTOP, &hwnd,
+                                  SWFO_NEEDDISPATCH, getter_AddRefs(dispDesktop));
+  if (FAILED(hr)) {
+    return false;
+  }
+
+  RefPtr<IServiceProvider> servProv;
+  hr = dispDesktop->QueryInterface(IID_IServiceProvider, getter_AddRefs(servProv));
+  if (FAILED(hr)) {
+    return false;
+  }
+
+  RefPtr<IShellBrowser> browser;
+  hr = servProv->QueryService(SID_STopLevelBrowser, IID_IShellBrowser,
+                              getter_AddRefs(browser));
+  if (FAILED(hr)) {
+    return false;
+  }
+
+  RefPtr<IShellView> activeShellView;
+  hr = browser->QueryActiveShellView(getter_AddRefs(activeShellView));
+  if (FAILED(hr)) {
+    return false;
+  }
+
+  // 2. Get the automation object for the desktop.
+  RefPtr<IDispatch> dispView;
+  hr = activeShellView->GetItemObject(SVGIO_BACKGROUND, IID_IDispatch,
+                                      getter_AddRefs(dispView));
+  if (FAILED(hr)) {
+    return false;
+  }
+
+  RefPtr<IShellFolderViewDual> folderView;
+  hr = dispView->QueryInterface(IID_IShellFolderViewDual,
+                                getter_AddRefs(folderView));
+  if (FAILED(hr)) {
+    return false;
+  }
+
+  // 3. Get the interface to IShellDispatch2
+  RefPtr<IDispatch> dispShell;
+  hr = folderView->get_Application(getter_AddRefs(dispShell));
+  if (FAILED(hr)) {
+    return false;
+  }
+
+  RefPtr<IShellDispatch2> shellDisp;
+  hr = dispShell->QueryInterface(IID_IShellDispatch2, getter_AddRefs(shellDisp));
+  if (FAILED(hr)) {
+    return false;
+  }
+
+  // 4. Now call IShellDispatch2::ShellExecute to ask Explorer to re-launch us.
+
+  // Omit argv[0] because ShellExecute doesn't need it in params
+  UniquePtr<wchar_t[]> cmdLine(MakeCommandLine(aArgc - 1, aArgv + 1));
+  if (!cmdLine) {
+    return false;
+  }
+
+  _bstr_t exe(aArgv[0]);
+  _variant_t args(cmdLine.get());
+  _variant_t operation(L"open");
+  _variant_t directory;
+  _variant_t showCmd(SW_SHOWNORMAL);
+  hr = shellDisp->ShellExecute(exe, args, operation, directory, showCmd);
+  return SUCCEEDED(hr);
+}
+
+mozilla::Maybe<bool>
+IsElevated()
+{
+  HANDLE rawToken;
+  if (!::OpenProcessToken(::GetCurrentProcess(), TOKEN_QUERY, &rawToken)) {
+    return mozilla::Nothing();
+  }
+
+  nsAutoHandle token(rawToken);
+
+  DWORD reqdLen;
+  if (!::GetTokenInformation(token.get(), TokenIntegrityLevel, nullptr, 0,
+                             &reqdLen) &&
+      ::GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
+    return mozilla::Nothing();
+  }
+
+  auto buf = mozilla::MakeUnique<char[]>(reqdLen);
+
+  if (!::GetTokenInformation(token.get(), TokenIntegrityLevel, buf.get(),
+                             reqdLen, &reqdLen)) {
+    return mozilla::Nothing();
+  }
+
+  auto tokenLabel = reinterpret_cast<PTOKEN_MANDATORY_LABEL>(buf.get());
+
+  DWORD subAuthCount = *::GetSidSubAuthorityCount(tokenLabel->Label.Sid);
+  DWORD integrityLevel = *::GetSidSubAuthority(tokenLabel->Label.Sid,
+                                               subAuthCount - 1);
+  return mozilla::Some(integrityLevel > SECURITY_MANDATORY_MEDIUM_RID);
+}
+
+} // namespace mozilla
+
new file mode 100644
--- /dev/null
+++ b/browser/app/LaunchUnelevated.h
@@ -0,0 +1,20 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
+
+#ifndef mozilla_LaunchUnelevated_h
+#define mozilla_LaunchUnelevated_h
+
+#include "mozilla/Maybe.h"
+
+namespace mozilla {
+
+mozilla::Maybe<bool> IsElevated();
+bool LaunchUnelevated(int aArgc, wchar_t* aArgv[]);
+
+} // namespace mozilla
+
+#endif // mozilla_LaunchUnelevated_h
+
--- a/browser/app/LauncherProcessWin.cpp
+++ b/browser/app/LauncherProcessWin.cpp
@@ -5,45 +5,63 @@
  * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
 
 #include "LauncherProcessWin.h"
 
 #include <string.h>
 
 #include "mozilla/Attributes.h"
 #include "mozilla/CmdLineAndEnvUtils.h"
+#include "mozilla/DebugOnly.h"
+#include "mozilla/DynamicallyLinkedFunctionPtr.h"
 #include "mozilla/Maybe.h"
 #include "mozilla/SafeMode.h"
 #include "mozilla/UniquePtr.h"
+#include "mozilla/WindowsVersion.h"
 #include "nsWindowsHelpers.h"
 
 #include <windows.h>
+#include <processthreadsapi.h>
 
+#include "LaunchUnelevated.h"
 #include "ProcThreadAttributes.h"
 
 /**
  * At this point the child process has been created in a suspended state. Any
  * additional startup work (eg, blocklist setup) should go here.
  *
  * @return true if browser startup should proceed, otherwise false.
  */
 static bool
 PostCreationSetup(HANDLE aChildProcess, HANDLE aChildMainThread,
                   const bool aIsSafeMode)
 {
   return true;
 }
 
+#if !defined(PROCESS_CREATION_MITIGATION_POLICY_IMAGE_LOAD_PREFER_SYSTEM32_ALWAYS_ON)
+# define PROCESS_CREATION_MITIGATION_POLICY_IMAGE_LOAD_PREFER_SYSTEM32_ALWAYS_ON (0x00000001ui64 << 60)
+#endif // !defined(PROCESS_CREATION_MITIGATION_POLICY_IMAGE_LOAD_PREFER_SYSTEM32_ALWAYS_ON)
+
+#if (_WIN32_WINNT < 0x0602)
+BOOL WINAPI
+SetProcessMitigationPolicy(PROCESS_MITIGATION_POLICY aMitigationPolicy,
+                           PVOID aBuffer, SIZE_T aBufferLen);
+#endif // (_WIN32_WINNT >= 0x0602)
+
 /**
  * Any mitigation policies that should be set on the browser process should go
  * here.
  */
 static void
 SetMitigationPolicies(mozilla::ProcThreadAttributes& aAttrs, const bool aIsSafeMode)
 {
+  if (mozilla::IsWin10November2015UpdateOrLater()) {
+    aAttrs.AddMitigationPolicy(PROCESS_CREATION_MITIGATION_POLICY_IMAGE_LOAD_PREFER_SYSTEM32_ALWAYS_ON);
+  }
 }
 
 static void
 ShowError(DWORD aError = ::GetLastError())
 {
   if (aError == ERROR_SUCCESS) {
     return;
   }
@@ -72,16 +90,40 @@ RunAsLauncherProcess(int& argc, wchar_t*
   return CheckArg(argc, argv, L"launcher",
                   static_cast<const wchar_t**>(nullptr),
                   CheckArgFlag::CheckOSInt | CheckArgFlag::RemoveArg);
 }
 
 int
 LauncherMain(int argc, wchar_t* argv[])
 {
+  if (IsWin10November2015UpdateOrLater()) {
+    const DynamicallyLinkedFunctionPtr<decltype(&SetProcessMitigationPolicy)>
+      pSetProcessMitigationPolicy(L"kernel32.dll", "SetProcessMitigationPolicy");
+    if (pSetProcessMitigationPolicy) {
+      // Make sure that the launcher process itself has image load policies set
+      PROCESS_MITIGATION_IMAGE_LOAD_POLICY imgLoadPol = {};
+      imgLoadPol.PreferSystem32Images = 1;
+
+      DebugOnly<BOOL> setOk = pSetProcessMitigationPolicy(ProcessImageLoadPolicy,
+                                                          &imgLoadPol,
+                                                          sizeof(imgLoadPol));
+      MOZ_ASSERT(setOk);
+    }
+  }
+
+  Maybe<bool> isElevated = IsElevated();
+  if (!isElevated) {
+    return 1;
+  }
+
+  if (isElevated.value()) {
+    return !LaunchUnelevated(argc, argv);
+  }
+
   UniquePtr<wchar_t[]> cmdLine(MakeCommandLine(argc, argv));
   if (!cmdLine) {
     return 1;
   }
 
   const Maybe<bool> isSafeMode = IsSafeModeRequested(argc, argv,
                                                      SafeModeFlag::None);
   if (!isSafeMode) {
--- a/browser/app/blocklist.xml
+++ b/browser/app/blocklist.xml
@@ -1,10 +1,10 @@
 <?xml version='1.0' encoding='UTF-8'?>
-<blocklist lastupdate="1524147337556" xmlns="http://www.mozilla.org/2006/addons-blocklist">
+<blocklist lastupdate="1525377135149" xmlns="http://www.mozilla.org/2006/addons-blocklist">
   <emItems>
     <emItem blockID="i334" id="{0F827075-B026-42F3-885D-98981EE7B1AE}">
       <prefs/>
       <versionRange minVersion="0" maxVersion="*" severity="3"/>
     </emItem>
     <emItem blockID="i1211" id="flvto@hotger.com">
       <prefs/>
       <versionRange minVersion="0" maxVersion="*" severity="1"/>
@@ -2246,16 +2246,24 @@
     <emItem blockID="feb2d0d7-1b76-4dba-bf84-42873a92af5f" id="/^({6ecb9f49-90f0-43a1-8f8a-e809ea4f732b})|(@googledashboard)|(@smashdashboard)|(@smash_tv)|(@smash_mov)|(@smashmovs)|(@smashtvs)|(@FirefoxUpdate)|({92b9e511-ac81-4d47-9b8f-f92dc872447e})|({3c841114-da8c-44ea-8303-78264edfe60b})|({116a0754-20eb-4fe5-bd35-575867a0b89e})|({6e6ff0fd-4ae4-49ae-ac0c-e2527e12359b})|({f992ac88-79d3-4960-870e-92c342ed3491})|({6ecb9f49-90f0-43a1-8f8a-e809ea4f732b})|({a512297e-4d3a-468c-bd1a-f77bd093f925})|({08c28c16-9fb6-4b32-9868-db37c1668f94})|({b4ab1a1d-e137-4c59-94d5-4f509358a81d})|({feedf4f8-08c1-451f-a717-f08233a64ec9})$/">
       <prefs/>
       <versionRange minVersion="0" maxVersion="*" severity="3"/>
     </emItem>
     <emItem blockID="96b137e6-8cb5-44d6-9a34-4a4a76fb5e38" id="/^({b99ae7b1-aabb-4674-ba8f-14ed32d04e76})|({dfa77d38-f67b-4c41-80d5-96470d804d09})$/">
       <prefs/>
       <versionRange minVersion="0" maxVersion="*" severity="3"/>
     </emItem>
+    <emItem blockID="3ab9f100-e253-4080-b3e5-652f842ddb7a" id="/((@extcorp\.[a-z]+)|(@brcorporation\.com)|(@brmodcorp\.com)|(@teset\.com)|(@modext\.tech)|(@ext?mod\.net)|(@browcorporation\.org)|(@omegacorporation\.org)|(@browmodule\.com)|(@corpext\.net)|({6b50ddac-f5e0-4d9e-945b-e4165bfea5d6})|({fab6484f-b8a7-4ba9-a041-0f948518b80c})|({b797035a-7f29-4ff5-bd19-77f1b5e464b1})|({0f612416-5c5a-4ec8-b482-eb546af9cac4}))$/">
+      <prefs/>
+      <versionRange minVersion="0" maxVersion="*" severity="3"/>
+    </emItem>
+    <emItem blockID="3a123214-b4b6-410c-a061-bbaf0d168d31" id="/^(({41c14ab8-9958-44bf-b74e-af54c1f169a6})|({78054cb2-e3e8-4070-a8ad-3fd69c8e4707})|({0089b179-8f3d-44d9-bb18-582843b0757a})|({f44ddcb4-4cc0-4866-92fa-eefda60c6720})|({1893d673-7953-4870-8069-baac49ce3335})|({fb28cac0-c2aa-4e0c-a614-cf3641196237})|({d7dee150-da14-45ba-afca-02c7a79ad805})|(RandomNameTest@RandomNameTest\.com )|(corpsearchengine@mail\.ru)|(support@work\.org))$/">
+      <prefs/>
+      <versionRange minVersion="0" maxVersion="*" severity="3"/>
+    </emItem>
   </emItems>
   <pluginItems>
     <pluginItem blockID="p332">
       <match exp="libflashplayer\.so" name="filename"/>
       <match exp="^Shockwave Flash 11.(0|1) r[0-9]{1,3}$" name="description"/>
       <infoURL>https://get.adobe.com/flashplayer/</infoURL>
       <versionRange severity="0" vulnerabilitystatus="1">
         <targetApplication id="{ec8030f7-c20a-464f-9b0e-13a3a9e97384}">
--- a/browser/app/moz.build
+++ b/browser/app/moz.build
@@ -59,16 +59,25 @@ if CONFIG['CC_TYPE'] in ('msvc', 'clang-
     # a console application.
     WIN32_EXE_LDFLAGS += ['-ENTRY:wmainCRTStartup']
 
 if CONFIG['OS_ARCH'] == 'WINNT':
     RCINCLUDE = 'splash.rc'
     DEFINES['MOZ_PHOENIX'] = True
     SOURCES += [
         'LauncherProcessWin.cpp',
+        'LaunchUnelevated.cpp',
+    ]
+    DELAYLOAD_DLLS += [
+        'oleaut32.dll',
+        'ole32.dll',
+    ]
+    OS_LIBS += [
+        'oleaut32',
+        'ole32',
     ]
 
 if CONFIG['MOZ_SANDBOX'] and CONFIG['OS_ARCH'] == 'WINNT':
     # For sandbox includes and the include dependencies those have
     LOCAL_INCLUDES += [
         '/security/sandbox/chromium',
         '/security/sandbox/chromium-shim',
     ]
--- a/browser/base/content/test/general/browser_keywordSearch.js
+++ b/browser/base/content/test/general/browser_keywordSearch.js
@@ -46,26 +46,17 @@ function test() {
                        Ci.nsIWebProgressListener.STATE_START;
         if (!(flags & docStart)) {
           return;
         }
 
         req.cancel(Cr.NS_ERROR_FAILURE);
       },
 
-      QueryInterface: function QueryInterface(aIID) {
-        if (aIID.equals(Ci.nsIWebProgressListener) ||
-            aIID.equals(Ci.nsIWebProgressListener2) ||
-            aIID.equals(Ci.nsISupportsWeakReference) ||
-            aIID.equals(Ci.nsISupports)) {
-          return this;
-        }
-
-        throw Cr.NS_ERROR_NO_INTERFACE;
-      }
+      QueryInterface: ChromeUtils.generateQI(["nsIWebProgressListener", "nsIWebProgressListener2", "nsISupportsWeakReference"])
     };
 
     let webProgress = docShell.QueryInterface(Ci.nsIInterfaceRequestor)
         .getInterface(Ci.nsIWebProgress);
     webProgress.addProgressListener(listener,
                                     Ci.nsIWebProgress.NOTIFY_STATE_DOCUMENT);
 
     addEventListener("unload", () => {
--- a/browser/base/content/test/urlbar/browser_bug623155.js
+++ b/browser/base/content/test/urlbar/browser_bug623155.js
@@ -53,23 +53,17 @@ function test() {
   gBrowser.getBrowserForTab(gNewTab)
           .webProgress
           .addProgressListener(gWebProgressListener,
                                Ci.nsIWebProgress
                                  .NOTIFY_LOCATION);
 }
 
 var gWebProgressListener = {
-  QueryInterface(aIID) {
-    if (aIID.equals(Ci.nsIWebProgressListener) ||
-        aIID.equals(Ci.nsISupportsWeakReference) ||
-        aIID.equals(Ci.nsISupports))
-      return this;
-    throw Cr.NS_NOINTERFACE;
-  },
+  QueryInterface: ChromeUtils.generateQI(["nsIWebProgressListener", "nsISupportsWeakReference"]),
 
   // ---------------------------------------------------------------------------
   // NOTIFY_LOCATION mode should work fine without these methods.
   //
   // onStateChange: function() {},
   // onStatusChange: function() {},
   // onProgressChange: function() {},
   // onSecurityChange: function() {},
--- a/browser/components/contextualidentity/test/browser/browser_forgetaboutsite.js
+++ b/browser/components/contextualidentity/test/browser/browser_forgetaboutsite.js
@@ -84,22 +84,17 @@ function getCacheStorage(where, lci, app
 
 function OpenCacheEntry(key, where, flags, lci) {
   return new Promise(resolve => {
     key = createURI(key);
     function CacheListener() { }
     CacheListener.prototype = {
       _appCache: null,
 
-      QueryInterface(iid) {
-        if (iid.equals(Ci.nsICacheEntryOpenCallback) ||
-            iid.equals(Ci.nsISupports))
-          return this;
-        throw Cr.NS_ERROR_NO_INTERFACE;
-      },
+      QueryInterface: ChromeUtils.generateQI(["nsICacheEntryOpenCallback"]),
 
       onCacheEntryCheck(entry, appCache) {
         return Ci.nsICacheEntryOpenCallback.ENTRY_WANTED;
       },
 
       onCacheEntryAvailable(entry, isnew, appCache, status) {
         resolve();
       },
--- a/browser/components/customizableui/test/browser_allow_dragging_removable_false.js
+++ b/browser/components/customizableui/test/browser_allow_dragging_removable_false.js
@@ -8,16 +8,20 @@ add_task(async function() {
   let forwardButton = document.getElementById("forward-button");
   is(forwardButton.getAttribute("removable"), "false", "forward-button should not be removable");
   ok(CustomizableUI.inDefaultState, "Should start in default state.");
 
   let urlbarContainer = document.getElementById("urlbar-container");
   let placementsAfterDrag = getAreaWidgetIds(CustomizableUI.AREA_NAVBAR);
   placementsAfterDrag.splice(placementsAfterDrag.indexOf("forward-button"), 1);
   placementsAfterDrag.splice(placementsAfterDrag.indexOf("urlbar-container"), 0, "forward-button");
+
+  // Force layout flush to ensure the drag completes as expected
+  urlbarContainer.clientWidth;
+
   simulateItemDrag(forwardButton, urlbarContainer, "start");
   assertAreaPlacements(CustomizableUI.AREA_NAVBAR, placementsAfterDrag);
   ok(!CustomizableUI.inDefaultState, "Should no longer be in default state.");
   let palette = document.getElementById("customization-palette");
   simulateItemDrag(forwardButton, palette);
   is(CustomizableUI.getPlacementOfWidget("forward-button").area, CustomizableUI.AREA_NAVBAR, "forward-button was not able to move to palette");
 
   await endCustomizing();
--- a/browser/components/originattributes/test/browser/browser_cache.js
+++ b/browser/components/originattributes/test/browser/browser_cache.js
@@ -42,22 +42,17 @@ function cacheDataForContext(loadContext
       onCacheStorageInfo(num, consumption) {},
       onCacheEntryInfo(uri, idEnhance) {
         cacheEntries.push({ uri,
                             idEnhance });
       },
       onCacheEntryVisitCompleted() {
         resolve(cacheEntries);
       },
-      QueryInterface(iid) {
-        if (iid.equals(Ci.nsICacheStorageVisitor))
-          return this;
-
-        throw Cr.NS_ERROR_NO_INTERFACE;
-      }
+      QueryInterface: ChromeUtils.generateQI(["nsICacheStorageVisitor"])
     };
     // Visiting the disk cache also visits memory storage so we do not
     // need to use Services.cache2.memoryCacheStorage() here.
     let storage = Services.cache2.diskCacheStorage(loadContextInfo, false);
     storage.asyncVisitStorage(cacheVisitor, true);
   });
 }
 
--- a/browser/components/originattributes/test/browser/browser_sanitize.js
+++ b/browser/components/originattributes/test/browser/browser_sanitize.js
@@ -20,22 +20,17 @@ function cacheDataForContext(loadContext
     let cacheVisitor = {
       onCacheStorageInfo(num, consumption) {},
       onCacheEntryInfo(uri, idEnhance) {
         cachedURIs.push(uri.asciiSpec);
       },
       onCacheEntryVisitCompleted() {
         resolve(cachedURIs);
       },
-      QueryInterface(iid) {
-        if (iid.equals(Ci.nsICacheStorageVisitor))
-          return this;
-
-        throw Cr.NS_ERROR_NO_INTERFACE;
-      }
+      QueryInterface: ChromeUtils.generateQI(["nsICacheStorageVisitor"])
     };
     // Visiting the disk cache also visits memory storage so we do not
     // need to use Services.cache2.memoryCacheStorage() here.
     let storage = Services.cache2.diskCacheStorage(loadContextInfo, false);
     storage.asyncVisitStorage(cacheVisitor, true);
   });
 }
 
--- a/browser/components/places/content/treeView.js
+++ b/browser/components/places/content/treeView.js
@@ -56,17 +56,17 @@ PlacesTreeView.prototype = {
   __xulStore: null,
   get _xulStore() {
     if (!this.__xulStore) {
       this.__xulStore = Cc["@mozilla.org/xul/xulstore;1"].getService(Ci.nsIXULStore);
     }
     return this.__xulStore;
   },
 
-  QueryInterface: XPCOMUtils.generateQI(PTV_interfaces),
+  QueryInterface: ChromeUtils.generateQI(PTV_interfaces),
 
   // Bug 761494:
   // ----------
   // Some addons use methods from nsINavHistoryResultObserver and
   // nsINavHistoryResultTreeViewer, without QIing to these interfaces first.
   // That's not a problem when the view is retrieved through the
   // <tree>.view getter (which returns the wrappedJSObject of this object),
   // it raises an issue when the view retrieved through the treeBoxObject.view
--- a/browser/components/places/tests/unit/test_PUIU_batchUpdatesForNode.js
+++ b/browser/components/places/tests/unit/test_PUIU_batchUpdatesForNode.js
@@ -3,16 +3,18 @@
 // docs: http://sinonjs.org/releases/v2.3.2/
 ChromeUtils.import("resource://gre/modules/Timer.jsm");
 Services.scriptloader.loadSubScript("resource://testing-common/sinon-2.3.2.js", this);
 /* globals sinon */
 // ================================================
 
 ChromeUtils.import("resource:///modules/PlacesUIUtils.jsm");
 
+/* eslint-disable mozilla/use-chromeutils-generateqi */
+
 add_task(async function test_no_result_node() {
   let functionSpy = sinon.stub().returns(Promise.resolve());
 
   await PlacesUIUtils.batchUpdatesForNode(null, 1, functionSpy);
 
   Assert.ok(functionSpy.calledOnce,
     "Passing a null result node should still call the wrapped function");
 });
--- a/browser/components/uitour/test/browser_UITour_modalDialog.js
+++ b/browser/components/uitour/test/browser_UITour_modalDialog.js
@@ -1,10 +1,12 @@
 "use strict";
 
+/* eslint-disable mozilla/use-chromeutils-generateqi */
+
 var gTestTab;
 var gContentAPI;
 var gContentWindow;
 var handleDialog;
 
 // Modified from toolkit/components/passwordmgr/test/prompt_common.js
 var didDialog;
 
--- a/browser/modules/test/browser/browser_ProcessHangNotifications.js
+++ b/browser/modules/test/browser/browser_ProcessHangNotifications.js
@@ -74,22 +74,17 @@ TestHangReport.prototype = {
   get addonId() {
     return this._addonId;
   },
 
   get hangType() {
     return this._hangType;
   },
 
-  QueryInterface(aIID) {
-    if (aIID.equals(Ci.nsIHangReport) ||
-        aIID.equals(Ci.nsISupports))
-      return this;
-    throw Cr.NS_NOINTERFACE;
-  },
+  QueryInterface: ChromeUtils.generateQI(["nsIHangReport"]),
 
   userCanceled() {
     this._resolver(TEST_ACTION_CANCELLED);
   },
 
   terminateScript() {
     this._resolver(TEST_ACTION_TERMSCRIPT);
   },
--- a/build/moz.configure/old.configure
+++ b/build/moz.configure/old.configure
@@ -219,17 +219,16 @@ def old_configure_options(*options):
     '--enable-system-pixman',
     '--enable-system-sqlite',
     '--enable-tasktracer',
     '--enable-thread-sanitizer',
     '--enable-signed-overflow-sanitizer',
     '--enable-universalchardet',
     '--enable-unsigned-overflow-sanitizer',
     '--enable-updater',
-    '--enable-valgrind',
     '--enable-verify-mar',
     '--enable-xul',
     '--enable-zipwriter',
     '--includedir',
     '--libdir',
     '--no-create',
     '--prefix',
     '--with-android-distribution-directory',
@@ -255,17 +254,16 @@ def old_configure_options(*options):
     '--with-macos-private-frameworks',
     '--with-macos-sdk',
     '--with-nspr-cflags',
     '--with-nspr-exec-prefix',
     '--with-nspr-libs',
     '--with-nspr-prefix',
     '--with-nss-exec-prefix',
     '--with-nss-prefix',
-    '--with-pthreads',
     '--with-qemu-exe',
     '--with-sixgill',
     '--with-soft-float',
     '--with-system-bz2',
     '--with-system-icu',
     '--with-system-jpeg',
     '--with-system-libevent',
     '--with-system-libvpx',
--- a/build/moz.configure/toolchain.configure
+++ b/build/moz.configure/toolchain.configure
@@ -490,17 +490,17 @@ def check_compiler(compiler, language, t
 
     # Note: MSVC, while supporting C++14, still reports 199711L for __cplusplus.
     # Note: this is a strict version check because we used to always add
     # -std=gnu++14.
     cxx14_version = 201402
     if info.language == 'C++':
         if info.type == 'clang' and info.language_version != cxx14_version:
             append_flag('-std=gnu++14')
-        # MSVC 2015 headers include C++14 features, but don't guard them
+        # MSVC headers include C++14 features, but don't guard them
         # with appropriate checks.
         elif info.type == 'clang-cl' and info.language_version != cxx14_version:
             append_flag('-std=c++14')
 
     # We force clang-cl to emulate Visual C++ 2017 version 15.6.0
     msvc_version = '19.13.26128'
     if info.type == 'clang-cl' and info.version != msvc_version:
         # This flag is a direct clang-cl flag that doesn't need -Xclang,
@@ -556,54 +556,38 @@ def get_vc_paths(topsrcdir):
         encoding = 'mbcs' if sys.platform == 'win32' else 'utf-8'
         return json.loads(
             subprocess.check_output([
                 os.path.join(topsrcdir, 'build/win32/vswhere.exe'),
                 '-format',
                 'json'
             ] + args).decode(encoding, 'replace'))
 
-    # Can't pass -requires with -legacy, so query each separately.
-    # Legacy versions first (VS2015)
-    for install in vswhere(['-legacy', '-version', '[14.0,15.0)']):
-        version = Version(install['installationVersion'])
-        # Skip anything older than VS2015.
-        if version < '14':
-            continue
-        path = install['installationPath']
-
-        yield (Version(install['installationVersion']), {
-            'x64': [os.path.join(path, r'VC\bin\amd64')],
-            # The x64->x86 cross toolchain requires DLLs from the native x64 toolchain.
-            'x86': [os.path.join(path, r'VC\bin\amd64_x86'), os.path.join(path, r'VC\bin\amd64')],
-        })
-    # Then VS2017 and newer.
     for install in vswhere(['-requires', 'Microsoft.VisualStudio.Component.VC.Tools.x86.x64']):
         path = install['installationPath']
         tools_version = open(os.path.join(
             path, r'VC\Auxiliary\Build\Microsoft.VCToolsVersion.default.txt'), 'rb').read().strip()
         tools_path = os.path.join(
             path, r'VC\Tools\MSVC', tools_version, r'bin\HostX64')
         yield (Version(install['installationVersion']), {
             'x64': [os.path.join(tools_path, 'x64')],
             # The x64->x86 cross toolchain requires DLLs from the native x64 toolchain.
             'x86': [os.path.join(tools_path, 'x86'), os.path.join(tools_path, 'x64')],
         })
 
 
 js_option('--with-visual-studio-version', nargs=1,
-          choices=('2015', '2017'),
+          choices=('2017',),
           help='Select a specific Visual Studio version to use')
 
 
 @depends('--with-visual-studio-version')
 def vs_major_version(value):
     if value:
-        return {'2015': 14,
-                '2017': 15}[value[0]]
+        return {'2017': 15}[value[0]]
 
 
 @depends(host, target, vs_major_version, check_build_environment, '--with-visual-studio-version')
 @imports(_from='__builtin__', _import='sorted')
 @imports(_from='operator', _import='itemgetter')
 @imports('platform')
 def vc_compiler_path(host, target, vs_major_version, env, vs_release_name):
     if host.kernel != 'WINNT':
@@ -912,17 +896,28 @@ def compiler(language, host_or_target, c
             raise FatalCheckError(
                 'Only clang/llvm 3.6 or newer is supported.')
 
         if info.type == 'msvc':
             if info.version < '19.13.26128':
                 raise FatalCheckError(
                     'This version (%s) of the MSVC compiler is not '
                     'supported.\n'
-                    'You must install Visual C++ 2017 Update 6 or newer in '
+                    'You must install Visual C++ 2017 Update 6 in '
+                    'order to build.\n'
+                    'See https://developer.mozilla.org/en/'
+                    'Windows_Build_Prerequisites' % info.version)
+
+            # MSVC version 15.7 and the previews for 15.8, at least,
+            # can't build Firefox.
+            if info.version >= '19.14.0':
+                raise FatalCheckError(
+                    'This version (%s) of the MSVC compiler is not '
+                    'supported due to compiler bugs.\n'
+                    'You must install Visual C++ 2017 Update 6 in '
                     'order to build.\n'
                     'See https://developer.mozilla.org/en/'
                     'Windows_Build_Prerequisites' % info.version)
 
         if info.flags:
             raise FatalCheckError(
                 'Unknown compiler or compiler not supported.')
 
@@ -1039,18 +1034,16 @@ building_with_gcc = depends(c_compiler)(
 
 @depends(c_compiler)
 def msvs_version(info):
     # clang-cl emulates the same version scheme as cl. And MSVS_VERSION needs to
     # be set for GYP on Windows.
     if info.type in ('clang-cl', 'msvc'):
         if info.version >= '19.10':
             return '2017'
-        elif info.version >= '19.00':
-            return '2015'
 
     return ''
 
 
 set_config('MSVS_VERSION', msvs_version)
 
 include('compile-checks.configure')
 
--- a/devtools/client/debugger/new/README.mozilla
+++ b/devtools/client/debugger/new/README.mozilla
@@ -1,13 +1,13 @@
 This is the debugger.html project output.
 See https://github.com/devtools-html/debugger.html
 
-Version 49.0
+Version 50
 
-Comparison: https://github.com/devtools-html/debugger.html/compare/release-48...release-49
+Comparison: https://github.com/devtools-html/debugger.html/compare/release-49...release-50
 
 Packages:
 - babel-plugin-transform-es2015-modules-commonjs @6.26.2
 - babel-preset-react @6.24.1
 - react @16.2.0
 - react-dom @16.2.0
 - webpack @3.11.0
--- a/devtools/client/debugger/new/debugger.css
+++ b/devtools/client/debugger/new/debugger.css
@@ -2338,31 +2338,48 @@ button.jump-definition {
   border-top-color: var(--theme-body-color);
 }
 
 .bracket-arrow.down::after {
   border-bottom-color: transparent;
   border-top-color: var(--theme-body-background);
   top: -1px;
 }
+
+.bracket-arrow.left::before {
+  border-left-color: transparent;
+  border-right-color: var(--theme-splitter-color);
+  top: 0px;
+}
+
+.theme-dark .bracket-arrow.left::before {
+  border-right-color: var(--theme-body-color);
+}
+
+.bracket-arrow.left::after {
+  border-left-color: transparent;
+  border-right-color: var(--theme-body-background);
+  top: 0px;
+  left: 1px;
+}
 /* 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/>. */
 
 .popover {
   position: fixed;
   z-index: 100;
 }
 
 .popover .gap {
   height: 5px;
   padding-top: 5px;
 }
 
-.popover .preview-popup {
+.popover:not(.orientation-right) .preview-popup {
   margin-left: -55px;
 }
 
 .popover .add-to-expression-bar {
   margin-left: -55px;
 }
 /* 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
@@ -3064,16 +3081,20 @@ html[dir="rtl"] .breakpoints-list .break
 .breakpoint .close {
   visibility: hidden;
 }
 
 .breakpoint:hover .close {
   visibility: visible;
 }
 
+.CodeMirror.cm-s-mozilla-breakpoint {
+  cursor: default;
+}
+
 .CodeMirror.cm-s-mozilla-breakpoint .CodeMirror-lines {
   padding: 0;
 }
 
 .CodeMirror.cm-s-mozilla-breakpoint .CodeMirror-sizer {
   min-width: initial !important;
 }
 
@@ -3086,17 +3107,16 @@ html[dir="rtl"] .breakpoints-list .break
   max-width: 100%;
   overflow: hidden;
   text-overflow: ellipsis;
   display: inline-block;
 }
 
 .CodeMirror.cm-s-mozilla-breakpoint .CodeMirror-code,
 .CodeMirror.cm-s-mozilla-breakpoint .CodeMirror-scroll {
-  cursor: default;
   pointer-events: none;
 }
 
 .CodeMirror.cm-s-mozilla-breakpoint {
   padding-top: 1px;
 }
 /* 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
@@ -3799,16 +3819,17 @@ img.skipPausing {
   height: 100%;
   width: 100%;
   display: flex;
   flex-direction: column;
 }
 
 .secondary-panes .accordion {
   flex: 1 0 auto;
+  margin-bottom: 0;
 }
 
 .secondary-panes-wrapper .accordion li:last-child ._content {
   border-bottom: 0;
 }
 
 .pane {
   color: var(--theme-body-color);
--- a/devtools/client/debugger/new/debugger.js
+++ b/devtools/client/debugger/new/debugger.js
@@ -130,49 +130,16 @@ function getRawTag(value) {
   return result;
 }
 
 module.exports = getRawTag;
 
 
 /***/ }),
 
-/***/ 100:
-/***/ (function(module, exports, __webpack_require__) {
-
-var assocIndexOf = __webpack_require__(96);
-
-/**
- * Sets the list cache `key` to `value`.
- *
- * @private
- * @name set
- * @memberOf ListCache
- * @param {string} key The key of the value to set.
- * @param {*} value The value to set.
- * @returns {Object} Returns the list cache instance.
- */
-function listCacheSet(key, value) {
-  var data = this.__data__,
-      index = assocIndexOf(data, key);
-
-  if (index < 0) {
-    ++this.size;
-    data.push([key, value]);
-  } else {
-    data[index][1] = value;
-  }
-  return this;
-}
-
-module.exports = listCacheSet;
-
-
-/***/ }),
-
 /***/ 1000:
 /***/ (function(module, exports) {
 
 module.exports = "<!-- 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 version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" viewBox=\"0 -2.5 34 32\"><path d=\"M19.314 15.987c0 1.321-1.071 2.392-2.392 2.392s-2.392-1.071-2.392-2.392c0-1.321 1.071-2.392 2.392-2.392s2.392 1.071 2.392 2.392z\"></path><path d=\"M16.922 24.783c1.878 1.826 3.729 2.906 5.221 2.906 0.489 0 0.952-0.103 1.337-0.334 1.337-0.772 1.826-2.701 1.363-5.453-0.077-0.489-0.18-0.977-0.309-1.492 0.514-0.154 0.977-0.309 1.44-0.463 2.598-1.003 4.038-2.392 4.038-3.909 0-1.543-1.44-2.932-4.038-3.909-0.463-0.18-0.926-0.334-1.44-0.463 0.129-0.514 0.232-1.003 0.309-1.492 0.437-2.803-0.051-4.758-1.389-5.53-0.386-0.231-0.849-0.334-1.337-0.334-1.466 0-3.344 1.080-5.221 2.906-1.852-1.826-3.704-2.906-5.195-2.906-0.489 0-0.952 0.103-1.337 0.334-1.337 0.772-1.826 2.701-1.363 5.453 0.077 0.489 0.18 0.977 0.309 1.492-0.514 0.154-0.977 0.309-1.44 0.463-2.598 1.003-4.038 2.392-4.038 3.909 0 1.543 1.44 2.932 4.038 3.909 0.463 0.18 0.926 0.334 1.44 0.463-0.129 0.514-0.232 1.003-0.309 1.492-0.437 2.752 0.051 4.707 1.363 5.453 0.386 0.232 0.849 0.334 1.337 0.334 1.492 0.051 3.344-1.029 5.221-2.829v0zM15.481 21.311c0.463 0.026 0.952 0.026 1.44 0.026s0.977 0 1.44-0.026c-0.463 0.617-0.952 1.183-1.44 1.723-0.489-0.54-0.977-1.106-1.44-1.723zM12.292 18.662c0.257 0.437 0.489 0.849 0.772 1.26-0.797-0.103-1.543-0.232-2.263-0.386 0.232-0.694 0.489-1.415 0.797-2.135 0.206 0.411 0.437 0.849 0.694 1.26zM10.8 12.463c0.72-0.154 1.466-0.283 2.263-0.386-0.257 0.412-0.514 0.823-0.772 1.26s-0.489 0.849-0.694 1.286c-0.334-0.746-0.592-1.466-0.797-2.161zM12.215 15.987c0.334-0.694 0.694-1.389 1.106-2.083 0.386-0.669 0.823-1.337 1.26-2.006 0.772-0.051 1.543-0.077 2.341-0.077 0.823 0 1.595 0.026 2.341 0.077 0.463 0.669 0.874 1.337 1.26 2.006 0.412 0.694 0.772 1.389 1.106 2.083-0.334 0.694-0.694 1.389-1.106 2.083-0.386 0.669-0.823 1.337-1.26 2.006-0.772 0.051-1.543 0.077-2.341 0.077-0.823 0-1.595-0.026-2.341-0.077-0.463-0.669-0.874-1.337-1.26-2.006-0.412-0.695-0.772-1.389-1.106-2.083v0zM22.272 14.598l-0.694-1.286c-0.257-0.437-0.489-0.849-0.772-1.26 0.797 0.103 1.543 0.232 2.263 0.386-0.231 0.72-0.489 1.44-0.797 2.161v0zM22.272 17.376c0.309 0.72 0.566 1.44 0.797 2.135-0.72 0.154-1.466 0.283-2.263 0.386 0.257-0.412 0.514-0.823 0.772-1.26 0.232-0.386 0.463-0.823 0.694-1.26v0zM22.863 26.301c-0.206 0.129-0.463 0.18-0.746 0.18-1.26 0-2.829-1.029-4.372-2.572 0.746-0.797 1.466-1.698 2.186-2.701 1.209-0.103 2.366-0.283 3.447-0.54 0.129 0.463 0.206 0.926 0.283 1.389 0.36 2.186 0.077 3.755-0.797 4.244zM24.201 12.746c2.881 0.823 4.604 2.083 4.604 3.241 0 1.003-1.183 2.006-3.266 2.804-0.412 0.154-0.874 0.309-1.337 0.437-0.334-1.055-0.746-2.135-1.26-3.241 0.514-1.106 0.952-2.186 1.26-3.241v0zM22.143 5.493c0.283 0 0.514 0.051 0.746 0.18 0.849 0.489 1.157 2.032 0.797 4.244-0.077 0.437-0.18 0.9-0.283 1.389-1.080-0.232-2.238-0.412-3.447-0.54-0.694-1.003-1.44-1.903-2.186-2.701 1.543-1.518 3.112-2.572 4.372-2.572zM18.362 10.663c-0.463-0.026-0.952-0.026-1.44-0.026s-0.977 0-1.44 0.026c0.463-0.617 0.952-1.183 1.44-1.723 0.489 0.54 0.977 1.132 1.44 1.723v0zM10.98 5.673c0.206-0.129 0.463-0.18 0.746-0.18 1.26 0 2.829 1.029 4.372 2.572-0.746 0.797-1.466 1.697-2.186 2.701-1.209 0.103-2.366 0.283-3.447 0.54-0.129-0.463-0.206-0.926-0.283-1.389-0.36-2.186-0.077-3.729 0.797-4.244v0zM9.643 19.228c-2.881-0.823-4.604-2.083-4.604-3.241 0-1.003 1.183-2.006 3.266-2.803 0.412-0.154 0.874-0.309 1.337-0.437 0.334 1.055 0.746 2.135 1.26 3.241-0.514 1.106-0.952 2.212-1.26 3.241zM10.183 22.057c0.077-0.437 0.18-0.9 0.283-1.389 1.080 0.232 2.238 0.412 3.447 0.54 0.694 1.003 1.44 1.903 2.186 2.701-1.543 1.517-3.112 2.572-4.372 2.572-0.283 0-0.514-0.051-0.746-0.18-0.875-0.489-1.157-2.058-0.797-4.244z\"></path></svg>"
 
 /***/ }),
 
 /***/ 1001:
@@ -198,102 +165,16 @@ module.exports = "<!-- This Source Code 
 
 /***/ 1004:
 /***/ (function(module, exports) {
 
 module.exports = "<!-- 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 version=\"1.1\" id=\"Layer_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\" viewBox=\"0 0 128 128\" style=\"enable-background:new 0 0 128 128;\" xml:space=\"preserve\"><style type=\"text/css\"> .st0{fill:#C1272D;} .st1{fill:#EFCCA3;} .st2{fill:#ED1C24;} .st3{fill:#CCAC8D;} .st4{fill:#FFFFFF;} .st5{fill:#FF931E;} .st6{fill:#FFB81E;} .st7{fill:#56332B;} .st8{fill:#442823;} .st9{fill:#7F4A41;} .st10{fill:#331712;} .st11{fill:#FFCC66;} .st12{fill:#CCCCCC;} .st13{fill:#B3B3B3;} .st14{fill:#989898;} .st15{fill:#323232;} .st16{fill:#1E1E1E;} .st17{fill:#4C4C4C;} .st18{fill:#E6E6E6;} .st19{fill:#606060;} </style><g><path class=\"st1\" d=\"M107.4,50.9c-0.2-4.4,0.4-8.3-1.6-11.6c-4.8-8.2-16.8-13-40.8-13V27c0,0-0.5,0-0.5,0c0,0,0.5,0,0.5,0v-0.7 c-24,0-36.6,4.8-41.4,13.1c-1.9,3.4-1.7,7.2-2,11.6c-0.2,3.5-1.8,7.2-1.1,11.2c0.8,5.2,1.1,10.4,1.9,15.2c0.6,3.9,6,7.2,6.5,10.9 c1.4,10.2,12,14.9,36,14.9v0.8h-0.6h0.1H65v-0.8c24,0,34.2-4.7,35.5-14.9c0.5-3.8,5.5-7,6.1-10.9c0.8-4.8,1.1-10,1.9-15.2 C109.2,58.2,107.6,54.4,107.4,50.9z\"></path><path class=\"st3\" d=\"M64.6,54.5c4.3,0.1,7.3,2.8,10.1,5.3c3.3,2.9,8.9,4.9,11.2,7.4c2.3,2.5,5.3,5,6.4,8.9 c1.1,3.9,1.4,8.9,1.4,10.2c0,1.3,0.7,1,2.7,0c4.7-2.3,9.9-8.5,9.9-8.5c-0.6,3.9-5.7,7.4-6.2,11.1C98.9,99.1,89,104,64.5,104h-0.1h0 H65\"></path><path class=\"st3\" d=\"M80.4,46.7c0.9,3.1,4.1,13.6-2.1,10.1c0,0,2.6,1.5,4.2,7.2c1.7,5.7,5.8,6.4,5.8,6.4s6.7,1.3,11.7-3 c4.2-3.6,4.9-10,3.1-14.9c-1.8-4.8-5-6.3-9.7-7.3C88.7,44.1,79.3,43.2,80.4,46.7z\"></path><g><circle cx=\"92.3\" cy=\"58.1\" r=\"8.8\"></circle><circle class=\"st4\" cx=\"90\" cy=\"54.2\" r=\"2.3\"></circle></g><path class=\"st1\" d=\"M78.9,57.7c0,0,7.9,5.4,12.2,10.7c4.3,5.3,4.2,6.3,4.2,6.3l-3.1,1.4c0,0-4.4-8.3-9.8-11.4 c-5.5-3.1-6.1-5.7-6.1-5.7L78.9,57.7z\"></path><path class=\"st3\" d=\"M64.9,54.5c-4.3,0.1-7.5,2.8-10.4,5.3c-3.3,2.9-9.1,4.9-11.4,7.4c-2.3,2.5-5.4,5-6.5,8.9 c-1.1,3.9-1.5,8.9-1.5,10.2c0,1.3,0.2,1.4-2.7,0c-4.7-2.2-9.9-8.5-9.9-8.5c0.6,3.9,5.7,7.4,6.2,11.1C30.1,99.1,40,104,64.5,104h0.1 h0H65\"></path><path class=\"st7\" d=\"M88.1,71.4C83.3,65.5,75.6,60,64.9,60h-0.1h0c-10.7,0-18.4,5.5-23.2,11.4c-5,6.1-4.6,8.5-4.6,14.3 c0,21,7.4,15,12.3,17.6c5,2.5,10.2,1.7,15.5,1.7h0h0.1c5.4,0,10.5,0.7,15.5-1.8c4.9-2.5,12.3,3.7,12.3-17.3 C92.8,80.1,93.1,77.5,88.1,71.4z\"></path><path class=\"st8\" d=\"M64.4,65.2c0,0-0.7,9.7-2.1,11.6l2.6-0.6L64.4,65.2z\"></path><path class=\"st8\" d=\"M65.1,65.2c0,0,0.7,9.7,2.1,11.6l-2.6-0.6L65.1,65.2z\"></path><path class=\"st7\" d=\"M56.7,62.9c-1-2.3,2.6-6,8.3-6.1c5.7,0,9.3,3.7,8.3,6.1c-1,2.4-4.6,3.1-8.3,3.2C61.4,66,57.7,65.3,56.7,62.9z\"></path><path d=\"M65,65.2c0-0.4,3.4-0.5,5.2-1.7c0,0-3.7,1.2-4.5,0.7c-0.8-0.4-1-1.6-1-1.6s-0.3,1.2-0.9,1.6c-0.7,0.4-4.9-0.7-4.9-0.7 s5.6,1.4,5.6,1.7c0,0.3-0.1,1.3-0.1,2c0,2.5,0,8.7,0.4,9.2c0.6,0.9,0.4-6.7,0.4-9.2C65.1,66.4,65.1,65.6,65,65.2z\"></path><path class=\"st9\" d=\"M65.2,78.6c1.7,0,4.7,1.2,7.4,3.1c-2.6-2.9-5.7-4.9-7.4-4.9c-1.8,0-5.6,2.2-8.3,5.4 C59.7,80,63.3,78.6,65.2,78.6z\"></path><path class=\"st8\" d=\"M64.5,96.3c-3.8,0-7.5-1.2-10.9-2.1c-0.7-0.2-1.4,0.3-2.1,0.1c-6.3-2-11.4-5.4-14.5-9.7c0,0.3,0,0.7,0,1 c0,21,7.4,15.1,12.3,17.6c5,2.5,10.2,1.7,15.5,1.7h0h0.1c5.4,0,10.5,0.7,15.5-1.8c4.9-2.5,12.3,3.6,12.3-17.4c0-0.8,0-1.6,0.1-2.3 c-2.9,4.7-8.2,8.4-14.8,10.6c-0.6,0.2-2-0.3-2.6-0.2C71.8,95,68.6,96.3,64.5,96.3z\"></path><path class=\"st8\" d=\"M55,85c0,0-2.5,7.5-0.8,10.8l-2.3-1C51.9,94.8,53.6,87.2,55,85z\"></path><path class=\"st8\" d=\"M74.8,85c0,0,2.5,7.5,0.8,10.8l2.3-1C77.9,94.8,76.1,87.2,74.8,85z\"></path><path class=\"st3\" d=\"M48.6,46.7c-0.9,3.1-4.1,13.6,2.1,10.1c0,0-2.6,1.5-4.2,7.2s-5.8,6.4-5.8,6.4s-6.7,1.3-11.7-3 c-4.2-3.6-4.9-10-3.1-14.9s5-6.3,9.7-7.3C40.3,44.1,49.6,43.2,48.6,46.7z\"></path><path d=\"M64.9,76.8c2.7,0,11.1,5.8,11.2,12.9c0-0.1,0-0.2,0-0.4c0-7.4-6.8-13.3-11.2-13.3c-4.4,0-11.2,6-11.2,13.3 c0,0.1,0,0.2,0,0.4C53.8,82.6,62.2,76.8,64.9,76.8z\"></path><g><ellipse transform=\"matrix(0.9683 -0.2497 0.2497 0.9683 -13.2339 18.6065)\" class=\"st10\" cx=\"66.7\" cy=\"61.5\" rx=\"0.8\" ry=\"1.5\"></ellipse><ellipse transform=\"matrix(0.9551 0.2963 -0.2963 0.9551 21.0115 -15.7209)\" class=\"st10\" cx=\"62.4\" cy=\"61.5\" rx=\"0.8\" ry=\"1.5\"></ellipse></g><g><circle cx=\"37.2\" cy=\"58.1\" r=\"8.8\"></circle><circle class=\"st4\" cx=\"39.5\" cy=\"54.2\" r=\"2.3\"></circle></g><g><path class=\"st9\" d=\"M67.5,58.2c0-0.1-2.3,1-2.9,1.1c-0.6-0.1-2.9-1.2-2.9-1.1c0,0,1.9,0,2.9,0C65.6,58.2,67.5,58.2,67.5,58.2z\"></path></g><path class=\"st1\" d=\"M50,57.7c0,0-7.9,5.4-12.2,10.7c-4.3,5.3-4.2,6.3-4.2,6.3l3.1,1.4c0,0,4.4-8.3,9.8-11.4s6.1-5.7,6.1-5.7 L50,57.7z\"></path><path class=\"st3\" d=\"M32.7,41.7c0,0-2.7,7.4-8.7,10.5C24,52.2,33.4,51.1,32.7,41.7z\"></path><path class=\"st3\" d=\"M95.8,41.7c0,0,2.7,7.4,8.7,10.5C104.5,52.2,95.1,51.1,95.8,41.7z\"></path><path class=\"st3\" d=\"M78.7,55.5c0,0-5.9-6.2-13.8-6.4l0,0c-0.1,0,0.2,0,0.1,0c-0.1,0,0.1,0,0.1,0v0c-8,0.2-13.8,6.4-13.8,6.4 c6.9-4.8,12.8-4.7,13.8-4.7v0c0,0,0,0,0,0c0,0,0,0,0,0v0C65,50.8,71.8,50.7,78.7,55.5z\"></path><path class=\"st3\" d=\"M71.8,42.5c0,0-3-4.2-7-4.3l0,0c0,0,0.1,0,0.1,0c0,0,0.1,0,0.1,0v0c-3,0.1-6.9,4.3-6.9,4.3 c3.4-3.3,6.9-3.2,6.9-3.2v0c0,0,0,0,0,0c0,0,0,0,0,0v0C65,39.3,68.3,39.2,71.8,42.5z\"></path><path class=\"st3\" d=\"M37.2,73.2c0,0-4.7,2.3-8.1,0.9l0,0c0,0-0.1,0-0.1,0c0,0,0,0,0,0v0c-3-1.7-4.5-6.8-4.5-6.8 S27.5,76.3,37.2,73.2z\"></path><path class=\"st3\" d=\"M92,73.2c0,0,4.7,2.3,8.1,0.9l0,0c0,0,0,0,0,0c0,0,0,0,0,0v0c4-1.7,4.6-6.8,4.6-6.8S101.7,76.3,92,73.2z\"></path><g><path class=\"st3\" d=\"M42.6,41.2c2.6-0.5,6.9-0.6,10.3,0.5c4.3,1.5,0.8,7,1.7,7.3c0.9,0.3,2.1-3.8,10.1-3.4c8.1,0.4,9,4,10.1,3.4 s-1.1-10,11-7.8c0,0-12.7-3.4-12.1,5.8c0,0-7.3-5.6-17.5-0.6C56.3,46.4,58.9,37.8,42.6,41.2z\"></path></g><path class=\"st3\" d=\"M86.9,41.2c0.2,0,0.3,0.1,0.4,0.1C87.4,41.3,87.2,41.2,86.9,41.2z\"></path><path class=\"st3\" d=\"M86.9,41.2C86.9,41.2,86.9,41.2,86.9,41.2C86.9,41.2,86.9,41.2,86.9,41.2z\"></path><path class=\"st3\" d=\"M39.1,28.9c0,0-10.8,13.6-12.4,18.8c-1.6,5.3-2.8,27-4.2,30.1l-5-21.4l9.2-22.3L39.1,28.9z\"></path><path class=\"st3\" d=\"M89.9,28.9c0,0,10.8,13.6,12.4,18.8c1.6,5.3,2.8,27,4.2,30.1l5-21.4l-9.2-22.3L89.9,28.9z\"></path><path class=\"st7\" d=\"M89.4,28.9c0,0,11.6,9.7,15,20.9c3.4,11.2,2,24.8,4.6,26.5c3.7,2.4,7.9-11.9,9.3-13.4c2.2-2.4,9.5-8.5,10-9.6 c0.5-1.1-14.8-17.8-21.5-21.1C98.7,28.4,88.7,28.1,89.4,28.9z\"></path><path class=\"st8\" d=\"M99.3,34.9c0,0,13.7,17.5,13.5,39.3l5.5-11.2C118.2,63,113.4,48.7,99.3,34.9z\"></path><path class=\"st7\" d=\"M39.1,28.9c0,0-11.6,9.7-15,20.9s-2,24.8-4.6,26.5c-3.7,2.4-7.9-11.9-9.3-13.4c-2.2-2.4-9.5-8.5-10-9.6 c-0.5-1.1,14.8-17.8,21.5-21.1C29.8,28.4,39.8,28.1,39.1,28.9z\"></path><path class=\"st8\" d=\"M29.2,34.9c0,0-13.7,17.5-13.5,39.3L10.3,63C10.3,63,15.1,48.7,29.2,34.9z\"></path><path class=\"st3\" d=\"M21.8,74.6c0,0,1,5.4,2.6,7.1s0.5-1.3,0.5-1.3s-1.7-0.9-1.4-7.8S21.8,74.6,21.8,74.6z\"></path><path class=\"st3\" d=\"M107.1,74.6c0,0-1,5.4-2.6,7.1s-0.5-1.3-0.5-1.3s1.7-0.9,1.4-7.8S107.1,74.6,107.1,74.6z\"></path><g><circle class=\"st8\" cx=\"54.5\" cy=\"70.5\" r=\"0.8\"></circle><circle class=\"st8\" cx=\"49.9\" cy=\"75.3\" r=\"0.8\"></circle><circle class=\"st8\" cx=\"48.4\" cy=\"70.5\" r=\"0.8\"></circle></g><g><circle class=\"st8\" cx=\"74\" cy=\"70.5\" r=\"0.8\"></circle><circle class=\"st8\" cx=\"78.6\" cy=\"75.3\" r=\"0.8\"></circle><circle class=\"st8\" cx=\"80.1\" cy=\"70.5\" r=\"0.8\"></circle></g></g></svg>"
 
 /***/ }),
 
-/***/ 101:
-/***/ (function(module, exports, __webpack_require__) {
-
-var getNative = __webpack_require__(81),
-    root = __webpack_require__(8);
-
-/* Built-in method references that are verified to be native. */
-var Map = getNative(root, 'Map');
-
-module.exports = Map;
-
-
-/***/ }),
-
-/***/ 102:
-/***/ (function(module, exports, __webpack_require__) {
-
-var getMapData = __webpack_require__(103);
-
-/**
- * Removes `key` and its value from the map.
- *
- * @private
- * @name delete
- * @memberOf MapCache
- * @param {string} key The key of the value to remove.
- * @returns {boolean} Returns `true` if the entry was removed, else `false`.
- */
-function mapCacheDelete(key) {
-  var result = getMapData(this, key)['delete'](key);
-  this.size -= result ? 1 : 0;
-  return result;
-}
-
-module.exports = mapCacheDelete;
-
-
-/***/ }),
-
-/***/ 103:
-/***/ (function(module, exports, __webpack_require__) {
-
-var isKeyable = __webpack_require__(104);
-
-/**
- * Gets the data for `map`.
- *
- * @private
- * @param {Object} map The map to query.
- * @param {string} key The reference key.
- * @returns {*} Returns the map data.
- */
-function getMapData(map, key) {
-  var data = map.__data__;
-  return isKeyable(key)
-    ? data[typeof key == 'string' ? 'string' : 'hash']
-    : data.map;
-}
-
-module.exports = getMapData;
-
-
-/***/ }),
-
-/***/ 104:
-/***/ (function(module, exports) {
-
-/**
- * Checks if `value` is suitable for use as unique object key.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
- */
-function isKeyable(value) {
-  var type = typeof value;
-  return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
-    ? (value !== '__proto__')
-    : (value === null);
-}
-
-module.exports = isKeyable;
-
-
-/***/ }),
-
 /***/ 1043:
 /***/ (function(module, exports) {
 
 module.exports = "<!-- 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:svg=\"http://www.w3.org/2000/svg\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" id=\"svg2\" viewBox=\"0 0 34 34\"><defs id=\"defs4\"><linearGradient id=\"linearGradient4275\"><stop id=\"stop4277\" offset=\"0\" style=\"stop-color:#006e00;stop-opacity:1\"></stop><stop style=\"stop-color:#00cc00;stop-opacity:1;\" offset=\"0.55349338\" id=\"stop4283\"></stop><stop id=\"stop4279\" offset=\"1\" style=\"stop-color:#eeff2a;stop-opacity:1\"></stop></linearGradient><linearGradient gradientTransform=\"matrix(0.03267513,0,0,0.03267513,5.555801,1018.6805)\" gradientUnits=\"userSpaceOnUse\" y2=\"275.13159\" x2=\"162.84953\" y1=\"823.703\" x1=\"555.89331\" id=\"linearGradient4281\" xlink:href=\"#linearGradient4275\"></linearGradient></defs><g transform=\"translate(0,-1018.3622)\" id=\"layer1\"><path id=\"path4136\" d=\"m 13.661978,1019.0545 c -9.6447445,1.1926 -10.316754,13.2244 -4.2596149,18.1959 6.0571409,4.9714 13.9697969,9.3171 10.7466029,14.4295 9.372821,-1.0092 10.165143,-10.5469 5.793842,-15.3419 -4.371301,-4.7949 -17.4582341,-10.442 -12.28083,-17.2835 z\" style=\"opacity:1;fill:url(#linearGradient4281);fill-opacity:1;stroke:#000080;stroke-width:0.29986507;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1\"></path></g></svg>"
 
 /***/ }),
 
 /***/ 1044:
@@ -305,91 +186,16 @@ module.exports = "<!-- This Source Code 
 
 /***/ 1045:
 /***/ (function(module, exports) {
 
 module.exports = "<!-- 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 viewBox=\"0 0 14 5\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><desc>Created with Sketch.</desc><defs></defs><g id=\"Symbols\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" stroke-linecap=\"square\"><g id=\"outline\" transform=\"translate(0.000000, -2.000000)\" stroke=\"#DDE1E5\"><path d=\"M1.25,2.25 L1.25,2.75\" id=\"Line\" transform=\"translate(1.250000, 2.500000) rotate(90.000000) translate(-1.250000, -2.500000) \"></path><path d=\"M1.25,4.25 L1.25,4.75\" id=\"Line\" transform=\"translate(1.250000, 4.500000) rotate(90.000000) translate(-1.250000, -4.500000) \"></path><path d=\"M8.5,-3.5 L8.5,6.5\" id=\"Line\" transform=\"translate(8.000000, 2.000000) rotate(90.000000) translate(-8.000000, -2.000000) \"></path><path d=\"M8.5,-0.5 L8.5,9.5\" id=\"Line\" transform=\"translate(8.500000, 4.500000) rotate(90.000000) translate(-8.500000, -4.500000) \"></path><path d=\"M1.25,6.25 L1.25,6.75\" id=\"Line\" transform=\"translate(1.250000, 6.500000) rotate(90.000000) translate(-1.250000, -6.500000) \"></path><path d=\"M8.5,1.5 L8.5,11.5\" id=\"Line\" transform=\"translate(8.500000, 6.500000) rotate(90.000000) translate(-8.500000, -6.500000) \"></path></g></g></svg>"
 
 /***/ }),
 
-/***/ 105:
-/***/ (function(module, exports, __webpack_require__) {
-
-var getMapData = __webpack_require__(103);
-
-/**
- * Gets the map value for `key`.
- *
- * @private
- * @name get
- * @memberOf MapCache
- * @param {string} key The key of the value to get.
- * @returns {*} Returns the entry value.
- */
-function mapCacheGet(key) {
-  return getMapData(this, key).get(key);
-}
-
-module.exports = mapCacheGet;
-
-
-/***/ }),
-
-/***/ 106:
-/***/ (function(module, exports, __webpack_require__) {
-
-var getMapData = __webpack_require__(103);
-
-/**
- * Checks if a map value for `key` exists.
- *
- * @private
- * @name has
- * @memberOf MapCache
- * @param {string} key The key of the entry to check.
- * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
- */
-function mapCacheHas(key) {
-  return getMapData(this, key).has(key);
-}
-
-module.exports = mapCacheHas;
-
-
-/***/ }),
-
-/***/ 107:
-/***/ (function(module, exports, __webpack_require__) {
-
-var getMapData = __webpack_require__(103);
-
-/**
- * Sets the map `key` to `value`.
- *
- * @private
- * @name set
- * @memberOf MapCache
- * @param {string} key The key of the value to set.
- * @param {*} value The value to set.
- * @returns {Object} Returns the map cache instance.
- */
-function mapCacheSet(key, value) {
-  var data = getMapData(this, key),
-      size = data.size;
-
-  data.set(key, value);
-  this.size += data.size == size ? 0 : 1;
-  return this;
-}
-
-module.exports = mapCacheSet;
-
-
-/***/ }),
-
 /***/ 108:
 /***/ (function(module, exports, __webpack_require__) {
 
 var baseToString = __webpack_require__(109);
 
 /**
  * Converts `value` to a string. An empty string is returned for `null`
  * and `undefined` values. The sign of `-0` is preserved.
@@ -516,44 +322,16 @@ function arrayMap(array, iteratee) {
   return result;
 }
 
 module.exports = arrayMap;
 
 
 /***/ }),
 
-/***/ 111:
-/***/ (function(module, exports, __webpack_require__) {
-
-var isSymbol = __webpack_require__(72);
-
-/** Used as references for various `Number` constants. */
-var INFINITY = 1 / 0;
-
-/**
- * Converts `value` to a string key if it's not a string or symbol.
- *
- * @private
- * @param {*} value The value to inspect.
- * @returns {string|symbol} Returns the key.
- */
-function toKey(value) {
-  if (typeof value == 'string' || isSymbol(value)) {
-    return value;
-  }
-  var result = (value + '');
-  return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
-}
-
-module.exports = toKey;
-
-
-/***/ }),
-
 /***/ 1117:
 /***/ (function(module, exports) {
 
 module.exports = "<!-- 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 version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" viewBox=\"0 0 32 32\"><rect fill=\"#002f42\" width=\"16\" x=\"0\" y=\"28\" height=\"4\"></rect><rect fill=\"#0072b1\" width=\"16\" x=\"16\" y=\"28\" height=\"4\"></rect></svg>"
 
 /***/ }),
 
 /***/ 1118:
@@ -565,475 +343,23 @@ module.exports = "<!-- This Source Code 
 
 /***/ 1119:
 /***/ (function(module, exports) {
 
 module.exports = "<!-- 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 viewBox=\"0.1 31.4 256 244.5\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" preserveAspectRatio=\"xMinYMin meet\"><path fill=\"#FFF\" d=\"M57.9 219.3l.6-1.5.1-.2c.5-1.2 1-2.5 1.5-3.7.6-1.6 1.2-3.3 1.8-4.9.4-.9.7-1.8 1-2.8.8-2.2 1.9-5.1 3.2-7.9.8-1.7 1.4-2.9 2.1-4 .8-1.3 1.6-2.5 2.5-3.7l.7-1 1.1-.7c.1-.1.3-.2.5-.3.5-.3 1.1-.5 1.5-.7.7-.3 1.6-.6 2.6-.9 1.4-.4 3-.8 4.9-1.2 2.8-.6 5.8-1.2 9.6-1.8 5.7-.9 11.8-1.7 19.1-2.5 12.9-1.4 25.8-2.4 38.2-3 6.6-.3 11.6-.4 16.3-.4h3c3.1.1 6.7.2 10 .7 1.2.2 2.3.4 3.1.7.3.1.6.2.7.3l1 .4.8.7.9.9c1.1 1.1 2.3 2.4 3.5 3.9 3.8 4.8 7.2 10.6 10.2 17.2 2.9 6.4 4.7 12.1 5.8 17.7l1.5 7.9h-18.4l-1.1-5.3c-1.2-5.6-16.3-20.4-23.8-23.3-.8-.3-4-1.2-13.9-1.2-20.4 0-49.2 3.6-53.3 4.5-4.9 2.3-12.4 11.9-16.7 21.5l-1.8 3.9\"></path><path fill=\"#BA8449\" d=\"M182.9 190.1c-.9-1.2-1.9-2.3-3-3.3l-.7-.7s-.1 0-.2-.1c-.5-.2-1.2-.3-1.9-.4-2.9-.4-6-.5-9.1-.6-6.3-.1-12.6.1-18.9.4-12.6.6-25.3 1.6-37.8 3-6.3.7-12.6 1.5-18.8 2.5-3.1.5-6.2 1-9.2 1.7-1.5.3-3 .7-4.4 1.1-.7.2-1.4.4-2 .7-.3.1-.6.2-.7.4 0 0-.1 0-.1.1-.7 1-1.4 2-2.1 3.1-.7 1.1-1.2 2.3-1.8 3.5-1.1 2.4-2.1 4.9-3 7.4s-1.9 5.1-2.8 7.7c-.5 1.3-1 2.6-1.6 3.9-.2.6-.5 1.2-.8 1.8h8.5c4.6-10.3 13.3-22.1 20.5-25 2-.8 34.2-4.8 55.5-4.8 7.9 0 13.3.6 16.3 1.7 8.7 3.4 26.1 19.5 27.9 28.2h4.9c-1-5.5-3-10.9-5.3-16.1-2.6-6-5.7-11.5-9.4-16.2\"></path><path fill=\"#FFF\" d=\"M179.1 185.9z\"></path><path fill=\"#BA8449\" d=\"M179.1 185.9z\"></path><path fill=\"#FFF\" d=\"M192.1 228.6l-1-5.4c-.9-4.5-2.4-9.3-4.8-14.6-2.6-5.6-5.4-10.5-8.6-14.4-.6-.8-1.2-1.5-1.8-2.1-2.5-.4-5.4-.4-8-.5h-2.8c-4.5 0-9.3.1-15.7.4-12.2.6-24.7 1.6-37.4 3-7.1.8-13 1.6-18.4 2.4-3.5.5-6.3 1.1-8.8 1.6-1.6.4-2.8.7-3.9 1-.2 0-.3.1-.4.1-.2.4-.5.7-.7 1.1-.5.8-.9 1.7-1.6 2.9-1.1 2.3-2 4.7-2.8 6.8-.4.9-.7 1.8-1 2.7-.6 1.7-1.2 3.4-1.9 5.1-.5 1.3-1.1 2.6-1.6 4l-.1.2c-.2.6-.5 1.2-.7 1.7l-1.8 4H56.6l-1.7-.8-.2-.1c-4-2.3-4-5.7-3.9-7.1v-.3l.2-.9.3-1.1c.2-.7.4-1.5.6-2.2.4-1.5.9-2.9 1.4-4.3.9-2.6 2-5.4 3.3-8.4 1.4-3.1 2.7-5.8 4.2-8.3.7-1.3 1.5-2.6 2.5-4.1.9-1.4 1.9-2.8 2.9-4.1.9-1.1 1.7-1.8 2.3-2.2h.1c.6-.5 1.2-.8 1.5-.9.9-.5 1.6-.8 2.1-1 1.2-.5 2.3-.8 3.2-1.1 2-.6 3.9-1 5.3-1.3 2.9-.6 6-1.2 9.9-1.8 5.8-.9 11.9-1.6 19.4-2.4 13-1.3 26-2.3 38.6-2.8 6-.2 10.7-.4 15-.4h4.6c3.2.1 6.8.2 10.7.8h.1c.9.2 2.3.4 3.9.9h.1c.4.2 1 .4 1.7.7.5.3.9.5 1.2.7l.5.4.4.3.4.4 1.1 1.1c1.3 1.3 2.5 2.7 3.8 4.4 4 5.2 7.5 11.2 10.7 18.3 1.5 3.3 2.8 6.6 3.8 9.8 1.1 3.5 1.9 6.8 2.5 10l1.2 7.7h-18.2v.1z\"></path><path fill=\"#FFF\" d=\"M64.3 228.6l4.4-9.5c3.7-7.9 12.6-22.4 22.5-26.5l.2-.1c3.3-1.2 36.7-5.1 57.1-5.1 11.4 0 15.7 1.1 17.9 2 10.3 4 28.2 20.9 30.6 30.9l2 8.2H64.3z\"></path><path fill=\"#FFF\" d=\"M185.4 228.6l-1.2-5.1c-1.1-4.7-15.2-18.8-22.5-21.7-.7-.3-3.6-1.1-13.2-1.1-19.6 0-48 3.5-52.6 4.4-3.8 1.9-10.7 10-15.2 19.6l-1.8 3.8H62.3l4.2-9.3c4.9-11 14.6-24.6 24.1-28.4 3.7-1.5 37.5-5.3 58-5.3 8.9 0 14.9.7 18.6 2.1 10.3 4 29.6 21.4 32 33l1.6 8h-15.4z\"></path><path fill=\"#FFF\" d=\"M193.1 228.6l-1.9-1.8c-7.2-6.7-9.2-20.6-7-26.3 1.5-3.8 4.7-5.1 7.1-5.1.7 0 1.3.1 1.9.3 1.3-.1 4.3-2.6 5.2-4 1.4-2.6 4.1-4.2 7.4-4.2 4.9 0 12.9 3.9 15.5 7.6 1.5 2.1 1.9 4.6 1.1 6.8-.1.2-.2.6-.4 1.1-2.7 8.1-6.2 18-9 22.6l-1.9 3.1-18-.1z\"></path><path fill=\"#FFF\" d=\"M192.5 228.6l6.2-10.1c3-4.9 5.1-8.9 6.5-12-3.5 2.5-8.4 4-15.7 4.4l-.2-.2-.1.7c-4.3 0-7.8-3.5-8-7.8-.1-2.1.7-4.2 2.1-5.8 1.4-1.6 3.4-2.5 5.5-2.6 7.2-.3 8.1-2 9.4-4.5 1.8-3.4 5.7-5.4 10.8-5.4 1.3 0 2.6.1 3.8.4 6.3 1.4 10.4 6.2 10.7 12.4.3 6.3-3.2 15.5-10.2 27.3l-1.9 3.2h-18.9z\"></path><path fill=\"#FFF\" d=\"M218.8 208.9c-8.1 0-16.9-5.3-21.4-10.5-4.1-4.7-4.5-8.9-4.1-11.6.5-3.3 3.2-6.6 8.1-6.6.9 0 1.8.1 2.6.2.8-3.6 2.7-11.1 10.4-11.1h1.1c3.7.4 6.5 2.7 7.6 6.2 1.2-.6 2.6-1.1 4.2-1.1 2.4 0 4.7 1 6.4 2.8 2.7 2.9 3.3 6.9 1.6 10.7 1.8 1.1 3.2 2.8 3.8 5 .8 2.8.3 5.8-1.5 8.2-3.5 4.9-11.6 7.2-18 7.4-.4.4-.6.4-.8.4M210.8 44.2c-7.3 4.6-15.3 15.1-25.1 29.5-1.5 2.3-4 3.5-6.8 3.5-3.6 0-8.2-2.2-13.5-6.5-8.4-6.8-8.6-10.6-8.7-12.1-.2-4 2.8-7.4 7-7.8 8.1-.7 14.8-5.6 21.3-10.3 6.5-4.7 12.5-9 19.7-9 1.4 0 2.9.2 4.3.5\"></path><path fill=\"#FFF8EE\" d=\"M164.3 57.5c19.6-1.8 31.1-22.1 43-19-8 5-15.9 15-27 31.4-2.7 3.9-21.4-11.9-16-12.4\"></path><path fill=\"#FFF\" d=\"M37.3 48.2c4.9-4.5 11.5-6.8 19.6-6.8 7 0 15.3 1.7 24.6 5.1 2.5.9 5.8 1.1 8.3 1.1h3.7c2.3 0 7.2 0 9.3 4.5.7 1.7 1.6 5.2-1.1 9.3-3.3 5.1-12 10.5-20.4 10.5h-.4c-4.5-.1-8.7-2.5-13.6-5.2-6.1-3.4-13-7.3-21.2-7.3-1.1 0-2.3.1-3.4.2M188.1 96.7c-3.6 0-10.4-1.5-14.7-11.7-2.4-5.4-3.2-11.5-3.2-14.9 0-7 3.7-8.9 6-9.4 1.6-1.6 4.6-5.7 6.8-8.8 9.1-12.4 15.7-20.5 23.4-20.5 1.3 0 2.5.2 3.7.7 10.3 4.1 15.3 12.8 13.6 23.8-1.2 8.1-6.3 17.7-13.8 26.5-3.5 4.1-12.6 13.7-20.7 14.3h-1.1\"></path><path fill=\"#FFF\" d=\"M69.9 100.5c-.9 0-1.8 0-2.6-.2-12.8-2.1-28.8-15-34.8-28.3-4.1-9.1-2.3-15.3 0-18.9 3.7-5.9 9.2-9 16-9 8.2 0 16.4 4.5 23.6 8.4 2.8 1.5 6.8 3.7 8.5 4.1.6-.2 1.2-.3 1.9-.3 2.6 0 5 1.4 6.4 3.8 3.3 5.8 1.3 21.4-3.9 30.4-3.6 6.6-9 10-15.1 10z\"></path><path fill=\"#FFF\" d=\"M114.5 212.1c-30 0-59.7-14.7-69.6-25.4-10.3-11.1-14-23.7-11.2-37.5 2.4-11.3 8.7-21.4 14.2-30.4 3.8-6.2 7.4-12 8.4-16.2 12.2-53.9 42.8-60.8 68.1-60.8 1.6 0 3.3 0 5.2.1 53.9 1.6 59.3 27.6 62.5 43.2.6 2.9 1.2 5.6 1.9 7.4 18.1 44.4 21.1 71 10 89-10.9 17.7-34.8 26.4-82.4 30.3-2.3.2-4.7.3-7.1.3z\"></path><path fill=\"#FFF\" d=\"M113.4 212.2c-30.6 0-58.9-15.2-68.4-25.5-10.3-11.1-14-23.7-11.2-37.5 2.4-11.3 8.7-21.4 14.2-30.4 3.8-6.2 7.4-12 8.4-16.2 12.2-53.9 42.8-60.8 68.1-60.8 1.6 0 3.3 0 5.2.1 53.9 1.6 59.3 27.6 62.5 43.2.6 2.9 1.2 5.6 1.9 7.4 17.8 43.7 20.7 70.1 9.8 88.1-12.5 20.7-41.9 27.4-82.1 31.2-2.8.3-5.6.4-8.4.4\"></path><path fill=\"#FFF\" d=\"M191.3 174.6c.4-.9.8-1.9 1.2-2.8 4.1-9.8 7.2-18.4 2.3-23.9-5.8-6.4-30.3-18-52.1-28.2-41.7-19.7-67.5-32.4-71.2-45-.9-3.2-.5-6.5 1.2-9.3C79.9 54.1 100 42 127.5 42h.8c25.9.2 44.7 7.7 56 22.1 9.6 12.2 11.7 26.5 13.3 36.9.5 3.5 1.2 8 1.9 9.2 19.6 33.7 10.6 58.6 3.5 70.3l-11.7-5.9z\"></path><path fill=\"#FFF\" d=\"M170.8 135.8c-10.1 0-27-2.5-32.8-8.1-4.6-4.4-6.3-11.7-8.1-18.8-.7-3-1.9-7.8-3-10h-.1c-.4 1.1-.9 2.5-1.3 3.6-2.7 7.6-6.5 18.1-14.4 23.8-3.4 2.5-15.7 4.7-25.2 4.7s-16.7-2-21.5-6.1c-6.9-5.8-12.1-16.5-15.6-31.8-.2-.1-.3-.2-.5-.3-1.6-1.1-3.7-2.4-4.8-4.7-1.8-3.6-1.1-10 .8-13.4 1.4-2.5 3.8-4.1 6.4-4.3h.9c1.4 0 2.8.2 4.4.5s3.5.6 5.1.6h.9c9.5-1.4 18.4-2 26.5-2 19.7 0 30.1 4 34 5.6.3.1.6.2.8.3 1.1.3 3.2.7 5.4.7.8 0 1.6 0 2.3-.2 8.9-1.4 17.4-2 25.2-2 20.8 0 31.8 4.7 36.6 6.8.4.2.8.4 1.1.4h.4c1.3 0 3.2-.4 4.8-.7 1.2-.3 2.4-.5 3.5-.7h.9c3.1 0 5.9 1.8 7.6 4.8 1.9 3.5 3.2 10.8.5 15-1.8 2.8-4.7 4.1-7.1 5.2-.3.1-.7.3-1 .5-.8 1.4-2.2 4.2-3.4 6.5-3.5 6.8-7.4 14.6-11 18.8-3.2 3.6-9.2 5.3-18.3 5.3\"></path><defs><path id=\"a\" d=\"M42.5 75H212v59.2H42.5z\"></path></defs><clipPath id=\"b\"><use xlink:href=\"#a\" overflow=\"visible\"></use></clipPath><g opacity=\".3\" clip-path=\"url(#b)\"><path fill=\"#FFF\" d=\"M166.778 134.181c-8 0-19.3-1.2-27.4-6.9-4.6-3.3-6.7-9.9-9.6-20.5-.8-3-2-7.2-2.9-9.3-.5 1.2-1.1 2.8-1.6 4.1-3 8.1-7.1 19.1-14.6 23.7-3.9 2.4-16 4.6-25.4 4.6-10.1 0-17.4-2.3-21.6-6.7-10.7-11.2-12.8-21.9-14.1-28.2-.2-.9-.4-2.1-.6-2.8-6.3-3.3-6.7-8.2-6.6-10.3.3-3.9 3.3-6.8 7-6.8 2.5 0 4.1 1.2 5.3 2 .1.1.2.2.4.2.1 0 .4.1.5.2 1.6.5 6.3 1.8 7.3 7.9.2 1.1 1.8 7.5 4.4 14.2 4.1 10.7 7 12.5 7.3 12.6 3.4 1.2 7.4 1.8 11.9 1.8 7.4 0 13.6-1.6 16.1-2.4 1.5-2.3 4.5-8.3 6.6-12.4 6.3-12.5 7.4-14.4 10.1-15.8 1.5-.8 3.3-1.2 5.6-1.2 3 0 7.3.7 9.3 1.6 4.6 2 7 8 12.4 23.5 1 2.8 2.2 6.4 3 8.2 4 1.9 13.1 3.2 22.6 3.2 2.7 0 4.7-.1 6-.2.9-1.9 2.2-4.6 3.3-6.9 7.6-16.2 8.8-18.1 10.7-19.6 3.3-2.5 9.1-4.2 12.4-4.2 4.4 0 6.8 2.9 7.4 5.7 1.1 5.8-4.6 8-6.5 8.7-.5.2-1.2.5-1.7.7-.7 1.2-2 3.8-3 5.9-8.2 16-10.9 20.4-14 22.3-3.8 2.1-13 3.1-20 3.1\"></path></g><defs><path id=\"c\" d=\"M45 70.7h33.4v16.2H45z\"></path></defs><clipPath id=\"d\"><use xlink:href=\"#c\" overflow=\"visible\"></use></clipPath><g opacity=\".3\" clip-path=\"url(#d)\"><path fill=\"#FFF\" d=\"M61.388 86.816c-1.2 0-3.5-.2-8.1-1.7-1.2-.4-2.3-.8-3-1.1-1.5-.6-5.4-2.1-5.4-6.7v-6.7h6.6c.9 0 1.5.2 2 .3 1.4.2 5.9.5 7.4.6l.9.1c1.2 0 4.9-.5 6.5-.7 2-.3 2.6-.4 3.4-.4h5.7l.9 5.6c.4 2.8-1.1 6.3-4.8 7.4-.2.1-.9.3-1.5.5-3.5 1.3-7 2.5-10 2.6-.2.2-.4.2-.6.2\"></path></g><defs><path id=\"e\" d=\"M181 79.3h25.4v17.2H181z\"></path></defs><clipPath id=\"f\"><use xlink:href=\"#e\" overflow=\"visible\"></use></clipPath><g opacity=\".3\" clip-path=\"url(#f)\"><path fill=\"#FFF\" d=\"M193.488 96.41c-2.2 0-4.4-.9-7.4-3-2.9-2-5.1-4-5.1-7.5v-6.7h6.5c.9 0 1.8.2 2.7.6.7.3 3.4 1.2 4.6 1.5.4 0 1.2-.2 2.8-.5.8-.2 1.3-.2 2-.2h5.7l.9 5.6c.4 2.7-.8 6.1-4.5 7.4l-1.2.6c-1.8.9-3.9 1.9-6 2.3-.2-.1-.6-.1-1-.1\"></path></g><path fill=\"#FFF\" d=\"M171.7 243.3h-24.6V222h24.6v21.3z\"></path><path fill=\"#BA8449\" d=\"M182.9 190.1c-.9-1.2-1.9-2.3-3-3.3l-.7-.7s-.1 0-.2-.1c-.5-.2-1.2-.3-1.9-.4-2.9-.4-6-.5-9.1-.6-6.3-.1-12.6.1-18.9.4-12.6.6-25.3 1.6-37.8 3-6.3.7-12.6 1.5-18.8 2.5-3.1.5-6.2 1-9.2 1.7-1.5.3-3 .7-4.4 1.1-.7.2-1.4.4-2 .7-.3.1-.6.2-.7.4 0 0-.1 0-.1.1-.7 1-1.4 2-2.1 3.1-.7 1.1-1.2 2.3-1.8 3.5-1.1 2.4-2.1 4.9-3 7.4s-1.9 5.1-2.8 7.7c-.5 1.3-1 2.6-1.6 3.9-.2.6-.5 1.2-.8 1.8h8.5c4.6-10.3 13.3-22.1 20.5-25 2-.8 34.2-4.8 55.5-4.8 7.9 0 13.3.6 16.3 1.7 8.7 3.4 26.1 19.5 27.9 28.2h4.9c-1-5.5-3-10.9-5.3-16.1-2.6-6-5.7-11.5-9.4-16.2M179.1 185.9z\"></path><path fill=\"#895B2E\" d=\"M179.1 185.9zm17.8 17.9c-2.7-6-5.8-11.7-9.9-16.9-1-1.3-2.1-2.6-3.3-3.8l-.9-.9-.2-.2-.1-.1-.2-.2c-.2-.1-.4-.2-.5-.3-.3-.2-.6-.3-.9-.4-1.1-.4-1.9-.5-2.8-.7-3.4-.5-6.6-.6-9.8-.7-6.5-.1-12.8 0-19.2.3-12.8.5-25.5 1.5-38.2 2.8-6.3.7-12.7 1.4-19.1 2.4-3.2.5-6.3 1-9.5 1.7-1.6.4-3.2.7-4.8 1.2-.8.2-1.6.5-2.5.9-.4.2-.9.4-1.4.7-.2.2-.5.3-.8.5-.3.2-.6.5-1 1-.9 1.1-1.8 2.4-2.6 3.6-.8 1.2-1.6 2.5-2.3 3.8-1.4 2.5-2.7 5.1-3.9 7.7-1.1 2.6-2.2 5.2-3.1 7.9-.5 1.3-.9 2.6-1.2 4-.2.7-.4 1.3-.6 2l-.3 1-.1.5c0 .1.2.2.6.5H64.2c.3-.6.5-1.2.8-1.8.5-1.3 1.1-2.6 1.6-3.8 1-2.6 1.9-5.1 2.8-7.7.9-2.5 1.9-5.1 3-7.4.6-1.2 1.2-2.3 1.8-3.5.7-1.1 1.3-2.1 2.1-3.1 0 0 .1 0 .1-.1.2-.1.5-.2.7-.4.6-.2 1.3-.5 2-.7 1.4-.4 2.9-.8 4.4-1.1 3-.7 6.1-1.2 9.2-1.7 6.2-1 12.5-1.8 18.8-2.5 12.6-1.4 25.2-2.4 37.8-3 6.3-.3 12.6-.5 18.9-.4 3.1.1 6.3.2 9.1.6.7.1 1.4.3 1.9.4.1 0 .2 0 .2.1l.7.7c1.1 1.1 2 2.2 3 3.3 3.7 4.7 6.8 10.2 9.4 15.8 2.3 5.2 4.3 10.6 5.3 16.1h5c-.5-3.1-1.3-6.1-2.2-9-1.2-3.1-2.4-6.1-3.7-9.1\"></path><path fill=\"#FFF8EE\" d=\"M164.1 195.7c-2.6-1-7.9-1.6-15.5-1.6-21.4 0-53 4-54.7 4.7-6.5 2.6-14.6 13.6-19.1 23.2h115.9c-1.9-7.5-18-22.9-26.6-26.3\"></path><path fill=\"#E5D0AE\" d=\"M164.8 193.8c-2.9-1.1-8.4-1.7-16.3-1.7-21.3 0-53.5 4-55.5 4.8-7.3 3-15.9 14.7-20.5 25h2.2c4.5-9.5 12.6-20.5 19.1-23.2 1.7-.7 33.3-4.7 54.7-4.7 7.6 0 12.9.5 15.5 1.6 8.6 3.3 24.7 18.8 26.6 26.3h2c-1.7-8.6-19.1-24.7-27.8-28.1\"></path><path fill=\"#BA8449\" d=\"M204.4 194.7c-1.2 2.5-7.5 8.9-12.8 7.4-2.8-.8-2.3 14 4.1 19.9h11.6c3.2-5.1 8.2-20.7 8.8-22.3.7-1.9-10.5-7.5-11.7-5\"></path><path fill=\"#895B2E\" d=\"M216.7 198.4c-.2-3.2-2.1-5.5-5.5-6.3-2.7-.6-6.3-.1-7.2 1.6-1.8 3.4-4 7.5-14.9 8.1-.7 0-1.3.7-1.3 1.4s.7 1.3 1.4 1.3c11.4-.5 14.7-4.9 17.1-9.4.5-.4 3.2-.9 5.4 0 1.6.7 2.3 1.8 2.4 3.5.3 6.2-6.2 17.7-9.7 23.5h3.1c3.9-6.8 9.5-17.3 9.2-23.7\"></path><defs><path id=\"g\" d=\"M193.5 196.5H217v27.3h-23.5z\"></path></defs><clipPath id=\"h\"><use xlink:href=\"#g\" overflow=\"visible\"></use></clipPath><g opacity=\".15\" clip-path=\"url(#h)\"><path fill=\"#E3AB5E\" d=\"M194.235 222.3c7.1-1.7 13.4-8.8 13.9-18.9.1-1.9-3.8-5.5-3.8-6.5s11.9.2 12.5 3c.5 2.8-7.4 19.7-10.1 22.5-2.6 2.7-16.7.9-12.5-.1\"></path></g><path fill=\"#FCD4C3\" d=\"M199.8 187.8c-.9 6.2 11.2 14.7 19.4 14.5 6.8-.2 14.5-3.4 13.4-7.2-1.1-3.9-7.7.7-8.3-2-.5-2.6 7.7-7.5 4.4-11.1-3.1-3.3-6.7 5.2-10.3 4-3.6-1.2.7-9.5-3.8-10-5.3-.5-3.3 11.3-7.3 11.5-2.8.3-7.2-1.7-7.5.3\"></path><path fill=\"none\" stroke=\"#F8A38F\" stroke-width=\"2\" stroke-miterlimit=\"10\" d=\"M199.8 187.8c-.9 6.2 11.2 14.7 19.4 14.5 6.8-.2 14.5-3.4 13.4-7.2-1.1-3.9-7.7.7-8.3-2-.5-2.6 7.7-7.5 4.4-11.1-3.1-3.3-6.7 5.2-10.3 4-3.6-1.2.7-9.5-3.8-10-5.3-.5-3.3 11.3-7.3 11.5-2.8.3-7.2-1.7-7.5.3z\"></path><defs><path id=\"i\" d=\"M203.2 182.8h7.8v6.4h-7.8z\"></path></defs><clipPath id=\"j\"><use xlink:href=\"#i\" overflow=\"visible\"></use></clipPath><g opacity=\".5\" clip-path=\"url(#j)\"><path fill=\"#FCD4C3\" d=\"M203.238 187.742c1.3 1 6 2.3 6.7.6.8-1.7 1.4-5.1.9-5.6-.4 1.6-.9 4.6-2.6 5.3-1.3.5-4.1-.1-5-.3\"></path></g><defs><path id=\"k\" d=\"M215.9 181.2h7.7v7.2h-7.7z\"></path></defs><clipPath id=\"l\"><use xlink:href=\"#k\" overflow=\"visible\"></use></clipPath><g opacity=\".5\" clip-path=\"url(#l)\"><path fill=\"#FCD4C3\" d=\"M216.159 181.142c-.2 1.1-1.1 6.3 1.6 7 2.3.6 4-.8 5.8-3.7-1 .9-3.5 3.1-5.4 2.3-1.9-.9-2.1-2.9-2-5.6\"></path></g><defs><path id=\"m\" d=\"M204.5 193h15.8v8.6h-15.8z\"></path></defs><clipPath id=\"n\"><use xlink:href=\"#m\" overflow=\"visible\"></use></clipPath><g opacity=\".25\" clip-path=\"url(#n)\"><path fill=\"#FCD4C3\" d=\"M204.576 195.158c13.6-6.7 16.4 4.2 15.7 6.4-5.4.9-14.9-4.7-15.7-6.4\"></path></g><defs><path id=\"o\" d=\"M223 190.9h5.7v5H223z\"></path></defs><clipPath id=\"p\"><use xlink:href=\"#o\" overflow=\"visible\"></use></clipPath><g opacity=\".5\" clip-path=\"url(#p)\"><path fill=\"#FCD4C3\" d=\"M224.351 190.896c-2.3 2.6-1.2 4.7.3 5 1.9.4 4.4-1.6 4-1.6-.5 0-4.2 1.2-4.9-.6-.5-1.4.3-2.2.6-2.8\"></path></g><defs><path id=\"q\" d=\"M66.1 182.6H195v36.5H66.1z\"></path></defs><clipPath id=\"r\"><use xlink:href=\"#q\" overflow=\"visible\"></use></clipPath><g opacity=\".15\" clip-path=\"url(#r)\"><path fill=\"#E3AB5E\" d=\"M69.034 208.266c43.7 25.1 130.4-.4 125.8-8.6-6.1-10.9-8.5-17.7-21.9-17.1-13.3.7-98.9 7.5-102.4 10.1-3.4 2.7-7.2 12.3-1.5 15.6\"></path></g><path fill=\"#FFF8EE\" d=\"M164.3 57.5c19.6-1.8 31.1-22.1 43-19-8 5-15.9 15-27 31.4-2.7 3.9-21.4-11.9-16-12.4\"></path><path fill=\"none\" stroke=\"#E5D0AE\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M164.3 57.5c19.6-1.8 31.1-22.1 43-19-8 5-15.9 15-27 31.4-2.7 3.9-21.4-11.9-16-12.4z\"></path><path fill=\"#BA8449\" d=\"M41.8 53.1c8.8-8.2 24.7-5 37.5-.4 7.3 2.6 16.8.5 17.4 2 1.6 3.5-7.9 10.7-15.7 10.5-7.7-.1-20.6-14.6-39.2-12.1\"></path><path fill=\"none\" stroke=\"#895B2E\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M41.8 53.1c8.8-8.2 24.7-5 37.5-.4 7.3 2.6 16.8.5 17.4 2 1.6 3.5-7.9 10.7-15.7 10.5-7.7-.1-20.6-14.6-39.2-12.1z\"></path><path fill=\"#FCD4C3\" d=\"M177.7 67.2c4.5 1.3 21.6-32.2 29.9-28.9 26.4 10.5-8 50.9-18.9 51.8-11 .8-13.5-23.7-11-22.9\"></path><path fill=\"none\" stroke=\"#F8A38F\" stroke-width=\"2\" stroke-miterlimit=\"10\" d=\"M177.7 67.2c4.5 1.3 21.6-32.2 29.9-28.9 26.4 10.5-8 50.9-18.9 51.8-11 .8-13.5-23.7-11-22.9z\"></path><path fill=\"#FCD4C3\" d=\"M82.3 63.2c-7.3 3.2-33.2-23.9-44.1-6.5C31 68.2 52.8 91.4 68.4 93.9s17.7-32.4 13.9-30.7\"></path><path fill=\"none\" stroke=\"#F8A38F\" stroke-width=\"2\" stroke-miterlimit=\"10\" d=\"M82.3 63.2c-7.3 3.2-33.2-23.9-44.1-6.5C31 68.2 52.8 91.4 68.4 93.9s17.7-32.4 13.9-30.7z\"></path><defs><path id=\"s\" d=\"M180.5 44.8h18v44.6h-18z\"></path></defs><clipPath id=\"t\"><use xlink:href=\"#s\" overflow=\"visible\"></use></clipPath><g clip-path=\"url(#t)\"><path fill=\"#FCD4C3\" d=\"M198.067 44.8c-1.4 4.6-13.2 16.5-11.6 26.7.6 3.8 4.6 15 6.3 14.6s6-3.1 5.6-2.5c-.4.6-6 4.7-8.1 5.8-2.1-1.1-11-21.8-9.7-22.9 3.9-3.5 15.8-21.5 17.5-21.7\"></path></g><defs><path id=\"u\" d=\"M38.6 51.5h44.2v31.6H38.6z\"></path></defs><clipPath id=\"v\"><use xlink:href=\"#u\" overflow=\"visible\"></use></clipPath><g clip-path=\"url(#v)\"><path fill=\"#FCD4C3\" d=\"M38.533 57.4c8-4.9 22.6-2.8 31.1 5.5 3 3 3.9 13-2.9 19.8-2.7 2.7 16-9.6 16.1-13.2 0-3.6-1.2-4.6-4-5.6-10.3-3.8-21.1-12.6-30.5-12.4-6.1.1-8.9 4.3-9.8 5.9\"></path></g><defs><path id=\"w\" d=\"M181.1 42.2h26.2v44.2h-26.2z\"></path></defs><clipPath id=\"x\"><use xlink:href=\"#w\" overflow=\"visible\"></use></clipPath><g opacity=\".25\" clip-path=\"url(#x)\"><path fill=\"#FCD4C3\" d=\"M201.3 42.175c18.2 10-11.1 25.2-8.9 44.1-3.8-.4-13.2-18.7-10.9-20.3 3.2-2.2 16.7-24.6 19.8-23.8\"></path></g><path fill=\"#E5D0AE\" d=\"M60.9 103.6c.3-1.3.5-2.7.5-4 .1-1.4.2-2.8.5-4.1.1-.7.3-1.4.6-2 .3-.6.5-1.3.7-1.9.5-1.3 1-2.6 1.6-3.8 2.3-5.1 4.9-9.9 8.1-14.4 3.2-4.5 6.7-8.7 10.7-12.3 4-3.7 8.7-6.7 13.7-8.7 5-2.1 10.4-3.4 15.8-4 5.4-.7 10.8-.8 16.2-.7 5.4.1 10.8.4 16.2 1.1 5.4.7 10.8 1.9 16 3.8 2.6 1 5.1 2.1 7.5 3.5 2.4 1.4 4.7 3.1 6.8 5.1 2.1 1.9 3.9 4.2 5.4 6.6 1.5 2.4 2.6 5 3.6 7.7.9 2.6 1.6 5.3 2.2 8s1 5.3 1.6 7.8c.3 1.2.7 2.4 1.1 3.6.5 1.2 1 2.5 1.4 3.8.9 2.5 1.9 5.1 2.8 7.6 3.5 10.2 6.6 20.6 8.5 31.2.9 5.3 1.6 10.7 1.7 16.1.1 5.4-.4 10.8-1.9 16-.4 1.3-.8 2.6-1.3 3.8-.5 1.2-1.2 2.4-1.6 3.7-.2.7-.4 1.3-.7 1.9-.3.6-.7 1.2-1.1 1.8-.7 1.1-1.6 2.3-2.5 3.3-3.5 4.2-8 7.6-12.8 10.2s-10 4.6-15.2 6.1c-5.3 1.5-10.5 2.7-15.9 3.7s-10.7 1.7-16 2.4l-8.1.9-4 .4c-1.3.1-2.7.2-4.1.3-11 .6-22-1-32.5-3.9-5.3-1.5-10.4-3.3-15.4-5.5s-9.9-4.7-14.5-7.7c-2.3-1.5-4.6-3.2-6.7-5.1-.5-.5-1.1-1-1.6-1.5s-.9-1.1-1.4-1.6c-.9-1.1-1.8-2.2-2.6-3.3-3.1-4.6-5.6-10-6.4-15.6-.9-5.7-.1-11.5 1.5-16.8 1.6-5.4 4.1-10.3 6.7-15.1 2.7-4.7 5.6-9.3 8.4-13.8 1.4-2.3 2.7-4.6 3.9-6.9 1.1-3 2.1-5.3 2.6-7.7zm4 .9c-.7 2.8-1.9 5.4-3.2 7.9s-2.7 4.8-4.1 7.1c-2.8 4.6-5.7 9.1-8.2 13.7s-4.8 9.4-6.2 14.3c-1.4 4.9-2 10-1.2 15 .8 4.9 2.9 9.6 5.9 13.7.7 1 1.6 2 2.4 3 .4.5.9 1 1.3 1.4.4.5.9.9 1.3 1.3 1.8 1.7 3.9 3.2 6.1 4.7 4.4 2.8 9 5.3 13.9 7.4 4.8 2.1 9.8 3.9 14.9 5.3s10.2 2.5 15.4 3.2c5.2.7 10.4.9 15.6.7l3.9-.3 4-.4c2.6-.2 5.3-.5 8-.8 5.3-.5 10.6-1.2 15.8-2.1 5.3-.9 10.4-1.9 15.5-3.3s10.1-3 14.9-5.1c4.7-2.2 9.3-4.9 13-8.6.9-.9 1.8-1.9 2.6-2.9.4-.5.8-1.1 1.2-1.6.4-.5.9-1 1.3-1.6.9-1.1 1.3-2.3 1.9-3.5.5-1.2.9-2.5 1.2-3.8 1.3-5.2 1.6-10.6 1.3-15.9-.4-5.3-1.3-10.6-2.6-15.8-2.5-10.4-6.2-20.4-10.1-30.3-1-2.5-2-5-3-7.4l-1.6-3.7c-.5-1.3-1-2.7-1.4-4-.7-2.7-1.2-5.3-1.8-7.9-.5-2.6-1.2-5.1-2-7.5-1.7-4.9-4.2-9.3-7.9-12.8-3.6-3.5-8.1-6.2-12.9-8.2-4.8-2-10-3.3-15.2-4.2-5.2-.9-10.5-1.4-15.8-1.7-5.3-.2-10.7-.3-16 .3-5.3.6-10.5 1.7-15.4 3.8-4.9 2-9.4 4.9-13.2 8.5-3.9 3.6-7 8-9.3 12.6-2.4 4.7-4.1 9.7-5.6 14.7-.4 1.2-.7 2.5-1 3.8-.2.6-.3 1.3-.5 1.9-.1.3-.1.7-.2 1-.1.3-.2.6-.4.9-.5 1.2-1.1 2.4-1.7 3.6-.2 1.1-.6 2.3-.9 3.6z\"></path><path fill=\"#FFF8EE\" d=\"M62.9 104.1c-4.2 18.6-40.9 48-13 78.1 9.5 10.2 40.3 25.9 71.2 23 80.4-7.6 100.7-27 66.8-110.2-5.5-13.5.7-44.7-58.4-46.5-24.8-.7-54.6 2.7-66.6 55.6\"></path><path fill=\"#E5BFA1\" d=\"M76.8 67.7c2.6-4 6-7.3 9.8-10C90.4 55 94.7 53 99 51.4c8.8-3.2 18-4.4 27.2-4.7 9.2-.2 18.5.5 27.5 2.8 4.5 1.2 8.9 2.8 13.1 5.1s8.1 5.1 11.4 8.6c3.3 3.5 6 7.4 8.1 11.7 2.1 4.3 3.6 8.8 4.7 13.3 1.1 4.6 1.8 9.1 2.4 13.6.3 2.3.6 4.5 1.1 6.6.2 1.1.5 2.1.8 2.9l.3.6.1.1.1.1.2.4.9 1.5c4.4 8.1 7.7 17 8.9 26.3.6 4.6.7 9.3.2 14-.5 4.6-1.7 9.2-3.5 13.5-.9 2.1-1.9 4.2-3.1 6.3l-.9 1.5c-.3.5-.6.9-1 1.5-.1.1-.1.2-.2.3-.3-.2.4.7-1.6 0-.5-.9-.2-.7-.3-.9 0-.3.1-.4.1-.6l.3-.9.5-1.6c1.4-4.3 2.6-8.6 3.1-13.1.2-2.2.3-4.4 0-6.7-.3-2.2-.9-4.3-2-6.1-.3-.5-.6-.9-1-1.3s-.7-.8-1.1-1.2c-.8-.8-1.6-1.5-2.5-2.2-1.8-1.4-3.7-2.5-5.7-3.5-4.1-1.8-8.6-2.5-13-2.3-4.5.2-8.9 1.1-13.2 2.3-2.2.6-4.3 1.3-6.5 2-1.1.4-2.2.7-3.3 1-.6.2-1.1.3-1.8.4-.6.1-1.1.2-1.7.2-4.6.5-9.1.8-13.8.7-4.6-.1-9.2-.6-13.8-1.6-4.5-1-9-2.5-13.2-4.4-4.2-2-8.2-4.4-11.8-7.4-3.6-3-6.8-6.4-9.6-10.1-5.6-7.5-9.3-16.2-11.1-25.3-.9-4.6-1.3-9.2-1.1-13.9.1-2.3.4-4.7.9-7 .6-1.8 1.4-4.1 2.7-6.2zm2 1.3c-1.1 1.8-1.8 3.8-2.3 6-.5 2.1-.7 4.3-.9 6.5-.2 4.4.3 8.9 1.2 13.2 1.9 8.7 5.6 17 11 24 2.7 3.5 5.8 6.7 9.2 9.5 3.4 2.8 7.2 5.2 11.2 7.1 4 1.9 8.2 3.3 12.6 4.3 4.3 1 8.8 1.6 13.2 1.7 4.5.2 8.9 0 13.4-.5l1.7-.2c.5-.1 1-.2 1.6-.3 1.1-.3 2.1-.6 3.2-.9 2.2-.6 4.4-1.3 6.6-1.8 4.4-1.1 9-1.9 13.7-1.9 4.6 0 9.3.8 13.5 2.8 2.1 1 4.1 2.2 5.9 3.6.9.7 1.8 1.5 2.6 2.3l1.2 1.2c.4.4.8.9 1.1 1.4 1.3 2 2 4.3 2.3 6.7s.3 4.7.1 7c-.4 4.6-1.4 9.1-2.7 13.5l-.5 1.6-.2.8c0 .1-.1.3 0 .3-.1-.1.2.2-.2-.7-1.9-.7-1.2.2-1.4-.1.2-.4.5-.9.8-1.4.3-.5.5-1 .8-1.5 1-2 1.9-4 2.7-6.1 3-8.3 3.6-17.4 2.1-26.1-.7-4.4-2-8.6-3.6-12.7s-3.5-8.1-5.7-12l-.8-1.4-.2-.4-.1-.2-.1-.2c-.2-.3-.3-.6-.4-.9-.5-1.2-.8-2.5-1.1-3.6-.5-2.3-.9-4.6-1.2-6.8-.7-4.5-1.3-8.9-2.4-13.2-1-4.3-2.4-8.5-4.3-12.4-1.9-3.9-4.2-7.5-7.2-10.7-5.8-6.3-13.8-10.5-22.3-13s-17.5-3.3-26.5-3.3c-8.9 0-17.9 1.1-26.3 3.9-4.2 1.4-8.2 3.3-11.9 5.8-3.8 2.4-7 5.4-9.4 9.1z\"></path><path fill=\"#895B2E\" d=\"M75.6 67.2c1.5-2.4 3.3-4.3 5.1-6.1 1.9-1.8 3.9-3.3 6-4.7 4.2-2.8 8.7-5 13.4-6.7 9.4-3.3 19.3-4.6 29.1-4.4 9.7.3 19.5 1.5 28.9 4.9 4.7 1.7 9.2 3.9 13.3 6.9 4.1 2.9 7.7 6.5 10.7 10.6 2.9 4.1 5.1 8.6 6.8 13.3 1.6 4.7 2.7 9.5 3.5 14.2.4 2.4.7 4.7 1.1 7.1.4 2.3.7 4.7 1.1 6.8.2 1.1.5 2.1.9 2.9l.1.2.1.2.2.4.4.8.9 1.6c1.1 2.1 2.2 4.3 3.2 6.5 1.9 4.4 3.5 9.1 4.6 13.9 1.1 4.7 1.6 9.6 1.6 14.5-.1 9.8-2.8 19.5-7.9 27.8-.4.6-1.2.9-1.8.5-.6-.4-.8-1.1-.6-1.6 1.4-3.6 2.9-7 4-10.5 1.2-3.5 2-7.1 2-10.6s-.9-6.9-3-9.6c-.1-.2-.3-.4-.4-.5l-.2-.2-.2-.3-.9-.9c-.6-.6-1.3-1.2-2-1.7-1.4-1.1-3-2.1-4.5-3.1-6.3-3.9-13-7.3-19.8-10.7-6.8-3.3-13.7-6.5-20.5-9.6-13.8-6.3-27.6-12.6-41.2-19.4-6.8-3.5-13.5-7-20.1-11.2-3.5-2.5-6.7-4.7-9.8-7.5-1.5-1.4-3-3-4.2-5.2-.6-1.1-1.1-2.4-1.2-4 0-.8 0-1.6.2-2.4.1-.4.2-.8.4-1.2.1-.3.4-.9.5-1h.2zm5.6 3.4c-.2.3-.1.2-.2.3 0 .1 0 .1-.1.2v.4c0 .3.2.8.4 1.4.6 1.2 1.7 2.5 2.9 3.6 2.5 2.4 5.4 4.6 8.5 6.6 6.1 4.1 12.7 7.7 19.4 11.3 13.3 7 27 13.5 40.6 20.1 6.8 3.3 13.6 6.7 20.4 10.1 6.8 3.5 13.5 7 20 11.3 1.6 1.1 3.2 2.2 4.7 3.5.8.6 1.5 1.3 2.3 2 .4.4.7.7 1.1 1.2l.2.3.3.3c.2.2.3.4.5.6 1.2 1.7 2.1 3.6 2.7 5.6s.7 4.1.7 6.1c-.1 4-1.2 7.9-2.5 11.6-1.3 3.7-2.9 7.1-4.4 10.6l-2.4-1.2c4.7-8 6.9-17.2 6.8-26.4-.2-9.2-2.6-18.3-6.5-26.7-1-2.1-2-4.2-3.2-6.2l-1.8-3.2c-.7-1.3-1-2.6-1.3-3.8-.6-2.5-1-4.8-1.4-7.2s-.8-4.7-1.2-6.9c-.9-4.6-2-9-3.6-13.3-1.6-4.2-3.7-8.3-6.3-11.8-2.6-3.6-5.9-6.7-9.5-9.2-3.7-2.5-7.7-4.5-12-5.9-8.6-2.9-17.8-3.9-27-4-4.6 0-9.1.2-13.6 1-4.5.7-8.9 1.8-13.1 3.3s-8.3 3.4-12 5.8c-1.9 1.2-3.6 2.5-5.2 4s-3.1 3-4.2 4.6z\"></path><path fill=\"#BA8449\" d=\"M77.8 68.3c-11 17 2.1 82.3 71.2 73.5 7.3-.9 31.6-13.9 48 4.3 8.9 10-3.1 35.3 0 30 3.5-5.8 16.9-28.2-3.2-62.7-6.4-11.1 4.2-64.4-65-65.1-26.5-.1-43.7 8.7-51 20\"></path><defs><path id=\"y\" d=\"M61.7 64.6H179v111.9H61.7z\"></path></defs><clipPath id=\"z\"><use xlink:href=\"#y\" overflow=\"visible\"></use></clipPath><g opacity=\".15\" clip-path=\"url(#z)\"><path fill=\"#E3AB5E\" d=\"M75.968 72.433c19.9-12.8 80.1-11.9 99.3 18.8 12.8 20.4-10.6 70.8-19.3 77.2-8.6 6.4-20.6 12-52.2 4.4-26.8-6.4 13.5-31.3-17.9-34.9-28.7-3.3-31.6-51.5-9.9-65.5\"></path></g><defs><path id=\"A\" d=\"M118.5 119.2h13.1v5.5h-13.1z\"></path></defs><clipPath id=\"B\"><use xlink:href=\"#A\" overflow=\"visible\"></use></clipPath><g opacity=\".25\" clip-path=\"url(#B)\"><path fill=\"#E3AB5E\" d=\"M131.6 121.966c0 1.5-2.9 2.8-6.5 2.8s-6.5-1.2-6.5-2.8c0-1.5 2.9-2.8 6.5-2.8 3.6.1 6.5 1.3 6.5 2.8\"></path></g><path fill=\"#F8A38F\" d=\"M120.1 113.8c1.5-1 9.5-.7 10.5.4 1 1 3.2 5.2.7 7-.9.6-.9-1.9-2.9-1.5-2.4.5-1.1 3.6-3 3.6-2.9-.1-.1-3.4-2.6-3.8-1.9-.4-2.3 1.5-3.2 1.3-2.9-.6-1.6-5.6.5-7\"></path><defs><path id=\"C\" d=\"M117.9 113.2h14.5v9.9h-14.5z\"></path></defs><clipPath id=\"D\"><use xlink:href=\"#C\" overflow=\"visible\"></use></clipPath><g clip-path=\"url(#D)\"><path fill=\"#F8A38F\" d=\"M124.42 113.205c-1.9 0-3.7.2-4.3.6-2.1 1.4-3.4 6.4-.6 6.9h.1c.7 0 1.1-1.4 2.6-1.4h.5c2.5.4-.2 3.8 2.6 3.8 1.8 0 .5-3 3-3.5h.4c1.4 0 1.6 1.6 2.2 1.6.1 0 .2 0 .3-.1 2.6-1.8.4-6-.7-7-.5-.5-3.4-.9-6.1-.9m0 .7c3 0 5.3.4 5.7.7.6.6 1.8 2.8 1.6 4.4-.1.6-.3 1.1-.7 1.4 0-.1-.1-.1-.2-.2-.4-.5-1-1.3-2.1-1.3-.2 0-.4 0-.5.1-1.7.4-2 1.7-2.3 2.6-.2.9-.3.9-.6.9-.8 0-.8-.2-.8-1.1 0-.9 0-2.3-1.8-2.6h-.6c-1.1 0-1.8.7-2.3 1.1-.1.1-.3.3-.4.3-.4-.1-.8-.3-1-1.1-.3-1.4.7-3.8 1.8-4.6.6-.4 2-.6 4.2-.6\"></path></g><defs><path id=\"E\" d=\"M74.1 124.9H187V189H74.1z\"></path></defs><clipPath id=\"F\"><use xlink:href=\"#E\" overflow=\"visible\"></use></clipPath><g opacity=\".25\" clip-path=\"url(#F)\"><path fill=\"#F7E8D0\" d=\"M186.799 140.05c3 19.2-21 43.3-53.3 48.3-32.3 4.9-56.1-23.9-59.1-43.2-3-19.2 16.8-11.9 49.1-16.8s60.3-7.5 63.3 11.7\"></path></g><defs><path id=\"G\" d=\"M80 125.9h93.6v47.5H80z\"></path></defs><clipPath id=\"H\"><use xlink:href=\"#G\" overflow=\"visible\"></use></clipPath><g opacity=\".5\" clip-path=\"url(#H)\"><path fill=\"#D8CAB2\" d=\"M102.515 169.277c-.9-1.4-1.4-3.1-1.9-4.7l-1.5-4.8c-1-3.2-2.1-6.4-3.6-9.4s-3.4-5.8-5.8-7.9c-2.4-2.1-5.3-3.5-8.4-4.1-1.1-.4-1.6-1.5-1.2-2.5.4-1 1.4-1.5 2.3-1.3 7.2 1.7 14.7 2.5 22.1 2.6s15-.3 22.5-1.2c7.5-.9 14.9-2.2 22.2-3.9 7.3-1.7 14.6-3.7 21.7-6.1 1.1-.4 2.2.2 2.5 1.2.3.8 0 1.6-.6 2.1-.2.2-.6.5-.9.8-.3.3-.6.7-.9 1-.6.7-1.2 1.5-1.8 2.3-1.2 1.6-2.3 3.2-3.3 4.9-2.2 3.3-4.2 6.7-6.1 10.2-1.9 3.5-3.8 7-5.5 10.5-.9 1.8-1.7 3.6-2.4 5.4-.4.9-.7 1.8-1.1 2.8-.2.5-.3.9-.4 1.4v.2c0 .1 0 .1-.1.2 0 .1-.1.2-.2.2-.1.1-.2.2-.4.3-.2.2-.5.3-.7.4-1.9.8-3.9 1.2-5.8 1.6-1.9.4-3.9.7-5.9.9-4 .5-7.9.9-11.9 1-4 .2-8 .2-11.9-.2-2-.2-4-.5-5.9-1-1-.3-1.9-.6-2.8-1.1-.9-.4-1.7-1-2.3-1.8m.1-.1c.5.8 1.4 1.4 2.3 1.8.9.4 1.8.7 2.8 1 1.9.5 3.9.8 5.9.9 4 .3 7.9.3 11.9.1 4-.2 7.9-.7 11.8-1.2 1.9-.3 3.9-.6 5.8-1.1s3.9-.9 5.6-1.7c.2-.1.4-.2.6-.4.2-.1.3-.2.3-.3.1-.5.2-1 .4-1.5.3-1 .6-1.9.9-2.9.7-1.9 1.4-3.7 2.2-5.6 1.6-3.7 3.2-7.3 4.9-10.9 1.7-3.6 3.5-7.2 5.4-10.7.9-1.8 1.9-3.5 3-5.3.5-.9 1.1-1.8 1.7-2.6.3-.4.6-.9.9-1.3.4-.4.7-.9 1.2-1.3l1.9 3.4c-7.3 2.5-14.6 4.5-22.1 6.2-7.5 1.7-15 3.1-22.6 4-7.6.9-15.3 1.4-23 1.2s-15.4-1.1-23-2.9l1.1-4c3.3 2 6.3 3.9 8.6 6.6 2.3 2.7 3.9 5.8 5.2 9 1.2 3.2 2.2 6.5 3 9.7.4 1.6.9 3.3 1.3 4.9.6 1.9 1.1 3.5 2 4.9\"></path></g><defs><path id=\"I\" d=\"M81 126.9h91.6v46.5H81z\"></path></defs><clipPath id=\"J\"><use xlink:href=\"#I\" overflow=\"visible\"></use></clipPath><g opacity=\".5\" clip-path=\"url(#J)\"><path fill=\"#D8CAB2\" d=\"M102.532 169.288c-.9-1.4-1.4-3-1.9-4.6-.5-1.6-.9-3.2-1.4-4.8-1-3.2-2-6.4-3.5-9.5-1.4-3-3.3-5.8-5.6-8-2.4-2.3-5.3-3.9-8.4-4.6v-.1c-.5-.2-.8-.8-.6-1.3.2-.5.7-.8 1.2-.7 7.3 1.7 14.8 2.5 22.4 2.6s15.1-.3 22.6-1.2c7.5-.9 14.9-2.3 22.3-3.9 7.4-1.7 14.7-3.7 21.8-6.1.5-.2 1.1.1 1.3.6.1.4 0 .8-.3 1.1-.6.5-1.3 1.3-1.9 2-.6.7-1.2 1.6-1.8 2.3-1.1 1.6-2.2 3.3-3.2 5-2.1 3.3-4.1 6.8-6 10.3-1.9 3.5-3.7 7-5.3 10.6l-2.4 5.4c-.4.9-.7 1.8-1 2.8-.2.5-.3.9-.4 1.4-.1.4-.4.5-.6.7-.2.2-.5.3-.7.4-1.9.8-3.9 1.2-5.8 1.6-1.9.4-3.9.7-5.9 1-3.9.5-7.9.9-11.9 1.1-4 .2-8 .2-11.9-.2-2-.2-4-.5-5.9-1-1-.3-1.9-.6-2.8-1-1-.5-1.9-1.1-2.4-1.9m0-.1c.5.8 1.4 1.4 2.3 1.9.9.4 1.8.7 2.8 1 1.9.5 3.9.8 5.9.9 4 .4 7.9.3 11.9.1 4-.2 7.9-.6 11.9-1.2 1.9-.3 3.9-.6 5.9-1.1 1.9-.4 3.9-.9 5.6-1.7.2-.1.4-.2.6-.4.2-.1.4-.3.4-.4.1-.5.2-1 .4-1.5.3-1 .6-1.9 1-2.8.7-1.9 1.5-3.7 2.3-5.5 1.6-3.7 3.3-7.2 5.1-10.8 1.8-3.6 3.6-7.1 5.6-10.6 1-1.8 2-3.5 3.1-5.1.5-.9 1.1-1.7 1.7-2.5.6-.8 1.2-1.6 2.1-2.4l1 1.8c-7.2 2.5-14.6 4.5-22 6.2s-14.9 3-22.5 4c-7.6.9-15.2 1.4-22.9 1.2-7.6-.2-15.3-1-22.8-2.7l.5-1.9c3.3 1.3 6.3 3.3 8.6 5.9 2.3 2.6 4 5.6 5.3 8.7 1.3 3.1 2.3 6.3 3.2 9.6.4 1.6.9 3.2 1.4 4.9.2 1.4.7 3 1.6 4.4\"></path></g><path fill=\"#333\" d=\"M102.6 169.2c5.1 8 46.8 2.5 47.5-.7 1.8-8.1 16.8-36.7 21.6-40.7-8.6 3-53.3 17.3-89.6 8.6 16.3 5.5 16.5 26.6 20.5 32.8\"></path><g><defs><path id=\"K\" d=\"M82 127.9h89.6v45.4H82z\"></path></defs><clipPath id=\"L\"><use xlink:href=\"#K\" overflow=\"visible\"></use></clipPath><g clip-path=\"url(#L)\"><path fill=\"#333\" d=\"M171.55 127.95c-6.7 2.3-34.9 11.4-64.1 11.4-8.6 0-17.2-.8-25.5-2.7 16.4 5.3 16.6 26.5 20.6 32.7 1.9 3 9.2 4.1 17.5 4.1 13.4 0 29.5-2.8 30-4.8 1.8-8.2 16.7-36.8 21.5-40.7m-5.6 3.9c-6.5 9.8-15.9 28.7-17.8 35.8-2.5 1.4-15.4 3.8-28.1 3.8-10.2 0-14.8-1.7-15.8-3.2-1-1.5-1.8-4.3-2.6-7.5-1.7-6.1-4.1-14.5-9.8-20.3 5 .6 10.2.9 15.7.9 23.8-.1 47.1-6.1 58.4-9.5\"></path></g></g><path fill=\"#FCD4C3\" d=\"M119.7 173.4c-8.6 0-14.2-1.2-16.4-3.6-.2-.2-.2-1.4.8-3.7 2.4-5.5 9.8-14.9 22.6-15.7.9 0 1.7-.1 2.5-.1 15 0 24 7.6 24 8.9-.2.4-.4 1-.7 1.8-.8 1.9-2 4.9-3.1 8.1-1.3 1.3-16.3 4.3-29.7 4.3\"></path><path fill=\"#F8A38F\" d=\"M129.2 149.8c-.9 0-1.7 0-2.6.1-17.5 1.1-25.6 18.4-23.8 20.5 2.6 2.8 9.3 3.8 16.9 3.8 13.5 0 29.8-3.1 30.3-4.6 1.5-4.5 3.2-8.2 3.9-10 .6-1.8-9.5-9.9-24.7-9.8m0 1.3c13.4 0 22.4 6.4 23.3 8.3-.2.4-.4.9-.6 1.5-.8 1.9-2 4.7-3.1 7.9-2.1 1.2-16.1 3.9-29.1 3.9-8.1 0-13.7-1.2-15.8-3.3-.1-.7.6-3.5 3.1-7 2.2-3.2 8.6-10.7 19.7-11.3h2.5\"></path><g><defs><path id=\"M\" d=\"M103.1 149.4h50.2v20.7h-50.2z\"></path></defs><clipPath id=\"N\"><use xlink:href=\"#M\" overflow=\"visible\"></use></clipPath><g clip-path=\"url(#N)\"><path fill=\"#FCD4C3\" d=\"M103.084 169.317c-1.2 5.4 31.9-21.1 49.7-8.4 3.7-4.9-16-13.2-27.5-11.3-9.7 1.7-19.7 7.9-22.2 19.7\"></path></g></g><path fill=\"#FFF7E3\" d=\"M109.8 140.8c1.7 3 4.8 17.6 6.1 17.9s9.5 2.6 10.6 2.1c1.2-.5 1.1-3.3 2.3-2.5 1 .7 1.5 2 2.5 1.5 1.8-.9 7.1-4.2 8-5.6.8-1.5.7-9.8 0-16.4-3.4 1.6-23.5 3.7-29.5 3\"></path><g><defs><path id=\"O\" d=\"M109.8 137.9h30.1v23.2h-30.1z\"></path></defs><clipPath id=\"P\"><use xlink:href=\"#O\" overflow=\"visible\"></use></clipPath><g clip-path=\"url(#P)\"><path fill=\"#FFDC99\" d=\"M139.35 137.85c-3 1.3-18.7 3.1-26.6 3.1-1.2 0-2.1 0-2.9-.1 1.7 3 4.8 17.6 6.1 17.9 1.2.3 8 2.2 10.1 2.2.2 0 .4 0 .5-.1 1-.4 1.1-2.6 1.9-2.6.1 0 .3 0 .4.2.9.5 1.3 1.6 2.1 1.6.1 0 .3 0 .4-.1 1.8-.9 7.1-4.2 8-5.6.9-1.5.7-9.8 0-16.5m-.5.9c.6 6.8.6 14 0 15.2-.7 1.2-5.5 4.3-7.7 5.4h-.1c-.2 0-.5-.3-.7-.6-.3-.3-.6-.6-1-.9-.3-.2-.5-.3-.8-.3-.9 0-1.2.9-1.5 1.6-.2.4-.4 1-.7 1.1h-.3c-1.7 0-6.8-1.4-8.9-1.9-.4-.1-.7-.2-.9-.2-.6-.7-1.9-5.4-2.9-8.8-.9-3.1-1.7-6-2.4-7.7h1.9c7.5 0 21.5-1.6 26-2.9\"></path></g></g><g><defs><path id=\"Q\" d=\"M109.9 137.5h29.7v10.3h-29.7z\"></path></defs><clipPath id=\"R\"><use xlink:href=\"#Q\" overflow=\"visible\"></use></clipPath><g clip-path=\"url(#R)\"><path fill=\"#EADCBE\" d=\"M112.151 147.85c-.5-5.4 24.4-7.2 27.5-6.7 0-1.3-.2-2.1-.2-3.6-4.1 2.1-26.5 4.3-29.5 3.4.3.6 1.4 3.6 2.2 6.9\"></path></g></g><g><defs><path id=\"S\" d=\"M124 143.8h5.5v14.7H124z\"></path></defs><clipPath id=\"T\"><use xlink:href=\"#S\" overflow=\"visible\"></use></clipPath><g clip-path=\"url(#T)\"><path fill=\"#FFDC99\" d=\"M124.558 143.768c.5 1.2 1 2.3 1.4 3.5l1.2 3.6 1.1 3.6 1.1 3.6-1.7.5-.8-3.7-.9-3.7-.9-3.6c-.4-1.2-.7-2.4-1.1-3.5l.6-.3z\"></path></g></g><g><defs><path id=\"U\" d=\"M39.1 51.5h39.4v35.7H39.1z\"></path></defs><clipPath id=\"V\"><use xlink:href=\"#U\" overflow=\"visible\"></use></clipPath><g opacity=\".4\" clip-path=\"url(#V)\"><path fill=\"#FCD4C3\" d=\"M40.384 59.116c13.2 3.4 11.1 26.2 18.9 28 7.9 1.8 18.2-18.8 19.2-23.3-15.2-6.5-22.3-14.1-33.2-11.9-3.6.7-8.6 6.2-4.9 7.2\"></path></g></g><g><defs><path id=\"W\" d=\"M59.9 88.7h133.7v42.5H59.9z\"></path></defs><clipPath id=\"X\"><use xlink:href=\"#W\" overflow=\"visible\"></use></clipPath><g opacity=\".5\" clip-path=\"url(#X)\"><path fill=\"#E3AB5E\" d=\"M76.967 125.833c16.6 1.3 30.3 2 35.2-3.1s6.7-27.7 14.7-27.1c6.8.5 9.1 29.9 13.5 30.7 4.4.9 35.5 9.4 43.3 1.4 7.7-8 11.3-13 9.5-17.8-1.8-4.8-47.3-20.3-56.6-21.2-9.3-.9-72.1 7-73.7 10.9-1.6 4-3.3 3.4-3 7.6.6 8.1.5 17.3 17.1 18.6\"></path></g></g><path fill=\"#333\" d=\"M123.5 92.4c1.2 0 5.9-.4 7 .5 6 4.7 5.8 24 12.1 30 5.6 5.4 36.2 9.3 41.5 3.2 5.3-6.1 13.1-24.7 14.9-26.1 1.8-1.3 5.8-2.3 7-4.2 1.2-1.8.2-10-2.6-9.6-2.8.4-8.1 2.1-11.4 1.2-3.3-1-19.4-11.1-59.9-5-3.9.6-7.8 0-10.5-.7S103.7 72.2 63 78c-4 .6-9.6-1.2-11.6-1-2 .2-2.6 6.5-1.8 8.1s5 3 5.5 5 4.2 21.6 13.8 29.7c10.2 8.6 36.2 2.6 38.5 1 10.3-7.3 12.6-28.4 16.1-28.4\"></path><g><defs><path id=\"Y\" d=\"M49.1 76.1h157.3v53.1H49.1z\"></path></defs><clipPath id=\"Z\"><use xlink:href=\"#Y\" overflow=\"visible\"></use></clipPath><g clip-path=\"url(#Z)\"><path fill=\"#1A1A1A\" d=\"M88.438 76.123c-7.1 0-15.6.5-25.6 2-.6.1-1.2.1-1.8.1-3.5 0-7.6-1.1-9.5-1.1h-.3c-2 .2-2.6 6.5-1.8 8.1.8 1.7 5 3 5.5 5s4.2 21.6 13.8 29.7c4 3.4 10.6 4.5 17.2 4.5 10 0 19.9-2.5 21.3-3.5 10.4-7.4 12.8-28.5 16.3-28.5.5 0 1.8-.1 3-.1 1.6 0 3.3.1 3.9.5 6 4.7 5.8 24 12.1 30 3.6 3.4 17.4 6.3 28.2 6.3 6.1 0 11.3-.9 13.2-3.1 5.3-6.1 13.1-24.7 14.9-26.1 1.8-1.4 5.8-2.3 7-4.2 1.1-1.8.2-9.6-2.5-9.6h-.2c-2.2.3-6 1.4-9.1 1.4-.8 0-1.6-.1-2.3-.3-2.6-.8-12.7-6.9-35.7-6.9-6.9 0-14.9.5-24.2 1.9-1.1.2-2.3.2-3.3.2-2.7 0-5.2-.4-7.1-.9-2-.2-11.2-5.4-33-5.4m0 2c18.1 0 27.4 3.6 30.8 5 .7.3 1.2.5 1.7.6 1.8.4 4.5 1 7.6 1 1.2 0 2.5-.1 3.6-.3 8.5-1.3 16.5-1.9 23.9-1.9 19 0 28.9 4.2 33.2 6.1.9.4 1.5.6 2 .8.9.3 1.8.4 2.9.4 2.2 0 4.6-.5 6.6-.9.9-.2 1.8-.4 2.5-.5.9 1 1.5 5.4 1 6.6-.4.6-2.1 1.4-3.3 1.9-1.2.5-2.3 1-3.1 1.6-1.1.8-2.2 2.9-5.4 9.3-3.1 6.1-6.9 13.7-9.8 17-1 1.2-4.6 2.4-11.8 2.4-10.5 0-23.9-2.8-26.9-5.7-2.8-2.6-4.2-8.7-5.6-14.6-1.6-6.6-3.1-12.8-6.6-15.6-.9-.7-2.3-1-5.1-1h-3.1c-2.8 0-4 3.3-6.1 9.3-2.3 6.6-5.6 15.5-11.3 19.6-1.3.8-10.7 3.2-20.2 3.2-7.3 0-12.8-1.4-15.9-4-3.8-3.2-9.1-10.7-12.9-27.8-.1-.4-.2-.7-.2-.9-.5-1.9-2.3-3-3.8-4-.6-.4-1.6-1.1-1.8-1.4-.4-.9 0-4.2.6-5.3.7 0 1.7.2 2.8.4 1.9.3 4.3.7 6.5.7.7 0 1.5 0 2.1-.2 8.9-1.1 17.4-1.8 25.1-1.8\"></path></g></g><g><defs><path id=\"aa\" d=\"M64.4 83.4h50.5v34.2H64.4z\"></path></defs><clipPath id=\"ab\"><use xlink:href=\"#aa\" overflow=\"visible\"></use></clipPath><g opacity=\".5\" clip-path=\"url(#ab)\"><path fill=\"none\" stroke=\"#333\" stroke-width=\"4\" stroke-miterlimit=\"10\" d=\"M66.2 90.45c-.9 1.2-1.5 18.9 6 23.7 4.9 3.2 25.7 2.5 29.9.2 6.5-3.7 12.9-20.5 11.1-22.9-3-4-24.6-9.3-40.8-5.1-2 .4-5.1 2.6-6.2 4.1z\"></path></g></g><path fill=\"#FFF\" d=\"M66.2 90.4c-.9 1.2-1.5 18.9 6 23.7 4.9 3.2 25.7 2.5 29.9.2 6.5-3.7 12.9-20.5 11.1-22.9-3-4-24.6-9.3-40.8-5.1-2 .5-5.1 2.6-6.2 4.1\"></path><g><defs><path id=\"ac\" d=\"M139.8 88.1h50.1v35h-50.1z\"></path></defs><clipPath id=\"ad\"><use xlink:href=\"#ac\" overflow=\"visible\"></use></clipPath><g opacity=\".5\" clip-path=\"url(#ad)\"><path fill=\"none\" stroke=\"#333\" stroke-width=\"4\" stroke-miterlimit=\"10\" d=\"M188.394 98.163c.8 1.3-1 18.9-9 22.8-5.3 2.5-25.8-.9-29.6-3.7-6-4.5-10.2-22-8.1-24.2 3.5-3.6 25.6-6 41.1.2 1.9.7 4.7 3.3 5.6 4.9z\"></path></g></g><path fill=\"#FFF\" d=\"M188.4 98.2c.8 1.3-1 18.9-9 22.8-5.3 2.5-25.8-.9-29.6-3.7-6-4.5-10.2-22-8.1-24.2 3.5-3.6 25.6-6 41.1.2 1.9.7 4.6 3.2 5.6 4.9\"></path><path d=\"M89.9 101.2c-.5 3.9-2.5 6.8-4.4 6.5-1.9-.3-2.9-3.6-2.4-7.5s2.5-6.8 4.4-6.5c1.9.3 2.9 3.6 2.4 7.5M169.6 105.6c.4 3.9-.8 7.2-2.6 7.4-1.9.2-3.7-2.8-4.1-6.7-.4-3.9.8-7.2 2.6-7.4 1.8-.1 3.6 2.9 4.1 6.7\"></path><g><defs><path id=\"ae\" d=\"M49.1 81.6h156.3v46H49.1z\"></path></defs><clipPath id=\"af\"><use xlink:href=\"#ae\" overflow=\"visible\"></use></clipPath><g opacity=\".3\" clip-path=\"url(#af)\"><path fill=\"#333\" d=\"M51.475 82.75c2.3 1.5 4.4.6 4.9 3.6s7.4 29 16 32c14.1 4.9 31.9.1 34.3-1.4 2.4-1.5 13.7-26.8 15.6-27.8 1.9-1 7.9.1 9.2.7 3.9 1.7 11.1 29.1 13 30.5 8.7 6.1 36.6 5.6 37.9 4 1.4-1.7 11.8-25.6 13.7-27 2.7-2.1 9-3.5 9.2-2.6.2.9-5.1 1.8-6.7 3.7-1.6 2-12.1 24.9-15.4 26.9-3.3 2-27.7 5.3-40.1-3.4-5.9-4.2-8.2-29.1-12.9-30.5-3-.9-5.3-.8-7.5-.2-2.9 1.9-7 23.1-15.7 28.4-3.5 2.1-30.6 7.4-38.7-1.1-15.1-15.8-10.5-29.9-15.4-31.9-3.3-1.4-4-3.2-4-4.4.3-1.3 1.4-.3 2.6.5\"></path></g></g><g><defs><path id=\"ag\" d=\"M51.6 77.2h20.2v3H51.6z\"></path></defs><clipPath id=\"ah\"><use xlink:href=\"#ag\" overflow=\"visible\"></use></clipPath><g opacity=\".3\" clip-path=\"url(#ah)\"><path fill=\"#333\" d=\"M51.75 77.45c-1.6-.6 6.8 2.9 9.9 2.7 3.1-.2 8.3-2.4 10-2.9 1.5-.5-7.8 1.2-10.1 1.1s-8.9-.6-9.8-.9\"></path></g></g><g><defs><path id=\"ai\" d=\"M116.6 82.1h21.7v5.3h-21.7z\"></path></defs><clipPath id=\"aj\"><use xlink:href=\"#ai\" overflow=\"visible\"></use></clipPath><g opacity=\".3\" clip-path=\"url(#aj)\"><path fill=\"#333\" d=\"M116.6 82.15c2.9 1.3 4.2 4.6 7 4.9s6.2.8 7.8-.1c1.6-.9 5.6-3 6.7-3.2 1.2-.2-8.7 1.3-12.4 1-3.7-.4-8-2.5-9.1-2.6\"></path></g></g><g><defs><path id=\"ak\" d=\"M187.4 86h12.3v3.9h-12.3z\"></path></defs><clipPath id=\"al\"><use xlink:href=\"#ak\" overflow=\"visible\"></use></clipPath><g opacity=\".3\" clip-path=\"url(#al)\"><path fill=\"#333\" d=\"M187.575 85.975c-1.2-.5 4.4 4 6.1 3.8 1.7-.2 4.7-2.1 6-2.6 1-.4-4 1-5.5.7-1.5-.1-5.4-1.4-6.6-1.9\"></path></g></g><g><defs><path id=\"am\" d=\"M62.3 82.8h28.9v28.6H62.3z\"></path></defs><clipPath id=\"an\"><use xlink:href=\"#am\" overflow=\"visible\"></use></clipPath><g opacity=\".3\" clip-path=\"url(#an)\"><path fill=\"#333\" d=\"M63.05 87.825c7.4-7.3 25-4.8 28.2-4.2-21.1 1.5-21.5 3.1-25.2 6.8-.5 2.9-1.2 12.5 2.1 20.9-3.7-2-7.6-21-5.1-23.5\"></path></g></g><g><defs><path id=\"ao\" d=\"M165.1 87.8h27.8v30.5h-27.8z\"></path></defs><clipPath id=\"ap\"><use xlink:href=\"#ao\" overflow=\"visible\"></use></clipPath><g opacity=\".3\" clip-path=\"url(#ap)\"><path fill=\"#333\" d=\"M192.46 95.698c-6.4-8.2-24.1-8.1-27.4-7.8 20.7 4.3 20.9 5.9 24.1 10.1.2 2.9-.4 12.5-4.7 20.4 3.8-1.6 10.1-20 8-22.7\"></path></g></g><g><defs><path id=\"aq\" d=\"M65.8 84.8h47.8v27.5H65.8z\"></path></defs><clipPath id=\"ar\"><use xlink:href=\"#aq\" overflow=\"visible\"></use></clipPath><g clip-path=\"url(#ar)\"><path fill=\"#D0DDDC\" d=\"M66.412 102.575c.7-8.6 1.5-15.6 18.6-16.1 13.7-.4 24.6 2.8 26.1 6.1 1 2.1.2 11.3-6.6 19.7 4.4-3.9 11.4-19.4 8.4-21.3-11.1-7.1-33.2-7.3-41.4-4.4-1.5.5-3.9 2.2-5.5 4-.3 2.2-.3 10.8.4 12\"></path></g></g><g><defs><path id=\"as\" d=\"M66.8 103H102v13.9H66.8z\"></path></defs><clipPath id=\"at\"><use xlink:href=\"#as\" overflow=\"visible\"></use></clipPath><g clip-path=\"url(#at)\"><path fill=\"#D0DDDC\" d=\"M66.884 103.2c2.6 16.8 33.3 11.7 35.1 11-.1.9-16.1 5.4-29.5.2-5.4-2-5.8-13.1-5.6-11.2\"></path></g></g><g><defs><path id=\"au\" d=\"M141.2 89.5h47.7V115h-47.7z\"></path></defs><clipPath id=\"av\"><use xlink:href=\"#au\" overflow=\"visible\"></use></clipPath><g clip-path=\"url(#av)\"><path fill=\"#D0DDDC\" d=\"M186.957 110.087c.4-8.7.4-15.6-16.4-18.2-13.5-2.1-24.7-.3-26.7 2.8-1.2 1.9-1.6 11.2 4.2 20.4-3.9-4.5-9-20.6-5.7-22.2 11.9-5.7 33.9-3.2 41.6.7 1.4.7 3.7 2.6 5 4.7-.1 2.1-1.1 10.7-2 11.8\"></path></g></g><g><defs><path id=\"aw\" d=\"M150.2 110.4h36.3v11.7h-36.3z\"></path></defs><clipPath id=\"ax\"><use xlink:href=\"#aw\" overflow=\"visible\"></use></clipPath><g clip-path=\"url(#ax)\"><path fill=\"#D0DDDC\" d=\"M186.383 110.613c-4.6 16.3-34.5 7.5-36.2 6.6 0 .9 15.3 7.3 29.3 3.9 5.6-1.4 7.5-12.4 6.9-10.5\"></path></g></g><g><defs><path id=\"ay\" d=\"M87.3 95.2h2v2h-2z\"></path></defs><clipPath id=\"az\"><use xlink:href=\"#ay\" overflow=\"visible\"></use></clipPath><g opacity=\".25\" clip-path=\"url(#az)\"><path fill=\"#FFF\" d=\"M89.375 96.2c0-.5-.4-1-1-1s-1 .4-1 1 .4 1 1 1 1-.4 1-1\"></path></g></g><g><defs><path id=\"aA\" d=\"M166.3 99.9h2v2h-2z\"></path></defs><clipPath id=\"aB\"><use xlink:href=\"#aA\" overflow=\"visible\"></use></clipPath><g opacity=\".25\" clip-path=\"url(#aB)\"><path fill=\"#FFF\" d=\"M168.375 100.9c0-.5-.4-1-1-1-.5 0-1 .4-1 1s.4 1 1 1c.5 0 1-.5 1-1\"></path></g></g><g><defs><path id=\"aC\" d=\"M52 79.1h64.8v9.5H52z\"></path></defs><clipPath id=\"aD\"><use xlink:href=\"#aC\" overflow=\"visible\"></use></clipPath><g opacity=\".1\" clip-path=\"url(#aD)\"><path fill=\"#D0DDDC\" d=\"M52.025 81.675c2.4 2.7 3.9 3 7.1 2.6 31.1-4 48.3-3.9 56.8 4 1.8 1.7.8-5.1-2.6-6-26.2-6.9-45.2-.7-49.2-.2-4.1.6-7-.3-12.1-.4\"></path></g></g><g><defs><path id=\"aE\" d=\"M137.7 82.3h47.9v9.2h-47.9z\"></path></defs><clipPath id=\"aF\"><use xlink:href=\"#aE\" overflow=\"visible\"></use></clipPath><g opacity=\".1\" clip-path=\"url(#aF)\"><path fill=\"#D0DDDC\" d=\"M138.025 85.675c-.7.7-.4 7.9 3 5.2 9.8-7.8 30.3-6 44.6-1.2-2.3-4.5-19-7.6-28.4-7.5-4.5.2-17.3 1.5-19.2 3.5\"></path></g></g><path fill=\"#D0DDDC\" d=\"M197.2 91.4c0 .3-1.6.5-3.5.5s-3.5-.2-3.5-.5 1.6-.5 3.5-.5c2 0 3.5.3 3.5.5M62.4 82.8c0 .3-1.6.3-3.5 0s-3.4-.8-3.3-1.1 1.6-.3 3.5 0c1.9.2 3.4.7 3.3 1.1\"></path><g><path fill=\"#FFF\" d=\"M256.04 243.036c-.6-6.1-5.1-8.8-9.2-8.8-1.9 0-3.4.5-4 .8l-.8.4-.7.5c-1 .7-2.7 1.8-4.2 2.3-.1-1.2 0-2.8.2-4.2v-.2c1.1-10.7-1.1-17-6.7-18.6-.9-.3-1.9-.4-2.9-.4-3.4 0-6.4 1.6-8.3 3-1.6-2.1-4.4-3.2-7.8-3.2-5.1 0-9.2 2.4-10.7 6.2-.2.4-.4 1-.6 1.8-3-6.6-9.1-9.1-14.8-9.1-5.4 0-10.6 2.1-12.5 3.6-.1.1-.2.1-.3.2-5.1 3.6-9.1 8.2-11.9 13.7-1.4-4.7-4.4-9.2-9.7-12.5l-.1-.1c-.2-.1-.3-.2-.4-.2 5.3-9.3 9.9-21.7 7.1-33.5-3-12.6-10.4-14.4-14.5-14.4-1.7 0-3.5.3-5.3.9h-.2c-7.8 3.1-11.2 7.7-12 8.8-.8 1.2-9.3 14.2-11.4 33.2-.2 2.1-.5 4.3-.7 6.5-1.2-1.7-3.2-3.3-6.3-4.2-1-.3-2-.4-3-.4-4.3 0-7.8 2.6-9.7 4.4-1.6-2.4-4.2-3.9-7.1-4h-.7c-4.6 0-8.2 2-10.9 4.3-1.7-3-4.9-4.9-8.6-4.9h-1.5c-5.1 0-9.1 2.4-10.7 6.4-.1.3-.3.7-.4 1.2-4-5-9.1-7.3-16-7.3h-.7c-4.3.1-14.9 1.9-21.5 16.6-1 2.3-1.8 4.6-2.4 6.8-1.4-.7-2.8-.8-3.7-.8-3.4 0-6 1.9-7.2 3.8-1 1.5-4.2 6.7-2.6 11.9.9 2.8 2.8 4.9 5.6 6 2.5 1 5.6 1.9 7.9 2.6 1.4 3.3 4 7 8.6 10.5 3.2 2.5 7.4 3.7 12.2 3.7 8.2 0 16.1-3.5 16.9-3.9l.3-.2.1-.1c1.6 1.6 3.6 2.8 6.2 3.3.8.2 1.8.3 3 .3 4.4 0 7.5-2.3 10.4-6.5 2.3 3.7 6.6 5.7 11.6 5.7.3 0 .5.2.9.2 2.6 0 6-.9 8.7-5.4 2.3 4.1 6.5 6.5 11.5 6.5 4.4 0 8.3-1.8 9-2.2l.2-.1c1.5-.8 2.7-1.5 3.7-2 3.3 1.8 8.3 3.7 14.5 3.7 1.1 0 2.1 0 3.2-.2h.6c13-2.6 21.5-5.7 26.6-8.1 3.5 4 9.2 7.8 17.2 8.4.9.1 1.8.1 2.7.1 6.6 0 11.9-1.9 15.8-3.9 1.2 1.3 2.8 2.5 4.8 3.3 1.2.5 2.5.7 3.7.7 8.1 0 11.9-9.6 12.9-12.9l1.9-5.2c1.7 1.8 3.9 3.3 6.7 4.1 1.5.4 3.2.7 4.8.7 8.9 0 17.5-6.3 18.8-7.4 2.3-2.3 4.9-6.5 4.4-12.2\"></path></g><g><path fill=\"#E24B31\" d=\"M174.35 245.713s-1.1-4 3.1-11.6 7.4-3.5 7.4-3.5 3.6 3.9-.5 9.7c-4.1 5.8-10 5.4-10 5.4m-32.1 5.5c-4.8 12.5-16.4 7.4-16.4 7.4s-1.3-4.5 2.5-17 12.6-7.6 12.6-7.6 6.1 4.7 1.3 17.2m-8.7-52.5s7.2-18.9 9-9.7c1.8 9.2-15.2 36.5-15.2 36.5.2-6.1 6.2-26.8 6.2-26.8m-103.5 47c.3-12.1 8.2-17.4 11-14.8 2.8 2.6 1.8 8.4-3.5 11.9-5.1 3.6-7.5 2.9-7.5 2.9m219.3-2c-.4-4.1-4.1-2.6-4.1-2.6s-5.9 4.6-11.1 4.1c-5.2-.5-3.5-12.1-3.5-12.1s1.1-10.7-1.9-11.6c-3.1-.9-6.8 2.8-6.8 2.8s-4.7 5.2-6.9 11.8l-.6.2s.7-11.6-.1-14.3c-.6-1.3-6.2-1.2-7.1 1.1-.9 2.3-5.4 18.6-5.7 25.5 0 0-8.8 7.4-16.4 8.7-7.7 1.2-9.5-3.6-9.5-3.6s20.8-5.8 20.1-22.4c-.7-16.6-16.8-10.5-18.6-9.1-1.8 1.3-11.1 7-13.9 22.6-.1.5-.3 2.9-.3 2.9s-8.1 5.4-12.5 6.8c0 0 12.5-21.1-2.8-30.7-6.9-4.2-12.5 4.6-12.5 4.6s20.7-23 16.1-42.5c-2.2-9.3-6.8-10.3-11.1-8.8-6.5 2.6-8.9 6.3-8.9 6.3s-8.4 12.1-10.3 30.2-4.8 39.8-4.8 39.8-4 3.9-7.6 4.1c-3.7.2-2-10.9-2-10.9s2.8-16.9 2.6-19.8-.4-4.4-3.8-5.4c-3.3-1-7 3.3-7 3.3s-9.7 14.7-10.5 16.9l-.5.9-.5-.6s6.8-20 .3-20.3c-6.5-.3-10.8 7.1-10.8 7.1s-7.4 12.5-7.7 13.9l-.5-.6s3.1-14.5 2.5-18.1c-.6-3.6-4-2.8-4-2.8s-4.3-.5-5.4 2.3c-1.1 2.8-5.2 21-5.7 26.8 0 0-10.7 7.7-17.7 7.7-7 .1-6.3-4.5-6.3-4.5s25.8-8.8 18.8-26.3c-3.2-4.5-6.8-5.9-12-5.8-5.2.1-11.3 3.3-15.5 12.6-2 4.5-2.8 8.7-2.8 11.9 0 0-4.8.9-7.3-1.1s-3.9 0-3.9 0-4.3 6.1-.1 7.7c4.2 1.6 10.6 3.2 10.6 3.2.6 2.6 2.3 7 7.4 10.8 7.6 5.8 22.3-.9 22.3-.9l6-3.6s.2 5.4 4.6 6.2c4.4.8 6.2-.1 13.9-18.6 4.5-9.5 4.8-9 4.8-9l.5-.1s-3.5 18.1-2.1 23 7.1 4.4 7.1 4.4 3.2 1.1 5.7-7.9c2.6-9 7.4-18.4 7.4-18.4h.6s-2.1 18.1 1.1 24c3.3 5.9 11.7 1.8 11.7 1.8s5.9-3.1 6.8-4c0 0 7 5.9 16.9 4.8 22.1-4.4 30-10.3 30-10.3s3.8 9.6 15.6 10.5c13.5 1 20.8-7.5 20.8-7.5s-.1 5.5 4.6 7.4c4.7 1.9 7.9-8.3 7.9-8.3l7.9-21.1h.7s.4 13.5 8.2 15.7c7.8 2.2 17.9-5.6 17.9-5.6s2.2-1.1 1.7-5.2\"></path></g></svg>"
 
 /***/ }),
 
-/***/ 112:
-/***/ (function(module, exports, __webpack_require__) {
-
-var baseSet = __webpack_require__(113);
-
-/**
- * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,
- * it's created. Arrays are created for missing index properties while objects
- * are created for all other missing properties. Use `_.setWith` to customize
- * `path` creation.
- *
- * **Note:** This method mutates `object`.
- *
- * @static
- * @memberOf _
- * @since 3.7.0
- * @category Object
- * @param {Object} object The object to modify.
- * @param {Array|string} path The path of the property to set.
- * @param {*} value The value to set.
- * @returns {Object} Returns `object`.
- * @example
- *
- * var object = { 'a': [{ 'b': { 'c': 3 } }] };
- *
- * _.set(object, 'a[0].b.c', 4);
- * console.log(object.a[0].b.c);
- * // => 4
- *
- * _.set(object, ['x', '0', 'y', 'z'], 5);
- * console.log(object.x[0].y.z);
- * // => 5
- */
-function set(object, path, value) {
-  return object == null ? object : baseSet(object, path, value);
-}
-
-module.exports = set;
-
-
-/***/ }),
-
-/***/ 113:
-/***/ (function(module, exports, __webpack_require__) {
-
-var assignValue = __webpack_require__(114),
-    castPath = __webpack_require__(69),
-    isIndex = __webpack_require__(117),
-    isObject = __webpack_require__(84),
-    toKey = __webpack_require__(111);
-
-/**
- * The base implementation of `_.set`.
- *
- * @private
- * @param {Object} object The object to modify.
- * @param {Array|string} path The path of the property to set.
- * @param {*} value The value to set.
- * @param {Function} [customizer] The function to customize path creation.
- * @returns {Object} Returns `object`.
- */
-function baseSet(object, path, value, customizer) {
-  if (!isObject(object)) {
-    return object;
-  }
-  path = castPath(path, object);
-
-  var index = -1,
-      length = path.length,
-      lastIndex = length - 1,
-      nested = object;
-
-  while (nested != null && ++index < length) {
-    var key = toKey(path[index]),
-        newValue = value;
-
-    if (index != lastIndex) {
-      var objValue = nested[key];
-      newValue = customizer ? customizer(objValue, key, nested) : undefined;
-      if (newValue === undefined) {
-        newValue = isObject(objValue)
-          ? objValue
-          : (isIndex(path[index + 1]) ? [] : {});
-      }
-    }
-    assignValue(nested, key, newValue);
-    nested = nested[key];
-  }
-  return object;
-}
-
-module.exports = baseSet;
-
-
-/***/ }),
-
-/***/ 114:
-/***/ (function(module, exports, __webpack_require__) {
-
-var baseAssignValue = __webpack_require__(115),
-    eq = __webpack_require__(97);
-
-/** Used for built-in method references. */
-var objectProto = Object.prototype;
-
-/** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
-
-/**
- * Assigns `value` to `key` of `object` if the existing value is not equivalent
- * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
- * for equality comparisons.
- *
- * @private
- * @param {Object} object The object to modify.
- * @param {string} key The key of the property to assign.
- * @param {*} value The value to assign.
- */
-function assignValue(object, key, value) {
-  var objValue = object[key];
-  if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||
-      (value === undefined && !(key in object))) {
-    baseAssignValue(object, key, value);
-  }
-}
-
-module.exports = assignValue;
-
-
-/***/ }),
-
-/***/ 115:
-/***/ (function(module, exports, __webpack_require__) {
-
-var defineProperty = __webpack_require__(116);
-
-/**
- * The base implementation of `assignValue` and `assignMergeValue` without
- * value checks.
- *
- * @private
- * @param {Object} object The object to modify.
- * @param {string} key The key of the property to assign.
- * @param {*} value The value to assign.
- */
-function baseAssignValue(object, key, value) {
-  if (key == '__proto__' && defineProperty) {
-    defineProperty(object, key, {
-      'configurable': true,
-      'enumerable': true,
-      'value': value,
-      'writable': true
-    });
-  } else {
-    object[key] = value;
-  }
-}
-
-module.exports = baseAssignValue;
-
-
-/***/ }),
-
-/***/ 116:
-/***/ (function(module, exports, __webpack_require__) {
-
-var getNative = __webpack_require__(81);
-
-var defineProperty = (function() {
-  try {
-    var func = getNative(Object, 'defineProperty');
-    func({}, '', {});
-    return func;
-  } catch (e) {}
-}());
-
-module.exports = defineProperty;
-
-
-/***/ }),
-
-/***/ 117:
-/***/ (function(module, exports) {
-
-/** Used as references for various `Number` constants. */
-var MAX_SAFE_INTEGER = 9007199254740991;
-
-/** Used to detect unsigned integer values. */
-var reIsUint = /^(?:0|[1-9]\d*)$/;
-
-/**
- * Checks if `value` is a valid array-like index.
- *
- * @private
- * @param {*} value The value to check.
- * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
- * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
- */
-function isIndex(value, length) {
-  var type = typeof value;
-  length = length == null ? MAX_SAFE_INTEGER : length;
-
-  return !!length &&
-    (type == 'number' ||
-      (type != 'symbol' && reIsUint.test(value))) &&
-        (value > -1 && value % 1 == 0 && value < length);
-}
-
-module.exports = isIndex;
-
-
-/***/ }),
-
 /***/ 1174:
 /***/ (function(module, exports) {
 
 module.exports = "<!-- 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:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:cc=\"http://creativecommons.org/ns#\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" xmlns:svg=\"http://www.w3.org/2000/svg\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 400 400\" xml:space=\"preserve\" id=\"svg2\" version=\"1.1\"><metadata id=\"metadata8\"><rdf:RDF><cc:Work rdf:about><dc:format>image/svg+xml</dc:format><dc:type rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\"></dc></cc:Work></rdf:RDF></metadata><defs id=\"defs6\"></defs><g transform=\"matrix(1.3333333,0,0,-1.3333333,0,400)\" id=\"g10\"><g transform=\"translate(178.0626,235.0086)\" id=\"g12\"><path id=\"path14\" style=\"fill:#41b883;fill-opacity:1;fill-rule:nonzero;stroke:none\" d=\"M 0,0 -22.669,-39.264 -45.338,0 h -75.491 L -22.669,-170.017 75.491,0 Z\"></path></g><g transform=\"translate(178.0626,235.0086)\" id=\"g16\"><path id=\"path18\" style=\"fill:#34495e;fill-opacity:1;fill-rule:nonzero;stroke:none\" d=\"M 0,0 -22.669,-39.264 -45.338,0 H -81.565 L -22.669,-102.01 36.227,0 Z\"></path></g></g></svg>"
 
 /***/ }),
 
-/***/ 118:
-/***/ (function(module, exports) {
-
-
-
-/***/ }),
-
-/***/ 119:
-/***/ (function(module, exports, __webpack_require__) {
-
-/* WEBPACK VAR INJECTION */(function(process) {// Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-// resolves . and .. elements in a path array with directory names there
-// must be no slashes, empty elements, or device names (c:\) in the array
-// (so also no leading and trailing slashes - it does not distinguish
-// relative and absolute paths)
-function normalizeArray(parts, allowAboveRoot) {
-  // if the path tries to go above the root, `up` ends up > 0
-  var up = 0;
-  for (var i = parts.length - 1; i >= 0; i--) {
-    var last = parts[i];
-    if (last === '.') {
-      parts.splice(i, 1);
-    } else if (last === '..') {
-      parts.splice(i, 1);
-      up++;
-    } else if (up) {
-      parts.splice(i, 1);
-      up--;
-    }
-  }
-
-  // if the path is allowed to go above the root, restore leading ..s
-  if (allowAboveRoot) {
-    for (; up--; up) {
-      parts.unshift('..');
-    }
-  }
-
-  return parts;
-}
-
-// Split a filename into [root, dir, basename, ext], unix version
-// 'root' is just a slash, or nothing.
-var splitPathRe =
-    /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
-var splitPath = function(filename) {
-  return splitPathRe.exec(filename).slice(1);
-};
-
-// path.resolve([from ...], to)
-// posix version
-exports.resolve = function() {
-  var resolvedPath = '',
-      resolvedAbsolute = false;
-
-  for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
-    var path = (i >= 0) ? arguments[i] : process.cwd();
-
-    // Skip empty and invalid entries
-    if (typeof path !== 'string') {
-      throw new TypeError('Arguments to path.resolve must be strings');
-    } else if (!path) {
-      continue;
-    }
-
-    resolvedPath = path + '/' + resolvedPath;
-    resolvedAbsolute = path.charAt(0) === '/';
-  }
-
-  // At this point the path should be resolved to a full absolute path, but
-  // handle relative paths to be safe (might happen when process.cwd() fails)
-
-  // Normalize the path
-  resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {
-    return !!p;
-  }), !resolvedAbsolute).join('/');
-
-  return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';
-};
-
-// path.normalize(path)
-// posix version
-exports.normalize = function(path) {
-  var isAbsolute = exports.isAbsolute(path),
-      trailingSlash = substr(path, -1) === '/';
-
-  // Normalize the path
-  path = normalizeArray(filter(path.split('/'), function(p) {
-    return !!p;
-  }), !isAbsolute).join('/');
-
-  if (!path && !isAbsolute) {
-    path = '.';
-  }
-  if (path && trailingSlash) {
-    path += '/';
-  }
-
-  return (isAbsolute ? '/' : '') + path;
-};
-
-// posix version
-exports.isAbsolute = function(path) {
-  return path.charAt(0) === '/';
-};
-
-// posix version
-exports.join = function() {
-  var paths = Array.prototype.slice.call(arguments, 0);
-  return exports.normalize(filter(paths, function(p, index) {
-    if (typeof p !== 'string') {
-      throw new TypeError('Arguments to path.join must be strings');
-    }
-    return p;
-  }).join('/'));
-};
-
-
-// path.relative(from, to)
-// posix version
-exports.relative = function(from, to) {
-  from = exports.resolve(from).substr(1);
-  to = exports.resolve(to).substr(1);
-
-  function trim(arr) {
-    var start = 0;
-    for (; start < arr.length; start++) {
-      if (arr[start] !== '') break;
-    }
-
-    var end = arr.length - 1;
-    for (; end >= 0; end--) {
-      if (arr[end] !== '') break;
-    }
-
-    if (start > end) return [];
-    return arr.slice(start, end - start + 1);
-  }
-
-  var fromParts = trim(from.split('/'));
-  var toParts = trim(to.split('/'));
-
-  var length = Math.min(fromParts.length, toParts.length);
-  var samePartsLength = length;
-  for (var i = 0; i < length; i++) {
-    if (fromParts[i] !== toParts[i]) {
-      samePartsLength = i;
-      break;
-    }
-  }
-
-  var outputParts = [];
-  for (var i = samePartsLength; i < fromParts.length; i++) {
-    outputParts.push('..');
-  }
-
-  outputParts = outputParts.concat(toParts.slice(samePartsLength));
-
-  return outputParts.join('/');
-};
-
-exports.sep = '/';
-exports.delimiter = ':';
-
-exports.dirname = function(path) {
-  var result = splitPath(path),
-      root = result[0],
-      dir = result[1];
-
-  if (!root && !dir) {
-    // No dirname whatsoever
-    return '.';
-  }
-
-  if (dir) {
-    // It has a dirname, strip trailing slash
-    dir = dir.substr(0, dir.length - 1);
-  }
-
-  return root + dir;
-};
-
-
-exports.basename = function(path, ext) {
-  var f = splitPath(path)[2];
-  // TODO: make this comparison case-insensitive on windows?
-  if (ext && f.substr(-1 * ext.length) === ext) {
-    f = f.substr(0, f.length - ext.length);
-  }
-  return f;
-};
-
-
-exports.extname = function(path) {
-  return splitPath(path)[3];
-};
-
-function filter (xs, f) {
-    if (xs.filter) return xs.filter(f);
-    var res = [];
-    for (var i = 0; i < xs.length; i++) {
-        if (f(xs[i], i, xs)) res.push(xs[i]);
-    }
-    return res;
-}
-
-// String.prototype.substr - negative index don't work in IE8
-var substr = 'ab'.substr(-1) === 'b'
-    ? function (str, start, len) { return str.substr(start, len) }
-    : function (str, start, len) {
-        if (start < 0) start = str.length + start;
-        return str.substr(start, len);
-    }
-;
-
-/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(120)))
-
-/***/ }),
-
 /***/ 120:
 /***/ (function(module, exports) {
 
 // shim for using process in browser
 var process = module.exports = {};
 
 // cached from whatever global is present so that test runners that stub it
 // don't break things.  But we need to wrap it in a try catch in case it is
@@ -1803,28 +1129,16 @@ var _preview = __webpack_require__(1786)
 var preview = _interopRequireWildcard(_preview);
 
 function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
 
 exports.default = _extends({}, navigation, breakpoints, expressions, eventListeners, sources, pause, ui, fileSearch, ast, coverage, projectTextSearch, replay, quickOpen, sourceTree, debuggee, toolbox, preview);
 
 /***/ }),
 
-/***/ 1355:
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-const feature = __webpack_require__(1461);
-
-module.exports = feature;
-
-/***/ }),
-
 /***/ 1356:
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
@@ -4207,23 +3521,23 @@ function initialASTState() {
     sourceMetaData: I.Map()
   })();
 }
 
 function update(state = initialASTState(), action) {
   switch (action.type) {
     case "SET_SYMBOLS":
       {
-        const { source } = action;
+        const { sourceId } = action;
         if (action.status === "start") {
-          return state.setIn(["symbols", source.id], { loading: true });
+          return state.setIn(["symbols", sourceId], { loading: true });
         }
 
         const value = action.value;
-        return state.setIn(["symbols", source.id], value);
+        return state.setIn(["symbols", sourceId], value);
       }
 
     case "SET_PAUSE_POINTS":
       {
         const { source, pausePoints } = action;
         const emptyLines = (0, _ast.findEmptyLines)(source, pausePoints);
 
         return state.setIn(["pausePoints", source.id], pausePoints).setIn(["emptyLines", source.id], emptyLines);
@@ -4383,20 +3697,20 @@ exports.default = update;
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.default = assert;
 
-var _devtoolsConfig = __webpack_require__(1355);
+var _devtoolsEnvironment = __webpack_require__(3721);
 
 function assert(condition, message) {
-  if ((0, _devtoolsConfig.isDevelopment)() && !condition) {
+  if ((0, _devtoolsEnvironment.isDevelopment)() && !condition) {
     throw new Error(`Assertion failure: ${message}`);
   }
 } /* 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/>. */
 
 /***/ }),
 
@@ -5815,18 +5129,18 @@ function setSymbols(sourceId) {
   return async ({ dispatch, getState }) => {
     const source = (0, _selectors.getSource)(getState(), sourceId);
     if (!source || !source.text || source.isWasm || (0, _selectors.hasSymbols)(getState(), source)) {
       return;
     }
 
     await dispatch({
       type: "SET_SYMBOLS",
-      source: source.toJS(),
-      [_promise.PROMISE]: (0, _parser.getSymbols)(source.id)
+      sourceId,
+      [_promise.PROMISE]: (0, _parser.getSymbols)(sourceId)
     });
 
     if ((0, _selectors.isPaused)(getState())) {
       await dispatch((0, _pause.fetchExtra)());
       await dispatch((0, _pause.mapFrames)());
     }
 
     await dispatch(setPausePoints(sourceId));
@@ -6511,33 +5825,33 @@ function getURL(sourceUrl, debuggeeUrl =
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.scrollList = undefined;
 
-var _devtoolsConfig = __webpack_require__(1355);
+var _devtoolsEnvironment = __webpack_require__(3721);
 
 var _Modal = __webpack_require__(1403);
 
 /* 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/>. */
 
 function scrollList(resultList, index, delayed = false) {
   if (!resultList.hasOwnProperty(index)) {
     return;
   }
 
   const resultEl = resultList[index];
 
   const scroll = () => {
-    if ((0, _devtoolsConfig.isFirefox)()) {
+    if ((0, _devtoolsEnvironment.isFirefox)()) {
       resultEl.scrollIntoView({ block: "center", behavior: "smooth" });
     } else {
       chromeScrollList(resultEl, index);
     }
   };
 
   if (delayed) {
     // Wait for Modal Transition timeout before scrolling to resultEl.
@@ -7947,17 +7261,17 @@ var _react = __webpack_require__(0);
 var _react2 = _interopRequireDefault(_react);
 
 var _redux = __webpack_require__(3593);
 
 var _reactDom = __webpack_require__(4);
 
 var _reactDom2 = _interopRequireDefault(_reactDom);
 
-var _devtoolsConfig = __webpack_require__(1355);
+var _devtoolsEnvironment = __webpack_require__(3721);
 
 var _devtoolsSourceMap = __webpack_require__(3646);
 
 var _search = __webpack_require__(1395);
 
 var search = _interopRequireWildcard(_search);
 
 var _prettyPrint = __webpack_require__(1431);
@@ -8002,54 +7316,57 @@ function renderPanel(component, store) {
   }
   mount.appendChild(root);
 
   _reactDom2.default.render(_react2.default.createElement(Provider, { store }, _react2.default.createElement(component)), root);
 }
 
 function bootstrapStore(client, { services, toolboxActions }) {
   const createStore = (0, _createStore2.default)({
-    log: (0, _devtoolsConfig.isTesting)() || (0, _devtoolsConfig.getValue)("logging.actions"),
-    timing: (0, _devtoolsConfig.isDevelopment)(),
+    log: (0, _devtoolsEnvironment.isTesting)(),
+    timing: (0, _devtoolsEnvironment.isDevelopment)(),
     makeThunkArgs: (args, state) => {
       return _extends({}, args, { client }, services, toolboxActions);
     }
   });
 
   const store = createStore((0, _redux.combineReducers)(_reducers2.default));
   store.subscribe(() => updatePrefs(store.getState()));
 
   const actions = (0, _redux.bindActionCreators)(__webpack_require__(1354).default, store.dispatch);
 
   return { store, actions, selectors };
 }
 
 function bootstrapWorkers() {
-  if (!(0, _devtoolsConfig.isFirefoxPanel)()) {
+  const workerPath = (0, _devtoolsEnvironment.isDevelopment)() ? "assets/build" : "resource://devtools/client/debugger/new";
+
+  if ((0, _devtoolsEnvironment.isDevelopment)()) {
     // When used in Firefox, the toolbox manages the source map worker.
-    (0, _devtoolsSourceMap.startSourceMapWorker)((0, _devtoolsConfig.getValue)("workers.sourceMapURL"));
-  }
-  prettyPrint.start((0, _devtoolsConfig.getValue)("workers.prettyPrintURL"));
-  parser.start((0, _devtoolsConfig.getValue)("workers.parserURL"));
-  search.start((0, _devtoolsConfig.getValue)("workers.searchURL"));
+    (0, _devtoolsSourceMap.startSourceMapWorker)(`${workerPath}/source-map-worker.js`);
+  }
+
+  prettyPrint.start(`${workerPath}/pretty-print-worker.js`);
+  parser.start(`${workerPath}/parser-worker.js`);
+  search.start(`${workerPath}/search-worker.js`);
   return { prettyPrint, parser, search };
 }
 
 function teardownWorkers() {
-  if (!(0, _devtoolsConfig.isFirefoxPanel)()) {
+  if (!(0, _devtoolsEnvironment.isFirefoxPanel)()) {
     // When used in Firefox, the toolbox manages the source map worker.
     (0, _devtoolsSourceMap.stopSourceMapWorker)();
   }
   prettyPrint.stop();
   parser.stop();
   search.stop();
 }
 
 function bootstrapApp(store) {
-  if ((0, _devtoolsConfig.isFirefoxPanel)()) {
+  if ((0, _devtoolsEnvironment.isFirefoxPanel)()) {
     renderPanel(_App2.default, store);
   } else {
     const { renderRoot } = __webpack_require__(52);
     renderRoot(_react2.default, _reactDom2.default, _App2.default, store);
   }
 }
 
 function updatePrefs(state) {
@@ -9467,43 +8784,38 @@ function FrameMenu(frame, frameworkGroup
 var _react = __webpack_require__(0);
 
 var _react2 = _interopRequireDefault(_react);
 
 var _reactDom = __webpack_require__(4);
 
 var _reactDom2 = _interopRequireDefault(_reactDom);
 
-var _devtoolsConfig = __webpack_require__(1355);
+var _devtoolsEnvironment = __webpack_require__(3721);
 
 var _client = __webpack_require__(1499);
 
 var _bootstrap = __webpack_require__(1430);
 
 var _sourceQueue = __webpack_require__(1795);
 
 var _sourceQueue2 = _interopRequireDefault(_sourceQueue);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 /* 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/>. */
 
-/* global DebuggerConfig */
-
 function unmountRoot() {
   const mount = document.querySelector("#mount .launchpad-root");
   _reactDom2.default.unmountComponentAtNode(mount);
 }
 
-if ((0, _devtoolsConfig.isFirefoxPanel)()) {
-  // $FlowIgnore
-  (0, _devtoolsConfig.setConfig)({"environment":"firefox-panel","logging":false,"clientLogging":false,"firefox":{"mcPath":"./firefox"},"workers":{"parserURL":"resource://devtools/client/debugger/new/parser-worker.js","prettyPrintURL":"resource://devtools/client/debugger/new/pretty-print-worker.js","searchURL":"resource://devtools/client/debugger/new/search-worker.js"},"features":{}});
-
+if ((0, _devtoolsEnvironment.isFirefoxPanel)()) {
   module.exports = {
     bootstrap: ({
       threadClient,
       tabTarget,
       debuggerClient,
       sourceMaps,
       toolboxActions
     }) => {
@@ -9537,115 +8849,16 @@ if ((0, _devtoolsConfig.isFirefoxPanel)(
       services: { sourceMaps: __webpack_require__(3646) },
       toolboxActions: {}
     });
   });
 }
 
 /***/ }),
 
-/***/ 1461:
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-const pick = __webpack_require__(67);
-const put = __webpack_require__(112);
-const fs = __webpack_require__(118);
-const path = __webpack_require__(119);
-
-let config;
-
-const flag = __webpack_require__(52);
-
-function isBrowser() {
-  return typeof window == "object" && typeof module == "undefined";
-}
-
-/**
- * Gets a config value for a given key
- * e.g "chrome.webSocketPort"
- */
-function getValue(key) {
-  return pick(config, key);
-}
-
-function setValue(key, value) {
-  return put(config, key, value);
-}
-
-function isEnabled(key) {
-  return config.features && typeof config.features[key] == "object" ? config.features[key].enabled : config.features[key];
-}
-
-function isDevelopment() {
-  if (isBrowser()) {
-    if (true) {
-      return false;
-    }
-    const href = window.location ? window.location.href : "";
-    return href.match(/^file:/) || href.match(/localhost:/);
-  }
-
-  if (isFirefoxPanel()) {
-    // Default to production if compiling for the Firefox panel
-    return "production" === "development";
-  }
-  return "production" !== "production";
-}
-
-function isTesting() {
-  return flag.testing;
-}
-
-function isFirefoxPanel() {
-  return "firefox-panel" == "firefox-panel";
-}
-
-function isApplication() {
-  return "firefox-panel" == "application";
-}
-
-function isFirefox() {
-  return (/firefox/i.test(navigator.userAgent)
-  );
-}
-
-function setConfig(value) {
-  config = value;
-}
-
-function getConfig() {
-  return config;
-}
-
-function updateLocalConfig(relativePath) {
-  const localConfigPath = path.resolve(relativePath, "../configs/local.json");
-  const output = JSON.stringify(config, null, 2);
-  fs.writeFileSync(localConfigPath, output, { flag: "w" });
-  return output;
-}
-
-module.exports = {
-  isEnabled,
-  getValue,
-  setValue,
-  isDevelopment,
-  isTesting,
-  isFirefoxPanel,
-  isApplication,
-  isFirefox,
-  getConfig,
-  setConfig,
-  updateLocalConfig
-};
-
-/***/ }),
-
 /***/ 1464:
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 /* 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
@@ -12808,17 +12021,17 @@ Object.defineProperty(exports, "__esModu
 });
 exports.openLink = openLink;
 exports.openWorkerToolbox = openWorkerToolbox;
 exports.evaluateInConsole = evaluateInConsole;
 /* 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/>. */
 
-const { isDevelopment } = __webpack_require__(1355);
+const { isDevelopment } = __webpack_require__(3721);
 const { getSelectedFrameId } = __webpack_require__(3590);
 
 /**
  * @memberof actions/toolbox
  * @static
  */
 function openLink(url) {
   return async function ({ openLink: openLinkCommand }) {
@@ -13333,17 +12546,16 @@ var _svgInlineReact2 = _interopRequireDe
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
 /* 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/>. */
 
 const React = __webpack_require__(0);
 
-const { isDevelopment } = __webpack_require__(1355);
 
 const svg = {
   "angle-brackets": __webpack_require__(347),
   angular: __webpack_require__(247),
   arrow: __webpack_require__(348),
   babel: __webpack_require__(3595),
   backbone: __webpack_require__(997),
   blackBox: __webpack_require__(349),
@@ -13406,20 +12618,16 @@ const svg = {
   showOutline: __webpack_require__(1045),
   nuxtjs: __webpack_require__(1651),
   rxjs: __webpack_require__(1808)
 };
 
 function Svg({ name, className, onClick, "aria-label": ariaLabel }) {
   if (!svg[name]) {
     const error = `Unknown SVG: ${name}`;
-    if (isDevelopment()) {
-      throw new Error(error);
-    }
-
     console.warn(error);
     return null;
   }
 
   className = `${name} ${className || ""}`;
   if (name === "subSettings") {
     className = "";
   }
@@ -14598,17 +13806,17 @@ var _reactDom2 = _interopRequireDefault(
 var _reactRedux = __webpack_require__(3592);
 
 var _classnames = __webpack_require__(175);
 
 var _classnames2 = _interopRequireDefault(_classnames);
 
 var _source = __webpack_require__(1356);
 
-var _devtoolsConfig = __webpack_require__(1355);
+var _devtoolsEnvironment = __webpack_require__(3721);
 
 var _prefs = __webpack_require__(226);
 
 var _indentation = __webpack_require__(1438);
 
 var _selectors = __webpack_require__(3590);
 
 var _actions = __webpack_require__(1354);
@@ -14849,17 +14057,17 @@ class Editor extends _react.PureComponen
         });
       }
     };
 
     const codeMirrorGutter = codeMirror.getGutterElement();
     codeMirrorGutter.addEventListener("mouseleave", toggleFoldMarkerVisibility);
     codeMirrorGutter.addEventListener("mouseenter", toggleFoldMarkerVisibility);
 
-    if (!(0, _devtoolsConfig.isFirefox)()) {
+    if (!(0, _devtoolsEnvironment.isFirefox)()) {
       codeMirror.on("gutterContextMenu", (cm, line, eventName, event) => this.onGutterContextMenu(event));
       codeMirror.on("contextmenu", (cm, event) => this.openMenu(event));
     } else {
       codeMirrorWrapper.addEventListener("contextmenu", event => this.openMenu(event));
     }
 
     this.setState({ editor });
     (0, _editor.setEditor)(editor);
@@ -15647,20 +14855,17 @@ class SearchBar extends _react.Component
       (0, _resultList.scrollList)(this.refs.resultList.refs, this.state.selectedResultIndex);
     }
   }
 
   // Handlers
 
   // Renderers
   buildSummaryMsg() {
-    const {
-      searchResults: { matchIndex, count, index },
-      query
-    } = this.props;
+    const { searchResults: { matchIndex, count, index }, query } = this.props;
 
     if (query.trim() == "") {
       return "";
     }
 
     if (count == 0) {
       return L10N.getStr("editor.noResults");
     }
@@ -15668,28 +14873,22 @@ class SearchBar extends _react.Component
     if (index == -1) {
       return L10N.getFormatStr("sourceSearch.resultsSummary1", count);
     }
 
     return L10N.getFormatStr("editor.searchResults", matchIndex + 1, count);
   }
 
   shouldShowErrorEmoji() {
-    const {
-      query,
-      searchResults: { count }
-    } = this.props;
+    const { query, searchResults: { count } } = this.props;
     return !!query && !count;
   }
 
   render() {
-    const {
-      searchResults: { count },
-      searchOn
-    } = this.props;
+    const { searchResults: { count }, searchOn } = this.props;
 
     if (!searchOn) {
       return _react2.default.createElement("div", null);
     }
     return _react2.default.createElement(
       "div",
       { className: "search-bar" },
       _react2.default.createElement(_SearchInput2.default, {
@@ -16016,24 +15215,19 @@ var _Svg = __webpack_require__(1359);
 var _Svg2 = _interopRequireDefault(_Svg);
 
 var _firefox = __webpack_require__(1500);
 
 __webpack_require__(1328);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
-const {
-  REPS: { Rep },
-  MODE,
-  ObjectInspector,
-  ObjectInspectorUtils
-} = _devtoolsReps2.default; /* 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/>. */
+const { REPS: { Rep }, MODE, ObjectInspector, ObjectInspectorUtils } = _devtoolsReps2.default; /* 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/>. */
 
 const {
   createNode,
   getChildren,
   getValue,
   nodeIsPrimitive,
   NODE_TYPES
 } = ObjectInspectorUtils.node;
@@ -16336,121 +15530,192 @@ function _interopRequireDefault(obj) { r
 /* 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/>. */
 
 class Popover extends _react.Component {
   constructor(props) {
     super(props);
 
+    this.calculateTopForRightOrientation = (target, editor, popover) => {
+      if (popover.height < editor.height) {
+        const rightOrientationTop = target.top - popover.height / 2;
+        if (rightOrientationTop < editor.top) {
+          return editor.top;
+        }
+        const rightOrientationBottom = rightOrientationTop + popover.height;
+        if (rightOrientationBottom > editor.bottom) {
+          return editor.bottom - popover.height;
+        }
+        return rightOrientationTop;
+      }
+      return 0;
+    };
+
+    this.calculateTop = (target, editor, popover, orientation) => {
+      if (orientation === "down") {
+        return target.bottom;
+      }
+      if (orientation === "up") {
+        return target.top - popover.height;
+      }
+
+      return this.calculateTopForRightOrientation(target, editor, popover);
+    };
+
     this.onMouseLeave = e => {
       const { onMouseLeave } = this.props;
       if (/^(bracket-arrow|gap)$/.test(e.currentTarget.className)) {
         return;
       }
 
       onMouseLeave(e);
     };
 
     this.state = {
       left: 0,
       top: 0,
-      targetMid: 0,
+      targetMid: { x: 0, y: 0 },
       orientation: "up"
     };
   }
 
   componentDidMount() {
     const { type } = this.props;
     const { left, top, orientation, targetMid } = type == "popover" ? this.getPopoverCoords() : this.getTooltipCoords();
 
     // eslint-disable-next-line react/no-did-mount-set-state
-    this.setState({ left, top, orientation, targetMid });
-  }
-
-  calculateLeft(target, editor, popover) {
+    this.setState({
+      left,
+      top,
+      orientation,
+      targetMid
+    });
+  }
+
+  calculateLeft(target, editor, popover, orientation) {
     const estimatedLeft = target.left;
     const estimatedRight = estimatedLeft + popover.width;
     const isOverflowingRight = estimatedRight > editor.right;
+    if (orientation === "right") {
+      return target.left + target.width + 10;
+    }
     if (isOverflowingRight) {
       const adjustedLeft = editor.right - popover.width - 8;
       return adjustedLeft;
     }
     return estimatedLeft;
   }
 
-  calculateVerticalOrientation(target, editor, popover) {
+  calculateOrientation(target, editor, popover) {
     const estimatedBottom = target.bottom + popover.height;
-
-    return estimatedBottom > editor.bottom ? "up" : "down";
+    if (editor.bottom > estimatedBottom) {
+      return "down";
+    }
+    const upOrientationTop = target.top - popover.height;
+    if (upOrientationTop > editor.top) {
+      return "up";
+    }
+
+    return "right";
   }
 
   getPopoverCoords() {
     if (this.$popover && this.props.editorRef) {
       const popover = this.$popover;
       const editor = this.props.editorRef;
       const popoverRect = popover.getBoundingClientRect();
       const editorRect = editor.getBoundingClientRect();
       const targetRect = this.props.targetPosition;
-      const popoverLeft = this.calculateLeft(targetRect, editorRect, popoverRect);
-      const orientation = this.calculateVerticalOrientation(targetRect, editorRect, popoverRect);
-      const top = orientation == "down" ? targetRect.bottom : targetRect.top - popoverRect.height;
-
-      const targetMid = targetRect.left - popoverLeft + targetRect.width / 2 - 8;
-
-      return { left: popoverLeft, top, orientation, targetMid };
-    }
-    return { left: 0, top: 0, orientation: "down", targetMid: 0 };
+      const orientation = this.calculateOrientation(targetRect, editorRect, popoverRect);
+      const top = this.calculateTop(targetRect, editorRect, popoverRect, orientation);
+      const popoverLeft = this.calculateLeft(targetRect, editorRect, popoverRect, orientation);
+      let targetMid;
+      if (orientation === "right") {
+        targetMid = {
+          x: -14,
+          y: targetRect.top - top - 2
+        };
+      } else {
+        targetMid = {
+          x: targetRect.left - popoverLeft + targetRect.width / 2 - 8,
+          y: 0
+        };
+      }
+
+      return {
+        left: popoverLeft,
+        top,
+        orientation,
+        targetMid
+      };
+    }
+    return {
+      left: 0,
+      top: 0,
+      orientation: "down",
+      targetMid: { x: 0, y: 0 }
+    };
   }
 
   getTooltipCoords() {
     if (this.$tooltip && this.props.editorRef) {
       const tooltip = this.$tooltip;
       const editor = this.props.editorRef;
       const tooltipRect = tooltip.getBoundingClientRect();
       const editorRect = editor.getBoundingClientRect();
       const targetRect = this.props.targetPosition;
       const left = this.calculateLeft(targetRect, editorRect, tooltipRect);
       const top = targetRect.top - tooltipRect.height;
 
-      return { left, top, orientation: "up", targetMid: 0 };
-    }
-    return { left: 0, top: 0, orientation: "up", targetMid: 0 };
+      return {
+        left,
+        top,
+        orientation: "up",
+        targetMid: { x: 0, y: 0 }
+      };
+    }
+    return {
+      left: 0,
+      top: 0,
+      orientation: "up",
+      targetMid: { x: 0, y: 0 }
+    };
   }
 
   getChildren() {
     const { children } = this.props;
     const { orientation } = this.state;
     const gap = _react2.default.createElement("div", { className: "gap", key: "gap" });
     return orientation === "up" ? [children, gap] : [gap, children];
   }
 
-  getPopoverArrow(orientation, left) {
-    const arrowOrientation = orientation === "up" ? "down" : "up";
-
-    const arrowProp = arrowOrientation === "up" ? "top" : "bottom";
-    const arrowPropValue = arrowOrientation === "up" ? -7 : 5;
-
-    const arrowProps = {
-      orientation: arrowOrientation,
-      left,
-      [arrowProp]: arrowPropValue
-    };
+  getPopoverArrow(orientation, left, top) {
+    const arrowProps = {};
+    if (orientation === "up") {
+      Object.assign(arrowProps, { orientation: "down", bottom: 5, left });
+    } else if (orientation === "down") {
+      Object.assign(arrowProps, { orientation: "up", top: -7, left });
+    } else {
+      Object.assign(arrowProps, { orientation: "left", top, left: -14 });
+    }
 
     return _react2.default.createElement(_BracketArrow2.default, arrowProps);
   }
 
   renderPopover() {
     const { top, left, orientation, targetMid } = this.state;
-    const arrow = this.getPopoverArrow(orientation, targetMid);
-
-    return _react2.default.createElement(
-      "div",
-      {
-        className: (0, _classnames2.default)("popover", { up: orientation === "up" }),
+    const arrow = this.getPopoverArrow(orientation, targetMid.x, targetMid.y);
+
+    return _react2.default.createElement(
+      "div",
+      {
+        className: (0, _classnames2.default)("popover", `orientation-${orientation}`, {
+          up: orientation === "up"
+        }),
         onMouseLeave: this.onMouseLeave,
         style: { top, left },
         ref: c => this.$popover = c
       },
       arrow,
       this.getChildren()
     );
   }
@@ -16979,19 +16244,17 @@ function getCallSites(symbols, breakpoin
   // a breakpoint to be added at the beginning of a call expression.
   const bpLocationMap = (0, _lodash.keyBy)(breakpoints.valueSeq().toJS(), ({ location }) => locationKey(location));
 
   function locationKey({ line, column }) {
     return `${line}/${column}`;
   }
 
   function findBreakpoint(callSite) {
-    const {
-      location: { start, end }
-    } = callSite;
+    const { location: { start, end } } = callSite;
 
     const breakpointId = (0, _lodash.range)(start.column - 1, end.column).map(column => locationKey({ line: start.line, column })).find(key => bpLocationMap[key]);
 
     if (breakpointId) {
       return bpLocationMap[breakpointId];
     }
   }
 
@@ -17597,19 +16860,17 @@ function getMenuItems(event, {
 
   const functionText = getFunctionText(sourceLine);
   const copyFunctionItem = {
     id: "node-menu-copy-function",
     label: copyFunctionLabel,
     accesskey: copyFunctionKey,
     disabled: !functionText,
     click: () => {
-      const {
-        location: { start, end }
-      } = getFunctionLocation(sourceLine);
+      const { location: { start, end } } = getFunctionLocation(sourceLine);
       flashLineRange({
         start: start.line,
         end: end.line,
         sourceId: selectedLocation.sourceId
       });
       return (0, _clipboard.copyToTheClipboard)(functionText);
     }
   };
@@ -17757,19 +17018,17 @@ function findFunctionText(line, source, 
     line,
     column: Infinity
   });
 
   if (!func || !source.text) {
     return null;
   }
 
-  const {
-    location: { start, end }
-  } = func;
+  const { location: { start, end } } = func;
   const lines = source.text.split("\n");
   const firstLine = lines[start.line - 1].slice(start.column);
   const lastLine = lines[end.line - 1].slice(0, end.column);
   const middle = lines.slice(start.line, end.line - 1);
   const functionText = [firstLine, ...middle, lastLine].join("\n");
   const indentedFunctionText = (0, _indentation.correctIndentation)(functionText);
 
   return indentedFunctionText;
@@ -18176,19 +17435,17 @@ class SecondaryPanes extends _react.Comp
       opened: _prefs.prefs.componentStackVisible,
       onToggle: opened => {
         _prefs.prefs.componentStackVisible = opened;
       }
     };
   }
 
   getComponentItem() {
-    const {
-      extra: { react }
-    } = this.props;
+    const { extra: { react } } = this.props;
 
     return {
       header: react.displayName,
       className: "component-pane",
       component: _react2.default.createElement(_FrameworkComponent2.default, null),
       opened: _prefs.prefs.componentVisible,
       onToggle: opened => {
         _prefs.prefs.componentVisible = opened;
@@ -18553,17 +17810,17 @@ class Breakpoints extends _react.Compone
   }
 
   renderBreakpoints() {
     const { breakpoints } = this.props;
     if (breakpoints.size == 0) {
       return;
     }
 
-    const groupedBreakpoints = (0, _lodash.groupBy)((0, _lodash.sortBy)([...breakpoints.valueSeq()], bp => bp.location.line), bp => bp.source.url);
+    const groupedBreakpoints = (0, _lodash.groupBy)((0, _lodash.sortBy)([...breakpoints.valueSeq()], bp => bp.location.line), bp => (0, _source.getRawSourceURL)(bp.source.url));
 
     return [...Object.keys(groupedBreakpoints).sort(sortFilenames).map(url => {
       const file = (0, _source.getFilenameFromURL)(url);
       const groupBreakpoints = groupedBreakpoints[url].filter(bp => !bp.hidden && (bp.text || bp.originalText));
 
       if (!groupBreakpoints.length) {
         return null;
       }
@@ -18974,17 +18231,17 @@ class Frames extends _react.Component {
     };
 
     this.toggleFrameworkGrouping = () => {
       const { toggleFrameworkGrouping, frameworkGroupingOn } = this.props;
       toggleFrameworkGrouping(!frameworkGroupingOn);
     };
 
     this.state = {
-      showAllFrames: false
+      showAllFrames: !!props.disableFrameTruncate
     };
   }
 
   shouldComponentUpdate(nextProps, nextState) {
     const { frames, selectedFrame, frameworkGroupingOn } = this.props;
     const { showAllFrames } = this.state;
     return frames !== nextProps.frames || selectedFrame !== nextProps.selectedFrame || showAllFrames !== nextState.showAllFrames || frameworkGroupingOn !== nextProps.frameworkGroupingOn;
   }
@@ -19055,17 +18312,17 @@ class Frames extends _react.Component {
         "button",
         { className: "show-more", onClick: this.toggleFramesDisplay },
         buttonMessage
       )
     );
   }
 
   render() {
-    const { frames, why } = this.props;
+    const { frames, disableFrameTruncate, why } = this.props;
 
     if (!frames) {
       return _react2.default.createElement(
         "div",
         { className: "pane frames" },
         _react2.default.createElement(
           "div",
           { className: "pane-info empty" },
@@ -19074,17 +18331,17 @@ class Frames extends _react.Component {
       );
     }
 
     return _react2.default.createElement(
       "div",
       { className: "pane frames" },
       this.renderFrames(frames),
       (0, _WhyPaused2.default)(why),
-      this.renderToggleButton(frames)
+      disableFrameTruncate ? null : this.renderToggleButton(frames)
     );
   }
 }
 
 const mapStateToProps = state => ({
   frames: (0, _selectors.getCallStackFrames)(state),
   why: (0, _selectors.getPauseReason)(state),
   frameworkGroupingOn: (0, _selectors.getFrameworkGroupingState)(state),
@@ -21058,49 +20315,31 @@ exports.default = Dropdown;
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
-
-var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; /* 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/>. */
-
-// eslint-disable-next-line max-len
-
-
 exports.mapScopes = mapScopes;
 
-var _lodash = __webpack_require__(2);
-
 var _selectors = __webpack_require__(3590);
 
 var _loadSourceText = __webpack_require__(1435);
 
-var _parser = __webpack_require__(1365);
-
 var _promise = __webpack_require__(1653);
 
-var _locColumn = __webpack_require__(2349);
-
-var _findGeneratedBindingFromPosition = __webpack_require__(2358);
-
-var _firefox = __webpack_require__(1500);
-
 var _prefs = __webpack_require__(226);
 
 var _log = __webpack_require__(2359);
 
 var _devtoolsSourceMap = __webpack_require__(3646);
 
-function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
+var _mapScopes = __webpack_require__(3723);
 
 function mapScopes(scopes, frame) {
   return async function ({ dispatch, getState, client, sourceMaps }) {
     const generatedSourceRecord = (0, _selectors.getSource)(getState(), frame.generatedLocation.sourceId);
 
     const sourceRecord = (0, _selectors.getSource)(getState(), frame.location.sourceId);
 
     const shouldMapScopes = _prefs.features.mapScopes && !generatedSourceRecord.isWasm && !sourceRecord.isPrettyPrinted && !(0, _devtoolsSourceMap.isGeneratedId)(frame.location.sourceId);
@@ -21111,372 +20350,27 @@ function mapScopes(scopes, frame) {
       [_promise.PROMISE]: async function () {
         if (!shouldMapScopes) {
           return null;
         }
 
         await dispatch((0, _loadSourceText.loadSourceText)(sourceRecord));
 
         try {
-          return await buildMappedScopes(sourceRecord.toJS(), frame, (await scopes), sourceMaps, client);
+          return await (0, _mapScopes.buildMappedScopes)(sourceRecord.toJS(), frame, (await scopes), sourceMaps, client);
         } catch (e) {
           (0, _log.log)(e);
           return null;
         }
       }()
     });
   };
-}
-
-function batchScopeMappings(originalAstScopes, source, sourceMaps) {
-  const precalculatedRanges = new Map();
-  const precalculatedLocations = new Map();
-
-  // Explicitly dispatch all of the sourcemap requests synchronously up front so
-  // that they will be batched into a single request for the worker to process.
-  for (const item of originalAstScopes) {
-    for (const name of Object.keys(item.bindings)) {
-      for (const ref of item.bindings[name].refs) {
-        const locs = [ref];
-        if (ref.type === "decl") {
-          locs.push(ref.declaration);
-        }
-
-        for (const loc of locs) {
-          precalculatedRanges.set(buildLocationKey(loc.start), sourceMaps.getGeneratedRanges(loc.start, source));
-          precalculatedLocations.set(buildLocationKey(loc.start), sourceMaps.getGeneratedLocation(loc.start, source));
-          precalculatedLocations.set(buildLocationKey(loc.end), sourceMaps.getGeneratedLocation(loc.end, source));
-        }
-      }
-    }
-  }
-
-  return {
-    async getGeneratedRanges(pos, s) {
-      const key = buildLocationKey(pos);
-
-      if (s !== source || !precalculatedRanges.has(key)) {
-        (0, _log.log)("Bad precalculated mapping");
-        return sourceMaps.getGeneratedRanges(pos, s);
-      }
-      return precalculatedRanges.get(key);
-    },
-    async getGeneratedLocation(pos, s) {
-      const key = buildLocationKey(pos);
-
-      if (s !== source || !precalculatedLocations.has(key)) {
-        (0, _log.log)("Bad precalculated mapping");
-        return sourceMaps.getGeneratedLocation(pos, s);
-      }
-      return precalculatedLocations.get(key);
-    }
-  };
-}
-function buildLocationKey(loc) {
-  return `${loc.line}:${(0, _locColumn.locColumn)(loc)}`;
-}
-
-async function buildMappedScopes(source, frame, scopes, sourceMaps, client) {
-  const originalAstScopes = await (0, _parser.getScopes)(frame.location);
-  const generatedAstScopes = await (0, _parser.getScopes)(frame.generatedLocation);
-
-  if (!originalAstScopes || !generatedAstScopes) {
-    return null;
-  }
-
-  const generatedAstBindings = buildGeneratedBindingList(scopes, generatedAstScopes, frame.this);
-
-  const expressionLookup = {};
-  const mappedOriginalScopes = [];
-
-  const cachedSourceMaps = batchScopeMappings(originalAstScopes, source, sourceMaps);
-
-  for (const item of originalAstScopes) {
-    const generatedBindings = {};
-
-    for (const name of Object.keys(item.bindings)) {
-      const binding = item.bindings[name];
-
-      const result = await findGeneratedBinding(cachedSourceMaps, client, source, name, binding, generatedAstBindings);
-
-      if (result) {
-        generatedBindings[name] = result.grip;
-
-        if (binding.refs.length !== 0 &&
-        // These are assigned depth-first, so we don't want shadowed
-        // bindings in parent scopes overwriting the expression.
-        !Object.prototype.hasOwnProperty.call(expressionLookup, name)) {
-          expressionLookup[name] = result.expression;
-        }
-      }
-    }
-
-    mappedOriginalScopes.push(_extends({}, item, {
-      generatedBindings
-    }));
-  }
-
-  const mappedGeneratedScopes = generateClientScope(scopes, mappedOriginalScopes);
-
-  return isReliableScope(mappedGeneratedScopes) ? { mappings: expressionLookup, scope: mappedGeneratedScopes } : null;
-}
-
-/**
- * Consider a scope and its parents reliable if the vast majority of its
- * bindings were successfully mapped to generated scope bindings.
- */
-function isReliableScope(scope) {
-  let totalBindings = 0;
-  let unknownBindings = 0;
-
-  for (let s = scope; s; s = s.parent) {
-    const vars = s.bindings && s.bindings.variables || {};
-    for (const key of Object.keys(vars)) {
-      const binding = vars[key];
-
-      totalBindings += 1;
-      if (binding.value && typeof binding.value === "object" && (binding.value.type === "unscoped" || binding.value.type === "unmapped")) {
-        unknownBindings += 1;
-      }
-    }
-  }
-
-  // As determined by fair dice roll.
-  return totalBindings === 0 || unknownBindings / totalBindings < 0.1;
-}
-
-function generateClientScope(scopes, originalScopes) {
-  // Pull the root object scope and root lexical scope to reuse them in
-  // our mapped scopes. This assumes that file file being processed is
-  // a CommonJS or ES6 module, which might not be ideal. Potentially
-  let globalLexicalScope = null;
-  for (let s = scopes; s.parent; s = s.parent) {
-    // $FlowIgnore - Flow doesn't like casting 'parent'.
-    globalLexicalScope = s;
-  }
-  if (!globalLexicalScope) {
-    throw new Error("Assertion failure - there should always be a scope");
-  }
-
-  // Build a structure similar to the client's linked scope object using
-  // the original AST scopes, but pulling in the generated bindings
-  // linked to each scope.
-  const result = originalScopes.slice(0, -2).reverse().reduce((acc, orig, i) => {
-    const _orig$generatedBindin = orig.generatedBindings,
-          {
-      // The 'this' binding data we have is handled independently, so
-      // the binding data is not included here.
-      // eslint-disable-next-line no-unused-vars
-      this: _this
-    } = _orig$generatedBindin,
-          variables = _objectWithoutProperties(_orig$generatedBindin, ["this"]);
-
-    return _extends({
-      // Flow doesn't like casting 'parent'.
-      parent: acc,
-      actor: `originalActor${i}`,
-      type: orig.type,
-      bindings: {
-        arguments: [],
-        variables
-      }
-    }, orig.type === "function" ? {
-      function: {
-        displayName: orig.displayName
-      }
-    } : null, orig.type === "block" ? {
-      block: {
-        displayName: orig.displayName
-      }
-    } : null);
-  }, globalLexicalScope);
-
-  // The rendering logic in getScope 'this' bindings only runs on the current
-  // selected frame scope, so we pluck out the 'this' binding that was mapped,
-  // and put it in a special location
-  const thisScope = originalScopes.find(scope => scope.bindings.this);
-  if (thisScope) {
-    result.bindings.this = thisScope.generatedBindings.this || null;
-  }
-
-  return result;
-}
-
-async function findGeneratedBinding(sourceMaps, client, source, name, originalBinding, generatedAstBindings) {
-  // If there are no references to the implicits, then we have no way to
-  // even attempt to map it back to the original since there is no location
-  // data to use. Bail out instead of just showing it as unmapped.
-  if (originalBinding.type === "implicit" && !originalBinding.refs.some(item => item.type === "ref")) {
-    return null;
-  }
-
-  const { refs } = originalBinding;
-
-  const genContent = await refs.reduce(async (acc, pos) => {
-    const result = await acc;
-    if (result) {
-      return result;
-    }
-
-    return await (0, _findGeneratedBindingFromPosition.findGeneratedBindingFromPosition)(sourceMaps, client, source, pos, name, originalBinding.type, generatedAstBindings);
-  }, null);
-
-  if (genContent && genContent.desc) {
-    return {
-      grip: genContent.desc,
-      expression: genContent.expression
-    };
-  } else if (genContent) {
-    // If there is no descriptor for 'this', then this is not the top-level
-    // 'this' that the server gave us a binding for, and we can just ignore it.
-    if (name === "this") {
-      return null;
-    }
-
-    // If the location is found but the descriptor is not, then it
-    // means that the server scope information didn't match the scope
-    // information from the DevTools parsed scopes.
-    return {
-      grip: {
-        configurable: false,
-        enumerable: true,
-        writable: false,
-        value: {
-          type: "unscoped",
-          unscoped: true,
-
-          // HACK: Until support for "unscoped" lands in devtools-reps,
-          // this will make these show as (unavailable).
-          missingArguments: true
-        }
-      },
-      expression: null
-    };
-  }
-
-  // If no location mapping is found, then the map is bad, or
-  // the map is okay but it original location is inside
-  // of some scope, but the generated location is outside, leading
-  // us to search for bindings that don't technically exist.
-  return {
-    grip: {
-      configurable: false,
-      enumerable: true,
-      writable: false,
-      value: {
-        type: "unmapped",
-        unmapped: true,
-
-        // HACK: Until support for "unmapped" lands in devtools-reps,
-        // this will make these show as (unavailable).
-        missingArguments: true
-      }
-    },
-    expression: null
-  };
-}
-
-function buildGeneratedBindingList(scopes, generatedAstScopes, thisBinding) {
-  // The server's binding data doesn't include general 'this' binding
-  // information, so we manually inject the one 'this' binding we have into
-  // the normal binding data we are working with.
-  const frameThisOwner = generatedAstScopes.find(generated => "this" in generated.bindings);
-
-  let globalScope = null;
-  const clientScopes = [];
-  for (let s = scopes; s; s = s.parent) {
-    const bindings = s.bindings ? Object.assign({}, ...s.bindings.arguments, s.bindings.variables) : {};
-
-    clientScopes.push(bindings);
-    globalScope = s;
-  }
-
-  const generatedMainScopes = generatedAstScopes.slice(0, -2);
-  const generatedGlobalScopes = generatedAstScopes.slice(-2);
-
-  const clientMainScopes = clientScopes.slice(0, generatedMainScopes.length);
-  const clientGlobalScopes = clientScopes.slice(generatedMainScopes.length);
-
-  // Map the main parsed script body using the nesting hierarchy of the
-  // generated and client scopes.
-  const generatedBindings = generatedMainScopes.reduce((acc, generated, i) => {
-    const bindings = clientMainScopes[i];
-
-    if (generated === frameThisOwner && thisBinding) {
-      bindings.this = {
-        value: thisBinding
-      };
-    }
-
-    for (const name of Object.keys(generated.bindings)) {
-      // If there is no 'this' value, we exclude the binding entirely.
-      // Otherwise it would pass through as found, but "(unscoped)", causing
-      // the search logic to stop with a match.
-      if (name === "this" && !bindings[name]) {
-        continue;
-      }
-
-      const { refs } = generated.bindings[name];
-      for (const loc of refs) {
-        acc.push({
-          name,
-          loc,
-          desc: () => Promise.resolve(bindings[name] || null)
-        });
-      }
-    }
-    return acc;
-  }, []);
-
-  // Bindings in the global/lexical global of the generated code may or
-  // may not be the real global if the generated code is running inside
-  // of an evaled context. To handle this, we just look up the client scope
-  // hierarchy to find the closest binding with that name.
-  for (const generated of generatedGlobalScopes) {
-    for (const name of Object.keys(generated.bindings)) {
-      const { refs } = generated.bindings[name];
-      const bindings = clientGlobalScopes.find(b => (0, _lodash.has)(b, name));
-
-      for (const loc of refs) {
-        if (bindings) {
-          generatedBindings.push({
-            name,
-            loc,
-            desc: () => Promise.resolve(bindings[name])
-          });
-        } else {
-          const globalGrip = globalScope && globalScope.object;
-          if (globalGrip) {
-            // Should always exist, just checking to keep Flow happy.
-
-            generatedBindings.push({
-              name,
-              loc,
-              desc: async () => {
-                const objectClient = (0, _firefox.createObjectClient)(globalGrip);
-                return (await objectClient.getProperty(name)).descriptor;
-              }
-            });
-          }
-        }
-      }
-    }
-  }
-
-  // Sort so we can binary-search.
-  return generatedBindings.sort((a, b) => {
-    const aStart = a.loc.start;
-    const bStart = b.loc.start;
-
-    if (aStart.line === bStart.line) {
-      return (0, _locColumn.locColumn)(aStart) - (0, _locColumn.locColumn)(bStart);
-    }
-    return aStart.line - bStart.line;
-  });
-}
+} /* 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/>. */
 
 /***/ }),
 
 /***/ 1635:
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
@@ -22793,19 +21687,17 @@ class QuickOpenModal extends _react.Comp
 
     this.searchSources = query => {
       const { sources } = this.props;
       const results = query == "" ? sources : filter(sources, this.dropGoto(query));
       return this.setState({ results });
     };
 
     this.searchSymbols = query => {
-      const {
-        symbols: { functions, variables }
-      } = this.props;
+      const { symbols: { functions, variables } } = this.props;
 
       let results = functions;
       if (this.isVariableQuery()) {
         results = variables;
       } else {
         results = results.filter(result => result.title !== "anonymous");
       }
 
@@ -23701,17 +22593,17 @@ Object.defineProperty(exports, "__esModu
 
 var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; /* 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/>. */
 /* global window */
 
 exports.log = log;
 
-var _devtoolsConfig = __webpack_require__(1355);
+var _devtoolsEnvironment = __webpack_require__(3721);
 
 const blacklist = ["SET_POPUP_OBJECT_PROPERTIES", "SET_PAUSE_POINTS", "SET_SYMBOLS", "OUT_OF_SCOPE_LOCATIONS", "MAP_SCOPES", "MAP_FRAMES", "ADD_SCOPES", "IN_SCOPE_LINES", "REMOVE_BREAKPOINT", "ADD_BREAKPOINT"];
 
 function cloneAction(action) {
   action = action || {};
   action = _extends({}, action);
 
   // ADD_TAB, ...
@@ -23776,17 +22668,17 @@ function serializeAction(action) {
 /**
  * A middleware that logs all actions coming through the system
  * to the console.
  */
 function log({ dispatch, getState }) {
   return next => action => {
     const asyncMsg = !action.status ? "" : `[${action.status}]`;
 
-    if ((0, _devtoolsConfig.isTesting)()) {
+    if ((0, _devtoolsEnvironment.isTesting)()) {
       dump(`[ACTION] ${action.type} ${asyncMsg} - ${serializeAction(action)}\n`);
     } else {
       console.log(action, asyncMsg);
     }
 
     next(action);
   };
 }
@@ -23799,29 +22691,29 @@ function log({ dispatch, getState }) {
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.history = undefined;
 
-var _devtoolsConfig = __webpack_require__(1355);
+var _devtoolsEnvironment = __webpack_require__(3721);
 
 /**
  * A middleware that stores every action coming through the store in the passed
  * in logging object. Should only be used for tests, as it collects all
  * action information, which will cause memory bloat.
  */
 const history = exports.history = (log = []) => ({
   dispatch,
   getState
 }) => {
   return next => action => {
-    if ((0, _devtoolsConfig.isDevelopment)()) {
+    if ((0, _devtoolsEnvironment.isDevelopment)()) {
       log.push(action);
     }
 
     return next(action);
   };
 }; /* 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/>. */
@@ -25667,22 +24559,17 @@ var _selectors = __webpack_require__(359
  * @static
  */
 function selectSourceURL(url, options = {}) {
   return async ({ dispatch, getState }) => {
     const source = (0, _selectors.getSourceByURL)(getState(), url);
     if (source) {
       const sourceId = source.id;
       const location = (0, _location.createLocation)(_extends({}, options.location, { sourceId }));
-      // flow is unable to comprehend that if an options.location object
-      // exists, that we have a valid Location object, and if it doesnt,
-      // we have a valid { sourceId: string } object. So we are overriding
-      // the error
-      // $FlowIgnore
-      await dispatch(selectLocation(location, options.tabIndex));
+      await dispatch(selectLocation(location));
     } else {
       dispatch({
         type: "SELECT_SOURCE_URL",
         url: url,
         line: options.location ? options.location.line : null
       });
     }
   };
@@ -27069,17 +25956,17 @@ var _extends = Object.assign || function
 exports.setupHelper = setupHelper;
 
 var _timings = __webpack_require__(1657);
 
 var timings = _interopRequireWildcard(_timings);
 
 var _prefs = __webpack_require__(226);
 
-var _devtoolsConfig = __webpack_require__(1355);
+var _devtoolsEnvironment = __webpack_require__(3721);
 
 var _pausePoints = __webpack_require__(3622);
 
 function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
 
 function findSource(dbg, url) {
   const sources = dbg.selectors.getSources();
   const source = sources.find(s => (s.get("url") || "").includes(url));
@@ -27137,17 +26024,17 @@ function setupHelper(obj) {
     },
     formatters: {
       pausePoints: url => _formatPausePoints(dbg, url)
     }
   });
 
   window.dbg = dbg;
 
-  if ((0, _devtoolsConfig.isDevelopment)()) {
+  if ((0, _devtoolsEnvironment.isDevelopment)()) {
     console.group("Development Notes");
     const baseUrl = "https://devtools-html.github.io/debugger.html";
     const localDevelopmentUrl = `${baseUrl}/docs/dbg.html`;
     console.log("Debugging Tips", localDevelopmentUrl);
     console.log("dbg", window.dbg);
     console.groupEnd();
   }
 }
@@ -27188,17 +26075,17 @@ module.exports = "<!-- This Source Code 
 "use strict";
 Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
 /* 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/>. */
 
 // @flow
 
-const { isDevelopment } = __webpack_require__(1355);
+const { isDevelopment } = __webpack_require__(3721);
 const { Services, PrefsHelper } = __webpack_require__(1376);
 
 const prefsSchemaVersion = "1.0.3";
 
 const pref = Services.pref;
 
 if (isDevelopment()) {
   pref("devtools.debugger.alphabetize-outline", false);
@@ -27574,127 +26461,85 @@ function locColumn(loc) {
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
-exports.findGeneratedBindingFromPosition = findGeneratedBindingFromPosition;
+exports.findGeneratedBindingForStandardBinding = findGeneratedBindingForStandardBinding;
+exports.findGeneratedBindingForImportBinding = findGeneratedBindingForImportBinding;
+exports.findGeneratedBindingForNormalDeclaration = findGeneratedBindingForNormalDeclaration;
+exports.findGeneratedBindingForImportDeclaration = findGeneratedBindingForImportDeclaration;
 
 var _locColumn = __webpack_require__(2349);
 
-var _filtering = __webpack_require__(3635);
+var _mappingContains = __webpack_require__(3722);
+
+var _getGeneratedLocationRanges = __webpack_require__(3724);
 
 var _firefox = __webpack_require__(1500);
 
-/* 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/>. */
-
-async function findGeneratedBindingFromPosition(sourceMaps, client, source, pos, name, bindingType, generatedAstBindings) {
-  const locationType = pos.type;
-
-  const generatedRanges = await getGeneratedLocationRanges(source, pos, bindingType, locationType, sourceMaps);
-  let applicableBindings = filterApplicableBindings(generatedAstBindings, generatedRanges);
-
+/**
+ * Find a simple 1-1 match of a binding in the original code to a binding
+ * in the generated code.
+ */
+async function findGeneratedBindingForStandardBinding(sourceMaps, client, source, pos, name, bindingType, generatedAstBindings) {
+  return await findGeneratedReference((await (0, _getGeneratedLocationRanges.getGeneratedLocationRanges)(generatedAstBindings, source, pos, bindingType, pos.type, sourceMaps)));
+}
+
+/**
+ * Find a simple 1-1 match of a binding in the original code to an
+ * expression in the generated code.
+ */
+/* 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/>. */
+
+async function findGeneratedBindingForImportBinding(sourceMaps, client, source, pos, name, bindingType, generatedAstBindings) {
+  return await findGeneratedImportReference((await (0, _getGeneratedLocationRanges.getGeneratedLocationRanges)(generatedAstBindings, source, pos, bindingType, pos.type, sourceMaps)));
+}
+
+/**
+ * Find a simple 1-1 match of a binding's declaration in the original code to a
+ * binding in the generated code.
+ */
+async function findGeneratedBindingForNormalDeclaration(sourceMaps, client, source, pos, name, bindingType, generatedAstBindings) {
+  return await findGeneratedReference((await (0, _getGeneratedLocationRanges.getGeneratedLocationRanges)(generatedAstBindings, source, pos.declaration, bindingType, pos.type, sourceMaps)));
+}
+
+/**
+ * Find a simple 1-1 match of an import binding's declaration in the original
+ * code to an expression in the generated code.
+ */
+async function findGeneratedBindingForImportDeclaration(sourceMaps, client, source, pos, name, bindingType, generatedAstBindings) {
+  const importName = pos.importName;
+  if (typeof importName !== "string") {
+    // Should never happen, just keeping Flow happy.
+    return null;
+  }
+
+  return await findGeneratedImportDeclaration((await (0, _getGeneratedLocationRanges.getGeneratedLocationRanges)(generatedAstBindings, source, pos.declaration, bindingType, pos.type, sourceMaps)), importName);
+}
+
+/**
+ * Given a mapped range over the generated source, attempt to resolve a real
+ * binding descriptor that can be used to access the value.
+ */
+async function findGeneratedReference(applicableBindings) {
   // We can adjust this number as we go, but these are a decent start as a
   // general heuristic to assume the bindings were bad or just map a chunk of
   // whole line or something.
   if (applicableBindings.length > 4) {
     // Babel's for..of generates at least 3 bindings inside one range for
     // block-scoped loop variables, so we shouldn't go below that.
     applicableBindings = [];
   }
 
-  let result;
-  if (bindingType === "import") {
-    result = await findGeneratedImportReference(applicableBindings);
-
-    if (!result && pos.type === "decl") {
-      const importName = pos.importName;
-      if (typeof importName !== "string") {
-        // Should never happen, just keeping Flow happy.
-        return null;
-      }
-
-      let applicableImportBindings = applicableBindings;
-      if (generatedRanges.length === 0) {
-        // If the imported name itself does not map to a useful range, fall back
-        // to resolving the bindinding using the location of the overall
-        // import declaration.
-        const declarationRanges = await getGeneratedLocationRanges(source, pos.declaration, bindingType, locationType, sourceMaps);
-        applicableImportBindings = filterApplicableBindings(generatedAstBindings, declarationRanges);
-
-        if (applicableImportBindings.length > 10) {
-          // Import declarations tend to have a large number of bindings for
-          // for things like 'require' and 'interop', so this number is larger
-          // than other binding count checks.
-          applicableImportBindings = [];
-        }
-      }
-
-      result = await findGeneratedImportDeclaration(applicableImportBindings, importName);
-    }
-  } else {
-    result = await findGeneratedReference(applicableBindings);
-  }
-
-  return result;
-}
-// eslint-disable-next-line max-len
-
-
-function filterApplicableBindings(bindings, ranges) {
-  const result = [];
-  for (const range of ranges) {
-    // Any binding overlapping a part of the mapping range.
-    const filteredBindings = (0, _filtering.filterSortedArray)(bindings, binding => {
-      if (positionCmp(binding.loc.end, range.start) <= 0) {
-        return -1;
-      }
-      if (positionCmp(binding.loc.start, range.end) >= 0) {
-        return 1;
-      }
-
-      return 0;
-    });
-
-    let firstInRange = true;
-    let firstOnLine = true;
-    let line = -1;
-
-    for (const binding of filteredBindings) {
-      if (binding.loc.start.line === line) {
-        firstOnLine = false;
-      } else {
-        line = binding.loc.start.line;
-        firstOnLine = true;
-      }
-
-      result.push({
-        binding,
-        range,
-        firstOnLine,
-        firstInRange
-      });
-
-      firstInRange = false;
-    }
-  }
-
-  return result;
-}
-
-/**
- * Given a mapped range over the generated source, attempt to resolve a real
- * binding descriptor that can be used to access the value.
- */
-async function findGeneratedReference(applicableBindings) {
   for (const applicable of applicableBindings) {
     const result = await mapBindingReferenceToDescriptor(applicable);
     if (result) {
       return result;
     }
   }
   return null;
 }
@@ -27708,38 +26553,57 @@ async function findGeneratedImportRefere
       return true;
     }
 
     const next = i + 1 < applicableBindings.length ? applicableBindings[i + 1] : null;
 
     return !next || next.binding.loc.type !== "ref" || !next.binding.loc.meta;
   });
 
+  // We can adjust this number as we go, but these are a decent start as a
+  // general heuristic to assume the bindings were bad or just map a chunk of
+  // whole line or something.
+  if (applicableBindings.length > 2) {
+    // Babel's for..of generates at least 3 bindings inside one range for
+    // block-scoped loop variables, so we shouldn't go below that.
+    applicableBindings = [];
+  }
+
   for (const applicable of applicableBindings) {
     const result = await mapImportReferenceToDescriptor(applicable);
     if (result) {
       return result;
     }
   }
 
   return null;
 }
 
 /**
  * Given a mapped range over the generated source and the name of the imported
  * value that is referenced, attempt to resolve a binding descriptor for
  * the import's value.
  */
 async function findGeneratedImportDeclaration(applicableBindings, importName) {
+  // We can adjust this number as we go, but these are a decent start as a
+  // general heuristic to assume the bindings were bad or just map a chunk of
+  // whole line or something.
+  if (applicableBindings.length > 10) {
+    // Import declarations tend to have a large number of bindings for
+    // for things like 'require' and 'interop', so this number is larger
+    // than other binding count checks.
+    applicableBindings = [];
+  }
+
   let result = null;
 
   for (const _ref of applicableBindings) {
     const { binding } = _ref;
 
-    if (binding.loc.type !== "decl") {
+    if (binding.loc.type === "ref") {
       continue;
     }
 
     const namespaceDesc = await binding.desc();
     if (isPrimitiveValue(namespaceDesc)) {
       continue;
     }
     if (!isObjectValue(namespaceDesc)) {
@@ -27840,31 +26704,31 @@ async function mapImportReferenceToDescr
   // Unfortunately, Webpack also has a tendancy to over-map past the call
   // expression to the start of the next line, at least when there isn't
   // anything else on that line that is mapped, e.g.
   //
   //   Object(foo.bar)()
   //   ^^^^^^^^^^^^^^^^^
   //   ^                 // wrapped to column 0 of next line
 
-  if (!mappingContains(range, binding.loc)) {
+  if (!(0, _mappingContains.mappingContains)(range, binding.loc)) {
     return null;
   }
 
   let expression = binding.name;
   let desc = await binding.desc();
 
   if (binding.loc.type === "ref") {
     const { meta } = binding.loc;
 
     // Limit to 2 simple property or inherits operartions, since it would
     // just be more work to search more and it is very unlikely that
     // bindings would be mapped to more than a single member + inherits
     // wrapper.
-    for (let op = meta, index = 0; op && mappingContains(range, op) && desc && index < 2; index++, op = op && op.parent) {
+    for (let op = meta, index = 0; op && (0, _mappingContains.mappingContains)(range, op) && desc && index < 2; index++, op = op && op.parent) {
       // Calling could potentially trigger side-effects, which would not
       // be ideal for this case.
       if (op.type === "call") {
         return null;
       }
 
       if (op.type === "inherit") {
         continue;
@@ -27912,136 +26776,42 @@ async function readDescriptorProperty(de
     // it's definitely not the namespace and it is probably an error.
     return desc;
   }
 
   const objectClient = (0, _firefox.createObjectClient)(desc.value);
   return (await objectClient.getProperty(property)).descriptor;
 }
 
-function mappingContains(mapped, item) {
-  return positionCmp(item.start, mapped.start) >= 0 && positionCmp(item.end, mapped.end) <= 0;
-}
-
-/**
- * * === 0 - Positions are equal.
- * * < 0 - first position before second position
- * * > 0 - first position after second position
- */
-function positionCmp(p1, p2) {
-  if (p1.line === p2.line) {
-    const l1 = (0, _locColumn.locColumn)(p1);
-    const l2 = (0, _locColumn.locColumn)(p2);
-
-    if (l1 === l2) {
-      return 0;
-    }
-    return l1 < l2 ? -1 : 1;
-  }
-
-  return p1.line < p2.line ? -1 : 1;
-}
-
-async function getGeneratedLocationRanges(source, {
-  start,
-  end
-}, bindingType, locationType, sourceMaps) {
-  const endPosition = await sourceMaps.getGeneratedLocation(end, source);
-  const startPosition = await sourceMaps.getGeneratedLocation(start, source);
-
-  // If the start and end positions collapse into eachother, it means that
-  // the range in the original content didn't _start_ at the start position.
-  // Since this likely means that the range doesn't logically apply to this
-  // binding location, we skip it.
-  if (positionCmp(startPosition, endPosition) === 0) {
-    return [];
-  }
-
-  const ranges = await sourceMaps.getGeneratedRanges(start, source);
-
-  const resultRanges = ranges.reduce((acc, mapRange) => {
-    // Some tooling creates ranges that map a line as a whole, which is useful
-    // for step-debugging, but can easily lead to finding the wrong binding.
-    // To avoid these false-positives, we entirely ignore ranges that cover
-    // full lines.
-    if (locationType === "ref" && mapRange.columnStart === 0 && mapRange.columnEnd === Infinity) {
-      return acc;
-    }
-
-    const range = {
-      start: {
-        line: mapRange.line,
-        column: mapRange.columnStart
-      },
-      end: {
-        line: mapRange.line,
-        // SourceMapConsumer's 'lastColumn' is inclusive, so we add 1 to make
-        // it exclusive like all other locations.
-        column: mapRange.columnEnd + 1
-      }
-    };
-
-    const previous = acc[acc.length - 1];
-
-    if (previous && (previous.end.line === range.start.line && previous.end.column === range.start.column || previous.end.line + 1 === range.start.line && previous.end.column === Infinity && range.start.column === 0)) {
-      previous.end.line = range.end.line;
-      previous.end.column = range.end.column;
-    } else {
-      acc.push(range);
-    }
-
-    return acc;
-  }, []);
-
-  // When searching for imports, we expand the range to up to the next available
-  // mapping to allow for import declarations that are composed of multiple
-  // variable statements, where the later ones are entirely unmapped.
-  // Babel 6 produces imports in this style, e.g.
-  //
-  // var _mod = require("mod"); // mapped from import statement
-  // var _mod2 = interop(_mod); // entirely unmapped
-  if (bindingType === "import" && locationType === "decl") {
-    for (const range of resultRanges) {
-      if (mappingContains(range, { start: startPosition, end: startPosition }) && positionCmp(range.end, endPosition) < 0) {
-        range.end.line = endPosition.line;
-        range.end.column = endPosition.column;
-        break;
-      }
-    }
-  }
-
-  return resultRanges;
-}
-
 /***/ }),
 
 /***/ 2359:
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.log = log;
 
-var _devtoolsConfig = __webpack_require__(1355);
+var _devtoolsEnvironment = __webpack_require__(3721);
 
 /**
  * Produces a formatted console log line by imploding args, prefixed by [log]
  *
  * function input: log(["hello", "world"])
  * console output: [log] hello world
  *
  * @memberof utils/log
  * @static
  */
 function log(...args) {
-  if (!(0, _devtoolsConfig.isDevelopment)()) {
+  if (!(0, _devtoolsEnvironment.isDevelopment)()) {
     return;
   }
 
   console.log.apply(console, ["[log]", ...args]);
 } /* 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/>. */
 
@@ -31434,17 +30204,17 @@ function findInsertionLocation(array, ca
     } else {
       left = mid + 1;
     }
   }
 
   // Ensure the value is the start of any set of matches.
   let i = left;
   if (i < array.length) {
-    while (i > 0 && callback(array[i]) >= 0) {
+    while (i >= 0 && callback(array[i]) >= 0) {
       i--;
     }
     return i + 1;
   }
 
   return i;
 }
 
@@ -33121,19 +31891,17 @@ module.exports = {
 
 const {
   originalToGeneratedId,
   generatedToOriginalId,
   isGeneratedId,
   isOriginalId
 } = __webpack_require__(3652);
 
-const {
-  workerUtils: { WorkerDispatcher }
-} = __webpack_require__(3651);
+const { workerUtils: { WorkerDispatcher } } = __webpack_require__(3651);
 
 const dispatcher = new WorkerDispatcher();
 
 const getOriginalURLs = dispatcher.task("getOriginalURLs");
 const getGeneratedRanges = dispatcher.task("getGeneratedRanges", {
   queue: true
 });
 const getGeneratedLocation = dispatcher.task("getGeneratedLocation", {
@@ -34464,19 +33232,17 @@ var _extends = Object.assign || function
 
 const client = __webpack_require__(3665);
 const loadProperties = __webpack_require__(3666);
 const node = __webpack_require__(3667);
 const { nodeIsError, nodeIsPrimitive } = node;
 const selection = __webpack_require__(3698);
 
 const { MODE } = __webpack_require__(3645);
-const {
-  REPS: { Rep, Grip }
-} = __webpack_require__(3647);
+const { REPS: { Rep, Grip } } = __webpack_require__(3647);
 
 
 function shouldRenderRootsInReps(roots) {
   if (roots.length > 1) {
     return false;
   }
 
   const root = roots[0];
@@ -35937,19 +34703,17 @@ function nodeHasAllEntriesInPreview(item
   return entries ? entries.length === size : items.length === length;
 }
 
 function nodeNeedsNumericalBuckets(item) {
   return nodeSupportsNumericalBucketing(item) && getNumericalPropertiesCount(item) > MAX_NUMERICAL_PROPERTIES;
 }
 
 function makeNodesForPromiseProperties(item) {
-  const {
-    promiseState: { reason, value, state }
-  } = getValue(item);
+  const { promiseState: { reason, value, state } } = getValue(item);
 
   const properties = [];
 
   if (state) {
     properties.push(createNode({
       parent: item,
       name: "<state>",
       contents: { value: state },
@@ -39793,16 +38557,698 @@ module.exports = "<!-- This Source Code 
 
 /***/ 372:
 /***/ (function(module, exports) {
 
 module.exports = "<!-- 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 viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\"><path fill-rule=\"evenodd\" d=\"M8.5 8.793L5.854 6.146l-.04-.035L7.5 4.426c.2-.2.3-.4.3-.6 0-.2-.1-.4-.2-.6l-1-1c-.4-.3-.9-.3-1.2 0l-4.1 4.1c-.2.2-.3.4-.3.6 0 .2.1.4.2.6l1 1c.3.3.9.3 1.2 0l1.71-1.71.036.04L7.793 9.5l-3.647 3.646c-.195.196-.195.512 0 .708.196.195.512.195.708 0L8.5 10.207l3.646 3.647c.196.195.512.195.708 0 .195-.196.195-.512 0-.708L9.207 9.5l2.565-2.565L13.3 8.5c.1.1 2.3 1.1 2.7.7.4-.4-.3-2.7-.5-2.9l-1.1-1.1c.1-.1.2-.4.2-.6 0-.2-.1-.4-.2-.6l-.4-.4c-.3-.3-.8-.3-1.1 0l-1.5-1.4c-.2-.2-.3-.2-.5-.2s-.3.1-.5.2L9.2 3.4c-.2.1-.2.2-.2.4s.1.4.2.5l1.874 1.92L8.5 8.792z\"></path></svg>"
 
 /***/ }),
 
+/***/ 3720:
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.positionCmp = positionCmp;
+
+var _locColumn = __webpack_require__(2349);
+
+/**
+ * * === 0 - Positions are equal.
+ * * < 0 - first position before second position
+ * * > 0 - first position after second position
+ */
+/* 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/>. */
+
+function positionCmp(p1, p2) {
+  if (p1.line === p2.line) {
+    const l1 = (0, _locColumn.locColumn)(p1);
+    const l2 = (0, _locColumn.locColumn)(p2);
+
+    if (l1 === l2) {
+      return 0;
+    }
+    return l1 < l2 ? -1 : 1;
+  }
+
+  return p1.line < p2.line ? -1 : 1;
+}
+
+/***/ }),
+
+/***/ 3721:
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+/* WEBPACK VAR INJECTION */(function(process) {
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.isDevelopment = isDevelopment;
+exports.isTesting = isTesting;
+exports.isFirefoxPanel = isFirefoxPanel;
+exports.isFirefox = isFirefox;
+/* 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/>. */
+
+const flag = __webpack_require__(52);
+
+function isBrowser() {
+  return typeof window == "object";
+}
+
+function isNode() {
+  return process && process.release && process.release.name == 'node';
+}
+
+function isDevelopment() {
+  if (!isNode && isBrowser()) {
+    const href = window.location ? window.location.href : "";
+    return href.match(/^file:/) || href.match(/localhost:/);
+  }
+
+  return "production" != "production";
+}
+
+function isTesting() {
+  return flag.testing;
+}
+
+function isFirefoxPanel() {
+  return !isDevelopment();
+}
+
+function isFirefox() {
+  return (/firefox/i.test(navigator.userAgent)
+  );
+}
+/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(120)))
+
+/***/ }),
+
+/***/ 3722:
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.mappingContains = mappingContains;
+
+var _positionCmp = __webpack_require__(3720);
+
+/* 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/>. */
+
+function mappingContains(mapped, item) {
+  return (0, _positionCmp.positionCmp)(item.start, mapped.start) >= 0 && (0, _positionCmp.positionCmp)(item.end, mapped.end) <= 0;
+}
+
+/***/ }),
+
+/***/ 3723:
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+
+var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; /* 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/>. */
+
+// eslint-disable-next-line max-len
+
+
+exports.buildMappedScopes = buildMappedScopes;
+
+var _parser = __webpack_require__(1365);
+
+var _locColumn = __webpack_require__(2349);
+
+var _findGeneratedBindingFromPosition = __webpack_require__(2358);
+
+var _buildGeneratedBindingList = __webpack_require__(3725);
+
+var _log = __webpack_require__(2359);
+
+function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
+
+async function buildMappedScopes(source, frame, scopes, sourceMaps, client) {
+  const originalAstScopes = await (0, _parser.getScopes)(frame.location);
+  const generatedAstScopes = await (0, _parser.getScopes)(frame.generatedLocation);
+
+  if (!originalAstScopes || !generatedAstScopes) {
+    return null;
+  }
+
+  const generatedAstBindings = (0, _buildGeneratedBindingList.buildGeneratedBindingList)(scopes, generatedAstScopes, frame.this);
+
+  const {
+    mappedOriginalScopes,
+    expressionLookup
+  } = await mapOriginalBindingsToGenerated(source, originalAstScopes, generatedAstBindings, client, sourceMaps);
+
+  const mappedGeneratedScopes = generateClientScope(scopes, mappedOriginalScopes);
+
+  return isReliableScope(mappedGeneratedScopes) ? { mappings: expressionLookup, scope: mappedGeneratedScopes } : null;
+}
+
+async function mapOriginalBindingsToGenerated(source, originalAstScopes, generatedAstBindings, client, sourceMaps) {
+  const expressionLookup = {};
+  const mappedOriginalScopes = [];
+
+  const cachedSourceMaps = batchScopeMappings(originalAstScopes, source, sourceMaps);
+
+  for (const item of originalAstScopes) {
+    const generatedBindings = {};
+
+    for (const name of Object.keys(item.bindings)) {
+      const binding = item.bindings[name];
+
+      const result = await findGeneratedBinding(cachedSourceMaps, client, source, name, binding, generatedAstBindings);
+
+      if (result) {
+        generatedBindings[name] = result.grip;
+
+        if (binding.refs.length !== 0 &&
+        // These are assigned depth-first, so we don't want shadowed
+        // bindings in parent scopes overwriting the expression.
+        !Object.prototype.hasOwnProperty.call(expressionLookup, name)) {
+          expressionLookup[name] = result.expression;
+        }
+      }
+    }
+
+    mappedOriginalScopes.push(_extends({}, item, {
+      generatedBindings
+    }));
+  }
+
+  return {
+    mappedOriginalScopes,
+    expressionLookup
+  };
+}
+
+/**
+ * Consider a scope and its parents reliable if the vast majority of its
+ * bindings were successfully mapped to generated scope bindings.
+ */
+function isReliableScope(scope) {
+  let totalBindings = 0;
+  let unknownBindings = 0;
+
+  for (let s = scope; s; s = s.parent) {
+    const vars = s.bindings && s.bindings.variables || {};
+    for (const key of Object.keys(vars)) {
+      const binding = vars[key];
+
+      totalBindings += 1;
+      if (binding.value && typeof binding.value === "object" && (binding.value.type === "unscoped" || binding.value.type === "unmapped")) {
+        unknownBindings += 1;
+      }
+    }
+  }
+
+  // As determined by fair dice roll.
+  return totalBindings === 0 || unknownBindings / totalBindings < 0.1;
+}
+
+function batchScopeMappings(originalAstScopes, source, sourceMaps) {
+  const precalculatedRanges = new Map();
+  const precalculatedLocations = new Map();
+
+  // Explicitly dispatch all of the sourcemap requests synchronously up front so
+  // that they will be batched into a single request for the worker to process.
+  for (const item of originalAstScopes) {
+    for (const name of Object.keys(item.bindings)) {
+      for (const ref of item.bindings[name].refs) {
+        const locs = [ref];
+        if (ref.type !== "ref") {
+          locs.push(ref.declaration);
+        }
+
+        for (const loc of locs) {
+          precalculatedRanges.set(buildLocationKey(loc.start), sourceMaps.getGeneratedRanges(loc.start, source));
+          precalculatedLocations.set(buildLocationKey(loc.start), sourceMaps.getGeneratedLocation(loc.start, source));
+          precalculatedLocations.set(buildLocationKey(loc.end), sourceMaps.getGeneratedLocation(loc.end, source));
+        }
+      }
+    }
+  }
+
+  return {
+    async getGeneratedRanges(pos, s) {
+      const key = buildLocationKey(pos);
+
+      if (s !== source || !precalculatedRanges.has(key)) {
+        (0, _log.log)("Bad precalculated mapping");
+        return sourceMaps.getGeneratedRanges(pos, s);
+      }
+      return precalculatedRanges.get(key);
+    },
+    async getGeneratedLocation(pos, s) {
+      const key = buildLocationKey(pos);
+
+      if (s !== source || !precalculatedLocations.has(key)) {
+        (0, _log.log)("Bad precalculated mapping");
+        return sourceMaps.getGeneratedLocation(pos, s);
+      }
+      return precalculatedLocations.get(key);
+    }
+  };
+}
+function buildLocationKey(loc) {
+  return `${loc.line}:${(0, _locColumn.locColumn)(loc)}`;
+}
+
+function generateClientScope(scopes, originalScopes) {
+  // Pull the root object scope and root lexical scope to reuse them in
+  // our mapped scopes. This assumes that file file being processed is
+  // a CommonJS or ES6 module, which might not be ideal. Potentially
+  let globalLexicalScope = null;
+  for (let s = scopes; s.parent; s = s.parent) {
+    // $FlowIgnore - Flow doesn't like casting 'parent'.
+    globalLexicalScope = s;
+  }
+  if (!globalLexicalScope) {
+    throw new Error("Assertion failure - there should always be a scope");
+  }
+
+  // Build a structure similar to the client's linked scope object using
+  // the original AST scopes, but pulling in the generated bindings
+  // linked to each scope.
+  const result = originalScopes.slice(0, -2).reverse().reduce((acc, orig, i) => {
+    const _orig$generatedBindin = orig.generatedBindings,
+          {
+      // The 'this' binding data we have is handled independently, so
+      // the binding data is not included here.
+      // eslint-disable-next-line no-unused-vars
+      this: _this
+    } = _orig$generatedBindin,
+          variables = _objectWithoutProperties(_orig$generatedBindin, ["this"]);
+
+    return _extends({
+      // Flow doesn't like casting 'parent'.
+      parent: acc,
+      actor: `originalActor${i}`,
+      type: orig.type,
+      bindings: {
+        arguments: [],
+        variables
+      }
+    }, orig.type === "function" ? {
+      function: {
+        displayName: orig.displayName
+      }
+    } : null, orig.type === "block" ? {
+      block: {
+        displayName: orig.displayName
+      }
+    } : null);
+  }, globalLexicalScope);
+
+  // The rendering logic in getScope 'this' bindings only runs on the current
+  // selected frame scope, so we pluck out the 'this' binding that was mapped,
+  // and put it in a special location
+  const thisScope = originalScopes.find(scope => scope.bindings.this);
+  if (thisScope) {
+    result.bindings.this = thisScope.generatedBindings.this || null;
+  }
+
+  return result;
+}
+
+async function findGeneratedBinding(sourceMaps, client, source, name, originalBinding, generatedAstBindings) {
+  // If there are no references to the implicits, then we have no way to
+  // even attempt to map it back to the original since there is no location
+  // data to use. Bail out instead of just showing it as unmapped.
+  if (originalBinding.type === "implicit" && !originalBinding.refs.some(item => item.type === "ref")) {
+    return null;
+  }
+
+  const { refs } = originalBinding;
+
+  let genContent = null;
+  for (const pos of refs) {
+    if (originalBinding.type === "import") {
+      genContent = await (0, _findGeneratedBindingFromPosition.findGeneratedBindingForImportBinding)(sourceMaps, client, source, pos, name, originalBinding.type, generatedAstBindings);
+    } else {
+      genContent = await (0, _findGeneratedBindingFromPosition.findGeneratedBindingForStandardBinding)(sourceMaps, client, source, pos, name, originalBinding.type, generatedAstBindings);
+    }
+
+    if ((pos.type === "class-decl" || pos.type === "class-inner") && source.contentType && source.contentType.match(/\/typescript/)) {
+      // Resolve to first binding in the range
+      const declContent = await (0, _findGeneratedBindingFromPosition.findGeneratedBindingForNormalDeclaration)(sourceMaps, client, source, pos, name, originalBinding.type, generatedAstBindings);
+
+      if (declContent) {
+        // Prefer the declaration mapping in this case because TS sometimes
+        // maps class declaration names to "export.Foo = Foo;" or to
+        // the decorator logic itself
+        genContent = declContent;
+      }
+    }
+
+    if (!genContent && (pos.type === "import-decl" || pos.type === "import-ns-decl")) {
+      // match the import declaration location
+      genContent = await (0, _findGeneratedBindingFromPosition.findGeneratedBindingForImportDeclaration)(sourceMaps, client, source, pos, name, originalBinding.type, generatedAstBindings);
+    }
+
+    if (genContent) {
+      break;
+    }
+  }
+
+  if (genContent && genContent.desc) {
+    return {
+      grip: genContent.desc,
+      expression: genContent.expression
+    };
+  } else if (genContent) {
+    // If there is no descriptor for 'this', then this is not the top-level
+    // 'this' that the server gave us a binding for, and we can just ignore it.
+    if (name === "this") {
+      return null;
+    }
+
+    // If the location is found but the descriptor is not, then it
+    // means that the server scope information didn't match the scope
+    // information from the DevTools parsed scopes.
+    return {
+      grip: {
+        configurable: false,
+        enumerable: true,
+        writable: false,
+        value: {
+          type: "unscoped",
+          unscoped: true,
+
+          // HACK: Until support for "unscoped" lands in devtools-reps,
+          // this will make these show as (unavailable).
+          missingArguments: true
+        }
+      },
+      expression: null
+    };
+  }
+
+  // If no location mapping is found, then the map is bad, or
+  // the map is okay but it original location is inside
+  // of some scope, but the generated location is outside, leading
+  // us to search for bindings that don't technically exist.
+  return {
+    grip: {
+      configurable: false,
+      enumerable: true,
+      writable: false,
+      value: {
+        type: "unmapped",
+        unmapped: true,
+
+        // HACK: Until support for "unmapped" lands in devtools-reps,
+        // this will make these show as (unavailable).
+        missingArguments: true
+      }
+    },
+    expression: null
+  };
+}
+
+/***/ }),
+
+/***/ 3724:
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.getGeneratedLocationRanges = getGeneratedLocationRanges;
+
+var _positionCmp = __webpack_require__(3720);
+
+var _filtering = __webpack_require__(3635);
+
+var _mappingContains = __webpack_require__(3722);
+
+/* 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/>. */
+
+async function getGeneratedLocationRanges(generatedAstBindings, source, {
+  start,
+  end
+}, bindingType, locationType, sourceMaps) {
+  const endPosition = await sourceMaps.getGeneratedLocation(end, source);
+  const startPosition = await sourceMaps.getGeneratedLocation(start, source);
+
+  // If the start and end positions collapse into eachother, it means that
+  // the range in the original content didn't _start_ at the start position.
+  // Since this likely means that the range doesn't logically apply to this
+  // binding location, we skip it.
+  if ((0, _positionCmp.positionCmp)(startPosition, endPosition) === 0) {
+    return [];
+  }
+
+  const ranges = await sourceMaps.getGeneratedRanges(start, source);
+
+  const resultRanges = ranges.reduce((acc, mapRange) => {
+    // Some tooling creates ranges that map a line as a whole, which is useful
+    // for step-debugging, but can easily lead to finding the wrong binding.
+    // To avoid these false-positives, we entirely ignore ranges that cover
+    // full lines.
+    if (locationType === "ref" && mapRange.columnStart === 0 && mapRange.columnEnd === Infinity) {
+      return acc;
+    }
+
+    const range = {
+      start: {
+        line: mapRange.line,
+        column: mapRange.columnStart
+      },
+      end: {
+        line: mapRange.line,
+        // SourceMapConsumer's 'lastColumn' is inclusive, so we add 1 to make
+        // it exclusive like all other locations.
+        column: mapRange.columnEnd + 1
+      }
+    };
+
+    const previous = acc[acc.length - 1];
+
+    if (previous && (previous.end.line === range.start.line && previous.end.column === range.start.column || previous.end.line + 1 === range.start.line && previous.end.column === Infinity && range.start.column === 0)) {
+      previous.end.line = range.end.line;
+      previous.end.column = range.end.column;
+    } else {
+      acc.push(range);
+    }
+
+    return acc;
+  }, []);
+
+  // When searching for imports, we expand the range to up to the next available
+  // mapping to allow for import declarations that are composed of multiple
+  // variable statements, where the later ones are entirely unmapped.
+  // Babel 6 produces imports in this style, e.g.
+  //
+  // var _mod = require("mod"); // mapped from import statement
+  // var _mod2 = interop(_mod); // entirely unmapped
+  if (bindingType === "import" && locationType !== "ref") {
+    for (const range of resultRanges) {
+      if ((0, _mappingContains.mappingContains)(range, { start: startPosition, end: startPosition }) && (0, _positionCmp.positionCmp)(range.end, endPosition) < 0) {
+        range.end.line = endPosition.line;
+        range.end.column = endPosition.column;
+        break;
+      }
+    }
+  }
+
+  return filterApplicableBindings(generatedAstBindings, resultRanges);
+}
+
+function filterApplicableBindings(bindings, ranges) {
+  const result = [];
+  for (const range of ranges) {
+    // Any binding overlapping a part of the mapping range.
+    const filteredBindings = (0, _filtering.filterSortedArray)(bindings, binding => {
+      if ((0, _positionCmp.positionCmp)(binding.loc.end, range.start) <= 0) {
+        return -1;
+      }
+      if ((0, _positionCmp.positionCmp)(binding.loc.start, range.end) >= 0) {
+        return 1;
+      }
+
+      return 0;
+    });
+
+    let firstInRange = true;
+    let firstOnLine = true;
+    let line = -1;
+
+    for (const binding of filteredBindings) {
+      if (binding.loc.start.line === line) {
+        firstOnLine = false;
+      } else {
+        line = binding.loc.start.line;
+        firstOnLine = true;
+      }
+
+      result.push({
+        binding,
+        range,
+        firstOnLine,
+        firstInRange
+      });
+
+      firstInRange = false;
+    }
+  }
+
+  return result;
+}
+
+/***/ }),
+
+/***/ 3725:
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.buildGeneratedBindingList = buildGeneratedBindingList;
+
+var _lodash = __webpack_require__(2);
+
+var _firefox = __webpack_require__(1500);
+
+var _locColumn = __webpack_require__(2349);
+
+function buildGeneratedBindingList(scopes, generatedAstScopes, thisBinding) {
+  // The server's binding data doesn't include general 'this' binding
+  // information, so we manually inject the one 'this' binding we have into
+  // the normal binding data we are working with.
+  const frameThisOwner = generatedAstScopes.find(generated => "this" in generated.bindings);
+
+  let globalScope = null;
+  const clientScopes = [];
+  for (let s = scopes; s; s = s.parent) {
+    const bindings = s.bindings ? Object.assign({}, ...s.bindings.arguments, s.bindings.variables) : {};
+
+    clientScopes.push(bindings);
+    globalScope = s;
+  }
+
+  const generatedMainScopes = generatedAstScopes.slice(0, -2);
+  const generatedGlobalScopes = generatedAstScopes.slice(-2);
+
+  const clientMainScopes = clientScopes.slice(0, generatedMainScopes.length);
+  const clientGlobalScopes = clientScopes.slice(generatedMainScopes.length);
+
+  // Map the main parsed script body using the nesting hierarchy of the
+  // generated and client scopes.
+  const generatedBindings = generatedMainScopes.reduce((acc, generated, i) => {
+    const bindings = clientMainScopes[i];
+
+    if (generated === frameThisOwner && thisBinding) {
+      bindings.this = {
+        value: thisBinding
+      };
+    }
+
+    for (const name of Object.keys(generated.bindings)) {
+      // If there is no 'this' value, we exclude the binding entirely.
+      // Otherwise it would pass through as found, but "(unscoped)", causing
+      // the search logic to stop with a match.
+      if (name === "this" && !bindings[name]) {
+        continue;
+      }
+
+      const { refs } = generated.bindings[name];
+      for (const loc of refs) {
+        acc.push({
+          name,
+          loc,
+          desc: () => Promise.resolve(bindings[name] || null)
+        });
+      }
+    }
+    return acc;
+  }, []);
+
+  // Bindings in the global/lexical global of the generated code may or
+  // may not be the real global if the generated code is running inside
+  // of an evaled context. To handle this, we just look up the client scope
+  // hierarchy to find the closest binding with that name.
+  for (const generated of generatedGlobalScopes) {
+    for (const name of Object.keys(generated.bindings)) {
+      const { refs } = generated.bindings[name];
+      const bindings = clientGlobalScopes.find(b => (0, _lodash.has)(b, name));
+
+      for (const loc of refs) {
+        if (bindings) {
+          generatedBindings.push({
+            name,
+            loc,
+            desc: () => Promise.resolve(bindings[name])
+          });
+        } else {
+          const globalGrip = globalScope && globalScope.object;
+          if (globalGrip) {
+            // Should always exist, just checking to keep Flow happy.
+
+            generatedBindings.push({
+              name,
+              loc,
+              desc: async () => {
+                const objectClient = (0, _firefox.createObjectClient)(globalGrip);
+                return (await objectClient.getProperty(name)).descriptor;
+              }
+            });
+          }
+        }
+      }
+    }
+  }
+
+  // Sort so we can binary-search.
+  return generatedBindings.sort((a, b) => {
+    const aStart = a.loc.start;
+    const bStart = b.loc.start;
+
+    if (aStart.line === bStart.line) {
+      return (0, _locColumn.locColumn)(aStart) - (0, _locColumn.locColumn)(bStart);
+    }
+    return aStart.line - bStart.line;
+  });
+} /* 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/>. */
+
+/***/ }),
+
 /***/ 4:
 /***/ (function(module, exports) {
 
 module.exports = __WEBPACK_EXTERNAL_MODULE_4__;
 
 /***/ }),
 
 /***/ 46:
@@ -39862,129 +39308,30 @@ module.exports = baseGetTag;
 
 
 exports.decode = exports.parse = __webpack_require__(121);
 exports.encode = exports.stringify = __webpack_require__(122);
 
 
 /***/ }),
 
-/***/ 67:
-/***/ (function(module, exports, __webpack_require__) {
-
-var baseGet = __webpack_require__(68);
-
-/**
- * Gets the value at `path` of `object`. If the resolved value is
- * `undefined`, the `defaultValue` is returned in its place.
- *
- * @static
- * @memberOf _
- * @since 3.7.0
- * @category Object
- * @param {Object} object The object to query.
- * @param {Array|string} path The path of the property to get.
- * @param {*} [defaultValue] The value returned for `undefined` resolved values.
- * @returns {*} Returns the resolved value.
- * @example
- *
- * var object = { 'a': [{ 'b': { 'c': 3 } }] };
- *
- * _.get(object, 'a[0].b.c');
- * // => 3
- *
- * _.get(object, ['a', '0', 'b', 'c']);
- * // => 3
- *
- * _.get(object, 'a.b.c', 'default');
- * // => 'default'
- */
-function get(object, path, defaultValue) {
-  var result = object == null ? undefined : baseGet(object, path);
-  return result === undefined ? defaultValue : result;
-}
-
-module.exports = get;
-
-
-/***/ }),
-
 /***/ 677:
 /***/ (function(module, exports) {
 
 module.exports = __WEBPACK_EXTERNAL_MODULE_677__;
 
 /***/ }),
 
 /***/ 678:
 /***/ (function(module, exports) {
 
 module.exports = __WEBPACK_EXTERNAL_MODULE_678__;
 
 /***/ }),
 
-/***/ 68:
-/***/ (function(module, exports, __webpack_require__) {
-
-var castPath = __webpack_require__(69),
-    toKey = __webpack_require__(111);
-
-/**
- * The base implementation of `_.get` without support for default values.
- *
- * @private
- * @param {Object} object The object to query.
- * @param {Array|string} path The path of the property to get.
- * @returns {*} Returns the resolved value.
- */
-function baseGet(object, path) {
-  path = castPath(path, object);
-
-  var index = 0,
-      length = path.length;
-
-  while (object != null && index < length) {
-    object = object[toKey(path[index++])];
-  }
-  return (index && index == length) ? object : undefined;
-}
-
-module.exports = baseGet;
-
-
-/***/ }),
-
-/***/ 69:
-/***/ (function(module, exports, __webpack_require__) {
-
-var isArray = __webpack_require__(70),
-    isKey = __webpack_require__(71),
-    stringToPath = __webpack_require__(73),
-    toString = __webpack_require__(108);
-
-/**
- * Casts `value` to a path array if it's not one.
- *
- * @private
- * @param {*} value The value to inspect.
- * @param {Object} [object] The object to query keys on.
- * @returns {Array} Returns the cast property path array.
- */
-function castPath(value, object) {
-  if (isArray(value)) {
-    return value;
-  }
-  return isKey(value, object) ? [value] : stringToPath(toString(value));
-}
-
-module.exports = castPath;
-
-
-/***/ }),
-
 /***/ 7:
 /***/ (function(module, exports, __webpack_require__) {
 
 var root = __webpack_require__(8);
 
 /** Built-in value references. */
 var Symbol = root.Symbol;
 
@@ -40021,52 +39368,16 @@ module.exports = Symbol;
  */
 var isArray = Array.isArray;
 
 module.exports = isArray;
 
 
 /***/ }),
 
-/***/ 71:
-/***/ (function(module, exports, __webpack_require__) {
-
-var isArray = __webpack_require__(70),
-    isSymbol = __webpack_require__(72);
-
-/** Used to match property names within property paths. */
-var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
-    reIsPlainProp = /^\w*$/;
-
-/**
- * Checks if `value` is a property name and not a property path.
- *
- * @private
- * @param {*} value The value to check.
- * @param {Object} [object] The object to query keys on.
- * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
- */
-function isKey(value, object) {
-  if (isArray(value)) {
-    return false;
-  }
-  var type = typeof value;
-  if (type == 'number' || type == 'symbol' || type == 'boolean' ||
-      value == null || isSymbol(value)) {
-    return true;
-  }
-  return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
-    (object != null && value in Object(object));
-}
-
-module.exports = isKey;
-
-
-/***/ }),
-
 /***/ 72:
 /***/ (function(module, exports, __webpack_require__) {
 
 var baseGetTag = __webpack_require__(6),
     isObjectLike = __webpack_require__(14);
 
 /** `Object#toString` result references. */
 var symbolTag = '[object Symbol]';
@@ -40093,291 +39404,16 @@ function isSymbol(value) {
     (isObjectLike(value) && baseGetTag(value) == symbolTag);
 }
 
 module.exports = isSymbol;
 
 
 /***/ }),
 
-/***/ 73:
-/***/ (function(module, exports, __webpack_require__) {
-
-var memoizeCapped = __webpack_require__(74);
-
-/** Used to match property names within property paths. */
-var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
-
-/** Used to match backslashes in property paths. */
-var reEscapeChar = /\\(\\)?/g;
-
-/**
- * Converts `string` to a property path array.
- *
- * @private
- * @param {string} string The string to convert.
- * @returns {Array} Returns the property path array.
- */
-var stringToPath = memoizeCapped(function(string) {
-  var result = [];
-  if (string.charCodeAt(0) === 46 /* . */) {
-    result.push('');
-  }
-  string.replace(rePropName, function(match, number, quote, subString) {
-    result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));
-  });
-  return result;
-});
-
-module.exports = stringToPath;
-
-
-/***/ }),
-
-/***/ 74:
-/***/ (function(module, exports, __webpack_require__) {
-
-var memoize = __webpack_require__(75);
-
-/** Used as the maximum memoize cache size. */
-var MAX_MEMOIZE_SIZE = 500;
-
-/**
- * A specialized version of `_.memoize` which clears the memoized function's
- * cache when it exceeds `MAX_MEMOIZE_SIZE`.
- *
- * @private
- * @param {Function} func The function to have its output memoized.
- * @returns {Function} Returns the new memoized function.
- */
-function memoizeCapped(func) {
-  var result = memoize(func, function(key) {
-    if (cache.size === MAX_MEMOIZE_SIZE) {
-      cache.clear();
-    }
-    return key;
-  });
-
-  var cache = result.cache;
-  return result;
-}
-
-module.exports = memoizeCapped;
-
-
-/***/ }),
-
-/***/ 75:
-/***/ (function(module, exports, __webpack_require__) {
-
-var MapCache = __webpack_require__(76);
-
-/** Error message constants. */
-var FUNC_ERROR_TEXT = 'Expected a function';
-
-/**
- * Creates a function that memoizes the result of `func`. If `resolver` is
- * provided, it determines the cache key for storing the result based on the
- * arguments provided to the memoized function. By default, the first argument
- * provided to the memoized function is used as the map cache key. The `func`
- * is invoked with the `this` binding of the memoized function.
- *
- * **Note:** The cache is exposed as the `cache` property on the memoized
- * function. Its creation may be customized by replacing the `_.memoize.Cache`
- * constructor with one whose instances implement the
- * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)
- * method interface of `clear`, `delete`, `get`, `has`, and `set`.
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Function
- * @param {Function} func The function to have its output memoized.
- * @param {Function} [resolver] The function to resolve the cache key.
- * @returns {Function} Returns the new memoized function.
- * @example
- *
- * var object = { 'a': 1, 'b': 2 };
- * var other = { 'c': 3, 'd': 4 };
- *
- * var values = _.memoize(_.values);
- * values(object);
- * // => [1, 2]
- *
- * values(other);
- * // => [3, 4]
- *
- * object.a = 2;
- * values(object);
- * // => [1, 2]
- *
- * // Modify the result cache.
- * values.cache.set(object, ['a', 'b']);
- * values(object);
- * // => ['a', 'b']
- *
- * // Replace `_.memoize.Cache`.
- * _.memoize.Cache = WeakMap;
- */
-function memoize(func, resolver) {
-  if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {
-    throw new TypeError(FUNC_ERROR_TEXT);
-  }
-  var memoized = function() {
-    var args = arguments,
-        key = resolver ? resolver.apply(this, args) : args[0],
-        cache = memoized.cache;
-
-    if (cache.has(key)) {
-      return cache.get(key);
-    }
-    var result = func.apply(this, args);
-    memoized.cache = cache.set(key, result) || cache;
-    return result;
-  };
-  memoized.cache = new (memoize.Cache || MapCache);
-  return memoized;
-}
-
-// Expose `MapCache`.
-memoize.Cache = MapCache;
-
-module.exports = memoize;
-
-
-/***/ }),
-
-/***/ 76:
-/***/ (function(module, exports, __webpack_require__) {
-
-var mapCacheClear = __webpack_require__(77),
-    mapCacheDelete = __webpack_require__(102),
-    mapCacheGet = __webpack_require__(105),
-    mapCacheHas = __webpack_require__(106),
-    mapCacheSet = __webpack_require__(107);
-
-/**
- * Creates a map cache object to store key-value pairs.
- *
- * @private
- * @constructor
- * @param {Array} [entries] The key-value pairs to cache.
- */
-function MapCache(entries) {
-  var index = -1,
-      length = entries == null ? 0 : entries.length;
-
-  this.clear();
-  while (++index < length) {
-    var entry = entries[index];
-    this.set(entry[0], entry[1]);
-  }
-}
-
-// Add methods to `MapCache`.
-MapCache.prototype.clear = mapCacheClear;
-MapCache.prototype['delete'] = mapCacheDelete;
-MapCache.prototype.get = mapCacheGet;
-MapCache.prototype.has = mapCacheHas;
-MapCache.prototype.set = mapCacheSet;
-
-module.exports = MapCache;
-
-
-/***/ }),
-
-/***/ 77:
-/***/ (function(module, exports, __webpack_require__) {
-
-var Hash = __webpack_require__(78),
-    ListCache = __webpack_require__(93),
-    Map = __webpack_require__(101);
-
-/**
- * Removes all key-value entries from the map.
- *
- * @private
- * @name clear
- * @memberOf MapCache
- */
-function mapCacheClear() {
-  this.size = 0;
-  this.__data__ = {
-    'hash': new Hash,
-    'map': new (Map || ListCache),
-    'string': new Hash
-  };
-}
-
-module.exports = mapCacheClear;
-
-
-/***/ }),
-
-/***/ 78:
-/***/ (function(module, exports, __webpack_require__) {
-
-var hashClear = __webpack_require__(79),
-    hashDelete = __webpack_require__(89),
-    hashGet = __webpack_require__(90),
-    hashHas = __webpack_require__(91),
-    hashSet = __webpack_require__(92);
-
-/**
- * Creates a hash object.
- *
- * @private
- * @constructor
- * @param {Array} [entries] The key-value pairs to cache.
- */
-function Hash(entries) {
-  var index = -1,
-      length = entries == null ? 0 : entries.length;
-
-  this.clear();
-  while (++index < length) {
-    var entry = entries[index];
-    this.set(entry[0], entry[1]);
-  }
-}
-
-// Add methods to `Hash`.
-Hash.prototype.clear = hashClear;
-Hash.prototype['delete'] = hashDelete;
-Hash.prototype.get = hashGet;
-Hash.prototype.has = hashHas;
-Hash.prototype.set = hashSet;
-
-module.exports = Hash;
-
-
-/***/ }),
-
-/***/ 79:
-/***/ (function(module, exports, __webpack_require__) {
-
-var nativeCreate = __webpack_require__(80);
-
-/**
- * Removes all key-value entries from the hash.
- *
- * @private
- * @name clear
- * @memberOf Hash
- */
-function hashClear() {
-  this.__data__ = nativeCreate ? nativeCreate(null) : {};
-  this.size = 0;
-}
-
-module.exports = hashClear;
-
-
-/***/ }),
-
 /***/ 792:
 /***/ (function(module, exports) {
 
 var g;
 
 // This works in non-strict mode
 g = (function() {
 	return this;
@@ -40441,658 +39477,49 @@ var freeSelf = typeof self == 'object' &
 /** Used as a reference to the global object. */
 var root = freeGlobal || freeSelf || Function('return this')();
 
 module.exports = root;
 
 
 /***/ }),
 
-/***/ 80:
-/***/ (function(module, exports, __webpack_require__) {
-
-var getNative = __webpack_require__(81);
-
-/* Built-in method references that are verified to be native. */
-var nativeCreate = getNative(Object, 'create');
-
-module.exports = nativeCreate;
-
-
-/***/ }),
-
 /***/ 806:
 /***/ (function(module, exports) {
 
 module.exports = "<!-- 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\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" viewBox=\"0 0 256 256\"><defs><style>.cls-1{isolation:isolate;}.cls-17,.cls-2,.cls-25{fill:none;}.cls-17,.cls-2{stroke-miterlimit:10;}.cls-2{stroke-width:0.75px;stroke:url(#linear-gradient);}.cls-3{fill:url(#linear-gradient-2);}.cls-4{fill:#f15a24;}.cls-5{fill:#ed1c24;}.cls-6{fill:#c1272d;}.cls-7{fill:url(#linear-gradient-3);}.cls-8{fill:url(#linear-gradient-4);}.cls-9{fill:url(#linear-gradient-5);}.cls-10{fill:url(#linear-gradient-6);}.cls-11{opacity:0.49;fill:url(#linear-gradient-7);}.cls-12{fill:url(#linear-gradient-8);}.cls-13{fill:#2db5f9;}.cls-13,.cls-14{mix-blend-mode:screen;}.cls-14{fill:#5fd2ff;}.cls-15{fill:#219058;}.cls-16{fill:url(#linear-gradient-9);}.cls-17{stroke:#fff;stroke-width:1.87px;}.cls-18{fill:#f7b852;}.cls-19{fill:#ff8431;}.cls-20{fill:#fffb69;}.cls-21{fill:#44c688;}.cls-22{fill:#29b36e;}.cls-23{fill:#6fd191;}.cls-24{fill:#c83ad7;}.cls-26{fill:#fba9ff;}.cls-27{fill:#ff737d;}.cls-28{fill:#fdc666;}</style><linearGradient id=\"linear-gradient\" x1=\"67.45\" y1=\"154.72\" x2=\"67.29\" y2=\"155.43\" gradientUnits=\"userSpaceOnUse\"><stop offset=\"0\" stop-color=\"#ff1d25\" stop-opacity=\"0.5\"></stop><stop offset=\"0.06\" stop-color=\"#ff1d25\" stop-opacity=\"0.54\"></stop><stop offset=\"0.37\" stop-color=\"#ff1d25\" stop-opacity=\"0.74\"></stop><stop offset=\"0.64\" stop-color=\"#ff1d25\" stop-opacity=\"0.88\"></stop><stop offset=\"0.86\" stop-color=\"#ff1d25\" stop-opacity=\"0.97\"></stop><stop offset=\"1\" stop-color=\"#ff1d25\"></stop></linearGradient><linearGradient id=\"linear-gradient-2\" x1=\"73.09\" y1=\"170.74\" x2=\"73.09\" y2=\"153.5\" gradientUnits=\"userSpaceOnUse\"><stop offset=\"0\" stop-color=\"#ffdd42\"></stop><stop offset=\"1\" stop-color=\"#fb784b\"></stop></linearGradient><linearGradient id=\"linear-gradient-3\" x1=\"201.52\" y1=\"95.13\" x2=\"207.88\" y2=\"89.89\" gradientUnits=\"userSpaceOnUse\"><stop offset=\"0\" stop-color=\"#5bcb99\"></stop><stop offset=\"1\" stop-color=\"#85a8e8\"></stop></linearGradient><linearGradient id=\"linear-gradient-4\" x1=\"81.17\" y1=\"158.3\" x2=\"279.32\" y2=\"55.49\" gradientUnits=\"userSpaceOnUse\"><stop offset=\"0\" stop-color=\"#34e28b\"></stop><stop offset=\"1\"></stop></linearGradient><linearGradient id=\"linear-gradient-5\" x1=\"117.57\" y1=\"178.22\" x2=\"133.15\" y2=\"178.22\" gradientUnits=\"userSpaceOnUse\"><stop offset=\"0\" stop-color=\"#c297ff\"></stop><stop offset=\"1\" stop-color=\"#ae31bb\"></stop></linearGradient><linearGradient id=\"linear-gradient-6\" x1=\"54.05\" y1=\"253.29\" x2=\"251.08\" y2=\"99.63\" gradientUnits=\"userSpaceOnUse\"><stop offset=\"0\"></stop><stop offset=\"1\" stop-color=\"#d23de2\"></stop></linearGradient><linearGradient id=\"linear-gradient-7\" x1=\"199.8\" y1=\"86.45\" x2=\"191.83\" y2=\"113.37\" gradientUnits=\"userSpaceOnUse\"><stop offset=\"0\"></stop><stop offset=\"1\" stop-opacity=\"0\"></stop></linearGradient><linearGradient id=\"linear-gradient-8\" x1=\"126.87\" y1=\"190.63\" x2=\"182.9\" y2=\"204.2\" gradientUnits=\"userSpaceOnUse\"><stop offset=\"0\" stop-color=\"#2db5f9\"></stop><stop offset=\"1\" stop-color=\"#092432\"></stop></linearGradient><linearGradient id=\"linear-gradient-9\" x1=\"83.08\" y1=\"49.55\" x2=\"46.06\" y2=\"151.24\" gradientUnits=\"userSpaceOnUse\"><stop offset=\"0\"></stop><stop offset=\"0.21\" stop-color=\"#48080a\"></stop><stop offset=\"0.42\" stop-color=\"#891014\"></stop><stop offset=\"0.61\" stop-color=\"#bc151b\"></stop><stop offset=\"0.78\" stop-color=\"#e01a21\"></stop><stop offset=\"0.91\" stop-color=\"#f71c24\"></stop><stop offset=\"1\" stop-color=\"#ff1d25\"></stop></linearGradient></defs><title>dojo_square</title><g class=\"cls-1\"><g id=\"Layer_1\" data-name=\"Layer 1\"><line class=\"cls-2\" x1=\"67.37\" y1=\"155.08\" x2=\"67.37\" y2=\"155.08\"></line><path class=\"cls-3\" d=\"M42.28,150.4l.52.82A58,58,0,0,0,52,161.49a45.23,45.23,0,0,0,28.74,10.25c.65,0,1.31,0,2,0a67.32,67.32,0,0,0,21.13-5.26,67.38,67.38,0,0,1-9.09.83,36.92,36.92,0,0,1-27.44-12.17A66.82,66.82,0,0,1,42.28,150.4Z\"></path><path class=\"cls-4\" d=\"M80.79,80.88a45.4,45.4,0,0,1,38.89,21.94A37,37,0,0,0,84.43,94.7c8.29,4,19.66,7.08,35.28,8.15,0,0-.77-14.87-19.8-22.64-26.57-10.84-30.33-8.69-37.06-19.9a30.09,30.09,0,0,0,6,22.15A45.45,45.45,0,0,1,80.79,80.88Z\"></path><path class=\"cls-5\" d=\"M99.92,80.21c-9.1-3.71-15.52-5.9-20.3-7.62A33.4,33.4,0,0,0,84.54,81a45.42,45.42,0,0,1,35.13,21.78,36.87,36.87,0,0,0-20.54-9.34,109,109,0,0,0,20,9.32l.59,0S118.94,88,99.92,80.21Z\"></path><path class=\"cls-6\" d=\"M119.69,102.85h.1c.29-1.62,2.07-14.46-12.4-25.7C85.78,60.37,81.56,58.82,80.53,49.94a27.8,27.8,0,0,0-.91,22.65c4.78,1.72,11.21,3.91,20.3,7.62,19,7.77,19.8,22.64,19.8,22.64Z\"></path><path class=\"cls-7\" d=\"M185.28,88.22a33.64,33.64,0,0,1,22.08,8.23,29.8,29.8,0,0,1,19,8S208.22,78,176.19,89a41.72,41.72,0,0,0-8.2,4A33.64,33.64,0,0,1,185.28,88.22Z\"></path><path class=\"cls-8\" d=\"M185.28,88.22A33.62,33.62,0,0,0,168,93l.93-.56c-25.88,15.24-57.6,62.06-101.56,62.65h0a36.92,36.92,0,0,0,27.44,12.17,67.38,67.38,0,0,0,9.09-.83c28.6-11.79,56.09-40,68.55-53.64,11.56-12.67,24.22-17,34.91-16.34A33.64,33.64,0,0,0,185.28,88.22Z\"></path><path class=\"cls-9\" d=\"M118.48,179a20.94,20.94,0,0,0-.92,5.86,22.25,22.25,0,0,0,1,6.74,16.56,16.56,0,0,1,5.5-14.74c0-.17.09-.34.14-.51a20.37,20.37,0,0,1,8.91-11.47l-.08,0a37.84,37.84,0,0,0-4,1.53A20.87,20.87,0,0,0,118.48,179Z\"></path><path class=\"cls-10\" d=\"M234.26,129.11a42.41,42.41,0,0,0-7.94-24.76,29.82,29.82,0,0,0-19-7.9A33.69,33.69,0,0,1,219.06,122c0,11.34-4.12,24.3-17.45,31.28-19.42,10.16-49.21,5.33-68.54,11.6l.08,0a20.37,20.37,0,0,0-8.91,11.47c-.05.17-.09.34-.14.51h0c5.67-5,16.84-8.54,38.63-5.73,15.56,2,27.93,2.55,38.54-.5a41.2,41.2,0,0,0,25.23-17h0A42.41,42.41,0,0,0,234.26,129.11Z\"></path><path class=\"cls-11\" d=\"M234.26,129.11a42.41,42.41,0,0,0-7.94-24.76,29.82,29.82,0,0,0-19-7.9A33.69,33.69,0,0,1,219.06,122c0,11.34-4.12,24.3-17.45,31.28-19.42,10.16-49.21,5.33-68.54,11.6l.08,0a20.37,20.37,0,0,0-8.91,11.47c-.05.17-.09.34-.14.51h0c5.67-5,16.84-8.54,38.63-5.73,15.56,2,27.93,2.55,38.54-.5a41.2,41.2,0,0,0,25.23-17h0A42.41,42.41,0,0,0,234.26,129.11Z\"></path><path class=\"cls-12\" d=\"M137.8,201.88a20.44,20.44,0,0,1-13.68-25.12h0l0,.08a16.56,16.56,0,0,0-5.5,14.73,20.94,20.94,0,0,0,33.63,9.38A20.37,20.37,0,0,1,137.8,201.88Z\"></path><path class=\"cls-13\" d=\"M144.91,200.4c2.12-6.17,9-15.7,16.33-11.34,0,0,6,3.36,7.23-6.11,0,0,4.49,22.28-17.1,21.53,0,0,4.86-3.55,4.81-7.2A24.73,24.73,0,0,1,144.91,200.4Z\"></path><path class=\"cls-14\" d=\"M153.52,186.75c2.14-1.09,4.16-2.18,8.08-.44,3,1.35,6.88-3.94,3.56-8.66,0,0,.21,4.88-3.72,4.84A8.81,8.81,0,0,0,153.52,186.75Z\"></path><path class=\"cls-15\" d=\"M175.21,115.88c-5.17,7-12.75,12.95-13.64,14.39s1.5,6.11,5,6.45.82-1.36.52-3,1.06,1,5.27.42-1.53-2.2-1.14-4.33,4.74-6.17,6.47-10.25,4.7,0,3.18,3.18c-.6,1.26,4.81-3.54,2.08-7.21S178.22,111.77,175.21,115.88Z\"></path><path class=\"cls-15\" d=\"M160.47,131.28c-.76.73-3,2.37-3,2.37s2.19,3.05,5,3c0,0,.61-.29-.27-1.18S160.27,131.82,160.47,131.28Z\"></path><path class=\"cls-16\" d=\"M84.43,94.7c-7.35-3.56-12.27-7.88-15.54-12.24A45.42,45.42,0,0,0,42.28,150.4a66.82,66.82,0,0,0,25.09,4.67h0A37,37,0,0,1,84.43,94.7Z\"></path><line class=\"cls-17\" x1=\"67.37\" y1=\"155.08\" x2=\"67.37\" y2=\"155.08\"></line><path class=\"cls-18\" d=\"M84.52,81c2,2.91,7.81,7.94,14.63,12.44a36.87,36.87,0,0,1,20.52,9.33A45.42,45.42,0,0,0,84.52,81Z\"></path><path class=\"cls-19\" d=\"M84.52,81c-1.23-.1-2.48-.16-3.74-.16a45.45,45.45,0,0,0-11.89,1.58c3.27,4.36,8.19,8.67,15.54,12.24a36.72,36.72,0,0,1,14.72-1.22C92.33,89,86.54,83.95,84.52,81Z\"></path><path class=\"cls-20\" d=\"M109.73,91.38a33.29,33.29,0,0,0-12.21-7.29C100.46,89.66,103,91.38,109.73,91.38Z\"></path><path class=\"cls-6\" d=\"M96.89,67.66a63.16,63.16,0,0,1,6.54,4.58c.52.39-.93-3.55-2.62-4.3A7.5,7.5,0,0,0,96.89,67.66Z\"></path><path class=\"cls-6\" d=\"M105,73.37a70.75,70.75,0,0,1,6.5,4.64c.53.38-.9-3.56-2.57-4.33A7.5,7.5,0,0,0,105,73.37Z\"></path><path class=\"cls-6\" d=\"M112.55,79a19.59,19.59,0,0,1,3.52,4.39c.26.38.07-2.58-.92-3.42A5.28,5.28,0,0,0,112.55,79Z\"></path><path class=\"cls-21\" d=\"M77.55,151c-.2-.65,2.35-1.48,3-1.51a11.91,11.91,0,0,1,3.57,1.19,16.34,16.34,0,0,1-4.89,1A4.46,4.46,0,0,1,77.55,151Z\"></path><path class=\"cls-21\" d=\"M86.73,148.78c-.22-.51,1.75-1.38,2.29-1.46a9.58,9.58,0,0,1,3,.65,13.15,13.15,0,0,1-3.83,1.23A3.59,3.59,0,0,1,86.73,148.78Z\"></path><path class=\"cls-21\" d=\"M94.41,146c-.22-.4,1.32-1.29,1.76-1.41a7.92,7.92,0,0,1,2.48.27,10.87,10.87,0,0,1-3,1.35A3,3,0,0,1,94.41,146Z\"></path><path class=\"cls-21\" d=\"M100.52,143.19c-.23-.35,1.11-1.27,1.5-1.41a7.25,7.25,0,0,1,2.29.07,10,10,0,0,1-2.67,1.45A2.72,2.72,0,0,1,100.52,143.19Z\"></path><path class=\"cls-21\" d=\"M106.23,140.07c-.22-.29.9-1.16,1.24-1.3a6.31,6.31,0,0,1,2,0,8.66,8.66,0,0,1-2.25,1.39A2.36,2.36,0,0,1,106.23,140.07Z\"></path><path class=\"cls-21\" d=\"M68.34,151.69c-.11-.73,2.73-1.16,3.46-1.09a12.76,12.76,0,0,1,3.57,1.86,17.51,17.51,0,0,1-5.35.26A4.78,4.78,0,0,1,68.34,151.69Z\"></path><path class=\"cls-6\" d=\"M70.08,65.82c2,2.27,6.68,3.74,6.68,3.74A19,19,0,0,1,75.83,62c0-.18-5.75-.09-6.73-4.81C68.91,56.23,68.1,63.55,70.08,65.82Z\"></path><path class=\"cls-4\" d=\"M50.54,174.68a5.49,5.49,0,0,1,2.24-3.88l.19-.11a14,14,0,0,0-1.43-.25c-6.85-1-8.59,3.06-8.95,7.64,0,.26,0,.53,0,.78a8.31,8.31,0,0,1,7.89-4.2Z\"></path><path class=\"cls-4\" d=\"M58.88,173.19c-6.81-4.13-10.63-4.43-12.15,7.14,0,0,7.17-5.67,10.55-1.92,3.68,4.07,8.68.32,6.05-2.06A18.77,18.77,0,0,0,58.88,173.19Z\"></path><path class=\"cls-4\" d=\"M56.06,174.53c-3.86,2.57-3.86,8.62-3.86,8.62s7-3.81,6.5-6.19A2.93,2.93,0,0,0,56.06,174.53Z\"></path><path class=\"cls-4\" d=\"M24,127a5.49,5.49,0,0,1,4.43-.68l.2.08a14,14,0,0,0-.7-1.27c-3.49-6-7.76-4.79-11.56-2.21-.22.15-.43.31-.63.47a8.31,8.31,0,0,1,8.21,3.53Z\"></path><path class=\"cls-4\" d=\"M31.29,134.08c-2.48-9.82-4.47-13.62-14-6.83,0,0,8.13-2.34,9.06,9.22.44,5.47,5.69,6.57,5.63,3A18.77,18.77,0,0,0,31.29,134.08Z\"></path><path class=\"cls-4\" d=\"M27.83,128.82c-4.52-1.07-8.94,3.06-8.94,3.06s6.94-.24,7.78,4C27.14,138.23,27.83,128.82,27.83,128.82Z\"></path><path class=\"cls-22\" d=\"M172.45,112.79a55.39,55.39,0,0,1,15.49-12.5c5.64-3,13.66-4.84,18.5-4.61l1.85,1.59-1-.08a37.75,37.75,0,0,0-19,3.76A55,55,0,0,0,172.45,112.79Z\"></path><path class=\"cls-23\" d=\"M207.12,95.74a34.5,34.5,0,0,1,10.45,2.68,27.42,27.42,0,0,1,8.81,6,27.05,27.05,0,0,0-9.09-5.29,43.65,43.65,0,0,0-9-1.84l-1.84-1.59Z\"></path><path class=\"cls-24\" d=\"M124.52,175.47a27.43,27.43,0,0,1,3.11-1.9,25.35,25.35,0,0,1,2.31-1c.78-.34,1.58-.58,2.38-.84a45.63,45.63,0,0,1,9.84-1.81,95.67,95.67,0,0,1,19.84.78,194.33,194.33,0,0,0,19.66,1.89,66.25,66.25,0,0,0,19.6-1.93,66.44,66.44,0,0,1-19.6,2.3,194.82,194.82,0,0,1-19.75-1.52,94.77,94.77,0,0,0-19.65-.41,44.43,44.43,0,0,0-9.55,1.94c-.76.27-1.53.52-2.27.85a24,24,0,0,0-2.18,1,21.38,21.38,0,0,0-3.93,2.7l-.53.47A18.42,18.42,0,0,1,124.52,175.47Z\"></path><line class=\"cls-25\" x1=\"124.09\" y1=\"176.84\" x2=\"124.09\" y2=\"176.84\"></line><path class=\"cls-6\" d=\"M85.66,97.64c-6.36,1.4-5.37,6.45-5.37,6.45s2-2.43,13.09-3.74A52.36,52.36,0,0,1,85.66,97.64Z\"></path><path class=\"cls-26\" d=\"M118.59,191.58a16.4,16.4,0,0,1-.08-4.24,18.64,18.64,0,0,1,.91-4.18,18.86,18.86,0,0,1,1.87-3.9,19.81,19.81,0,0,1,2.78-3.38l.46-.42s-.63,2-.7,2.51a19.27,19.27,0,0,0-1.61,1.93,17.84,17.84,0,0,0-3.33,7.5A16.22,16.22,0,0,0,118.59,191.58Z\"></path><path class=\"cls-27\" d=\"M65.89,155.08c-3.61-4-6.65-10.29-7.95-16.2a36.79,36.79,0,0,1-.82-9.49l.14-2.38.33-2.36a23,23,0,0,1,.47-2.33,19.65,19.65,0,0,1,.6-2.3,35.6,35.6,0,0,1,3.83-8.64,39.45,39.45,0,0,1,2.68-3.89l1.53-1.8c.51-.6,1.1-1.13,1.64-1.69a37.2,37.2,0,0,1,7.47-5.68,39.82,39.82,0,0,1,8.62-3.62A39.67,39.67,0,0,0,76,98.56a36.78,36.78,0,0,0-7.22,5.83c-.52.57-1.08,1.11-1.56,1.71l-1.45,1.81a38.67,38.67,0,0,0-2.51,3.89,34.62,34.62,0,0,0-3.48,8.52,18.77,18.77,0,0,0-.52,2.24,21.9,21.9,0,0,0-.38,2.27l-.25,2.28-.06,2.3a35.25,35.25,0,0,0,1.06,9.07,36.17,36.17,0,0,0,8.62,15.83l.66.71S66.44,155.12,65.89,155.08Z\"></path><path class=\"cls-28\" d=\"M103.89,166.42A47.14,47.14,0,0,1,94,167.55,37.09,37.09,0,0,1,84,165.91,46.7,46.7,0,0,1,74.71,162a34.57,34.57,0,0,1-8.12-6.17l-.69-.74s2.38,0,3-.06a33.57,33.57,0,0,0,6.72,5.5,45.26,45.26,0,0,0,8.82,4.27A36.2,36.2,0,0,0,94,166.91,47.78,47.78,0,0,0,103.89,166.42Z\"></path></g></g></svg>"
 
 /***/ }),
 
-/***/ 81:
-/***/ (function(module, exports, __webpack_require__) {
-
-var baseIsNative = __webpack_require__(82),
-    getValue = __webpack_require__(88);
-
-/**
- * Gets the native function at `key` of `object`.
- *
- * @private
- * @param {Object} object The object to query.
- * @param {string} key The key of the method to get.
- * @returns {*} Returns the function if it's native, else `undefined`.
- */
-function getNative(object, key) {
-  var value = getValue(object, key);
-  return baseIsNative(value) ? value : undefined;
-}
-
-module.exports = getNative;
-
-
-/***/ }),
-
-/***/ 82:
-/***/ (function(module, exports, __webpack_require__) {
-
-var isFunction = __webpack_require__(83),
-    isMasked = __webpack_require__(85),
-    isObject = __webpack_require__(84),
-    toSource = __webpack_require__(87);
-
-/**
- * Used to match `RegExp`
- * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
- */
-var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
-
-/** Used to detect host constructors (Safari). */
-var reIsHostCtor = /^\[object .+?Constructor\]$/;
-
-/** Used for built-in method references. */
-var funcProto = Function.prototype,
-    objectProto = Object.prototype;
-
-/** Used to resolve the decompiled source of functions. */
-var funcToString = funcProto.toString;
-
-/** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
-
-/** Used to detect if a method is native. */
-var reIsNative = RegExp('^' +
-  funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
-  .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
-);
-
-/**
- * The base implementation of `_.isNative` without bad shim checks.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a native function,
- *  else `false`.
- */
-function baseIsNative(value) {
-  if (!isObject(value) || isMasked(value)) {
-    return false;
-  }
-  var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
-  return pattern.test(toSource(value));
-}
-
-module.exports = baseIsNative;
-
-
-/***/ }),
-
-/***/ 83:
-/***/ (function(module, exports, __webpack_require__) {
-
-var baseGetTag = __webpack_require__(6),
-    isObject = __webpack_require__(84);
-
-/** `Object#toString` result references. */
-var asyncTag = '[object AsyncFunction]',
-    funcTag = '[object Function]',
-    genTag = '[object GeneratorFunction]',
-    proxyTag = '[object Proxy]';
-
-/**
- * Checks if `value` is classified as a `Function` object.
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a function, else `false`.
- * @example
- *
- * _.isFunction(_);
- * // => true
- *
- * _.isFunction(/abc/);
- * // => false
- */
-function isFunction(value) {
-  if (!isObject(value)) {
-    return false;
-  }
-  // The use of `Object#toString` avoids issues with the `typeof` operator
-  // in Safari 9 which returns 'object' for typed arrays and other constructors.
-  var tag = baseGetTag(value);
-  return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
-}
-
-module.exports = isFunction;
-
-
-/***/ }),
-
-/***/ 84:
-/***/ (function(module, exports) {
-
-/**
- * Checks if `value` is the
- * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
- * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
- *
- * @static
- * @memberOf _
- * @since 0.1.0
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an object, else `false`.
- * @example
- *
- * _.isObject({});
- * // => true
- *
- * _.isObject([1, 2, 3]);
- * // => true
- *
- * _.isObject(_.noop);
- * // => true
- *
- * _.isObject(null);
- * // => false
- */
-function isObject(value) {
-  var type = typeof value;
-  return value != null && (type == 'object' || type == 'function');
-}
-
-module.exports = isObject;
-
-
-/***/ }),
-
-/***/ 85:
-/***/ (function(module, exports, __webpack_require__) {
-
-var coreJsData = __webpack_require__(86);
-
-/** Used to detect methods masquerading as native. */
-var maskSrcKey = (function() {
-  var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
-  return uid ? ('Symbol(src)_1.' + uid) : '';
-}());
-
-/**
- * Checks if `func` has its source masked.
- *
- * @private
- * @param {Function} func The function to check.
- * @returns {boolean} Returns `true` if `func` is masked, else `false`.
- */
-function isMasked(func) {
-  return !!maskSrcKey && (maskSrcKey in func);
-}
-
-module.exports = isMasked;
-
-
-/***/ }),
-
-/***/ 86:
-/***/ (function(module, exports, __webpack_require__) {
-
-var root = __webpack_require__(8);
-
-/** Used to detect overreaching core-js shims. */
-var coreJsData = root['__core-js_shared__'];
-
-module.exports = coreJsData;
-
-
-/***/ }),
-
-/***/ 87:
-/***/ (function(module, exports) {
-
-/** Used for built-in method references. */
-var funcProto = Function.prototype;
-
-/** Used to resolve the decompiled source of functions. */
-var funcToString = funcProto.toString;
-
-/**
- * Converts `func` to its source code.
- *
- * @private
- * @param {Function} func The function to convert.
- * @returns {string} Returns the source code.
- */
-function toSource(func) {
-  if (func != null) {
-    try {
-      return funcToString.call(func);
-    } catch (e) {}
-    try {
-      return (func + '');
-    } catch (e) {}
-  }
-  return '';
-}
-
-module.exports = toSource;
-
-
-/***/ }),
-
-/***/ 88:
-/***/ (function(module, exports) {
-
-/**
- * Gets the value at `key` of `object`.
- *
- * @private
- * @param {Object} [object] The object to query.
- * @param {string} key The key of the property to get.
- * @returns {*} Returns the property value.
- */
-function getValue(object, key) {
-  return object == null ? undefined : object[key];
-}
-
-module.exports = getValue;
-
-
-/***/ }),
-
-/***/ 89:
-/***/ (function(module, exports) {
-
-/**
- * Removes `key` and its value from the hash.
- *
- * @private
- * @name delete
- * @memberOf Hash
- * @param {Object} hash The hash to modify.
- * @param {string} key The key of the value to remove.
- * @returns {boolean} Returns `true` if the entry was removed, else `false`.
- */
-function hashDelete(key) {
-  var result = this.has(key) && delete this.__data__[key];
-  this.size -= result ? 1 : 0;
-  return result;
-}
-
-module.exports = hashDelete;
-
-
-/***/ }),
-
 /***/ 9:
 /***/ (function(module, exports, __webpack_require__) {
 
 /* WEBPACK VAR INJECTION */(function(global) {/** Detect free variable `global` from Node.js. */
 var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
 
 module.exports = freeGlobal;
 
 /* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(792)))
 
 /***/ }),
 
-/***/ 90:
-/***/ (function(module, exports, __webpack_require__) {
-
-var nativeCreate = __webpack_require__(80);
-
-/** Used to stand-in for `undefined` hash values. */
-var HASH_UNDEFINED = '__lodash_hash_undefined__';
-
-/** Used for built-in method references. */
-var objectProto = Object.prototype;
-
-/** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
-
-/**
- * Gets the hash value for `key`.
- *
- * @private
- * @name get
- * @memberOf Hash
- * @param {string} key The key of the value to get.
- * @returns {*} Returns the entry value.
- */
-function hashGet(key) {
-  var data = this.__data__;
-  if (nativeCreate) {
-    var result = data[key];
-    return result === HASH_UNDEFINED ? undefined : result;
-  }
-  return hasOwnProperty.call(data, key) ? data[key] : undefined;
-}
-
-module.exports = hashGet;
-
-
-/***/ }),
-
-/***/ 91:
-/***/ (function(module, exports, __webpack_require__) {
-
-var nativeCreate = __webpack_require__(80);
-
-/** Used for built-in method references. */
-var objectProto = Object.prototype;
-
-/** Used to check objects for own properties. */
-var hasOwnProperty = objectProto.hasOwnProperty;
-
-/**
- * Checks if a hash value for `key` exists.
- *
- * @private
- * @name has
- * @memberOf Hash
- * @param {string} key The key of the entry to check.
- * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
- */
-function hashHas(key) {
-  var data = this.__data__;
-  return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);
-}
-
-module.exports = hashHas;
-
-
-/***/ }),
-
 /***/ 919:
 /***/ (function(module, exports) {
 
 module.exports = "<!-- 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 1792 1792\"><path d=\"M1395 1184q0 13-10 23l-50 50q-10 10-23 10t-23-10l-393-393-393 393q-10 10-23 10t-23-10l-50-50q-10-10-10-23t10-23l466-466q10-10 23-10t23 10l466 466q10 10 10 23z\" fill=\"#696969\"></path></svg>"
 
 /***/ }),
 
-/***/ 92:
-/***/ (function(module, exports, __webpack_require__) {
-
-var nativeCreate = __webpack_require__(80);
-
-/** Used to stand-in for `undefined` hash values. */
-var HASH_UNDEFINED = '__lodash_hash_undefined__';
-
-/**
- * Sets the hash `key` to `value`.
- *
- * @private
- * @name set
- * @memberOf Hash
- * @param {string} key The key of the value to set.
- * @param {*} value The value to set.
- * @returns {Object} Returns the hash instance.
- */
-function hashSet(key, value) {
-  var data = this.__data__;
-  this.size += this.has(key) ? 0 : 1;
-  data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;
-  return this;
-}
-
-module.exports = hashSet;
-
-
-/***/ }),
-
 /***/ 920:
 /***/ (function(module, exports) {
 
 module.exports = "<!-- 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 1792 1792\"><path d=\"M1395 736q0 13-10 23l-466 466q-10 10-23 10t-23-10l-466-466q-10-10-10-23t10-23l50-50q10-10 23-10t23 10l393 393 393-393q10-10 23-10t23 10l50 50q10 10 10 23z\" fill=\"#696969\"></path></svg>"
 
 /***/ }),
 
-/***/ 93:
-/***/ (function(module, exports, __webpack_require__) {
-
-var listCacheClear = __webpack_require__(94),
-    listCacheDelete = __webpack_require__(95),
-    listCacheGet = __webpack_require__(98),
-    listCacheHas = __webpack_require__(99),
-    listCacheSet = __webpack_require__(100);
-
-/**
- * Creates an list cache object.
- *
- * @private
- * @constructor
- * @param {Array} [entries] The key-value pairs to cache.
- */
-function ListCache(entries) {
-  var index = -1,
-      length = entries == null ? 0 : entries.length;
-
-  this.clear();
-  while (++index < length) {
-    var entry = entries[index];
-    this.set(entry[0], entry[1]);
-  }
-}
-
-// Add methods to `ListCache`.
-ListCache.prototype.clear = listCacheClear;
-ListCache.prototype['delete'] = listCacheDelete;
-ListCache.prototype.get = listCacheGet;
-ListCache.prototype.has = listCacheHas;
-ListCache.prototype.set = listCacheSet;
-
-module.exports = ListCache;
-
-
-/***/ }),
-
-/***/ 94:
-/***/ (function(module, exports) {
-
-/**
- * Removes all key-value entries from the list cache.
- *
- * @private
- * @name clear
- * @memberOf ListCache
- */
-function listCacheClear() {
-  this.__data__ = [];
-  this.size = 0;
-}
-
-module.exports = listCacheClear;
-
-
-/***/ }),
-
-/***/ 95:
-/***/ (function(module, exports, __webpack_require__) {
-
-var assocIndexOf = __webpack_require__(96);
-
-/** Used for built-in method references. */
-var arrayProto = Array.prototype;
-
-/** Built-in value references. */
-var splice = arrayProto.splice;
-
-/**
- * Removes `key` and its value from the list cache.
- *
- * @private
- * @name delete
- * @memberOf ListCache
- * @param {string} key The key of the value to remove.
- * @returns {boolean} Returns `true` if the entry was removed, else `false`.
- */
-function listCacheDelete(key) {
-  var data = this.__data__,
-      index = assocIndexOf(data, key);
-
-  if (index < 0) {
-    return false;
-  }
-  var lastIndex = data.length - 1;
-  if (index == lastIndex) {
-    data.pop();
-  } else {
-    splice.call(data, index, 1);
-  }
-  --this.size;
-  return true;
-}
-
-module.exports = listCacheDelete;
-
-
-/***/ }),
-
-/***/ 96:
-/***/ (function(module, exports, __webpack_require__) {
-
-var eq = __webpack_require__(97);
-
-/**
- * Gets the index at which the `key` is found in `array` of key-value pairs.
- *
- * @private
- * @param {Array} array The array to inspect.
- * @param {*} key The key to search for.
- * @returns {number} Returns the index of the matched value, else `-1`.
- */
-function assocIndexOf(array, key) {
-  var length = array.length;
-  while (length--) {
-    if (eq(array[length][0], key)) {
-      return length;
-    }
-  }
-  return -1;
-}
-
-module.exports = assocIndexOf;
-
-
-/***/ }),
-
-/***/ 97:
-/***/ (function(module, exports) {
-
-/**
- * Performs a
- * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
- * comparison between two values to determine if they are equivalent.
- *
- * @static
- * @memberOf _
- * @since 4.0.0
- * @category Lang
- * @param {*} value The value to compare.
- * @param {*} other The other value to compare.
- * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
- * @example
- *
- * var object = { 'a': 1 };
- * var other = { 'a': 1 };
- *
- * _.eq(object, object);
- * // => true
- *
- * _.eq(object, other);
- * // => false
- *
- * _.eq('a', 'a');
- * // => true
- *
- * _.eq('a', Object('a'));
- * // => false
- *
- * _.eq(NaN, NaN);
- * // => true
- */
-function eq(value, other) {
-  return value === other || (value !== value && other !== other);
-}
-
-module.exports = eq;
-
-
-/***/ }),
-
-/***/ 98:
-/***/ (function(module, exports, __webpack_require__) {
-
-var assocIndexOf = __webpack_require__(96);
-
-/**
- * Gets the list cache value for `key`.
- *
- * @private
- * @name get
- * @memberOf ListCache
- * @param {string} key The key of the value to get.
- * @returns {*} Returns the entry value.
- */
-function listCacheGet(key) {
-  var data = this.__data__,
-      index = assocIndexOf(data, key);
-
-  return index < 0 ? undefined : data[index][1];
-}
-
-module.exports = listCacheGet;
-
-
-/***/ }),
-
-/***/ 99:
-/***/ (function(module, exports, __webpack_require__) {
-
-var assocIndexOf = __webpack_require__(96);
-
-/**
- * Checks if a list cache value for `key` exists.
- *
- * @private
- * @name has
- * @memberOf ListCache
- * @param {string} key The key of the entry to check.
- * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
- */
-function listCacheHas(key) {
-  return assocIndexOf(this.__data__, key) > -1;
-}
-
-module.exports = listCacheHas;
-
-
-/***/ }),
-
 /***/ 993:
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 exports.__esModule = true;
 exports.defaultMemoize = defaultMemoize;
--- a/devtools/client/debugger/new/parser-worker.js
+++ b/devtools/client/debugger/new/parser-worker.js
@@ -1016,16 +1016,17 @@ let ASTs = new Map();
 function _parse(code, opts) {
   return babylon.parse(code, _extends({}, opts, {
     tokens: true
   }));
 }
 
 const sourceOptions = {
   generated: {
+    sourceType: "unambiguous",
     tokens: true,
     plugins: ["objectRestSpread"]
   },
   original: {
     sourceType: "unambiguous",
     tokens: true,
     plugins: ["jsx", "flow", "doExpressions", "decorators", "objectRestSpread", "classProperties", "exportDefaultFrom", "exportNamespaceFrom", "asyncGenerators", "functionBind", "functionSent", "dynamicImport", "react-jsx"]
   }
@@ -2516,60 +2517,59 @@ module.exports = function (str) {
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
 exports.getFramework = getFramework;
 
+var _types = __webpack_require__(2268);
+
+var t = _interopRequireWildcard(_types);
+
 var _getSymbols = __webpack_require__(1457);
 
+function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
+
+/* 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/>. */
+
 function getFramework(sourceId) {
   const sourceSymbols = (0, _getSymbols.getSymbols)(sourceId);
 
   if (isReactComponent(sourceSymbols)) {
     return "React";
   }
   if (isAngularComponent(sourceSymbols)) {
     return "Angular";
   }
   if (isVueComponent(sourceSymbols)) {
     return "Vue";
   }
 }
 
 // React
 
-/* 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/>. */
-
 function isReactComponent(sourceSymbols) {
   const { imports, classes, callExpressions } = sourceSymbols;
   return importsReact(imports) || requiresReact(callExpressions) || extendsReactComponent(classes);
 }
 
 function importsReact(imports) {
   return imports.some(importObj => importObj.source === "react" && importObj.specifiers.some(specifier => specifier === "React"));
 }
 
 function requiresReact(callExpressions) {
   return callExpressions.some(callExpression => callExpression.name === "require" && callExpression.values.some(value => value === "react"));
 }
 
 function extendsReactComponent(classes) {
-  let result = false;
-  classes.some(classObj => {
-    if (classObj.parent && (classObj.parent.name === "Component" || classObj.parent.name === "PureComponent" || classObj.parent.property.name === "Component")) {
-      result = true;
-    }
-  });
-
-  return result;
+  return classes.some(classObj => t.isIdentifier(classObj.parent, { name: "Component" }) || t.isIdentifier(classObj.parent, { name: "PureComponent" }) || t.isMemberExpression(classObj.parent, { computed: false }) && t.isIdentifier(classObj.parent, { name: "Component" }));
 }
 
 // Angular
 
 const isAngularComponent = sourceSymbols => {
   const { memberExpressions, identifiers } = sourceSymbols;
   return identifiesAngular(identifiers) && hasAngularExpressions(memberExpressions);
 };
@@ -22861,48 +22861,48 @@ function getVarScope(scope) {
 function fromBabelLocation(location, sourceId) {
   return {
     sourceId,
     line: location.line,
     column: location.column
   };
 }
 
-function parseDeclarator(declaratorId, targetScope, type, declaration, state) {
+function parseDeclarator(declaratorId, targetScope, type, locationType, declaration, state) {
   if (isNode(declaratorId, "Identifier")) {
     let existing = targetScope.bindings[declaratorId.name];
     if (!existing) {
       existing = {
         type,
         refs: []
       };
       targetScope.bindings[declaratorId.name] = existing;
     }
     state.declarationBindingIds.add(declaratorId);
     existing.refs.push({
-      type: "decl",
+      type: locationType,
       start: fromBabelLocation(declaratorId.loc.start, state.sourceId),
       end: fromBabelLocation(declaratorId.loc.end, state.sourceId),
       declaration: {
         start: fromBabelLocation(declaration.loc.start, state.sourceId),
         end: fromBabelLocation(declaration.loc.end, state.sourceId)
       }
     });
   } else if (isNode(declaratorId, "ObjectPattern")) {
     declaratorId.properties.forEach(prop => {
-      parseDeclarator(prop.value, targetScope, type, declaration, state);
+      parseDeclarator(prop.value, targetScope, type, locationType, declaration, state);
     });
   } else if (isNode(declaratorId, "ArrayPattern")) {
     declaratorId.elements.forEach(item => {
-      parseDeclarator(item, targetScope, type, declaration, state);
+      parseDeclarator(item, targetScope, type, locationType, declaration, state);
     });
   } else if (isNode(declaratorId, "AssignmentPattern")) {
-    parseDeclarator(declaratorId.left, targetScope, type, declaration, state);
+    parseDeclarator(declaratorId.left, targetScope, type, locationType, declaration, state);
   } else if (isNode(declaratorId, "RestElement")) {
-    parseDeclarator(declaratorId.argument, targetScope, type, declaration, state);
+    parseDeclarator(declaratorId.argument, targetScope, type, locationType, declaration, state);
   }
 }
 
 function isLetOrConst(node) {
   return node.kind === "let" || node.kind === "const";
 }
 
 function hasLexicalDeclaration(node, parent) {
@@ -22953,17 +22953,17 @@ const scopeCollectionVisitor = {
         scope = pushTempScope(state, "block", "Function Expression", {
           start: fromBabelLocation(node.loc.start, state.sourceId),
           end: fromBabelLocation(node.loc.end, state.sourceId)
         });
         state.declarationBindingIds.add(node.id);
         scope.bindings[node.id.name] = {
           type: "const",
           refs: [{
-            type: "decl",
+            type: "fn-expr",
             start: fromBabelLocation(node.id.loc.start, state.sourceId),
             end: fromBabelLocation(node.id.loc.end, state.sourceId),
             declaration: {
               start: fromBabelLocation(node.loc.start, state.sourceId),
               end: fromBabelLocation(node.loc.end, state.sourceId)
             }
           }]
         };
@@ -22972,17 +22972,17 @@ const scopeCollectionVisitor = {
       if (t.isFunctionDeclaration(node) && isNode(node.id, "Identifier")) {
         // This ignores Annex B function declaration hoisting, which
         // is probably a fine assumption.
         state.declarationBindingIds.add(node.id);
         const fnScope = getVarScope(scope);
         scope.bindings[node.id.name] = {
           type: fnScope === scope ? "var" : "let",
           refs: [{
-            type: "decl",
+            type: "fn-decl",
             start: fromBabelLocation(node.id.loc.start, state.sourceId),
             end: fromBabelLocation(node.id.loc.end, state.sourceId),
             declaration: {
               start: fromBabelLocation(node.loc.start, state.sourceId),
               end: fromBabelLocation(node.loc.end, state.sourceId)
             }
           }]
         };
@@ -22990,17 +22990,17 @@ const scopeCollectionVisitor = {
 
       scope = pushTempScope(state, "function", (0, _getFunctionName2.default)(node, parentNode), {
         // Being at the start of a function doesn't count as
         // being inside of it.
         start: fromBabelLocation(node.params[0] ? node.params[0].loc.start : node.loc.start, state.sourceId),
         end: fromBabelLocation(node.loc.end, state.sourceId)
       });
 
-      node.params.forEach(param => parseDeclarator(param, scope, "var", node, state));
+      node.params.forEach(param => parseDeclarator(param, scope, "var", "fn-param", node, state));
 
       if (!t.isArrowFunctionExpression(node)) {
         scope.bindings.this = {
           type: "implicit",
           refs: []
         };
         scope.bindings.arguments = {
           type: "implicit",
@@ -23029,34 +23029,34 @@ const scopeCollectionVisitor = {
           end: fromBabelLocation(node.loc.end, state.sourceId)
         };
 
         if (t.isClassDeclaration(node)) {
           state.declarationBindingIds.add(node.id);
           state.scope.bindings[node.id.name] = {
             type: "let",
             refs: [{
-              type: "decl",
+              type: "class-decl",
               start: fromBabelLocation(node.id.loc.start, state.sourceId),
               end: fromBabelLocation(node.id.loc.end, state.sourceId),
               declaration
             }]
           };
         }
 
         const scope = pushTempScope(state, "block", "Class", {
           start: fromBabelLocation(node.loc.start, state.sourceId),
           end: fromBabelLocation(node.loc.end, state.sourceId)
         });
 
         state.declarationBindingIds.add(node.id);
         scope.bindings[node.id.name] = {
           type: "const",
           refs: [{
-            type: "decl",
+            type: "class-inner",
             start: fromBabelLocation(node.id.loc.start, state.sourceId),
             end: fromBabelLocation(node.id.loc.end, state.sourceId),
             declaration
           }]
         };
       }
     } else if (t.isForXStatement(node) || t.isForStatement(node)) {
       const init = node.init || node.left;
@@ -23069,74 +23069,74 @@ const scopeCollectionVisitor = {
           end: fromBabelLocation(node.loc.end, state.sourceId)
         });
       }
     } else if (t.isCatchClause(node)) {
       const scope = pushTempScope(state, "block", "Catch", {
         start: fromBabelLocation(node.loc.start, state.sourceId),
         end: fromBabelLocation(node.loc.end, state.sourceId)
       });
-      parseDeclarator(node.param, scope, "var", node, state);
+      parseDeclarator(node.param, scope, "var", "catch", node, state);
     } else if (t.isBlockStatement(node) && hasLexicalDeclaration(node, parentNode)) {
       // Debugger will create new lexical environment for the block.
       pushTempScope(state, "block", "Block", {
         start: fromBabelLocation(node.loc.start, state.sourceId),
         end: fromBabelLocation(node.loc.end, state.sourceId)
       });
     } else if (t.isVariableDeclaration(node) && (node.kind === "var" ||
     // Lexical declarations in for statements are handled above.
     !t.isForStatement(parentNode, { init: node }) || !t.isForXStatement(parentNode, { left: node }))) {
       // Finds right lexical environment
       const hoistAt = !isLetOrConst(node) ? getVarScope(state.scope) : state.scope;
       node.declarations.forEach(declarator => {
-        parseDeclarator(declarator.id, hoistAt, node.kind, node, state);
+        parseDeclarator(declarator.id, hoistAt, node.kind, node.kind, node, state);
       });
     } else if (t.isImportDeclaration(node) && (!node.importKind || node.importKind === "value")) {
       node.specifiers.forEach(spec => {
         if (t.isImportNamespaceSpecifier(spec)) {
           state.declarationBindingIds.add(spec.local);
 
           state.scope.bindings[spec.local.name] = {
             // Imported namespaces aren't live import bindings, they are
             // just normal const bindings.
             type: "const",
             refs: [{
-              type: "decl",
+              type: "import-ns-decl",
               start: fromBabelLocation(spec.local.loc.start, state.sourceId),
               end: fromBabelLocation(spec.local.loc.end, state.sourceId),
               declaration: {
                 start: fromBabelLocation(node.loc.start, state.sourceId),
                 end: fromBabelLocation(node.loc.end, state.sourceId)
               }
             }]
           };
         } else {
           state.declarationBindingIds.add(spec.local);
 
           state.scope.bindings[spec.local.name] = {
             type: "import",
             refs: [{
-              type: "decl",
+              type: "import-decl",
               start: fromBabelLocation(spec.local.loc.start, state.sourceId),
               end: fromBabelLocation(spec.local.loc.end, state.sourceId),
               importName: t.isImportDefaultSpecifier(spec) ? "default" : spec.imported.name,
               declaration: {
                 start: fromBabelLocation(node.loc.start, state.sourceId),
                 end: fromBabelLocation(node.loc.end, state.sourceId)
               }
             }]
           };
         }
       });
     } else if (t.isTSEnumDeclaration(node)) {
       state.declarationBindingIds.add(node.id);
       state.scope.bindings[node.id.name] = {
         type: "const",
         refs: [{
-          type: "decl",
+          type: "ts-enum-decl",
           start: fromBabelLocation(node.id.loc.start, state.sourceId),
           end: fromBabelLocation(node.id.loc.end, state.sourceId),
           declaration: {
             start: fromBabelLocation(node.loc.start, state.sourceId),
             end: fromBabelLocation(node.loc.end, state.sourceId)
           }
         }]
       };
@@ -24994,19 +24994,17 @@ function mapOriginalExpression(expressio
 
 const {
   originalToGeneratedId,
   generatedToOriginalId,
   isGeneratedId,
   isOriginalId
 } = __webpack_require__(3652);
 
-const {
-  workerUtils: { WorkerDispatcher }
-} = __webpack_require__(3651);
+const { workerUtils: { WorkerDispatcher } } = __webpack_require__(3651);
 
 const dispatcher = new WorkerDispatcher();
 
 const getOriginalURLs = dispatcher.task("getOriginalURLs");
 const getGeneratedRanges = dispatcher.task("getGeneratedRanges", {
   queue: true
 });
 const getGeneratedLocation = dispatcher.task("getGeneratedLocation", {
--- a/devtools/client/debugger/new/search-worker.js
+++ b/devtools/client/debugger/new/search-worker.js
@@ -672,43 +672,42 @@ Object.defineProperty(exports, "__esModu
 exports.findSourceMatches = findSourceMatches;
 /* 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/>. */
 
 // Maybe reuse file search's functions?
 
 function findSourceMatches(source, queryText) {
-  const text = source.text;
-  if (source.loadedState !== "loaded" || !text || queryText == "") {
+  const { id, loadedState, text } = source;
+  if (loadedState != "loaded" || !text || queryText == "") {
     return [];
   }
 
   const lines = text.split("\n");
   let result = undefined;
   const query = new RegExp(queryText, "g");
 
-  let matches = lines.map((_text, line) => {
+  const matches = lines.map((_text, line) => {
     const indices = [];
 
     while (result = query.exec(_text)) {
       indices.push({
-        sourceId: source.id,
+        sourceId: id,
         line: line + 1,
         column: result.index,
         match: result[0],
         value: _text,
         text: result.input
       });
     }
     return indices;
   }).filter(_matches => _matches.length > 0);
 
-  matches = [].concat(...matches);
-  return matches;
+  return [].concat(...matches);
 }
 
 /***/ }),
 
 /***/ 259:
 /***/ (function(module, exports, __webpack_require__) {
 
 var toString = __webpack_require__(108);
--- a/devtools/client/debugger/new/test/mochitest/browser.ini
+++ b/devtools/client/debugger/new/test/mochitest/browser.ini
@@ -1,18 +1,21 @@
 [DEFAULT]
 tags = devtools
 subsuite = devtools
 skip-if = (os == 'linux' && debug && bits == 32)
 support-files =
   head.js
+  helpers.js
   !/devtools/client/commandline/test/helpers.js
   !/devtools/client/shared/test/shared-head.js
   !/devtools/client/shared/test/telemetry-test-helpers.js
   examples/babel/polyfill-bundle.js
+  examples/babel/fixtures/ts-classes/output.js
+  examples/babel/fixtures/ts-classes/output.js.map
   examples/babel/fixtures/eval-source-maps/output.js
   examples/babel/fixtures/eval-source-maps/output.js.map
   examples/babel/fixtures/for-of/output.js
   examples/babel/fixtures/for-of/output.js.map
   examples/babel/fixtures/line-start-bindings-es6/output.js
   examples/babel/fixtures/line-start-bindings-es6/output.js.map
   examples/babel/fixtures/shadowed-vars/output.js
   examples/babel/fixtures/shadowed-vars/output.js.map
--- a/devtools/client/debugger/new/test/mochitest/browser_dbg-babel-preview.js
+++ b/devtools/client/debugger/new/test/mochitest/browser_dbg-babel-preview.js
@@ -123,18 +123,18 @@ function testImportedBindings(dbg) {
      line: 24,
      column: 16,
      expression: "_mod3.aNamed;",
      result: '"a-named"',
    },
    {
      line: 25,
      column: 16,
-     expression: "_mod4.original;",
-     result: '"an-original"',
+     expression: "_mod3.aNamed;",
+     result: '"a-named"',
    },
    {
      line: 26,
      column: 16,
      expression: "aNamespace",
      fields: [
        ['aNamed', 'a-named'],
        ['default', 'a-default'],
@@ -156,18 +156,18 @@ function testImportedBindings(dbg) {
      line: 33,
      column: 20,
      expression: "_mod8.aNamed2;",
      result: '"a-named2"',
    },
    {
      line: 34,
      column: 20,
-     expression: "_mod9.original;",
-     result: '"an-original2"',
+     expression: "_mod8.aNamed2;",
+     result: '"a-named2"',
    },
    {
      line: 35,
      column: 20,
      expression: "aNamespace2",
      fields: [
        ['aNamed', 'a-named2'],
        ['default', 'a-default2'],
--- a/devtools/client/debugger/new/test/mochitest/browser_dbg-babel-scopes.js
+++ b/devtools/client/debugger/new/test/mochitest/browser_dbg-babel-scopes.js
@@ -2,31 +2,46 @@
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 // This test can be really slow on debug platforms and should be split.
 requestLongerTimeout(6);
 
 // Tests loading sourcemapped sources for Babel's compile output.
 
 async function breakpointScopes(dbg, fixture, { line, column }, scopes) {
-  const filename = `fixtures/${fixture}/input.js`;
+  const filename = `fixtures/${fixture}/input.`;
   const fnName = fixture.replace(/-([a-z])/g, (s, c) => c.toUpperCase());
 
   await invokeWithBreakpoint(dbg, fnName, filename, { line, column }, async () => {
     await assertScopes(dbg, scopes);
   });
 
   ok(true, `Ran tests for ${fixture} at line ${line} column ${column}`);
 }
 
 add_task(async function() {
   await pushPref("devtools.debugger.features.map-scopes", true);
 
   const dbg = await initDebugger("doc-babel.html");
 
+  await breakpointScopes(dbg, "ts-classes", { line: 52, column: 4 }, [
+    "Module",
+    "AnotherThing()",
+    ["anyWindow", "Window"],
+    "AppComponent()",
+    "decoratorFactory()",
+    "def()",
+    "ExportedOther()",
+    "ExpressionClass:Foo()",
+    "fn()",
+    ["ns", '{\u2026}'],
+    "SubDecl()",
+    "SubVar:SubExpr()"
+  ]);
+
   await breakpointScopes(dbg, "eval-source-maps", { line: 14, column: 4 }, [
     "Block",
     ["three", "5"],
     ["two", "4"],
     "Block",
     ["three", "3"],
     ["two", "2"],
     "root",
@@ -124,16 +139,19 @@ add_task(async function() {
     ["anAliased2", '"an-original2"'],
     ["anAliased3", '"an-original3"'],
     ["aNamed", '"a-named"'],
     ["aNamed2", '"a-named2"'],
     ["aNamed3", '"a-named3"'],
     ["aNamespace", "{\u2026}"],
     ["aNamespace2", "{\u2026}"],
     ["aNamespace3", "{\u2026}"],
+    ["anotherNamed", '"a-named"'],
+    ["anotherNamed2", '"a-named2"'],
+    ["anotherNamed3", '"a-named3"'],
     ["example", "(optimized away)"],
     ["optimizedOut", "(optimized away)"],
     "root()"
   ]);
 
   await breakpointScopes(dbg, "classes", { line: 12, column: 6 }, [
     "Block",
     ["three", "3"],
@@ -277,16 +295,19 @@ add_task(async function() {
     ["anAliased2", "Getter"],
     ["anAliased3", "Getter"],
     ["aNamed", "Getter"],
     ["aNamed2", "Getter"],
     ["aNamed3", "Getter"],
     ["aNamespace", "{\u2026}"],
     ["aNamespace2", "{\u2026}"],
     ["aNamespace3", "{\u2026}"],
+    ["anotherNamed", "Getter"],
+    ["anotherNamed2", "Getter"],
+    ["anotherNamed3", "Getter"],
     ["example", "(optimized away)"],
     ["optimizedOut", "(optimized away)"],
     "root()"
   ]);
 
   await breakpointScopes(dbg, "webpack-modules-es6", { line: 20, column: 2 }, [
     "Module",
     ["aDefault", '"a-default"'],
@@ -296,16 +317,19 @@ add_task(async function() {
     ["anAliased2", '"an-original2"'],
     ["anAliased3", '"an-original3"'],
     ["aNamed", '"a-named"'],
     ["aNamed2", '"a-named2"'],
     ["aNamed3", '"a-named3"'],
     ["aNamespace", "{\u2026}"],
     ["aNamespace2", "{\u2026}"],
     ["aNamespace3", "{\u2026}"],
+    ["anotherNamed", '"a-named"'],
+    ["anotherNamed2", '"a-named2"'],
+    ["anotherNamed3", '"a-named3"'],
     ["example", "(optimized away)"],
     ["optimizedOut", "(optimized away)"],
     "root()"
   ]);
 
   await breakpointScopes(dbg, "webpack-standalone", { line: 11, column: 0 }, [
     "Block",
     ["<this>", '"this-value"'],
--- a/devtools/client/debugger/new/test/mochitest/examples/babel/fixtures/imported-bindings/input.js
+++ b/devtools/client/debugger/new/test/mochitest/examples/babel/fixtures/imported-bindings/input.js
@@ -1,48 +1,48 @@
 import aDefault from "./src/mod1";
-import { aNamed } from "./src/mod2";
+import { aNamed, aNamed as anotherNamed } from "./src/mod2";
 import { original as anAliased } from "./src/mod3";
 import * as aNamespace from "./src/mod4";
 
 import aDefault2 from "./src/mod5";
-import { aNamed2 } from "./src/mod6";
+import { aNamed2, aNamed2 as anotherNamed2 } from "./src/mod6";
 import { original as anAliased2 } from "./src/mod7";
 import * as aNamespace2 from "./src/mod8";
 
 import aDefault3 from "./src/mod9";
-import { aNamed3 } from "./src/mod10";
+import { aNamed3, aNamed3 as anotherNamed3 } from "./src/mod10";
 import { original as anAliased3 } from "./src/mod11";
 import * as aNamespace3 from "./src/mod12";
 
 import optimizedOut from "./src/optimized-out";
 optimizedOut();
 
 export default function root() {
   console.log("pause here", root);
 
   console.log(aDefault);
   console.log(anAliased);
   console.log(aNamed);
-  console.log(anAliased);
+  console.log(anotherNamed);
   console.log(aNamespace);
 
   try {
     // None of these are callable in this code, but we still want to make sure
     // they map properly even if the only reference is in a call expressions.
     console.log(aDefault2());
     console.log(anAliased2());
     console.log(aNamed2());
-    console.log(anAliased2());
+    console.log(anotherNamed2());
     console.log(aNamespace2());
 
     console.log(new aDefault3());
     console.log(new anAliased3());
     console.log(new aNamed3());
-    console.log(new anAliased3());
+    console.log(new anotherNamed3());
     console.log(new aNamespace3());
   } catch (e) {}
 }
 
 export function example(){}
 
 // The build harness sets the wrong global, so just override it.
 Promise.resolve().then(() => {
--- a/devtools/client/debugger/new/test/mochitest/examples/babel/fixtures/imported-bindings/output.js
+++ b/devtools/client/debugger/new/test/mochitest/examples/babel/fixtures/imported-bindings/output.js
@@ -124,32 +124,32 @@ function _interopRequireDefault(obj) { r
 (0, _optimizedOut2.default)();
 
 function root() {
   console.log("pause here", root);
 
   console.log(_mod2.default);
   console.log(_mod4.original);
   console.log(_mod3.aNamed);
-  console.log(_mod4.original);
+  console.log(_mod3.aNamed);
   console.log(aNamespace);
 
   try {
     // None of these are callable in this code, but we still want to make sure
     // they map properly even if the only reference is in a call expressions.
     console.log((0, _mod7.default)());
     console.log((0, _mod9.original)());
     console.log((0, _mod8.aNamed2)());
-    console.log((0, _mod9.original)());
+    console.log((0, _mod8.aNamed2)());
     console.log(aNamespace2());
 
     console.log(new _mod12.default());
     console.log(new _mod14.original());
     console.log(new _mod13.aNamed3());
-    console.log(new _mod14.original());
+    console.log(new _mod13.aNamed3());
     console.log(new aNamespace3());
   } catch (e) {}
 }
 
 function example() {}
 
 // The build harness sets the wrong global, so just override it.
 Promise.resolve().then(function () {
--- a/devtools/client/debugger/new/test/mochitest/examples/babel/fixtures/imported-bindings/output.js.map
+++ b/devtools/client/debugger/new/test/mochitest/examples/babel/fixtures/imported-bindings/output.js.map
@@ -1,1 +1,1 @@
-{"version":3,"sources":["webpack:///webpack/bootstrap 10c0c41335992ab33745","webpack:///./fixtures/imported-bindings/input.js","webpack:///./fixtures/imported-bindings/src/mod1.js","webpack:///./fixtures/imported-bindings/src/mod2.js","webpack:///./fixtures/imported-bindings/src/mod3.js","webpack:///./fixtures/imported-bindings/src/mod4.js","webpack:///./fixtures/imported-bindings/src/mod5.js","webpack:///./fixtures/imported-bindings/src/mod6.js","webpack:///./fixtures/imported-bindings/src/mod7.js","webpack:///./fixtures/imported-bindings/src/mod8.js","webpack:///./fixtures/imported-bindings/src/mod9.js","webpack:///./fixtures/imported-bindings/src/mod10.js","webpack:///./fixtures/imported-bindings/src/mod11.js","webpack:///./fixtures/imported-bindings/src/mod12.js","webpack:///./fixtures/imported-bindings/src/optimized-out.js"],"names":["root","example","aNamespace","aNamespace2","aNamespace3","console","log","aDefault","anAliased","aNamed","aDefault3","anAliased3","aNamed3","e","Promise","resolve","then","window","importedBindings","original","aNamed2","optimizedOut"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;;;;kBC3CwBA,I;QA0BRC,O,GAAAA,O;;AA5ChB;;;;AACA;;AACA;;AACA;;IAAYC,U;;AAEZ;;;;AACA;;AACA;;AACA;;IAAYC,W;;AAEZ;;;;AACA;;AACA;;AACA;;IAAYC,W;;AAEZ;;;;;;;;AACA;;AAEe,SAASJ,IAAT,GAAgB;AAC7BK,UAAQC,GAAR,CAAY,YAAZ,EAA0BN,IAA1B;;AAEAK,UAAQC,GAAR,CAAYC,aAAZ;AACAF,UAAQC,GAAR,CAAYE,cAAZ;AACAH,UAAQC,GAAR,CAAYG,YAAZ;AACAJ,UAAQC,GAAR,CAAYE,cAAZ;AACAH,UAAQC,GAAR,CAAYJ,UAAZ;;AAEA,MAAI;AACF;AACA;AACAG,YAAQC,GAAR,CAAY,oBAAZ;AACAD,YAAQC,GAAR,CAAY,qBAAZ;AACAD,YAAQC,GAAR,CAAY,oBAAZ;AACAD,YAAQC,GAAR,CAAY,qBAAZ;AACAD,YAAQC,GAAR,CAAYH,aAAZ;;AAEAE,YAAQC,GAAR,CAAY,IAAII,cAAJ,EAAZ;AACAL,YAAQC,GAAR,CAAY,IAAIK,eAAJ,EAAZ;AACAN,YAAQC,GAAR,CAAY,IAAIM,cAAJ,EAAZ;AACAP,YAAQC,GAAR,CAAY,IAAIK,eAAJ,EAAZ;AACAN,YAAQC,GAAR,CAAY,IAAIF,WAAJ,EAAZ;AACD,GAdD,CAcE,OAAOS,CAAP,EAAU,CAAE;AACf;;AAEM,SAASZ,OAAT,GAAkB,CAAE;;AAE3B;AACAa,QAAQC,OAAR,GAAkBC,IAAlB,CAAuB,YAAM;AAC3BC,SAAOC,gBAAP,GAA0BlB,IAA1B;AACD,CAFD,E;;;;;;;;;;;;kBC/Ce,W;;;;;;;;;;;;;ACAR,IAAMS,0BAAS,SAAf,C;;;;;;;;;;;;ACAA,IAAMU,8BAAW,aAAjB,C;;;;;;;;;;;;kBCAQ,W;AACR,IAAMV,0BAAS,SAAf,C;;;;;;;;;;;;kBCDQ,Y;;;;;;;;;;;;;ACAR,IAAMW,4BAAU,UAAhB,C;;;;;;;;;;;;ACAA,IAAMD,8BAAW,cAAjB,C;;;;;;;;;;;;kBCAQ,Y;AACR,IAAMV,0BAAS,UAAf,C;;;;;;;;;;;;kBCDQ,Y;;;;;;;;;;;;;ACAR,IAAMG,4BAAU,UAAhB,C;;;;;;;;;;;;ACAA,IAAMO,8BAAW,cAAjB,C;;;;;;;;;;;;kBCAQ,Y;AACR,IAAMV,0BAAS,UAAf,C;;;;;;;;;;;;kBCDiBY,Y;AAAT,SAASA,YAAT,GAAwB,CAAE","file":"fixtures/imported-bindings/output.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 10c0c41335992ab33745","import aDefault from \"./src/mod1\";\nimport { aNamed } from \"./src/mod2\";\nimport { original as anAliased } from \"./src/mod3\";\nimport * as aNamespace from \"./src/mod4\";\n\nimport aDefault2 from \"./src/mod5\";\nimport { aNamed2 } from \"./src/mod6\";\nimport { original as anAliased2 } from \"./src/mod7\";\nimport * as aNamespace2 from \"./src/mod8\";\n\nimport aDefault3 from \"./src/mod9\";\nimport { aNamed3 } from \"./src/mod10\";\nimport { original as anAliased3 } from \"./src/mod11\";\nimport * as aNamespace3 from \"./src/mod12\";\n\nimport optimizedOut from \"./src/optimized-out\";\noptimizedOut();\n\nexport default function root() {\n  console.log(\"pause here\", root);\n\n  console.log(aDefault);\n  console.log(anAliased);\n  console.log(aNamed);\n  console.log(anAliased);\n  console.log(aNamespace);\n\n  try {\n    // None of these are callable in this code, but we still want to make sure\n    // they map properly even if the only reference is in a call expressions.\n    console.log(aDefault2());\n    console.log(anAliased2());\n    console.log(aNamed2());\n    console.log(anAliased2());\n    console.log(aNamespace2());\n\n    console.log(new aDefault3());\n    console.log(new anAliased3());\n    console.log(new aNamed3());\n    console.log(new anAliased3());\n    console.log(new aNamespace3());\n  } catch (e) {}\n}\n\nexport function example(){}\n\n// The build harness sets the wrong global, so just override it.\nPromise.resolve().then(() => {\n  window.importedBindings = root;\n});\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/imported-bindings/input.js","export default \"a-default\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/imported-bindings/src/mod1.js","export const aNamed = \"a-named\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/imported-bindings/src/mod2.js","export const original = \"an-original\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/imported-bindings/src/mod3.js","export default \"a-default\";\nexport const aNamed = \"a-named\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/imported-bindings/src/mod4.js","export default \"a-default2\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/imported-bindings/src/mod5.js","export const aNamed2 = \"a-named2\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/imported-bindings/src/mod6.js","export const original = \"an-original2\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/imported-bindings/src/mod7.js","export default \"a-default2\";\nexport const aNamed = \"a-named2\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/imported-bindings/src/mod8.js","export default \"a-default3\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/imported-bindings/src/mod9.js","export const aNamed3 = \"a-named3\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/imported-bindings/src/mod10.js","export const original = \"an-original3\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/imported-bindings/src/mod11.js","export default \"a-default3\";\nexport const aNamed = \"a-named3\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/imported-bindings/src/mod12.js","export default function optimizedOut() {}\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/imported-bindings/src/optimized-out.js"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"sources":["webpack:///webpack/bootstrap f26be9eca6f5710ed7aa","webpack:///./fixtures/imported-bindings/input.js","webpack:///./fixtures/imported-bindings/src/mod1.js","webpack:///./fixtures/imported-bindings/src/mod2.js","webpack:///./fixtures/imported-bindings/src/mod3.js","webpack:///./fixtures/imported-bindings/src/mod4.js","webpack:///./fixtures/imported-bindings/src/mod5.js","webpack:///./fixtures/imported-bindings/src/mod6.js","webpack:///./fixtures/imported-bindings/src/mod7.js","webpack:///./fixtures/imported-bindings/src/mod8.js","webpack:///./fixtures/imported-bindings/src/mod9.js","webpack:///./fixtures/imported-bindings/src/mod10.js","webpack:///./fixtures/imported-bindings/src/mod11.js","webpack:///./fixtures/imported-bindings/src/mod12.js","webpack:///./fixtures/imported-bindings/src/optimized-out.js"],"names":["root","example","aNamespace","aNamespace2","aNamespace3","console","log","aDefault","anAliased","aNamed","anotherNamed","aDefault3","anAliased3","aNamed3","anotherNamed3","e","Promise","resolve","then","window","importedBindings","original","aNamed2","optimizedOut"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;;;;kBC3CwBA,I;QA0BRC,O,GAAAA,O;;AA5ChB;;;;AACA;;AACA;;AACA;;IAAYC,U;;AAEZ;;;;AACA;;AACA;;AACA;;IAAYC,W;;AAEZ;;;;AACA;;AACA;;AACA;;IAAYC,W;;AAEZ;;;;;;;;AACA;;AAEe,SAASJ,IAAT,GAAgB;AAC7BK,UAAQC,GAAR,CAAY,YAAZ,EAA0BN,IAA1B;;AAEAK,UAAQC,GAAR,CAAYC,aAAZ;AACAF,UAAQC,GAAR,CAAYE,cAAZ;AACAH,UAAQC,GAAR,CAAYG,YAAZ;AACAJ,UAAQC,GAAR,CAAYI,YAAZ;AACAL,UAAQC,GAAR,CAAYJ,UAAZ;;AAEA,MAAI;AACF;AACA;AACAG,YAAQC,GAAR,CAAY,oBAAZ;AACAD,YAAQC,GAAR,CAAY,qBAAZ;AACAD,YAAQC,GAAR,CAAY,oBAAZ;AACAD,YAAQC,GAAR,CAAY,oBAAZ;AACAD,YAAQC,GAAR,CAAYH,aAAZ;;AAEAE,YAAQC,GAAR,CAAY,IAAIK,cAAJ,EAAZ;AACAN,YAAQC,GAAR,CAAY,IAAIM,eAAJ,EAAZ;AACAP,YAAQC,GAAR,CAAY,IAAIO,cAAJ,EAAZ;AACAR,YAAQC,GAAR,CAAY,IAAIQ,cAAJ,EAAZ;AACAT,YAAQC,GAAR,CAAY,IAAIF,WAAJ,EAAZ;AACD,GAdD,CAcE,OAAOW,CAAP,EAAU,CAAE;AACf;;AAEM,SAASd,OAAT,GAAkB,CAAE;;AAE3B;AACAe,QAAQC,OAAR,GAAkBC,IAAlB,CAAuB,YAAM;AAC3BC,SAAOC,gBAAP,GAA0BpB,IAA1B;AACD,CAFD,E;;;;;;;;;;;;kBC/Ce,W;;;;;;;;;;;;;ACAR,IAAMS,0BAAS,SAAf,C;;;;;;;;;;;;ACAA,IAAMY,8BAAW,aAAjB,C;;;;;;;;;;;;kBCAQ,W;AACR,IAAMZ,0BAAS,SAAf,C;;;;;;;;;;;;kBCDQ,Y;;;;;;;;;;;;;ACAR,IAAMa,4BAAU,UAAhB,C;;;;;;;;;;;;ACAA,IAAMD,8BAAW,cAAjB,C;;;;;;;;;;;;kBCAQ,Y;AACR,IAAMZ,0BAAS,UAAf,C;;;;;;;;;;;;kBCDQ,Y;;;;;;;;;;;;;ACAR,IAAMI,4BAAU,UAAhB,C;;;;;;;;;;;;ACAA,IAAMQ,8BAAW,cAAjB,C;;;;;;;;;;;;kBCAQ,Y;AACR,IAAMZ,0BAAS,UAAf,C;;;;;;;;;;;;kBCDiBc,Y;AAAT,SAASA,YAAT,GAAwB,CAAE","file":"fixtures/imported-bindings/output.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap f26be9eca6f5710ed7aa","import aDefault from \"./src/mod1\";\nimport { aNamed, aNamed as anotherNamed } from \"./src/mod2\";\nimport { original as anAliased } from \"./src/mod3\";\nimport * as aNamespace from \"./src/mod4\";\n\nimport aDefault2 from \"./src/mod5\";\nimport { aNamed2, aNamed2 as anotherNamed2 } from \"./src/mod6\";\nimport { original as anAliased2 } from \"./src/mod7\";\nimport * as aNamespace2 from \"./src/mod8\";\n\nimport aDefault3 from \"./src/mod9\";\nimport { aNamed3, aNamed3 as anotherNamed3 } from \"./src/mod10\";\nimport { original as anAliased3 } from \"./src/mod11\";\nimport * as aNamespace3 from \"./src/mod12\";\n\nimport optimizedOut from \"./src/optimized-out\";\noptimizedOut();\n\nexport default function root() {\n  console.log(\"pause here\", root);\n\n  console.log(aDefault);\n  console.log(anAliased);\n  console.log(aNamed);\n  console.log(anotherNamed);\n  console.log(aNamespace);\n\n  try {\n    // None of these are callable in this code, but we still want to make sure\n    // they map properly even if the only reference is in a call expressions.\n    console.log(aDefault2());\n    console.log(anAliased2());\n    console.log(aNamed2());\n    console.log(anotherNamed2());\n    console.log(aNamespace2());\n\n    console.log(new aDefault3());\n    console.log(new anAliased3());\n    console.log(new aNamed3());\n    console.log(new anotherNamed3());\n    console.log(new aNamespace3());\n  } catch (e) {}\n}\n\nexport function example(){}\n\n// The build harness sets the wrong global, so just override it.\nPromise.resolve().then(() => {\n  window.importedBindings = root;\n});\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/imported-bindings/input.js","export default \"a-default\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/imported-bindings/src/mod1.js","export const aNamed = \"a-named\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/imported-bindings/src/mod2.js","export const original = \"an-original\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/imported-bindings/src/mod3.js","export default \"a-default\";\nexport const aNamed = \"a-named\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/imported-bindings/src/mod4.js","export default \"a-default2\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/imported-bindings/src/mod5.js","export const aNamed2 = \"a-named2\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/imported-bindings/src/mod6.js","export const original = \"an-original2\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/imported-bindings/src/mod7.js","export default \"a-default2\";\nexport const aNamed = \"a-named2\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/imported-bindings/src/mod8.js","export default \"a-default3\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/imported-bindings/src/mod9.js","export const aNamed3 = \"a-named3\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/imported-bindings/src/mod10.js","export const original = \"an-original3\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/imported-bindings/src/mod11.js","export default \"a-default3\";\nexport const aNamed = \"a-named3\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/imported-bindings/src/mod12.js","export default function optimizedOut() {}\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/imported-bindings/src/optimized-out.js"],"sourceRoot":""}
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/examples/babel/fixtures/ts-classes/input.ts
@@ -0,0 +1,54 @@
+// This file essentially reproduces an example Angular component to map testing,
+// among other typescript edge cases.
+
+import def, { decoratorFactory } from './src/mod.ts';
+
+import * as ns from './src/mod.ts';
+
+@decoratorFactory({
+  selector: 'app-root',
+})
+export class AppComponent {
+  title = 'app';
+}
+
+const fn = arg => {
+  console.log("here");
+};
+fn("arg");
+
+// Un-decorated exported classes present a mapping challege because
+// the class name is mapped to an unhelpful export assignment.
+export class ExportedOther {
+  title = 'app';
+}
+
+class AnotherThing {
+  prop = 4;
+}
+
+const ExpressionClass = class Foo {
+  prop = 4;
+};
+
+class SubDecl extends AnotherThing {
+  prop = 4;
+}
+
+let SubVar = class SubExpr extends AnotherThing {
+  prop = 4;
+};
+
+ns;
+
+const anyWindow = (<any>window);
+anyWindow.Promise.resolve().then(() => {
+  anyWindow.tsClasses = function() {
+    // This file is specifically for testing the mappings of classes and things
+    // above, which means we don't want to include _other_ references to then.
+    // To avoid having them be optimized out, we include a no-op eval.
+    eval("");
+
+    console.log("pause here");
+  };
+});
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/examples/babel/fixtures/ts-classes/output.js
@@ -0,0 +1,181 @@
+var tsClasses =
+/******/ (function(modules) { // webpackBootstrap
+/******/ 	// The module cache
+/******/ 	var installedModules = {};
+/******/
+/******/ 	// The require function
+/******/ 	function __webpack_require__(moduleId) {
+/******/
+/******/ 		// Check if module is in cache
+/******/ 		if(installedModules[moduleId]) {
+/******/ 			return installedModules[moduleId].exports;
+/******/ 		}
+/******/ 		// Create a new module (and put it into the cache)
+/******/ 		var module = installedModules[moduleId] = {
+/******/ 			i: moduleId,
+/******/ 			l: false,
+/******/ 			exports: {}
+/******/ 		};
+/******/
+/******/ 		// Execute the module function
+/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ 		// Flag the module as loaded
+/******/ 		module.l = true;
+/******/
+/******/ 		// Return the exports of the module
+/******/ 		return module.exports;
+/******/ 	}
+/******/
+/******/
+/******/ 	// expose the modules object (__webpack_modules__)
+/******/ 	__webpack_require__.m = modules;
+/******/
+/******/ 	// expose the module cache
+/******/ 	__webpack_require__.c = installedModules;
+/******/
+/******/ 	// define getter function for harmony exports
+/******/ 	__webpack_require__.d = function(exports, name, getter) {
+/******/ 		if(!__webpack_require__.o(exports, name)) {
+/******/ 			Object.defineProperty(exports, name, {
+/******/ 				configurable: false,
+/******/ 				enumerable: true,
+/******/ 				get: getter
+/******/ 			});
+/******/ 		}
+/******/ 	};
+/******/
+/******/ 	// getDefaultExport function for compatibility with non-harmony modules
+/******/ 	__webpack_require__.n = function(module) {
+/******/ 		var getter = module && module.__esModule ?
+/******/ 			function getDefault() { return module['default']; } :
+/******/ 			function getModuleExports() { return module; };
+/******/ 		__webpack_require__.d(getter, 'a', getter);
+/******/ 		return getter;
+/******/ 	};
+/******/
+/******/ 	// Object.prototype.hasOwnProperty.call
+/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ 	// __webpack_public_path__
+/******/ 	__webpack_require__.p = "";
+/******/
+/******/ 	// Load entry module and return exports
+/******/ 	return __webpack_require__(__webpack_require__.s = 1);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+exports.__esModule = true;
+function decoratorFactory(opts) {
+    return function decorator(target) {
+        return target;
+    };
+}
+exports.decoratorFactory = decoratorFactory;
+function def() { }
+exports["default"] = def;
+
+
+/***/ }),
+/* 1 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// This file essentially reproduces an example Angular component to map testing,
+// among other typescript edge cases.
+var __extends = (this && this.__extends) || (function () {
+    var extendStatics = Object.setPrototypeOf ||
+        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+    return function (d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    };
+})();
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+    return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+exports.__esModule = true;
+var mod_ts_1 = __webpack_require__(0);
+var ns = __webpack_require__(0);
+var AppComponent = /** @class */ (function () {
+    function AppComponent() {
+        this.title = 'app';
+    }
+    AppComponent = __decorate([
+        mod_ts_1.decoratorFactory({
+            selector: 'app-root'
+        })
+    ], AppComponent);
+    return AppComponent;
+}());
+exports.AppComponent = AppComponent;
+var fn = function (arg) {
+    console.log("here");
+};
+fn("arg");
+// Un-decorated exported classes present a mapping challege because
+// the class name is mapped to an unhelpful export assignment.
+var ExportedOther = /** @class */ (function () {
+    function ExportedOther() {
+        this.title = 'app';
+    }
+    return ExportedOther;
+}());
+exports.ExportedOther = ExportedOther;
+var AnotherThing = /** @class */ (function () {
+    function AnotherThing() {
+        this.prop = 4;
+    }
+    return AnotherThing;
+}());
+var ExpressionClass = /** @class */ (function () {
+    function Foo() {
+        this.prop = 4;
+    }
+    return Foo;
+}());
+var SubDecl = /** @class */ (function (_super) {
+    __extends(SubDecl, _super);
+    function SubDecl() {
+        var _this = _super !== null && _super.apply(this, arguments) || this;
+        _this.prop = 4;
+        return _this;
+    }
+    return SubDecl;
+}(AnotherThing));
+var SubVar = /** @class */ (function (_super) {
+    __extends(SubExpr, _super);
+    function SubExpr() {
+        var _this = _super !== null && _super.apply(this, arguments) || this;
+        _this.prop = 4;
+        return _this;
+    }
+    return SubExpr;
+}(AnotherThing));
+ns;
+var anyWindow = window;
+anyWindow.Promise.resolve().then(function () {
+    anyWindow.tsClasses = function () {
+        // This file is specifically for testing the mappings of classes and things
+        // above, which means we don't want to include _other_ references to then.
+        // To avoid having them be optimized out, we include a no-op eval.
+        eval("");
+        console.log("pause here");
+    };
+});
+
+
+/***/ })
+/******/ ]);
+//# sourceMappingURL=output.js.map
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/examples/babel/fixtures/ts-classes/output.js.map
@@ -0,0 +1,1 @@
+{"version":3,"sources":["webpack:///webpack/bootstrap 7e31c3e2442a7edd28bf","webpack:///./fixtures/ts-classes/src/mod.ts","webpack:///./fixtures/ts-classes/input.ts"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;AC5DA,0BAAiC,IAA0B;IACzD,OAAO,mBAAmB,MAAM;QAC9B,OAAY,MAAM,CAAC;IACrB,CAAC,CAAC;AACJ,CAAC;AAJD,4CAIC;AAED,iBAA+B,CAAC;AAAhC,yBAAgC;;;;;;;;;ACPhC,gFAAgF;AAChF,qCAAqC;;;;;;;;;;;;;;;;;;AAErC,sCAAqD;AAErD,gCAAmC;AAKnC;IAHA;QAIE,UAAK,GAAG,KAAK,CAAC;IAChB,CAAC;IAFY,YAAY;QAHxB,yBAAgB,CAAC;YAChB,QAAQ,EAAE,UAAU;SACrB,CAAC;OACW,YAAY,CAExB;IAAD,mBAAC;CAAA;AAFY,oCAAY;AAIzB,IAAM,EAAE,GAAG,aAAG;IACZ,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACtB,CAAC,CAAC;AACF,EAAE,CAAC,KAAK,CAAC,CAAC;AAEV,mEAAmE;AACnE,8DAA8D;AAC9D;IAAA;QACE,UAAK,GAAG,KAAK,CAAC;IAChB,CAAC;IAAD,oBAAC;AAAD,CAAC;AAFY,sCAAa;AAI1B;IAAA;QACE,SAAI,GAAG,CAAC,CAAC;IACX,CAAC;IAAD,mBAAC;AAAD,CAAC;AAED,IAAM,eAAe;IAAG;QACtB,SAAI,GAAG,CAAC,CAAC;IACX,CAAC;IAAD,UAAC;AAAD,CAAC,IAAC;AAEF;IAAsB,2BAAY;IAAlC;QAAA,qEAEC;QADC,UAAI,GAAG,CAAC,CAAC;;IACX,CAAC;IAAD,cAAC;AAAD,CAAC,CAFqB,YAAY,GAEjC;AAED,IAAI,MAAM;IAAyB,2BAAY;IAAlC;QAAA,qEAEZ;QADC,UAAI,GAAG,CAAC,CAAC;;IACX,CAAC;IAAD,cAAC;AAAD,CAAC,CAFkC,YAAY,EAE9C,CAAC;AAEF,EAAE,CAAC;AAEH,IAAM,SAAS,GAAS,MAAO,CAAC;AAChC,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC;IAC/B,SAAS,CAAC,SAAS,GAAG;QACpB,2EAA2E;QAC3E,0EAA0E;QAC1E,kEAAkE;QAClE,IAAI,CAAC,EAAE,CAAC,CAAC;QAET,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC5B,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","file":"fixtures/ts-classes/output.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 1);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 7e31c3e2442a7edd28bf","\nexport function decoratorFactory(opts: { selector: string }) {\n  return function decorator(target) {\n    return <any>target;\n  };\n}\n\nexport default function def() {}\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/ts-classes/src/mod.ts","// This file essentially reproduces an example Angular component to map testing,\n// among other typescript edge cases.\n\nimport def, { decoratorFactory } from './src/mod.ts';\n\nimport * as ns from './src/mod.ts';\n\n@decoratorFactory({\n  selector: 'app-root',\n})\nexport class AppComponent {\n  title = 'app';\n}\n\nconst fn = arg => {\n  console.log(\"here\");\n};\nfn(\"arg\");\n\n// Un-decorated exported classes present a mapping challege because\n// the class name is mapped to an unhelpful export assignment.\nexport class ExportedOther {\n  title = 'app';\n}\n\nclass AnotherThing {\n  prop = 4;\n}\n\nconst ExpressionClass = class Foo {\n  prop = 4;\n};\n\nclass SubDecl extends AnotherThing {\n  prop = 4;\n}\n\nlet SubVar = class SubExpr extends AnotherThing {\n  prop = 4;\n};\n\nns;\n\nconst anyWindow = (<any>window);\nanyWindow.Promise.resolve().then(() => {\n  anyWindow.tsClasses = function() {\n    // This file is specifically for testing the mappings of classes and things\n    // above, which means we don't want to include _other_ references to then.\n    // To avoid having them be optimized out, we include a no-op eval.\n    eval(\"\");\n\n    console.log(\"pause here\");\n  };\n});\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/ts-classes/input.ts"],"sourceRoot":""}
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/examples/babel/fixtures/ts-classes/src/mod.ts
@@ -0,0 +1,8 @@
+
+export function decoratorFactory(opts: { selector: string }) {
+  return function decorator(target) {
+    return <any>target;
+  };
+}
+
+export default function def() {}
--- a/devtools/client/debugger/new/test/mochitest/examples/babel/fixtures/webpack-modules-es6/input.js
+++ b/devtools/client/debugger/new/test/mochitest/examples/babel/fixtures/webpack-modules-es6/input.js
@@ -1,48 +1,48 @@
 import aDefault from "./src/mod1";
-import { aNamed } from "./src/mod2";
+import { aNamed, aNamed as anotherNamed } from "./src/mod2";
 import { original as anAliased } from "./src/mod3";
 import * as aNamespace from "./src/mod4";
 
 import aDefault2 from "./src/mod5";
-import { aNamed2 } from "./src/mod6";
+import { aNamed2, aNamed2 as anotherNamed2 } from "./src/mod6";
 import { original as anAliased2 } from "./src/mod7";
 import * as aNamespace2 from "./src/mod8";
 
 import aDefault3 from "./src/mod9";
-import { aNamed3 } from "./src/mod10";
+import { aNamed3, aNamed3 as anotherNamed3 } from "./src/mod10";
 import { original as anAliased3 } from "./src/mod11";
 import * as aNamespace3 from "./src/mod12";
 
 import optimizedOut from "./src/optimized-out";
 optimizedOut();
 
 export default function root() {
   console.log("pause here", root);
 
   console.log(aDefault);
   console.log(anAliased);
   console.log(aNamed);
-  console.log(anAliased);
+  console.log(anotherNamed);
   console.log(aNamespace);
 
   try {
     // None of these are callable in this code, but we still want to make sure
     // they map properly even if the only reference is in a call expressions.
     console.log(aDefault2());
     console.log(anAliased2());
     console.log(aNamed2());
-    console.log(anAliased2());
+    console.log(anotherNamed2());
     console.log(aNamespace2());
 
     console.log(new aDefault3());
     console.log(new anAliased3());
     console.log(new aNamed3());
-    console.log(new anAliased3());
+    console.log(new anotherNamed3());
     console.log(new aNamespace3());
   } catch (e) {}
 }
 
 export function example(){}
 
 // The build harness sets the wrong global, so just override it.
 Promise.resolve().then(() => {
--- a/devtools/client/debugger/new/test/mochitest/examples/babel/fixtures/webpack-modules-es6/output.js
+++ b/devtools/client/debugger/new/test/mochitest/examples/babel/fixtures/webpack-modules-es6/output.js
@@ -104,32 +104,32 @@ Object.defineProperty(__webpack_exports_
 Object(__WEBPACK_IMPORTED_MODULE_12__src_optimized_out__["a" /* default */])();
 
 function root() {
   console.log("pause here", root);
 
   console.log(__WEBPACK_IMPORTED_MODULE_0__src_mod1__["a" /* default */]);
   console.log(__WEBPACK_IMPORTED_MODULE_2__src_mod3__["a" /* original */]);
   console.log(__WEBPACK_IMPORTED_MODULE_1__src_mod2__["a" /* aNamed */]);
-  console.log(__WEBPACK_IMPORTED_MODULE_2__src_mod3__["a" /* original */]);
+  console.log(__WEBPACK_IMPORTED_MODULE_1__src_mod2__["a" /* aNamed */]);
   console.log(__WEBPACK_IMPORTED_MODULE_3__src_mod4__);
 
   try {
     // None of these are callable in this code, but we still want to make sure
     // they map properly even if the only reference is in a call expressions.
     console.log(Object(__WEBPACK_IMPORTED_MODULE_4__src_mod5__["a" /* default */])());
     console.log(Object(__WEBPACK_IMPORTED_MODULE_6__src_mod7__["a" /* original */])());
     console.log(Object(__WEBPACK_IMPORTED_MODULE_5__src_mod6__["a" /* aNamed2 */])());
-    console.log(Object(__WEBPACK_IMPORTED_MODULE_6__src_mod7__["a" /* original */])());
+    console.log(Object(__WEBPACK_IMPORTED_MODULE_5__src_mod6__["a" /* aNamed2 */])());
     console.log(__WEBPACK_IMPORTED_MODULE_7__src_mod8__());
 
     console.log(new __WEBPACK_IMPORTED_MODULE_8__src_mod9__["a" /* default */]());
     console.log(new __WEBPACK_IMPORTED_MODULE_10__src_mod11__["a" /* original */]());
     console.log(new __WEBPACK_IMPORTED_MODULE_9__src_mod10__["a" /* aNamed3 */]());
-    console.log(new __WEBPACK_IMPORTED_MODULE_10__src_mod11__["a" /* original */]());
+    console.log(new __WEBPACK_IMPORTED_MODULE_9__src_mod10__["a" /* aNamed3 */]());
     console.log(new __WEBPACK_IMPORTED_MODULE_11__src_mod12__());
   } catch (e) {}
 }
 
 function example() {}
 
 // The build harness sets the wrong global, so just override it.
 Promise.resolve().then(() => {
--- a/devtools/client/debugger/new/test/mochitest/examples/babel/fixtures/webpack-modules-es6/output.js.map
+++ b/devtools/client/debugger/new/test/mochitest/examples/babel/fixtures/webpack-modules-es6/output.js.map
@@ -1,1 +1,1 @@
-{"version":3,"sources":["webpack:///webpack/bootstrap ce5a3febd2184465bc3b","webpack:///./fixtures/webpack-modules-es6/input.js","webpack:///./fixtures/webpack-modules-es6/src/mod1.js","webpack:///./fixtures/webpack-modules-es6/src/mod2.js","webpack:///./fixtures/webpack-modules-es6/src/mod3.js","webpack:///./fixtures/webpack-modules-es6/src/mod4.js","webpack:///./fixtures/webpack-modules-es6/src/mod5.js","webpack:///./fixtures/webpack-modules-es6/src/mod6.js","webpack:///./fixtures/webpack-modules-es6/src/mod7.js","webpack:///./fixtures/webpack-modules-es6/src/mod8.js","webpack:///./fixtures/webpack-modules-es6/src/mod9.js","webpack:///./fixtures/webpack-modules-es6/src/mod10.js","webpack:///./fixtures/webpack-modules-es6/src/mod11.js","webpack:///./fixtures/webpack-modules-es6/src/mod12.js","webpack:///./fixtures/webpack-modules-es6/src/optimized-out.js"],"names":["optimizedOut","root","console","log","aDefault2","anAliased2","aNamed2","aNamespace2","e","example","Promise","resolve","then","window","webpackModulesEs6","aNamed","original","aNamed3"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;;;;;;;;;;;;;;;AC7DA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,4EAAAA;;AAEe,SAASC,IAAT,GAAgB;AAC7BC,UAAQC,GAAR,CAAY,YAAZ,EAA0BF,IAA1B;;AAEAC,UAAQC,GAAR,CAAY,0DAAZ;AACAD,UAAQC,GAAR,CAAY,2DAAZ;AACAD,UAAQC,GAAR,CAAY,yDAAZ;AACAD,UAAQC,GAAR,CAAY,2DAAZ;AACAD,UAAQC,GAAR,CAAY,uCAAZ;;AAEA,MAAI;AACF;AACA;AACAD,YAAQC,GAAR,CAAY,kEAAAC,EAAZ;AACAF,YAAQC,GAAR,CAAY,mEAAAE,EAAZ;AACAH,YAAQC,GAAR,CAAY,kEAAAG,EAAZ;AACAJ,YAAQC,GAAR,CAAY,mEAAAE,EAAZ;AACAH,YAAQC,GAAR,CAAY,uCAAAI,EAAZ;;AAEAL,YAAQC,GAAR,CAAY,IAAI,0DAAJ,EAAZ;AACAD,YAAQC,GAAR,CAAY,IAAI,6DAAJ,EAAZ;AACAD,YAAQC,GAAR,CAAY,IAAI,2DAAJ,EAAZ;AACAD,YAAQC,GAAR,CAAY,IAAI,6DAAJ,EAAZ;AACAD,YAAQC,GAAR,CAAY,IAAI,yCAAJ,EAAZ;AACD,GAdD,CAcE,OAAOK,CAAP,EAAU,CAAE;AACf;;AAEM,SAASC,OAAT,GAAkB,CAAE;;AAE3B;AACAC,QAAQC,OAAR,GAAkBC,IAAlB,CAAuB,MAAM;AAC3BC,SAAOC,iBAAP,GAA2Bb,IAA3B;AACD,CAFD,E;;;;;;;AC/CA,yDAAe,WAAf,E;;;;;;;ACAO,MAAMc,SAAS,SAAf,C;;;;;;;;;ACAA,MAAMC,WAAW,aAAjB,C;;;;;;;;;;ACAP,+DAAe,WAAf;AACO,MAAMD,SAAS,SAAf,C;;;;;;;;;ACDP,yDAAe,YAAf,E;;;;;;;ACAO,MAAMT,UAAU,UAAhB,C;;;;;;;;;ACAA,MAAMU,WAAW,cAAjB,C;;;;;;;;;;ACAP,+DAAe,YAAf;AACO,MAAMD,SAAS,UAAf,C;;;;;;;;;ACDP,yDAAe,YAAf,E;;;;;;;ACAO,MAAME,UAAU,UAAhB,C;;;;;;;;;ACAA,MAAMD,WAAW,cAAjB,C;;;;;;;;;;ACAP,+DAAe,YAAf;AACO,MAAMD,SAAS,UAAf,C;;;;;;;;;;ACDQ,SAASf,YAAT,GAAwB,CAAE,C","file":"fixtures/webpack-modules-es6/output.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap ce5a3febd2184465bc3b","import aDefault from \"./src/mod1\";\nimport { aNamed } from \"./src/mod2\";\nimport { original as anAliased } from \"./src/mod3\";\nimport * as aNamespace from \"./src/mod4\";\n\nimport aDefault2 from \"./src/mod5\";\nimport { aNamed2 } from \"./src/mod6\";\nimport { original as anAliased2 } from \"./src/mod7\";\nimport * as aNamespace2 from \"./src/mod8\";\n\nimport aDefault3 from \"./src/mod9\";\nimport { aNamed3 } from \"./src/mod10\";\nimport { original as anAliased3 } from \"./src/mod11\";\nimport * as aNamespace3 from \"./src/mod12\";\n\nimport optimizedOut from \"./src/optimized-out\";\noptimizedOut();\n\nexport default function root() {\n  console.log(\"pause here\", root);\n\n  console.log(aDefault);\n  console.log(anAliased);\n  console.log(aNamed);\n  console.log(anAliased);\n  console.log(aNamespace);\n\n  try {\n    // None of these are callable in this code, but we still want to make sure\n    // they map properly even if the only reference is in a call expressions.\n    console.log(aDefault2());\n    console.log(anAliased2());\n    console.log(aNamed2());\n    console.log(anAliased2());\n    console.log(aNamespace2());\n\n    console.log(new aDefault3());\n    console.log(new anAliased3());\n    console.log(new aNamed3());\n    console.log(new anAliased3());\n    console.log(new aNamespace3());\n  } catch (e) {}\n}\n\nexport function example(){}\n\n// The build harness sets the wrong global, so just override it.\nPromise.resolve().then(() => {\n  window.webpackModulesEs6 = root;\n});\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules-es6/input.js","export default \"a-default\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules-es6/src/mod1.js","export const aNamed = \"a-named\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules-es6/src/mod2.js","export const original = \"an-original\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules-es6/src/mod3.js","export default \"a-default\";\nexport const aNamed = \"a-named\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules-es6/src/mod4.js","export default \"a-default2\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules-es6/src/mod5.js","export const aNamed2 = \"a-named2\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules-es6/src/mod6.js","export const original = \"an-original2\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules-es6/src/mod7.js","export default \"a-default2\";\nexport const aNamed = \"a-named2\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules-es6/src/mod8.js","export default \"a-default3\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules-es6/src/mod9.js","export const aNamed3 = \"a-named3\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules-es6/src/mod10.js","export const original = \"an-original3\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules-es6/src/mod11.js","export default \"a-default3\";\nexport const aNamed = \"a-named3\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules-es6/src/mod12.js","export default function optimizedOut() {}\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules-es6/src/optimized-out.js"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"sources":["webpack:///webpack/bootstrap 0baaf15f35ff7d5d485d","webpack:///./fixtures/webpack-modules-es6/input.js","webpack:///./fixtures/webpack-modules-es6/src/mod1.js","webpack:///./fixtures/webpack-modules-es6/src/mod2.js","webpack:///./fixtures/webpack-modules-es6/src/mod3.js","webpack:///./fixtures/webpack-modules-es6/src/mod4.js","webpack:///./fixtures/webpack-modules-es6/src/mod5.js","webpack:///./fixtures/webpack-modules-es6/src/mod6.js","webpack:///./fixtures/webpack-modules-es6/src/mod7.js","webpack:///./fixtures/webpack-modules-es6/src/mod8.js","webpack:///./fixtures/webpack-modules-es6/src/mod9.js","webpack:///./fixtures/webpack-modules-es6/src/mod10.js","webpack:///./fixtures/webpack-modules-es6/src/mod11.js","webpack:///./fixtures/webpack-modules-es6/src/mod12.js","webpack:///./fixtures/webpack-modules-es6/src/optimized-out.js"],"names":["optimizedOut","root","console","log","aDefault2","anAliased2","aNamed2","anotherNamed2","aNamespace2","e","example","Promise","resolve","then","window","webpackModulesEs6","aNamed","original","aNamed3"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;;;;;;;;;;;;;;;AC7DA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,4EAAAA;;AAEe,SAASC,IAAT,GAAgB;AAC7BC,UAAQC,GAAR,CAAY,YAAZ,EAA0BF,IAA1B;;AAEAC,UAAQC,GAAR,CAAY,0DAAZ;AACAD,UAAQC,GAAR,CAAY,2DAAZ;AACAD,UAAQC,GAAR,CAAY,yDAAZ;AACAD,UAAQC,GAAR,CAAY,yDAAZ;AACAD,UAAQC,GAAR,CAAY,uCAAZ;;AAEA,MAAI;AACF;AACA;AACAD,YAAQC,GAAR,CAAY,kEAAAC,EAAZ;AACAF,YAAQC,GAAR,CAAY,mEAAAE,EAAZ;AACAH,YAAQC,GAAR,CAAY,kEAAAG,EAAZ;AACAJ,YAAQC,GAAR,CAAY,kEAAAI,EAAZ;AACAL,YAAQC,GAAR,CAAY,uCAAAK,EAAZ;;AAEAN,YAAQC,GAAR,CAAY,IAAI,0DAAJ,EAAZ;AACAD,YAAQC,GAAR,CAAY,IAAI,6DAAJ,EAAZ;AACAD,YAAQC,GAAR,CAAY,IAAI,2DAAJ,EAAZ;AACAD,YAAQC,GAAR,CAAY,IAAI,2DAAJ,EAAZ;AACAD,YAAQC,GAAR,CAAY,IAAI,yCAAJ,EAAZ;AACD,GAdD,CAcE,OAAOM,CAAP,EAAU,CAAE;AACf;;AAEM,SAASC,OAAT,GAAkB,CAAE;;AAE3B;AACAC,QAAQC,OAAR,GAAkBC,IAAlB,CAAuB,MAAM;AAC3BC,SAAOC,iBAAP,GAA2Bd,IAA3B;AACD,CAFD,E;;;;;;;AC/CA,yDAAe,WAAf,E;;;;;;;ACAO,MAAMe,SAAS,SAAf,C;;;;;;;;;ACAA,MAAMC,WAAW,aAAjB,C;;;;;;;;;;ACAP,+DAAe,WAAf;AACO,MAAMD,SAAS,SAAf,C;;;;;;;;;ACDP,yDAAe,YAAf,E;;;;;;;ACAO,MAAMV,UAAU,UAAhB,C;;;;;;;;;ACAA,MAAMW,WAAW,cAAjB,C;;;;;;;;;;ACAP,+DAAe,YAAf;AACO,MAAMD,SAAS,UAAf,C;;;;;;;;;ACDP,yDAAe,YAAf,E;;;;;;;ACAO,MAAME,UAAU,UAAhB,C;;;;;;;;;ACAA,MAAMD,WAAW,cAAjB,C;;;;;;;;;;ACAP,+DAAe,YAAf;AACO,MAAMD,SAAS,UAAf,C;;;;;;;;;;ACDQ,SAAShB,YAAT,GAAwB,CAAE,C","file":"fixtures/webpack-modules-es6/output.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 0baaf15f35ff7d5d485d","import aDefault from \"./src/mod1\";\nimport { aNamed, aNamed as anotherNamed } from \"./src/mod2\";\nimport { original as anAliased } from \"./src/mod3\";\nimport * as aNamespace from \"./src/mod4\";\n\nimport aDefault2 from \"./src/mod5\";\nimport { aNamed2, aNamed2 as anotherNamed2 } from \"./src/mod6\";\nimport { original as anAliased2 } from \"./src/mod7\";\nimport * as aNamespace2 from \"./src/mod8\";\n\nimport aDefault3 from \"./src/mod9\";\nimport { aNamed3, aNamed3 as anotherNamed3 } from \"./src/mod10\";\nimport { original as anAliased3 } from \"./src/mod11\";\nimport * as aNamespace3 from \"./src/mod12\";\n\nimport optimizedOut from \"./src/optimized-out\";\noptimizedOut();\n\nexport default function root() {\n  console.log(\"pause here\", root);\n\n  console.log(aDefault);\n  console.log(anAliased);\n  console.log(aNamed);\n  console.log(anotherNamed);\n  console.log(aNamespace);\n\n  try {\n    // None of these are callable in this code, but we still want to make sure\n    // they map properly even if the only reference is in a call expressions.\n    console.log(aDefault2());\n    console.log(anAliased2());\n    console.log(aNamed2());\n    console.log(anotherNamed2());\n    console.log(aNamespace2());\n\n    console.log(new aDefault3());\n    console.log(new anAliased3());\n    console.log(new aNamed3());\n    console.log(new anotherNamed3());\n    console.log(new aNamespace3());\n  } catch (e) {}\n}\n\nexport function example(){}\n\n// The build harness sets the wrong global, so just override it.\nPromise.resolve().then(() => {\n  window.webpackModulesEs6 = root;\n});\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules-es6/input.js","export default \"a-default\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules-es6/src/mod1.js","export const aNamed = \"a-named\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules-es6/src/mod2.js","export const original = \"an-original\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules-es6/src/mod3.js","export default \"a-default\";\nexport const aNamed = \"a-named\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules-es6/src/mod4.js","export default \"a-default2\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules-es6/src/mod5.js","export const aNamed2 = \"a-named2\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules-es6/src/mod6.js","export const original = \"an-original2\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules-es6/src/mod7.js","export default \"a-default2\";\nexport const aNamed = \"a-named2\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules-es6/src/mod8.js","export default \"a-default3\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules-es6/src/mod9.js","export const aNamed3 = \"a-named3\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules-es6/src/mod10.js","export const original = \"an-original3\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules-es6/src/mod11.js","export default \"a-default3\";\nexport const aNamed = \"a-named3\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules-es6/src/mod12.js","export default function optimizedOut() {}\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules-es6/src/optimized-out.js"],"sourceRoot":""}
\ No newline at end of file
--- a/devtools/client/debugger/new/test/mochitest/examples/babel/fixtures/webpack-modules/input.js
+++ b/devtools/client/debugger/new/test/mochitest/examples/babel/fixtures/webpack-modules/input.js
@@ -1,48 +1,48 @@
 import aDefault from "./src/mod1";
-import { aNamed } from "./src/mod2";
+import { aNamed, aNamed as anotherNamed } from "./src/mod2";
 import { original as anAliased } from "./src/mod3";
 import * as aNamespace from "./src/mod4";
 
 import aDefault2 from "./src/mod5";
-import { aNamed2 } from "./src/mod6";
+import { aNamed2, aNamed2 as anotherNamed2 } from "./src/mod6";
 import { original as anAliased2 } from "./src/mod7";
 import * as aNamespace2 from "./src/mod8";
 
 import aDefault3 from "./src/mod9";
-import { aNamed3 } from "./src/mod10";
+import { aNamed3, aNamed3 as anotherNamed3 } from "./src/mod10";
 import { original as anAliased3 } from "./src/mod11";
 import * as aNamespace3 from "./src/mod12";
 
 import optimizedOut from "./src/optimized-out";
 optimizedOut();
 
 export default function root() {
   console.log("pause here", root);
 
   console.log(aDefault);
   console.log(anAliased);
   console.log(aNamed);
-  console.log(anAliased);
+  console.log(anotherNamed);
   console.log(aNamespace);
 
   try {
     // None of these are callable in this code, but we still want to make sure
     // they map properly even if the only reference is in a call expressions.
     console.log(aDefault2());
     console.log(anAliased2());
     console.log(aNamed2());
-    console.log(anAliased2());
+    console.log(anotherNamed2());
     console.log(aNamespace2());
 
     console.log(new aDefault3());
     console.log(new anAliased3());
     console.log(new aNamed3());
-    console.log(new anAliased3());
+    console.log(new anotherNamed3());
     console.log(new aNamespace3());
   } catch (e) {}
 }
 
 export function example(){}
 
 // The build harness sets the wrong global, so just override it.
 Promise.resolve().then(() => {
--- a/devtools/client/debugger/new/test/mochitest/examples/babel/fixtures/webpack-modules/output.js
+++ b/devtools/client/debugger/new/test/mochitest/examples/babel/fixtures/webpack-modules/output.js
@@ -104,32 +104,32 @@ Object.defineProperty(__webpack_exports_
 Object(__WEBPACK_IMPORTED_MODULE_12__src_optimized_out__["a" /* default */])();
 
 function root() {
   console.log("pause here", root);
 
   console.log(__WEBPACK_IMPORTED_MODULE_0__src_mod1__["a" /* default */]);
   console.log(__WEBPACK_IMPORTED_MODULE_2__src_mod3__["a" /* original */]);
   console.log(__WEBPACK_IMPORTED_MODULE_1__src_mod2__["a" /* aNamed */]);
-  console.log(__WEBPACK_IMPORTED_MODULE_2__src_mod3__["a" /* original */]);
+  console.log(__WEBPACK_IMPORTED_MODULE_1__src_mod2__["a" /* aNamed */]);
   console.log(__WEBPACK_IMPORTED_MODULE_3__src_mod4__);
 
   try {
     // None of these are callable in this code, but we still want to make sure
     // they map properly even if the only reference is in a call expressions.
     console.log(Object(__WEBPACK_IMPORTED_MODULE_4__src_mod5__["a" /* default */])());
     console.log(Object(__WEBPACK_IMPORTED_MODULE_6__src_mod7__["a" /* original */])());
     console.log(Object(__WEBPACK_IMPORTED_MODULE_5__src_mod6__["a" /* aNamed2 */])());
-    console.log(Object(__WEBPACK_IMPORTED_MODULE_6__src_mod7__["a" /* original */])());
+    console.log(Object(__WEBPACK_IMPORTED_MODULE_5__src_mod6__["a" /* aNamed2 */])());
     console.log(__WEBPACK_IMPORTED_MODULE_7__src_mod8__());
 
     console.log(new __WEBPACK_IMPORTED_MODULE_8__src_mod9__["a" /* default */]());
     console.log(new __WEBPACK_IMPORTED_MODULE_10__src_mod11__["a" /* original */]());
     console.log(new __WEBPACK_IMPORTED_MODULE_9__src_mod10__["a" /* aNamed3 */]());
-    console.log(new __WEBPACK_IMPORTED_MODULE_10__src_mod11__["a" /* original */]());
+    console.log(new __WEBPACK_IMPORTED_MODULE_9__src_mod10__["a" /* aNamed3 */]());
     console.log(new __WEBPACK_IMPORTED_MODULE_11__src_mod12__());
   } catch (e) {}
 }
 
 function example() {}
 
 // The build harness sets the wrong global, so just override it.
 Promise.resolve().then(function () {
--- a/devtools/client/debugger/new/test/mochitest/examples/babel/fixtures/webpack-modules/output.js.map
+++ b/devtools/client/debugger/new/test/mochitest/examples/babel/fixtures/webpack-modules/output.js.map
@@ -1,1 +1,1 @@
-{"version":3,"sources":["webpack:///webpack/bootstrap bc0f05c10dc0e0831af0","webpack:///./fixtures/webpack-modules/input.js","webpack:///./fixtures/webpack-modules/src/mod1.js","webpack:///./fixtures/webpack-modules/src/mod2.js","webpack:///./fixtures/webpack-modules/src/mod3.js","webpack:///./fixtures/webpack-modules/src/mod4.js","webpack:///./fixtures/webpack-modules/src/mod5.js","webpack:///./fixtures/webpack-modules/src/mod6.js","webpack:///./fixtures/webpack-modules/src/mod7.js","webpack:///./fixtures/webpack-modules/src/mod8.js","webpack:///./fixtures/webpack-modules/src/mod9.js","webpack:///./fixtures/webpack-modules/src/mod10.js","webpack:///./fixtures/webpack-modules/src/mod11.js","webpack:///./fixtures/webpack-modules/src/mod12.js","webpack:///./fixtures/webpack-modules/src/optimized-out.js"],"names":["optimizedOut","root","console","log","aDefault2","anAliased2","aNamed2","aNamespace2","e","example","Promise","resolve","then","window","webpackModules","aNamed","original","aNamed3"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;;;;;;;;;;;;;;;AC7DA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,4EAAAA;;AAEe,SAASC,IAAT,GAAgB;AAC7BC,UAAQC,GAAR,CAAY,YAAZ,EAA0BF,IAA1B;;AAEAC,UAAQC,GAAR,CAAY,0DAAZ;AACAD,UAAQC,GAAR,CAAY,2DAAZ;AACAD,UAAQC,GAAR,CAAY,yDAAZ;AACAD,UAAQC,GAAR,CAAY,2DAAZ;AACAD,UAAQC,GAAR,CAAY,uCAAZ;;AAEA,MAAI;AACF;AACA;AACAD,YAAQC,GAAR,CAAY,kEAAAC,EAAZ;AACAF,YAAQC,GAAR,CAAY,mEAAAE,EAAZ;AACAH,YAAQC,GAAR,CAAY,kEAAAG,EAAZ;AACAJ,YAAQC,GAAR,CAAY,mEAAAE,EAAZ;AACAH,YAAQC,GAAR,CAAY,uCAAAI,EAAZ;;AAEAL,YAAQC,GAAR,CAAY,IAAI,0DAAJ,EAAZ;AACAD,YAAQC,GAAR,CAAY,IAAI,6DAAJ,EAAZ;AACAD,YAAQC,GAAR,CAAY,IAAI,2DAAJ,EAAZ;AACAD,YAAQC,GAAR,CAAY,IAAI,6DAAJ,EAAZ;AACAD,YAAQC,GAAR,CAAY,IAAI,yCAAJ,EAAZ;AACD,GAdD,CAcE,OAAOK,CAAP,EAAU,CAAE;AACf;;AAEM,SAASC,OAAT,GAAkB,CAAE;;AAE3B;AACAC,QAAQC,OAAR,GAAkBC,IAAlB,CAAuB,YAAM;AAC3BC,SAAOC,cAAP,GAAwBb,IAAxB;AACD,CAFD,E;;;;;;;AC/CA,yDAAe,WAAf,E;;;;;;;;ACAO,IAAMc,SAAS,SAAf,C;;;;;;;;ACAA,IAAMC,WAAW,aAAjB,C;;;;;;;;;ACAP,+DAAe,WAAf;AACO,IAAMD,SAAS,SAAf,C;;;;;;;ACDP,yDAAe,YAAf,E;;;;;;;;ACAO,IAAMT,UAAU,UAAhB,C;;;;;;;;ACAA,IAAMU,WAAW,cAAjB,C;;;;;;;;;ACAP,+DAAe,YAAf;AACO,IAAMD,SAAS,UAAf,C;;;;;;;ACDP,yDAAe,YAAf,E;;;;;;;;ACAO,IAAME,UAAU,UAAhB,C;;;;;;;;ACAA,IAAMD,WAAW,cAAjB,C;;;;;;;;;ACAP,+DAAe,YAAf;AACO,IAAMD,SAAS,UAAf,C;;;;;;;;ACDQ,SAASf,YAAT,GAAwB,CAAE,C","file":"fixtures/webpack-modules/output.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap bc0f05c10dc0e0831af0","import aDefault from \"./src/mod1\";\nimport { aNamed } from \"./src/mod2\";\nimport { original as anAliased } from \"./src/mod3\";\nimport * as aNamespace from \"./src/mod4\";\n\nimport aDefault2 from \"./src/mod5\";\nimport { aNamed2 } from \"./src/mod6\";\nimport { original as anAliased2 } from \"./src/mod7\";\nimport * as aNamespace2 from \"./src/mod8\";\n\nimport aDefault3 from \"./src/mod9\";\nimport { aNamed3 } from \"./src/mod10\";\nimport { original as anAliased3 } from \"./src/mod11\";\nimport * as aNamespace3 from \"./src/mod12\";\n\nimport optimizedOut from \"./src/optimized-out\";\noptimizedOut();\n\nexport default function root() {\n  console.log(\"pause here\", root);\n\n  console.log(aDefault);\n  console.log(anAliased);\n  console.log(aNamed);\n  console.log(anAliased);\n  console.log(aNamespace);\n\n  try {\n    // None of these are callable in this code, but we still want to make sure\n    // they map properly even if the only reference is in a call expressions.\n    console.log(aDefault2());\n    console.log(anAliased2());\n    console.log(aNamed2());\n    console.log(anAliased2());\n    console.log(aNamespace2());\n\n    console.log(new aDefault3());\n    console.log(new anAliased3());\n    console.log(new aNamed3());\n    console.log(new anAliased3());\n    console.log(new aNamespace3());\n  } catch (e) {}\n}\n\nexport function example(){}\n\n// The build harness sets the wrong global, so just override it.\nPromise.resolve().then(() => {\n  window.webpackModules = root;\n});\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules/input.js","export default \"a-default\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules/src/mod1.js","export const aNamed = \"a-named\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules/src/mod2.js","export const original = \"an-original\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules/src/mod3.js","export default \"a-default\";\nexport const aNamed = \"a-named\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules/src/mod4.js","export default \"a-default2\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules/src/mod5.js","export const aNamed2 = \"a-named2\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules/src/mod6.js","export const original = \"an-original2\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules/src/mod7.js","export default \"a-default2\";\nexport const aNamed = \"a-named2\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules/src/mod8.js","export default \"a-default3\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules/src/mod9.js","export const aNamed3 = \"a-named3\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules/src/mod10.js","export const original = \"an-original3\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules/src/mod11.js","export default \"a-default3\";\nexport const aNamed = \"a-named3\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules/src/mod12.js","export default function optimizedOut() {}\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules/src/optimized-out.js"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"sources":["webpack:///webpack/bootstrap 51f9a8fc19bc76a32b9c","webpack:///./fixtures/webpack-modules/input.js","webpack:///./fixtures/webpack-modules/src/mod1.js","webpack:///./fixtures/webpack-modules/src/mod2.js","webpack:///./fixtures/webpack-modules/src/mod3.js","webpack:///./fixtures/webpack-modules/src/mod4.js","webpack:///./fixtures/webpack-modules/src/mod5.js","webpack:///./fixtures/webpack-modules/src/mod6.js","webpack:///./fixtures/webpack-modules/src/mod7.js","webpack:///./fixtures/webpack-modules/src/mod8.js","webpack:///./fixtures/webpack-modules/src/mod9.js","webpack:///./fixtures/webpack-modules/src/mod10.js","webpack:///./fixtures/webpack-modules/src/mod11.js","webpack:///./fixtures/webpack-modules/src/mod12.js","webpack:///./fixtures/webpack-modules/src/optimized-out.js"],"names":["optimizedOut","root","console","log","aDefault2","anAliased2","aNamed2","anotherNamed2","aNamespace2","e","example","Promise","resolve","then","window","webpackModules","aNamed","original","aNamed3"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;;;;;;;;;;;;;;;AC7DA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA,4EAAAA;;AAEe,SAASC,IAAT,GAAgB;AAC7BC,UAAQC,GAAR,CAAY,YAAZ,EAA0BF,IAA1B;;AAEAC,UAAQC,GAAR,CAAY,0DAAZ;AACAD,UAAQC,GAAR,CAAY,2DAAZ;AACAD,UAAQC,GAAR,CAAY,yDAAZ;AACAD,UAAQC,GAAR,CAAY,yDAAZ;AACAD,UAAQC,GAAR,CAAY,uCAAZ;;AAEA,MAAI;AACF;AACA;AACAD,YAAQC,GAAR,CAAY,kEAAAC,EAAZ;AACAF,YAAQC,GAAR,CAAY,mEAAAE,EAAZ;AACAH,YAAQC,GAAR,CAAY,kEAAAG,EAAZ;AACAJ,YAAQC,GAAR,CAAY,kEAAAI,EAAZ;AACAL,YAAQC,GAAR,CAAY,uCAAAK,EAAZ;;AAEAN,YAAQC,GAAR,CAAY,IAAI,0DAAJ,EAAZ;AACAD,YAAQC,GAAR,CAAY,IAAI,6DAAJ,EAAZ;AACAD,YAAQC,GAAR,CAAY,IAAI,2DAAJ,EAAZ;AACAD,YAAQC,GAAR,CAAY,IAAI,2DAAJ,EAAZ;AACAD,YAAQC,GAAR,CAAY,IAAI,yCAAJ,EAAZ;AACD,GAdD,CAcE,OAAOM,CAAP,EAAU,CAAE;AACf;;AAEM,SAASC,OAAT,GAAkB,CAAE;;AAE3B;AACAC,QAAQC,OAAR,GAAkBC,IAAlB,CAAuB,YAAM;AAC3BC,SAAOC,cAAP,GAAwBd,IAAxB;AACD,CAFD,E;;;;;;;AC/CA,yDAAe,WAAf,E;;;;;;;;ACAO,IAAMe,SAAS,SAAf,C;;;;;;;;ACAA,IAAMC,WAAW,aAAjB,C;;;;;;;;;ACAP,+DAAe,WAAf;AACO,IAAMD,SAAS,SAAf,C;;;;;;;ACDP,yDAAe,YAAf,E;;;;;;;;ACAO,IAAMV,UAAU,UAAhB,C;;;;;;;;ACAA,IAAMW,WAAW,cAAjB,C;;;;;;;;;ACAP,+DAAe,YAAf;AACO,IAAMD,SAAS,UAAf,C;;;;;;;ACDP,yDAAe,YAAf,E;;;;;;;;ACAO,IAAME,UAAU,UAAhB,C;;;;;;;;ACAA,IAAMD,WAAW,cAAjB,C;;;;;;;;;ACAP,+DAAe,YAAf;AACO,IAAMD,SAAS,UAAf,C;;;;;;;;ACDQ,SAAShB,YAAT,GAAwB,CAAE,C","file":"fixtures/webpack-modules/output.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 51f9a8fc19bc76a32b9c","import aDefault from \"./src/mod1\";\nimport { aNamed, aNamed as anotherNamed } from \"./src/mod2\";\nimport { original as anAliased } from \"./src/mod3\";\nimport * as aNamespace from \"./src/mod4\";\n\nimport aDefault2 from \"./src/mod5\";\nimport { aNamed2, aNamed2 as anotherNamed2 } from \"./src/mod6\";\nimport { original as anAliased2 } from \"./src/mod7\";\nimport * as aNamespace2 from \"./src/mod8\";\n\nimport aDefault3 from \"./src/mod9\";\nimport { aNamed3, aNamed3 as anotherNamed3 } from \"./src/mod10\";\nimport { original as anAliased3 } from \"./src/mod11\";\nimport * as aNamespace3 from \"./src/mod12\";\n\nimport optimizedOut from \"./src/optimized-out\";\noptimizedOut();\n\nexport default function root() {\n  console.log(\"pause here\", root);\n\n  console.log(aDefault);\n  console.log(anAliased);\n  console.log(aNamed);\n  console.log(anotherNamed);\n  console.log(aNamespace);\n\n  try {\n    // None of these are callable in this code, but we still want to make sure\n    // they map properly even if the only reference is in a call expressions.\n    console.log(aDefault2());\n    console.log(anAliased2());\n    console.log(aNamed2());\n    console.log(anotherNamed2());\n    console.log(aNamespace2());\n\n    console.log(new aDefault3());\n    console.log(new anAliased3());\n    console.log(new aNamed3());\n    console.log(new anotherNamed3());\n    console.log(new aNamespace3());\n  } catch (e) {}\n}\n\nexport function example(){}\n\n// The build harness sets the wrong global, so just override it.\nPromise.resolve().then(() => {\n  window.webpackModules = root;\n});\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules/input.js","export default \"a-default\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules/src/mod1.js","export const aNamed = \"a-named\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules/src/mod2.js","export const original = \"an-original\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules/src/mod3.js","export default \"a-default\";\nexport const aNamed = \"a-named\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules/src/mod4.js","export default \"a-default2\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules/src/mod5.js","export const aNamed2 = \"a-named2\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules/src/mod6.js","export const original = \"an-original2\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules/src/mod7.js","export default \"a-default2\";\nexport const aNamed = \"a-named2\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules/src/mod8.js","export default \"a-default3\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules/src/mod9.js","export const aNamed3 = \"a-named3\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules/src/mod10.js","export const original = \"an-original3\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules/src/mod11.js","export default \"a-default3\";\nexport const aNamed = \"a-named3\";\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules/src/mod12.js","export default function optimizedOut() {}\n\n\n\n// WEBPACK FOOTER //\n// ./fixtures/webpack-modules/src/optimized-out.js"],"sourceRoot":""}
\ No newline at end of file
--- a/devtools/client/debugger/new/test/mochitest/examples/babel/package.json
+++ b/devtools/client/debugger/new/test/mochitest/examples/babel/package.json
@@ -10,15 +10,17 @@
   "author": "",
   "license": "MPL-2.0",
   "devDependencies": {
     "babel-core": "^6.26.0",
     "babel-loader": "^7.1.2",
     "babel-plugin-add-module-exports": "^0.2.1",
     "babel-plugin-transform-flow-strip-types": "^6.22.0",
     "babel-preset-env": "^1.6.1",
+    "ts-loader": "3.5",
+    "typescript": "^2.8.3",
     "webpack": "^3.7.1"
   },
   "dependencies": {
     "babel-polyfill": "^6.26.0",
     "lodash": "^4.17.5"
   }
 }
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/examples/babel/tsconfig.json
@@ -0,0 +1,10 @@
+{
+  "compilerOptions": {
+    "sourceMap": true,
+    "experimentalDecorators": true
+  },
+  "include": [
+    "fixtures/*/input.ts",
+    "fixtures/*/src/*.ts"
+  ]
+}
--- a/devtools/client/debugger/new/test/mochitest/examples/babel/webpack.config.js
+++ b/devtools/client/debugger/new/test/mochitest/examples/babel/webpack.config.js
@@ -4,20 +4,23 @@ const _ = require("lodash");
 
 const fixtures = path.join(__dirname, "fixtures");
 
 const tests = fs.readdirSync(fixtures).map(name => {
   if (name[0] === ".") return;
 
   const dirname = path.relative(__dirname, path.join(fixtures, name));
 
+  const inputTS = path.join(dirname, "input.ts");
+  const inputJS = path.join(dirname, "input.js");
+
   return {
     name: _.camelCase(name),
     dirname,
-    input: `./${path.join(dirname, "input.js")}`,
+    input: `./${fs.existsSync(inputTS) ? inputTS : inputJS}`,
     output: path.join(dirname, "output.js")
   };
 }).filter(Boolean);
 
 const html = path.join(__dirname, "..", "doc-babel.html");
 
 fs.writeFileSync(
   html,
@@ -63,31 +66,37 @@ module.exports = [
         path: __dirname,
         filename: output,
 
         libraryTarget: "var",
         library: name
       },
       devtool,
       module: {
-        loaders: babelEnabled
-          ? [
-              {
+        loaders: [
+          babelEnabled
+            ? {
                 test: /\.js$/,
                 exclude: /node_modules/,
                 loader: "babel-loader",
                 options: {
                   babelrc: false,
                   presets: babelEnv
                     ? [["env", { modules: babelModules ? "commonjs" : false }]]
                     : [],
                   plugins:
                     (babelEnv && babelModules ? ["add-module-exports"] : []).concat([
                       "babel-plugin-transform-flow-strip-types",
                     ])
                 }
               }
-            ]
-          : []
+            : null,
+          {
+            test: /\.tsx?$/,
+            exclude: /node_modules/,
+            loader: "ts-loader",
+            options: {}
+          }
+        ].filter(Boolean)
       }
     };
   })
 );
--- a/devtools/client/debugger/new/test/mochitest/examples/doc-babel.html
+++ b/devtools/client/debugger/new/test/mochitest/examples/doc-babel.html
@@ -52,16 +52,18 @@
     <script src="babel/fixtures/step-over-regenerator-await/output.js"></script>
     <button onclick="stepOverRegeneratorAwait()">Run stepOverRegeneratorAwait</button>
     <script src="babel/fixtures/switches/output.js"></script>
     <button onclick="switches()">Run switches</button>
     <script src="babel/fixtures/this-arguments-bindings/output.js"></script>
     <button onclick="thisArgumentsBindings()">Run thisArgumentsBindings</button>
     <script src="babel/fixtures/try-catches/output.js"></script>
     <button onclick="tryCatches()">Run tryCatches</button>
+    <script src="babel/fixtures/ts-classes/output.js"></script>
+    <button onclick="tsClasses()">Run tsClasses</button>
     <script src="babel/fixtures/webpack-modules/output.js"></script>
     <button onclick="webpackModules()">Run webpackModules</button>
     <script src="babel/fixtures/webpack-modules-es6/output.js"></script>
     <button onclick="webpackModulesEs6()">Run webpackModulesEs6</button>
     <script src="babel/fixtures/webpack-standalone/output.js"></script>
     <button onclick="webpackStandalone()">Run webpackStandalone</button>
     <!-- INJECTED-END -->
   </body>
--- a/devtools/client/debugger/new/test/mochitest/head.js
+++ b/devtools/client/debugger/new/test/mochitest/head.js
@@ -33,1268 +33,29 @@
  */
 
 // shared-head.js handles imports, constants, and utility functions
 Services.scriptloader.loadSubScript(
   "chrome://mochitests/content/browser/devtools/client/shared/test/shared-head.js",
   this
 );
 
-var { Toolbox } = require("devtools/client/framework/toolbox");
-var { Task } = require("devtools/shared/task");
-
-const sourceUtils = {
-  isLoaded: source => source.get("loadedState") === "loaded"
-};
+Services.scriptloader.loadSubScript(
+  "chrome://mochitests/content/browser/devtools/client/debugger/new/test/mochitest/helpers.js",
+  this);
 
 const EXAMPLE_URL =
   "http://example.com/browser/devtools/client/debugger/new/test/mochitest/examples/";
 
 Services.prefs.setBoolPref("devtools.debugger.new-debugger-frontend", true);
 
 registerCleanupFunction(() => {
   Services.prefs.clearUserPref("devtools.debugger.new-debugger-frontend");
-  delete window.resumeTest;
 });
 
-function log(msg, data) {
-  info(`${msg} ${!data ? "" : JSON.stringify(data)}`);
-}
-
-function logThreadEvents(dbg, event) {
-  const thread = dbg.toolbox.threadClient;
-
-  thread.addListener(event, function onEvent(eventName, ...args) {
-    info(`Thread event '${eventName}' fired.`);
-  });
-}
-
-async function waitFor(condition) {
-  await BrowserTestUtils.waitForCondition(condition, "waitFor", 10, 500);
-  return condition();
-}
-
-// Wait until an action of `type` is dispatched. This is different
-// then `_afterDispatchDone` because it doesn't wait for async actions
-// to be done/errored. Use this if you want to listen for the "start"
-// action of an async operation (somewhat rare).
-function waitForNextDispatch(store, type) {
-  return new Promise(resolve => {
-    store.dispatch({
-      // Normally we would use `services.WAIT_UNTIL`, but use the
-      // internal name here so tests aren't forced to always pass it
-      // in
-      type: "@@service/waitUntil",
-      predicate: action => action.type === type,
-      run: (dispatch, getState, action) => {
-        resolve(action);
-      }
-    });
-  });
-}
-
-// Wait until an action of `type` is dispatched. If it's part of an
-// async operation, wait until the `status` field is "done" or "error"
-function _afterDispatchDone(store, type) {
-  return new Promise(resolve => {
-    store.dispatch({
-      // Normally we would use `services.WAIT_UNTIL`, but use the
-      // internal name here so tests aren't forced to always pass it
-      // in
-      type: "@@service/waitUntil",
-      predicate: action => {
-        if (action.type === type) {
-          return action.status
-            ? action.status === "done" || action.status === "error"
-            : true;
-        }
-      },
-      run: (dispatch, getState, action) => {
-        resolve(action);
-      }
-    });
-  });
-}
-
-/**
- * Wait for a specific action type to be dispatch.
- * If an async action, will wait for it to be done.
- *
- * @memberof mochitest/waits
- * @param {Object} dbg
- * @param {String} type
- * @param {Number} eventRepeat
- * @return {Promise}
- * @static
- */
-function waitForDispatch(dbg, type, eventRepeat = 1) {
-  let count = 0;
-
-  return Task.spawn(function*() {
-    info(`Waiting for ${type} to dispatch ${eventRepeat} time(s)`);
-    while (count < eventRepeat) {
-      yield _afterDispatchDone(dbg.store, type);
-      count++;
-      info(`${type} dispatched ${count} time(s)`);
-    }
-  });
-}
-
-/**
- * Waits for specific thread events.
- *
- * @memberof mochitest/waits
- * @param {Object} dbg
- * @param {String} eventName
- * @return {Promise}
- * @static
- */
-function waitForThreadEvents(dbg, eventName) {
-  info(`Waiting for thread event '${eventName}' to fire.`);
-  const thread = dbg.toolbox.threadClient;
-
-  return new Promise(function(resolve, reject) {
-    thread.addListener(eventName, function onEvent(eventName, ...args) {
-      info(`Thread event '${eventName}' fired.`);
-      thread.removeListener(eventName, onEvent);
-      resolve.apply(resolve, args);
-    });
-  });
-}
-
-/**
- * Waits for `predicate(state)` to be true. `state` is the redux app state.
- *
- * @memberof mochitest/waits
- * @param {Object} dbg
- * @param {Function} predicate
- * @return {Promise}
- * @static
- */
-function waitForState(dbg, predicate, msg) {
-  return new Promise(resolve => {
-    info(`Waiting for state change: ${msg || ""}`);
-    if (predicate(dbg.store.getState())) {
-      info(`Finished waiting for state change: ${msg || ""}`);
-      return resolve();
-    }
-
-    const unsubscribe = dbg.store.subscribe(() => {
-      const result = predicate(dbg.store.getState());
-      if (result) {
-        info(`Finished waiting for state change: ${msg || ""}`);
-        unsubscribe();
-        resolve(result);
-      }
-    });
-  });
-}
-
-/**
- * Waits for sources to be loaded.
- *
- * @memberof mochitest/waits
- * @param {Object} dbg
- * @param {Array} sources
- * @return {Promise}
- * @static
- */
-async function waitForSources(dbg, ...sources) {
-  const { selectors: { getSources }, store } = dbg;
-  if (sources.length === 0) {
-    return Promise.resolve();
-  }
-
-  info(`Waiting on sources: ${sources.join(", ")}`);
-  await Promise.all(
-    sources.map(url => {
-      if (!sourceExists(dbg, url)) {
-        return waitForState(
-          dbg,
-          () => sourceExists(dbg, url),
-          `source ${url} exists`
-        );
-      }
-    })
-  );
-
-  info(`Finished waiting on sources: ${sources.join(", ")}`);
-}
-
-/**
- * Waits for a source to be loaded.
- *
- * @memberof mochitest/waits
- * @param {Object} dbg
- * @param {String} source
- * @return {Promise}
- * @static
- */
-function waitForSource(dbg, url) {
-  return waitForState(
-    dbg,
-    state => {
-      const sources = dbg.selectors.getSources(state);
-      return sources.find(s => (s.get("url") || "").includes(url));
-    },
-    `source exists`
-  );
-}
-
-async function waitForElement(dbg, name) {
-  await waitUntil(() => findElement(dbg, name));
-  return findElement(dbg, name);
-}
-
-async function waitForElementWithSelector(dbg, selector) {
-  await waitUntil(() => findElementWithSelector(dbg, selector));
-  return findElementWithSelector(dbg, selector);
-}
-
-function waitForSelectedSource(dbg, url) {
-  return waitForState(
-    dbg,
-    state => {
-
-      const source = dbg.selectors.getSelectedSource(state);
-      const isLoaded = source && sourceUtils.isLoaded(source);
-      if (!isLoaded) {
-        return false;
-      }
-
-      if (!url) {
-        return true;
-      }
-
-      const newSource = findSource(dbg, url, { silent: true });
-      if (newSource.id != source.id) {
-        return false;
-      }
-
-      // wait for async work to be done
-      const hasSymbols = dbg.selectors.hasSymbols(state, source);
-      const hasSourceMetaData = dbg.selectors.hasSourceMetaData(
-        state,
-        source.id
-      );
-      const hasPausePoints = dbg.selectors.hasPausePoints(state, source.id);
-      return hasSymbols && hasSourceMetaData && hasPausePoints;
-    },
-    "selected source"
-  );
-}
-
-/**
- * Assert that the debugger is not currently paused.
- * @memberof mochitest/asserts
- * @static
- */
-function assertNotPaused(dbg) {
-  ok(!isPaused(dbg), "client is not paused");
-}
-
-function getVisibleSelectedFrameLine(dbg) {
-  const { selectors: { getVisibleSelectedFrame }, getState } = dbg;
-  const frame = getVisibleSelectedFrame(getState());
-  return frame && frame.location.line;
-}
-
-/**
- * Assert that the debugger is paused at the correct location.
- *
- * @memberof mochitest/asserts
- * @param {Object} dbg
- * @param {String} source
- * @param {Number} line
- * @static
- */
-function assertPausedLocation(dbg) {
-  const { selectors: { getSelectedSource }, getState } = dbg;
-
-  ok(
-    isSelectedFrameSelected(dbg, getState()),
-    "top frame's source is selected"
-  );
-
-  // Check the pause location
-  const pauseLine = getVisibleSelectedFrameLine(dbg);
-  assertDebugLine(dbg, pauseLine);
-
-  ok(isVisibleInEditor(dbg, getCM(dbg).display.gutters), "gutter is visible");
-}
-
-function assertDebugLine(dbg, line) {
-  // Check the debug line
-  const lineInfo = getCM(dbg).lineInfo(line - 1);
-  const source = dbg.selectors.getSelectedSource(dbg.getState());
-  if (source && source.loadedState == "loading") {
-    const url = source.url;
-    ok(
-      false,
-      `Looks like the source ${url} is still loading. Try adding waitForLoadedSource in the test.`
-    );
-    return;
-  }
-
-  if (!lineInfo.wrapClass) {
-    const pauseLine = getVisibleSelectedFrameLine(dbg);
-    ok(false, `Expected pause line on line ${line}, it is on ${pauseLine}`);
-    return;
-  }
-
-  ok(
-    lineInfo.wrapClass.includes("new-debug-line"),
-    "Line is highlighted as paused"
-  );
-
-  const debugLine =
-    findElement(dbg, "debugLine") || findElement(dbg, "debugErrorLine");
-
-  is(
-    findAllElements(dbg, "debugLine").length +
-      findAllElements(dbg, "debugErrorLine").length,
-    1,
-    "There is only one line"
-  );
-
-  ok(isVisibleInEditor(dbg, debugLine), "debug line is visible");
-
-  const markedSpans = lineInfo.handle.markedSpans;
-  if (markedSpans && markedSpans.length > 0) {
-    const marker = markedSpans[0].marker;
-    ok(
-      marker.className.includes("debug-expression"),
-      "expression is highlighted as paused"
-    );
-  }
-}
-
-/**
- * Assert that the debugger is highlighting the correct location.
- *
- * @memberof mochitest/asserts
- * @param {Object} dbg
- * @param {String} source
- * @param {Number} line
- * @static
- */
-function assertHighlightLocation(dbg, source, line) {
-  const { selectors: { getSelectedSource }, getState } = dbg;
-  source = findSource(dbg, source);
-
-  // Check the selected source
-  is(
-    getSelectedSource(getState()).get("url"),
-    source.url,
-    "source url is correct"
-  );
-
-  // Check the highlight line
-  const lineEl = findElement(dbg, "highlightLine");
-  ok(lineEl, "Line is highlighted");
-
-  is(
-    findAllElements(dbg, "highlightLine").length,
-    1,
-    "Only 1 line is highlighted"
-  );
-
-  ok(isVisibleInEditor(dbg, lineEl), "Highlighted line is visible");
-  ok(
-    getCM(dbg)
-      .lineInfo(line - 1)
-      .wrapClass.includes("highlight-line"),
-    "Line is highlighted"
-  );
-}
-
-/**
- * Returns boolean for whether the debugger is paused.
- *
- * @memberof mochitest/asserts
- * @param {Object} dbg
- * @static
- */
-function isPaused(dbg) {
-  const { selectors: { isPaused }, getState } = dbg;
-  return !!isPaused(getState());
-}
-
-async function waitForLoadedScopes(dbg) {
-  const scopes = await waitForElement(dbg, "scopes");
-  // Since scopes auto-expand, we can assume they are loaded when there is a tree node
-  // with the aria-level attribute equal to "2".
-  await waitUntil(() => scopes.querySelector(`.tree-node[aria-level="2"]`));
-}
-
-/**
- * Waits for the debugger to be fully paused.
- *
- * @memberof mochitest/waits
- * @param {Object} dbg
- * @static
- */
-async function waitForPaused(dbg, url) {
-  const { getSelectedScope } = dbg.selectors;
-
-  await waitForState(
-    dbg,
-    state => isPaused(dbg) && !!getSelectedScope(state),
-    "paused"
-  );
-
-  await waitForLoadedScopes(dbg);
-  await waitForSelectedSource(dbg, url);
-}
-
-/*
- * useful for when you want to see what is happening
- * e.g await waitForever()
- */
-function waitForever() {
-  return new Promise(r => {});
-}
-
-/*
- * useful for waiting for a short amount of time as
- * a placeholder for a better waitForX handler.
- *
- * e.g await waitForTime(500)
- */
-function waitForTime(ms) {
-  return new Promise(r => setTimeout(r, ms));
-}
-
-function isSelectedFrameSelected(dbg, state) {
-  const frame = dbg.selectors.getVisibleSelectedFrame(state);
-
-  // Make sure the source text is completely loaded for the
-  // source we are paused in.
-  const sourceId = frame.location.sourceId;
-  const source = dbg.selectors.getSelectedSource(state);
-
-  if (!source) {
-    return false;
-  }
-
-  const isLoaded = source.has("loadedState") && sourceUtils.isLoaded(source);
-  if (!isLoaded) {
-    return false;
-  }
-
-  return source.id == sourceId;
-}
-
-function createDebuggerContext(toolbox) {
-  const panel = toolbox.getPanel("jsdebugger");
-  const win = panel.panelWin;
-  const { store, client, selectors, actions } = panel.getVarsForTests();
-
-  return {
-    actions: actions,
-    selectors: selectors,
-    getState: store.getState,
-    store: store,
-    client: client,
-    toolbox: toolbox,
-    win: win,
-    panel: panel
-  };
-}
-
-/**
- * Clear all the debugger related preferences.
- */
-function clearDebuggerPreferences() {
-  Services.prefs.clearUserPref("devtools.debugger.pause-on-exceptions");
-  Services.prefs.clearUserPref("devtools.debugger.pause-on-caught-exceptions");
-  Services.prefs.clearUserPref("devtools.debugger.ignore-caught-exceptions");
-  Services.prefs.clearUserPref("devtools.debugger.tabs");
-  Services.prefs.clearUserPref("devtools.debugger.pending-selected-location");
-  Services.prefs.clearUserPref("devtools.debugger.pending-breakpoints");
-  Services.prefs.clearUserPref("devtools.debugger.expressions");
-  Services.prefs.clearUserPref("devtools.debugger.call-stack-visible");
-  Services.prefs.clearUserPref("devtools.debugger.scopes-visible");
-}
-
-/**
- * Intilializes the debugger.
- *
- * @memberof mochitest
- * @param {String} url
- * @return {Promise} dbg
- * @static
- */
-async function initDebugger(url) {
-  clearDebuggerPreferences();
-  const toolbox = await openNewTabAndToolbox(EXAMPLE_URL + url, "jsdebugger");
-  return createDebuggerContext(toolbox);
-}
-
-async function initPane(url, pane) {
-  clearDebuggerPreferences();
-  return openNewTabAndToolbox(EXAMPLE_URL + url, pane);
-}
-
-window.resumeTest = undefined;
-/**
- * Pause the test and let you interact with the debugger.
- * The test can be resumed by invoking `resumeTest` in the console.
- *
- * @memberof mochitest
- * @static
- */
-function pauseTest() {
-  info("Test paused. Invoke resumeTest to continue.");
-  return new Promise(resolve => (resumeTest = resolve));
-}
-
-// Actions
-/**
- * Returns a source that matches the URL.
- *
- * @memberof mochitest/actions
- * @param {Object} dbg
- * @param {String} url
- * @return {Object} source
- * @static
- */
-function findSource(dbg, url, { silent } = { silent: false }) {
-  if (typeof url !== "string") {
-    // Support passing in a source object itelf all APIs that use this
-    // function support both styles
-    const source = url;
-    return source;
-  }
-
-  const sources = dbg.selectors.getSources(dbg.getState());
-  const source = sources.find(s => (s.get("url") || "").includes(url));
-
-  if (!source) {
-    if (silent) {
-      return false;
-    }
-
-    throw new Error(`Unable to find source: ${url}`);
-  }
-
-  return source.toJS();
-}
-
-function sourceExists(dbg, url) {
-  return !!findSource(dbg, url, { silent: true });
-}
-
-function waitForLoadedSource(dbg, url) {
-  return waitForState(
-    dbg,
-    state => findSource(dbg, url, { silent: true }).loadedState == "loaded",
-    "loaded source"
-  );
-}
-
-function waitForLoadedSources(dbg) {
-  return waitForState(
-    dbg,
-    state => {
-      const sources = dbg.selectors
-        .getSources(state)
-        .valueSeq()
-        .toJS();
-      return !sources.some(source => source.loadedState == "loading");
-    },
-    "loaded source"
-  );
-}
-/**
- * Selects the source.
- *
- * @memberof mochitest/actions
- * @param {Object} dbg
- * @param {String} url
- * @param {Number} line
- * @return {Promise}
- * @static
- */
-async function selectSource(dbg, url, line) {
-  const source = findSource(dbg, url);
-  await dbg.actions.selectLocation({ sourceId: source.id, line });
-  return waitForSelectedSource(dbg, url);
-}
-
-function closeTab(dbg, url) {
-  const source = findSource(dbg, url);
-  return dbg.actions.closeTab(source.url);
-}
-
-/**
- * Steps over.
- *
- * @memberof mochitest/actions
- * @param {Object} dbg
- * @return {Promise}
- * @static
- */
-async function stepOver(dbg) {
-  const pauseLine = getVisibleSelectedFrameLine(dbg);
-  info(`Stepping over from ${pauseLine}`);
-  await dbg.actions.stepOver();
-  return waitForPaused(dbg);
-}
-
-/**
- * Steps in.
- *
- * @memberof mochitest/actions
- * @param {Object} dbg
- * @return {Promise}
- * @static
- */
-async function stepIn(dbg) {
-  const pauseLine = getVisibleSelectedFrameLine(dbg);
-  info(`Stepping in from ${pauseLine}`);
-  await dbg.actions.stepIn();
-  return waitForPaused(dbg);
-}
-
-/**
- * Steps out.
- *
- * @memberof mochitest/actions
- * @param {Object} dbg
- * @return {Promise}
- * @static
- */
-async function stepOut(dbg) {
-  const pauseLine = getVisibleSelectedFrameLine(dbg);
-  info(`Stepping out from ${pauseLine}`);
-  await dbg.actions.stepOut();
-  return waitForPaused(dbg);
-}
-
-/**
- * Resumes.
- *
- * @memberof mochitest/actions
- * @param {Object} dbg
- * @return {Promise}
- * @static
- */
-function resume(dbg) {
-  const pauseLine = getVisibleSelectedFrameLine(dbg);
-  info(`Resuming from ${pauseLine}`);
-  return dbg.actions.resume();
-}
-
-function deleteExpression(dbg, input) {
-  info(`Delete expression "${input}"`);
-  return dbg.actions.deleteExpression({ input });
-}
-
-/**
- * Reloads the debuggee.
- *
- * @memberof mochitest/actions
- * @param {Object} dbg
- * @param {Array} sources
- * @return {Promise}
- * @static
- */
-async function reload(dbg, ...sources) {
-  const navigated = waitForDispatch(dbg, "NAVIGATE");
-  await dbg.client.reload();
-  await navigated;
-  return waitForSources(dbg, ...sources);
-}
-
-/**
- * Navigates the debuggee to another url.
- *
- * @memberof mochitest/actions
- * @param {Object} dbg
- * @param {String} url
- * @param {Array} sources
- * @return {Promise}
- * @static
- */
-async function navigate(dbg, url, ...sources) {
-  info(`Navigating to ${url}`)
-  const navigated =  waitForDispatch(dbg, "NAVIGATE");
-  await dbg.client.navigate(url);
-  await navigated;
-  return waitForSources(dbg, ...sources);
-}
-
-/**
- * Adds a breakpoint to a source at line/col.
- *
- * @memberof mochitest/actions
- * @param {Object} dbg
- * @param {String} source
- * @param {Number} line
- * @param {Number} col
- * @return {Promise}
- * @static
- */
-function addBreakpoint(dbg, source, line, column) {
-  source = findSource(dbg, source);
-  const sourceId = source.id;
-  dbg.actions.addBreakpoint({ sourceId, line, column });
-  return waitForDispatch(dbg, "ADD_BREAKPOINT");
-}
-
-function disableBreakpoint(dbg, source, line, column) {
-  source = findSource(dbg, source);
-  const sourceId = source.id;
-  dbg.actions.disableBreakpoint({ sourceId, line, column });
-  return waitForDispatch(dbg, "DISABLE_BREAKPOINT");
-}
-
-async function loadAndAddBreakpoint(dbg, filename, line, column) {
-  const { selectors: { getBreakpoint, getBreakpoints }, getState } = dbg;
-
-  await waitForSources(dbg, filename);
-
-  ok(true, "Original sources exist");
-  const source = findSource(dbg, filename);
-
-  await selectSource(dbg, source);
-
-  // Test that breakpoint is not off by a line.
-  await addBreakpoint(dbg, source, line);
-
-  is(getBreakpoints(getState()).size, 1, "One breakpoint exists");
-  ok(
-    getBreakpoint(getState(), { sourceId: source.id, line, column }),
-    "Breakpoint has correct line"
-  );
-
-  return source;
-}
-
-async function invokeWithBreakpoint(dbg, fnName, filename, { line, column }, handler) {
-  const { selectors: { getBreakpoints }, getState } = dbg;
-
-  const source = await loadAndAddBreakpoint(dbg, filename, line, column);
-
-  const invokeResult = invokeInTab(fnName);
-
-  let invokeFailed = await Promise.race([
-    waitForPaused(dbg),
-    invokeResult.then(() => new Promise(() => {}), () => true)
-  ]);
-
-  if (invokeFailed) {
-    return invokeResult;
-  }
-
-  assertPausedLocation(dbg);
-
-  await removeBreakpoint(dbg, source.id, line, column);
-
-  is(getBreakpoints(getState()).size, 0, "Breakpoint reverted");
-
-  await handler(source);
-
-  await resume(dbg);
-
-  // If the invoke errored later somehow, capture here so the error is reported nicely.
-  await invokeResult;
-}
-
-async function expandAllScopes(dbg) {
-  const scopes = await waitForElement(dbg, "scopes");
-  const scopeElements = scopes.querySelectorAll(
-    `.tree-node[aria-level="1"][data-expandable="true"]:not([aria-expanded="true"])`
-  );
-  const indices = Array.from(scopeElements, el => {
-    return Array.prototype.indexOf.call(el.parentNode.childNodes, el);
-  }).reverse();
-
-  for (const index of indices) {
-    await toggleScopeNode(dbg, index + 1);
-  }
-}
-
-async function assertScopes(dbg, items) {
-  await expandAllScopes(dbg);
-
-  for (const [i, val] of items.entries()) {
-    if (Array.isArray(val)) {
-      is(getScopeLabel(dbg, i + 1), val[0]);
-      is(
-        getScopeValue(dbg, i + 1),
-        val[1],
-        `"${val[0]}" has the expected "${val[1]}" value`
-      );
-    } else {
-      is(getScopeLabel(dbg, i + 1), val);
-    }
-  }
-
-  is(getScopeLabel(dbg, items.length + 1), "Window");
-}
-
-/**
- * Removes a breakpoint from a source at line/col.
- *
- * @memberof mochitest/actions
- * @param {Object} dbg
- * @param {String} source
- * @param {Number} line
- * @param {Number} col
- * @return {Promise}
- * @static
- */
-function removeBreakpoint(dbg, sourceId, line, column) {
-  dbg.actions.removeBreakpoint({ sourceId, line, column });
-  return waitForDispatch(dbg, "REMOVE_BREAKPOINT");
-}
-
-/**
- * Toggles the Pause on exceptions feature in the debugger.
- *
- * @memberof mochitest/actions
- * @param {Object} dbg
- * @param {Boolean} pauseOnExceptions
- * @param {Boolean} pauseOnCaughtExceptions
- * @return {Promise}
- * @static
- */
-async function togglePauseOnExceptions(
-  dbg,
-  pauseOnExceptions,
-  pauseOnCaughtExceptions
-) {
-  const command = dbg.actions.pauseOnExceptions(
-    pauseOnExceptions,
-    pauseOnCaughtExceptions
-  );
-
-  if (!isPaused(dbg)) {
-    await waitForThreadEvents(dbg, "resumed");
-  }
-
-  return command;
-}
-
-function waitForActive(dbg) {
-  return waitForState(dbg, state => !dbg.selectors.isPaused(state), "active");
-}
-
-// Helpers
-
-/**
- * Invokes a global function in the debuggee tab.
- *
- * @memberof mochitest/helpers
- * @param {String} fnc The name of a global function on the content window to
- *                     call. This is applied to structured clones of the
- *                     remaining arguments to invokeInTab.
- * @param {Any} ...args Remaining args to serialize and pass to fnc.
- * @return {Promise}
- * @static
- */
-function invokeInTab(fnc, ...args) {
-  info(`Invoking in tab: ${fnc}(${args.map(uneval).join(",")})`);
-  return ContentTask.spawn(gBrowser.selectedBrowser, { fnc, args }, function*({
-    fnc,
-    args
-  }) {
-    content.wrappedJSObject[fnc](...args);
-  });
-}
-
-const isLinux = Services.appinfo.OS === "Linux";
-const isMac = Services.appinfo.OS === "Darwin";
-const cmdOrCtrl = isLinux ? { ctrlKey: true } : { metaKey: true };
-const shiftOrAlt = isMac
-  ? { accelKey: true, shiftKey: true }
-  : { accelKey: true, altKey: true };
-
-const cmdShift = isMac
-  ? { accelKey: true, shiftKey: true, metaKey: true }
-  : { accelKey: true, shiftKey: true, ctrlKey: true };
-
-// On Mac, going to beginning/end only works with meta+left/right.  On
-// Windows, it only works with home/end.  On Linux, apparently, either
-// ctrl+left/right or home/end work.
-const endKey = isMac
-  ? { code: "VK_RIGHT", modifiers: cmdOrCtrl }
-  : { code: "VK_END" };
-const startKey = isMac
-  ? { code: "VK_LEFT", modifiers: cmdOrCtrl }
-  : { code: "VK_HOME" };
-
-const keyMappings = {
-  debugger: { code: "s", modifiers: shiftOrAlt },
-  inspector: { code: "c", modifiers: shiftOrAlt },
-  quickOpen: { code: "p", modifiers: cmdOrCtrl },
-  quickOpenFunc: { code: "o", modifiers: cmdShift },
-  quickOpenLine: { code: ":", modifiers: cmdOrCtrl },
-  fileSearch: { code: "f", modifiers: cmdOrCtrl },
-  Enter: { code: "VK_RETURN" },
-  ShiftEnter: { code: "VK_RETURN", modifiers: shiftOrAlt },
-  Up: { code: "VK_UP" },
-  Down: { code: "VK_DOWN" },
-  Right: { code: "VK_RIGHT" },
-  Left: { code: "VK_LEFT" },
-  End: endKey,
-  Start: startKey,
-  Tab: { code: "VK_TAB" },
-  Escape: { code: "VK_ESCAPE" },
-  Delete: { code: "VK_DELETE" },
-  pauseKey: { code: "VK_F8" },
-  resumeKey: { code: "VK_F8" },
-  stepOverKey: { code: "VK_F10" },
-  stepInKey: { code: "VK_F11", modifiers: { ctrlKey: isLinux } },
-  stepOutKey: {
-    code: "VK_F11",
-    modifiers: { ctrlKey: isLinux, shiftKey: true }
-  }
-};
-
-/**
- * Simulates a key press in the debugger window.
- *
- * @memberof mochitest/helpers
- * @param {Object} dbg
- * @param {String} keyName
- * @return {Promise}
- * @static
- */
-function pressKey(dbg, keyName) {
-  const keyEvent = keyMappings[keyName];
-
-  const { code, modifiers } = keyEvent;
-  return EventUtils.synthesizeKey(code, modifiers || {}, dbg.win);
-}
-
-function type(dbg, string) {
-  string.split("").forEach(char => EventUtils.synthesizeKey(char, {}, dbg.win));
-}
-
-/*
- * Checks to see if the inner element is visible inside the editor.
- *
- * @memberof mochitest/helpers
- * @param {Object} dbg
- * @param {HTMLElement} inner element
- * @return {boolean}
- * @static
- */
-
-function isVisibleInEditor(dbg, element) {
-  return isVisible(findElement(dbg, "codeMirror"), element);
-}
-
-/*
- * Checks to see if the inner element is visible inside the
- * outer element.
- *
- * Note, the inner element does not need to be entirely visible,
- * it is possible for it to be somewhat clipped by the outer element's
- * bounding element or for it to span the entire length, starting before the
- * outer element and ending after.
- *
- * @memberof mochitest/helpers
- * @param {HTMLElement} outer element
- * @param {HTMLElement} inner element
- * @return {boolean}
- * @static
- */
-function isVisible(outerEl, innerEl) {
-  if (!innerEl || !outerEl) {
-    return false;
-  }
-
-  const innerRect = innerEl.getBoundingClientRect();
-  const outerRect = outerEl.getBoundingClientRect();
-
-  const verticallyVisible =
-    innerRect.top >= outerRect.top ||
-    innerRect.bottom <= outerRect.bottom ||
-    (innerRect.top < outerRect.top && innerRect.bottom > outerRect.bottom);
-
-  const horizontallyVisible =
-    innerRect.left >= outerRect.left ||
-    innerRect.right <= outerRect.right ||
-    (innerRect.left < outerRect.left && innerRect.right > outerRect.right);
-
-  const visible = verticallyVisible && horizontallyVisible;
-  return visible;
-}
-
-const selectors = {
-  callStackHeader: ".call-stack-pane ._header",
-  callStackBody: ".call-stack-pane .pane",
-  expressionNode: i =>
-    `.expressions-list .expression-container:nth-child(${i}) .object-label`,
-  expressionValue: i =>
-    `.expressions-list .expression-container:nth-child(${i}) .object-delimiter + *`,
-  expressionClose: i =>
-    `.expressions-list .expression-container:nth-child(${i}) .close`,
-  expressionInput: '.expressions-list  input.input-expression',
-  expressionNodes: ".expressions-list .tree-node",
-  scopesHeader: ".scopes-pane ._header",
-  breakpointItem: i => `.breakpoints-list .breakpoint:nth-of-type(${i})`,
-  breakpointItems: `.breakpoints-list .breakpoint`,
-  scopes: ".scopes-list",
-  scopeNode: i => `.scopes-list .tree-node:nth-child(${i}) .object-label`,
-  scopeValue: i =>
-    `.scopes-list .tree-node:nth-child(${i}) .object-delimiter + *`,
-  frame: i => `.frames ul li:nth-child(${i})`,
-  frames: ".frames ul li",
-  gutter: i => `.CodeMirror-code *:nth-child(${i}) .CodeMirror-linenumber`,
-  menuitem: i => `menupopup menuitem:nth-child(${i})`,
-  pauseOnExceptions: ".pause-exceptions",
-  breakpoint: ".CodeMirror-code > .new-breakpoint",
-  highlightLine: ".CodeMirror-code > .highlight-line",
-  debugLine: ".new-debug-line",
-  debugErrorLine: ".new-debug-line-error",
-  codeMirror: ".CodeMirror",
-  resume: ".resume.active",
-  sourceTabs: ".source-tabs",
-  stepOver: ".stepOver.active",
-  stepOut: ".stepOut.active",
-  stepIn: ".stepIn.active",
-  replayPrevious: ".replay-previous.active",
-  replayNext: ".replay-next.active",
-  toggleBreakpoints: ".breakpoints-toggle",
-  prettyPrintButton: ".source-footer .prettyPrint",
-  sourceMapLink: ".source-footer .mapped-source",
-  sourcesFooter: ".sources-panel .source-footer",
-  editorFooter: ".editor-pane .source-footer",
-  sourceNode: i => `.sources-list .tree-node:nth-child(${i}) .node`,
-  sourceNodes: ".sources-list .tree-node",
-  sourceDirectoryLabel: i => `.sources-list .tree-node:nth-child(${i}) .label`,
-  resultItems: ".result-list .result-item",
-  fileMatch: ".managed-tree .result",
-  popup: ".popover",
-  tooltip: ".tooltip",
-  previewPopup: ".preview-popup",
-  outlineItem: i =>
-    `.outline-list__element:nth-child(${i}) .function-signature`,
-  outlineItems: ".outline-list__element",
-  conditionalPanelInput: ".conditional-breakpoint-panel input",
-  searchField: ".search-field",
-};
-
-function getSelector(elementName, ...args) {
-  let selector = selectors[elementName];
-  if (!selector) {
-    throw new Error(`The selector ${elementName} is not defined`);
-  }
-
-  if (typeof selector == "function") {
-    selector = selector(...args);
-  }
-
-  return selector;
-}
-
-function findElement(dbg, elementName, ...args) {
-  const selector = getSelector(elementName, ...args);
-  return findElementWithSelector(dbg, selector);
-}
-
-function findElementWithSelector(dbg, selector) {
-  return dbg.win.document.querySelector(selector);
-}
-
-function findAllElements(dbg, elementName, ...args) {
-  const selector = getSelector(elementName, ...args);
-  return dbg.win.document.querySelectorAll(selector);
-}
-
-/**
- * Simulates a mouse click in the debugger DOM.
- *
- * @memberof mochitest/helpers
- * @param {Object} dbg
- * @param {String} elementName
- * @param {Array} args
- * @return {Promise}
- * @static
- */
-async function clickElement(dbg, elementName, ...args) {
-  const selector = getSelector(elementName, ...args);
-  const el = await waitForElementWithSelector(dbg, selector);
-
-  el.scrollIntoView();
-
-  return clickElementWithSelector(dbg, selector);
-}
-
-function clickElementWithSelector(dbg, selector) {
-  EventUtils.synthesizeMouseAtCenter(
-    findElementWithSelector(dbg, selector),
-    {},
-    dbg.win
-  );
-}
-
-function dblClickElement(dbg, elementName, ...args) {
-  const selector = getSelector(elementName, ...args);
-
-  return EventUtils.synthesizeMouseAtCenter(
-    findElementWithSelector(dbg, selector),
-    { clickCount: 2 },
-    dbg.win
-  );
-}
-
-function rightClickElement(dbg, elementName, ...args) {
-  const selector = getSelector(elementName, ...args);
-  const doc = dbg.win.document;
-  return EventUtils.synthesizeMouseAtCenter(
-    doc.querySelector(selector),
-    { type: "contextmenu" },
-    dbg.win
-  );
-}
-
-function selectMenuItem(dbg, index) {
-  // the context menu is in the toolbox window
-  const doc = dbg.toolbox.win.document;
-
-  // there are several context menus, we want the one with the menu-api
-  const popup = doc.querySelector('menupopup[menu-api="true"]');
-
-  const item = popup.querySelector(`menuitem:nth-child(${index})`);
-  return EventUtils.synthesizeMouseAtCenter(item, {}, dbg.toolbox.win);
-}
-
-/**
- * Toggles the debugger call stack accordian.
- *
- * @memberof mochitest/actions
- * @param {Object} dbg
- * @return {Promise}
- * @static
- */
-function toggleCallStack(dbg) {
-  return findElement(dbg, "callStackHeader").click();
-}
-
-function toggleScopes(dbg) {
-  return findElement(dbg, "scopesHeader").click();
-}
-
-function toggleExpressionNode(dbg, index) {
-  return toggleObjectInspectorNode(findElement(dbg, "expressionNode", index));
-}
-
-function toggleScopeNode(dbg, index) {
-  return toggleObjectInspectorNode(findElement(dbg, "scopeNode", index));
-}
-
-function getScopeLabel(dbg, index) {
-  return findElement(dbg, "scopeNode", index).innerText;
-}
-
-function getScopeValue(dbg, index) {
-  return findElement(dbg, "scopeValue", index).innerText;
-}
-
-function toggleObjectInspectorNode(node) {
-
-  const objectInspector = node.closest(".object-inspector");
-  const properties = objectInspector.querySelectorAll(".node").length;
-
-  log(`Toggling node ${node.innerText}`)
-  node.click();
-  return waitUntil(
-    () => objectInspector.querySelectorAll(".node").length !== properties
-  );
-}
-
-function getCM(dbg) {
-  const el = dbg.win.document.querySelector(".CodeMirror");
-  return el.CodeMirror;
-}
-
-function getCoordsFromPosition(cm, { line, ch }) {
-  return cm.charCoords({ line: ~~line, ch: ~~ch });
-}
-
-function hoverAtPos(dbg, { line, ch }) {
-  info(`Hovering at ${line}, ${ch}`);
-  const cm = getCM(dbg);
-
-  // Ensure the line is visible with margin because the bar at the bottom of
-  // the editor overlaps into what the editor things is its own space, blocking
-  // the click event below.
-  cm.scrollIntoView({ line: line - 1, ch }, 100);
-
-  const coords = getCoordsFromPosition(cm, { line: line - 1, ch });
-  const tokenEl = dbg.win.document.elementFromPoint(coords.left, coords.top);
-  tokenEl.dispatchEvent(
-    new MouseEvent("mouseover", {
-      bubbles: true,
-      cancelable: true,
-      view: dbg.win
-    })
-  );
-}
-
-async function assertPreviewTextValue(dbg, { text, expression }) {
-  const previewEl = await waitForElement(dbg, "previewPopup");
-
-  is(previewEl.innerText, text, "Preview text shown to user");
-
-  const preview = dbg.selectors.getPreview(dbg.getState());
-  is(preview.updating, false, "Preview.updating");
-  is(preview.expression, expression, "Preview.expression");
-}
-
-async function assertPreviewTooltip(dbg, { result, expression }) {
-  const previewEl = await waitForElement(dbg, "tooltip");
-  is(previewEl.innerText, result, "Preview text shown to user");
-
-  const preview = dbg.selectors.getPreview(dbg.getState());
-  is(`${preview.result}`, result, "Preview.result");
-  is(preview.updating, false, "Preview.updating");
-  is(preview.expression, expression, "Preview.expression");
-}
-
-async function assertPreviewPopup(dbg, { field, value, expression }) {
-  const previewEl = await waitForElement(dbg, "popup");
-  const preview = dbg.selectors.getPreview(dbg.getState());
-
-  const properties =
-    preview.result.preview.ownProperties || preview.result.preview.items;
-  const property = properties[field];
-  const propertyValue = property.value || property
-
-  is(`${propertyValue}`, value, "Preview.result");
-  is(preview.updating, false, "Preview.updating");
-  is(preview.expression, expression, "Preview.expression");
-}
-
-async function assertPreviews(dbg, previews) {
-  for (const { line, column, expression, result, fields } of previews) {
-    hoverAtPos(dbg, { line, ch: column - 1 });
-
-    if (fields && result) {
-      throw new Error("Invalid test fixture");
-    }
-
-    if (fields) {
-      for (const [field, value] of fields) {
-        await assertPreviewPopup(dbg, { expression, field, value });
-      }
-    } else {
-      await assertPreviewTextValue(dbg, { expression, text: result });
-    }
-
-    dbg.actions.clearPreview();
-  }
-}
-
 // NOTE: still experimental, the screenshots might not be exactly correct
 async function takeScreenshot(dbg) {
   let canvas = dbg.win.document.createElementNS(
     "http://www.w3.org/1999/xhtml",
     "html:canvas"
   );
   let context = canvas.getContext("2d");
   canvas.width = dbg.win.innerWidth;
new file mode 100644
--- /dev/null
+++ b/devtools/client/debugger/new/test/mochitest/helpers.js
@@ -0,0 +1,1253 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+/**
+ * Helper methods to drive with the debugger during mochitests. This file can be safely
+ * required from other panel test files.
+ */
+
+var { Toolbox } = require("devtools/client/framework/toolbox");
+var { Task } = require("devtools/shared/task");
+
+const sourceUtils = {
+  isLoaded: source => source.get("loadedState") === "loaded"
+};
+
+function log(msg, data) {
+  info(`${msg} ${!data ? "" : JSON.stringify(data)}`);
+}
+
+function logThreadEvents(dbg, event) {
+  const thread = dbg.toolbox.threadClient;
+
+  thread.addListener(event, function onEvent(eventName, ...args) {
+    info(`Thread event '${eventName}' fired.`);
+  });
+}
+
+async function waitFor(condition) {
+  await BrowserTestUtils.waitForCondition(condition, "waitFor", 10, 500);
+  return condition();
+}
+
+// Wait until an action of `type` is dispatched. This is different
+// then `_afterDispatchDone` because it doesn't wait for async actions
+// to be done/errored. Use this if you want to listen for the "start"
+// action of an async operation (somewhat rare).
+function waitForNextDispatch(store, type) {
+  return new Promise(resolve => {
+    store.dispatch({
+      // Normally we would use `services.WAIT_UNTIL`, but use the
+      // internal name here so tests aren't forced to always pass it
+      // in
+      type: "@@service/waitUntil",
+      predicate: action => action.type === type,
+      run: (dispatch, getState, action) => {
+        resolve(action);
+      }
+    });
+  });
+}
+
+// Wait until an action of `type` is dispatched. If it's part of an
+// async operation, wait until the `status` field is "done" or "error"
+function _afterDispatchDone(store, type) {
+  return new Promise(resolve => {
+    store.dispatch({
+      // Normally we would use `services.WAIT_UNTIL`, but use the
+      // internal name here so tests aren't forced to always pass it
+      // in
+      type: "@@service/waitUntil",
+      predicate: action => {
+        if (action.type === type) {
+          return action.status
+            ? action.status === "done" || action.status === "error"
+            : true;
+        }
+      },
+      run: (dispatch, getState, action) => {
+        resolve(action);
+      }
+    });
+  });
+}
+
+/**
+ * Wait for a specific action type to be dispatch.
+ * If an async action, will wait for it to be done.
+ *
+ * @memberof mochitest/waits
+ * @param {Object} dbg
+ * @param {String} type
+ * @param {Number} eventRepeat
+ * @return {Promise}
+ * @static
+ */
+function waitForDispatch(dbg, type, eventRepeat = 1) {
+  let count = 0;
+
+  return Task.spawn(function*() {
+    info(`Waiting for ${type} to dispatch ${eventRepeat} time(s)`);
+    while (count < eventRepeat) {
+      yield _afterDispatchDone(dbg.store, type);
+      count++;
+      info(`${type} dispatched ${count} time(s)`);
+    }
+  });
+}
+
+/**
+ * Waits for specific thread events.
+ *
+ * @memberof mochitest/waits
+ * @param {Object} dbg
+ * @param {String} eventName
+ * @return {Promise}
+ * @static
+ */
+function waitForThreadEvents(dbg, eventName) {
+  info(`Waiting for thread event '${eventName}' to fire.`);
+  const thread = dbg.toolbox.threadClient;
+
+  return new Promise(function(resolve, reject) {
+    thread.addListener(eventName, function onEvent(eventName, ...args) {
+      info(`Thread event '${eventName}' fired.`);
+      thread.removeListener(eventName, onEvent);
+      resolve.apply(resolve, args);
+    });
+  });
+}
+
+/**
+ * Waits for `predicate(state)` to be true. `state` is the redux app state.
+ *
+ * @memberof mochitest/waits
+ * @param {Object} dbg
+ * @param {Function} predicate
+ * @return {Promise}
+ * @static
+ */
+function waitForState(dbg, predicate, msg) {
+  return new Promise(resolve => {
+    info(`Waiting for state change: ${msg || ""}`);
+    if (predicate(dbg.store.getState())) {
+      info(`Finished waiting for state change: ${msg || ""}`);
+      return resolve();
+    }
+
+    const unsubscribe = dbg.store.subscribe(() => {
+      const result = predicate(dbg.store.getState());
+      if (result) {
+        info(`Finished waiting for state change: ${msg || ""}`);
+        unsubscribe();
+        resolve(result);
+      }
+    });
+  });
+}
+
+/**
+ * Waits for sources to be loaded.
+ *
+ * @memberof mochitest/waits
+ * @param {Object} dbg
+ * @param {Array} sources
+ * @return {Promise}
+ * @static
+ */
+async function waitForSources(dbg, ...sources) {
+  const { selectors: { getSources }, store } = dbg;
+  if (sources.length === 0) {
+    return Promise.resolve();
+  }
+
+  info(`Waiting on sources: ${sources.join(", ")}`);
+  await Promise.all(
+    sources.map(url => {
+      if (!sourceExists(dbg, url)) {
+        return waitForState(
+          dbg,
+          () => sourceExists(dbg, url),
+          `source ${url} exists`
+        );
+      }
+    })
+  );
+
+  info(`Finished waiting on sources: ${sources.join(", ")}`);
+}
+
+/**
+ * Waits for a source to be loaded.
+ *
+ * @memberof mochitest/waits
+ * @param {Object} dbg
+ * @param {String} source
+ * @return {Promise}
+ * @static
+ */
+function waitForSource(dbg, url) {
+  return waitForState(
+    dbg,
+    state => {
+      const sources = dbg.selectors.getSources(state);
+      return sources.find(s => (s.get("url") || "").includes(url));
+    },
+    `source exists`
+  );
+}
+
+async function waitForElement(dbg, name) {
+  await waitUntil(() => findElement(dbg, name));
+  return findElement(dbg, name);
+}
+
+async function waitForElementWithSelector(dbg, selector) {
+  await waitUntil(() => findElementWithSelector(dbg, selector));
+  return findElementWithSelector(dbg, selector);
+}
+
+function waitForSelectedSource(dbg, url) {
+  return waitForState(
+    dbg,
+    state => {
+
+      const source = dbg.selectors.getSelectedSource(state);
+      const isLoaded = source && sourceUtils.isLoaded(source);
+      if (!isLoaded) {
+        return false;
+      }
+
+      if (!url) {
+        return true;
+      }
+
+      const newSource = findSource(dbg, url, { silent: true });
+      if (newSource.id != source.id) {
+        return false;
+      }
+
+      // wait for async work to be done
+      const hasSymbols = dbg.selectors.hasSymbols(state, source);
+      const hasSourceMetaData = dbg.selectors.hasSourceMetaData(
+        state,
+        source.id
+      );
+      const hasPausePoints = dbg.selectors.hasPausePoints(state, source.id);
+      return hasSymbols && hasSourceMetaData && hasPausePoints;
+    },
+    "selected source"
+  );
+}
+
+/**
+ * Assert that the debugger is not currently paused.
+ * @memberof mochitest/asserts
+ * @static
+ */
+function assertNotPaused(dbg) {
+  ok(!isPaused(dbg), "client is not paused");
+}
+
+function getVisibleSelectedFrameLine(dbg) {
+  const { selectors: { getVisibleSelectedFrame }, getState } = dbg;
+  const frame = getVisibleSelectedFrame(getState());
+  return frame && frame.location.line;
+}
+
+/**
+ * Assert that the debugger is paused at the correct location.
+ *
+ * @memberof mochitest/asserts
+ * @param {Object} dbg
+ * @param {String} source
+ * @param {Number} line
+ * @static
+ */
+function assertPausedLocation(dbg) {
+  const { selectors: { getSelectedSource }, getState } = dbg;
+
+  ok(
+    isSelectedFrameSelected(dbg, getState()),
+    "top frame's source is selected"
+  );
+
+  // Check the pause location
+  const pauseLine = getVisibleSelectedFrameLine(dbg);
+  assertDebugLine(dbg, pauseLine);
+
+  ok(isVisibleInEditor(dbg, getCM(dbg).display.gutters), "gutter is visible");
+}
+
+function assertDebugLine(dbg, line) {
+  // Check the debug line
+  const lineInfo = getCM(dbg).lineInfo(line - 1);
+  const source = dbg.selectors.getSelectedSource(dbg.getState());
+  if (source && source.loadedState == "loading") {
+    const url = source.url;
+    ok(
+      false,
+      `Looks like the source ${url} is still loading. Try adding waitForLoadedSource in the test.`
+    );
+    return;
+  }
+
+  if (!lineInfo.wrapClass) {
+    const pauseLine = getVisibleSelectedFrameLine(dbg);
+    ok(false, `Expected pause line on line ${line}, it is on ${pauseLine}`);
+    return;
+  }
+
+  ok(
+    lineInfo.wrapClass.includes("new-debug-line"),
+    "Line is highlighted as paused"
+  );
+
+  const debugLine =
+    findElement(dbg, "debugLine") || findElement(dbg, "debugErrorLine");
+
+  is(
+    findAllElements(dbg, "debugLine").length +
+      findAllElements(dbg, "debugErrorLine").length,
+    1,
+    "There is only one line"
+  );
+
+  ok(isVisibleInEditor(dbg, debugLine), "debug line is visible");
+
+  const markedSpans = lineInfo.handle.markedSpans;
+  if (markedSpans && markedSpans.length > 0) {
+    const marker = markedSpans[0].marker;
+    ok(
+      marker.className.includes("debug-expression"),
+      "expression is highlighted as paused"
+    );
+  }
+}
+
+/**
+ * Assert that the debugger is highlighting the correct location.
+ *
+ * @memberof mochitest/asserts
+ * @param {Object} dbg
+ * @param {String} source
+ * @param {Number} line
+ * @static
+ */
+function assertHighlightLocation(dbg, source, line) {
+  const { selectors: { getSelectedSource }, getState } = dbg;
+  source = findSource(dbg, source);
+
+  // Check the selected source
+  is(
+    getSelectedSource(getState()).get("url"),
+    source.url,
+    "source url is correct"
+  );
+
+  // Check the highlight line
+  const lineEl = findElement(dbg, "highlightLine");
+  ok(lineEl, "Line is highlighted");
+
+  is(
+    findAllElements(dbg, "highlightLine").length,
+    1,
+    "Only 1 line is highlighted"
+  );
+
+  ok(isVisibleInEditor(dbg, lineEl), "Highlighted line is visible");
+  ok(
+    getCM(dbg)
+      .lineInfo(line - 1)
+      .wrapClass.includes("highlight-line"),
+    "Line is highlighted"
+  );
+}
+
+/**
+ * Returns boolean for whether the debugger is paused.
+ *
+ * @memberof mochitest/asserts
+ * @param {Object} dbg
+ * @static
+ */
+function isPaused(dbg) {
+  const { selectors: { isPaused }, getState } = dbg;
+  return !!isPaused(getState());
+}
+
+async function waitForLoadedScopes(dbg) {
+  const scopes = await waitForElement(dbg, "scopes");
+  // Since scopes auto-expand, we can assume they are loaded when there is a tree node
+  // with the aria-level attribute equal to "2".
+  await waitUntil(() => scopes.querySelector(`.tree-node[aria-level="2"]`));
+}
+
+/**
+ * Waits for the debugger to be fully paused.
+ *
+ * @memberof mochitest/waits
+ * @param {Object} dbg
+ * @static
+ */
+async function waitForPaused(dbg, url) {
+  const { getSelectedScope } = dbg.selectors;
+
+  await waitForState(
+    dbg,
+    state => isPaused(dbg) && !!getSelectedScope(state),
+    "paused"
+  );
+
+  await waitForLoadedScopes(dbg);
+  await waitForSelectedSource(dbg, url);
+}
+
+/*
+ * useful for when you want to see what is happening
+ * e.g await waitForever()
+ */
+function waitForever() {
+  return new Promise(r => {});
+}
+
+/*
+ * useful for waiting for a short amount of time as
+ * a placeholder for a better waitForX handler.
+ *
+ * e.g await waitForTime(500)
+ */
+function waitForTime(ms) {
+  return new Promise(r => setTimeout(r, ms));
+}
+
+function isSelectedFrameSelected(dbg, state) {
+  const frame = dbg.selectors.getVisibleSelectedFrame(state);
+
+  // Make sure the source text is completely loaded for the
+  // source we are paused in.
+  const sourceId = frame.location.sourceId;
+  const source = dbg.selectors.getSelectedSource(state);
+
+  if (!source) {
+    return false;
+  }
+
+  const isLoaded = source.has("loadedState") && sourceUtils.isLoaded(source);
+  if (!isLoaded) {
+    return false;
+  }
+
+  return source.id == sourceId;
+}
+
+function createDebuggerContext(toolbox) {
+  const panel = toolbox.getPanel("jsdebugger");
+  const win = panel.panelWin;
+  const { store, client, selectors, actions } = panel.getVarsForTests();
+
+  return {
+    actions: actions,
+    selectors: selectors,
+    getState: store.getState,
+    store: store,
+    client: client,
+    toolbox: toolbox,
+    win: win,
+    panel: panel
+  };
+}
+
+/**
+ * Clear all the debugger related preferences.
+ */
+function clearDebuggerPreferences() {
+  Services.prefs.clearUserPref("devtools.debugger.pause-on-exceptions");
+  Services.prefs.clearUserPref("devtools.debugger.pause-on-caught-exceptions");
+  Services.prefs.clearUserPref("devtools.debugger.ignore-caught-exceptions");
+  Services.prefs.clearUserPref("devtools.debugger.tabs");
+  Services.prefs.clearUserPref("devtools.debugger.pending-selected-location");
+  Services.prefs.clearUserPref("devtools.debugger.pending-breakpoints");
+  Services.prefs.clearUserPref("devtools.debugger.expressions");
+  Services.prefs.clearUserPref("devtools.debugger.call-stack-visible");
+  Services.prefs.clearUserPref("devtools.debugger.scopes-visible");
+}
+
+/**
+ * Intilializes the debugger.
+ *
+ * @memberof mochitest
+ * @param {String} url
+ * @return {Promise} dbg
+ * @static
+ */
+async function initDebugger(url) {
+  clearDebuggerPreferences();
+  const toolbox = await openNewTabAndToolbox(EXAMPLE_URL + url, "jsdebugger");
+  return createDebuggerContext(toolbox);
+}
+
+async function initPane(url, pane) {
+  clearDebuggerPreferences();
+  return openNewTabAndToolbox(EXAMPLE_URL + url, pane);
+}
+
+window.resumeTest = undefined;
+registerCleanupFunction(() => {
+  delete window.resumeTest;
+});
+
+/**
+ * Pause the test and let you interact with the debugger.
+ * The test can be resumed by invoking `resumeTest` in the console.
+ *
+ * @memberof mochitest
+ * @static
+ */
+function pauseTest() {
+  info("Test paused. Invoke resumeTest to continue.");
+  return new Promise(resolve => (resumeTest = resolve));
+}
+
+// Actions
+/**
+ * Returns a source that matches the URL.
+ *
+ * @memberof mochitest/actions
+ * @param {Object} dbg
+ * @param {String} url
+ * @return {Object} source
+ * @static
+ */
+function findSource(dbg, url, { silent } = { silent: false }) {
+  if (typeof url !== "string") {
+    // Support passing in a source object itelf all APIs that use this
+    // function support both styles
+    const source = url;
+    return source;
+  }
+
+  const sources = dbg.selectors.getSources(dbg.getState());
+  const source = sources.find(s => (s.get("url") || "").includes(url));
+
+  if (!source) {
+    if (silent) {
+      return false;
+    }
+
+    throw new Error(`Unable to find source: ${url}`);
+  }
+
+  return source.toJS();
+}
+
+function sourceExists(dbg, url) {
+  return !!findSource(dbg, url, { silent: true });
+}
+
+function waitForLoadedSource(dbg, url) {
+  return waitForState(
+    dbg,
+    state => findSource(dbg, url, { silent: true }).loadedState == "loaded",
+    "loaded source"
+  );
+}
+
+function waitForLoadedSources(dbg) {
+  return waitForState(
+    dbg,
+    state => {
+      const sources = dbg.selectors
+        .getSources(state)
+        .valueSeq()
+        .toJS();
+      return !sources.some(source => source.loadedState == "loading");
+    },
+    "loaded source"
+  );
+}
+/**
+ * Selects the source.
+ *
+ * @memberof mochitest/actions
+ * @param {Object} dbg
+ * @param {String} url
+ * @param {Number} line
+ * @return {Promise}
+ * @static
+ */
+async function selectSource(dbg, url, line) {
+  const source = findSource(dbg, url);
+  await dbg.actions.selectLocation({ sourceId: source.id, line });
+  return waitForSelectedSource(dbg, url);
+}
+
+function closeTab(dbg, url) {
+  const source = findSource(dbg, url);
+  return dbg.actions.closeTab(source.url);
+}
+
+/**
+ * Steps over.
+ *
+ * @memberof mochitest/actions
+ * @param {Object} dbg
+ * @return {Promise}
+ * @static
+ */
+async function stepOver(dbg) {
+  const pauseLine = getVisibleSelectedFrameLine(dbg);
+  info(`Stepping over from ${pauseLine}`);
+  await dbg.actions.stepOver();
+  return waitForPaused(dbg);
+}
+
+/**
+ * Steps in.
+ *
+ * @memberof mochitest/actions
+ * @param {Object} dbg
+ * @return {Promise}
+ * @static
+ */
+async function stepIn(dbg) {
+  const pauseLine = getVisibleSelectedFrameLine(dbg);
+  info(`Stepping in from ${pauseLine}`);
+  await dbg.actions.stepIn();
+  return waitForPaused(dbg);
+}
+
+/**
+ * Steps out.
+ *
+ * @memberof mochitest/actions
+ * @param {Object} dbg
+ * @return {Promise}
+ * @static
+ */
+async function stepOut(dbg) {
+  const pauseLine = getVisibleSelectedFrameLine(dbg);
+  info(`Stepping out from ${pauseLine}`);
+  await dbg.actions.stepOut();
+  return waitForPaused(dbg);
+}
+
+/**
+ * Resumes.
+ *
+ * @memberof mochitest/actions
+ * @param {Object} dbg
+ * @return {Promise}
+ * @static
+ */
+function resume(dbg) {
+  const pauseLine = getVisibleSelectedFrameLine(dbg);
+  info(`Resuming from ${pauseLine}`);
+  return dbg.actions.resume();
+}
+
+function deleteExpression(dbg, input) {
+  info(`Delete expression "${input}"`);
+  return dbg.actions.deleteExpression({ input });
+}
+
+/**
+ * Reloads the debuggee.
+ *
+ * @memberof mochitest/actions
+ * @param {Object} dbg
+ * @param {Array} sources
+ * @return {Promise}
+ * @static
+ */
+async function reload(dbg, ...sources) {
+  const navigated = waitForDispatch(dbg, "NAVIGATE");
+  await dbg.client.reload();
+  await navigated;
+  return waitForSources(dbg, ...sources);
+}
+
+/**
+ * Navigates the debuggee to another url.
+ *
+ * @memberof mochitest/actions
+ * @param {Object} dbg
+ * @param {String} url
+ * @param {Array} sources
+ * @return {Promise}
+ * @static
+ */
+async function navigate(dbg, url, ...sources) {
+  info(`Navigating to ${url}`)
+  const navigated =  waitForDispatch(dbg, "NAVIGATE");
+  await dbg.client.navigate(url);
+  await navigated;
+  return waitForSources(dbg, ...sources);
+}
+
+/**
+ * Adds a breakpoint to a source at line/col.
+ *
+ * @memberof mochitest/actions
+ * @param {Object} dbg
+ * @param {String} source
+ * @param {Number} line
+ * @param {Number} col
+ * @return {Promise}
+ * @static
+ */
+function addBreakpoint(dbg, source, line, column) {
+  source = findSource(dbg, source);
+  const sourceId = source.id;
+  dbg.actions.addBreakpoint({ sourceId, line, column });
+  return waitForDispatch(dbg, "ADD_BREAKPOINT");
+}
+
+function disableBreakpoint(dbg, source, line, column) {
+  source = findSource(dbg, source);
+  const sourceId = source.id;
+  dbg.actions.disableBreakpoint({ sourceId, line, column });
+  return waitForDispatch(dbg, "DISABLE_BREAKPOINT");
+}
+
+async function loadAndAddBreakpoint(dbg, filename, line, column) {
+  const { selectors: { getBreakpoint, getBreakpoints }, getState } = dbg;
+
+  await waitForSources(dbg, filename);
+
+  ok(true, "Original sources exist");
+  const source = findSource(dbg, filename);
+
+  await selectSource(dbg, source);
+
+  // Test that breakpoint is not off by a line.
+  await addBreakpoint(dbg, source, line);
+
+  is(getBreakpoints(getState()).size, 1, "One breakpoint exists");
+  ok(
+    getBreakpoint(getState(), { sourceId: source.id, line, column }),
+    "Breakpoint has correct line"
+  );
+
+  return source;
+}
+
+async function invokeWithBreakpoint(dbg, fnName, filename, { line, column }, handler) {
+  const { selectors: { getBreakpoints }, getState } = dbg;
+
+  const source = await loadAndAddBreakpoint(dbg, filename, line, column);
+
+  const invokeResult = invokeInTab(fnName);
+
+  let invokeFailed = await Promise.race([
+    waitForPaused(dbg),
+    invokeResult.then(() => new Promise(() => {}), () => true)
+  ]);
+
+  if (invokeFailed) {
+    return invokeResult;
+  }
+
+  assertPausedLocation(dbg);
+
+  await removeBreakpoint(dbg, source.id, line, column);
+
+  is(getBreakpoints(getState()).size, 0, "Breakpoint reverted");
+
+  await handler(source);
+
+  await resume(dbg);
+
+  // If the invoke errored later somehow, capture here so the error is reported nicely.
+  await invokeResult;
+}
+
+async function expandAllScopes(dbg) {
+  const scopes = await waitForElement(dbg, "scopes");
+  const scopeElements = scopes.querySelectorAll(
+    `.tree-node[aria-level="1"][data-expandable="true"]:not([aria-expanded="true"])`
+  );
+  const indices = Array.from(scopeElements, el => {
+    return Array.prototype.indexOf.call(el.parentNode.childNodes, el);
+  }).reverse();
+
+  for (const index of indices) {
+    await toggleScopeNode(dbg, index + 1);
+  }
+}
+
+async function assertScopes(dbg, items) {
+  await expandAllScopes(dbg);
+
+  for (const [i, val] of items.entries()) {
+    if (Array.isArray(val)) {
+      is(getScopeLabel(dbg, i + 1), val[0]);
+      is(
+        getScopeValue(dbg, i + 1),
+        val[1],
+        `"${val[0]}" has the expected "${val[1]}" value`
+      );
+    } else {
+      is(getScopeLabel(dbg, i + 1), val);
+    }
+  }
+
+  is(getScopeLabel(dbg, items.length + 1), "Window");
+}
+
+/**
+ * Removes a breakpoint from a source at line/col.
+ *
+ * @memberof mochitest/actions
+ * @param {Object} dbg
+ * @param {String} source
+ * @param {Number} line
+ * @param {Number} col
+ * @return {Promise}
+ * @static
+ */
+function removeBreakpoint(dbg, sourceId, line, column) {
+  dbg.actions.removeBreakpoint({ sourceId, line, column });
+  return waitForDispatch(dbg, "REMOVE_BREAKPOINT");
+}
+
+/**
+ * Toggles the Pause on exceptions feature in the debugger.
+ *
+ * @memberof mochitest/actions
+ * @param {Object} dbg
+ * @param {Boolean} pauseOnExceptions
+ * @param {Boolean} pauseOnCaughtExceptions
+ * @return {Promise}
+ * @static
+ */
+async function togglePauseOnExceptions(
+  dbg,
+  pauseOnExceptions,
+  pauseOnCaughtExceptions
+) {
+  const command = dbg.actions.pauseOnExceptions(
+    pauseOnExceptions,
+    pauseOnCaughtExceptions
+  );
+
+  if (!isPaused(dbg)) {
+    await waitForThreadEvents(dbg, "resumed");
+  }
+
+  return command;
+}
+
+function waitForActive(dbg) {
+  return waitForState(dbg, state => !dbg.selectors.isPaused(state), "active");
+}
+
+// Helpers
+
+/**
+ * Invokes a global function in the debuggee tab.
+ *
+ * @memberof mochitest/helpers
+ * @param {String} fnc The name of a global function on the content window to
+ *                     call. This is applied to structured clones of the
+ *                     remaining arguments to invokeInTab.
+ * @param {Any} ...args Remaining args to serialize and pass to fnc.
+ * @return {Promise}
+ * @static
+ */
+function invokeInTab(fnc, ...args) {
+  info(`Invoking in tab: ${fnc}(${args.map(uneval).join(",")})`);
+  return ContentTask.spawn(gBrowser.selectedBrowser, { fnc, args }, function*({
+    fnc,
+    args
+  }) {