merge mozilla-inbound to mozilla-central. r=merge a=merge
authorSebastian Hengst <archaeopteryx@coole-files.de>
Sat, 07 Oct 2017 10:45:11 +0200
changeset 384962 6b0491f83229a80462793c74825f79b1ec1d9cda
parent 384945 dde44491690467f0b59a942e5565ba5d3eed69de (current diff)
parent 384961 b22ab8df0170dbeb946d4fca26b9f5bd1d6fcf50 (diff)
child 384963 3e21585c633905cec19416b15b02178e36a7001d
child 384984 591f6b2788a91ee51338ae5f7c775dc88cebf303
child 385021 156942799371cfbd361b0adc6bf09c6b668f8df0
push id32636
push userarchaeopteryx@coole-files.de
push dateSat, 07 Oct 2017 08:46:47 +0000
treeherdermozilla-central@6b0491f83229 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge, merge
milestone58.0a1
first release with
nightly linux32
6b0491f83229 / 58.0a1 / 20171007100142 / files
nightly linux64
6b0491f83229 / 58.0a1 / 20171007100142 / files
nightly mac
6b0491f83229 / 58.0a1 / 20171007100142 / files
nightly win32
6b0491f83229 / 58.0a1 / 20171007100142 / files
nightly win64
6b0491f83229 / 58.0a1 / 20171007100142 / files
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
releases
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
merge mozilla-inbound to mozilla-central. r=merge a=merge MozReview-Commit-ID: JDCYKq7yKwb
dom/base/crashtests/crashtests.list
dom/base/nsDOMWindowUtils.cpp
dom/canvas/WebGLContext.cpp
dom/html/HTMLCanvasElement.cpp
dom/html/HTMLCanvasElement.h
dom/interfaces/base/nsIDOMWindowUtils.idl
dom/interfaces/html/moz.build
dom/interfaces/html/nsIDOMHTMLCanvasElement.idl
js/src/shell/js.cpp
third_party/speedometer/resources/todomvc/architecture-examples/angular/dist/inline.28efc571905d42a672b0.bundle.js
third_party/speedometer/resources/todomvc/architecture-examples/angular/dist/main.c82799edffc751aa6590.bundle.js
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/assets/todomvc.js
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/assets/vendor.css
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/assets/vendor.js
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/crossdomain.xml
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/index.html
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/robots.txt
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/.bowerrc
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/.editorconfig
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/.ember-cli
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/.gitignore
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/.jshintrc
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/.travis.yml
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/.watchmanconfig
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/README.md
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/app.js
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/components/todo-item.js
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/components/todo-list.js
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/controllers/active.js
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/controllers/application.js
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/controllers/completed.js
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/helpers/gt.js
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/helpers/pluralize.js
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/index.html
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/resolver.js
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/router.js
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/routes/application.js
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/services/memory.js
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/services/repo.js
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/templates/active.hbs
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/templates/application.hbs
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/templates/completed.hbs
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/templates/components/todo-item.hbs
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/templates/components/todo-list.hbs
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/templates/index.hbs
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/bower.json
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/config/environment.js
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/dist/assets/todomvc-7601ffca6150ed633f0f333fe76bfaf2.js
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/dist/assets/vendor-7b5c98520910afa58d74e05ec86cd873.css
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/dist/assets/vendor-820919567eb7bd4d9fac358a90a5aac4.js
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/dist/crossdomain.xml
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/dist/index.html
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/dist/robots.txt
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/ember-cli-build.js
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/package-lock.json
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/package.json
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/public/crossdomain.xml
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/public/robots.txt
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/testem.js
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/tests/helpers/destroy-app.js
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/tests/helpers/module-for-acceptance.js
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/tests/helpers/resolver.js
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/tests/helpers/start-app.js
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/tests/index.html
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/tests/test-helper.js
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/vendor/base.css
third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/vendor/index.css
third_party/speedometer/resources/todomvc/architecture-examples/react-redux/dist/static/css/main.f04a7319.css
third_party/speedometer/resources/todomvc/architecture-examples/react-redux/dist/static/css/main.f04a7319.css.map
third_party/speedometer/resources/todomvc/architecture-examples/react-redux/dist/static/js/main.69cd9655.js
third_party/speedometer/resources/todomvc/architecture-examples/react-redux/dist/static/js/main.69cd9655.js.map
third_party/speedometer/resources/todomvc/architecture-examples/vuejs-cli/dist/static/css/app.dca4292ab322c1e7d51534e72981032e.css
third_party/speedometer/resources/todomvc/architecture-examples/vuejs-cli/dist/static/css/app.dca4292ab322c1e7d51534e72981032e.css.map
third_party/speedometer/resources/todomvc/architecture-examples/vuejs-cli/dist/static/js/app.d6ed8935438f44e9843a.js
third_party/speedometer/resources/todomvc/architecture-examples/vuejs-cli/dist/static/js/app.d6ed8935438f44e9843a.js.map
third_party/speedometer/resources/todomvc/architecture-examples/vuejs-cli/dist/static/js/manifest.a307c7f9a5da5dc72bb5.js
third_party/speedometer/resources/todomvc/architecture-examples/vuejs-cli/dist/static/js/manifest.a307c7f9a5da5dc72bb5.js.map
third_party/speedometer/resources/todomvc/architecture-examples/vuejs-cli/dist/static/js/vendor.2e4e9e528664fa796d3a.js
third_party/speedometer/resources/todomvc/architecture-examples/vuejs-cli/dist/static/js/vendor.2e4e9e528664fa796d3a.js.map
third_party/speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/bundle.app.71bb1f671e4e65604d05.js
third_party/speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/bundle.app.71bb1f671e4e65604d05.js.map
third_party/speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/bundle.manifest.2102040c9a6e04cc046e.js
third_party/speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/bundle.manifest.2102040c9a6e04cc046e.js.map
third_party/speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/bundle.vendor.b16cc08e016d07886f5f.js
third_party/speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/bundle.vendor.b16cc08e016d07886f5f.js.map
third_party/speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/styles.app.71bb1f671e4e65604d05.css
third_party/speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/styles.app.71bb1f671e4e65604d05.css.map
third_party/speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/styles.vendor.b16cc08e016d07886f5f.css
third_party/speedometer/resources/todomvc/vanilla-examples/es2015-babel-webpack/dist/styles.vendor.b16cc08e016d07886f5f.css.map
third_party/speedometer/resources/todomvc/vanilla-examples/es2015/node_modules/todomvc-app-css/package.json
third_party/speedometer/resources/todomvc/vanilla-examples/es2015/node_modules/todomvc-app-css/readme.md
third_party/speedometer/resources/todomvc/vanilla-examples/es2015/node_modules/todomvc-common/package.json
third_party/speedometer/resources/todomvc/vanilla-examples/es2015/node_modules/todomvc-common/readme.md
widget/windows/TaskbarPreview.cpp
xpcom/reflect/xptinfo/ShimInterfaceInfo.cpp
--- a/.cron.yml
+++ b/.cron.yml
@@ -97,12 +97,18 @@ jobs:
           by-project:
               mozilla-central: [{hour: 10, minute: 0}]
               # No default
 
     - name: periodic-update
       job:
           type: decision-task
           treeherder-symbol: Nfile
-          target-tasks-method: nightly_file_update
+          target-tasks-method: file_update
       run-on-projects:
           - mozilla-central
-      when: []  # don't run for now due to unforeseen issues
+      when:
+          by-project:
+              # No default branch
+              mozilla-central:
+                  # Buildbot start time is 10:02am UTC, until we are able to
+                  # disable buildbot scheduling, use +12h
+                  - {hour: 22, minute: 0}
--- a/browser/extensions/pdfjs/README.mozilla
+++ b/browser/extensions/pdfjs/README.mozilla
@@ -1,5 +1,5 @@
 This is the PDF.js project output, https://github.com/mozilla/pdf.js
 
-Current extension version is: 1.9.607
+Current extension version is: 1.9.630
 
-Taken from upstream commit: b3f84112
+Taken from upstream commit: ec469673
--- a/browser/extensions/pdfjs/content/build/pdf.js
+++ b/browser/extensions/pdfjs/content/build/pdf.js
@@ -701,19 +701,16 @@ var Util = function UtilClosure() {
     if (orderedY[0] === rect1[1] && orderedY[1] === rect2[1] || orderedY[0] === rect2[1] && orderedY[1] === rect1[1]) {
       result[1] = orderedY[1];
       result[3] = orderedY[2];
     } else {
       return false;
     }
     return result;
   };
-  Util.sign = function Util_sign(num) {
-    return num < 0 ? -1 : 1;
-  };
   var ROMAN_NUMBER_MAP = ['', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM', '', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC', '', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX'];
   Util.toRoman = function Util_toRoman(number, lowerCase) {
     assert(Number.isInteger(number) && number > 0, 'The number should be a positive integer.');
     var pos,
         romanBuf = [];
     while (number >= 1000) {
       number -= 1000;
       romanBuf.push('M');
@@ -1988,17 +1985,17 @@ function getDocument(src, pdfDataRangeTr
     });
   }).catch(task._capability.reject);
   return task;
 }
 function _fetchDocument(worker, source, pdfDataRangeTransport, docId) {
   if (worker.destroyed) {
     return Promise.reject(new Error('Worker was destroyed'));
   }
-  let apiVersion = '1.9.607';
+  let apiVersion = '1.9.630';
   source.disableAutoFetch = (0, _dom_utils.getDefaultSetting)('disableAutoFetch');
   source.disableStream = (0, _dom_utils.getDefaultSetting)('disableStream');
   source.chunkedViewerLoading = !!pdfDataRangeTransport;
   if (pdfDataRangeTransport) {
     source.length = pdfDataRangeTransport.length;
     source.initialData = pdfDataRangeTransport.initialData;
   }
   return worker.messageHandler.sendWithPromise('GetDocRequest', {
@@ -3309,18 +3306,18 @@ var _UnsupportedManager = function Unsup
       for (var i = 0, ii = listeners.length; i < ii; i++) {
         listeners[i](featureId);
       }
     }
   };
 }();
 var version, build;
 {
-  exports.version = version = '1.9.607';
-  exports.build = build = 'b3f84112';
+  exports.version = version = '1.9.630';
+  exports.build = build = 'ec469673';
 }
 exports.getDocument = getDocument;
 exports.LoopbackPort = LoopbackPort;
 exports.PDFDataRangeTransport = PDFDataRangeTransport;
 exports.PDFWorker = PDFWorker;
 exports.PDFDocumentProxy = PDFDocumentProxy;
 exports.PDFPageProxy = PDFPageProxy;
 exports.setPDFNetworkStreamClass = setPDFNetworkStreamClass;
@@ -5049,18 +5046,18 @@ exports.SVGGraphics = SVGGraphics;
 
 /***/ }),
 /* 9 */
 /***/ (function(module, exports, __w_pdfjs_require__) {
 
 "use strict";
 
 
-var pdfjsVersion = '1.9.607';
-var pdfjsBuild = 'b3f84112';
+var pdfjsVersion = '1.9.630';
+var pdfjsBuild = 'ec469673';
 var pdfjsSharedUtil = __w_pdfjs_require__(0);
 var pdfjsDisplayGlobal = __w_pdfjs_require__(13);
 var pdfjsDisplayAPI = __w_pdfjs_require__(3);
 var pdfjsDisplayTextLayer = __w_pdfjs_require__(7);
 var pdfjsDisplayAnnotationLayer = __w_pdfjs_require__(6);
 var pdfjsDisplayDOMUtils = __w_pdfjs_require__(1);
 var pdfjsDisplaySVG = __w_pdfjs_require__(8);
 ;
@@ -8148,17 +8145,17 @@ if (isReadableStreamSupported) {
 /***/ (function(module, exports, __w_pdfjs_require__) {
 
 "use strict";
 
 
 Object.defineProperty(exports, "__esModule", {
   value: true
 });
-exports.PDFJS = exports.isWorker = exports.globalScope = undefined;
+exports.PDFJS = exports.globalScope = undefined;
 
 var _api = __w_pdfjs_require__(3);
 
 var _dom_utils = __w_pdfjs_require__(1);
 
 var _util = __w_pdfjs_require__(0);
 
 var _annotation_layer = __w_pdfjs_require__(6);
@@ -8170,24 +8167,23 @@ var _global_scope2 = _interopRequireDefa
 var _metadata = __w_pdfjs_require__(5);
 
 var _text_layer = __w_pdfjs_require__(7);
 
 var _svg = __w_pdfjs_require__(8);
 
 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
-var isWorker = typeof window === 'undefined';
 if (!_global_scope2.default.PDFJS) {
   _global_scope2.default.PDFJS = {};
 }
 var PDFJS = _global_scope2.default.PDFJS;
 {
-  PDFJS.version = '1.9.607';
-  PDFJS.build = 'b3f84112';
+  PDFJS.version = '1.9.630';
+  PDFJS.build = 'ec469673';
 }
 PDFJS.pdfBug = false;
 if (PDFJS.verbosity !== undefined) {
   (0, _util.setVerbosityLevel)(PDFJS.verbosity);
 }
 delete PDFJS.verbosity;
 Object.defineProperty(PDFJS, 'verbosity', {
   get() {
@@ -8255,17 +8251,16 @@ PDFJS.addLinkAttributes = _dom_utils.add
 PDFJS.getFilenameFromUrl = _dom_utils.getFilenameFromUrl;
 PDFJS.isExternalLinkTargetSet = _dom_utils.isExternalLinkTargetSet;
 PDFJS.AnnotationLayer = _annotation_layer.AnnotationLayer;
 PDFJS.renderTextLayer = _text_layer.renderTextLayer;
 PDFJS.Metadata = _metadata.Metadata;
 PDFJS.SVGGraphics = _svg.SVGGraphics;
 PDFJS.UnsupportedManager = _api._UnsupportedManager;
 exports.globalScope = _global_scope2.default;
-exports.isWorker = isWorker;
 exports.PDFJS = PDFJS;
 
 /***/ }),
 /* 14 */
 /***/ (function(module, exports, __w_pdfjs_require__) {
 
 "use strict";
 
--- a/browser/extensions/pdfjs/content/build/pdf.worker.js
+++ b/browser/extensions/pdfjs/content/build/pdf.worker.js
@@ -701,19 +701,16 @@ var Util = function UtilClosure() {
     if (orderedY[0] === rect1[1] && orderedY[1] === rect2[1] || orderedY[0] === rect2[1] && orderedY[1] === rect1[1]) {
       result[1] = orderedY[1];
       result[3] = orderedY[2];
     } else {
       return false;
     }
     return result;
   };
-  Util.sign = function Util_sign(num) {
-    return num < 0 ? -1 : 1;
-  };
   var ROMAN_NUMBER_MAP = ['', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM', '', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC', '', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX'];
   Util.toRoman = function Util_toRoman(number, lowerCase) {
     assert(Number.isInteger(number) && number > 0, 'The number should be a positive integer.');
     var pos,
         romanBuf = [];
     while (number >= 1000) {
       number -= 1000;
       romanBuf.push('M');
@@ -23821,18 +23818,18 @@ exports.PostScriptCompiler = PostScriptC
 
 /***/ }),
 /* 17 */
 /***/ (function(module, exports, __w_pdfjs_require__) {
 
 "use strict";
 
 
-var pdfjsVersion = '1.9.607';
-var pdfjsBuild = 'b3f84112';
+var pdfjsVersion = '1.9.630';
+var pdfjsBuild = 'ec469673';
 var pdfjsCoreWorker = __w_pdfjs_require__(18);
 exports.WorkerMessageHandler = pdfjsCoreWorker.WorkerMessageHandler;
 
 /***/ }),
 /* 18 */
 /***/ (function(module, exports, __w_pdfjs_require__) {
 
 "use strict";
@@ -24017,17 +24014,17 @@ var WorkerMessageHandler = {
     });
   },
   createDocumentHandler(docParams, port) {
     var pdfManager;
     var terminated = false;
     var cancelXHRs = null;
     var WorkerTasks = [];
     let apiVersion = docParams.apiVersion;
-    let workerVersion = '1.9.607';
+    let workerVersion = '1.9.630';
     if (apiVersion !== null && apiVersion !== workerVersion) {
       throw new Error(`The API version "${apiVersion}" does not match ` + `the Worker version "${workerVersion}".`);
     }
     var docId = docParams.docId;
     var docBaseUrl = docParams.docBaseUrl;
     var workerHandlerName = docParams.docId + '_worker';
     var handler = new _util.MessageHandler(workerHandlerName, docId, port);
     handler.postMessageTransfers = docParams.postMessageTransfers;
--- a/browser/extensions/pdfjs/content/web/viewer.js
+++ b/browser/extensions/pdfjs/content/web/viewer.js
@@ -4436,17 +4436,17 @@ class PDFHistory {
     let state = window.history.state;
     this.initialized = true;
     this.initialBookmark = null;
     this.initialRotation = null;
     this._popStateInProgress = false;
     this._blockHashChange = 0;
     this._currentHash = getCurrentHash();
     this._numPositionUpdates = 0;
-    this._currentUid = this._uid = 0;
+    this._uid = this._maxUid = 0;
     this._destination = null;
     this._position = null;
     if (!this._isValidState(state) || resetHistory) {
       let { hash, page, rotation } = parseCurrentHash(this.linkService);
       if (!hash || reInitialized || resetHistory) {
         this._pushOrReplaceState(null, true);
         return;
       }
@@ -4521,34 +4521,35 @@ class PDFHistory {
       window.history.back();
     }
   }
   forward() {
     if (!this.initialized || this._popStateInProgress) {
       return;
     }
     let state = window.history.state;
-    if (this._isValidState(state) && state.uid < this._uid - 1) {
+    if (this._isValidState(state) && state.uid < this._maxUid) {
       window.history.forward();
     }
   }
   get popStateInProgress() {
     return this.initialized && (this._popStateInProgress || this._blockHashChange > 0);
   }
   _pushOrReplaceState(destination, forceReplace = false) {
     let shouldReplace = forceReplace || !this._destination;
     let newState = {
       fingerprint: this.fingerprint,
-      uid: shouldReplace ? this._currentUid : this._uid,
+      uid: shouldReplace ? this._uid : this._uid + 1,
       destination
     };
     this._updateInternalState(destination, newState.uid);
     if (shouldReplace) {
       window.history.replaceState(newState, '');
     } else {
+      this._maxUid = this._uid;
       window.history.pushState(newState, '');
     }
   }
   _tryPushCurrentPosition(temporary = false) {
     if (!this._position) {
       return;
     }
     let position = this._position;
@@ -4598,18 +4599,17 @@ class PDFHistory {
     if (this._updateViewareaTimeout) {
       clearTimeout(this._updateViewareaTimeout);
       this._updateViewareaTimeout = null;
     }
     if (removeTemporary && destination && destination.temporary) {
       delete destination.temporary;
     }
     this._destination = destination;
-    this._currentUid = uid;
-    this._uid = this._currentUid + 1;
+    this._uid = uid;
     this._numPositionUpdates = 0;
   }
   _updateViewarea({ location }) {
     if (this._updateViewareaTimeout) {
       clearTimeout(this._updateViewareaTimeout);
       this._updateViewareaTimeout = null;
     }
     this._position = {
@@ -4633,17 +4633,17 @@ class PDFHistory {
       }, UPDATE_VIEWAREA_TIMEOUT);
     }
   }
   _popState({ state }) {
     let newHash = getCurrentHash(),
         hashChanged = this._currentHash !== newHash;
     this._currentHash = newHash;
     if (!state || false) {
-      this._currentUid = this._uid;
+      this._uid++;
       let { hash, page, rotation } = parseCurrentHash(this.linkService);
       this._pushOrReplaceState({
         hash,
         page,
         rotation
       }, true);
       return;
     }
new file mode 100644
--- /dev/null
+++ b/dom/base/crashtests/1405771.html
@@ -0,0 +1,20 @@
+<html>
+<head>
+<script></script>
+<!-- a -->
+<script>
+window.onload=function(){
+  let s=window.getSelection();
+  let r=document.createRange();
+  r.selectNode(document.getElementById('b'));
+  s.addRange(r);
+  try{window.getSelection().modify('extend','forward','word')}catch(e){}
+  let o=document.getElementById('a');
+  o.parentNode.replaceChild(document.createElement('col'), o);
+}
+</script>
+>
+<template id='a' contenteditable='true'></template>
+<header id='b'></header>
+<!-- a -->
+</html>
\ No newline at end of file
--- a/dom/base/crashtests/crashtests.list
+++ b/dom/base/crashtests/crashtests.list
@@ -222,9 +222,10 @@ skip-if(stylo&&isDebugBuild&&winWidget) 
 load xhr_empty_datauri.html
 load xhr_html_nullresponse.html
 load 1383478.html
 load 1383780.html
 pref(clipboard.autocopy,true) load 1385272-1.html
 load 1393806.html
 load 1400701.html
 load 1403377.html
+load 1405771.html
 load 1406109-1.html
--- a/dom/base/nsDOMWindowUtils.cpp
+++ b/dom/base/nsDOMWindowUtils.cpp
@@ -45,17 +45,16 @@
 #include "mozilla/MiscEvents.h"
 #include "mozilla/MouseEvents.h"
 #include "mozilla/TextEvents.h"
 #include "mozilla/TextEventDispatcher.h"
 #include "mozilla/TouchEvents.h"
 
 #include "nsViewManager.h"
 
-#include "nsIDOMHTMLCanvasElement.h"
 #include "nsLayoutUtils.h"
 #include "nsComputedDOMStyle.h"
 #include "nsIPresShell.h"
 #include "nsCSSProps.h"
 #include "nsTArrayHelpers.h"
 #include "nsIDocShell.h"
 #include "nsIContentViewer.h"
 #include "mozilla/StyleAnimationValue.h"
@@ -101,16 +100,17 @@
 #include "nsIContentIterator.h"
 #include "nsIDOMStyleSheet.h"
 #include "nsIStyleSheetService.h"
 #include "nsContentPermissionHelper.h"
 #include "nsCSSPseudoElements.h"            // for CSSPseudoElementType
 #include "nsNetUtil.h"
 #include "nsDocument.h"
 #include "HTMLImageElement.h"
+#include "HTMLCanvasElement.h"
 #include "mozilla/css/ImageLoader.h"
 #include "mozilla/layers/APZCTreeManager.h" // for layers::ZoomToRectBehavior
 #include "mozilla/dom/Promise.h"
 #include "mozilla/StyleSheetInlines.h"
 #include "mozilla/gfx/GPUProcessManager.h"
 #include "mozilla/dom/TimeoutManager.h"
 #include "mozilla/PreloadedStyleSheet.h"
 #include "mozilla/layers/WebRenderBridgeChild.h"
@@ -1619,46 +1619,48 @@ nsDOMWindowUtils::GetTranslationNodes(ns
     }
   }
 
   *aRetVal = list.forget().take();
   return NS_OK;
 }
 
 static already_AddRefed<DataSourceSurface>
-CanvasToDataSourceSurface(nsIDOMHTMLCanvasElement* aCanvas)
+CanvasToDataSourceSurface(HTMLCanvasElement* aCanvas)
 {
-  nsCOMPtr<nsINode> node = do_QueryInterface(aCanvas);
-  if (!node) {
-    return nullptr;
-  }
-
-  MOZ_ASSERT(node->IsElement(),
-             "An nsINode that implements nsIDOMHTMLCanvasElement should "
-             "be an element.");
+  MOZ_ASSERT(aCanvas);
   nsLayoutUtils::SurfaceFromElementResult result =
-    nsLayoutUtils::SurfaceFromElement(node->AsElement());
+    nsLayoutUtils::SurfaceFromElement(aCanvas);
 
   MOZ_ASSERT(result.GetSourceSurface());
   return result.GetSourceSurface()->GetDataSurface();
 }
 
 NS_IMETHODIMP
-nsDOMWindowUtils::CompareCanvases(nsIDOMHTMLCanvasElement *aCanvas1,
-                                  nsIDOMHTMLCanvasElement *aCanvas2,
+nsDOMWindowUtils::CompareCanvases(nsISupports *aCanvas1,
+                                  nsISupports *aCanvas2,
                                   uint32_t* aMaxDifference,
                                   uint32_t* retVal)
 {
   if (aCanvas1 == nullptr ||
       aCanvas2 == nullptr ||
       retVal == nullptr)
     return NS_ERROR_FAILURE;
 
-  RefPtr<DataSourceSurface> img1 = CanvasToDataSourceSurface(aCanvas1);
-  RefPtr<DataSourceSurface> img2 = CanvasToDataSourceSurface(aCanvas2);
+  nsCOMPtr<nsIContent> contentCanvas1 = do_QueryInterface(aCanvas1);
+  nsCOMPtr<nsIContent> contentCanvas2 = do_QueryInterface(aCanvas2);
+  auto canvas1 = HTMLCanvasElement::FromContentOrNull(contentCanvas1);
+  auto canvas2 = HTMLCanvasElement::FromContentOrNull(contentCanvas2);
+
+  if (!canvas1 || !canvas2) {
+    return NS_ERROR_FAILURE;
+  }
+
+  RefPtr<DataSourceSurface> img1 = CanvasToDataSourceSurface(canvas1);
+  RefPtr<DataSourceSurface> img2 = CanvasToDataSourceSurface(canvas2);
 
   DataSourceSurface::ScopedMap map1(img1, DataSourceSurface::READ);
   DataSourceSurface::ScopedMap map2(img2, DataSourceSurface::READ);
 
   if (img1 == nullptr || img2 == nullptr ||
       !map1.IsMapped() || !map2.IsMapped() ||
       img1->GetSize() != img2->GetSize() ||
       map1.GetStride() != map2.GetStride()) {
--- a/dom/base/nsRange.cpp
+++ b/dom/base/nsRange.cpp
@@ -942,16 +942,33 @@ nsRange::IntersectsNode(nsINode& aNode, 
 
   // Step 2.
   if (disconnected) {
     result = false;
   }
   return result;
 }
 
+void
+nsRange::NotifySelectionListenersAfterRangeSet()
+{
+  if (mSelection) {
+    // Our internal code should not move focus with using this instance while
+    // it's calling Selection::NotifySelectionListeners() which may move focus
+    // or calls selection listeners.  So, let's set mCalledByJS to false here
+    // since non-*JS() methods don't set it to false.
+    AutoCalledByJSRestore calledByJSRestorer(*this);
+    mCalledByJS = false;
+    // Be aware, this range may be modified or stop being a range for selection
+    // after this call.  Additionally, the selection instance may have gone.
+    RefPtr<Selection> selection = mSelection;
+    selection->NotifySelectionListeners(calledByJSRestorer.SavedValue());
+  }
+}
+
 /******************************************************
  * Private helper routines
  ******************************************************/
 
 // It's important that all setting of the range start/end points
 // go through this function, which will do all the right voodoo
 // for content notification of range ownership.
 // Calling DoSetRange with either parent argument null will collapse
@@ -1025,27 +1042,23 @@ nsRange::DoSetRange(const RawRangeBounda
   }
 
   // This needs to be the last thing this function does, other than notifying
   // selection listeners. See comment in ParentChainChanged.
   mRoot = aRoot;
 
   // Notify any selection listeners. This has to occur last because otherwise the world
   // could be observed by a selection listener while the range was in an invalid state.
+  // So we run it off of a script runner to ensure it runs after the mutation observers
+  // have finished running.
   if (mSelection) {
-    // Our internal code should not move focus with using this instance while
-    // it's calling Selection::NotifySelectionListeners() which may move focus
-    // or calls selection listeners.  So, let's set mCalledByJS to false here
-    // since non-*JS() methods don't set it to false.
-    AutoCalledByJSRestore calledByJSRestorer(*this);
-    mCalledByJS = false;
-    // Be aware, this range may be modified or stop being a range for selection
-    // after this call.  Additionally, the selection instance may have gone.
-    RefPtr<Selection> selection = mSelection;
-    selection->NotifySelectionListeners(calledByJSRestorer.SavedValue());
+    nsContentUtils::AddScriptRunner(NewRunnableMethod(
+                                    "NotifySelectionListenersAfterRangeSet",
+                                    this,
+                                    &nsRange::NotifySelectionListenersAfterRangeSet));
   }
 }
 
 static int32_t
 IndexOf(nsINode* aChild)
 {
   nsINode* parent = aChild->GetParentNode();
 
--- a/dom/base/nsRange.h
+++ b/dom/base/nsRange.h
@@ -422,16 +422,21 @@ public:
    * Otherwise, |this| will be modified so that it ends before the first
    * -moz-user-select:none node and additional ranges may also be created.
    * If all nodes in the range are -moz-user-select:none then aOutRanges
    * will be empty.
    * @param aOutRanges the resulting set of ranges
    */
   void ExcludeNonSelectableNodes(nsTArray<RefPtr<nsRange>>* aOutRanges);
 
+  /**
+   * Notify the selection listeners after a range has been modified.
+   */
+  void NotifySelectionListenersAfterRangeSet();
+
   typedef nsTHashtable<nsPtrHashKey<nsRange> > RangeHashTable;
 protected:
 
   void RegisterCommonAncestor(nsINode* aNode);
   void UnregisterCommonAncestor(nsINode* aNode, bool aIsUnlinking);
   nsINode* IsValidBoundary(nsINode* aNode) const
   {
     return ComputeRootNode(aNode, mMaySpanAnonymousSubtrees);
--- a/dom/canvas/WebGLContext.cpp
+++ b/dom/canvas/WebGLContext.cpp
@@ -1814,17 +1814,17 @@ WebGLContext::UpdateContextLossStatus()
         const auto kEventName = NS_LITERAL_STRING("webglcontextlost");
         const bool kCanBubble = true;
         const bool kIsCancelable = true;
         bool useDefaultHandler;
 
         if (mCanvasElement) {
             nsContentUtils::DispatchTrustedEvent(
                 mCanvasElement->OwnerDoc(),
-                static_cast<nsIDOMHTMLCanvasElement*>(mCanvasElement),
+                static_cast<nsIContent*>(mCanvasElement),
                 kEventName,
                 kCanBubble,
                 kIsCancelable,
                 &useDefaultHandler);
         } else {
             // OffscreenCanvas case
             RefPtr<Event> event = new Event(mOffscreenCanvas, nullptr, nullptr);
             event->InitEvent(kEventName, kCanBubble, kIsCancelable);
@@ -1882,17 +1882,17 @@ WebGLContext::UpdateContextLossStatus()
         }
 
         // Revival!
         mContextStatus = ContextNotLost;
 
         if (mCanvasElement) {
             nsContentUtils::DispatchTrustedEvent(
                 mCanvasElement->OwnerDoc(),
-                static_cast<nsIDOMHTMLCanvasElement*>(mCanvasElement),
+                static_cast<nsIContent*>(mCanvasElement),
                 NS_LITERAL_STRING("webglcontextrestored"),
                 true,
                 true);
         } else {
             RefPtr<Event> event = new Event(mOffscreenCanvas, nullptr, nullptr);
             event->InitEvent(NS_LITERAL_STRING("webglcontextrestored"), true, true);
             event->SetTrusted(true);
             bool unused;
--- a/dom/html/HTMLCanvasElement.cpp
+++ b/dom/html/HTMLCanvasElement.cpp
@@ -398,19 +398,17 @@ HTMLCanvasElement::~HTMLCanvasElement()
   }
 }
 
 NS_IMPL_CYCLE_COLLECTION_INHERITED(HTMLCanvasElement, nsGenericHTMLElement,
                                    mCurrentContext, mPrintCallback,
                                    mPrintState, mOriginalCanvas,
                                    mOffscreenCanvas)
 
-NS_IMPL_ISUPPORTS_CYCLE_COLLECTION_INHERITED(HTMLCanvasElement,
-                                             nsGenericHTMLElement,
-                                             nsIDOMHTMLCanvasElement)
+NS_IMPL_ISUPPORTS_CYCLE_COLLECTION_INHERITED_0(HTMLCanvasElement, nsGenericHTMLElement)
 
 NS_IMPL_ELEMENT_CLONE(HTMLCanvasElement)
 
 /* virtual */ JSObject*
 HTMLCanvasElement::WrapNode(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
 {
   return HTMLCanvasElementBinding::Wrap(aCx, this, aGivenProto);
 }
@@ -454,20 +452,16 @@ HTMLCanvasElement::GetWidthHeight()
 
   MOZ_ASSERT(size.width >= 0 && size.height >= 0,
              "we should've required <canvas> width/height attrs to be "
              "unsigned (non-negative) values");
 
   return size;
 }
 
-NS_IMPL_UINT_ATTR_DEFAULT_VALUE(HTMLCanvasElement, Width, width, DEFAULT_CANVAS_WIDTH)
-NS_IMPL_UINT_ATTR_DEFAULT_VALUE(HTMLCanvasElement, Height, height, DEFAULT_CANVAS_HEIGHT)
-NS_IMPL_BOOL_ATTR(HTMLCanvasElement, MozOpaque, moz_opaque)
-
 nsresult
 HTMLCanvasElement::AfterSetAttr(int32_t aNamespaceID, nsIAtom* aName,
                                 const nsAttrValue* aValue,
                                 const nsAttrValue* aOldValue, bool aNotify)
 {
   AfterMaybeChangeAttr(aNamespaceID, aName, aNotify);
 
   return nsGenericHTMLElement::AfterSetAttr(aNamespaceID, aName, aValue,
--- a/dom/html/HTMLCanvasElement.h
+++ b/dom/html/HTMLCanvasElement.h
@@ -4,17 +4,16 @@
  * 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/. */
 #if !defined(mozilla_dom_HTMLCanvasElement_h)
 #define mozilla_dom_HTMLCanvasElement_h
 
 #include "mozilla/Attributes.h"
 #include "mozilla/WeakPtr.h"
 #include "nsIDOMEventListener.h"
-#include "nsIDOMHTMLCanvasElement.h"
 #include "nsIObserver.h"
 #include "nsGenericHTMLElement.h"
 #include "nsGkAtoms.h"
 #include "nsSize.h"
 #include "nsError.h"
 
 #include "mozilla/dom/BindingDeclarations.h"
 #include "mozilla/dom/CanvasRenderingContextHelper.h"
@@ -111,17 +110,16 @@ public:
 
 protected:
   virtual ~FrameCaptureListener() {}
 
   bool mFrameCaptureRequested;
 };
 
 class HTMLCanvasElement final : public nsGenericHTMLElement,
-                                public nsIDOMHTMLCanvasElement,
                                 public CanvasRenderingContextHelper
 {
   enum {
     DEFAULT_CANVAS_WIDTH = 300,
     DEFAULT_CANVAS_HEIGHT = 150
   };
 
   typedef layers::AsyncCanvasRenderer AsyncCanvasRenderer;
@@ -133,19 +131,16 @@ class HTMLCanvasElement final : public n
 public:
   explicit HTMLCanvasElement(already_AddRefed<mozilla::dom::NodeInfo>& aNodeInfo);
 
   NS_IMPL_FROMCONTENT_HTML_WITH_TAG(HTMLCanvasElement, canvas)
 
   // nsISupports
   NS_DECL_ISUPPORTS_INHERITED
 
-  // nsIDOMHTMLCanvasElement
-  NS_DECL_NSIDOMHTMLCANVASELEMENT
-
   // CC
   NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(HTMLCanvasElement,
                                            nsGenericHTMLElement)
 
   // WebIDL
   uint32_t Height()
   {
     return GetUnsignedIntAttr(nsGkAtoms::height, DEFAULT_CANVAS_HEIGHT);
--- a/dom/interfaces/base/nsIDOMWindowUtils.idl
+++ b/dom/interfaces/base/nsIDOMWindowUtils.idl
@@ -29,17 +29,16 @@ native nscolor(nscolor);
 [ptr] native gfxContext(gfxContext);
 typedef unsigned long long nsViewID;
 
 interface nsIArray;
 interface nsICycleCollectorListener;
 interface nsIDOMNode;
 interface nsIDOMNodeList;
 interface nsIDOMElement;
-interface nsIDOMHTMLCanvasElement;
 interface nsIDOMEvent;
 interface nsIPreloadedStyleSheet;
 interface nsITransferable;
 interface nsIQueryContentEventResult;
 interface nsIDOMWindow;
 interface nsIFile;
 interface nsIDOMClientRect;
 interface nsIURI;
@@ -923,18 +922,18 @@ interface nsIDOMWindowUtils : nsISupport
 
   /**
    * Compare the two canvases, returning the number of differing pixels and
    * the maximum difference in a channel.  This will throw an error if
    * the dimensions of the two canvases are different.
    *
    * This method requires chrome privileges.
    */
-  uint32_t compareCanvases(in nsIDOMHTMLCanvasElement aCanvas1,
-                           in nsIDOMHTMLCanvasElement aCanvas2,
+  uint32_t compareCanvases(in nsISupports aCanvas1,
+                           in nsISupports aCanvas2,
                            out unsigned long aMaxDifference);
 
   /**
    * Returns true if a MozAfterPaint event has been queued but not yet
    * fired.
    */
   readonly attribute boolean isMozAfterPaintPending;
 
--- a/dom/interfaces/html/moz.build
+++ b/dom/interfaces/html/moz.build
@@ -4,17 +4,16 @@
 # 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/.
 
 with Files("**"):
     BUG_COMPONENT = ("Core", "DOM")
 
 XPIDL_SOURCES += [
     'nsIDOMHTMLBaseElement.idl',
-    'nsIDOMHTMLCanvasElement.idl',
     'nsIDOMHTMLCollection.idl',
     'nsIDOMHTMLDocument.idl',
     'nsIDOMHTMLElement.idl',
     'nsIDOMHTMLFormElement.idl',
     'nsIDOMHTMLHtmlElement.idl',
     'nsIDOMHTMLImageElement.idl',
     'nsIDOMHTMLInputElement.idl',
     'nsIDOMHTMLLinkElement.idl',
deleted file mode 100644
--- a/dom/interfaces/html/nsIDOMHTMLCanvasElement.idl
+++ /dev/null
@@ -1,29 +0,0 @@
-/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include "nsIDOMHTMLElement.idl"
-
-/**
- * The nsIDOMHTMLCanvasElement interface is the interface to a HTML
- * <canvas> element.
- *
- * For more information on this interface, please see
- * http://www.whatwg.org/specs/web-apps/current-work/#graphics
- *
- * @status UNDER_DEVELOPMENT
- */
-
-interface nsIDOMBlob;
-interface nsIVariant;
-interface nsIInputStreamCallback;
-
-[uuid(4e8f1316-b601-471d-8f44-3c650d91ee9b)]
-interface nsIDOMHTMLCanvasElement : nsISupports
-{
-  attribute unsigned long width;
-  attribute unsigned long height;
-  attribute boolean mozOpaque;
-};
-
--- a/dom/ipc/ContentChild.cpp
+++ b/dom/ipc/ContentChild.cpp
@@ -3030,21 +3030,26 @@ ContentChild::RecvShutdown()
 
   // Start a timer that will insure we quickly exit after a reasonable
   // period of time. Prevents shutdown hangs after our connection to the
   // parent closes.
   StartForceKillTimer();
 
 #if defined(MOZ_CRASHREPORTER)
   CrashReporter::AnnotateCrashReport(NS_LITERAL_CSTRING("IPCShutdownState"),
-                                     NS_LITERAL_CSTRING("SendFinishShutdown"));
-#endif
+                                     NS_LITERAL_CSTRING("SendFinishShutdown (sending)"));
+  bool sent = SendFinishShutdown();
+  CrashReporter::AnnotateCrashReport(NS_LITERAL_CSTRING("IPCShutdownState"),
+                                     sent ? NS_LITERAL_CSTRING("SendFinishShutdown (sent)")
+                                          : NS_LITERAL_CSTRING("SendFinishShutdown (failed)"));
+#else
   // Ignore errors here. If this fails, the parent will kill us after a
   // timeout.
   Unused << SendFinishShutdown();
+#endif
   return IPC_OK();
 }
 
 PBrowserOrId
 ContentChild::GetBrowserOrId(TabChild* aTabChild)
 {
   if (!aTabChild ||
     this == aTabChild->Manager()) {
--- a/js/src/builtin/Promise.cpp
+++ b/js/src/builtin/Promise.cpp
@@ -1047,18 +1047,22 @@ RejectMaybeWrappedPromise(JSContext *cx,
 // ES2016, 25.4.1.8.
 static MOZ_MUST_USE bool
 TriggerPromiseReactions(JSContext* cx, HandleValue reactionsVal, JS::PromiseState state,
                         HandleValue valueOrReason)
 {
     RootedObject reactions(cx, &reactionsVal.toObject());
     RootedObject reaction(cx);
 
-    if (reactions->is<PromiseReactionRecord>() || IsWrapper(reactions))
+    if (reactions->is<PromiseReactionRecord>() ||
+        IsWrapper(reactions) ||
+        JS_IsDeadWrapper(reactions))
+    {
         return EnqueuePromiseReactionJob(cx, reactions, valueOrReason, state);
+    }
 
     RootedNativeObject reactionsList(cx, &reactions->as<NativeObject>());
     size_t reactionsCount = reactionsList->getDenseInitializedLength();
     MOZ_ASSERT(reactionsCount > 1, "Reactions list should be created lazily");
 
     RootedValue reactionVal(cx);
     for (size_t i = 0; i < reactionsCount; i++) {
         reactionVal = reactionsList->getDenseElement(i);
--- a/js/src/jit-test/tests/basic/bug908915.js
+++ b/js/src/jit-test/tests/basic/bug908915.js
@@ -6,16 +6,17 @@ load(libdir + "immutable-prototype.js");
 os.file.redirect(null);
 
 var blacklist = {
     'quit': true,
     'crash': true,
     'readline': true,
     'terminate': true,
     'nestedShell': true,
+    'nukeAllCCWs': true,
 };
 
 function f(y) {}
 for each(let e in newGlobal()) {
     if (e.name in blacklist)
 	continue;
     print(e.name);
     try {
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/promise/bug1347984.js
@@ -0,0 +1,6 @@
+// |jit-test| error:dead object
+var g = newGlobal();
+var p = new Promise(() => {});
+g.Promise.prototype.then.call(p, () => void 0);
+g.eval("nukeAllCCWs()");
+resolvePromise(p, 9);
--- a/js/src/shell/js.cpp
+++ b/js/src/shell/js.cpp
@@ -5111,16 +5111,33 @@ NukeCCW(JSContext* cx, unsigned argc, Va
     }
 
     NukeCrossCompartmentWrapper(cx, &args[0].toObject());
     args.rval().setUndefined();
     return true;
 }
 
 static bool
+NukeAllCCWs(JSContext* cx, unsigned argc, Value* vp)
+{
+    CallArgs args = CallArgsFromVp(argc, vp);
+
+    if (args.length() != 0) {
+        JS_ReportErrorNumberASCII(cx, my_GetErrorMessage, nullptr, JSSMSG_INVALID_ARGS,
+                                  "nukeAllCCWs");
+        return false;
+    }
+
+    NukeCrossCompartmentWrappers(cx, AllCompartments(), cx->compartment(),
+                                 NukeWindowReferences, NukeAllReferences);
+    args.rval().setUndefined();
+    return true;
+}
+
+static bool
 GetMaxArgs(JSContext* cx, unsigned argc, Value* vp)
 {
     CallArgs args = CallArgsFromVp(argc, vp);
     args.rval().setInt32(ARGS_LENGTH_MAX);
     return true;
 }
 
 static bool
@@ -6617,16 +6634,20 @@ static const JSFunctionSpecWithHelp shel
 "         principals of ~0 subsumes all other principals. The absence of a\n"
 "         principal is treated as if its bits were 0xffff, for subsumption\n"
 "         purposes. If this property is omitted, supply no principal."),
 
     JS_FN_HELP("nukeCCW", NukeCCW, 1, 0,
 "nukeCCW(wrapper)",
 "  Nuke a CrossCompartmentWrapper, which turns it into a DeadProxyObject."),
 
+    JS_FN_HELP("nukeAllCCWs", NukeAllCCWs, 0, 0,
+"nukeAllCCWs()",
+"  Like nukeCCW, but for all CrossCompartmentWrappers targeting the current compartment."),
+
     JS_FN_HELP("createMappedArrayBuffer", CreateMappedArrayBuffer, 1, 0,
 "createMappedArrayBuffer(filename, [offset, [size]])",
 "  Create an array buffer that mmaps the given file."),
 
     JS_FN_HELP("addPromiseReactions", AddPromiseReactions, 3, 0,
 "addPromiseReactions(promise, onResolve, onReject)",
 "  Calls the JS::AddPromiseReactions JSAPI function with the given arguments."),
 
new file mode 100644
--- /dev/null
+++ b/layout/generic/crashtests/1001994.html
@@ -0,0 +1,14 @@
+<html class="reftest-paged"><body>
+
+<div style="position: fixed;">
+<ul style="position: sticky;">
+<span>
+mmmmmmm mmmm mmmmmm mmmmmmmmmmmmmmmmm mmmmm mmmmm mmmmmmmm mmmmmmmmmmmmmmm mmmm mmmmmm mmmmmmmmmmmmmmmmm mmmmm mmmmm mmmmmmmm mmmmmmmm
+mmmmmmm mmmm mmmmmm mmmmmmmmmmmmmmmmm mmmmm mmmmm mmmmmmmm mmmmmmmmmmmmmmm mmmm mmmmmm mmmmmmmmmmmmmmmmm mmmmm mmmmm mmmmmmmm mmmmmmmm
+mmmmmmm mmmm mmmmmm mmmmmmmmmmmmmmmmm mmmmm mmmmm mmmmmmmm mmmmmmmmmmmmmmm mmmm mmmmmm mmmmmmmmmmmmmmmmm mmmmm mmmmm mmmmmmmm mmmmmmmm
+mmmmmmm mmmm mmmmmm mmmmmmmmmmmmmmmmm mmmmm mmmmm mmmmmmmm mmmmmmmmmmmmmmm mmmm mmmmmm mmmmmmmmmmmmmmmmm mmmmm mmmmm mmmmmmmm mmmmmmmm
+mmmmmmm mmmm mmmmmm mmmmmmmmmmmmmmmmm mmmmm mmmmm mmmmmmmm mmmmmmmmmmmmmmm mmmm mmmmmm mmmmmmmmmmmmmmmmm mmmmm mmmmm mmmmmmmm mmmmmmmm
+mmmmmmm mmmm mmmmmm mmmmmmmmmmmmmmmmm mmmmm mmmmm mmmmmmmm mmmmmmmmmmmmmmm mmmm mmmmmm mmmmmmmmmmmmmmmmm mmmmm mmmmm mmmmmmmm mmmmmmmm
+<span style="position: sticky;">a
+
+</body></html>
new file mode 100644
--- /dev/null
+++ b/layout/generic/crashtests/743364.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html style="width: 1px;">
+<head>
+<style>
+p:first-letter { }
+</style>
+<script>
+function boom()
+{
+  var p = document.querySelector("p");
+  document.documentElement.offsetHeight;
+  p.style.direction = "ltr";
+  document.documentElement.offsetHeight;
+  p.style.letterSpacing = "-56px";
+  document.documentElement.offsetHeight;
+}
+</script>
+</head>
+<body onload="boom();">
+<p style="direction: rtl; -moz-column-count: 3; white-space: pre-line;">x y
+
+</p>
+</body>
+</html>
--- a/layout/generic/crashtests/crashtests.list
+++ b/layout/generic/crashtests/crashtests.list
@@ -477,16 +477,17 @@ load 724235.html
 skip-if(Android&&isDebugBuild) load 724978.xhtml # bug 1263300 - slow
 skip-if(Android&&isDebugBuild) load 730559.html # bug 1245634 - slow
 load 734777.html
 load 737313-1.html
 load 737313-2.html
 load 737313-3.html
 test-pref(font.size.inflation.emPerLine,15) load 740199-1.xhtml
 test-pref(font.size.inflation.emPerLine,15) load 742602.html
+load 743364.html
 load 747688.html
 load 750066.html
 load 757413.xhtml
 load 757413-2.html
 load 762764-1.html
 load 762902.html
 load 765409.html
 asserts(0-200) load 765621.html # bug 703550
@@ -564,16 +565,17 @@ load 947158.html
 load 949932.html
 asserts-if(Android,0-1) load 964078.html # bug 989718
 load 970710.html
 load 973701-1.xhtml
 load 973701-2.xhtml
 load 986899.html
 load 1001233.html
 load 1001258-1.html
+load 1001994.html
 load 1003441.xul
 pref(layout.css.grid.enabled,true) load 1015562.html
 asserts(1-2) load 1015563-1.html
 asserts(1-2) load 1015563-2.html
 asserts(543) load 1015844.html # bug 574889, bug 1374479
 pref(font.size.inflation.minTwips,200) load 1032450.html
 load 1032613-1.svg
 load 1032613-2.html
@@ -656,9 +658,9 @@ load 1349650.html
 asserts-if(browserIsRemote,0-5) load 1349816-1.html # bug 1350352
 load 1364361-1.html
 load 1367413-1.html
 load 1368617-1.html
 load 1373586.html
 load 1401420-1.html
 load 1401709.html
 load 1401807.html
-asserts(11) load 1405443.html # bug 1405443
+load 1405443.html
--- a/layout/generic/nsBlockReflowContext.cpp
+++ b/layout/generic/nsBlockReflowContext.cpp
@@ -325,33 +325,30 @@ nsBlockReflowContext::ReflowBlock(const 
     }
   }
 #endif
 
   if (!mFrame->HasOverflowAreas()) {
     mMetrics.SetOverflowAreasToDesiredBounds();
   }
 
-  if (!aFrameReflowStatus.IsInlineBreakBefore() ||
-      (mFrame->GetStateBits() & NS_FRAME_OUT_OF_FLOW)) {
+  if (!aFrameReflowStatus.IsInlineBreakBefore() &&
+      aFrameReflowStatus.IsFullyComplete()) {
     // If frame is complete and has a next-in-flow, we need to delete
     // them now. Do not do this when a break-before is signaled because
-    // the frame is going to get reflowed again (and may end up wanting
-    // a next-in-flow where it ends up), unless it is an out of flow frame.
-    if (aFrameReflowStatus.IsFullyComplete()) {
-      nsIFrame* kidNextInFlow = mFrame->GetNextInFlow();
-      if (nullptr != kidNextInFlow) {
-        // Remove all of the childs next-in-flows. Make sure that we ask
-        // the right parent to do the removal (it's possible that the
-        // parent is not this because we are executing pullup code).
-        // Floats will eventually be removed via nsBlockFrame::RemoveFloat
-        // which detaches the placeholder from the float.
-        nsOverflowContinuationTracker::AutoFinish fini(aState.mOverflowTracker, mFrame);
-        kidNextInFlow->GetParent()->DeleteNextInFlowChild(kidNextInFlow, true);
-      }
+    // the frame is going to get reflowed again (whether the frame is
+    // (in)complete is undefined in that case anyway).
+    if (nsIFrame* kidNextInFlow = mFrame->GetNextInFlow()) {
+      // Remove all of the childs next-in-flows. Make sure that we ask
+      // the right parent to do the removal (it's possible that the
+      // parent is not this because we are executing pullup code).
+      // Floats will eventually be removed via nsBlockFrame::RemoveFloat
+      // which detaches the placeholder from the float.
+      nsOverflowContinuationTracker::AutoFinish fini(aState.mOverflowTracker, mFrame);
+      kidNextInFlow->GetParent()->DeleteNextInFlowChild(kidNextInFlow, true);
     }
   }
 }
 
 /**
  * Attempt to place the block frame within the available space.  If
  * it fits, apply inline-dir ("horizontal") positioning (CSS 10.3.3),
  * collapse margins (CSS2 8.3.1). Also apply relative positioning.
--- a/layout/generic/nsInlineFrame.cpp
+++ b/layout/generic/nsInlineFrame.cpp
@@ -1010,23 +1010,16 @@ nsInlineFrame::UpdateStyleOfOwnedAnonBox
     // We don't want to just walk through using GetNextContinuationWithSameStyle
     // here, because we want to set updated style contexts on both our
     // ib-sibling blocks and inlines.
     for (nsIFrame* cont = blockFrame; cont; cont = cont->GetNextContinuation()) {
       cont->SetStyleContext(newContext);
     }
 
     nsIFrame* nextInline = blockFrame->GetProperty(nsIFrame::IBSplitSibling());
-
-    // This check is here due to bug 1405443.  Please remove it once
-    // that bug is fixed.
-    if (!nextInline) {
-      break;
-    }
-
     MOZ_ASSERT(nextInline, "There is always a trailing inline in an IB split");
 
     for (nsIFrame* cont = nextInline; cont; cont = cont->GetNextContinuation()) {
       cont->SetStyleContext(ourStyle);
     }
     blockFrame = nextInline->GetProperty(nsIFrame::IBSplitSibling());
   }
 }
new file mode 100644
--- /dev/null
+++ b/layout/reftests/css-break/1405443-ref.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<style>
+  #block { page-break-inside: avoid; }
+  span { padding-left: 1px; }
+  #columns { columns: 0px; column-gap: 0; )
+</style>
+<body>
+  There word 'Hello' should appear below.
+  <div id="columns">
+    H
+    <div id="block">
+      <span> <!-- Just need an inline with nonzero width -->
+        <div style="padding-left: 1ch">&nbsp;ello</div>
+      </span>
+    </div>
+  </div>
+</body>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/css-break/1405443.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<style>
+  #float { page-break-inside: avoid; float: left }
+  span { padding-left: 1px; }
+  #columns { columns: 0px; column-gap: 0; )
+</style>
+<body>
+  There word 'Hello' should appear below.
+  <div id="columns">
+    H
+    <div id="float">
+      <span> <!-- Just need an inline with nonzero width -->
+        <div style="padding-left: 1ch">&nbsp;ello</div>
+      </span>
+    </div>
+  </div>
+</body>
--- a/layout/reftests/css-break/reftest.list
+++ b/layout/reftests/css-break/reftest.list
@@ -6,8 +6,9 @@ fuzzy(45,460) fuzzy-if(skiaContent,57,43
 random-if(!gtkWidget) HTTP(..) == box-decoration-break-border-image.html box-decoration-break-border-image-ref.html
 == box-decoration-break-block-border-padding.html box-decoration-break-block-border-padding-ref.html
 == box-decoration-break-block-margin.html box-decoration-break-block-margin-ref.html
 fuzzy-if(!Android,1,62) fuzzy-if(Android,8,6627) == box-decoration-break-first-letter.html box-decoration-break-first-letter-ref.html #Bug 1313773
 == box-decoration-break-with-bidi.html box-decoration-break-with-bidi-ref.html
 == box-decoration-break-bug-1235152.html box-decoration-break-bug-1235152-ref.html
 == box-decoration-break-bug-1249913.html box-decoration-break-bug-1249913-ref.html
 == vertical-wm-001.html vertical-wm-001-ref.html
+random-if(Android) == 1405443.html 1405443-ref.html
new file mode 100644
--- /dev/null
+++ b/layout/tables/crashtests/1144641.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<html>
+<!-- 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/.  -->
+  <head>
+    <style>
+      body { writing-mode:vertical-lr; }
+      #el0 {
+        height: 200px ! important;
+        height: 1em;
+        width: 1em;
+        padding: 5px;
+        display: table;
+        -moz-transform:translate3d(0, 80px, 0);
+      } 
+      #el0:before {
+        display: -moz-grid;
+        content: counter(c, hiragana) attr(id);
+        counter-increment: c 694;
+      } 
+      #el0:after {
+        counter-reset: c 694;
+        content: counter(c, cjk-ideographic) attr(id);
+      } 
+      #el1 {
+        text-shadow: 0px 20px 0px, 0px -20px 10px;
+        line-height: 4px;
+        transform: translate3d(0px, -300px, 0px);
+        display: table-row-group;
+        border-spacing: 7px;
+      } 
+      #el1:after {
+        counter-reset: c;
+        display: -moz-box;
+        content: counter(c, cjk-ideographic) attr(id);
+        counter-increment: c 694;
+      }
+      #el2 {
+        display: table-row-group;
+        -moz-transform:translate3d(0, 80px, 0); 
+      }
+      #el2:after {
+        content: counter(c, cjk-ideographic) attr(id);
+      } 
+    </style>
+    <script>
+      onload = function() {
+        el0=document.createElement('div')
+        el0.setAttribute('id','el0')
+        document.body.appendChild(el0)
+        el1=document.createElement('div')
+        el1.setAttribute('id','el1')
+        el0.appendChild(el1)
+        el2=document.createElement('q')
+        el2.setAttribute('id','el2')
+        el1.appendChild(el2)
+        el0.appendChild(document.createTextNode('A'))
+        setTimeout("location.reload()", 100)
+      }
+    </script>
+  </head>
+  <body>
+  </body>
+</html>
--- a/layout/tables/crashtests/crashtests.list
+++ b/layout/tables/crashtests/crashtests.list
@@ -149,12 +149,13 @@ load 707622-1.html
 load 710098-1.html
 load 711864-1.html
 load 759249-1.html
 load 759249-2.html
 load 814713.html
 load 980223.html
 load 1027611-1.html
 load 1031934.html
+load 1144641.html
 load 1183896.html
 load 1223282.html
 load 1223232.html
 load 1243623-1.html
--- a/layout/tools/reftest/reftest.jsm
+++ b/layout/tools/reftest/reftest.jsm
@@ -549,54 +549,58 @@ function StartTests()
             var filter = manifests[manifestURL] ? new RegExp(manifests[manifestURL]) : null;
             ReadTopManifest(manifestURL, [globalFilter, filter, false]);
         });
         BuildUseCounts();
 
         // Filter tests which will be skipped to get a more even distribution when chunking
         // tURLs is a temporary array containing all active tests
         var tURLs = new Array();
-        var tIDs = new Array();
         for (var i = 0; i < gURLs.length; ++i) {
             if (gURLs[i].expected == EXPECTED_DEATH)
                 continue;
 
             if (gURLs[i].needsFocus && !Focus())
                 continue;
 
             if (gURLs[i].slow && !gRunSlowTests)
                 continue;
 
             tURLs.push(gURLs[i]);
-            tIDs.push(gURLs[i].identifier);
         }
 
-        if (gStartAfter === undefined && !gSuiteStarted) {
-            logger.suiteStart(tIDs, {"skipped": gURLs.length - tURLs.length});
-            gSuiteStarted = true
-        }
+        var numActiveTests = tURLs.length;
 
         if (gTotalChunks > 0 && gThisChunk > 0) {
             // Calculate start and end indices of this chunk if tURLs array were
             // divided evenly
             var testsPerChunk = tURLs.length / gTotalChunks;
             var start = Math.round((gThisChunk-1) * testsPerChunk);
             var end = Math.round(gThisChunk * testsPerChunk);
+            numActiveTests = end - start;
 
             // Map these indices onto the gURLs array. This avoids modifying the
             // gURLs array which prevents skipped tests from showing up in the log
             start = gThisChunk == 1 ? 0 : gURLs.indexOf(tURLs[start]);
             end = gThisChunk == gTotalChunks ? gURLs.length : gURLs.indexOf(tURLs[end + 1]) - 1;
 
             logger.info("Running chunk " + gThisChunk + " out of " + gTotalChunks + " chunks.  " +
                 "tests " + (start+1) + "-" + end + "/" + gURLs.length);
 
             gURLs = gURLs.slice(start, end);
         }
 
+        if (gStartAfter === undefined && !gSuiteStarted) {
+            var ids = gURLs.map(function(obj) {
+                return obj.identifier;
+            });
+            logger.suiteStart(ids, {"skipped": gURLs.length - numActiveTests});
+            gSuiteStarted = true
+        }
+
         if (gShuffle) {
             if (gStartAfter !== undefined) {
                 logger.error("Can't resume from a crashed test when " +
                              "--shuffle is enabled, continue by shuffling " +
                              "all the tests");
                 DoneTests();
                 return;
             }
--- a/mobile/android/base/java/org/mozilla/gecko/customtabs/CustomTabsActivity.java
+++ b/mobile/android/base/java/org/mozilla/gecko/customtabs/CustomTabsActivity.java
@@ -33,18 +33,20 @@ import android.view.View;
 import android.widget.ListView;
 import android.widget.ProgressBar;
 
 import org.mozilla.gecko.ActivityHandlerHelper;
 import org.mozilla.gecko.BrowserApp;
 import org.mozilla.gecko.DoorHangerPopup;
 import org.mozilla.gecko.EventDispatcher;
 import org.mozilla.gecko.FormAssistPopup;
+import org.mozilla.gecko.GeckoSharedPrefs;
 import org.mozilla.gecko.GeckoView;
 import org.mozilla.gecko.GeckoViewSettings;
+import org.mozilla.gecko.preferences.GeckoPreferences;
 import org.mozilla.gecko.R;
 import org.mozilla.gecko.SnackbarBuilder;
 import org.mozilla.gecko.Telemetry;
 import org.mozilla.gecko.TelemetryContract;
 import org.mozilla.gecko.menu.GeckoMenu;
 import org.mozilla.gecko.menu.GeckoMenuInflater;
 import org.mozilla.gecko.mozglue.SafeIntent;
 import org.mozilla.gecko.permissions.Permissions;
@@ -132,16 +134,20 @@ public class CustomTabsActivity extends 
         mFormAssistPopup = (FormAssistPopup) findViewById(R.id.form_assist_popup);
         mFormAssistPopup.create(mGeckoView);
 
         mTextSelection = TextSelection.Factory.create(mGeckoView, this);
         mTextSelection.create();
 
         final GeckoViewSettings settings = mGeckoView.getSettings();
         settings.setBoolean(GeckoViewSettings.USE_MULTIPROCESS, false);
+        settings.setBoolean(
+            GeckoViewSettings.USE_REMOTE_DEBUGGER,
+            GeckoSharedPrefs.forApp(this).getBoolean(
+                GeckoPreferences.PREFS_DEVTOOLS_REMOTE_USB_ENABLED, false));
 
         if (intent != null && !TextUtils.isEmpty(intent.getDataString())) {
             mGeckoView.loadUri(intent.getDataString());
         } else {
             Log.w(LOGTAG, "No intend found for custom tab");
             finish();
         }
     }
--- a/mobile/android/base/java/org/mozilla/gecko/preferences/GeckoPreferences.java
+++ b/mobile/android/base/java/org/mozilla/gecko/preferences/GeckoPreferences.java
@@ -125,18 +125,18 @@ public class GeckoPreferences
     private static final String PREFS_CRASHREPORTER_ENABLED = "datareporting.crashreporter.submitEnabled";
     private static final String PREFS_MENU_CHAR_ENCODING = "browser.menu.showCharacterEncoding";
     private static final String PREFS_MP_ENABLED = "privacy.masterpassword.enabled";
     private static final String PREFS_UPDATER_AUTODOWNLOAD = "app.update.autodownload";
     private static final String PREFS_UPDATER_URL = "app.update.url.android";
     private static final String PREFS_GEO_REPORTING = NON_PREF_PREFIX + "app.geo.reportdata";
     private static final String PREFS_GEO_LEARN_MORE = NON_PREF_PREFIX + "geo.learn_more";
     private static final String PREFS_HEALTHREPORT_LINK = NON_PREF_PREFIX + "healthreport.link";
-    private static final String PREFS_DEVTOOLS_REMOTE_USB_ENABLED = "devtools.remote.usb.enabled";
-    private static final String PREFS_DEVTOOLS_REMOTE_WIFI_ENABLED = "devtools.remote.wifi.enabled";
+    public static final String PREFS_DEVTOOLS_REMOTE_USB_ENABLED = "devtools.remote.usb.enabled";
+    public static final String PREFS_DEVTOOLS_REMOTE_WIFI_ENABLED = "devtools.remote.wifi.enabled";
     private static final String PREFS_DEVTOOLS_REMOTE_LINK = NON_PREF_PREFIX + "remote_debugging.link";
     public static final String PREFS_VOICE_INPUT_ENABLED = NON_PREF_PREFIX + "voice_input_enabled";
     public static final String PREFS_QRCODE_ENABLED = NON_PREF_PREFIX + "qrcode_enabled";
     private static final String PREFS_TRACKING_PROTECTION_LEARN_MORE = NON_PREF_PREFIX + "trackingprotection.learn_more";
     private static final String PREFS_CLEAR_PRIVATE_DATA = NON_PREF_PREFIX + "privacy.clear";
     private static final String PREFS_CLEAR_PRIVATE_DATA_EXIT = NON_PREF_PREFIX + "history.clear_on_exit";
     private static final String PREFS_SCREEN_ADVANCED = NON_PREF_PREFIX + "advanced_screen";
     public static final String PREFS_HOMEPAGE = NON_PREF_PREFIX + "homepage";
--- a/mobile/android/base/java/org/mozilla/gecko/webapps/WebAppActivity.java
+++ b/mobile/android/base/java/org/mozilla/gecko/webapps/WebAppActivity.java
@@ -27,18 +27,20 @@ import android.view.View;
 import android.view.Window;
 import android.view.WindowManager;
 import android.widget.TextView;
 
 import org.mozilla.gecko.ActivityHandlerHelper;
 import org.mozilla.gecko.AppConstants;
 import org.mozilla.gecko.DoorHangerPopup;
 import org.mozilla.gecko.GeckoScreenOrientation;
+import org.mozilla.gecko.GeckoSharedPrefs;
 import org.mozilla.gecko.GeckoView;
 import org.mozilla.gecko.GeckoViewSettings;
+import org.mozilla.gecko.preferences.GeckoPreferences;
 import org.mozilla.gecko.R;
 import org.mozilla.gecko.customtabs.CustomTabsActivity;
 import org.mozilla.gecko.permissions.Permissions;
 import org.mozilla.gecko.prompts.PromptService;
 import org.mozilla.gecko.text.TextSelection;
 import org.mozilla.gecko.util.ActivityUtils;
 import org.mozilla.gecko.util.ColorUtil;
 import org.mozilla.gecko.widget.ActionModePresenter;
@@ -100,16 +102,20 @@ public class WebAppActivity extends AppC
         mPromptService = new PromptService(this, mGeckoView.getEventDispatcher());
         mDoorHangerPopup = new DoorHangerPopup(this, mGeckoView.getEventDispatcher());
 
         mTextSelection = TextSelection.Factory.create(mGeckoView, this);
         mTextSelection.create();
 
         final GeckoViewSettings settings = mGeckoView.getSettings();
         settings.setBoolean(GeckoViewSettings.USE_MULTIPROCESS, false);
+        settings.setBoolean(
+            GeckoViewSettings.USE_REMOTE_DEBUGGER,
+            GeckoSharedPrefs.forApp(this).getBoolean(
+                GeckoPreferences.PREFS_DEVTOOLS_REMOTE_USB_ENABLED, false));
 
         mManifest = WebAppManifest.fromFile(getIntent().getStringExtra(MANIFEST_URL),
                                             getIntent().getStringExtra(MANIFEST_PATH));
 
         updateFromManifest();
 
         mGeckoView.loadUri(mManifest.getStartUri().toString());
 
--- a/taskcluster/taskgraph/target_tasks.py
+++ b/taskcluster/taskgraph/target_tasks.py
@@ -385,16 +385,16 @@ def target_tasks_nightly_desktop(full_ta
 def target_tasks_dmd(full_task_graph, parameters):
     """Target DMD that run nightly on the m-c branch."""
     def filter(task):
         platform = task.attributes.get('build_platform', '')
         return platform.endswith('-dmd')
     return [l for l, t in full_task_graph.tasks.iteritems() if filter(t)]
 
 
-@_target_task('nightly_file_update')
+@_target_task('file_update')
 def target_tasks_file_update(full_task_graph, parameters):
     """Select the set of tasks required to perform nightly in-tree file updates
     """
     def filter(task):
         # For now any task in the repo-update kind is ok
-        return task.kind not in ['repo-update']
+        return task.kind in ['repo-update']
     return [l for l, t in full_task_graph.tasks.iteritems() if filter(t)]
--- a/testing/web-platform/mozilla/meta/MANIFEST.json
+++ b/testing/web-platform/mozilla/meta/MANIFEST.json
@@ -3,16 +3,31 @@
   "reftest": {},
   "reftest_node": {},
   "support": {
    "./placeholder": [
     [
      {}
     ]
    ],
+   "dom/throttling/resources/test.html": [
+    [
+     {}
+    ]
+   ],
+   "dom/throttling/resources/throttling.js": [
+    [
+     {}
+    ]
+   ],
+   "dom/throttling/resources/ws.sub.js": [
+    [
+     {}
+    ]
+   ],
    "fetch/api/redirect/redirect-referrer-mixed-content.js": [
     [
      {}
     ]
    ],
    "focus/Selection_addRange_into_iframe_iframe.html": [
     [
      {}
@@ -401,16 +416,64 @@
   },
   "testharness": {
    "dom/classList.html": [
     [
      "/_mozilla/dom/classList.html",
      {}
     ]
    ],
+   "dom/throttling/throttling-1.window.js": [
+    [
+     "/_mozilla/dom/throttling/throttling-1.window.html",
+     {}
+    ]
+   ],
+   "dom/throttling/throttling-2.window.js": [
+    [
+     "/_mozilla/dom/throttling/throttling-2.window.html",
+     {}
+    ]
+   ],
+   "dom/throttling/throttling-3.window.js": [
+    [
+     "/_mozilla/dom/throttling/throttling-3.window.html",
+     {}
+    ]
+   ],
+   "dom/throttling/throttling-4.window.js": [
+    [
+     "/_mozilla/dom/throttling/throttling-4.window.html",
+     {}
+    ]
+   ],
+   "dom/throttling/throttling-indexeddb.window.js": [
+    [
+     "/_mozilla/dom/throttling/throttling-indexeddb.window.html",
+     {}
+    ]
+   ],
+   "dom/throttling/throttling-webaudio.window.js": [
+    [
+     "/_mozilla/dom/throttling/throttling-webaudio.window.html",
+     {}
+    ]
+   ],
+   "dom/throttling/throttling-webrtc.window.js": [
+    [
+     "/_mozilla/dom/throttling/throttling-webrtc.window.html",
+     {}
+    ]
+   ],
+   "dom/throttling/throttling-ws.window.js": [
+    [
+     "/_mozilla/dom/throttling/throttling-ws.window.html",
+     {}
+    ]
+   ],
    "fetch/api/redirect/redirect-referrer.https.html": [
     [
      "/_mozilla/fetch/api/redirect/redirect-referrer.https.html",
      {}
     ]
    ],
    "focus/Range_collapse.html": [
     [
@@ -910,16 +973,60 @@
   "./placeholder": [
    "74e16eb87ecdfeb2dfc28f36e0c73a584abdf9c2",
    "support"
   ],
   "dom/classList.html": [
    "f289334e7b3486259b9aae54b4282a7211b8813e",
    "testharness"
   ],
+  "dom/throttling/resources/test.html": [
+   "15bf447545bf4ccd8b6a71d5d2cf2e5bba303293",
+   "support"
+  ],
+  "dom/throttling/resources/throttling.js": [
+   "2dc138ec9298d31711bc33fc47af12da1f64c4ce",
+   "support"
+  ],
+  "dom/throttling/resources/ws.sub.js": [
+   "66306649fb96efc2d5f13c566fac3da18339bc38",
+   "support"
+  ],
+  "dom/throttling/throttling-1.window.js": [
+   "609c0d54b0aaf81b28a590217abde69c5e23f168",
+   "testharness"
+  ],
+  "dom/throttling/throttling-2.window.js": [
+   "1c6900b823d95ee84791fb04eeae8b61311f5c58",
+   "testharness"
+  ],
+  "dom/throttling/throttling-3.window.js": [
+   "a9b4b0ade8a22eae9c804735513d89370311d471",
+   "testharness"
+  ],
+  "dom/throttling/throttling-4.window.js": [
+   "aeabd55bbb829c92d69bfc44f5e6fe3ad3105a84",
+   "testharness"
+  ],
+  "dom/throttling/throttling-indexeddb.window.js": [
+   "275a900b501e54cadc5ca224240489ad27464081",
+   "testharness"
+  ],
+  "dom/throttling/throttling-webaudio.window.js": [
+   "fd5cd3bd05b749e871e5a3e746e2cfc10a48d794",
+   "testharness"
+  ],
+  "dom/throttling/throttling-webrtc.window.js": [
+   "1d832a4e14ad10c5a2143c6b0d7f5cad2c29bdcd",
+   "testharness"
+  ],
+  "dom/throttling/throttling-ws.window.js": [
+   "df9b37384c42984fe80ea8a35164089f977268b0",
+   "testharness"
+  ],
   "fetch/api/redirect/redirect-referrer-mixed-content.js": [
    "f9d7ec9cf9fa8c847e45664b05482e3f8c191385",
    "support"
   ],
   "fetch/api/redirect/redirect-referrer.https.html": [
    "99cbd16b78771f35e075e4012d8dbc5dce3209c0",
    "testharness"
   ],
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/mozilla/meta/dom/throttling/__dir__.ini
@@ -0,0 +1,5 @@
+prefs: [dom.timeout.enable_budget_timer_throttling: true,
+        dom.timeout.foreground_budget_regeneration_rate: 100,
+        dom.timeout.foreground_throttling_max_budget: 10,
+        dom.timeout.budget_throttling_max_delay: 2000,
+        dom.timeout.throttling_delay: 1]
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/mozilla/meta/dom/throttling/throttling-1.window.js.ini
@@ -0,0 +1,4 @@
+[throttling-1.window.html]
+  type: testharness
+  disabled:
+    if debug: "disabled"
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/mozilla/meta/dom/throttling/throttling-2.window.js.ini
@@ -0,0 +1,4 @@
+[throttling-2.window.html]
+  type: testharness
+  disabled:
+    if debug: "disabled"
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/mozilla/meta/dom/throttling/throttling-3.window.js.ini
@@ -0,0 +1,4 @@
+[throttling-3.window.html]
+  type: testharness
+  disabled:
+    if debug: "disabled"
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/mozilla/meta/dom/throttling/throttling-4.window.js.ini
@@ -0,0 +1,4 @@
+[throttling-4.window.html]
+  type: testharness
+  disabled:
+    if debug: "disabled"
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/mozilla/meta/dom/throttling/throttling-indexeddb.window.js.ini
@@ -0,0 +1,4 @@
+[throttling-indexeddb.window.html]
+  type: testharness
+  disabled:
+    if debug: "disabled"
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/mozilla/meta/dom/throttling/throttling-webaudio.window.js.ini
@@ -0,0 +1,4 @@
+[throttling-webaudio.window.html]
+  type: testharness
+  disabled:
+    if debug: "disabled"
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/mozilla/meta/dom/throttling/throttling-webrtc.window.js.ini
@@ -0,0 +1,4 @@
+[throttling-webrtc.window.html]
+  type: testharness
+  disabled:
+    if debug: "disabled"
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/mozilla/meta/dom/throttling/throttling-ws.window.js.ini
@@ -0,0 +1,4 @@
+[throttling-ws.window.html]
+  type: testharness
+  disabled:
+    if debug: "disabled"
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/mozilla/tests/dom/throttling/resources/test.html
@@ -0,0 +1,5 @@
+<!doctype html>
+<meta charset=utf-8>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="throttling.js"></script>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/mozilla/tests/dom/throttling/resources/throttling.js
@@ -0,0 +1,136 @@
+function waitForLoad() {
+  return new Promise(resolve => addEventListener('load', resolve))
+    .then(() => delay(10));
+}
+
+function delay(timeout) {
+  return new Promise(resolve => step_timeout(() => resolve(), 10));
+}
+
+function busy(work) {
+  return delay(10).then(() => new Promise(resolve => {
+    step_timeout(() => {
+      let end = performance.now() + work;
+      while (performance.now() < end) {
+
+      }
+
+      resolve();
+    }, 1);
+  }));
+}
+
+function getThrottlingRate(delay) {
+  return new Promise(resolve => {
+    let start = performance.now();
+    setTimeout(() => {
+      let rate = Math.floor((performance.now() - start) / delay);
+      resolve(rate);
+    }, delay);
+  });
+}
+
+function addElement(t, element, src) {
+  return new Promise((resolve, reject) => {
+    let e = document.createElement(element);
+    e.addEventListener('load', () => resolve(e));
+    if (src) {
+      e.src = src;
+    }
+    document.body.appendChild(e);
+    t.add_cleanup(() => e.remove());
+  });
+}
+
+function inFrame(t) {
+  return addElement(t, "iframe", "resources/test.html")
+    .then(frame => delay(10).then(() => Promise.resolve(frame.contentWindow)));
+}
+
+function addWebSocket(t, url) {
+  return new Promise((resolve, reject) => {
+    let socket = new WebSocket(url);
+    socket.onopen = () => {
+      t.add_cleanup(() => socket.close());
+      resolve();
+    };
+    socket.onerror = reject;
+  });
+}
+
+function addRTCPeerConnection(t) {
+  return new Promise((resolve, reject) => {
+    let connection = new RTCPeerConnection();
+    t.add_cleanup(() => {
+      connection.close()
+    });
+
+    resolve();
+  });
+}
+
+function addIndexedDB(t) {
+  return new Promise((resolve, reject) => {
+    let iDBState = {
+      running: false,
+      db: null
+    };
+
+    let req = indexedDB.open("testDB", 1);
+
+    req.onupgradeneeded = e => {
+      let db = e.target.result;
+      let store = db.createObjectStore("testOS", {keyPath: "id"});
+      let index = store.createIndex("index", ["col"]);
+    };
+
+    req.onsuccess = e => {
+      let db = iDBState.db = e.target.result;
+      let store = db.transaction("testOS", "readwrite").objectStore("testOS");
+      let ctr = 0;
+
+      iDBState.running = true;
+
+      function putLoop() {
+        if (!iDBState.running) {
+          return;
+        }
+
+        let req = store.put({id: ctr++, col: "foo"});
+        req.onsuccess = putLoop;
+
+        if (!iDBState.request) {
+          iDBState.request = req;
+        }
+      }
+
+      putLoop();
+      resolve();
+    };
+
+    t.add_cleanup(() => {
+      iDBState.running = false;
+      iDBState.db && iDBState.db.close();
+      iDBState.db = null;
+    });
+  });
+}
+
+function addWebAudio(t) {
+  return new Promise(resolve => {
+    let context = new (window.AudioContext || window.webkitAudioContext)();
+    context.onstatechange = () => (context.state === "running") && resolve();
+
+    let gain = context.createGain();
+    gain.gain.value = 0.1;
+    gain.connect(context.destination);
+
+    let webaudionode = context.createOscillator();
+    webaudionode.type = 'square';
+    webaudionode.frequency.value = 440; // value in hertz
+    webaudionode.connect(gain);
+    webaudionode.start();
+
+    t.add_cleanup(() => webaudionode.stop());
+  });
+}
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/mozilla/tests/dom/throttling/resources/ws.sub.js
@@ -0,0 +1,3 @@
+var __SERVER__NAME = "{{host}}";
+var __PORT = "{{ports[ws][0]}}";
+var __PATH = "echo";
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/mozilla/tests/dom/throttling/throttling-1.window.js
@@ -0,0 +1,10 @@
+// META: script=resources/throttling.js
+
+setup(() => waitForLoad()
+  .then(() => "setup done"));
+
+promise_test(t => busy(100)
+  .then(() => getThrottlingRate(100))
+  .then(rate => {
+    assert_greater_than(rate, 10, "Timeout wasn't throttled");
+  }), "Throttle when all budget has been used.");
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/mozilla/tests/dom/throttling/throttling-2.window.js
@@ -0,0 +1,11 @@
+// META: script=resources/throttling.js
+
+setup(() => waitForLoad()
+  .then(() => "setup done"));
+
+promise_test(t => inFrame(t)
+  .then(win => win.busy(100)
+                  .then(() => win.getThrottlingRate(100)))
+  .then(rate => {
+    assert_greater_than(rate, 10, "Timeout wasn't throttled");
+  }), "Throttle iframe when all budget has been used");
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/mozilla/tests/dom/throttling/throttling-3.window.js
@@ -0,0 +1,11 @@
+// META: script=resources/throttling.js
+
+setup(() => waitForLoad()
+  .then(() => "setup done"));
+
+promise_test(t => inFrame(t)
+  .then(win => busy(100)
+    .then(() => win.getThrottlingRate(100)))
+  .then(rate => {
+    assert_less_than(rate, 10, "Timeout was throttled");
+  }), "Don't throttle iframe when all budget in parent has been used");
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/mozilla/tests/dom/throttling/throttling-4.window.js
@@ -0,0 +1,11 @@
+// META: script=resources/throttling.js
+
+setup(() => waitForLoad()
+  .then(() => "setup done"));
+
+promise_test(t => inFrame(t)
+  .then(win => win.busy(100))
+  .then(() => getThrottlingRate(100))
+  .then(rate => {
+    assert_less_than(rate, 10, "Timeout was throttled");
+  }), "Don't throttle parent when all budget in iframe has been used");
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/mozilla/tests/dom/throttling/throttling-indexeddb.window.js
@@ -0,0 +1,35 @@
+// META: script=resources/throttling.js
+
+setup(() => waitForLoad()
+  .then(() => "setup done"));
+
+promise_test(t => addIndexedDB(t)
+  .then(() => busy(100))
+  .then(() => getThrottlingRate(100))
+  .then(rate => {
+    assert_less_than(rate, 10, "Timeout was throttled");
+  }), "Don't throttle when there are open IndexedDB transactions.");
+
+promise_test(t => inFrame(t)
+  .then(win => win.addIndexedDB(t))
+  .then(() => busy(100))
+  .then(() => getThrottlingRate(100))
+  .then(rate => {
+    assert_less_than(rate, 10, "Timeout was throttled");
+  }), "Don't throttle when there are open IndexedDB transactions in iframe.");
+
+promise_test(t => inFrame(t)
+  .then(win => addIndexedDB(t)
+    .then(() => win.busy(100))
+    .then(() => win.getThrottlingRate(100)))
+  .then(rate => {
+    assert_less_than(rate, 10, "Timeout was throttled");
+  }), "Don't throttle iframe when there are open IndexedDB transactions in parent.");
+
+promise_test(t => inFrame(t)
+  .then(win => win.addIndexedDB(t)
+                  .then(() => win.busy(100))
+                  .then(() => win.getThrottlingRate(100)))
+  .then(rate => {
+    assert_less_than(rate, 10, "Timeout was throttled");
+  }), "Don't throttle iframe when there are open IndexedDB transactions in iframe.");
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/mozilla/tests/dom/throttling/throttling-webaudio.window.js
@@ -0,0 +1,35 @@
+// META: script=resources/throttling.js
+
+setup(() => waitForLoad()
+  .then(() => "setup done"));
+
+promise_test(t => addWebAudio(t)
+  .then(() => busy(100))
+  .then(() => getThrottlingRate(100))
+  .then(rate => {
+    assert_less_than(rate, 10, "Timeout was throttled");
+  }), "Don't throttle when there is active WebAudio.");
+
+promise_test(t => inFrame(t)
+  .then(win => win.addWebAudio(t))
+  .then(() => busy(100))
+  .then(() => getThrottlingRate(100))
+  .then(rate => {
+    assert_less_than(rate, 10, "Timeout was throttled");
+  }), "Don't throttle when there is active WebAudio in iframe.");
+
+promise_test(t => inFrame(t)
+  .then(win => addWebAudio(t)
+    .then(() => win.busy(100))
+    .then(() => win.getThrottlingRate(100)))
+  .then(rate => {
+    assert_less_than(rate, 10, "Timeout was throttled");
+  }), "Don't throttle iframe when there is active WebAudio in parent.");
+
+promise_test(t => inFrame(t)
+  .then(win => win.addWebAudio(t)
+                  .then(() => win.busy(100))
+                  .then(() => win.getThrottlingRate(100)))
+  .then(rate => {
+    assert_less_than(rate, 10, "Timeout was throttled");
+  }), "Don't throttle iframe when there is active WebAudio in iframe.");
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/mozilla/tests/dom/throttling/throttling-webrtc.window.js
@@ -0,0 +1,35 @@
+// META: script=resources/throttling.js
+
+setup(() => waitForLoad()
+  .then(() => "setup done"));
+
+promise_test(t => addRTCPeerConnection(t)
+  .then(() => busy(100))
+  .then(() => getThrottlingRate(100))
+  .then(rate => {
+    assert_less_than(rate, 10, "Timeout was throttled");
+  }), "Don't throttle when there are open RTCPeerConnections.");
+
+promise_test(t => inFrame(t)
+  .then(win => win.addRTCPeerConnection(t))
+  .then(() => busy(100))
+  .then(() => getThrottlingRate(100))
+  .then(rate => {
+    assert_less_than(rate, 10, "Timeout was throttled");
+  }), "Don't throttle when there are open RTCPeerConnections in iframe.");
+
+promise_test(t => inFrame(t)
+  .then(win => addRTCPeerConnection(t)
+    .then(() => win.busy(100))
+    .then(() => win.getThrottlingRate(100)))
+  .then(rate => {
+    assert_less_than(rate, 10, "Timeout was throttled");
+  }), "Don't throttle iframe when there are open RTCPeerConnections in parent.");
+
+promise_test(t => inFrame(t)
+  .then(win => win.addRTCPeerConnection(t)
+                  .then(() => win.busy(100))
+                  .then(() => win.getThrottlingRate(100)))
+  .then(rate => {
+    assert_less_than(rate, 10, "Timeout was throttled");
+  }), "Don't throttle iframe when there are open RTCPeerConnections in iframe.");
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/mozilla/tests/dom/throttling/throttling-ws.window.js
@@ -0,0 +1,37 @@
+// META: script=resources/ws.sub.js
+// META: script=resources/throttling.js
+let server = "ws://" + __SERVER__NAME + ":" + __PORT + "/" + __PATH;
+
+setup(() => waitForLoad()
+  .then(() => "setup done"));
+
+promise_test(t => addWebSocket(t, server)
+  .then(() => busy(100))
+  .then(() => getThrottlingRate(100))
+  .then(rate => {
+    assert_less_than(rate, 10, "Timeout was throttled");
+  }), "Don't throttle when there are open WebSockets.");
+
+promise_test(t => inFrame(t)
+  .then(win => win.addWebSocket(t, server))
+  .then(() => busy(100))
+  .then(() => getThrottlingRate(100))
+  .then(rate => {
+    assert_less_than(rate, 10, "Timeout was throttled");
+  }), "Don't throttle when there are open WebSockets in iframe.");
+
+promise_test(t => inFrame(t)
+  .then(win => addWebSocket(t, server)
+    .then(() => win.busy(100))
+    .then(() => win.getThrottlingRate(100)))
+  .then(rate => {
+    assert_less_than(rate, 10, "Timeout was throttled");
+  }), "Don't throttle iframe when there are open WebSockets in parent.");
+
+promise_test(t => inFrame(t)
+  .then(win => win.addWebSocket(t, server)
+                  .then(() => win.busy(100))
+                  .then(() => win.getThrottlingRate(100)))
+  .then(rate => {
+    assert_less_than(rate, 10, "Timeout was throttled");
+  }), "Don't throttle iframe when there are open WebSockets in iframe.");
--- a/third_party/speedometer/InteractiveRunner.html
+++ b/third_party/speedometer/InteractiveRunner.html
@@ -136,17 +136,20 @@ function startTest() {
                     var testResults = suiteResults.tests[testName];
                     for (var subtestName in testResults.tests) {
                         results += suiteName + ' : ' + testName + ' : ' + subtestName
                             + ': ' + testResults.tests[subtestName] + ' ms\n';
                     }
                 }
                 results += suiteName + ' : ' + suiteResults.total + ' ms\n';
             }
+            results += 'Arithmetic Mean : ' + measuredValues.mean  + ' ms\n';
+            results += 'Geometric Mean : ' + measuredValues.geomean  + ' ms\n';
             results += 'Total : ' + measuredValues.total + ' ms\n';
+            results += 'Score : ' + measuredValues.score + ' rpm\n';
 
             if (!results)
                 return;
 
             var pre = document.createElement('pre');
             document.body.appendChild(pre);
             pre.textContent = results;
         }
--- a/third_party/speedometer/README_MOZILLA
+++ b/third_party/speedometer/README_MOZILLA
@@ -1,13 +1,13 @@
 The source from this directory was copied from the
 PerformanceTests/Speedometer directory of the Webkit repository
 at: https://svn.webkit.org/repository/webkit/trunk
 
-The SVN revision used was: 221009
+The SVN revision used was: 222778
 
 The contents of this directory are intended for use to "train" the
 profile guided optimization (PGO) of Firefox and for benchmarking
 scenarios. The files inside this directory are not intended to ship
 with Firefox or any other product. If files inside this directory
 are useful for other purposes (e.g. JavaScript libraries), consumers
 should vendor those files separately, as it is not appropriate to pull
 in components of Speedometer for use outside of Speedometer.
--- a/third_party/speedometer/resources/benchmark-runner.js
+++ b/third_party/speedometer/resources/benchmark-runner.js
@@ -189,30 +189,29 @@ BenchmarkState.prototype.prepareCurrentS
     }
     frame.src = 'resources/' + suite.url;
     return promise;
 }
 
 BenchmarkRunner.prototype.step = function (state) {
     if (!state) {
         state = new BenchmarkState(this._suites);
-        this._measuredValues = {tests: {}, total: 0};
+        this._measuredValues = {tests: {}, total: 0, mean: NaN, geomean: NaN, score: NaN};
     }
 
     var suite = state.currentSuite();
     if (!suite) {
         this._finalize();
         var promise = new SimplePromise;
         promise.resolve();
         return promise;
     }
 
     if (state.isFirstTest()) {
         this._removeFrame();
-        this._masuredValuesForCurrentSuite = {};
         var self = this;
         return state.prepareCurrentSuite(this, this._appendFrame()).then(function (prepareReturnValue) {
             self._prepareReturnValue = prepareReturnValue;
             return self._runTestAndRecordResults(state);
         });
     }
 
     return this._runTestAndRecordResults(state);
@@ -255,29 +254,46 @@ BenchmarkRunner.prototype._runTestAndRec
     var self = this;
     setTimeout(function () {
         self._runTest(suite, test, self._prepareReturnValue, function (syncTime, asyncTime) {
             var suiteResults = self._measuredValues.tests[suite.name] || {tests:{}, total: 0};
             var total = syncTime + asyncTime;
             self._measuredValues.tests[suite.name] = suiteResults;
             suiteResults.tests[test.name] = {tests: {'Sync': syncTime, 'Async': asyncTime}, total: total};
             suiteResults.total += total;
-            self._measuredValues.total += total;
 
             if (self._client && self._client.didRunTest)
                 self._client.didRunTest(suite, test);
 
             state.next();
             promise.resolve(state);
         });
     }, 0);
     return promise;
 }
 
 BenchmarkRunner.prototype._finalize = function () {
     this._removeFrame();
 
-    if (this._client && this._client.didRunSuites)
+    if (this._client && this._client.didRunSuites) {
+        var product = 1;
+        var values = [];
+        for (var suiteName in this._measuredValues.tests) {
+            var suiteTotal = this._measuredValues.tests[suiteName].total;
+            product *= suiteTotal;
+            values.push(suiteTotal);
+        }
+
+        values.sort(function (a, b) { return a - b }); // Avoid the loss of significance for the sum.
+        var total = values.reduce(function (a, b) { return a + b });
+        var geomean = Math.pow(product, 1 / values.length);
+
+        var correctionFactor = 3; // This factor makes the test score look reasonably fit within 0 to 140.
+        this._measuredValues.total = total;
+        this._measuredValues.mean = total / values.length;
+        this._measuredValues.geomean = geomean;
+        this._measuredValues.score = 60 * 1000 / geomean / correctionFactor;
         this._client.didRunSuites(this._measuredValues);
+    }
 
     if (this._runNextIteration)
         this._runNextIteration();
 }
--- a/third_party/speedometer/resources/main.js
+++ b/third_party/speedometer/resources/main.js
@@ -1,75 +1,75 @@
 window.benchmarkClient = {
     displayUnit: 'runs/min',
     iterationCount: 10,
-    testsCount: null,
+    stepCount: null,
     suitesCount: null,
-    _timeValues: [],
+    _measuredValuesList: [],
     _finishedTestCount: 0,
     _progressCompleted: null,
     willAddTestFrame: function (frame) {
         var main = document.querySelector('main');
         var style = getComputedStyle(main);
         frame.style.left = main.offsetLeft + parseInt(style.borderLeftWidth) + parseInt(style.paddingLeft) + 'px';
         frame.style.top = main.offsetTop + parseInt(style.borderTopWidth) + parseInt(style.paddingTop) + 'px';
     },
     willRunTest: function (suite, test) {
-        document.getElementById('info').textContent = suite.name + ' ( ' + this._finishedTestCount + ' / ' + this.testsCount + ' )';
+        document.getElementById('info').textContent = suite.name + ' ( ' + this._finishedTestCount + ' / ' + this.stepCount + ' )';
     },
     didRunTest: function () {
         this._finishedTestCount++;
-        this._progressCompleted.style.width = (this._finishedTestCount * 100 / this.testsCount) + '%';
+        this._progressCompleted.style.width = (this._finishedTestCount * 100 / this.stepCount) + '%';
     },
     didRunSuites: function (measuredValues) {
-        this._timeValues.push(measuredValues.total);
+        this._measuredValuesList.push(measuredValues);
     },
     willStartFirstIteration: function () {
-        this._timeValues = [];
+        this._measuredValuesList = [];
         this._finishedTestCount = 0;
         this._progressCompleted = document.getElementById('progress-completed');
         document.getElementById('logo-link').onclick = function (event) { event.preventDefault(); return false; }
     },
     didFinishLastIteration: function () {
         document.getElementById('logo-link').onclick = null;
 
-        var results = this._computeResults(this._timeValues, this.displayUnit);
+        var results = this._computeResults(this._measuredValuesList, this.displayUnit);
 
         this._updateGaugeNeedle(results.mean);
         document.getElementById('result-number').textContent = results.formattedMean;
         if (results.formattedDelta)
             document.getElementById('confidence-number').textContent = '\u00b1 ' + results.formattedDelta;
 
         this._populateDetailedResults(results.formattedValues);
         document.getElementById('results-with-statistics').textContent = results.formattedMeanAndDelta;
 
         if (this.displayUnit == 'ms') {
             document.getElementById('show-summary').style.display = 'none';
             showResultDetails();
         } else
             showResultsSummary();
     },
-    _computeResults: function (timeValues, displayUnit) {
+    _computeResults: function (measuredValuesList, displayUnit) {
         var suitesCount = this.suitesCount;
-        function totalTimeInDisplayUnit(time) {
+        function valueForUnit(measuredValues) {
             if (displayUnit == 'ms')
-                return time;
-            return computeScore(time);
+                return measuredValues.geomean;
+            return measuredValues.score;
         }
 
         function sigFigFromPercentDelta(percentDelta) {
             return Math.ceil(-Math.log(percentDelta)/Math.log(10)) + 3;
         }
 
         function toSigFigPrecision(number, sigFig) {
             var nonDecimalDigitCount = number < 1 ? 0 : (Math.floor(Math.log(number)/Math.log(10)) + 1);
             return number.toPrecision(Math.max(nonDecimalDigitCount, Math.min(6, sigFig)));
         }
 
-        var values = timeValues.map(totalTimeInDisplayUnit);
+        var values = measuredValuesList.map(valueForUnit);
         var sum = values.reduce(function (a, b) { return a + b; }, 0);
         var arithmeticMean = sum / values.length;
         var meanSigFig = 4;
         var formattedDelta;
         var formattedPercentDelta;
         if (window.Statistics) {
             var delta = Statistics.confidenceIntervalDelta(0.95, values.length, sum, Statistics.squareSum(values));
             if (!isNaN(delta)) {
@@ -78,18 +78,18 @@ window.benchmarkClient = {
                 formattedDelta = toSigFigPrecision(delta, 2);
                 formattedPercentDelta = toSigFigPrecision(percentDelta, 2) + '%';
             }
         }
 
         var formattedMean = toSigFigPrecision(arithmeticMean, Math.max(meanSigFig, 3));
 
         return {
-            formattedValues: timeValues.map(function (time) {
-                return toSigFigPrecision(totalTimeInDisplayUnit(time), 4) + ' ' + displayUnit;
+            formattedValues: values.map(function (value) {
+                return toSigFigPrecision(value, 4) + ' ' + displayUnit;
             }),
             mean: arithmeticMean,
             formattedMean: formattedMean,
             formattedDelta: formattedDelta,
             formattedMeanAndDelta: formattedMean + (formattedDelta ? ' \xb1 ' + formattedDelta + ' (' + formattedPercentDelta + ')' : ''),
         };
     },
     _addDetailedResultsRow: function (table, iterationNumber, value) {
@@ -191,29 +191,25 @@ function startBenchmark() {
                     return false;
                 }
                 break;
             }
         }
     }
 
     var enabledSuites = Suites.filter(function (suite) { return !suite.disabled; });
-    var totalSubtestCount = enabledSuites.reduce(function (testsCount, suite) { return testsCount + suite.tests.length; }, 0);
-    benchmarkClient.testsCount = benchmarkClient.iterationCount * totalSubtestCount;
+    var totalSubtestsCount = enabledSuites.reduce(function (testsCount, suite) { return testsCount + suite.tests.length; }, 0);
+    benchmarkClient.stepCount = benchmarkClient.iterationCount * totalSubtestsCount;
     benchmarkClient.suitesCount = enabledSuites.length;
     var runner = new BenchmarkRunner(Suites, benchmarkClient);
     runner.runMultipleIterations(benchmarkClient.iterationCount);
 
     return true;
 }
 
-function computeScore(time) {
-    return 60 * 1000 * benchmarkClient.suitesCount / time;
-}
-
 function showSection(sectionIdentifier, pushState) {
     var currentSectionElement = document.querySelector('section.selected');
     console.assert(currentSectionElement);
 
     var newSectionElement = document.getElementById(sectionIdentifier);
     console.assert(newSectionElement);
 
     currentSectionElement.classList.remove('selected');
--- a/third_party/speedometer/resources/tests.js
+++ b/third_party/speedometer/resources/tests.js
@@ -161,17 +161,46 @@ Suites.push({
             for (var i = 0; i < deleteButtons.length; i++)
                 deleteButtons[i].click();
         }),
     ]
 });
 
 Suites.push({
     name: 'EmberJS-TodoMVC',
-    url: 'todomvc/architecture-examples/emberjs/index.html',
+    url: 'todomvc/architecture-examples/emberjs/dist/index.html',
+    prepare: function (runner, contentWindow, contentDocument) {
+        return runner.waitForElement('#new-todo').then(function (element) {
+            element.focus();
+            return element;
+        });
+    },
+    tests: [
+        new BenchmarkTestStep('Adding' + numberOfItemsToAdd + 'Items', function (newTodo, contentWindow, contentDocument) {
+            for (var i = 0; i < numberOfItemsToAdd; i++) {
+                newTodo.value = 'Something to do ' + i;
+                triggerEnter(newTodo, 'keydown');
+            }
+        }),
+        new BenchmarkTestStep('CompletingAllItems', function (params, contentWindow, contentDocument) {
+            var checkboxes = contentDocument.querySelectorAll('.toggle');
+            for (var i = 0; i < checkboxes.length; i++)
+                checkboxes[i].click();
+        }),
+        new BenchmarkTestStep('DeletingItems', function (params, contentWindow, contentDocument) {
+            var deleteButtons = contentDocument.querySelectorAll('.destroy');
+            for (var i = 0; i < deleteButtons.length; i++)
+                deleteButtons[i].click();
+        }),
+    ]
+});
+
+Suites.push({
+    name: 'EmberJS-Debug-TodoMVC',
+    url: 'todomvc/architecture-examples/emberjs-debug/index.html',
     prepare: function (runner, contentWindow, contentDocument) {
         return runner.waitForElement('#new-todo').then(function (element) {
             element.focus();
             return element;
         });
     },
     tests: [
         new BenchmarkTestStep('Adding' + numberOfItemsToAdd + 'Items', function (newTodo, contentWindow, contentDocument) {
@@ -193,36 +222,37 @@ Suites.push({
     ]
 });
 
 Suites.push({
     name: 'BackboneJS-TodoMVC',
     url: 'todomvc/architecture-examples/backbone/index.html',
     prepare: function (runner, contentWindow, contentDocument) {
     contentWindow.Backbone.sync = function () {}
-        return runner.waitForElement('.new-todo').then(function (element) {
-            element.focus();
-            return element;
+        return runner.waitForElement('#appIsReady').then(function (element) {
+            var newTodo = contentDocument.querySelector('.new-todo');
+            newTodo.focus();
+            return newTodo;
         });
     },
     tests: [
         new BenchmarkTestStep('Adding' + numberOfItemsToAdd + 'Items', function (newTodo, contentWindow, contentDocument) {
             for (var i = 0; i < numberOfItemsToAdd; i++) {
                 newTodo.value = 'Something to do ' + i;
                 triggerEnter(newTodo, 'keypress');
             }
         }),
         new BenchmarkTestStep('CompletingAllItems', function (newTodo, contentWindow, contentDocument) {
             var checkboxes = contentDocument.querySelectorAll('.toggle');
-            for (var i = 0; i < checkboxes.length; i++)
+            for (var i = 0; i < numberOfItemsToAdd; i++)
                 checkboxes[i].click();
         }),
         new BenchmarkTestStep('DeletingAllItems', function (newTodo, contentWindow, contentDocument) {
             var deleteButtons = contentDocument.querySelectorAll('.destroy');
-            for (var i = 0; i < deleteButtons.length; i++)
+            for (var i = 0; i < numberOfItemsToAdd; i++)
                 deleteButtons[i].click();
         }),
     ]
 });
 
 Suites.push({
     name: 'AngularJS-TodoMVC',
     url: 'todomvc/architecture-examples/angularjs/index.html',
@@ -321,19 +351,20 @@ Suites.push({
         }),
     ]
 });
 
 Suites.push({
     name: 'jQuery-TodoMVC',
     url: 'todomvc/architecture-examples/jquery/index.html',
     prepare: function (runner, contentWindow, contentDocument) {
-        return runner.waitForElement('#new-todo').then(function (element) {
-            element.focus();
-            return element;
+        return runner.waitForElement('#appIsReady').then(function (element) {
+            var newTodo = contentDocument.getElementById('new-todo');
+            newTodo.focus();
+            return newTodo;
         });
     },
     tests: [
         new BenchmarkTestStep('Adding' + numberOfItemsToAdd + 'Items', function (newTodo, contentWindow, contentDocument) {
             for (var i = 0; i < numberOfItemsToAdd; i++) {
                 newTodo.value = 'Something to do ' + i;
                 triggerEnter(newTodo, 'keyup');
             }
--- a/third_party/speedometer/resources/todomvc/architecture-examples/angular/dist/assets/css/todomvc-app.css
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/angular/dist/assets/css/todomvc-app.css
@@ -107,38 +107,42 @@ body {
 }
 
 .main {
     position: relative;
     z-index: 2;
     border-top: 1px solid #e6e6e6;
 }
 
-label[for='toggle-all'] {
-    display: none;
+.toggle-all {
+    text-align: center;
+    border: none; /* Mobile Safari */
+    opacity: 0;
+    position: absolute;
 }
 
-.toggle-all {
-    position: absolute;
-    top: -55px;
-    left: -12px;
+.toggle-all + label {
     width: 60px;
     height: 34px;
-    text-align: center;
-    border: none; /* Mobile Safari */
+    font-size: 0;
+    position: absolute;
+    top: -52px;
+    left: -13px;
+    -webkit-transform: rotate(90deg);
+    transform: rotate(90deg);
 }
 
-.toggle-all:before {
+.toggle-all + label:before {
     content: '❯';
     font-size: 22px;
     color: #e6e6e6;
     padding: 10px 27px 10px 27px;
 }
 
-.toggle-all:checked:before {
+.toggle-all:checked + label:before {
     color: #737373;
 }
 
 .todo-list {
     margin: 0;
     padding: 0;
     list-style: none;
 }
@@ -178,28 +182,37 @@ label[for='toggle-all'] {
     top: 0;
     bottom: 0;
     margin: auto 0;
     border: none; /* Mobile Safari */
     -webkit-appearance: none;
     appearance: none;
 }
 
-.todo-list li .toggle:after {
-    content: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="-10 -18 100 135"><circle cx="50" cy="50" r="50" fill="none" stroke="#ededed" stroke-width="3"/></svg>');
+.todo-list li .toggle {
+    opacity: 0;
 }
 
-.todo-list li .toggle:checked:after {
-    content: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="-10 -18 100 135"><circle cx="50" cy="50" r="50" fill="none" stroke="#bddad5" stroke-width="3"/><path fill="#5dc2af" d="M72 25L42 71 27 56l-4 4 20 20 34-52z"/></svg>');
+.todo-list li .toggle + label {
+    /*
+        Firefox requires `#` to be escaped - https://bugzilla.mozilla.org/show_bug.cgi?id=922433
+        IE and Edge requires *everything* to be escaped to render, so we do that instead of just the `#` - https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/7157459/
+    */
+    background-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23ededed%22%20stroke-width%3D%223%22/%3E%3C/svg%3E');
+    background-repeat: no-repeat;
+    background-position: center left;
+}
+
+.todo-list li .toggle:checked + label {
+    background-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23bddad5%22%20stroke-width%3D%223%22/%3E%3Cpath%20fill%3D%22%235dc2af%22%20d%3D%22M72%2025L42%2071%2027%2056l-4%204%2020%2020%2034-52z%22/%3E%3C/svg%3E');
 }
 
 .todo-list li label {
     word-break: break-all;
-    padding: 15px 60px 15px 15px;
-    margin-left: 45px;
+    padding: 15px 15px 15px 60px;
     display: block;
     line-height: 1.2;
     transition: color 0.4s;
 }
 
 .todo-list li.completed label {
     color: #d9d9d9;
     text-decoration: line-through;
@@ -345,23 +358,16 @@ html .clear-completed:active {
     .toggle-all,
     .todo-list li .toggle {
         background: none;
     }
 
     .todo-list li .toggle {
         height: 40px;
     }
-
-    .toggle-all {
-        -webkit-transform: rotate(90deg);
-        transform: rotate(90deg);
-        -webkit-appearance: none;
-        appearance: none;
-    }
 }
 
 @media (max-width: 430px) {
     .footer {
         height: 50px;
     }
 
     .filters {
--- a/third_party/speedometer/resources/todomvc/architecture-examples/angular/dist/index.html
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/angular/dist/index.html
@@ -6,10 +6,10 @@
   <meta name="viewport" content="width=device-width, initial-scale=1">
   <link rel="icon" type="image/x-icon" href="favicon.ico">
   <link rel="stylesheet" href="assets/css/todomvc-common.css">
   <link rel="stylesheet" href="assets/css/todomvc-app.css">
 <link href="styles.d41d8cd98f00b204e980.bundle.css" rel="stylesheet"/></head>
 <body>
   <app-root>Loading...</app-root>
   <!-- Credits: Addy Osmani -->
-<script type="text/javascript" src="inline.28efc571905d42a672b0.bundle.js"></script><script type="text/javascript" src="polyfills.3a2aed82a0c9b24e6585.bundle.js"></script><script type="text/javascript" src="vendor.9a296bbc1909830a9106.bundle.js"></script><script type="text/javascript" src="main.c82799edffc751aa6590.bundle.js"></script></body>
+<script type="text/javascript" src="inline.3b7f8ce2e6bc2f77dd83.bundle.js"></script><script type="text/javascript" src="polyfills.3a2aed82a0c9b24e6585.bundle.js"></script><script type="text/javascript" src="vendor.9a296bbc1909830a9106.bundle.js"></script><script type="text/javascript" src="main.f1c5d33a6950c335064d.bundle.js"></script></body>
 </html>
deleted file mode 100644
--- a/third_party/speedometer/resources/todomvc/architecture-examples/angular/dist/inline.28efc571905d42a672b0.bundle.js
+++ /dev/null
@@ -1,1 +0,0 @@
-!function(e){function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}var n=window.webpackJsonp;window.webpackJsonp=function(t,c,a){for(var u,i,f,l=0,s=[];l<t.length;l++)i=t[l],o[i]&&s.push(o[i][0]),o[i]=0;for(u in c)Object.prototype.hasOwnProperty.call(c,u)&&(e[u]=c[u]);for(n&&n(t,c,a);s.length;)s.shift()();if(a)for(l=0;l<a.length;l++)f=r(r.s=a[l]);return f};var t={},o={4:0};r.e=function(e){function n(){c.onerror=c.onload=null,clearTimeout(a);var r=o[e];0!==r&&(r&&r[1](new Error("Loading chunk "+e+" failed.")),o[e]=void 0)}if(0===o[e])return Promise.resolve();if(o[e])return o[e][2];var t=document.getElementsByTagName("head")[0],c=document.createElement("script");c.type="text/javascript",c.charset="utf-8",c.async=!0,c.timeout=12e4,r.nc&&c.setAttribute("nonce",r.nc),c.src=r.p+""+e+"."+{0:"3a2aed82a0c9b24e6585",1:"c82799edffc751aa6590",2:"a63205ae4b55b180b58c"}[e]+".chunk.js";var a=setTimeout(n,12e4);c.onerror=c.onload=n;var u=new Promise(function(r,n){o[e]=[r,n]});return o[e][2]=u,t.appendChild(c),u},r.m=e,r.c=t,r.i=function(e){return e},r.d=function(e,n,t){r.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:t})},r.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(n,"a",n),n},r.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},r.p="",r.oe=function(e){throw console.error(e),e}}([]);
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/angular/dist/inline.3b7f8ce2e6bc2f77dd83.bundle.js
@@ -0,0 +1,1 @@
+!function(e){function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}var n=window.webpackJsonp;window.webpackJsonp=function(t,c,a){for(var u,i,f,l=0,s=[];l<t.length;l++)i=t[l],o[i]&&s.push(o[i][0]),o[i]=0;for(u in c)Object.prototype.hasOwnProperty.call(c,u)&&(e[u]=c[u]);for(n&&n(t,c,a);s.length;)s.shift()();if(a)for(l=0;l<a.length;l++)f=r(r.s=a[l]);return f};var t={},o={4:0};r.e=function(e){function n(){c.onerror=c.onload=null,clearTimeout(a);var r=o[e];0!==r&&(r&&r[1](new Error("Loading chunk "+e+" failed.")),o[e]=void 0)}if(0===o[e])return Promise.resolve();if(o[e])return o[e][2];var t=document.getElementsByTagName("head")[0],c=document.createElement("script");c.type="text/javascript",c.charset="utf-8",c.async=!0,c.timeout=12e4,r.nc&&c.setAttribute("nonce",r.nc),c.src=r.p+""+e+"."+{0:"3a2aed82a0c9b24e6585",1:"f1c5d33a6950c335064d",2:"a63205ae4b55b180b58c"}[e]+".chunk.js";var a=setTimeout(n,12e4);c.onerror=c.onload=n;var u=new Promise(function(r,n){o[e]=[r,n]});return o[e][2]=u,t.appendChild(c),u},r.m=e,r.c=t,r.i=function(e){return e},r.d=function(e,n,t){r.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:t})},r.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(n,"a",n),n},r.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},r.p="",r.oe=function(e){throw console.error(e),e}}([]);
\ No newline at end of file
rename from third_party/speedometer/resources/todomvc/architecture-examples/angular/dist/main.c82799edffc751aa6590.bundle.js
rename to third_party/speedometer/resources/todomvc/architecture-examples/angular/dist/main.f1c5d33a6950c335064d.bundle.js
--- a/third_party/speedometer/resources/todomvc/architecture-examples/angular/src/assets/css/todomvc-app.css
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/angular/src/assets/css/todomvc-app.css
@@ -107,38 +107,42 @@ body {
 }
 
 .main {
     position: relative;
     z-index: 2;
     border-top: 1px solid #e6e6e6;
 }
 
-label[for='toggle-all'] {
-    display: none;
+.toggle-all {
+    text-align: center;
+    border: none; /* Mobile Safari */
+    opacity: 0;
+    position: absolute;
 }
 
-.toggle-all {
-    position: absolute;
-    top: -55px;
-    left: -12px;
+.toggle-all + label {
     width: 60px;
     height: 34px;
-    text-align: center;
-    border: none; /* Mobile Safari */
+    font-size: 0;
+    position: absolute;
+    top: -52px;
+    left: -13px;
+    -webkit-transform: rotate(90deg);
+    transform: rotate(90deg);
 }
 
-.toggle-all:before {
+.toggle-all + label:before {
     content: '❯';
     font-size: 22px;
     color: #e6e6e6;
     padding: 10px 27px 10px 27px;
 }
 
-.toggle-all:checked:before {
+.toggle-all:checked + label:before {
     color: #737373;
 }
 
 .todo-list {
     margin: 0;
     padding: 0;
     list-style: none;
 }
@@ -178,28 +182,37 @@ label[for='toggle-all'] {
     top: 0;
     bottom: 0;
     margin: auto 0;
     border: none; /* Mobile Safari */
     -webkit-appearance: none;
     appearance: none;
 }
 
-.todo-list li .toggle:after {
-    content: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="-10 -18 100 135"><circle cx="50" cy="50" r="50" fill="none" stroke="#ededed" stroke-width="3"/></svg>');
+.todo-list li .toggle {
+    opacity: 0;
 }
 
-.todo-list li .toggle:checked:after {
-    content: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="-10 -18 100 135"><circle cx="50" cy="50" r="50" fill="none" stroke="#bddad5" stroke-width="3"/><path fill="#5dc2af" d="M72 25L42 71 27 56l-4 4 20 20 34-52z"/></svg>');
+.todo-list li .toggle + label {
+    /*
+        Firefox requires `#` to be escaped - https://bugzilla.mozilla.org/show_bug.cgi?id=922433
+        IE and Edge requires *everything* to be escaped to render, so we do that instead of just the `#` - https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/7157459/
+    */
+    background-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23ededed%22%20stroke-width%3D%223%22/%3E%3C/svg%3E');
+    background-repeat: no-repeat;
+    background-position: center left;
+}
+
+.todo-list li .toggle:checked + label {
+    background-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23bddad5%22%20stroke-width%3D%223%22/%3E%3Cpath%20fill%3D%22%235dc2af%22%20d%3D%22M72%2025L42%2071%2027%2056l-4%204%2020%2020%2034-52z%22/%3E%3C/svg%3E');
 }
 
 .todo-list li label {
     word-break: break-all;
-    padding: 15px 60px 15px 15px;
-    margin-left: 45px;
+    padding: 15px 15px 15px 60px;
     display: block;
     line-height: 1.2;
     transition: color 0.4s;
 }
 
 .todo-list li.completed label {
     color: #d9d9d9;
     text-decoration: line-through;
@@ -345,23 +358,16 @@ html .clear-completed:active {
     .toggle-all,
     .todo-list li .toggle {
         background: none;
     }
 
     .todo-list li .toggle {
         height: 40px;
     }
-
-    .toggle-all {
-        -webkit-transform: rotate(90deg);
-        transform: rotate(90deg);
-        -webkit-appearance: none;
-        appearance: none;
-    }
 }
 
 @media (max-width: 430px) {
     .footer {
         height: 50px;
     }
 
     .filters {
--- a/third_party/speedometer/resources/todomvc/architecture-examples/angularjs/node_modules/todomvc-app-css/index.css
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/angularjs/node_modules/todomvc-app-css/index.css
@@ -12,367 +12,365 @@ button {
     font-size: 100%;
     vertical-align: baseline;
     font-family: inherit;
     font-weight: inherit;
     color: inherit;
     -webkit-appearance: none;
     appearance: none;
     -webkit-font-smoothing: antialiased;
-    -moz-font-smoothing: antialiased;
-    font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
 }
 
 body {
     font: 14px 'Helvetica Neue', Helvetica, Arial, sans-serif;
     line-height: 1.4em;
     background: #f5f5f5;
     color: #4d4d4d;
     min-width: 230px;
     max-width: 550px;
     margin: 0 auto;
     -webkit-font-smoothing: antialiased;
-    -moz-font-smoothing: antialiased;
-    font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
     font-weight: 300;
 }
 
-button,
-input[type="checkbox"] {
-    outline: none;
+:focus {
+    outline: 0;
 }
 
 .hidden {
     display: none;
 }
 
-#todoapp {
+.todoapp {
     background: #fff;
     margin: 130px 0 40px 0;
     position: relative;
     box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2),
                 0 25px 50px 0 rgba(0, 0, 0, 0.1);
 }
 
-#todoapp input::-webkit-input-placeholder {
+.todoapp input::-webkit-input-placeholder {
     font-style: italic;
     font-weight: 300;
     color: #e6e6e6;
 }
 
-#todoapp input::-moz-placeholder {
+.todoapp input::-moz-placeholder {
     font-style: italic;
     font-weight: 300;
     color: #e6e6e6;
 }
 
-#todoapp input::input-placeholder {
+.todoapp input::input-placeholder {
     font-style: italic;
     font-weight: 300;
     color: #e6e6e6;
 }
 
-#todoapp h1 {
+.todoapp h1 {
     position: absolute;
     top: -155px;
     width: 100%;
     font-size: 100px;
     font-weight: 100;
     text-align: center;
     color: rgba(175, 47, 47, 0.15);
     -webkit-text-rendering: optimizeLegibility;
     -moz-text-rendering: optimizeLegibility;
     text-rendering: optimizeLegibility;
 }
 
-#new-todo,
+.new-todo,
 .edit {
     position: relative;
     margin: 0;
     width: 100%;
     font-size: 24px;
     font-family: inherit;
     font-weight: inherit;
     line-height: 1.4em;
     border: 0;
-    outline: none;
     color: inherit;
     padding: 6px;
     border: 1px solid #999;
     box-shadow: inset 0 -1px 5px 0 rgba(0, 0, 0, 0.2);
     box-sizing: border-box;
     -webkit-font-smoothing: antialiased;
-    -moz-font-smoothing: antialiased;
-    font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
 }
 
-#new-todo {
+.new-todo {
     padding: 16px 16px 16px 60px;
     border: none;
     background: rgba(0, 0, 0, 0.003);
     box-shadow: inset 0 -2px 1px rgba(0,0,0,0.03);
 }
 
-#main {
+.main {
     position: relative;
     z-index: 2;
     border-top: 1px solid #e6e6e6;
 }
 
-label[for='toggle-all'] {
-    display: none;
+.toggle-all {
+    text-align: center;
+    border: none; /* Mobile Safari */
+    opacity: 0;
+    position: absolute;
 }
 
-#toggle-all {
-    position: absolute;
-    top: -55px;
-    left: -12px;
+.toggle-all + label {
     width: 60px;
     height: 34px;
-    text-align: center;
-    border: none; /* Mobile Safari */
+    font-size: 0;
+    position: absolute;
+    top: -52px;
+    left: -13px;
+    -webkit-transform: rotate(90deg);
+    transform: rotate(90deg);
 }
 
-#toggle-all:before {
+.toggle-all + label:before {
     content: '❯';
     font-size: 22px;
     color: #e6e6e6;
     padding: 10px 27px 10px 27px;
 }
 
-#toggle-all:checked:before {
+.toggle-all:checked + label:before {
     color: #737373;
 }
 
-#todo-list {
+.todo-list {
     margin: 0;
     padding: 0;
     list-style: none;
 }
 
-#todo-list li {
+.todo-list li {
     position: relative;
     font-size: 24px;
     border-bottom: 1px solid #ededed;
 }
 
-#todo-list li:last-child {
+.todo-list li:last-child {
     border-bottom: none;
 }
 
-#todo-list li.editing {
+.todo-list li.editing {
     border-bottom: none;
     padding: 0;
 }
 
-#todo-list li.editing .edit {
+.todo-list li.editing .edit {
     display: block;
     width: 506px;
-    padding: 13px 17px 12px 17px;
+    padding: 12px 16px;
     margin: 0 0 0 43px;
 }
 
-#todo-list li.editing .view {
+.todo-list li.editing .view {
     display: none;
 }
 
-#todo-list li .toggle {
+.todo-list li .toggle {
     text-align: center;
     width: 40px;
     /* auto, since non-WebKit browsers doesn't support input styling */
     height: auto;
     position: absolute;
     top: 0;
     bottom: 0;
     margin: auto 0;
     border: none; /* Mobile Safari */
     -webkit-appearance: none;
     appearance: none;
 }
 
-#todo-list li .toggle:after {
-    content: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="-10 -18 100 135"><circle cx="50" cy="50" r="50" fill="none" stroke="#ededed" stroke-width="3"/></svg>');
+.todo-list li .toggle {
+    opacity: 0;
 }
 
-#todo-list li .toggle:checked:after {
-    content: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="-10 -18 100 135"><circle cx="50" cy="50" r="50" fill="none" stroke="#bddad5" stroke-width="3"/><path fill="#5dc2af" d="M72 25L42 71 27 56l-4 4 20 20 34-52z"/></svg>');
+.todo-list li .toggle + label {
+    /*
+        Firefox requires `#` to be escaped - https://bugzilla.mozilla.org/show_bug.cgi?id=922433
+        IE and Edge requires *everything* to be escaped to render, so we do that instead of just the `#` - https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/7157459/
+    */
+    background-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23ededed%22%20stroke-width%3D%223%22/%3E%3C/svg%3E');
+    background-repeat: no-repeat;
+    background-position: center left;
 }
 
-#todo-list li label {
-    white-space: pre;
-    word-break: break-word;
-    padding: 15px 60px 15px 15px;
-    margin-left: 45px;
+.todo-list li .toggle:checked + label {
+    background-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23bddad5%22%20stroke-width%3D%223%22/%3E%3Cpath%20fill%3D%22%235dc2af%22%20d%3D%22M72%2025L42%2071%2027%2056l-4%204%2020%2020%2034-52z%22/%3E%3C/svg%3E');
+}
+
+.todo-list li label {
+    word-break: break-all;
+    padding: 15px 15px 15px 60px;
     display: block;
     line-height: 1.2;
     transition: color 0.4s;
 }
 
-#todo-list li.completed label {
+.todo-list li.completed label {
     color: #d9d9d9;
     text-decoration: line-through;
 }
 
-#todo-list li .destroy {
+.todo-list li .destroy {
     display: none;
     position: absolute;
     top: 0;
     right: 10px;
     bottom: 0;
     width: 40px;
     height: 40px;
     margin: auto 0;
     font-size: 30px;
     color: #cc9a9a;
     margin-bottom: 11px;
     transition: color 0.2s ease-out;
 }
 
-#todo-list li .destroy:hover {
+.todo-list li .destroy:hover {
     color: #af5b5e;
 }
 
-#todo-list li .destroy:after {
+.todo-list li .destroy:after {
     content: '×';
 }
 
-#todo-list li:hover .destroy {
+.todo-list li:hover .destroy {
     display: block;
 }
 
-#todo-list li .edit {
+.todo-list li .edit {
     display: none;
 }
 
-#todo-list li.editing:last-child {
+.todo-list li.editing:last-child {
     margin-bottom: -1px;
 }
 
-#footer {
+.footer {
     color: #777;
     padding: 10px 15px;
     height: 20px;
     text-align: center;
     border-top: 1px solid #e6e6e6;
 }
 
-#footer:before {
+.footer:before {
     content: '';
     position: absolute;
     right: 0;
     bottom: 0;
     left: 0;
     height: 50px;
     overflow: hidden;
     box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2),
                 0 8px 0 -3px #f6f6f6,
                 0 9px 1px -3px rgba(0, 0, 0, 0.2),
                 0 16px 0 -6px #f6f6f6,
                 0 17px 2px -6px rgba(0, 0, 0, 0.2);
 }
 
-#todo-count {
+.todo-count {
     float: left;
     text-align: left;
 }
 
-#todo-count strong {
+.todo-count strong {
     font-weight: 300;
 }
 
-#filters {
+.filters {
     margin: 0;
     padding: 0;
     list-style: none;
     position: absolute;
     right: 0;
     left: 0;
 }
 
-#filters li {
+.filters li {
     display: inline;
 }
 
-#filters li a {
+.filters li a {
     color: inherit;
     margin: 3px;
     padding: 3px 7px;
     text-decoration: none;
     border: 1px solid transparent;
     border-radius: 3px;
 }
 
-#filters li a.selected,
-#filters li a:hover {
+.filters li a:hover {
     border-color: rgba(175, 47, 47, 0.1);
 }
 
-#filters li a.selected {
+.filters li a.selected {
     border-color: rgba(175, 47, 47, 0.2);
 }
 
-#clear-completed,
-html #clear-completed:active {
+.clear-completed,
+html .clear-completed:active {
     float: right;
     position: relative;
     line-height: 20px;
     text-decoration: none;
     cursor: pointer;
-    position: relative;
 }
 
-#clear-completed:hover {
+.clear-completed:hover {
     text-decoration: underline;
 }
 
-#info {
+.info {
     margin: 65px auto 0;
     color: #bfbfbf;
     font-size: 10px;
     text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
     text-align: center;
 }
 
-#info p {
+.info p {
     line-height: 1;
 }
 
-#info a {
+.info a {
     color: inherit;
     text-decoration: none;
     font-weight: 400;
 }
 
-#info a:hover {
+.info a:hover {
     text-decoration: underline;
 }
 
 /*
     Hack to remove background from Mobile Safari.
     Can't use it globally since it destroys checkboxes in Firefox
 */
 @media screen and (-webkit-min-device-pixel-ratio:0) {
-    #toggle-all,
-    #todo-list li .toggle {
+    .toggle-all,
+    .todo-list li .toggle {
         background: none;
     }
 
-    #todo-list li .toggle {
+    .todo-list li .toggle {
         height: 40px;
     }
-
-    #toggle-all {
-        -webkit-transform: rotate(90deg);
-        transform: rotate(90deg);
-        -webkit-appearance: none;
-        appearance: none;
-    }
 }
 
 @media (max-width: 430px) {
-    #footer {
+    .footer {
         height: 50px;
     }
 
-    #filters {
+    .filters {
         bottom: 10px;
     }
 }
--- a/third_party/speedometer/resources/todomvc/architecture-examples/angularjs/node_modules/todomvc-app-css/package.json
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/angularjs/node_modules/todomvc-app-css/package.json
@@ -1,32 +1,32 @@
 {
-  "_from": "todomvc-app-css@^1.0.1",
-  "_id": "todomvc-app-css@1.0.4",
+  "_from": "todomvc-app-css@^2.1.0",
+  "_id": "todomvc-app-css@2.1.0",
   "_inBundle": false,
-  "_integrity": "sha1-0lKSeabaW++wa1XAwyTF/P2U1lY=",
+  "_integrity": "sha1-tvJxbTOa+i5feZNH0qSLBTliQqU=",
   "_location": "/todomvc-app-css",
   "_phantomChildren": {},
   "_requested": {
     "type": "range",
     "registry": true,
-    "raw": "todomvc-app-css@^1.0.1",
+    "raw": "todomvc-app-css@^2.1.0",
     "name": "todomvc-app-css",
     "escapedName": "todomvc-app-css",
-    "rawSpec": "^1.0.1",
+    "rawSpec": "^2.1.0",
     "saveSpec": null,
-    "fetchSpec": "^1.0.1"
+    "fetchSpec": "^2.1.0"
   },
   "_requiredBy": [
     "/"
   ],
-  "_resolved": "https://registry.npmjs.org/todomvc-app-css/-/todomvc-app-css-1.0.4.tgz",
-  "_shasum": "d2529279a6da5befb06b55c0c324c5fcfd94d656",
-  "_spec": "todomvc-app-css@^1.0.1",
-  "_where": "/Users/mathiasb/projects/WebKit-Git/PerformanceTests/Speedometer/resources/todomvc/architecture-examples/angularjs",
+  "_resolved": "https://registry.npmjs.org/todomvc-app-css/-/todomvc-app-css-2.1.0.tgz",
+  "_shasum": "b6f2716d339afa2e5f799347d2a48b05396242a5",
+  "_spec": "todomvc-app-css@^2.1.0",
+  "_where": "/Users/mathiasb/projects/WebKit/PerformanceTests/Speedometer/resources/todomvc/architecture-examples/angularjs",
   "author": {
     "name": "Sindre Sorhus",
     "email": "sindresorhus@gmail.com",
     "url": "sindresorhus.com"
   },
   "bugs": {
     "url": "https://github.com/tastejs/todomvc-app-css/issues"
   },
@@ -48,10 +48,11 @@
     "stylesheet"
   ],
   "license": "CC-BY-4.0",
   "name": "todomvc-app-css",
   "repository": {
     "type": "git",
     "url": "git+https://github.com/tastejs/todomvc-app-css.git"
   },
-  "version": "1.0.4"
+  "style": "index.css",
+  "version": "2.1.0"
 }
--- a/third_party/speedometer/resources/todomvc/architecture-examples/angularjs/node_modules/todomvc-common/base.js
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/angularjs/node_modules/todomvc-common/base.js
@@ -16,17 +16,17 @@
                     for (var key in iterable) {
                         if (object[key] == null) {
                             object[key] = iterable[key];
                         }
                     }
                 }
             }
             return object;
-        }
+        };
 
         // By default, Underscore uses ERB-style template delimiters, change the
         // following template settings to use alternative delimiters.
         _.templateSettings = {
             evaluate    : /<%([\s\S]+?)%>/g,
             interpolate : /<%=([\s\S]+?)%>/g,
             escape      : /<%-([\s\S]+?)%>/g
         };
--- a/third_party/speedometer/resources/todomvc/architecture-examples/angularjs/node_modules/todomvc-common/package.json
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/angularjs/node_modules/todomvc-common/package.json
@@ -1,32 +1,32 @@
 {
-  "_from": "todomvc-common@^1.0.0",
-  "_id": "todomvc-common@1.0.3",
+  "_from": "todomvc-common@^1.0.4",
+  "_id": "todomvc-common@1.0.4",
   "_inBundle": false,
-  "_integrity": "sha1-y6GGgQnKpAG5COv3d5TMEBS3SHM=",
+  "_integrity": "sha512-AA0Z4exovEqubhbZCrzzn9roVT4zvOncS319p2zIc4CsNe5B9TLL7Sei1NIV6d+WrgR5rOi+y0I9Y6GE7xgNOw==",
   "_location": "/todomvc-common",
   "_phantomChildren": {},
   "_requested": {
     "type": "range",
     "registry": true,
-    "raw": "todomvc-common@^1.0.0",
+    "raw": "todomvc-common@^1.0.4",
     "name": "todomvc-common",
     "escapedName": "todomvc-common",
-    "rawSpec": "^1.0.0",
+    "rawSpec": "^1.0.4",
     "saveSpec": null,
-    "fetchSpec": "^1.0.0"
+    "fetchSpec": "^1.0.4"
   },
   "_requiredBy": [
     "/"
   ],
-  "_resolved": "https://registry.npmjs.org/todomvc-common/-/todomvc-common-1.0.3.tgz",
-  "_shasum": "cba1868109caa401b908ebf77794cc1014b74873",
-  "_spec": "todomvc-common@^1.0.0",
-  "_where": "/Users/mathiasb/projects/WebKit-Git/PerformanceTests/Speedometer/resources/todomvc/architecture-examples/angularjs",
+  "_resolved": "https://registry.npmjs.org/todomvc-common/-/todomvc-common-1.0.4.tgz",
+  "_shasum": "23099af886c2f0525bfd4537e078f12d0074309e",
+  "_spec": "todomvc-common@^1.0.4",
+  "_where": "/Users/mathiasb/projects/WebKit/PerformanceTests/Speedometer/resources/todomvc/architecture-examples/angularjs",
   "author": {
     "name": "TasteJS"
   },
   "bugs": {
     "url": "https://github.com/tastejs/todomvc-common/issues"
   },
   "bundleDependencies": false,
   "deprecated": false,
@@ -45,10 +45,10 @@
   "license": "MIT",
   "main": "base.js",
   "name": "todomvc-common",
   "repository": {
     "type": "git",
     "url": "git+https://github.com/tastejs/todomvc-common.git"
   },
   "style": "base.css",
-  "version": "1.0.3"
+  "version": "1.0.4"
 }
--- a/third_party/speedometer/resources/todomvc/architecture-examples/angularjs/package-lock.json
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/angularjs/package-lock.json
@@ -13,19 +13,19 @@
       "integrity": "sha1-0ecSqwGvpdLsZJ9eRxZzpwTyvkA="
     },
     "angular-route": {
       "version": "1.6.5",
       "resolved": "https://registry.npmjs.org/angular-route/-/angular-route-1.6.5.tgz",
       "integrity": "sha1-r0VZMpn1WHTQJhAYrbEVIKOBfSo="
     },
     "todomvc-app-css": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/todomvc-app-css/-/todomvc-app-css-1.0.4.tgz",
-      "integrity": "sha1-0lKSeabaW++wa1XAwyTF/P2U1lY="
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/todomvc-app-css/-/todomvc-app-css-2.1.0.tgz",
+      "integrity": "sha1-tvJxbTOa+i5feZNH0qSLBTliQqU="
     },
     "todomvc-common": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/todomvc-common/-/todomvc-common-1.0.3.tgz",
-      "integrity": "sha1-y6GGgQnKpAG5COv3d5TMEBS3SHM="
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/todomvc-common/-/todomvc-common-1.0.4.tgz",
+      "integrity": "sha512-AA0Z4exovEqubhbZCrzzn9roVT4zvOncS319p2zIc4CsNe5B9TLL7Sei1NIV6d+WrgR5rOi+y0I9Y6GE7xgNOw=="
     }
   }
 }
--- a/third_party/speedometer/resources/todomvc/architecture-examples/angularjs/package.json
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/angularjs/package.json
@@ -2,12 +2,12 @@
   "private": true,
   "scripts": {
     "test": "karma start test/config/karma.conf.js"
   },
   "dependencies": {
     "angular": "1.6.5",
     "angular-resource": "1.6.5",
     "angular-route": "1.6.5",
-    "todomvc-app-css": "^1.0.1",
-    "todomvc-common": "^1.0.0"
+    "todomvc-app-css": "^2.1.0",
+    "todomvc-common": "^1.0.4"
   }
 }
--- a/third_party/speedometer/resources/todomvc/architecture-examples/angularjs/todomvc-index.html
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/angularjs/todomvc-index.html
@@ -1,52 +1,52 @@
-<section id="todoapp">
+<section id="todoapp" class="todoapp">
     <header id="header">
         <h1>todos</h1>
-        <form id="todo-form" ng-submit="addTodo()">
-            <input id="new-todo" placeholder="What needs to be done?" ng-model="newTodo" ng-disabled="saving" autofocus>
+        <form id="todo-form" class="todo-form" ng-submit="addTodo()">
+            <input id="new-todo" class="new-todo" placeholder="What needs to be done?" ng-model="newTodo" ng-disabled="saving" autofocus>
         </form>
     </header>
-    <section id="main" ng-show="todos.length" ng-cloak>
-        <input id="toggle-all" type="checkbox" ng-model="allChecked" ng-click="markAll(allChecked)">
+    <section id="main" class="main" ng-show="todos.length" ng-cloak>
+        <input id="toggle-all" class="toggle-all" type="checkbox" ng-model="allChecked" ng-click="markAll(allChecked)">
         <label for="toggle-all">Mark all as complete</label>
-        <ul id="todo-list">
+        <ul id="todo-list" class="todo-list">
             <li ng-repeat="todo in todos | filter:statusFilter track by $index" ng-class="{completed: todo.completed, editing: todo == editedTodo}">
                 <div class="view">
                     <input class="toggle" type="checkbox" ng-model="todo.completed" ng-change="toggleCompleted(todo)">
                     <label ng-dblclick="editTodo(todo)">{{todo.title}}</label>
                     <button class="destroy" ng-click="removeTodo(todo)"></button>
                 </div>
                 <form ng-submit="saveEdits(todo, 'submit')">
                     <input class="edit" ng-trim="false" ng-model="todo.title" todo-escape="revertEdits(todo)" ng-blur="saveEdits(todo, 'blur')"
                         todo-focus="todo == editedTodo">
                 </form>
             </li>
         </ul>
     </section>
-    <footer id="footer" ng-show="todos.length" ng-cloak>
-        <span id="todo-count"><strong>{{remainingCount}}</strong>
-                        <ng-pluralize count="remainingCount" when="{ one: 'item left', other: 'items left' }"></ng-pluralize>
-                    </span>
-        <ul id="filters">
+    <footer id="footer" class="footer" ng-show="todos.length" ng-cloak>
+        <span id="todo-count" class="todo-count"><strong>{{remainingCount}}</strong>
+            <ng-pluralize count="remainingCount" when="{ one: 'item left', other: 'items left' }"></ng-pluralize>
+        </span>
+        <ul id="filters" class="filters">
             <li>
                 <a ng-class="{selected: status == ''} " href="#/">All</a>
             </li>
             <li>
                 <a ng-class="{selected: status == 'active'}" href="#/active">Active</a>
             </li>
             <li>
                 <a ng-class="{selected: status == 'completed'}" href="#/completed">Completed</a>
             </li>
         </ul>
-        <button id="clear-completed" ng-click="clearCompletedTodos()" ng-show="completedCount">Clear completed</button>
+        <button id="clear-completed" class="clear-completed" ng-click="clearCompletedTodos()" ng-show="completedCount">Clear completed</button>
     </footer>
 </section>
-<footer id="info">
+<footer id="info" class="info">
     <p>Double-click to edit a todo</p>
     <p>Credits:
-        <a href="http://twitter.com/cburgdorf">Christoph Burgdorf</a>,
+        <a href="https://twitter.com/cburgdorf">Christoph Burgdorf</a>,
         <a href="http://ericbidelman.com">Eric Bidelman</a>,
         <a href="http://jacobmumm.com">Jacob Mumm</a> and
         <a href="http://blog.igorminar.com">Igor Minar</a>
     </p>
     <p>Part of <a href="http://todomvc.com">TodoMVC</a></p>
-</footer>
\ No newline at end of file
+</footer>
--- a/third_party/speedometer/resources/todomvc/architecture-examples/backbone/js/app.js
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/backbone/js/app.js
@@ -4,9 +4,13 @@ var app = app || {};
 var ENTER_KEY = 13;
 var ESC_KEY = 27;
 
 $(function () {
     'use strict';
 
     // kick things off by creating the `App`
     window.appView = new app.AppView();
+
+    var dummyNodeToNotifyAppIsReady = document.createElement('div');
+    dummyNodeToNotifyAppIsReady.id = 'appIsReady';
+    document.body.appendChild(dummyNodeToNotifyAppIsReady);
 });
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/assets/todomvc.js
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/assets/todomvc.js
new file mode 100644
--- /dev/null
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/assets/vendor.css
@@ -0,0 +1,376 @@
+html,
+body {
+    margin: 0;
+    padding: 0;
+}
+
+button {
+    margin: 0;
+    padding: 0;
+    border: 0;
+    background: none;
+    font-size: 100%;
+    vertical-align: baseline;
+    font-family: inherit;
+    font-weight: inherit;
+    color: inherit;
+    -webkit-appearance: none;
+    appearance: none;
+    -webkit-font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
+}
+
+body {
+    font: 14px 'Helvetica Neue', Helvetica, Arial, sans-serif;
+    line-height: 1.4em;
+    background: #f5f5f5;
+    color: #4d4d4d;
+    min-width: 230px;
+    max-width: 550px;
+    margin: 0 auto;
+    -webkit-font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
+    font-weight: 300;
+}
+
+:focus {
+    outline: 0;
+}
+
+.hidden {
+    display: none;
+}
+
+#todoapp {
+    background: #fff;
+    margin: 130px 0 40px 0;
+    position: relative;
+    box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2),
+                0 25px 50px 0 rgba(0, 0, 0, 0.1);
+}
+
+#todoapp input::-webkit-input-placeholder {
+    font-style: italic;
+    font-weight: 300;
+    color: #e6e6e6;
+}
+
+#todoapp input::-moz-placeholder {
+    font-style: italic;
+    font-weight: 300;
+    color: #e6e6e6;
+}
+
+#todoapp input::input-placeholder {
+    font-style: italic;
+    font-weight: 300;
+    color: #e6e6e6;
+}
+
+#todoapp h1 {
+    position: absolute;
+    top: -155px;
+    width: 100%;
+    font-size: 100px;
+    font-weight: 100;
+    text-align: center;
+    color: rgba(175, 47, 47, 0.15);
+    -webkit-text-rendering: optimizeLegibility;
+    -moz-text-rendering: optimizeLegibility;
+    text-rendering: optimizeLegibility;
+}
+
+#new-todo,
+.edit {
+    position: relative;
+    margin: 0;
+    width: 100%;
+    font-size: 24px;
+    font-family: inherit;
+    font-weight: inherit;
+    line-height: 1.4em;
+    border: 0;
+    color: inherit;
+    padding: 6px;
+    border: 1px solid #999;
+    box-shadow: inset 0 -1px 5px 0 rgba(0, 0, 0, 0.2);
+    box-sizing: border-box;
+    -webkit-font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
+}
+
+#new-todo {
+    padding: 16px 16px 16px 60px;
+    border: none;
+    background: rgba(0, 0, 0, 0.003);
+    box-shadow: inset 0 -2px 1px rgba(0,0,0,0.03);
+}
+
+#main {
+    position: relative;
+    z-index: 2;
+    border-top: 1px solid #e6e6e6;
+}
+
+#toggle-all {
+    text-align: center;
+    border: none; /* Mobile Safari */
+    opacity: 0;
+    position: absolute;
+}
+
+#toggle-all + label {
+    width: 60px;
+    height: 34px;
+    font-size: 0;
+    position: absolute;
+    top: -52px;
+    left: -13px;
+    -webkit-transform: rotate(90deg);
+    transform: rotate(90deg);
+}
+
+#toggle-all + label:before {
+    content: '❯';
+    font-size: 22px;
+    color: #e6e6e6;
+    padding: 10px 27px 10px 27px;
+}
+
+#toggle-all:checked + label:before {
+    color: #737373;
+}
+
+#todo-list {
+    margin: 0;
+    padding: 0;
+    list-style: none;
+}
+
+#todo-list li {
+    position: relative;
+    font-size: 24px;
+    border-bottom: 1px solid #ededed;
+}
+
+#todo-list li:last-child {
+    border-bottom: none;
+}
+
+#todo-list li.editing {
+    border-bottom: none;
+    padding: 0;
+}
+
+#todo-list li.editing .edit {
+    display: block;
+    width: 506px;
+    padding: 12px 16px;
+    margin: 0 0 0 43px;
+}
+
+#todo-list li.editing .view {
+    display: none;
+}
+
+#todo-list li .toggle {
+    text-align: center;
+    width: 40px;
+    /* auto, since non-WebKit browsers doesn't support input styling */
+    height: auto;
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    margin: auto 0;
+    border: none; /* Mobile Safari */
+    -webkit-appearance: none;
+    appearance: none;
+}
+
+#todo-list li .toggle {
+    opacity: 0;
+}
+
+#todo-list li .toggle + label {
+    /*
+        Firefox requires `#` to be escaped - https://bugzilla.mozilla.org/show_bug.cgi?id=922433
+        IE and Edge requires *everything* to be escaped to render, so we do that instead of just the `#` - https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/7157459/
+    */
+    background-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23ededed%22%20stroke-width%3D%223%22/%3E%3C/svg%3E');
+    background-repeat: no-repeat;
+    background-position: center left;
+}
+
+#todo-list li .toggle:checked + label {
+    background-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23bddad5%22%20stroke-width%3D%223%22/%3E%3Cpath%20fill%3D%22%235dc2af%22%20d%3D%22M72%2025L42%2071%2027%2056l-4%204%2020%2020%2034-52z%22/%3E%3C/svg%3E');
+}
+
+#todo-list li label {
+    word-break: break-all;
+    padding: 15px 15px 15px 60px;
+    display: block;
+    line-height: 1.2;
+    transition: color 0.4s;
+}
+
+#todo-list li.completed label {
+    color: #d9d9d9;
+    text-decoration: line-through;
+}
+
+#todo-list li .destroy {
+    display: none;
+    position: absolute;
+    top: 0;
+    right: 10px;
+    bottom: 0;
+    width: 40px;
+    height: 40px;
+    margin: auto 0;
+    font-size: 30px;
+    color: #cc9a9a;
+    margin-bottom: 11px;
+    transition: color 0.2s ease-out;
+}
+
+#todo-list li .destroy:hover {
+    color: #af5b5e;
+}
+
+#todo-list li .destroy:after {
+    content: '×';
+}
+
+#todo-list li:hover .destroy {
+    display: block;
+}
+
+#todo-list li .edit {
+    display: none;
+}
+
+#todo-list li.editing:last-child {
+    margin-bottom: -1px;
+}
+
+#footer {
+    color: #777;
+    padding: 10px 15px;
+    height: 20px;
+    text-align: center;
+    border-top: 1px solid #e6e6e6;
+}
+
+#footer:before {
+    content: '';
+    position: absolute;
+    right: 0;
+    bottom: 0;
+    left: 0;
+    height: 50px;
+    overflow: hidden;
+    box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2),
+                0 8px 0 -3px #f6f6f6,
+                0 9px 1px -3px rgba(0, 0, 0, 0.2),
+                0 16px 0 -6px #f6f6f6,
+                0 17px 2px -6px rgba(0, 0, 0, 0.2);
+}
+
+#todo-count {
+    float: left;
+    text-align: left;
+}
+
+#todo-count strong {
+    font-weight: 300;
+}
+
+#filters {
+    margin: 0;
+    padding: 0;
+    list-style: none;
+    position: absolute;
+    right: 0;
+    left: 0;
+}
+
+#filters li {
+    display: inline;
+}
+
+#filters li a {
+    color: inherit;
+    margin: 3px;
+    padding: 3px 7px;
+    text-decoration: none;
+    border: 1px solid transparent;
+    border-radius: 3px;
+}
+
+#filters li a:hover {
+    border-color: rgba(175, 47, 47, 0.1);
+}
+
+#filters li a.selected {
+    border-color: rgba(175, 47, 47, 0.2);
+}
+
+#clear-completed,
+html #clear-completed:active {
+    float: right;
+    position: relative;
+    line-height: 20px;
+    text-decoration: none;
+    cursor: pointer;
+}
+
+#clear-completed:hover {
+    text-decoration: underline;
+}
+
+#info {
+    margin: 65px auto 0;
+    color: #bfbfbf;
+    font-size: 10px;
+    text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+    text-align: center;
+}
+
+#info p {
+    line-height: 1;
+}
+
+#info a {
+    color: inherit;
+    text-decoration: none;
+    font-weight: 400;
+}
+
+#info a:hover {
+    text-decoration: underline;
+}
+
+/*
+    Hack to remove background from Mobile Safari.
+    Can't use it globally since it destroys checkboxes in Firefox
+*/
+@media screen and (-webkit-min-device-pixel-ratio:0) {
+    #toggle-all,
+    #todo-list li .toggle {
+        background: none;
+    }
+
+    #todo-list li .toggle {
+        height: 40px;
+    }
+}
+
+@media (max-width: 430px) {
+    #footer {
+        height: 50px;
+    }
+
+    #filters {
+        bottom: 10px;
+    }
+}
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/assets/vendor.js
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/assets/vendor.js
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/crossdomain.xml
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/crossdomain.xml
new file mode 100644
--- /dev/null
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/index.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <title>Todomvc</title>
+    <meta name="description" content="">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+   
+<meta name="todomvc/config/environment" content="%7B%22modulePrefix%22%3A%22todomvc%22%2C%22environment%22%3A%22development%22%2C%22locationType%22%3A%22none%22%2C%22EmberENV%22%3A%7B%22FEATURES%22%3A%7B%7D%7D%2C%22APP%22%3A%7B%22name%22%3A%22todomvc%22%2C%22version%22%3A%220.0.0%202c3f8158%22%7D%2C%22exportApplicationGlobal%22%3Atrue%7D" />
+
+    <link rel="stylesheet" href="assets/vendor.css">
+
+    
+  </head>
+  <body>
+    
+
+    <script src="assets/vendor.js"></script>
+    <script src="assets/todomvc.js"></script>
+
+    
+  </body>
+</html>
\ No newline at end of file
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/robots.txt
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/robots.txt
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/.bowerrc
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/source/.bowerrc
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/.editorconfig
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/source/.editorconfig
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/.ember-cli
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/source/.ember-cli
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/.gitignore
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/source/.gitignore
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/.jshintrc
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/source/.jshintrc
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/.travis.yml
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/source/.travis.yml
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/.watchmanconfig
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/source/.watchmanconfig
new file mode 100644
--- /dev/null
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/source/README.md
@@ -0,0 +1,15 @@
+# Ember.js TodoMVC Example using Ember CLI
+
+> A framework for creating ambitious web applications.
+
+> _[Ember.js - emberjs.com](http://emberjs.com)_
+> _[Ember CLI - ember-cli.com](http://ember-cli.com)_
+
+## Note for people updating this app.
+
+The `index.html` and the `assets` folder in the parent folder as simlinks into the items with the
+same names inside `dist`. The `dist` folder has to be checked in git and built for production.
+
+To work on this comment `<base href="/examples/ember-cli/index.html" />` in the `app/index.html`
+and uncommented it back before doing the production build.
+
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/app.js
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/source/app/app.js
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/components/todo-item.js
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/source/app/components/todo-item.js
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/components/todo-list.js
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/source/app/components/todo-list.js
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/controllers/active.js
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/source/app/controllers/active.js
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/controllers/application.js
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/source/app/controllers/application.js
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/controllers/completed.js
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/source/app/controllers/completed.js
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/helpers/gt.js
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/source/app/helpers/gt.js
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/helpers/pluralize.js
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/source/app/helpers/pluralize.js
new file mode 100644
--- /dev/null
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/source/app/index.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <title>Todomvc</title>
+    <meta name="description" content="">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    {{content-for "head"}}
+
+    <link rel="stylesheet" href="assets/vendor.css">
+    <link rel="stylesheet" href="assets/todomvc.css">
+
+    {{content-for "head-footer"}}
+  </head>
+  <body>
+    {{content-for "body"}}
+
+    <script src="assets/vendor.js"></script>
+    <script src="assets/todomvc.js"></script>
+
+    {{content-for "body-footer"}}
+  </body>
+</html>
new file mode 100644
--- /dev/null
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/source/app/instance-initializers/global.js
@@ -0,0 +1,10 @@
+// app/instance-initializers/global.js
+
+export function initialize(application) {
+  window.App = application;  // or window.Whatever
+}
+
+export default {
+  name: 'global',
+  initialize: initialize
+};
\ No newline at end of file
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/resolver.js
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/source/app/resolver.js
new file mode 100644
--- /dev/null
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/source/app/router.js
@@ -0,0 +1,13 @@
+import Ember from 'ember';
+import config from './config/environment';
+
+const Router = Ember.Router.extend({
+    location: config.locationType
+});
+
+Router.map(function () {
+    this.route('active');
+    this.route('completed');
+});
+
+export default Router;
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/routes/application.js
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/source/app/routes/application.js
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/services/memory.js
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/source/app/services/memory.js
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/services/repo.js
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/source/app/services/repo.js
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/templates/active.hbs
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/source/app/templates/active.hbs
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/templates/application.hbs
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/source/app/templates/application.hbs
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/templates/completed.hbs
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/source/app/templates/completed.hbs
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/templates/components/todo-item.hbs
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/source/app/templates/components/todo-item.hbs
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/templates/components/todo-list.hbs
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/source/app/templates/components/todo-list.hbs
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/templates/index.hbs
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/source/app/templates/index.hbs
new file mode 100644
--- /dev/null
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/source/bower.json
@@ -0,0 +1,9 @@
+{
+  "name": "todomvc",
+  "dependencies": {
+    "ember": "~2.6.0",
+    "ember-cli-shims": "0.1.1",
+    "ember-cli-test-loader": "0.2.2",
+    "ember-qunit-notifications": "0.1.0"
+  }
+}
new file mode 100644
--- /dev/null
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/source/config/environment.js
@@ -0,0 +1,47 @@
+/* jshint node: true */
+
+module.exports = function (environment) {
+    var ENV = {
+        modulePrefix: 'todomvc',
+        environment: environment,
+        baseURL: null,
+        locationType: 'auto',
+        EmberENV: {
+            FEATURES: {
+                // Here you can enable experimental features on an ember canary build
+                // e.g. 'with-controller': true
+            }
+        },
+
+        APP: {
+            // Here you can pass flags/options to your application instance
+            // when it is created
+        }
+    };
+
+    // if (environment === 'development') {
+    //  ENV.APP.LOG_RESOLVER = true;
+    //  ENV.APP.LOG_ACTIVE_GENERATION = true;
+    //  ENV.APP.LOG_TRANSITIONS = true;
+    //  ENV.APP.LOG_TRANSITIONS_INTERNAL = true;
+    //  ENV.APP.LOG_VIEW_LOOKUPS = true;
+    // }
+
+    if (environment === 'test') {
+        // Testem prefers this...
+        ENV.baseURL = '/';
+        ENV.locationType = 'none';
+
+        // keep test console output quieter
+        ENV.APP.LOG_ACTIVE_GENERATION = false;
+        ENV.APP.LOG_VIEW_LOOKUPS = false;
+
+        ENV.APP.rootElement = '#ember-testing';
+    }
+
+    // if (environment === 'production') {
+
+    // }
+
+    return ENV;
+};
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/ember-cli-build.js
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/source/ember-cli-build.js
new file mode 100644
--- /dev/null
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/source/package.json
@@ -0,0 +1,42 @@
+{
+  "name": "todomvc",
+  "version": "0.0.0",
+  "description": "Small description for todomvc goes here",
+  "private": true,
+  "directories": {
+    "doc": "doc",
+    "test": "tests"
+  },
+  "scripts": {
+    "build": "ember build",
+    "start": "ember server",
+    "test": "ember test"
+  },
+  "repository": "",
+  "engines": {
+    "node": ">= 0.10.0"
+  },
+  "author": "",
+  "license": "MIT",
+  "devDependencies": {
+    "broccoli-asset-rev": "^2.4.2",
+    "ember-ajax": "0.7.1",
+    "ember-cli": "2.5.0",
+    "ember-cli-app-version": "^1.0.0",
+    "ember-cli-babel": "^5.1.6",
+    "ember-cli-dependency-checker": "^1.2.0",
+    "ember-cli-htmlbars": "^1.0.3",
+    "ember-cli-htmlbars-inline-precompile": "^0.3.1",
+    "ember-cli-inject-live-reload": "^1.4.0",
+    "ember-cli-jshint": "^1.0.0",
+    "ember-cli-qunit": "^1.4.0",
+    "ember-cli-release": "0.2.8",
+    "ember-cli-sri": "^2.1.0",
+    "ember-cli-uglify": "^1.2.0",
+    "ember-export-application-global": "^1.0.5",
+    "ember-inflector": "1.9.4",
+    "ember-load-initializers": "^0.5.1",
+    "ember-resolver": "^2.0.3",
+    "loader.js": "^4.0.1"
+  }
+}
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/dist/crossdomain.xml
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/source/public/crossdomain.xml
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/dist/robots.txt
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/source/public/robots.txt
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/testem.js
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/source/testem.js
new file mode 100644
--- /dev/null
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/source/tests/.jshintrc
@@ -0,0 +1,52 @@
+{
+  "predef": [
+    "document",
+    "window",
+    "location",
+    "setTimeout",
+    "$",
+    "-Promise",
+    "define",
+    "console",
+    "visit",
+    "exists",
+    "fillIn",
+    "click",
+    "keyEvent",
+    "triggerEvent",
+    "find",
+    "findWithAssert",
+    "wait",
+    "DS",
+    "andThen",
+    "currentURL",
+    "currentPath",
+    "currentRouteName"
+  ],
+  "node": false,
+  "browser": false,
+  "boss": true,
+  "curly": true,
+  "debug": false,
+  "devel": false,
+  "eqeqeq": true,
+  "evil": true,
+  "forin": false,
+  "immed": false,
+  "laxbreak": false,
+  "newcap": true,
+  "noarg": true,
+  "noempty": false,
+  "nonew": false,
+  "nomen": false,
+  "onevar": false,
+  "plusplus": false,
+  "regexp": false,
+  "undef": true,
+  "sub": true,
+  "strict": false,
+  "white": false,
+  "eqnull": true,
+  "esnext": true,
+  "unused": true
+}
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/tests/helpers/destroy-app.js
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/source/tests/helpers/destroy-app.js
new file mode 100644
--- /dev/null
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/source/tests/helpers/module-for-acceptance.js
@@ -0,0 +1,22 @@
+import { module } from 'qunit';
+import startApp from '../helpers/start-app';
+import destroyApp from '../helpers/destroy-app';
+
+export default function (name, options = {}) {
+    module(name, {
+        beforeEach() {
+            this.application = startApp();
+
+            if (options.beforeEach) {
+                options.beforeEach.apply(this, arguments);
+            }
+        },
+
+        afterEach() {
+            if (options.afterEach) {
+                options.afterEach.apply(this, arguments);
+            }
+            destroyApp(this.application);
+        }
+    });
+}
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/tests/helpers/resolver.js
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/source/tests/helpers/resolver.js
new file mode 100644
--- /dev/null
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/source/tests/helpers/start-app.js
@@ -0,0 +1,18 @@
+import Ember from 'ember';
+import Application from '../../app';
+import config from '../../config/environment';
+
+export default function startApp(attrs) {
+    let application;
+
+    let attributes = Ember.merge({}, config.APP);
+    attributes = Ember.merge(attributes, attrs); // use defaults, but you can override;
+
+    Ember.run(() => {
+        application = Application.create(attributes);
+        application.setupForTesting();
+        application.injectTestHelpers();
+    });
+
+    return application;
+}
new file mode 100644
--- /dev/null
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/source/tests/index.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <title>Todomvc Tests</title>
+    <meta name="description" content="">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+
+    {{content-for "head"}}
+    {{content-for "test-head"}}
+
+    <link rel="stylesheet" href="assets/vendor.css">
+    <link rel="stylesheet" href="assets/todomvc.css">
+    <link rel="stylesheet" href="assets/test-support.css">
+
+    {{content-for "head-footer"}}
+    {{content-for "test-head-footer"}}
+  </head>
+  <body>
+    {{content-for "body"}}
+    {{content-for "test-body"}}
+
+    <script src="testem.js" integrity=""></script>
+    <script src="assets/vendor.js"></script>
+    <script src="assets/test-support.js"></script>
+    <script src="assets/todomvc.js"></script>
+    <script src="assets/tests.js"></script>
+    <script src="assets/test-loader.js"></script>
+
+    {{content-for "body-footer"}}
+    {{content-for "test-body-footer"}}
+  </body>
+</html>
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/tests/test-helper.js
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/source/tests/test-helper.js
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/vendor/base.css
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/source/vendor/base.css
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/vendor/index.css
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/source/vendor/index.css
copy from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/testem.js
copy to third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/testem.js
copy from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/tests/index.html
copy to third_party/speedometer/resources/todomvc/architecture-examples/emberjs-debug/tests/index.html
copy from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/.bowerrc
copy to third_party/speedometer/resources/todomvc/architecture-examples/emberjs/.bowerrc
copy from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/.editorconfig
copy to third_party/speedometer/resources/todomvc/architecture-examples/emberjs/.editorconfig
copy from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/.ember-cli
copy to third_party/speedometer/resources/todomvc/architecture-examples/emberjs/.ember-cli
new file mode 100644
--- /dev/null
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/emberjs/.gitignore
@@ -0,0 +1,18 @@
+# See http://help.github.com/ignore-files/ for more about ignoring files.
+
+# compiled output
+# /dist
+/dist/assets/.gitkeep
+/tmp
+
+# dependencies
+/node_modules
+/bower_components
+
+# misc
+/.sass-cache
+/connect.lock
+/coverage/*
+/libpeerconnection.log
+npm-debug.log
+testem.log
copy from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/.jshintrc
copy to third_party/speedometer/resources/todomvc/architecture-examples/emberjs/.jshintrc
--- a/third_party/speedometer/resources/todomvc/architecture-examples/emberjs/README.md
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/emberjs/README.md
@@ -1,3 +1,8 @@
 # Speedometer 2.0: Ember.js TodoMVC example
 
-See `source/README.md`.
+## Test locally
+
+1. `npm install && bower install`
+2. `npm run build`
+3. Run a local server from the `dist` directory. (You could use [`npm i -g http-server`](https://github.com/indexzero/http-server).)
+4. Open the URL pointing to the local server in your web browser of choice.
copy from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/app.js
copy to third_party/speedometer/resources/todomvc/architecture-examples/emberjs/app/app.js
copy from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/components/todo-item.js
copy to third_party/speedometer/resources/todomvc/architecture-examples/emberjs/app/components/todo-item.js
new file mode 100644
--- /dev/null
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/emberjs/app/components/todo-list.js
@@ -0,0 +1,28 @@
+import Ember from 'ember';
+
+export default Ember.Component.extend({
+    repo: Ember.inject.service(),
+    tagName: 'section',
+    elementId: 'main',
+    classNames: ['main'],
+    canToggle: true,
+    allCompleted: Ember.computed('todos.@each.completed', function () {
+        return this.get('todos').isEvery('completed');
+    }),
+
+    actions: {
+        enableToggle() {
+            this.set('canToggle', true);
+        },
+
+        disableToggle() {
+            this.set('canToggle', false);
+        },
+
+        toggleAll() {
+            let allCompleted = this.get('allCompleted');
+            this.get('todos').forEach(todo => Ember.set(todo, 'completed', !allCompleted));
+            this.get('repo').persist();
+        }
+    }
+});
copy from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/controllers/active.js
copy to third_party/speedometer/resources/todomvc/architecture-examples/emberjs/app/controllers/active.js
copy from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/controllers/application.js
copy to third_party/speedometer/resources/todomvc/architecture-examples/emberjs/app/controllers/application.js
copy from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/controllers/completed.js
copy to third_party/speedometer/resources/todomvc/architecture-examples/emberjs/app/controllers/completed.js
copy from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/helpers/gt.js
copy to third_party/speedometer/resources/todomvc/architecture-examples/emberjs/app/helpers/gt.js
copy from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/helpers/pluralize.js
copy to third_party/speedometer/resources/todomvc/architecture-examples/emberjs/app/helpers/pluralize.js
new file mode 100644
--- /dev/null
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/emberjs/app/index.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <title>Ember.js TodoMVC example</title>
+    <meta name="description" content="">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    {{content-for "head"}}
+    <link rel="stylesheet" href="{{rootURL}}assets/vendor.css">
+    {{content-for "head-footer"}}
+  </head>
+  <body>
+    {{content-for "body"}}
+    <script src="{{rootURL}}assets/vendor.js"></script>
+    <script src="{{rootURL}}assets/todomvc.js"></script>
+    {{content-for "body-footer"}}
+  </body>
+</html>
copy from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/resolver.js
copy to third_party/speedometer/resources/todomvc/architecture-examples/emberjs/app/resolver.js
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/router.js
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs/app/router.js
copy from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/routes/application.js
copy to third_party/speedometer/resources/todomvc/architecture-examples/emberjs/app/routes/application.js
copy from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/services/memory.js
copy to third_party/speedometer/resources/todomvc/architecture-examples/emberjs/app/services/memory.js
copy from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/services/repo.js
copy to third_party/speedometer/resources/todomvc/architecture-examples/emberjs/app/services/repo.js
new file mode 100644
--- /dev/null
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/emberjs/app/styles/.gitkeep
@@ -0,0 +1,2 @@
+# This file ensures the `app/styles` directory is included in the repository.
+# Without that directory present, the Ember TodoMVC example fails to build.
copy from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/templates/active.hbs
copy to third_party/speedometer/resources/todomvc/architecture-examples/emberjs/app/templates/active.hbs
new file mode 100644
--- /dev/null
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/emberjs/app/templates/application.hbs
@@ -0,0 +1,29 @@
+<section id="todoapp" class="todoapp">
+  <header id="header" class="header">
+    <h1>todos</h1>
+    <input type="text" id="new-todo" class="new-todo" onkeydown={{action 'createTodo'}} placeholder="What needs to be done?" autofocus>
+  </header>
+    {{outlet}}
+    {{#if (gt model.length 0)}}
+      <footer id="footer" class="footer">
+        <span id="todo-count" class="todo-count"><strong>{{remaining.length}}</strong> {{pluralize 'item' remaining.length}} left</span>
+        <ul id="filters" class="filters">
+          <li>{{#link-to "index" activeClass="selected"}}All{{/link-to}}</li>
+          <li>{{#link-to "active" activeClass="selected"}}Active{{/link-to}}</li>
+          <li>{{#link-to "completed" activeClass="selected"}}Completed{{/link-to}}</li>
+        </ul>
+        {{#if completed.length}}
+          <button id="clear-completed" class="clear-completed" onclick={{action 'clearCompleted'}}>Clear completed</button>
+        {{/if}}
+      </footer>
+    {{/if}}
+</section>
+<footer id="info" class="info">
+  <p>Double-click to edit a todo</p>
+  <p>
+    Created by
+    <a href="http://github.com/cibernox">Miguel Camba</a>,
+    <a href="http://github.com/addyosmani">Addy Osmani</a>
+  </p>
+  <p>Part of <a href="http://todomvc.com">TodoMVC</a></p>
+</footer>
\ No newline at end of file
copy from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/templates/completed.hbs
copy to third_party/speedometer/resources/todomvc/architecture-examples/emberjs/app/templates/completed.hbs
copy from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/templates/components/todo-item.hbs
copy to third_party/speedometer/resources/todomvc/architecture-examples/emberjs/app/templates/components/todo-item.hbs
new file mode 100644
--- /dev/null
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/emberjs/app/templates/components/todo-list.hbs
@@ -0,0 +1,10 @@
+{{#if todos.length}}
+  {{#if canToggle}}
+    <input type="checkbox" id="toggle-all" class="toggle-all" checked={{allCompleted}} onchange={{action 'toggleAll'}}>
+  {{/if}}
+  <ul id="todo-list" class="todo-list">
+    {{#each todos as |todo|}}
+      {{todo-item todo=todo onStartEdit=(action 'disableToggle') onEndEdit=(action 'enableToggle')}}
+    {{/each}}
+  </ul>
+{{/if}}
copy from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/templates/index.hbs
copy to third_party/speedometer/resources/todomvc/architecture-examples/emberjs/app/templates/index.hbs
deleted file mode 100644
--- a/third_party/speedometer/resources/todomvc/architecture-examples/emberjs/assets/vendor.css
+++ /dev/null
@@ -1,521 +0,0 @@
-hr {
-    margin: 20px 0;
-    border: 0;
-    border-top: 1px dashed #c5c5c5;
-    border-bottom: 1px dashed #f7f7f7;
-}
-
-.learn a {
-    font-weight: normal;
-    text-decoration: none;
-    color: #b83f45;
-}
-
-.learn a:hover {
-    text-decoration: underline;
-    color: #787e7e;
-}
-
-.learn h3,
-.learn h4,
-.learn h5 {
-    margin: 10px 0;
-    font-weight: 500;
-    line-height: 1.2;
-    color: #000;
-}
-
-.learn h3 {
-    font-size: 24px;
-}
-
-.learn h4 {
-    font-size: 18px;
-}
-
-.learn h5 {
-    margin-bottom: 0;
-    font-size: 14px;
-}
-
-.learn ul {
-    padding: 0;
-    margin: 0 0 30px 25px;
-}
-
-.learn li {
-    line-height: 20px;
-}
-
-.learn p {
-    font-size: 15px;
-    font-weight: 300;
-    line-height: 1.3;
-    margin-top: 0;
-    margin-bottom: 0;
-}
-
-#issue-count {
-    display: none;
-}
-
-.quote {
-    border: none;
-    margin: 20px 0 60px 0;
-}
-
-.quote p {
-    font-style: italic;
-}
-
-.quote p:before {
-    content: '“';
-    font-size: 50px;
-    opacity: .15;
-    position: absolute;
-    top: -20px;
-    left: 3px;
-}
-
-.quote p:after {
-    content: '”';
-    font-size: 50px;
-    opacity: .15;
-    position: absolute;
-    bottom: -42px;
-    right: 3px;
-}
-
-.quote footer {
-    position: absolute;
-    bottom: -40px;
-    right: 0;
-}
-
-.quote footer img {
-    border-radius: 3px;
-}
-
-.quote footer a {
-    margin-left: 5px;
-    vertical-align: middle;
-}
-
-.speech-bubble {
-    position: relative;
-    padding: 10px;
-    background: rgba(0, 0, 0, .04);
-    border-radius: 5px;
-}
-
-.speech-bubble:after {
-    content: '';
-    position: absolute;
-    top: 100%;
-    right: 30px;
-    border: 13px solid transparent;
-    border-top-color: rgba(0, 0, 0, .04);
-}
-
-.learn-bar > .learn {
-    position: absolute;
-    width: 272px;
-    top: 8px;
-    left: -300px;
-    padding: 10px;
-    border-radius: 5px;
-    background-color: rgba(255, 255, 255, .6);
-    transition-property: left;
-    transition-duration: 500ms;
-}
-
-@media (min-width: 899px) {
-    .learn-bar {
-        width: auto;
-        padding-left: 300px;
-    }
-
-    .learn-bar > .learn {
-        left: 8px;
-    }
-}
-
-html,
-body {
-    margin: 0;
-    padding: 0;
-}
-
-button {
-    margin: 0;
-    padding: 0;
-    border: 0;
-    background: none;
-    font-size: 100%;
-    vertical-align: baseline;
-    font-family: inherit;
-    font-weight: inherit;
-    color: inherit;
-    -webkit-appearance: none;
-    appearance: none;
-    -webkit-font-smoothing: antialiased;
-    -moz-font-smoothing: antialiased;
-    font-smoothing: antialiased;
-}
-
-body {
-    font: 14px 'Helvetica Neue', Helvetica, Arial, sans-serif;
-    line-height: 1.4em;
-    background: #f5f5f5;
-    color: #4d4d4d;
-    min-width: 230px;
-    max-width: 550px;
-    margin: 0 auto;
-    -webkit-font-smoothing: antialiased;
-    -moz-font-smoothing: antialiased;
-    font-smoothing: antialiased;
-    font-weight: 300;
-}
-
-button,
-input[type="checkbox"] {
-    outline: none;
-}
-
-.hidden {
-    display: none;
-}
-
-#todoapp {
-    background: #fff;
-    margin: 130px 0 40px 0;
-    position: relative;
-    box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2),
-                0 25px 50px 0 rgba(0, 0, 0, 0.1);
-}
-
-#todoapp input::-webkit-input-placeholder {
-    font-style: italic;
-    font-weight: 300;
-    color: #e6e6e6;
-}
-
-#todoapp input::-moz-placeholder {
-    font-style: italic;
-    font-weight: 300;
-    color: #e6e6e6;
-}
-
-#todoapp input::input-placeholder {
-    font-style: italic;
-    font-weight: 300;
-    color: #e6e6e6;
-}
-
-#todoapp h1 {
-    position: absolute;
-    top: -155px;
-    width: 100%;
-    font-size: 100px;
-    font-weight: 100;
-    text-align: center;
-    color: rgba(175, 47, 47, 0.15);
-    -webkit-text-rendering: optimizeLegibility;
-    -moz-text-rendering: optimizeLegibility;
-    text-rendering: optimizeLegibility;
-}
-
-#new-todo,
-.edit {
-    position: relative;
-    margin: 0;
-    width: 100%;
-    font-size: 24px;
-    font-family: inherit;
-    font-weight: inherit;
-    line-height: 1.4em;
-    border: 0;
-    outline: none;
-    color: inherit;
-    padding: 6px;
-    border: 1px solid #999;
-    box-shadow: inset 0 -1px 5px 0 rgba(0, 0, 0, 0.2);
-    box-sizing: border-box;
-    -webkit-font-smoothing: antialiased;
-    -moz-font-smoothing: antialiased;
-    font-smoothing: antialiased;
-}
-
-#new-todo {
-    padding: 16px 16px 16px 60px;
-    border: none;
-    background: rgba(0, 0, 0, 0.003);
-    box-shadow: inset 0 -2px 1px rgba(0,0,0,0.03);
-}
-
-#main {
-    position: relative;
-    z-index: 2;
-    border-top: 1px solid #e6e6e6;
-}
-
-label[for='toggle-all'] {
-    display: none;
-}
-
-#toggle-all {
-    position: absolute;
-    top: -55px;
-    left: -12px;
-    width: 60px;
-    height: 34px;
-    text-align: center;
-    border: none; /* Mobile Safari */
-}
-
-#toggle-all:before {
-    content: '❯';
-    font-size: 22px;
-    color: #e6e6e6;
-    padding: 10px 27px 10px 27px;
-}
-
-#toggle-all:checked:before {
-    color: #737373;
-}
-
-#todo-list {
-    margin: 0;
-    padding: 0;
-    list-style: none;
-}
-
-#todo-list li {
-    position: relative;
-    font-size: 24px;
-    border-bottom: 1px solid #ededed;
-}
-
-#todo-list li:last-child {
-    border-bottom: none;
-}
-
-#todo-list li.editing {
-    border-bottom: none;
-    padding: 0;
-}
-
-#todo-list li.editing .edit {
-    display: block;
-    width: 506px;
-    padding: 13px 17px 12px 17px;
-    margin: 0 0 0 43px;
-}
-
-#todo-list li.editing .view {
-    display: none;
-}
-
-#todo-list li .toggle {
-    text-align: center;
-    width: 40px;
-    /* auto, since non-WebKit browsers doesn't support input styling */
-    height: auto;
-    position: absolute;
-    top: 0;
-    bottom: 0;
-    margin: auto 0;
-    border: none; /* Mobile Safari */
-    -webkit-appearance: none;
-    appearance: none;
-}
-
-#todo-list li .toggle:after {
-    content: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="-10 -18 100 135"><circle cx="50" cy="50" r="50" fill="none" stroke="#ededed" stroke-width="3"/></svg>');
-}
-
-#todo-list li .toggle:checked:after {
-    content: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="-10 -18 100 135"><circle cx="50" cy="50" r="50" fill="none" stroke="#bddad5" stroke-width="3"/><path fill="#5dc2af" d="M72 25L42 71 27 56l-4 4 20 20 34-52z"/></svg>');
-}
-
-#todo-list li label {
-    white-space: pre;
-    word-break: break-word;
-    padding: 15px 60px 15px 15px;
-    margin-left: 45px;
-    display: block;
-    line-height: 1.2;
-    transition: color 0.4s;
-}
-
-#todo-list li.completed label {
-    color: #d9d9d9;
-    text-decoration: line-through;
-}
-
-#todo-list li .destroy {
-    display: none;
-    position: absolute;
-    top: 0;
-    right: 10px;
-    bottom: 0;
-    width: 40px;
-    height: 40px;
-    margin: auto 0;
-    font-size: 30px;
-    color: #cc9a9a;
-    margin-bottom: 11px;
-    transition: color 0.2s ease-out;
-}
-
-#todo-list li .destroy:hover {
-    color: #af5b5e;
-}
-
-#todo-list li .destroy:after {
-    content: '×';
-}
-
-#todo-list li:hover .destroy {
-    display: block;
-}
-
-#todo-list li .edit {
-    display: none;
-}
-
-#todo-list li.editing:last-child {
-    margin-bottom: -1px;
-}
-
-#footer {
-    color: #777;
-    padding: 10px 15px;
-    height: 20px;
-    text-align: center;
-    border-top: 1px solid #e6e6e6;
-}
-
-#footer:before {
-    content: '';
-    position: absolute;
-    right: 0;
-    bottom: 0;
-    left: 0;
-    height: 50px;
-    overflow: hidden;
-    box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2),
-                0 8px 0 -3px #f6f6f6,
-                0 9px 1px -3px rgba(0, 0, 0, 0.2),
-                0 16px 0 -6px #f6f6f6,
-                0 17px 2px -6px rgba(0, 0, 0, 0.2);
-}
-
-#todo-count {
-    float: left;
-    text-align: left;
-}
-
-#todo-count strong {
-    font-weight: 300;
-}
-
-#filters {
-    margin: 0;
-    padding: 0;
-    list-style: none;
-    position: absolute;
-    right: 0;
-    left: 0;
-}
-
-#filters li {
-    display: inline;
-}
-
-#filters li a {
-    color: inherit;
-    margin: 3px;
-    padding: 3px 7px;
-    text-decoration: none;
-    border: 1px solid transparent;
-    border-radius: 3px;
-}
-
-#filters li a.selected,
-#filters li a:hover {
-    border-color: rgba(175, 47, 47, 0.1);
-}
-
-#filters li a.selected {
-    border-color: rgba(175, 47, 47, 0.2);
-}
-
-#clear-completed,
-html #clear-completed:active {
-    float: right;
-    position: relative;
-    line-height: 20px;
-    text-decoration: none;
-    cursor: pointer;
-    position: relative;
-}
-
-#clear-completed:hover {
-    text-decoration: underline;
-}
-
-#info {
-    margin: 65px auto 0;
-    color: #bfbfbf;
-    font-size: 10px;
-    text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
-    text-align: center;
-}
-
-#info p {
-    line-height: 1;
-}
-
-#info a {
-    color: inherit;
-    text-decoration: none;
-    font-weight: 400;
-}
-
-#info a:hover {
-    text-decoration: underline;
-}
-
-/*
-    Hack to remove background from Mobile Safari.
-    Can't use it globally since it destroys checkboxes in Firefox
-*/
-@media screen and (-webkit-min-device-pixel-ratio:0) {
-    #toggle-all,
-    #todo-list li .toggle {
-        background: none;
-    }
-
-    #todo-list li .toggle {
-        height: 40px;
-    }
-
-    #toggle-all {
-        -webkit-transform: rotate(90deg);
-        transform: rotate(90deg);
-        -webkit-appearance: none;
-        appearance: none;
-    }
-}
-
-@media (max-width: 430px) {
-    #footer {
-        height: 50px;
-    }
-
-    #filters {
-        bottom: 10px;
-    }
-}
-
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/bower.json
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs/bower.json
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/config/environment.js
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs/config/environment.js
new file mode 100644
--- /dev/null
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/emberjs/dist/assets/todomvc-5d3e8eb3d5b3740a33185edcb11eeb57.js
@@ -0,0 +1,30 @@
+"use strict"
+define("todomvc/app",["exports","ember","todomvc/resolver","ember-load-initializers","todomvc/config/environment"],function(e,t,o,n,l){var i=void 0
+t.default.MODEL_FACTORY_INJECTIONS=!0,i=t.default.Application.extend({modulePrefix:l.default.modulePrefix,podModulePrefix:l.default.podModulePrefix,Resolver:o.default}),(0,n.default)(i,l.default.modulePrefix),e.default=i}),define("todomvc/components/todo-item",["exports","ember"],function(e,t){e.default=t.default.Component.extend({repo:t.default.inject.service(),tagName:"li",editing:!1,classNameBindings:["todo.completed","editing"],actions:{startEditing:function(){this.get("onStartEdit")(),this.set("editing",!0),t.default.run.scheduleOnce("afterRender",this,"focusInput")},doneEditing:function(e){this.get("editing")&&(t.default.isBlank(e)?this.send("removeTodo"):(this.set("todo.title",e.trim()),this.set("editing",!1),this.get("onEndEdit")()))},handleKeydown:function(e){13===e.keyCode?e.target.blur():27===e.keyCode&&this.set("editing",!1)},toggleCompleted:function(e){var o=this.get("todo")
+t.default.set(o,"completed",e.target.checked),this.get("repo").persist()},removeTodo:function(){this.get("repo").delete(this.get("todo"))}},focusInput:function(){this.element.querySelector("input.edit").focus()}})}),define("todomvc/components/todo-list",["exports","ember"],function(e,t){e.default=t.default.Component.extend({repo:t.default.inject.service(),tagName:"section",elementId:"main",classNames:["main"],canToggle:!0,allCompleted:t.default.computed("todos.@each.completed",function(){return this.get("todos").isEvery("completed")}),actions:{enableToggle:function(){this.set("canToggle",!0)},disableToggle:function(){this.set("canToggle",!1)},toggleAll:function(){var e=this.get("allCompleted")
+this.get("todos").forEach(function(o){return t.default.set(o,"completed",!e)}),this.get("repo").persist()}}})}),define("todomvc/controllers/active",["exports","ember"],function(e,t){e.default=t.default.Controller.extend({todos:t.default.computed.filterBy("model","completed",!1)})}),define("todomvc/controllers/application",["exports","ember"],function(e,t){e.default=t.default.Controller.extend({repo:t.default.inject.service(),remaining:t.default.computed.filterBy("model","completed",!1),completed:t.default.computed.filterBy("model","completed"),actions:{createTodo:function(e){13!==e.keyCode||t.default.isBlank(e.target.value)||(this.get("repo").add({title:e.target.value.trim(),completed:!1}),e.target.value="")},clearCompleted:function(){this.get("model").removeObjects(this.get("completed")),this.get("repo").persist()}}})}),define("todomvc/controllers/completed",["exports","ember"],function(e,t){e.default=t.default.Controller.extend({todos:t.default.computed.filterBy("model","completed",!0)})}),define("todomvc/helpers/app-version",["exports","ember","todomvc/config/environment","ember-cli-app-version/utils/regexp"],function(e,t,o,n){function l(e){var t=arguments.length<=1||void 0===arguments[1]?{}:arguments[1]
+return t.hideSha?i.match(n.versionRegExp)[0]:t.hideVersion?i.match(n.shaRegExp)[0]:i}e.appVersion=l
+var i=o.default.APP.version
+e.default=t.default.Helper.helper(l)}),define("todomvc/helpers/gt",["exports","ember"],function(e,t){function o(e){var t=n(e,2)
+return t[0]>t[1]}var n=function(){function e(e,t){var o=[],n=!0,l=!1,i=void 0
+try{for(var a,d=e[Symbol.iterator]();!(n=(a=d.next()).done)&&(o.push(a.value),!t||o.length!==t);n=!0);}catch(e){l=!0,i=e}finally{try{!n&&d.return&&d.return()}finally{if(l)throw i}}return o}return function(t,o){if(Array.isArray(t))return t
+if(Symbol.iterator in Object(t))return e(t,o)
+throw new TypeError("Invalid attempt to destructure non-iterable instance")}}()
+e.gt=o,e.default=t.default.Helper.helper(o)}),define("todomvc/helpers/pluralize",["exports","ember","ember-inflector"],function(e,t,o){function n(e){var t=l(e,2),n=t[0]
+return 1===t[1]?n:(0,o.pluralize)(n)}var l=function(){function e(e,t){var o=[],n=!0,l=!1,i=void 0
+try{for(var a,d=e[Symbol.iterator]();!(n=(a=d.next()).done)&&(o.push(a.value),!t||o.length!==t);n=!0);}catch(e){l=!0,i=e}finally{try{!n&&d.return&&d.return()}finally{if(l)throw i}}return o}return function(t,o){if(Array.isArray(t))return t
+if(Symbol.iterator in Object(t))return e(t,o)
+throw new TypeError("Invalid attempt to destructure non-iterable instance")}}()
+e.pluralizeHelper=n,e.default=t.default.Helper.helper(n)}),define("todomvc/helpers/singularize",["exports","ember-inflector/lib/helpers/singularize"],function(e,t){e.default=t.default}),define("todomvc/initializers/app-version",["exports","ember-cli-app-version/initializer-factory","todomvc/config/environment"],function(e,t,o){var n=o.default.APP,l=n.name,i=n.version
+e.default={name:"App Version",initialize:(0,t.default)(l,i)}}),define("todomvc/initializers/container-debug-adapter",["exports","ember-resolver/container-debug-adapter"],function(e,t){e.default={name:"container-debug-adapter",initialize:function(){var e=arguments[1]||arguments[0]
+e.register("container-debug-adapter:main",t.default),e.inject("container-debug-adapter:main","namespace","application:main")}}}),define("todomvc/initializers/export-application-global",["exports","ember","todomvc/config/environment"],function(e,t,o){function n(){var e=arguments[1]||arguments[0]
+if(!1!==o.default.exportApplicationGlobal){var n
+if("undefined"!=typeof window)n=window
+else if("undefined"!=typeof global)n=global
+else{if("undefined"==typeof self)return
+n=self}var l,i=o.default.exportApplicationGlobal
+l="string"==typeof i?i:t.default.String.classify(o.default.modulePrefix),n[l]||(n[l]=e,e.reopen({willDestroy:function(){this._super.apply(this,arguments),delete n[l]}}))}}e.initialize=n,e.default={name:"export-application-global",initialize:n}}),define("todomvc/resolver",["exports","ember-resolver"],function(e,t){e.default=t.default}),define("todomvc/router",["exports","ember","todomvc/config/environment"],function(e,t,o){var n=t.default.Router.extend({location:o.default.locationType,rootURL:o.default.rootURL})
+n.map(function(){this.route("active"),this.route("completed")}),e.default=n}),define("todomvc/routes/application",["exports","ember"],function(e,t){e.default=t.default.Route.extend({repo:t.default.inject.service(),model:function(){return this.get("repo").findAll()}})}),define("todomvc/services/ajax",["exports","ember-ajax/services/ajax"],function(e,t){Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})}),define("todomvc/services/memory",["exports"],function(e){(function(e){var t={},o={}
+t.length=0,t.getItem=function(e){return o[e]||null},t.setItem=function(e,n){void 0===n?t.removeItem(e):(o.hasOwnProperty(e)||t.length++,o[e]=""+n)},t.removeItem=function(e){o.hasOwnProperty(e)&&(delete o[e],t.length--)},t.key=function(e){return Object.keys(o)[e]||null},t.clear=function(){o={},t.length=0},e.localStorageMemory=t})(window)}),define("todomvc/services/repo",["exports","ember","todomvc/services/memory"],function(e,t,o){e.default=t.default.Service.extend({lastId:0,data:null,findAll:function(){return this.get("data")||this.set("data",JSON.parse(window.localStorageMemory.getItem("todos")||"[]"))},add:function(e){var t=Object.assign({id:this.incrementProperty("lastId")},e)
+return this.get("data").pushObject(t),this.persist(),t},delete:function(e){this.get("data").removeObject(e),this.persist()},persist:function(){window.localStorageMemory.setItem("todos",JSON.stringify(this.get("data")))}})}),define("todomvc/templates/active",["exports"],function(e){e.default=Ember.HTMLBars.template({id:"aAsc4Lt8",block:'{"statements":[[1,[33,["todo-list"],null,[["todos"],[[28,["todos"]]]]],false]],"locals":[],"named":[],"yields":[],"hasPartials":false}',meta:{moduleName:"todomvc/templates/active.hbs"}})}),define("todomvc/templates/application",["exports"],function(e){e.default=Ember.HTMLBars.template({id:"LO5Br/dD",block:'{"statements":[[11,"section",[]],[15,"id","todoapp"],[15,"class","todoapp"],[13],[0,"\\n  "],[11,"header",[]],[15,"id","header"],[15,"class","header"],[13],[0,"\\n    "],[11,"h1",[]],[13],[0,"todos"],[14],[0,"\\n    "],[11,"input",[]],[15,"type","text"],[15,"id","new-todo"],[15,"class","new-todo"],[16,"onkeydown",[33,["action"],[[28,[null]],"createTodo"],null],null],[15,"placeholder","What needs to be done?"],[15,"autofocus",""],[13],[14],[0,"\\n  "],[14],[0,"\\n    "],[1,[26,["outlet"]],false],[0,"\\n"],[6,["if"],[[33,["gt"],[[28,["model","length"]],0],null]],null,{"statements":[[0,"      "],[11,"footer",[]],[15,"id","footer"],[15,"class","footer"],[13],[0,"\\n        "],[11,"span",[]],[15,"id","todo-count"],[15,"class","todo-count"],[13],[11,"strong",[]],[13],[1,[28,["remaining","length"]],false],[14],[0," "],[1,[33,["pluralize"],["item",[28,["remaining","length"]]],null],false],[0," left"],[14],[0,"\\n        "],[11,"ul",[]],[15,"id","filters"],[15,"class","filters"],[13],[0,"\\n          "],[11,"li",[]],[13],[6,["link-to"],["index"],[["activeClass"],["selected"]],{"statements":[[0,"All"]],"locals":[]},null],[14],[0,"\\n          "],[11,"li",[]],[13],[6,["link-to"],["active"],[["activeClass"],["selected"]],{"statements":[[0,"Active"]],"locals":[]},null],[14],[0,"\\n          "],[11,"li",[]],[13],[6,["link-to"],["completed"],[["activeClass"],["selected"]],{"statements":[[0,"Completed"]],"locals":[]},null],[14],[0,"\\n        "],[14],[0,"\\n"],[6,["if"],[[28,["completed","length"]]],null,{"statements":[[0,"          "],[11,"button",[]],[15,"id","clear-completed"],[15,"class","clear-completed"],[16,"onclick",[33,["action"],[[28,[null]],"clearCompleted"],null],null],[13],[0,"Clear completed"],[14],[0,"\\n"]],"locals":[]},null],[0,"      "],[14],[0,"\\n"]],"locals":[]},null],[14],[0,"\\n"],[11,"footer",[]],[15,"id","info"],[15,"class","info"],[13],[0,"\\n  "],[11,"p",[]],[13],[0,"Double-click to edit a todo"],[14],[0,"\\n  "],[11,"p",[]],[13],[0,"\\n    Created by\\n    "],[11,"a",[]],[15,"href","http://github.com/cibernox"],[13],[0,"Miguel Camba"],[14],[0,",\\n    "],[11,"a",[]],[15,"href","http://github.com/addyosmani"],[13],[0,"Addy Osmani"],[14],[0,"\\n  "],[14],[0,"\\n  "],[11,"p",[]],[13],[0,"Part of "],[11,"a",[]],[15,"href","http://todomvc.com"],[13],[0,"TodoMVC"],[14],[14],[0,"\\n"],[14]],"locals":[],"named":[],"yields":[],"hasPartials":false}',meta:{moduleName:"todomvc/templates/application.hbs"}})}),define("todomvc/templates/completed",["exports"],function(e){e.default=Ember.HTMLBars.template({id:"F4la9wtb",block:'{"statements":[[1,[33,["todo-list"],null,[["todos"],[[28,["todos"]]]]],false]],"locals":[],"named":[],"yields":[],"hasPartials":false}',meta:{moduleName:"todomvc/templates/completed.hbs"}})}),define("todomvc/templates/components/todo-item",["exports"],function(e){e.default=Ember.HTMLBars.template({id:"dQ3+cK5E",block:'{"statements":[[11,"div",[]],[15,"class","view"],[13],[0,"\\n  "],[11,"input",[]],[15,"type","checkbox"],[15,"class","toggle"],[16,"checked",[28,["todo","completed"]],null],[16,"onchange",[33,["action"],[[28,[null]],"toggleCompleted"],null],null],[13],[14],[0,"\\n  "],[11,"label",[]],[16,"ondblclick",[33,["action"],[[28,[null]],"startEditing"],null],null],[13],[1,[28,["todo","title"]],false],[14],[0,"\\n  "],[11,"button",[]],[16,"onclick",[33,["action"],[[28,[null]],"removeTodo"],null],null],[15,"class","destroy"],[13],[14],[0,"\\n"],[14],[0,"\\n"],[11,"input",[]],[15,"type","text"],[15,"class","edit"],[16,"value",[28,["todo","title"]],null],[16,"onblur",[33,["action"],[[28,[null]],"doneEditing"],[["value"],["target.value"]]],null],[16,"onkeydown",[33,["action"],[[28,[null]],"handleKeydown"],null],null],[15,"autofocus",""],[13],[14]],"locals":[],"named":[],"yields":[],"hasPartials":false}',meta:{moduleName:"todomvc/templates/components/todo-item.hbs"}})}),define("todomvc/templates/components/todo-list",["exports"],function(e){e.default=Ember.HTMLBars.template({id:"UPycDhZO",block:'{"statements":[[6,["if"],[[28,["todos","length"]]],null,{"statements":[[6,["if"],[[28,["canToggle"]]],null,{"statements":[[0,"    "],[11,"input",[]],[15,"type","checkbox"],[15,"id","toggle-all"],[15,"class","toggle-all"],[16,"checked",[26,["allCompleted"]],null],[16,"onchange",[33,["action"],[[28,[null]],"toggleAll"],null],null],[13],[14],[0,"\\n"]],"locals":[]},null],[0,"  "],[11,"ul",[]],[15,"id","todo-list"],[15,"class","todo-list"],[13],[0,"\\n"],[6,["each"],[[28,["todos"]]],null,{"statements":[[0,"      "],[1,[33,["todo-item"],null,[["todo","onStartEdit","onEndEdit"],[[28,["todo"]],[33,["action"],[[28,[null]],"disableToggle"],null],[33,["action"],[[28,[null]],"enableToggle"],null]]]],false],[0,"\\n"]],"locals":["todo"]},null],[0,"  "],[14],[0,"\\n"]],"locals":[]},null]],"locals":[],"named":[],"yields":[],"hasPartials":false}',meta:{moduleName:"todomvc/templates/components/todo-list.hbs"}})}),define("todomvc/templates/index",["exports"],function(e){e.default=Ember.HTMLBars.template({id:"hBadNIpo",block:'{"statements":[[6,["if"],[[28,["model","length"]]],null,{"statements":[[0,"  "],[1,[33,["todo-list"],null,[["todos"],[[28,["model"]]]]],false],[0,"\\n"]],"locals":[]},null]],"locals":[],"named":[],"yields":[],"hasPartials":false}',meta:{moduleName:"todomvc/templates/index.hbs"}})}),define("todomvc/config/environment",["ember"],function(e){try{var t="todomvc/config/environment",o=document.querySelector('meta[name="'+t+'"]').getAttribute("content"),n=JSON.parse(unescape(o)),l={default:n}
+return Object.defineProperty(l,"__esModule",{value:!0}),l}catch(e){throw new Error('Could not read config from meta tag with name "'+t+'".')}}),runningTests||require("todomvc/app").default.create({name:"todomvc",version:"0.0.0+bc37752f"})
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/dist/assets/vendor-820919567eb7bd4d9fac358a90a5aac4.js
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs/dist/assets/vendor-820919567eb7bd4d9fac358a90a5aac4.js
new file mode 100644
--- /dev/null
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/emberjs/dist/assets/vendor-a45c44bc56b4692cca4a96b6916c0fde.css
@@ -0,0 +1,1 @@
+#issue-count,.hidden{display:none}.edit,.new-todo,body,button{-moz-osx-font-smoothing:grayscale}.footer,.todoapp h1,.toggle-all{text-align:center}hr{margin:20px 0;border:0;border-top:1px dashed #c5c5c5;border-bottom:1px dashed #f7f7f7}.learn a{font-weight:400;text-decoration:none;color:#b83f45}.learn a:hover{text-decoration:underline;color:#787e7e}.learn h3,.learn h4,.learn h5{margin:10px 0;font-weight:500;line-height:1.2;color:#000}.learn h3{font-size:24px}.learn h4{font-size:18px}.learn h5{margin-bottom:0;font-size:14px}.learn ul{padding:0;margin:0 0 30px 25px}.learn li{line-height:20px}.learn p{font-size:15px;font-weight:300;line-height:1.3;margin-top:0;margin-bottom:0}.quote p:after,.quote p:before{font-size:50px;opacity:.15;position:absolute}.quote{border:none;margin:20px 0 60px}.quote p{font-style:italic}.quote p:before{content:'“';top:-20px;left:3px}.quote p:after{content:'”';bottom:-42px;right:3px}.quote footer{position:absolute;bottom:-40px;right:0}.quote footer img{border-radius:3px}.quote footer a{margin-left:5px;vertical-align:middle}.speech-bubble{position:relative;padding:10px;background:rgba(0,0,0,.04);border-radius:5px}.speech-bubble:after{content:'';position:absolute;top:100%;right:30px;border:13px solid transparent;border-top-color:rgba(0,0,0,.04)}.learn-bar>.learn{position:absolute;width:272px;top:8px;left:-300px;padding:10px;border-radius:5px;background-color:rgba(255,255,255,.6);transition-property:left;transition-duration:.5s}@media (min-width:899px){.learn-bar{width:auto;padding-left:300px}.learn-bar>.learn{left:8px}}body,button,html{margin:0;padding:0}button{border:0;background:0 0;font-size:100%;vertical-align:baseline;font-family:inherit;font-weight:inherit;color:inherit;-webkit-appearance:none;appearance:none;-webkit-font-smoothing:antialiased}body{font:14px 'Helvetica Neue',Helvetica,Arial,sans-serif;line-height:1.4em;background:#f5f5f5;color:#4d4d4d;min-width:230px;max-width:550px;margin:0 auto;-webkit-font-smoothing:antialiased;font-weight:300}:focus{outline:0}.todoapp{background:#fff;margin:130px 0 40px;position:relative;box-shadow:0 2px 4px 0 rgba(0,0,0,.2),0 25px 50px 0 rgba(0,0,0,.1)}.todoapp input::-webkit-input-placeholder{font-style:italic;font-weight:300;color:#e6e6e6}.todoapp input::-moz-placeholder{font-style:italic;font-weight:300;color:#e6e6e6}.todoapp input::input-placeholder{font-style:italic;font-weight:300;color:#e6e6e6}.todoapp h1{position:absolute;top:-155px;width:100%;font-size:100px;font-weight:100;color:rgba(175,47,47,.15);-webkit-text-rendering:optimizeLegibility;-moz-text-rendering:optimizeLegibility;text-rendering:optimizeLegibility}.edit,.new-todo{position:relative;margin:0;width:100%;font-size:24px;font-family:inherit;font-weight:inherit;line-height:1.4em;color:inherit;padding:6px;border:1px solid #999;box-shadow:inset 0 -1px 5px 0 rgba(0,0,0,.2);box-sizing:border-box;-webkit-font-smoothing:antialiased}.new-todo{padding:16px 16px 16px 60px;border:none;background:rgba(0,0,0,.003);box-shadow:inset 0 -2px 1px rgba(0,0,0,.03)}.main{position:relative;z-index:2;border-top:1px solid #e6e6e6}.toggle-all{border:none;opacity:0;position:absolute}.toggle-all+label{width:60px;height:34px;font-size:0;position:absolute;top:-52px;left:-13px;-webkit-transform:rotate(90deg);transform:rotate(90deg)}.toggle-all+label:before{content:'❯';font-size:22px;color:#e6e6e6;padding:10px 27px}.toggle-all:checked+label:before{color:#737373}.todo-list{margin:0;padding:0;list-style:none}.todo-list li{position:relative;font-size:24px;border-bottom:1px solid #ededed}.todo-list li:last-child{border-bottom:none}.todo-list li.editing{border-bottom:none;padding:0}.todo-list li.editing .edit{display:block;width:506px;padding:12px 16px;margin:0 0 0 43px}.todo-list li.editing .view{display:none}.todo-list li .toggle{text-align:center;width:40px;height:auto;position:absolute;top:0;bottom:0;margin:auto 0;border:none;-webkit-appearance:none;appearance:none;opacity:0}.todo-list li .toggle+label{background-image:url(data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23ededed%22%20stroke-width%3D%223%22/%3E%3C/svg%3E);background-repeat:no-repeat;background-position:center left}.todo-list li .toggle:checked+label{background-image:url(data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23bddad5%22%20stroke-width%3D%223%22/%3E%3Cpath%20fill%3D%22%235dc2af%22%20d%3D%22M72%2025L42%2071%2027%2056l-4%204%2020%2020%2034-52z%22/%3E%3C/svg%3E)}.todo-list li label{word-break:break-all;padding:15px 15px 15px 60px;display:block;line-height:1.2;transition:color .4s}.todo-list li.completed label{color:#d9d9d9;text-decoration:line-through}.todo-list li .destroy{display:none;position:absolute;top:0;right:10px;bottom:0;width:40px;height:40px;margin:auto 0 11px;font-size:30px;color:#cc9a9a;transition:color .2s ease-out}.filters,.footer:before{position:absolute;right:0;left:0}.todo-list li .destroy:hover{color:#af5b5e}.todo-list li .destroy:after{content:'×'}.todo-list li:hover .destroy{display:block}.todo-list li .edit{display:none}.todo-list li.editing:last-child{margin-bottom:-1px}.footer{color:#777;padding:10px 15px;height:20px;border-top:1px solid #e6e6e6}.footer:before{content:'';bottom:0;height:50px;overflow:hidden;box-shadow:0 1px 1px rgba(0,0,0,.2),0 8px 0 -3px #f6f6f6,0 9px 1px -3px rgba(0,0,0,.2),0 16px 0 -6px #f6f6f6,0 17px 2px -6px rgba(0,0,0,.2)}.todo-count{float:left;text-align:left}.todo-count strong{font-weight:300}.filters{margin:0;padding:0;list-style:none}.filters li{display:inline}.filters li a{color:inherit;margin:3px;padding:3px 7px;text-decoration:none;border:1px solid transparent;border-radius:3px}.filters li a:hover{border-color:rgba(175,47,47,.1)}.filters li a.selected{border-color:rgba(175,47,47,.2)}.clear-completed,html .clear-completed:active{float:right;position:relative;line-height:20px;text-decoration:none;cursor:pointer}.clear-completed:hover{text-decoration:underline}.info{margin:65px auto 0;color:#bfbfbf;font-size:10px;text-shadow:0 1px 0 rgba(255,255,255,.5);text-align:center}.info p{line-height:1}.info a{color:inherit;text-decoration:none;font-weight:400}.info a:hover{text-decoration:underline}@media screen and (-webkit-min-device-pixel-ratio:0){.todo-list li .toggle,.toggle-all{background:0 0}.todo-list li .toggle{height:40px}}@media (max-width:430px){.footer{height:50px}.filters{bottom:10px}}
\ No newline at end of file
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/public/crossdomain.xml
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs/dist/crossdomain.xml
new file mode 100644
--- /dev/null
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/emberjs/dist/index.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <title>Ember.js TodoMVC example</title>
+    <meta name="description" content="">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    
+<meta name="todomvc/config/environment" content="%7B%22modulePrefix%22%3A%22todomvc%22%2C%22environment%22%3A%22production%22%2C%22baseURL%22%3Anull%2C%22locationType%22%3A%22hash%22%2C%22EmberENV%22%3A%7B%22FEATURES%22%3A%7B%7D%2C%22EXTEND_PROTOTYPES%22%3A%7B%22Date%22%3Afalse%7D%7D%2C%22APP%22%3A%7B%22name%22%3A%22todomvc%22%2C%22version%22%3A%220.0.0+bc37752f%22%7D%2C%22exportApplicationGlobal%22%3Afalse%7D" />
+    <link rel="stylesheet" href="assets/vendor-a45c44bc56b4692cca4a96b6916c0fde.css" integrity="sha256-wri71NgRSS8Ri2MYmuencXvYL+yQDweqc4LX9yrCstw= sha512-Quz1uKZ8tcCIvB9safdsFiWlRSunJyK+8elapH+Mx4qLx2+1CzYOAbjpaQDpmlMttL+Nra1P361yZrIyRhPDDA==" >
+    
+  </head>
+  <body>
+    
+    <script src="assets/vendor-820919567eb7bd4d9fac358a90a5aac4.js" integrity="sha256-BZHBbf1U21+kgPYmoIK7gLkqHu88v5cwEVFfwUPXojs= sha512-2YWrAbR45p8fk3/y4Qhbok/KUfLE/v6yMSUqIWncTmWqfJbyJj0+AiTkJL03k0oPUMZbFYyQx9SuL6XoXp4sgg==" ></script>
+    <script src="assets/todomvc-5d3e8eb3d5b3740a33185edcb11eeb57.js" integrity="sha256-TlR3MSC0+pEW7ypWHo2KbKJ8aGi7ebK3AAyXVdGlGJk= sha512-VrNV9WfIGB3sR8fm1qhLQwIISD4AQbarc5PqrKAddfNg+eNY/NynTA3N/eW0SHWQtOmNxSMOtP+aZlKfLi3r2A==" ></script>
+    
+  </body>
+</html>
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/public/robots.txt
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs/dist/robots.txt
copy from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/ember-cli-build.js
copy to third_party/speedometer/resources/todomvc/architecture-examples/emberjs/ember-cli-build.js
deleted file mode 100644
--- a/third_party/speedometer/resources/todomvc/architecture-examples/emberjs/index.html
+++ /dev/null
@@ -1,17 +0,0 @@
-<!DOCTYPE html>
-<html>
-  <head>
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge">
-    <title>Ember.js TodoMVC example</title>
-    <meta name="description" content="">
-    <meta name="viewport" content="width=device-width, initial-scale=1">
-    <meta name="todomvc/config/environment" content="%7B%22modulePrefix%22%3A%22todomvc%22%2C%22environment%22%3A%22development%22%2C%22baseURL%22%3Anull%2C%22locationType%22%3A%22hash%22%2C%22EmberENV%22%3A%7B%22FEATURES%22%3A%7B%7D%2C%22EXTEND_PROTOTYPES%22%3A%7B%22Date%22%3Afalse%7D%7D%2C%22APP%22%3A%7B%22name%22%3A%22todomvc%22%2C%22version%22%3A%220.0.0+32a851f1%22%7D%2C%22exportApplicationGlobal%22%3Atrue%7D" />
-    <link rel="stylesheet" href="assets/vendor.css">
-    <link rel="stylesheet" href="assets/todomvc.css">
-  </head>
-  <body>
-    <script src="assets/vendor.js"></script>
-    <script src="assets/todomvc.js"></script>
-  </body>
-</html>
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/package-lock.json
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs/package-lock.json
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/package.json
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs/package.json
copy from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/crossdomain.xml
copy to third_party/speedometer/resources/todomvc/architecture-examples/emberjs/public/crossdomain.xml
copy from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/robots.txt
copy to third_party/speedometer/resources/todomvc/architecture-examples/emberjs/public/robots.txt
deleted file mode 100644
--- a/third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-# Speedometer 2.0: Ember.js TodoMVC example
-
-## Test locally
-
-1. `npm install && bower install`
-2. `npm run build`
-3. Run a local server from the `dist` directory. (You could use [`npm i -g http-server`](https://github.com/indexzero/http-server).)
-4. Open the URL pointing to the local server in your web browser of choice.
deleted file mode 100644
--- a/third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/app/index.html
+++ /dev/null
@@ -1,20 +0,0 @@
-<!DOCTYPE html>
-<html>
-  <head>
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge">
-    <title>Ember.js TodoMVC example</title>
-    <meta name="description" content="">
-    <meta name="viewport" content="width=device-width, initial-scale=1">
-    {{content-for "head"}}
-    <link rel="stylesheet" href="{{rootURL}}assets/vendor.css">
-    <link rel="stylesheet" href="{{rootURL}}assets/todomvc.css">
-    {{content-for "head-footer"}}
-  </head>
-  <body>
-    {{content-for "body"}}
-    <script src="{{rootURL}}assets/vendor.js"></script>
-    <script src="{{rootURL}}assets/todomvc.js"></script>
-    {{content-for "body-footer"}}
-  </body>
-</html>
deleted file mode 100644
--- a/third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/dist/assets/todomvc-7601ffca6150ed633f0f333fe76bfaf2.js
+++ /dev/null
@@ -1,30 +0,0 @@
-"use strict"
-define("todomvc/app",["exports","ember","todomvc/resolver","ember-load-initializers","todomvc/config/environment"],function(e,t,o,n,l){var i=void 0
-t.default.MODEL_FACTORY_INJECTIONS=!0,i=t.default.Application.extend({modulePrefix:l.default.modulePrefix,podModulePrefix:l.default.podModulePrefix,Resolver:o.default}),(0,n.default)(i,l.default.modulePrefix),e.default=i}),define("todomvc/components/todo-item",["exports","ember"],function(e,t){e.default=t.default.Component.extend({repo:t.default.inject.service(),tagName:"li",editing:!1,classNameBindings:["todo.completed","editing"],actions:{startEditing:function(){this.get("onStartEdit")(),this.set("editing",!0),t.default.run.scheduleOnce("afterRender",this,"focusInput")},doneEditing:function(e){this.get("editing")&&(t.default.isBlank(e)?this.send("removeTodo"):(this.set("todo.title",e.trim()),this.set("editing",!1),this.get("onEndEdit")()))},handleKeydown:function(e){13===e.keyCode?e.target.blur():27===e.keyCode&&this.set("editing",!1)},toggleCompleted:function(e){var o=this.get("todo")
-t.default.set(o,"completed",e.target.checked),this.get("repo").persist()},removeTodo:function(){this.get("repo").delete(this.get("todo"))}},focusInput:function(){this.element.querySelector("input.edit").focus()}})}),define("todomvc/components/todo-list",["exports","ember"],function(e,t){e.default=t.default.Component.extend({repo:t.default.inject.service(),tagName:"section",elementId:"main",canToggle:!0,allCompleted:t.default.computed("todos.@each.completed",function(){return this.get("todos").isEvery("completed")}),actions:{enableToggle:function(){this.set("canToggle",!0)},disableToggle:function(){this.set("canToggle",!1)},toggleAll:function(){var e=this.get("allCompleted")
-this.get("todos").forEach(function(o){return t.default.set(o,"completed",!e)}),this.get("repo").persist()}}})}),define("todomvc/controllers/active",["exports","ember"],function(e,t){e.default=t.default.Controller.extend({todos:t.default.computed.filterBy("model","completed",!1)})}),define("todomvc/controllers/application",["exports","ember"],function(e,t){e.default=t.default.Controller.extend({repo:t.default.inject.service(),remaining:t.default.computed.filterBy("model","completed",!1),completed:t.default.computed.filterBy("model","completed"),actions:{createTodo:function(e){13!==e.keyCode||t.default.isBlank(e.target.value)||(this.get("repo").add({title:e.target.value.trim(),completed:!1}),e.target.value="")},clearCompleted:function(){this.get("model").removeObjects(this.get("completed")),this.get("repo").persist()}}})}),define("todomvc/controllers/completed",["exports","ember"],function(e,t){e.default=t.default.Controller.extend({todos:t.default.computed.filterBy("model","completed",!0)})}),define("todomvc/helpers/app-version",["exports","ember","todomvc/config/environment","ember-cli-app-version/utils/regexp"],function(e,t,o,n){function l(e){var t=arguments.length<=1||void 0===arguments[1]?{}:arguments[1]
-return t.hideSha?i.match(n.versionRegExp)[0]:t.hideVersion?i.match(n.shaRegExp)[0]:i}e.appVersion=l
-var i=o.default.APP.version
-e.default=t.default.Helper.helper(l)}),define("todomvc/helpers/gt",["exports","ember"],function(e,t){function o(e){var t=n(e,2)
-return t[0]>t[1]}var n=function(){function e(e,t){var o=[],n=!0,l=!1,i=void 0
-try{for(var a,d=e[Symbol.iterator]();!(n=(a=d.next()).done)&&(o.push(a.value),!t||o.length!==t);n=!0);}catch(e){l=!0,i=e}finally{try{!n&&d.return&&d.return()}finally{if(l)throw i}}return o}return function(t,o){if(Array.isArray(t))return t
-if(Symbol.iterator in Object(t))return e(t,o)
-throw new TypeError("Invalid attempt to destructure non-iterable instance")}}()
-e.gt=o,e.default=t.default.Helper.helper(o)}),define("todomvc/helpers/pluralize",["exports","ember","ember-inflector"],function(e,t,o){function n(e){var t=l(e,2),n=t[0]
-return 1===t[1]?n:(0,o.pluralize)(n)}var l=function(){function e(e,t){var o=[],n=!0,l=!1,i=void 0
-try{for(var a,d=e[Symbol.iterator]();!(n=(a=d.next()).done)&&(o.push(a.value),!t||o.length!==t);n=!0);}catch(e){l=!0,i=e}finally{try{!n&&d.return&&d.return()}finally{if(l)throw i}}return o}return function(t,o){if(Array.isArray(t))return t
-if(Symbol.iterator in Object(t))return e(t,o)
-throw new TypeError("Invalid attempt to destructure non-iterable instance")}}()
-e.pluralizeHelper=n,e.default=t.default.Helper.helper(n)}),define("todomvc/helpers/singularize",["exports","ember-inflector/lib/helpers/singularize"],function(e,t){e.default=t.default}),define("todomvc/initializers/app-version",["exports","ember-cli-app-version/initializer-factory","todomvc/config/environment"],function(e,t,o){var n=o.default.APP,l=n.name,i=n.version
-e.default={name:"App Version",initialize:(0,t.default)(l,i)}}),define("todomvc/initializers/container-debug-adapter",["exports","ember-resolver/container-debug-adapter"],function(e,t){e.default={name:"container-debug-adapter",initialize:function(){var e=arguments[1]||arguments[0]
-e.register("container-debug-adapter:main",t.default),e.inject("container-debug-adapter:main","namespace","application:main")}}}),define("todomvc/initializers/export-application-global",["exports","ember","todomvc/config/environment"],function(e,t,o){function n(){var e=arguments[1]||arguments[0]
-if(!1!==o.default.exportApplicationGlobal){var n
-if("undefined"!=typeof window)n=window
-else if("undefined"!=typeof global)n=global
-else{if("undefined"==typeof self)return
-n=self}var l,i=o.default.exportApplicationGlobal
-l="string"==typeof i?i:t.default.String.classify(o.default.modulePrefix),n[l]||(n[l]=e,e.reopen({willDestroy:function(){this._super.apply(this,arguments),delete n[l]}}))}}e.initialize=n,e.default={name:"export-application-global",initialize:n}}),define("todomvc/resolver",["exports","ember-resolver"],function(e,t){e.default=t.default}),define("todomvc/router",["exports","ember","todomvc/config/environment"],function(e,t,o){var n=t.default.Router.extend({location:o.default.locationType,rootURL:o.default.rootURL})
-n.map(function(){this.route("active"),this.route("completed")}),e.default=n}),define("todomvc/routes/application",["exports","ember"],function(e,t){e.default=t.default.Route.extend({repo:t.default.inject.service(),model:function(){return this.get("repo").findAll()}})}),define("todomvc/services/ajax",["exports","ember-ajax/services/ajax"],function(e,t){Object.defineProperty(e,"default",{enumerable:!0,get:function(){return t.default}})}),define("todomvc/services/memory",["exports"],function(e){(function(e){var t={},o={}
-t.length=0,t.getItem=function(e){return o[e]||null},t.setItem=function(e,n){void 0===n?t.removeItem(e):(o.hasOwnProperty(e)||t.length++,o[e]=""+n)},t.removeItem=function(e){o.hasOwnProperty(e)&&(delete o[e],t.length--)},t.key=function(e){return Object.keys(o)[e]||null},t.clear=function(){o={},t.length=0},e.localStorageMemory=t})(window)}),define("todomvc/services/repo",["exports","ember","todomvc/services/memory"],function(e,t,o){e.default=t.default.Service.extend({lastId:0,data:null,findAll:function(){return this.get("data")||this.set("data",JSON.parse(window.localStorageMemory.getItem("todos")||"[]"))},add:function(e){var t=Object.assign({id:this.incrementProperty("lastId")},e)
-return this.get("data").pushObject(t),this.persist(),t},delete:function(e){this.get("data").removeObject(e),this.persist()},persist:function(){window.localStorageMemory.setItem("todos",JSON.stringify(this.get("data")))}})}),define("todomvc/templates/active",["exports"],function(e){e.default=Ember.HTMLBars.template({id:"aAsc4Lt8",block:'{"statements":[[1,[33,["todo-list"],null,[["todos"],[[28,["todos"]]]]],false]],"locals":[],"named":[],"yields":[],"hasPartials":false}',meta:{moduleName:"todomvc/templates/active.hbs"}})}),define("todomvc/templates/application",["exports"],function(e){e.default=Ember.HTMLBars.template({id:"BYnyz5ON",block:'{"statements":[[11,"section",[]],[15,"id","todoapp"],[13],[0,"\\n  "],[11,"header",[]],[15,"id","header"],[13],[0,"\\n    "],[11,"h1",[]],[13],[0,"todos"],[14],[0,"\\n    "],[11,"input",[]],[15,"type","text"],[15,"id","new-todo"],[16,"onkeydown",[33,["action"],[[28,[null]],"createTodo"],null],null],[15,"placeholder","What needs to be done?"],[15,"autofocus",""],[13],[14],[0,"\\n  "],[14],[0,"\\n    "],[1,[26,["outlet"]],false],[0,"\\n"],[6,["if"],[[33,["gt"],[[28,["model","length"]],0],null]],null,{"statements":[[0,"      "],[11,"footer",[]],[15,"id","footer"],[13],[0,"\\n        "],[11,"span",[]],[15,"id","todo-count"],[13],[11,"strong",[]],[13],[1,[28,["remaining","length"]],false],[14],[0," "],[1,[33,["pluralize"],["item",[28,["remaining","length"]]],null],false],[0," left"],[14],[0,"\\n        "],[11,"ul",[]],[15,"id","filters"],[13],[0,"\\n          "],[11,"li",[]],[13],[6,["link-to"],["index"],[["activeClass"],["selected"]],{"statements":[[0,"All"]],"locals":[]},null],[14],[0,"\\n          "],[11,"li",[]],[13],[6,["link-to"],["active"],[["activeClass"],["selected"]],{"statements":[[0,"Active"]],"locals":[]},null],[14],[0,"\\n          "],[11,"li",[]],[13],[6,["link-to"],["completed"],[["activeClass"],["selected"]],{"statements":[[0,"Completed"]],"locals":[]},null],[14],[0,"\\n        "],[14],[0,"\\n"],[6,["if"],[[28,["completed","length"]]],null,{"statements":[[0,"          "],[11,"button",[]],[15,"id","clear-completed"],[16,"onclick",[33,["action"],[[28,[null]],"clearCompleted"],null],null],[13],[0,"Clear completed"],[14],[0,"\\n"]],"locals":[]},null],[0,"      "],[14],[0,"\\n"]],"locals":[]},null],[14],[0,"\\n"],[11,"footer",[]],[15,"id","info"],[13],[0,"\\n  "],[11,"p",[]],[13],[0,"Double-click to edit a todo"],[14],[0,"\\n  "],[11,"p",[]],[13],[0,"\\n    Created by\\n    "],[11,"a",[]],[15,"href","http://github.com/cibernox"],[13],[0,"Miguel Camba"],[14],[0,",\\n    "],[11,"a",[]],[15,"href","http://github.com/addyosmani"],[13],[0,"Addy Osmani"],[14],[0,"\\n  "],[14],[0,"\\n  "],[11,"p",[]],[13],[0,"Part of "],[11,"a",[]],[15,"href","http://todomvc.com"],[13],[0,"TodoMVC"],[14],[14],[0,"\\n"],[14]],"locals":[],"named":[],"yields":[],"hasPartials":false}',meta:{moduleName:"todomvc/templates/application.hbs"}})}),define("todomvc/templates/completed",["exports"],function(e){e.default=Ember.HTMLBars.template({id:"F4la9wtb",block:'{"statements":[[1,[33,["todo-list"],null,[["todos"],[[28,["todos"]]]]],false]],"locals":[],"named":[],"yields":[],"hasPartials":false}',meta:{moduleName:"todomvc/templates/completed.hbs"}})}),define("todomvc/templates/components/todo-item",["exports"],function(e){e.default=Ember.HTMLBars.template({id:"dQ3+cK5E",block:'{"statements":[[11,"div",[]],[15,"class","view"],[13],[0,"\\n  "],[11,"input",[]],[15,"type","checkbox"],[15,"class","toggle"],[16,"checked",[28,["todo","completed"]],null],[16,"onchange",[33,["action"],[[28,[null]],"toggleCompleted"],null],null],[13],[14],[0,"\\n  "],[11,"label",[]],[16,"ondblclick",[33,["action"],[[28,[null]],"startEditing"],null],null],[13],[1,[28,["todo","title"]],false],[14],[0,"\\n  "],[11,"button",[]],[16,"onclick",[33,["action"],[[28,[null]],"removeTodo"],null],null],[15,"class","destroy"],[13],[14],[0,"\\n"],[14],[0,"\\n"],[11,"input",[]],[15,"type","text"],[15,"class","edit"],[16,"value",[28,["todo","title"]],null],[16,"onblur",[33,["action"],[[28,[null]],"doneEditing"],[["value"],["target.value"]]],null],[16,"onkeydown",[33,["action"],[[28,[null]],"handleKeydown"],null],null],[15,"autofocus",""],[13],[14]],"locals":[],"named":[],"yields":[],"hasPartials":false}',meta:{moduleName:"todomvc/templates/components/todo-item.hbs"}})}),define("todomvc/templates/components/todo-list",["exports"],function(e){e.default=Ember.HTMLBars.template({id:"XGmWWD63",block:'{"statements":[[6,["if"],[[28,["todos","length"]]],null,{"statements":[[6,["if"],[[28,["canToggle"]]],null,{"statements":[[0,"    "],[11,"input",[]],[15,"type","checkbox"],[15,"id","toggle-all"],[16,"checked",[26,["allCompleted"]],null],[16,"onchange",[33,["action"],[[28,[null]],"toggleAll"],null],null],[13],[14],[0,"\\n"]],"locals":[]},null],[0,"  "],[11,"ul",[]],[15,"id","todo-list"],[15,"class","todo-list"],[13],[0,"\\n"],[6,["each"],[[28,["todos"]]],null,{"statements":[[0,"      "],[1,[33,["todo-item"],null,[["todo","onStartEdit","onEndEdit"],[[28,["todo"]],[33,["action"],[[28,[null]],"disableToggle"],null],[33,["action"],[[28,[null]],"enableToggle"],null]]]],false],[0,"\\n"]],"locals":["todo"]},null],[0,"  "],[14],[0,"\\n"]],"locals":[]},null]],"locals":[],"named":[],"yields":[],"hasPartials":false}',meta:{moduleName:"todomvc/templates/components/todo-list.hbs"}})}),define("todomvc/templates/index",["exports"],function(e){e.default=Ember.HTMLBars.template({id:"hBadNIpo",block:'{"statements":[[6,["if"],[[28,["model","length"]]],null,{"statements":[[0,"  "],[1,[33,["todo-list"],null,[["todos"],[[28,["model"]]]]],false],[0,"\\n"]],"locals":[]},null]],"locals":[],"named":[],"yields":[],"hasPartials":false}',meta:{moduleName:"todomvc/templates/index.hbs"}})}),define("todomvc/config/environment",["ember"],function(e){try{var t="todomvc/config/environment",o=document.querySelector('meta[name="'+t+'"]').getAttribute("content"),n=JSON.parse(unescape(o)),l={default:n}
-return Object.defineProperty(l,"__esModule",{value:!0}),l}catch(e){throw new Error('Could not read config from meta tag with name "'+t+'".')}}),runningTests||require("todomvc/app").default.create({name:"todomvc",version:"0.0.0+164d27e2"})
deleted file mode 100644
--- a/third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/dist/assets/vendor-7b5c98520910afa58d74e05ec86cd873.css
+++ /dev/null
@@ -1,1 +0,0 @@
-#issue-count,.hidden,label[for=toggle-all]{display:none}#footer,#info,#todoapp h1,#toggle-all{text-align:center}hr{margin:20px 0;border:0;border-top:1px dashed #c5c5c5;border-bottom:1px dashed #f7f7f7}.learn a{font-weight:400;text-decoration:none;color:#b83f45}.learn a:hover{text-decoration:underline;color:#787e7e}.learn h3,.learn h4,.learn h5{margin:10px 0;font-weight:500;line-height:1.2;color:#000}.learn h3{font-size:24px}.learn h4{font-size:18px}.learn h5{margin-bottom:0;font-size:14px}.learn ul{padding:0;margin:0 0 30px 25px}.learn li{line-height:20px}.learn p{font-size:15px;font-weight:300;line-height:1.3;margin-top:0;margin-bottom:0}.quote p:after,.quote p:before{font-size:50px;opacity:.15;position:absolute}.quote{border:none;margin:20px 0 60px}.quote p{font-style:italic}.quote p:before{content:'“';top:-20px;left:3px}.quote p:after{content:'”';bottom:-42px;right:3px}.quote footer{position:absolute;bottom:-40px;right:0}.quote footer img{border-radius:3px}.quote footer a{margin-left:5px;vertical-align:middle}.speech-bubble{position:relative;padding:10px;background:rgba(0,0,0,.04);border-radius:5px}.speech-bubble:after{content:'';position:absolute;top:100%;right:30px;border:13px solid transparent;border-top-color:rgba(0,0,0,.04)}.learn-bar>.learn{position:absolute;width:272px;top:8px;left:-300px;padding:10px;border-radius:5px;background-color:rgba(255,255,255,.6);transition-property:left;transition-duration:.5s}#main,#new-todo,#todo-list li,#todoapp,.edit{position:relative}@media (min-width:899px){.learn-bar{width:auto;padding-left:300px}.learn-bar>.learn{left:8px}}body,button,html{padding:0;margin:0}button{border:0;background:0 0;font-size:100%;vertical-align:baseline;font-family:inherit;font-weight:inherit;color:inherit;-webkit-appearance:none;appearance:none;-webkit-font-smoothing:antialiased;-moz-font-smoothing:antialiased;font-smoothing:antialiased}body{font:14px 'Helvetica Neue',Helvetica,Arial,sans-serif;line-height:1.4em;background:#f5f5f5;color:#4d4d4d;min-width:230px;max-width:550px;margin:0 auto;-webkit-font-smoothing:antialiased;-moz-font-smoothing:antialiased;font-smoothing:antialiased;font-weight:300}button,input[type=checkbox]{outline:0}#todoapp{background:#fff;margin:130px 0 40px;box-shadow:0 2px 4px 0 rgba(0,0,0,.2),0 25px 50px 0 rgba(0,0,0,.1)}#todoapp input::-webkit-input-placeholder{font-style:italic;font-weight:300;color:#e6e6e6}#todoapp input::-moz-placeholder{font-style:italic;font-weight:300;color:#e6e6e6}#todoapp input::input-placeholder{font-style:italic;font-weight:300;color:#e6e6e6}#todoapp h1{position:absolute;top:-155px;width:100%;font-size:100px;font-weight:100;color:rgba(175,47,47,.15);-webkit-text-rendering:optimizeLegibility;-moz-text-rendering:optimizeLegibility;text-rendering:optimizeLegibility}#new-todo,.edit{margin:0;width:100%;font-size:24px;font-family:inherit;font-weight:inherit;line-height:1.4em;outline:0;color:inherit;padding:6px;border:1px solid #999;box-shadow:inset 0 -1px 5px 0 rgba(0,0,0,.2);box-sizing:border-box;-webkit-font-smoothing:antialiased;-moz-font-smoothing:antialiased;font-smoothing:antialiased}#new-todo{padding:16px 16px 16px 60px;border:none;background:rgba(0,0,0,.003);box-shadow:inset 0 -2px 1px rgba(0,0,0,.03)}#main{z-index:2;border-top:1px solid #e6e6e6}#toggle-all{position:absolute;top:-55px;left:-12px;width:60px;height:34px;border:none}#toggle-all:before{content:'❯';font-size:22px;color:#e6e6e6;padding:10px 27px}#toggle-all:checked:before{color:#737373}#todo-list{margin:0;padding:0;list-style:none}#todo-list li{font-size:24px;border-bottom:1px solid #ededed}#todo-list li:last-child{border-bottom:none}#todo-list li.editing{border-bottom:none;padding:0}#todo-list li.editing .edit{display:block;width:506px;padding:13px 17px 12px;margin:0 0 0 43px}#todo-list li.editing .view{display:none}#todo-list li .toggle{text-align:center;width:40px;height:auto;position:absolute;top:0;bottom:0;margin:auto 0;border:none;-webkit-appearance:none;appearance:none}#todo-list li .toggle:after{content:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="-10 -18 100 135"><circle cx="50" cy="50" r="50" fill="none" stroke="#ededed" stroke-width="3"/></svg>')}#todo-list li .toggle:checked:after{content:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="-10 -18 100 135"><circle cx="50" cy="50" r="50" fill="none" stroke="#bddad5" stroke-width="3"/><path fill="#5dc2af" d="M72 25L42 71 27 56l-4 4 20 20 34-52z"/></svg>')}#todo-list li label{white-space:pre;word-break:break-word;padding:15px 60px 15px 15px;margin-left:45px;display:block;line-height:1.2;transition:color .4s}#todo-list li.completed label{color:#d9d9d9;text-decoration:line-through}#todo-list li .destroy{display:none;position:absolute;top:0;right:10px;bottom:0;width:40px;height:40px;margin:auto 0 11px;font-size:30px;color:#cc9a9a;transition:color .2s ease-out}#filters,#footer:before{position:absolute;right:0;left:0}#todo-list li .destroy:hover{color:#af5b5e}#filters li a,#info a{color:inherit;text-decoration:none}#todo-list li .destroy:after{content:'×'}#todo-list li:hover .destroy{display:block}#todo-list li .edit{display:none}#todo-list li.editing:last-child{margin-bottom:-1px}#footer{color:#777;padding:10px 15px;height:20px;border-top:1px solid #e6e6e6}#footer:before{content:'';bottom:0;height:50px;overflow:hidden;box-shadow:0 1px 1px rgba(0,0,0,.2),0 8px 0 -3px #f6f6f6,0 9px 1px -3px rgba(0,0,0,.2),0 16px 0 -6px #f6f6f6,0 17px 2px -6px rgba(0,0,0,.2)}#todo-count{float:left;text-align:left}#todo-count strong{font-weight:300}#filters{margin:0;padding:0;list-style:none}#filters li{display:inline}#filters li a{margin:3px;padding:3px 7px;border:1px solid transparent;border-radius:3px}#filters li a.selected,#filters li a:hover{border-color:rgba(175,47,47,.1)}#filters li a.selected{border-color:rgba(175,47,47,.2)}#clear-completed,html #clear-completed:active{float:right;line-height:20px;text-decoration:none;cursor:pointer;position:relative}#clear-completed:hover,#info a:hover{text-decoration:underline}#info{margin:65px auto 0;color:#bfbfbf;font-size:10px;text-shadow:0 1px 0 rgba(255,255,255,.5)}#info p{line-height:1}#info a{font-weight:400}@media screen and (-webkit-min-device-pixel-ratio:0){#todo-list li .toggle,#toggle-all{background:0 0}#todo-list li .toggle{height:40px}#toggle-all{-webkit-transform:rotate(90deg);transform:rotate(90deg);-webkit-appearance:none;appearance:none}}@media (max-width:430px){#footer{height:50px}#filters{bottom:10px}}
\ No newline at end of file
deleted file mode 100644
--- a/third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/dist/index.html
+++ /dev/null
@@ -1,21 +0,0 @@
-<!DOCTYPE html>
-<html>
-  <head>
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge">
-    <title>Ember.js TodoMVC example</title>
-    <meta name="description" content="">
-    <meta name="viewport" content="width=device-width, initial-scale=1">
-    
-<meta name="todomvc/config/environment" content="%7B%22modulePrefix%22%3A%22todomvc%22%2C%22environment%22%3A%22production%22%2C%22baseURL%22%3Anull%2C%22locationType%22%3A%22hash%22%2C%22EmberENV%22%3A%7B%22FEATURES%22%3A%7B%7D%2C%22EXTEND_PROTOTYPES%22%3A%7B%22Date%22%3Afalse%7D%7D%2C%22APP%22%3A%7B%22name%22%3A%22todomvc%22%2C%22version%22%3A%220.0.0+164d27e2%22%7D%2C%22exportApplicationGlobal%22%3Afalse%7D" />
-    <link rel="stylesheet" href="assets/vendor-7b5c98520910afa58d74e05ec86cd873.css" integrity="sha256-bsagGHduhay9QPLUFpddcZFq7Kmr2ScM3VKnWhdX8oM= sha512-eNsGN2aLecWPvoqNVH8oXK8o/IJ7rO5ti0zgS8lF8LiwmKUHdEIuFduwcDL1VLAt2r+3YjgDzoSNYK6c57pJzw==" >
-    <link rel="stylesheet" href="assets/todomvc-d41d8cd98f00b204e9800998ecf8427e.css" integrity="sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU= sha512-z4PhNX7vuL3xVChQ1m2AB9Yg5AULVxXcg/SpIdNs6c5H0NE8XYXysP+DGNKHfuwvY7kxvUdBeoGlODJ6+SfaPg==" >
-    
-  </head>
-  <body>
-    
-    <script src="assets/vendor-820919567eb7bd4d9fac358a90a5aac4.js" integrity="sha256-BZHBbf1U21+kgPYmoIK7gLkqHu88v5cwEVFfwUPXojs= sha512-2YWrAbR45p8fk3/y4Qhbok/KUfLE/v6yMSUqIWncTmWqfJbyJj0+AiTkJL03k0oPUMZbFYyQx9SuL6XoXp4sgg==" ></script>
-    <script src="assets/todomvc-7601ffca6150ed633f0f333fe76bfaf2.js" integrity="sha256-J9SBPSVPiTlDzBrAevEqRvNz3E++u7jNErZ79EDgR3g= sha512-8QtnoWm6aXdKWOIsnuqQwaU575TkOmagUJS66bIqqZzwM8aUduM6DHlrbTsopZ9M5ok9NLqhKsafEXHWQP0cXg==" ></script>
-    
-  </body>
-</html>
deleted file mode 100644
--- a/third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/tests/index.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE html>
-<html>
-  <head>
-    <meta charset="utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=edge">
-    <title>Todomvc Tests</title>
-    <meta name="description" content="">
-    <meta name="viewport" content="width=device-width, initial-scale=1">
-
-    {{content-for "head"}}
-    {{content-for "test-head"}}
-
-    <link rel="stylesheet" href="{{rootURL}}assets/vendor.css">
-    <link rel="stylesheet" href="{{rootURL}}assets/todomvc.css">
-    <link rel="stylesheet" href="{{rootURL}}assets/test-support.css">
-
-    {{content-for "head-footer"}}
-    {{content-for "test-head-footer"}}
-  </head>
-  <body>
-    {{content-for "body"}}
-    {{content-for "test-body"}}
-
-    <script src="/testem.js" integrity=""></script>
-    <script src="{{rootURL}}assets/vendor.js"></script>
-    <script src="{{rootURL}}assets/test-support.js"></script>
-    <script src="{{rootURL}}assets/todomvc.js"></script>
-    <script src="{{rootURL}}assets/tests.js"></script>
-
-    {{content-for "body-footer"}}
-    {{content-for "test-body-footer"}}
-  </body>
-</html>
--- a/third_party/speedometer/resources/todomvc/architecture-examples/emberjs/testem.js
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/emberjs/testem.js
@@ -1,19 +1,13 @@
-/**
- * This is dummy file that exists for the sole purpose
- * of allowing tests to run directly in the browser as
- * well as by Testem.
- *
- * Testem is configured to run tests directly against
- * the test build of index.html, which requires a
- * snippet to load the testem.js file:
- *   <script src="/testem.js"></script>
- * This has to go before the qunit framework and app
- * tests are loaded.
- *
- * Testem internally supplies this file. However, if you
- * run the tests directly in the browser (localhost:8000/tests),
- * this file does not exist.
- *
- * Hence the purpose of this fake file. This file is served
- * directly from the express server to satisify the script load.
- */
+/*jshint node:true*/
+module.exports = {
+    framework: 'qunit',
+    test_page: 'tests/index.html?hidepassed',
+    disable_watching: true,
+    launch_in_ci: [
+        'PhantomJS'
+    ],
+    launch_in_dev: [
+        'PhantomJS',
+        'Chrome'
+    ]
+};
copy from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/tests/helpers/destroy-app.js
copy to third_party/speedometer/resources/todomvc/architecture-examples/emberjs/tests/helpers/destroy-app.js
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/tests/helpers/module-for-acceptance.js
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs/tests/helpers/module-for-acceptance.js
copy from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/tests/helpers/resolver.js
copy to third_party/speedometer/resources/todomvc/architecture-examples/emberjs/tests/helpers/resolver.js
rename from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/tests/helpers/start-app.js
rename to third_party/speedometer/resources/todomvc/architecture-examples/emberjs/tests/helpers/start-app.js
--- a/third_party/speedometer/resources/todomvc/architecture-examples/emberjs/tests/index.html
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/emberjs/tests/index.html
@@ -2,40 +2,32 @@
 <html>
   <head>
     <meta charset="utf-8">
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
     <title>Todomvc Tests</title>
     <meta name="description" content="">
     <meta name="viewport" content="width=device-width, initial-scale=1">
 
-    <base href="/" />
-<meta name="todomvc/config/environment" content="%7B%22modulePrefix%22%3A%22todomvc%22%2C%22environment%22%3A%22test%22%2C%22baseURL%22%3A%22/%22%2C%22locationType%22%3A%22none%22%2C%22EmberENV%22%3A%7B%22FEATURES%22%3A%7B%7D%7D%2C%22APP%22%3A%7B%22LOG_ACTIVE_GENERATION%22%3Afalse%2C%22LOG_VIEW_LOOKUPS%22%3Afalse%2C%22rootElement%22%3A%22%23ember-testing%22%2C%22name%22%3A%22todomvc%22%2C%22version%22%3A%220.0.0+%22%7D%2C%22exportApplicationGlobal%22%3Atrue%7D" />
-    
+    {{content-for "head"}}
+    {{content-for "test-head"}}
 
-    <link rel="stylesheet" href="assets/vendor.css">
-    <link rel="stylesheet" href="assets/todomvc.css">
-    <link rel="stylesheet" href="assets/test-support.css">
+    <link rel="stylesheet" href="{{rootURL}}assets/vendor.css">
+    <link rel="stylesheet" href="{{rootURL}}assets/todomvc.css">
+    <link rel="stylesheet" href="{{rootURL}}assets/test-support.css">
 
-    
-    
+    {{content-for "head-footer"}}
+    {{content-for "test-head-footer"}}
   </head>
   <body>
-    
-    <div id="qunit"></div>
-<div id="qunit-fixture"></div>
-
-<div id="ember-testing-container">
-  <div id="ember-testing"></div>
-</div>
-
+    {{content-for "body"}}
+    {{content-for "test-body"}}
 
-    <script src="testem.js" integrity=""></script>
-    <script src="assets/vendor.js"></script>
-    <script src="assets/test-support.js"></script>
-    <script src="assets/todomvc.js"></script>
-    <script src="assets/tests.js"></script>
-    <script src="assets/test-loader.js"></script>
+    <script src="/testem.js" integrity=""></script>
+    <script src="{{rootURL}}assets/vendor.js"></script>
+    <script src="{{rootURL}}assets/test-support.js"></script>
+    <script src="{{rootURL}}assets/todomvc.js"></script>
+    <script src="{{rootURL}}assets/tests.js"></script>
 
-    
-    <script>Ember.assert('The tests file was not loaded. Make sure your tests index.html includes "assets/tests.js".', EmberENV.TESTS_FILE_LOADED);</script>
+    {{content-for "body-footer"}}
+    {{content-for "test-body-footer"}}
   </body>
 </html>
copy from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/tests/test-helper.js
copy to third_party/speedometer/resources/todomvc/architecture-examples/emberjs/tests/test-helper.js
copy from third_party/speedometer/resources/todomvc/architecture-examples/emberjs/source/vendor/base.css
copy to third_party/speedometer/resources/todomvc/architecture-examples/emberjs/vendor/base.css
new file mode 100644
--- /dev/null
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/emberjs/vendor/index.css
@@ -0,0 +1,376 @@
+html,
+body {
+    margin: 0;
+    padding: 0;
+}
+
+button {
+    margin: 0;
+    padding: 0;
+    border: 0;
+    background: none;
+    font-size: 100%;
+    vertical-align: baseline;
+    font-family: inherit;
+    font-weight: inherit;
+    color: inherit;
+    -webkit-appearance: none;
+    appearance: none;
+    -webkit-font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
+}
+
+body {
+    font: 14px 'Helvetica Neue', Helvetica, Arial, sans-serif;
+    line-height: 1.4em;
+    background: #f5f5f5;
+    color: #4d4d4d;
+    min-width: 230px;
+    max-width: 550px;
+    margin: 0 auto;
+    -webkit-font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
+    font-weight: 300;
+}
+
+:focus {
+    outline: 0;
+}
+
+.hidden {
+    display: none;
+}
+
+.todoapp {
+    background: #fff;
+    margin: 130px 0 40px 0;
+    position: relative;
+    box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2),
+                0 25px 50px 0 rgba(0, 0, 0, 0.1);
+}
+
+.todoapp input::-webkit-input-placeholder {
+    font-style: italic;
+    font-weight: 300;
+    color: #e6e6e6;
+}
+
+.todoapp input::-moz-placeholder {
+    font-style: italic;
+    font-weight: 300;
+    color: #e6e6e6;
+}
+
+.todoapp input::input-placeholder {
+    font-style: italic;
+    font-weight: 300;
+    color: #e6e6e6;
+}
+
+.todoapp h1 {
+    position: absolute;
+    top: -155px;
+    width: 100%;
+    font-size: 100px;
+    font-weight: 100;
+    text-align: center;
+    color: rgba(175, 47, 47, 0.15);
+    -webkit-text-rendering: optimizeLegibility;
+    -moz-text-rendering: optimizeLegibility;
+    text-rendering: optimizeLegibility;
+}
+
+.new-todo,
+.edit {
+    position: relative;
+    margin: 0;
+    width: 100%;
+    font-size: 24px;
+    font-family: inherit;
+    font-weight: inherit;
+    line-height: 1.4em;
+    border: 0;
+    color: inherit;
+    padding: 6px;
+    border: 1px solid #999;
+    box-shadow: inset 0 -1px 5px 0 rgba(0, 0, 0, 0.2);
+    box-sizing: border-box;
+    -webkit-font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
+}
+
+.new-todo {
+    padding: 16px 16px 16px 60px;
+    border: none;
+    background: rgba(0, 0, 0, 0.003);
+    box-shadow: inset 0 -2px 1px rgba(0,0,0,0.03);
+}
+
+.main {
+    position: relative;
+    z-index: 2;
+    border-top: 1px solid #e6e6e6;
+}
+
+.toggle-all {
+    text-align: center;
+    border: none; /* Mobile Safari */
+    opacity: 0;
+    position: absolute;
+}
+
+.toggle-all + label {
+    width: 60px;
+    height: 34px;
+    font-size: 0;
+    position: absolute;
+    top: -52px;
+    left: -13px;
+    -webkit-transform: rotate(90deg);
+    transform: rotate(90deg);
+}
+
+.toggle-all + label:before {
+    content: '❯';
+    font-size: 22px;
+    color: #e6e6e6;
+    padding: 10px 27px 10px 27px;
+}
+
+.toggle-all:checked + label:before {
+    color: #737373;
+}
+
+.todo-list {
+    margin: 0;
+    padding: 0;
+    list-style: none;
+}
+
+.todo-list li {
+    position: relative;
+    font-size: 24px;
+    border-bottom: 1px solid #ededed;
+}
+
+.todo-list li:last-child {
+    border-bottom: none;
+}
+
+.todo-list li.editing {
+    border-bottom: none;
+    padding: 0;
+}
+
+.todo-list li.editing .edit {
+    display: block;
+    width: 506px;
+    padding: 12px 16px;
+    margin: 0 0 0 43px;
+}
+
+.todo-list li.editing .view {
+    display: none;
+}
+
+.todo-list li .toggle {
+    text-align: center;
+    width: 40px;
+    /* auto, since non-WebKit browsers doesn't support input styling */
+    height: auto;
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    margin: auto 0;
+    border: none; /* Mobile Safari */
+    -webkit-appearance: none;
+    appearance: none;
+}
+
+.todo-list li .toggle {
+    opacity: 0;
+}
+
+.todo-list li .toggle + label {
+    /*
+        Firefox requires `#` to be escaped - https://bugzilla.mozilla.org/show_bug.cgi?id=922433
+        IE and Edge requires *everything* to be escaped to render, so we do that instead of just the `#` - https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/7157459/
+    */
+    background-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23ededed%22%20stroke-width%3D%223%22/%3E%3C/svg%3E');
+    background-repeat: no-repeat;
+    background-position: center left;
+}
+
+.todo-list li .toggle:checked + label {
+    background-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23bddad5%22%20stroke-width%3D%223%22/%3E%3Cpath%20fill%3D%22%235dc2af%22%20d%3D%22M72%2025L42%2071%2027%2056l-4%204%2020%2020%2034-52z%22/%3E%3C/svg%3E');
+}
+
+.todo-list li label {
+    word-break: break-all;
+    padding: 15px 15px 15px 60px;
+    display: block;
+    line-height: 1.2;
+    transition: color 0.4s;
+}
+
+.todo-list li.completed label {
+    color: #d9d9d9;
+    text-decoration: line-through;
+}
+
+.todo-list li .destroy {
+    display: none;
+    position: absolute;
+    top: 0;
+    right: 10px;
+    bottom: 0;
+    width: 40px;
+    height: 40px;
+    margin: auto 0;
+    font-size: 30px;
+    color: #cc9a9a;
+    margin-bottom: 11px;
+    transition: color 0.2s ease-out;
+}
+
+.todo-list li .destroy:hover {
+    color: #af5b5e;
+}
+
+.todo-list li .destroy:after {
+    content: '×';
+}
+
+.todo-list li:hover .destroy {
+    display: block;
+}
+
+.todo-list li .edit {
+    display: none;
+}
+
+.todo-list li.editing:last-child {
+    margin-bottom: -1px;
+}
+
+.footer {
+    color: #777;
+    padding: 10px 15px;
+    height: 20px;
+    text-align: center;
+    border-top: 1px solid #e6e6e6;
+}
+
+.footer:before {
+    content: '';
+    position: absolute;
+    right: 0;
+    bottom: 0;
+    left: 0;
+    height: 50px;
+    overflow: hidden;
+    box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2),
+                0 8px 0 -3px #f6f6f6,
+                0 9px 1px -3px rgba(0, 0, 0, 0.2),
+                0 16px 0 -6px #f6f6f6,
+                0 17px 2px -6px rgba(0, 0, 0, 0.2);
+}
+
+.todo-count {
+    float: left;
+    text-align: left;
+}
+
+.todo-count strong {
+    font-weight: 300;
+}
+
+.filters {
+    margin: 0;
+    padding: 0;
+    list-style: none;
+    position: absolute;
+    right: 0;
+    left: 0;
+}
+
+.filters li {
+    display: inline;
+}
+
+.filters li a {
+    color: inherit;
+    margin: 3px;
+    padding: 3px 7px;
+    text-decoration: none;
+    border: 1px solid transparent;
+    border-radius: 3px;
+}
+
+.filters li a:hover {
+    border-color: rgba(175, 47, 47, 0.1);
+}
+
+.filters li a.selected {
+    border-color: rgba(175, 47, 47, 0.2);
+}
+
+.clear-completed,
+html .clear-completed:active {
+    float: right;
+    position: relative;
+    line-height: 20px;
+    text-decoration: none;
+    cursor: pointer;
+}
+
+.clear-completed:hover {
+    text-decoration: underline;
+}
+
+.info {
+    margin: 65px auto 0;
+    color: #bfbfbf;
+    font-size: 10px;
+    text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+    text-align: center;
+}
+
+.info p {
+    line-height: 1;
+}
+
+.info a {
+    color: inherit;
+    text-decoration: none;
+    font-weight: 400;
+}
+
+.info a:hover {
+    text-decoration: underline;
+}
+
+/*
+    Hack to remove background from Mobile Safari.
+    Can't use it globally since it destroys checkboxes in Firefox
+*/
+@media screen and (-webkit-min-device-pixel-ratio:0) {
+    .toggle-all,
+    .todo-list li .toggle {
+        background: none;
+    }
+
+    .todo-list li .toggle {
+        height: 40px;
+    }
+}
+
+@media (max-width: 430px) {
+    .footer {
+        height: 50px;
+    }
+
+    .filters {
+        bottom: 10px;
+    }
+}
--- a/third_party/speedometer/resources/todomvc/architecture-examples/inferno/node_modules/todomvc-app-css/index.css
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/inferno/node_modules/todomvc-app-css/index.css
@@ -107,38 +107,42 @@ body {
 }
 
 .main {
     position: relative;
     z-index: 2;
     border-top: 1px solid #e6e6e6;
 }
 
-label[for='toggle-all'] {
-    display: none;
+.toggle-all {
+    text-align: center;
+    border: none; /* Mobile Safari */
+    opacity: 0;
+    position: absolute;
 }
 
-.toggle-all {
-    position: absolute;
-    top: -55px;
-    left: -12px;
+.toggle-all + label {
     width: 60px;
     height: 34px;
-    text-align: center;
-    border: none; /* Mobile Safari */
+    font-size: 0;
+    position: absolute;
+    top: -52px;
+    left: -13px;
+    -webkit-transform: rotate(90deg);
+    transform: rotate(90deg);
 }
 
-.toggle-all:before {
+.toggle-all + label:before {
     content: '❯';
     font-size: 22px;
     color: #e6e6e6;
     padding: 10px 27px 10px 27px;
 }
 
-.toggle-all:checked:before {
+.toggle-all:checked + label:before {
     color: #737373;
 }
 
 .todo-list {
     margin: 0;
     padding: 0;
     list-style: none;
 }
@@ -178,28 +182,37 @@ label[for='toggle-all'] {
     top: 0;
     bottom: 0;
     margin: auto 0;
     border: none; /* Mobile Safari */
     -webkit-appearance: none;
     appearance: none;
 }
 
-.todo-list li .toggle:after {
-    content: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="-10 -18 100 135"><circle cx="50" cy="50" r="50" fill="none" stroke="#ededed" stroke-width="3"/></svg>');
+.todo-list li .toggle {
+    opacity: 0;
 }
 
-.todo-list li .toggle:checked:after {
-    content: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="-10 -18 100 135"><circle cx="50" cy="50" r="50" fill="none" stroke="#bddad5" stroke-width="3"/><path fill="#5dc2af" d="M72 25L42 71 27 56l-4 4 20 20 34-52z"/></svg>');
+.todo-list li .toggle + label {
+    /*
+        Firefox requires `#` to be escaped - https://bugzilla.mozilla.org/show_bug.cgi?id=922433
+        IE and Edge requires *everything* to be escaped to render, so we do that instead of just the `#` - https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/7157459/
+    */
+    background-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23ededed%22%20stroke-width%3D%223%22/%3E%3C/svg%3E');
+    background-repeat: no-repeat;
+    background-position: center left;
+}
+
+.todo-list li .toggle:checked + label {
+    background-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23bddad5%22%20stroke-width%3D%223%22/%3E%3Cpath%20fill%3D%22%235dc2af%22%20d%3D%22M72%2025L42%2071%2027%2056l-4%204%2020%2020%2034-52z%22/%3E%3C/svg%3E');
 }
 
 .todo-list li label {
     word-break: break-all;
-    padding: 15px 60px 15px 15px;
-    margin-left: 45px;
+    padding: 15px 15px 15px 60px;
     display: block;
     line-height: 1.2;
     transition: color 0.4s;
 }
 
 .todo-list li.completed label {
     color: #d9d9d9;
     text-decoration: line-through;
@@ -345,23 +358,16 @@ html .clear-completed:active {
     .toggle-all,
     .todo-list li .toggle {
         background: none;
     }
 
     .todo-list li .toggle {
         height: 40px;
     }
-
-    .toggle-all {
-        -webkit-transform: rotate(90deg);
-        transform: rotate(90deg);
-        -webkit-appearance: none;
-        appearance: none;
-    }
 }
 
 @media (max-width: 430px) {
     .footer {
         height: 50px;
     }
 
     .filters {
--- a/third_party/speedometer/resources/todomvc/architecture-examples/inferno/node_modules/todomvc-app-css/package.json
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/inferno/node_modules/todomvc-app-css/package.json
@@ -1,26 +1,59 @@
 {
-  "name": "todomvc-app-css",
-  "style": "index.css",
-  "version": "2.0.6",
-  "description": "CSS for TodoMVC apps",
-  "license": "CC-BY-4.0",
-  "repository": "tastejs/todomvc-app-css",
+  "_from": "todomvc-app-css@^2.1.0",
+  "_id": "todomvc-app-css@2.1.0",
+  "_inBundle": false,
+  "_integrity": "sha1-tvJxbTOa+i5feZNH0qSLBTliQqU=",
+  "_location": "/todomvc-app-css",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "todomvc-app-css@^2.1.0",
+    "name": "todomvc-app-css",
+    "escapedName": "todomvc-app-css",
+    "rawSpec": "^2.1.0",
+    "saveSpec": null,
+    "fetchSpec": "^2.1.0"
+  },
+  "_requiredBy": [
+    "#USER",
+    "/"
+  ],
+  "_resolved": "https://registry.npmjs.org/todomvc-app-css/-/todomvc-app-css-2.1.0.tgz",
+  "_shasum": "b6f2716d339afa2e5f799347d2a48b05396242a5",
+  "_spec": "todomvc-app-css@^2.1.0",
+  "_where": "/Users/mathiasb/projects/WebKit/PerformanceTests/Speedometer/resources/todomvc/architecture-examples/inferno",
   "author": {
     "name": "Sindre Sorhus",
     "email": "sindresorhus@gmail.com",
     "url": "sindresorhus.com"
   },
+  "bugs": {
+    "url": "https://github.com/tastejs/todomvc-app-css/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
+  "description": "CSS for TodoMVC apps",
   "files": [
     "index.css"
   ],
+  "homepage": "https://github.com/tastejs/todomvc-app-css#readme",
   "keywords": [
     "todomvc",
     "tastejs",
     "app",
     "todo",
     "template",
     "css",
     "style",
     "stylesheet"
-  ]
+  ],
+  "license": "CC-BY-4.0",
+  "name": "todomvc-app-css",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/tastejs/todomvc-app-css.git"
+  },
+  "style": "index.css",
+  "version": "2.1.0"
 }
--- a/third_party/speedometer/resources/todomvc/architecture-examples/inferno/node_modules/todomvc-common/base.js
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/inferno/node_modules/todomvc-common/base.js
@@ -16,17 +16,17 @@
                     for (var key in iterable) {
                         if (object[key] == null) {
                             object[key] = iterable[key];
                         }
                     }
                 }
             }
             return object;
-        }
+        };
 
         // By default, Underscore uses ERB-style template delimiters, change the
         // following template settings to use alternative delimiters.
         _.templateSettings = {
             evaluate    : /<%([\s\S]+?)%>/g,
             interpolate : /<%=([\s\S]+?)%>/g,
             escape      : /<%-([\s\S]+?)%>/g
         };
--- a/third_party/speedometer/resources/todomvc/architecture-examples/inferno/node_modules/todomvc-common/package.json
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/inferno/node_modules/todomvc-common/package.json
@@ -1,20 +1,55 @@
 {
-  "name": "todomvc-common",
-  "version": "1.0.3",
+  "_from": "todomvc-common@^1.0.4",
+  "_id": "todomvc-common@1.0.4",
+  "_inBundle": false,
+  "_integrity": "sha512-AA0Z4exovEqubhbZCrzzn9roVT4zvOncS319p2zIc4CsNe5B9TLL7Sei1NIV6d+WrgR5rOi+y0I9Y6GE7xgNOw==",
+  "_location": "/todomvc-common",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "todomvc-common@^1.0.4",
+    "name": "todomvc-common",
+    "escapedName": "todomvc-common",
+    "rawSpec": "^1.0.4",
+    "saveSpec": null,
+    "fetchSpec": "^1.0.4"
+  },
+  "_requiredBy": [
+    "#USER",
+    "/"
+  ],
+  "_resolved": "https://registry.npmjs.org/todomvc-common/-/todomvc-common-1.0.4.tgz",
+  "_shasum": "23099af886c2f0525bfd4537e078f12d0074309e",
+  "_spec": "todomvc-common@^1.0.4",
+  "_where": "/Users/mathiasb/projects/WebKit/PerformanceTests/Speedometer/resources/todomvc/architecture-examples/inferno",
+  "author": {
+    "name": "TasteJS"
+  },
+  "bugs": {
+    "url": "https://github.com/tastejs/todomvc-common/issues"
+  },
+  "bundleDependencies": false,
+  "deprecated": false,
   "description": "Common TodoMVC utilities used by our apps",
-  "license": "MIT",
-  "repository": "tastejs/todomvc-common",
-  "author": "TasteJS",
-  "main": "base.js",
-  "style": "base.css",
   "files": [
     "base.js",
     "base.css"
   ],
+  "homepage": "https://github.com/tastejs/todomvc-common#readme",
   "keywords": [
     "todomvc",
     "tastejs",
     "util",
     "utilities"
-  ]
+  ],
+  "license": "MIT",
+  "main": "base.js",
+  "name": "todomvc-common",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/tastejs/todomvc-common.git"
+  },
+  "style": "base.css",
+  "version": "1.0.4"
 }
--- a/third_party/speedometer/resources/todomvc/architecture-examples/inferno/package.json
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/inferno/package.json
@@ -3,18 +3,18 @@
   "scripts": {
     "dev": "webpack-dev-server",
     "build": "webpack -p",
     "test": "cd test && npm test"
   },
   "dependencies": {
     "inferno": "beta32",
     "inferno-component": "beta32",
-    "todomvc-app-css": "^2.0.0",
-    "todomvc-common": "^1.0.0"
+    "todomvc-app-css": "^2.1.0",
+    "todomvc-common": "^1.0.4"
   },
   "devDependencies": {
     "babel-core": "^6.5.2",
     "babel-loader": "^6.2.1",
     "babel-plugin-inferno": "beta13",
     "babel-preset-es2015": "^6.5.0",
     "babel-preset-es2015-loose": "^7.0.0",
     "babel-preset-stage-0": "^6.5.0",
--- a/third_party/speedometer/resources/todomvc/architecture-examples/jquery/index.html
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/jquery/index.html
@@ -3,29 +3,29 @@
     <head>
         <meta charset="utf-8">
         <title>jQuery • TodoMVC</title>
         <link rel="stylesheet" href="node_modules/todomvc-common/base.css">
         <link rel="stylesheet" href="node_modules/todomvc-app-css/index.css">
         <link rel="stylesheet" href="css/app.css">
     </head>
     <body>
-        <section id="todoapp">
-            <header id="header">
+        <section id="todoapp" class="todoapp">
+            <header id="header" class="header">
                 <h1>todos</h1>
-                <input id="new-todo" placeholder="What needs to be done?" autofocus>
+                <input id="new-todo" class="new-todo" placeholder="What needs to be done?" autofocus>
             </header>
-            <section id="main">
-                <input id="toggle-all" type="checkbox">
+            <section id="main" class="main">
+                <input id="toggle-all" class="toggle-all" type="checkbox">
                 <label for="toggle-all">Mark all as complete</label>
-                <ul id="todo-list"></ul>
+                <ul id="todo-list" class="todo-list"></ul>
             </section>
-            <footer id="footer"></footer>
+            <footer id="footer" class="footer"></footer>
         </section>
-        <footer id="info">
+        <footer id="info" class="info">
             <p>Double-click to edit a todo</p>
             <p>Created by <a href="http://sindresorhus.com">Sindre Sorhus</a></p>
             <p>Part of <a href="http://todomvc.com">TodoMVC</a></p>
         </footer>
         <script id="todo-template" type="text/x-handlebars-template">
             {{#this}}
             <li {{#if completed}}class="completed"{{/if}} data-id="{{id}}">
                 <div class="view">
@@ -33,18 +33,18 @@
                     <label>{{title}}</label>
                     <button class="destroy"></button>
                 </div>
                 <input class="edit" value="{{title}}">
             </li>
         {{/this}}
         </script>
         <script id="footer-template" type="text/x-handlebars-template">
-            <span id="todo-count"><strong>{{activeTodoCount}}</strong> {{activeTodoWord}} left</span>
-            <ul id="filters">
+            <span id="todo-count" class="todo-count"><strong>{{activeTodoCount}}</strong> {{activeTodoWord}} left</span>
+            <ul id="filters" class="filters">
                 <li>
                     <a {{#eq filter 'all'}}class="selected"{{/eq}} href="#/all">All</a>
                 </li>
                 <li>
                     <a {{#eq filter 'active'}}class="selected"{{/eq}}href="#/active">Active</a>
                 </li>
                 <li>
                     <a {{#eq filter 'completed'}}class="selected"{{/eq}}href="#/completed">Completed</a>
--- a/third_party/speedometer/resources/todomvc/architecture-examples/jquery/js/app.js
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/jquery/js/app.js
@@ -41,16 +41,20 @@ jQuery(function ($) {
             this.bindEvents();
 
             new Router({
                 '/:filter': function (filter) {
                     this.filter = filter;
                     this.render();
                 }.bind(this)
             }).init('/all');
+
+            var dummyNodeToNotifyAppIsReady = document.createElement('div');
+            dummyNodeToNotifyAppIsReady.id = 'appIsReady';
+            document.body.appendChild(dummyNodeToNotifyAppIsReady);
         },
         bindEvents: function () {
             $('#new-todo').on('keyup', this.create.bind(this));
             $('#toggle-all').on('change', this.toggleAll.bind(this));
             $('#footer').on('click', '#clear-completed', this.destroyCompleted.bind(this));
             $('#todo-list')
                 .on('change', '.toggle', this.toggle.bind(this))
                 .on('dblclick', 'label', this.edit.bind(this))
--- a/third_party/speedometer/resources/todomvc/architecture-examples/jquery/node_modules/todomvc-app-css/index.css
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/jquery/node_modules/todomvc-app-css/index.css
@@ -12,367 +12,365 @@ button {
     font-size: 100%;
     vertical-align: baseline;
     font-family: inherit;
     font-weight: inherit;
     color: inherit;
     -webkit-appearance: none;
     appearance: none;
     -webkit-font-smoothing: antialiased;
-    -moz-font-smoothing: antialiased;
-    font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
 }
 
 body {
     font: 14px 'Helvetica Neue', Helvetica, Arial, sans-serif;
     line-height: 1.4em;
     background: #f5f5f5;
     color: #4d4d4d;
     min-width: 230px;
     max-width: 550px;
     margin: 0 auto;
     -webkit-font-smoothing: antialiased;
-    -moz-font-smoothing: antialiased;
-    font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
     font-weight: 300;
 }
 
-button,
-input[type="checkbox"] {
-    outline: none;
+:focus {
+    outline: 0;
 }
 
 .hidden {
     display: none;
 }
 
-#todoapp {
+.todoapp {
     background: #fff;
     margin: 130px 0 40px 0;
     position: relative;
     box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2),
                 0 25px 50px 0 rgba(0, 0, 0, 0.1);
 }
 
-#todoapp input::-webkit-input-placeholder {
+.todoapp input::-webkit-input-placeholder {
     font-style: italic;
     font-weight: 300;
     color: #e6e6e6;
 }
 
-#todoapp input::-moz-placeholder {
+.todoapp input::-moz-placeholder {
     font-style: italic;
     font-weight: 300;
     color: #e6e6e6;
 }
 
-#todoapp input::input-placeholder {
+.todoapp input::input-placeholder {
     font-style: italic;
     font-weight: 300;
     color: #e6e6e6;
 }
 
-#todoapp h1 {
+.todoapp h1 {
     position: absolute;
     top: -155px;
     width: 100%;
     font-size: 100px;
     font-weight: 100;
     text-align: center;
     color: rgba(175, 47, 47, 0.15);
     -webkit-text-rendering: optimizeLegibility;
     -moz-text-rendering: optimizeLegibility;
     text-rendering: optimizeLegibility;
 }
 
-#new-todo,
+.new-todo,
 .edit {
     position: relative;
     margin: 0;
     width: 100%;
     font-size: 24px;
     font-family: inherit;
     font-weight: inherit;
     line-height: 1.4em;
     border: 0;
-    outline: none;
     color: inherit;
     padding: 6px;
     border: 1px solid #999;
     box-shadow: inset 0 -1px 5px 0 rgba(0, 0, 0, 0.2);
     box-sizing: border-box;
     -webkit-font-smoothing: antialiased;
-    -moz-font-smoothing: antialiased;
-    font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
 }
 
-#new-todo {
+.new-todo {
     padding: 16px 16px 16px 60px;
     border: none;
     background: rgba(0, 0, 0, 0.003);
     box-shadow: inset 0 -2px 1px rgba(0,0,0,0.03);
 }
 
-#main {
+.main {
     position: relative;
     z-index: 2;
     border-top: 1px solid #e6e6e6;
 }
 
-label[for='toggle-all'] {
-    display: none;
+.toggle-all {
+    text-align: center;
+    border: none; /* Mobile Safari */
+    opacity: 0;
+    position: absolute;
 }
 
-#toggle-all {
-    position: absolute;
-    top: -55px;
-    left: -12px;
+.toggle-all + label {
     width: 60px;
     height: 34px;
-    text-align: center;
-    border: none; /* Mobile Safari */
+    font-size: 0;
+    position: absolute;
+    top: -52px;
+    left: -13px;
+    -webkit-transform: rotate(90deg);
+    transform: rotate(90deg);
 }
 
-#toggle-all:before {
+.toggle-all + label:before {
     content: '❯';
     font-size: 22px;
     color: #e6e6e6;
     padding: 10px 27px 10px 27px;
 }
 
-#toggle-all:checked:before {
+.toggle-all:checked + label:before {
     color: #737373;
 }
 
-#todo-list {
+.todo-list {
     margin: 0;
     padding: 0;
     list-style: none;
 }
 
-#todo-list li {
+.todo-list li {
     position: relative;
     font-size: 24px;
     border-bottom: 1px solid #ededed;
 }
 
-#todo-list li:last-child {
+.todo-list li:last-child {
     border-bottom: none;
 }
 
-#todo-list li.editing {
+.todo-list li.editing {
     border-bottom: none;
     padding: 0;
 }
 
-#todo-list li.editing .edit {
+.todo-list li.editing .edit {
     display: block;
     width: 506px;
-    padding: 13px 17px 12px 17px;
+    padding: 12px 16px;
     margin: 0 0 0 43px;
 }
 
-#todo-list li.editing .view {
+.todo-list li.editing .view {
     display: none;
 }
 
-#todo-list li .toggle {
+.todo-list li .toggle {
     text-align: center;
     width: 40px;
     /* auto, since non-WebKit browsers doesn't support input styling */
     height: auto;
     position: absolute;
     top: 0;
     bottom: 0;
     margin: auto 0;
     border: none; /* Mobile Safari */
     -webkit-appearance: none;
     appearance: none;
 }
 
-#todo-list li .toggle:after {
-    content: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="-10 -18 100 135"><circle cx="50" cy="50" r="50" fill="none" stroke="#ededed" stroke-width="3"/></svg>');
+.todo-list li .toggle {
+    opacity: 0;
 }
 
-#todo-list li .toggle:checked:after {
-    content: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="-10 -18 100 135"><circle cx="50" cy="50" r="50" fill="none" stroke="#bddad5" stroke-width="3"/><path fill="#5dc2af" d="M72 25L42 71 27 56l-4 4 20 20 34-52z"/></svg>');
+.todo-list li .toggle + label {
+    /*
+        Firefox requires `#` to be escaped - https://bugzilla.mozilla.org/show_bug.cgi?id=922433
+        IE and Edge requires *everything* to be escaped to render, so we do that instead of just the `#` - https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/7157459/
+    */
+    background-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23ededed%22%20stroke-width%3D%223%22/%3E%3C/svg%3E');
+    background-repeat: no-repeat;
+    background-position: center left;
 }
 
-#todo-list li label {
-    white-space: pre;
-    word-break: break-word;
-    padding: 15px 60px 15px 15px;
-    margin-left: 45px;
+.todo-list li .toggle:checked + label {
+    background-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23bddad5%22%20stroke-width%3D%223%22/%3E%3Cpath%20fill%3D%22%235dc2af%22%20d%3D%22M72%2025L42%2071%2027%2056l-4%204%2020%2020%2034-52z%22/%3E%3C/svg%3E');
+}
+
+.todo-list li label {
+    word-break: break-all;
+    padding: 15px 15px 15px 60px;
     display: block;
     line-height: 1.2;
     transition: color 0.4s;
 }
 
-#todo-list li.completed label {
+.todo-list li.completed label {
     color: #d9d9d9;
     text-decoration: line-through;
 }
 
-#todo-list li .destroy {
+.todo-list li .destroy {
     display: none;
     position: absolute;
     top: 0;
     right: 10px;
     bottom: 0;
     width: 40px;
     height: 40px;
     margin: auto 0;
     font-size: 30px;
     color: #cc9a9a;
     margin-bottom: 11px;
     transition: color 0.2s ease-out;
 }
 
-#todo-list li .destroy:hover {
+.todo-list li .destroy:hover {
     color: #af5b5e;
 }
 
-#todo-list li .destroy:after {
+.todo-list li .destroy:after {
     content: '×';
 }
 
-#todo-list li:hover .destroy {
+.todo-list li:hover .destroy {
     display: block;
 }
 
-#todo-list li .edit {
+.todo-list li .edit {
     display: none;
 }
 
-#todo-list li.editing:last-child {
+.todo-list li.editing:last-child {
     margin-bottom: -1px;
 }
 
-#footer {
+.footer {
     color: #777;
     padding: 10px 15px;
     height: 20px;
     text-align: center;
     border-top: 1px solid #e6e6e6;
 }
 
-#footer:before {
+.footer:before {
     content: '';
     position: absolute;
     right: 0;
     bottom: 0;
     left: 0;
     height: 50px;
     overflow: hidden;
     box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2),
                 0 8px 0 -3px #f6f6f6,
                 0 9px 1px -3px rgba(0, 0, 0, 0.2),
                 0 16px 0 -6px #f6f6f6,
                 0 17px 2px -6px rgba(0, 0, 0, 0.2);
 }
 
-#todo-count {
+.todo-count {
     float: left;
     text-align: left;
 }
 
-#todo-count strong {
+.todo-count strong {
     font-weight: 300;
 }
 
-#filters {
+.filters {
     margin: 0;
     padding: 0;
     list-style: none;
     position: absolute;
     right: 0;
     left: 0;
 }
 
-#filters li {
+.filters li {
     display: inline;
 }
 
-#filters li a {
+.filters li a {
     color: inherit;
     margin: 3px;
     padding: 3px 7px;
     text-decoration: none;
     border: 1px solid transparent;
     border-radius: 3px;
 }
 
-#filters li a.selected,
-#filters li a:hover {
+.filters li a:hover {
     border-color: rgba(175, 47, 47, 0.1);
 }
 
-#filters li a.selected {
+.filters li a.selected {
     border-color: rgba(175, 47, 47, 0.2);
 }
 
-#clear-completed,
-html #clear-completed:active {
+.clear-completed,
+html .clear-completed:active {
     float: right;
     position: relative;
     line-height: 20px;
     text-decoration: none;
     cursor: pointer;
-    position: relative;
 }
 
-#clear-completed:hover {
+.clear-completed:hover {
     text-decoration: underline;
 }
 
-#info {
+.info {
     margin: 65px auto 0;
     color: #bfbfbf;
     font-size: 10px;
     text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
     text-align: center;
 }
 
-#info p {
+.info p {
     line-height: 1;
 }
 
-#info a {
+.info a {
     color: inherit;
     text-decoration: none;
     font-weight: 400;
 }
 
-#info a:hover {
+.info a:hover {
     text-decoration: underline;
 }
 
 /*
     Hack to remove background from Mobile Safari.
     Can't use it globally since it destroys checkboxes in Firefox
 */
 @media screen and (-webkit-min-device-pixel-ratio:0) {
-    #toggle-all,
-    #todo-list li .toggle {
+    .toggle-all,
+    .todo-list li .toggle {
         background: none;
     }
 
-    #todo-list li .toggle {
+    .todo-list li .toggle {
         height: 40px;
     }
-
-    #toggle-all {
-        -webkit-transform: rotate(90deg);
-        transform: rotate(90deg);
-        -webkit-appearance: none;
-        appearance: none;
-    }
 }
 
 @media (max-width: 430px) {
-    #footer {
+    .footer {
         height: 50px;
     }
 
-    #filters {
+    .filters {
         bottom: 10px;
     }
 }
--- a/third_party/speedometer/resources/todomvc/architecture-examples/jquery/node_modules/todomvc-app-css/package.json
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/jquery/node_modules/todomvc-app-css/package.json
@@ -1,103 +1,58 @@
 {
-  "_args": [
-    [
-      {
-        "raw": "todomvc-app-css@~1.0.1",
-        "scope": null,
-        "escapedName": "todomvc-app-css",
-        "name": "todomvc-app-css",
-        "rawSpec": "~1.0.1",
-        "spec": ">=1.0.1 <1.1.0",
-        "type": "range"
-      },
-      "/Users/addyo/projects/speedometer/resources/todomvc/architecture-examples/jquery"
-    ]
-  ],
-  "_from": "todomvc-app-css@>=1.0.1 <1.1.0",
-  "_id": "todomvc-app-css@1.0.4",
-  "_inCache": true,
+  "_from": "todomvc-app-css@^2.1.0",
+  "_id": "todomvc-app-css@2.1.0",
+  "_inBundle": false,
+  "_integrity": "sha1-tvJxbTOa+i5feZNH0qSLBTliQqU=",
   "_location": "/todomvc-app-css",
-  "_nodeVersion": "0.12.0",
-  "_npmUser": {
-    "name": "sindresorhus",
-    "email": "sindresorhus@gmail.com"
-  },
-  "_npmVersion": "2.5.1",
   "_phantomChildren": {},
   "_requested": {
-    "raw": "todomvc-app-css@~1.0.1",
-    "scope": null,
-    "escapedName": "todomvc-app-css",
+    "type": "range",
+    "registry": true,
+    "raw": "todomvc-app-css@^2.1.0",
     "name": "todomvc-app-css",
-    "rawSpec": "~1.0.1",
-    "spec": ">=1.0.1 <1.1.0",
-    "type": "range"
+    "escapedName": "todomvc-app-css",
+    "rawSpec": "^2.1.0",
+    "saveSpec": null,
+    "fetchSpec": "^2.1.0"
   },
   "_requiredBy": [
     "/"
   ],
-  "_resolved": "https://registry.npmjs.org/todomvc-app-css/-/todomvc-app-css-1.0.4.tgz",
-  "_shasum": "d2529279a6da5befb06b55c0c324c5fcfd94d656",
-  "_shrinkwrap": null,
-  "_spec": "todomvc-app-css@~1.0.1",
-  "_where": "/Users/addyo/projects/speedometer/resources/todomvc/architecture-examples/jquery",
+  "_resolved": "https://registry.npmjs.org/todomvc-app-css/-/todomvc-app-css-2.1.0.tgz",
+  "_shasum": "b6f2716d339afa2e5f799347d2a48b05396242a5",
+  "_spec": "todomvc-app-css@^2.1.0",
+  "_where": "/Users/mathiasb/projects/WebKit/PerformanceTests/Speedometer/resources/todomvc/architecture-examples/jquery",
   "author": {
     "name": "Sindre Sorhus",
     "email": "sindresorhus@gmail.com",
     "url": "sindresorhus.com"
   },
   "bugs": {
     "url": "https://github.com/tastejs/todomvc-app-css/issues"
   },
-  "dependencies": {},
+  "bundleDependencies": false,
+  "deprecated": false,
   "description": "CSS for TodoMVC apps",
-  "devDependencies": {},
-  "directories": {},
-  "dist": {
-    "shasum": "d2529279a6da5befb06b55c0c324c5fcfd94d656",
-    "tarball": "https://registry.npmjs.org/todomvc-app-css/-/todomvc-app-css-1.0.4.tgz"
-  },
   "files": [
     "index.css"
   ],
-  "gitHead": "1e4e38884a35193eaf1808a5ba44421832867184",
-  "homepage": "https://github.com/tastejs/todomvc-app-css",
+  "homepage": "https://github.com/tastejs/todomvc-app-css#readme",
   "keywords": [
     "todomvc",
     "tastejs",
     "app",
     "todo",
     "template",
     "css",
     "style",
     "stylesheet"
   ],
   "license": "CC-BY-4.0",
-  "maintainers": [
-    {
-      "name": "sindresorhus",
-      "email": "sindresorhus@gmail.com"
-    },
-    {
-      "name": "addyosmani",
-      "email": "addyosmani@gmail.com"
-    },
-    {
-      "name": "passy",
-      "email": "phartig@rdrei.net"
-    },
-    {
-      "name": "stephenplusplus",
-      "email": "sawchuk@gmail.com"
-    }
-  ],
   "name": "todomvc-app-css",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
   "repository": {
     "type": "git",
     "url": "git+https://github.com/tastejs/todomvc-app-css.git"
   },
-  "scripts": {},
-  "version": "1.0.4"
+  "style": "index.css",
+  "version": "2.1.0"
 }
--- a/third_party/speedometer/resources/todomvc/architecture-examples/jquery/node_modules/todomvc-common/base.js
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/jquery/node_modules/todomvc-common/base.js
@@ -16,17 +16,17 @@
                     for (var key in iterable) {
                         if (object[key] == null) {
                             object[key] = iterable[key];
                         }
                     }
                 }
             }
             return object;
-        }
+        };
 
         // By default, Underscore uses ERB-style template delimiters, change the
         // following template settings to use alternative delimiters.
         _.templateSettings = {
             evaluate    : /<%([\s\S]+?)%>/g,
             interpolate : /<%=([\s\S]+?)%>/g,
             escape      : /<%-([\s\S]+?)%>/g
         };
--- a/third_party/speedometer/resources/todomvc/architecture-examples/jquery/node_modules/todomvc-common/package.json
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/jquery/node_modules/todomvc-common/package.json
@@ -1,104 +1,54 @@
 {
-  "_args": [
-    [
-      {
-        "raw": "todomvc-common@~1.0.1",
-        "scope": null,
-        "escapedName": "todomvc-common",
-        "name": "todomvc-common",
-        "rawSpec": "~1.0.1",
-        "spec": ">=1.0.1 <1.1.0",
-        "type": "range"
-      },
-      "/Users/addyo/projects/speedometer/resources/todomvc/architecture-examples/jquery"
-    ]
-  ],
-  "_from": "todomvc-common@>=1.0.1 <1.1.0",
-  "_id": "todomvc-common@1.0.3",
-  "_inCache": true,
+  "_from": "todomvc-common@^1.0.4",
+  "_id": "todomvc-common@1.0.4",
+  "_inBundle": false,
+  "_integrity": "sha512-AA0Z4exovEqubhbZCrzzn9roVT4zvOncS319p2zIc4CsNe5B9TLL7Sei1NIV6d+WrgR5rOi+y0I9Y6GE7xgNOw==",
   "_location": "/todomvc-common",
-  "_nodeVersion": "7.1.0",
-  "_npmOperationalInternal": {
-    "host": "packages-18-east.internal.npmjs.com",
-    "tmp": "tmp/todomvc-common-1.0.3.tgz_1479276361227_0.51124880136922"
-  },
-  "_npmUser": {
-    "name": "sindresorhus",
-    "email": "sindresorhus@gmail.com"
-  },
-  "_npmVersion": "3.10.9",
   "_phantomChildren": {},
   "_requested": {
-    "raw": "todomvc-common@~1.0.1",
-    "scope": null,
-    "escapedName": "todomvc-common",
+    "type": "range",
+    "registry": true,
+    "raw": "todomvc-common@^1.0.4",
     "name": "todomvc-common",
-    "rawSpec": "~1.0.1",
-    "spec": ">=1.0.1 <1.1.0",
-    "type": "range"
+    "escapedName": "todomvc-common",
+    "rawSpec": "^1.0.4",
+    "saveSpec": null,
+    "fetchSpec": "^1.0.4"
   },
   "_requiredBy": [
     "/"
   ],
-  "_resolved": "https://registry.npmjs.org/todomvc-common/-/todomvc-common-1.0.3.tgz",
-  "_shasum": "cba1868109caa401b908ebf77794cc1014b74873",
-  "_shrinkwrap": null,
-  "_spec": "todomvc-common@~1.0.1",
-  "_where": "/Users/addyo/projects/speedometer/resources/todomvc/architecture-examples/jquery",
+  "_resolved": "https://registry.npmjs.org/todomvc-common/-/todomvc-common-1.0.4.tgz",
+  "_shasum": "23099af886c2f0525bfd4537e078f12d0074309e",
+  "_spec": "todomvc-common@^1.0.4",
+  "_where": "/Users/mathiasb/projects/WebKit/PerformanceTests/Speedometer/resources/todomvc/architecture-examples/jquery",
   "author": {
     "name": "TasteJS"
   },
   "bugs": {
     "url": "https://github.com/tastejs/todomvc-common/issues"
   },
-  "dependencies": {},
+  "bundleDependencies": false,
+  "deprecated": false,
   "description": "Common TodoMVC utilities used by our apps",
-  "devDependencies": {},
-  "directories": {},
-  "dist": {
-    "shasum": "cba1868109caa401b908ebf77794cc1014b74873",
-    "tarball": "https://registry.npmjs.org/todomvc-common/-/todomvc-common-1.0.3.tgz"
-  },
   "files": [
     "base.js",
     "base.css"
   ],
-  "gitHead": "e7425bafb9561d766b769844810e0496734ffe8c",
   "homepage": "https://github.com/tastejs/todomvc-common#readme",
   "keywords": [
     "todomvc",
     "tastejs",
     "util",
     "utilities"
   ],
   "license": "MIT",
   "main": "base.js",
-  "maintainers": [
-    {
-      "name": "sindresorhus",
-      "email": "sindresorhus@gmail.com"
-    },
-    {
-      "name": "addyosmani",
-      "email": "addyosmani@gmail.com"
-    },
-    {
-      "name": "passy",
-      "email": "phartig@rdrei.net"
-    },
-    {
-      "name": "stephenplusplus",
-      "email": "sawchuk@gmail.com"
-    }
-  ],
   "name": "todomvc-common",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
   "repository": {
     "type": "git",
     "url": "git+https://github.com/tastejs/todomvc-common.git"
   },
-  "scripts": {},
   "style": "base.css",
-  "version": "1.0.3"
+  "version": "1.0.4"
 }
--- a/third_party/speedometer/resources/todomvc/architecture-examples/jquery/package.json
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/jquery/package.json
@@ -1,10 +1,10 @@
 {
   "private": true,
   "dependencies": {
     "director": "~1.2.2",
     "handlebars": "^4.0.6",
     "jquery": "^3.1.1",
-    "todomvc-app-css": "~1.0.1",
-    "todomvc-common": "~1.0.1"
+    "todomvc-app-css": "^2.1.0",
+    "todomvc-common": "^1.0.4"
   }
 }
new file mode 100644
--- /dev/null
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/react-redux/dist/asset-manifest.json
@@ -0,0 +1,6 @@
+{
+  "main.css": "static/css/main.21111742.css",
+  "main.css.map": "static/css/main.21111742.css.map",
+  "main.js": "static/js/main.18b409e1.js",
+  "main.js.map": "static/js/main.18b409e1.js.map"
+}
\ No newline at end of file
--- a/third_party/speedometer/resources/todomvc/architecture-examples/react-redux/dist/index.html
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/react-redux/dist/index.html
@@ -1,1 +1,1 @@
-<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>React Redux TodoMVC example</title><link href="./static/css/main.f04a7319.css" rel="stylesheet"></head><body><div class="todoapp" id="root"></div><script type="text/javascript" src="./static/js/main.69cd9655.js"></script></body></html>
\ No newline at end of file
+<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>React Redux TodoMVC example</title><link href="./static/css/main.21111742.css" rel="stylesheet"></head><body><div class="todoapp" id="root"></div><script type="text/javascript" src="./static/js/main.18b409e1.js"></script></body></html>
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/react-redux/dist/service-worker.js
@@ -0,0 +1,1 @@
+"use strict";function setOfCachedUrls(e){return e.keys().then(function(e){return e.map(function(e){return e.url})}).then(function(e){return new Set(e)})}var precacheConfig=[["./index.html","70e95a3f3a1d1cbd333b8544580c4130"],["./static/css/main.21111742.css","fec2811be103da4460c67500f37bb3fb"],["./static/js/main.18b409e1.js","bc76e5d850c48a3ae24784e335ef0b0e"]],cacheName="sw-precache-v3-sw-precache-webpack-plugin-"+(self.registration?self.registration.scope:""),ignoreUrlParametersMatching=[/^utm_/],addDirectoryIndex=function(e,t){var n=new URL(e);return"/"===n.pathname.slice(-1)&&(n.pathname+=t),n.toString()},cleanResponse=function(e){return e.redirected?("body"in e?Promise.resolve(e.body):e.blob()).then(function(t){return new Response(t,{headers:e.headers,status:e.status,statusText:e.statusText})}):Promise.resolve(e)},createCacheKey=function(e,t,n,r){var a=new URL(e);return r&&a.pathname.match(r)||(a.search+=(a.search?"&":"")+encodeURIComponent(t)+"="+encodeURIComponent(n)),a.toString()},isPathWhitelisted=function(e,t){if(0===e.length)return!0;var n=new URL(t).pathname;return e.some(function(e){return n.match(e)})},stripIgnoredUrlParameters=function(e,t){var n=new URL(e);return n.hash="",n.search=n.search.slice(1).split("&").map(function(e){return e.split("=")}).filter(function(e){return t.every(function(t){return!t.test(e[0])})}).map(function(e){return e.join("=")}).join("&"),n.toString()},hashParamName="_sw-precache",urlsToCacheKeys=new Map(precacheConfig.map(function(e){var t=e[0],n=e[1],r=new URL(t,self.location),a=createCacheKey(r,hashParamName,n,/\.\w{8}\./);return[r.toString(),a]}));self.addEventListener("install",function(e){e.waitUntil(caches.open(cacheName).then(function(e){return setOfCachedUrls(e).then(function(t){return Promise.all(Array.from(urlsToCacheKeys.values()).map(function(n){if(!t.has(n)){var r=new Request(n,{credentials:"same-origin"});return fetch(r).then(function(t){if(!t.ok)throw new Error("Request for "+n+" returned a response with status "+t.status);return cleanResponse(t).then(function(t){return e.put(n,t)})})}}))})}).then(function(){return self.skipWaiting()}))}),self.addEventListener("activate",function(e){var t=new Set(urlsToCacheKeys.values());e.waitUntil(caches.open(cacheName).then(function(e){return e.keys().then(function(n){return Promise.all(n.map(function(n){if(!t.has(n.url))return e.delete(n)}))})}).then(function(){return self.clients.claim()}))}),self.addEventListener("fetch",function(e){if("GET"===e.request.method){var t,n=stripIgnoredUrlParameters(e.request.url,ignoreUrlParametersMatching);(t=urlsToCacheKeys.has(n))||(n=addDirectoryIndex(n,"index.html"),t=urlsToCacheKeys.has(n));!t&&"navigate"===e.request.mode&&isPathWhitelisted(["^(?!\\/__).*"],e.request.url)&&(n=new URL("./index.html",self.location).toString(),t=urlsToCacheKeys.has(n)),t&&e.respondWith(caches.open(cacheName).then(function(e){return e.match(urlsToCacheKeys.get(n)).then(function(e){if(e)return e;throw Error("The cached response that was expected is missing.")})}).catch(function(t){return console.warn('Couldn\'t serve response for "%s" from cache: %O',e.request.url,t),fetch(e.request)}))}});
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/react-redux/dist/static/css/main.21111742.css
@@ -0,0 +1,2 @@
+body,button,html{margin:0;padding:0}button{border:0;background:none;font-size:100%;vertical-align:baseline;font-family:inherit;font-weight:inherit;color:inherit;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-font-smoothing:antialiased}body,button{-moz-osx-font-smoothing:grayscale}body{font:14px Helvetica Neue,Helvetica,Arial,sans-serif;line-height:1.4em;background:#f5f5f5;color:#4d4d4d;min-width:230px;max-width:550px;margin:0 auto;-webkit-font-smoothing:antialiased;font-weight:300}:focus{outline:0}.hidden{display:none}.todoapp{background:#fff;margin:130px 0 40px;position:relative;-webkit-box-shadow:0 2px 4px 0 rgba(0,0,0,.2),0 25px 50px 0 rgba(0,0,0,.1);box-shadow:0 2px 4px 0 rgba(0,0,0,.2),0 25px 50px 0 rgba(0,0,0,.1)}.todoapp input::-webkit-input-placeholder{font-style:italic;font-weight:300;color:#e6e6e6}.todoapp input::-moz-placeholder{font-style:italic;font-weight:300;color:#e6e6e6}.todoapp input::input-placeholder{font-style:italic;font-weight:300;color:#e6e6e6}.todoapp h1{position:absolute;top:-155px;width:100%;font-size:100px;font-weight:100;text-align:center;color:rgba(175,47,47,.15);-webkit-text-rendering:optimizeLegibility;-moz-text-rendering:optimizeLegibility;text-rendering:optimizeLegibility}.edit,.new-todo{position:relative;margin:0;width:100%;font-size:24px;font-family:inherit;font-weight:inherit;line-height:1.4em;border:0;color:inherit;padding:6px;border:1px solid #999;-webkit-box-shadow:inset 0 -1px 5px 0 rgba(0,0,0,.2);box-shadow:inset 0 -1px 5px 0 rgba(0,0,0,.2);-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.new-todo{padding:16px 16px 16px 60px;border:none;background:rgba(0,0,0,.003);-webkit-box-shadow:inset 0 -2px 1px rgba(0,0,0,.03);box-shadow:inset 0 -2px 1px rgba(0,0,0,.03)}.main{position:relative;z-index:2;border-top:1px solid #e6e6e6}.toggle-all{text-align:center;border:none;opacity:0;position:absolute}.toggle-all+label{width:60px;height:34px;font-size:0;position:absolute;top:-52px;left:-13px;-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.toggle-all+label:before{content:"\276F";font-size:22px;color:#e6e6e6;padding:10px 27px}.toggle-all:checked+label:before{color:#737373}.todo-list{margin:0;padding:0;list-style:none}.todo-list li{position:relative;font-size:24px;border-bottom:1px solid #ededed}.todo-list li:last-child{border-bottom:none}.todo-list li.editing{border-bottom:none;padding:0}.todo-list li.editing .edit{display:block;width:506px;padding:12px 16px;margin:0 0 0 43px}.todo-list li.editing .view{display:none}.todo-list li .toggle{text-align:center;width:40px;height:auto;position:absolute;top:0;bottom:0;margin:auto 0;border:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;opacity:0}.todo-list li .toggle+label{background-image:url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23ededed%22%20stroke-width%3D%223%22/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:0}.todo-list li .toggle:checked+label{background-image:url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23bddad5%22%20stroke-width%3D%223%22/%3E%3Cpath%20fill%3D%22%235dc2af%22%20d%3D%22M72%2025L42%2071%2027%2056l-4%204%2020%2020%2034-52z%22/%3E%3C/svg%3E")}.todo-list li label{word-break:break-all;padding:15px 15px 15px 60px;display:block;line-height:1.2;-webkit-transition:color .4s;-o-transition:color .4s;transition:color .4s}.todo-list li.completed label{color:#d9d9d9;text-decoration:line-through}.todo-list li .destroy{display:none;position:absolute;top:0;right:10px;bottom:0;width:40px;height:40px;margin:auto 0;font-size:30px;color:#cc9a9a;margin-bottom:11px;-webkit-transition:color .2s ease-out;-o-transition:color .2s ease-out;transition:color .2s ease-out}.todo-list li .destroy:hover{color:#af5b5e}.todo-list li .destroy:after{content:"\D7"}.todo-list li:hover .destroy{display:block}.todo-list li .edit{display:none}.todo-list li.editing:last-child{margin-bottom:-1px}.footer{color:#777;padding:10px 15px;height:20px;text-align:center;border-top:1px solid #e6e6e6}.footer:before{content:"";position:absolute;right:0;bottom:0;left:0;height:50px;overflow:hidden;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.2),0 8px 0 -3px #f6f6f6,0 9px 1px -3px rgba(0,0,0,.2),0 16px 0 -6px #f6f6f6,0 17px 2px -6px rgba(0,0,0,.2);box-shadow:0 1px 1px rgba(0,0,0,.2),0 8px 0 -3px #f6f6f6,0 9px 1px -3px rgba(0,0,0,.2),0 16px 0 -6px #f6f6f6,0 17px 2px -6px rgba(0,0,0,.2)}.todo-count{float:left;text-align:left}.todo-count strong{font-weight:300}.filters{margin:0;padding:0;list-style:none;position:absolute;right:0;left:0}.filters li{display:inline}.filters li a{color:inherit;margin:3px;padding:3px 7px;text-decoration:none;border:1px solid transparent;border-radius:3px}.filters li a:hover{border-color:rgba(175,47,47,.1)}.filters li a.selected{border-color:rgba(175,47,47,.2)}.clear-completed,html .clear-completed:active{float:right;position:relative;line-height:20px;text-decoration:none;cursor:pointer}.clear-completed:hover{text-decoration:underline}.info{margin:65px auto 0;color:#bfbfbf;font-size:10px;text-shadow:0 1px 0 hsla(0,0%,100%,.5);text-align:center}.info p{line-height:1}.info a{color:inherit;text-decoration:none;font-weight:400}.info a:hover{text-decoration:underline}@media screen and (-webkit-min-device-pixel-ratio:0){.todo-list li .toggle,.toggle-all{background:none}.todo-list li .toggle{height:40px}}@media (max-width:430px){.footer{height:50px}.filters{bottom:10px}}
+/*# sourceMappingURL=main.21111742.css.map*/
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/react-redux/dist/static/css/main.21111742.css.map
@@ -0,0 +1,1 @@
+{"version":3,"sources":["../node_modules/todomvc-app-css/index.css"],"names":[],"mappings":"AAMA,iBAJC,SACA,SAAW,CAkBX,OAZA,SACA,gBACA,eACA,wBACA,oBACA,oBACA,cACA,wBACA,qBACK,gBACL,kCAAoC,CAIrC,YAHC,iCAAmC,CAcnC,KAVA,oDACA,kBACA,mBACA,cACA,gBACA,gBACA,cACA,mCAEA,eAAiB,CAGlB,OACC,SAAW,CAGZ,QACC,YAAc,CAGf,SACC,gBACA,oBACA,kBACA,2EAEQ,kEACqC,CAG9C,0CACC,kBACA,gBACA,aAAe,CAGhB,iCACC,kBACA,gBACA,aAAe,CAGhB,kCACC,kBACA,gBACA,aAAe,CAGhB,YACC,kBACA,WACA,WACA,gBACA,gBACA,kBACA,0BACA,0CACA,uCACA,iCAAmC,CAGpC,gBAEC,kBACA,SACA,WACA,eACA,oBACA,oBACA,kBACA,SACA,cACA,YACA,sBACA,qDACQ,6CACR,8BACQ,sBACR,mCACA,iCAAmC,CAGpC,UACC,4BACA,YACA,4BACA,oDACQ,2CAA8C,CAGvD,MACC,kBACA,UACA,4BAA8B,CAG/B,YACC,kBACA,YACA,UACA,iBAAmB,CAGpB,kBACC,WACA,YACA,YACA,kBACA,UACA,WACA,gCACA,4BACI,uBAAyB,CAG9B,yBACC,gBACA,eACA,cACA,iBAA6B,CAG9B,iCACC,aAAe,CAGhB,WACC,SACA,UACA,eAAiB,CAGlB,cACC,kBACA,eACA,+BAAiC,CAGlC,yBACC,kBAAoB,CAGrB,sBACC,mBACA,SAAW,CAGZ,4BACC,cACA,YACA,kBACA,iBAAmB,CAGpB,4BACC,YAAc,CAGf,sBACC,kBACA,WAEA,YACA,kBACA,MACA,SACA,cACA,YACA,wBACA,qBACK,gBAIL,SAAW,CAGZ,4BAKC,oUACA,4BACA,qBAAiC,CAGlC,oCACC,waAA0a,CAG3a,oBACC,qBACA,4BACA,cACA,gBACA,6BACA,wBACA,oBAAuB,CAGxB,8BACC,cACA,4BAA8B,CAG/B,uBACC,aACA,kBACA,MACA,WACA,SACA,WACA,YACA,cACA,eACA,cACA,mBACA,sCACA,iCACA,6BAAgC,CAGjC,6BACC,aAAe,CAGhB,6BACC,aAAa,CAGd,6BACC,aAAe,CAGhB,oBACC,YAAc,CAGf,iCACC,kBAAoB,CAGrB,QACC,WACA,kBACA,YACA,kBACA,4BAA8B,CAG/B,eACC,WACA,kBACA,QACA,SACA,OACA,YACA,gBACA,oJAKQ,2IAIuC,CAGhD,YACC,WACA,eAAiB,CAGlB,mBACC,eAAiB,CAGlB,SACC,SACA,UACA,gBACA,kBACA,QACA,MAAQ,CAGT,YACC,cAAgB,CAGjB,cACC,cACA,WACA,gBACA,qBACA,6BACA,iBAAmB,CAGpB,oBACC,+BAAqC,CAGtC,uBACC,+BAAqC,CAGtC,8CAEC,YACA,kBACA,iBACA,qBACA,cAAgB,CAGjB,uBACC,yBAA2B,CAG5B,MACC,mBACA,cACA,eACA,uCACA,iBAAmB,CAGpB,QACC,aAAe,CAGhB,QACC,cACA,qBACA,eAAiB,CAGlB,cACC,yBAA2B,CAO5B,qDACC,kCAEC,eAAiB,CAGlB,sBACC,WAAa,CACb,CAGF,yBACC,QACC,WAAa,CAGd,SACC,WAAa,CACb","file":"static/css/main.21111742.css","sourcesContent":["html,\nbody {\n\tmargin: 0;\n\tpadding: 0;\n}\n\nbutton {\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\tbackground: none;\n\tfont-size: 100%;\n\tvertical-align: baseline;\n\tfont-family: inherit;\n\tfont-weight: inherit;\n\tcolor: inherit;\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\t     appearance: none;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\nbody {\n\tfont: 14px 'Helvetica Neue', Helvetica, Arial, sans-serif;\n\tline-height: 1.4em;\n\tbackground: #f5f5f5;\n\tcolor: #4d4d4d;\n\tmin-width: 230px;\n\tmax-width: 550px;\n\tmargin: 0 auto;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n\tfont-weight: 300;\n}\n\n:focus {\n\toutline: 0;\n}\n\n.hidden {\n\tdisplay: none;\n}\n\n.todoapp {\n\tbackground: #fff;\n\tmargin: 130px 0 40px 0;\n\tposition: relative;\n\t-webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2),\n\t            0 25px 50px 0 rgba(0, 0, 0, 0.1);\n\t        box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2),\n\t            0 25px 50px 0 rgba(0, 0, 0, 0.1);\n}\n\n.todoapp input::-webkit-input-placeholder {\n\tfont-style: italic;\n\tfont-weight: 300;\n\tcolor: #e6e6e6;\n}\n\n.todoapp input::-moz-placeholder {\n\tfont-style: italic;\n\tfont-weight: 300;\n\tcolor: #e6e6e6;\n}\n\n.todoapp input::input-placeholder {\n\tfont-style: italic;\n\tfont-weight: 300;\n\tcolor: #e6e6e6;\n}\n\n.todoapp h1 {\n\tposition: absolute;\n\ttop: -155px;\n\twidth: 100%;\n\tfont-size: 100px;\n\tfont-weight: 100;\n\ttext-align: center;\n\tcolor: rgba(175, 47, 47, 0.15);\n\t-webkit-text-rendering: optimizeLegibility;\n\t-moz-text-rendering: optimizeLegibility;\n\ttext-rendering: optimizeLegibility;\n}\n\n.new-todo,\n.edit {\n\tposition: relative;\n\tmargin: 0;\n\twidth: 100%;\n\tfont-size: 24px;\n\tfont-family: inherit;\n\tfont-weight: inherit;\n\tline-height: 1.4em;\n\tborder: 0;\n\tcolor: inherit;\n\tpadding: 6px;\n\tborder: 1px solid #999;\n\t-webkit-box-shadow: inset 0 -1px 5px 0 rgba(0, 0, 0, 0.2);\n\t        box-shadow: inset 0 -1px 5px 0 rgba(0, 0, 0, 0.2);\n\t-webkit-box-sizing: border-box;\n\t        box-sizing: border-box;\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\n.new-todo {\n\tpadding: 16px 16px 16px 60px;\n\tborder: none;\n\tbackground: rgba(0, 0, 0, 0.003);\n\t-webkit-box-shadow: inset 0 -2px 1px rgba(0,0,0,0.03);\n\t        box-shadow: inset 0 -2px 1px rgba(0,0,0,0.03);\n}\n\n.main {\n\tposition: relative;\n\tz-index: 2;\n\tborder-top: 1px solid #e6e6e6;\n}\n\n.toggle-all {\n\ttext-align: center;\n\tborder: none; /* Mobile Safari */\n\topacity: 0;\n\tposition: absolute;\n}\n\n.toggle-all + label {\n\twidth: 60px;\n\theight: 34px;\n\tfont-size: 0;\n\tposition: absolute;\n\ttop: -52px;\n\tleft: -13px;\n\t-webkit-transform: rotate(90deg);\n\t-ms-transform: rotate(90deg);\n\t    transform: rotate(90deg);\n}\n\n.toggle-all + label:before {\n\tcontent: '❯';\n\tfont-size: 22px;\n\tcolor: #e6e6e6;\n\tpadding: 10px 27px 10px 27px;\n}\n\n.toggle-all:checked + label:before {\n\tcolor: #737373;\n}\n\n.todo-list {\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n}\n\n.todo-list li {\n\tposition: relative;\n\tfont-size: 24px;\n\tborder-bottom: 1px solid #ededed;\n}\n\n.todo-list li:last-child {\n\tborder-bottom: none;\n}\n\n.todo-list li.editing {\n\tborder-bottom: none;\n\tpadding: 0;\n}\n\n.todo-list li.editing .edit {\n\tdisplay: block;\n\twidth: 506px;\n\tpadding: 12px 16px;\n\tmargin: 0 0 0 43px;\n}\n\n.todo-list li.editing .view {\n\tdisplay: none;\n}\n\n.todo-list li .toggle {\n\ttext-align: center;\n\twidth: 40px;\n\t/* auto, since non-WebKit browsers doesn't support input styling */\n\theight: auto;\n\tposition: absolute;\n\ttop: 0;\n\tbottom: 0;\n\tmargin: auto 0;\n\tborder: none; /* Mobile Safari */\n\t-webkit-appearance: none;\n\t-moz-appearance: none;\n\t     appearance: none;\n}\n\n.todo-list li .toggle {\n\topacity: 0;\n}\n\n.todo-list li .toggle + label {\n\t/*\n\t\tFirefox requires `#` to be escaped - https://bugzilla.mozilla.org/show_bug.cgi?id=922433\n\t\tIE and Edge requires *everything* to be escaped to render, so we do that instead of just the `#` - https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/7157459/\n\t*/\n\tbackground-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23ededed%22%20stroke-width%3D%223%22/%3E%3C/svg%3E');\n\tbackground-repeat: no-repeat;\n\tbackground-position: center left;\n}\n\n.todo-list li .toggle:checked + label {\n\tbackground-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23bddad5%22%20stroke-width%3D%223%22/%3E%3Cpath%20fill%3D%22%235dc2af%22%20d%3D%22M72%2025L42%2071%2027%2056l-4%204%2020%2020%2034-52z%22/%3E%3C/svg%3E');\n}\n\n.todo-list li label {\n\tword-break: break-all;\n\tpadding: 15px 15px 15px 60px;\n\tdisplay: block;\n\tline-height: 1.2;\n\t-webkit-transition: color 0.4s;\n\t-o-transition: color 0.4s;\n\ttransition: color 0.4s;\n}\n\n.todo-list li.completed label {\n\tcolor: #d9d9d9;\n\ttext-decoration: line-through;\n}\n\n.todo-list li .destroy {\n\tdisplay: none;\n\tposition: absolute;\n\ttop: 0;\n\tright: 10px;\n\tbottom: 0;\n\twidth: 40px;\n\theight: 40px;\n\tmargin: auto 0;\n\tfont-size: 30px;\n\tcolor: #cc9a9a;\n\tmargin-bottom: 11px;\n\t-webkit-transition: color 0.2s ease-out;\n\t-o-transition: color 0.2s ease-out;\n\ttransition: color 0.2s ease-out;\n}\n\n.todo-list li .destroy:hover {\n\tcolor: #af5b5e;\n}\n\n.todo-list li .destroy:after {\n\tcontent: '×';\n}\n\n.todo-list li:hover .destroy {\n\tdisplay: block;\n}\n\n.todo-list li .edit {\n\tdisplay: none;\n}\n\n.todo-list li.editing:last-child {\n\tmargin-bottom: -1px;\n}\n\n.footer {\n\tcolor: #777;\n\tpadding: 10px 15px;\n\theight: 20px;\n\ttext-align: center;\n\tborder-top: 1px solid #e6e6e6;\n}\n\n.footer:before {\n\tcontent: '';\n\tposition: absolute;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\theight: 50px;\n\toverflow: hidden;\n\t-webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2),\n\t            0 8px 0 -3px #f6f6f6,\n\t            0 9px 1px -3px rgba(0, 0, 0, 0.2),\n\t            0 16px 0 -6px #f6f6f6,\n\t            0 17px 2px -6px rgba(0, 0, 0, 0.2);\n\t        box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2),\n\t            0 8px 0 -3px #f6f6f6,\n\t            0 9px 1px -3px rgba(0, 0, 0, 0.2),\n\t            0 16px 0 -6px #f6f6f6,\n\t            0 17px 2px -6px rgba(0, 0, 0, 0.2);\n}\n\n.todo-count {\n\tfloat: left;\n\ttext-align: left;\n}\n\n.todo-count strong {\n\tfont-weight: 300;\n}\n\n.filters {\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n\tposition: absolute;\n\tright: 0;\n\tleft: 0;\n}\n\n.filters li {\n\tdisplay: inline;\n}\n\n.filters li a {\n\tcolor: inherit;\n\tmargin: 3px;\n\tpadding: 3px 7px;\n\ttext-decoration: none;\n\tborder: 1px solid transparent;\n\tborder-radius: 3px;\n}\n\n.filters li a:hover {\n\tborder-color: rgba(175, 47, 47, 0.1);\n}\n\n.filters li a.selected {\n\tborder-color: rgba(175, 47, 47, 0.2);\n}\n\n.clear-completed,\nhtml .clear-completed:active {\n\tfloat: right;\n\tposition: relative;\n\tline-height: 20px;\n\ttext-decoration: none;\n\tcursor: pointer;\n}\n\n.clear-completed:hover {\n\ttext-decoration: underline;\n}\n\n.info {\n\tmargin: 65px auto 0;\n\tcolor: #bfbfbf;\n\tfont-size: 10px;\n\ttext-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);\n\ttext-align: center;\n}\n\n.info p {\n\tline-height: 1;\n}\n\n.info a {\n\tcolor: inherit;\n\ttext-decoration: none;\n\tfont-weight: 400;\n}\n\n.info a:hover {\n\ttext-decoration: underline;\n}\n\n/*\n\tHack to remove background from Mobile Safari.\n\tCan't use it globally since it destroys checkboxes in Firefox\n*/\n@media screen and (-webkit-min-device-pixel-ratio:0) {\n\t.toggle-all,\n\t.todo-list li .toggle {\n\t\tbackground: none;\n\t}\n\n\t.todo-list li .toggle {\n\t\theight: 40px;\n\t}\n}\n\n@media (max-width: 430px) {\n\t.footer {\n\t\theight: 50px;\n\t}\n\n\t.filters {\n\t\tbottom: 10px;\n\t}\n}\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/todomvc-app-css/index.css"],"sourceRoot":""}
\ No newline at end of file
deleted file mode 100644
--- a/third_party/speedometer/resources/todomvc/architecture-examples/react-redux/dist/static/css/main.f04a7319.css
+++ /dev/null
@@ -1,2 +0,0 @@
-body,button,html{margin:0;padding:0}button{border:0;background:none;font-size:100%;vertical-align:baseline;font-family:inherit;font-weight:inherit;color:inherit;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-font-smoothing:antialiased}body,button{-moz-osx-font-smoothing:grayscale}body{font:14px Helvetica Neue,Helvetica,Arial,sans-serif;line-height:1.4em;background:#f5f5f5;color:#4d4d4d;min-width:230px;max-width:550px;margin:0 auto;-webkit-font-smoothing:antialiased;font-weight:300}:focus{outline:0}.hidden{display:none}.todoapp{background:#fff;margin:130px 0 40px;position:relative;box-shadow:0 2px 4px 0 rgba(0,0,0,.2),0 25px 50px 0 rgba(0,0,0,.1)}.todoapp input::-webkit-input-placeholder{font-style:italic;font-weight:300;color:#e6e6e6}.todoapp input::-moz-placeholder{font-style:italic;font-weight:300;color:#e6e6e6}.todoapp input::input-placeholder{font-style:italic;font-weight:300;color:#e6e6e6}.todoapp h1{position:absolute;top:-155px;width:100%;font-size:100px;font-weight:100;text-align:center;color:rgba(175,47,47,.15);-webkit-text-rendering:optimizeLegibility;-moz-text-rendering:optimizeLegibility;text-rendering:optimizeLegibility}.edit,.new-todo{position:relative;margin:0;width:100%;font-size:24px;font-family:inherit;font-weight:inherit;line-height:1.4em;border:0;color:inherit;padding:6px;border:1px solid #999;box-shadow:inset 0 -1px 5px 0 rgba(0,0,0,.2);box-sizing:border-box;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.new-todo{padding:16px 16px 16px 60px;border:none;background:rgba(0,0,0,.003);box-shadow:inset 0 -2px 1px rgba(0,0,0,.03)}.main{position:relative;z-index:2;border-top:1px solid #e6e6e6}.toggle-all{text-align:center;border:none;opacity:0;position:absolute}.toggle-all+label{width:60px;height:34px;font-size:0;position:absolute;top:-52px;left:-13px;-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.toggle-all+label:before{content:'\276F';font-size:22px;color:#e6e6e6;padding:10px 27px}.toggle-all:checked+label:before{color:#737373}.todo-list{margin:0;padding:0;list-style:none}.todo-list li{position:relative;font-size:24px;border-bottom:1px solid #ededed}.todo-list li:last-child{border-bottom:none}.todo-list li.editing{border-bottom:none;padding:0}.todo-list li.editing .edit{display:block;width:506px;padding:12px 16px;margin:0 0 0 43px}.todo-list li.editing .view{display:none}.todo-list li .toggle{text-align:center;width:40px;height:auto;position:absolute;top:0;bottom:0;margin:auto 0;border:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;opacity:0}.todo-list li .toggle+label{background-image:url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23ededed%22%20stroke-width%3D%223%22/%3E%3C/svg%3E');background-repeat:no-repeat;background-position:0}.todo-list li .toggle:checked+label{background-image:url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23bddad5%22%20stroke-width%3D%223%22/%3E%3Cpath%20fill%3D%22%235dc2af%22%20d%3D%22M72%2025L42%2071%2027%2056l-4%204%2020%2020%2034-52z%22/%3E%3C/svg%3E')}.todo-list li label{word-break:break-all;padding:15px 15px 15px 60px;display:block;line-height:1.2;-webkit-transition:color .4s;transition:color .4s}.todo-list li.completed label{color:#d9d9d9;text-decoration:line-through}.todo-list li .destroy{display:none;position:absolute;top:0;right:10px;bottom:0;width:40px;height:40px;margin:auto 0;font-size:30px;color:#cc9a9a;margin-bottom:11px;-webkit-transition:color .2s ease-out;transition:color .2s ease-out}.todo-list li .destroy:hover{color:#af5b5e}.todo-list li .destroy:after{content:'\D7'}.todo-list li:hover .destroy{display:block}.todo-list li .edit{display:none}.todo-list li.editing:last-child{margin-bottom:-1px}.footer{color:#777;padding:10px 15px;height:20px;text-align:center;border-top:1px solid #e6e6e6}.footer:before{content:'';position:absolute;right:0;bottom:0;left:0;height:50px;overflow:hidden;box-shadow:0 1px 1px rgba(0,0,0,.2),0 8px 0 -3px #f6f6f6,0 9px 1px -3px rgba(0,0,0,.2),0 16px 0 -6px #f6f6f6,0 17px 2px -6px rgba(0,0,0,.2)}.todo-count{float:left;text-align:left}.todo-count strong{font-weight:300}.filters{margin:0;padding:0;list-style:none;position:absolute;right:0;left:0}.filters li{display:inline}.filters li a{color:inherit;margin:3px;padding:3px 7px;text-decoration:none;border:1px solid transparent;border-radius:3px}.filters li a:hover{border-color:rgba(175,47,47,.1)}.filters li a.selected{border-color:rgba(175,47,47,.2)}.clear-completed,html .clear-completed:active{float:right;position:relative;line-height:20px;text-decoration:none;cursor:pointer}.clear-completed:hover{text-decoration:underline}.info{margin:65px auto 0;color:#bfbfbf;font-size:10px;text-shadow:0 1px 0 hsla(0,0%,100%,.5);text-align:center}.info p{line-height:1}.info a{color:inherit;text-decoration:none;font-weight:400}.info a:hover{text-decoration:underline}@media screen and (-webkit-min-device-pixel-ratio:0){.todo-list li .toggle,.toggle-all{background:none}.todo-list li .toggle{height:40px}}@media (max-width:430px){.footer{height:50px}.filters{bottom:10px}}
-/*# sourceMappingURL=main.f04a7319.css.map*/
\ No newline at end of file
deleted file mode 100644
--- a/third_party/speedometer/resources/todomvc/architecture-examples/react-redux/dist/static/css/main.f04a7319.css.map
+++ /dev/null
@@ -1,1 +0,0 @@
-{"version":3,"sources":[],"names":[],"mappings":"","file":"static/css/main.f04a7319.css","sourceRoot":""}
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/third_party/speedometer/resources/todomvc/architecture-examples/react-redux/dist/static/js/main.18b409e1.js
@@ -0,0 +1,2 @@
+!function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="./",t(t.s=97)}([function(e,t,n){"use strict";function r(e,t,n,r,i,a,u,s){if(o(t),!e){var c;if(void 0===t)c=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var l=[n,r,i,a,u,s],p=0;c=new Error(t.replace(/%s/g,function(){return l[p++]})),c.name="Invariant Violation"}throw c.framesToPop=1,c}}var o=function(e){};e.exports=r},function(e,t,n){"use strict";var r=n(6),o=r;e.exports=o},function(e,t,n){"use strict";function r(e){for(var t=arguments.length-1,n="Minified React error #"+e+"; visit http://facebook.github.io/react/docs/error-decoder.html?invariant="+e,r=0;r<t;r++)n+="&args[]="+encodeURIComponent(arguments[r+1]);n+=" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.";var o=new Error(n);throw o.name="Invariant Violation",o.framesToPop=1,o}e.exports=r},function(e,t,n){"use strict";function r(e){if(null===e||void 0===e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}var o=Object.getOwnPropertySymbols,i=Object.prototype.hasOwnProperty,a=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map(function(e){return t[e]}).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach(function(e){r[e]=e}),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(e){return!1}}()?Object.assign:function(e,t){for(var n,u,s=r(e),c=1;c<arguments.length;c++){n=Object(arguments[c]);for(var l in n)i.call(n,l)&&(s[l]=n[l]);if(o){u=o(n);for(var p=0;p<u.length;p++)a.call(n,u[p])&&(s[u[p]]=n[u[p]])}}return s}},function(e,t,n){"use strict";function r(e,t){return 1===e.nodeType&&e.getAttribute(h)===String(t)||8===e.nodeType&&e.nodeValue===" react-text: "+t+" "||8===e.nodeType&&e.nodeValue===" react-empty: "+t+" "}function o(e){for(var t;t=e._renderedComponent;)e=t;return e}function i(e,t){var n=o(e);n._hostNode=t,t[v]=n}function a(e){var t=e._hostNode;t&&(delete t[v],e._hostNode=null)}function u(e,t){if(!(e._flags&m.hasCachedChildNodes)){var n=e._renderedChildren,a=t.firstChild;e:for(var u in n)if(n.hasOwnProperty(u)){var s=n[u],c=o(s)._domID;if(0!==c){for(;null!==a;a=a.nextSibling)if(r(a,c)){i(s,a);continue e}p("32",c)}}e._flags|=m.hasCachedChildNodes}}function s(e){if(e[v])return e[v];for(var t=[];!e[v];){if(t.push(e),!e.parentNode)return null;e=e.parentNode}for(var n,r;e&&(r=e[v]);e=t.pop())n=r,t.length&&u(r,e);return n}function c(e){var t=s(e);return null!=t&&t._hostNode===e?t:null}function l(e){if(void 0===e._hostNode&&p("33"),e._hostNode)return e._hostNode;for(var t=[];!e._hostNode;)t.push(e),e._hostParent||p("34"),e=e._hostParent;for(;t.length;e=t.pop())u(e,e._hostNode);return e._hostNode}var p=n(2),f=n(15),d=n(58),h=(n(0),f.ID_ATTRIBUTE_NAME),m=d,v="__reactInternalInstance$"+Math.random().toString(36).slice(2),y={getClosestInstanceFromNode:s,getInstanceFromNode:c,getNodeFromInstance:l,precacheChildNodes:u,precacheNode:i,uncacheNode:a};e.exports=y},function(e,t,n){"use strict";var r=!("undefined"===typeof window||!window.document||!window.document.createElement),o={canUseDOM:r,canUseWorkers:"undefined"!==typeof Worker,canUseEventListeners:r&&!(!window.addEventListener&&!window.attachEvent),canUseViewport:r&&!!window.screen,isInWorker:!r};e.exports=o},function(e,t,n){"use strict";function r(e){return function(){return e}}var o=function(){};o.thatReturns=r,o.thatReturnsFalse=r(!1),o.thatReturnsTrue=r(!0),o.thatReturnsNull=r(null),o.thatReturnsThis=function(){return this},o.thatReturnsArgument=function(e){return e},e.exports=o},function(e,t,n){"use strict";var r=null;e.exports={debugTool:r}},function(e,t,n){"use strict";function r(){O.ReactReconcileTransaction&&C||l("123")}function o(){this.reinitializeTransaction(),this.dirtyComponentsLength=null,this.callbackQueue=f.getPooled(),this.reconcileTransaction=O.ReactReconcileTransaction.getPooled(!0)}function i(e,t,n,o,i,a){return r(),C.batchedUpdates(e,t,n,o,i,a)}function a(e,t){return e._mountOrder-t._mountOrder}function u(e){var t=e.dirtyComponentsLength;t!==y.length&&l("124",t,y.length),y.sort(a),g++;for(var n=0;n<t;n++){var r=y[n],o=r._pendingCallbacks;r._pendingCallbacks=null;var i;if(h.logTopLevelRenders){var u=r;r._currentElement.type.isReactTopLevelWrapper&&(u=r._renderedComponent),i="React update: "+u.getName(),console.time(i)}if(m.performUpdateIfNecessary(r,e.reconcileTransaction,g),i&&console.timeEnd(i),o)for(var s=0;s<o.length;s++)e.callbackQueue.enqueue(o[s],r.getPublicInstance())}}function s(e){if(r(),!C.isBatchingUpdates)return void C.batchedUpdates(s,e);y.push(e),null==e._updateBatchNumber&&(e._updateBatchNumber=g+1)}function c(e,t){C.isBatchingUpdates||l("125"),b.enqueue(e,t),_=!0}var l=n(2),p=n(3),f=n(62),d=n(12),h=n(63),m=n(16),v=n(24),y=(n(0),[]),g=0,b=f.getPooled(),_=!1,C=null,w={initialize:function(){this.dirtyComponentsLength=y.length},close:function(){this.dirtyComponentsLength!==y.length?(y.splice(0,this.dirtyComponentsLength),T()):y.length=0}},E={initialize:function(){this.callbackQueue.reset()},close:function(){this.callbackQueue.notifyAll()}},x=[w,E];p(o.prototype,v,{getTransactionWrappers:function(){return x},destructor:function(){this.dirtyComponentsLength=null,f.release(this.callbackQueue),this.callbackQueue=null,O.ReactReconcileTransaction.release(this.reconcileTransaction),this.reconcileTransaction=null},perform:function(e,t,n){return v.perform.call(this,this.reconcileTransaction.perform,this.reconcileTransaction,e,t,n)}}),d.addPoolingTo(o);var T=function(){for(;y.length||_;){if(y.length){var e=o.getPooled();e.perform(u,null,e),o.release(e)}if(_){_=!1;var t=b;b=f.getPooled(),t.notifyAll(),f.release(t)}}},P={injectReconcileTransaction:function(e){e||l("126"),O.ReactReconcileTransaction=e},injectBatchingStrategy:function(e){e||l("127"),"function"!==typeof e.batchedUpdates&&l("128"),"boolean"!==typeof e.isBatchingUpdates&&l("129"),C=e}},O={ReactReconcileTransaction:null,batchedUpdates:i,enqueueUpdate:s,flushBatchedUpdates:T,injection:P,asap:c};e.exports=O},function(e,t,n){"use strict";e.exports=n(13)},function(e,t,n){"use strict";var r={current:null};e.exports=r},function(e,t,n){"use strict";function r(e,t,n,r){this.dispatchConfig=e,this._targetInst=t,this.nativeEvent=n;var o=this.constructor.Interface;for(var i in o)if(o.hasOwnProperty(i)){var u=o[i];u?this[i]=u(n):"target"===i?this.target=r:this[i]=n[i]}var s=null!=n.defaultPrevented?n.defaultPrevented:!1===n.returnValue;return this.isDefaultPrevented=s?a.thatReturnsTrue:a.thatReturnsFalse,this.isPropagationStopped=a.thatReturnsFalse,this}var o=n(3),i=n(12),a=n(6),u=(n(1),["dispatchConfig","_targetInst","nativeEvent","isDefaultPrevented","isPropagationStopped","_dispatchListeners","_dispatchInstances"]),s={type:null,target:null,currentTarget:a.thatReturnsNull,eventPhase:null,bubbles:null,cancelable:null,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:null,isTrusted:null};o(r.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():"unknown"!==typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=a.thatReturnsTrue)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():"unknown"!==typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=a.thatReturnsTrue)},persist:function(){this.isPersistent=a.thatReturnsTrue},isPersistent:a.thatReturnsFalse,destructor:function(){var e=this.constructor.Interface;for(var t in e)this[t]=null;for(var n=0;n<u.length;n++)this[u[n]]=null}}),r.Interface=s,r.augmentClass=function(e,t){var n=this,r=function(){};r.prototype=n.prototype;var a=new r;o(a,e.prototype),e.prototype=a,e.prototype.constructor=e,e.Interface=o({},n.Interface,t),e.augmentClass=n.augmentClass,i.addPoolingTo(e,i.fourArgumentPooler)},i.addPoolingTo(r,i.fourArgumentPooler),e.exports=r},function(e,t,n){"use strict";var r=n(2),o=(n(0),function(e){var t=this;if(t.instancePool.length){var n=t.instancePool.pop();return t.call(n,e),n}return new t(e)}),i=function(e,t){var n=this;if(n.instancePool.length){var r=n.instancePool.pop();return n.call(r,e,t),r}return new n(e,t)},a=function(e,t,n){var r=this;if(r.instancePool.length){var o=r.instancePool.pop();return r.call(o,e,t,n),o}return new r(e,t,n)},u=function(e,t,n,r){var o=this;if(o.instancePool.length){var i=o.instancePool.pop();return o.call(i,e,t,n,r),i}return new o(e,t,n,r)},s=function(e){var t=this;e instanceof t||r("25"),e.destructor(),t.instancePool.length<t.poolSize&&t.instancePool.push(e)},c=o,l=function(e,t){var n=e;return n.instancePool=[],n.getPooled=t||c,n.poolSize||(n.poolSize=10),n.release=s,n},p={addPoolingTo:l,oneArgumentPooler:o,twoArgumentPooler:i,threeArgumentPooler:a,fourArgumentPooler:u};e.exports=p},function(e,t,n){"use strict";var r=n(3),o=n(52),i=n(105),a=n(110),u=n(14),s=n(111),c=n(114),l=n(115),p=n(117),f=u.createElement,d=u.createFactory,h=u.cloneElement,m=r,v=function(e){return e},y={Children:{map:i.map,forEach:i.forEach,count:i.count,toArray:i.toArray,only:p},Component:o.Component,PureComponent:o.PureComponent,createElement:f,cloneElement:h,isValidElement:u.isValidElement,PropTypes:s,createClass:l,createFactory:d,createMixin:v,DOM:a,version:c,__spread:m};e.exports=y},function(e,t,n){"use strict";function r(e){return void 0!==e.ref}function o(e){return void 0!==e.key}var i=n(3),a=n(10),u=(n(1),n(54),Object.prototype.hasOwnProperty),s=n(55),c={key:!0,ref:!0,__self:!0,__source:!0},l=function(e,t,n,r,o,i,a){var u={$$typeof:s,type:e,key:t,ref:n,props:a,_owner:i};return u};l.createElement=function(e,t,n){var i,s={},p=null,f=null;if(null!=t){r(t)&&(f=t.ref),o(t)&&(p=""+t.key),void 0===t.__self?null:t.__self,void 0===t.__source?null:t.__source;for(i in t)u.call(t,i)&&!c.hasOwnProperty(i)&&(s[i]=t[i])}var d=arguments.length-2;if(1===d)s.children=n;else if(d>1){for(var h=Array(d),m=0;m<d;m++)h[m]=arguments[m+2];s.children=h}if(e&&e.defaultProps){var v=e.defaultProps;for(i in v)void 0===s[i]&&(s[i]=v[i])}return l(e,p,f,0,0,a.current,s)},l.createFactory=function(e){var t=l.createElement.bind(null,e);return t.type=e,t},l.cloneAndReplaceKey=function(e,t){return l(e.type,t,e.ref,e._self,e._source,e._owner,e.props)},l.cloneElement=function(e,t,n){var s,p=i({},e.props),f=e.key,d=e.ref,h=(e._self,e._source,e._owner);if(null!=t){r(t)&&(d=t.ref,h=a.current),o(t)&&(f=""+t.key);var m;e.type&&e.type.defaultProps&&(m=e.type.defaultProps);for(s in t)u.call(t,s)&&!c.hasOwnProperty(s)&&(void 0===t[s]&&void 0!==m?p[s]=m[s]:p[s]=t[s])}var v=arguments.length-2;if(1===v)p.children=n;else if(v>1){for(var y=Array(v),g=0;g<v;g++)y[g]=arguments[g+2];p.children=y}return l(e.type,f,d,0,0,h,p)},l.isValidElement=function(e){return"object"===typeof e&&null!==e&&e.$$typeof===s},e.exports=l},function(e,t,n){"use strict";function r(e,t){return(e&t)===t}var o=n(2),i=(n(0),{MUST_USE_PROPERTY:1,HAS_BOOLEAN_VALUE:4,HAS_NUMERIC_VALUE:8,HAS_POSITIVE_NUMERIC_VALUE:24,HAS_OVERLOADED_BOOLEAN_VALUE:32,injectDOMPropertyConfig:function(e){var t=i,n=e.Properties||{},a=e.DOMAttributeNamespaces||{},s=e.DOMAttributeNames||{},c=e.DOMPropertyNames||{},l=e.DOMMutationMethods||{};e.isCustomAttribute&&u._isCustomAttributeFunctions.push(e.isCustomAttribute);for(var p in n){u.properties.hasOwnProperty(p)&&o("48",p);var f=p.toLowerCase(),d=n[p],h={attributeName:f,attributeNamespace:null,propertyName:p,mutationMethod:null,mustUseProperty:r(d,t.MUST_USE_PROPERTY),hasBooleanValue:r(d,t.HAS_BOOLEAN_VALUE),hasNumericValue:r(d,t.HAS_NUMERIC_VALUE),hasPositiveNumericValue:r(d,t.HAS_POSITIVE_NUMERIC_VALUE),hasOverloadedBooleanValue:r(d,t.HAS_OVERLOADED_BOOLEAN_VALUE)};if(h.hasBooleanValue+h.hasNumericValue+h.hasOverloadedBooleanValue<=1||o("50",p),s.hasOwnProperty(p)){var m=s[p];h.attributeName=m}a.hasOwnProperty(p)&&(h.attributeNamespace=a[p]),c.hasOwnProperty(p)&&(h.propertyName=c[p]),l.hasOwnProperty(p)&&(h.mutationMethod=l[p]),u.properties[p]=h}}}),a=":A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD",u={ID_ATTRIBUTE_NAME:"data-reactid",ROOT_ATTRIBUTE_NAME:"data-reactroot",ATTRIBUTE_NAME_START_CHAR:a,ATTRIBUTE_NAME_CHAR:a+"\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040",properties:{},getPossibleStandardName:null,_isCustomAttributeFunctions:[],isCustomAttribute:function(e){for(var t=0;t<u._isCustomAttributeFunctions.length;t++){if((0,u._isCustomAttributeFunctions[t])(e))return!0}return!1},injection:i};e.exports=u},function(e,t,n){"use strict";function r(){o.attachRefs(this,this._currentElement)}var o=n(127),i=(n(7),n(1),{mountComponent:function(e,t,n,o,i,a){var u=e.mountComponent(t,n,o,i,a);return e._currentElement&&null!=e._currentElement.ref&&t.getReactMountReady().enqueue(r,e),u},getHostNode:function(e){return e.getHostNode()},unmountComponent:function(e,t){o.detachRefs(e,e._currentElement),e.unmountComponent(t)},receiveComponent:function(e,t,n,i){var a=e._currentElement;if(t!==a||i!==e._context){var u=o.shouldUpdateRefs(a,t);u&&o.detachRefs(e,a),e.receiveComponent(t,n,i),u&&e._currentElement&&null!=e._currentElement.ref&&n.getReactMountReady().enqueue(r,e)}},performUpdateIfNecessary:function(e,t,n){e._updateBatchNumber===n&&e.performUpdateIfNecessary(t)}});e.exports=i},function(e,t,n){"use strict";function r(e){if(h){var t=e.node,n=e.children;if(n.length)for(var r=0;r<n.length;r++)m(t,n[r],null);else null!=e.html?p(t,e.html):null!=e.text&&d(t,e.text)}}function o(e,t){e.parentNode.replaceChild(t.node,e),r(t)}function i(e,t){h?e.children.push(t):e.node.appendChild(t.node)}function a(e,t){h?e.html=t:p(e.node,t)}function u(e,t){h?e.text=t:d(e.node,t)}function s(){return this.node.nodeName}function c(e){return{node:e,children:[],html:null,text:null,toString:s}}var l=n(38),p=n(26),f=n(39),d=n(67),h="undefined"!==typeof document&&"number"===typeof document.documentMode||"undefined"!==typeof navigator&&"string"===typeof navigator.userAgent&&/\bEdge\/\d/.test(navigator.userAgent),m=f(function(e,t,n){11===t.node.nodeType||1===t.node.nodeType&&"object"===t.node.nodeName.toLowerCase()&&(null==t.node.namespaceURI||t.node.namespaceURI===l.html)?(r(t),e.insertBefore(t.node,n)):(e.insertBefore(t.node,n),r(t))});c.insertTreeBefore=m,c.replaceChildWithTree=o,c.queueChild=i,c.queueHTML=a,c.queueText=u,e.exports=c},function(e,t,n){"use strict";function r(e){for(var t=arguments.length-1,n="Minified React error #"+e+"; visit http://facebook.github.io/react/docs/error-decoder.html?invariant="+e,r=0;r<t;r++)n+="&args[]="+encodeURIComponent(arguments[r+1]);n+=" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.";var o=new Error(n);throw o.name="Invariant Violation",o.framesToPop=1,o}e.exports=r},function(e,t,n){"use strict";function r(e,t,n){var r=t.dispatchConfig.phasedRegistrationNames[n];return y(e,r)}function o(e,t,n){var o=r(e,n,t);o&&(n._dispatchListeners=m(n._dispatchListeners,o),n._dispatchInstances=m(n._dispatchInstances,e))}function i(e){e&&e.dispatchConfig.phasedRegistrationNames&&h.traverseTwoPhase(e._targetInst,o,e)}function a(e){if(e&&e.dispatchConfig.phasedRegistrationNames){var t=e._targetInst,n=t?h.getParentInstance(t):null;h.traverseTwoPhase(n,o,e)}}function u(e,t,n){if(n&&n.dispatchConfig.registrationName){var r=n.dispatchConfig.registrationName,o=y(e,r);o&&(n._dispatchListeners=m(n._dispatchListeners,o),n._dispatchInstances=m(n._dispatchInstances,e))}}function s(e){e&&e.dispatchConfig.registrationName&&u(e._targetInst,null,e)}function c(e){v(e,i)}function l(e){v(e,a)}function p(e,t,n,r){h.traverseEnterLeave(n,r,u,e,t)}function f(e){v(e,s)}var d=n(20),h=n(32),m=n(59),v=n(60),y=(n(1),d.getListener),g={accumulateTwoPhaseDispatches:c,accumulateTwoPhaseDispatchesSkipTarget:l,accumulateDirectDispatches:f,accumulateEnterLeaveDispatches:p};e.exports=g},function(e,t,n){"use strict";function r(e){return"button"===e||"input"===e||"select"===e||"textarea"===e}function o(e,t,n){switch(e){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":return!(!n.disabled||!r(t));default:return!1}}var i=n(2),a=n(31),u=n(32),s=n(33),c=n(59),l=n(60),p=(n(0),{}),f=null,d=function(e,t){e&&(u.executeDispatchesInOrder(e,t),e.isPersistent()||e.constructor.release(e))},h=function(e){return d(e,!0)},m=function(e){return d(e,!1)},v=function(e){return"."+e._rootNodeID},y={injection:{injectEventPluginOrder:a.injectEventPluginOrder,injectEventPluginsByName:a.injectEventPluginsByName},putListener:function(e,t,n){"function"!==typeof n&&i("94",t,typeof n);var r=v(e);(p[t]||(p[t]={}))[r]=n;var o=a.registrationNameModules[t];o&&o.didPutListener&&o.didPutListener(e,t,n)},getListener:function(e,t){var n=p[t];if(o(t,e._currentElement.type,e._currentElement.props))return null;var r=v(e);return n&&n[r]},deleteListener:function(e,t){var n=a.registrationNameModules[t];n&&n.willDeleteListener&&n.willDeleteListener(e,t);var r=p[t];if(r){delete r[v(e)]}},deleteAllListeners:function(e){var t=v(e);for(var n in p)if(p.hasOwnProperty(n)&&p[n][t]){var r=a.registrationNameModules[n];r&&r.willDeleteListener&&r.willDeleteListener(e,n),delete p[n][t]}},extractEvents:function(e,t,n,r){for(var o,i=a.plugins,u=0;u<i.length;u++){var s=i[u];if(s){var l=s.extractEvents(e,t,n,r);l&&(o=c(o,l))}}return o},enqueueEvents:function(e){e&&(f=c(f,e))},processEventQueue:function(e){var t=f;f=null,e?l(t,h):l(t,m),f&&i("95"),s.rethrowCaughtError()},__purge:function(){p={}},__getListenerBank:function(){return p}};e.exports=y},function(e,t,n){"use strict";function r(e,t,n,r){return o.call(this,e,t,n,r)}var o=n(11),i=n(34),a={view:function(e){if(e.view)return e.view;var t=i(e);if(t.window===t)return t;var n=t.ownerDocument;return n?n.defaultView||n.parentWindow:window},detail:function(e){return e.detail||0}};o.augmentClass(r,a),e.exports=r},function(e,t,n){"use strict";var r={remove:function(e){e._reactInternalInstance=void 0},get:function(e){return e._reactInternalInstance},has:function(e){return void 0!==e._reactInternalInstance},set:function(e,t){e._reactInternalInstance=t}};e.exports=r},function(e,t,n){"use strict";var r={};e.exports=r},function(e,t,n){"use strict";var r=n(2),o=(n(0),{}),i={reinitializeTransaction:function(){this.transactionWrappers=this.getTransactionWrappers(),this.wrapperInitData?this.wrapperInitData.length=0:this.wrapperInitData=[],this._isInTransaction=!1},_isInTransaction:!1,getTransactionWrappers:null,isInTransaction:function(){return!!this._isInTransaction},perform:function(e,t,n,o,i,a,u,s){this.isInTransaction()&&r("27");var c,l;try{this._isInTransaction=!0,c=!0,this.initializeAll(0),l=e.call(t,n,o,i,a,u,s),c=!1}finally{try{if(c)try{this.closeAll(0)}catch(e){}else this.closeAll(0)}finally{this._isInTransaction=!1}}return l},initializeAll:function(e){for(var t=this.transactionWrappers,n=e;n<t.length;n++){var r=t[n];try{this.wrapperInitData[n]=o,this.wrapperInitData[n]=r.initialize?r.initialize.call(this):null}finally{if(this.wrapperInitData[n]===o)try{this.initializeAll(n+1)}catch(e){}}}},closeAll:function(e){this.isInTransaction()||r("28");for(var t=this.transactionWrappers,n=e;n<t.length;n++){var i,a=t[n],u=this.wrapperInitData[n];try{i=!0,u!==o&&a.close&&a.close.call(this,u),i=!1}finally{if(i)try{this.closeAll(n+1)}catch(e){}}}this.wrapperInitData.length=0}};e.exports=i},function(e,t,n){"use strict";function r(e,t,n,r){return o.call(this,e,t,n,r)}var o=n(21),i=n(66),a=n(36),u={screenX:null,screenY:null,clientX:null,clientY:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,getModifierState:a,button:function(e){var t=e.button;return"which"in e?t:2===t?2:4===t?1:0},buttons:null,relatedTarget:function(e){return e.relatedTarget||(e.fromElement===e.srcElement?e.toElement:e.fromElement)},pageX:function(e){return"pageX"in e?e.pageX:e.clientX+i.currentScrollLeft},pageY:function(e){return"pageY"in e?e.pageY:e.clientY+i.currentScrollTop}};o.augmentClass(r,u),e.exports=r},function(e,t,n){"use strict";var r,o=n(5),i=n(38),a=/^[ \r\n\t\f]/,u=/<(!--|link|noscript|meta|script|style)[ \r\n\t\f\/>]/,s=n(39),c=s(function(e,t){if(e.namespaceURI!==i.svg||"innerHTML"in e)e.innerHTML=t;else{r=r||document.createElement("div"),r.innerHTML="<svg>"+t+"</svg>";for(var n=r.firstChild;n.firstChild;)e.appendChild(n.firstChild)}});if(o.canUseDOM){var l=document.createElement("div");l.innerHTML=" ",""===l.innerHTML&&(c=function(e,t){if(e.parentNode&&e.parentNode.replaceChild(e,e),a.test(t)||"<"===t[0]&&u.test(t)){e.innerHTML=String.fromCharCode(65279)+t;var n=e.firstChild;1===n.data.length?e.removeChild(n):n.deleteData(0,1)}else e.innerHTML=t}),l=null}e.exports=c},function(e,t,n){"use strict";function r(e){var t=""+e,n=i.exec(t);if(!n)return t;var r,o="",a=0,u=0;for(a=n.index;a<t.length;a++){switch(t.charCodeAt(a)){case 34:r="&quot;";break;case 38:r="&amp;";break;case 39:r="&#x27;";break;case 60:r="&lt;";break;case 62:r="&gt;";break;default:continue}u!==a&&(o+=t.substring(u,a)),u=a+1,o+=r}return u!==a?o+t.substring(u,a):o}function o(e){return"boolean"===typeof e||"number"===typeof e?""+e:r(e)}var i=/["'&<>]/;e.exports=o},function(e,t,n){"use strict";function r(e){return Object.prototype.hasOwnProperty.call(e,m)||(e[m]=d++,p[e[m]]={}),p[e[m]]}var o,i=n(3),a=n(31),u=n(148),s=n(66),c=n(149),l=n(35),p={},f=!1,d=0,h={topAbort:"abort",topAnimationEnd:c("animationend")||"animationend",topAnimationIteration:c("animationiteration")||"animationiteration",topAnimationStart:c("animationstart")||"animationstart",topBlur:"blur",topCanPlay:"canplay",topCanPlayThrough:"canplaythrough",topChange:"change",topClick:"click",topCompositionEnd:"compositionend",topCompositionStart:"compositionstart",topCompositionUpdate:"compositionupdate",topContextMenu:"contextmenu",topCopy:"copy",topCut:"cut",topDoubleClick:"dblclick",topDrag:"drag",topDragEnd:"dragend",topDragEnter:"dragenter",topDragExit:"dragexit",topDragLeave:"dragleave",topDragOver:"dragover",topDragStart:"dragstart",topDrop:"drop",topDurationChange:"durationchange",topEmptied:"emptied",topEncrypted:"encrypted",topEnded:"ended",topError:"error",topFocus:"focus",topInput:"input",topKeyDown:"keydown",topKeyPress:"keypress",topKeyUp:"keyup",topLoadedData:"loadeddata",topLoadedMetadata:"loadedmetadata",topLoadStart:"loadstart",topMouseDown:"mousedown",topMouseMove:"mousemove",topMouseOut:"mouseout",topMouseOver:"mouseover",topMouseUp:"mouseup",topPaste:"paste",topPause:"pause",topPlay:"play",topPlaying:"playing",topProgress:"progress",topRateChange:"ratechange",topScroll:"scroll",topSeeked:"seeked",topSeeking:"seeking",topSelectionChange:"selectionchange",topStalled:"stalled",topSuspend:"suspend",topTextInput:"textInput",topTimeUpdate:"timeupdate",topTouchCancel:"touchcancel",topTouchEnd:"touchend",topTouchMove:"touchmove",topTouchStart:"touchstart",topTransitionEnd:c("transitionend")||"transitionend",topVolumeChange:"volumechange",topWaiting:"waiting",topWheel:"wheel"},m="_reactListenersID"+String(Math.random()).slice(2),v=i({},u,{ReactEventListener:null,injection:{injectReactEventListener:function(e){e.setHandleTopLevel(v.handleTopLevel),v.ReactEventListener=e}},setEnabled:function(e){v.ReactEventListener&&v.ReactEventListener.setEnabled(e)},isEnabled:function(){return!(!v.ReactEventListener||!v.ReactEventListener.isEnabled())},listenTo:function(e,t){for(var n=t,o=r(n),i=a.registrationNameDependencies[e],u=0;u<i.length;u++){var s=i[u];o.hasOwnProperty(s)&&o[s]||("topWheel"===s?l("wheel")?v.ReactEventListener.trapBubbledEvent("topWheel","wheel",n):l("mousewheel")?v.ReactEventListener.trapBubbledEvent("topWheel","mousewheel",n):v.ReactEventListener.trapBubbledEvent("topWheel","DOMMouseScroll",n):"topScroll"===s?l("scroll",!0)?v.ReactEventListener.trapCapturedEvent("topScroll","scroll",n):v.ReactEventListener.trapBubbledEvent("topScroll","scroll",v.ReactEventListener.WINDOW_HANDLE):"topFocus"===s||"topBlur"===s?(l("focus",!0)?(v.ReactEventListener.trapCapturedEvent("topFocus","focus",n),v.ReactEventListener.trapCapturedEvent("topBlur","blur",n)):l("focusin")&&(v.ReactEventListener.trapBubbledEvent("topFocus","focusin",n),v.ReactEventListener.trapBubbledEvent("topBlur","focusout",n)),o.topBlur=!0,o.topFocus=!0):h.hasOwnProperty(s)&&v.ReactEventListener.trapBubbledEvent(s,h[s],n),o[s]=!0)}},trapBubbledEvent:function(e,t,n){return v.ReactEventListener.trapBubbledEvent(e,t,n)},trapCapturedEvent:function(e,t,n){return v.ReactEventListener.trapCapturedEvent(e,t,n)},supportsEventPageXY:function(){if(!document.createEvent)return!1;var e=document.createEvent("MouseEvent");return null!=e&&"pageX"in e},ensureScrollValueMonitoring:function(){if(void 0===o&&(o=v.supportsEventPageXY()),!o&&!f){var e=s.refreshScrollValues;v.ReactEventListener.monitorScrollValue(e),f=!0}}});e.exports=v},function(e,t,n){"use strict";var r=n(84),o=n(207),i=n(208);n(209),n(87),n(86);n.d(t,"c",function(){return r.b}),n.d(t,"b",function(){return o.a}),n.d(t,"a",function(){return i.a})},function(e,t){var n;n=function(){return this}();try{n=n||Function("return this")()||(0,eval)("this")}catch(e){"object"===typeof window&&(n=window)}e.exports=n},function(e,t,n){"use strict";function r(){if(u)for(var e in s){var t=s[e],n=u.indexOf(e);if(n>-1||a("96",e),!c.plugins[n]){t.extractEvents||a("97",e),c.plugins[n]=t;var r=t.eventTypes;for(var i in r)o(r[i],t,i)||a("98",i,e)}}}function o(e,t,n){c.eventNameDispatchConfigs.hasOwnProperty(n)&&a("99",n),c.eventNameDispatchConfigs[n]=e;var r=e.phasedRegistrationNames;if(r){for(var o in r)if(r.hasOwnProperty(o)){var u=r[o];i(u,t,n)}return!0}return!!e.registrationName&&(i(e.registrationName,t,n),!0)}function i(e,t,n){c.registrationNameModules[e]&&a("100",e),c.registrationNameModules[e]=t,c.registrationNameDependencies[e]=t.eventTypes[n].dependencies}var a=n(2),u=(n(0),null),s={},c={plugins:[],eventNameDispatchConfigs:{},registrationNameModules:{},registrationNameDependencies:{},possibleRegistrationNames:null,injectEventPluginOrder:function(e){u&&a("101"),u=Array.prototype.slice.call(e),r()},injectEventPluginsByName:function(e){var t=!1;for(var n in e)if(e.hasOwnProperty(n)){var o=e[n];s.hasOwnProperty(n)&&s[n]===o||(s[n]&&a("102",n),s[n]=o,t=!0)}t&&r()},getPluginModuleForEvent:function(e){var t=e.dispatchConfig;if(t.registrationName)return c.registrationNameModules[t.registrationName]||null;if(void 0!==t.phasedRegistrationNames){var n=t.phasedRegistrationNames;for(var r in n)if(n.hasOwnProperty(r)){var o=c.registrationNameModules[n[r]];if(o)return o}}return null},_resetEventPlugins:function(){u=null;for(var e in s)s.hasOwnProperty(e)&&delete s[e];c.plugins.length=0;var t=c.eventNameDispatchConfigs;for(var n in t)t.hasOwnProperty(n)&&delete t[n];var r=c.registrationNameModules;for(var o in r)r.hasOwnProperty(o)&&delete r[o]}};e.exports=c},function(e,t,n){"use strict";function r(e){return"topMouseUp"===e||"topTouchEnd"===e||"topTouchCancel"===e}function o(e){return"topMouseMove"===e||"topTouchMove"===e}function i(e){return"topMouseDown"===e||"topTouchStart"===e}function a(e,t,n,r){var o=e.type||"unknown-event";e.currentTarget=y.getNodeFromInstance(r),t?m.invokeGuardedCallbackWithCatch(o,n,e):m.invokeGuardedCallback(o,n,e),e.currentTarget=null}function u(e,t){var n=e._dispatchListeners,r=e._dispatchInstances;if(Array.isArray(n))for(var o=0;o<n.length&&!e.isPropagationStopped();o++)a(e,t,n[o],r[o]);else n&&a(e,t,n,r);e._dispatchListeners=null,e._dispatchInstances=null}function s(e){var t=e._dispatchListeners,n=e._dispatchInstances;if(Array.isArray(t)){for(var r=0;r<t.length&&!e.isPropagationStopped();r++)if(t[r](e,n[r]))return n[r]}else if(t&&t(e,n))return n;return null}function c(e){var t=s(e);return e._dispatchInstances=null,e._dispatchListeners=null,t}function l(e){var t=e._dispatchListeners,n=e._dispatchInstances;Array.isArray(t)&&h("103"),e.currentTarget=t?y.getNodeFromInstance(n):null;var r=t?t(e):null;return e.currentTarget=null,e._dispatchListeners=null,e._dispatchInstances=null,r}function p(e){return!!e._dispatchListeners}var f,d,h=n(2),m=n(33),v=(n(0),n(1),{injectComponentTree:function(e){f=e},injectTreeTraversal:function(e){d=e}}),y={isEndish:r,isMoveish:o,isStartish:i,executeDirectDispatch:l,executeDispatchesInOrder:u,executeDispatchesInOrderStopAtTrue:c,hasDispatches:p,getInstanceFromNode:function(e){return f.getInstanceFromNode(e)},getNodeFromInstance:function(e){return f.getNodeFromInstance(e)},isAncestor:function(e,t){return d.isAncestor(e,t)},getLowestCommonAncestor:function(e,t){return d.getLowestCommonAncestor(e,t)},getParentInstance:function(e){return d.getParentInstance(e)},traverseTwoPhase:function(e,t,n){return d.traverseTwoPhase(e,t,n)},traverseEnterLeave:function(e,t,n,r,o){return d.traverseEnterLeave(e,t,n,r,o)},injection:v};e.exports=y},function(e,t,n){"use strict";function r(e,t,n){try{t(n)}catch(e){null===o&&(o=e)}}var o=null,i={invokeGuardedCallback:r,invokeGuardedCallbackWithCatch:r,rethrowCaughtError:function(){if(o){var e=o;throw o=null,e}}};e.exports=i},function(e,t,n){"use strict";function r(e){var t=e.target||e.srcElement||window;return t.correspondingUseElement&&(t=t.correspondingUseElement),3===t.nodeType?t.parentNode:t}e.exports=r},function(e,t,n){"use strict";function r(e,t){if(!i.canUseDOM||t&&!("addEventListener"in document))return!1;var n="on"+e,r=n in document;if(!r){var a=document.createElement("div");a.setAttribute(n,"return;"),r="function"===typeof a[n]}return!r&&o&&"wheel"===e&&(r=document.implementation.hasFeature("Events.wheel","3.0")),r}var o,i=n(5);i.canUseDOM&&(o=document.implementation&&document.implementation.hasFeature&&!0!==document.implementation.hasFeature("","")),e.exports=r},function(e,t,n){"use strict";function r(e){var t=this,n=t.nativeEvent;if(n.getModifierState)return n.getModifierState(e);var r=i[e];return!!r&&!!n[r]}function o(e){return r}var i={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};e.exports=o},function(e,t,n){"use strict";function r(e,t){return Array.isArray(t)&&(t=t[1]),t?t.nextSibling:e.firstChild}function o(e,t,n){l.insertTreeBefore(e,t,n)}function i(e,t,n){Array.isArray(t)?u(e,t[0],t[1],n):m(e,t,n)}function a(e,t){if(Array.isArray(t)){var n=t[1];t=t[0],s(e,t,n),e.removeChild(n)}e.removeChild(t)}function u(e,t,n,r){for(var o=t;;){var i=o.nextSibling;if(m(e,o,r),o===n)break;o=i}}function s(e,t,n){for(;;){var r=t.nextSibling;if(r===n)break;e.removeChild(r)}}function c(e,t,n){var r=e.parentNode,o=e.nextSibling;o===t?n&&m(r,document.createTextNode(n),o):n?(h(o,n),s(r,o,t)):s(r,e,t)}var l=n(17),p=n(133),f=(n(4),n(7),n(39)),d=n(26),h=n(67),m=f(function(e,t,n){e.insertBefore(t,n)}),v=p.dangerouslyReplaceNodeWithMarkup,y={dangerouslyReplaceNodeWithMarkup:v,replaceDelimitedText:c,processUpdates:function(e,t){for(var n=0;n<t.length;n++){var u=t[n];switch(u.type){case"INSERT_MARKUP":o(e,u.content,r(e,u.afterNode));break;case"MOVE_EXISTING":i(e,u.fromNode,r(e,u.afterNode));break;case"SET_MARKUP":d(e,u.content);break;case"TEXT_CONTENT":h(e,u.content);break;case"REMOVE_NODE":a(e,u.fromNode)}}}};e.exports=y},function(e,t,n){"use strict";var r={html:"http://www.w3.org/1999/xhtml",mathml:"http://www.w3.org/1998/Math/MathML",svg:"http://www.w3.org/2000/svg"};e.exports=r},function(e,t,n){"use strict";var r=function(e){return"undefined"!==typeof MSApp&&MSApp.execUnsafeLocalFunction?function(t,n,r,o){MSApp.execUnsafeLocalFunction(function(){return e(t,n,r,o)})}:e};e.exports=r},function(e,t,n){"use strict";function r(e){null!=e.checkedLink&&null!=e.valueLink&&u("87")}function o(e){r(e),(null!=e.value||null!=e.onChange)&&u("88")}function i(e){r(e),(null!=e.checked||null!=e.onChange)&&u("89")}function a(e){if(e){var t=e.getName();if(t)return" Check the render method of `"+t+"`."}return""}var u=n(2),s=n(151),c=n(56),l=n(13),p=c(l.isValidElement),f=(n(0),n(1),{button:!0,checkbox:!0,image:!0,hidden:!0,radio:!0,reset:!0,submit:!0}),d={value:function(e,t,n){return!e[t]||f[e.type]||e.onChange||e.readOnly||e.disabled?null:new Error("You provided a `value` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultValue`. Otherwise, set either `onChange` or `readOnly`.")},checked:function(e,t,n){return!e[t]||e.onChange||e.readOnly||e.disabled?null:new Error("You provided a `checked` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultChecked`. Otherwise, set either `onChange` or `readOnly`.")},onChange:p.func},h={},m={checkPropTypes:function(e,t,n){for(var r in d){if(d.hasOwnProperty(r))var o=d[r](t,r,e,"prop",null,s);if(o instanceof Error&&!(o.message in h)){h[o.message]=!0;a(n)}}},getValue:function(e){return e.valueLink?(o(e),e.valueLink.value):e.value},getChecked:function(e){return e.checkedLink?(i(e),e.checkedLink.value):e.checked},executeOnChange:function(e,t){return e.valueLink?(o(e),e.valueLink.requestChange(t.target.value)):e.checkedLink?(i(e),e.checkedLink.requestChange(t.target.checked)):e.onChange?e.onChange.call(void 0,t):void 0}};e.exports=m},function(e,t,n){"use strict";var r=n(2),o=(n(0),!1),i={replaceNodeWithMarkup:null,processChildrenUpdates:null,injection:{injectEnvironment:function(e){o&&r("104"),i.replaceNodeWithMarkup=e.replaceNodeWithMarkup,i.processChildrenUpdates=e.processChildrenUpdates,o=!0}}};e.exports=i},function(e,t,n){"use strict";function r(e,t){return e===t?0!==e||0!==t||1/e===1/t:e!==e&&t!==t}function o(e,t){if(r(e,t))return!0;if("object"!==typeof e||null===e||"object"!==typeof t||null===t)return!1;var n=Object.keys(e),o=Object.keys(t);if(n.length!==o.length)return!1;for(var a=0;a<n.length;a++)if(!i.call(t,n[a])||!r(e[n[a]],t[n[a]]))return!1;return!0}var i=Object.prototype.hasOwnProperty;e.exports=o},function(e,t,n){"use strict";function r(e,t){var n=null===e||!1===e,r=null===t||!1===t;if(n||r)return n===r;var o=typeof e,i=typeof t;return"string"===o||"number"===o?"string"===i||"number"===i:"object"===i&&e.type===t.type&&e.key===t.key}e.exports=r},function(e,t,n){"use strict";function r(e){var t={"=":"=0",":":"=2"};return"$"+(""+e).replace(/[=:]/g,function(e){return t[e]})}function o(e){var t=/(=0|=2)/g,n={"=0":"=","=2":":"};return(""+("."===e[0]&&"$"===e[1]?e.substring(2):e.substring(1))).replace(t,function(e){return n[e]})}var i={escape:r,unescape:o};e.exports=i},function(e,t,n){"use strict";function r(e){s.enqueueUpdate(e)}function o(e){var t=typeof e;if("object"!==t)return t;var n=e.constructor&&e.constructor.name||t,r=Object.keys(e);return r.length>0&&r.length<20?n+" (keys: "+r.join(", ")+")":n}function i(e,t){var n=u.get(e);if(!n){return null}return n}var a=n(2),u=(n(10),n(22)),s=(n(7),n(8)),c=(n(0),n(1),{isMounted:function(e){var t=u.get(e);return!!t&&!!t._renderedComponent},enqueueCallback:function(e,t,n){c.validateCallback(t,n);var o=i(e);if(!o)return null;o._pendingCallbacks?o._pendingCallbacks.push(t):o._pendingCallbacks=[t],r(o)},enqueueCallbackInternal:function(e,t){e._pendingCallbacks?e._pendingCallbacks.push(t):e._pendingCallbacks=[t],r(e)},enqueueForceUpdate:function(e){var t=i(e,"forceUpdate");t&&(t._pendingForceUpdate=!0,r(t))},enqueueReplaceState:function(e,t,n){var o=i(e,"replaceState");o&&(o._pendingStateQueue=[t],o._pendingReplaceState=!0,void 0!==n&&null!==n&&(c.validateCallback(n,"replaceState"),o._pendingCallbacks?o._pendingCallbacks.push(n):o._pendingCallbacks=[n]),r(o))},enqueueSetState:function(e,t){var n=i(e,"setState");if(n){(n._pendingStateQueue||(n._pendingStateQueue=[])).push(t),r(n)}},enqueueElementInternal:function(e,t,n){e._pendingElement=t,e._context=n,r(e)},validateCallback:function(e,t){e&&"function"!==typeof e&&a("122",t,o(e))}});e.exports=c},function(e,t,n){"use strict";var r=(n(3),n(6)),o=(n(1),r);e.exports=o},function(e,t,n){"use strict";function r(e){var t,n=e.keyCode;return"charCode"in e?0===(t=e.charCode)&&13===n&&(t=13):t=n,t>=32||13===t?t:0}e.exports=r},function(e,t,n){"use strict";function r(e){if(!Object(a.a)(e)||Object(o.a)(e)!=u)return!1;var t=Object(i.a)(e);if(null===t)return!0;var n=p.call(t,"constructor")&&t.constructor;return"function"==typeof n&&n instanceof n&&l.call(n)==f}var o=n(195),i=n(200),a=n(202),u="[object Object]",s=Function.prototype,c=Object.prototype,l=s.toString,p=c.hasOwnProperty,f=l.call(Object);t.a=r},function(e,t,n){"use strict";function r(e){"undefined"!==typeof console&&"function"===typeof console.error&&console.error(e);try{throw new Error(e)}catch(e){}}t.a=r},function(e,t,n){var r,o;!function(){"use strict";function n(){for(var e=[],t=0;t<arguments.length;t++){var r=arguments[t];if(r){var o=typeof r;if("string"===o||"number"===o)e.push(r);else if(Array.isArray(r))e.push(n.apply(null,r));else if("object"===o)for(var a in r)i.call(r,a)&&r[a]&&e.push(a)}}return e.join(" ")}var i={}.hasOwnProperty;"undefined"!==typeof e&&e.exports?e.exports=n:(r=[],void 0!==(o=function(){return n}.apply(t,r))&&(e.exports=o))}()},function(e,t,n){"use strict";function r(){}function o(e){try{return e.then}catch(e){return y=e,g}}function i(e,t){try{return e(t)}catch(e){return y=e,g}}function a(e,t,n){try{e(t,n)}catch(e){return y=e,g}}function u(e){if("object"!==typeof this)throw new TypeError("Promises must be constructed via new");if("function"!==typeof e)throw new TypeError("Promise constructor's argument is not a function");this._75=0,this._83=0,this._18=null,this._38=null,e!==r&&m(e,this)}function s(e,t,n){return new e.constructor(function(o,i){var a=new u(r);a.then(o,i),c(e,new h(t,n,a))})}function c(e,t){for(;3===e._83;)e=e._18;if(u._47&&u._47(e),0===e._83)return 0===e._75?(e._75=1,void(e._38=t)):1===e._75?(e._75=2,void(e._38=[e._38,t])):void e._38.push(t);l(e,t)}function l(e,t){v(function(){var n=1===e._83?t.onFulfilled:t.onRejected;if(null===n)return void(1===e._83?p(t.promise,e._18):f(t.promise,e._18));var r=i(n,e._18);r===g?f(t.promise,y):p(t.promise,r)})}function p(e,t){if(t===e)return f(e,new TypeError("A promise cannot be resolved with itself."));if(t&&("object"===typeof t||"function"===typeof t)){var n=o(t);if(n===g)return f(e,y);if(n===e.then&&t instanceof u)return e._83=3,e._18=t,void d(e);if("function"===typeof n)return void m(n.bind(t),e)}e._83=1,e._18=t,d(e)}function f(e,t){e._83=2,e._18=t,u._71&&u._71(e,t),d(e)}function d(e){if(1===e._75&&(c(e,e._38),e._38=null),2===e._75){for(var t=0;t<e._38.length;t++)c(e,e._38[t]);e._38=null}}function h(e,t,n){this.onFulfilled="function"===typeof e?e:null,this.onRejected="function"===typeof t?t:null,this.promise=n}function m(e,t){var n=!1,r=a(e,function(e){n||(n=!0,p(t,e))},function(e){n||(n=!0,f(t,e))});n||r!==g||(n=!0,f(t,y))}var v=n(100),y=null,g={};e.exports=u,u._47=null,u._71=null,u._44=r,u.prototype.then=function(e,t){if(this.constructor!==u)return s(this,e,t);var n=new u(r);return c(this,new h(e,t,n)),n}},function(e,t,n){"use strict";function r(e,t,n){this.props=e,this.context=t,this.refs=c,this.updater=n||s}function o(e,t,n){this.props=e,this.context=t,this.refs=c,this.updater=n||s}function i(){}var a=n(18),u=n(3),s=n(53),c=(n(54),n(23));n(0),n(104);r.prototype.isReactComponent={},r.prototype.setState=function(e,t){"object"!==typeof e&&"function"!==typeof e&&null!=e&&a("85"),this.updater.enqueueSetState(this,e),t&&this.updater.enqueueCallback(this,t,"setState")},r.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this),e&&this.updater.enqueueCallback(this,e,"forceUpdate")};i.prototype=r.prototype,o.prototype=new i,o.prototype.constructor=o,u(o.prototype,r.prototype),o.prototype.isPureReactComponent=!0,e.exports={Component:r,PureComponent:o}},function(e,t,n){"use strict";var r=(n(1),{isMounted:function(e){return!1},enqueueCallback:function(e,t){},enqueueForceUpdate:function(e){},enqueueReplaceState:function(e,t){},enqueueSetState:function(e,t){}});e.exports=r},function(e,t,n){"use strict";var r=!1;e.exports=r},function(e,t,n){"use strict";var r="function"===typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103;e.exports=r},function(e,t,n){"use strict";var r=n(112);e.exports=function(e){return r(e,!1)}},function(e,t,n){"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},function(e,t,n){"use strict";var r={hasCachedChildNodes:1};e.exports=r},function(e,t,n){"use strict";function r(e,t){return null==t&&o("30"),null==e?t:Array.isArray(e)?Array.isArray(t)?(e.push.apply(e,t),e):(e.push(t),e):Array.isArray(t)?[e].concat(t):[e,t]}var o=n(2);n(0);e.exports=r},function(e,t,n){"use strict";function r(e,t,n){Array.isArray(e)?e.forEach(t,n):e&&t.call(n,e)}e.exports=r},function(e,t,n){"use strict";function r(){return!i&&o.canUseDOM&&(i="textContent"in document.documentElement?"textContent":"innerText"),i}var o=n(5),i=null;e.exports=r},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var o=n(2),i=n(12),a=(n(0),function(){function e(t){r(this,e),this._callbacks=null,this._contexts=null,this._arg=t}return e.prototype.enqueue=function(e,t){this._callbacks=this._callbacks||[],this._callbacks.push(e),this._contexts=this._contexts||[],this._contexts.push(t)},e.prototype.notifyAll=function(){var e=this._callbacks,t=this._contexts,n=this._arg;if(e&&t){e.length!==t.length&&o("24"),this._callbacks=null,this._contexts=null;for(var r=0;r<e.length;r++)e[r].call(t[r],n);e.length=0,t.length=0}},e.prototype.checkpoint=function(){return this._callbacks?this._callbacks.length:0},e.prototype.rollback=function(e){this._callbacks&&this._contexts&&(this._callbacks.length=e,this._contexts.length=e)},e.prototype.reset=function(){this._callbacks=null,this._contexts=null},e.prototype.destructor=function(){this.reset()},e}());e.exports=i.addPoolingTo(a)},function(e,t,n){"use strict";var r={logTopLevelRenders:!1};e.exports=r},function(e,t,n){"use strict";function r(e){var t=e.type,n=e.nodeName;return n&&"input"===n.toLowerCase()&&("checkbox"===t||"radio"===t)}function o(e){return e._wrapperState.valueTracker}function i(e,t){e._wrapperState.valueTracker=t}function a(e){delete e._wrapperState.valueTracker}function u(e){var t;return e&&(t=r(e)?""+e.checked:e.value),t}var s=n(4),c={_getTrackerFromNode:function(e){return o(s.getInstanceFromNode(e))},track:function(e){if(!o(e)){var t=s.getNodeFromInstance(e),n=r(t)?"checked":"value",u=Object.getOwnPropertyDescriptor(t.constructor.prototype,n),c=""+t[n];t.hasOwnProperty(n)||"function"!==typeof u.get||"function"!==typeof u.set||(Object.defineProperty(t,n,{enumerable:u.enumerable,configurable:!0,get:function(){return u.get.call(this)},set:function(e){c=""+e,u.set.call(this,e)}}),i(e,{getValue:function(){return c},setValue:function(e){c=""+e},stopTracking:function(){a(e),delete t[n]}}))}},updateValueIfChanged:function(e){if(!e)return!1;var t=o(e);if(!t)return c.track(e),!0;var n=t.getValue(),r=u(s.getNodeFromInstance(e));return r!==n&&(t.setValue(r),!0)},stopTracking:function(e){var t=o(e);t&&t.stopTracking()}};e.exports=c},function(e,t,n){"use strict";function r(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!o[e.type]:"textarea"===t}var o={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};e.exports=r},function(e,t,n){"use strict";var r={currentScrollLeft:0,currentScrollTop:0,refreshScrollValues:function(e){r.currentScrollLeft=e.x,r.currentScrollTop=e.y}};e.exports=r},function(e,t,n){"use strict";var r=n(5),o=n(27),i=n(26),a=function(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.nodeType)return void(n.nodeValue=t)}e.textContent=t};r.canUseDOM&&("textContent"in document.documentElement||(a=function(e,t){if(3===e.nodeType)return void(e.nodeValue=t);i(e,o(t))})),e.exports=a},function(e,t,n){"use strict";function r(e){try{e.focus()}catch(e){}}e.exports=r},function(e,t,n){"use strict";function r(e,t){return e+t.charAt(0).toUpperCase()+t.substring(1)}var o={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},i=["Webkit","ms","Moz","O"];Object.keys(o).forEach(function(e){i.forEach(function(t){o[r(t,e)]=o[e]})});var a={background:{backgroundAttachment:!0,backgroundColor:!0,backgroundImage:!0,backgroundPositionX:!0,backgroundPositionY:!0,backgroundRepeat:!0},backgroundPosition:{backgroundPositionX:!0,backgroundPositionY:!0},border:{borderWidth:!0,borderStyle:!0,borderColor:!0},borderBottom:{borderBottomWidth:!0,borderBottomStyle:!0,borderBottomColor:!0},borderLeft:{borderLeftWidth:!0,borderLeftStyle:!0,borderLeftColor:!0},borderRight:{borderRightWidth:!0,borderRightStyle:!0,borderRightColor:!0},borderTop:{borderTopWidth:!0,borderTopStyle:!0,borderTopColor:!0},font:{fontStyle:!0,fontVariant:!0,fontWeight:!0,fontSize:!0,lineHeight:!0,fontFamily:!0},outline:{outlineWidth:!0,outlineStyle:!0,outlineColor:!0}},u={isUnitlessNumber:o,shorthandPropertyExpansions:a};e.exports=u},function(e,t,n){"use strict";function r(e){return!!c.hasOwnProperty(e)||!s.hasOwnProperty(e)&&(u.test(e)?(c[e]=!0,!0):(s[e]=!0,!1))}function o(e,t){return null==t||e.hasBooleanValue&&!t||e.hasNumericValue&&isNaN(t)||e.hasPositiveNumericValue&&t<1||e.hasOverloadedBooleanValue&&!1===t}var i=n(15),a=(n(4),n(7),n(147)),u=(n(1),new RegExp("^["+i.ATTRIBUTE_NAME_START_CHAR+"]["+i.ATTRIBUTE_NAME_CHAR+"]*$")),s={},c={},l={createMarkupForID:function(e){return i.ID_ATTRIBUTE_NAME+"="+a(e)},setAttributeForID:function(e,t){e.setAttribute(i.ID_ATTRIBUTE_NAME,t)},createMarkupForRoot:function(){return i.ROOT_ATTRIBUTE_NAME+'=""'},setAttributeForRoot:function(e){e.setAttribute(i.ROOT_ATTRIBUTE_NAME,"")},createMarkupForProperty:function(e,t){var n=i.properties.hasOwnProperty(e)?i.properties[e]:null;if(n){if(o(n,t))return"";var r=n.attributeName;return n.hasBooleanValue||n.hasOverloadedBooleanValue&&!0===t?r+'=""':r+"="+a(t)}return i.isCustomAttribute(e)?null==t?"":e+"="+a(t):null},createMarkupForCustomAttribute:function(e,t){return r(e)&&null!=t?e+"="+a(t):""},setValueForProperty:function(e,t,n){var r=i.properties.hasOwnProperty(t)?i.properties[t]:null;if(r){var a=r.mutationMethod;if(a)a(e,n);else{if(o(r,n))return void this.deleteValueForProperty(e,t);if(r.mustUseProperty)e[r.propertyName]=n;else{var u=r.attributeName,s=r.attributeNamespace;s?e.setAttributeNS(s,u,""+n):r.hasBooleanValue||r.hasOverloadedBooleanValue&&!0===n?e.setAttribute(u,""):e.setAttribute(u,""+n)}}}else if(i.isCustomAttribute(t))return void l.setValueForAttribute(e,t,n)},setValueForAttribute:function(e,t,n){if(r(t)){null==n?e.removeAttribute(t):e.setAttribute(t,""+n)}},deleteValueForAttribute:function(e,t){e.removeAttribute(t)},deleteValueForProperty:function(e,t){var n=i.properties.hasOwnProperty(t)?i.properties[t]:null;if(n){var r=n.mutationMethod;if(r)r(e,void 0);else if(n.mustUseProperty){var o=n.propertyName;n.hasBooleanValue?e[o]=!1:e[o]=""}else e.removeAttribute(n.attributeName)}else i.isCustomAttribute(t)&&e.removeAttribute(t)}};e.exports=l},function(e,t,n){"use strict";function r(){if(this._rootNodeID&&this._wrapperState.pendingUpdate){this._wrapperState.pendingUpdate=!1;var e=this._currentElement.props,t=u.getValue(e);null!=t&&o(this,Boolean(e.multiple),t)}}function o(e,t,n){var r,o,i=s.getNodeFromInstance(e).options;if(t){for(r={},o=0;o<n.length;o++)r[""+n[o]]=!0;for(o=0;o<i.length;o++){var a=r.hasOwnProperty(i[o].value);i[o].selected!==a&&(i[o].selected=a)}}else{for(r=""+n,o=0;o<i.length;o++)if(i[o].value===r)return void(i[o].selected=!0);i.length&&(i[0].selected=!0)}}function i(e){var t=this._currentElement.props,n=u.executeOnChange(t,e);return this._rootNodeID&&(this._wrapperState.pendingUpdate=!0),c.asap(r,this),n}var a=n(3),u=n(40),s=n(4),c=n(8),l=(n(1),!1),p={getHostProps:function(e,t){return a({},t,{onChange:e._wrapperState.onChange,value:void 0})},mountWrapper:function(e,t){var n=u.getValue(t);e._wrapperState={pendingUpdate:!1,initialValue:null!=n?n:t.defaultValue,listeners:null,onChange:i.bind(e),wasMultiple:Boolean(t.multiple)},void 0===t.value||void 0===t.defaultValue||l||(l=!0)},getSelectValueContext:function(e){return e._wrapperState.initialValue},postUpdateWrapper:function(e){var t=e._currentElement.props;e._wrapperState.initialValue=void 0;var n=e._wrapperState.wasMultiple;e._wrapperState.wasMultiple=Boolean(t.multiple);var r=u.getValue(t);null!=r?(e._wrapperState.pendingUpdate=!1,o(e,Boolean(t.multiple),r)):n!==Boolean(t.multiple)&&(null!=t.defaultValue?o(e,Boolean(t.multiple),t.defaultValue):o(e,Boolean(t.multiple),t.multiple?[]:""))}};e.exports=p},function(e,t){function n(){throw new Error("setTimeout has not been defined")}function r(){throw new Error("clearTimeout has not been defined")}function o(e){if(l===setTimeout)return setTimeout(e,0);if((l===n||!l)&&setTimeout)return l=setTimeout,setTimeout(e,0);try{return l(e,0)}catch(t){try{return l.call(null,e,0)}catch(t){return l.call(this,e,0)}}}function i(e){if(p===clearTimeout)return clearTimeout(e);if((p===r||!p)&&clearTimeout)return p=clearTimeout,clearTimeout(e);try{return p(e)}catch(t){try{return p.call(null,e)}catch(t){return p.call(this,e)}}}function a(){m&&d&&(m=!1,d.length?h=d.concat(h):v=-1,h.length&&u())}function u(){if(!m){var e=o(a);m=!0;for(var t=h.length;t;){for(d=h,h=[];++v<t;)d&&d[v].run();v=-1,t=h.length}d=null,m=!1,i(e)}}function s(e,t){this.fun=e,this.array=t}function c(){}var l,p,f=e.exports={};!function(){try{l="function"===typeof setTimeout?setTimeout:n}catch(e){l=n}try{p="function"===typeof clearTimeout?clearTimeout:r}catch(e){p=r}}();var d,h=[],m=!1,v=-1;f.nextTick=function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)t[n-1]=arguments[n];h.push(new s(e,t)),1!==h.length||m||o(u)},s.prototype.run=function(){this.fun.apply(null,this.array)},f.title="browser",f.browser=!0,f.env={},f.argv=[],f.version="",f.versions={},f.on=c,f.addListener=c,f.once=c,f.off=c,f.removeListener=c,f.removeAllListeners=c,f.emit=c,f.prependListener=c,f.prependOnceListener=c,f.listeners=function(e){return[]},f.binding=function(e){throw new Error("process.binding is not supported")},f.cwd=function(){return"/"},f.chdir=function(e){throw new Error("process.chdir is not supported")},f.umask=function(){return 0}},function(e,t,n){"use strict";function r(e){if(e){var t=e.getName();if(t)return" Check the render method of `"+t+"`."}return""}function o(e){return"function"===typeof e&&"undefined"!==typeof e.prototype&&"function"===typeof e.prototype.mountComponent&&"function"===typeof e.prototype.receiveComponent}function i(e,t){var n;if(null===e||!1===e)n=c.create(i);else if("object"===typeof e){var u=e,s=u.type;if("function"!==typeof s&&"string"!==typeof s){var f="";f+=r(u._owner),a("130",null==s?s:typeof s,f)}"string"===typeof u.type?n=l.createInternalComponent(u):o(u.type)?(n=new u.type(u),n.getHostNode||(n.getHostNode=n.getNativeNode)):n=new p(u)}else"string"===typeof e||"number"===typeof e?n=l.createInstanceForText(e):a("131",typeof e);return n._mountIndex=0,n._mountImage=null,n}var a=n(2),u=n(3),s=n(156),c=n(75),l=n(76),p=(n(157),n(0),n(1),function(e){this.construct(e)});u(p.prototype,s,{_instantiateReactComponent:i}),e.exports=i},function(e,t,n){"use strict";var r=n(2),o=n(13),i=(n(0),{HOST:0,COMPOSITE:1,EMPTY:2,getType:function(e){return null===e||!1===e?i.EMPTY:o.isValidElement(e)?"function"===typeof e.type?i.COMPOSITE:i.HOST:void r("26",e)}});e.exports=i},function(e,t,n){"use strict";var r,o={injectEmptyComponentFactory:function(e){r=e}},i={create:function(e){return r(e)}};i.injection=o,e.exports=i},function(e,t,n){"use strict";function r(e){return u||a("111",e.type),new u(e)}function o(e){return new s(e)}function i(e){return e instanceof s}var a=n(2),u=(n(0),null),s=null,c={injectGenericComponentClass:function(e){u=e},injectTextComponentClass:function(e){s=e}},l={createInternalComponent:r,createInstanceForText:o,isTextComponent:i,injection:c};e.exports=l},function(e,t,n){"use strict";function r(e,t){return e&&"object"===typeof e&&null!=e.key?c.escape(e.key):t.toString(36)}function o(e,t,n,i){var f=typeof e;if("undefined"!==f&&"boolean"!==f||(e=null),null===e||"string"===f||"number"===f||"object"===f&&e.$$typeof===u)return n(i,e,""===t?l+r(e,0):t),1;var d,h,m=0,v=""===t?l:t+p;if(Array.isArray(e))for(var y=0;y<e.length;y++)d=e[y],h=v+r(d,y),m+=o(d,h,n,i);else{var g=s(e);if(g){var b,_=g.call(e);if(g!==e.entries)for(var C=0;!(b=_.next()).done;)d=b.value,h=v+r(d,C++),m+=o(d,h,n,i);else for(;!(b=_.next()).done;){var w=b.value;w&&(d=w[1],h=v+c.escape(w[0])+p+r(d,0),m+=o(d,h,n,i))}}else if("object"===f){var E="",x=String(e);a("31","[object Object]"===x?"object with keys {"+Object.keys(e).join(", ")+"}":x,E)}}return m}function i(e,t,n){return null==e?0:o(e,"",t,n)}var a=n(2),u=(n(10),n(158)),s=n(159),c=(n(0),n(44)),l=(n(1),"."),p=":";e.exports=i},function(e,t,n){"use strict";function r(e){var t=Function.prototype.toString,n=Object.prototype.hasOwnProperty,r=RegExp("^"+t.call(n).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");try{var o=t.call(e);return r.test(o)}catch(e){return!1}}function o(e){var t=c(e);if(t){var n=t.childIDs;l(e),n.forEach(o)}}function i(e,t,n){return"\n    in "+(e||"Unknown")+(t?" (at "+t.fileName.replace(/^.*[\\\/]/,"")+":"+t.lineNumber+")":n?" (created by "+n+")":"")}function a(e){return null==e?"#empty":"string"===typeof e||"number"===typeof e?"#text":"string"===typeof e.type?e.type:e.type.displayName||e.type.name||"Unknown"}function u(e){var t,n=T.getDisplayName(e),r=T.getElement(e),o=T.getOwnerID(e);return o&&(t=T.getDisplayName(o)),i(n,r&&r._source,t)}var s,c,l,p,f,d,h,m=n(18),v=n(10),y=(n(0),n(1),"function"===typeof Array.from&&"function"===typeof Map&&r(Map)&&null!=Map.prototype&&"function"===typeof Map.prototype.keys&&r(Map.prototype.keys)&&"function"===typeof Set&&r(Set)&&null!=Set.prototype&&"function"===typeof Set.prototype.keys&&r(Set.prototype.keys));if(y){var g=new Map,b=new Set;s=function(e,t){g.set(e,t)},c=function(e){return g.get(e)},l=function(e){g.delete(e)},p=function(){return Array.from(g.keys())},f=function(e){b.add(e)},d=function(e){b.delete(e)},h=function(){return Array.from(b.keys())}}else{var _={},C={},w=function(e){return"."+e},E=function(e){return parseInt(e.substr(1),10)};s=function(e,t){var n=w(e);_[n]=t},c=function(e){var t=w(e);return _[t]},l=function(e){var t=w(e);delete _[t]},p=function(){return Object.keys(_).map(E)},f=function(e){var t=w(e);C[t]=!0},d=function(e){var t=w(e);delete C[t]},h=function(){return Object.keys(C).map(E)}}var x=[],T={onSetChildren:function(e,t){var n=c(e);n||m("144"),n.childIDs=t;for(var r=0;r<t.length;r++){var o=t[r],i=c(o);i||m("140"),null==i.childIDs&&"object"===typeof i.element&&null!=i.element&&m("141"),i.isMounted||m("71"),null==i.parentID&&(i.parentID=e),i.parentID!==e&&m("142",o,i.parentID,e)}},onBeforeMountComponent:function(e,t,n){s(e,{element:t,parentID:n,text:null,childIDs:[],isMounted:!1,updateCount:0})},onBeforeUpdateComponent:function(e,t){var n=c(e);n&&n.isMounted&&(n.element=t)},onMountComponent:function(e){var t=c(e);t||m("144"),t.isMounted=!0,0===t.parentID&&f(e)},onUpdateComponent:function(e){var t=c(e);t&&t.isMounted&&t.updateCount++},onUnmountComponent:function(e){var t=c(e);if(t){t.isMounted=!1;0===t.parentID&&d(e)}x.push(e)},purgeUnmountedComponents:function(){if(!T._preventPurging){for(var e=0;e<x.length;e++){o(x[e])}x.length=0}},isMounted:function(e){var t=c(e);return!!t&&t.isMounted},getCurrentStackAddendum:function(e){var t="";if(e){var n=a(e),r=e._owner;t+=i(n,e._source,r&&r.getName())}var o=v.current,u=o&&o._debugID;return t+=T.getStackAddendumByID(u)},getStackAddendumByID:function(e){for(var t="";e;)t+=u(e),e=T.getParentID(e);return t},getChildIDs:function(e){var t=c(e);return t?t.childIDs:[]},getDisplayName:function(e){var t=T.getElement(e);return t?a(t):null},getElement:function(e){var t=c(e);return t?t.element:null},getOwnerID:function(e){var t=T.getElement(e);return t&&t._owner?t._owner._debugID:null},getParentID:function(e){var t=c(e);return t?t.parentID:null},getSource:function(e){var t=c(e),n=t?t.element:null;return null!=n?n._source:null},getText:function(e){var t=T.getElement(e);return"string"===typeof t?t:"number"===typeof t?""+t:null},getUpdateCount:function(e){var t=c(e);return t?t.updateCount:0},getRootIDs:h,getRegisteredIDs:p,pushNonStandardWarningStack:function(e,t){if("function"===typeof console.reactStack){var n=[],r=v.current,o=r&&r._debugID;try{for(e&&n.push({name:o?T.getDisplayName(o):null,fileName:t?t.fileName:null,lineNumber:t?t.lineNumber:null});o;){var i=T.getElement(o),a=T.getParentID(o),u=T.getOwnerID(o),s=u?T.getDisplayName(u):null,c=i&&i._source;n.push({name:s,fileName:c?c.fileName:null,lineNumber:c?c.lineNumber:null}),o=a}}catch(e){}console.reactStack(n)}},popNonStandardWarningStack:function(){"function"===typeof console.reactStackEnd&&console.reactStackEnd()}};e.exports=T},function(e,t,n){"use strict";var r=n(6),o={listen:function(e,t,n){return e.addEventListener?(e.addEventListener(t,n,!1),{remove:function(){e.removeEventListener(t,n,!1)}}):e.attachEvent?(e.attachEvent("on"+t,n),{remove:function(){e.detachEvent("on"+t,n)}}):void 0},capture:function(e,t,n){return e.addEventListener?(e.addEventListener(t,n,!0),{remove:function(){e.removeEventListener(t,n,!0)}}):{remove:r}},registerDefault:function(){}};e.exports=o},function(e,t,n){"use strict";function r(e){return i(document.documentElement,e)}var o=n(171),i=n(173),a=n(68),u=n(81),s={hasSelectionCapabilities:function(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&("input"===t&&"text"===e.type||"textarea"===t||"true"===e.contentEditable)},getSelectionInformation:function(){var e=u();return{focusedElem:e,selectionRange:s.hasSelectionCapabilities(e)?s.getSelection(e):null}},restoreSelection:function(e){var t=u(),n=e.focusedElem,o=e.selectionRange;t!==n&&r(n)&&(s.hasSelectionCapabilities(n)&&s.setSelection(n,o),a(n))},getSelection:function(e){var t;if("selectionStart"in e)t={start:e.selectionStart,end:e.selectionEnd};else if(document.selection&&e.nodeName&&"input"===e.nodeName.toLowerCase()){var n=document.selection.createRange();n.parentElement()===e&&(t={start:-n.moveStart("character",-e.value.length),end:-n.moveEnd("character",-e.value.length)})}else t=o.getOffsets(e);return t||{start:0,end:0}},setSelection:function(e,t){var n=t.start,r=t.end;if(void 0===r&&(r=n),"selectionStart"in e)e.selectionStart=n,e.selectionEnd=Math.min(r,e.value.length);else if(document.selection&&e.nodeName&&"input"===e.nodeName.toLowerCase()){var i=e.createTextRange();i.collapse(!0),i.moveStart("character",n),i.moveEnd("character",r-n),i.select()}else o.setOffsets(e,t)}};e.exports=s},function(e,t,n){"use strict";function r(e){if("undefined"===typeof(e=e||("undefined"!==typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(t){return e.body}}e.exports=r},function(e,t,n){"use strict";function r(e,t){for(var n=Math.min(e.length,t.length),r=0;r<n;r++)if(e.charAt(r)!==t.charAt(r))return r;return e.length===t.length?-1:n}function o(e){return e?e.nodeType===A?e.documentElement:e.firstChild:null}function i(e){return e.getAttribute&&e.getAttribute(I)||""}function a(e,t,n,r,o){var i;if(C.logTopLevelRenders){var a=e._currentElement.props.child,u=a.type;i="React mount: "+("string"===typeof u?u:u.displayName||u.name),console.time(i)}var s=x.mountComponent(e,n,null,b(e,t),o,0);i&&console.timeEnd(i),e._renderedComponent._topLevelWrapper=e,F._mountImageIntoNode(s,t,e,r,n)}function u(e,t,n,r){var o=P.ReactReconcileTransaction.getPooled(!n&&_.useCreateElement);o.perform(a,null,e,t,o,n,r),P.ReactReconcileTransaction.release(o)}function s(e,t,n){for(x.unmountComponent(e,n),t.nodeType===A&&(t=t.documentElement);t.lastChild;)t.removeChild(t.lastChild)}function c(e){var t=o(e);if(t){var n=g.getInstanceFromNode(t);return!(!n||!n._hostParent)}}function l(e){return!(!e||e.nodeType!==R&&e.nodeType!==A&&e.nodeType!==D)}function p(e){var t=o(e),n=t&&g.getInstanceFromNode(t);return n&&!n._hostParent?n:null}function f(e){var t=p(e);return t?t._hostContainerInfo._topLevelWrapper:null}var d=n(2),h=n(17),m=n(15),v=n(13),y=n(28),g=(n(10),n(4)),b=n(188),_=n(189),C=n(63),w=n(22),E=(n(7),n(190)),x=n(16),T=n(45),P=n(8),O=n(23),k=n(73),S=(n(0),n(26)),N=n(43),I=(n(1),m.ID_ATTRIBUTE_NAME),M=m.ROOT_ATTRIBUTE_NAME,R=1,A=9,D=11,j={},U=1,L=function(){this.rootID=U++};L.prototype.isReactComponent={},L.prototype.render=function(){return this.props.child},L.isReactTopLevelWrapper=!0;var F={TopLevelWrapper:L,_instancesByReactRootID:j,scrollMonitor:function(e,t){t()},_updateRootComponent:function(e,t,n,r,o){return F.scrollMonitor(r,function(){T.enqueueElementInternal(e,t,n),o&&T.enqueueCallbackInternal(e,o)}),e},_renderNewRootComponent:function(e,t,n,r){l(t)||d("37"),y.ensureScrollValueMonitoring();var o=k(e,!1);P.batchedUpdates(u,o,t,n,r);var i=o._instance.rootID;return j[i]=o,o},renderSubtreeIntoContainer:function(e,t,n,r){return null!=e&&w.has(e)||d("38"),F._renderSubtreeIntoContainer(e,t,n,r)},_renderSubtreeIntoContainer:function(e,t,n,r){T.validateCallback(r,"ReactDOM.render"),v.isValidElement(t)||d("39","string"===typeof t?" Instead of passing a string like 'div', pass React.createElement('div') or <div />.":"function"===typeof t?" Instead of passing a class like Foo, pass React.createElement(Foo) or <Foo />.":null!=t&&void 0!==t.props?" This may be caused by unintentionally loading two independent copies of React.":"");var a,u=v.createElement(L,{child:t});if(e){var s=w.get(e);a=s._processChildContext(s._context)}else a=O;var l=f(n);if(l){var p=l._currentElement,h=p.props.child;if(N(h,t)){var m=l._renderedComponent.getPublicInstance(),y=r&&function(){r.call(m)};return F._updateRootComponent(l,u,a,n,y),m}F.unmountComponentAtNode(n)}var g=o(n),b=g&&!!i(g),_=c(n),C=b&&!l&&!_,E=F._renderNewRootComponent(u,n,C,a)._renderedComponent.getPublicInstance();return r&&r.call(E),E},render:function(e,t,n){return F._renderSubtreeIntoContainer(null,e,t,n)},unmountComponentAtNode:function(e){l(e)||d("40");var t=f(e);if(!t){c(e),1===e.nodeType&&e.hasAttribute(M);return!1}return delete j[t._instance.rootID],P.batchedUpdates(s,t,e,!1),!0},_mountImageIntoNode:function(e,t,n,i,a){if(l(t)||d("41"),i){var u=o(t);if(E.canReuseMarkup(e,u))return void g.precacheNode(n,u);var s=u.getAttribute(E.CHECKSUM_ATTR_NAME);u.removeAttribute(E.CHECKSUM_ATTR_NAME);var c=u.outerHTML;u.setAttribute(E.CHECKSUM_ATTR_NAME,s);var p=e,f=r(p,c),m=" (client) "+p.substring(f-20,f+20)+"\n (server) "+c.substring(f-20,f+20);t.nodeType===A&&d("42",m)}if(t.nodeType===A&&d("43"),a.useCreateElement){for(;t.lastChild;)t.removeChild(t.lastChild);h.insertTreeBefore(t,e,null)}else S(t,e),g.precacheNode(n,t.firstChild)}};e.exports=F},function(e,t,n){"use strict";function r(e){for(var t;(t=e._renderedNodeType)===o.COMPOSITE;)e=e._renderedComponent;return t===o.HOST?e._renderedComponent:t===o.EMPTY?null:void 0}var o=n(74);e.exports=r},function(e,t,n){"use strict";function r(e,t,n){function i(){y===v&&(y=v.slice())}function s(){return m}function c(e){if("function"!==typeof e)throw new Error("Expected listener to be a function.");var t=!0;return i(),y.push(e),function(){if(t){t=!1,i();var n=y.indexOf(e);y.splice(n,1)}}}function l(e){if(!Object(o.a)(e))throw new Error("Actions must be plain objects. Use custom middleware for async actions.");if("undefined"===typeof e.type)throw new Error('Actions may not have an undefined "type" property. Have you misspelled a constant?');if(g)throw new Error("Reducers may not dispatch actions.");try{g=!0,m=h(m,e)}finally{g=!1}for(var t=v=y,n=0;n<t.length;n++){(0,t[n])()}return e}function p(e){if("function"!==typeof e)throw new Error("Expected the nextReducer to be a function.");h=e,l({type:u.INIT})}function f(){var e,t=c;return e={subscribe:function(e){function n(){e.next&&e.next(s())}if("object"!==typeof e)throw new TypeError("Expected the observer to be an object.");return n(),{unsubscribe:t(n)}}},e[a.a]=function(){return this},e}var d;if("function"===typeof t&&"undefined"===typeof n&&(n=t,t=void 0),"undefined"!==typeof n){if("function"!==typeof n)throw new Error("Expected the enhancer to be a function.");return n(r)(e,t)}if("function"!==typeof e)throw new Error("Expected the reducer to be a function.");var h=e,m=t,v=[],y=v,g=!1;return l({type:u.INIT}),d={dispatch:l,subscribe:c,getState:s,replaceReducer:p},d[a.a]=f,d}n.d(t,"a",function(){return u}),t.b=r;var o=n(48),i=n(203),a=n.n(i),u={INIT:"@@redux/INIT"}},function(e,t,n){"use strict";var r=n(196),o=r.a.Symbol;t.a=o},function(e,t,n){"use strict"},function(e,t,n){"use strict";function r(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return 0===t.length?function(e){return e}:1===t.length?t[0]:t.reduce(function(e,t){return function(){return e(t.apply(void 0,arguments))}})}t.a=r},function(e,t,n){"use strict";var r=n(210),o=(n(91),n(215));n.d(t,"a",function(){return r.a}),n.d(t,"b",function(){return o.a})},function(e,t,n){e.exports=n(211)()},function(e,t,n){"use strict";n.d(t,"b",function(){return i}),n.d(t,"a",function(){return a});var r=n(89),o=n.n(r),i=o.a.shape({trySubscribe:o.a.func.isRequired,tryUnsubscribe:o.a.func.isRequired,notifyNestedSubs:o.a.func.isRequired,isSubscribed:o.a.func.isRequired}),a=o.a.shape({subscribe:o.a.func.isRequired,dispatch:o.a.func.isRequired,getState:o.a.func.isRequired})},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!==typeof t&&"function"!==typeof t?e:t}function i(e,t){if("function"!==typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function a(e,t){var n={};for(var r in e)t.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}function u(){}function s(e,t){var n={run:function(r){try{var o=e(t.getState(),r);(o!==n.props||n.error)&&(n.shouldComponentUpdate=!0,n.props=o,n.error=null)}catch(e){n.shouldComponentUpdate=!0,n.error=e}}};return n}function c(e){var t,n,c=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},l=c.getDisplayName,f=void 0===l?function(e){return"ConnectAdvanced("+e+")"}:l,_=c.methodName,C=void 0===_?"connectAdvanced":_,w=c.renderCountProp,E=void 0===w?void 0:w,x=c.shouldHandleStateChanges,T=void 0===x||x,P=c.storeKey,O=void 0===P?"store":P,k=c.withRef,S=void 0!==k&&k,N=a(c,["getDisplayName","methodName","renderCountProp","shouldHandleStateChanges","storeKey","withRef"]),I=O+"Subscription",M=g++,R=(t={},t[O]=v.a,t[I]=v.b,t),A=(n={},n[I]=v.b,n);return function(t){d()("function"==typeof t,"You must pass a component to the function returned by connect. Instead received "+JSON.stringify(t));var n=t.displayName||t.name||"Component",a=f(n),c=y({},N,{getDisplayName:f,methodName:C,renderCountProp:E,shouldHandleStateChanges:T,storeKey:O,withRef:S,displayName:a,wrappedComponentName:n,WrappedComponent:t}),l=function(n){function l(e,t){r(this,l);var i=o(this,n.call(this,e,t));return i.version=M,i.state={},i.renderCount=0,i.store=e[O]||t[O],i.propsMode=Boolean(e[O]),i.setWrappedInstance=i.setWrappedInstance.bind(i),d()(i.store,'Could not find "'+O+'" in either the context or props of "'+a+'". Either wrap the root component in a <Provider>, or explicitly pass "'+O+'" as a prop to "'+a+'".'),i.initSelector(),i.initSubscription(),i}return i(l,n),l.prototype.getChildContext=function(){var e,t=this.propsMode?null:this.subscription;return e={},e[I]=t||this.context[I],e},l.prototype.componentDidMount=function(){T&&(this.subscription.trySubscribe(),this.selector.run(this.props),this.selector.shouldComponentUpdate&&this.forceUpdate())},l.prototype.componentWillReceiveProps=function(e){this.selector.run(e)},l.prototype.shouldComponentUpdate=function(){return this.selector.shouldComponentUpdate},l.prototype.componentWillUnmount=function(){this.subscription&&this.subscription.tryUnsubscribe(),this.subscription=null,this.notifyNestedSubs=u,this.store=null,this.selector.run=u,this.selector.shouldComponentUpdate=!1},l.prototype.getWrappedInstance=function(){return d()(S,"To access the wrapped instance, you need to specify { withRef: true } in the options argument of the "+C+"() call."),this.wrappedInstance},l.prototype.setWrappedInstance=function(e){this.wrappedInstance=e},l.prototype.initSelector=function(){var t=e(this.store.dispatch,c);this.selector=s(t,this.store),this.selector.run(this.props)},l.prototype.initSubscription=function(){if(T){var e=(this.propsMode?this.props:this.context)[I];this.subscription=new m.a(this.store,e,this.onStateChange.bind(this)),this.notifyNestedSubs=this.subscription.notifyNestedSubs.bind(this.subscription)}},l.prototype.onStateChange=function(){this.selector.run(this.props),this.selector.shouldComponentUpdate?(this.componentDidUpdate=this.notifyNestedSubsOnComponentDidUpdate,this.setState(b)):this.notifyNestedSubs()},l.prototype.notifyNestedSubsOnComponentDidUpdate=function(){this.componentDidUpdate=void 0,this.notifyNestedSubs()},l.prototype.isSubscribed=function(){return Boolean(this.subscription)&&this.subscription.isSubscribed()},l.prototype.addExtraProps=function(e){if(!S&&!E&&(!this.propsMode||!this.subscription))return e;var t=y({},e);return S&&(t.ref=this.setWrappedInstance),E&&(t[E]=this.renderCount++),this.propsMode&&this.subscription&&(t[I]=this.subscription),t},l.prototype.render=function(){var e=this.selector;if(e.shouldComponentUpdate=!1,e.error)throw e.error;return Object(h.createElement)(t,this.addExtraProps(e.props))},l}(h.Component);return l.WrappedComponent=t,l.displayName=a,l.childContextTypes=A,l.contextTypes=R,l.propTypes=R,p()(l,t)}}t.a=c;var l=n(212),p=n.n(l),f=n(213),d=n.n(f),h=n(9),m=(n.n(h),n(214)),v=n(90),y=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},g=0,b={}},function(e,t,n){"use strict";function r(e){return function(t,n){function r(){return o}var o=e(t,n);return r.dependsOnOwnProps=!1,r}}function o(e){return null!==e.dependsOnOwnProps&&void 0!==e.dependsOnOwnProps?Boolean(e.dependsOnOwnProps):1!==e.length}function i(e,t){return function(t,n){var r=(n.displayName,function(e,t){return r.dependsOnOwnProps?r.mapToProps(e,t):r.mapToProps(e)});return r.dependsOnOwnProps=!0,r.mapToProps=function(t,n){r.mapToProps=e,r.dependsOnOwnProps=o(e);var i=r(t,n);return"function"===typeof i&&(r.mapToProps=i,r.dependsOnOwnProps=o(i),i=r(t,n)),i},r}}t.a=r,t.b=i;n(93)},function(e,t,n){"use strict";n(48),n(49)},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!==typeof t&&"function"!==typeof t?e:t}function i(e,t){if("function"!==typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var a=n(9),u=n.n(a),s=n(50),c=n.n(s),l=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),p=function(e){function t(){var e,n,i,a;r(this,t);for(var u=arguments.length,s=Array(u),c=0;c<u;c++)s[c]=arguments[c];return n=i=o(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(s))),i.state={text:i.props.text||""},i.handleSubmit=function(e){var t=e.target.value.trim();13===e.which&&(i.props.onSave(t),i.props.newTodo&&i.setState({text:""}))},i.handleChange=function(e){i.setState({text:e.target.value})},i.handleBlur=function(e){i.props.newTodo||i.props.onSave(e.target.value)},a=n,o(i,a)}return i(t,e),l(t,[{key:"render",value:function(){return u.a.createElement("input",{className:c()({edit:this.props.editing,"new-todo":this.props.newTodo}),type:"text",placeholder:this.props.placeholder,autoFocus:"true",value:this.state.text,onBlur:this.handleBlur,onChange:this.handleChange,onKeyDown:this.handleSubmit})}}]),t}(a.Component);p.propTypes={onSave:a.PropTypes.func.isRequired,text:a.PropTypes.string,placeholder:a.PropTypes.string,editing:a.PropTypes.bool,newTodo:a.PropTypes.bool},t.a=p},function(e,t,n){"use strict";n.d(t,"b",function(){return r}),n.d(t,"c",function(){return o}),n.d(t,"a",function(){return i});var r="show_all",o="show_completed",i="show_active"},function(e,t,n){"use strict";n.d(t,"a",function(){return r}),n.d(t,"e",function(){return o}),n.d(t,"f",function(){return i}),n.d(t,"d",function(){return a}),n.d(t,"c",function(){return u}),n.d(t,"b",function(){return s});var r="ADD_TODO",o="DELETE_TODO",i="EDIT_TODO",a="COMPLETE_TODO",u="COMPLETE_ALL",s="CLEAR_COMPLETED"},function(e,t,n){n(98),e.exports=n(103)},function(e,t,n){"use strict";"undefined"===typeof Promise&&(n(99).enable(),window.Promise=n(101)),n(102),Object.assign=n(3)},function(e,t,n){"use strict";function r(){c=!1,u._47=null,u._71=null}function o(e){function t(t){(e.allRejections||a(p[t].error,e.whitelist||s))&&(p[t].displayId=l++,e.onUnhandled?(p[t].logged=!0,e.onUnhandled(p[t].displayId,p[t].error)):(p[t].logged=!0,i(p[t].displayId,p[t].error)))}function n(t){p[t].logged&&(e.onHandled?e.onHandled(p[t].displayId,p[t].error):p[t].onUnhandled||(console.warn("Promise Rejection Handled (id: "+p[t].displayId+"):"),console.warn('  This means you can ignore any previous messages of the form "Possible Unhandled Promise Rejection" with id '+p[t].displayId+".")))}e=e||{},c&&r(),c=!0;var o=0,l=0,p={};u._47=function(e){2===e._83&&p[e._56]&&(p[e._56].logged?n(e._56):clearTimeout(p[e._56].timeout),delete p[e._56])},u._71=function(e,n){0===e._75&&(e._56=o++,p[e._56]={displayId:null,error:n,timeout:setTimeout(t.bind(null,e._56),a(n,s)?100:2e3),logged:!1})}}function i(e,t){console.warn("Possible Unhandled Promise Rejection (id: "+e+"):"),((t&&(t.stack||t))+"").split("\n").forEach(function(e){console.warn("  "+e)})}function a(e,t){return t.some(function(t){return e instanceof t})}var u=n(51),s=[ReferenceError,TypeError,RangeError],c=!1;t.disable=r,t.enable=o},function(e,t,n){"use strict";(function(t){function n(e){a.length||(i(),u=!0),a[a.length]=e}function r(){for(;s<a.length;){var e=s;if(s+=1,a[e].call(),s>c){for(var t=0,n=a.length-s;t<n;t++)a[t]=a[t+s];a.length-=s,s=0}}a.length=0,s=0,u=!1}function o(e){return function(){function t(){clearTimeout(n),clearInterval(r),e()}var n=setTimeout(t,0),r=setInterval(t,50)}}e.exports=n;var i,a=[],u=!1,s=0,c=1024,l="undefined"!==typeof t?t:self,p=l.MutationObserver||l.WebKitMutationObserver;i="function"===typeof p?function(e){var t=1,n=new p(e),r=document.createTextNode("");return n.observe(r,{characterData:!0}),function(){t=-t,r.data=t}}(r):o(r),n.requestFlush=i,n.makeRequestCallFromTimer=o}).call(t,n(30))},function(e,t,n){"use strict";function r(e){var t=new o(o._44);return t._83=1,t._18=e,t}var o=n(51);e.exports=o;var i=r(!0),a=r(!1),u=r(null),s=r(void 0),c=r(0),l=r("");o.resolve=function(e){if(e instanceof o)return e;if(null===e)return u;if(void 0===e)return s;if(!0===e)return i;if(!1===e)return a;if(0===e)return c;if(""===e)return l;if("object"===typeof e||"function"===typeof e)try{var t=e.then;if("function"===typeof t)return new o(t.bind(e))}catch(e){return new o(function(t,n){n(e)})}return r(e)},o.all=function(e){var t=Array.prototype.slice.call(e);return new o(function(e,n){function r(a,u){if(u&&("object"===typeof u||"function"===typeof u)){if(u instanceof o&&u.then===o.prototype.then){for(;3===u._83;)u=u._18;return 1===u._83?r(a,u._18):(2===u._83&&n(u._18),void u.then(function(e){r(a,e)},n))}var s=u.then;if("function"===typeof s){return void new o(s.bind(u)).then(function(e){r(a,e)},n)}}t[a]=u,0===--i&&e(t)}if(0===t.length)return e([]);for(var i=t.length,a=0;a<t.length;a++)r(a,t[a])})},o.reject=function(e){return new o(function(t,n){n(e)})},o.race=function(e){return new o(function(t,n){e.forEach(function(e){o.resolve(e).then(t,n)})})},o.prototype.catch=function(e){return this.then(null,e)}},function(e,t){!function(e){"use strict";function t(e){if("string"!==typeof e&&(e=String(e)),/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(e))throw new TypeError("Invalid character in header field name");return e.toLowerCase()}function n(e){return"string"!==typeof e&&(e=String(e)),e}function r(e){var t={next:function(){var t=e.shift();return{done:void 0===t,value:t}}};return y.iterable&&(t[Symbol.iterator]=function(){return t}),t}function o(e){this.map={},e instanceof o?e.forEach(function(e,t){this.append(t,e)},this):Array.isArray(e)?e.forEach(function(e){this.append(e[0],e[1])},this):e&&Object.getOwnPropertyNames(e).forEach(function(t){this.append(t,e[t])},this)}function i(e){if(e.bodyUsed)return Promise.reject(new TypeError("Already read"));e.bodyUsed=!0}function a(e){return new Promise(function(t,n){e.onload=function(){t(e.result)},e.onerror=function(){n(e.error)}})}function u(e){var t=new FileReader,n=a(t);return t.readAsArrayBuffer(e),n}function s(e){var t=new FileReader,n=a(t);return t.readAsText(e),n}function c(e){for(var t=new Uint8Array(e),n=new Array(t.length),r=0;r<t.length;r++)n[r]=String.fromCharCode(t[r]);return n.join("")}function l(e){if(e.slice)return e.slice(0);var t=new Uint8Array(e.byteLength);return t.set(new Uint8Array(e)),t.buffer}function p(){return this.bodyUsed=!1,this._initBody=function(e){if(this._bodyInit=e,e)if("string"===typeof e)this._bodyText=e;else if(y.blob&&Blob.prototype.isPrototypeOf(e))this._bodyBlob=e;else if(y.formData&&FormData.prototype.isPrototypeOf(e))this._bodyFormData=e;else if(y.searchParams&&URLSearchParams.prototype.isPrototypeOf(e))this._bodyText=e.toString();else if(y.arrayBuffer&&y.blob&&b(e))this._bodyArrayBuffer=l(e.buffer),this._bodyInit=new Blob([this._bodyArrayBuffer]);else{if(!y.arrayBuffer||!ArrayBuffer.prototype.isPrototypeOf(e)&&!_(e))throw new Error("unsupported BodyInit type");this._bodyArrayBuffer=l(e)}else this._bodyText="";this.headers.get("content-type")||("string"===typeof e?this.headers.set("content-type","text/plain;charset=UTF-8"):this._bodyBlob&&this._bodyBlob.type?this.headers.set("content-type",this._bodyBlob.type):y.searchParams&&URLSearchParams.prototype.isPrototypeOf(e)&&this.headers.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"))},y.blob&&(this.blob=function(){var e=i(this);if(e)return e;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(new Blob([this._bodyArrayBuffer]));if(this._bodyFormData)throw new Error("could not read FormData body as blob");return Promise.resolve(new Blob([this._bodyText]))},this.arrayBuffer=function(){return this._bodyArrayBuffer?i(this)||Promise.resolve(this._bodyArrayBuffer):this.blob().then(u)}),this.text=function(){var e=i(this);if(e)return e;if(this._bodyBlob)return s(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(c(this._bodyArrayBuffer));if(this._bodyFormData)throw new Error("could not read FormData body as text");return Promise.resolve(this._bodyText)},y.formData&&(this.formData=function(){return this.text().then(h)}),this.json=function(){return this.text().then(JSON.parse)},this}function f(e){var t=e.toUpperCase();return C.indexOf(t)>-1?t:e}function d(e,t){t=t||{};var n=t.body;if(e instanceof d){if(e.bodyUsed)throw new TypeError("Already read");this.url=e.url,this.credentials=e.credentials,t.headers||(this.headers=new o(e.headers)),this.method=e.method,this.mode=e.mode,n||null==e._bodyInit||(n=e._bodyInit,e.bodyUsed=!0)}else this.url=String(e);if(this.credentials=t.credentials||this.credentials||"omit",!t.headers&&this.headers||(this.headers=new o(t.headers)),this.method=f(t.method||this.method||"GET"),this.mode=t.mode||this.mode||null,this.referrer=null,("GET"===this.method||"HEAD"===this.method)&&n)throw new TypeError("Body not allowed for GET or HEAD requests");this._initBody(n)}function h(e){var t=new FormData;return e.trim().split("&").forEach(function(e){if(e){var n=e.split("="),r=n.shift().replace(/\+/g," "),o=n.join("=").replace(/\+/g," ");t.append(decodeURIComponent(r),decodeURIComponent(o))}}),t}function m(e){var t=new o;return e.split(/\r?\n/).forEach(function(e){var n=e.split(":"),r=n.shift().trim();if(r){var o=n.join(":").trim();t.append(r,o)}}),t}function v(e,t){t||(t={}),this.type="default",this.status="status"in t?t.status:200,this.ok=this.status>=200&&this.status<300,this.statusText="statusText"in t?t.statusText:"OK",this.headers=new o(t.headers),this.url=t.url||"",this._initBody(e)}if(!e.fetch){var y={searchParams:"URLSearchParams"in e,iterable:"Symbol"in e&&"iterator"in Symbol,blob:"FileReader"in e&&"Blob"in e&&function(){try{return new Blob,!0}catch(e){return!1}}(),formData:"FormData"in e,arrayBuffer:"ArrayBuffer"in e};if(y.arrayBuffer)var g=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]"],b=function(e){return e&&DataView.prototype.isPrototypeOf(e)},_=ArrayBuffer.isView||function(e){return e&&g.indexOf(Object.prototype.toString.call(e))>-1};o.prototype.append=function(e,r){e=t(e),r=n(r);var o=this.map[e];this.map[e]=o?o+","+r:r},o.prototype.delete=function(e){delete this.map[t(e)]},o.prototype.get=function(e){return e=t(e),this.has(e)?this.map[e]:null},o.prototype.has=function(e){return this.map.hasOwnProperty(t(e))},o.prototype.set=function(e,r){this.map[t(e)]=n(r)},o.prototype.forEach=function(e,t){for(var n in this.map)this.map.hasOwnProperty(n)&&e.call(t,this.map[n],n,this)},o.prototype.keys=function(){var e=[];return this.forEach(function(t,n){e.push(n)}),r(e)},o.prototype.values=function(){var e=[];return this.forEach(function(t){e.push(t)}),r(e)},o.prototype.entries=function(){var e=[];return this.forEach(function(t,n){e.push([n,t])}),r(e)},y.iterable&&(o.prototype[Symbol.iterator]=o.prototype.entries);var C=["DELETE","GET","HEAD","OPTIONS","POST","PUT"];d.prototype.clone=function(){return new d(this,{body:this._bodyInit})},p.call(d.prototype),p.call(v.prototype),v.prototype.clone=function(){return new v(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new o(this.headers),url:this.url})},v.error=function(){var e=new v(null,{status:0,statusText:""});return e.type="error",e};var w=[301,302,303,307,308];v.redirect=function(e,t){if(-1===w.indexOf(t))throw new RangeError("Invalid status code");return new v(null,{status:t,headers:{location:e}})},e.Headers=o,e.Request=d,e.Response=v,e.fetch=function(e,t){return new Promise(function(n,r){var o=new d(e,t),i=new XMLHttpRequest;i.onload=function(){var e={status:i.status,statusText:i.statusText,headers:m(i.getAllResponseHeaders()||"")};e.url="responseURL"in i?i.responseURL:e.headers.get("X-Request-URL");var t="response"in i?i.response:i.responseText;n(new v(t,e))},i.onerror=function(){r(new TypeError("Network request failed"))},i.ontimeout=function(){r(new TypeError("Network request failed"))},i.open(o.method,o.url,!0),"include"===o.credentials&&(i.withCredentials=!0),"responseType"in i&&y.blob&&(i.responseType="blob"),o.headers.forEach(function(e,t){i.setRequestHeader(t,e)}),i.send("undefined"===typeof o._bodyInit?null:o._bodyInit)})},e.fetch.polyfill=!0}}("undefined"!==typeof self?self:this)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(9),o=n.n(r),i=n(118),a=(n.n(i),n(29)),u=n(88),s=n(222),c=n(228),l=n(230),p=(n.n(l),Object(a.c)(c.a));Object(i.render)(o.a.createElement(u.a,{store:p},o.a.createElement(s.a,null)),document.getElementById("root"))},function(e,t,n){"use strict";var r=function(){};e.exports=r},function(e,t,n){"use strict";function r(e){return(""+e).replace(_,"$&/")}function o(e,t){this.func=e,this.context=t,this.count=0}function i(e,t,n){var r=e.func,o=e.context;r.call(o,t,e.count++)}function a(e,t,n){if(null==e)return e;var r=o.getPooled(t,n);y(e,i,r),o.release(r)}function u(e,t,n,r){this.result=e,this.keyPrefix=t,this.func=n,this.context=r,this.count=0}function s(e,t,n){var o=e.result,i=e.keyPrefix,a=e.func,u=e.context,s=a.call(u,t,e.count++);Array.isArray(s)?c(s,o,n,v.thatReturnsArgument):null!=s&&(m.isValidElement(s)&&(s=m.cloneAndReplaceKey(s,i+(!s.key||t&&t.key===s.key?"":r(s.key)+"/")+n)),o.push(s))}function c(e,t,n,o,i){var a="";null!=n&&(a=r(n)+"/");var c=u.getPooled(t,a,o,i);y(e,s,c),u.release(c)}function l(e,t,n){if(null==e)return e;var r=[];return c(e,r,null,t,n),r}function p(e,t,n){return null}function f(e,t){return y(e,p,null)}function d(e){var t=[];return c(e,t,null,v.thatReturnsArgument),t}var h=n(106),m=n(14),v=n(6),y=n(107),g=h.twoArgumentPooler,b=h.fourArgumentPooler,_=/\/+/g;o.prototype.destructor=function(){this.func=null,this.context=null,this.count=0},h.addPoolingTo(o,g),u.prototype.destructor=function(){this.result=null,this.keyPrefix=null,this.func=null,this.context=null,this.count=0},h.addPoolingTo(u,b);var C={forEach:a,map:l,mapIntoWithKeyPrefixInternal:c,count:f,toArray:d};e.exports=C},function(e,t,n){"use strict";var r=n(18),o=(n(0),function(e){var t=this;if(t.instancePool.length){var n=t.instancePool.pop();return t.call(n,e),n}return new t(e)}),i=function(e,t){var n=this;if(n.instancePool.length){var r=n.instancePool.pop();return n.call(r,e,t),r}return new n(e,t)},a=function(e,t,n){var r=this;if(r.instancePool.length){var o=r.instancePool.pop();return r.call(o,e,t,n),o}return new r(e,t,n)},u=function(e,t,n,r){var o=this;if(o.instancePool.length){var i=o.instancePool.pop();return o.call(i,e,t,n,r),i}return new o(e,t,n,r)},s=function(e){var t=this;e instanceof t||r("25"),e.destructor(),t.instancePool.length<t.poolSize&&t.instancePool.push(e)},c=o,l=function(e,t){var n=e;return n.instancePool=[],n.getPooled=t||c,n.poolSize||(n.poolSize=10),n.release=s,n},p={addPoolingTo:l,oneArgumentPooler:o,twoArgumentPooler:i,threeArgumentPooler:a,fourArgumentPooler:u};e.exports=p},function(e,t,n){"use strict";function r(e,t){return e&&"object"===typeof e&&null!=e.key?c.escape(e.key):t.toString(36)}function o(e,t,n,i){var f=typeof e;if("undefined"!==f&&"boolean"!==f||(e=null),null===e||"string"===f||"number"===f||"object"===f&&e.$$typeof===u)return n(i,e,""===t?l+r(e,0):t),1;var d,h,m=0,v=""===t?l:t+p;if(Array.isArray(e))for(var y=0;y<e.length;y++)d=e[y],h=v+r(d,y),m+=o(d,h,n,i);else{var g=s(e);if(g){var b,_=g.call(e);if(g!==e.entries)for(var C=0;!(b=_.next()).done;)d=b.value,h=v+r(d,C++),m+=o(d,h,n,i);else for(;!(b=_.next()).done;){var w=b.value;w&&(d=w[1],h=v+c.escape(w[0])+p+r(d,0),m+=o(d,h,n,i))}}else if("object"===f){var E="",x=String(e);a("31","[object Object]"===x?"object with keys {"+Object.keys(e).join(", ")+"}":x,E)}}return m}function i(e,t,n){return null==e?0:o(e,"",t,n)}var a=n(18),u=(n(10),n(55)),s=n(108),c=(n(0),n(109)),l=(n(1),"."),p=":";e.exports=i},function(e,t,n){"use strict";function r(e){var t=e&&(o&&e[o]||e[i]);if("function"===typeof t)return t}var o="function"===typeof Symbol&&Symbol.iterator,i="@@iterator";e.exports=r},function(e,t,n){"use strict";function r(e){var t={"=":"=0",":":"=2"};return"$"+(""+e).replace(/[=:]/g,function(e){return t[e]})}function o(e){var t=/(=0|=2)/g,n={"=0":"=","=2":":"};return(""+("."===e[0]&&"$"===e[1]?e.substring(2):e.substring(1))).replace(t,function(e){return n[e]})}var i={escape:r,unescape:o};e.exports=i},function(e,t,n){"use strict";var r=n(14),o=r.createFactory,i={a:o("a"),abbr:o("abbr"),address:o("address"),area:o("area"),article:o("article"),aside:o("aside"),audio:o("audio"),b:o("b"),base:o("base"),bdi:o("bdi"),bdo:o("bdo"),big:o("big"),blockquote:o("blockquote"),body:o("body"),br:o("br"),button:o("button"),canvas:o("canvas"),caption:o("caption"),cite:o("cite"),code:o("code"),col:o("col"),colgroup:o("colgroup"),data:o("data"),datalist:o("datalist"),dd:o("dd"),del:o("del"),details:o("details"),dfn:o("dfn"),dialog:o("dialog"),div:o("div"),dl:o("dl"),dt:o("dt"),em:o("em"),embed:o("embed"),fieldset:o("fieldset"),figcaption:o("figcaption"),figure:o("figure"),footer:o("footer"),form:o("form"),h1:o("h1"),h2:o("h2"),h3:o("h3"),h4:o("h4"),h5:o("h5"),h6:o("h6"),head:o("head"),header:o("header"),hgroup:o("hgroup"),hr:o("hr"),html:o("html"),i:o("i"),iframe:o("iframe"),img:o("img"),input:o("input"),ins:o("ins"),kbd:o("kbd"),keygen:o("keygen"),label:o("label"),legend:o("legend"),li:o("li"),link:o("link"),main:o("main"),map:o("map"),mark:o("mark"),menu:o("menu"),menuitem:o("menuitem"),meta:o("meta"),meter:o("meter"),nav:o("nav"),noscript:o("noscript"),object:o("object"),ol:o("ol"),optgroup:o("optgroup"),option:o("option"),output:o("output"),p:o("p"),param:o("param"),picture:o("picture"),pre:o("pre"),progress:o("progress"),q:o("q"),rp:o("rp"),rt:o("rt"),ruby:o("ruby"),s:o("s"),samp:o("samp"),script:o("script"),section:o("section"),select:o("select"),small:o("small"),source:o("source"),span:o("span"),strong:o("strong"),style:o("style"),sub:o("sub"),summary:o("summary"),sup:o("sup"),table:o("table"),tbody:o("tbody"),td:o("td"),textarea:o("textarea"),tfoot:o("tfoot"),th:o("th"),thead:o("thead"),time:o("time"),title:o("title"),tr:o("tr"),track:o("track"),u:o("u"),ul:o("ul"),var:o("var"),video:o("video"),wbr:o("wbr"),circle:o("circle"),clipPath:o("clipPath"),defs:o("defs"),ellipse:o("ellipse"),g:o("g"),image:o("image"),line:o("line"),linearGradient:o("linearGradient"),mask:o("mask"),path:o("path"),pattern:o("pattern"),polygon:o("polygon"),polyline:o("polyline"),radialGradient:o("radialGradient"),rect:o("rect"),stop:o("stop"),svg:o("svg"),text:o("text"),tspan:o("tspan")};e.exports=i},function(e,t,n){"use strict";var r=n(14),o=r.isValidElement,i=n(56);e.exports=i(o)},function(e,t,n){"use strict";var r=n(6),o=n(0),i=n(1),a=n(57),u=n(113);e.exports=function(e,t){function n(e){var t=e&&(x&&e[x]||e[T]);if("function"===typeof t)return t}function s(e,t){return e===t?0!==e||1/e===1/t:e!==e&&t!==t}function c(e){this.message=e,this.stack=""}function l(e){function n(n,r,i,u,s,l,p){if(u=u||P,l=l||i,p!==a)if(t)o(!1,"Calling PropTypes validators directly is not supported by the `prop-types` package. Use `PropTypes.checkPropTypes()` to call them. Read more at http://fb.me/use-check-prop-types");else;return null==r[i]?n?new c(null===r[i]?"The "+s+" `"+l+"` is marked as required in `"+u+"`, but its value is `null`.":"The "+s+" `"+l+"` is marked as required in `"+u+"`, but its value is `undefined`."):null:e(r,i,u,s,l)}var r=n.bind(null,!1);return r.isRequired=n.bind(null,!0),r}function p(e){function t(t,n,r,o,i,a){var u=t[n];if(_(u)!==e)return new c("Invalid "+o+" `"+i+"` of type `"+C(u)+"` supplied to `"+r+"`, expected `"+e+"`.");return null}return l(t)}function f(e){function t(t,n,r,o,i){if("function"!==typeof e)return new c("Property `"+i+"` of component `"+r+"` has invalid PropType notation inside arrayOf.");var u=t[n];if(!Array.isArray(u)){return new c("Invalid "+o+" `"+i+"` of type `"+_(u)+"` supplied to `"+r+"`, expected an array.")}for(var s=0;s<u.length;s++){var l=e(u,s,r,o,i+"["+s+"]",a);if(l instanceof Error)return l}return null}return l(t)}function d(e){function t(t,n,r,o,i){if(!(t[n]instanceof e)){var a=e.name||P;return new c("Invalid "+o+" `"+i+"` of type `"+E(t[n])+"` supplied to `"+r+"`, expected instance of `"+a+"`.")}return null}return l(t)}function h(e){function t(t,n,r,o,i){for(var a=t[n],u=0;u<e.length;u++)if(s(a,e[u]))return null;return new c("Invalid "+o+" `"+i+"` of value `"+a+"` supplied to `"+r+"`, expected one of "+JSON.stringify(e)+".")}return Array.isArray(e)?l(t):r.thatReturnsNull}function m(e){function t(t,n,r,o,i){if("function"!==typeof e)return new c("Property `"+i+"` of component `"+r+"` has invalid PropType notation inside objectOf.");var u=t[n],s=_(u);if("object"!==s)return new c("Invalid "+o+" `"+i+"` of type `"+s+"` supplied to `"+r+"`, expected an object.");for(var l in u)if(u.hasOwnProperty(l)){var p=e(u,l,r,o,i+"."+l,a);if(p instanceof Error)return p}return null}return l(t)}function v(e){function t(t,n,r,o,i){for(var u=0;u<e.length;u++){if(null==(0,e[u])(t,n,r,o,i,a))return null}return new c("Invalid "+o+" `"+i+"` supplied to `"+r+"`.")}if(!Array.isArray(e))return r.thatReturnsNull;for(var n=0;n<e.length;n++){var o=e[n];if("function"!==typeof o)return i(!1,"Invalid argument supplid to oneOfType. Expected an array of check functions, but received %s at index %s.",w(o),n),r.thatReturnsNull}return l(t)}function y(e){function t(t,n,r,o,i){var u=t[n],s=_(u);if("object"!==s)return new c("Invalid "+o+" `"+i+"` of type `"+s+"` supplied to `"+r+"`, expected `object`.");for(var l in e){var p=e[l];if(p){var f=p(u,l,r,o,i+"."+l,a);if(f)return f}}return null}return l(t)}function g(t){switch(typeof t){case"number":case"string":case"undefined":return!0;case"boolean":return!t;case"object":if(Array.isArray(t))return t.every(g);if(null===t||e(t))return!0;var r=n(t);if(!r)return!1;var o,i=r.call(t);if(r!==t.entries){for(;!(o=i.next()).done;)if(!g(o.value))return!1}else for(;!(o=i.next()).done;){var a=o.value;if(a&&!g(a[1]))return!1}return!0;default:return!1}}function b(e,t){return"symbol"===e||("Symbol"===t["@@toStringTag"]||"function"===typeof Symbol&&t instanceof Symbol)}function _(e){var t=typeof e;return Array.isArray(e)?"array":e instanceof RegExp?"object":b(t,e)?"symbol":t}function C(e){if("undefined"===typeof e||null===e)return""+e;var t=_(e);if("object"===t){if(e instanceof Date)return"date";if(e instanceof RegExp)return"regexp"}return t}function w(e){var t=C(e);switch(t){case"array":case"object":return"an "+t;case"boolean":case"date":case"regexp":return"a "+t;default:return t}}function E(e){return e.constructor&&e.constructor.name?e.constructor.name:P}var x="function"===typeof Symbol&&Symbol.iterator,T="@@iterator",P="<<anonymous>>",O={array:p("array"),bool:p("boolean"),func:p("function"),number:p("number"),object:p("object"),string:p("string"),symbol:p("symbol"),any:function(){return l(r.thatReturnsNull)}(),arrayOf:f,element:function(){function t(t,n,r,o,i){var a=t[n];if(!e(a)){return new c("Invalid "+o+" `"+i+"` of type `"+_(a)+"` supplied to `"+r+"`, expected a single ReactElement.")}return null}return l(t)}(),instanceOf:d,node:function(){function e(e,t,n,r,o){return g(e[t])?null:new c("Invalid "+r+" `"+o+"` supplied to `"+n+"`, expected a ReactNode.")}return l(e)}(),objectOf:m,oneOf:h,oneOfType:v,shape:y};return c.prototype=Error.prototype,O.checkPropTypes=u,O.PropTypes=O,O}},function(e,t,n){"use strict";function r(e,t,n,r,o){}e.exports=r},function(e,t,n){"use strict";e.exports="15.6.1"},function(e,t,n){"use strict";var r=n(52),o=r.Component,i=n(14),a=i.isValidElement,u=n(53),s=n(116);e.exports=s(o,a,u)},function(e,t,n){"use strict";function r(e){return e}function o(e,t,n){function o(e,t){var n=g.hasOwnProperty(t)?g[t]:null;w.hasOwnProperty(t)&&u("OVERRIDE_BASE"===n,"ReactClassInterface: You are attempting to override `%s` from your class specification. Ensure that your method names do not overlap with React methods.",t),e&&u("DEFINE_MANY"===n||"DEFINE_MANY_MERGED"===n,"ReactClassInterface: You are attempting to define `%s` on your component more than once. This conflict may be due to a mixin.",t)}function c(e,n){if(n){u("function"!==typeof n,"ReactClass: You're attempting to use a component class or function as a mixin. Instead, just use a regular object."),u(!t(n),"ReactClass: You're attempting to use a component as a mixin. Instead, just use a regular object.");var r=e.prototype,i=r.__reactAutoBindPairs;n.hasOwnProperty(s)&&b.mixins(e,n.mixins);for(var a in n)if(n.hasOwnProperty(a)&&a!==s){var c=n[a],l=r.hasOwnProperty(a);if(o(l,a),b.hasOwnProperty(a))b[a](e,c);else{var p=g.hasOwnProperty(a),h="function"===typeof c,m=h&&!p&&!l&&!1!==n.autobind;if(m)i.push(a,c),r[a]=c;else if(l){var v=g[a];u(p&&("DEFINE_MANY_MERGED"===v||"DEFINE_MANY"===v),"ReactClass: Unexpected spec policy %s for key %s when mixing in component specs.",v,a),"DEFINE_MANY_MERGED"===v?r[a]=f(r[a],c):"DEFINE_MANY"===v&&(r[a]=d(r[a],c))}else r[a]=c}}}else;}function l(e,t){if(t)for(var n in t){var r=t[n];if(t.hasOwnProperty(n)){var o=n in b;u(!o,'ReactClass: You are attempting to define a reserved property, `%s`, that shouldn\'t be on the "statics" key. Define it as an instance property instead; it will still be accessible on the constructor.',n);var i=n in e;u(!i,"ReactClass: You are attempting to define `%s` on your component more than once. This conflict may be due to a mixin.",n),e[n]=r}}}function p(e,t){u(e&&t&&"object"===typeof e&&"object"===typeof t,"mergeIntoWithNoDuplicateKeys(): Cannot merge non-objects.");for(var n in t)t.hasOwnProperty(n)&&(u(void 0===e[n],"mergeIntoWithNoDuplicateKeys(): Tried to merge two objects with the same key: `%s`. This conflict may be due to a mixin; in particular, this may be caused by two getInitialState() or getDefaultProps() methods returning objects with clashing keys.",n),e[n]=t[n]);return e}function f(e,t){return function(){var n=e.apply(this,arguments),r=t.apply(this,arguments);if(null==n)return r;if(null==r)return n;var o={};return p(o,n),p(o,r),o}}function d(e,t){return function(){e.apply(this,arguments),t.apply(this,arguments)}}function h(e,t){var n=t.bind(e);return n}function m(e){for(var t=e.__reactAutoBindPairs,n=0;n<t.length;n+=2){var r=t[n],o=t[n+1];e[r]=h(e,o)}}function v(e){var t=r(function(e,r,o){this.__reactAutoBindPairs.length&&m(this),this.props=e,this.context=r,this.refs=a,this.updater=o||n,this.state=null;var i=this.getInitialState?this.getInitialState():null;u("object"===typeof i&&!Array.isArray(i),"%s.getInitialState(): must return an object or null",t.displayName||"ReactCompositeComponent"),this.state=i});t.prototype=new E,t.prototype.constructor=t,t.prototype.__reactAutoBindPairs=[],y.forEach(c.bind(null,t)),c(t,_),c(t,e),c(t,C),t.getDefaultProps&&(t.defaultProps=t.getDefaultProps()),u(t.prototype.render,"createClass(...): Class specification must implement a `render` method.");for(var o in g)t.prototype[o]||(t.prototype[o]=null);return t}var y=[],g={mixins:"DEFINE_MANY",statics:"DEFINE_MANY",propTypes:"DEFINE_MANY",contextTypes:"DEFINE_MANY",childContextTypes:"DEFINE_MANY",getDefaultProps:"DEFINE_MANY_MERGED",getInitialState:"DEFINE_MANY_MERGED",getChildContext:"DEFINE_MANY_MERGED",render:"DEFINE_ONCE",componentWillMount:"DEFINE_MANY",componentDidMount:"DEFINE_MANY",componentWillReceiveProps:"DEFINE_MANY",shouldComponentUpdate:"DEFINE_ONCE",componentWillUpdate:"DEFINE_MANY",componentDidUpdate:"DEFINE_MANY",componentWillUnmount:"DEFINE_MANY",updateComponent:"OVERRIDE_BASE"},b={displayName:function(e,t){e.displayName=t},mixins:function(e,t){if(t)for(var n=0;n<t.length;n++)c(e,t[n])},childContextTypes:function(e,t){e.childContextTypes=i({},e.childContextTypes,t)},contextTypes:function(e,t){e.contextTypes=i({},e.contextTypes,t)},getDefaultProps:function(e,t){e.getDefaultProps?e.getDefaultProps=f(e.getDefaultProps,t):e.getDefaultProps=t},propTypes:function(e,t){e.propTypes=i({},e.propTypes,t)},statics:function(e,t){l(e,t)},autobind:function(){}},_={componentDidMount:function(){this.__isMounted=!0}},C={componentWillUnmount:function(){this.__isMounted=!1}},w={replaceState:function(e,t){this.updater.enqueueReplaceState(this,e,t)},isMounted:function(){return!!this.__isMounted}},E=function(){};return i(E.prototype,e.prototype,w),v}var i=n(3),a=n(23),u=n(0),s="mixins";e.exports=o},function(e,t,n){"use strict";function r(e){return i.isValidElement(e)||o("143"),e}var o=n(18),i=n(14);n(0);e.exports=r},function(e,t,n){"use strict";e.exports=n(119)},function(e,t,n){"use strict";var r=n(4),o=n(120),i=n(82),a=n(16),u=n(8),s=n(192),c=n(193),l=n(83),p=n(194);n(1);o.inject();var f={findDOMNode:c,render:i.render,unmountComponentAtNode:i.unmountComponentAtNode,version:s,unstable_batchedUpdates:u.batchedUpdates,unstable_renderSubtreeIntoContainer:p};"undefined"!==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"===typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.inject&&__REACT_DEVTOOLS_GLOBAL_HOOK__.inject({ComponentTree:{getClosestInstanceFromNode:r.getClosestInstanceFromNode,getNodeFromInstance:function(e){return e._renderedComponent&&(e=l(e)),e?r.getNodeFromInstance(e):null}},Mount:i,Reconciler:a});e.exports=f},function(e,t,n){"use strict";function r(){E||(E=!0,g.EventEmitter.injectReactEventListener(y),g.EventPluginHub.injectEventPluginOrder(u),g.EventPluginUtils.injectComponentTree(f),g.EventPluginUtils.injectTreeTraversal(h),g.EventPluginHub.injectEventPluginsByName({SimpleEventPlugin:w,EnterLeaveEventPlugin:s,ChangeEventPlugin:a,SelectEventPlugin:C,BeforeInputEventPlugin:i}),g.HostComponent.injectGenericComponentClass(p),g.HostComponent.injectTextComponentClass(m),g.DOMProperty.injectDOMPropertyConfig(o),g.DOMProperty.injectDOMPropertyConfig(c),g.DOMProperty.injectDOMPropertyConfig(_),g.EmptyComponent.injectEmptyComponentFactory(function(e){return new d(e)}),g.Updates.injectReconcileTransaction(b),g.Updates.injectBatchingStrategy(v),g.Component.injectEnvironment(l))}var o=n(121),i=n(122),a=n(126),u=n(129),s=n(130),c=n(131),l=n(132),p=n(138),f=n(4),d=n(163),h=n(164),m=n(165),v=n(166),y=n(167),g=n(169),b=n(170),_=n(176),C=n(177),w=n(178),E=!1;e.exports={inject:r}},function(e,t,n){"use strict";var r={Properties:{"aria-current":0,"aria-details":0,"aria-disabled":0,"aria-hidden":0,"aria-invalid":0,"aria-keyshortcuts":0,"aria-label":0,"aria-roledescription":0,"aria-autocomplete":0,"aria-checked":0,"aria-expanded":0,"aria-haspopup":0,"aria-level":0,"aria-modal":0,"aria-multiline":0,"aria-multiselectable":0,"aria-orientation":0,"aria-placeholder":0,"aria-pressed":0,"aria-readonly":0,"aria-required":0,"aria-selected":0,"aria-sort":0,"aria-valuemax":0,"aria-valuemin":0,"aria-valuenow":0,"aria-valuetext":0,"aria-atomic":0,"aria-busy":0,"aria-live":0,"aria-relevant":0,"aria-dropeffect":0,"aria-grabbed":0,"aria-activedescendant":0,"aria-colcount":0,"aria-colindex":0,"aria-colspan":0,"aria-controls":0,"aria-describedby":0,"aria-errormessage":0,"aria-flowto":0,"aria-labelledby":0,"aria-owns":0,"aria-posinset":0,"aria-rowcount":0,"aria-rowindex":0,"aria-rowspan":0,"aria-setsize":0},DOMAttributeNames:{},DOMPropertyNames:{}};e.exports=r},function(e,t,n){"use strict";function r(e){return(e.ctrlKey||e.altKey||e.metaKey)&&!(e.ctrlKey&&e.altKey)}function o(e){switch(e){case"topCompositionStart":return T.compositionStart;case"topCompositionEnd":return T.compositionEnd;case"topCompositionUpdate":return T.compositionUpdate}}function i(e,t){return"topKeyDown"===e&&t.keyCode===g}function a(e,t){switch(e){case"topKeyUp":return-1!==y.indexOf(t.keyCode);case"topKeyDown":return t.keyCode!==g;case"topKeyPress":case"topMouseDown":case"topBlur":return!0;default:return!1}}function u(e){var t=e.detail;return"object"===typeof t&&"data"in t?t.data:null}function s(e,t,n,r){var s,c;if(b?s=o(e):O?a(e,n)&&(s=T.compositionEnd):i(e,n)&&(s=T.compositionStart),!s)return null;w&&(O||s!==T.compositionStart?s===T.compositionEnd&&O&&(c=O.getData()):O=h.getPooled(r));var l=m.getPooled(s,t,n,r);if(c)l.data=c;else{var p=u(n);null!==p&&(l.data=p)}return f.accumulateTwoPhaseDispatches(l),l}function c(e,t){switch(e){case"topCompositionEnd":return u(t);case"topKeyPress":return t.which!==E?null:(P=!0,x);case"topTextInput":var n=t.data;return n===x&&P?null:n;default:return null}}function l(e,t){if(O){if("topCompositionEnd"===e||!b&&a(e,t)){var n=O.getData();return h.release(O),O=null,n}return null}switch(e){case"topPaste":return null;case"topKeyPress":return t.which&&!r(t)?String.fromCharCode(t.which):null;case"topCompositionEnd":return w?null:t.data;default:return null}}function p(e,t,n,r){var o;if(!(o=C?c(e,n):l(e,n)))return null;var i=v.getPooled(T.beforeInput,t,n,r);return i.data=o,f.accumulateTwoPhaseDispatches(i),i}var f=n(19),d=n(5),h=n(123),m=n(124),v=n(125),y=[9,13,27,32],g=229,b=d.canUseDOM&&"CompositionEvent"in window,_=null;d.canUseDOM&&"documentMode"in document&&(_=document.documentMode);var C=d.canUseDOM&&"TextEvent"in window&&!_&&!function(){var e=window.opera;return"object"===typeof e&&"function"===typeof e.version&&parseInt(e.version(),10)<=12}(),w=d.canUseDOM&&(!b||_&&_>8&&_<=11),E=32,x=String.fromCharCode(E),T={beforeInput:{phasedRegistrationNames:{bubbled:"onBeforeInput",captured:"onBeforeInputCapture"},dependencies:["topCompositionEnd","topKeyPress","topTextInput","topPaste"]},compositionEnd:{phasedRegistrationNames:{bubbled:"onCompositionEnd",captured:"onCompositionEndCapture"},dependencies:["topBlur","topCompositionEnd","topKeyDown","topKeyPress","topKeyUp","topMouseDown"]},compositionStart:{phasedRegistrationNames:{bubbled:"onCompositionStart",captured:"onCompositionStartCapture"},dependencies:["topBlur","topCompositionStart","topKeyDown","topKeyPress","topKeyUp","topMouseDown"]},compositionUpdate:{phasedRegistrationNames:{bubbled:"onCompositionUpdate",captured:"onCompositionUpdateCapture"},dependencies:["topBlur","topCompositionUpdate","topKeyDown","topKeyPress","topKeyUp","topMouseDown"]}},P=!1,O=null,k={eventTypes:T,extractEvents:function(e,t,n,r){return[s(e,t,n,r),p(e,t,n,r)]}};e.exports=k},function(e,t,n){"use strict";function r(e){this._root=e,this._startText=this.getText(),this._fallbackText=null}var o=n(3),i=n(12),a=n(61);o(r.prototype,{destructor:function(){this._root=null,this._startText=null,this._fallbackText=null},getText:function(){return"value"in this._root?this._root.value:this._root[a()]},getData:function(){if(this._fallbackText)return this._fallbackText;var e,t,n=this._startText,r=n.length,o=this.getText(),i=o.length;for(e=0;e<r&&n[e]===o[e];e++);var a=r-e;for(t=1;t<=a&&n[r-t]===o[i-t];t++);var u=t>1?1-t:void 0;return this._fallbackText=o.slice(e,u),this._fallbackText}}),i.addPoolingTo(r),e.exports=r},function(e,t,n){"use strict";function r(e,t,n,r){return o.call(this,e,t,n,r)}var o=n(11),i={data:null};o.augmentClass(r,i),e.exports=r},function(e,t,n){"use strict";function r(e,t,n,r){return o.call(this,e,t,n,r)}var o=n(11),i={data:null};o.augmentClass(r,i),e.exports=r},function(e,t,n){"use strict";function r(e,t,n){var r=P.getPooled(I.change,e,t,n);return r.type="change",w.accumulateTwoPhaseDispatches(r),r}function o(e){var t=e.nodeName&&e.nodeName.toLowerCase();return"select"===t||"input"===t&&"file"===e.type}function i(e){var t=r(R,e,k(e));T.batchedUpdates(a,t)}function a(e){C.enqueueEvents(e),C.processEventQueue(!1)}function u(e,t){M=e,R=t,M.attachEvent("onchange",i)}function s(){M&&(M.detachEvent("onchange",i),M=null,R=null)}function c(e,t){var n=O.updateValueIfChanged(e),r=!0===t.simulated&&j._allowSimulatedPassThrough;if(n||r)return e}function l(e,t){if("topChange"===e)return t}function p(e,t,n){"topFocus"===e?(s(),u(t,n)):"topBlur"===e&&s()}function f(e,t){M=e,R=t,M.attachEvent("onpropertychange",h)}function d(){M&&(M.detachEvent("onpropertychange",h),M=null,R=null)}function h(e){"value"===e.propertyName&&c(R,e)&&i(e)}function m(e,t,n){"topFocus"===e?(d(),f(t,n)):"topBlur"===e&&d()}function v(e,t,n){if("topSelectionChange"===e||"topKeyUp"===e||"topKeyDown"===e)return c(R,n)}function y(e){var t=e.nodeName;return t&&"input"===t.toLowerCase()&&("checkbox"===e.type||"radio"===e.type)}function g(e,t,n){if("topClick"===e)return c(t,n)}function b(e,t,n){if("topInput"===e||"topChange"===e)return c(t,n)}function _(e,t){if(null!=e){var n=e._wrapperState||t._wrapperState;if(n&&n.controlled&&"number"===t.type){var r=""+t.value;t.getAttribute("value")!==r&&t.setAttribute("value",r)}}}var C=n(20),w=n(19),E=n(5),x=n(4),T=n(8),P=n(11),O=n(64),k=n(34),S=n(35),N=n(65),I={change:{phasedRegistrationNames:{bubbled:"onChange",captured:"onChangeCapture"},dependencies:["topBlur","topChange","topClick","topFocus","topInput","topKeyDown","topKeyUp","topSelectionChange"]}},M=null,R=null,A=!1;E.canUseDOM&&(A=S("change")&&(!document.documentMode||document.documentMode>8));var D=!1;E.canUseDOM&&(D=S("input")&&(!("documentMode"in document)||document.documentMode>9));var j={eventTypes:I,_allowSimulatedPassThrough:!0,_isInputEventSupported:D,extractEvents:function(e,t,n,i){var a,u,s=t?x.getNodeFromInstance(t):window;if(o(s)?A?a=l:u=p:N(s)?D?a=b:(a=v,u=m):y(s)&&(a=g),a){var c=a(e,t,n);if(c){return r(c,n,i)}}u&&u(e,s,t),"topBlur"===e&&_(t,s)}};e.exports=j},function(e,t,n){"use strict";function r(e,t,n){"function"===typeof e?e(t.getPublicInstance()):i.addComponentAsRefTo(t,e,n)}function o(e,t,n){"function"===typeof e?e(null):i.removeComponentAsRefFrom(t,e,n)}var i=n(128),a={};a.attachRefs=function(e,t){if(null!==t&&"object"===typeof t){var n=t.ref;null!=n&&r(n,e,t._owner)}},a.shouldUpdateRefs=function(e,t){var n=null,r=null;null!==e&&"object"===typeof e&&(n=e.ref,r=e._owner);var o=null,i=null;return null!==t&&"object"===typeof t&&(o=t.ref,i=t._owner),n!==o||"string"===typeof o&&i!==r},a.detachRefs=function(e,t){if(null!==t&&"object"===typeof t){var n=t.ref;null!=n&&o(n,e,t._owner)}},e.exports=a},function(e,t,n){"use strict";function r(e){return!(!e||"function"!==typeof e.attachRef||"function"!==typeof e.detachRef)}var o=n(2),i=(n(0),{addComponentAsRefTo:function(e,t,n){r(n)||o("119"),n.attachRef(t,e)},removeComponentAsRefFrom:function(e,t,n){r(n)||o("120");var i=n.getPublicInstance();i&&i.refs[t]===e.getPublicInstance()&&n.detachRef(t)}});e.exports=i},function(e,t,n){"use strict";var r=["ResponderEventPlugin","SimpleEventPlugin","TapEventPlugin","EnterLeaveEventPlugin","ChangeEventPlugin","SelectEventPlugin","BeforeInputEventPlugin"];e.exports=r},function(e,t,n){"use strict";var r=n(19),o=n(4),i=n(25),a={mouseEnter:{registrationName:"onMouseEnter",dependencies:["topMouseOut","topMouseOver"]},mouseLeave:{registrationName:"onMouseLeave",dependencies:["topMouseOut","topMouseOver"]}},u={eventTypes:a,extractEvents:function(e,t,n,u){if("topMouseOver"===e&&(n.relatedTarget||n.fromElement))return null;if("topMouseOut"!==e&&"topMouseOver"!==e)return null;var s;if(u.window===u)s=u;else{var c=u.ownerDocument;s=c?c.defaultView||c.parentWindow:window}var l,p;if("topMouseOut"===e){l=t;var f=n.relatedTarget||n.toElement;p=f?o.getClosestInstanceFromNode(f):null}else l=null,p=t;if(l===p)return null;var d=null==l?s:o.getNodeFromInstance(l),h=null==p?s:o.getNodeFromInstance(p),m=i.getPooled(a.mouseLeave,l,n,u);m.type="mouseleave",m.target=d,m.relatedTarget=h;var v=i.getPooled(a.mouseEnter,p,n,u);return v.type="mouseenter",v.target=h,v.relatedTarget=d,r.accumulateEnterLeaveDispatches(m,v,l,p),[m,v]}};e.exports=u},function(e,t,n){"use strict";var r=n(15),o=r.injection.MUST_USE_PROPERTY,i=r.injection.HAS_BOOLEAN_VALUE,a=r.injection.HAS_NUMERIC_VALUE,u=r.injection.HAS_POSITIVE_NUMERIC_VALUE,s=r.injection.HAS_OVERLOADED_BOOLEAN_VALUE,c={isCustomAttribute:RegExp.prototype.test.bind(new RegExp("^(data|aria)-["+r.ATTRIBUTE_NAME_CHAR+"]*$")),Properties:{accept:0,acceptCharset:0,accessKey:0,action:0,allowFullScreen:i,allowTransparency:0,alt:0,as:0,async:i,autoComplete:0,autoPlay:i,capture:i,cellPadding:0,cellSpacing:0,charSet:0,challenge:0,checked:o|i,cite:0,classID:0,className:0,cols:u,colSpan:0,content:0,contentEditable:0,contextMenu:0,controls:i,coords:0,crossOrigin:0,data:0,dateTime:0,default:i,defer:i,dir:0,disabled:i,download:s,draggable:0,encType:0,form:0,formAction:0,formEncType:0,formMethod:0,formNoValidate:i,formTarget:0,frameBorder:0,headers:0,height:0,hidden:i,high:0,href:0,hrefLang:0,htmlFor:0,httpEquiv:0,icon:0,id:0,inputMode:0,integrity:0,is:0,keyParams:0,keyType:0,kind:0,label:0,lang:0,list:0,loop:i,low:0,manifest:0,marginHeight:0,marginWidth:0,max:0,maxLength:0,media:0,mediaGroup:0,method:0,min:0,minLength:0,multiple:o|i,muted:o|i,name:0,nonce:0,noValidate:i,open:i,optimum:0,pattern:0,placeholder:0,playsInline:i,poster:0,preload:0,profile:0,radioGroup:0,readOnly:i,referrerPolicy:0,rel:0,required:i,reversed:i,role:0,rows:u,rowSpan:a,sandbox:0,scope:0,scoped:i,scrolling:0,seamless:i,selected:o|i,shape:0,size:u,sizes:0,span:u,spellCheck:0,src:0,srcDoc:0,srcLang:0,srcSet:0,start:a,step:0,style:0,summary:0,tabIndex:0,target:0,title:0,type:0,useMap:0,value:0,width:0,wmode:0,wrap:0,about:0,datatype:0,inlist:0,prefix:0,property:0,resource:0,typeof:0,vocab:0,autoCapitalize:0,autoCorrect:0,autoSave:0,color:0,itemProp:0,itemScope:i,itemType:0,itemID:0,itemRef:0,results:0,security:0,unselectable:0},DOMAttributeNames:{acceptCharset:"accept-charset",className:"class",htmlFor:"for",httpEquiv:"http-equiv"},DOMPropertyNames:{},DOMMutationMethods:{value:function(e,t){if(null==t)return e.removeAttribute("value");"number"!==e.type||!1===e.hasAttribute("value")?e.setAttribute("value",""+t):e.validity&&!e.validity.badInput&&e.ownerDocument.activeElement!==e&&e.setAttribute("value",""+t)}}};e.exports=c},function(e,t,n){"use strict";var r=n(37),o=n(137),i={processChildrenUpdates:o.dangerouslyProcessChildrenUpdates,replaceNodeWithMarkup:r.dangerouslyReplaceNodeWithMarkup};e.exports=i},function(e,t,n){"use strict";var r=n(2),o=n(17),i=n(5),a=n(134),u=n(6),s=(n(0),{dangerouslyReplaceNodeWithMarkup:function(e,t){if(i.canUseDOM||r("56"),t||r("57"),"HTML"===e.nodeName&&r("58"),"string"===typeof t){var n=a(t,u)[0];e.parentNode.replaceChild(n,e)}else o.replaceChildWithTree(e,t)}});e.exports=s},function(e,t,n){"use strict";function r(e){var t=e.match(l);return t&&t[1].toLowerCase()}function o(e,t){var n=c;c||s(!1);var o=r(e),i=o&&u(o);if(i){n.innerHTML=i[1]+e+i[2];for(var l=i[0];l--;)n=n.lastChild}else n.innerHTML=e;var p=n.getElementsByTagName("script");p.length&&(t||s(!1),a(p).forEach(t));for(var f=Array.from(n.childNodes);n.lastChild;)n.removeChild(n.lastChild);return f}var i=n(5),a=n(135),u=n(136),s=n(0),c=i.canUseDOM?document.createElement("div"):null,l=/^\s*<(\w+)/;e.exports=o},function(e,t,n){"use strict";function r(e){var t=e.length;if((Array.isArray(e)||"object"!==typeof e&&"function"!==typeof e)&&a(!1),"number"!==typeof t&&a(!1),0===t||t-1 in e||a(!1),"function"===typeof e.callee&&a(!1),e.hasOwnProperty)try{return Array.prototype.slice.call(e)}catch(e){}for(var n=Array(t),r=0;r<t;r++)n[r]=e[r];return n}function o(e){return!!e&&("object"==typeof e||"function"==typeof e)&&"length"in e&&!("setInterval"in e)&&"number"!=typeof e.nodeType&&(Array.isArray(e)||"callee"in e||"item"in e)}function i(e){return o(e)?Array.isArray(e)?e.slice():r(e):[e]}var a=n(0);e.exports=i},function(e,t,n){"use strict";function r(e){return a||i(!1),f.hasOwnProperty(e)||(e="*"),u.hasOwnProperty(e)||(a.innerHTML="*"===e?"<link />":"<"+e+"></"+e+">",u[e]=!a.firstChild),u[e]?f[e]:null}var o=n(5),i=n(0),a=o.canUseDOM?document.createElement("div"):null,u={},s=[1,'<select multiple="true">',"</select>"],c=[1,"<table>","</table>"],l=[3,"<table><tbody><tr>","</tr></tbody></table>"],p=[1,'<svg xmlns="http://www.w3.org/2000/svg">',"</svg>"],f={"*":[1,"?<div>","</div>"],area:[1,"<map>","</map>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],legend:[1,"<fieldset>","</fieldset>"],param:[1,"<object>","</object>"],tr:[2,"<table><tbody>","</tbody></table>"],optgroup:s,option:s,caption:c,colgroup:c,tbody:c,tfoot:c,thead:c,td:l,th:l};["circle","clipPath","defs","ellipse","g","image","line","linearGradient","mask","path","pattern","polygon","polyline","radialGradient","rect","stop","text","tspan"].forEach(function(e){f[e]=p,u[e]=!0}),e.exports=r},function(e,t,n){"use strict";var r=n(37),o=n(4),i={dangerouslyProcessChildrenUpdates:function(e,t){var n=o.getNodeFromInstance(e);r.processUpdates(n,t)}};e.exports=i},function(e,t,n){"use strict";function r(e){if(e){var t=e._currentElement._owner||null;if(t){var n=t.getName();if(n)return" This DOM node was rendered by `"+n+"`."}}return""}function o(e,t){t&&(X[e._tag]&&(null!=t.children||null!=t.dangerouslySetInnerHTML)&&v("137",e._tag,e._currentElement._owner?" Check the render method of "+e._currentElement._owner.getName()+".":""),null!=t.dangerouslySetInnerHTML&&(null!=t.children&&v("60"),"object"===typeof t.dangerouslySetInnerHTML&&W in t.dangerouslySetInnerHTML||v("61")),null!=t.style&&"object"!==typeof t.style&&v("62",r(e)))}function i(e,t,n,r){if(!(r instanceof A)){var o=e._hostContainerInfo,i=o._node&&o._node.nodeType===K,u=i?o._node:o._ownerDocument;B(t,u),r.getReactMountReady().enqueue(a,{inst:e,registrationName:t,listener:n})}}function a(){var e=this;x.putListener(e.inst,e.registrationName,e.listener)}function u(){var e=this;S.postMountWrapper(e)}function s(){var e=this;M.postMountWrapper(e)}function c(){var e=this;N.postMountWrapper(e)}function l(){j.track(this)}function p(){var e=this;e._rootNodeID||v("63");var t=F(e);switch(t||v("64"),e._tag){case"iframe":case"object":e._wrapperState.listeners=[P.trapBubbledEvent("topLoad","load",t)];break;case"video":case"audio":e._wrapperState.listeners=[];for(var n in Y)Y.hasOwnProperty(n)&&e._wrapperState.listeners.push(P.trapBubbledEvent(n,Y[n],t));break;case"source":e._wrapperState.listeners=[P.trapBubbledEvent("topError","error",t)];break;case"img":e._wrapperState.listeners=[P.trapBubbledEvent("topError","error",t),P.trapBubbledEvent("topLoad","load",t)];break;case"form":e._wrapperState.listeners=[P.trapBubbledEvent("topReset","reset",t),P.trapBubbledEvent("topSubmit","submit",t)];break;case"input":case"select":case"textarea":e._wrapperState.listeners=[P.trapBubbledEvent("topInvalid","invalid",t)]}}function f(){I.postUpdateWrapper(this)}function d(e){Z.call($,e)||(Q.test(e)||v("65",e),$[e]=!0)}function h(e,t){return e.indexOf("-")>=0||null!=t.is}function m(e){var t=e.type;d(t),this._currentElement=e,this._tag=t.toLowerCase(),this._namespaceURI=null,this._renderedChildren=null,this._previousStyle=null,this._previousStyleCopy=null,this._hostNode=null,this._hostParent=null,this._rootNodeID=0,this._domID=0,this._hostContainerInfo=null,this._wrapperState=null,this._topLevelWrapper=null,this._flags=0}var v=n(2),y=n(3),g=n(139),b=n(140),_=n(17),C=n(38),w=n(15),E=n(70),x=n(20),T=n(31),P=n(28),O=n(58),k=n(4),S=n(150),N=n(152),I=n(71),M=n(153),R=(n(7),n(154)),A=n(161),D=(n(6),n(27)),j=(n(0),n(35),n(42),n(64)),U=(n(46),n(1),O),L=x.deleteListener,F=k.getNodeFromInstance,B=P.listenTo,V=T.registrationNameModules,q={string:!0,number:!0},W="__html",H={children:null,dangerouslySetInnerHTML:null,suppressContentEditableWarning:null},K=11,Y={topAbort:"abort",topCanPlay:"canplay",topCanPlayThrough:"canplaythrough",topDurationChange:"durationchange",topEmptied:"emptied",topEncrypted:"encrypted",topEnded:"ended",topError:"error",topLoadedData:"loadeddata",topLoadedMetadata:"loadedmetadata",topLoadStart:"loadstart",topPause:"pause",topPlay:"play",topPlaying:"playing",topProgress:"progress",topRateChange:"ratechange",topSeeked:"seeked",topSeeking:"seeking",topStalled:"stalled",topSuspend:"suspend",topTimeUpdate:"timeupdate",topVolumeChange:"volumechange",topWaiting:"waiting"},z={area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0},G={listing:!0,pre:!0,textarea:!0},X=y({menuitem:!0},z),Q=/^[a-zA-Z][a-zA-Z:_\.\-\d]*$/,$={},Z={}.hasOwnProperty,J=1;m.displayName="ReactDOMComponent",m.Mixin={mountComponent:function(e,t,n,r){this._rootNodeID=J++,this._domID=n._idCounter++,this._hostParent=t,this._hostContainerInfo=n;var i=this._currentElement.props;switch(this._tag){case"audio":case"form":case"iframe":case"img":case"link":case"object":case"source":case"video":this._wrapperState={listeners:null},e.getReactMountReady().enqueue(p,this);break;case"input":S.mountWrapper(this,i,t),i=S.getHostProps(this,i),e.getReactMountReady().enqueue(l,this),e.getReactMountReady().enqueue(p,this);break;case"option":N.mountWrapper(this,i,t),i=N.getHostProps(this,i);break;case"select":I.mountWrapper(this,i,t),i=I.getHostProps(this,i),e.getReactMountReady().enqueue(p,this);break;case"textarea":M.mountWrapper(this,i,t),i=M.getHostProps(this,i),e.getReactMountReady().enqueue(l,this),e.getReactMountReady().enqueue(p,this)}o(this,i);var a,f;null!=t?(a=t._namespaceURI,f=t._tag):n._tag&&(a=n._namespaceURI,f=n._tag),(null==a||a===C.svg&&"foreignobject"===f)&&(a=C.html),a===C.html&&("svg"===this._tag?a=C.svg:"math"===this._tag&&(a=C.mathml)),this._namespaceURI=a;var d;if(e.useCreateElement){var h,m=n._ownerDocument;if(a===C.html)if("script"===this._tag){var v=m.createElement("div"),y=this._currentElement.type;v.innerHTML="<"+y+"></"+y+">",h=v.removeChild(v.firstChild)}else h=i.is?m.createElement(this._currentElement.type,i.is):m.createElement(this._currentElement.type);else h=m.createElementNS(a,this._currentElement.type);k.precacheNode(this,h),this._flags|=U.hasCachedChildNodes,this._hostParent||E.setAttributeForRoot(h),this._updateDOMProperties(null,i,e);var b=_(h);this._createInitialChildren(e,i,r,b),d=b}else{var w=this._createOpenTagMarkupAndPutListeners(e,i),x=this._createContentMarkup(e,i,r);d=!x&&z[this._tag]?w+"/>":w+">"+x+"</"+this._currentElement.type+">"}switch(this._tag){case"input":e.getReactMountReady().enqueue(u,this),i.autoFocus&&e.getReactMountReady().enqueue(g.focusDOMComponent,this);break;case"textarea":e.getReactMountReady().enqueue(s,this),i.autoFocus&&e.getReactMountReady().enqueue(g.focusDOMComponent,this);break;case"select":case"button":i.autoFocus&&e.getReactMountReady().enqueue(g.focusDOMComponent,this);break;case"option":e.getReactMountReady().enqueue(c,this)}return d},_createOpenTagMarkupAndPutListeners:function(e,t){var n="<"+this._currentElement.type;for(var r in t)if(t.hasOwnProperty(r)){var o=t[r];if(null!=o)if(V.hasOwnProperty(r))o&&i(this,r,o,e);else{"style"===r&&(o&&(o=this._previousStyleCopy=y({},t.style)),o=b.createMarkupForStyles(o,this));var a=null;null!=this._tag&&h(this._tag,t)?H.hasOwnProperty(r)||(a=E.createMarkupForCustomAttribute(r,o)):a=E.createMarkupForProperty(r,o),a&&(n+=" "+a)}}return e.renderToStaticMarkup?n:(this._hostParent||(n+=" "+E.createMarkupForRoot()),n+=" "+E.createMarkupForID(this._domID))},_createContentMarkup:function(e,t,n){var r="",o=t.dangerouslySetInnerHTML;if(null!=o)null!=o.__html&&(r=o.__html);else{var i=q[typeof t.children]?t.children:null,a=null!=i?null:t.children;if(null!=i)r=D(i);else if(null!=a){var u=this.mountChildren(a,e,n);r=u.join("")}}return G[this._tag]&&"\n"===r.charAt(0)?"\n"+r:r},_createInitialChildren:function(e,t,n,r){var o=t.dangerouslySetInnerHTML;if(null!=o)null!=o.__html&&_.queueHTML(r,o.__html);else{var i=q[typeof t.children]?t.children:null,a=null!=i?null:t.children;if(null!=i)""!==i&&_.queueText(r,i);else if(null!=a)for(var u=this.mountChildren(a,e,n),s=0;s<u.length;s++)_.queueChild(r,u[s])}},receiveComponent:function(e,t,n){var r=this._currentElement;this._currentElement=e,this.updateComponent(t,r,e,n)},updateComponent:function(e,t,n,r){var i=t.props,a=this._currentElement.props;switch(this._tag){case"input":i=S.getHostProps(this,i),a=S.getHostProps(this,a);break;case"option":i=N.getHostProps(this,i),a=N.getHostProps(this,a);break;case"select":i=I.getHostProps(this,i),a=I.getHostProps(this,a);break;case"textarea":i=M.getHostProps(this,i),a=M.getHostProps(this,a)}switch(o(this,a),this._updateDOMProperties(i,a,e),this._updateDOMChildren(i,a,e,r),this._tag){case"input":S.updateWrapper(this);break;case"textarea":M.updateWrapper(this);break;case"select":e.getReactMountReady().enqueue(f,this)}},_updateDOMProperties:function(e,t,n){var r,o,a;for(r in e)if(!t.hasOwnProperty(r)&&e.hasOwnProperty(r)&&null!=e[r])if("style"===r){var u=this._previousStyleCopy;for(o in u)u.hasOwnProperty(o)&&(a=a||{},a[o]="");this._previousStyleCopy=null}else V.hasOwnProperty(r)?e[r]&&L(this,r):h(this._tag,e)?H.hasOwnProperty(r)||E.deleteValueForAttribute(F(this),r):(w.properties[r]||w.isCustomAttribute(r))&&E.deleteValueForProperty(F(this),r);for(r in t){var s=t[r],c="style"===r?this._previousStyleCopy:null!=e?e[r]:void 0;if(t.hasOwnProperty(r)&&s!==c&&(null!=s||null!=c))if("style"===r)if(s?s=this._previousStyleCopy=y({},s):this._previousStyleCopy=null,c){for(o in c)!c.hasOwnProperty(o)||s&&s.hasOwnProperty(o)||(a=a||{},a[o]="");for(o in s)s.hasOwnProperty(o)&&c[o]!==s[o]&&(a=a||{},a[o]=s[o])}else a=s;else if(V.hasOwnProperty(r))s?i(this,r,s,n):c&&L(this,r);else if(h(this._tag,t))H.hasOwnProperty(r)||E.setValueForAttribute(F(this),r,s);else if(w.properties[r]||w.isCustomAttribute(r)){var l=F(this);null!=s?E.setValueForProperty(l,r,s):E.deleteValueForProperty(l,r)}}a&&b.setValueForStyles(F(this),a,this)},_updateDOMChildren:function(e,t,n,r){var o=q[typeof e.children]?e.children:null,i=q[typeof t.children]?t.children:null,a=e.dangerouslySetInnerHTML&&e.dangerouslySetInnerHTML.__html,u=t.dangerouslySetInnerHTML&&t.dangerouslySetInnerHTML.__html,s=null!=o?null:e.children,c=null!=i?null:t.children,l=null!=o||null!=a,p=null!=i||null!=u;null!=s&&null==c?this.updateChildren(null,n,r):l&&!p&&this.updateTextContent(""),null!=i?o!==i&&this.updateTextContent(""+i):null!=u?a!==u&&this.updateMarkup(""+u):null!=c&&this.updateChildren(c,n,r)},getHostNode:function(){return F(this)},unmountComponent:function(e){switch(this._tag){case"audio":case"form":case"iframe":case"img":case"link":case"object":case"source":case"video":var t=this._wrapperState.listeners;if(t)for(var n=0;n<t.length;n++)t[n].remove();break;case"input":case"textarea":j.stopTracking(this);break;case"html":case"head":case"body":v("66",this._tag)}this.unmountChildren(e),k.uncacheNode(this),x.deleteAllListeners(this),this._rootNodeID=0,this._domID=0,this._wrapperState=null},getPublicInstance:function(){return F(this)}},y(m.prototype,m.Mixin,R.Mixin),e.exports=m},function(e,t,n){"use strict";var r=n(4),o=n(68),i={focusDOMComponent:function(){o(r.getNodeFromInstance(this))}};e.exports=i},function(e,t,n){"use strict";var r=n(69),o=n(5),i=(n(7),n(141),n(143)),a=n(144),u=n(146),s=(n(1),u(function(e){return a(e)})),c=!1,l="cssFloat";if(o.canUseDOM){var p=document.createElement("div").style;try{p.font=""}catch(e){c=!0}void 0===document.documentElement.style.cssFloat&&(l="styleFloat")}var f={createMarkupForStyles:function(e,t){var n="";for(var r in e)if(e.hasOwnProperty(r)){var o=0===r.indexOf("--"),a=e[r];null!=a&&(n+=s(r)+":",n+=i(r,a,t,o)+";")}return n||null},setValueForStyles:function(e,t,n){var o=e.style;for(var a in t)if(t.hasOwnProperty(a)){var u=0===a.indexOf("--"),s=i(a,t[a],n,u);if("float"!==a&&"cssFloat"!==a||(a=l),u)o.setProperty(a,s);else if(s)o[a]=s;else{var p=c&&r.shorthandPropertyExpansions[a];if(p)for(var f in p)o[f]="";else o[a]=""}}}};e.exports=f},function(e,t,n){"use strict";function r(e){return o(e.replace(i,"ms-"))}var o=n(142),i=/^-ms-/;e.exports=r},function(e,t,n){"use strict";function r(e){return e.replace(o,function(e,t){return t.toUpperCase()})}var o=/-(.)/g;e.exports=r},function(e,t,n){"use strict";function r(e,t,n,r){if(null==t||"boolean"===typeof t||""===t)return"";var o=isNaN(t);if(r||o||0===t||i.hasOwnProperty(e)&&i[e])return""+t;if("string"===typeof t){t=t.trim()}return t+"px"}var o=n(69),i=(n(1),o.isUnitlessNumber);e.exports=r},function(e,t,n){"use strict";function r(e){return o(e).replace(i,"-ms-")}var o=n(145),i=/^ms-/;e.exports=r},function(e,t,n){"use strict";function r(e){return e.replace(o,"-$1").toLowerCase()}var o=/([A-Z])/g;e.exports=r},function(e,t,n){"use strict";function r(e){var t={};return function(n){return t.hasOwnProperty(n)||(t[n]=e.call(this,n)),t[n]}}e.exports=r},function(e,t,n){"use strict";function r(e){return'"'+o(e)+'"'}var o=n(27);e.exports=r},function(e,t,n){"use strict";function r(e){o.enqueueEvents(e),o.processEventQueue(!1)}var o=n(20),i={handleTopLevel:function(e,t,n,i){r(o.extractEvents(e,t,n,i))}};e.exports=i},function(e,t,n){"use strict";function r(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n["ms"+e]="MS"+t,n["O"+e]="o"+t.toLowerCase(),n}function o(e){if(u[e])return u[e];if(!a[e])return e;var t=a[e];for(var n in t)if(t.hasOwnProperty(n)&&n in s)return u[e]=t[n];return""}var i=n(5),a={animationend:r("Animation","AnimationEnd"),animationiteration:r("Animation","AnimationIteration"),animationstart:r("Animation","AnimationStart"),transitionend:r("Transition","TransitionEnd")},u={},s={};i.canUseDOM&&(s=document.createElement("div").style,"AnimationEvent"in window||(delete a.animationend.animation,delete a.animationiteration.animation,delete a.animationstart.animation),"TransitionEvent"in window||delete a.transitionend.transition),e.exports=o},function(e,t,n){"use strict";function r(){this._rootNodeID&&f.updateWrapper(this)}function o(e){return"checkbox"===e.type||"radio"===e.type?null!=e.checked:null!=e.value}function i(e){var t=this._currentElement.props,n=c.executeOnChange(t,e);p.asap(r,this);var o=t.name;if("radio"===t.type&&null!=o){for(var i=l.getNodeFromInstance(this),u=i;u.parentNode;)u=u.parentNode;for(var s=u.querySelectorAll("input[name="+JSON.stringify(""+o)+'][type="radio"]'),f=0;f<s.length;f++){var d=s[f];if(d!==i&&d.form===i.form){var h=l.getInstanceFromNode(d);h||a("90"),p.asap(r,h)}}}return n}var a=n(2),u=n(3),s=n(70),c=n(40),l=n(4),p=n(8),f=(n(0),n(1),{getHostProps:function(e,t){var n=c.getValue(t),r=c.getChecked(t);return u({type:void 0,step:void 0,min:void 0,max:void 0},t,{defaultChecked:void 0,defaultValue:void 0,value:null!=n?n:e._wrapperState.initialValue,checked:null!=r?r:e._wrapperState.initialChecked,onChange:e._wrapperState.onChange})},mountWrapper:function(e,t){var n=t.defaultValue;e._wrapperState={initialChecked:null!=t.checked?t.checked:t.defaultChecked,initialValue:null!=t.value?t.value:n,listeners:null,onChange:i.bind(e),controlled:o(t)}},updateWrapper:function(e){var t=e._currentElement.props,n=t.checked;null!=n&&s.setValueForProperty(l.getNodeFromInstance(e),"checked",n||!1);var r=l.getNodeFromInstance(e),o=c.getValue(t);if(null!=o)if(0===o&&""===r.value)r.value="0";else if("number"===t.type){var i=parseFloat(r.value,10)||0;(o!=i||o==i&&r.value!=o)&&(r.value=""+o)}else r.value!==""+o&&(r.value=""+o);else null==t.value&&null!=t.defaultValue&&r.defaultValue!==""+t.defaultValue&&(r.defaultValue=""+t.defaultValue),null==t.checked&&null!=t.defaultChecked&&(r.defaultChecked=!!t.defaultChecked)},postMountWrapper:function(e){var t=e._currentElement.props,n=l.getNodeFromInstance(e);switch(t.type){case"submit":case"reset":break;case"color":case"date":case"datetime":case"datetime-local":case"month":case"time":case"week":n.value="",n.value=n.defaultValue;break;default:n.value=n.value}var r=n.name;""!==r&&(n.name=""),n.defaultChecked=!n.defaultChecked,n.defaultChecked=!n.defaultChecked,""!==r&&(n.name=r)}});e.exports=f},function(e,t,n){"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},function(e,t,n){"use strict";function r(e){var t="";return i.Children.forEach(e,function(e){null!=e&&("string"===typeof e||"number"===typeof e?t+=e:s||(s=!0))}),t}var o=n(3),i=n(13),a=n(4),u=n(71),s=(n(1),!1),c={mountWrapper:function(e,t,n){var o=null;if(null!=n){var i=n;"optgroup"===i._tag&&(i=i._hostParent),null!=i&&"select"===i._tag&&(o=u.getSelectValueContext(i))}var a=null;if(null!=o){var s;if(s=null!=t.value?t.value+"":r(t.children),a=!1,Array.isArray(o)){for(var c=0;c<o.length;c++)if(""+o[c]===s){a=!0;break}}else a=""+o===s}e._wrapperState={selected:a}},postMountWrapper:function(e){var t=e._currentElement.props;if(null!=t.value){a.getNodeFromInstance(e).setAttribute("value",t.value)}},getHostProps:function(e,t){var n=o({selected:void 0,children:void 0},t);null!=e._wrapperState.selected&&(n.selected=e._wrapperState.selected);var i=r(t.children);return i&&(n.children=i),n}};e.exports=c},function(e,t,n){"use strict";function r(){this._rootNodeID&&l.updateWrapper(this)}function o(e){var t=this._currentElement.props,n=u.executeOnChange(t,e);return c.asap(r,this),n}var i=n(2),a=n(3),u=n(40),s=n(4),c=n(8),l=(n(0),n(1),{getHostProps:function(e,t){return null!=t.dangerouslySetInnerHTML&&i("91"),a({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue,onChange:e._wrapperState.onChange})},mountWrapper:function(e,t){var n=u.getValue(t),r=n;if(null==n){var a=t.defaultValue,s=t.children;null!=s&&(null!=a&&i("92"),Array.isArray(s)&&(s.length<=1||i("93"),s=s[0]),a=""+s),null==a&&(a=""),r=a}e._wrapperState={initialValue:""+r,listeners:null,onChange:o.bind(e)}},updateWrapper:function(e){var t=e._currentElement.props,n=s.getNodeFromInstance(e),r=u.getValue(t);if(null!=r){var o=""+r;o!==n.value&&(n.value=o),null==t.defaultValue&&(n.defaultValue=o)}null!=t.defaultValue&&(n.defaultValue=t.defaultValue)},postMountWrapper:function(e){var t=s.getNodeFromInstance(e),n=t.textContent;n===e._wrapperState.initialValue&&(t.value=n)}});e.exports=l},function(e,t,n){"use strict";function r(e,t,n){return{type:"INSERT_MARKUP",content:e,fromIndex:null,fromNode:null,toIndex:n,afterNode:t}}function o(e,t,n){return{type:"MOVE_EXISTING",content:null,fromIndex:e._mountIndex,fromNode:f.getHostNode(e),toIndex:n,afterNode:t}}function i(e,t){return{type:"REMOVE_NODE",content:null,fromIndex:e._mountIndex,fromNode:t,toIndex:null,afterNode:null}}function a(e){return{type:"SET_MARKUP",content:e,fromIndex:null,fromNode:null,toIndex:null,afterNode:null}}function u(e){return{type:"TEXT_CONTENT",content:e,fromIndex:null,fromNode:null,toIndex:null,afterNode:null}}function s(e,t){return t&&(e=e||[],e.push(t)),e}function c(e,t){p.processChildrenUpdates(e,t)}var l=n(2),p=n(41),f=(n(22),n(7),n(10),n(16)),d=n(155),h=(n(6),n(160)),m=(n(0),{Mixin:{_reconcilerInstantiateChildren:function(e,t,n){return d.instantiateChildren(e,t,n)},_reconcilerUpdateChildren:function(e,t,n,r,o,i){var a,u=0;return a=h(t,u),d.updateChildren(e,a,n,r,o,this,this._hostContainerInfo,i,u),a},mountChildren:function(e,t,n){var r=this._reconcilerInstantiateChildren(e,t,n);this._renderedChildren=r;var o=[],i=0;for(var a in r)if(r.hasOwnProperty(a)){var u=r[a],s=0,c=f.mountComponent(u,t,this,this._hostContainerInfo,n,s);u._mountIndex=i++,o.push(c)}return o},updateTextContent:function(e){var t=this._renderedChildren;d.unmountChildren(t,!1);for(var n in t)t.hasOwnProperty(n)&&l("118");c(this,[u(e)])},updateMarkup:function(e){var t=this._renderedChildren;d.unmountChildren(t,!1);for(var n in t)t.hasOwnProperty(n)&&l("118");c(this,[a(e)])},updateChildren:function(e,t,n){this._updateChildren(e,t,n)},_updateChildren:function(e,t,n){var r=this._renderedChildren,o={},i=[],a=this._reconcilerUpdateChildren(r,e,i,o,t,n);if(a||r){var u,l=null,p=0,d=0,h=0,m=null;for(u in a)if(a.hasOwnProperty(u)){var v=r&&r[u],y=a[u];v===y?(l=s(l,this.moveChild(v,m,p,d)),d=Math.max(v._mountIndex,d),v._mountIndex=p):(v&&(d=Math.max(v._mountIndex,d)),l=s(l,this._mountChildAtIndex(y,i[h],m,p,t,n)),h++),p++,m=f.getHostNode(y)}for(u in o)o.hasOwnProperty(u)&&(l=s(l,this._unmountChild(r[u],o[u])));l&&c(this,l),this._renderedChildren=a}},unmountChildren:function(e){var t=this._renderedChildren;d.unmountChildren(t,e),this._renderedChildren=null},moveChild:function(e,t,n,r){if(e._mountIndex<r)return o(e,t,n)},createChild:function(e,t,n){return r(n,t,e._mountIndex)},removeChild:function(e,t){return i(e,t)},_mountChildAtIndex:function(e,t,n,r,o,i){return e._mountIndex=r,this.createChild(e,n,t)},_unmountChild:function(e,t){var n=this.removeChild(e,t);return e._mountIndex=null,n}}});e.exports=m},function(e,t,n){"use strict";(function(t){function r(e,t,n,r){var o=void 0===e[n];null!=t&&o&&(e[n]=i(t,!0))}var o=n(16),i=n(73),a=(n(44),n(43)),u=n(77);n(1);"undefined"!==typeof t&&Object({NODE_ENV:"production",PUBLIC_URL:"."});var s={instantiateChildren:function(e,t,n,o){if(null==e)return null;var i={};return u(e,r,i),i},updateChildren:function(e,t,n,r,u,s,c,l,p){if(t||e){var f,d;for(f in t)if(t.hasOwnProperty(f)){d=e&&e[f];var h=d&&d._currentElement,m=t[f];if(null!=d&&a(h,m))o.receiveComponent(d,m,u,l),t[f]=d;else{d&&(r[f]=o.getHostNode(d),o.unmountComponent(d,!1));var v=i(m,!0);t[f]=v;var y=o.mountComponent(v,u,s,c,l,p);n.push(y)}}for(f in e)!e.hasOwnProperty(f)||t&&t.hasOwnProperty(f)||(d=e[f],r[f]=o.getHostNode(d),o.unmountComponent(d,!1))}},unmountChildren:function(e,t){for(var n in e)if(e.hasOwnProperty(n)){var r=e[n];o.unmountComponent(r,t)}}};e.exports=s}).call(t,n(72))},function(e,t,n){"use strict";function r(e){}function o(e){return!(!e.prototype||!e.prototype.isReactComponent)}function i(e){return!(!e.prototype||!e.prototype.isPureReactComponent)}var a=n(2),u=n(3),s=n(13),c=n(41),l=n(10),p=n(33),f=n(22),d=(n(7),n(74)),h=n(16),m=n(23),v=(n(0),n(42)),y=n(43),g=(n(1),{ImpureClass:0,PureClass:1,StatelessFunctional:2});r.prototype.render=function(){var e=f.get(this)._currentElement.type,t=e(this.props,this.context,this.updater);return t};var b=1,_={construct:function(e){this._currentElement=e,this._rootNodeID=0,this._compositeType=null,this._instance=null,this._hostParent=null,this._hostContainerInfo=null,this._updateBatchNumber=null,this._pendingElement=null,this._pendingStateQueue=null,this._pendingReplaceState=!1,this._pendingForceUpdate=!1,this._renderedNodeType=null,this._renderedComponent=null,this._context=null,this._mountOrder=0,this._topLevelWrapper=null,this._pendingCallbacks=null,this._calledComponentWillUnmount=!1},mountComponent:function(e,t,n,u){this._context=u,this._mountOrder=b++,this._hostParent=t,this._hostContainerInfo=n;var c,l=this._currentElement.props,p=this._processContext(u),d=this._currentElement.type,h=e.getUpdateQueue(),v=o(d),y=this._constructComponent(v,l,p,h);v||null!=y&&null!=y.render?i(d)?this._compositeType=g.PureClass:this._compositeType=g.ImpureClass:(c=y,null===y||!1===y||s.isValidElement(y)||a("105",d.displayName||d.name||"Component"),y=new r(d),this._compositeType=g.StatelessFunctional);y.props=l,y.context=p,y.refs=m,y.updater=h,this._instance=y,f.set(y,this);var _=y.state;void 0===_&&(y.state=_=null),("object"!==typeof _||Array.isArray(_))&&a("106",this.getName()||"ReactCompositeComponent"),this._pendingStateQueue=null,this._pendingReplaceState=!1,this._pendingForceUpdate=!1;var C;return C=y.unstable_handleError?this.performInitialMountWithErrorHandling(c,t,n,e,u):this.performInitialMount(c,t,n,e,u),y.componentDidMount&&e.getReactMountReady().enqueue(y.componentDidMount,y),C},_constructComponent:function(e,t,n,r){return this._constructComponentWithoutOwner(e,t,n,r)},_constructComponentWithoutOwner:function(e,t,n,r){var o=this._currentElement.type;return e?new o(t,n,r):o(t,n,r)},performInitialMountWithErrorHandling:function(e,t,n,r,o){var i,a=r.checkpoint();try{i=this.performInitialMount(e,t,n,r,o)}catch(u){r.rollback(a),this._instance.unstable_handleError(u),this._pendingStateQueue&&(this._instance.state=this._processPendingState(this._instance.props,this._instance.context)),a=r.checkpoint(),this._renderedComponent.unmountComponent(!0),r.rollback(a),i=this.performInitialMount(e,t,n,r,o)}return i},performInitialMount:function(e,t,n,r,o){var i=this._instance,a=0;i.componentWillMount&&(i.componentWillMount(),this._pendingStateQueue&&(i.state=this._processPendingState(i.props,i.context))),void 0===e&&(e=this._renderValidatedComponent());var u=d.getType(e);this._renderedNodeType=u;var s=this._instantiateReactComponent(e,u!==d.EMPTY);this._renderedComponent=s;var c=h.mountComponent(s,r,t,n,this._processChildContext(o),a);return c},getHostNode:function(){return h.getHostNode(this._renderedComponent)},unmountComponent:function(e){if(this._renderedComponent){var t=this._instance;if(t.componentWillUnmount&&!t._calledComponentWillUnmount)if(t._calledComponentWillUnmount=!0,e){var n=this.getName()+".componentWillUnmount()";p.invokeGuardedCallback(n,t.componentWillUnmount.bind(t))}else t.componentWillUnmount();this._renderedComponent&&(h.unmountComponent(this._renderedComponent,e),this._renderedNodeType=null,this._renderedComponent=null,this._instance=null),this._pendingStateQueue=null,this._pendingReplaceState=!1,this._pendingForceUpdate=!1,this._pendingCallbacks=null,this._pendingElement=null,this._context=null,this._rootNodeID=0,this._topLevelWrapper=null,f.remove(t)}},_maskContext:function(e){var t=this._currentElement.type,n=t.contextTypes;if(!n)return m;var r={};for(var o in n)r[o]=e[o];return r},_processContext:function(e){var t=this._maskContext(e);return t},_processChildContext:function(e){var t,n=this._currentElement.type,r=this._instance;if(r.getChildContext&&(t=r.getChildContext()),t){"object"!==typeof n.childContextTypes&&a("107",this.getName()||"ReactCompositeComponent");for(var o in t)o in n.childContextTypes||a("108",this.getName()||"ReactCompositeComponent",o);return u({},e,t)}return e},_checkContextTypes:function(e,t,n){},receiveComponent:function(e,t,n){var r=this._currentElement,o=this._context;this._pendingElement=null,this.updateComponent(t,r,e,o,n)},performUpdateIfNecessary:function(e){null!=this._pendingElement?h.receiveComponent(this,this._pendingElement,e,this._context):null!==this._pendingStateQueue||this._pendingForceUpdate?this.updateComponent(e,this._currentElement,this._currentElement,this._context,this._context):this._updateBatchNumber=null},updateComponent:function(e,t,n,r,o){var i=this._instance;null==i&&a("136",this.getName()||"ReactCompositeComponent");var u,s=!1;this._context===o?u=i.context:(u=this._processContext(o),s=!0);var c=t.props,l=n.props;t!==n&&(s=!0),s&&i.componentWillReceiveProps&&i.componentWillReceiveProps(l,u);var p=this._processPendingState(l,u),f=!0;this._pendingForceUpdate||(i.shouldComponentUpdate?f=i.shouldComponentUpdate(l,p,u):this._compositeType===g.PureClass&&(f=!v(c,l)||!v(i.state,p))),this._updateBatchNumber=null,f?(this._pendingForceUpdate=!1,this._performComponentUpdate(n,l,p,u,e,o)):(this._currentElement=n,this._context=o,i.props=l,i.state=p,i.context=u)},_processPendingState:function(e,t){var n=this._instance,r=this._pendingStateQueue,o=this._pendingReplaceState;if(this._pendingReplaceState=!1,this._pendingStateQueue=null,!r)return n.state;if(o&&1===r.length)return r[0];for(var i=u({},o?r[0]:n.state),a=o?1:0;a<r.length;a++){var s=r[a];u(i,"function"===typeof s?s.call(n,i,e,t):s)}return i},_performComponentUpdate:function(e,t,n,r,o,i){var a,u,s,c=this._instance,l=Boolean(c.componentDidUpdate);l&&(a=c.props,u=c.state,s=c.context),c.componentWillUpdate&&c.componentWillUpdate(t,n,r),this._currentElement=e,this._context=i,c.props=t,c.state=n,c.context=r,this._updateRenderedComponent(o,i),l&&o.getReactMountReady().enqueue(c.componentDidUpdate.bind(c,a,u,s),c)},_updateRenderedComponent:function(e,t){var n=this._renderedComponent,r=n._currentElement,o=this._renderValidatedComponent(),i=0;if(y(r,o))h.receiveComponent(n,o,e,this._processChildContext(t));else{var a=h.getHostNode(n);h.unmountComponent(n,!1);var u=d.getType(o);this._renderedNodeType=u;var s=this._instantiateReactComponent(o,u!==d.EMPTY);this._renderedComponent=s;var c=h.mountComponent(s,e,this._hostParent,this._hostContainerInfo,this._processChildContext(t),i);this._replaceNodeWithMarkup(a,c,n)}},_replaceNodeWithMarkup:function(e,t,n){c.replaceNodeWithMarkup(e,t,n)},_renderValidatedComponentWithoutOwnerOrContext:function(){var e=this._instance;return e.render()},_renderValidatedComponent:function(){var e;if(this._compositeType!==g.StatelessFunctional){l.current=this;try{e=this._renderValidatedComponentWithoutOwnerOrContext()}finally{l.current=null}}else e=this._renderValidatedComponentWithoutOwnerOrContext();return null===e||!1===e||s.isValidElement(e)||a("109",this.getName()||"ReactCompositeComponent"),e},attachRef:function(e,t){var n=this.getPublicInstance();null==n&&a("110");var r=t.getPublicInstance();(n.refs===m?n.refs={}:n.refs)[e]=r},detachRef:function(e){delete this.getPublicInstance().refs[e]},getName:function(){var e=this._currentElement.type,t=this._instance&&this._instance.constructor;return e.displayName||t&&t.displayName||e.name||t&&t.name||null},getPublicInstance:function(){var e=this._instance;return this._compositeType===g.StatelessFunctional?null:e},_instantiateReactComponent:null};e.exports=_},function(e,t,n){"use strict";function r(){return o++}var o=1;e.exports=r},function(e,t,n){"use strict";var r="function"===typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103;e.exports=r},function(e,t,n){"use strict";function r(e){var t=e&&(o&&e[o]||e[i]);if("function"===typeof t)return t}var o="function"===typeof Symbol&&Symbol.iterator,i="@@iterator";e.exports=r},function(e,t,n){"use strict";(function(t){function r(e,t,n,r){if(e&&"object"===typeof e){var o=e,i=void 0===o[n];i&&null!=t&&(o[n]=t)}}function o(e,t){if(null==e)return e;var n={};return i(e,r,n),n}var i=(n(44),n(77));n(1);"undefined"!==typeof t&&Object({NODE_ENV:"production",PUBLIC_URL:"."}),e.exports=o}).call(t,n(72))},function(e,t,n){"use strict";function r(e){this.reinitializeTransaction(),this.renderToStaticMarkup=e,this.useCreateElement=!1,this.updateQueue=new u(this)}var o=n(3),i=n(12),a=n(24),u=(n(7),n(162)),s=[],c={enqueue:function(){}},l={getTransactionWrappers:function(){return s},getReactMountReady:function(){return c},getUpdateQueue:function(){return this.updateQueue},destructor:function(){},checkpoint:function(){},rollback:function(){}};o(r.prototype,a,l),i.addPoolingTo(r),e.exports=r},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var o=n(45),i=(n(1),function(){function e(t){r(this,e),this.transaction=t}return e.prototype.isMounted=function(e){return!1},e.prototype.enqueueCallback=function(e,t,n){this.transaction.isInTransaction()&&o.enqueueCallback(e,t,n)},e.prototype.enqueueForceUpdate=function(e){this.transaction.isInTransaction()&&o.enqueueForceUpdate(e)},e.prototype.enqueueReplaceState=function(e,t){this.transaction.isInTransaction()&&o.enqueueReplaceState(e,t)},e.prototype.enqueueSetState=function(e,t){this.transaction.isInTransaction()&&o.enqueueSetState(e,t)},e}());e.exports=i},function(e,t,n){"use strict";var r=n(3),o=n(17),i=n(4),a=function(e){this._currentElement=null,this._hostNode=null,this._hostParent=null,this._hostContainerInfo=null,this._domID=0};r(a.prototype,{mountComponent:function(e,t,n,r){var a=n._idCounter++;this._domID=a,this._hostParent=t,this._hostContainerInfo=n;var u=" react-empty: "+this._domID+" ";if(e.useCreateElement){var s=n._ownerDocument,c=s.createComment(u);return i.precacheNode(this,c),o(c)}return e.renderToStaticMarkup?"":"\x3c!--"+u+"--\x3e"},receiveComponent:function(){},getHostNode:function(){return i.getNodeFromInstance(this)},unmountComponent:function(){i.uncacheNode(this)}}),e.exports=a},function(e,t,n){"use strict";function r(e,t){"_hostNode"in e||s("33"),"_hostNode"in t||s("33");for(var n=0,r=e;r;r=r._hostParent)n++;for(var o=0,i=t;i;i=i._hostParent)o++;for(;n-o>0;)e=e._hostParent,n--;for(;o-n>0;)t=t._hostParent,o--;for(var a=n;a--;){if(e===t)return e;e=e._hostParent,t=t._hostParent}return null}function o(e,t){"_hostNode"in e||s("35"),"_hostNode"in t||s("35");for(;t;){if(t===e)return!0;t=t._hostParent}return!1}function i(e){return"_hostNode"in e||s("36"),e._hostParent}function a(e,t,n){for(var r=[];e;)r.push(e),e=e._hostParent;var o;for(o=r.length;o-- >0;)t(r[o],"captured",n);for(o=0;o<r.length;o++)t(r[o],"bubbled",n)}function u(e,t,n,o,i){for(var a=e&&t?r(e,t):null,u=[];e&&e!==a;)u.push(e),e=e._hostParent;for(var s=[];t&&t!==a;)s.push(t),t=t._hostParent;var c;for(c=0;c<u.length;c++)n(u[c],"bubbled",o);for(c=s.length;c-- >0;)n(s[c],"captured",i)}var s=n(2);n(0);e.exports={isAncestor:o,getLowestCommonAncestor:r,getParentInstance:i,traverseTwoPhase:a,traverseEnterLeave:u}},function(e,t,n){"use strict";var r=n(2),o=n(3),i=n(37),a=n(17),u=n(4),s=n(27),c=(n(0),n(46),function(e){this._currentElement=e,this._stringText=""+e,this._hostNode=null,this._hostParent=null,this._domID=0,this._mountIndex=0,this._closingComment=null,this._commentNodes=null});o(c.prototype,{mountComponent:function(e,t,n,r){var o=n._idCounter++,i=" react-text: "+o+" ";if(this._domID=o,this._hostParent=t,e.useCreateElement){var c=n._ownerDocument,l=c.createComment(i),p=c.createComment(" /react-text "),f=a(c.createDocumentFragment());return a.queueChild(f,a(l)),this._stringText&&a.queueChild(f,a(c.createTextNode(this._stringText))),a.queueChild(f,a(p)),u.precacheNode(this,l),this._closingComment=p,f}var d=s(this._stringText);return e.renderToStaticMarkup?d:"\x3c!--"+i+"--\x3e"+d+"\x3c!-- /react-text --\x3e"},receiveComponent:function(e,t){if(e!==this._currentElement){this._currentElement=e;var n=""+e;if(n!==this._stringText){this._stringText=n;var r=this.getHostNode();i.replaceDelimitedText(r[0],r[1],n)}}},getHostNode:function(){var e=this._commentNodes;if(e)return e;if(!this._closingComment)for(var t=u.getNodeFromInstance(this),n=t.nextSibling;;){if(null==n&&r("67",this._domID),8===n.nodeType&&" /react-text "===n.nodeValue){this._closingComment=n;break}n=n.nextSibling}return e=[this._hostNode,this._closingComment],this._commentNodes=e,e},unmountComponent:function(){this._closingComment=null,this._commentNodes=null,u.uncacheNode(this)}}),e.exports=c},function(e,t,n){"use strict";function r(){this.reinitializeTransaction()}var o=n(3),i=n(8),a=n(24),u=n(6),s={initialize:u,close:function(){f.isBatchingUpdates=!1}},c={initialize:u,close:i.flushBatchedUpdates.bind(i)},l=[c,s];o(r.prototype,a,{getTransactionWrappers:function(){return l}});var p=new r,f={isBatchingUpdates:!1,batchedUpdates:function(e,t,n,r,o,i){var a=f.isBatchingUpdates;return f.isBatchingUpdates=!0,a?e(t,n,r,o,i):p.perform(e,null,t,n,r,o,i)}};e.exports=f},function(e,t,n){"use strict";function r(e){for(;e._hostParent;)e=e._hostParent;var t=p.getNodeFromInstance(e),n=t.parentNode;return p.getClosestInstanceFromNode(n)}function o(e,t){this.topLevelType=e,this.nativeEvent=t,this.ancestors=[]}function i(e){var t=d(e.nativeEvent),n=p.getClosestInstanceFromNode(t),o=n;do{e.ancestors.push(o),o=o&&r(o)}while(o);for(var i=0;i<e.ancestors.length;i++)n=e.ancestors[i],m._handleTopLevel(e.topLevelType,n,e.nativeEvent,d(e.nativeEvent))}function a(e){e(h(window))}var u=n(3),s=n(79),c=n(5),l=n(12),p=n(4),f=n(8),d=n(34),h=n(168);u(o.prototype,{destructor:function(){this.topLevelType=null,this.nativeEvent=null,this.ancestors.length=0}}),l.addPoolingTo(o,l.twoArgumentPooler);var m={_enabled:!0,_handleTopLevel:null,WINDOW_HANDLE:c.canUseDOM?window:null,setHandleTopLevel:function(e){m._handleTopLevel=e},setEnabled:function(e){m._enabled=!!e},isEnabled:function(){return m._enabled},trapBubbledEvent:function(e,t,n){return n?s.listen(n,t,m.dispatchEvent.bind(null,e)):null},trapCapturedEvent:function(e,t,n){return n?s.capture(n,t,m.dispatchEvent.bind(null,e)):null},monitorScrollValue:function(e){var t=a.bind(null,e);s.listen(window,"scroll",t)},dispatchEvent:function(e,t){if(m._enabled){var n=o.getPooled(e,t);try{f.batchedUpdates(i,n)}finally{o.release(n)}}}};e.exports=m},function(e,t,n){"use strict";function r(e){return e.Window&&e instanceof e.Window?{x:e.pageXOffset||e.document.documentElement.scrollLeft,y:e.pageYOffset||e.document.documentElement.scrollTop}:{x:e.scrollLeft,y:e.scrollTop}}e.exports=r},function(e,t,n){"use strict";var r=n(15),o=n(20),i=n(32),a=n(41),u=n(75),s=n(28),c=n(76),l=n(8),p={Component:a.injection,DOMProperty:r.injection,EmptyComponent:u.injection,EventPluginHub:o.injection,EventPluginUtils:i.injection,EventEmitter:s.injection,HostComponent:c.injection,Updates:l.injection};e.exports=p},function(e,t,n){"use strict";function r(e){this.reinitializeTransaction(),this.renderToStaticMarkup=!1,this.reactMountReady=i.getPooled(null),this.useCreateElement=e}var o=n(3),i=n(62),a=n(12),u=n(28),s=n(80),c=(n(7),n(24)),l=n(45),p={initialize:s.getSelectionInformation,close:s.restoreSelection},f={initialize:function(){var e=u.isEnabled();return u.setEnabled(!1),e},close:function(e){u.setEnabled(e)}},d={initialize:function(){this.reactMountReady.reset()},close:function(){this.reactMountReady.notifyAll()}},h=[p,f,d],m={getTransactionWrappers:function(){return h},getReactMountReady:function(){return this.reactMountReady},getUpdateQueue:function(){return l},checkpoint:function(){return this.reactMountReady.checkpoint()},rollback:function(e){this.reactMountReady.rollback(e)},destructor:function(){i.release(this.reactMountReady),this.reactMountReady=null}};o(r.prototype,c,m),a.addPoolingTo(r),e.exports=r},function(e,t,n){"use strict";function r(e,t,n,r){return e===n&&t===r}function o(e){var t=document.selection,n=t.createRange(),r=n.text.length,o=n.duplicate();o.moveToElementText(e),o.setEndPoint("EndToStart",n);var i=o.text.length;return{start:i,end:i+r}}function i(e){var t=window.getSelection&&window.getSelection();if(!t||0===t.rangeCount)return null;var n=t.anchorNode,o=t.anchorOffset,i=t.focusNode,a=t.focusOffset,u=t.getRangeAt(0);try{u.startContainer.nodeType,u.endContainer.nodeType}catch(e){return null}var s=r(t.anchorNode,t.anchorOffset,t.focusNode,t.focusOffset),c=s?0:u.toString().length,l=u.cloneRange();l.selectNodeContents(e),l.setEnd(u.startContainer,u.startOffset);var p=r(l.startContainer,l.startOffset,l.endContainer,l.endOffset),f=p?0:l.toString().length,d=f+c,h=document.createRange();h.setStart(n,o),h.setEnd(i,a);var m=h.collapsed;return{start:m?d:f,end:m?f:d}}function a(e,t){var n,r,o=document.selection.createRange().duplicate();void 0===t.end?(n=t.start,r=n):t.start>t.end?(n=t.end,r=t.start):(n=t.start,r=t.end),o.moveToElementText(e),o.moveStart("character",n),o.setEndPoint("EndToStart",o),o.moveEnd("character",r-n),o.select()}function u(e,t){if(window.getSelection){var n=window.getSelection(),r=e[l()].length,o=Math.min(t.start,r),i=void 0===t.end?o:Math.min(t.end,r);if(!n.extend&&o>i){var a=i;i=o,o=a}var u=c(e,o),s=c(e,i);if(u&&s){var p=document.createRange();p.setStart(u.node,u.offset),n.removeAllRanges(),o>i?(n.addRange(p),n.extend(s.node,s.offset)):(p.setEnd(s.node,s.offset),n.addRange(p))}}}var s=n(5),c=n(172),l=n(61),p=s.canUseDOM&&"selection"in document&&!("getSelection"in window),f={getOffsets:p?o:i,setOffsets:p?a:u};e.exports=f},function(e,t,n){"use strict";function r(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function o(e){for(;e;){if(e.nextSibling)return e.nextSibling;e=e.parentNode}}function i(e,t){for(var n=r(e),i=0,a=0;n;){if(3===n.nodeType){if(a=i+n.textContent.length,i<=t&&a>=t)return{node:n,offset:t-i};i=a}n=r(o(n))}}e.exports=i},function(e,t,n){"use strict";function r(e,t){return!(!e||!t)&&(e===t||!o(e)&&(o(t)?r(e,t.parentNode):"contains"in e?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}var o=n(174);e.exports=r},function(e,t,n){"use strict";function r(e){return o(e)&&3==e.nodeType}var o=n(175);e.exports=r},function(e,t,n){"use strict";function r(e){var t=e?e.ownerDocument||e:document,n=t.defaultView||window;return!(!e||!("function"===typeof n.Node?e instanceof n.Node:"object"===typeof e&&"number"===typeof e.nodeType&&"string"===typeof e.nodeName))}e.exports=r},function(e,t,n){"use strict";var r={xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace"},o={accentHeight:"accent-height",accumulate:0,additive:0,alignmentBaseline:"alignment-baseline",allowReorder:"allowReorder",alphabetic:0,amplitude:0,arabicForm:"arabic-form",ascent:0,attributeName:"attributeName",attributeType:"attributeType",autoReverse:"autoReverse",azimuth:0,baseFrequency:"baseFrequency",baseProfile:"baseProfile",baselineShift:"baseline-shift",bbox:0,begin:0,bias:0,by:0,calcMode:"calcMode",capHeight:"cap-height",clip:0,clipPath:"clip-path",clipRule:"clip-rule",clipPathUnits:"clipPathUnits",colorInterpolation:"color-interpolation",colorInterpolationFilters:"color-interpolation-filters",colorProfile:"color-profile",colorRendering:"color-rendering",contentScriptType:"contentScriptType",contentStyleType:"contentStyleType",cursor:0,cx:0,cy:0,d:0,decelerate:0,descent:0,diffuseConstant:"diffuseConstant",direction:0,display:0,divisor:0,dominantBaseline:"dominant-baseline",dur:0,dx:0,dy:0,edgeMode:"edgeMode",elevation:0,enableBackground:"enable-background",end:0,exponent:0,externalResourcesRequired:"externalResourcesRequired",fill:0,fillOpacity:"fill-opacity",fillRule:"fill-rule",filter:0,filterRes:"filterRes",filterUnits:"filterUnits",floodColor:"flood-color",floodOpacity:"flood-opacity",focusable:0,fontFamily:"font-family",fontSize:"font-size",fontSizeAdjust:"font-size-adjust",fontStretch:"font-stretch",fontStyle:"font-style",fontVariant:"font-variant",fontWeight:"font-weight",format:0,from:0,fx:0,fy:0,g1:0,g2:0,glyphName:"glyph-name",glyphOrientationHorizontal:"glyph-orientation-horizontal",glyphOrientationVertical:"glyph-orientation-vertical",glyphRef:"glyphRef",gradientTransform:"gradientTransform",gradientUnits:"gradientUnits",hanging:0,horizAdvX:"horiz-adv-x",horizOriginX:"horiz-origin-x",ideographic:0,imageRendering:"image-rendering",in:0,in2:0,intercept:0,k:0,k1:0,k2:0,k3:0,k4:0,kernelMatrix:"kernelMatrix",kernelUnitLength:"kernelUnitLength",kerning:0,keyPoints:"keyPoints",keySplines:"keySplines",keyTimes:"keyTimes",lengthAdjust:"lengthAdjust",letterSpacing:"letter-spacing",lightingColor:"lighting-color",limitingConeAngle:"limitingConeAngle",local:0,markerEnd:"marker-end",markerMid:"marker-mid",markerStart:"marker-start",markerHeight:"markerHeight",markerUnits:"markerUnits",markerWidth:"markerWidth",mask:0,maskContentUnits:"maskContentUnits",maskUnits:"maskUnits",mathem