Merge m-c to inbound, a=merge
authorWes Kocher <wkocher@mozilla.com>
Tue, 01 Mar 2016 15:29:43 -0800
changeset 322705 f26594a273a9ed010f8a3f1510ab97953b7fd29e
parent 322704 863c6740f637161e2a5577b893bcef3718924275 (current diff)
parent 322638 eb25b90a05c194bfd4f498ff3ffee7440f85f1cd (diff)
child 322706 ab587ee9793f96c2f92ae26d147438e8455dc79b
push id5913
push userjlund@mozilla.com
push dateMon, 25 Apr 2016 16:57:49 +0000
treeherdermozilla-beta@dcaf0a6fa115 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone47.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 m-c to inbound, a=merge MozReview-Commit-ID: 3PWdAnh0hk5
browser/components/extensions/test/browser/browser_ext_commands.js
browser/extensions/shumway/LICENSE
browser/extensions/shumway/chrome.manifest
browser/extensions/shumway/chrome/ExternalInterface.jsm
browser/extensions/shumway/chrome/FileLoader.jsm
browser/extensions/shumway/chrome/LocalConnection.jsm
browser/extensions/shumway/chrome/RtmpUtils.jsm
browser/extensions/shumway/chrome/ShumwayCom.jsm
browser/extensions/shumway/chrome/SpecialInflate.jsm
browser/extensions/shumway/chrome/SpecialStorage.jsm
browser/extensions/shumway/chrome/StartupInfo.jsm
browser/extensions/shumway/chrome/bootstrap-content.js
browser/extensions/shumway/chrome/content.html
browser/extensions/shumway/chrome/content.js
browser/extensions/shumway/chrome/pingpong.js
browser/extensions/shumway/chrome/plugin.js
browser/extensions/shumway/chrome/viewer.wrapper.html
browser/extensions/shumway/chrome/viewerDebugger.js
browser/extensions/shumway/chrome/viewerWrapper.js
browser/extensions/shumway/content/ShumwayBootstrapUtils.jsm
browser/extensions/shumway/content/ShumwayStreamConverter.jsm
browser/extensions/shumway/content/ShumwayTelemetry.jsm
browser/extensions/shumway/content/ShumwayUtils.jsm
browser/extensions/shumway/content/gfx/gl/shaders/combined.frag
browser/extensions/shumway/content/gfx/gl/shaders/combined.vert
browser/extensions/shumway/content/libs/builtin.abc
browser/extensions/shumway/content/playerglobal/playerglobal.abcs
browser/extensions/shumway/content/playerglobal/playerglobal.json
browser/extensions/shumway/content/shumway.gfx.js
browser/extensions/shumway/content/shumway.player.js
browser/extensions/shumway/content/version.txt
browser/extensions/shumway/content/web/noflv.mp4
browser/extensions/shumway/content/web/viewer.gfx.html
browser/extensions/shumway/content/web/viewer.html
browser/extensions/shumway/content/web/viewer.js
browser/extensions/shumway/content/web/viewer.player.html
browser/extensions/shumway/content/web/viewerGfx.js
browser/extensions/shumway/content/web/viewerPlayer.js
browser/extensions/shumway/content/web/worker.js
browser/extensions/shumway/jar.mn
browser/extensions/shumway/moz.build
dom/plugins/ipc/PluginInstanceParent.cpp
dom/plugins/ipc/PluginInstanceParent.h
dom/plugins/ipc/PluginModuleParent.cpp
mobile/android/base/WebappFragmentRepeater.inc
mobile/android/base/WebappManifestFragment.xml.frag.in
mobile/android/base/java/org/mozilla/gecko/Webapp.java
mobile/android/base/java/org/mozilla/gecko/webapp/Allocator.java
mobile/android/base/java/org/mozilla/gecko/webapp/ApkResources.java
mobile/android/base/java/org/mozilla/gecko/webapp/Dispatcher.java
mobile/android/base/java/org/mozilla/gecko/webapp/EventListener.java
mobile/android/base/java/org/mozilla/gecko/webapp/InstallHelper.java
mobile/android/base/java/org/mozilla/gecko/webapp/InstallListener.java
mobile/android/base/java/org/mozilla/gecko/webapp/TaskKiller.java
mobile/android/base/java/org/mozilla/gecko/webapp/UninstallListener.java
mobile/android/base/java/org/mozilla/gecko/webapp/WebappImpl.java
mobile/android/base/java/org/mozilla/gecko/webapp/Webapps.java
mobile/android/base/resources/layout/web_app.xml
mobile/android/chrome/content/WebappRT.js
mobile/android/components/WebappsUpdateTimer.js
mobile/android/locales/en-US/chrome/webapp.properties
mobile/android/modules/WebappManager.jsm
mobile/android/modules/WebappManagerWorker.js
--- a/.eslintignore
+++ b/.eslintignore
@@ -67,17 +67,16 @@ browser/components/feeds/**
 browser/components/preferences/**
 browser/components/privatebrowsing/**
 browser/components/sessionstore/**
 browser/components/shell/**
 browser/components/tabview/**
 browser/components/translation/**
 browser/extensions/pdfjs/**
 browser/extensions/pocket/content/panels/js/vendor/**
-browser/extensions/shumway/**
 browser/locales/**
 
 # Ignore all of loop since it is imported from github and checked at source.
 browser/extensions/loop/**
 
 # devtools/ exclusions
 devtools/*.js
 devtools/client/canvasdebugger/**
@@ -147,20 +146,16 @@ mobile/android/chrome/content/about.js
 
 # Not much JS to lint and non-standard at that
 mobile/android/installer/
 mobile/android/locales/
 
 # Pretty sure we're disabling this one anyway
 mobile/android/modules/ContactService.jsm
 
-# es7 proposed: array comprehensions
-#   https://github.com/eslint/espree/issues/125
-mobile/android/modules/WebappManager.jsm
-
 # Non-standard `(catch ex if ...)`
 mobile/android/components/Snippets.js
 
 # Bug 1178739: Ignore this file as a quick fix for "Illegal yield expression"
 mobile/android/modules/HomeProvider.jsm
 
 # services/ exclusions
 
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -1392,21 +1392,16 @@ pref("pdfjs.disabled", false);
 // Used by pdf.js to know the first time firefox is run with it installed so it
 // can become the default pdf viewer.
 pref("pdfjs.firstRun", true);
 // The values of preferredAction and alwaysAskBeforeHandling before pdf.js
 // became the default.
 pref("pdfjs.previousHandler.preferredAction", 0);
 pref("pdfjs.previousHandler.alwaysAskBeforeHandling", false);
 
-// Shumway is only bundled in Nightly.
-#ifdef NIGHTLY_BUILD
-pref("shumway.disabled", true);
-#endif
-
 // The maximum amount of decoded image data we'll willingly keep around (we
 // might keep around more than this, but we'll try to get down to this value).
 // (This is intentionally on the high side; see bug 746055.)
 pref("image.mem.max_decoded_image_kb", 256000);
 
 pref("social.sidebar.unload_timeout_ms", 10000);
 
 // Activation from inside of share panel is possible if activationPanelEnabled
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -6643,16 +6643,28 @@ var gIdentityHandler = {
 
   enableMixedContentProtection() {
     gBrowser.selectedBrowser.messageManager.sendAsyncMessage(
       "MixedContent:ReenableProtection", {});
     BrowserReload();
     this._identityPopup.hidePopup();
   },
 
+  removeCertException() {
+    if (!this._uriHasHost) {
+      Cu.reportError("Trying to revoke a cert exception on a URI without a host?");
+      return;
+    }
+    let host = this._uri.host;
+    let port = this._uri.port > 0 ? this._uri.port : 443;
+    this._overrideService.clearValidityOverride(host, port);
+    BrowserReloadSkipCache();
+    this._identityPopup.hidePopup();
+  },
+
   /**
    * Helper to parse out the important parts of _sslStatus (of the SSL cert in
    * particular) for use in constructing identity UI strings
   */
   getIdentityData : function() {
     var result = {};
     var cert = this._sslStatus.serverCert;
 
--- a/browser/base/content/sanitize.js
+++ b/browser/base/content/sanitize.js
@@ -148,32 +148,38 @@ Sanitizer.prototype = {
 
     let annotateError = (name, ex) => {
       progress[name] = "failed";
       seenError = true;
       console.error("Error sanitizing " + name, ex);
     };
 
     // Array of objects in form { name, promise }.
-    // Name is the itemName and promise may be a promise, if the sanitization
-    // is asynchronous, or the function return value, if synchronous.
-    let promises = [];
+    // `name` is the item's name and `promise` may be a promise, if the
+    // sanitization is asynchronous, or the function return value, otherwise.
+    let handles = [];
     for (let itemName of itemsToClear) {
-      let item = this.items[itemName];
+      // Workaround for bug 449811.
+      let name = itemName;
+      let item = this.items[name];
       try {
-        // Note we need to catch errors here, otherwise Promise.all would stop
-        // at the first rejection.
-        promises.push(item.clear(range)
-                          .then(() => progress[itemName] = "cleared",
-                                ex => annotateError(itemName, ex)));
+        // Catch errors here, so later we can just loop through these.
+        handles.push({ name,
+                       promise: item.clear(range)
+                                    .then(() => progress[name] = "cleared",
+                                          ex => annotateError(name, ex))
+                     });
       } catch (ex) {
-        annotateError(itemName, ex);
+        annotateError(name, ex);
       }
     }
-    yield Promise.all(promises);
+    for (let handle of handles) {
+      progress[handle.name] = "blocking";
+      yield handle.promise;
+    }
 
     // Sanitization is complete.
     TelemetryStopwatch.finish("FX_SANITIZE_TOTAL", refObj);
     // Reset the inProgress preference since we were not killed during
     // sanitization.
     Preferences.reset(Sanitizer.PREF_SANITIZE_IN_PROGRESS);
     progress = {};
     if (seenError) {
--- a/browser/components/controlcenter/content/panel.inc.xul
+++ b/browser/components/controlcenter/content/panel.inc.xul
@@ -112,16 +112,22 @@
         <description id="identity-popup-content-owner"
                      when-connection="secure-ev"
                      class="header"/>
         <description id="identity-popup-content-supplemental"
                      when-connection="secure-ev"/>
         <description id="identity-popup-content-verifier"
                      when-connection="secure secure-ev secure-cert-user-overridden"/>
 
+        <!-- Remove Certificate Exception -->
+        <button when-connection="secure-cert-user-overridden"
+                label="&identity.removeCertException.label;"
+                accesskey="&identity.removeCertException.accesskey;"
+                oncommand="gIdentityHandler.removeCertException()"/>
+
         <!-- Connection is Not Secure -->
         <description when-connection="not-secure"
                      and-when-loginforms="secure">&identity.description.insecure;</description>
 
         <!-- Insecure login forms -->
         <description when-loginforms="insecure">&identity.description.insecureLoginForms; <label observes="identity-popup-insecure-login-forms-learn-more"/></description>
 
         <!-- Weak Cipher -->
--- a/browser/components/extensions/ext-commands.js
+++ b/browser/components/extensions/ext-commands.js
@@ -1,53 +1,234 @@
 /* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set sts=2 sw=2 et tw=80: */
 "use strict";
 
+Cu.import("resource://devtools/shared/event-emitter.js");
 Cu.import("resource://gre/modules/ExtensionUtils.jsm");
 
 var {
-   PlatformInfo,
+  EventManager,
+  PlatformInfo,
 } = ExtensionUtils;
 
-// WeakMap[Extension -> Map[name => Command]]
+const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
+
+// WeakMap[Extension -> CommandList]
 var commandsMap = new WeakMap();
 
-function Command(description, shortcut) {
-  this.description = description;
-  this.shortcut = shortcut;
+function CommandList(commandsObj, extensionID) {
+  this.commands = this.loadCommandsFromManifest(commandsObj);
+  this.keysetID = `ext-keyset-id-${makeWidgetId(extensionID)}`;
+  this.windowOpenListener = null;
+  this.register();
+  EventEmitter.decorate(this);
 }
 
+CommandList.prototype = {
+  /**
+   * Registers the commands to all open windows and to any which
+   * are later created.
+   */
+  register() {
+    for (let window of WindowListManager.browserWindows()) {
+      this.registerKeysToDocument(window.document);
+    }
+
+    this.windowOpenListener = (window) => {
+      this.registerKeysToDocument(window.document);
+    };
+
+    WindowListManager.addOpenListener(this.windowOpenListener);
+  },
+
+  /**
+   * Unregisters the commands from all open windows and stops commands
+   * from being registered to windows which are later created.
+   */
+  unregister() {
+    for (let window of WindowListManager.browserWindows()) {
+      let keyset = window.document.getElementById(this.keysetID);
+      if (keyset) {
+        keyset.remove();
+      }
+    }
+
+    WindowListManager.removeOpenListener(this.windowOpenListener);
+  },
+
+  /**
+   * Creates a Map from commands for each command in the manifest.commands object.
+   * @param {Object} commandsObj The manifest.commands JSON object.
+   */
+  loadCommandsFromManifest(commandsObj) {
+    let commands = new Map();
+    // For Windows, chrome.runtime expects 'win' while chrome.commands
+    // expects 'windows'.  We can special case this for now.
+    let os = PlatformInfo.os == "win" ? "windows" : PlatformInfo.os;
+    for (let name of Object.keys(commandsObj)) {
+      let command = commandsObj[name];
+      commands.set(name, {
+        description: command.description,
+        shortcut: command.suggested_key[os] || command.suggested_key.default,
+      });
+    }
+    return commands;
+  },
+
+  /**
+   * Registers the commands to a document.
+   * @param {Document} doc The XUL document to insert the Keyset.
+   */
+  registerKeysToDocument(doc) {
+    let keyset = doc.createElementNS(XUL_NS, "keyset");
+    keyset.id = this.keysetID;
+    this.commands.forEach((command, name) => {
+      let keyElement = this.buildKey(doc, name, command.shortcut);
+      keyset.appendChild(keyElement);
+    });
+    doc.documentElement.appendChild(keyset);
+  },
+
+  /**
+   * Builds a XUL Key element and attaches an onCommand listener which
+   * emits a command event with the provided name when fired.
+   *
+   * @param {Document} doc The XUL document.
+   * @param {String} name The name of the command.
+   * @param {String} shortcut The shortcut provided in the manifest.
+   * @see https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XUL/key
+   *
+   * @returns {Document} The newly created Key element.
+   */
+  buildKey(doc, name, shortcut) {
+    let keyElement = this.buildKeyFromShortcut(doc, shortcut);
+
+    // We need to have the attribute "oncommand" for the "command" listener to fire,
+    // and it is currently ignored when set to the empty string.
+    keyElement.setAttribute("oncommand", "//");
+
+    /* eslint-disable mozilla/balanced-listeners */
+    // We remove all references to the key elements when the extension is shutdown,
+    // therefore the listeners for these elements will be garbage collected.
+    keyElement.addEventListener("command", (event) => {
+      this.emit("command", name);
+    });
+    /* eslint-enable mozilla/balanced-listeners */
+
+    return keyElement;
+  },
+
+  /**
+   * Builds a XUL Key element from the provided shortcut.
+   *
+   * @param {Document} doc The XUL document.
+   * @param {String} name The name of the command.
+   * @param {String} shortcut The shortcut provided in the manifest.
+   *
+   * @see https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XUL/key
+   * @returns {Document} The newly created Key element.
+   */
+  buildKeyFromShortcut(doc, shortcut) {
+    let keyElement = doc.createElementNS(XUL_NS, "key");
+
+    let parts = shortcut.split("+");
+
+    // The key is always the last element.
+    let chromeKey = parts.pop();
+
+    // The modifiers are the remaining elements.
+    keyElement.setAttribute("modifiers", this.getModifiersAttribute(parts));
+
+    if (/^[A-Z0-9]$/.test(chromeKey)) {
+      // We use the key attribute for all single digits and characters.
+      keyElement.setAttribute("key", chromeKey);
+    } else {
+      keyElement.setAttribute("keycode", this.getKeycodeAttribute(chromeKey));
+    }
+
+    return keyElement;
+  },
+
+  /**
+   * Determines the corresponding XUL keycode from the given chrome key.
+   *
+   * For example:
+   *
+   *    input     |  output
+   *    ---------------------------------------
+   *    "PageUP"  |  "VK_PAGE_UP"
+   *    "Delete"  |  "VK_DELETE"
+   *
+   * @param {String} key The chrome key (e.g. "PageUp", "Space", ...)
+   * @return The constructed value for the Key's 'keycode' attribute.
+   */
+  getKeycodeAttribute(chromeKey) {
+    return `VK${chromeKey.replace(/([A-Z])/g, "_$&").toUpperCase()}`;
+  },
+
+  /**
+   * Determines the corresponding XUL modifiers from the chrome modifiers.
+   *
+   * For example:
+   *
+   *    input             |   output
+   *    ---------------------------------------
+   *    ["Ctrl", "Shift"] |   "accel shift"
+   *    ["MacCtrl"]       |   "control"
+   *
+   * @param {Array} chromeModifiers The array of chrome modifiers.
+   * @return The constructed value for the Key's 'modifiers' attribute.
+   */
+  getModifiersAttribute(chromeModifiers) {
+    let modifiersMap = {
+      "Alt"     : "alt",
+      "Command" : "accel",
+      "Ctrl"    : "accel",
+      "MacCtrl" : "control",
+      "Shift"   : "shift",
+    };
+    return Array.from(chromeModifiers, modifier => {
+      return modifiersMap[modifier];
+    }).join(" ");
+  },
+};
+
+
 /* eslint-disable mozilla/balanced-listeners */
 extensions.on("manifest_commands", (type, directive, extension, manifest) => {
-  let commands = new Map();
-  for (let name of Object.keys(manifest.commands)) {
-    let os = PlatformInfo.os == "win" ? "windows" : PlatformInfo.os;
-    let manifestCommand = manifest.commands[name];
-    let description = manifestCommand.description;
-    let shortcut = manifestCommand.suggested_key[os] || manifestCommand.suggested_key.default;
-    let command = new Command(description, shortcut);
-    commands.set(name, command);
-  }
-  commandsMap.set(extension, commands);
+  commandsMap.set(extension, new CommandList(manifest.commands, extension.id));
 });
 
 extensions.on("shutdown", (type, extension) => {
-  commandsMap.delete(extension);
+  let commandsList = commandsMap.get(extension);
+  if (commandsList) {
+    commandsList.unregister();
+    commandsMap.delete(extension);
+  }
 });
 /* eslint-enable mozilla/balanced-listeners */
 
 extensions.registerSchemaAPI("commands", null, (extension, context) => {
   return {
     commands: {
       getAll() {
-        let commands = Array.from(commandsMap.get(extension), ([name, command]) => {
+        let commands = commandsMap.get(extension).commands;
+        return Promise.resolve(Array.from(commands, ([name, command]) => {
           return ({
             name,
             description: command.description,
             shortcut: command.shortcut,
           });
-        });
-        return Promise.resolve(commands);
+        }));
       },
+      onCommand: new EventManager(context, "commands.onCommand", fire => {
+        let listener = (event, name) => {
+          fire(name);
+        };
+        commandsMap.get(extension).on("command", listener);
+        return () => {
+          commandsMap.get(extension).off("command", listener);
+        };
+      }).api(),
     },
   };
 });
--- a/browser/components/extensions/ext-tabs.js
+++ b/browser/components/extensions/ext-tabs.js
@@ -823,22 +823,36 @@ extensions.registerSchemaAPI("tabs", nul
       duplicate: function(tabId) {
         let tab = TabManager.getTab(tabId);
         if (!tab) {
           return Promise.reject({message: `Invalid tab ID: ${tabId}`});
         }
 
         let gBrowser = tab.ownerDocument.defaultView.gBrowser;
         let newTab = gBrowser.duplicateTab(tab);
-        gBrowser.moveTabTo(newTab, tab._tPos + 1);
-        gBrowser.selectTabAtIndex(newTab._tPos);
 
         return new Promise(resolve => {
+          // We need to use SSTabRestoring because any attributes set before
+          // are ignored. SSTabRestored is too late and results in a jump in
+          // the UI. See http://bit.ly/session-store-api for more information.
+          newTab.addEventListener("SSTabRestoring", function listener() {
+            // As the tab is restoring, move it to the correct position.
+            newTab.removeEventListener("SSTabRestoring", listener);
+            // Pinned tabs that are duplicated are inserted
+            // after the existing pinned tab and pinned.
+            if (tab.pinned) {
+              gBrowser.pinTab(newTab);
+            }
+            gBrowser.moveTabTo(newTab, tab._tPos + 1);
+          });
+
           newTab.addEventListener("SSTabRestored", function listener() {
+            // Once it has been restored, select it and return the promise.
             newTab.removeEventListener("SSTabRestored", listener);
+            gBrowser.selectedTab = newTab;
             return resolve(TabManager.convert(extension, newTab));
           });
         });
       },
     },
   };
   return self;
 });
--- a/browser/components/extensions/schemas/commands.json
+++ b/browser/components/extensions/schemas/commands.json
@@ -102,17 +102,16 @@
             "description": "The shortcut active for this command, or blank if not active."
           }
         }
       }
     ],
     "events": [
       {
         "name": "onCommand",
-        "unsupported": true,
         "description": "Fired when a registered command is activated using a keyboard shortcut.",
         "type": "function",
         "parameters": [
           {
             "name": "command",
             "type": "string"
           }
         ]
--- a/browser/components/extensions/test/browser/browser.ini
+++ b/browser/components/extensions/test/browser/browser.ini
@@ -6,27 +6,28 @@ support-files =
   context_tabs_onUpdated_page.html
   context_tabs_onUpdated_iframe.html
   file_popup_api_injection_a.html
   file_popup_api_injection_b.html
   file_iframe_document.html
   file_iframe_document.sjs
 
 [browser_ext_simple.js]
-[browser_ext_commands.js]
 [browser_ext_currentWindow.js]
 [browser_ext_browserAction_simple.js]
 [browser_ext_browserAction_pageAction_icon.js]
 [browser_ext_browserAction_context.js]
 [browser_ext_browserAction_disabled.js]
 [browser_ext_pageAction_context.js]
 [browser_ext_pageAction_popup.js]
 [browser_ext_browserAction_popup.js]
 [browser_ext_popup_api_injection.js]
 [browser_ext_contextMenus.js]
+[browser_ext_commands_getAll.js]
+[browser_ext_commands_onCommand.js]
 [browser_ext_getViews.js]
 [browser_ext_lastError.js]
 [browser_ext_runtime_setUninstallURL.js]
 [browser_ext_tabs_audio.js]
 [browser_ext_tabs_captureVisibleTab.js]
 [browser_ext_tabs_events.js]
 [browser_ext_tabs_executeScript.js]
 [browser_ext_tabs_executeScript_good.js]
deleted file mode 100644
--- a/browser/components/extensions/test/browser/browser_ext_commands.js
+++ /dev/null
@@ -1,81 +0,0 @@
-/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* vim: set sts=2 sw=2 et tw=80: */
-"use strict";
-
-var {AppConstants} = Cu.import("resource://gre/modules/AppConstants.jsm");
-
-add_task(function* () {
-  let extension = ExtensionTestUtils.loadExtension({
-    manifest: {
-      "name": "Commands Extension",
-      "commands": {
-        "with-desciption": {
-          "suggested_key": {
-            "default": "Ctrl+Shift+Y",
-          },
-          "description": "should have a description",
-        },
-        "without-description": {
-          "suggested_key": {
-            "default": "Ctrl+Shift+D",
-          },
-        },
-        "with-platform-info": {
-          "suggested_key": {
-            "mac": "Ctrl+Shift+M",
-            "linux": "Ctrl+Shift+L",
-            "windows": "Ctrl+Shift+W",
-            "android": "Ctrl+Shift+A",
-          },
-        },
-      },
-    },
-
-    background: function() {
-      browser.test.onMessage.addListener((message, additionalScope) => {
-        browser.commands.getAll((commands) => {
-          let errorMessage = "getAll should return an array of commands";
-          browser.test.assertEq(commands.length, 3, errorMessage);
-
-          let command = commands.find(c => c.name == "with-desciption");
-
-          errorMessage = "The description should match what is provided in the manifest";
-          browser.test.assertEq("should have a description", command.description, errorMessage);
-
-          errorMessage = "The shortcut should match the default shortcut provided in the manifest";
-          browser.test.assertEq("Ctrl+Shift+Y", command.shortcut, errorMessage);
-
-          command = commands.find(c => c.name == "without-description");
-
-          errorMessage = "The description should be empty when it is not provided";
-          browser.test.assertEq(null, command.description, errorMessage);
-
-          errorMessage = "The shortcut should match the default shortcut provided in the manifest";
-          browser.test.assertEq("Ctrl+Shift+D", command.shortcut, errorMessage);
-
-          let platformKeys = {
-            macosx: "M",
-            linux: "L",
-            win: "W",
-            android: "A",
-          };
-
-          command = commands.find(c => c.name == "with-platform-info");
-          let platformKey = platformKeys[additionalScope.platform];
-          let shortcut = `Ctrl+Shift+${platformKey}`;
-          errorMessage = `The shortcut should match the one provided in the manifest for OS='${additionalScope.platform}'`;
-          browser.test.assertEq(shortcut, command.shortcut, errorMessage);
-
-          browser.test.notifyPass("commands");
-        });
-      });
-      browser.test.sendMessage("ready");
-    },
-  });
-
-  yield extension.startup();
-  yield extension.awaitMessage("ready");
-  extension.sendMessage("additional-scope", {platform: AppConstants.platform});
-  yield extension.awaitFinish("commands");
-  yield extension.unload();
-});
new file mode 100644
--- /dev/null
+++ b/browser/components/extensions/test/browser/browser_ext_commands_getAll.js
@@ -0,0 +1,81 @@
+/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* vim: set sts=2 sw=2 et tw=80: */
+"use strict";
+
+var {AppConstants} = Cu.import("resource://gre/modules/AppConstants.jsm");
+
+add_task(function* () {
+  let extension = ExtensionTestUtils.loadExtension({
+    manifest: {
+      "name": "Commands Extension",
+      "commands": {
+        "with-desciption": {
+          "suggested_key": {
+            "default": "Ctrl+Shift+Y",
+          },
+          "description": "should have a description",
+        },
+        "without-description": {
+          "suggested_key": {
+            "default": "Ctrl+Shift+D",
+          },
+        },
+        "with-platform-info": {
+          "suggested_key": {
+            "mac": "Ctrl+Shift+M",
+            "linux": "Ctrl+Shift+L",
+            "windows": "Ctrl+Shift+W",
+            "android": "Ctrl+Shift+A",
+          },
+        },
+      },
+    },
+
+    background: function() {
+      browser.test.onMessage.addListener((message, additionalScope) => {
+        browser.commands.getAll((commands) => {
+          let errorMessage = "getAll should return an array of commands";
+          browser.test.assertEq(commands.length, 3, errorMessage);
+
+          let command = commands.find(c => c.name == "with-desciption");
+
+          errorMessage = "The description should match what is provided in the manifest";
+          browser.test.assertEq("should have a description", command.description, errorMessage);
+
+          errorMessage = "The shortcut should match the default shortcut provided in the manifest";
+          browser.test.assertEq("Ctrl+Shift+Y", command.shortcut, errorMessage);
+
+          command = commands.find(c => c.name == "without-description");
+
+          errorMessage = "The description should be empty when it is not provided";
+          browser.test.assertEq(null, command.description, errorMessage);
+
+          errorMessage = "The shortcut should match the default shortcut provided in the manifest";
+          browser.test.assertEq("Ctrl+Shift+D", command.shortcut, errorMessage);
+
+          let platformKeys = {
+            macosx: "M",
+            linux: "L",
+            win: "W",
+            android: "A",
+          };
+
+          command = commands.find(c => c.name == "with-platform-info");
+          let platformKey = platformKeys[additionalScope.platform];
+          let shortcut = `Ctrl+Shift+${platformKey}`;
+          errorMessage = `The shortcut should match the one provided in the manifest for OS='${additionalScope.platform}'`;
+          browser.test.assertEq(shortcut, command.shortcut, errorMessage);
+
+          browser.test.notifyPass("commands");
+        });
+      });
+      browser.test.sendMessage("ready");
+    },
+  });
+
+  yield extension.startup();
+  yield extension.awaitMessage("ready");
+  extension.sendMessage("additional-scope", {platform: AppConstants.platform});
+  yield extension.awaitFinish("commands");
+  yield extension.unload();
+});
new file mode 100644
--- /dev/null
+++ b/browser/components/extensions/test/browser/browser_ext_commands_onCommand.js
@@ -0,0 +1,74 @@
+/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* vim: set sts=2 sw=2 et tw=80: */
+"use strict";
+
+add_task(function* () {
+  // Create a window before the extension is loaded.
+  let win1 = yield BrowserTestUtils.openNewBrowserWindow();
+  yield BrowserTestUtils.loadURI(win1.gBrowser.selectedBrowser, "about:robots");
+  yield BrowserTestUtils.browserLoaded(win1.gBrowser.selectedBrowser);
+
+  let extension = ExtensionTestUtils.loadExtension({
+    manifest: {
+      "name": "Commands Extension",
+      "commands": {
+        "toggle-feature-using-alt-shift-3": {
+          "suggested_key": {
+            "default": "Alt+Shift+3",
+          },
+        },
+        "toggle-feature-using-alt-shift-comma": {
+          "suggested_key": {
+            "default": "Alt+Shift+Comma",
+          },
+        },
+      },
+    },
+
+    background: function() {
+      browser.commands.onCommand.addListener((message) => {
+        browser.test.sendMessage("oncommand", message);
+      });
+      browser.test.sendMessage("ready");
+    },
+  });
+
+  yield extension.startup();
+  yield extension.awaitMessage("ready");
+
+  // Create another window after the extension is loaded.
+  let win2 = yield BrowserTestUtils.openNewBrowserWindow();
+  yield BrowserTestUtils.loadURI(win2.gBrowser.selectedBrowser, "about:config");
+  yield BrowserTestUtils.browserLoaded(win2.gBrowser.selectedBrowser);
+
+  // Confirm the keysets have been added to both windows.
+  let keysetID = `ext-keyset-id-${makeWidgetId(extension.id)}`;
+  let keyset = win1.document.getElementById(keysetID);
+  is(keyset.childNodes.length, 2, "Expected keyset to exist and have 2 children");
+
+  keyset = win2.document.getElementById(keysetID);
+  is(keyset.childNodes.length, 2, "Expected keyset to exist and have 2 children");
+
+  // Confirm that the commands are registered to both windows.
+  yield focusWindow(win1);
+  EventUtils.synthesizeKey("3", {altKey: true, shiftKey: true});
+  let message = yield extension.awaitMessage("oncommand");
+  is(message, "toggle-feature-using-alt-shift-3", "Expected onCommand listener to fire with correct message");
+
+  yield focusWindow(win2);
+  EventUtils.synthesizeKey("VK_COMMA", {altKey: true, shiftKey: true});
+  message = yield extension.awaitMessage("oncommand");
+  is(message, "toggle-feature-using-alt-shift-comma", "Expected onCommand listener to fire with correct message");
+
+  yield extension.unload();
+
+  // Confirm that the keysets have been removed from both windows after the extension is unloaded.
+  keyset = win1.document.getElementById(keysetID);
+  is(keyset, null, "Expected keyset to be removed from the window");
+
+  keyset = win2.document.getElementById(keysetID);
+  is(keyset, null, "Expected keyset to be removed from the window");
+
+  yield BrowserTestUtils.closeWindow(win1);
+  yield BrowserTestUtils.closeWindow(win2);
+});
--- a/browser/components/extensions/test/browser/browser_ext_tabs_duplicate.js
+++ b/browser/components/extensions/test/browser/browser_ext_tabs_duplicate.js
@@ -30,15 +30,47 @@ add_task(function* testDuplicateTab() {
       });
     },
   });
 
   yield extension.startup();
   yield extension.awaitFinish("tabs.duplicate");
   yield extension.unload();
 
-  while (window.gBrowser.tabs.length > 1) {
-    let tab = window.gBrowser.tabs[0];
-    if (tab.linkedBrowser.currentURI.spec === "http://example.net/") {
-      yield BrowserTestUtils.removeTab(tab);
-    }
+  while (gBrowser.tabs[0].linkedBrowser.currentURI.spec === "http://example.net/") {
+    yield BrowserTestUtils.removeTab(gBrowser.tabs[0]);
   }
 });
+
+add_task(function* testDuplicatePinnedTab() {
+  let tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, "http://example.net/");
+  gBrowser.pinTab(tab);
+
+  let extension = ExtensionTestUtils.loadExtension({
+    manifest: {
+      "permissions": ["tabs"],
+    },
+
+    background: function() {
+      browser.tabs.query({
+        lastFocusedWindow: true,
+      }, function(tabs) {
+        // Duplicate the pinned tab, example.net.
+        browser.tabs.duplicate(tabs[0].id, (tab) => {
+          browser.test.assertEq("http://example.net/", tab.url);
+          // Should be the second tab, next to the one duplicated.
+          browser.test.assertEq(1, tab.index);
+          // Should be pinned.
+          browser.test.assertTrue(tab.pinned);
+          browser.test.notifyPass("tabs.duplicate.pinned");
+        });
+      });
+    },
+  });
+
+  yield extension.startup();
+  yield extension.awaitFinish("tabs.duplicate.pinned");
+  yield extension.unload();
+
+  while (gBrowser.tabs[0].linkedBrowser.currentURI.spec === "http://example.net/") {
+    yield BrowserTestUtils.removeTab(gBrowser.tabs[0]);
+  }
+});
--- a/browser/components/nsBrowserGlue.js
+++ b/browser/components/nsBrowserGlue.js
@@ -59,21 +59,16 @@ XPCOMUtils.defineLazyModuleGetter(this, 
                                   "resource://gre/modules/PageThumbs.jsm");
 
 XPCOMUtils.defineLazyModuleGetter(this, "PdfJs",
                                   "resource://pdf.js/PdfJs.jsm");
 
 XPCOMUtils.defineLazyModuleGetter(this, "ProcessHangMonitor",
                                   "resource:///modules/ProcessHangMonitor.jsm");
 
-if (AppConstants.NIGHTLY_BUILD) {
-  XPCOMUtils.defineLazyModuleGetter(this, "ShumwayUtils",
-                                    "resource://shumway/ShumwayUtils.jsm");
-}
-
 XPCOMUtils.defineLazyModuleGetter(this, "webrtcUI",
                                   "resource:///modules/webrtcUI.jsm");
 
 XPCOMUtils.defineLazyModuleGetter(this, "PrivateBrowsingUtils",
                                   "resource://gre/modules/PrivateBrowsingUtils.jsm");
 
 XPCOMUtils.defineLazyModuleGetter(this, "RecentWindow",
                                   "resource:///modules/RecentWindow.jsm");
@@ -990,23 +985,16 @@ BrowserGlue.prototype = {
     // shim for privileged api access.
     PdfJs.init(true);
     // child only: similar to the call above for parent - register content
     // handler and init message manager child shim for privileged api access.
     // With older versions of the extension installed, this load will fail
     // passively.
     Services.ppmm.loadProcessScript("resource://pdf.js/pdfjschildbootstrap.js", true);
 
-    if (AppConstants.NIGHTLY_BUILD) {
-      // Registering Shumway bootstrap script the child processes.
-      Services.ppmm.loadProcessScript("chrome://shumway/content/bootstrap-content.js", true);
-      // Initializing Shumway (shall be run after child script registration).
-      ShumwayUtils.init();
-    }
-
     if (AppConstants.platform == "win") {
       // For Windows 7, initialize the jump list module.
       const WINTASKBAR_CONTRACTID = "@mozilla.org/windows-taskbar;1";
       if (WINTASKBAR_CONTRACTID in Cc &&
           Cc[WINTASKBAR_CONTRACTID].getService(Ci.nsIWinTaskbar).available) {
         let temp = {};
         Cu.import("resource:///modules/WindowsJumpLists.jsm", temp);
         temp.WinTaskbarJumpList.startup();
--- a/browser/components/places/tests/browser/browser.ini
+++ b/browser/components/places/tests/browser/browser.ini
@@ -28,17 +28,16 @@ support-files =
 [browser_bookmarkProperties_addLivemark.js]
 [browser_bookmarkProperties_editTagContainer.js]
 [browser_bookmarkProperties_readOnlyRoot.js]
 [browser_bookmarksProperties.js]
 [browser_drag_bookmarks_on_toolbar.js]
 skip-if = e10s # Bug ?????? - test fails - "Number of dragged items should be the same. - Got 0, expected 1"
 [browser_forgetthissite_single.js]
 [browser_history_sidebar_search.js]
-skip-if = e10s && (os == 'linux' || os == 'mac') # Bug 1116457
 [browser_library_batch_delete.js]
 [browser_library_commands.js]
 [browser_library_downloads.js]
 [browser_library_infoBox.js]
 [browser_library_left_pane_fixnames.js]
 [browser_library_left_pane_select_hierarchy.js]
 [browser_library_middleclick.js]
 [browser_library_open_leak.js]
--- a/browser/components/places/tests/browser/browser_history_sidebar_search.js
+++ b/browser/components/places/tests/browser/browser_history_sidebar_search.js
@@ -1,89 +1,64 @@
-/* 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/. */
-
-/**
- * Bug 392497 - search in history sidebar loses sort
- */
+add_task(function* test () {
+  let sidebar = document.getElementById("sidebar");
 
-var hs = Cc["@mozilla.org/browser/nav-history-service;1"].
-         getService(Ci.nsINavHistoryService);
-var bh = hs.QueryInterface(Ci.nsIBrowserHistory);
-var ios = Cc["@mozilla.org/network/io-service;1"].
-          getService(Ci.nsIIOService);
-function uri(spec) {
-  return ios.newURI(spec, null, null);
-}
+  // Visited pages listed by descending visit date.
+  let pages = [
+    "http://sidebar.mozilla.org/a",
+    "http://sidebar.mozilla.org/b",
+    "http://sidebar.mozilla.org/c",
+    "http://www.mozilla.org/d",
+  ];
 
-var sidebar = document.getElementById("sidebar");
+  // Number of pages that will be filtered out by the search.
+  const FILTERED_COUNT = 1;
+
+  yield PlacesTestUtils.clearHistory();
 
-// Visited pages listed by descending visit date.
-var pages = [
-  "http://sidebar.mozilla.org/a",
-  "http://sidebar.mozilla.org/b",
-  "http://sidebar.mozilla.org/c",
-  "http://www.mozilla.org/d",
-];
-// Number of pages that will be filtered out by the search.
-const FILTERED_COUNT = 1;
-
-function test() {
-  waitForExplicitFinish();
+  // Add some visited page.
+  let time = Date.now();
+  let places = [];
+  for (let i = 0; i < pages.length; i++) {
+    places.push({ uri: NetUtil.newURI(pages[i]),
+                  visitDate: (time - i) * 1000,
+                  transition: PlacesUtils.history.TRANSITION_TYPED });
+  }
+  yield PlacesTestUtils.addVisits(places);
 
-  // Cleanup.
-  PlacesTestUtils.clearHistory().then(continue_test);
-}
+  yield withSidebarTree("history", function* () {
+    info("Set 'by last visited' view");
+    sidebar.contentDocument.getElementById("bylastvisited").doCommand();
+    let tree = sidebar.contentDocument.getElementById("historyTree");
+    check_tree_order(tree, pages);
 
-function continue_test() {
-  // Add some visited page.
-  var time = Date.now();
-  var pagesLength = pages.length;
-  var places = [];
-  for (var i = 0; i < pagesLength; i++) {
-    places.push({uri: uri(pages[i]), visitDate: (time - i) * 1000,
-                 transition: hs.TRANSITION_TYPED});
-  }
-  PlacesTestUtils.addVisits(places).then(() => {
-    SidebarUI.show("viewHistorySidebar");
+    // Set a search value.
+    let searchBox = sidebar.contentDocument.getElementById("search-box");
+    ok(searchBox, "search box is in context");
+    searchBox.value = "sidebar.mozilla";
+    searchBox.doCommand();
+    check_tree_order(tree, pages, -FILTERED_COUNT);
+
+    info("Reset the search");
+    searchBox.value = "";
+    searchBox.doCommand();
+    check_tree_order(tree, pages);
   });
 
-  sidebar.addEventListener("load", function() {
-    sidebar.removeEventListener("load", arguments.callee, true);
-    executeSoon(function() {
-      // Set "by last visited" in the sidebar (sort by visit date descendind).
-      sidebar.contentDocument.getElementById("bylastvisited").doCommand();
-      check_sidebar_tree_order(pages.length);
-      var searchBox = sidebar.contentDocument.getElementById("search-box");
-      ok(searchBox, "search box is in context");
-      searchBox.value = "sidebar.mozilla";
-      searchBox.doCommand();
-      check_sidebar_tree_order(pages.length - FILTERED_COUNT);
-      searchBox.value = "";
-      searchBox.doCommand();
-      check_sidebar_tree_order(pages.length);
+  yield PlacesTestUtils.clearHistory();
+});
 
-      // Cleanup.
-      SidebarUI.hide();
-      PlacesTestUtils.clearHistory().then(finish);
-    });
-  }, true);
-}
+function check_tree_order(tree, pages, aNumberOfRowsDelta = 0) {
+  let treeView = tree.view;
+  let columns = tree.columns;
+  is(columns.count, 1, "There should be only 1 column in the sidebar");
 
-function check_sidebar_tree_order(aExpectedRows) {
-  var tree = sidebar.contentDocument.getElementById("historyTree");
-  var treeView = tree.view;
-  var rc = treeView.rowCount;
-  var columns = tree.columns;
-  is(columns.count, 1, "There should be only 1 column in the sidebar");
-  var found = 0;
-  for (var r = 0; r < rc; r++) {
-    var node = treeView.nodeForTreeIndex(r);
-    // We could inherit visits from previous tests, skip them since they are
-    // not interesting for us.
+  let found = 0;
+  for (let i = 0; i < treeView.rowCount; i++) {
+    let node = treeView.nodeForTreeIndex(i);
+    // We could inherit delayed visits from previous tests, skip them.
     if (!pages.includes(node.uri))
       continue;
-    is(node.uri, pages[r], "Node is in correct position based on its visit date");
+    is(node.uri, pages[i], "Node is in correct position based on its visit date");
     found++;
   }
-  ok(found, aExpectedRows, "Found all expected results");
+  ok(found, pages.length + aNumberOfRowsDelta, "Found all expected results");
 }
--- a/browser/extensions/moz.build
+++ b/browser/extensions/moz.build
@@ -3,10 +3,9 @@
 # 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/.
 
 DIRS += [
     'loop',
     'pdfjs',
     'pocket',
-    'shumway',
 ]
deleted file mode 100644
--- a/browser/extensions/shumway/LICENSE
+++ /dev/null
@@ -1,178 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
deleted file mode 100644
--- a/browser/extensions/shumway/chrome.manifest
+++ /dev/null
@@ -1,2 +0,0 @@
-content shumway chrome/
-resource shumway content/
deleted file mode 100644
--- a/browser/extensions/shumway/chrome/ExternalInterface.jsm
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Copyright 2015 Mozilla Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var EXPORTED_SYMBOLS = ['ExternalInterface'];
-
-Components.utils.import('resource://gre/modules/Services.jsm');
-
-// Helper class to forward external interface messages between chrome code and
-// content window / object element.
-function ExternalInterface(window, embedTag, callback) {
-  this.window = window;
-  this.embedTag = embedTag;
-  this.callback = callback;
-  this.externalComInitialized = false;
-}
-ExternalInterface.prototype = {
-  processAction: function (data) {
-    var parentWindow = this.window;
-    var embedTag = this.embedTag;
-
-    switch (data.action) {
-      case 'init':
-        if (this.externalComInitialized)
-          return;
-
-        this.externalComInitialized = true;
-        this.initExternalCom(parentWindow, embedTag, this.callback);
-        return;
-      case 'getId':
-        return embedTag.id;
-      case 'eval':
-        return this.__flash__eval(data.expression);
-      case 'call':
-        return this.__flash__call(data.request);
-      case 'register':
-        return this.__flash__registerCallback(data.functionName);
-      case 'unregister':
-        return this.__flash__unregisterCallback(data.functionName);
-    }
-  },
-
-  initExternalCom: function (window, embedTag, onExternalCallback) {
-    var traceExternalInterface = getBoolPref('shumway.externalInterface.trace', false);
-    // Initialize convenience functions. Notice that these functions are
-    // exposed to the content via Cu.exportFunction, so be careful (e.g. don't
-    // use `this` pointer).
-    this.__flash__toXML = function __flash__toXML(obj) {
-      switch (typeof obj) {
-        case 'boolean':
-          return obj ? '<true/>' : '<false/>';
-        case 'number':
-          return '<number>' + obj + '</number>';
-        case 'object':
-          if (obj === null) {
-            return '<null/>';
-          }
-          if ('hasOwnProperty' in obj && obj.hasOwnProperty('length')) {
-            // array
-            var xml = '<array>';
-            for (var i = 0; i < obj.length; i++) {
-              xml += '<property id="' + i + '">' + __flash__toXML(obj[i]) + '</property>';
-            }
-            return xml + '</array>';
-          }
-          var xml = '<object>';
-          for (var i in obj) {
-            xml += '<property id="' + i + '">' + __flash__toXML(obj[i]) + '</property>';
-          }
-          return xml + '</object>';
-        case 'string':
-          return '<string>' + obj.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;') + '</string>';
-        case 'undefined':
-          return '<undefined/>';
-      }
-    };
-    this.__flash__eval = function (expr) {
-      traceExternalInterface && window.console.log('__flash__eval: ' + expr);
-      // allowScriptAccess protects page from unwanted swf scripts,
-      // we can execute script in the page context without restrictions.
-      var result = window.eval(expr);
-      traceExternalInterface && window.console.log('__flash__eval (result): ' + result);
-      return result;
-    };
-    this.__flash__call = function (expr) {
-      traceExternalInterface && window.console.log('__flash__call (ignored): ' + expr);
-    };
-
-    this.__flash__registerCallback = function (functionName) {
-      traceExternalInterface && window.console.log('__flash__registerCallback: ' + functionName);
-      Components.utils.exportFunction(function () {
-        var args = Array.prototype.slice.call(arguments, 0);
-        traceExternalInterface && window.console.log('__flash__callIn: ' + functionName);
-        var result;
-        if (onExternalCallback) {
-          result = onExternalCallback({functionName: functionName, args: args});
-          traceExternalInterface && window.console.log('__flash__callIn (result): ' + result);
-        }
-        return window.eval(result);
-      }, embedTag.wrappedJSObject, {defineAs: functionName});
-    };
-    this.__flash__unregisterCallback = function (functionName) {
-      traceExternalInterface && window.console.log('__flash__unregisterCallback: ' + functionName);
-      delete embedTag.wrappedJSObject[functionName];
-    };
-
-    this.exportInterfaceFunctions();
-  },
-
-  exportInterfaceFunctions: function () {
-    var window = this.window;
-    // We need to export window functions only once.
-    if (!window.wrappedJSObject.__flash__initialized) {
-      window.wrappedJSObject.__flash__initialized = true;
-      // JavaScript eval'ed code use those functions.
-      // TODO find the case when JavaScript code patches those
-      // __flash__toXML will be called by the eval'ed code.
-      Components.utils.exportFunction(this.__flash__toXML, window.wrappedJSObject,
-        {defineAs: '__flash__toXML'});
-      // The functions below are used for compatibility and are not called by chrome code.
-      Components.utils.exportFunction(this.__flash__eval, window.wrappedJSObject,
-        {defineAs: '__flash__eval'});
-      Components.utils.exportFunction(this.__flash__call, window.wrappedJSObject,
-        {defineAs: '__flash__call'});
-    }
-  }
-};
-
-function getBoolPref(pref, def) {
-  try {
-    return Services.prefs.getBoolPref(pref);
-  } catch (ex) {
-    return def;
-  }
-}
deleted file mode 100644
--- a/browser/extensions/shumway/chrome/FileLoader.jsm
+++ /dev/null
@@ -1,323 +0,0 @@
-/*
- * Copyright 2015 Mozilla Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var EXPORTED_SYMBOLS = ['FileLoader'];
-
-Components.utils.import('resource://gre/modules/Services.jsm');
-Components.utils.import('resource://gre/modules/Promise.jsm');
-Components.utils.import('resource://gre/modules/XPCOMUtils.jsm');
-Components.utils.import('resource://gre/modules/NetUtil.jsm');
-
-function FileLoaderSession(sessionId) {
-  this.sessionId = sessionId;
-  this.xhr = null;
-}
-FileLoaderSession.prototype = {
-  abort() {
-    if (this.xhr) {
-      this.xhr.abort();
-      this.xhr = null;
-    }
-  }
-};
-
-
-function FileLoader(swfUrl, baseUrl, refererUrl, callback) {
-  this.swfUrl = swfUrl;
-  this.baseUrl = baseUrl;
-  this.refererUrl = refererUrl;
-  this.callback = callback;
-  this.activeSessions = Object.create(null);
-
-  this.crossdomainRequestsCache = Object.create(null);
-}
-
-FileLoader.prototype = {
-  load: function (data) {
-    function notifyLoadFileListener(data) {
-      if (!onLoadFileCallback) {
-        return;
-      }
-      onLoadFileCallback(data);
-    }
-
-    var onLoadFileCallback = this.callback;
-    var crossdomainRequestsCache = this.crossdomainRequestsCache;
-    var baseUrl = this.baseUrl;
-    var swfUrl = this.swfUrl;
-
-    var url = data.url;
-    var checkPolicyFile = data.checkPolicyFile;
-    var sessionId = data.sessionId;
-    var limit = data.limit || 0;
-    var method = data.method || "GET";
-    var mimeType = data.mimeType;
-    var postData = data.postData || null;
-    var sendReferer = canSendReferer(swfUrl, this.refererUrl);
-
-    var session = new FileLoaderSession(sessionId);
-    this.activeSessions[sessionId] = session;
-    var self = this;
-
-    var performXHR = function () {
-      // Load has been aborted before we reached this point.
-      if (!self.activeSessions[sessionId]) {
-        return;
-      }
-      var xhr = session.xhr = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"].
-                              createInstance(Components.interfaces.nsIXMLHttpRequest);
-      xhr.open(method, url, true);
-      xhr.responseType = "moz-chunked-arraybuffer";
-
-      if (sendReferer) {
-        // Setting the referer uri, some site doing checks if swf is embedded
-        // on the original page.
-        xhr.setRequestHeader("Referer", self.refererUrl);
-      }
-
-      // TODO apply range request headers if limit is specified
-
-      var lastPosition = 0;
-      xhr.onprogress = function (e) {
-        var position = e.loaded;
-        var total = e.total;
-        var data = new Uint8Array(xhr.response);
-        // The event's `loaded` and `total` properties are sometimes lower than the actual
-        // number of loaded bytes. In that case, increase them to that value.
-        position = Math.max(position, data.byteLength);
-        total = Math.max(total, data.byteLength);
-
-        notifyLoadFileListener({callback:"loadFile", sessionId: sessionId,
-          topic: "progress", array: data, loaded: position, total: total});
-        lastPosition = position;
-        if (limit && total >= limit) {
-          xhr.abort();
-        }
-      };
-      xhr.onreadystatechange = function(event) {
-        if (xhr.readyState === 4) {
-          delete self.activeSessions[sessionId];
-          if (xhr.status !== 200 && xhr.status !== 0) {
-            notifyLoadFileListener({callback:"loadFile", sessionId: sessionId, topic: "error", error: xhr.statusText});
-          }
-          notifyLoadFileListener({callback:"loadFile", sessionId: sessionId, topic: "close"});
-        }
-      };
-      if (mimeType)
-        xhr.setRequestHeader("Content-Type", mimeType);
-      xhr.send(postData);
-      notifyLoadFileListener({callback:"loadFile", sessionId: sessionId, topic: "open"});
-    };
-
-    canDownloadFile(url, checkPolicyFile, swfUrl, crossdomainRequestsCache).then(function () {
-      performXHR();
-    }, function (reason) {
-      log("data access is prohibited to " + url + " from " + baseUrl);
-      delete self.activeSessions[sessionId];
-      notifyLoadFileListener({
-        callback: "loadFile", sessionId: sessionId, topic: "error",
-        error: "only original swf file or file from the same origin loading supported (XDOMAIN)"
-      });
-    });
-  },
-  abort: function(sessionId) {
-    var session = this.activeSessions[sessionId];
-    if (!session) {
-      log("Warning: trying to abort invalid session " + sessionId);
-      return;
-    }
-    session.abort();
-    delete this.activeSessions[sessionId];
-  }
-};
-
-function log(aMsg) {
-  let msg = 'FileLoader.js: ' + (aMsg.join ? aMsg.join('') : aMsg);
-  Services.console.logStringMessage(msg);
-  dump(msg + '\n');
-}
-
-function getStringPref(pref, def) {
-  try {
-    return Services.prefs.getComplexValue(pref, Components.interfaces.nsISupportsString).data;
-  } catch (ex) {
-    return def;
-  }
-}
-
-function disableXHRRedirect(xhr) {
-  var listener = {
-    asyncOnChannelRedirect: function(oldChannel, newChannel, flags, callback) {
-      // TODO perform URL check?
-      callback.onRedirectVerifyCallback(Components.results.NS_ERROR_ABORT);
-    },
-    getInterface: function(iid) {
-      return this.QueryInterface(iid);
-    },
-    QueryInterface: XPCOMUtils.generateQI([Components.interfaces.nsIChannelEventSink])
-  };
-  xhr.channel.notificationCallbacks = listener;
-}
-
-function canSendReferer(url, refererUrl) {
-  if (!refererUrl) {
-    return false;
-  }
-  // Allow sending HTTPS referer only to HTTPS.
-  var parsedUrl, parsedRefererUrl;
-  try {
-    parsedRefererUrl = NetUtil.newURI(refererUrl);
-  } catch (ex) { /* skipping invalid urls */ }
-  if (!parsedRefererUrl ||
-      parsedRefererUrl.scheme.toLowerCase() !== 'https') {
-    return true;
-  }
-  try {
-    parsedUrl = NetUtil.newURI(url);
-  } catch (ex) { /* skipping invalid urls */ }
-  return !!parsedUrl && parsedUrl.scheme.toLowerCase() === 'https';
-}
-
-function canDownloadFile(url, checkPolicyFile, swfUrl, cache) {
-  // TODO flash cross-origin request
-  if (url === swfUrl) {
-    // Allows downloading for the original file.
-    return Promise.resolve(undefined);
-  }
-
-  // Allows downloading from the same origin.
-  var parsedUrl, parsedBaseUrl;
-  try {
-    parsedUrl = NetUtil.newURI(url);
-  } catch (ex) { /* skipping invalid urls */ }
-  try {
-    parsedBaseUrl = NetUtil.newURI(swfUrl);
-  } catch (ex) { /* skipping invalid urls */ }
-
-  if (parsedUrl && parsedBaseUrl &&
-    parsedUrl.prePath === parsedBaseUrl.prePath) {
-    return Promise.resolve(undefined);
-  }
-
-  // Additionally using internal whitelist.
-  var whitelist = getStringPref('shumway.whitelist', '');
-  if (whitelist && parsedUrl) {
-    var whitelisted = whitelist.split(',').some(function (i) {
-      return domainMatches(parsedUrl.host, i);
-    });
-    if (whitelisted) {
-      return Promise.resolve();
-    }
-  }
-
-  if (!parsedUrl || !parsedBaseUrl) {
-    return Promise.reject('Invalid or non-specified URL or Base URL.');
-  }
-
-  if (!checkPolicyFile) {
-    return Promise.reject('Check of the policy file is not allowed.');
-  }
-
-  // We can request crossdomain.xml.
-  return fetchPolicyFile(parsedUrl.prePath + '/crossdomain.xml', cache).
-    then(function (policy) {
-
-      if (policy.siteControl === 'none') {
-        throw 'Site control is set to \"none\"';
-      }
-      // TODO assuming master-only, there are also 'by-content-type', 'all', etc.
-
-      var allowed = policy.allowAccessFrom.some(function (i) {
-        return domainMatches(parsedBaseUrl.host, i.domain) &&
-          (!i.secure || parsedBaseUrl.scheme.toLowerCase() === 'https');
-      });
-      if (!allowed) {
-        throw 'crossdomain.xml does not contain source URL.';
-      }
-      return undefined;
-    });
-}
-
-function domainMatches(host, pattern) {
-  if (!pattern) return false;
-  if (pattern === '*') return true;
-  host = host.toLowerCase();
-  var parts = pattern.toLowerCase().split('*');
-  if (host.indexOf(parts[0]) !== 0) return false;
-  var p = parts[0].length;
-  for (var i = 1; i < parts.length; i++) {
-    var j = host.indexOf(parts[i], p);
-    if (j === -1) return false;
-    p = j + parts[i].length;
-  }
-  return parts[parts.length - 1] === '' || p === host.length;
-}
-
-function fetchPolicyFile(url, cache) {
-  if (url in cache) {
-    return cache[url];
-  }
-
-  var deferred = Promise.defer();
-
-  log('Fetching policy file at ' + url);
-  var MAX_POLICY_SIZE = 8192;
-  var xhr =  Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"]
-    .createInstance(Components.interfaces.nsIXMLHttpRequest);
-  xhr.open('GET', url, true);
-  disableXHRRedirect(xhr);
-  xhr.overrideMimeType('text/xml');
-  xhr.onprogress = function (e) {
-    if (e.loaded >= MAX_POLICY_SIZE) {
-      xhr.abort();
-      cache[url] = false;
-      deferred.reject('Max policy size');
-    }
-  };
-  xhr.onreadystatechange = function(event) {
-    if (xhr.readyState === 4) {
-      // TODO disable redirects
-      var doc = xhr.responseXML;
-      if (xhr.status !== 200 || !doc) {
-        deferred.reject('Invalid HTTP status: ' + xhr.statusText);
-        return;
-      }
-      // parsing params
-      var params = doc.documentElement.childNodes;
-      var policy = { siteControl: null, allowAccessFrom: []};
-      for (var i = 0; i < params.length; i++) {
-        switch (params[i].localName) {
-          case 'site-control':
-            policy.siteControl = params[i].getAttribute('permitted-cross-domain-policies');
-            break;
-          case 'allow-access-from':
-            var access = {
-              domain: params[i].getAttribute('domain'),
-              security: params[i].getAttribute('security') === 'true'
-            };
-            policy.allowAccessFrom.push(access);
-            break;
-          default:
-            // TODO allow-http-request-headers-from and other
-            break;
-        }
-      }
-      deferred.resolve(policy);
-    }
-  };
-  xhr.send(null);
-  return (cache[url] = deferred.promise);
-}
deleted file mode 100644
--- a/browser/extensions/shumway/chrome/LocalConnection.jsm
+++ /dev/null
@@ -1,258 +0,0 @@
-/*
- * Copyright 2015 Mozilla Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var EXPORTED_SYMBOLS = ['LocalConnectionService'];
-
-Components.utils.import('resource://gre/modules/NetUtil.jsm');
-Components.utils.import('resource://gre/modules/Services.jsm');
-
-const localConnectionsRegistry = Object.create(null);
-
-function isConnectionNameValid(connectionName) {
-  return typeof connectionName === 'string' &&
-         (connectionName[0] === '_' || connectionName.split(':').length === 2);
-}
-
-/**
- * Creates a trusted qualified connection name from an already qualified name and a swfUrl.
- *
- * While connection names are already qualified at this point, the qualification happens in
- * untrusted code. To ensure that the name is correctly qualified, this function compares the
- * qualification domain with the current SWF's URL and substitutes that URL's domain if
- * required. A warning is logged in that case.
- */
-function _getQualifiedConnectionName(connectionName, swfUrl) {
-  // Already syntactically invalid connection names mustn't get here.
-  if (!isConnectionNameValid(connectionName)) {
-    // TODO: add telemetry
-    throw new Error('Syntactically invalid local-connection name encountered', connectionName,
-                    swfUrl);
-  }
-  var [domain, name] = connectionName.split(':');
-  var parsedURL = NetUtil.newURI(swfUrl);
-  if (domain !== parsedURL.host) {
-    // TODO: add telemetry
-    log('Warning: invalid local-connection name qualification found: ' + connectionName);
-    return parsedURL.host + ':' + swfUrl;
-  }
-  return connectionName;
-}
-
-function _getLocalConnection(connectionName) {
-  // Treat invalid connection names as non-existent. This can only happen if player code
-  // misbehaves, though.
-  if (!isConnectionNameValid(connectionName)) {
-    // TODO: add telemetry
-    return null;
-  }
-  var connection = localConnectionsRegistry[connectionName];
-  if (connection && Components.utils.isDeadWrapper(connection.callback)) {
-    delete localConnectionsRegistry[connectionName];
-    return null;
-  }
-  return localConnectionsRegistry[connectionName];
-}
-
-function LocalConnectionService(content, environment) {
-  var traceLocalConnection = getBoolPref('shumway.localConnection.trace', false);
-  var api = {
-    createLocalConnection: function (connectionName, callback) {
-      connectionName = connectionName + '';
-      traceLocalConnection && content.console.log(`Creating local connection "${connectionName}" ` +
-                                                  `for SWF with URL ${environment.swfUrl}`);
-
-      if (!isConnectionNameValid(connectionName)) {
-        // TODO: add telemetry
-        traceLocalConnection && content.console.warn(`Invalid localConnection name `);
-        return -1; // LocalConnectionConnectResult.InvalidName
-      }
-      if (typeof callback !== 'function') {
-        // TODO: add telemetry
-        traceLocalConnection && content.console.warn(`Invalid callback for localConnection`);
-        return -3; // LocalConnectionConnectResult.InvalidCallback
-      }
-      connectionName = _getQualifiedConnectionName(connectionName, environment.swfUrl);
-      if (_getLocalConnection(connectionName)) {
-        traceLocalConnection && content.console.log(`localConnection ` +
-                                                     `name "${connectionName}" already taken`);
-        return -2; // LocalConnectionConnectResult.AlreadyTaken
-      }
-
-      var parsedURL = NetUtil.newURI(environment.swfUrl);
-
-      var connection = {
-        callback,
-        domain: parsedURL.host,
-        environment: environment,
-        secure: parsedURL.protocol === 'https:',
-        allowedSecureDomains: Object.create(null),
-        allowedInsecureDomains: Object.create(null)
-      };
-      localConnectionsRegistry[connectionName] = connection;
-      return 0; // LocalConnectionConnectResult.Success
-    },
-    hasLocalConnection: function (connectionName) {
-      connectionName = _getQualifiedConnectionName(connectionName + '', environment.swfUrl);
-
-      var result = !!_getLocalConnection(connectionName);
-      traceLocalConnection && content.console.log(`hasLocalConnection "${connectionName}"? ` +
-                                                  result);
-      return result;
-    },
-    closeLocalConnection: function (connectionName) {
-      connectionName = _getQualifiedConnectionName(connectionName + '', environment.swfUrl);
-      traceLocalConnection && content.console.log(`Closing local connection "${connectionName}" ` +
-                                                  `for SWF with URL ${environment.swfUrl}`);
-
-      var connection = _getLocalConnection(connectionName);
-      if (!connection) {
-        traceLocalConnection && content.console.log(`localConnection "${connectionName}" not ` +
-                                                    `connected`);
-        return -1; // LocalConnectionCloseResult.NotConnected
-      } else if (connection.environment !== environment) {
-        // Attempts to close connections from a SWF instance that didn't create them shouldn't
-        // happen. If they do, we treat them as if the connection didn't exist.
-        traceLocalConnection && content.console.warn(`Ignored attempt to close localConnection ` +
-                                                     `"${connectionName}" from SWF instance that ` +
-                                                     `didn't create it`);
-        return -1; // LocalConnectionCloseResult.NotConnected
-      }
-      delete localConnectionsRegistry[connectionName];
-      return 0; // LocalConnectionCloseResult.Success
-    },
-    sendLocalConnectionMessage: function (connectionName, methodName, argsBuffer, sender,
-                                          senderDomain, senderIsSecure) {
-      connectionName = connectionName + '';
-      methodName = methodName + '';
-      senderDomain = senderDomain + '';
-      senderIsSecure = !!senderIsSecure;
-      // TODO: sanitize argsBuffer argument. Ask bholley how to do so.
-      traceLocalConnection && content.console.log(`sending localConnection message ` +
-                                                  `"${methodName}" to "${connectionName}"`);
-
-      // Since we don't currently trust the sender information passed in here, we use the
-      // currently running SWF's URL instead.
-      var parsedURL = NetUtil.newURI(environment.swfUrl);
-      var parsedURLIsSecure = parsedURL.protocol === 'https:';
-      if (parsedURL.host !== senderDomain || parsedURLIsSecure !== senderIsSecure) {
-        traceLocalConnection && content.console.warn(`sending localConnection message ` +
-                                                     `"${methodName}" to "${connectionName}"`);
-      }
-      senderDomain = parsedURL.host;
-      senderIsSecure = parsedURLIsSecure;
-
-      var connection = _getLocalConnection(connectionName);
-      if (!connection) {
-        traceLocalConnection && content.console.log(`localConnection "${connectionName}" not ` +
-                                                    `connected`);
-        return;
-      }
-      try {
-        var allowed = false;
-        if (connection.secure) {
-          // If the receiver is secure, the sender has to be, too, or it has to be whitelisted
-          // with allowInsecureDomain.
-          if (senderIsSecure) {
-            if (senderDomain === connection.domain ||
-                senderDomain in connection.allowedSecureDomains ||
-                '*' in connection.allowedSecureDomains) {
-              allowed = true;
-            }
-          } else {
-            if (senderDomain in connection.allowedInsecureDomains ||
-                '*' in connection.allowedInsecureDomains) {
-              allowed = true;
-            }
-          }
-        } else {
-          // For non-secure connections, allowedSecureDomains is expected to contain all allowed
-          // domains, secure on non-secure, so we don't have to check both.
-          if (senderDomain === connection.domain ||
-              senderDomain in connection.allowedSecureDomains ||
-              '*' in connection.allowedSecureDomains) {
-            allowed = true;
-          }
-        }
-        if (!allowed) {
-          traceLocalConnection && content.console.warn(`LocalConnection message rejected: domain ` +
-                                                       `${senderDomain} not allowed.`);
-          return {
-            name: 'SecurityError',
-            $Bgmessage: "The current security context does not allow this operation.",
-            _errorID: 3315
-          };
-        }
-        var callback = connection.callback;
-        var clonedArgs = Components.utils.cloneInto(argsBuffer, callback);
-        callback(methodName, clonedArgs);
-      } catch (e) {
-        // TODO: add telemetry
-        content.console.warn('Unexpected error encountered while sending LocalConnection message.');
-      }
-    },
-    allowDomainsForLocalConnection: function (connectionName, domains, secure) {
-      connectionName = _getQualifiedConnectionName(connectionName + '', environment.swfUrl);
-      secure = !!secure;
-      var connection = _getLocalConnection(connectionName);
-      if (!connection) {
-        return;
-      }
-      try {
-        domains = Components.utils.cloneInto(domains, connection);
-      } catch (e) {
-        log('error in allowDomainsForLocalConnection: ' + e);
-        return;
-      }
-      traceLocalConnection && content.console.log(`allowing ${secure ? '' : 'in'}secure domains ` +
-                                                  `[${domains}] for localConnection ` +
-                                                  `"${connectionName}"`);
-      function validateDomain(domain) {
-        if (typeof domain !== 'string') {
-          return false;
-        }
-        if (domain === '*') {
-          return true;
-        }
-        try {
-          var uri = NetUtil.newURI('http://' + domain);
-          return uri.host === domain;
-        } catch (e) {
-          return false;
-        }
-      }
-      if (!Array.isArray(domains) || !domains.every(validateDomain)) {
-        traceLocalConnection && content.console.warn(`Invalid domains rejected`);
-        return;
-      }
-      var allowedDomains = secure ?
-                           connection.allowedSecureDomains :
-                           connection.allowedInsecureDomains;
-      domains.forEach(domain => allowedDomains[domain] = true);
-    }
-  };
-
-  // Don't return `this` even though this function is treated as a ctor. Makes cloning into the
-  // content compartment an internal operation the client code doesn't have to worry about.
-  return Components.utils.cloneInto(api, content, {cloneFunctions:true});
-}
-
-function getBoolPref(pref, def) {
-  try {
-    return Services.prefs.getBoolPref(pref);
-  } catch (ex) {
-    return def;
-  }
-}
deleted file mode 100644
--- a/browser/extensions/shumway/chrome/RtmpUtils.jsm
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright 2014 Mozilla Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var EXPORTED_SYMBOLS = ['RtmpUtils'];
-
-Components.utils.import('resource://gre/modules/Services.jsm');
-
-var Cc = Components.classes;
-var Ci = Components.interfaces;
-var Cu = Components.utils;
-var Cr = Components.results;
-
-var RtmpUtils = {
-  get isRtmpEnabled() {
-    try {
-      return Services.prefs.getBoolPref('shumway.rtmp.enabled');
-    } catch (ex) {
-      return false;
-    }
-  },
-
-  createSocket: function (sandbox, params) {
-    var host = params.host, port = params.port, ssl = params.ssl;
-
-    var baseSocket = Cc["@mozilla.org/tcp-socket;1"].createInstance(Ci.nsIDOMTCPSocket);
-    var socket = baseSocket.open(host, port, {useSecureTransport: ssl, binaryType: 'arraybuffer'});
-    if (!socket) {
-      return null;
-    }
-
-    socket.onopen = function () {
-      if (wrapperOnOpen) {
-        wrapperOnOpen(new sandbox.Object());
-      }
-    };
-    socket.ondata = function (e) {
-      if (wrapperOnData) {
-        var wrappedE = new sandbox.Object();
-        wrappedE.data = Components.utils.cloneInto(e.data, sandbox);
-        wrapperOnData(wrappedE);
-      }
-    };
-    socket.ondrain = function () {
-      if (wrapperOnDrain) {
-        wrapperOnDrain(new sandbox.Object());
-      }
-    };
-    socket.onerror = function (e) {
-      if (wrapperOnError) {
-        var wrappedE = new sandbox.Object();
-        wrappedE.data = Components.utils.cloneInto(e.data, sandbox);
-        wrapperOnError(wrappedE);
-      }
-    };
-    socket.onclose = function () {
-      if (wrapperOnClose) {
-        wrapperOnClose(new sandbox.Object());
-      }
-    };
-
-    var wrapperOnOpen, wrapperOnData, wrapperOnDrain, wrapperOnError, wrapperOnClose;
-    var wrapper = Components.utils.cloneInto({
-      setOpenCallback: function (callback) {
-        wrapperOnOpen = callback;
-      },
-      setDataCallback: function (callback) {
-        wrapperOnData = callback;
-      },
-      setDrainCallback: function (callback) {
-        wrapperOnDrain = callback;
-      },
-      setErrorCallback: function (callback) {
-        wrapperOnError = callback;
-      },
-      setCloseCallback: function (callback) {
-        wrapperOnClose = callback;
-      },
-
-      send: function (buffer, offset, count) {
-        return socket.send(buffer, offset, count);
-      },
-
-      close: function () {
-        socket.close();
-      }
-    }, sandbox, {cloneFunctions:true});
-    return wrapper;
-  },
-
-  createXHR: function (sandbox) {
-    var xhr = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"]
-                .createInstance(Ci.nsIXMLHttpRequest);
-
-    xhr.onload = function () {
-      wrapper.status = xhr.status;
-      wrapper.response = Components.utils.cloneInto(xhr.response, sandbox);
-      if (wrapperOnLoad) {
-        wrapperOnLoad(new sandbox.Object());
-      }
-    };
-    xhr.onerror = function () {
-      wrapper.status = xhr.status;
-      if (wrapperOnError) {
-        wrapperOnError(new sandbox.Object());
-      }
-    };
-
-    var wrapperOnLoad, wrapperOnError;
-    var wrapper = Components.utils.cloneInto({
-      status: 0,
-      response: undefined,
-      responseType: 'text',
-
-      setLoadCallback: function (callback) {
-        wrapperOnLoad = callback;
-      },
-      setErrorCallback: function (callback) {
-        wrapperOnError = callback;
-      },
-
-      open: function (method, path, async) {
-        if (method !== 'POST' || !path || (async !== undefined && !async)) {
-          throw new Error('invalid open() arguments');
-        }
-        // TODO check path
-        xhr.open('POST', path, true);
-        xhr.responseType = 'arraybuffer';
-        xhr.setRequestHeader('Content-Type', 'application/x-fcs');
-      },
-
-      setRequestHeader: function (header, value) {
-        if (header !== 'Content-Type' || value !== 'application/x-fcs') {
-          throw new Error('invalid setRequestHeader() arguments');
-        }
-      },
-
-      send: function (data) {
-        if (wrapper.responseType !== 'arraybuffer') {
-          throw new Error('Invalid responseType.');
-        }
-        xhr.send(data);
-      }
-    }, sandbox, {cloneFunctions:true});
-    return wrapper;
-  }
-};
deleted file mode 100644
--- a/browser/extensions/shumway/chrome/ShumwayCom.jsm
+++ /dev/null
@@ -1,777 +0,0 @@
-/*
- * Copyright 2015 Mozilla Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var EXPORTED_SYMBOLS = ['ShumwayCom'];
-
-Components.utils.import('resource://gre/modules/NetUtil.jsm');
-Components.utils.import('resource://gre/modules/Promise.jsm');
-Components.utils.import('resource://gre/modules/Services.jsm');
-Components.utils.import('resource://gre/modules/XPCOMUtils.jsm');
-
-Components.utils.import('chrome://shumway/content/SpecialInflate.jsm');
-Components.utils.import('chrome://shumway/content/SpecialStorage.jsm');
-Components.utils.import('chrome://shumway/content/RtmpUtils.jsm');
-Components.utils.import('chrome://shumway/content/ExternalInterface.jsm');
-Components.utils.import('chrome://shumway/content/FileLoader.jsm');
-Components.utils.import('chrome://shumway/content/LocalConnection.jsm');
-
-XPCOMUtils.defineLazyModuleGetter(this, 'ShumwayTelemetry',
-  'resource://shumway/ShumwayTelemetry.jsm');
-
-const MAX_USER_INPUT_TIMEOUT = 250; // ms
-
-function getBoolPref(pref, def) {
-  try {
-    return Services.prefs.getBoolPref(pref);
-  } catch (ex) {
-    return def;
-  }
-}
-
-function getCharPref(pref, def) {
-  try {
-    return Services.prefs.getCharPref(pref);
-  } catch (ex) {
-    return def;
-  }
-}
-
-function log(aMsg) {
-  let msg = 'ShumwayCom.js: ' + (aMsg.join ? aMsg.join('') : aMsg);
-  Services.console.logStringMessage(msg);
-  dump(msg + '\n');
-}
-
-function sanitizeTelemetryArgs(args) {
-  var request = {
-    topic: String(args.topic)
-  };
-  switch (request.topic) {
-    case 'firstFrame':
-      break;
-    case 'parseInfo':
-      request.info = {
-        parseTime: +args.parseTime,
-        size: +args.bytesTotal,
-        swfVersion: args.swfVersion | 0,
-        frameRate: +args.frameRate,
-        width: args.width | 0,
-        height: args.height | 0,
-        bannerType: args.bannerType | 0,
-        isAvm2: !!args.isAvm2
-      };
-      break;
-    case 'feature':
-      request.featureType = args.feature | 0;
-      break;
-    case 'loadResource':
-      request.resultType = args.resultType | 0;
-      break;
-    case 'error':
-      request.errorType = args.error | 0;
-      break;
-  }
-  return request;
-}
-
-function sanitizeLoadFileArgs(args) {
-  return {
-    url: String(args.url || ''),
-    checkPolicyFile: !!args.checkPolicyFile,
-    sessionId: +args.sessionId,
-    limit: +args.limit || 0,
-    mimeType: String(args.mimeType || ''),
-    method: (args.method + '') || 'GET',
-    postData: args.postData || null
-  };
-}
-
-function sanitizeExternalComArgs(args) {
-  var request = {
-    action: String(args.action)
-  };
-  switch (request.action) {
-    case 'eval':
-      request.expression = String(args.expression);
-      break;
-    case 'call':
-      request.expression = String(args.request);
-      break;
-    case 'register':
-    case 'unregister':
-      request.functionName = String(args.functionName);
-      break;
-  }
-  return request;
-}
-
-var cloneIntoFromContent = (function () {
-  // waiveXrays are used due to bug 1150771, checking if we are affected
-  // TODO remove workaround after Firefox 40 is released (2015-08-11)
-  let sandbox1 = new Components.utils.Sandbox(null);
-  let sandbox2 = new Components.utils.Sandbox(null);
-  let arg = Components.utils.evalInSandbox('({buf: new ArrayBuffer(2)})', sandbox1);
-  let clonedArg = Components.utils.cloneInto(arg, sandbox2);
-  if (!Components.utils.waiveXrays(clonedArg).buf) {
-    return function (obj, contentSandbox) {
-      return Components.utils.cloneInto(
-        Components.utils.waiveXrays(obj), contentSandbox);
-    };
-  }
-
-  return function (obj, contentSandbox) {
-    return Components.utils.cloneInto(obj, contentSandbox);
-  };
-})();
-
-var ShumwayEnvironment = {
-  DEBUG: 'debug',
-  DEVELOPMENT: 'dev',
-  RELEASE: 'release',
-  TEST: 'test'
-};
-
-var ShumwayCom = {
-  environment: getCharPref('shumway.environment', 'dev'),
-  
-  createAdapter: function (content, callbacks, hooks) {
-    // Exposing ShumwayCom object/adapter to the unprivileged content -- setting
-    // up Xray wrappers.
-    var wrapped = {
-      environment: ShumwayCom.environment,
-    
-      enableDebug: function () {
-        callbacks.enableDebug()
-      },
-
-      fallback: function () {
-        callbacks.sendMessage('fallback', null, false);
-      },
-
-      getSettings: function () {
-        return Components.utils.cloneInto(
-          callbacks.sendMessage('getSettings', null, true), content);
-      },
-
-      getPluginParams: function () {
-        return Components.utils.cloneInto(
-          callbacks.sendMessage('getPluginParams', null, true), content);
-      },
-
-      reportIssue: function () {
-        callbacks.sendMessage('reportIssue', null, false);
-      },
-
-      reportTelemetry: function (args) {
-        var request = sanitizeTelemetryArgs(args);
-        callbacks.sendMessage('reportTelemetry', request, false);
-      },
-
-      setupGfxComBridge: function (gfxWindow) {
-        // Creates ShumwayCom adapter for the gfx iframe exposing only subset
-        // of the privileged function. Removing Xrays to setup the ShumwayCom
-        // property and for usage as a sandbox for cloneInto operations.
-        var gfxContent = gfxWindow.contentWindow.wrappedJSObject;
-        ShumwayCom.createGfxAdapter(gfxContent, callbacks, hooks);
-
-        setupUserInput(gfxWindow.contentWindow, callbacks);
-      },
-
-      setupPlayerComBridge: function (playerWindow) {
-        // Creates ShumwayCom adapter for the player iframe exposing only subset
-        // of the privileged function. Removing Xrays to setup the ShumwayCom
-        // property and for usage as a sandbox for cloneInto operations.
-        var playerContent = playerWindow.contentWindow.wrappedJSObject;
-        ShumwayCom.createPlayerAdapter(playerContent, callbacks, hooks);
-      }
-    };
-
-    var shumwayComAdapter = Components.utils.cloneInto(wrapped, content, {cloneFunctions:true});
-    content.ShumwayCom = shumwayComAdapter;
-  },
-
-  createGfxAdapter: function (content, callbacks, hooks) {
-    // Exposing ShumwayCom object/adapter to the unprivileged content -- setting
-    // up Xray wrappers.
-    var wrapped = {
-      environment: ShumwayCom.environment,
-
-      setFullscreen: function (value) {
-        value = !!value;
-        callbacks.sendMessage('setFullscreen', value, false);
-      },
-
-      reportTelemetry: function (args) {
-        var request = sanitizeTelemetryArgs(args);
-        callbacks.sendMessage('reportTelemetry', request, false);
-      },
-
-      postAsyncMessage: function (msg) {
-        if (hooks.onPlayerAsyncMessageCallback) {
-          hooks.onPlayerAsyncMessageCallback(msg);
-        }
-      },
-
-      setSyncMessageCallback: function (callback) {
-        if (typeof callback !== 'function') {
-          log('error: attempt to set non-callable as callback in setSyncMessageCallback');
-          return;
-        }
-        hooks.onGfxSyncMessageCallback = function (msg, sandbox) {
-          var reclonedMsg = cloneIntoFromContent(msg, content);
-          var result = callback(reclonedMsg);
-          return cloneIntoFromContent(result, sandbox);
-        };
-      },
-
-      setAsyncMessageCallback: function (callback) {
-        if (typeof callback !== 'function') {
-          log('error: attempt to set non-callable as callback in setAsyncMessageCallback');
-          return;
-        }
-        hooks.onGfxAsyncMessageCallback = function (msg) {
-          var reclonedMsg = cloneIntoFromContent(msg, content);
-          callback(reclonedMsg);
-        };
-      }
-    };
-    
-    if (ShumwayCom.environment === ShumwayEnvironment.TEST) {
-      wrapped.processFrame = function () {
-        callbacks.sendMessage('processFrame');
-      };
-      
-      wrapped.processFSCommand = function (command, args) {
-        callbacks.sendMessage('processFSCommand', command, args);
-      };
-      
-      wrapped.setScreenShotCallback = function (callback) {
-        callbacks.sendMessage('setScreenShotCallback', callback);
-      };
-    }
-
-    var shumwayComAdapter = Components.utils.cloneInto(wrapped, content, {cloneFunctions:true});
-    content.ShumwayCom = shumwayComAdapter;
-  },
-
-  createPlayerAdapter: function (content, callbacks, hooks) {
-    // Exposing ShumwayCom object/adapter to the unprivileged content -- setting
-    // up Xray wrappers.
-    var wrapped = {
-      environment: ShumwayCom.environment,
-    
-      externalCom: function (args) {
-        var request = sanitizeExternalComArgs(args);
-        var result = String(callbacks.sendMessage('externalCom', request, true));
-        return result;
-      },
-
-      loadFile: function (args) {
-        var request = sanitizeLoadFileArgs(args);
-        callbacks.sendMessage('loadFile', request, false);
-      },
-
-      abortLoad: function (sessionId) {
-        sessionId = sessionId|0;
-        callbacks.sendMessage('abortLoad', sessionId, false);
-      },
-
-      reportTelemetry: function (args) {
-        var request = sanitizeTelemetryArgs(args);
-        callbacks.sendMessage('reportTelemetry', request, false);
-      },
-
-      setClipboard: function (args) {
-        if (typeof args !== 'string') {
-          return; // ignore non-string argument
-        }
-        callbacks.sendMessage('setClipboard', args, false);
-      },
-
-      navigateTo: function (args) {
-        var request = {
-          url: String(args.url || ''),
-          target: String(args.target || '')
-        };
-        callbacks.sendMessage('navigateTo', request, false);
-      },
-
-      loadSystemResource: function (id) {
-        loadShumwaySystemResource(id).then(function (data) {
-          if (onSystemResourceCallback) {
-            onSystemResourceCallback(id, Components.utils.cloneInto(data, content));
-          }
-        });
-      },
-
-      sendSyncMessage: function (msg) {
-        var result;
-        if (hooks.onGfxSyncMessageCallback) {
-          result = hooks.onGfxSyncMessageCallback(msg, content);
-        }
-        return result;
-      },
-
-      postAsyncMessage: function (msg) {
-        if (hooks.onGfxAsyncMessageCallback) {
-          hooks.onGfxAsyncMessageCallback(msg);
-        }
-      },
-
-      setAsyncMessageCallback: function (callback) {
-        if (typeof callback !== 'function') {
-          log('error: attempt to set non-callable as callback in setAsyncMessageCallback');
-          return;
-        }
-        hooks.onPlayerAsyncMessageCallback = function (msg) {
-          var reclonedMsg = cloneIntoFromContent(msg, content);
-          callback(reclonedMsg);
-        };
-      },
-
-      createSpecialStorage: function () {
-        var environment = callbacks.getEnvironment();
-        return SpecialStorageUtils.createWrappedSpecialStorage(content,
-          environment.swfUrl, environment.privateBrowsing);
-      },
-
-      getWeakMapKeys: function (weakMap) {
-        var keys = ThreadSafeChromeUtils.nondeterministicGetWeakMapKeys(weakMap);
-        var result = new content.Array();
-        keys.forEach(function (key) {
-          result.push(key);
-        });
-        return result;
-      },
-
-      setLoadFileCallback: function (callback) {
-        if (callback !== null && typeof callback !== 'function') {
-          return;
-        }
-        onLoadFileCallback = callback;
-      },
-      setExternalCallback: function (callback) {
-        if (callback !== null && typeof callback !== 'function') {
-          return;
-        }
-        onExternalCallback = callback;
-      },
-      setSystemResourceCallback: function (callback) {
-        if (callback !== null && typeof callback !== 'function') {
-          return;
-        }
-        onSystemResourceCallback = callback;
-      },
-
-      getLocalConnectionService: function() {
-        if (!wrappedLocalConnectionService) {
-          wrappedLocalConnectionService = new LocalConnectionService(content,
-                                                                     callbacks.getEnvironment());
-        }
-        return wrappedLocalConnectionService;
-      }
-    };
-
-    // Exposing createSpecialInflate function for DEFLATE stream decoding using
-    // Gecko API.
-    if (SpecialInflateUtils.isSpecialInflateEnabled) {
-      wrapped.createSpecialInflate = function () {
-        return SpecialInflateUtils.createWrappedSpecialInflate(content);
-      };
-    }
-
-    // Exposing createRtmpSocket/createRtmpXHR functions to support RTMP stream
-    // functionality.
-    if (RtmpUtils.isRtmpEnabled) {
-      wrapped.createRtmpSocket = function (params) {
-        return RtmpUtils.createSocket(content, params);
-      };
-      wrapped.createRtmpXHR = function () {
-        return RtmpUtils.createXHR(content);
-      };
-    }
-
-    if (ShumwayCom.environment === ShumwayEnvironment.TEST) {
-      wrapped.print = function(msg) {
-        callbacks.sendMessage('print', msg);
-      }
-    }
-
-    var onSystemResourceCallback = null;
-    var onExternalCallback = null;
-    var onLoadFileCallback = null;
-
-    var wrappedLocalConnectionService = null;
-
-    hooks.onLoadFileCallback = function (arg) {
-      if (onLoadFileCallback) {
-        onLoadFileCallback(Components.utils.cloneInto(arg, content));
-      }
-    };
-    hooks.onExternalCallback = function (call) {
-      if (onExternalCallback) {
-        return onExternalCallback(Components.utils.cloneInto(call, content));
-      }
-    };
-
-    var shumwayComAdapter = Components.utils.cloneInto(wrapped, content, {cloneFunctions:true});
-    content.ShumwayCom = shumwayComAdapter;
-  },
-
-  createActions: function (startupInfo, window, document) {
-    return new ShumwayChromeActions(startupInfo, window, document);
-  }
-};
-
-function loadShumwaySystemResource(id) {
-  var url, type;
-  switch (id) {
-    case 0: // BuiltinAbc
-      url = 'resource://shumway/libs/builtin.abc';
-      type = 'arraybuffer';
-      break;
-    case 1: // PlayerglobalAbcs
-      url = 'resource://shumway/playerglobal/playerglobal.abcs';
-      type = 'arraybuffer';
-      break;
-    case 2: // PlayerglobalManifest
-      url = 'resource://shumway/playerglobal/playerglobal.json';
-      type = 'json';
-      break;
-    default:
-      return Promise.reject('Unsupported system resource id');
-  }
-
-  var deferred = Promise.defer();
-
-  var xhr = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"]
-                              .createInstance(Components.interfaces.nsIXMLHttpRequest);
-  xhr.open('GET', url, true);
-  xhr.responseType = type;
-  xhr.onload = function () {
-    deferred.resolve(xhr.response);
-  };
-  xhr.send(null);
-
-  return deferred.promise;
-}
-
-function setupUserInput(contentWindow, callbacks) {
-  function notifyUserInput() {
-    callbacks.sendMessage('userInput', null, true);
-  }
-
-  // Ignoring the untrusted events by providing the 4th argument for addEventListener.
-  contentWindow.document.addEventListener('mousedown', notifyUserInput, true, false);
-  contentWindow.document.addEventListener('mouseup', notifyUserInput, true, false);
-  contentWindow.document.addEventListener('keydown', notifyUserInput, true, false);
-  contentWindow.document.addEventListener('keyup', notifyUserInput, true, false);
-}
-
-// All the privileged actions.
-function ShumwayChromeActions(startupInfo, window, document) {
-  this.url = startupInfo.url;
-  this.objectParams = startupInfo.objectParams;
-  this.movieParams = startupInfo.movieParams;
-  this.baseUrl = startupInfo.baseUrl;
-  this.isOverlay = startupInfo.isOverlay;
-  this.embedTag = startupInfo.embedTag;
-  this.isPausedAtStart = startupInfo.isPausedAtStart;
-  this.initStartTime = startupInfo.initStartTime;
-  this.window = window;
-  this.document = document;
-  this.allowScriptAccess = startupInfo.allowScriptAccess;
-  this.lastUserInput = 0;
-  this.telemetry = {
-    startTime: Date.now(),
-    features: [],
-    errors: []
-  };
-
-  this.fileLoader = new FileLoader(startupInfo.url, startupInfo.baseUrl, startupInfo.refererUrl,
-    function (args) { this.onLoadFileCallback(args); }.bind(this));
-  this.onLoadFileCallback = null;
-
-  this.externalInterface = null;
-  this.onExternalCallback = null;
-}
-
-ShumwayChromeActions.prototype = {
-  // The method is created for convenience of routing messages from the OOP
-  // handler or remote debugger adapter. All method calls are originated from
-  // the ShumwayCom adapter (see above), or from the debugger adapter.
-  // See viewerWrapper.js for these usages near sendMessage calls.
-  invoke: function (name, args) {
-    return this[name].call(this, args);
-  },
-
-  getBoolPref: function (data) {
-    if (!/^shumway\./.test(data.pref)) {
-      return null;
-    }
-    return getBoolPref(data.pref, data.def);
-  },
-
-  getSettings: function getSettings() {
-    return {
-      compilerSettings: {
-        appCompiler: getBoolPref('shumway.appCompiler', true),
-        sysCompiler: getBoolPref('shumway.sysCompiler', false),
-        verifier: getBoolPref('shumway.verifier', true)
-      },
-      playerSettings: {
-        turboMode: getBoolPref('shumway.turboMode', false),
-        hud: getBoolPref('shumway.hud', false),
-        forceHidpi: getBoolPref('shumway.force_hidpi', false)
-      }
-    }
-  },
-
-  getPluginParams: function getPluginParams() {
-    return {
-      url: this.url,
-      baseUrl : this.baseUrl,
-      movieParams: this.movieParams,
-      objectParams: this.objectParams,
-      isOverlay: this.isOverlay,
-      isPausedAtStart: this.isPausedAtStart,
-      initStartTime: this.initStartTime,
-      isDebuggerEnabled: getBoolPref('shumway.debug.enabled', false)
-    };
-  },
-
-  loadFile: function loadFile(data) {
-    this.fileLoader.load(data);
-  },
-
-  abortLoad: function abortLoad(sessionId) {
-    this.fileLoader.abort(sessionId);
-  },
-
-  navigateTo: function (data) {
-    // Our restrictions are a little bit different from Flash's: let's enable
-    // only http(s) and only when script execution is allowed.
-    // See https://helpx.adobe.com/flash/kb/control-access-scripts-host-web.html
-    var url = data.url || 'about:blank';
-    var target = data.target || '_self';
-    var isWhitelistedProtocol = /^(http|https):\/\//i.test(url);
-    if (!isWhitelistedProtocol || !this.allowScriptAccess) {
-      return;
-    }
-    // ...and only when user input is in-progress.
-    if (!this.isUserInputInProgress()) {
-      return;
-    }
-    var embedTag = this.embedTag;
-    var window = embedTag ? embedTag.ownerDocument.defaultView : this.window;
-    window.open(url, target);
-  },
-
-  fallback: function(automatic) {
-    automatic = !!automatic;
-    var event = this.document.createEvent('CustomEvent');
-    event.initCustomEvent('shumwayFallback', true, true, {
-      automatic: automatic
-    });
-    this.window.dispatchEvent(event);
-  },
-
-  userInput: function() {
-    // Recording time of last user input for isUserInputInProgress below.
-    this.lastUserInput = Date.now();
-  },
-
-  isUserInputInProgress: function () {
-    // We don't trust our Shumway non-privileged code just yet to verify the
-    // user input -- using userInput function above to track that.
-    if ((Date.now() - this.lastUserInput) > MAX_USER_INPUT_TIMEOUT) {
-      return false;
-    }
-    // TODO other security checks?
-    return true;
-  },
-
-  setClipboard: function (data) {
-    if (!this.isUserInputInProgress()) {
-      return;
-    }
-
-    let clipboard = Components.classes["@mozilla.org/widget/clipboardhelper;1"]
-                                      .getService(Components.interfaces.nsIClipboardHelper);
-    clipboard.copyString(data);
-  },
-
-  setFullscreen: function (enabled) {
-    if (!this.isUserInputInProgress()) {
-      return;
-    }
-
-    var target = this.embedTag || this.document.body;
-    if (enabled) {
-      target.mozRequestFullScreen();
-    } else {
-      target.ownerDocument.mozCancelFullScreen();
-    }
-  },
-
-  reportTelemetry: function (request) {
-    switch (request.topic) {
-      case 'firstFrame':
-        var time = Date.now() - this.telemetry.startTime;
-        ShumwayTelemetry.onFirstFrame(time);
-        break;
-      case 'parseInfo':
-        ShumwayTelemetry.onParseInfo(request.info);
-        break;
-      case 'feature':
-        var featureType = request.featureType;
-        var MIN_FEATURE_TYPE = 0, MAX_FEATURE_TYPE = 999;
-        if (featureType >= MIN_FEATURE_TYPE && featureType <= MAX_FEATURE_TYPE &&
-          !this.telemetry.features[featureType]) {
-          this.telemetry.features[featureType] = true; // record only one feature per SWF
-          ShumwayTelemetry.onFeature(featureType);
-        }
-        break;
-      case 'loadResource':
-        var resultType = request.resultType;
-        var MIN_RESULT_TYPE = 0, MAX_RESULT_TYPE = 10;
-        if (resultType >= MIN_RESULT_TYPE && resultType <= MAX_RESULT_TYPE) {
-          ShumwayTelemetry.onLoadResource(resultType);
-        }
-        break;
-      case 'error':
-        var errorType = request.errorType;
-        var MIN_ERROR_TYPE = 0, MAX_ERROR_TYPE = 2;
-        if (errorType >= MIN_ERROR_TYPE && errorType <= MAX_ERROR_TYPE &&
-          !this.telemetry.errors[errorType]) {
-          this.telemetry.errors[errorType] = true; // record only one report per SWF
-          ShumwayTelemetry.onError(errorType);
-        }
-        break;
-    }
-  },
-
-  reportIssue: function (exceptions) {
-    var urlTemplate = "https://bugzilla.mozilla.org/enter_bug.cgi?op_sys=All&priority=--" +
-      "&rep_platform=All&target_milestone=---&version=Trunk&product=Firefox" +
-      "&component=Shumway&short_desc=&comment={comment}" +
-      "&bug_file_loc={url}";
-    var windowUrl = this.window.parent.location.href + '';
-    var url = urlTemplate.split('{url}').join(encodeURIComponent(windowUrl));
-    var params = {
-      swf: encodeURIComponent(this.url)
-    };
-    getVersionInfo().then(function (versions) {
-      params.versions = versions;
-    }).then(function () {
-      var ffbuild = params.versions.geckoVersion + ' (' + params.versions.geckoBuildID + ')';
-      //params.exceptions = encodeURIComponent(exceptions);
-      var comment = '+++ Initially filed via the problem reporting functionality in Shumway +++\n' +
-        'Please add any further information that you deem helpful here:\n\n\n\n' +
-        '----------------------\n\n' +
-        'Technical Information:\n' +
-        'Firefox version: ' + ffbuild + '\n' +
-        'Shumway version: ' + params.versions.shumwayVersion;
-      url = url.split('{comment}').join(encodeURIComponent(comment));
-      this.window.open(url);
-    }.bind(this));
-  },
-
-  externalCom: function (data) {
-    if (!this.allowScriptAccess)
-      return;
-
-    // TODO check more security stuff ?
-    if (!this.externalInterface) {
-      var parentWindow = this.window.parent; // host page -- parent of PlayPreview frame
-      var embedTag = this.embedTag;
-      this.externalInterface = new ExternalInterface(parentWindow, embedTag, function (call) {
-        return this.onExternalCallback(call);
-      }.bind(this));
-    }
-
-    return this.externalInterface.processAction(data);
-  },
-  
-  postMessage: function (type, data) {
-    var embedTag = this.embedTag;
-    var event = embedTag.ownerDocument.createEvent('CustomEvent');
-    var detail = Components.utils.cloneInto({ type: type, data: data }, embedTag.ownerDocument.wrappedJSObject);
-    event.initCustomEvent('message', false, false, detail);
-    embedTag.dispatchEvent(event);
-  },
-  
-  processFrame: function () {
-    this.postMessage('processFrame');
-  },
-
-  processFSCommand: function (command, data) {
-    this.postMessage('processFSCommand', { command: command, data: data });
-  },
-
-  print: function (msg) {
-    this.postMessage('print', msg);
-  },
-
-  setScreenShotCallback: function (callback) {
-    var embedTag = this.embedTag;
-    Components.utils.exportFunction(function () {
-      // `callback` can be wrapped in a CPOW and thus cause a slow synchronous cross-process operation.
-      var result = callback();
-      return Components.utils.cloneInto(result, embedTag.ownerDocument);
-    }, embedTag.wrappedJSObject, {defineAs: 'getCanvasData'});
-  }
-};
-
-function getVersionInfo() {
-  var deferred = Promise.defer();
-  var versionInfo = {
-    geckoVersion: 'unknown',
-    geckoBuildID: 'unknown',
-    shumwayVersion: 'unknown'
-  };
-  try {
-    var appInfo = Components.classes["@mozilla.org/xre/app-info;1"]
-                                    .getService(Components.interfaces.nsIXULAppInfo);
-    versionInfo.geckoVersion = appInfo.version;
-    versionInfo.geckoBuildID = appInfo.appBuildID;
-  } catch (e) {
-    log('Error encountered while getting platform version info: ' + e);
-  }
-  var xhr = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"]
-                              .createInstance(Components.interfaces.nsIXMLHttpRequest);
-  xhr.open('GET', 'resource://shumway/version.txt', true);
-  xhr.overrideMimeType('text/plain');
-  xhr.onload = function () {
-    try {
-      // Trying to merge version.txt lines into something like:
-      //   "version (sha) details"
-      var lines = xhr.responseText.split(/\n/g);
-      lines[1] = '(' + lines[1] + ')';
-      versionInfo.shumwayVersion = lines.join(' ');
-    } catch (e) {
-      log('Error while parsing version info: ' + e);
-    }
-    deferred.resolve(versionInfo);
-  };
-  xhr.onerror = function () {
-    log('Error while reading version info: ' + xhr.error);
-    deferred.resolve(versionInfo);
-  };
-  xhr.send();
-
-  return deferred.promise;
-}
deleted file mode 100644
--- a/browser/extensions/shumway/chrome/SpecialInflate.jsm
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Copyright 2014 Mozilla Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var EXPORTED_SYMBOLS = ['SpecialInflate', 'SpecialInflateUtils'];
-
-Components.utils.import('resource://gre/modules/Services.jsm');
-
-var Cc = Components.classes;
-var Ci = Components.interfaces;
-var Cu = Components.utils;
-var Cr = Components.results;
-
-function SimpleStreamListener() {
-  this.binaryStream = Cc['@mozilla.org/binaryinputstream;1']
-    .createInstance(Ci.nsIBinaryInputStream);
-  this.onData = null;
-  this.buffer = null;
-}
-SimpleStreamListener.prototype = {
-  QueryInterface: function (iid) {
-    if (iid.equals(Ci.nsIStreamListener) ||
-      iid.equals(Ci.nsIRequestObserver) ||
-      iid.equals(Ci.nsISupports))
-      return this;
-    throw Cr.NS_ERROR_NO_INTERFACE;
-  },
-  onStartRequest: function (aRequest, aContext) {
-    return Cr.NS_OK;
-  },
-  onStopRequest: function (aRequest, aContext, sStatusCode) {
-    return Cr.NS_OK;
-  },
-  onDataAvailable: function (aRequest, aContext, aInputStream, aOffset, aCount) {
-    this.binaryStream.setInputStream(aInputStream);
-    if (!this.buffer || aCount > this.buffer.byteLength) {
-      this.buffer = new ArrayBuffer(aCount);
-    }
-    this.binaryStream.readArrayBuffer(aCount, this.buffer);
-    this.onData(new Uint8Array(this.buffer, 0, aCount));
-    return Cr.NS_OK;
-  }
-};
-
-function SpecialInflate() {
-  var listener = new SimpleStreamListener();
-  listener.onData = function (data) {
-    this.onData(data);
-  }.bind(this);
-
-  var converterService = Cc["@mozilla.org/streamConverters;1"].getService(Ci.nsIStreamConverterService);
-  var converter = converterService.asyncConvertData("deflate", "uncompressed", listener, null);
-  converter.onStartRequest(null, null);
-  this.converter = converter;
-
-  var binaryStream = Cc["@mozilla.org/binaryoutputstream;1"].createInstance(Ci.nsIBinaryOutputStream);
-  var pipe = Cc["@mozilla.org/pipe;1"].createInstance(Ci.nsIPipe);
-  pipe.init(true, true, 0, 0xFFFFFFFF, null);
-  binaryStream.setOutputStream(pipe.outputStream);
-  this.binaryStream = binaryStream;
-
-  this.pipeInputStream = pipe.inputStream;
-
-  this.onData = null;
-}
-SpecialInflate.prototype = {
-  push: function (data) {
-    this.binaryStream.writeByteArray(data, data.length);
-    this.converter.onDataAvailable(null, null, this.pipeInputStream, 0, data.length);
-  },
-  close: function () {
-    this.binaryStream.close();
-    this.converter.onStopRequest(null, null, Cr.NS_OK);
-  }
-};
-
-var SpecialInflateUtils = {
-  get isSpecialInflateEnabled() {
-    try {
-      return Services.prefs.getBoolPref('shumway.specialInflate');
-    } catch (ex) {
-      return false; // TODO true;
-    }
-  },
-
-  createWrappedSpecialInflate: function (sandbox) {
-    var wrapped = new SpecialInflate();
-    var wrapperOnData;
-    wrapped.onData = function(data) {
-      if (wrapperOnData) {
-        wrapperOnData(Components.utils.cloneInto(data, sandbox));
-      }
-    };
-
-
-    // We will return object created in the sandbox/content, with some exposed
-    // properties/methods, so we can send data between wrapped object and
-    // and sandbox/content.
-    var wrapper = Components.utils.cloneInto({
-      setDataCallback: function (callback) {
-        wrapperOnData = callback;
-      },
-
-      push: function (data) {
-        // Uint8Array is expected in the data parameter.
-        // SpecialInflate.push() fails with other argument types.
-        return wrapped.push(data);
-      },
-      close: function () {
-        return wrapped.close();
-      }
-    }, sandbox, {cloneFunctions:true});
-    return wrapper;
-  }
-};
deleted file mode 100644
--- a/browser/extensions/shumway/chrome/SpecialStorage.jsm
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright 2015 Mozilla Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var EXPORTED_SYMBOLS = ['SpecialStorageUtils'];
-
-Components.utils.import('resource://gre/modules/Services.jsm');
-
-var SpecialStorageUtils = {
-  createWrappedSpecialStorage: function (sandbox, swfUrl, privateBrowsing) {
-    // Creating internal localStorage object based on url and privateBrowsing setting.
-    var uri = Services.io.newURI(swfUrl, null, null);
-    var ssm = Components.classes["@mozilla.org/scriptsecuritymanager;1"]
-                                .getService(Components.interfaces.nsIScriptSecurityManager);
-    var principal = ssm.createCodebasePrincipal(uri, {});
-    var dsm = Components.classes["@mozilla.org/dom/localStorage-manager;1"]
-                                .getService(Components.interfaces.nsIDOMStorageManager);
-    var storage = dsm.createStorage(null, principal, privateBrowsing);
-
-    // We will return object created in the sandbox/content, with some exposed
-    // properties/methods, so we can send data between wrapped object and
-    // and sandbox/content.
-    var wrapper = Components.utils.cloneInto({
-      getItem: function (key) {
-        return storage.getItem(key);
-      },
-      setItem: function (key, value) {
-        storage.setItem(key, value);
-      },
-      removeItem: function (key) {
-        storage.removeItem(key);
-      }
-    }, sandbox, {cloneFunctions:true});
-    return wrapper;
-  }
-};
deleted file mode 100644
--- a/browser/extensions/shumway/chrome/StartupInfo.jsm
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * Copyright 2015 Mozilla Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var EXPORTED_SYMBOLS = ['getStartupInfo', 'parseQueryString', 'isContentWindowPrivate'];
-
-Components.utils.import('resource://gre/modules/XPCOMUtils.jsm');
-Components.utils.import('resource://gre/modules/Services.jsm');
-
-Components.utils.import('chrome://shumway/content/ShumwayCom.jsm');
-
-XPCOMUtils.defineLazyModuleGetter(this, 'PrivateBrowsingUtils',
-  'resource://gre/modules/PrivateBrowsingUtils.jsm');
-
-function flashUnescape(s) {
-  return decodeURIComponent(s.split('+').join(' '));
-}
-
-function parseQueryString(qs) {
-  if (!qs)
-    return {};
-
-  if (qs.charAt(0) == '?')
-    qs = qs.slice(1);
-
-  var values = qs.split('&');
-  var obj = {};
-  for (var i = 0; i < values.length; i++) {
-    var pair = values[i], j = pair.indexOf('=');
-    if (j < 0) {
-      continue; // skipping invalid values
-    }
-    var key = pair.substring(0, j), value = pair.substring(j + 1);
-    obj[flashUnescape(key)] = flashUnescape(value);
-  }
-
-  return obj;
-}
-
-function isContentWindowPrivate(win) {
-  if (!('isContentWindowPrivate' in PrivateBrowsingUtils)) {
-    return PrivateBrowsingUtils.isWindowPrivate(win);
-  }
-  return PrivateBrowsingUtils.isContentWindowPrivate(win);
-}
-
-function isStandardEmbedWrapper(embedElement) {
-  try {
-    if (embedElement.tagName !== 'EMBED') {
-      return false;
-    }
-    var swfUrl = embedElement.src;
-    var document = embedElement.ownerDocument;
-    var docUrl = document.location.href;
-    if (swfUrl !== docUrl) {
-      return false; // document URL shall match embed src
-    }
-    if (document.body.children.length !== 1 ||
-      document.body.firstChild !== embedElement) {
-      return false; // not the only child
-    }
-    if (document.defaultView.top !== document.defaultView) {
-      return false; // not a top window
-    }
-    // Looks like a standard wrapper
-    return true;
-  } catch (e) {
-    // Declare that is not a standard fullscreen plugin wrapper for any error
-    return false;
-  }
-}
-
-function isScriptAllowed(allowScriptAccessParameter, url, pageUrl) {
-  if (!allowScriptAccessParameter) {
-    allowScriptAccessParameter = 'sameDomain';
-  }
-  var allowScriptAccess = false;
-  switch (allowScriptAccessParameter.toLowerCase()) { // ignoring case here
-    case 'always':
-      allowScriptAccess = true;
-      break;
-    case 'never':
-      allowScriptAccess = false;
-      break;
-    default: // 'samedomain'
-      if (!pageUrl)
-        break;
-      try {
-        // checking if page is in same domain (? same protocol and port)
-        allowScriptAccess =
-          Services.io.newURI('/', null, Services.io.newURI(pageUrl, null, null)).spec ==
-          Services.io.newURI('/', null, Services.io.newURI(url, null, null)).spec;
-      } catch (ex) {}
-      break;
-  }
-  return allowScriptAccess;
-}
-
-function getStartupInfo(element) {
-  var initStartTime = Date.now();
-  var baseUrl;
-  var pageUrl;
-  var isOverlay = false;
-  var objectParams = {};
-
-  // Getting absolute URL from the EMBED tag
-  var url = element.srcURI && element.srcURI.spec;
-
-  pageUrl = element.ownerDocument.location.href; // proper page url?
-
-  var tagName = element.nodeName;
-  if (tagName == 'EMBED') {
-    for (var i = 0; i < element.attributes.length; ++i) {
-      var paramName = element.attributes[i].localName.toLowerCase();
-      objectParams[paramName] = element.attributes[i].value;
-    }
-  } else {
-    for (var i = 0; i < element.childNodes.length; ++i) {
-      var paramElement = element.childNodes[i];
-      if (paramElement.nodeType != 1 ||
-        paramElement.nodeName != 'PARAM') {
-        continue;
-      }
-      var paramName = paramElement.getAttribute('name').toLowerCase();
-      objectParams[paramName] = paramElement.getAttribute('value');
-    }
-  }
-
-  baseUrl = pageUrl;
-  if (objectParams.base) {
-    try {
-      // Verifying base URL, passed in object parameters. It shall be okay to
-      // ignore bad/corrupted base.
-      var parsedPageUrl = Services.io.newURI(pageUrl, null, null);
-      baseUrl = Services.io.newURI(objectParams.base, null, parsedPageUrl).spec;
-    } catch (e) { /* it's okay to ignore any exception */ }
-  }
-
-  var movieParams = {};
-  if (objectParams.flashvars) {
-    movieParams = parseQueryString(objectParams.flashvars);
-  }
-  var queryStringMatch = url && /\?([^#]+)/.exec(url);
-  if (queryStringMatch) {
-    var queryStringParams = parseQueryString(queryStringMatch[1]);
-    for (var i in queryStringParams) {
-      if (!(i in movieParams)) {
-        movieParams[i] = queryStringParams[i];
-      }
-    }
-  }
-
-  var allowScriptAccess = !!url &&
-    isScriptAllowed(objectParams.allowscriptaccess, url, pageUrl);
-  var isFullscreenSwf = isStandardEmbedWrapper(element);
-
-  var document = element.ownerDocument;
-  var window = document.defaultView;
-
-  var startupInfo = {};
-  startupInfo.window = window;
-  startupInfo.url = url;
-  startupInfo.privateBrowsing = isContentWindowPrivate(window);
-  startupInfo.objectParams = objectParams;
-  startupInfo.movieParams = movieParams;
-  startupInfo.baseUrl = baseUrl || url;
-  startupInfo.isOverlay = isOverlay;
-  startupInfo.refererUrl = !isFullscreenSwf ? baseUrl : null;
-  startupInfo.embedTag = element;
-  startupInfo.initStartTime = initStartTime;
-  startupInfo.allowScriptAccess = allowScriptAccess;
-  startupInfo.pageIndex = 0;
-  return startupInfo;
-}
deleted file mode 100644
--- a/browser/extensions/shumway/chrome/bootstrap-content.js
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright 2014 Mozilla Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-'use strict';
-
-(function contentScriptClosure() {
-  const Cc = Components.classes;
-  const Ci = Components.interfaces;
-  const Cm = Components.manager;
-  const Cu = Components.utils;
-  const Cr = Components.results;
-
-  // we need to use closure here -- we are running in the global context
-  Cu.import('resource://gre/modules/Services.jsm');
-
-  var isRemote = Services.appinfo.processType ===
-                 Services.appinfo.PROCESS_TYPE_CONTENT;
-  var isStarted = false;
-
-  function startup() {
-    if (isStarted) {
-      return;
-    }
-
-    isStarted = true;
-    Cu.import('resource://shumway/ShumwayBootstrapUtils.jsm');
-    ShumwayBootstrapUtils.register();
-  }
-
-  function shutdown() {
-    if (!isStarted) {
-      return;
-    }
-
-    isStarted = false;
-    ShumwayBootstrapUtils.unregister();
-    Cu.unload('resource://shumway/ShumwayBootstrapUtils.jsm');
-  }
-
-
-  function updateSettings() {
-    let mm = Cc["@mozilla.org/childprocessmessagemanager;1"]
-               .getService(Ci.nsISyncMessageSender);
-    var results = mm.sendSyncMessage('Shumway:Chrome:isEnabled');
-    var isEnabled = results.some(function (item) {
-      return item;
-    });
-
-    if (isEnabled) {
-      startup();
-    } else {
-      shutdown();
-    }
-  }
-
-  if (isRemote && typeof ShumwayBootstrapUtils !== 'undefined') {
-    // Treat content as non-remote when bootstrap.js or ShumwayUtils.jsm
-    // already registered the Shumway components for current content scope.
-    isRemote = false;
-  }
-
-  if (isRemote) {
-    addMessageListener('Shumway:Child:refreshSettings', updateSettings);
-    updateSettings();
-
-    addMessageListener('Shumway:Child:shutdown', function shutdownListener(e) {
-      removeMessageListener('Shumway:Child:refreshSettings', updateSettings);
-      removeMessageListener('Shumway:Child:shutdown', shutdownListener);
-
-      shutdown();
-    });
-  }
-})();
deleted file mode 100644
--- a/browser/extensions/shumway/chrome/content.html
+++ /dev/null
@@ -1,56 +0,0 @@
-<!DOCTYPE html>
-<!--
-Copyright 2015 Mozilla Foundation
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-<html>
-<head>
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
-
-  <style>
-    html, body {
-      margin: 0;
-      padding: 0;
-      width: 100%;
-      height: 100%;
-      overflow: hidden;
-      background-color: transparent;
-    }
-
-    iframe {
-      position:fixed !important;
-      left:0;top:0;bottom:0;right:0;
-      overflow: hidden;
-      line-height: 0;
-      border: 0px none;
-    }
-
-    body.remoteStopped {
-      background-color: red;
-    }
-    body.remoteDebug {
-      background-color: green;
-    }
-    body.remoteReload {
-      background-color: yellow;
-    }
-  </style>
-</head>
-
-<body>
-  <iframe id="viewer" src="resource://shumway/web/viewer.html" width="100%" height="100%"></iframe>
-  <script src="chrome://shumway/content/content.js"></script>
-</body>
-</html>
deleted file mode 100644
--- a/browser/extensions/shumway/chrome/content.js
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright 2015 Mozilla Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-Components.utils.import('resource://gre/modules/Services.jsm');
-Components.utils.import('resource://gre/modules/Promise.jsm');
-
-Components.utils.import('chrome://shumway/content/ShumwayCom.jsm');
-
-var messageManager, viewerReady;
-// Checking if we loading content.js in the OOP/mozbrowser or jsplugins.
-// TODO remove mozbrowser logic when we switch to jsplugins only support
-if (typeof document === 'undefined') { // mozbrowser OOP frame script
-  messageManager = this;
-  viewerReady = Promise.resolve(content);
-  messageManager.sendAsyncMessage('Shumway:constructed', null);
-} else { // jsplugins instance
-  messageManager = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
-                .getInterface(Components.interfaces.nsIDocShell)
-                .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
-                .getInterface(Components.interfaces.nsIContentFrameMessageManager);
-
-  var viewer = document.getElementById('viewer');
-  viewerReady = new Promise(function (resolve) {
-    viewer.addEventListener('load', function () {
-      messageManager.sendAsyncMessage('Shumway:constructed', null);
-      resolve(viewer.contentWindow);
-    });
-  });
-}
-
-
-var externalInterfaceWrapper = {
-  callback: function (call) {
-    if (!shumwayComAdapterHooks.onExternalCallback) {
-      return undefined;
-    }
-    return shumwayComAdapterHooks.onExternalCallback(
-      Components.utils.cloneInto(JSON.parse(call), content));
-  }
-};
-
-var shumwayComAdapterHooks = {};
-
-function sendMessage(action, data, sync) {
-  var detail = {action: action, data: data, sync: sync};
-  if (!sync) {
-    messageManager.sendAsyncMessage('Shumway:message', detail);
-    return;
-  }
-  var result = String(messageManager.sendSyncMessage('Shumway:message', detail));
-  result = result == 'undefined' ? undefined : JSON.parse(result);
-  return Components.utils.cloneInto(result, content);
-}
-
-function enableDebug() {
-  messageManager.sendAsyncMessage('Shumway:enableDebug', null);
-}
-
-messageManager.addMessageListener('Shumway:init', function (message) {
-  var environment = message.data;
-
-  messageManager.sendAsyncMessage('Shumway:running', {}, {
-    externalInterface: externalInterfaceWrapper
-  });
-
-  viewerReady.then(function (viewerWindow) {
-    ShumwayCom.createAdapter(viewerWindow.wrappedJSObject, {
-      sendMessage: sendMessage,
-      enableDebug: enableDebug,
-      getEnvironment: function () { return environment; }
-    }, shumwayComAdapterHooks);
-
-    viewerWindow.wrappedJSObject.runViewer();
-  });
-});
-
-messageManager.addMessageListener('Shumway:loadFile', function (message) {
-  if (!shumwayComAdapterHooks.onLoadFileCallback) {
-    return;
-  }
-  shumwayComAdapterHooks.onLoadFileCallback(Components.utils.cloneInto(message.data, content));
-});
deleted file mode 100644
--- a/browser/extensions/shumway/chrome/pingpong.js
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Copyright 2015 Mozilla Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-// Simple class for synchronous XHR communication.
-// See also examples/inspector/debug/server.js.
-
-var PingPongConnection = (function () {
-  function PingPongConnection(url, onlySend) {
-    this.url = url;
-    this.onData = null;
-    this.onError = null;
-    this.currentXhr = null;
-    this.closed = false;
-
-    if (!onlySend) {
-      this.idle();
-    }
-  }
-
-  PingPongConnection.prototype = {
-    idle: function () {
-      function requestIncoming(connection) {
-        var xhr = new XMLHttpRequest();
-        xhr.open('GET', connection.url + '?idle', true);
-        xhr.onload = function () {
-          if (xhr.status === 204 &&
-              xhr.getResponseHeader('X-PingPong-Error') === 'timeout') {
-            requestIncoming(connection);
-            return;
-          }
-          if (xhr.status === 200) {
-            var result;
-            if (connection.onData) {
-              var response = xhr.responseText;
-              result = connection.onData(response ? JSON.parse(response) : undefined);
-            }
-            if (xhr.getResponseHeader('X-PingPong-Async') === '1') {
-              requestIncoming(connection);
-            } else {
-              sendResponse(connection, result);
-            }
-            return;
-          }
-
-          if (connection.onError) {
-            connection.onError(xhr.statusText);
-          }
-        };
-        xhr.onerror = function () {
-          if (connection.onError) {
-            connection.onError(xhr.error);
-          }
-        };
-        xhr.send();
-        connection.currentXhr = xhr;
-      }
-      function sendResponse(connection, result) {
-        var xhr = new XMLHttpRequest();
-        xhr.open('POST', connection.url + '?response', false);
-        xhr.onload = function () {
-          if (xhr.status !== 204) {
-            if (connection.onError) {
-              connection.onError(xhr.statusText);
-            }
-          }
-          requestIncoming(connection);
-        };
-        xhr.onerror = function () {
-          if (connection.onError) {
-            connection.onError(xhr.error);
-          }
-        };
-        xhr.send(result === undefined ? '' : JSON.stringify(result));
-        connection.currentXhr = xhr;
-      }
-      requestIncoming(this);
-    },
-    send: function (data, async, timeout) {
-      if (this.closed) {
-        throw new Error('connection closed');
-      }
-
-      async = !!async;
-      timeout |= 0;
-
-      var encoded = data === undefined ? '' : JSON.stringify(data);
-      if (async) {
-        var xhr = new XMLHttpRequest();
-        xhr.open('POST', this.url + '?async', true);
-        xhr.send(encoded);
-        return;
-      } else {
-        var xhr = new XMLHttpRequest();
-        xhr.open('POST', this.url, false);
-        if (timeout > 0) {
-          xhr.setRequestHeader('X-PingPong-Timeout', timeout);
-        }
-        xhr.send(encoded);
-        if (xhr.status === 204 &&
-          xhr.getResponseHeader('X-PingPong-Error') === 'timeout') {
-          throw new Error('sync request timeout');
-        }
-        var response = xhr.responseText;
-        return response ? JSON.parse(response) : undefined;
-      }
-    },
-    close: function () {
-      if (this.currentXhr) {
-        this.currentXhr.abort();
-        this.currentXhr = null;
-      }
-      this.closed = true;
-    }
-  };
-
-  return PingPongConnection;
-})();
deleted file mode 100644
--- a/browser/extensions/shumway/chrome/plugin.js
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Copyright 2015 Mozilla Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-Components.utils.import('resource://gre/modules/XPCOMUtils.jsm');
-Components.utils.import('resource://gre/modules/Services.jsm');
-Components.utils.import('resource://gre/modules/Promise.jsm');
-
-Components.utils.import('chrome://shumway/content/StartupInfo.jsm');
-Components.utils.import('chrome://shumway/content/ShumwayCom.jsm');
-
-XPCOMUtils.defineLazyModuleGetter(this, 'PrivateBrowsingUtils',
-  'resource://gre/modules/PrivateBrowsingUtils.jsm');
-
-function log(str) {
-  var msg = 'plugin.js: ' + str;
-  Services.console.logStringMessage(msg);
-  dump(msg + '\n');
-}
-
-function runViewer() {
-  function handlerOOP() {
-    var frameLoader = pluginElement.frameLoader;
-    var messageManager = frameLoader.messageManager;
-
-    var externalInterface;
-
-    messageManager.addMessageListener('Shumway:running', function (message) {
-      externalInterface = message.objects.externalInterface;
-    });
-
-    messageManager.addMessageListener('Shumway:message', function (message) {
-      var data = message.data;
-      var result = shumwayActions.invoke(data.action, data.data);
-      if (message.sync) {
-        return result === undefined ? 'undefined' : JSON.stringify(result);
-      }
-    });
-
-    messageManager.addMessageListener('Shumway:enableDebug', function (message) {
-      enableDebug();
-    });
-
-    shumwayActions.onExternalCallback = function (call) {
-      return externalInterface.callback(JSON.stringify(call));
-    };
-
-    shumwayActions.onLoadFileCallback = function (args) {
-      messageManager.sendAsyncMessage('Shumway:loadFile', args);
-    };
-
-    messageManager.addMessageListener('Shumway:constructed', function (message) {
-      messageManager.sendAsyncMessage('Shumway:init', getEnvironment());
-    });
-  }
-
-  function getEnvironment() {
-    return {
-      swfUrl: startupInfo.url,
-      privateBrowsing: startupInfo.privateBrowsing
-    };
-  }
-
-  function enableDebug() {
-    DebugUtils.enableDebug(startupInfo.url);
-    setTimeout(function () {
-      // TODO fix plugin instance reloading for jsplugins
-    }, 1000);
-  }
-
-  var startupInfo = getStartupInfo(pluginElement);
-  if (!startupInfo.url) {
-    // Special case when movie URL is not specified, e.g. swfobject
-    // checks only version. No need to instantiate the flash plugin.
-    if (startupInfo.embedTag) {
-      setupSimpleExternalInterface(startupInfo.embedTag);
-    }
-    return;
-  }
-
-  var document = pluginElement.ownerDocument;
-  var window = document.defaultView;
-  var shumwayActions = ShumwayCom.createActions(startupInfo, window, document);
-
-  handlerOOP();
-
-  // TODO fix remote debugging for jsplugins
-}
-
-function setupSimpleExternalInterface(embedTag) {
-  Components.utils.exportFunction(function (variable) {
-    switch (variable) {
-      case '$version':
-        return 'SHUMWAY 10,0,0';
-      default:
-        log('Unsupported GetVariable() call: ' + variable);
-        return undefined;
-    }
-  }, embedTag.wrappedJSObject, {defineAs: 'GetVariable'});
-}
-
-runViewer();
-
deleted file mode 100644
--- a/browser/extensions/shumway/chrome/viewer.wrapper.html
+++ /dev/null
@@ -1,58 +0,0 @@
-<!DOCTYPE html>
-<!--
-Copyright 2013 Mozilla Foundation
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
--->
-<html>
-<head>
-  <meta charset="utf-8">
-  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
-
-  <style>
-    html, body {
-      margin: 0;
-      padding: 0;
-      width: 100%;
-      height: 100%;
-      overflow: hidden;
-      background-color: transparent;
-    }
-
-    iframe {
-      position:fixed !important;
-      left:0;top:0;bottom:0;right:0;
-      overflow: hidden;
-      line-height: 0;
-      border: 0px none;
-    }
-
-    body.remoteStopped {
-      background-color: red;
-    }
-    body.remoteDebug {
-      background-color: green;
-    }
-    body.remoteReload {
-      background-color: yellow;
-    }
-  </style>
-</head>
-
-<body>
-  <iframe id="viewer" src="resource://shumway/web/viewer.html" width="100%" height="100%" mozbrowser remote="true"></iframe>
-  <script src="chrome://shumway/content/pingpong.js"></script>
-  <script src="chrome://shumway/content/viewerDebugger.js"></script>
-  <script src="chrome://shumway/content/viewerWrapper.js"></script>
-</body>
-</html>
deleted file mode 100644
--- a/browser/extensions/shumway/chrome/viewerDebugger.js
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright 2015 Mozilla Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-Components.utils.import('resource://gre/modules/Services.jsm');
-
-var DebugUtils = (function () {
-  var baseUrl = null;
-
-  function getBaseUrl() {
-    if (baseUrl === null) {
-      try {
-        baseUrl = Services.prefs.getCharPref('shumway.debug.url');
-      } catch (e) {
-        baseUrl = 'http://localhost:8010';
-      }
-    }
-    return baseUrl;
-  }
-
-  var uniqueId = (Date.now() % 888888) * 2 + 1;
-
-  function getEnabledDebuggerId(swfUrl) {
-    return new Promise(function (resolve) {
-      var url = getBaseUrl() + '/debugController/' + uniqueId;
-      var connection = new PingPongConnection(url);
-      connection.onData = function (data) {
-        if (data.action === 'setDebugger' && data.swfUrl === swfUrl) {
-          resolve(data.debuggerId);
-        }
-      };
-      try {
-        connection.send({action: 'getDebugger', swfUrl: swfUrl, swfId: uniqueId}, true);
-      } catch (e) {
-        // ignoring failed send request
-      }
-      setTimeout(function () {
-        resolve(0);
-        connection.close();
-      }, 500);
-    });
-  }
-
-  function enableDebug(swfUrl) {
-    var url = getBaseUrl() + '/debugController/' + uniqueId;
-    var connection = new PingPongConnection(url, true);
-    try {
-      connection.send({action: 'enableDebugging', swfUrl: swfUrl}, true);
-    } catch (e) {
-      // ignoring failed send request
-    }
-    connection.close();
-  }
-
-  function createDebuggerConnection(swfUrl) {
-    return getEnabledDebuggerId(swfUrl).then(function (debuggerId) {
-      if (!debuggerId) {
-        return null;
-      }
-
-      var url = getBaseUrl() + '/debug/' + uniqueId + '/' + debuggerId;
-      console.log('Starting remote debugger with ' + url);
-      return new PingPongConnection(url);
-    });
-  }
-
-  return {
-    get isEnabled() {
-      try {
-        return Services.prefs.getBoolPref('shumway.debug.enabled');
-      } catch (e) {
-        return false;
-      }
-    },
-    enableDebug: enableDebug,
-    createDebuggerConnection: createDebuggerConnection
-  };
-})();
deleted file mode 100644
--- a/browser/extensions/shumway/chrome/viewerWrapper.js
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Copyright 2014 Mozilla Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var viewer = document.getElementById('viewer'), onLoaded;
-var promise = new Promise(function (resolve) {
-  onLoaded = resolve;
-});
-viewer.addEventListener('load', function () {
-  onLoaded(false);
-});
-viewer.addEventListener('mozbrowserloadend', function () {
-  onLoaded(true);
-});
-
-Components.utils.import('chrome://shumway/content/ShumwayCom.jsm');
-
-function runViewer() {
-  function handler() {
-    function sendMessage(action, data, sync) {
-      var result = shumwayActions.invoke(action, data);
-      return Components.utils.cloneInto(result, childWindow);
-    }
-
-    var childWindow = viewer.contentWindow.wrappedJSObject;
-
-    var shumwayComAdapterHooks = {};
-    ShumwayCom.createAdapter(childWindow, {
-      sendMessage: sendMessage,
-      enableDebug: enableDebug,
-      getEnvironment: getEnvironment,
-    }, shumwayComAdapterHooks);
-
-    shumwayActions.onExternalCallback = function (call) {
-      return shumwayComAdapterHooks.onExternalCallback(Components.utils.cloneInto(call, childWindow));
-    };
-
-    shumwayActions.onLoadFileCallback = function (args) {
-      shumwayComAdapterHooks.onLoadFileCallback(Components.utils.cloneInto(args, childWindow));
-    };
-
-    childWindow.runViewer();
-  }
-
-  function handlerOOP() {
-    var frameLoader = viewer.QueryInterface(Components.interfaces.nsIFrameLoaderOwner).frameLoader;
-    var messageManager = frameLoader.messageManager;
-    messageManager.loadFrameScript('chrome://shumway/content/content.js', false);
-
-    var externalInterface;
-
-    messageManager.addMessageListener('Shumway:running', function (message) {
-      externalInterface = message.objects.externalInterface;
-    });
-
-    messageManager.addMessageListener('Shumway:message', function (message) {
-      var data = message.data;
-      var result = shumwayActions.invoke(data.action, data.data);
-      if (message.sync) {
-        return result === undefined ? 'undefined' : JSON.stringify(result);
-      }
-    });
-
-    messageManager.addMessageListener('Shumway:enableDebug', function (message) {
-      enableDebug();
-    });
-
-    shumwayActions.onExternalCallback = function (call) {
-      return externalInterface.callback(JSON.stringify(call));
-    };
-
-    shumwayActions.onLoadFileCallback = function (args) {
-      messageManager.sendAsyncMessage('Shumway:loadFile', args);
-    };
-
-    messageManager.sendAsyncMessage('Shumway:init', getEnvironment());
-  }
-
-
-  function handleDebug(connection) {
-    viewer.parentNode.removeChild(viewer); // we don't need viewer anymore
-    document.body.className = 'remoteDebug';
-
-    function sendMessage(data) {
-      return shumwayActions.invoke(data.id, data.data);
-    }
-
-    connection.onData = function (data) {
-      switch (data.action) {
-        case 'sendMessage':
-          return sendMessage(data);
-        case 'reload':
-          document.body.className = 'remoteReload';
-          setTimeout(function () {
-            window.top.location.reload();
-          }, 1000);
-          return;
-      }
-    };
-
-    shumwayActions.onExternalCallback = function (call) {
-      return connection.send({action: 'onExternalCallback', detail: call});
-    };
-
-    shumwayActions.onLoadFileCallback = function (args) {
-      if (args.array) {
-        args.array = Array.prototype.slice.call(args.array, 0);
-      }
-      return connection.send({action: 'onLoadFileCallback', detail: args}, true);
-    };
-
-    connection.send({action: 'runViewer'}, true);
-  }
-
-  function getEnvironment() {
-    return {
-      swfUrl: window.shumwayStartupInfo.url,
-      privateBrowsing: window.shumwayStartupInfo.privateBrowsing
-    };
-  }
-
-  function enableDebug() {
-    DebugUtils.enableDebug(window.shumwayStartupInfo.url);
-    setTimeout(function () {
-      window.top.location.reload();
-    }, 1000);
-  }
-
-  var startupInfo = window.shumwayStartupInfo;
-  var shumwayActions = ShumwayCom.createActions(startupInfo, window, document);
-
-  promise.then(function (oop) {
-    if (DebugUtils.isEnabled) {
-      DebugUtils.createDebuggerConnection(window.shumwayStartupInfo.url).then(
-          function (debuggerConnection) {
-        if (debuggerConnection) {
-          handleDebug(debuggerConnection);
-        } else if (oop) {
-          handlerOOP();
-        } else {
-          handler();
-        }
-      });
-      return;
-    }
-
-    if (oop) {
-      handlerOOP();
-    } else {
-      handler();
-    }
-  });
-}
deleted file mode 100644
--- a/browser/extensions/shumway/content/ShumwayBootstrapUtils.jsm
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Copyright 2015 Mozilla Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-'use strict';
-
-var EXPORTED_SYMBOLS = ['ShumwayBootstrapUtils'];
-
-const PREF_PREFIX = 'shumway.';
-const PREF_IGNORE_CTP = PREF_PREFIX + 'ignoreCTP';
-const PREF_WHITELIST = PREF_PREFIX + 'swf.whitelist';
-const SWF_CONTENT_TYPE = 'application/x-shockwave-flash';
-const PLUGIN_HANLDER_URI = 'chrome://shumway/content/content.html';
-
-var Cc = Components.classes;
-var Ci = Components.interfaces;
-var Cm = Components.manager;
-var Cu = Components.utils;
-
-Cu.import('resource://gre/modules/XPCOMUtils.jsm');
-Cu.import('resource://gre/modules/Services.jsm');
-
-var Ph = Cc["@mozilla.org/plugin/host;1"].getService(Ci.nsIPluginHost);
-
-function getBoolPref(pref, def) {
-  try {
-    return Services.prefs.getBoolPref(pref);
-  } catch (ex) {
-    return def;
-  }
-}
-
-function getStringPref(pref, def) {
-  try {
-    return Services.prefs.getComplexValue(pref, Ci.nsISupportsString).data;
-  } catch (ex) {
-    return def;
-  }
-}
-
-function log(str) {
-  var msg = 'ShumwayBootstrapUtils.jsm: ' + str;
-  Services.console.logStringMessage(msg);
-  dump(msg + '\n');
-}
-
-// Register/unregister a constructor as a factory.
-function Factory() {}
-Factory.prototype = {
-  register: function register(targetConstructor) {
-    var proto = targetConstructor.prototype;
-    this._classID = proto.classID;
-
-    var factory = XPCOMUtils._getFactory(targetConstructor);
-    this._factory = factory;
-
-    var registrar = Cm.QueryInterface(Ci.nsIComponentRegistrar);
-    registrar.registerFactory(proto.classID, proto.classDescription,
-      proto.contractID, factory);
-
-    if (proto.classID2) {
-      this._classID2 = proto.classID2;
-      registrar.registerFactory(proto.classID2, proto.classDescription,
-                                proto.contractID2, factory);
-    }
-  },
-
-  unregister: function unregister() {
-    var registrar = Cm.QueryInterface(Ci.nsIComponentRegistrar);
-    registrar.unregisterFactory(this._classID, this._factory);
-    if (this._classID2) {
-      registrar.unregisterFactory(this._classID2, this._factory);
-    }
-  }
-};
-
-function allowedPlatformForMedia() {
-  var oscpu = Cc["@mozilla.org/network/protocol;1?name=http"]
-                .getService(Ci.nsIHttpProtocolHandler).oscpu;
-  if (oscpu.indexOf('Windows NT') === 0) {
-    return oscpu.indexOf('Windows NT 5') < 0; // excluding Windows XP
-  }
-  if (oscpu.indexOf('Intel Mac OS X') === 0) {
-    return true;
-  }
-  // Other platforms are not supported yet.
-  return false;
-}
-
-var ShumwayBootstrapUtils = {
-  isRegistered: false,
-  isJSPluginsSupported: false,
-
-  register: function () {
-    if (this.isRegistered) {
-      return;
-    }
-
-    this.isRegistered = true;
-
-    // Register the components.
-    this.isJSPluginsSupported = !!Ph.registerFakePlugin &&
-                                getBoolPref('shumway.jsplugins', false);
-
-    if (this.isJSPluginsSupported) {
-      let initPluginDict = {
-        handlerURI: PLUGIN_HANLDER_URI,
-        mimeEntries: [
-          {
-            type: SWF_CONTENT_TYPE,
-            description: 'Shockwave Flash',
-            extension: 'swf'
-          }
-        ],
-        niceName: 'Shumway plugin',
-        name: 'Shumway',
-        supersedeExisting: true, // TODO verify when jsplugins (bug 558184) is implemented
-        sandboxScript: 'chrome://shumway/content/plugin.js', // TODO verify when jsplugins (bug 558184) is implemented
-        version: '10.0.0.0'
-      };
-      Ph.registerFakePlugin(initPluginDict);
-    } else {
-      Cu.import('resource://shumway/ShumwayStreamConverter.jsm');
-
-      let converterFactory = new Factory();
-      converterFactory.register(ShumwayStreamConverter);
-      this.converterFactory = converterFactory;
-    }
-  },
-
-  unregister: function () {
-    if (!this.isRegistered) {
-      return;
-    }
-
-    this.isRegistered = false;
-
-    // Remove the contract/component.
-    if (this.isJSPluginsSupported) {
-      Ph.unregisterFakePlugin(PLUGIN_HANLDER_URI);
-    } else {
-      this.converterFactory.unregister();
-      this.converterFactory = null;
-    }
-  }
-};
deleted file mode 100644
--- a/browser/extensions/shumway/content/ShumwayStreamConverter.jsm
+++ /dev/null
@@ -1,415 +0,0 @@
-/*
- * Copyright 2015 Mozilla Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-'use strict';
-
-var EXPORTED_SYMBOLS = ['ShumwayStreamConverter', 'ShumwayStreamOverlayConverter'];
-
-const Cc = Components.classes;
-const Ci = Components.interfaces;
-const Cr = Components.results;
-const Cu = Components.utils;
-
-const SHUMWAY_CONTENT_TYPE = 'application/x-shockwave-flash';
-const EXPECTED_PLAYPREVIEW_URI_PREFIX = 'data:application/x-moz-playpreview;,' +
-                                        SHUMWAY_CONTENT_TYPE;
-
-const FIREFOX_ID = '{ec8030f7-c20a-464f-9b0e-13a3a9e97384}';
-const SEAMONKEY_ID = '{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}';
-
-Cu.import('resource://gre/modules/XPCOMUtils.jsm');
-Cu.import('resource://gre/modules/Services.jsm');
-Cu.import('resource://gre/modules/NetUtil.jsm');
-
-XPCOMUtils.defineLazyModuleGetter(this, 'PrivateBrowsingUtils',
-  'resource://gre/modules/PrivateBrowsingUtils.jsm');
-
-XPCOMUtils.defineLazyModuleGetter(this, 'ShumwayTelemetry',
-  'resource://shumway/ShumwayTelemetry.jsm');
-
-Components.utils.import('chrome://shumway/content/StartupInfo.jsm');
-
-function getBoolPref(pref, def) {
-  try {
-    return Services.prefs.getBoolPref(pref);
-  } catch (ex) {
-    return def;
-  }
-}
-
-function log(aMsg) {
-  let msg = 'ShumwayStreamConverter.js: ' + (aMsg.join ? aMsg.join('') : aMsg);
-  Services.console.logStringMessage(msg);
-  dump(msg + '\n');
-}
-
-function getDOMWindow(aChannel) {
-  var requestor = aChannel.notificationCallbacks ||
-                  aChannel.loadGroup.notificationCallbacks;
-  var win = requestor.getInterface(Components.interfaces.nsIDOMWindow);
-  return win;
-}
-
-function isShumwayEnabledFor(startupInfo) {
-  // disabled for PrivateBrowsing windows
-  if (isContentWindowPrivate(startupInfo.window) &&
-      !getBoolPref('shumway.enableForPrivate', false)) {
-    return false;
-  }
-  // disabled if embed tag specifies shumwaymode (for testing purpose)
-  if (startupInfo.objectParams['shumwaymode'] === 'off') {
-    return false;
-  }
-
-  var url = startupInfo.url;
-  var baseUrl = startupInfo.baseUrl;
-
-  // blacklisting well known sites with issues
-  if (/\.ytimg\.com\//i.test(url) /* youtube movies */ ||
-    /\/vui.swf\b/i.test(url) /* vidyo manager */  ||
-    /soundcloud\.com\/player\/assets\/swf/i.test(url) /* soundcloud */ ||
-    /sndcdn\.com\/assets\/swf/.test(url) /* soundcloud */ ||
-    /vimeocdn\.com/.test(url) /* vimeo */) {
-    return false;
-  }
-
-  return true;
-}
-
-function activateShumwayScripts(window) {
-  function initScripts() {
-    window.wrappedJSObject.runViewer();
-
-    var parentWindow = window.parent;
-    var viewerWindow = window.viewer.contentWindow;
-
-    function activate(e) {
-      e.preventDefault();
-      viewerWindow.removeEventListener('mousedown', activate, true);
-
-      parentWindow.addEventListener('keydown', forwardKeyEvent, true);
-      parentWindow.addEventListener('keyup', forwardKeyEvent, true);
-
-      sendFocusEvent('focus');
-
-      parentWindow.addEventListener('blur', deactivate, true);
-      parentWindow.addEventListener('mousedown', deactivate, true);
-      viewerWindow.addEventListener('unload', deactivate, true);
-    }
-
-    function deactivate() {
-      parentWindow.removeEventListener('blur', deactivate, true);
-      parentWindow.removeEventListener('mousedown', deactivate, true);
-      viewerWindow.removeEventListener('unload', deactivate, true);
-
-      parentWindow.removeEventListener('keydown', forwardKeyEvent, true);
-      parentWindow.removeEventListener('keyup', forwardKeyEvent, true);
-
-      sendFocusEvent('blur');
-
-      viewerWindow.addEventListener('mousedown', activate, true);
-    }
-
-    function forwardKeyEvent(e) {
-      var event = viewerWindow.document.createEvent('KeyboardEvent');
-      event.initKeyEvent(e.type,
-                         e.bubbles,
-                         e.cancelable,
-                         e.view,
-                         e.ctrlKey,
-                         e.altKey,
-                         e.shiftKey,
-                         e.metaKey,
-                         e.keyCode,
-                         e.charCode);
-      viewerWindow.dispatchEvent(event);
-    }
-
-    function sendFocusEvent(type) {
-      var event = viewerWindow.document.createEvent("UIEvent");
-      event.initEvent(type, false, true);
-      viewerWindow.dispatchEvent(event);
-    }
-
-    if (viewerWindow) {
-      viewerWindow.addEventListener('mousedown', activate, true);
-    }
-
-    window.addEventListener('shumwayFallback', function (e) {
-      var automatic = !!e.detail.automatic;
-      fallbackToNativePlugin(window, !automatic, automatic);
-    });
-  }
-
-  if (window.document.readyState === "interactive" ||
-      window.document.readyState === "complete") {
-    initScripts();
-  } else {
-    window.document.addEventListener('DOMContentLoaded', initScripts);
-  }
-}
-
-function fallbackToNativePlugin(window, userAction, activateCTP) {
-  var obj = window.frameElement;
-  var doc = obj.ownerDocument;
-  var e = doc.createEvent("CustomEvent");
-  e.initCustomEvent("MozPlayPlugin", true, true, activateCTP);
-  obj.dispatchEvent(e);
-
-  ShumwayTelemetry.onFallback(userAction);
-}
-
-function ShumwayStreamConverterBase() {
-}
-
-ShumwayStreamConverterBase.prototype = {
-  QueryInterface: XPCOMUtils.generateQI([
-      Ci.nsISupports,
-      Ci.nsIStreamConverter,
-      Ci.nsIStreamListener,
-      Ci.nsIRequestObserver
-  ]),
-
-  /*
-   * This component works as such:
-   * 1. asyncConvertData stores the listener
-   * 2. onStartRequest creates a new channel, streams the viewer and cancels
-   *    the request so Shumway can do the request
-   * Since the request is cancelled onDataAvailable should not be called. The
-   * onStopRequest does nothing. The convert function just returns the stream,
-   * it's just the synchronous version of asyncConvertData.
-   */
-
-  // nsIStreamConverter::convert
-  convert: function(aFromStream, aFromType, aToType, aCtxt) {
-    throw Cr.NS_ERROR_NOT_IMPLEMENTED;
-  },
-
-  getUrlHint: function(requestUrl) {
-    return requestUrl.spec;
-  },
-
-  getStartupInfo: function(window, url) {
-    var initStartTime = Date.now();
-    var element = window.frameElement;
-    var isOverlay = false;
-    if (element) {
-      // PlayPreview overlay "belongs" to the embed/object tag and consists of
-      // DIV and IFRAME. Starting from IFRAME and looking for first object tag.
-      var tagName = element.nodeName, containerElement;
-      while (tagName != 'EMBED' && tagName != 'OBJECT') {
-        // plugin overlay skipping until the target plugin is found
-        isOverlay = true;
-        containerElement = element;
-        element = element.parentNode;
-        if (!element) {
-          throw new Error('Plugin element is not found');
-        }
-        tagName = element.nodeName;
-      }
-
-      if (isOverlay) {
-        // HACK For Facebook, CSS embed tag rescaling -- iframe (our overlay)
-        // has no styling in document. Shall removed with jsplugins.
-        for (var child = window.frameElement; child !== element; child = child.parentNode) {
-          child.setAttribute('style', 'max-width: 100%; max-height: 100%');
-        }
-
-        // Checking if overlay is a proper PlayPreview overlay.
-        for (var i = 0; i < element.children.length; i++) {
-          if (element.children[i] === containerElement) {
-            throw new Error('Plugin element is invalid');
-          }
-        }
-      }
-    }
-
-    if (element) {
-      return getStartupInfo(element);
-    }
-
-    // Stream converter is used in top level window, just providing basic
-    // information about SWF.
-
-    var objectParams = {};
-    var movieParams = {};
-    var queryStringMatch = url && /\?([^#]+)/.exec(url);
-    if (queryStringMatch) {
-      var queryStringParams = parseQueryString(queryStringMatch[1]);
-      for (var i in queryStringParams) {
-        if (!(i in movieParams)) {
-          movieParams[i] = queryStringParams[i];
-        }
-      }
-    }
-
-    // Using the same data structure as we return in StartupInfo.jsm and
-    // assigning constant values for fields that is not applicable for
-    // the stream converter when it is used in a top level window.
-    var startupInfo = {};
-    startupInfo.window = window;
-    startupInfo.url = url;
-    startupInfo.privateBrowsing = isContentWindowPrivate(window);
-    startupInfo.objectParams = objectParams;
-    startupInfo.movieParams = movieParams;
-    startupInfo.baseUrl = url;
-    startupInfo.isOverlay = false;
-    startupInfo.refererUrl = null;
-    startupInfo.embedTag = null;
-    startupInfo.isPausedAtStart = /\bpaused=true$/.test(url);
-    startupInfo.initStartTime = initStartTime;
-    startupInfo.allowScriptAccess = false;
-    return startupInfo;
-  },
-
-  // nsIStreamConverter::asyncConvertData
-  asyncConvertData: function(aFromType, aToType, aListener, aCtxt) {
-    // Store the listener passed to us
-    this.listener = aListener;
-  },
-
-  // nsIStreamListener::onDataAvailable
-  onDataAvailable: function(aRequest, aContext, aInputStream, aOffset, aCount) {
-    // Do nothing since all the data loading is handled by the viewer.
-    log('SANITY CHECK: onDataAvailable SHOULD NOT BE CALLED!');
-  },
-
-  // nsIRequestObserver::onStartRequest
-  onStartRequest: function(aRequest, aContext) {
-    // Setup the request so we can use it below.
-    aRequest.QueryInterface(Ci.nsIChannel);
-
-    aRequest.QueryInterface(Ci.nsIWritablePropertyBag);
-
-    // Change the content type so we don't get stuck in a loop.
-    aRequest.setProperty('contentType', aRequest.contentType);
-    aRequest.contentType = 'text/html';
-
-    // TODO For now suspending request, however we can continue fetching data
-    aRequest.suspend();
-
-    var originalURI = aRequest.URI;
-
-    // Create a new channel that loads the viewer as a chrome resource.
-    var viewerUrl = 'chrome://shumway/content/viewer.wrapper.html';
-    var channel = NetUtil.newChannel({
-      uri: viewerUrl,
-      loadUsingSystemPrincipal: true
-    });
-
-    var converter = this;
-    var listener = this.listener;
-    // Proxy all the request observer calls, when it gets to onStopRequest
-    // we can get the dom window.
-    var proxy = {
-      onStartRequest: function(request, context) {
-        listener.onStartRequest(aRequest, context);
-      },
-      onDataAvailable: function(request, context, inputStream, offset, count) {
-        listener.onDataAvailable(aRequest, context, inputStream, offset, count);
-      },
-      onStopRequest: function(request, context, statusCode) {
-        // Cancel the request so the viewer can handle it.
-        aRequest.resume();
-        aRequest.cancel(Cr.NS_BINDING_ABORTED);
-
-        var domWindow = getDOMWindow(channel);
-        let startupInfo = converter.getStartupInfo(domWindow, converter.getUrlHint(originalURI));
-
-        listener.onStopRequest(aRequest, context, statusCode);
-
-        if (!startupInfo.url) {
-          // Special case when movie URL is not specified, e.g. swfobject
-          // checks only version. No need to instantiate the flash plugin.
-          if (startupInfo.embedTag) {
-            setupSimpleExternalInterface(startupInfo.embedTag);
-          }
-          return;
-        }
-
-        if (!isShumwayEnabledFor(startupInfo)) {
-          fallbackToNativePlugin(domWindow, false, true);
-          return;
-        }
-
-        domWindow.shumwayStartupInfo = startupInfo;
-
-        // TODO Report telemetry on amount of swfs on the page
-        // ShumwayTelemetry.onPageIndex(pageIndex);
-
-        activateShumwayScripts(domWindow);
-      }
-    };
-
-    // Keep the URL the same so the browser sees it as the same.
-    channel.originalURI = aRequest.URI;
-    channel.loadGroup = aRequest.loadGroup;
-
-    // We can use all powerful principal: we are opening chrome:// web page,
-    // which will need lots of permission.
-    var securityManager = Cc['@mozilla.org/scriptsecuritymanager;1']
-                          .getService(Ci.nsIScriptSecurityManager);
-    var resourcePrincipal = securityManager.getSystemPrincipal();
-    aRequest.owner = resourcePrincipal;
-    channel.asyncOpen2(proxy);
-  },
-
-  // nsIRequestObserver::onStopRequest
-  onStopRequest: function(aRequest, aContext, aStatusCode) {
-    // Do nothing.
-  }
-};
-
-function setupSimpleExternalInterface(embedTag) {
-  Components.utils.exportFunction(function (variable) {
-    switch (variable) {
-      case '$version':
-        return 'SHUMWAY 10,0,0';
-      default:
-        log('Unsupported GetVariable() call: ' + variable);
-        return undefined;
-    }
-  }, embedTag.wrappedJSObject, {defineAs: 'GetVariable'});
-}
-
-// properties required for XPCOM registration:
-function copyProperties(obj, template) {
-  for (var prop in template) {
-    obj[prop] = template[prop];
-  }
-}
-
-function ShumwayStreamConverter() {}
-ShumwayStreamConverter.prototype = new ShumwayStreamConverterBase();
-copyProperties(ShumwayStreamConverter.prototype, {
-  classID: Components.ID('{4c6030f7-e20a-264f-5b0e-ada3a9e97384}'),
-  classDescription: 'Shumway Content Converter Component',
-  contractID: '@mozilla.org/streamconv;1?from=application/x-shockwave-flash&to=*/*',
-
-  classID2: Components.ID('{4c6030f8-e20a-264f-5b0e-ada3a9e97384}'),
-  contractID2: '@mozilla.org/streamconv;1?from=application/x-shockwave-flash&to=text/html'
-});
-
-function ShumwayStreamOverlayConverter() {}
-ShumwayStreamOverlayConverter.prototype = new ShumwayStreamConverterBase();
-copyProperties(ShumwayStreamOverlayConverter.prototype, {
-  classID: Components.ID('{4c6030f7-e20a-264f-5f9b-ada3a9e97384}'),
-  classDescription: 'Shumway PlayPreview Component',
-  contractID: '@mozilla.org/streamconv;1?from=application/x-moz-playpreview&to=*/*'
-});
-ShumwayStreamOverlayConverter.prototype.getUrlHint = function (requestUrl) {
-  return '';
-};
deleted file mode 100644
--- a/browser/extensions/shumway/content/ShumwayTelemetry.jsm
+++ /dev/null
@@ -1,75 +0,0 @@
-/* Copyright 2013 Mozilla Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-/* jshint esnext:true */
-
-'use strict';
-
-this.EXPORTED_SYMBOLS = ['ShumwayTelemetry'];
-
-const Cu = Components.utils;
-Cu.import('resource://gre/modules/Services.jsm');
-
-const BANNER_SIZES = [
-  "88x31", "120x60", "120x90", "120x240", "120x600", "125x125", "160x600",
-  "180x150", "234x60", "240x400", "250x250", "300x100", "300x250", "300x600",
-  "300x1050", "336x280", "468x60", "550x480", "720x100", "728x90", "970x90",
-  "970x250"];
-
-function getBannerType(width, height) {
-  return BANNER_SIZES.indexOf(width + 'x' + height) + 1;
-}
-
-this.ShumwayTelemetry = {
-  onFirstFrame: function (timeToDisplay) {
-    var histogram = Services.telemetry.getHistogramById("SHUMWAY_TIME_TO_VIEW_MS");
-    histogram.add(timeToDisplay);
-  },
-  onParseInfo: function (parseInfo) {
-    var histogram = Services.telemetry.getHistogramById("SHUMWAY_PARSING_MS");
-    histogram.add(parseInfo.parseTime);
-    var histogram = Services.telemetry.getHistogramById("SHUMWAY_SWF_SIZE_KB");
-    histogram.add(parseInfo.size / 1024);
-    var histogram = Services.telemetry.getHistogramById("SHUMWAY_SWF_VERSION");
-    histogram.add(parseInfo.swfVersion);
-    var histogram = Services.telemetry.getHistogramById("SHUMWAY_SWF_FRAME_RATE");
-    histogram.add(parseInfo.frameRate);
-    var histogram = Services.telemetry.getHistogramById("SHUMWAY_SWF_AREA");
-    histogram.add(parseInfo.width * parseInfo.height);
-    var histogram = Services.telemetry.getHistogramById("SHUMWAY_SWF_BANNER");
-    histogram.add(getBannerType(parseInfo.width, parseInfo.height));
-    var histogram = Services.telemetry.getHistogramById("SHUMWAY_SWF_AVM2");
-    histogram.add(parseInfo.isAvm2);
-  },
-  onError: function (errorType) {
-    var histogram = Services.telemetry.getHistogramById("SHUMWAY_ERROR");
-    histogram.add(errorType);
-  },
-  onPageIndex: function (pageIndex) {
-    var histogram = Services.telemetry.getHistogramById("SHUMWAY_SWF_INDEX_ON_PAGE");
-    histogram.add(pageIndex);
-  },
-  onFeature: function (featureType) {
-    var histogram = Services.telemetry.getHistogramById("SHUMWAY_FEATURE_USED");
-    histogram.add(featureType);
-  },
-  onLoadResource: function (resultType) {
-    var histogram = Services.telemetry.getHistogramById("SHUMWAY_LOAD_RESOURCE_RESULT");
-    histogram.add(resultType);
-  },
-  onFallback: function (userAction) {
-    var histogram = Services.telemetry.getHistogramById("SHUMWAY_FALLBACK");
-    histogram.add(userAction);
-  }
-};
deleted file mode 100644
--- a/browser/extensions/shumway/content/ShumwayUtils.jsm
+++ /dev/null
@@ -1,130 +0,0 @@
-/* Copyright 2012 Mozilla Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-var EXPORTED_SYMBOLS = ["ShumwayUtils"];
-
-const PREF_PREFIX = 'shumway.';
-const PREF_DISABLED = PREF_PREFIX + 'disabled';
-const PREF_WHITELIST = PREF_PREFIX + 'swf.whitelist';
-
-var Cc = Components.classes;
-var Ci = Components.interfaces;
-var Cm = Components.manager;
-var Cu = Components.utils;
-
-Cu.import('resource://gre/modules/XPCOMUtils.jsm');
-Cu.import('resource://gre/modules/Services.jsm');
-
-function getBoolPref(pref, def) {
-  try {
-    return Services.prefs.getBoolPref(pref);
-  } catch (ex) {
-    return def;
-  }
-}
-
-function log(str) {
-  dump(str + '\n');
-}
-
-var ShumwayUtils = {
-  QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver]),
-  _registered: false,
-
-  init: function init() {
-    this.migratePreferences();
-    if (this.enabled)
-      this._ensureRegistered();
-    else
-      this._ensureUnregistered();
-
-    Cc["@mozilla.org/parentprocessmessagemanager;1"]
-      .getService(Ci.nsIMessageBroadcaster)
-      .addMessageListener('Shumway:Chrome:isEnabled', this);
-
-    // Listen for when shumway is completely disabled.
-    Services.prefs.addObserver(PREF_DISABLED, this, false);
-  },
-
-  migratePreferences: function migratePreferences() {
-    // At one point we had shumway.disabled set to true by default,
-    // and we are trying to replace it with shumway.swf.whitelist:
-    // checking if the user already changed it before to reset
-    // the whitelist to '*'.
-    if (Services.prefs.prefHasUserValue(PREF_DISABLED) &&
-        !Services.prefs.prefHasUserValue(PREF_WHITELIST) &&
-        !getBoolPref(PREF_DISABLED, false)) {
-      // The user is already using Shumway -- enabling all web sites.
-      Services.prefs.setCharPref(PREF_WHITELIST, '*');
-    }
-  },
-
-  // nsIObserver
-  observe: function observe(aSubject, aTopic, aData) {
-    if (this.enabled)
-      this._ensureRegistered();
-    else
-      this._ensureUnregistered();
-  },
-
-  receiveMessage: function(message) {
-    switch (message.name) {
-      case 'Shumway:Chrome:isEnabled':
-        return this.enabled;
-    }
-  },
-  
-  /**
-   * shumway is only enabled if the global switch enabling is true.
-   * @return {boolean} Wether or not it's enabled.
-   */
-  get enabled() {
-    return !getBoolPref(PREF_DISABLED, true);
-  },
-
-  _ensureRegistered: function _ensureRegistered() {
-    if (this._registered)
-      return;
-
-    // Load the component and register it.
-    Cu.import('resource://shumway/ShumwayBootstrapUtils.jsm');
-    ShumwayBootstrapUtils.register();
-
-    this._registered = true;
-
-    log('Shumway is registered');
-
-    let globalMM = Cc['@mozilla.org/globalmessagemanager;1']
-      .getService(Ci.nsIFrameScriptLoader);
-    globalMM.broadcastAsyncMessage('Shumway:Child:refreshSettings');
-  },
-
-  _ensureUnregistered: function _ensureUnregistered() {
-    if (!this._registered)
-      return;
-
-    // Remove the contract/component.
-    ShumwayBootstrapUtils.unregister();
-    Cu.unload('resource://shumway/ShumwayBootstrapUtils.jsm');
-
-    this._registered = false;
-
-    log('Shumway is unregistered');
-
-    let globalMM = Cc['@mozilla.org/globalmessagemanager;1']
-      .getService(Ci.nsIFrameScriptLoader);
-    globalMM.broadcastAsyncMessage('Shumway:Child:refreshSettings');
-  }
-};
deleted file mode 100644
--- a/browser/extensions/shumway/content/gfx/gl/shaders/combined.frag
+++ /dev/null
@@ -1,46 +0,0 @@
-precision mediump float;
-
-varying vec4 vColor;
-uniform mat4 uColorMatrix;
-uniform vec4 uColorVector;
-uniform sampler2D uSampler[8];
-varying vec2 vCoordinate;
-varying float vKind;
-varying float vSampler;
-
-void main() {
-  vec4 color;
-  int kind = int(floor(vKind + 0.5));
-  if (kind == 0) {
-    color = vColor;
-  } else if (kind == 1 || kind == 2) {
-    int sampler = int(floor(vSampler + 0.5));
-    if (sampler == 0) {
-      color = vColor * texture2D(uSampler[0], vCoordinate);
-    } else if (sampler == 1) {
-      color = vColor * texture2D(uSampler[1], vCoordinate);
-    } else if (sampler == 2) {
-      color = vColor * texture2D(uSampler[2], vCoordinate);
-    } else if (sampler == 3) {
-      color = vColor * texture2D(uSampler[3], vCoordinate);
-    } else if (sampler == 4) {
-      color = vColor * texture2D(uSampler[4], vCoordinate);
-    } else if (sampler == 5) {
-      color = vColor * texture2D(uSampler[5], vCoordinate);
-    } else if (sampler == 6) {
-      color = vColor * texture2D(uSampler[6], vCoordinate);
-    } else if (sampler == 7) {
-      color = vColor * texture2D(uSampler[7], vCoordinate);
-    }
-    if (kind == 2) {
-      color = color * uColorMatrix + uColorVector;
-    }
-  } else {
-    color = vec4(1.0, 0.0, 0.0, 1.0);
-  }
-  // color.rgb *= color.a;
-  if (color.a < 0.01) {
-    discard;
-  }
-  gl_FragColor = color;
-}
\ No newline at end of file
deleted file mode 100644
--- a/browser/extensions/shumway/content/gfx/gl/shaders/combined.vert
+++ /dev/null
@@ -1,22 +0,0 @@
-uniform vec2 uResolution;
-uniform mat3 uTransformMatrix;
-uniform mat4 uTransformMatrix3D;
-
-attribute vec4 aPosition;
-attribute vec4 aColor;
-attribute vec2 aCoordinate;
-attribute float aKind;
-attribute float aSampler;
-
-varying vec4 vColor;
-varying vec2 vCoordinate;
-varying float vKind;
-varying float vSampler;
-
-void main() {
-  gl_Position = uTransformMatrix3D * aPosition;
-  vColor = aColor;
-  vCoordinate = aCoordinate;
-  vKind = aKind;
-  vSampler = aSampler;
-}
\ No newline at end of file
deleted file mode 100644
index a54a058b3aa0f23a4a6b5e945efbd00cc66e11d9..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 1bdf39e81dbccb67f5a7b6f11b301e917a9c6c30..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/browser/extensions/shumway/content/playerglobal/playerglobal.json
+++ /dev/null
@@ -1,2745 +0,0 @@
-[
-  {
-    "name": "flash/accessibility/Accessibility",
-    "defs": [
-      "flash.accessibility:Accessibility"
-    ],
-    "offset": 0,
-    "length": 355
-  },
-  {
-    "name": "flash/accessibility/AccessibilityImplementation",
-    "defs": [
-      "flash.accessibility:AccessibilityImplementation"
-    ],
-    "offset": 355,
-    "length": 995
-  },
-  {
-    "name": "flash/accessibility/AccessibilityProperties",
-    "defs": [
-      "flash.accessibility:AccessibilityProperties"
-    ],
-    "offset": 1350,
-    "length": 334
-  },
-  {
-    "name": "flash/accessibility/ISearchableText",
-    "defs": [
-      "flash.accessibility:ISearchableText"
-    ],
-    "offset": 1684,
-    "length": 183
-  },
-  {
-    "name": "flash/accessibility/ISimpleTextSelection",
-    "defs": [
-      "flash.accessibility:ISimpleTextSelection"
-    ],
-    "offset": 1867,
-    "length": 232
-  },
-  {
-    "name": "flash/desktop/Clipboard",
-    "defs": [
-      "flash.desktop:Clipboard"
-    ],
-    "offset": 2099,
-    "length": 552
-  },
-  {
-    "name": "flash/desktop/ClipboardTransferMode",
-    "defs": [
-      "flash.desktop:ClipboardTransferMode"
-    ],
-    "offset": 2651,
-    "length": 375
-  },
-  {
-    "name": "flash/desktop/ClipboardFormats",
-    "defs": [
-      "flash.desktop:ClipboardFormats"
-    ],
-    "offset": 3026,
-    "length": 653
-  },
-  {
-    "name": "flash/errors/InvalidSWFError",
-    "defs": [
-      "flash.errors:InvalidSWFError"
-    ],
-    "offset": 3679,
-    "length": 217
-  },
-  {
-    "name": "flash/errors/StackOverflowError",
-    "defs": [
-      "flash.errors:StackOverflowError"
-    ],
-    "offset": 3896,
-    "length": 223
-  },
-  {
-    "name": "flash/errors/ScriptTimeoutError",
-    "defs": [
-      "flash.errors:ScriptTimeoutError"
-    ],
-    "offset": 4119,
-    "length": 223
-  },
-  {
-    "name": "flash/display/ActionScriptVersion",
-    "defs": [
-      "flash.display:ActionScriptVersion"
-    ],
-    "offset": 4342,
-    "length": 253
-  },
-  {
-    "name": "flash/display/AVM1Movie",
-    "defs": [
-      "flash.display:AVM1Movie"
-    ],
-    "offset": 4595,
-    "length": 318
-  },
-  {
-    "name": "flash/display/Bitmap",
-    "defs": [
-      "flash.display:Bitmap"
-    ],
-    "offset": 4913,
-    "length": 390
-  },
-  {
-    "name": "flash/display/BitmapData",
-    "defs": [
-      "flash.display:BitmapData"
-    ],
-    "offset": 5303,
-    "length": 1445
-  },
-  {
-    "name": "flash/display/BitmapDataChannel",
-    "defs": [
-      "flash.display:BitmapDataChannel"
-    ],
-    "offset": 6748,
-    "length": 274
-  },
-  {
-    "name": "flash/display/BitmapEncodingColorSpace",
-    "defs": [
-      "flash.display:BitmapEncodingColorSpace"
-    ],
-    "offset": 7022,
-    "length": 355
-  },
-  {
-    "name": "flash/display/BlendMode",
-    "defs": [
-      "flash.display:BlendMode"
-    ],
-    "offset": 7377,
-    "length": 595
-  },
-  {
-    "name": "flash/display/CapsStyle",
-    "defs": [
-      "flash.display:CapsStyle"
-    ],
-    "offset": 7972,
-    "length": 256
-  },
-  {
-    "name": "flash/display/ColorCorrection",
-    "defs": [
-      "flash.display:ColorCorrection"
-    ],
-    "offset": 8228,
-    "length": 262
-  },
-  {
-    "name": "flash/display/ColorCorrectionSupport",
-    "defs": [
-      "flash.display:ColorCorrectionSupport"
-    ],
-    "offset": 8490,
-    "length": 314
-  },
-  {
-    "name": "flash/display/DisplayObject",
-    "defs": [
-      "flash.display:DisplayObject"
-    ],
-    "offset": 8804,
-    "length": 1466
-  },
-  {
-    "name": "flash/display/DisplayObjectContainer",
-    "defs": [
-      "flash.display:DisplayObjectContainer"
-    ],
-    "offset": 10270,
-    "length": 898
-  },
-  {
-    "name": "flash/display/FocusDirection",
-    "defs": [
-      "flash.display:FocusDirection"
-    ],
-    "offset": 11168,
-    "length": 262
-  },
-  {
-    "name": "flash/display/FrameLabel",
-    "defs": [
-      "flash.display:FrameLabel"
-    ],
-    "offset": 11430,
-    "length": 278
-  },
-  {
-    "name": "flash/display/Graphics",
-    "defs": [
-      "flash.display:Graphics"
-    ],
-    "offset": 11708,
-    "length": 956
-  },
-  {
-    "name": "flash/display/GradientType",
-    "defs": [
-      "flash.display:GradientType"
-    ],
-    "offset": 12664,
-    "length": 239
-  },
-  {
-    "name": "flash/display/GraphicsBitmapFill",
-    "defs": [
-      "flash.display:GraphicsBitmapFill"
-    ],
-    "offset": 12903,
-    "length": 346
-  },
-  {
-    "name": "flash/display/GraphicsEndFill",
-    "defs": [
-      "flash.display:GraphicsEndFill"
-    ],
-    "offset": 13249,
-    "length": 215
-  },
-  {
-    "name": "flash/display/GraphicsGradientFill",
-    "defs": [
-      "flash.display:GraphicsGradientFill"
-    ],
-    "offset": 13464,
-    "length": 697
-  },
-  {
-    "name": "flash/display/GraphicsPath",
-    "defs": [
-      "flash.display:GraphicsPath"
-    ],
-    "offset": 14161,
-    "length": 1258
-  },
-  {
-    "name": "flash/display/GraphicsPathCommand",
-    "defs": [
-      "flash.display:GraphicsPathCommand"
-    ],
-    "offset": 15419,
-    "length": 368
-  },
-  {
-    "name": "flash/display/GraphicsPathWinding",
-    "defs": [
-      "flash.display:GraphicsPathWinding"
-    ],
-    "offset": 15787,
-    "length": 259
-  },
-  {
-    "name": "flash/display/GraphicsSolidFill",
-    "defs": [
-      "flash.display:GraphicsSolidFill"
-    ],
-    "offset": 16046,
-    "length": 283
-  },
-  {
-    "name": "flash/display/GraphicsStroke",
-    "defs": [
-      "flash.display:GraphicsStroke"
-    ],
-    "offset": 16329,
-    "length": 1542
-  },
-  {
-    "name": "flash/display/GraphicsTrianglePath",
-    "defs": [
-      "flash.display:GraphicsTrianglePath"
-    ],
-    "offset": 17871,
-    "length": 680
-  },
-  {
-    "name": "flash/display/IBitmapDrawable",
-    "defs": [
-      "flash.display:IBitmapDrawable"
-    ],
-    "offset": 18551,
-    "length": 105
-  },
-  {
-    "name": "flash/display/IDrawCommand",
-    "defs": [
-      "flash.display:IDrawCommand"
-    ],
-    "offset": 18656,
-    "length": 102
-  },
-  {
-    "name": "flash/display/IGraphicsData",
-    "defs": [
-      "flash.display:IGraphicsData"
-    ],
-    "offset": 18758,
-    "length": 103
-  },
-  {
-    "name": "flash/display/IGraphicsFill",
-    "defs": [
-      "flash.display:IGraphicsFill"
-    ],
-    "offset": 18861,
-    "length": 103
-  },
-  {
-    "name": "flash/display/IGraphicsPath",
-    "defs": [
-      "flash.display:IGraphicsPath"
-    ],
-    "offset": 18964,
-    "length": 103
-  },
-  {
-    "name": "flash/display/IGraphicsStroke",
-    "defs": [
-      "flash.display:IGraphicsStroke"
-    ],
-    "offset": 19067,
-    "length": 105
-  },
-  {
-    "name": "flash/display/InteractiveObject",
-    "defs": [
-      "flash.display:InteractiveObject"
-    ],
-    "offset": 19172,
-    "length": 764
-  },
-  {
-    "name": "flash/display/InterpolationMethod",
-    "defs": [
-      "flash.display:InterpolationMethod"
-    ],
-    "offset": 19936,
-    "length": 254
-  },
-  {
-    "name": "flash/display/JointStyle",
-    "defs": [
-      "flash.display:JointStyle"
-    ],
-    "offset": 20190,
-    "length": 258
-  },
-  {
-    "name": "flash/display/JPEGEncoderOptions",
-    "defs": [
-      "flash.display:JPEGEncoderOptions"
-    ],
-    "offset": 20448,
-    "length": 216
-  },
-  {
-    "name": "flash/display/JPEGXREncoderOptions",
-    "defs": [
-      "flash.display:JPEGXREncoderOptions"
-    ],
-    "offset": 20664,
-    "length": 295
-  },
-  {
-    "name": "flash/display/LineScaleMode",
-    "defs": [
-      "flash.display:LineScaleMode"
-    ],
-    "offset": 20959,
-    "length": 307
-  },
-  {
-    "name": "flash/display/Loader",
-    "defs": [
-      "flash.display:Loader"
-    ],
-    "offset": 21266,
-    "length": 756
-  },
-  {
-    "name": "flash/display/LoaderInfo",
-    "defs": [
-      "flash.display:LoaderInfo"
-    ],
-    "offset": 22022,
-    "length": 992
-  },
-  {
-    "name": "flash/display/MorphShape",
-    "defs": [
-      "flash.display:MorphShape"
-    ],
-    "offset": 23014,
-    "length": 263
-  },
-  {
-    "name": "flash/display/MovieClip",
-    "defs": [
-      "flash.display:MovieClip"
-    ],
-    "offset": 23277,
-    "length": 845
-  },
-  {
-    "name": "flash/display/NativeMenu",
-    "defs": [
-      "flash.display:NativeMenu"
-    ],
-    "offset": 24122,
-    "length": 226
-  },
-  {
-    "name": "flash/display/NativeMenuItem",
-    "defs": [
-      "flash.display:NativeMenuItem"
-    ],
-    "offset": 24348,
-    "length": 285
-  },
-  {
-    "name": "flash/display/PixelSnapping",
-    "defs": [
-      "flash.display:PixelSnapping"
-    ],
-    "offset": 24633,
-    "length": 264
-  },
-  {
-    "name": "flash/display/PNGEncoderOptions",
-    "defs": [
-      "flash.display:PNGEncoderOptions"
-    ],
-    "offset": 24897,
-    "length": 224
-  },
-  {
-    "name": "flash/display/Scene",
-    "defs": [
-      "flash.display:Scene"
-    ],
-    "offset": 25121,
-    "length": 255
-  },
-  {
-    "name": "flash/display/Shape",
-    "defs": [
-      "flash.display:Shape"
-    ],
-    "offset": 25376,
-    "length": 266
-  },
-  {
-    "name": "flash/display/SimpleButton",
-    "defs": [
-      "flash.display:SimpleButton"
-    ],
-    "offset": 25642,
-    "length": 596
-  },
-  {
-    "name": "flash/display/SpreadMethod",
-    "defs": [
-      "flash.display:SpreadMethod"
-    ],
-    "offset": 26238,
-    "length": 264
-  },
-  {
-    "name": "flash/display/Sprite",
-    "defs": [
-      "flash.display:Sprite"
-    ],
-    "offset": 26502,
-    "length": 670
-  },
-  {
-    "name": "flash/display/Stage",
-    "defs": [
-      "flash.display:Stage"
-    ],
-    "offset": 27172,
-    "length": 2409
-  },
-  {
-    "name": "flash/display/Stage3D",
-    "defs": [
-      "flash.display:Stage3D"
-    ],
-    "offset": 29581,
-    "length": 443
-  },
-  {
-    "name": "flash/display/StageAlign",
-    "defs": [
-      "flash.display:StageAlign"
-    ],
-    "offset": 30024,
-    "length": 383
-  },
-  {
-    "name": "flash/display/StageDisplayState",
-    "defs": [
-      "flash.display:StageDisplayState"
-    ],
-    "offset": 30407,
-    "length": 319
-  },
-  {
-    "name": "flash/display/StageQuality",
-    "defs": [
-      "flash.display:StageQuality"
-    ],
-    "offset": 30726,
-    "length": 429
-  },
-  {
-    "name": "flash/display/StageScaleMode",
-    "defs": [
-      "flash.display:StageScaleMode"
-    ],
-    "offset": 31155,
-    "length": 317
-  },
-  {
-    "name": "flash/display/SWFVersion",
-    "defs": [
-      "flash.display:SWFVersion"
-    ],
-    "offset": 31472,
-    "length": 454
-  },
-  {
-    "name": "flash/display/TriangleCulling",
-    "defs": [
-      "flash.display:TriangleCulling"
-    ],
-    "offset": 31926,
-    "length": 278
-  },
-  {
-    "name": "flash/external/ExternalInterface",
-    "defs": [
-      "flash.external:ExternalInterface"
-    ],
-    "offset": 32204,
-    "length": 380
-  },
-  {
-    "name": "flash/events/AccelerometerEvent",
-    "defs": [
-      "flash.events:AccelerometerEvent"
-    ],
-    "offset": 32584,
-    "length": 817
-  },
-  {
-    "name": "flash/events/ActivityEvent",
-    "defs": [
-      "flash.events:ActivityEvent"
-    ],
-    "offset": 33401,
-    "length": 505
-  },
-  {
-    "name": "flash/events/AsyncErrorEvent",
-    "defs": [
-      "flash.events:AsyncErrorEvent"
-    ],
-    "offset": 33906,
-    "length": 398
-  },
-  {
-    "name": "flash/events/ContextMenuEvent",
-    "defs": [
-      "flash.events:ContextMenuEvent"
-    ],
-    "offset": 34304,
-    "length": 829
-  },
-  {
-    "name": "flash/events/DataEvent",
-    "defs": [
-      "flash.events:DataEvent"
-    ],
-    "offset": 35133,
-    "length": 546
-  },
-  {
-    "name": "flash/events/ErrorEvent",
-    "defs": [
-      "flash.events:ErrorEvent"
-    ],
-    "offset": 35679,
-    "length": 388
-  },
-  {
-    "name": "flash/events/Event",
-    "defs": [
-      "flash.events:Event"
-    ],
-    "offset": 36067,
-    "length": 2036
-  },
-  {
-    "name": "flash/events/EventDispatcher",
-    "defs": [
-      "flash.events:EventDispatcher"
-    ],
-    "offset": 38103,
-    "length": 463
-  },
-  {
-    "name": "flash/events/EventPhase",
-    "defs": [
-      "flash.events:EventPhase"
-    ],
-    "offset": 38566,
-    "length": 262
-  },
-  {
-    "name": "flash/events/FocusEvent",
-    "defs": [
-      "flash.events:FocusEvent"
-    ],
-    "offset": 38828,
-    "length": 980
-  },
-  {
-    "name": "flash/events/FullScreenEvent",
-    "defs": [
-      "flash.events:FullScreenEvent"
-    ],
-    "offset": 39808,
-    "length": 643
-  },
-  {
-    "name": "flash/events/GameInputEvent",
-    "defs": [
-      "flash.events:GameInputEvent"
-    ],
-    "offset": 40451,
-    "length": 390
-  },
-  {
-    "name": "flash/events/GeolocationEvent",
-    "defs": [
-      "flash.events:GeolocationEvent"
-    ],
-    "offset": 40841,
-    "length": 1137
-  },
-  {
-    "name": "flash/events/GestureEvent",
-    "defs": [
-      "flash.events:GestureEvent"
-    ],
-    "offset": 41978,
-    "length": 669
-  },
-  {
-    "name": "flash/events/GesturePhase",
-    "defs": [
-      "flash.events:GesturePhase"
-    ],
-    "offset": 42647,
-    "length": 281
-  },
-  {
-    "name": "flash/events/HTTPStatusEvent",
-    "defs": [
-      "flash.events:HTTPStatusEvent"
-    ],
-    "offset": 42928,
-    "length": 457
-  },
-  {
-    "name": "flash/events/IEventDispatcher",
-    "defs": [
-      "flash.events:IEventDispatcher"
-    ],
-    "offset": 43385,
-    "length": 353
-  },
-  {
-    "name": "flash/events/IMEEvent",
-    "defs": [
-      "flash.events:IMEEvent"
-    ],
-    "offset": 43738,
-    "length": 632
-  },
-  {
-    "name": "flash/events/IOErrorEvent",
-    "defs": [
-      "flash.events:IOErrorEvent"
-    ],
-    "offset": 44370,
-    "length": 495
-  },
-  {
-    "name": "flash/events/KeyboardEvent",
-    "defs": [
-      "flash.events:KeyboardEvent"
-    ],
-    "offset": 44865,
-    "length": 617
-  },
-  {
-    "name": "flash/events/MouseEvent",
-    "defs": [
-      "flash.events:MouseEvent"
-    ],
-    "offset": 45482,
-    "length": 1503
-  },
-  {
-    "name": "flash/events/NetDataEvent",
-    "defs": [
-      "flash.events:NetDataEvent"
-    ],
-    "offset": 46985,
-    "length": 565
-  },
-  {
-    "name": "flash/events/NetFilterEvent",
-    "defs": [
-      "flash.events:NetFilterEvent"
-    ],
-    "offset": 47550,
-    "length": 454
-  },
-  {
-    "name": "flash/events/NetMonitorEvent",
-    "defs": [
-      "flash.events:NetMonitorEvent"
-    ],
-    "offset": 48004,
-    "length": 516
-  },
-  {
-    "name": "flash/events/NetStatusEvent",
-    "defs": [
-      "flash.events:NetStatusEvent"
-    ],
-    "offset": 48520,
-    "length": 385
-  },
-  {
-    "name": "flash/events/OutputProgressEvent",
-    "defs": [
-      "flash.events:OutputProgressEvent"
-    ],
-    "offset": 48905,
-    "length": 638
-  },
-  {
-    "name": "flash/events/PressAndTapGestureEvent",
-    "defs": [
-      "flash.events:PressAndTapGestureEvent"
-    ],
-    "offset": 49543,
-    "length": 944
-  },
-  {
-    "name": "flash/events/ProgressEvent",
-    "defs": [
-      "flash.events:ProgressEvent"
-    ],
-    "offset": 50487,
-    "length": 460
-  },
-  {
-    "name": "flash/events/SampleDataEvent",
-    "defs": [
-      "flash.events:SampleDataEvent"
-    ],
-    "offset": 50947,
-    "length": 639
-  },
-  {
-    "name": "flash/events/SecurityErrorEvent",
-    "defs": [
-      "flash.events:SecurityErrorEvent"
-    ],
-    "offset": 51586,
-    "length": 511
-  },
-  {
-    "name": "flash/events/SoftKeyboardEvent",
-    "defs": [
-      "flash.events:SoftKeyboardEvent"
-    ],
-    "offset": 52097,
-    "length": 793
-  },
-  {
-    "name": "flash/events/SoftKeyboardTrigger",
-    "defs": [
-      "flash.events:SoftKeyboardTrigger"
-    ],
-    "offset": 52890,
-    "length": 287
-  },
-  {
-    "name": "flash/events/StageVideoAvailabilityEvent",
-    "defs": [
-      "flash.events:StageVideoAvailabilityEvent"
-    ],
-    "offset": 53177,
-    "length": 377
-  },
-  {
-    "name": "flash/events/StageVideoEvent",
-    "defs": [
-      "flash.events:StageVideoEvent"
-    ],
-    "offset": 53554,
-    "length": 535
-  },
-  {
-    "name": "flash/events/StatusEvent",
-    "defs": [
-      "flash.events:StatusEvent"
-    ],
-    "offset": 54089,
-    "length": 366
-  },
-  {
-    "name": "flash/events/SyncEvent",
-    "defs": [
-      "flash.events:SyncEvent"
-    ],
-    "offset": 54455,
-    "length": 466
-  },
-  {
-    "name": "flash/events/TextEvent",
-    "defs": [
-      "flash.events:TextEvent"
-    ],
-    "offset": 54921,
-    "length": 381
-  },
-  {
-    "name": "flash/events/ThrottleEvent",
-    "defs": [
-      "flash.events:ThrottleEvent"
-    ],
-    "offset": 55302,
-    "length": 553
-  },
-  {
-    "name": "flash/events/ThrottleType",
-    "defs": [
-      "flash.events:ThrottleType"
-    ],
-    "offset": 55855,
-    "length": 268
-  },
-  {
-    "name": "flash/events/TimerEvent",
-    "defs": [
-      "flash.events:TimerEvent"
-    ],
-    "offset": 56123,
-    "length": 389
-  },
-  {
-    "name": "flash/events/TouchEvent",
-    "defs": [
-      "flash.events:TouchEvent"
-    ],
-    "offset": 56512,
-    "length": 1501
-  },
-  {
-    "name": "flash/events/TransformGestureEvent",
-    "defs": [
-      "flash.events:TransformGestureEvent"
-    ],
-    "offset": 58013,
-    "length": 1154
-  },
-  {
-    "name": "flash/events/UncaughtErrorEvent",
-    "defs": [
-      "flash.events:UncaughtErrorEvent"
-    ],
-    "offset": 59167,
-    "length": 525
-  },
-  {
-    "name": "flash/events/UncaughtErrorEvents",
-    "defs": [
-      "flash.events:UncaughtErrorEvents"
-    ],
-    "offset": 59692,
-    "length": 236
-  },
-  {
-    "name": "flash/events/VideoEvent",
-    "defs": [
-      "flash.events:VideoEvent"
-    ],
-    "offset": 59928,
-    "length": 461
-  },
-  {
-    "name": "flash/geom/ColorTransform",
-    "defs": [
-      "flash.geom:ColorTransform"
-    ],
-    "offset": 60389,
-    "length": 586
-  },
-  {
-    "name": "flash/geom/Matrix",
-    "defs": [
-      "flash.geom:Matrix"
-    ],
-    "offset": 60975,
-    "length": 814
-  },
-  {
-    "name": "flash/geom/Matrix3D",
-    "defs": [
-      "flash.geom:Matrix3D"
-    ],
-    "offset": 61789,
-    "length": 1092
-  },
-  {
-    "name": "flash/geom/Orientation3D",
-    "defs": [
-      "flash.geom:Orientation3D"
-    ],
-    "offset": 62881,
-    "length": 290
-  },
-  {
-    "name": "flash/geom/PerspectiveProjection",
-    "defs": [
-      "flash.geom:PerspectiveProjection"
-    ],
-    "offset": 63171,
-    "length": 389
-  },
-  {
-    "name": "flash/geom/Point",
-    "defs": [
-      "flash.geom:Point"
-    ],
-    "offset": 63560,
-    "length": 516
-  },
-  {
-    "name": "flash/geom/Rectangle",
-    "defs": [
-      "flash.geom:Rectangle"
-    ],
-    "offset": 64076,
-    "length": 889
-  },
-  {
-    "name": "flash/geom/Transform",
-    "defs": [
-      "flash.geom:Transform"
-    ],
-    "offset": 64965,
-    "length": 553
-  },
-  {
-    "name": "flash/geom/Utils3D",
-    "defs": [
-      "flash.geom:Utils3D"
-    ],
-    "offset": 65518,
-    "length": 342
-  },
-  {
-    "name": "flash/geom/Vector3D",
-    "defs": [
-      "flash.geom:Vector3D"
-    ],
-    "offset": 65860,
-    "length": 830
-  },
-  {
-    "name": "flash/filters/BevelFilter",
-    "defs": [
-      "flash.filters:BevelFilter"
-    ],
-    "offset": 66690,
-    "length": 685
-  },
-  {
-    "name": "flash/filters/BitmapFilter",
-    "defs": [
-      "flash.filters:BitmapFilter"
-    ],
-    "offset": 67375,
-    "length": 209
-  },
-  {
-    "name": "flash/filters/BitmapFilterQuality",
-    "defs": [
-      "flash.filters:BitmapFilterQuality"
-    ],
-    "offset": 67584,
-    "length": 256
-  },
-  {
-    "name": "flash/filters/BitmapFilterType",
-    "defs": [
-      "flash.filters:BitmapFilterType"
-    ],
-    "offset": 67840,
-    "length": 268
-  },
-  {
-    "name": "flash/filters/BlurFilter",
-    "defs": [
-      "flash.filters:BlurFilter"
-    ],
-    "offset": 68108,
-    "length": 342
-  },
-  {
-    "name": "flash/filters/ColorMatrixFilter",
-    "defs": [
-      "flash.filters:ColorMatrixFilter"
-    ],
-    "offset": 68450,
-    "length": 294
-  },
-  {
-    "name": "flash/filters/ConvolutionFilter",
-    "defs": [
-      "flash.filters:ConvolutionFilter"
-    ],
-    "offset": 68744,
-    "length": 570
-  },
-  {
-    "name": "flash/filters/DisplacementMapFilter",
-    "defs": [
-      "flash.filters:DisplacementMapFilter"
-    ],
-    "offset": 69314,
-    "length": 632
-  },
-  {
-    "name": "flash/filters/DisplacementMapFilterMode",
-    "defs": [
-      "flash.filters:DisplacementMapFilterMode"
-    ],
-    "offset": 69946,
-    "length": 315
-  },
-  {
-    "name": "flash/filters/DropShadowFilter",
-    "defs": [
-      "flash.filters:DropShadowFilter"
-    ],
-    "offset": 70261,
-    "length": 627
-  },
-  {
-    "name": "flash/filters/GlowFilter",
-    "defs": [
-      "flash.filters:GlowFilter"
-    ],
-    "offset": 70888,
-    "length": 517
-  },
-  {
-    "name": "flash/filters/GradientBevelFilter",
-    "defs": [
-      "flash.filters:GradientBevelFilter"
-    ],
-    "offset": 71405,
-    "length": 649
-  },
-  {
-    "name": "flash/filters/GradientGlowFilter",
-    "defs": [
-      "flash.filters:GradientGlowFilter"
-    ],
-    "offset": 72054,
-    "length": 646
-  },
-  {
-    "name": "flash/globalization/Collator",
-    "defs": [
-      "flash.globalization:Collator"
-    ],
-    "offset": 72700,
-    "length": 692
-  },
-  {
-    "name": "flash/globalization/CollatorMode",
-    "defs": [
-      "flash.globalization:CollatorMode"
-    ],
-    "offset": 73392,
-    "length": 257
-  },
-  {
-    "name": "flash/globalization/CurrencyFormatter",
-    "defs": [
-      "flash.globalization:CurrencyFormatter"
-    ],
-    "offset": 73649,
-    "length": 1104
-  },
-  {
-    "name": "flash/globalization/CurrencyParseResult",
-    "defs": [
-      "flash.globalization:CurrencyParseResult"
-    ],
-    "offset": 74753,
-    "length": 350
-  },
-  {
-    "name": "flash/globalization/DateTimeFormatter",
-    "defs": [
-      "flash.globalization:DateTimeFormatter"
-    ],
-    "offset": 75103,
-    "length": 830
-  },
-  {
-    "name": "flash/globalization/DateTimeNameContext",
-    "defs": [
-      "flash.globalization:DateTimeNameContext"
-    ],
-    "offset": 75933,
-    "length": 273
-  },
-  {
-    "name": "flash/globalization/DateTimeNameStyle",
-    "defs": [
-      "flash.globalization:DateTimeNameStyle"
-    ],
-    "offset": 76206,
-    "length": 330
-  },
-  {
-    "name": "flash/globalization/DateTimeStyle",
-    "defs": [
-      "flash.globalization:DateTimeStyle"
-    ],
-    "offset": 76536,
-    "length": 330
-  },
-  {
-    "name": "flash/globalization/LastOperationStatus",
-    "defs": [
-      "flash.globalization:LastOperationStatus"
-    ],
-    "offset": 76866,
-    "length": 1104
-  },
-  {
-    "name": "flash/globalization/LocaleID",
-    "defs": [
-      "flash.globalization:LocaleID"
-    ],
-    "offset": 77970,
-    "length": 560
-  },
-  {
-    "name": "flash/globalization/NationalDigitsType",
-    "defs": [
-      "flash.globalization:NationalDigitsType"
-    ],
-    "offset": 78530,
-    "length": 1055
-  },
-  {
-    "name": "flash/globalization/NumberFormatter",
-    "defs": [
-      "flash.globalization:NumberFormatter"
-    ],
-    "offset": 79585,
-    "length": 946
-  },
-  {
-    "name": "flash/globalization/NumberParseResult",
-    "defs": [
-      "flash.globalization:NumberParseResult"
-    ],
-    "offset": 80531,
-    "length": 367
-  },
-  {
-    "name": "flash/globalization/StringTools",
-    "defs": [
-      "flash.globalization:StringTools"
-    ],
-    "offset": 80898,
-    "length": 460
-  },
-  {
-    "name": "flash/media/AudioDecoder",
-    "defs": [
-      "flash.media:AudioDecoder"
-    ],
-    "offset": 81358,
-    "length": 448
-  },
-  {
-    "name": "flash/media/Camera",
-    "defs": [
-      "flash.media:Camera"
-    ],
-    "offset": 81806,
-    "length": 1009
-  },
-  {
-    "name": "flash/media/H264Level",
-    "defs": [
-      "flash.media:H264Level"
-    ],
-    "offset": 82815,
-    "length": 613
-  },
-  {
-    "name": "flash/media/H264Profile",
-    "defs": [
-      "flash.media:H264Profile"
-    ],
-    "offset": 83428,
-    "length": 233
-  },
-  {
-    "name": "flash/media/H264VideoStreamSettings",
-    "defs": [
-      "flash.media:H264VideoStreamSettings"
-    ],
-    "offset": 83661,
-    "length": 1137
-  },
-  {
-    "name": "flash/media/ID3Info",
-    "defs": [
-      "flash.media:ID3Info"
-    ],
-    "offset": 84798,
-    "length": 300
-  },
-  {
-    "name": "flash/media/Microphone",
-    "defs": [
-      "flash.media:Microphone"
-    ],
-    "offset": 85098,
-    "length": 986
-  },
-  {
-    "name": "flash/media/MicrophoneEnhancedMode",
-    "defs": [
-      "flash.media:MicrophoneEnhancedMode"
-    ],
-    "offset": 86084,
-    "length": 367
-  },
-  {
-    "name": "flash/media/MicrophoneEnhancedOptions",
-    "defs": [
-      "flash.media:MicrophoneEnhancedOptions"
-    ],
-    "offset": 86451,
-    "length": 604
-  },
-  {
-    "name": "flash/media/Sound",
-    "defs": [
-      "flash.media:Sound"
-    ],
-    "offset": 87055,
-    "length": 726
-  },
-  {
-    "name": "flash/media/SoundChannel",
-    "defs": [
-      "flash.media:SoundChannel"
-    ],
-    "offset": 87781,
-    "length": 390
-  },
-  {
-    "name": "flash/media/SoundCodec",
-    "defs": [
-      "flash.media:SoundCodec"
-    ],
-    "offset": 88171,
-    "length": 287
-  },
-  {
-    "name": "flash/media/SoundLoaderContext",
-    "defs": [
-      "flash.media:SoundLoaderContext"
-    ],
-    "offset": 88458,
-    "length": 261
-  },
-  {
-    "name": "flash/media/SoundMixer",
-    "defs": [
-      "flash.media:SoundMixer"
-    ],
-    "offset": 88719,
-    "length": 513
-  },
-  {
-    "name": "flash/media/SoundTransform",
-    "defs": [
-      "flash.media:SoundTransform"
-    ],
-    "offset": 89232,
-    "length": 422
-  },
-  {
-    "name": "flash/media/StageVideo",
-    "defs": [
-      "flash.media:StageVideo"
-    ],
-    "offset": 89654,
-    "length": 570
-  },
-  {
-    "name": "flash/media/StageVideoAvailability",
-    "defs": [
-      "flash.media:StageVideoAvailability"
-    ],
-    "offset": 90224,
-    "length": 271
-  },
-  {
-    "name": "flash/media/Video",
-    "defs": [
-      "flash.media:Video"
-    ],
-    "offset": 90495,
-    "length": 494
-  },
-  {
-    "name": "flash/media/VideoCodec",
-    "defs": [
-      "flash.media:VideoCodec"
-    ],
-    "offset": 90989,
-    "length": 256
-  },
-  {
-    "name": "flash/media/VideoStatus",
-    "defs": [
-      "flash.media:VideoStatus"
-    ],
-    "offset": 91245,
-    "length": 286
-  },
-  {
-    "name": "flash/media/VideoStreamSettings",
-    "defs": [
-      "flash.media:VideoStreamSettings"
-    ],
-    "offset": 91531,
-    "length": 651
-  },
-  {
-    "name": "flash/profiler/Telemetry",
-    "defs": [
-      "flash.profiler:Telemetry"
-    ],
-    "offset": 92182,
-    "length": 422
-  },
-  {
-    "name": "flash/printing/PrintJob",
-    "defs": [
-      "flash.printing:PrintJob"
-    ],
-    "offset": 92604,
-    "length": 711
-  },
-  {
-    "name": "flash/printing/PrintJobOptions",
-    "defs": [
-      "flash.printing:PrintJobOptions"
-    ],
-    "offset": 93315,
-    "length": 216
-  },
-  {
-    "name": "flash/printing/PrintJobOrientation",
-    "defs": [
-      "flash.printing:PrintJobOrientation"
-    ],
-    "offset": 93531,
-    "length": 265
-  },
-  {
-    "name": "flash/security/CertificateStatus",
-    "defs": [
-      "flash.security:CertificateStatus"
-    ],
-    "offset": 93796,
-    "length": 533
-  },
-  {
-    "name": "flash/security/X500DistinguishedName",
-    "defs": [
-      "flash.security:X500DistinguishedName"
-    ],
-    "offset": 94329,
-    "length": 427
-  },
-  {
-    "name": "flash/security/X509Certificate",
-    "defs": [
-      "flash.security:X509Certificate"
-    ],
-    "offset": 94756,
-    "length": 635
-  },
-  {
-    "name": "flash/sampler/ClassFactory",
-    "defs": [
-      "flash.sampler:ClassFactory"
-    ],
-    "offset": 95391,
-    "length": 285
-  },
-  {
-    "name": "flash/sampler/DeleteObjectSample",
-    "defs": [
-      "flash.sampler:DeleteObjectSample"
-    ],
-    "offset": 95676,
-    "length": 233
-  },
-  {
-    "name": "flash/sampler/NewObjectSample",
-    "defs": [
-      "flash.sampler:NewObjectSample"
-    ],
-    "offset": 95909,
-    "length": 308
-  },
-  {
-    "name": "flash/sampler/Sample",
-    "defs": [
-      "flash.sampler:Sample"
-    ],
-    "offset": 96217,
-    "length": 205
-  },
-  {
-    "name": "flash/sampler/StackFrame",
-    "defs": [
-      "flash.sampler:StackFrame"
-    ],
-    "offset": 96422,
-    "length": 310
-  },
-  {
-    "name": "flash/system/ApplicationDomain",
-    "defs": [
-      "flash.system:ApplicationDomain"
-    ],
-    "offset": 96732,
-    "length": 498
-  },
-  {
-    "name": "flash/system/ApplicationInstaller",
-    "defs": [
-      "flash.system:ApplicationInstaller"
-    ],
-    "offset": 97230,
-    "length": 426
-  },
-  {
-    "name": "flash/system/AuthorizedFeatures",
-    "defs": [
-      "flash.system:AuthorizedFeatures"
-    ],
-    "offset": 97656,
-    "length": 456
-  },
-  {
-    "name": "flash/system/AuthorizedFeaturesLoader",
-    "defs": [
-      "flash.system:AuthorizedFeaturesLoader"
-    ],
-    "offset": 98112,
-    "length": 398
-  },
-  {
-    "name": "flash/system/Capabilities",
-    "defs": [
-      "flash.system:Capabilities"
-    ],
-    "offset": 98510,
-    "length": 1133
-  },
-  {
-    "name": "flash/system/DomainMemoryWithStage3D",
-    "defs": [
-      "flash.system:DomainMemoryWithStage3D"
-    ],
-    "offset": 99643,
-    "length": 191
-  },
-  {
-    "name": "flash/system/FSCommand",
-    "defs": [
-      "flash.system:FSCommand",
-      "flash.system:fscommand"
-    ],
-    "offset": 99834,
-    "length": 95
-  },
-  {
-    "name": "flash/system/ImageDecodingPolicy",
-    "defs": [
-      "flash.system:ImageDecodingPolicy"
-    ],
-    "offset": 99929,
-    "length": 257
-  },
-  {
-    "name": "flash/system/IME",
-    "defs": [
-      "flash.system:IME"
-    ],
-    "offset": 100186,
-    "length": 469
-  },
-  {
-    "name": "flash/system/IMEConversionMode",
-    "defs": [
-      "flash.system:IMEConversionMode"
-    ],
-    "offset": 100655,
-    "length": 432
-  },
-  {
-    "name": "flash/system/JPEGLoaderContext",
-    "defs": [
-      "flash.system:JPEGLoaderContext"
-    ],
-    "offset": 101087,
-    "length": 309
-  },
-  {
-    "name": "flash/system/LoaderContext",
-    "defs": [
-      "flash.system:LoaderContext"
-    ],
-    "offset": 101396,
-    "length": 480
-  },
-  {
-    "name": "flash/system/MessageChannel",
-    "defs": [
-      "flash.system:MessageChannel"
-    ],
-    "offset": 101876,
-    "length": 584
-  },
-  {
-    "name": "flash/system/MessageChannelState",
-    "defs": [
-      "flash.system:MessageChannelState"
-    ],
-    "offset": 102460,
-    "length": 278
-  },
-  {
-    "name": "flash/system/Security",
-    "defs": [
-      "flash.system:Security"
-    ],
-    "offset": 102738,
-    "length": 773
-  },
-  {
-    "name": "flash/system/SecurityDomain",
-    "defs": [
-      "flash.system:SecurityDomain"
-    ],
-    "offset": 103511,
-    "length": 221
-  },
-  {
-    "name": "flash/system/SecurityPanel",
-    "defs": [
-      "flash.system:SecurityPanel"
-    ],
-    "offset": 103732,
-    "length": 430
-  },
-  {
-    "name": "flash/system/System",
-    "defs": [
-      "flash.system:System"
-    ],
-    "offset": 104162,
-    "length": 602
-  },
-  {
-    "name": "flash/system/SystemUpdater",
-    "defs": [
-      "flash.system:SystemUpdater"
-    ],
-    "offset": 104764,
-    "length": 322
-  },
-  {
-    "name": "flash/system/SystemUpdaterType",
-    "defs": [
-      "flash.system:SystemUpdaterType"
-    ],
-    "offset": 105086,
-    "length": 241
-  },
-  {
-    "name": "flash/system/TouchscreenType",
-    "defs": [
-      "flash.system:TouchscreenType"
-    ],
-    "offset": 105327,
-    "length": 268
-  },
-  {
-    "name": "flash/trace/Trace",
-    "defs": [
-      "flash.trace:Trace"
-    ],
-    "offset": 105595,
-    "length": 488
-  },
-  {
-    "name": "flash/ui/ContextMenu",
-    "defs": [
-      "flash.ui:ContextMenu"
-    ],
-    "offset": 106083,
-    "length": 636
-  },
-  {
-    "name": "flash/ui/ContextMenuBuiltInItems",
-    "defs": [
-      "flash.ui:ContextMenuBuiltInItems"
-    ],
-    "offset": 106719,
-    "length": 467
-  },
-  {
-    "name": "flash/ui/ContextMenuClipboardItems",
-    "defs": [
-      "flash.ui:ContextMenuClipboardItems"
-    ],
-    "offset": 107186,
-    "length": 380
-  },
-  {
-    "name": "flash/ui/ContextMenuItem",
-    "defs": [
-      "flash.ui:ContextMenuItem"
-    ],
-    "offset": 107566,
-    "length": 458
-  },
-  {
-    "name": "flash/ui/GameInput",
-    "defs": [
-      "flash.ui:GameInput"
-    ],
-    "offset": 108024,
-    "length": 333
-  },
-  {
-    "name": "flash/ui/GameInputControl",
-    "defs": [
-      "flash.ui:GameInputControl"
-    ],
-    "offset": 108357,
-    "length": 458
-  },
-  {
-    "name": "flash/ui/GameInputControlType",
-    "defs": [
-      "flash.ui:GameInputControlType"
-    ],
-    "offset": 108815,
-    "length": 389
-  },
-  {
-    "name": "flash/ui/GameInputDevice",
-    "defs": [
-      "flash.ui:GameInputDevice"
-    ],
-    "offset": 109204,
-    "length": 623
-  },
-  {
-    "name": "flash/ui/GameInputFinger",
-    "defs": [
-      "flash.ui:GameInputFinger"
-    ],
-    "offset": 109827,
-    "length": 291
-  },
-  {
-    "name": "flash/ui/GameInputHand",
-    "defs": [
-      "flash.ui:GameInputHand"
-    ],
-    "offset": 110118,
-    "length": 256
-  },
-  {
-    "name": "flash/ui/Keyboard",
-    "defs": [
-      "flash.ui:Keyboard"
-    ],
-    "offset": 110374,
-    "length": 9336
-  },
-  {
-    "name": "flash/ui/KeyboardType",
-    "defs": [
-      "flash.ui:KeyboardType"
-    ],
-    "offset": 119710,
-    "length": 266
-  },
-  {
-    "name": "flash/ui/KeyLocation",
-    "defs": [
-      "flash.ui:KeyLocation"
-    ],
-    "offset": 119976,
-    "length": 273
-  },
-  {
-    "name": "flash/ui/Mouse",
-    "defs": [
-      "flash.ui:Mouse"
-    ],
-    "offset": 120249,
-    "length": 383
-  },
-  {
-    "name": "flash/ui/MouseCursor",
-    "defs": [
-      "flash.ui:MouseCursor"
-    ],
-    "offset": 120632,
-    "length": 302
-  },
-  {
-    "name": "flash/ui/MouseCursorData",
-    "defs": [
-      "flash.ui:MouseCursorData"
-    ],
-    "offset": 120934,
-    "length": 352
-  },
-  {
-    "name": "flash/ui/Multitouch",
-    "defs": [
-      "flash.ui:Multitouch"
-    ],
-    "offset": 121286,
-    "length": 435
-  },
-  {
-    "name": "flash/ui/MultitouchInputMode",
-    "defs": [
-      "flash.ui:MultitouchInputMode"
-    ],
-    "offset": 121721,
-    "length": 279
-  },
-  {
-    "name": "flash/sensors/Accelerometer",
-    "defs": [
-      "flash.sensors:Accelerometer"
-    ],
-    "offset": 122000,
-    "length": 357
-  },
-  {
-    "name": "flash/sensors/Geolocation",
-    "defs": [
-      "flash.sensors:Geolocation"
-    ],
-    "offset": 122357,
-    "length": 351
-  },
-  {
-    "name": "flash/display3D/Context3D",
-    "defs": [
-      "flash.display3D:Context3D"
-    ],
-    "offset": 122708,
-    "length": 2088
-  },
-  {
-    "name": "flash/display3D/Context3DBlendFactor",
-    "defs": [
-      "flash.display3D:Context3DBlendFactor"
-    ],
-    "offset": 124796,
-    "length": 681
-  },
-  {
-    "name": "flash/display3D/Context3DClearMask",
-    "defs": [
-      "flash.display3D:Context3DClearMask"
-    ],
-    "offset": 125477,
-    "length": 292
-  },
-  {
-    "name": "flash/display3D/Context3DProfile",
-    "defs": [
-      "flash.display3D:Context3DProfile"
-    ],
-    "offset": 125769,
-    "length": 282
-  },
-  {
-    "name": "flash/display3D/Context3DProgramType",
-    "defs": [
-      "flash.display3D:Context3DProgramType"
-    ],
-    "offset": 126051,
-    "length": 263
-  },
-  {
-    "name": "flash/display3D/Context3DRenderMode",
-    "defs": [
-      "flash.display3D:Context3DRenderMode"
-    ],
-    "offset": 126314,
-    "length": 257
-  },
-  {
-    "name": "flash/display3D/Context3DCompareMode",
-    "defs": [
-      "flash.display3D:Context3DCompareMode"
-    ],
-    "offset": 126571,
-    "length": 452
-  },
-  {
-    "name": "flash/display3D/Context3DStencilAction",
-    "defs": [
-      "flash.display3D:Context3DStencilAction"
-    ],
-    "offset": 127023,
-    "length": 499
-  },
-  {
-    "name": "flash/display3D/Context3DTextureFormat",
-    "defs": [
-      "flash.display3D:Context3DTextureFormat"
-    ],
-    "offset": 127522,
-    "length": 315
-  },
-  {
-    "name": "flash/display3D/Context3DTriangleFace",
-    "defs": [
-      "flash.display3D:Context3DTriangleFace"
-    ],
-    "offset": 127837,
-    "length": 323
-  },
-  {
-    "name": "flash/display3D/Context3DVertexBufferFormat",
-    "defs": [
-      "flash.display3D:Context3DVertexBufferFormat"
-    ],
-    "offset": 128160,
-    "length": 365
-  },
-  {
-    "name": "flash/display3D/IndexBuffer3D",
-    "defs": [
-      "flash.display3D:IndexBuffer3D"
-    ],
-    "offset": 128525,
-    "length": 364
-  },
-  {
-    "name": "flash/display3D/Program3D",
-    "defs": [
-      "flash.display3D:Program3D"
-    ],
-    "offset": 128889,
-    "length": 275
-  },
-  {
-    "name": "flash/display3D/VertexBuffer3D",
-    "defs": [
-      "flash.display3D:VertexBuffer3D"
-    ],
-    "offset": 129164,
-    "length": 367
-  },
-  {
-    "name": "flash/display3D/textures/CubeTexture",
-    "defs": [
-      "flash.display3D.textures:CubeTexture"
-    ],
-    "offset": 129531,
-    "length": 501
-  },
-  {
-    "name": "flash/display3D/textures/Texture",
-    "defs": [
-      "flash.display3D.textures:Texture"
-    ],
-    "offset": 130032,
-    "length": 487
-  },
-  {
-    "name": "flash/display3D/textures/TextureBase",
-    "defs": [
-      "flash.display3D.textures:TextureBase"
-    ],
-    "offset": 130519,
-    "length": 292
-  },
-  {
-    "name": "flash/net/DynamicPropertyOutput",
-    "defs": [
-      "flash.net:DynamicPropertyOutput"
-    ],
-    "offset": 130811,
-    "length": 308
-  },
-  {
-    "name": "flash/net/FileFilter",
-    "defs": [
-      "flash.net:FileFilter"
-    ],
-    "offset": 131119,
-    "length": 318
-  },
-  {
-    "name": "flash/net/FileReference",
-    "defs": [
-      "flash.net:FileReference"
-    ],
-    "offset": 131437,
-    "length": 666
-  },
-  {
-    "name": "flash/net/FileReferenceList",
-    "defs": [
-      "flash.net:FileReferenceList"
-    ],
-    "offset": 132103,
-    "length": 315
-  },
-  {
-    "name": "flash/net/GroupSpecifier",
-    "defs": [
-      "flash.net:GroupSpecifier"
-    ],
-    "offset": 132418,
-    "length": 1492
-  },
-  {
-    "name": "flash/net/IDynamicPropertyOutput",
-    "defs": [
-      "flash.net:IDynamicPropertyOutput"
-    ],
-    "offset": 133910,
-    "length": 197
-  },
-  {
-    "name": "flash/net/IDynamicPropertyWriter",
-    "defs": [
-      "flash.net:IDynamicPropertyWriter"
-    ],
-    "offset": 134107,
-    "length": 225
-  },
-  {
-    "name": "flash/net/LocalConnection",
-    "defs": [
-      "flash.net:LocalConnection"
-    ],
-    "offset": 134332,
-    "length": 469
-  },
-  {
-    "name": "flash/net/NetConnection",
-    "defs": [
-      "flash.net:NetConnection"
-    ],
-    "offset": 134801,
-    "length": 759
-  },
-  {
-    "name": "flash/net/NetGroup",
-    "defs": [
-      "flash.net:NetGroup"
-    ],
-    "offset": 135560,
-    "length": 1299
-  },
-  {
-    "name": "flash/net/NetGroupInfo",
-    "defs": [
-      "flash.net:NetGroupInfo"
-    ],
-    "offset": 136859,
-    "length": 768
-  },
-  {
-    "name": "flash/net/NetGroupReceiveMode",
-    "defs": [
-      "flash.net:NetGroupReceiveMode"
-    ],
-    "offset": 137627,
-    "length": 245
-  },
-  {
-    "name": "flash/net/NetGroupReplicationStrategy",
-    "defs": [
-      "flash.net:NetGroupReplicationStrategy"
-    ],
-    "offset": 137872,
-    "length": 283
-  },
-  {
-    "name": "flash/net/NetGroupSendMode",
-    "defs": [
-      "flash.net:NetGroupSendMode"
-    ],
-    "offset": 138155,
-    "length": 273
-  },
-  {
-    "name": "flash/net/NetGroupSendResult",
-    "defs": [
-      "flash.net:NetGroupSendResult"
-    ],
-    "offset": 138428,
-    "length": 270
-  },
-  {
-    "name": "flash/net/NetMonitor",
-    "defs": [
-      "flash.net:NetMonitor"
-    ],
-    "offset": 138698,
-    "length": 279
-  },
-  {
-    "name": "flash/net/NetStream",
-    "defs": [
-      "flash.net:NetStream"
-    ],
-    "offset": 138977,
-    "length": 3025
-  },
-  {
-    "name": "flash/net/NetStreamAppendBytesAction",
-    "defs": [
-      "flash.net:NetStreamAppendBytesAction"
-    ],
-    "offset": 142002,
-    "length": 315
-  },
-  {
-    "name": "flash/net/NetStreamMulticastInfo",
-    "defs": [
-      "flash.net:NetStreamMulticastInfo"
-    ],
-    "offset": 142317,
-    "length": 2712
-  },
-  {
-    "name": "flash/net/NetStreamInfo",
-    "defs": [
-      "flash.net:NetStreamInfo"
-    ],
-    "offset": 145029,
-    "length": 1958
-  },
-  {
-    "name": "flash/net/NetStreamPlayOptions",
-    "defs": [
-      "flash.net:NetStreamPlayOptions"
-    ],
-    "offset": 146987,
-    "length": 355
-  },
-  {
-    "name": "flash/net/NetStreamPlayTransitions",
-    "defs": [
-      "flash.net:NetStreamPlayTransitions"
-    ],
-    "offset": 147342,
-    "length": 406
-  },
-  {
-    "name": "flash/net/ObjectEncoding",
-    "defs": [
-      "flash.net:ObjectEncoding"
-    ],
-    "offset": 147748,
-    "length": 345
-  },
-  {
-    "name": "flash/net/Responder",
-    "defs": [
-      "flash.net:Responder"
-    ],
-    "offset": 148093,
-    "length": 239
-  },
-  {
-    "name": "flash/net/SecureSocket",
-    "defs": [
-      "flash.net:SecureSocket"
-    ],
-    "offset": 148332,
-    "length": 566
-  },
-  {
-    "name": "flash/net/SharedObject",
-    "defs": [
-      "flash.net:SharedObject"
-    ],
-    "offset": 148898,
-    "length": 699
-  },
-  {
-    "name": "flash/net/SharedObjectFlushStatus",
-    "defs": [
-      "flash.net:SharedObjectFlushStatus"
-    ],
-    "offset": 149597,
-    "length": 257
-  },
-  {
-    "name": "flash/net/URLLoader",
-    "defs": [
-      "flash.net:URLLoader"
-    ],
-    "offset": 149854,
-    "length": 435
-  },
-  {
-    "name": "flash/net/Socket",
-    "defs": [
-      "flash.net:Socket"
-    ],
-    "offset": 150289,
-    "length": 1282
-  },
-  {
-    "name": "flash/net/URLLoaderDataFormat",
-    "defs": [
-      "flash.net:URLLoaderDataFormat"
-    ],
-    "offset": 151571,
-    "length": 276
-  },
-  {
-    "name": "flash/net/URLRequest",
-    "defs": [
-      "flash.net:URLRequest"
-    ],
-    "offset": 151847,
-    "length": 379
-  },
-  {
-    "name": "flash/net/URLRequestHeader",
-    "defs": [
-      "flash.net:URLRequestHeader"
-    ],
-    "offset": 152226,
-    "length": 223
-  },
-  {
-    "name": "flash/net/URLStream",
-    "defs": [
-      "flash.net:URLStream"
-    ],
-    "offset": 152449,
-    "length": 894
-  },
-  {
-    "name": "flash/net/URLRequestMethod",
-    "defs": [
-      "flash.net:URLRequestMethod"
-    ],
-    "offset": 153343,
-    "length": 304
-  },
-  {
-    "name": "flash/net/URLVariables",
-    "defs": [
-      "flash.net:URLVariables"
-    ],
-    "offset": 153647,
-    "length": 245
-  },
-  {
-    "name": "flash/net/XMLSocket",
-    "defs": [
-      "flash.net:XMLSocket"
-    ],
-    "offset": 153892,
-    "length": 480
-  },
-  {
-    "name": "flash/text/AntiAliasType",
-    "defs": [
-      "flash.text:AntiAliasType"
-    ],
-    "offset": 154372,
-    "length": 239
-  },
-  {
-    "name": "flash/text/CSMSettings",
-    "defs": [
-      "flash.text:CSMSettings"
-    ],
-    "offset": 154611,
-    "length": 248
-  },
-  {
-    "name": "flash/text/Font",
-    "defs": [
-      "flash.text:Font"
-    ],
-    "offset": 154859,
-    "length": 361
-  },
-  {
-    "name": "flash/text/FontStyle",
-    "defs": [
-      "flash.text:FontStyle"
-    ],
-    "offset": 155220,
-    "length": 292
-  },
-  {
-    "name": "flash/text/FontType",
-    "defs": [
-      "flash.text:FontType"
-    ],
-    "offset": 155512,
-    "length": 269
-  },
-  {
-    "name": "flash/text/GridFitType",
-    "defs": [
-      "flash.text:GridFitType"
-    ],
-    "offset": 155781,
-    "length": 258
-  },
-  {
-    "name": "flash/text/StaticText",
-    "defs": [
-      "flash.text:StaticText"
-    ],
-    "offset": 156039,
-    "length": 299
-  },
-  {
-    "name": "flash/text/StyleSheet",
-    "defs": [
-      "flash.text:StyleSheet"
-    ],
-    "offset": 156338,
-    "length": 386
-  },
-  {
-    "name": "flash/text/TextColorType",
-    "defs": [
-      "flash.text:TextColorType"
-    ],
-    "offset": 156724,
-    "length": 241
-  },
-  {
-    "name": "flash/text/TextDisplayMode",
-    "defs": [
-      "flash.text:TextDisplayMode"
-    ],
-    "offset": 156965,
-    "length": 258
-  },
-  {
-    "name": "flash/text/TextField",
-    "defs": [
-      "flash.text:TextField"
-    ],
-    "offset": 157223,
-    "length": 2296
-  },
-  {
-    "name": "flash/text/TextFieldAutoSize",
-    "defs": [
-      "flash.text:TextFieldAutoSize"
-    ],
-    "offset": 159519,
-    "length": 291
-  },
-  {
-    "name": "flash/text/TextFieldType",
-    "defs": [
-      "flash.text:TextFieldType"
-    ],
-    "offset": 159810,
-    "length": 235
-  },
-  {
-    "name": "flash/text/TextFormat",
-    "defs": [
-      "flash.text:TextFormat"
-    ],
-    "offset": 160045,
-    "length": 778
-  },
-  {
-    "name": "flash/text/TextFormatAlign",
-    "defs": [
-      "flash.text:TextFormatAlign"
-    ],
-    "offset": 160823,
-    "length": 343
-  },
-  {
-    "name": "flash/text/TextFormatDisplay",
-    "defs": [
-      "flash.text:TextFormatDisplay"
-    ],
-    "offset": 161166,
-    "length": 241
-  },
-  {
-    "name": "flash/text/TextInteractionMode",
-    "defs": [
-      "flash.text:TextInteractionMode"
-    ],
-    "offset": 161407,
-    "length": 253
-  },
-  {
-    "name": "flash/text/TextLineMetrics",
-    "defs": [
-      "flash.text:TextLineMetrics"
-    ],
-    "offset": 161660,
-    "length": 300
-  },
-  {
-    "name": "flash/text/TextRenderer",
-    "defs": [
-      "flash.text:TextRenderer"
-    ],
-    "offset": 161960,
-    "length": 373
-  },
-  {
-    "name": "flash/text/TextRun",
-    "defs": [
-      "flash.text:TextRun"
-    ],
-    "offset": 162333,
-    "length": 294
-  },
-  {
-    "name": "flash/text/TextSnapshot",
-    "defs": [
-      "flash.text:TextSnapshot"
-    ],
-    "offset": 162627,
-    "length": 513
-  },
-  {
-    "name": "flash/text/engine/BreakOpportunity",
-    "defs": [
-      "flash.text.engine:BreakOpportunity"
-    ],
-    "offset": 163140,
-    "length": 293
-  },
-  {
-    "name": "flash/text/engine/CFFHinting",
-    "defs": [
-      "flash.text.engine:CFFHinting"
-    ],
-    "offset": 163433,
-    "length": 256
-  },
-  {
-    "name": "flash/text/engine/ContentElement",
-    "defs": [
-      "flash.text.engine:ContentElement"
-    ],
-    "offset": 163689,
-    "length": 624
-  },
-  {
-    "name": "flash/text/engine/DigitCase",
-    "defs": [
-      "flash.text.engine:DigitCase"
-    ],
-    "offset": 164313,
-    "length": 277
-  },
-  {
-    "name": "flash/text/engine/DigitWidth",
-    "defs": [
-      "flash.text.engine:DigitWidth"
-    ],
-    "offset": 164590,
-    "length": 288
-  },
-  {
-    "name": "flash/text/engine/EastAsianJustifier",
-    "defs": [
-      "flash.text.engine:EastAsianJustifier"
-    ],
-    "offset": 164878,
-    "length": 495
-  },
-  {
-    "name": "flash/text/engine/ElementFormat",
-    "defs": [
-      "flash.text.engine:ElementFormat"
-    ],
-    "offset": 165373,
-    "length": 1204
-  },
-  {
-    "name": "flash/text/engine/FontDescription",
-    "defs": [
-      "flash.text.engine:FontDescription"
-    ],
-    "offset": 166577,
-    "length": 672
-  },
-  {
-    "name": "flash/text/engine/FontLookup",
-    "defs": [
-      "flash.text.engine:FontLookup"
-    ],
-    "offset": 167249,
-    "length": 254
-  },
-  {
-    "name": "flash/text/engine/FontMetrics",
-    "defs": [
-      "flash.text.engine:FontMetrics"
-    ],
-    "offset": 167503,
-    "length": 512
-  },
-  {
-    "name": "flash/text/engine/FontPosture",
-    "defs": [
-      "flash.text.engine:FontPosture"
-    ],
-    "offset": 168015,
-    "length": 245
-  },
-  {
-    "name": "flash/text/engine/FontWeight",
-    "defs": [
-      "flash.text.engine:FontWeight"
-    ],
-    "offset": 168260,
-    "length": 239
-  },
-  {
-    "name": "flash/text/engine/GraphicElement",
-    "defs": [
-      "flash.text.engine:GraphicElement"
-    ],
-    "offset": 168499,
-    "length": 497
-  },
-  {
-    "name": "flash/text/engine/GroupElement",
-    "defs": [
-      "flash.text.engine:GroupElement"
-    ],
-    "offset": 168996,
-    "length": 714
-  },
-  {
-    "name": "flash/text/engine/JustificationStyle",
-    "defs": [
-      "flash.text.engine:JustificationStyle"
-    ],
-    "offset": 169710,
-    "length": 356
-  },
-  {
-    "name": "flash/text/engine/Kerning",
-    "defs": [
-      "flash.text.engine:Kerning"
-    ],
-    "offset": 170066,
-    "length": 248
-  },
-  {
-    "name": "flash/text/engine/LigatureLevel",
-    "defs": [
-      "flash.text.engine:LigatureLevel"
-    ],
-    "offset": 170314,
-    "length": 338
-  },
-  {
-    "name": "flash/text/engine/LineJustification",
-    "defs": [
-      "flash.text.engine:LineJustification"
-    ],
-    "offset": 170652,
-    "length": 388
-  },
-  {
-    "name": "flash/text/engine/RenderingMode",
-    "defs": [
-      "flash.text.engine:RenderingMode"
-    ],
-    "offset": 171040,
-    "length": 243
-  },
-  {
-    "name": "flash/text/engine/SpaceJustifier",
-    "defs": [
-      "flash.text.engine:SpaceJustifier"
-    ],
-    "offset": 171283,
-    "length": 527
-  },
-  {
-    "name": "flash/text/engine/TabAlignment",
-    "defs": [
-      "flash.text.engine:TabAlignment"
-    ],
-    "offset": 171810,
-    "length": 299
-  },
-  {
-    "name": "flash/text/engine/TabStop",
-    "defs": [
-      "flash.text.engine:TabStop"
-    ],
-    "offset": 172109,
-    "length": 357
-  },
-  {
-    "name": "flash/text/engine/TextBaseline",
-    "defs": [
-      "flash.text.engine:TextBaseline"
-    ],
-    "offset": 172466,
-    "length": 483
-  },
-  {
-    "name": "flash/text/engine/TextBlock",
-    "defs": [
-      "flash.text.engine:TextBlock"
-    ],
-    "offset": 172949,
-    "length": 2184
-  },
-  {
-    "name": "flash/text/engine/TextElement",
-    "defs": [
-      "flash.text.engine:TextElement"
-    ],
-    "offset": 175133,
-    "length": 383
-  },
-  {
-    "name": "flash/text/engine/TextJustifier",
-    "defs": [
-      "flash.text.engine:TextJustifier"
-    ],
-    "offset": 175516,
-    "length": 774
-  },
-  {
-    "name": "flash/text/engine/TextLine",
-    "defs": [
-      "flash.text.engine:TextLine"
-    ],
-    "offset": 176290,
-    "length": 2027
-  },
-  {
-    "name": "flash/text/engine/TextLineCreationResult",
-    "defs": [
-      "flash.text.engine:TextLineCreationResult"
-    ],
-    "offset": 178317,
-    "length": 360
-  },
-  {
-    "name": "flash/text/engine/TextLineMirrorRegion",
-    "defs": [
-      "flash.text.engine:TextLineMirrorRegion"
-    ],
-    "offset": 178677,
-    "length": 451
-  },
-  {
-    "name": "flash/text/engine/TextLineValidity",
-    "defs": [
-      "flash.text.engine:TextLineValidity"
-    ],
-    "offset": 179128,
-    "length": 332
-  },
-  {
-    "name": "flash/text/engine/TextRotation",
-    "defs": [
-      "flash.text.engine:TextRotation"
-    ],
-    "offset": 179460,
-    "length": 352
-  },
-  {
-    "name": "flash/text/engine/TypographicCase",
-    "defs": [
-      "flash.text.engine:TypographicCase"
-    ],
-    "offset": 179812,
-    "length": 436
-  },
-  {
-    "name": "flash/text/ime/CompositionAttributeRange",
-    "defs": [
-      "flash.text.ime:CompositionAttributeRange"
-    ],
-    "offset": 180248,
-    "length": 315
-  },
-  {
-    "name": "flash/text/ime/IIMEClient",
-    "defs": [
-      "flash.text.ime:IIMEClient"
-    ],
-    "offset": 180563,
-    "length": 525
-  },
-  {
-    "name": "flash/net/FlashNetScript",
-    "defs": [
-      "flash.net:navigateToURL",
-      "flash.net:sendToURL",
-      "flash.net:registerClassAlias",
-      "flash.net:getClassByAlias"
-    ],
-    "offset": 181088,
-    "length": 343
-  },
-  {
-    "name": "flash/utils/FlashUtilScript",
-    "defs": [
-      "flash.utils:describeType",
-      "flash.utils:getAliasName",
-      "flash.utils:getQualifiedClassName",
-      "flash.utils:getDefinitionByName",
-      "flash.utils:getQualifiedSuperclassName",
-      "flash.utils:getTimer",
-      "flash.utils:escapeMultiByte",
-      "flash.utils:unescapeMultiByte"
-    ],
-    "offset": 181431,
-    "length": 545
-  },
-  {
-    "name": "flash/utils/Endian",
-    "defs": [
-      "flash.utils:Endian"
-    ],
-    "offset": 181976,
-    "length": 243
-  },
-  {
-    "name": "flash/utils/IExternalizable",
-    "defs": [
-      "flash.utils:IExternalizable"
-    ],
-    "offset": 182219,
-    "length": 223
-  },
-  {
-    "name": "flash/utils/Timer",
-    "defs": [
-      "flash.utils:Timer"
-    ],
-    "offset": 182442,
-    "length": 400
-  },
-  {
-    "name": "flash/utils/SetIntervalTimer",
-    "defs": [
-      "flash.utils:SetIntervalTimer",
-      "flash.utils:setInterval",
-      "flash.utils:setTimeout",
-      "flash.utils:clearInterval",
-      "flash.utils:clearTimeout"
-    ],
-    "offset": 182842,
-    "length": 995
-  }
-]
\ No newline at end of file
deleted file mode 100644
--- a/browser/extensions/shumway/content/shumway.gfx.js
+++ /dev/null
@@ -1,13581 +0,0 @@
-/*
-
- Copyright 2014 Mozilla Foundation
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-console.time("Load Shared Dependencies");
-var Shumway, Shumway$$inline_0 = Shumway || (Shumway = {});
-Shumway$$inline_0.version = "0.11.422";
-Shumway$$inline_0.build = "137ba70";
-var jsGlobal = function() {
-  return this || (0,eval)("this//# sourceURL=jsGlobal-getter");
-}(), inBrowser = "undefined" !== typeof window && "document" in window && "plugins" in window.document, inFirefox = "undefined" !== typeof navigator && 0 <= navigator.userAgent.indexOf("Firefox");
-jsGlobal.performance || (jsGlobal.performance = {});
-jsGlobal.performance.now || (jsGlobal.performance.now = function() {
-  return Date.now();
-});
-function lazyInitializer(k, p, u) {
-  Object.defineProperty(k, p, {get:function() {
-    var a = u();
-    Object.defineProperty(k, p, {value:a, configurable:!0, enumerable:!0});
-    return a;
-  }, configurable:!0, enumerable:!0});
-}
-var START_TIME = performance.now();
-(function(k) {
-  function p(e) {
-    return (e | 0) === e;
-  }
-  function u(e) {
-    return "object" === typeof e || "function" === typeof e;
-  }
-  function a(e) {
-    return String(Number(e)) === e;
-  }
-  function w(e) {
-    var g = 0;
-    if ("number" === typeof e) {
-      return g = e | 0, e === g && 0 <= g ? !0 : e >>> 0 === e;
-    }
-    if ("string" !== typeof e) {
-      return !1;
-    }
-    var d = e.length;
-    if (0 === d) {
-      return !1;
-    }
-    if ("0" === e) {
-      return !0;
-    }
-    if (d > k.UINT32_CHAR_BUFFER_LENGTH) {
-      return !1;
-    }
-    var c = 0, g = e.charCodeAt(c++) - 48;
-    if (1 > g || 9 < g) {
-      return !1;
-    }
-    for (var f = 0, y = 0;c < d;) {
-      y = e.charCodeAt(c++) - 48;
-      if (0 > y || 9 < y) {
-        return !1;
-      }
-      f = g;
-      g = 10 * g + y;
-    }
-    return f < k.UINT32_MAX_DIV_10 || f === k.UINT32_MAX_DIV_10 && y <= k.UINT32_MAX_MOD_10 ? !0 : !1;
-  }
-  (function(e) {
-    e[e._0 = 48] = "_0";
-    e[e._1 = 49] = "_1";
-    e[e._2 = 50] = "_2";
-    e[e._3 = 51] = "_3";
-    e[e._4 = 52] = "_4";
-    e[e._5 = 53] = "_5";
-    e[e._6 = 54] = "_6";
-    e[e._7 = 55] = "_7";
-    e[e._8 = 56] = "_8";
-    e[e._9 = 57] = "_9";
-  })(k.CharacterCodes || (k.CharacterCodes = {}));
-  k.UINT32_CHAR_BUFFER_LENGTH = 10;
-  k.UINT32_MAX = 4294967295;
-  k.UINT32_MAX_DIV_10 = 429496729;
-  k.UINT32_MAX_MOD_10 = 5;
-  k.isString = function(e) {
-    return "string" === typeof e;
-  };
-  k.isFunction = function(e) {
-    return "function" === typeof e;
-  };
-  k.isNumber = function(e) {
-    return "number" === typeof e;
-  };
-  k.isInteger = p;
-  k.isArray = function(e) {
-    return e instanceof Array;
-  };
-  k.isNumberOrString = function(e) {
-    return "number" === typeof e || "string" === typeof e;
-  };
-  k.isObject = u;
-  k.toNumber = function(e) {
-    return +e;
-  };
-  k.isNumericString = a;
-  k.isNumeric = function(e) {
-    if ("number" === typeof e) {
-      return !0;
-    }
-    if ("string" === typeof e) {
-      var g = e.charCodeAt(0);
-      return 65 <= g && 90 >= g || 97 <= g && 122 >= g || 36 === g || 95 === g ? !1 : w(e) || a(e);
-    }
-    return !1;
-  };
-  k.isIndex = w;
-  k.isNullOrUndefined = function(e) {
-    return void 0 == e;
-  };
-  k.argumentsToString = function(e) {
-    for (var g = [], d = 0;d < e.length;d++) {
-      var c = e[d];
-      try {
-        var f;
-        f = "object" === typeof c && c ? "toString" in c ? c.toString() : Object.prototype.toString.call(c) : c + "";
-        g.push(f);
-      } catch (y) {
-        g.push("<unprintable value>");
-      }
-    }
-    return g.join(", ");
-  };
-  var m;
-  (function(e) {
-    e.error = function(c) {
-      console.error(c);
-      throw Error(c);
-    };
-    e.assert = function(c, f) {
-      void 0 === f && (f = "assertion failed");
-      "" === c && (c = !0);
-      if (!c) {
-        if ("undefined" !== typeof console && "assert" in console) {
-          throw console.assert(!1, f), Error(f);
-        }
-        e.error(f.toString());
-      }
-    };
-    e.assertUnreachable = function(c) {
-      var f = Error().stack.split("\n")[1];
-      throw Error("Reached unreachable location " + f + c);
-    };
-    e.assertNotImplemented = function(c, f) {
-      c || e.error("notImplemented: " + f);
-    };
-    var g = Object.create(null);
-    e.warning = function(c, f, d) {
-    };
-    e.warnCounts = function() {
-      var c = [], f;
-      for (f in g) {
-        c.push({key:f, count:g[f]});
-      }
-      c.sort(function(f, c) {
-        return c.count - f.count;
-      });
-      return c.reduce(function(f, c) {
-        return f + ("\n" + c.count + "\t" + c.key);
-      }, "");
-    };
-    e.notUsed = function(c) {
-    };
-    e.notImplemented = function(c) {
-    };
-    e.dummyConstructor = function(c) {
-    };
-    e.abstractMethod = function(c) {
-    };
-    var d = {};
-    e.somewhatImplemented = function(c) {
-      d[c] || (d[c] = !0, e.warning("somewhatImplemented: " + c));
-    };
-    e.unexpected = function(c) {
-      e.assert(!1, "Unexpected: " + c);
-    };
-    e.unexpectedCase = function(c) {
-      e.assert(!1, "Unexpected Case: " + c);
-    };
-  })(m = k.Debug || (k.Debug = {}));
-  k.getTicks = function() {
-    return performance.now();
-  };
-  (function(e) {
-    function g(c, f) {
-      for (var d = 0, x = c.length;d < x;d++) {
-        if (c[d] === f) {
-          return d;
-        }
-      }
-      c.push(f);
-      return c.length - 1;
-    }
-    e.popManyInto = function(c, f, d) {
-      for (var x = f - 1;0 <= x;x--) {
-        d[x] = c.pop();
-      }
-      d.length = f;
-    };
-    e.popMany = function(c, f) {
-      var d = c.length - f, x = c.slice(d, this.length);
-      c.length = d;
-      return x;
-    };
-    e.popManyIntoVoid = function(c, f) {
-      c.length -= f;
-    };
-    e.pushMany = function(c, f) {
-      for (var d = 0;d < f.length;d++) {
-        c.push(f[d]);
-      }
-    };
-    e.top = function(c) {
-      return c.length && c[c.length - 1];
-    };
-    e.last = function(c) {
-      return c.length && c[c.length - 1];
-    };
-    e.peek = function(c) {
-      return c[c.length - 1];
-    };
-    e.indexOf = function(c, f) {
-      for (var d = 0, x = c.length;d < x;d++) {
-        if (c[d] === f) {
-          return d;
-        }
-      }
-      return -1;
-    };
-    e.equals = function(c, f) {
-      if (c.length !== f.length) {
-        return !1;
-      }
-      for (var d = 0;d < c.length;d++) {
-        if (c[d] !== f[d]) {
-          return !1;
-        }
-      }
-      return !0;
-    };
-    e.pushUnique = g;
-    e.unique = function(c) {
-      for (var f = [], d = 0;d < c.length;d++) {
-        g(f, c[d]);
-      }
-      return f;
-    };
-    e.copyFrom = function(c, f) {
-      c.length = 0;
-      e.pushMany(c, f);
-    };
-    e.ensureTypedArrayCapacity = function(c, f) {
-      if (c.length < f) {
-        var d = c;
-        c = new c.constructor(k.IntegerUtilities.nearestPowerOfTwo(f));
-        c.set(d, 0);
-      }
-      return c;
-    };
-    e.memCopy = function(c, f, d, x, g) {
-      void 0 === d && (d = 0);
-      void 0 === x && (x = 0);
-      void 0 === g && (g = 0);
-      0 < x || 0 < g && g < f.length ? (0 >= g && (g = f.length - x), c.set(f.subarray(x, x + g), d)) : c.set(f, d);
-    };
-    var d = function() {
-      function c(f) {
-        void 0 === f && (f = 16);
-        this._f32 = this._i32 = this._u16 = this._u8 = null;
-        this._offset = 0;
-        this.ensureCapacity(f);
-      }
-      c.prototype.reset = function() {
-        this._offset = 0;
-      };
-      Object.defineProperty(c.prototype, "offset", {get:function() {
-        return this._offset;
-      }, enumerable:!0, configurable:!0});
-      c.prototype.getIndex = function(f) {
-        return this._offset / f;
-      };
-      c.prototype.ensureAdditionalCapacity = function(f) {
-        this.ensureCapacity(this._offset + f);
-      };
-      c.prototype.ensureCapacity = function(f) {
-        if (!this._u8) {
-          this._u8 = new Uint8Array(f);
-        } else {
-          if (this._u8.length > f) {
-            return;
-          }
-        }
-        var c = 2 * this._u8.length;
-        c < f && (c = f);
-        f = new Uint8Array(c);
-        f.set(this._u8, 0);
-        this._u8 = f;
-        this._u16 = new Uint16Array(f.buffer);
-        this._i32 = new Int32Array(f.buffer);
-        this._f32 = new Float32Array(f.buffer);
-      };
-      c.prototype.writeInt = function(f) {
-        this.ensureCapacity(this._offset + 4);
-        this.writeIntUnsafe(f);
-      };
-      c.prototype.writeIntAt = function(f, c) {
-        this.ensureCapacity(c + 4);
-        this._i32[c >> 2] = f;
-      };
-      c.prototype.writeIntUnsafe = function(f) {
-        this._i32[this._offset >> 2] = f;
-        this._offset += 4;
-      };
-      c.prototype.writeFloat = function(f) {
-        this.ensureCapacity(this._offset + 4);
-        this.writeFloatUnsafe(f);
-      };
-      c.prototype.writeFloatUnsafe = function(f) {
-        this._f32[this._offset >> 2] = f;
-        this._offset += 4;
-      };
-      c.prototype.write4Floats = function(f, c, d, g) {
-        this.ensureCapacity(this._offset + 16);
-        this.write4FloatsUnsafe(f, c, d, g);
-      };
-      c.prototype.write4FloatsUnsafe = function(f, c, d, g) {
-        var e = this._offset >> 2;
-        this._f32[e + 0] = f;
-        this._f32[e + 1] = c;
-        this._f32[e + 2] = d;
-        this._f32[e + 3] = g;
-        this._offset += 16;
-      };
-      c.prototype.write6Floats = function(f, c, d, g, e, b) {
-        this.ensureCapacity(this._offset + 24);
-        this.write6FloatsUnsafe(f, c, d, g, e, b);
-      };
-      c.prototype.write6FloatsUnsafe = function(f, c, d, g, e, b) {
-        var a = this._offset >> 2;
-        this._f32[a + 0] = f;
-        this._f32[a + 1] = c;
-        this._f32[a + 2] = d;
-        this._f32[a + 3] = g;
-        this._f32[a + 4] = e;
-        this._f32[a + 5] = b;
-        this._offset += 24;
-      };
-      c.prototype.subF32View = function() {
-        return this._f32.subarray(0, this._offset >> 2);
-      };
-      c.prototype.subI32View = function() {
-        return this._i32.subarray(0, this._offset >> 2);
-      };
-      c.prototype.subU16View = function() {
-        return this._u16.subarray(0, this._offset >> 1);
-      };
-      c.prototype.subU8View = function() {
-        return this._u8.subarray(0, this._offset);
-      };
-      c.prototype.hashWords = function(f, c, d) {
-        c = this._i32;
-        for (var g = 0;g < d;g++) {
-          f = (31 * f | 0) + c[g] | 0;
-        }
-        return f;
-      };
-      c.prototype.reserve = function(f) {
-        f = f + 3 & -4;
-        this.ensureCapacity(this._offset + f);
-        this._offset += f;
-      };
-      return c;
-    }();
-    e.ArrayWriter = d;
-  })(k.ArrayUtilities || (k.ArrayUtilities = {}));
-  var b = function() {
-    function e(g) {
-      this._u8 = new Uint8Array(g);
-      this._u16 = new Uint16Array(g);
-      this._i32 = new Int32Array(g);
-      this._f32 = new Float32Array(g);
-      this._offset = 0;
-    }
-    Object.defineProperty(e.prototype, "offset", {get:function() {
-      return this._offset;
-    }, enumerable:!0, configurable:!0});
-    e.prototype.isEmpty = function() {
-      return this._offset === this._u8.length;
-    };
-    e.prototype.readInt = function() {
-      var g = this._i32[this._offset >> 2];
-      this._offset += 4;
-      return g;
-    };
-    e.prototype.readFloat = function() {
-      var g = this._f32[this._offset >> 2];
-      this._offset += 4;
-      return g;
-    };
-    return e;
-  }();
-  k.ArrayReader = b;
-  (function(e) {
-    function g(c, f) {
-      return Object.prototype.hasOwnProperty.call(c, f);
-    }
-    function d(c, f) {
-      for (var d in f) {
-        g(f, d) && (c[d] = f[d]);
-      }
-    }
-    e.boxValue = function(c) {
-      return void 0 == c || u(c) ? c : Object(c);
-    };
-    e.toKeyValueArray = function(c) {
-      var f = Object.prototype.hasOwnProperty, d = [], g;
-      for (g in c) {
-        f.call(c, g) && d.push([g, c[g]]);
-      }
-      return d;
-    };
-    e.isPrototypeWriteable = function(c) {
-      return Object.getOwnPropertyDescriptor(c, "prototype").writable;
-    };
-    e.hasOwnProperty = g;
-    e.propertyIsEnumerable = function(c, f) {
-      return Object.prototype.propertyIsEnumerable.call(c, f);
-    };
-    e.getPropertyDescriptor = function(c, f) {
-      do {
-        var d = Object.getOwnPropertyDescriptor(c, f);
-        if (d) {
-          return d;
-        }
-        c = Object.getPrototypeOf(c);
-      } while (c);
-      return null;
-    };
-    e.hasOwnGetter = function(c, f) {
-      var d = Object.getOwnPropertyDescriptor(c, f);
-      return !(!d || !d.get);
-    };
-    e.getOwnGetter = function(c, f) {
-      var d = Object.getOwnPropertyDescriptor(c, f);
-      return d ? d.get : null;
-    };
-    e.hasOwnSetter = function(c, f) {
-      var d = Object.getOwnPropertyDescriptor(c, f);
-      return !(!d || !d.set);
-    };
-    e.createMap = function() {
-      return Object.create(null);
-    };
-    e.createArrayMap = function() {
-      return [];
-    };
-    e.defineReadOnlyProperty = function(c, f, d) {
-      Object.defineProperty(c, f, {value:d, writable:!1, configurable:!0, enumerable:!1});
-    };
-    e.getOwnPropertyDescriptors = function(c) {
-      for (var f = e.createMap(), d = Object.getOwnPropertyNames(c), g = 0;g < d.length;g++) {
-        f[d[g]] = Object.getOwnPropertyDescriptor(c, d[g]);
-      }
-      return f;
-    };
-    e.cloneObject = function(c) {
-      var f = Object.create(Object.getPrototypeOf(c));
-      d(f, c);
-      return f;
-    };
-    e.copyProperties = function(c, f) {
-      for (var d in f) {
-        c[d] = f[d];
-      }
-    };
-    e.copyOwnProperties = d;
-    e.copyOwnPropertyDescriptors = function(c, f, d, e, b) {
-      void 0 === d && (d = null);
-      void 0 === e && (e = !0);
-      void 0 === b && (b = !1);
-      for (var a in f) {
-        if (g(f, a) && (!d || d(a))) {
-          var l = Object.getOwnPropertyDescriptor(f, a);
-          if (e || !g(c, a)) {
-            try {
-              b && !1 === l.writable && (l.writable = !0), Object.defineProperty(c, a, l);
-            } catch (h) {
-              m.assert("Can't define: " + a);
-            }
-          }
-        }
-      }
-    };
-    e.copyPropertiesByList = function(c, f, d) {
-      for (var g = 0;g < d.length;g++) {
-        var e = d[g];
-        c[e] = f[e];
-      }
-    };
-    e.getLatestGetterOrSetterPropertyDescriptor = function(c, f) {
-      for (var d = {};c;) {
-        var g = Object.getOwnPropertyDescriptor(c, f);
-        g && (d.get = d.get || g.get, d.set = d.set || g.set);
-        if (d.get && d.set) {
-          break;
-        }
-        c = Object.getPrototypeOf(c);
-      }
-      return d;
-    };
-    e.defineNonEnumerableGetterOrSetter = function(c, f, d, g) {
-      var b = e.getLatestGetterOrSetterPropertyDescriptor(c, f);
-      b.configurable = !0;
-      b.enumerable = !1;
-      g ? b.get = d : b.set = d;
-      Object.defineProperty(c, f, b);
-    };
-    e.defineNonEnumerableGetter = function(c, f, d) {
-      Object.defineProperty(c, f, {get:d, configurable:!0, enumerable:!1});
-    };
-    e.defineNonEnumerableSetter = function(c, f, d) {
-      Object.defineProperty(c, f, {set:d, configurable:!0, enumerable:!1});
-    };
-    e.defineNonEnumerableProperty = function(c, f, d) {
-      Object.defineProperty(c, f, {value:d, writable:!0, configurable:!0, enumerable:!1});
-    };
-    e.defineNonEnumerableForwardingProperty = function(c, f, d) {
-      Object.defineProperty(c, f, {get:l.makeForwardingGetter(d), set:l.makeForwardingSetter(d), writable:!0, configurable:!0, enumerable:!1});
-    };
-    e.defineNewNonEnumerableProperty = function(c, f, d) {
-      e.defineNonEnumerableProperty(c, f, d);
-    };
-    e.createPublicAliases = function(c, f) {
-      for (var d = {value:null, writable:!0, configurable:!0, enumerable:!1}, g = 0;g < f.length;g++) {
-        var e = f[g];
-        d.value = c[e];
-        Object.defineProperty(c, "$Bg" + e, d);
-      }
-    };
-  })(k.ObjectUtilities || (k.ObjectUtilities = {}));
-  var l;
-  (function(e) {
-    e.makeForwardingGetter = function(g) {
-      return new Function('return this["' + g + '"]//# sourceURL=fwd-get-' + g + ".as");
-    };
-    e.makeForwardingSetter = function(g) {
-      return new Function("value", 'this["' + g + '"] = value;//# sourceURL=fwd-set-' + g + ".as");
-    };
-    e.bindSafely = function(g, d) {
-      function c() {
-        return g.apply(d, arguments);
-      }
-      c.boundTo = d;
-      return c;
-    };
-  })(l = k.FunctionUtilities || (k.FunctionUtilities = {}));
-  (function(e) {
-    function g(f) {
-      return "string" === typeof f ? '"' + f + '"' : "number" === typeof f || "boolean" === typeof f ? String(f) : f instanceof Array ? "[] " + f.length : typeof f;
-    }
-    function d(c, d, g) {
-      f[0] = c;
-      f[1] = d;
-      f[2] = g;
-      return f.join("");
-    }
-    function c(f, c, d, g) {
-      y[0] = f;
-      y[1] = c;
-      y[2] = d;
-      y[3] = g;
-      return y.join("");
-    }
-    e.repeatString = function(f, c) {
-      for (var d = "", g = 0;g < c;g++) {
-        d += f;
-      }
-      return d;
-    };
-    e.memorySizeToString = function(f) {
-      f |= 0;
-      return 1024 > f ? f + " B" : 1048576 > f ? (f / 1024).toFixed(2) + "KB" : (f / 1048576).toFixed(2) + "MB";
-    };
-    e.toSafeString = g;
-    e.toSafeArrayString = function(f) {
-      for (var c = [], d = 0;d < f.length;d++) {
-        c.push(g(f[d]));
-      }
-      return c.join(", ");
-    };
-    e.utf8decode = function(f) {
-      for (var c = new Uint8Array(4 * f.length), d = 0, g = 0, e = f.length;g < e;g++) {
-        var x = f.charCodeAt(g);
-        if (127 >= x) {
-          c[d++] = x;
-        } else {
-          if (55296 <= x && 56319 >= x) {
-            var y = f.charCodeAt(g + 1);
-            56320 <= y && 57343 >= y && (x = ((x & 1023) << 10) + (y & 1023) + 65536, ++g);
-          }
-          0 !== (x & 4292870144) ? (c[d++] = 248 | x >>> 24 & 3, c[d++] = 128 | x >>> 18 & 63, c[d++] = 128 | x >>> 12 & 63, c[d++] = 128 | x >>> 6 & 63) : 0 !== (x & 4294901760) ? (c[d++] = 240 | x >>> 18 & 7, c[d++] = 128 | x >>> 12 & 63, c[d++] = 128 | x >>> 6 & 63) : 0 !== (x & 4294965248) ? (c[d++] = 224 | x >>> 12 & 15, c[d++] = 128 | x >>> 6 & 63) : c[d++] = 192 | x >>> 6 & 31;
-          c[d++] = 128 | x & 63;
-        }
-      }
-      return c.subarray(0, d);
-    };
-    e.utf8encode = function(f) {
-      for (var c = 0, d = "";c < f.length;) {
-        var g = f[c++] & 255;
-        if (127 >= g) {
-          d += String.fromCharCode(g);
-        } else {
-          var e = 192, x = 5;
-          do {
-            if ((g & (e >> 1 | 128)) === e) {
-              break;
-            }
-            e = e >> 1 | 128;
-            --x;
-          } while (0 <= x);
-          if (0 >= x) {
-            d += String.fromCharCode(g);
-          } else {
-            for (var g = g & (1 << x) - 1, e = !1, y = 5;y >= x;--y) {
-              var b = f[c++];
-              if (128 != (b & 192)) {
-                e = !0;
-                break;
-              }
-              g = g << 6 | b & 63;
-            }
-            if (e) {
-              for (x = c - (7 - y);x < c;++x) {
-                d += String.fromCharCode(f[x] & 255);
-              }
-            } else {
-              d = 65536 <= g ? d + String.fromCharCode(g - 65536 >> 10 & 1023 | 55296, g & 1023 | 56320) : d + String.fromCharCode(g);
-            }
-          }
-        }
-      }
-      return d;
-    };
-    e.base64ArrayBuffer = function(f) {
-      var g = "";
-      f = new Uint8Array(f);
-      for (var e = f.byteLength, x = e % 3, e = e - x, y, b, a, I, l = 0;l < e;l += 3) {
-        I = f[l] << 16 | f[l + 1] << 8 | f[l + 2], y = (I & 16515072) >> 18, b = (I & 258048) >> 12, a = (I & 4032) >> 6, I &= 63, g += c("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[y], "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[b], "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[a], "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[I]);
-      }
-      1 == x ? (I = f[e], g += d("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(I & 252) >> 2], "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(I & 3) << 4], "==")) : 2 == x && (I = f[e] << 8 | f[e + 1], g += c("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(I & 64512) >> 10], "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(I & 1008) >> 4], "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(I & 15) << 
-      2], "="));
-      return g;
-    };
-    e.escapeString = function(f) {
-      void 0 !== f && (f = f.replace(/[^\w$]/gi, "$"), /^\d/.test(f) && (f = "$" + f));
-      return f;
-    };
-    e.fromCharCodeArray = function(f) {
-      for (var c = "", d = 0;d < f.length;d += 16384) {
-        var g = Math.min(f.length - d, 16384), c = c + String.fromCharCode.apply(null, f.subarray(d, d + g))
-      }
-      return c;
-    };
-    e.variableLengthEncodeInt32 = function(f) {
-      for (var c = 32 - Math.clz32(f), d = Math.ceil(c / 6), c = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789$_"[d], d = d - 1;0 <= d;d--) {
-        c += "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789$_"[f >> 6 * d & 63];
-      }
-      return c;
-    };
-    e.toEncoding = function(f) {
-      return "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789$_"[f];
-    };
-    e.fromEncoding = function(f) {
-      if (65 <= f && 90 >= f) {
-        return f - 65;
-      }
-      if (97 <= f && 122 >= f) {
-        return f - 71;
-      }
-      if (48 <= f && 57 >= f) {
-        return f + 4;
-      }
-      if (36 === f) {
-        return 62;
-      }
-      if (95 === f) {
-        return 63;
-      }
-    };
-    e.variableLengthDecodeInt32 = function(f) {
-      for (var c = e.fromEncoding(f.charCodeAt(0)), d = 0, g = 0;g < c;g++) {
-        var x = 6 * (c - g - 1), d = d | e.fromEncoding(f.charCodeAt(1 + g)) << x
-      }
-      return d;
-    };
-    e.trimMiddle = function(f, c) {
-      if (f.length <= c) {
-        return f;
-      }
-      var d = c >> 1, g = c - d - 1;
-      return f.substr(0, d) + "\u2026" + f.substr(f.length - g, g);
-    };
-    e.multiple = function(f, c) {
-      for (var d = "", g = 0;g < c;g++) {
-        d += f;
-      }
-      return d;
-    };
-    e.indexOfAny = function(f, c, d) {
-      for (var g = f.length, e = 0;e < c.length;e++) {
-        var x = f.indexOf(c[e], d);
-        0 <= x && (g = Math.min(g, x));
-      }
-      return g === f.length ? -1 : g;
-    };
-    var f = Array(3), y = Array(4), x = Array(5), b = Array(6), a = Array(7), l = Array(8), h = Array(9);
-    e.concat3 = d;
-    e.concat4 = c;
-    e.concat5 = function(f, c, d, g, e) {
-      x[0] = f;
-      x[1] = c;
-      x[2] = d;
-      x[3] = g;
-      x[4] = e;
-      return x.join("");
-    };
-    e.concat6 = function(f, c, d, g, e, x) {
-      b[0] = f;
-      b[1] = c;
-      b[2] = d;
-      b[3] = g;
-      b[4] = e;
-      b[5] = x;
-      return b.join("");
-    };
-    e.concat7 = function(f, c, d, g, e, x, y) {
-      a[0] = f;
-      a[1] = c;
-      a[2] = d;
-      a[3] = g;
-      a[4] = e;
-      a[5] = x;
-      a[6] = y;
-      return a.join("");
-    };
-    e.concat8 = function(f, c, d, g, e, x, y, b) {
-      l[0] = f;
-      l[1] = c;
-      l[2] = d;
-      l[3] = g;
-      l[4] = e;
-      l[5] = x;
-      l[6] = y;
-      l[7] = b;
-      return l.join("");
-    };
-    e.concat9 = function(f, c, d, g, e, x, y, b, a) {
-      h[0] = f;
-      h[1] = c;
-      h[2] = d;
-      h[3] = g;
-      h[4] = e;
-      h[5] = x;
-      h[6] = y;
-      h[7] = b;
-      h[8] = a;
-      return h.join("");
-    };
-  })(k.StringUtilities || (k.StringUtilities = {}));
-  (function(e) {
-    var g = new Uint8Array([7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21]), d = new Int32Array([-680876936, -389564586, 606105819, -1044525330, -176418897, 1200080426, -1473231341, -45705983, 1770035416, -1958414417, -42063, -1990404162, 1804603682, -40341101, -1502002290, 1236535329, -165796510, -1069501632, 
-    643717713, -373897302, -701558691, 38016083, -660478335, -405537848, 568446438, -1019803690, -187363961, 1163531501, -1444681467, -51403784, 1735328473, -1926607734, -378558, -2022574463, 1839030562, -35309556, -1530992060, 1272893353, -155497632, -1094730640, 681279174, -358537222, -722521979, 76029189, -640364487, -421815835, 530742520, -995338651, -198630844, 1126891415, -1416354905, -57434055, 1700485571, -1894986606, -1051523, -2054922799, 1873313359, -30611744, -1560198380, 1309151649, 
-    -145523070, -1120210379, 718787259, -343485551]);
-    e.hashBytesTo32BitsMD5 = function(c, f, e) {
-      var x = 1732584193, b = -271733879, a = -1732584194, l = 271733878, h = e + 72 & -64, v = new Uint8Array(h), r;
-      for (r = 0;r < e;++r) {
-        v[r] = c[f++];
-      }
-      v[r++] = 128;
-      for (c = h - 8;r < c;) {
-        v[r++] = 0;
-      }
-      v[r++] = e << 3 & 255;
-      v[r++] = e >> 5 & 255;
-      v[r++] = e >> 13 & 255;
-      v[r++] = e >> 21 & 255;
-      v[r++] = e >>> 29 & 255;
-      v[r++] = 0;
-      v[r++] = 0;
-      v[r++] = 0;
-      c = new Int32Array(16);
-      for (r = 0;r < h;) {
-        for (e = 0;16 > e;++e, r += 4) {
-          c[e] = v[r] | v[r + 1] << 8 | v[r + 2] << 16 | v[r + 3] << 24;
-        }
-        var n = x;
-        f = b;
-        var t = a, m = l, q, k;
-        for (e = 0;64 > e;++e) {
-          16 > e ? (q = f & t | ~f & m, k = e) : 32 > e ? (q = m & f | ~m & t, k = 5 * e + 1 & 15) : 48 > e ? (q = f ^ t ^ m, k = 3 * e + 5 & 15) : (q = t ^ (f | ~m), k = 7 * e & 15);
-          var w = m, n = n + q + d[e] + c[k] | 0;
-          q = g[e];
-          m = t;
-          t = f;
-          f = f + (n << q | n >>> 32 - q) | 0;
-          n = w;
-        }
-        x = x + n | 0;
-        b = b + f | 0;
-        a = a + t | 0;
-        l = l + m | 0;
-      }
-      return x;
-    };
-    e.hashBytesTo32BitsAdler = function(c, f, d) {
-      var g = 1, e = 0;
-      for (d = f + d;f < d;++f) {
-        g = (g + (c[f] & 255)) % 65521, e = (e + g) % 65521;
-      }
-      return e << 16 | g;
-    };
-    e.mixHash = function(c, f) {
-      return (31 * c | 0) + f | 0;
-    };
-  })(k.HashUtilities || (k.HashUtilities = {}));
-  var r = function() {
-    function e() {
-    }
-    e.seed = function(g) {
-      e._state[0] = g;
-      e._state[1] = g;
-    };
-    e.reset = function() {
-      e._state[0] = 57005;
-      e._state[1] = 48879;
-    };
-    e.next = function() {
-      var g = this._state, d = Math.imul(18273, g[0] & 65535) + (g[0] >>> 16) | 0;
-      g[0] = d;
-      var c = Math.imul(36969, g[1] & 65535) + (g[1] >>> 16) | 0;
-      g[1] = c;
-      g = (d << 16) + (c & 65535) | 0;
-      return 2.3283064365386963E-10 * (0 > g ? g + 4294967296 : g);
-    };
-    e._state = new Uint32Array([57005, 48879]);
-    return e;
-  }();
-  k.Random = r;
-  Math.random = function() {
-    return r.next();
-  };
-  k.installTimeWarper = function() {
-    var e = Date, g = 1428107694580;
-    jsGlobal.Date = function(d, c, f, y, x, b, a) {
-      switch(arguments.length) {
-        case 0:
-          return new e(g);
-        case 1:
-          return new e(d);
-        case 2:
-          return new e(d, c);
-        case 3:
-          return new e(d, c, f);
-        case 4:
-          return new e(d, c, f, y);
-        case 5:
-          return new e(d, c, f, y, x);
-        case 6:
-          return new e(d, c, f, y, x, b);
-        default:
-          return new e(d, c, f, y, x, b, a);
-      }
-    };
-    jsGlobal.Date.now = function() {
-      return g += 10;
-    };
-    jsGlobal.Date.UTC = function() {
-      return e.UTC.apply(e, arguments);
-    };
-  };
-  (function() {
-    function e() {
-      this.id = "$weakmap" + g++;
-    }
-    if ("function" !== typeof jsGlobal.WeakMap) {
-      var g = 0;
-      e.prototype = {has:function(d) {
-        return d.hasOwnProperty(this.id);
-      }, get:function(d, c) {
-        return d.hasOwnProperty(this.id) ? d[this.id] : c;
-      }, set:function(d, c) {
-        Object.defineProperty(d, this.id, {value:c, enumerable:!1, configurable:!0});
-      }, delete:function(d) {
-        delete d[this.id];
-      }};
-      jsGlobal.WeakMap = e;
-    }
-  })();
-  b = function() {
-    function e() {
-      "undefined" !== typeof ShumwayCom && ShumwayCom.getWeakMapKeys ? (this._map = new WeakMap, this._id = 0, this._newAdditions = []) : this._list = [];
-    }
-    e.prototype.clear = function() {
-      this._map ? this._map = new WeakMap() : this._list.length = 0;
-    };
-    e.prototype.push = function(g) {
-      this._map ? (this._map.set(g, this._id++), this._newAdditions.forEach(function(d) {
-        d.push(g);
-      })) : this._list.push(g);
-    };
-    e.prototype.remove = function(g) {
-      this._map ? this._map.delete(g) : this._list[this._list.indexOf(g)] = null;
-    };
-    e.prototype.forEach = function(g) {
-      if (this._map) {
-        var d = [];
-        this._newAdditions.push(d);
-        var c = this._map, f = ShumwayCom.getWeakMapKeys(c);
-        f.sort(function(f, d) {
-          return c.get(f) - c.get(d);
-        });
-        f.forEach(function(f) {
-          0 !== f._referenceCount && g(f);
-        });
-        d.forEach(function(f) {
-          0 !== f._referenceCount && g(f);
-        });
-        this._newAdditions.splice(this._newAdditions.indexOf(d), 1);
-      } else {
-        for (var d = this._list, e = 0, f = 0;f < d.length;f++) {
-          var x = d[f];
-          x && (0 === x._referenceCount ? (d[f] = null, e++) : g(x));
-        }
-        if (16 < e && e > d.length >> 2) {
-          e = [];
-          for (f = 0;f < d.length;f++) {
-            (x = d[f]) && 0 < x._referenceCount && e.push(x);
-          }
-          this._list = e;
-        }
-      }
-    };
-    Object.defineProperty(e.prototype, "length", {get:function() {
-      return this._map ? -1 : this._list.length;
-    }, enumerable:!0, configurable:!0});
-    return e;
-  }();
-  k.WeakList = b;
-  var h;
-  (function(e) {
-    e.pow2 = function(g) {
-      return g === (g | 0) ? 0 > g ? 1 / (1 << -g) : 1 << g : Math.pow(2, g);
-    };
-    e.clamp = function(g, d, c) {
-      return Math.max(d, Math.min(c, g));
-    };
-    e.roundHalfEven = function(g) {
-      if (.5 === Math.abs(g % 1)) {
-        var d = Math.floor(g);
-        return 0 === d % 2 ? d : Math.ceil(g);
-      }
-      return Math.round(g);
-    };
-    e.altTieBreakRound = function(g, d) {
-      return .5 !== Math.abs(g % 1) || d ? Math.round(g) : g | 0;
-    };
-    e.epsilonEquals = function(g, d) {
-      return 1E-7 > Math.abs(g - d);
-    };
-  })(h = k.NumberUtilities || (k.NumberUtilities = {}));
-  (function(e) {
-    e[e.MaxU16 = 65535] = "MaxU16";
-    e[e.MaxI16 = 32767] = "MaxI16";
-    e[e.MinI16 = -32768] = "MinI16";
-  })(k.Numbers || (k.Numbers = {}));
-  var t;
-  (function(e) {
-    function g(f) {
-      return 256 * f << 16 >> 16;
-    }
-    function d(f) {
-      return f / 256;
-    }
-    var c = new ArrayBuffer(8);
-    e.i8 = new Int8Array(c);
-    e.u8 = new Uint8Array(c);
-    e.i32 = new Int32Array(c);
-    e.f32 = new Float32Array(c);
-    e.f64 = new Float64Array(c);
-    e.nativeLittleEndian = 1 === (new Int8Array((new Int32Array([1])).buffer))[0];
-    e.floatToInt32 = function(f) {
-      e.f32[0] = f;
-      return e.i32[0];
-    };
-    e.int32ToFloat = function(f) {
-      e.i32[0] = f;
-      return e.f32[0];
-    };
-    e.swap16 = function(f) {
-      return (f & 255) << 8 | f >> 8 & 255;
-    };
-    e.swap32 = function(f) {
-      return (f & 255) << 24 | (f & 65280) << 8 | f >> 8 & 65280 | f >> 24 & 255;
-    };
-    e.toS8U8 = g;
-    e.fromS8U8 = d;
-    e.clampS8U8 = function(f) {
-      return d(g(f));
-    };
-    e.toS16 = function(f) {
-      return f << 16 >> 16;
-    };
-    e.bitCount = function(f) {
-      f -= f >> 1 & 1431655765;
-      f = (f & 858993459) + (f >> 2 & 858993459);
-      return 16843009 * (f + (f >> 4) & 252645135) >> 24;
-    };
-    e.ones = function(f) {
-      f -= f >> 1 & 1431655765;
-      f = (f & 858993459) + (f >> 2 & 858993459);
-      return 16843009 * (f + (f >> 4) & 252645135) >> 24;
-    };
-    e.trailingZeros = function(f) {
-      return e.ones((f & -f) - 1);
-    };
-    e.getFlags = function(f, c) {
-      var d = "";
-      for (f = 0;f < c.length;f++) {
-        f & 1 << f && (d += c[f] + " ");
-      }
-      return 0 === d.length ? "" : d.trim();
-    };
-    e.isPowerOfTwo = function(f) {
-      return f && 0 === (f & f - 1);
-    };
-    e.roundToMultipleOfFour = function(f) {
-      return f + 3 & -4;
-    };
-    e.nearestPowerOfTwo = function(f) {
-      f--;
-      f |= f >> 1;
-      f |= f >> 2;
-      f |= f >> 4;
-      f |= f >> 8;
-      f |= f >> 16;
-      f++;
-      return f;
-    };
-    e.roundToMultipleOfPowerOfTwo = function(f, c) {
-      var d = (1 << c) - 1;
-      return f + d & ~d;
-    };
-    e.toHEX = function(f) {
-      return "0x" + ("00000000" + (0 > f ? 4294967295 + f + 1 : f).toString(16)).substr(-8);
-    };
-    Math.imul || (Math.imul = function(f, c) {
-      var d = f & 65535, g = c & 65535;
-      return d * g + ((f >>> 16 & 65535) * g + d * (c >>> 16 & 65535) << 16 >>> 0) | 0;
-    });
-    Math.clz32 || (Math.clz32 = function(f) {
-      f |= f >> 1;
-      f |= f >> 2;
-      f |= f >> 4;
-      f |= f >> 8;
-      return 32 - e.ones(f | f >> 16);
-    });
-  })(t = k.IntegerUtilities || (k.IntegerUtilities = {}));
-  (function(e) {
-    function g(d, c, f, g, e, b) {
-      return (f - d) * (b - c) - (g - c) * (e - d);
-    }
-    e.pointInPolygon = function(d, c, f) {
-      for (var g = 0, e = f.length - 2, b = 0;b < e;b += 2) {
-        var a = f[b + 0], l = f[b + 1], h = f[b + 2], v = f[b + 3];
-        (l <= c && v > c || l > c && v <= c) && d < a + (c - l) / (v - l) * (h - a) && g++;
-      }
-      return 1 === (g & 1);
-    };
-    e.signedArea = g;
-    e.counterClockwise = function(d, c, f, e, x, b) {
-      return 0 < g(d, c, f, e, x, b);
-    };
-    e.clockwise = function(d, c, f, e, x, b) {
-      return 0 > g(d, c, f, e, x, b);
-    };
-    e.pointInPolygonInt32 = function(d, c, f) {
-      d |= 0;
-      c |= 0;
-      for (var g = 0, e = f.length - 2, b = 0;b < e;b += 2) {
-        var a = f[b + 0], l = f[b + 1], h = f[b + 2], v = f[b + 3];
-        (l <= c && v > c || l > c && v <= c) && d < a + (c - l) / (v - l) * (h - a) && g++;
-      }
-      return 1 === (g & 1);
-    };
-  })(k.GeometricUtilities || (k.GeometricUtilities = {}));
-  (function(e) {
-    e[e.Error = 1] = "Error";
-    e[e.Warn = 2] = "Warn";
-    e[e.Debug = 4] = "Debug";
-    e[e.Log = 8] = "Log";
-    e[e.Info = 16] = "Info";
-    e[e.All = 31] = "All";
-  })(k.LogLevel || (k.LogLevel = {}));
-  b = function() {
-    function e(g, d) {
-      void 0 === g && (g = !1);
-      this._tab = "  ";
-      this._padding = "";
-      this._suppressOutput = g;
-      this._out = d || e._consoleOut;
-      this._outNoNewline = d || e._consoleOutNoNewline;
-    }
-    Object.defineProperty(e.prototype, "suppressOutput", {get:function() {
-      return this._suppressOutput;
-    }, set:function(g) {
-      this._suppressOutput = g;
-    }, enumerable:!0, configurable:!0});
-    e.prototype.write = function(g, d) {
-      void 0 === g && (g = "");
-      void 0 === d && (d = !1);
-      this._suppressOutput || this._outNoNewline((d ? this._padding : "") + g);
-    };
-    e.prototype.writeLn = function(g) {
-      void 0 === g && (g = "");
-      this._suppressOutput || this._out(this._padding + g);
-    };
-    e.prototype.writeObject = function(g, d) {
-      void 0 === g && (g = "");
-      this._suppressOutput || this._out(this._padding + g, d);
-    };
-    e.prototype.writeTimeLn = function(g) {
-      void 0 === g && (g = "");
-      this._suppressOutput || this._out(this._padding + performance.now().toFixed(2) + " " + g);
-    };
-    e.prototype.writeComment = function(g) {
-      g = (g || "").split("\n");
-      if (1 === g.length) {
-        this.writeLn("// " + g[0]);
-      } else {
-        this.writeLn("/**");
-        for (var d = 0;d < g.length;d++) {
-          this.writeLn(" * " + g[d]);
-        }
-        this.writeLn(" */");
-      }
-    };
-    e.prototype.writeLns = function(g) {
-      g = (g || "").split("\n");
-      for (var d = 0;d < g.length;d++) {
-        this.writeLn(g[d]);
-      }
-    };
-    e.prototype.errorLn = function(g) {
-      e.logLevel & 1 && this.boldRedLn(g);
-    };
-    e.prototype.warnLn = function(g) {
-      e.logLevel & 2 && this.yellowLn(g);
-    };
-    e.prototype.debugLn = function(g) {
-      e.logLevel & 4 && this.purpleLn(g);
-    };
-    e.prototype.logLn = function(g) {
-      e.logLevel & 8 && this.writeLn(g);
-    };
-    e.prototype.infoLn = function(g) {
-      e.logLevel & 16 && this.writeLn(g);
-    };
-    e.prototype.yellowLn = function(g) {
-      this.colorLn(e.YELLOW, g);
-    };
-    e.prototype.greenLn = function(g) {
-      this.colorLn(e.GREEN, g);
-    };
-    e.prototype.boldRedLn = function(g) {
-      this.colorLn(e.BOLD_RED, g);
-    };
-    e.prototype.redLn = function(g) {
-      this.colorLn(e.RED, g);
-    };
-    e.prototype.purpleLn = function(g) {
-      this.colorLn(e.PURPLE, g);
-    };
-    e.prototype.colorLn = function(g, d) {
-      this._suppressOutput || (inBrowser ? this._out(this._padding + d) : this._out(this._padding + g + d + e.ENDC));
-    };
-    e.prototype.redLns = function(g) {
-      this.colorLns(e.RED, g);
-    };
-    e.prototype.colorLns = function(g, d) {
-      for (var c = (d || "").split("\n"), f = 0;f < c.length;f++) {
-        this.colorLn(g, c[f]);
-      }
-    };
-    e.prototype.enter = function(g) {
-      this._suppressOutput || this._out(this._padding + g);
-      this.indent();
-    };
-    e.prototype.leaveAndEnter = function(g) {
-      this.leave(g);
-      this.indent();
-    };
-    e.prototype.leave = function(g) {
-      this.outdent();
-      !this._suppressOutput && g && this._out(this._padding + g);
-    };
-    e.prototype.indent = function() {
-      this._padding += this._tab;
-    };
-    e.prototype.outdent = function() {
-      0 < this._padding.length && (this._padding = this._padding.substring(0, this._padding.length - this._tab.length));
-    };
-    e.prototype.writeArray = function(g, d, c) {
-      void 0 === d && (d = !1);
-      void 0 === c && (c = !1);
-      d = d || !1;
-      for (var f = 0, e = g.length;f < e;f++) {
-        var x = "";
-        d && (x = null === g[f] ? "null" : void 0 === g[f] ? "undefined" : g[f].constructor.name, x += " ");
-        var b = c ? "" : ("" + f).padRight(" ", 4);
-        this.writeLn(b + x + g[f]);
-      }
-    };
-    e.PURPLE = "\u001b[94m";
-    e.YELLOW = "\u001b[93m";
-    e.GREEN = "\u001b[92m";
-    e.RED = "\u001b[91m";
-    e.BOLD_RED = "\u001b[1;91m";
-    e.ENDC = "\u001b[0m";
-    e.logLevel = 31;
-    e._consoleOut = console.log.bind(console);
-    e._consoleOutNoNewline = console.log.bind(console);
-    return e;
-  }();
-  k.IndentingWriter = b;
-  var q = function() {
-    return function(e, g) {
-      this.value = e;
-      this.next = g;
-    };
-  }(), b = function() {
-    function e(g) {
-      this._compare = g;
-      this._head = null;
-      this._length = 0;
-    }
-    e.prototype.push = function(g) {
-      this._length++;
-      if (this._head) {
-        var d = this._head, c = null;
-        g = new q(g, null);
-        for (var f = this._compare;d;) {
-          if (0 < f(d.value, g.value)) {
-            c ? (g.next = d, c.next = g) : (g.next = this._head, this._head = g);
-            return;
-          }
-          c = d;
-          d = d.next;
-        }
-        c.next = g;
-      } else {
-        this._head = new q(g, null);
-      }
-    };
-    e.prototype.forEach = function(g) {
-      for (var d = this._head, c = null;d;) {
-        var f = g(d.value);
-        if (f === e.RETURN) {
-          break;
-        } else {
-          f === e.DELETE ? d = c ? c.next = d.next : this._head = this._head.next : (c = d, d = d.next);
-        }
-      }
-    };
-    e.prototype.isEmpty = function() {
-      return !this._head;
-    };
-    e.prototype.pop = function() {
-      if (this._head) {
-        this._length--;
-        var g = this._head;
-        this._head = this._head.next;
-        return g.value;
-      }
-    };
-    e.prototype.contains = function(g) {
-      for (var d = this._head;d;) {
-        if (d.value === g) {
-          return !0;
-        }
-        d = d.next;
-      }
-      return !1;
-    };
-    e.prototype.toString = function() {
-      for (var g = "[", d = this._head;d;) {
-        g += d.value.toString(), (d = d.next) && (g += ",");
-      }
-      return g + "]";
-    };
-    e.RETURN = 1;
-    e.DELETE = 2;
-    return e;
-  }();
-  k.SortedList = b;
-  b = function() {
-    function e(g, d) {
-      void 0 === d && (d = 12);
-      this.start = this.index = 0;
-      this._size = 1 << d;
-      this._mask = this._size - 1;
-      this.array = new g(this._size);
-    }
-    e.prototype.get = function(g) {
-      return this.array[g];
-    };
-    e.prototype.forEachInReverse = function(g) {
-      if (!this.isEmpty()) {
-        for (var d = 0 === this.index ? this._size - 1 : this.index - 1, c = this.start - 1 & this._mask;d !== c && !g(this.array[d], d);) {
-          d = 0 === d ? this._size - 1 : d - 1;
-        }
-      }
-    };
-    e.prototype.write = function(g) {
-      this.array[this.index] = g;
-      this.index = this.index + 1 & this._mask;
-      this.index === this.start && (this.start = this.start + 1 & this._mask);
-    };
-    e.prototype.isFull = function() {
-      return (this.index + 1 & this._mask) === this.start;
-    };
-    e.prototype.isEmpty = function() {
-      return this.index === this.start;
-    };
-    e.prototype.reset = function() {
-      this.start = this.index = 0;
-    };
-    return e;
-  }();
-  k.CircularBuffer = b;
-  (function(e) {
-    function g(f) {
-      return f + (e.BITS_PER_WORD - 1) >> e.ADDRESS_BITS_PER_WORD << e.ADDRESS_BITS_PER_WORD;
-    }
-    function d(f, c) {
-      f = f || "1";
-      c = c || "0";
-      for (var d = "", g = 0;g < length;g++) {
-        d += this.get(g) ? f : c;
-      }
-      return d;
-    }
-    function c(f) {
-      for (var c = [], d = 0;d < length;d++) {
-        this.get(d) && c.push(f ? f[d] : d);
-      }
-      return c.join(", ");
-    }
-    e.ADDRESS_BITS_PER_WORD = 5;
-    e.BITS_PER_WORD = 1 << e.ADDRESS_BITS_PER_WORD;
-    e.BIT_INDEX_MASK = e.BITS_PER_WORD - 1;
-    var f = function() {
-      function f(c) {
-        this.size = g(c);
-        this.dirty = this.count = 0;
-        this.length = c;
-        this.bits = new Uint32Array(this.size >> e.ADDRESS_BITS_PER_WORD);
-      }
-      f.prototype.recount = function() {
-        if (this.dirty) {
-          for (var f = this.bits, c = 0, d = 0, g = f.length;d < g;d++) {
-            var e = f[d], e = e - (e >> 1 & 1431655765), e = (e & 858993459) + (e >> 2 & 858993459), c = c + (16843009 * (e + (e >> 4) & 252645135) >> 24)
-          }
-          this.count = c;
-          this.dirty = 0;
-        }
-      };
-      f.prototype.set = function(f) {
-        var c = f >> e.ADDRESS_BITS_PER_WORD, d = this.bits[c];
-        f = d | 1 << (f & e.BIT_INDEX_MASK);
-        this.bits[c] = f;
-        this.dirty |= d ^ f;
-      };
-      f.prototype.setAll = function() {
-        for (var f = this.bits, c = 0, d = f.length;c < d;c++) {
-          f[c] = 4294967295;
-        }
-        this.count = this.size;
-        this.dirty = 0;
-      };
-      f.prototype.assign = function(f) {
-        this.count = f.count;
-        this.dirty = f.dirty;
-        this.size = f.size;
-        for (var c = 0, d = this.bits.length;c < d;c++) {
-          this.bits[c] = f.bits[c];
-        }
-      };
-      f.prototype.clear = function(f) {
-        var c = f >> e.ADDRESS_BITS_PER_WORD, d = this.bits[c];
-        f = d & ~(1 << (f & e.BIT_INDEX_MASK));
-        this.bits[c] = f;
-        this.dirty |= d ^ f;
-      };
-      f.prototype.get = function(f) {
-        return 0 !== (this.bits[f >> e.ADDRESS_BITS_PER_WORD] & 1 << (f & e.BIT_INDEX_MASK));
-      };
-      f.prototype.clearAll = function() {
-        for (var f = this.bits, c = 0, d = f.length;c < d;c++) {
-          f[c] = 0;
-        }
-        this.dirty = this.count = 0;
-      };
-      f.prototype._union = function(f) {
-        var c = this.dirty, d = this.bits;
-        f = f.bits;
-        for (var g = 0, e = d.length;g < e;g++) {
-          var x = d[g], y = x | f[g];
-          d[g] = y;
-          c |= x ^ y;
-        }
-        this.dirty = c;
-      };
-      f.prototype.intersect = function(f) {
-        var c = this.dirty, d = this.bits;
-        f = f.bits;
-        for (var g = 0, e = d.length;g < e;g++) {
-          var x = d[g], y = x & f[g];
-          d[g] = y;
-          c |= x ^ y;
-        }
-        this.dirty = c;
-      };
-      f.prototype.subtract = function(f) {
-        var c = this.dirty, d = this.bits;
-        f = f.bits;
-        for (var g = 0, e = d.length;g < e;g++) {
-          var x = d[g], y = x & ~f[g];
-          d[g] = y;
-          c |= x ^ y;
-        }
-        this.dirty = c;
-      };
-      f.prototype.negate = function() {
-        for (var f = this.dirty, c = this.bits, d = 0, g = c.length;d < g;d++) {
-          var e = c[d], x = ~e;
-          c[d] = x;
-          f |= e ^ x;
-        }
-        this.dirty = f;
-      };
-      f.prototype.forEach = function(f) {
-        for (var c = this.bits, d = 0, g = c.length;d < g;d++) {
-          var x = c[d];
-          if (x) {
-            for (var y = 0;y < e.BITS_PER_WORD;y++) {
-              x & 1 << y && f(d * e.BITS_PER_WORD + y);
-            }
-          }
-        }
-      };
-      f.prototype.toArray = function() {
-        for (var f = [], c = this.bits, d = 0, g = c.length;d < g;d++) {
-          var x = c[d];
-          if (x) {
-            for (var y = 0;y < e.BITS_PER_WORD;y++) {
-              x & 1 << y && f.push(d * e.BITS_PER_WORD + y);
-            }
-          }
-        }
-        return f;
-      };
-      f.prototype.equals = function(f) {
-        if (this.size !== f.size) {
-          return !1;
-        }
-        var c = this.bits;
-        f = f.bits;
-        for (var d = 0, g = c.length;d < g;d++) {
-          if (c[d] !== f[d]) {
-            return !1;
-          }
-        }
-        return !0;
-      };
-      f.prototype.contains = function(f) {
-        if (this.size !== f.size) {
-          return !1;
-        }
-        var c = this.bits;
-        f = f.bits;
-        for (var d = 0, g = c.length;d < g;d++) {
-          if ((c[d] | f[d]) !== c[d]) {
-            return !1;
-          }
-        }
-        return !0;
-      };
-      f.prototype.isEmpty = function() {
-        this.recount();
-        return 0 === this.count;
-      };
-      f.prototype.clone = function() {
-        var c = new f(this.length);
-        c._union(this);
-        return c;
-      };
-      return f;
-    }();
-    e.Uint32ArrayBitSet = f;
-    var y = function() {
-      function f(c) {
-        this.dirty = this.count = 0;
-        this.size = g(c);
-        this.bits = 0;
-        this.singleWord = !0;
-        this.length = c;
-      }
-      f.prototype.recount = function() {
-        if (this.dirty) {
-          var f = this.bits, f = f - (f >> 1 & 1431655765), f = (f & 858993459) + (f >> 2 & 858993459);
-          this.count = 0 + (16843009 * (f + (f >> 4) & 252645135) >> 24);
-          this.dirty = 0;
-        }
-      };
-      f.prototype.set = function(f) {
-        var c = this.bits;
-        this.bits = f = c | 1 << (f & e.BIT_INDEX_MASK);
-        this.dirty |= c ^ f;
-      };
-      f.prototype.setAll = function() {
-        this.bits = 4294967295;
-        this.count = this.size;
-        this.dirty = 0;
-      };
-      f.prototype.assign = function(f) {
-        this.count = f.count;
-        this.dirty = f.dirty;
-        this.size = f.size;
-        this.bits = f.bits;
-      };
-      f.prototype.clear = function(f) {
-        var c = this.bits;
-        this.bits = f = c & ~(1 << (f & e.BIT_INDEX_MASK));
-        this.dirty |= c ^ f;
-      };
-      f.prototype.get = function(f) {
-        return 0 !== (this.bits & 1 << (f & e.BIT_INDEX_MASK));
-      };
-      f.prototype.clearAll = function() {
-        this.dirty = this.count = this.bits = 0;
-      };
-      f.prototype._union = function(f) {
-        var c = this.bits;
-        this.bits = f = c | f.bits;
-        this.dirty = c ^ f;
-      };
-      f.prototype.intersect = function(f) {
-        var c = this.bits;
-        this.bits = f = c & f.bits;
-        this.dirty = c ^ f;
-      };
-      f.prototype.subtract = function(f) {
-        var c = this.bits;
-        this.bits = f = c & ~f.bits;
-        this.dirty = c ^ f;
-      };
-      f.prototype.negate = function() {
-        var f = this.bits, c = ~f;
-        this.bits = c;
-        this.dirty = f ^ c;
-      };
-      f.prototype.forEach = function(f) {
-        var c = this.bits;
-        if (c) {
-          for (var d = 0;d < e.BITS_PER_WORD;d++) {
-            c & 1 << d && f(d);
-          }
-        }
-      };
-      f.prototype.toArray = function() {
-        var f = [], c = this.bits;
-        if (c) {
-          for (var d = 0;d < e.BITS_PER_WORD;d++) {
-            c & 1 << d && f.push(d);
-          }
-        }
-        return f;
-      };
-      f.prototype.equals = function(f) {
-        return this.bits === f.bits;
-      };
-      f.prototype.contains = function(f) {
-        var c = this.bits;
-        return (c | f.bits) === c;
-      };
-      f.prototype.isEmpty = function() {
-        this.recount();
-        return 0 === this.count;
-      };
-      f.prototype.clone = function() {
-        var c = new f(this.length);
-        c._union(this);
-        return c;
-      };
-      return f;
-    }();
-    e.Uint32BitSet = y;
-    y.prototype.toString = c;
-    y.prototype.toBitString = d;
-    f.prototype.toString = c;
-    f.prototype.toBitString = d;
-    e.BitSetFunctor = function(c) {
-      var d = 1 === g(c) >> e.ADDRESS_BITS_PER_WORD ? y : f;
-      return function() {
-        return new d(c);
-      };
-    };
-  })(k.BitSets || (k.BitSets = {}));
-  b = function() {
-    function e() {
-    }
-    e.randomStyle = function() {
-      e._randomStyleCache || (e._randomStyleCache = "#ff5e3a #ff9500 #ffdb4c #87fc70 #52edc7 #1ad6fd #c644fc #ef4db6 #4a4a4a #dbddde #ff3b30 #ff9500 #ffcc00 #4cd964 #34aadc #007aff #5856d6 #ff2d55 #8e8e93 #c7c7cc #5ad427 #c86edf #d1eefc #e0f8d8 #fb2b69 #f7f7f7 #1d77ef #d6cec3 #55efcb #ff4981 #ffd3e0 #f7f7f7 #ff1300 #1f1f21 #bdbec2 #ff3a2d".split(" "));
-      return e._randomStyleCache[e._nextStyle++ % e._randomStyleCache.length];
-    };
-    e.gradientColor = function(g) {
-      return e._gradient[e._gradient.length * h.clamp(g, 0, 1) | 0];
-    };
-    e.contrastStyle = function(g) {
-      g = parseInt(g.substr(1), 16);
-      return 128 <= (299 * (g >> 16) + 587 * (g >> 8 & 255) + 114 * (g & 255)) / 1E3 ? "#000000" : "#ffffff";
-    };
-    e.reset = function() {
-      e._nextStyle = 0;
-    };
-    e.TabToolbar = "#252c33";
-    e.Toolbars = "#343c45";
-    e.HighlightBlue = "#1d4f73";
-    e.LightText = "#f5f7fa";
-    e.ForegroundText = "#b6babf";
-    e.Black = "#000000";
-    e.VeryDark = "#14171a";
-    e.Dark = "#181d20";
-    e.Light = "#a9bacb";
-    e.Grey = "#8fa1b2";
-    e.DarkGrey = "#5f7387";
-    e.Blue = "#46afe3";
-    e.Purple = "#6b7abb";
-    e.Pink = "#df80ff";
-    e.Red = "#eb5368";
-    e.Orange = "#d96629";
-    e.LightOrange = "#d99b28";
-    e.Green = "#70bf53";
-    e.BlueGrey = "#5e88b0";
-    e._nextStyle = 0;
-    e._gradient = "#FF0000 #FF1100 #FF2300 #FF3400 #FF4600 #FF5700 #FF6900 #FF7B00 #FF8C00 #FF9E00 #FFAF00 #FFC100 #FFD300 #FFE400 #FFF600 #F7FF00 #E5FF00 #D4FF00 #C2FF00 #B0FF00 #9FFF00 #8DFF00 #7CFF00 #6AFF00 #58FF00 #47FF00 #35FF00 #24FF00 #12FF00 #00FF00".split(" ");
-    return e;
-  }();
-  k.ColorStyle = b;
-  b = function() {
-    function e(g, d, c, f) {
-      this.xMin = g | 0;
-      this.yMin = d | 0;
-      this.xMax = c | 0;
-      this.yMax = f | 0;
-    }
-    e.FromUntyped = function(g) {
-      return new e(g.xMin, g.yMin, g.xMax, g.yMax);
-    };
-    e.FromRectangle = function(g) {
-      return new e(20 * g.x | 0, 20 * g.y | 0, 20 * (g.x + g.width) | 0, 20 * (g.y + g.height) | 0);
-    };
-    e.prototype.setElements = function(g, d, c, f) {
-      this.xMin = g;
-      this.yMin = d;
-      this.xMax = c;
-      this.yMax = f;
-    };
-    e.prototype.copyFrom = function(g) {
-      this.setElements(g.xMin, g.yMin, g.xMax, g.yMax);
-    };
-    e.prototype.contains = function(g, d) {
-      return g < this.xMin !== g < this.xMax && d < this.yMin !== d < this.yMax;
-    };
-    e.prototype.unionInPlace = function(g) {
-      g.isEmpty() || (this.extendByPoint(g.xMin, g.yMin), this.extendByPoint(g.xMax, g.yMax));
-    };
-    e.prototype.extendByPoint = function(g, d) {
-      this.extendByX(g);
-      this.extendByY(d);
-    };
-    e.prototype.extendByX = function(g) {
-      134217728 === this.xMin ? this.xMin = this.xMax = g : (this.xMin = Math.min(this.xMin, g), this.xMax = Math.max(this.xMax, g));
-    };
-    e.prototype.extendByY = function(g) {
-      134217728 === this.yMin ? this.yMin = this.yMax = g : (this.yMin = Math.min(this.yMin, g), this.yMax = Math.max(this.yMax, g));
-    };
-    e.prototype.intersects = function(g) {
-      return this.contains(g.xMin, g.yMin) || this.contains(g.xMax, g.yMax);
-    };
-    e.prototype.isEmpty = function() {
-      return this.xMax <= this.xMin || this.yMax <= this.yMin;
-    };
-    Object.defineProperty(e.prototype, "width", {get:function() {
-      return this.xMax - this.xMin;
-    }, set:function(g) {
-      this.xMax = this.xMin + g;
-    }, enumerable:!0, configurable:!0});
-    Object.defineProperty(e.prototype, "height", {get:function() {
-      return this.yMax - this.yMin;
-    }, set:function(g) {
-      this.yMax = this.yMin + g;
-    }, enumerable:!0, configurable:!0});
-    e.prototype.getBaseWidth = function(g) {
-      var d = Math.abs(Math.cos(g));
-      g = Math.abs(Math.sin(g));
-      return d * (this.xMax - this.xMin) + g * (this.yMax - this.yMin);
-    };
-    e.prototype.getBaseHeight = function(g) {
-      var d = Math.abs(Math.cos(g));
-      return Math.abs(Math.sin(g)) * (this.xMax - this.xMin) + d * (this.yMax - this.yMin);
-    };
-    e.prototype.setEmpty = function() {
-      this.xMin = this.yMin = this.xMax = this.yMax = 0;
-    };
-    e.prototype.setToSentinels = function() {
-      this.xMin = this.yMin = this.xMax = this.yMax = 134217728;
-    };
-    e.prototype.clone = function() {
-      return new e(this.xMin, this.yMin, this.xMax, this.yMax);
-    };
-    e.prototype.toString = function() {
-      return "{ xMin: " + this.xMin + ", xMin: " + this.yMin + ", xMax: " + this.xMax + ", xMax: " + this.yMax + " }";
-    };
-    return e;
-  }();
-  k.Bounds = b;
-  b = function() {
-    function e(g, d, c, f) {
-      m.assert(p(g));
-      m.assert(p(d));
-      m.assert(p(c));
-      m.assert(p(f));
-      this._xMin = g | 0;
-      this._yMin = d | 0;
-      this._xMax = c | 0;
-      this._yMax = f | 0;
-    }
-    e.FromUntyped = function(g) {
-      return new e(g.xMin, g.yMin, g.xMax, g.yMax);
-    };
-    e.FromRectangle = function(g) {
-      return new e(20 * g.x | 0, 20 * g.y | 0, 20 * (g.x + g.width) | 0, 20 * (g.y + g.height) | 0);
-    };
-    e.prototype.setElements = function(g, d, c, f) {
-      this.xMin = g;
-      this.yMin = d;
-      this.xMax = c;
-      this.yMax = f;
-    };
-    e.prototype.copyFrom = function(g) {
-      this.setElements(g.xMin, g.yMin, g.xMax, g.yMax);
-    };
-    e.prototype.contains = function(g, d) {
-      return g < this.xMin !== g < this.xMax && d < this.yMin !== d < this.yMax;
-    };
-    e.prototype.unionInPlace = function(g) {
-      g.isEmpty() || (this.extendByPoint(g.xMin, g.yMin), this.extendByPoint(g.xMax, g.yMax));
-    };
-    e.prototype.extendByPoint = function(g, d) {
-      this.extendByX(g);
-      this.extendByY(d);
-    };
-    e.prototype.extendByX = function(g) {
-      134217728 === this.xMin ? this.xMin = this.xMax = g : (this.xMin = Math.min(this.xMin, g), this.xMax = Math.max(this.xMax, g));
-    };
-    e.prototype.extendByY = function(g) {
-      134217728 === this.yMin ? this.yMin = this.yMax = g : (this.yMin = Math.min(this.yMin, g), this.yMax = Math.max(this.yMax, g));
-    };
-    e.prototype.intersects = function(g) {
-      return this.contains(g._xMin, g._yMin) || this.contains(g._xMax, g._yMax);
-    };