public inbox for [email protected]  
help / color / mirror / Atom feed
From: Dave Page <[email protected]>
To: George Gelashvili <[email protected]>
Cc: Sarah McAlear <[email protected]>
Cc: Surinder Kumar <[email protected]>
Cc: Matthew Kleiman <[email protected]>
Cc: Joao Pedro De Almeida Pereira <[email protected]>
Cc: Murtuza Zabuawala <[email protected]>
Cc: pgadmin-hackers <[email protected]>
Subject: Re: [pgAdmin4] [PATCH] History Tab rewrite in React
Date: Mon, 12 Jun 2017 11:58:30 +0100
Message-ID: <CA+OCxoxtxBO-mWfUokBu1WG8VH4E6MrHj16mrKT=L0svYvKfGg@mail.gmail.com> (raw)
In-Reply-To: <CAHowoHZFkDQrMO0-e2gx3ffo3kB56Qwb3jT2S1M7Sc8Bpo0Usw@mail.gmail.com>
References: <CAFS4TJYDRi6fs+wrhkj89gFe3xaFOkoApCK+AU2O4DfU2XfXog@mail.gmail.com>
	<CAKKotZQSTtJVkBKMeFi9vTrPugBEbEE38dhbbn-hr+hpd0Qzbw@mail.gmail.com>
	<CA+OCxowChMtZzaSwrG5Sganh4LiMQcgL7BpoqhTxZga30DqDXw@mail.gmail.com>
	<CAKKotZRmvbScMdUtjMgUJdRe-EXaqDoDbYBxrMZrkbVDVR_iUg@mail.gmail.com>
	<CA+OCxow3e=q9w_e=Kkw1ebZJ82EM8RyFmiTaXihdqhX6HbzZhw@mail.gmail.com>
	<CAFS4TJapVubRP_BK01GwYjfN7zpaTbCMX+CROC4mV93aL08DOg@mail.gmail.com>
	<CA+OCxozPDpP_5zdLjOSQhiGHgzE-QDsFv8-WyC8-XTxf5+uSJg@mail.gmail.com>
	<CAE+jjakzXbzvtai0Z2q0bXfecMhDzZwtn+p8mQwV7kfRGPON_Q@mail.gmail.com>
	<CA+OCxoxkM--KjFWt7FkJm+mrL5sA9jdZ59YN7=n=2ZMrkH8iSg@mail.gmail.com>
	<CAFS4TJaZA0U_BtiUBdx1jT6Z5bQzMQbjhwrjimDLgfkTb=gWJg@mail.gmail.com>
	<CAE+jjakrsf7f41LyCy6BWvjrsH9FyKK98koO0MgUkR0qmbk-uw@mail.gmail.com>
	<CA+OCxoxH+5gAjw17rWQb-jqNBeQGgOs4Q=GZ7KEwdmGHOQrsBw@mail.gmail.com>
	<CAHowoHZJtKn8F9XuiK2yFT=_OcgG7Ctx83iiFab17PwexajfDQ@mail.gmail.com>
	<CA+OCxozz7pbMQi_h-USovgwA2XkVzpeAUuK-zcro4La-_KjgtA@mail.gmail.com>
	<CAFS4TJYRuaRkHguU_BkMAa4vv7Xy_aa37B4M4HSbJ0h2QpmcFA@mail.gmail.com>
	<CA+OCxozdD8_4uyu9f+CJTjtH0x8bcKoeNMtRDcSHXSKStAPwbQ@mail.gmail.com>
	<CAE+jjakmryMDovhh+OMsw=FSTj5W62CuhbdQS4WpjcLSs9jO4g@mail.gmail.com>
	<CAM5-9D-wS-9qwMwvpUCwc8s=KumY+k8pkM7tOt1eysuFvq3n-w@mail.gmail.com>
	<CAFS4TJZtCDqoenHREPC7PEopwYVyPGUh0_9WtxQKNV2w_WLAjw@mail.gmail.com>
	<CAM5-9D9cm88KaiNjAwyNQG7+0FNxcAEJ6xaWTS9+pJ-6uLLTWQ@mail.gmail.com>
	<CAGRPzo-byoSsREPZxJ-bEbse2c2emFF5UMD=SGCJHWduk8kiCA@mail.gmail.com>
	<CA+OCxox3vW4dpK5w9LuL=axXpp_xR5V14oLbGYoe4N9zSOP3dA@mail.gmail.com>
	<CAHowoHa-xGTQgckQC431jusaHD2Eg3S0KCrn24yt9uiS0ow7bA@mail.gmail.com>
	<CA+OCxoy3gVbGiPL3hi250Ya0qMOURYOERH5XxYrnrt2Co2v-xw@mail.gmail.com>
	<CAHowoHZFkDQrMO0-e2gx3ffo3kB56Qwb3jT2S1M7Sc8Bpo0Usw@mail.gmail.com>
List-Unsubscribe:  <mailto:[email protected]?body=unsub%20pgadmin-hackers>

Hi

OK, so Ashesh and I spend much of the morning on this.

Patch 01 - Applied.
Patch 02:

- karma.conf.js wouldn't patch; I've manually handled that.
- test-main.js wouldn't patch. The diff looked like it was trying to
empty it; I have removed it instead.
- The imports in pgAdmin4.py need to be made after the app root is
added to the path.
- The JS bundler should be in pgadmin/utils, not pgadmin/tools (which
is intended for plugin modules)
- The tests were failing following some changes Ashesh pushed earlier
to add a client-side url_for function.
- pgAdmin4.py was attempting to run the bundler on every startup. I've
wrapped those called in "if config.DEBUG:" conditionals, as typically
an installation for an end-user will be in a read-only directory.

We've fixed all of that in the attached patch. I'm not sure why it's
so much bigger than yours.

The following issues are outstanding; please take a look at them:

- There is no update to the Windows installer generation code (needed
in 2 places unfortunately; Make.bat and Make-MinGW.bat).

- The updates to the other packages call "yarn run webpacker" which is
an undefined target.

I haven't looked at patch 03 yet, but Ashesh did tell me it won't
apply for him. Patch 4 is also untested at this stage.

If the issues above can be fixed, we can get patch 2 applied then move
on from there.

I'll hold off on Harshal's patch for the Query Tool's load on demand
to give you a chance to get this done.

Thanks.

On Sat, Jun 10, 2017 at 2:52 AM, George Gelashvili
<[email protected]> wrote:
> Hi Dave,
>
> Our patch touches code also changed by the patches that were recently
> committed.
> That's likely what's causing this issue. We've rebased on top of the new
> state of master.
>
> We had initially kept the yarn.lock .gitignored, but ran into an issue
> rather early on where an upgraded dependency introduced a regression.
> Checking-in the yarn.lock provides the "know your dependency version"
> benefit of vendorizing code without vendorization's drawback of having to
> manually manage your dependencies.
>
> It is safe to delete a yarn.lock before applying a patch, as you are
> authoring master. It provides a history of the versions of each dependency
> that were working at the point in time of the commit. By contrast,
> package.json provides approximate versions and leaves room for
> fixes/improvements by the dependency authors to be pulled in as they become
> available.
>
> To run linter and tests:
>
> The tasks that Grunt used to manage are now defined as a set of scripts in
> the package.json
> After applying the patches--which may require deleting yarn.lock for the
> first patch--you should cd web && yarn install
>
> Then yarn test will run the linter, jasmine specs, and python tests
> including feature tests, in that order, exiting early if there are
> failures/errors.
> At the moment, the CheckForViewData test is failing on master as well as in
> each of these patches; that should be resolved as RM2477.
>
> Thanks!
> George and Matt
>
>
> On Thu, Jun 8, 2017 at 9:15 AM, Dave Page <[email protected]> wrote:
>>
>> Hi George
>>
>> On Wed, Jun 7, 2017 at 10:21 PM, George Gelashvili
>> <[email protected]> wrote:
>> > Hi Dave,
>> >
>> > I split the linting out into an intermediate commit, and rebased on top
>> > of
>> > master.
>>
>> Unfortunately, it still doesn't apply:
>>
>> error: patch failed: web/regression/javascript/test-main.js:1
>> error: removal patch leaves file contents
>> error: web/regression/javascript/test-main.js: patch does not apply
>> Checking patch web/regression/requirements.txt...
>> Checking patch web/webpack.config.js...
>> Checking patch web/webpack.test.config.js...
>> Checking patch web/yarn.lock...
>> error: web/yarn.lock: already exists in working directory
>> Applied patch .gitignore cleanly.
>> Applied patch Make.bat cleanly.
>> Applied patch README cleanly.
>> Applied patch pkg/mac/build.sh cleanly.
>> Applied patch pkg/pip/build.sh cleanly.
>> Applied patch pkg/src/build.sh cleanly.
>> Applied patch web/.eslintrc.js cleanly.
>> Applied patch web/karma.conf.js cleanly.
>> Applied patch web/package.json cleanly.
>> Applied patch web/pgAdmin4.py cleanly.
>> Applied patch web/pgadmin/static/jsx/components.jsx cleanly.
>> Applied patch web/pgadmin/tools/javascript/__init__.py cleanly.
>> Applied patch web/pgadmin/tools/javascript/javascript_bundler.py cleanly.
>> Applied patch web/pgadmin/tools/javascript/tests/__init__.py cleanly.
>> Applied patch
>> web/pgadmin/tools/javascript/tests/test_javascript_bundler.py
>> cleanly.
>> Applied patch web/regression/README cleanly.
>> Applied patch
>> web/regression/javascript/jasmine_capture_warnings_beforeall.js
>> cleanly.
>> Applied patch web/regression/requirements.txt cleanly.
>> Applied patch web/webpack.config.js cleanly.
>> Applied patch web/webpack.test.config.js cleanly.
>>
>> The second (lint update) patch is even worse, with significant number
>> change that just don't want to apply.
>>
>> Clearly yarn.lock needs to be removed from there repo.
>>
>> Once I can apply a version of this, how should I be running the linter
>> and the unit tests?
>>
>> --
>> Dave Page
>> Blog: http://pgsnake.blogspot.com
>> Twitter: @pgsnake
>>
>> EnterpriseDB UK: http://www.enterprisedb.com
>> The Enterprise PostgreSQL Company
>
>



-- 
Dave Page
Blog: http://pgsnake.blogspot.com
Twitter: @pgsnake

EnterpriseDB UK: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

diff --git a/pkg/mac/build.sh b/pkg/mac/build.sh
index a138a8a5..cd2908ef 100755
--- a/pkg/mac/build.sh
+++ b/pkg/mac/build.sh
@@ -178,6 +178,11 @@ _complete_bundle() {
     # run complete-bundle to copy the dependent libraries and frameworks and fix the rpaths
     ./complete-bundle.sh "$BUILDROOT/$APP_BUNDLE_NAME" || { echo complete-bundle.sh failed; exit 1; }
 
+    pushd $SOURCEDIR/web
+        yarn install
+        yarn run webpacker
+    popd
+
     # copy the web directory to the bundle as it is required by runtime
     cp -r $SOURCEDIR/web "$BUILDROOT/$APP_BUNDLE_NAME/Contents/Resources/" || exit 1
     cd "$BUILDROOT/$APP_BUNDLE_NAME/Contents/Resources/web"
diff --git a/pkg/pip/build.sh b/pkg/pip/build.sh
index 3ceaec4f..e9d88350 100755
--- a/pkg/pip/build.sh
+++ b/pkg/pip/build.sh
@@ -57,6 +57,15 @@ do
     tar cf - $FILE | (cd ../pip-build/pgadmin4; tar xf -)
 done
 
+yarn install
+yarn run webpacker
+
+for FILE in `ls -d pgAdmin/static/js/generated/*`
+do
+    echo Adding $FILE
+    tar cf - $FILE | (cd ../pip-build/pgadmin4; tar xf -)
+done
+
 cd ../docs
 for FILE in `git ls-files`
 do
diff --git a/pkg/src/build.sh b/pkg/src/build.sh
index a2c6f90e..bf6bc284 100755
--- a/pkg/src/build.sh
+++ b/pkg/src/build.sh
@@ -69,6 +69,17 @@ do
     tar cf - $FILE | (cd src-build/$TARBALL_NAME; tar xf -)
 done
 
+pushd web
+    yarn install
+    yarn run webpacker
+
+    for FILE in `ls -d pgAdmin/static/js/generated/*`
+    do
+        echo Adding $FILE
+        tar cf - $FILE | (cd ../src-build/$TARBALL_NAME/web; tar xf -)
+    done
+popd
+
 # Create the tarball
 echo Creating tarball...
 cd src-build
diff --git a/web/.eslintrc.js b/web/.eslintrc.js
new file mode 100644
index 00000000..c60569db
--- /dev/null
+++ b/web/.eslintrc.js
@@ -0,0 +1,45 @@
+module.exports = {
+  'env': {
+    'browser': true,
+    'es6': true,
+    'amd': true,
+    'jasmine': true,
+  },
+  'extends': 'eslint:recommended',
+  'parserOptions': {
+    'ecmaFeatures': {
+      'experimentalObjectRestSpread': true,
+      'jsx': true
+    },
+    'sourceType': 'module'
+  },
+  'plugins': [
+    'react'
+  ],
+  'globals': {
+    '_': true,
+    'module': true,
+  },
+  'rules': {
+    'indent': [
+      'error',
+      2
+    ],
+    'linebreak-style': [
+      'error',
+      'unix'
+    ],
+    'quotes': [
+      'error',
+      'single'
+    ],
+    'semi': [
+      'error',
+      'always'
+    ],
+    'comma-dangle': [
+      'error',
+      'always-multiline'
+    ]
+  }
+};
\ No newline at end of file
diff --git a/web/karma.conf.js b/web/karma.conf.js
index baa912c7..feeee77f 100644
--- a/web/karma.conf.js
+++ b/web/karma.conf.js
@@ -1,63 +1,54 @@
 // Karma configuration
 // Generated on Wed Mar 01 2017 14:19:28 GMT-0500 (EST)
+const webpackConfig = require('./webpack.test.config.js');
 
-module.exports = function(config) {
+module.exports = function (config) {
   config.set({
-
-    // base path that will be used to resolve all patterns (eg. files, exclude)
-    basePath: '',
-
-
-    // frameworks to use
-    // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
-    frameworks: ['jasmine', 'requirejs'],
-
-
-    // list of files / patterns to load in the browser
+    frameworks: ['jasmine'],
+    plugins: [
+      'karma-webpack',
+      'karma-phantomjs-launcher',
+      'karma-jasmine',
+      'karma-jasmine-html-reporter',
+    ],
     files: [
-      'regression/javascript/test-main.js',
-      {pattern: 'regression/javascript/**/*.js', included: false},
+      {pattern: 'pgadmin/static/**/*.js', included: false},
       {pattern: 'pgadmin/static/vendor/**/*.js', included: false},
-      {pattern: 'pgadmin/static/js/**/*.js', included: false},
       {pattern: 'pgadmin/browser/static/js/**/*.js', included: false},
-      {pattern: 'pgadmin/static/img/*.png', included: false}
+      'regression/javascript/**/*.jsx',
+      'regression/javascript/**/*.js',
     ],
 
-
     // list of files to exclude
     exclude: [
       'pgadmin/static/vendor/**/*[Tt]est.js',
       'pgadmin/static/vendor/**/*[Ss]pec.js'
     ],
 
-
     // preprocess matching files before serving them to the browser
     // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
     preprocessors: {
+      'regression/javascript/**/*.js': ['webpack'],
+      // 'regression/javascript/**/*.jsx': ['webpack'],
     },
 
+    webpack: webpackConfig,
+    webpackMiddleware: {
+      stats: 'errors-only',
+    },
 
-    // test results reporter to use
-    // possible values: 'dots', 'progress'
-    // available reporters: https://npmjs.org/browse/keyword/karma-reporter
-    reporters: ['progress'],
-
-
-    // web server port
     port: 9876,
 
-
     // enable / disable colors in the output (reporters and logs)
     colors: true,
 
-
     // level of logging
     // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
-    logLevel: config.LOG_INFO,
+    logLevel: config.LOG_WARN,
 
 
     // enable / disable watching file and executing tests whenever any file changes
-    autoWatch: false,
+    autoWatch: true,
 
 
     // start these browsers
@@ -67,10 +58,10 @@ module.exports = function(config) {
 
     // Continuous Integration mode
     // if true, Karma captures browsers, runs the tests and exits
-    singleRun: true,
+    singleRun: false,
 
     // Concurrency level
     // how many browser should be started simultaneous
     concurrency: Infinity
-  })
-}
+  });
+};
diff --git a/web/package.json b/web/package.json
index 80e4e5ad..40070da0 100644
--- a/web/package.json
+++ b/web/package.json
@@ -1,10 +1,43 @@
 {
   "devDependencies": {
-    "jasmine-core": "^2.5.2",
-    "karma": "^1.5.0",
-    "karma-jasmine": "^1.1.0",
-    "karma-phantomjs-launcher": "^1.0.2",
-    "karma-requirejs": "^1.1.0",
-    "requirejs": "^2.3.3"
+    "babel-core": "~6.24.0",
+    "babel-loader": "~6.4.1",
+    "babel-preset-es2015": "~6.24.0",
+    "babel-preset-react": "~6.23.0",
+    "enzyme": "~2.8.2",
+    "jasmine-core": "~2.5.2",
+    "karma": "~1.5.0",
+    "karma-babel-preprocessor": "^6.0.1",
+    "karma-browserify": "~5.1.1",
+    "karma-jasmine": "~1.1.0",
+    "karma-jasmine-html-reporter": "~0.2.2",
+    "karma-phantomjs-launcher": "~1.0.2",
+    "karma-requirejs": "~1.1.0",
+    "karma-sourcemap-loader": "~0.3.7",
+    "karma-webpack": "~2.0.3",
+    "react-addons-test-utils": "~15.4.2",
+    "webpack": "~2.3.1"
+  },
+  "dependencies": {
+    "axios": "^0.16.1",
+    "babel-plugin-transform-es2015-modules-amd": "^6.24.1",
+    "babel-polyfill": "^6.23.0",
+    "babel-preset-es2015-without-strict": "~0.0.4",
+    "babelify": "~7.3.0",
+    "browserify": "~14.1.0",
+    "exports-loader": "~0.6.4",
+    "imports-loader": "git+https://github.com/webpack-contrib/imports-loader.git#44d6f48463b256a17c1ba6fd9b5cc1449b4e379d";,
+    "react": "~15.4.2",
+    "react-dom": "~15.4.2",
+    "requirejs": "~2.3.3",
+    "underscore": "~1.8.3",
+    "watchify": "~3.9.0"
+  },
+  "scripts": {
+    "bundle": "yarn run webpack -- --optimize-minimize --config webpack.config.js",
+    "test:karma-once": "yarn run karma start -- --single-run",
+    "test:karma": "yarn run karma start",
+    "test:feature": "yarn run bundle && python regression/runtests.py --pkg feature_tests",
+    "test": "yarn run test:karma-once && yarn run bundle && python regression/runtests.py"
   }
 }
diff --git a/web/pgAdmin4.py b/web/pgAdmin4.py
index 24e1564a..1db49584 100644
--- a/web/pgAdmin4.py
+++ b/web/pgAdmin4.py
@@ -22,17 +22,36 @@ if sys.path[0] != root:
 
 import config
 from pgadmin import create_app
+from pgadmin.utils import u, fs_encoding, file_quote
+
+if config.DEBUG:
+    from pgadmin.utils.javascript.javascript_bundler import JavascriptBundler, JsState
 
 # Get the config database schema version. We store this in pgadmin.model
 # as it turns out that putting it in the config files isn't a great idea
 from pgadmin.model import SCHEMA_VERSION
 config.SETTINGS_SCHEMA_VERSION = SCHEMA_VERSION
 
+##########################################################################
+# Sanity checks
+##########################################################################
+
+# Check if the database exists. If it does not, create it.
+if not os.path.isfile(config.SQLITE_PATH):
+    setupfile = os.path.join(
+        os.path.dirname(os.path.realpath(u(__file__, fs_encoding))), u'setup.py'
+    )
+    exec(open(file_quote(setupfile), 'r').read())
 
 ##########################################################################
-# Server starup
+# Server startup
 ##########################################################################
 
+# Build Javascript files
+if config.DEBUG:
+    javascriptBundler = JavascriptBundler()
+    javascriptBundler.bundle()
+
 # Create the app!
 app = create_app()
 
@@ -41,6 +60,13 @@ if config.DEBUG:
 else:
     app.debug = False
 
+# respond to JS
+if config.DEBUG:
+    if javascriptBundler.report() == JsState.NONE:
+        app.logger.error("Unable to generate javascript")
+        app.logger.error("To run the app ensure that yarn install command runs successfully")
+        raise Exception("No generated javascript, aborting")
+
 # Start the web server. The port number should have already been set by the
 # runtime if we're running in desktop mode, otherwise we'll just use the
 # Flask default.
diff --git a/web/pgadmin/static/js/generated/reactComponents.js b/web/pgadmin/static/js/generated/reactComponents.js
new file mode 100644
index 00000000..234cf494
--- /dev/null
+++ b/web/pgadmin/static/js/generated/reactComponents.js
@@ -0,0 +1,20 @@
+define(function(){return function(e){function t(o){if(n[o])return n[o].exports;var r=n[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,t),r.l=!0,r.exports}var n={};return t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,o){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:o})},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=81)}([function(e,t){function n(){throw new Error("setTimeout has not been defined")}function o(){throw new Error("clearTimeout has not been defined")}function r(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===o||!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&&f&&(m=!1,f.length?h=f.concat(h):v=-1,h.length&&s())}function s(){if(!m){var e=r(a);m=!0;for(var t=h.length;t;){for(f=h,h=[];++v<t;)f&&f[v].run();v=-1,t=h.length}f=null,m=!1,i(e)}}function u(e,t){this.fun=e,this.array=t}function c(){}var l,p,d=e.exports={};!function(){try{l="function"==typeof setTimeout?setTimeout:n}catch(e){l=n}try{p="function"==typeof clearTimeout?clearTimeout:o}catch(e){p=o}}();var f,h=[],m=!1,v=-1;d.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 u(e,t)),1!==h.length||m||r(s)},u.prototype.run=function(){this.fun.apply(null,this.array)},d.title="browser",d.browser=!0,d.env={},d.argv=[],d.version="",d.versions={},d.on=c,d.addListener=c,d.once=c,d.off=c,d.removeListener=c,d.removeAllListeners=c,d.emit=c,d.prependListener=c,d.prependOnceListener=c,d.listeners=function(e){return[]},d.binding=function(e){throw new Error("process.binding is not supported")},d.cwd=function(){return"/"},d.chdir=function(e){throw new Error("process.chdir is not supported")},d.umask=function(){return 0}},function(e,t,n){"use strict";(function(t){function n(e,t,n,r,i,a,s,u){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,s,u],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){};"production"!==t.env.NODE_ENV&&(o=function(e){if(void 0===e)throw new Error("invariant requires an error message argument")}),e.exports=n}).call(t,n(0))},function(e,t,n){"use strict";(function(t){var o=n(9),r=o;"production"!==t.env.NODE_ENV&&function(){var e=function(e){for(var t=arguments.length,n=Array(t>1?t-1:0),o=1;o<t;o++)n[o-1]=arguments[o];var r=0,i="Warning: "+e.replace(/%s/g,function(){return n[r++]});"undefined"!=typeof console&&console.error(i);try{throw new Error(i)}catch(e){}};r=function(t,n){if(void 0===n)throw new Error("`warning(condition, format, ...args)` requires a warning message argument");if(0!==n.indexOf("Failed Composite propType: ")&&!t){for(var o=arguments.length,r=Array(o>2?o-2:0),i=2;i<o;i++)r[i-2]=arguments[i];e.apply(void 0,[n].concat(r))}}}(),e.exports=r}).call(t,n(0))},function(e,t,n){"use strict";function o(e){for(var t=arguments.length-1,n="Minified React error #"+e+"; visit http://facebook.github.io/react/docs/error-decoder.html?invariant="+e,o=0;o<t;o++)n+="&am...[]="+encodeURIComponent(arguments[o+1]);n+=" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.";var r=new Error(n);throw r.name="Invariant Violation",r.framesToPop=1,r}e.exports=o},function(e,t,n){"use strict";function o(e){if(null===e||void 0===e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}/*
+object-assign
+(c) Sindre Sorhus
+@license MIT
+*/
+var r=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 o={};return"abcdefghijklmnopqrst".split("").forEach(function(e){o[e]=e}),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},o)).join("")}catch(e){return!1}}()?Object.assign:function(e,t){for(var n,s,u=o(e),c=1;c<arguments.length;c++){n=Object(arguments[c]);for(var l in n)i.call(n,l)&&(u[l]=n[l]);if(r){s=r(n);for(var p=0;p<s.length;p++)a.call(n,s[p])&&(u[s[p]]=n[s[p]])}}return u}},function(e,t,n){"use strict";(function(t){function o(e,t){return 1===e.nodeType&&e.getAttribute(m)===String(t)||8===e.nodeType&&e.nodeValue===" react-text: "+t+" "||8===e.nodeType&&e.nodeValue===" react-empty: "+t+" "}function r(e){for(var t;t=e._renderedComponent;)e=t;return e}function i(e,t){var n=r(e);n._hostNode=t,t[g]=n}function a(e){var t=e._hostNode;t&&(delete t[g],e._hostNode=null)}function s(e,n){if(!(e._flags&v.hasCachedChildNodes)){var a=e._renderedChildren,s=n.firstChild;e:for(var u in a)if(a.hasOwnProperty(u)){var c=a[u],l=r(c)._domID;if(0!==l){for(;null!==s;s=s.nextSibling)if(o(s,l)){i(c,s);continue e}"production"!==t.env.NODE_ENV?h(!1,"Unable to find element with ID %s.",l):p("32",l)}}e._flags|=v.hasCachedChildNodes}}function u(e){if(e[g])return e[g];for(var t=[];!e[g];){if(t.push(e),!e.parentNode)return null;e=e.parentNode}for(var n,o;e&&(o=e[g]);e=t.pop())n=o,t.length&&s(o,e);return n}function c(e){var t=u(e);return null!=t&&t._hostNode===e?t:null}function l(e){if(void 0===e._hostNode&&("production"!==t.env.NODE_ENV?h(!1,"getNodeFromInstance: Invalid argument."):p("33")),e._hostNode)return e._hostNode;for(var n=[];!e._hostNode;)n.push(e),e._hostParent||("production"!==t.env.NODE_ENV?h(!1,"React DOM tree root should always have a node reference."):p("34")),e=e._hostParent;for(;n.length;e=n.pop())s(e,e._hostNode);return e._hostNode}var p=n(3),d=n(13),f=n(58),h=n(1),m=d.ID_ATTRIBUTE_NAME,v=f,g="__reactInternalInstance$"+Math.random().toString(36).slice(2),y={getClosestInstanceFromNode:u,getInstanceFromNode:c,getNodeFromInstance:l,precacheChildNodes:s,precacheNode:i,uncacheNode:a};e.exports=y}).call(t,n(0))},function(e,t,n){"use strict";var o=!("undefined"==typeof window||!window.document||!window.document.createElement),r={canUseDOM:o,canUseWorkers:"undefined"!=typeof Worker,canUseEventListeners:o&&!(!window.addEventListener&&!window.attachEvent),canUseViewport:o&&!!window.screen,isInWorker:!o};e.exports=r},function(e,t,n){"use strict";(function(t){function o(e){var t=Function.prototype.toString,n=Object.prototype.hasOwnProperty,o=RegExp("^"+t.call(n).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");try{var r=t.call(e);return o.test(r)}catch(e){return!1}}function r(e){var t=c(e);if(t){var n=t.childIDs;l(e),n.forEach(r)}}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 s(e){var n,o=x.getDisplayName(e),r=x.getElement(e),a=x.getOwnerID(e);return a&&(n=x.getDisplayName(a)),"production"!==t.env.NODE_ENV&&y(r,"ReactComponentTreeHook: Missing React element for debugID %s when building stack",e),i(o,r&&r._source,n)}var u,c,l,p,d,f,h,m=n(16),v=n(11),g=n(1),y=n(2),E="function"==typeof Array.from&&"function"==typeof Map&&o(Map)&&null!=Map.prototype&&"function"==typeof Map.prototype.keys&&o(Map.prototype.keys)&&"function"==typeof Set&&o(Set)&&null!=Set.prototype&&"function"==typeof Set.prototype.keys&&o(Set.prototype.keys);if(E){var _=new Map,N=new Set;u=function(e,t){_.set(e,t)},c=function(e){return _.get(e)},l=function(e){_.delete(e)},p=function(){return Array.from(_.keys())},d=function(e){N.add(e)},f=function(e){N.delete(e)},h=function(){return Array.from(N.keys())}}else{var b={},C={},D=function(e){return"."+e},O=function(e){return parseInt(e.substr(1),10)};u=function(e,t){var n=D(e);b[n]=t},c=function(e){var t=D(e);return b[t]},l=function(e){var t=D(e);delete b[t]},p=function(){return Object.keys(b).map(O)},d=function(e){var t=D(e);C[t]=!0},f=function(e){var t=D(e);delete C[t]},h=function(){return Object.keys(C).map(O)}}var w=[],x={onSetChildren:function(e,n){var o=c(e);o||("production"!==t.env.NODE_ENV?g(!1,"Item must have been set"):m("144")),o.childIDs=n;for(var r=0;r<n.length;r++){var i=n[r],a=c(i);a||("production"!==t.env.NODE_ENV?g(!1,"Expected hook events to fire for the child before its parent includes it in onSetChildren()."):m("140")),null==a.childIDs&&"object"==typeof a.element&&null!=a.element&&("production"!==t.env.NODE_ENV?g(!1,"Expected onSetChildren() to fire for a container child before its parent includes it in onSetChildren()."):m("141")),a.isMounted||("production"!==t.env.NODE_ENV?g(!1,"Expected onMountComponent() to fire for the child before its parent includes it in onSetChildren()."):m("71")),null==a.parentID&&(a.parentID=e),a.parentID!==e&&("production"!==t.env.NODE_ENV?g(!1,"Expected onBeforeMountComponent() parent and onSetChildren() to be consistent (%s has parents %s and %s).",i,a.parentID,e):m("142",i,a.parentID,e))}},onBeforeMountComponent:function(e,t,n){u(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 n=c(e);n||("production"!==t.env.NODE_ENV?g(!1,"Item must have been set"):m("144")),n.isMounted=!0,0===n.parentID&&d(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&&f(e)}w.push(e)},purgeUnmountedComponents:function(){if(!x._preventPurging){for(var e=0;e<w.length;e++){r(w[e])}w.length=0}},isMounted:function(e){var t=c(e);return!!t&&t.isMounted},getCurrentStackAddendum:function(e){var t="";if(e){var n=a(e),o=e._owner;t+=i(n,e._source,o&&o.getName())}var r=v.current,s=r&&r._debugID;return t+=x.getStackAddendumByID(s)},getStackAddendumByID:function(e){for(var t="";e;)t+=s(e),e=x.getParentID(e);return t},getChildIDs:function(e){var t=c(e);return t?t.childIDs:[]},getDisplayName:function(e){var t=x.getElement(e);return t?a(t):null},getElement:function(e){var t=c(e);return t?t.element:null},getOwnerID:function(e){var t=x.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=x.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};e.exports=x}).call(t,n(0))},function(e,t,n){"use strict";(function(t){var o=null;if("production"!==t.env.NODE_ENV){o=n(124)}e.exports={debugTool:o}}).call(t,n(0))},function(e,t,n){"use strict";function o(e){return function(){return e}}var r=function(){};r.thatReturns=o,r.thatReturnsFalse=o(!1),r.thatReturnsTrue=o(!0),r.thatReturnsNull=o(null),r.thatReturnsThis=function(){return this},r.thatReturnsArgument=function(e){return e},e.exports=r},function(e,t,n){"use strict";(function(t){function o(){T.ReactReconcileTransaction&&b||("production"!==t.env.NODE_ENV?g(!1,"ReactUpdates: must inject a reconcile transaction class and batching strategy"):l("123"))}function r(){this.reinitializeTransaction(),this.dirtyComponentsLength=null,this.callbackQueue=d.getPooled(),this.reconcileTransaction=T.ReactReconcileTransaction.getPooled(!0)}function i(e,t,n,r,i,a){return o(),b.batchedUpdates(e,t,n,r,i,a)}function a(e,t){return e._mountOrder-t._mountOrder}function s(e){var n=e.dirtyComponentsLength;n!==y.length&&("production"!==t.env.NODE_ENV?g(!1,"Expected flush transaction's stored dirty-components length (%s) to match dirty-components array length (%s).",n,y.length):l("124",n,y.length)),y.sort(a),E++;for(var o=0;o<n;o++){var r=y[o],i=r._pendingCallbacks;r._pendingCallbacks=null;var s;if(h.logTopLevelRenders){var u=r;r._currentElement.type.isReactTopLevelWrapper&&(u=r._renderedComponent),s="React update: "+u.getName(),console.time(s)}if(m.performUpdateIfNecessary(r,e.reconcileTransaction,E),s&&console.timeEnd(s),i)for(var c=0;c<i.length;c++)e.callbackQueue.enqueue(i[c],r.getPublicInstance())}}function u(e){if(o(),!b.isBatchingUpdates)return void b.batchedUpdates(u,e);y.push(e),null==e._updateBatchNumber&&(e._updateBatchNumber=E+1)}function c(e,n){b.isBatchingUpdates||("production"!==t.env.NODE_ENV?g(!1,"ReactUpdates.asap: Can't enqueue an asap callback in a context whereupdates are not being batched."):l("125")),_.enqueue(e,n),N=!0}var l=n(3),p=n(4),d=n(56),f=n(14),h=n(61),m=n(18),v=n(28),g=n(1),y=[],E=0,_=d.getPooled(),N=!1,b=null,C={initialize:function(){this.dirtyComponentsLength=y.length},close:function(){this.dirtyComponentsLength!==y.length?(y.splice(0,this.dirtyComponentsLength),w()):y.length=0}},D={initialize:function(){this.callbackQueue.reset()},close:function(){this.callbackQueue.notifyAll()}},O=[C,D];p(r.prototype,v,{getTransactionWrappers:function(){return O},destructor:function(){this.dirtyComponentsLength=null,d.release(this.callbackQueue),this.callbackQueue=null,T.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)}}),f.addPoolingTo(r);var w=function(){for(;y.length||N;){if(y.length){var e=r.getPooled();e.perform(s,null,e),r.release(e)}if(N){N=!1;var t=_;_=d.getPooled(),t.notifyAll(),d.release(t)}}},x={injectReconcileTransaction:function(e){e||("production"!==t.env.NODE_ENV?g(!1,"ReactUpdates: must provide a reconcile transaction class"):l("126")),T.ReactReconcileTransaction=e},injectBatchingStrategy:function(e){e||("production"!==t.env.NODE_ENV?g(!1,"ReactUpdates: must provide a batching strategy"):l("127")),"function"!=typeof e.batchedUpdates&&("production"!==t.env.NODE_ENV?g(!1,"ReactUpdates: must provide a batchedUpdates() function"):l("128")),"boolean"!=typeof e.isBatchingUpdates&&("production"!==t.env.NODE_ENV?g(!1,"ReactUpdates: must provide an isBatchingUpdates boolean attribute"):l("129")),b=e}},T={ReactReconcileTransaction:null,batchedUpdates:i,enqueueUpdate:u,flushBatchedUpdates:w,injection:x,asap:c};e.exports=T}).call(t,n(0))},function(e,t,n){"use strict";var o={current:null};e.exports=o},function(e,t,n){"use strict";(function(t){function o(e,n,o,r){"production"!==t.env.NODE_ENV&&(delete this.nativeEvent,delete this.preventDefault,delete this.stopPropagation),this.dispatchConfig=e,this._targetInst=n,this.nativeEvent=o;var i=this.constructor.Interface;for(var a in i)if(i.hasOwnProperty(a)){"production"!==t.env.NODE_ENV&&delete this[a];var u=i[a];u?this[a]=u(o):"target"===a?this.target=r:this[a]=o[a]}var c=null!=o.defaultPrevented?o.defaultPrevented:!1===o.returnValue;return this.isDefaultPrevented=c?s.thatReturnsTrue:s.thatReturnsFalse,this.isPropagationStopped=s.thatReturnsFalse,this}function r(e,n){function o(e){return i(a?"setting the method":"setting the property","This is effectively a no-op"),e}function r(){return i(a?"accessing the method":"accessing the property",a?"This is a no-op function":"This is set to null"),n}function i(n,o){"production"!==t.env.NODE_ENV&&u(!1,"This synthetic event is reused for performance reasons. If you're seeing this, you're %s `%s` on a released/nullified synthetic event. %s. If you must keep the original synthetic event around, use event.persist(). See https://fb.me/react-event-pooling for more information.",n,e,o)}var a="function"==typeof n;return{configurable:!0,set:o,get:r}}var i=n(4),a=n(14),s=n(9),u=n(2),c=!1,l="function"==typeof Proxy,p=["dispatchConfig","_targetInst","nativeEvent","isDefaultPrevented","isPropagationStopped","_dispatchListeners","_dispatchInstances"],d={type:null,target:null,currentTarget:s.thatReturnsNull,eventPhase:null,bubbles:null,cancelable:null,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:null,isTrusted:null};i(o.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():"unknown"!=typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=s.thatReturnsTrue)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():"unknown"!=typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=s.thatReturnsTrue)},persist:function(){this.isPersistent=s.thatReturnsTrue},isPersistent:s.thatReturnsFalse,destructor:function(){var e=this.constructor.Interface;for(var n in e)"production"!==t.env.NODE_ENV?Object.defineProperty(this,n,r(n,e[n])):this[n]=null;for(var o=0;o<p.length;o++)this[p[o]]=null;"production"!==t.env.NODE_ENV&&(Object.defineProperty(this,"nativeEvent",r("nativeEvent",null)),Object.defineProperty(this,"preventDefault",r("preventDefault",s)),Object.defineProperty(this,"stopPropagation",r("stopPropagation",s)))}}),o.Interface=d,"production"!==t.env.NODE_ENV&&l&&(o=new Proxy(o,{construct:function(e,t){return this.apply(e,Object.create(e.prototype),t)},apply:function(e,n,o){return new Proxy(e.apply(n,o),{set:function(e,n,o){return"isPersistent"===n||e.constructor.Interface.hasOwnProperty(n)||-1!==p.indexOf(n)||("production"!==t.env.NODE_ENV&&u(c||e.isPersistent(),"This synthetic event is reused for performance reasons. If you're seeing this, you're adding a new property in the synthetic event object. The property is never released. See https://fb.me/react-event-pooling for more information."),c=!0),e[n]=o,!0}})}})),o.augmentClass=function(e,t){var n=this,o=function(){};o.prototype=n.prototype;var r=new o;i(r,e.prototype),e.prototype=r,e.prototype.constructor=e,e.Interface=i({},n.Interface,t),e.augmentClass=n.augmentClass,a.addPoolingTo(e,a.fourArgumentPooler)},a.addPoolingTo(o,a.fourArgumentPooler),e.exports=o}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e,t){return(e&t)===t}var r=n(3),i=n(1),a={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 n=a,s=e.Properties||{},c=e.DOMAttributeNamespaces||{},l=e.DOMAttributeNames||{},p=e.DOMPropertyNames||{},d=e.DOMMutationMethods||{};e.isCustomAttribute&&u._isCustomAttributeFunctions.push(e.isCustomAttribute);for(var f in s){u.properties.hasOwnProperty(f)&&("production"!==t.env.NODE_ENV?i(!1,"injectDOMPropertyConfig(...): You're trying to inject DOM property '%s' which has already been injected. You may be accidentally injecting the same DOM property config twice, or you may be injecting two configs that have conflicting property names.",f):r("48",f));var h=f.toLowerCase(),m=s[f],v={attributeName:h,attributeNamespace:null,propertyName:f,mutationMethod:null,mustUseProperty:o(m,n.MUST_USE_PROPERTY),hasBooleanValue:o(m,n.HAS_BOOLEAN_VALUE),hasNumericValue:o(m,n.HAS_NUMERIC_VALUE),hasPositiveNumericValue:o(m,n.HAS_POSITIVE_NUMERIC_VALUE),hasOverloadedBooleanValue:o(m,n.HAS_OVERLOADED_BOOLEAN_VALUE)};if(v.hasBooleanValue+v.hasNumericValue+v.hasOverloadedBooleanValue<=1||("production"!==t.env.NODE_ENV?i(!1,"DOMProperty: Value can be one of boolean, overloaded boolean, or numeric value, but not a combination: %s",f):r("50",f)),"production"!==t.env.NODE_ENV&&(u.getPossibleStandardName[h]=f),l.hasOwnProperty(f)){var g=l[f];v.attributeName=g,"production"!==t.env.NODE_ENV&&(u.getPossibleStandardName[g]=f)}c.hasOwnProperty(f)&&(v.attributeNamespace=c[f]),p.hasOwnProperty(f)&&(v.propertyName=p[f]),d.hasOwnProperty(f)&&(v.mutationMethod=d[f]),u.properties[f]=v}}},s=":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:s,ATTRIBUTE_NAME_CHAR:s+"\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040",properties:{},getPossibleStandardName:"production"!==t.env.NODE_ENV?{autofocus:"autoFocus"}: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:a};e.exports=u}).call(t,n(0))},function(e,t,n){"use strict";(function(t){var o=n(3),r=n(1),i=function(e){var t=this;if(t.instancePool.length){var n=t.instancePool.pop();return t.call(n,e),n}return new t(e)},a=function(e,t){var n=this;if(n.instancePool.length){var o=n.instancePool.pop();return n.call(o,e,t),o}return new n(e,t)},s=function(e,t,n){var o=this;if(o.instancePool.length){var r=o.instancePool.pop();return o.call(r,e,t,n),r}return new o(e,t,n)},u=function(e,t,n,o){var r=this;if(r.instancePool.length){var i=r.instancePool.pop();return r.call(i,e,t,n,o),i}return new r(e,t,n,o)},c=function(e){var n=this;e instanceof n||("production"!==t.env.NODE_ENV?r(!1,"Trying to release an instance into a pool of a different type."):o("25")),e.destructor(),n.instancePool.length<n.poolSize&&n.instancePool.push(e)},l=i,p=function(e,t){var n=e;return n.instancePool=[],n.getPooled=t||l,n.poolSize||(n.poolSize=10),n.release=c,n},d={addPoolingTo:p,oneArgumentPooler:i,twoArgumentPooler:a,threeArgumentPooler:s,fourArgumentPooler:u};e.exports=d}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e){if("production"!==t.env.NODE_ENV&&f.call(e,"ref")){var n=Object.getOwnPropertyDescriptor(e,"ref").get;if(n&&n.isReactWarning)return!1}return void 0!==e.ref}function r(e){if("production"!==t.env.NODE_ENV&&f.call(e,"key")){var n=Object.getOwnPropertyDescriptor(e,"key").get;if(n&&n.isReactWarning)return!1}return void 0!==e.key}function i(e,n){var o=function(){s||(s=!0,"production"!==t.env.NODE_ENV&&p(!1,"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://fb.me/react-special-props)",n))};o.isReactWarning=!0,Object.defineProperty(e,"key",{get:o,configurable:!0})}function a(e,n){var o=function(){u||(u=!0,"production"!==t.env.NODE_ENV&&p(!1,"%s: `ref` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://fb.me/react-special-props)",n))};o.isReactWarning=!0,Object.defineProperty(e,"ref",{get:o,configurable:!0})}var s,u,c=n(4),l=n(11),p=n(2),d=n(50),f=Object.prototype.hasOwnProperty,h=n(76),m={key:!0,ref:!0,__self:!0,__source:!0},v=function(e,n,o,r,i,a,s){var u={$$typeof:h,type:e,key:n,ref:o,props:s,_owner:a};return"production"!==t.env.NODE_ENV&&(u._store={},d?(Object.defineProperty(u._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:!1}),Object.defineProperty(u,"_self",{configurable:!1,enumerable:!1,writable:!1,value:r}),Object.defineProperty(u,"_source",{configurable:!1,enumerable:!1,writable:!1,value:i})):(u._store.validated=!1,u._self=r,u._source=i),Object.freeze&&(Object.freeze(u.props),Object.freeze(u))),u};v.createElement=function(e,n,s){var u,c={},p=null,d=null,g=null,y=null;if(null!=n){o(n)&&(d=n.ref),r(n)&&(p=""+n.key),g=void 0===n.__self?null:n.__self,y=void 0===n.__source?null:n.__source;for(u in n)f.call(n,u)&&!m.hasOwnProperty(u)&&(c[u]=n[u])}var E=arguments.length-2;if(1===E)c.children=s;else if(E>1){for(var _=Array(E),N=0;N<E;N++)_[N]=arguments[N+2];"production"!==t.env.NODE_ENV&&Object.freeze&&Object.freeze(_),c.children=_}if(e&&e.defaultProps){var b=e.defaultProps;for(u in b)void 0===c[u]&&(c[u]=b[u])}if("production"!==t.env.NODE_ENV&&(p||d)&&(void 0===c.$$typeof||c.$$typeof!==h)){var C="function"==typeof e?e.displayName||e.name||"Unknown":e;p&&i(c,C),d&&a(c,C)}return v(e,p,d,g,y,l.current,c)},v.createFactory=function(e){var t=v.createElement.bind(null,e);return t.type=e,t},v.cloneAndReplaceKey=function(e,t){return v(e.type,t,e.ref,e._self,e._source,e._owner,e.props)},v.cloneElement=function(e,t,n){var i,a=c({},e.props),s=e.key,u=e.ref,p=e._self,d=e._source,h=e._owner;if(null!=t){o(t)&&(u=t.ref,h=l.current),r(t)&&(s=""+t.key);var g;e.type&&e.type.defaultProps&&(g=e.type.defaultProps);for(i in t)f.call(t,i)&&!m.hasOwnProperty(i)&&(void 0===t[i]&&void 0!==g?a[i]=g[i]:a[i]=t[i])}var y=arguments.length-2;if(1===y)a.children=n;else if(y>1){for(var E=Array(y),_=0;_<y;_++)E[_]=arguments[_+2];a.children=E}return v(e.type,s,u,p,d,h,a)},v.isValidElement=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===h},e.exports=v}).call(t,n(0))},function(e,t,n){"use strict";function o(e){for(var t=arguments.length-1,n="Minified React error #"+e+"; visit http://facebook.github.io/react/docs/error-decoder.html?invariant="+e,o=0;o<t;o++)n+="&am...[]="+encodeURIComponent(arguments[o+1]);n+=" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.";var r=new Error(n);throw r.name="Invariant Violation",r.framesToPop=1,r}e.exports=o},function(e,t,n){"use strict";function o(e){if(h){var t=e.node,n=e.children;if(n.length)for(var o=0;o<n.length;o++)m(t,n[o],null);else null!=e.html?p(t,e.html):null!=e.text&&f(t,e.text)}}function r(e,t){e.parentNode.replaceChild(t.node,e),o(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 s(e,t){h?e.text=t:f(e.node,t)}function u(){return this.node.nodeName}function c(e){return{node:e,children:[],html:null,text:null,toString:u}}var l=n(33),p=n(30),d=n(40),f=n(74),h="undefined"!=typeof document&&"number"==typeof document.documentMode||"undefined"!=typeof navigator&&"string"==typeof navigator.userAgent&&/\bEdge\/\d/.test(navigator.userAgent),m=d(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)?(o(t),e.insertBefore(t.node,n)):(e.insertBefore(t.node,n),o(t))});c.insertTreeBefore=m,c.replaceChildWithTree=r,c.queueChild=i,c.queueHTML=a,c.queueText=s,e.exports=c},function(e,t,n){"use strict";(function(t){function o(){r.attachRefs(this,this._currentElement)}var r=n(138),i=n(8),a=n(2),s={mountComponent:function(e,n,r,a,s,u){"production"!==t.env.NODE_ENV&&0!==e._debugID&&i.debugTool.onBeforeMountComponent(e._debugID,e._currentElement,u);var c=e.mountComponent(n,r,a,s,u);return e._currentElement&&null!=e._currentElement.ref&&n.getReactMountReady().enqueue(o,e),"production"!==t.env.NODE_ENV&&0!==e._debugID&&i.debugTool.onMountComponent(e._debugID),c},getHostNode:function(e){return e.getHostNode()},unmountComponent:function(e,n){"production"!==t.env.NODE_ENV&&0!==e._debugID&&i.debugTool.onBeforeUnmountComponent(e._debugID),r.detachRefs(e,e._currentElement),e.unmountComponent(n),"production"!==t.env.NODE_ENV&&0!==e._debugID&&i.debugTool.onUnmountComponent(e._debugID)},receiveComponent:function(e,n,a,s){var u=e._currentElement;if(n!==u||s!==e._context){"production"!==t.env.NODE_ENV&&0!==e._debugID&&i.debugTool.onBeforeUpdateComponent(e._debugID,n);var c=r.shouldUpdateRefs(u,n);c&&r.detachRefs(e,u),e.receiveComponent(n,a,s),c&&e._currentElement&&null!=e._currentElement.ref&&a.getReactMountReady().enqueue(o,e),"production"!==t.env.NODE_ENV&&0!==e._debugID&&i.debugTool.onUpdateComponent(e._debugID)}},performUpdateIfNecessary:function(e,n,o){if(e._updateBatchNumber!==o)return void("production"!==t.env.NODE_ENV&&a(null==e._updateBatchNumber||e._updateBatchNumber===o+1,"performUpdateIfNecessary: Unexpected batch number (current %s, pending %s)",o,e._updateBatchNumber));"production"!==t.env.NODE_ENV&&0!==e._debugID&&i.debugTool.onBeforeUpdateComponent(e._debugID,e._currentElement),e.performUpdateIfNecessary(n),"production"!==t.env.NODE_ENV&&0!==e._debugID&&i.debugTool.onUpdateComponent(e._debugID)}};e.exports=s}).call(t,n(0))},function(e,t,n){"use strict";(function(t){var o=n(4),r=n(169),i=n(47),a=n(173),s=n(170),u=n(171),c=n(15),l=n(172),p=n(174),d=n(176),f=n(2),h=c.createElement,m=c.createFactory,v=c.cloneElement;if("production"!==t.env.NODE_ENV){var g=n(77);h=g.createElement,m=g.createFactory,v=g.cloneElement}var y=o;if("production"!==t.env.NODE_ENV){var E=!1;y=function(){return"production"!==t.env.NODE_ENV&&f(E,"React.__spread is deprecated and should not be used. Use Object.assign directly or another helper function with similar semantics. You may be seeing this warning due to your compiler. See https://fb.me/react-spread-deprecation for more details."),E=!0,o.apply(null,arguments)}}var _={Children:{map:r.map,forEach:r.forEach,count:r.count,toArray:r.toArray,only:d},Component:i,PureComponent:a,createElement:h,cloneElement:v,isValidElement:c.isValidElement,PropTypes:l,createClass:s.createClass,createFactory:m,createMixin:function(e){return e},DOM:u,version:p,__spread:y};e.exports=_}).call(t,n(0))},function(e,t,n){"use strict";(function(t){var n={};"production"!==t.env.NODE_ENV&&Object.freeze(n),e.exports=n}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e){return"button"===e||"input"===e||"select"===e||"textarea"===e}function r(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||!o(t));default:return!1}}var i=n(3),a=n(25),s=n(34),u=n(38),c=n(68),l=n(69),p=n(1),d={},f=null,h=function(e,t){e&&(s.executeDispatchesInOrder(e,t),e.isPersistent()||e.constructor.release(e))},m=function(e){return h(e,!0)},v=function(e){return h(e,!1)},g=function(e){return"."+e._rootNodeID},y={injection:{injectEventPluginOrder:a.injectEventPluginOrder,injectEventPluginsByName:a.injectEventPluginsByName},putListener:function(e,n,o){"function"!=typeof o&&("production"!==t.env.NODE_ENV?p(!1,"Expected %s listener to be a function, instead got type %s",n,typeof o):i("94",n,typeof o));var r=g(e);(d[n]||(d[n]={}))[r]=o;var s=a.registrationNameModules[n];s&&s.didPutListener&&s.didPutListener(e,n,o)},getListener:function(e,t){var n=d[t];if(r(t,e._currentElement.type,e._currentElement.props))return null;var o=g(e);return n&&n[o]},deleteListener:function(e,t){var n=a.registrationNameModules[t];n&&n.willDeleteListener&&n.willDeleteListener(e,t);var o=d[t];if(o){delete o[g(e)]}},deleteAllListeners:function(e){var t=g(e);for(var n in d)if(d.hasOwnProperty(n)&&d[n][t]){var o=a.registrationNameModules[n];o&&o.willDeleteListener&&o.willDeleteListener(e,n),delete d[n][t]}},extractEvents:function(e,t,n,o){for(var r,i=a.plugins,s=0;s<i.length;s++){var u=i[s];if(u){var l=u.extractEvents(e,t,n,o);l&&(r=c(r,l))}}return r},enqueueEvents:function(e){e&&(f=c(f,e))},processEventQueue:function(e){var n=f;f=null,e?l(n,m):l(n,v),f&&("production"!==t.env.NODE_ENV?p(!1,"processEventQueue(): Additional events were enqueued while processing an event queue. Support for this has not yet been implemented."):i("95")),u.rethrowCaughtError()},__purge:function(){d={}},__getListenerBank:function(){return d}};e.exports=y}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e,t,n){var o=t.dispatchConfig.phasedRegistrationNames[n];return y(e,o)}function r(e,n,r){"production"!==t.env.NODE_ENV&&"production"!==t.env.NODE_ENV&&g(e,"Dispatching inst must not be null");var i=o(e,r,n);i&&(r._dispatchListeners=m(r._dispatchListeners,i),r._dispatchInstances=m(r._dispatchInstances,e))}function i(e){e&&e.dispatchConfig.phasedRegistrationNames&&h.traverseTwoPhase(e._targetInst,r,e)}function a(e){if(e&&e.dispatchConfig.phasedRegistrationNames){var t=e._targetInst,n=t?h.getParentInstance(t):null;h.traverseTwoPhase(n,r,e)}}function s(e,t,n){if(n&&n.dispatchConfig.registrationName){var o=n.dispatchConfig.registrationName,r=y(e,o);r&&(n._dispatchListeners=m(n._dispatchListeners,r),n._dispatchInstances=m(n._dispatchInstances,e))}}function u(e){e&&e.dispatchConfig.registrationName&&s(e._targetInst,null,e)}function c(e){v(e,i)}function l(e){v(e,a)}function p(e,t,n,o){h.traverseEnterLeave(n,o,s,e,t)}function d(e){v(e,u)}var f=n(21),h=n(34),m=n(68),v=n(69),g=n(2),y=f.getListener,E={accumulateTwoPhaseDispatches:c,accumulateTwoPhaseDispatchesSkipTarget:l,accumulateDirectDispatches:d,accumulateEnterLeaveDispatches:p};e.exports=E}).call(t,n(0))},function(e,t,n){"use strict";var o={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=o},function(e,t,n){"use strict";function o(e,t,n,o){return r.call(this,e,t,n,o)}var r=n(12),i=n(43),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}};r.augmentClass(o,a),e.exports=o},function(e,t,n){"use strict";(function(t){function o(){if(u)for(var e in c){var n=c[e],o=u.indexOf(e);if(o>-1||("production"!==t.env.NODE_ENV?s(!1,"EventPluginRegistry: Cannot inject event plugins that do not exist in the plugin ordering, `%s`.",e):a("96",e)),!l.plugins[o]){n.extractEvents||("production"!==t.env.NODE_ENV?s(!1,"EventPluginRegistry: Event plugins must implement an `extractEvents` method, but `%s` does not.",e):a("97",e)),l.plugins[o]=n;var i=n.eventTypes;for(var p in i)r(i[p],n,p)||("production"!==t.env.NODE_ENV?s(!1,"EventPluginRegistry: Failed to publish event `%s` for plugin `%s`.",p,e):a("98",p,e))}}}function r(e,n,o){l.eventNameDispatchConfigs.hasOwnProperty(o)&&("production"!==t.env.NODE_ENV?s(!1,"EventPluginHub: More than one plugin attempted to publish the same event name, `%s`.",o):a("99",o)),l.eventNameDispatchConfigs[o]=e;var r=e.phasedRegistrationNames;if(r){for(var u in r)if(r.hasOwnProperty(u)){var c=r[u];i(c,n,o)}return!0}return!!e.registrationName&&(i(e.registrationName,n,o),!0)}function i(e,n,o){if(l.registrationNameModules[e]&&("production"!==t.env.NODE_ENV?s(!1,"EventPluginHub: More than one plugin attempted to publish the same registration name, `%s`.",e):a("100",e)),l.registrationNameModules[e]=n,l.registrationNameDependencies[e]=n.eventTypes[o].dependencies,"production"!==t.env.NODE_ENV){var r=e.toLowerCase();l.possibleRegistrationNames[r]=e,"onDoubleClick"===e&&(l.possibleRegistrationNames.ondblclick=e)}}var a=n(3),s=n(1),u=null,c={},l={plugins:[],eventNameDispatchConfigs:{},registrationNameModules:{},registrationNameDependencies:{},possibleRegistrationNames:"production"!==t.env.NODE_ENV?{}:null,injectEventPluginOrder:function(e){u&&("production"!==t.env.NODE_ENV?s(!1,"EventPluginRegistry: Cannot inject event plugin ordering more than once. You are likely trying to load more than one copy of React."):a("101")),u=Array.prototype.slice.call(e),o()},injectEventPluginsByName:function(e){var n=!1;for(var r in e)if(e.hasOwnProperty(r)){var i=e[r];c.hasOwnProperty(r)&&c[r]===i||(c[r]&&("production"!==t.env.NODE_ENV?s(!1,"EventPluginRegistry: Cannot inject two different event plugins using the same name, `%s`.",r):a("102",r)),c[r]=i,n=!0)}n&&o()},getPluginModuleForEvent:function(e){var t=e.dispatchConfig;if(t.registrationName)return l.registrationNameModules[t.registrationName]||null;if(void 0!==t.phasedRegistrationNames){var n=t.phasedRegistrationNames;for(var o in n)if(n.hasOwnProperty(o)){var r=l.registrationNameModules[n[o]];if(r)return r}}return null},_resetEventPlugins:function(){u=null;for(var e in c)c.hasOwnProperty(e)&&delete c[e];l.plugins.length=0;var n=l.eventNameDispatchConfigs;for(var o in n)n.hasOwnProperty(o)&&delete n[o];var r=l.registrationNameModules;for(var i in r)r.hasOwnProperty(i)&&delete r[i];if("production"!==t.env.NODE_ENV){var a=l.possibleRegistrationNames;for(var s in a)a.hasOwnProperty(s)&&delete a[s]}}};e.exports=l}).call(t,n(0))},function(e,t,n){"use strict";function o(e){return Object.prototype.hasOwnProperty.call(e,m)||(e[m]=f++,p[e[m]]={}),p[e[m]]}var r,i=n(4),a=n(25),s=n(128),u=n(67),c=n(164),l=n(44),p={},d=!1,f=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({},s,{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,r=o(n),i=a.registrationNameDependencies[e],s=0;s<i.length;s++){var u=i[s];r.hasOwnProperty(u)&&r[u]||("topWheel"===u?l("wheel")?v.ReactEventListener.trapBubbledEvent("topWheel","wheel",n):l("mousewheel")?v.ReactEventListener.trapBubbledEvent("topWheel","mousewheel",n):v.ReactEventListener.trapBubbledEvent("topWheel","DOMMouseScroll",n):"topScroll"===u?l("scroll",!0)?v.ReactEventListener.trapCapturedEvent("topScroll","scroll",n):v.ReactEventListener.trapBubbledEvent("topScroll","scroll",v.ReactEventListener.WINDOW_HANDLE):"topFocus"===u||"topBlur"===u?(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)),r.topBlur=!0,r.topFocus=!0):h.hasOwnProperty(u)&&v.ReactEventListener.trapBubbledEvent(u,h[u],n),r[u]=!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===r&&(r=v.supportsEventPageXY()),!r&&!d){var e=u.refreshScrollValues;v.ReactEventListener.monitorScrollValue(e),d=!0}}});e.exports=v},function(e,t,n){"use strict";function o(e,t,n,o){return r.call(this,e,t,n,o)}var r=n(24),i=n(67),a=n(42),s={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}};r.augmentClass(o,s),e.exports=o},function(e,t,n){"use strict";(function(t){var o=n(3),r=n(1),i={},a={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,n,i,a,s,u,c,l){this.isInTransaction()&&("production"!==t.env.NODE_ENV?r(!1,"Transaction.perform(...): Cannot initialize a transaction when there is already an outstanding transaction."):o("27"));var p,d;try{this._isInTransaction=!0,p=!0,this.initializeAll(0),d=e.call(n,i,a,s,u,c,l),p=!1}finally{try{if(p)try{this.closeAll(0)}catch(e){}else this.closeAll(0)}finally{this._isInTransaction=!1}}return d},initializeAll:function(e){for(var t=this.transactionWrappers,n=e;n<t.length;n++){var o=t[n];try{this.wrapperInitData[n]=i,this.wrapperInitData[n]=o.initialize?o.initialize.call(this):null}finally{if(this.wrapperInitData[n]===i)try{this.initializeAll(n+1)}catch(e){}}}},closeAll:function(e){this.isInTransaction()||("production"!==t.env.NODE_ENV?r(!1,"Transaction.closeAll(): Cannot close transaction when none are open."):o("28"));for(var n=this.transactionWrappers,a=e;a<n.length;a++){var s,u=n[a],c=this.wrapperInitData[a];try{s=!0,c!==i&&u.close&&u.close.call(this,c),s=!1}finally{if(s)try{this.closeAll(a+1)}catch(e){}}}this.wrapperInitData.length=0}};e.exports=a}).call(t,n(0))},function(e,t,n){"use strict";function o(e){var t=""+e,n=i.exec(t);if(!n)return t;var o,r="",a=0,s=0;for(a=n.index;a<t.length;a++){switch(t.charCodeAt(a)){case 34:o="&quot;";break;case 38:o="&amp;";break;case 39:o="&#x27;";break;case 60:o="&lt;";break;case 62:o="&gt;";break;default:continue}s!==a&&(r+=t.substring(s,a)),s=a+1,r+=o}return s!==a?r+t.substring(s,a):r}function r(e){return"boolean"==typeof e||"number"==typeof e?""+e:o(e)}var i=/["'&<>]/;e.exports=r},function(e,t,n){"use strict";var o,r=n(6),i=n(33),a=/^[ \r\n\t\f]/,s=/<(!--|link|noscript|meta|script|style)[ \r\n\t\f\/>]/,u=n(40),c=u(function(e,t){if(e.namespaceURI!==i.svg||"innerHTML"in e)e.innerHTML=t;else{o=o||document.createElement("div"),o.innerHTML="<svg>"+t+"</svg>";for(var n=o.firstChild;n.firstChild;)e.appendChild(n.firstChild)}});if(r.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]&&s.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 o(e,t){return e===t?0!==e||0!==t||1/e==1/t:e!==e&&t!==t}function r(e,t){if(o(e,t))return!0;if("object"!=typeof e||null===e||"object"!=typeof t||null===t)return!1;var n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(var a=0;a<n.length;a++)if(!i.call(t,n[a])||!o(e[n[a]],t[n[a]]))return!1;return!0}var i=Object.prototype.hasOwnProperty;e.exports=r},function(e,t,n){"use strict";(function(t){function o(e,t){return Array.isArray(t)&&(t=t[1]),t?t.nextSibling:e.firstChild}function r(e,t,n){l.insertTreeBefore(e,t,n)}function i(e,t,n){Array.isArray(t)?s(e,t[0],t[1],n):g(e,t,n)}function a(e,t){if(Array.isArray(t)){var n=t[1];t=t[0],u(e,t,n),e.removeChild(n)}e.removeChild(t)}function s(e,t,n,o){for(var r=t;;){var i=r.nextSibling;if(g(e,r,o),r===n)break;r=i}}function u(e,t,n){for(;;){var o=t.nextSibling;if(o===n)break;e.removeChild(o)}}function c(e,n,o){var r=e.parentNode,i=e.nextSibling;i===n?o&&g(r,document.createTextNode(o),i):o?(v(i,o),u(r,i,n)):u(r,e,n),"production"!==t.env.NODE_ENV&&f.debugTool.onHostOperation({instanceID:d.getInstanceFromNode(e)._debugID,type:"replace text",payload:o})}var l=n(17),p=n(101),d=n(5),f=n(8),h=n(40),m=n(30),v=n(74),g=h(function(e,t,n){e.insertBefore(t,n)}),y=p.dangerouslyReplaceNodeWithMarkup;"production"!==t.env.NODE_ENV&&(y=function(e,t,n){if(p.dangerouslyReplaceNodeWithMarkup(e,t),0!==n._debugID)f.debugTool.onHostOperation({instanceID:n._debugID,type:"replace with",payload:t.toString()});else{var o=d.getInstanceFromNode(t.node);0!==o._debugID&&f.debugTool.onHostOperation({instanceID:o._debugID,type:"mount",payload:t.toString()})}});var E={dangerouslyReplaceNodeWithMarkup:y,replaceDelimitedText:c,processUpdates:function(e,n){if("production"!==t.env.NODE_ENV)var s=d.getInstanceFromNode(e)._debugID;for(var u=0;u<n.length;u++){var c=n[u];switch(c.type){case"INSERT_MARKUP":r(e,c.content,o(e,c.afterNode)),"production"!==t.env.NODE_ENV&&f.debugTool.onHostOperation({instanceID:s,type:"insert child",payload:{toIndex:c.toIndex,content:c.content.toString()}});break;case"MOVE_EXISTING":i(e,c.fromNode,o(e,c.afterNode)),"production"!==t.env.NODE_ENV&&f.debugTool.onHostOperation({instanceID:s,type:"move child",payload:{fromIndex:c.fromIndex,toIndex:c.toIndex}});break;case"SET_MARKUP":m(e,c.content),"production"!==t.env.NODE_ENV&&f.debugTool.onHostOperation({instanceID:s,type:"replace children",payload:c.content.toString()});break;case"TEXT_CONTENT":v(e,c.content),"production"!==t.env.NODE_ENV&&f.debugTool.onHostOperation({instanceID:s,type:"replace text",payload:c.content.toString()});break;case"REMOVE_NODE":a(e,c.fromNode),"production"!==t.env.NODE_ENV&&f.debugTool.onHostOperation({instanceID:s,type:"remove child",payload:{fromIndex:c.fromIndex}})}}}};e.exports=E}).call(t,n(0))},function(e,t,n){"use strict";var o={html:"http://www.w3.org/1999/xhtml",mathml:"http://www.w3.org/1998/Math/MathML",svg:"http:...;};e.exports=o},function(e,t,n){"use strict";(function(t){function o(e){return"topMouseUp"===e||"topTouchEnd"===e||"topTouchCancel"===e}function r(e){return"topMouseMove"===e||"topTouchMove"===e}function i(e){return"topMouseDown"===e||"topTouchStart"===e}function a(e,t,n,o){var r=e.type||"unknown-event";e.currentTarget=_.getNodeFromInstance(o),t?v.invokeGuardedCallbackWithCatch(r,n,e):v.invokeGuardedCallback(r,n,e),e.currentTarget=null}function s(e,n){var o=e._dispatchListeners,r=e._dispatchInstances;if("production"!==t.env.NODE_ENV&&h(e),Array.isArray(o))for(var i=0;i<o.length&&!e.isPropagationStopped();i++)a(e,n,o[i],r[i]);else o&&a(e,n,o,r);e._dispatchListeners=null,e._dispatchInstances=null}function u(e){var n=e._dispatchListeners,o=e._dispatchInstances;if("production"!==t.env.NODE_ENV&&h(e),Array.isArray(n)){for(var r=0;r<n.length&&!e.isPropagationStopped();r++)if(n[r](e,o[r]))return o[r]}else if(n&&n(e,o))return o;return null}function c(e){var t=u(e);return e._dispatchInstances=null,e._dispatchListeners=null,t}function l(e){"production"!==t.env.NODE_ENV&&h(e);var n=e._dispatchListeners,o=e._dispatchInstances;Array.isArray(n)&&("production"!==t.env.NODE_ENV?g(!1,"executeDirectDispatch(...): Invalid `event`."):m("103")),e.currentTarget=n?_.getNodeFromInstance(o):null;var r=n?n(e):null;return e.currentTarget=null,e._dispatchListeners=null,e._dispatchInstances=null,r}function p(e){return!!e._dispatchListeners}var d,f,h,m=n(3),v=n(38),g=n(1),y=n(2),E={injectComponentTree:function(e){d=e,"production"!==t.env.NODE_ENV&&"production"!==t.env.NODE_ENV&&y(e&&e.getNodeFromInstance&&e.getInstanceFromNode,"EventPluginUtils.injection.injectComponentTree(...): Injected module is missing getNodeFromInstance or getInstanceFromNode.")},injectTreeTraversal:function(e){f=e,"production"!==t.env.NODE_ENV&&"production"!==t.env.NODE_ENV&&y(e&&e.isAncestor&&e.getLowestCommonAncestor,"EventPluginUtils.injection.injectTreeTraversal(...): Injected module is missing isAncestor or getLowestCommonAncestor.")}};"production"!==t.env.NODE_ENV&&(h=function(e){var n=e._dispatchListeners,o=e._dispatchInstances,r=Array.isArray(n),i=r?n.length:n?1:0,a=Array.isArray(o),s=a?o.length:o?1:0;"production"!==t.env.NODE_ENV&&y(a===r&&s===i,"EventPluginUtils: Invalid `event`.")});var _={isEndish:o,isMoveish:r,isStartish:i,executeDirectDispatch:l,executeDispatchesInOrder:s,executeDispatchesInOrderStopAtTrue:c,hasDispatches:p,getInstanceFromNode:function(e){return d.getInstanceFromNode(e)},getNodeFromInstance:function(e){return d.getNodeFromInstance(e)},isAncestor:function(e,t){return f.isAncestor(e,t)},getLowestCommonAncestor:function(e,t){return f.getLowestCommonAncestor(e,t)},getParentInstance:function(e){return f.getParentInstance(e)},traverseTwoPhase:function(e,t,n){return f.traverseTwoPhase(e,t,n)},traverseEnterLeave:function(e,t,n,o,r){return f.traverseEnterLeave(e,t,n,o,r)},injection:E};e.exports=_}).call(t,n(0))},function(e,t,n){"use strict";function o(e){var t={"=":"=0",":":"=2"};return"$"+(""+e).replace(/[=:]/g,function(e){return t[e]})}function r(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:o,unescape:r};e.exports=i},function(e,t,n){"use strict";(function(t){function o(e){null!=e.checkedLink&&null!=e.valueLink&&("production"!==t.env.NODE_ENV?l(!1,"Cannot provide a checkedLink and a valueLink. If you want to use checkedLink, you probably don't want to use valueLink and vice versa."):s("87"))}function r(e){o(e),(null!=e.value||null!=e.onChange)&&("production"!==t.env.NODE_ENV?l(!1,"Cannot provide a valueLink and a value or onChange event. If you want to use value or onChange, you probably don't want to use valueLink."):s("88"))}function i(e){o(e),(null!=e.checked||null!=e.onChange)&&("production"!==t.env.NODE_ENV?l(!1,"Cannot provide a checkedLink and a checked property or onChange event. If you want to use checked or onChange, you probably don't want to use checkedLink"):s("89"))}function a(e){if(e){var t=e.getName();if(t)return" Check the render method of `"+t+"`."}return""}var s=n(3),u=n(19),c=n(66),l=n(1),p=n(2),d={button:!0,checkbox:!0,image:!0,hidden:!0,radio:!0,reset:!0,submit:!0},f={value:function(e,t,n){return!e[t]||d[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:u.PropTypes.func},h={},m={checkPropTypes:function(e,n,o){for(var r in f){if(f.hasOwnProperty(r))var i=f[r](n,r,e,"prop",null,c);if(i instanceof Error&&!(i.message in h)){h[i.message]=!0;var s=a(o);"production"!==t.env.NODE_ENV&&p(!1,"Failed form propType: %s%s",i.message,s)}}},getValue:function(e){return e.valueLink?(r(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?(r(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}).call(t,n(0))},function(e,t,n){"use strict";(function(t){var o=n(3),r=n(1),i=!1,a={replaceNodeWithMarkup:null,processChildrenUpdates:null,injection:{injectEnvironment:function(e){i&&("production"!==t.env.NODE_ENV?r(!1,"ReactCompositeComponent: injectEnvironment() can only be called once."):o("104")),a.replaceNodeWithMarkup=e.replaceNodeWithMarkup,a.processChildrenUpdates=e.processChildrenUpdates,i=!0}}};e.exports=a}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function n(e,t,n){try{t(n)}catch(e){null===o&&(o=e)}}var o=null,r={invokeGuardedCallback:n,invokeGuardedCallbackWithCatch:n,rethrowCaughtError:function(){if(o){var e=o;throw o=null,e}}};if("production"!==t.env.NODE_ENV&&"undefined"!=typeof window&&"function"==typeof window.dispatchEvent&&"undefined"!=typeof document&&"function"==typeof document.createEvent){var i=document.createElement("react");r.invokeGuardedCallback=function(e,t,n){var o=t.bind(null,n),r="react-"+e;i.addEventListener(r,o,!1);var a=document.createEvent("Event");a.initEvent(r,!1,!1),i.dispatchEvent(a),i.removeEventListener(r,o,!1)}}e.exports=r}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e){l.enqueueUpdate(e)}function r(e){var t=typeof e;if("object"!==t)return t;var n=e.constructor&&e.constructor.name||t,o=Object.keys(e);return o.length>0&&o.length<20?n+" (keys: "+o.join(", ")+")":n}function i(e,n){var o=u.get(e);if(!o){if("production"!==t.env.NODE_ENV){var r=e.constructor;"production"!==t.env.NODE_ENV&&d(!n,"%s(...): Can only update a mounted or mounting component. This usually means you called %s() on an unmounted component. This is a no-op. Please check the code for the %s component.",n,n,r&&(r.displayName||r.name)||"ReactClass")}return null}return"production"!==t.env.NODE_ENV&&"production"!==t.env.NODE_ENV&&d(null==s.current,"%s(...): Cannot update during an existing state transition (such as within `render` or another component's constructor). Render methods should be a pure function of props and state; constructor side-effects are an anti-pattern, but can be moved to `componentWillMount`.",n),o}var a=n(3),s=n(11),u=n(23),c=n(8),l=n(10),p=n(1),d=n(2),f={isMounted:function(e){if("production"!==t.env.NODE_ENV){var n=s.current;null!==n&&("production"!==t.env.NODE_ENV&&d(n._warnedAboutRefsInRender,"%s is accessing isMounted inside its render() function. render() should be a pure function of props and state. It should never access something that requires stale data from the previous render, such as refs. Move this logic to componentDidMount and componentDidUpdate instead.",n.getName()||"A component"),n._warnedAboutRefsInRender=!0)}var o=u.get(e);return!!o&&!!o._renderedComponent},enqueueCallback:function(e,t,n){f.validateCallback(t,n);var r=i(e);if(!r)return null;r._pendingCallbacks?r._pendingCallbacks.push(t):r._pendingCallbacks=[t],o(r)},enqueueCallbackInternal:function(e,t){e._pendingCallbacks?e._pendingCallbacks.push(t):e._pendingCallbacks=[t],o(e)},enqueueForceUpdate:function(e){var t=i(e,"forceUpdate");t&&(t._pendingForceUpdate=!0,o(t))},enqueueReplaceState:function(e,t){var n=i(e,"replaceState");n&&(n._pendingStateQueue=[t],n._pendingReplaceState=!0,o(n))},enqueueSetState:function(e,n){"production"!==t.env.NODE_ENV&&(c.debugTool.onSetState(),"production"!==t.env.NODE_ENV&&d(null!=n,"setState(...): You passed an undefined or null state object; instead, use forceUpdate()."));var r=i(e,"setState");if(r){(r._pendingStateQueue||(r._pendingStateQueue=[])).push(n),o(r)}},enqueueElementInternal:function(e,t,n){e._pendingElement=t,e._context=n,o(e)},validateCallback:function(e,n){e&&"function"!=typeof e&&("production"!==t.env.NODE_ENV?p(!1,"%s(...): Expected the last optional `callback` argument to be a function. Instead received: %s.",n,r(e)):a("122",n,r(e)))}};e.exports=f}).call(t,n(0))},function(e,t,n){"use strict";var o=function(e){return"undefined"!=typeof MSApp&&MSApp.execUnsafeLocalFunction?function(t,n,o,r){MSApp.execUnsafeLocalFunction(function(){return e(t,n,o,r)})}:e};e.exports=o},function(e,t,n){"use strict";function o(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=o},function(e,t,n){"use strict";function o(e){var t=this,n=t.nativeEvent;if(n.getModifierState)return n.getModifierState(e);var o=i[e];return!!o&&!!n[o]}function r(e){return o}var i={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};e.exports=r},function(e,t,n){"use strict";function o(e){var t=e.target||e.srcElement||window;return t.correspondingUseElement&&(t=t.correspondingUseElement),3===t.nodeType?t.parentNode:t}e.exports=o},function(e,t,n){"use strict";/**
+ * Checks if an event is supported in the current execution environment.
+ *
+ * NOTE: This will not work correctly for non-generic events such as `change`,
+ * `reset`, `load`, `error`, and `select`.
+ *
+ * Borrows from Modernizr.
+ *
+ * @param {string} eventNameSuffix Event name, e.g. "click".
+ * @param {?boolean} capture Check if the capture phase is supported.
+ * @return {boolean} True if the event is supported.
+ * @internal
+ * @license Modernizr 3.0.0pre (Custom Build) | MIT
+ */
+function o(e,t){if(!i.canUseDOM||t&&!("addEventListener"in document))return!1;var n="on"+e,o=n in document;if(!o){var a=document.createElement("div");a.setAttribute(n,"return;"),o="function"==typeof a[n]}return!o&&r&&"wheel"===e&&(o=document.implementation.hasFeature("Events.wheel","3.0")),o}var r,i=n(6);i.canUseDOM&&(r=document.implementation&&document.implementation.hasFeature&&!0!==document.implementation.hasFeature("","")),e.exports=o},function(e,t,n){"use strict";function o(e,t){var n=null===e||!1===e,o=null===t||!1===t;if(n||o)return n===o;var r=typeof e,i=typeof t;return"string"===r||"number"===r?"string"===i||"number"===i:"object"===i&&e.type===t.type&&e.key===t.key}e.exports=o},function(e,t,n){"use strict";(function(t){var o=n(4),r=n(9),i=n(2),a=r;if("production"!==t.env.NODE_ENV){var s=["address","applet","area","article","aside","base","basefont","bgsound","blockquote","body","br","button","caption","center","col","colgroup","dd","details","dir","div","dl","dt","embed","fieldset","figcaption","figure","footer","form","frame","frameset","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","iframe","img","input","isindex","li","link","listing","main","marquee","menu","menuitem","meta","nav","noembed","noframes","noscript","object","ol","p","param","plaintext","pre","script","section","select","source","style","summary","table","tbody","td","template","textarea","tfoot","th","thead","title","tr","track","ul","wbr","xmp"],u=["applet","caption","html","table","td","th","marquee","object","template","foreignObject","desc","title"],c=u.concat(["button"]),l=["dd","dt","li","option","optgroup","p","rp","rt"],p={current:null,formTag:null,aTagInScope:null,buttonTagInScope:null,nobrTagInScope:null,pTagInButtonScope:null,listItemTagAutoclosing:null,dlItemTagAutoclosing:null},d=function(e,t,n){var r=o({},e||p),i={tag:t,instance:n};return-1!==u.indexOf(t)&&(r.aTagInScope=null,r.buttonTagInScope=null,r.nobrTagInScope=null),-1!==c.indexOf(t)&&(r.pTagInButtonScope=null),-1!==s.indexOf(t)&&"address"!==t&&"div"!==t&&"p"!==t&&(r.listItemTagAutoclosing=null,r.dlItemTagAutoclosing=null),r.current=i,"form"===t&&(r.formTag=i),"a"===t&&(r.aTagInScope=i),"button"===t&&(r.buttonTagInScope=i),"nobr"===t&&(r.nobrTagInScope=i),"p"===t&&(r.pTagInButtonScope=i),"li"===t&&(r.listItemTagAutoclosing=i),"dd"!==t&&"dt"!==t||(r.dlItemTagAutoclosing=i),r},f=function(e,t){switch(t){case"select":return"option"===e||"optgroup"===e||"#text"===e;case"optgroup":return"option"===e||"#text"===e;case"option":return"#text"===e;case"tr":return"th"===e||"td"===e||"style"===e||"script"===e||"template"===e;case"tbody":case"thead":case"tfoot":return"tr"===e||"style"===e||"script"===e||"template"===e;case"colgroup":return"col"===e||"template"===e;case"table":return"caption"===e||"colgroup"===e||"tbody"===e||"tfoot"===e||"thead"===e||"style"===e||"script"===e||"template"===e;case"head":return"base"===e||"basefont"===e||"bgsound"===e||"link"===e||"meta"===e||"title"===e||"noscript"===e||"noframes"===e||"style"===e||"script"===e||"template"===e;case"html":return"head"===e||"body"===e;case"#document":return"html"===e}switch(e){case"h1":case"h2":case"h3":case"h4":case"h5":case"h6":return"h1"!==t&&"h2"!==t&&"h3"!==t&&"h4"!==t&&"h5"!==t&&"h6"!==t;case"rp":case"rt":return-1===l.indexOf(t);case"body":case"caption":case"col":case"colgroup":case"frame":case"head":case"html":case"tbody":case"td":case"tfoot":case"th":case"thead":case"tr":return null==t}return!0},h=function(e,t){switch(e){case"address":case"article":case"aside":case"blockquote":case"center":case"details":case"dialog":case"dir":case"div":case"dl":case"fieldset":case"figcaption":case"figure":case"footer":case"header":case"hgroup":case"main":case"menu":case"nav":case"ol":case"p":case"section":case"summary":case"ul":case"pre":case"listing":case"table":case"hr":case"xmp":case"h1":case"h2":case"h3":case"h4":case"h5":case"h6":return t.pTagInButtonScope;case"form":return t.formTag||t.pTagInButtonScope;case"li":return t.listItemTagAutoclosing;case"dd":case"dt":return t.dlItemTagAutoclosing;case"button":return t.buttonTagInScope;case"a":return t.aTagInScope;case"nobr":return t.nobrTagInScope}return null},m=function(e){if(!e)return[];var t=[];do{t.push(e)}while(e=e._currentElement._owner);return t.reverse(),t},v={};a=function(e,n,o,r){r=r||p;var a=r.current,s=a&&a.tag;null!=n&&("production"!==t.env.NODE_ENV&&i(null==e,"validateDOMNesting: when childText is passed, childTag should be null"),e="#text");var u=f(e,s)?null:a,c=u?null:h(e,r),l=u||c;if(l){var d,g=l.tag,y=l.instance,E=o&&o._currentElement._owner,_=y&&y._currentElement._owner,N=m(E),b=m(_),C=Math.min(N.length,b.length),D=-1;for(d=0;d<C&&N[d]===b[d];d++)D=d;var O=N.slice(D+1).map(function(e){return e.getName()||"(unknown)"}),w=b.slice(D+1).map(function(e){return e.getName()||"(unknown)"}),x=[].concat(-1!==D?N[D].getName()||"(unknown)":[],w,g,c?["..."]:[],O,e).join(" > "),T=!!u+"|"+e+"|"+g+"|"+x;if(v[T])return;v[T]=!0;var k=e,I="";if("#text"===e?/\S/.test(n)?k="Text nodes":(k="Whitespace text nodes",I=" Make sure you don't have any extra whitespace between tags on each line of your source code."):k="<"+e+">",u){var P="";"table"===g&&"tr"===e&&(P+=" Add a <tbody> to your code to match the DOM tree generated by the browser."),"production"!==t.env.NODE_ENV&&i(!1,"validateDOMNesting(...): %s cannot appear as a child of <%s>.%s See %s.%s",k,g,I,x,P)}else"production"!==t.env.NODE_ENV&&i(!1,"validateDOMNesting(...): %s cannot appear as a descendant of <%s>. See %s.",k,g,x)}},a.updatedAncestorInfo=d,a.isTagValidInContext=function(e,t){t=t||p;var n=t.current,o=n&&n.tag;return f(e,o)&&!h(e,t)}}e.exports=a}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e,t,n){this.props=e,this.context=t,this.refs=s,this.updater=n||i}var r=n(16),i=n(48),a=n(50),s=n(20),u=n(1),c=n(2);if(o.prototype.isReactComponent={},o.prototype.setState=function(e,n){"object"!=typeof e&&"function"!=typeof e&&null!=e&&("production"!==t.env.NODE_ENV?u(!1,"setState(...): takes an object of state variables to update or a function which returns an object of state variables."):r("85")),this.updater.enqueueSetState(this,e),n&&this.updater.enqueueCallback(this,n,"setState")},o.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this),e&&this.updater.enqueueCallback(this,e,"forceUpdate")},"production"!==t.env.NODE_ENV){var l={isMounted:["isMounted","Instead, make sure to clean up subscriptions and pending requests in componentWillUnmount to prevent memory leaks."],replaceState:["replaceState","Refactor your code to use setState instead (see https://github.com/facebook/react/issues/3236).";]};for(var p in l)l.hasOwnProperty(p)&&function(e,n){a&&Object.defineProperty(o.prototype,e,{get:function(){"production"!==t.env.NODE_ENV&&c(!1,"%s(...) is deprecated in plain JavaScript React classes. %s",n[0],n[1])}})}(p,l[p])}e.exports=o}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e,n){if("production"!==t.env.NODE_ENV){var o=e.constructor;"production"!==t.env.NODE_ENV&&r(!1,"%s(...): Can only update a mounted or mounting component. This usually means you called %s() on an unmounted component. This is a no-op. Please check the code for the %s component.",n,n,o&&(o.displayName||o.name)||"ReactClass")}}var r=n(2),i={isMounted:function(e){return!1},enqueueCallback:function(e,t){},enqueueForceUpdate:function(e){o(e,"forceUpdate")},enqueueReplaceState:function(e,t){o(e,"replaceState")},enqueueSetState:function(e,t){o(e,"setState")}};e.exports=i}).call(t,n(0))},function(e,t,n){"use strict";(function(t){var n={};"production"!==t.env.NODE_ENV&&(n={prop:"prop",context:"context",childContext:"child context"}),e.exports=n}).call(t,n(0))},function(e,t,n){"use strict";(function(t){var n=!1;if("production"!==t.env.NODE_ENV)try{Object.defineProperty({},"x",{get:function(){}}),n=!0}catch(e){}e.exports=n}).call(t,n(0))},function(e,t,n){"use strict";function o(e){var t=e&&(r&&e[r]||e[i]);if("function"==typeof t)return t}var r="function"==typeof Symbol&&Symbol.iterator,i="@@iterator";e.exports=o},function(e,t,n){"use strict";(function(t){var o=n(9),r={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,n,r){return e.addEventListener?(e.addEventListener(n,r,!0),{remove:function(){e.removeEventListener(n,r,!0)}}):("production"!==t.env.NODE_ENV&&console.error("Attempted to listen to events during the capture phase on a browser that does not support the capture phase. Your application will not receive some events."),{remove:o})},registerDefault:function(){}};e.exports=r}).call(t,n(0))},function(e,t,n){"use strict";function o(e){try{e.focus()}catch(e){}}e.exports=o},function(e,t,n){"use strict";function o(e){if(void 0===(e=e||("undefined"!=typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(t){return e.body}}e.exports=o},function(e,t,n){"use strict";function o(e,t){return e+t.charAt(0).toUpperCase()+t.substring(1)}var r={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,gridColumn:!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(r).forEach(function(e){i.forEach(function(t){r[o(t,e)]=r[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}},s={isUnitlessNumber:r,shorthandPropertyExpansions:a};e.exports=s},function(e,t,n){"use strict";(function(t){function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var r=n(3),i=n(14),a=n(1),s=function(){function e(t){o(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,n=this._contexts,o=this._arg;if(e&&n){e.length!==n.length&&("production"!==t.env.NODE_ENV?a(!1,"Mismatched list of contexts in callback queue"):r("24")),this._callbacks=null,this._contexts=null;for(var i=0;i<e.length;i++)e[i].call(n[i],o);e.length=0,n.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(s)}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e){return!!d.hasOwnProperty(e)||!p.hasOwnProperty(e)&&(l.test(e)?(d[e]=!0,!0):(p[e]=!0,"production"!==t.env.NODE_ENV&&c(!1,"Invalid attribute name: `%s`",e),!1))}function r(e,t){return null==t||e.hasBooleanValue&&!t||e.hasNumericValue&&isNaN(t)||e.hasPositiveNumericValue&&t<1||e.hasOverloadedBooleanValue&&!1===t}var i=n(13),a=n(5),s=n(8),u=n(165),c=n(2),l=new RegExp("^["+i.ATTRIBUTE_NAME_START_CHAR+"]["+i.ATTRIBUTE_NAME_CHAR+"]*$"),p={},d={},f={createMarkupForID:function(e){return i.ID_ATTRIBUTE_NAME+"="+u(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(r(n,t))return"";var o=n.attributeName;return n.hasBooleanValue||n.hasOverloadedBooleanValue&&!0===t?o+'=""':o+"="+u(t)}return i.isCustomAttribute(e)?null==t?"":e+"="+u(t):null},createMarkupForCustomAttribute:function(e,t){return o(e)&&null!=t?e+"="+u(t):""},setValueForProperty:function(e,n,o){var u=i.properties.hasOwnProperty(n)?i.properties[n]:null;if(u){var c=u.mutationMethod;if(c)c(e,o);else{if(r(u,o))return void this.deleteValueForProperty(e,n);if(u.mustUseProperty)e[u.propertyName]=o;else{var l=u.attributeName,p=u.attributeNamespace;p?e.setAttributeNS(p,l,""+o):u.hasBooleanValue||u.hasOverloadedBooleanValue&&!0===o?e.setAttribute(l,""):e.setAttribute(l,""+o)}}}else if(i.isCustomAttribute(n))return void f.setValueForAttribute(e,n,o);if("production"!==t.env.NODE_ENV){var d={};d[n]=o,s.debugTool.onHostOperation({instanceID:a.getInstanceFromNode(e)._debugID,type:"update attribute",payload:d})}},setValueForAttribute:function(e,n,r){if(o(n)&&(null==r?e.removeAttribute(n):e.setAttribute(n,""+r),"production"!==t.env.NODE_ENV)){var i={};i[n]=r,s.debugTool.onHostOperation({instanceID:a.getInstanceFromNode(e)._debugID,type:"update attribute",payload:i})}},deleteValueForAttribute:function(e,n){e.removeAttribute(n),"production"!==t.env.NODE_ENV&&s.debugTool.onHostOperation({instanceID:a.getInstanceFromNode(e)._debugID,type:"remove attribute",payload:n})},deleteValueForProperty:function(e,n){var o=i.properties.hasOwnProperty(n)?i.properties[n]:null;if(o){var r=o.mutationMethod;if(r)r(e,void 0);else if(o.mustUseProperty){var u=o.propertyName;o.hasBooleanValue?e[u]=!1:e[u]=""}else e.removeAttribute(o.attributeName)}else i.isCustomAttribute(n)&&e.removeAttribute(n);"production"!==t.env.NODE_ENV&&s.debugTool.onHostOperation({instanceID:a.getInstanceFromNode(e)._debugID,type:"remove attribute",payload:n})}};e.exports=f}).call(t,n(0))},function(e,t,n){"use strict";var o={hasCachedChildNodes:1};e.exports=o},function(e,t,n){"use strict";(function(t){function o(){if(this._rootNodeID&&this._wrapperState.pendingUpdate){this._wrapperState.pendingUpdate=!1;var e=this._currentElement.props,t=c.getValue(e);null!=t&&a(this,Boolean(e.multiple),t)}}function r(e){if(e){var t=e.getName();if(t)return" Check the render method of `"+t+"`."}return""}function i(e,n){var o=e._currentElement._owner;c.checkPropTypes("select",n,o),void 0===n.valueLink||f||("production"!==t.env.NODE_ENV&&d(!1,"`valueLink` prop on `select` is deprecated; set `value` and `onChange` instead."),f=!0);for(var i=0;i<m.length;i++){var a=m[i];if(null!=n[a]){var s=Array.isArray(n[a]);n.multiple&&!s?"production"!==t.env.NODE_ENV&&d(!1,"The `%s` prop supplied to <select> must be an array if `multiple` is true.%s",a,r(o)):!n.multiple&&s&&"production"!==t.env.NODE_ENV&&d(!1,"The `%s` prop supplied to <select> must be a scalar value if `multiple` is false.%s",a,r(o))}}}function a(e,t,n){var o,r,i=l.getNodeFromInstance(e).options;if(t){for(o={},r=0;r<n.length;r++)o[""+n[r]]=!0;for(r=0;r<i.length;r++){var a=o.hasOwnProperty(i[r].value);i[r].selected!==a&&(i[r].selected=a)}}else{for(o=""+n,r=0;r<i.length;r++)if(i[r].value===o)return void(i[r].selected=!0);i.length&&(i[0].selected=!0)}}function s(e){var t=this._currentElement.props,n=c.executeOnChange(t,e);return this._rootNodeID&&(this._wrapperState.pendingUpdate=!0),p.asap(o,this),n}var u=n(4),c=n(36),l=n(5),p=n(10),d=n(2),f=!1,h=!1,m=["value","defaultValue"],v={getHostProps:function(e,t){return u({},t,{onChange:e._wrapperState.onChange,value:void 0})},mountWrapper:function(e,n){"production"!==t.env.NODE_ENV&&i(e,n);var o=c.getValue(n);e._wrapperState={pendingUpdate:!1,initialValue:null!=o?o:n.defaultValue,listeners:null,onChange:s.bind(e),wasMultiple:Boolean(n.multiple)},void 0===n.value||void 0===n.defaultValue||h||("production"!==t.env.NODE_ENV&&d(!1,"Select elements must be either controlled or uncontrolled (specify either the value prop, or the defaultValue prop, but not both). Decide between using a controlled or uncontrolled select element and remove one of these props. More info: https://fb.me/react-controlled-components"),h=!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 o=c.getValue(t);null!=o?(e._wrapperState.pendingUpdate=!1,a(e,Boolean(t.multiple),o)):n!==Boolean(t.multiple)&&(null!=t.defaultValue?a(e,Boolean(t.multiple),t.defaultValue):a(e,Boolean(t.multiple),t.multiple?[]:""))}};e.exports=v}).call(t,n(0))},function(e,t,n){"use strict";var o,r={injectEmptyComponentFactory:function(e){o=e}},i={create:function(e){return o(e)}};i.injection=r,e.exports=i},function(e,t,n){"use strict";var o={logTopLevelRenders:!1};e.exports=o},function(e,t,n){"use strict";(function(t){function o(e){return u||("production"!==t.env.NODE_ENV?s(!1,"There is no registered component for the tag %s",e.type):a("111",e.type)),new u(e)}function r(e){return new c(e)}function i(e){return e instanceof c}var a=n(3),s=n(1),u=null,c=null,l={injectGenericComponentClass:function(e){u=e},injectTextComponentClass:function(e){c=e}},p={createInternalComponent:o,createInstanceForText:r,isTextComponent:i,injection:l};e.exports=p}).call(t,n(0))},function(e,t,n){"use strict";function o(e){return i(document.documentElement,e)}var r=n(119),i=n(84),a=n(53),s=n(54),u={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=s();return{focusedElem:e,selectionRange:u.hasSelectionCapabilities(e)?u.getSelection(e):null}},restoreSelection:function(e){var t=s(),n=e.focusedElem,r=e.selectionRange;t!==n&&o(n)&&(u.hasSelectionCapabilities(n)&&u.setSelection(n,r),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=r.getOffsets(e);return t||{start:0,end:0}},setSelection:function(e,t){var n=t.start,o=t.end;if(void 0===o&&(o=n),"selectionStart"in e)e.selectionStart=n,e.selectionEnd=Math.min(o,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",o-n),i.select()}else r.setOffsets(e,t)}};e.exports=u},function(e,t,n){"use strict";(function(t){function o(e,t){for(var n=Math.min(e.length,t.length),o=0;o<n;o++)if(e.charAt(o)!==t.charAt(o))return o;return e.length===t.length?-1:n}function r(e){return e?e.nodeType===j?e.documentElement:e.firstChild:null}function i(e){return e.getAttribute&&e.getAttribute(U)||""}function a(e,t,n,o,r){var i;if(D.logTopLevelRenders){var a=e._currentElement.props.child,s=a.type;i="React mount: "+("string"==typeof s?s:s.displayName||s.name),console.time(i)}var u=T.mountComponent(e,n,null,b(e,t),r,0);i&&console.timeEnd(i),e._renderedComponent._topLevelWrapper=e,Y._mountImageIntoNode(u,t,e,o,n)}function s(e,t,n,o){var r=I.ReactReconcileTransaction.getPooled(!n&&C.useCreateElement);r.perform(a,null,e,t,r,n,o),I.ReactReconcileTransaction.release(r)}function u(e,n,o){for("production"!==t.env.NODE_ENV&&w.debugTool.onBeginFlush(),T.unmountComponent(e,o),"production"!==t.env.NODE_ENV&&w.debugTool.onEndFlush(),n.nodeType===j&&(n=n.documentElement);n.lastChild;)n.removeChild(n.lastChild)}function c(e){var t=r(e);if(t){var n=N.getInstanceFromNode(t);return!(!n||!n._hostParent)}}function l(e){var t=r(e);return!(!t||!d(t)||N.getInstanceFromNode(t))}function p(e){return!(!e||e.nodeType!==F&&e.nodeType!==j&&e.nodeType!==B)}function d(e){return p(e)&&(e.hasAttribute(L)||e.hasAttribute(U))}function f(e){var t=r(e),n=t&&N.getInstanceFromNode(t);return n&&!n._hostParent?n:null}function h(e){var t=f(e);return t?t._hostContainerInfo._topLevelWrapper:null}var m=n(3),v=n(17),g=n(13),y=n(19),E=n(26),_=n(11),N=n(5),b=n(111),C=n(113),D=n(61),O=n(23),w=n(8),x=n(133),T=n(18),k=n(39),I=n(10),P=n(20),S=n(72),V=n(1),R=n(30),M=n(45),A=n(2),U=g.ID_ATTRIBUTE_NAME,L=g.ROOT_ATTRIBUTE_NAME,F=1,j=9,B=11,H={},W=1,q=function(){this.rootID=W++};q.prototype.isReactComponent={},"production"!==t.env.NODE_ENV&&(q.displayName="TopLevelWrapper"),q.prototype.render=function(){return this.props.child},q.isReactTopLevelWrapper=!0;var Y={TopLevelWrapper:q,_instancesByReactRootID:H,scrollMonitor:function(e,t){t()},_updateRootComponent:function(e,t,n,o,r){return Y.scrollMonitor(o,function(){k.enqueueElementInternal(e,t,n),r&&k.enqueueCallbackInternal(e,r)}),e},_renderNewRootComponent:function(e,n,o,r){"production"!==t.env.NODE_ENV&&A(null==_.current,"_renderNewRootComponent(): Render methods should be a pure function of props and state; triggering nested component updates from render is not allowed. If necessary, trigger nested updates in componentDidUpdate. Check the render method of %s.",_.current&&_.current.getName()||"ReactCompositeComponent"),p(n)||("production"!==t.env.NODE_ENV?V(!1,"_registerComponent(...): Target container is not a DOM element."):m("37")),E.ensureScrollValueMonitoring();var i=S(e,!1);I.batchedUpdates(s,i,n,o,r);var a=i._instance.rootID;return H[a]=i,i},renderSubtreeIntoContainer:function(e,n,o,r){return null!=e&&O.has(e)||("production"!==t.env.NODE_ENV?V(!1,"parentComponent must be a valid React Component"):m("38")),Y._renderSubtreeIntoContainer(e,n,o,r)},_renderSubtreeIntoContainer:function(e,n,o,a){k.validateCallback(a,"ReactDOM.render"),y.isValidElement(n)||("production"!==t.env.NODE_ENV?V(!1,"ReactDOM.render(): Invalid component element.%s","string"==typeof n?" Instead of passing a string like 'div', pass React.createElement('div') or <div />.":"function"==typeof n?" Instead of passing a class like Foo, pass React.createElement(Foo) or <Foo />.":null!=n&&void 0!==n.props?" This may be caused by unintentionally loading two independent copies of React.":""):m("39","string"==typeof n?" Instead of passing a string like 'div', pass React.createElement('div') or <div />.":"function"==typeof n?" Instead of passing a class like Foo, pass React.createElement(Foo) or <Foo />.":null!=n&&void 0!==n.props?" This may be caused by unintentionally loading two independent copies of React.":"")),"production"!==t.env.NODE_ENV&&A(!o||!o.tagName||"BODY"!==o.tagName.toUpperCase(),"render(): Rendering components directly into document.body is discouraged, since its children are often manipulated by third-party scripts and browser extensions. This may lead to subtle reconciliation issues. Try rendering into a container element created for your app.");var s,u=y.createElement(q,{child:n});if(e){var l=O.get(e);s=l._processChildContext(l._context)}else s=P;var p=h(o);if(p){var d=p._currentElement,f=d.props.child;if(M(f,n)){var v=p._renderedComponent.getPublicInstance(),g=a&&function(){a.call(v)};return Y._updateRootComponent(p,u,s,o,g),v}Y.unmountComponentAtNode(o)}var E=r(o),_=E&&!!i(E),N=c(o);if("production"!==t.env.NODE_ENV&&("production"!==t.env.NODE_ENV&&A(!N,"render(...): Replacing React-rendered children with a new root component. If you intended to update the children of this node, you should instead have the existing children update their state and render the new components instead of calling ReactDOM.render."),!_||E.nextSibling))for(var b=E;b;){if(i(b)){"production"!==t.env.NODE_ENV&&A(!1,"render(): Target node has markup rendered by React, but there are unrelated nodes as well. This is most commonly caused by white-space inserted around server-rendered markup.");break}b=b.nextSibling}var C=_&&!p&&!N,D=Y._renderNewRootComponent(u,o,C,s)._renderedComponent.getPublicInstance();return a&&a.call(D),D},render:function(e,t,n){return Y._renderSubtreeIntoContainer(null,e,t,n)},unmountComponentAtNode:function(e){"production"!==t.env.NODE_ENV&&A(null==_.current,"unmountComponentAtNode(): Render methods should be a pure function of props and state; triggering nested component updates from render is not allowed. If necessary, trigger nested updates in componentDidUpdate. Check the render method of %s.",_.current&&_.current.getName()||"ReactCompositeComponent"),p(e)||("production"!==t.env.NODE_ENV?V(!1,"unmountComponentAtNode(...): Target container is not a DOM element."):m("40")),"production"!==t.env.NODE_ENV&&"production"!==t.env.NODE_ENV&&A(!l(e),"unmountComponentAtNode(): The node you're attempting to unmount was rendered by another copy of React.");var n=h(e);if(!n){var o=c(e),r=1===e.nodeType&&e.hasAttribute(L);return"production"!==t.env.NODE_ENV&&"production"!==t.env.NODE_ENV&&A(!o,"unmountComponentAtNode(): The node you're attempting to unmount was rendered by React and is not a top-level container. %s",r?"You may have accidentally passed in a React root node instead of its container.":"Instead, have the parent component update its state and rerender in order to remove this component."),!1}return delete H[n._instance.rootID],I.batchedUpdates(u,n,e,!1),!0},_mountImageIntoNode:function(e,n,i,a,s){if(p(n)||("production"!==t.env.NODE_ENV?V(!1,"mountComponentIntoNode(...): Target container is not valid."):m("41")),a){var u=r(n);if(x.canReuseMarkup(e,u))return void N.precacheNode(i,u);var c=u.getAttribute(x.CHECKSUM_ATTR_NAME);u.removeAttribute(x.CHECKSUM_ATTR_NAME);var l=u.outerHTML;u.setAttribute(x.CHECKSUM_ATTR_NAME,c);var d=e;if("production"!==t.env.NODE_ENV){var f;n.nodeType===F?(f=document.createElement("div"),f.innerHTML=e,d=f.innerHTML):(f=document.createElement("iframe"),document.body.appendChild(f),f.contentDocument.write(e),d=f.contentDocument.documentElement.outerHTML,document.body.removeChild(f))}var h=o(d,l),g=" (client) "+d.substring(h-20,h+20)+"\n (server) "+l.substring(h-20,h+20);n.nodeType===j&&("production"!==t.env.NODE_ENV?V(!1,"You're trying to render a component to the document using server rendering but the checksum was invalid. This usually means you rendered a different component type or props on the client from the one on the server, or your render() methods are impure. React cannot handle this case due to cross-browser quirks by rendering at the document root. You should look for environment dependent code in your components and ensure the props are the same client and server side:\n%s",g):m("42",g)),"production"!==t.env.NODE_ENV&&"production"!==t.env.NODE_ENV&&A(!1,"React attempted to reuse markup in a container but the checksum was invalid. This generally means that you are using server rendering and the markup generated on the server was not what the client was expecting. React injected new markup to compensate which works but you have lost many of the benefits of server rendering. Instead, figure out why the markup being generated is different on the client or server:\n%s",g)}if(n.nodeType===j&&("production"!==t.env.NODE_ENV?V(!1,"You're trying to render a component to the document but you didn't use server rendering. We can't do this without using server rendering due to cross-browser quirks. See ReactDOMServer.renderToString() for server rendering."):m("43")),s.useCreateElement){for(;n.lastChild;)n.removeChild(n.lastChild);v.insertTreeBefore(n,e,null)}else R(n,e),N.precacheNode(i,n.firstChild);if("production"!==t.env.NODE_ENV){var y=N.getInstanceFromNode(n.firstChild);0!==y._debugID&&w.debugTool.onHostOperation({instanceID:y._debugID,type:"mount",payload:e.toString()})}}};e.exports=Y}).call(t,n(0))},function(e,t,n){"use strict";(function(t){var o=n(3),r=n(19),i=n(1),a={HOST:0,COMPOSITE:1,EMPTY:2,getType:function(e){return null===e||!1===e?a.EMPTY:r.isValidElement(e)?"function"==typeof e.type?a.COMPOSITE:a.HOST:void("production"!==t.env.NODE_ENV?i(!1,"Unexpected node: %s",e):o("26",e))}};e.exports=a}).call(t,n(0))},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 o={currentScrollLeft:0,currentScrollTop:0,refreshScrollValues:function(e){o.currentScrollLeft=e.x,o.currentScrollTop=e.y}};e.exports=o},function(e,t,n){"use strict";(function(t){function o(e,n){return null==n&&("production"!==t.env.NODE_ENV?i(!1,"accumulateInto(...): Accumulated items must not be null or undefined."):r("30")),null==e?n:Array.isArray(e)?Array.isArray(n)?(e.push.apply(e,n),e):(e.push(n),e):Array.isArray(n)?[e].concat(n):[e,n]}var r=n(3),i=n(1);e.exports=o}).call(t,n(0))},function(e,t,n){"use strict";function o(e,t,n){Array.isArray(e)?e.forEach(t,n):e&&t.call(n,e)}e.exports=o},function(e,t,n){"use strict";function o(e){for(var t;(t=e._renderedNodeType)===r.COMPOSITE;)e=e._renderedComponent;return t===r.HOST?e._renderedComponent:t===r.EMPTY?null:void 0}var r=n(65);e.exports=o},function(e,t,n){"use strict";function o(){return!i&&r.canUseDOM&&(i="textContent"in document.documentElement?"textContent":"innerText"),i}var r=n(6),i=null;e.exports=o},function(e,t,n){"use strict";(function(t){function o(e){if(e){var t=e.getName();if(t)return" Check the render method of `"+t+"`."}return""}function r(e){return"function"==typeof e&&void 0!==e.prototype&&"function"==typeof e.prototype.mountComponent&&"function"==typeof e.prototype.receiveComponent}function i(e,n){var s;if(null===e||!1===e)s=c.create(i);else if("object"==typeof e){var u=e,m=u.type;if("function"!=typeof m&&"string"!=typeof m){var v="";"production"!==t.env.NODE_ENV&&(void 0===m||"object"==typeof m&&null!==m&&0===Object.keys(m).length)&&(v+=" You likely forgot to export your component from the file it's defined in."),v+=o(u._owner),"production"!==t.env.NODE_ENV?d(!1,"Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s",null==m?m:typeof m,v):a("130",null==m?m:typeof m,v)}"string"==typeof u.type?s=l.createInternalComponent(u):r(u.type)?(s=new u.type(u),s.getHostNode||(s.getHostNode=s.getNativeNode)):s=new h(u)}else"string"==typeof e||"number"==typeof e?s=l.createInstanceForText(e):"production"!==t.env.NODE_ENV?d(!1,"Encountered invalid React node of type %s",typeof e):a("131",typeof e);return"production"!==t.env.NODE_ENV&&"production"!==t.env.NODE_ENV&&f("function"==typeof s.mountComponent&&"function"==typeof s.receiveComponent&&"function"==typeof s.getHostNode&&"function"==typeof s.unmountComponent,"Only React Components can be mounted."),s._mountIndex=0,s._mountImage=null,"production"!==t.env.NODE_ENV&&(s._debugID=n?p():0),"production"!==t.env.NODE_ENV&&Object.preventExtensions&&Object.preventExtensions(s),s}var a=n(3),s=n(4),u=n(108),c=n(60),l=n(62),p=n(162),d=n(1),f=n(2),h=function(e){this.construct(e)};s(h.prototype,u,{_instantiateReactComponent:i}),e.exports=i}).call(t,n(0))},function(e,t,n){"use strict";function o(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!r[e.type]:"textarea"===t}var r={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=o},function(e,t,n){"use strict";var o=n(6),r=n(29),i=n(30),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};o.canUseDOM&&("textContent"in document.documentElement||(a=function(e,t){if(3===e.nodeType)return void(e.nodeValue=t);i(e,r(t))})),e.exports=a},function(e,t,n){"use strict";(function(t){function o(e,t){return e&&"object"==typeof e&&null!=e.key?p.escape(e.key):t.toString(36)}function r(e,n,i,v){var g=typeof e;if("undefined"!==g&&"boolean"!==g||(e=null),null===e||"string"===g||"number"===g||"object"===g&&e.$$typeof===u)return i(v,e,""===n?f+o(e,0):n),1;var y,E,_=0,N=""===n?f:n+h;if(Array.isArray(e))for(var b=0;b<e.length;b++)y=e[b],E=N+o(y,b),_+=r(y,E,i,v);else{var C=c(e);if(C){var D,O=C.call(e);if(C!==e.entries)for(var w=0;!(D=O.next()).done;)y=D.value,E=N+o(y,w++),_+=r(y,E,i,v);else{if("production"!==t.env.NODE_ENV){var x="";if(s.current){var T=s.current.getName();T&&(x=" Check the render method of `"+T+"`.")}"production"!==t.env.NODE_ENV&&d(m,"Using Maps as children is not yet fully supported. It is an experimental feature that might be removed. Convert it to a sequence / iterable of keyed ReactElements instead.%s",x),m=!0}for(;!(D=O.next()).done;){var k=D.value;k&&(y=k[1],E=N+p.escape(k[0])+h+o(y,0),_+=r(y,E,i,v))}}}else if("object"===g){var I="";if("production"!==t.env.NODE_ENV&&(I=" If you meant to render a collection of children, use an array instead or wrap the object using createFragment(object) from the React add-ons.",e._isReactElement&&(I=" It looks like you're using an element created by a different version of React. Make sure to use only one copy of React."),s.current)){var P=s.current.getName();P&&(I+=" Check the render method of `"+P+"`.")}var S=String(e);"production"!==t.env.NODE_ENV?l(!1,"Objects are not valid as a React child (found: %s).%s","[object Object]"===S?"object with keys {"+Object.keys(e).join(", ")+"}":S,I):a("31","[object Object]"===S?"object with keys {"+Object.keys(e).join(", ")+"}":S,I)}}return _}function i(e,t,n){return null==e?0:r(e,"",t,n)}var a=n(3),s=n(11),u=n(127),c=n(161),l=n(1),p=n(35),d=n(2),f=".",h=":",m=!1;e.exports=i}).call(t,n(0))},function(e,t,n){"use strict";var o="function"==typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103;e.exports=o},function(e,t,n){"use strict";(function(t){function o(){if(u.current){var e=u.current.getName();if(e)return" Check the render method of `"+e+"`."}return""}function r(e){var t=o();if(!t){var n="string"==typeof e?e:e.displayName||e.name;n&&(t=" Check the top-level render call using <"+n+">.")}return t}function i(e,n){if(e._store&&!e._store.validated&&null==e.key){e._store.validated=!0;var o=m.uniqueKey||(m.uniqueKey={}),i=r(n);if(!o[i]){o[i]=!0;var a="";e&&e._owner&&e._owner!==u.current&&(a=" It was passed a child from "+e._owner.getName()+"."),"production"!==t.env.NODE_ENV&&h(!1,'Each child in an array or iterator should have a unique "key" prop.%s%s See https://fb.me/react-warning-keys for more information.%s',i,a,c.getCurrentStackAddendum(e))}}}function a(e,t){if("object"==typeof e)if(Array.isArray(e))for(var n=0;n<e.length;n++){var o=e[n];l.isValidElement(o)&&i(o,t)}else if(l.isValidElement(e))e._store&&(e._store.validated=!0);else if(e){var r=f(e);if(r&&r!==e.entries)for(var a,s=r.call(e);!(a=s.next()).done;)l.isValidElement(a.value)&&i(a.value,t)}}function s(e){var n=e.type;if("function"==typeof n){var o=n.displayName||n.name;n.propTypes&&p(n.propTypes,e.props,"prop",o,e,null),"function"==typeof n.getDefaultProps&&"production"!==t.env.NODE_ENV&&h(n.getDefaultProps.isReactClassApproved,"getDefaultProps is only used on classic React.createClass definitions. Use a static property named `defaultProps` instead.")}}var u=n(11),c=n(7),l=n(15),p=n(175),d=n(50),f=n(51),h=n(2),m={},v={createElement:function(e,n,r){var i="string"==typeof e||"function"==typeof e;if(!i&&"function"!=typeof e&&"string"!=typeof e){var u="";(void 0===e||"object"==typeof e&&null!==e&&0===Object.keys(e).length)&&(u+=" You likely forgot to export your component from the file it's defined in."),u+=o(),"production"!==t.env.NODE_ENV&&h(!1,"React.createElement: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s",null==e?e:typeof e,u)}var c=l.createElement.apply(this,arguments);if(null==c)return c;if(i)for(var p=2;p<arguments.length;p++)a(arguments[p],e);return s(c),c},createFactory:function(e){var n=v.createElement.bind(null,e);return n.type=e,"production"!==t.env.NODE_ENV&&d&&Object.defineProperty(n,"type",{enumerable:!1,get:function(){return"production"!==t.env.NODE_ENV&&h(!1,"Factory.type is deprecated. Access the class directly before passing it to createFactory."),Object.defineProperty(this,"type",{value:e}),e}}),n},cloneElement:function(e,t,n){for(var o=l.cloneElement.apply(this,arguments),r=2;r<arguments.length;r++)a(arguments[r],o.type);return s(o),o}};e.exports=v}).call(t,n(0))},function(e,t,n){"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},function(e,t,n){"use strict";e.exports=n(109)},function(e,t,n){"use strict";e.exports=n(19)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.React=t.render=void 0;var o=n(80),r=function(e){return e&&e.__esModule?e:{default:e}}(o),i=n(79);t.render=i.render,t.React=r.default},function(e,t,n){"use strict";function o(e){return e.replace(r,function(e,t){return t.toUpperCase()})}var r=/-(.)/g;e.exports=o},function(e,t,n){"use strict";function o(e){return r(e.replace(i,"ms-"))}var r=n(82),i=/^-ms-/;e.exports=o},function(e,t,n){"use strict";function o(e,t){return!(!e||!t)&&(e===t||!r(e)&&(r(t)?o(e,t.parentNode):"contains"in e?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}var r=n(92);e.exports=o},function(e,t,n){"use strict";(function(t){function o(e){var n=e.length;if((Array.isArray(e)||"object"!=typeof e&&"function"!=typeof e)&&("production"!==t.env.NODE_ENV?a(!1,"toArray: Array-like object expected"):a(!1)),"number"!=typeof n&&("production"!==t.env.NODE_ENV?a(!1,"toArray: Object needs a length property"):a(!1)),0===n||n-1 in e||("production"!==t.env.NODE_ENV?a(!1,"toArray: Object should have keys for indices"):a(!1)),"function"==typeof e.callee&&("production"!==t.env.NODE_ENV?a(!1,"toArray: Object can't be `arguments`. Use rest params (function(...args) {}) or Array.from() instead."):a(!1)),e.hasOwnProperty)try{return Array.prototype.slice.call(e)}catch(e){}for(var o=Array(n),r=0;r<n;r++)o[r]=e[r];return o}function r(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 r(e)?Array.isArray(e)?e.slice():o(e):[e]}var a=n(1);e.exports=i}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e){var t=e.match(l);return t&&t[1].toLowerCase()}function r(e,n){var r=c;c||("production"!==t.env.NODE_ENV?u(!1,"createNodesFromMarkup dummy not initialized"):u(!1));var i=o(e),l=i&&s(i);if(l){r.innerHTML=l[1]+e+l[2];for(var p=l[0];p--;)r=r.lastChild}else r.innerHTML=e;var d=r.getElementsByTagName("script");d.length&&(n||("production"!==t.env.NODE_ENV?u(!1,"createNodesFromMarkup(...): Unexpected <script> element rendered."):u(!1)),a(d).forEach(n));for(var f=Array.from(r.childNodes);r.lastChild;)r.removeChild(r.lastChild);return f}var i=n(6),a=n(85),s=n(87),u=n(1),c=i.canUseDOM?document.createElement("div"):null,l=/^\s*<(\w+)/;e.exports=r}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e){return a||("production"!==t.env.NODE_ENV?i(!1,"Markup wrapping node not initialized"):i(!1)),d.hasOwnProperty(e)||(e="*"),s.hasOwnProperty(e)||(a.innerHTML="*"===e?"<link />":"<"+e+"></"+e+">",s[e]=!a.firstChild),s[e]?d[e]:null}var r=n(6),i=n(1),a=r.canUseDOM?document.createElement("div"):null,s={},u=[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>";],d={"*":[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:u,option:u,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){d[e]=p,s[e]=!0}),e.exports=o}).call(t,n(0))},function(e,t,n){"use strict";function o(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=o},function(e,t,n){"use strict";function o(e){return e.replace(r,"-$1").toLowerCase()}var r=/([A-Z])/g;e.exports=o},function(e,t,n){"use strict";function o(e){return r(e).replace(i,"-ms-")}var r=n(89),i=/^ms-/;e.exports=o},function(e,t,n){"use strict";function o(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=o},function(e,t,n){"use strict";function o(e){return r(e)&&3==e.nodeType}var r=n(91);e.exports=o},function(e,t,n){"use strict";function o(e){var t={};return function(n){return t.hasOwnProperty(n)||(t[n]=e.call(this,n)),t[n]}}e.exports=o},function(e,t,n){"use strict";var o,r=n(6);r.canUseDOM&&(o=window.performance||window.msPerformance||window.webkitPerformance),e.exports=o||{}},function(e,t,n){"use strict";var o,r=n(94);o=r.now?function(){return r.now()}:function(){return Date.now()},e.exports=o},function(e,t,n){"use strict";var o={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=o},function(e,t,n){"use strict";var o=n(5),r=n(53),i={focusDOMComponent:function(){r(o.getNodeFromInstance(this))}};e.exports=i},function(e,t,n){"use strict";function o(e){return(e.ctrlKey||e.altKey||e.metaKey)&&!(e.ctrlKey&&e.altKey)}function r(e){switch(e){case"topCompositionStart":return O.compositionStart;case"topCompositionEnd":return O.compositionEnd;case"topCompositionUpdate":return O.compositionUpdate}}function i(e,t){return"topKeyDown"===e&&t.keyCode===y}function a(e,t){switch(e){case"topKeyUp":return-1!==g.indexOf(t.keyCode);case"topKeyDown":return t.keyCode!==y;case"topKeyPress":case"topMouseDown":case"topBlur":return!0;default:return!1}}function s(e){var t=e.detail;return"object"==typeof t&&"data"in t?t.data:null}function u(e,t,n,o){var u,c;if(E?u=r(e):x?a(e,n)&&(u=O.compositionEnd):i(e,n)&&(u=O.compositionStart),!u)return null;b&&(x||u!==O.compositionStart?u===O.compositionEnd&&x&&(c=x.getData()):x=h.getPooled(o));var l=m.getPooled(u,t,n,o);if(c)l.data=c;else{var p=s(n);null!==p&&(l.data=p)}return d.accumulateTwoPhaseDispatches(l),l}function c(e,t){switch(e){case"topCompositionEnd":return s(t);case"topKeyPress":return t.which!==C?null:(w=!0,D);case"topTextInput":var n=t.data;return n===D&&w?null:n;default:return null}}function l(e,t){if(x){if("topCompositionEnd"===e||!E&&a(e,t)){var n=x.getData();return h.release(x),x=null,n}return null}switch(e){case"topPaste":return null;case"topKeyPress":return t.which&&!o(t)?String.fromCharCode(t.which):null;case"topCompositionEnd":return b?null:t.data;default:return null}}function p(e,t,n,o){var r;if(!(r=N?c(e,n):l(e,n)))return null;var i=v.getPooled(O.beforeInput,t,n,o);return i.data=r,d.accumulateTwoPhaseDispatches(i),i}var d=n(22),f=n(6),h=n(104),m=n(147),v=n(150),g=[9,13,27,32],y=229,E=f.canUseDOM&&"CompositionEvent"in window,_=null;f.canUseDOM&&"documentMode"in document&&(_=document.documentMode);var N=f.canUseDOM&&"TextEvent"in window&&!_&&!function(){var e=window.opera;return"object"==typeof e&&"function"==typeof e.version&&parseInt(e.version(),10)<=12}(),b=f.canUseDOM&&(!E||_&&_>8&&_<=11),C=32,D=String.fromCharCode(C),O={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"]}},w=!1,x=null,T={eventTypes:O,extractEvents:function(e,t,n,o){return[u(e,t,n,o),p(e,t,n,o)]}};e.exports=T},function(e,t,n){"use strict";(function(t){var o=n(55),r=n(6),i=n(8),a=n(83),s=n(157),u=n(90),c=n(93),l=n(2),p=c(function(e){return u(e)}),d=!1,f="cssFloat";if(r.canUseDOM){var h=document.createElement("div").style;try{h.font=""}catch(e){d=!0}void 0===document.documentElement.style.cssFloat&&(f="styleFloat")}if("production"!==t.env.NODE_ENV)var m=/^(?:webkit|moz|o)[A-Z]/,v=/;\s*$/,g={},y={},E=!1,_=function(e,n){g.hasOwnProperty(e)&&g[e]||(g[e]=!0,"production"!==t.env.NODE_ENV&&l(!1,"Unsupported style property %s. Did you mean %s?%s",e,a(e),D(n)))},N=function(e,n){g.hasOwnProperty(e)&&g[e]||(g[e]=!0,"production"!==t.env.NODE_ENV&&l(!1,"Unsupported vendor-prefixed style property %s. Did you mean %s?%s",e,e.charAt(0).toUpperCase()+e.slice(1),D(n)))},b=function(e,n,o){y.hasOwnProperty(n)&&y[n]||(y[n]=!0,"production"!==t.env.NODE_ENV&&l(!1,'Style property values shouldn\'t contain a semicolon.%s Try "%s: %s" instead.',D(o),e,n.replace(v,"")))},C=function(e,n,o){E||(E=!0,"production"!==t.env.NODE_ENV&&l(!1,"`NaN` is an invalid value for the `%s` css style property.%s",e,D(o)))},D=function(e){if(e){var t=e.getName();if(t)return" Check the render method of `"+t+"`."}return""},O=function(e,t,n){var o;n&&(o=n._currentElement._owner),e.indexOf("-")>-1?_(e,o):m.test(e)?N(e,o):v.test(t)&&b(e,t,o),"number"==typeof t&&isNaN(t)&&C(e,0,o)};var w={createMarkupForStyles:function(e,n){var o="";for(var r in e)if(e.hasOwnProperty(r)){var i=e[r];"production"!==t.env.NODE_ENV&&O(r,i,n),null!=i&&(o+=p(r)+":",o+=s(r,i,n)+";")}return o||null},setValueForStyles:function(e,n,r){"production"!==t.env.NODE_ENV&&i.debugTool.onHostOperation({instanceID:r._debugID,type:"update styles",payload:n});var a=e.style;for(var u in n)if(n.hasOwnProperty(u)){"production"!==t.env.NODE_ENV&&O(u,n[u],r);var c=s(u,n[u],r);if("float"!==u&&"cssFloat"!==u||(u=f),c)a[u]=c;else{var l=d&&o.shorthandPropertyExpansions[u];if(l)for(var p in l)a[p]="";else a[u]=""}}}};e.exports=w}).call(t,n(0))},function(e,t,n){"use strict";function o(e){var t=e.nodeName&&e.nodeName.toLowerCase();return"select"===t||"input"===t&&"file"===e.type}function r(e){var t=C.getPooled(x.change,k,e,D(e));E.accumulateTwoPhaseDispatches(t),b.batchedUpdates(i,t)}function i(e){y.enqueueEvents(e),y.processEventQueue(!1)}function a(e,t){T=e,k=t,T.attachEvent("onchange",r)}function s(){T&&(T.detachEvent("onchange",r),T=null,k=null)}function u(e,t){if("topChange"===e)return t}function c(e,t,n){"topFocus"===e?(s(),a(t,n)):"topBlur"===e&&s()}function l(e,t){T=e,k=t,I=e.value,P=Object.getOwnPropertyDescriptor(e.constructor.prototype,"value"),Object.defineProperty(T,"value",R),T.attachEvent?T.attachEvent("onpropertychange",d):T.addEventListener("propertychange",d,!1)}function p(){T&&(delete T.value,T.detachEvent?T.detachEvent("onpropertychange",d):T.removeEventListener("propertychange",d,!1),T=null,k=null,I=null,P=null)}function d(e){if("value"===e.propertyName){var t=e.srcElement.value;t!==I&&(I=t,r(e))}}function f(e,t){if("topInput"===e)return t}function h(e,t,n){"topFocus"===e?(p(),l(t,n)):"topBlur"===e&&p()}function m(e,t){if(("topSelectionChange"===e||"topKeyUp"===e||"topKeyDown"===e)&&T&&T.value!==I)return I=T.value,k}function v(e){return e.nodeName&&"input"===e.nodeName.toLowerCase()&&("checkbox"===e.type||"radio"===e.type)}function g(e,t){if("topClick"===e)return t}var y=n(21),E=n(22),_=n(6),N=n(5),b=n(10),C=n(12),D=n(43),O=n(44),w=n(73),x={change:{phasedRegistrationNames:{bubbled:"onChange",captured:"onChangeCapture"},dependencies:["topBlur","topChange","topClick","topFocus","topInput","topKeyDown","topKeyUp","topSelectionChange"]}},T=null,k=null,I=null,P=null,S=!1;_.canUseDOM&&(S=O("change")&&(!document.documentMode||document.documentMode>8));var V=!1;_.canUseDOM&&(V=O("input")&&(!document.documentMode||document.documentMode>11));var R={get:function(){return P.get.call(this)},set:function(e){I=""+e,P.set.call(this,e)}},M={eventTypes:x,extractEvents:function(e,t,n,r){var i,a,s=t?N.getNodeFromInstance(t):window;if(o(s)?S?i=u:a=c:w(s)?V?i=f:(i=m,a=h):v(s)&&(i=g),i){var l=i(e,t);if(l){var p=C.getPooled(x.change,l,n,r);return p.type="change",E.accumulateTwoPhaseDispatches(p),p}}a&&a(e,s,t)}};e.exports=M},function(e,t,n){"use strict";(function(t){var o=n(3),r=n(17),i=n(6),a=n(86),s=n(9),u=n(1),c={dangerouslyReplaceNodeWithMarkup:function(e,n){if(i.canUseDOM||("production"!==t.env.NODE_ENV?u(!1,"dangerouslyReplaceNodeWithMarkup(...): Cannot render markup in a worker thread. Make sure `window` and `document` are available globally before requiring React when unit testing or use ReactDOMServer.renderToString() for server rendering."):o("56")),n||("production"!==t.env.NODE_ENV?u(!1,"dangerouslyReplaceNodeWithMarkup(...): Missing markup."):o("57")),"HTML"===e.nodeName&&("production"!==t.env.NODE_ENV?u(!1,"dangerouslyReplaceNodeWithMarkup(...): Cannot replace markup of the <html> node. This is because browser quirks make this unreliable and/or slow. If you want to render to the root you must use server rendering. See ReactDOMServer.renderToString()."):o("58")),"string"==typeof n){var c=a(n,s)[0];e.parentNode.replaceChild(c,e)}else r.replaceChildWithTree(e,n)}};e.exports=c}).call(t,n(0))},function(e,t,n){"use strict";var o=["ResponderEventPlugin","SimpleEventPlugin","TapEventPlugin","EnterLeaveEventPlugin","ChangeEventPlugin","SelectEventPlugin","BeforeInputEventPlugin"];e.exports=o},function(e,t,n){"use strict";var o=n(22),r=n(5),i=n(27),a={mouseEnter:{registrationName:"onMouseEnter",dependencies:["topMouseOut","topMouseOver"]},mouseLeave:{registrationName:"onMouseLeave",dependencies:["topMouseOut","topMouseOver"]}},s={eventTypes:a,extractEvents:function(e,t,n,s){if("topMouseOver"===e&&(n.relatedTarget||n.fromElement))return null;if("topMouseOut"!==e&&"topMouseOver"!==e)return null;var u;if(s.window===s)u=s;else{var c=s.ownerDocument;u=c?c.defaultView||c.parentWindow:window}var l,p;if("topMouseOut"===e){l=t;var d=n.relatedTarget||n.toElement;p=d?r.getClosestInstanceFromNode(d):null}else l=null,p=t;if(l===p)return null;var f=null==l?u:r.getNodeFromInstance(l),h=null==p?u:r.getNodeFromInstance(p),m=i.getPooled(a.mouseLeave,l,n,s);m.type="mouseleave",m.target=f,m.relatedTarget=h;var v=i.getPooled(a.mouseEnter,p,n,s);return v.type="mouseenter",v.target=h,v.relatedTarget=f,o.accumulateEnterLeaveDispatches(m,v,l,p),[m,v]}};e.exports=s},function(e,t,n){"use strict";function o(e){this._root=e,this._startText=this.getText(),this._fallbackText=null}var r=n(4),i=n(14),a=n(71);r(o.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,o=n.length,r=this.getText(),i=r.length;for(e=0;e<o&&n[e]===r[e];e++);var a=o-e;for(t=1;t<=a&&n[o-t]===r[i-t];t++);var s=t>1?1-t:void 0;return this._fallbackText=r.slice(e,s),this._fallbackText}}),i.addPoolingTo(o),e.exports=o},function(e,t,n){"use strict";var o=n(13),r=o.injection.MUST_USE_PROPERTY,i=o.injection.HAS_BOOLEAN_VALUE,a=o.injection.HAS_NUMERIC_VALUE,s=o.injection.HAS_POSITIVE_NUMERIC_VALUE,u=o.injection.HAS_OVERLOADED_BOOLEAN_VALUE,c={isCustomAttribute:RegExp.prototype.test.bind(new RegExp("^(data|aria)-["+o.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:r|i,cite:0,classID:0,className:0,cols:s,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:u,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:r|i,muted:r|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:s,rowSpan:a,sandbox:0,scope:0,scoped:i,scrolling:0,seamless:i,selected:r|i,shape:0,size:s,sizes:0,span:s,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:{}};e.exports=c},function(e,t,n){"use strict";(function(t){function o(e,o,i,u){var c=void 0===e[i];"production"!==t.env.NODE_ENV&&(r||(r=n(7)),c||"production"!==t.env.NODE_ENV&&l(!1,"flattenChildren(...): Encountered two children with the same key, `%s`. Child keys must be unique; when two children share a key, only the first child will be used.%s",s.unescape(i),r.getStackAddendumByID(u))),null!=o&&c&&(e[i]=a(o,!0))}var r,i=n(18),a=n(72),s=n(35),u=n(45),c=n(75),l=n(2);void 0!==t&&t.env&&"test"===t.env.NODE_ENV&&(r=n(7));var p={instantiateChildren:function(e,n,r,i){if(null==e)return null;var a={};return"production"!==t.env.NODE_ENV?c(e,function(e,t,n){return o(e,t,n,i)},a):c(e,o,a),a},updateChildren:function(e,t,n,o,r,s,c,l,p){if(t||e){var d,f;for(d in t)if(t.hasOwnProperty(d)){f=e&&e[d];var h=f&&f._currentElement,m=t[d];if(null!=f&&u(h,m))i.receiveComponent(f,m,r,l),t[d]=f;else{f&&(o[d]=i.getHostNode(f),i.unmountComponent(f,!1));var v=a(m,!0);t[d]=v;var g=i.mountComponent(v,r,s,c,l,p);n.push(g)}}for(d in e)!e.hasOwnProperty(d)||t&&t.hasOwnProperty(d)||(f=e[d],o[d]=i.getHostNode(f),i.unmountComponent(f,!1))}},unmountChildren:function(e,t){for(var n in e)if(e.hasOwnProperty(n)){var o=e[n];i.unmountComponent(o,t)}}};e.exports=p}).call(t,n(0))},function(e,t,n){"use strict";var o=n(32),r=n(114),i={processChildrenUpdates:r.dangerouslyProcessChildrenUpdates,replaceNodeWithMarkup:o.dangerouslyReplaceNodeWithMarkup};e.exports=i},function(e,t,n){"use strict";(function(t){function o(e){}function r(e,n){"production"!==t.env.NODE_ENV&&("production"!==t.env.NODE_ENV&&C(null===n||!1===n||l.isValidElement(n),"%s(...): A valid React element (or null) must be returned. You may have returned undefined, an array or some other invalid object.",e.displayName||e.name||"Component"),"production"!==t.env.NODE_ENV&&C(!e.childContextTypes,"%s(...): childContextTypes cannot be defined on a functional component.",e.displayName||e.name||"Component"))}function i(e){return!(!e.prototype||!e.prototype.isReactComponent)}function a(e){return!(!e.prototype||!e.prototype.isPureReactComponent)}function s(e,t,n){if(0===t)return e();m.debugTool.onBeginLifeCycleTimer(t,n);try{return e()}finally{m.debugTool.onEndLifeCycleTimer(t,n)}}var u=n(3),c=n(4),l=n(19),p=n(37),d=n(11),f=n(38),h=n(23),m=n(8),v=n(65),g=n(18);if("production"!==t.env.NODE_ENV)var y=n(156);var E=n(20),_=n(1),N=n(31),b=n(45),C=n(2),D={ImpureClass:0,PureClass:1,StatelessFunctional:2};o.prototype.render=function(){var e=h.get(this)._currentElement.type,t=e(this.props,this.context,this.updater);return r(e,t),t};var O=1,w={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,"production"!==t.env.NODE_ENV&&(this._warnedAboutRefsInRender=!1)},mountComponent:function(e,n,c,p){var d=this;this._context=p,this._mountOrder=O++,this._hostParent=n,this._hostContainerInfo=c;var f,m=this._currentElement.props,v=this._processContext(p),g=this._currentElement.type,y=e.getUpdateQueue(),N=i(g),b=this._constructComponent(N,m,v,y);if(N||null!=b&&null!=b.render?a(g)?this._compositeType=D.PureClass:this._compositeType=D.ImpureClass:(f=b,r(g,f),null===b||!1===b||l.isValidElement(b)||("production"!==t.env.NODE_ENV?_(!1,"%s(...): A valid React element (or null) must be returned. You may have returned undefined, an array or some other invalid object.",g.displayName||g.name||"Component"):u("105",g.displayName||g.name||"Component")),b=new o(g),this._compositeType=D.StatelessFunctional),"production"!==t.env.NODE_ENV){null==b.render&&"production"!==t.env.NODE_ENV&&C(!1,"%s(...): No `render` method found on the returned component instance: you may have forgotten to define `render`.",g.displayName||g.name||"Component");var w=b.props!==m,x=g.displayName||g.name||"Component";"production"!==t.env.NODE_ENV&&C(void 0===b.props||!w,"%s(...): When calling super() in `%s`, make sure to pass up the same props that your component's constructor was passed.",x,x)}b.props=m,b.context=v,b.refs=E,b.updater=y,this._instance=b,h.set(b,this),"production"!==t.env.NODE_ENV&&("production"!==t.env.NODE_ENV&&C(!b.getInitialState||b.getInitialState.isReactClassApproved||b.state,"getInitialState was defined on %s, a plain JavaScript class. This is only supported for classes created using React.createClass. Did you mean to define a state property instead?",this.getName()||"a component"),"production"!==t.env.NODE_ENV&&C(!b.getDefaultProps||b.getDefaultProps.isReactClassApproved,"getDefaultProps was defined on %s, a plain JavaScript class. This is only supported for classes created using React.createClass. Use a static property to define defaultProps instead.",this.getName()||"a component"),"production"!==t.env.NODE_ENV&&C(!b.propTypes,"propTypes was defined as an instance property on %s. Use a static property to define propTypes instead.",this.getName()||"a component"),"production"!==t.env.NODE_ENV&&C(!b.contextTypes,"contextTypes was defined as an instance property on %s. Use a static property to define contextTypes instead.",this.getName()||"a component"),"production"!==t.env.NODE_ENV&&C("function"!=typeof b.componentShouldUpdate,"%s has a method called componentShouldUpdate(). Did you mean shouldComponentUpdate()? The name is phrased as a question because the function is expected to return a value.",this.getName()||"A component"),"production"!==t.env.NODE_ENV&&C("function"!=typeof b.componentDidUnmount,"%s has a method called componentDidUnmount(). But there is no such lifecycle method. Did you mean componentWillUnmount()?",this.getName()||"A component"),"production"!==t.env.NODE_ENV&&C("function"!=typeof b.componentWillRecieveProps,"%s has a method called componentWillRecieveProps(). Did you mean componentWillReceiveProps()?",this.getName()||"A component"));var T=b.state;void 0===T&&(b.state=T=null),("object"!=typeof T||Array.isArray(T))&&("production"!==t.env.NODE_ENV?_(!1,"%s.state: must be set to an object or null",this.getName()||"ReactCompositeComponent"):u("106",this.getName()||"ReactCompositeComponent")),this._pendingStateQueue=null,this._pendingReplaceState=!1,this._pendingForceUpdate=!1;var k;return k=b.unstable_handleError?this.performInitialMountWithErrorHandling(f,n,c,e,p):this.performInitialMount(f,n,c,e,p),b.componentDidMount&&("production"!==t.env.NODE_ENV?e.getReactMountReady().enqueue(function(){s(function(){return b.componentDidMount()},d._debugID,"componentDidMount")}):e.getReactMountReady().enqueue(b.componentDidMount,b)),k},_constructComponent:function(e,n,o,r){if("production"===t.env.NODE_ENV)return this._constructComponentWithoutOwner(e,n,o,r);d.current=this;try{return this._constructComponentWithoutOwner(e,n,o,r)}finally{d.current=null}},_constructComponentWithoutOwner:function(e,n,o,r){var i=this._currentElement.type;return e?"production"!==t.env.NODE_ENV?s(function(){return new i(n,o,r)},this._debugID,"ctor"):new i(n,o,r):"production"!==t.env.NODE_ENV?s(function(){return i(n,o,r)},this._debugID,"render"):i(n,o,r)},performInitialMountWithErrorHandling:function(e,t,n,o,r){var i,a=o.checkpoint();try{i=this.performInitialMount(e,t,n,o,r)}catch(s){o.rollback(a),this._instance.unstable_handleError(s),this._pendingStateQueue&&(this._instance.state=this._processPendingState(this._instance.props,this._instance.context)),a=o.checkpoint(),this._renderedComponent.unmountComponent(!0),o.rollback(a),i=this.performInitialMount(e,t,n,o,r)}return i},performInitialMount:function(e,n,o,r,i){var a=this._instance,u=0;"production"!==t.env.NODE_ENV&&(u=this._debugID),a.componentWillMount&&("production"!==t.env.NODE_ENV?s(function(){return a.componentWillMount()},u,"componentWillMount"):a.componentWillMount(),this._pendingStateQueue&&(a.state=this._processPendingState(a.props,a.context))),void 0===e&&(e=this._renderValidatedComponent());var c=v.getType(e);this._renderedNodeType=c;var l=this._instantiateReactComponent(e,c!==v.EMPTY);this._renderedComponent=l;var p=g.mountComponent(l,r,n,o,this._processChildContext(i),u);if("production"!==t.env.NODE_ENV&&0!==u){var d=0!==l._debugID?[l._debugID]:[];m.debugTool.onSetChildren(u,d)}return p},getHostNode:function(){return g.getHostNode(this._renderedComponent)},unmountComponent:function(e){if(this._renderedComponent){var n=this._instance;if(n.componentWillUnmount&&!n._calledComponentWillUnmount)if(n._calledComponentWillUnmount=!0,e){var o=this.getName()+".componentWillUnmount()";f.invokeGuardedCallback(o,n.componentWillUnmount.bind(n))}else"production"!==t.env.NODE_ENV?s(function(){return n.componentWillUnmount()},this._debugID,"componentWillUnmount"):n.componentWillUnmount();this._renderedComponent&&(g.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,h.remove(n)}},_maskContext:function(e){var t=this._currentElement.type,n=t.contextTypes;if(!n)return E;var o={};for(var r in n)o[r]=e[r];return o},_processContext:function(e){var n=this._maskContext(e);if("production"!==t.env.NODE_ENV){var o=this._currentElement.type;o.contextTypes&&this._checkContextTypes(o.contextTypes,n,"context")}return n},_processChildContext:function(e){var n,o=this._currentElement.type,r=this._instance;if(r.getChildContext)if("production"!==t.env.NODE_ENV){m.debugTool.onBeginProcessingChildContext();try{n=r.getChildContext()}finally{m.debugTool.onEndProcessingChildContext()}}else n=r.getChildContext();if(n){"object"!=typeof o.childContextTypes&&("production"!==t.env.NODE_ENV?_(!1,"%s.getChildContext(): childContextTypes must be defined in order to use getChildContext().",this.getName()||"ReactCompositeComponent"):u("107",this.getName()||"ReactCompositeComponent")),"production"!==t.env.NODE_ENV&&this._checkContextTypes(o.childContextTypes,n,"childContext");for(var i in n)i in o.childContextTypes||("production"!==t.env.NODE_ENV?_(!1,'%s.getChildContext(): key "%s" is not defined in childContextTypes.',this.getName()||"ReactCompositeComponent",i):u("108",this.getName()||"ReactCompositeComponent",i));return c({},e,n)}return e},_checkContextTypes:function(e,n,o){"production"!==t.env.NODE_ENV&&y(e,n,o,this.getName(),null,this._debugID)},receiveComponent:function(e,t,n){var o=this._currentElement,r=this._context;this._pendingElement=null,this.updateComponent(t,o,e,r,n)},performUpdateIfNecessary:function(e){null!=this._pendingElement?g.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,n,o,r,i){var a=this._instance;null==a&&("production"!==t.env.NODE_ENV?_(!1,"Attempted to update component `%s` that has already been unmounted (or failed to mount).",this.getName()||"ReactCompositeComponent"):u("136",this.getName()||"ReactCompositeComponent"));var c,l=!1;this._context===i?c=a.context:(c=this._processContext(i),l=!0);var p=n.props,d=o.props;n!==o&&(l=!0),l&&a.componentWillReceiveProps&&("production"!==t.env.NODE_ENV?s(function(){return a.componentWillReceiveProps(d,c)},this._debugID,"componentWillReceiveProps"):a.componentWillReceiveProps(d,c));var f=this._processPendingState(d,c),h=!0;this._pendingForceUpdate||(a.shouldComponentUpdate?h="production"!==t.env.NODE_ENV?s(function(){return a.shouldComponentUpdate(d,f,c)},this._debugID,"shouldComponentUpdate"):a.shouldComponentUpdate(d,f,c):this._compositeType===D.PureClass&&(h=!N(p,d)||!N(a.state,f))),"production"!==t.env.NODE_ENV&&"production"!==t.env.NODE_ENV&&C(void 0!==h,"%s.shouldComponentUpdate(): Returned undefined instead of a boolean value. Make sure to return true or false.",this.getName()||"ReactCompositeComponent"),this._updateBatchNumber=null,h?(this._pendingForceUpdate=!1,this._performComponentUpdate(o,d,f,c,e,i)):(this._currentElement=o,this._context=i,a.props=d,a.state=f,a.context=c)},_processPendingState:function(e,t){var n=this._instance,o=this._pendingStateQueue,r=this._pendingReplaceState;if(this._pendingReplaceState=!1,this._pendingStateQueue=null,!o)return n.state;if(r&&1===o.length)return o[0];for(var i=c({},r?o[0]:n.state),a=r?1:0;a<o.length;a++){var s=o[a];c(i,"function"==typeof s?s.call(n,i,e,t):s)}return i},_performComponentUpdate:function(e,n,o,r,i,a){var u,c,l,p=this,d=this._instance,f=Boolean(d.componentDidUpdate);f&&(u=d.props,c=d.state,l=d.context),d.componentWillUpdate&&("production"!==t.env.NODE_ENV?s(function(){return d.componentWillUpdate(n,o,r)},this._debugID,"componentWillUpdate"):d.componentWillUpdate(n,o,r)),this._currentElement=e,this._context=a,d.props=n,d.state=o,d.context=r,this._updateRenderedComponent(i,a),f&&("production"!==t.env.NODE_ENV?i.getReactMountReady().enqueue(function(){s(d.componentDidUpdate.bind(d,u,c,l),p._debugID,"componentDidUpdate")}):i.getReactMountReady().enqueue(d.componentDidUpdate.bind(d,u,c,l),d))},_updateRenderedComponent:function(e,n){var o=this._renderedComponent,r=o._currentElement,i=this._renderValidatedComponent(),a=0;if("production"!==t.env.NODE_ENV&&(a=this._debugID),b(r,i))g.receiveComponent(o,i,e,this._processChildContext(n));else{var s=g.getHostNode(o);g.unmountComponent(o,!1);var u=v.getType(i);this._renderedNodeType=u;var c=this._instantiateReactComponent(i,u!==v.EMPTY);this._renderedComponent=c;var l=g.mountComponent(c,e,this._hostParent,this._hostContainerInfo,this._processChildContext(n),a);if("production"!==t.env.NODE_ENV&&0!==a){var p=0!==c._debugID?[c._debugID]:[];m.debugTool.onSetChildren(a,p)}this._replaceNodeWithMarkup(s,l,o)}},_replaceNodeWithMarkup:function(e,t,n){p.replaceNodeWithMarkup(e,t,n)},_renderValidatedComponentWithoutOwnerOrContext:function(){var e,n=this._instance;return e="production"!==t.env.NODE_ENV?s(function(){return n.render()},this._debugID,"render"):n.render(),"production"!==t.env.NODE_ENV&&void 0===e&&n.render._isMockFunction&&(e=null),e},_renderValidatedComponent:function(){var e;if("production"!==t.env.NODE_ENV||this._compositeType!==D.StatelessFunctional){d.current=this;try{e=this._renderValidatedComponentWithoutOwnerOrContext()}finally{d.current=null}}else e=this._renderValidatedComponentWithoutOwnerOrContext();return null===e||!1===e||l.isValidElement(e)||("production"!==t.env.NODE_ENV?_(!1,"%s.render(): A valid React element (or null) must be returned. You may have returned undefined, an array or some other invalid object.",this.getName()||"ReactCompositeComponent"):u("109",this.getName()||"ReactCompositeComponent")),e},attachRef:function(e,n){var o=this.getPublicInstance();null==o&&("production"!==t.env.NODE_ENV?_(!1,"Stateless function components cannot have refs."):u("110"));var r=n.getPublicInstance();if("production"!==t.env.NODE_ENV){var i=n&&n.getName?n.getName():"a component";"production"!==t.env.NODE_ENV&&C(null!=r||n._compositeType!==D.StatelessFunctional,'Stateless function components cannot be given refs (See ref "%s" in %s created by %s). Attempts to access this ref will fail.',e,i,this.getName())}(o.refs===E?o.refs={}:o.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===D.StatelessFunctional?null:e},_instantiateReactComponent:null};e.exports=w}).call(t,n(0))},function(e,t,n){"use strict";(function(t){var o=n(5),r=n(126),i=n(64),a=n(18),s=n(10),u=n(141),c=n(158),l=n(70),p=n(166),d=n(2);r.inject();var f={findDOMNode:c,render:i.render,unmountComponentAtNode:i.unmountComponentAtNode,version:u,unstable_batchedUpdates:s.batchedUpdates,unstable_renderSubtreeIntoContainer:p};if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.inject&&__REACT_DEVTOOLS_GLOBAL_HOOK__.inject({ComponentTree:{getClosestInstanceFromNode:o.getClosestInstanceFromNode,getNodeFromInstance:function(e){return e._renderedComponent&&(e=l(e)),e?o.getNodeFromInstance(e):null}},Mount:i,Reconciler:a}),"production"!==t.env.NODE_ENV){if(n(6).canUseDOM&&window.top===window.self){if("undefined"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&(navigator.userAgent.indexOf("Chrome")>-1&&-1===navigator.userAgent.indexOf("Edge")||navigator.userAgent.indexOf("Firefox")>-1)){var h=-1===window.location.protocol.indexOf("http")&&-1===navigator.userAgent.indexOf("Firefox");console.debug("Download the React DevTools "+(h?"and use an HTTP server (instead of a file: URL) ":"")+"for a better development experience: https://fb.me/react-devtools";)}var m=function(){};"production"!==t.env.NODE_ENV&&d(-1!==(m.name||m.toString()).indexOf("testFn"),"It looks like you're using a minified copy of the development build of React. When deploying React apps to production, make sure to use the production build which skips development warnings and is faster. See https://fb.me/react-minification for more details.");var v=document.documentMode&&document.documentMode<8;"production"!==t.env.NODE_ENV&&d(!v,'Internet Explorer is running in compatibility mode; please add the following tag to your HTML to prevent this from happening: <meta http-equiv="X-UA-Compatible" content="IE=edge" />');for(var g=[Array.isArray,Array.prototype.every,Array.prototype.forEach,Array.prototype.indexOf,Array.prototype.map,Date.now,Function.prototype.bind,Object.keys,String.prototype.trim],y=0;y<g.length;y++)if(!g[y]){"production"!==t.env.NODE_ENV&&d(!1,"One or more ES5 shims expected by React are not available: https://fb.me/react-warning-polyfills");break}}}if("production"!==t.env.NODE_ENV){var E=n(8),_=n(123),N=n(117),b=n(116);E.debugTool.addHook(_),E.debugTool.addHook(N),E.debugTool.addHook(b)}e.exports=f}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(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 r(e){if("object"==typeof e){if(Array.isArray(e))return"["+e.map(r).join(", ")+"]";var t=[];for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){var o=/^[a-z$_][\w$_]*$/i.test(n)?n:JSON.stringify(n);t.push(o+": "+r(e[n]))}return"{"+t.join(", ")+"}"}return"string"==typeof e?JSON.stringify(e):"function"==typeof e?"[function object]":String(e)}function i(e,n,o){if(null!=e&&null!=n&&!B(e,n)){var i,a=o._tag,s=o._currentElement._owner;s&&(i=s.getName());var u=i+"|"+a;Z.hasOwnProperty(u)||(Z[u]=!0,"production"!==t.env.NODE_ENV&&W(!1,"`%s` was passed a style object that has previously been mutated. Mutating `style` is deprecated. Consider cloning it beforehand. Check the `render` %s. Previous style: %s. Mutated style: %s.",a,s?"of `"+i+"`":"using <"+a+">",r(e),r(n)))}}function a(e,n){n&&(re[e._tag]&&(null!=n.children||null!=n.dangerouslySetInnerHTML)&&("production"!==t.env.NODE_ENV?F(!1,"%s is a void element tag and must neither have `children` nor use `dangerouslySetInnerHTML`.%s",e._tag,e._currentElement._owner?" Check the render method of "+e._currentElement._owner.getName()+".":""):g("137",e._tag,e._currentElement._owner?" Check the render method of "+e._currentElement._owner.getName()+".":"")),null!=n.dangerouslySetInnerHTML&&(null!=n.children&&("production"!==t.env.NODE_ENV?F(!1,"Can only set one of `children` or `props.dangerouslySetInnerHTML`."):g("60")),"object"==typeof n.dangerouslySetInnerHTML&&G in n.dangerouslySetInnerHTML||("production"!==t.env.NODE_ENV?F(!1,"`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. Please visit https://fb.me/react-invariant-dangerously-set-inner-html for more information."):g("61"))),"production"!==t.env.NODE_ENV&&("production"!==t.env.NODE_ENV&&W(null==n.innerHTML,"Directly setting property `innerHTML` is not permitted. For more information, lookup documentation on `dangerouslySetInnerHTML`."),"production"!==t.env.NODE_ENV&&W(n.suppressContentEditableWarning||!n.contentEditable||null==n.children,"A component is `contentEditable` and contains `children` managed by React. It is now your responsibility to guarantee that none of those nodes are unexpectedly modified or duplicated. This is probably not intentional."),"production"!==t.env.NODE_ENV&&W(null==n.onFocusIn&&null==n.onFocusOut,"React uses onFocus and onBlur instead of onFocusIn and onFocusOut. All React events are normalized to bubble, so onFocusIn and onFocusOut are not needed/supported by React.")),null!=n.style&&"object"!=typeof n.style&&("production"!==t.env.NODE_ENV?F(!1,"The `style` prop expects a mapping from style properties to values, not a string. For example, style={{marginRight: spacing + 'em'}} when using JSX.%s",o(e)):g("62",o(e))))}function s(e,n,o,r){if(!(r instanceof A)){"production"!==t.env.NODE_ENV&&"production"!==t.env.NODE_ENV&&W("onScroll"!==n||j("scroll",!0),"This browser doesn't support the `onScroll` event");var i=e._hostContainerInfo,a=i._node&&i._node.nodeType===J,s=a?i._node:i._ownerDocument;z(n,s),r.getReactMountReady().enqueue(u,{inst:e,registrationName:n,listener:o})}}function u(){var e=this;O.putListener(e.inst,e.registrationName,e.listener)}function c(){var e=this;I.postMountWrapper(e)}function l(){var e=this;V.postMountWrapper(e)}function p(){var e=this;P.postMountWrapper(e)}function d(){var e=this;e._rootNodeID||("production"!==t.env.NODE_ENV?F(!1,"Must be mounted to trap events"):g("63"));var n=K(e);switch(n||("production"!==t.env.NODE_ENV?F(!1,"trapBubbledEvent(...): Requires node to be rendered."):g("64")),e._tag){case"iframe":case"object":e._wrapperState.listeners=[x.trapBubbledEvent("topLoad","load",n)];break;case"video":case"audio":e._wrapperState.listeners=[];for(var o in te)te.hasOwnProperty(o)&&e._wrapperState.listeners.push(x.trapBubbledEvent(o,te[o],n));break;case"source":e._wrapperState.listeners=[x.trapBubbledEvent("topError","error",n)];break;case"img":e._wrapperState.listeners=[x.trapBubbledEvent("topError","error",n),x.trapBubbledEvent("topLoad","load",n)];break;case"form":e._wrapperState.listeners=[x.trapBubbledEvent("topReset","reset",n),x.trapBubbledEvent("topSubmit","submit",n)];break;case"input":case"select":case"textarea":e._wrapperState.listeners=[x.trapBubbledEvent("topInvalid","invalid",n)]}}function f(){S.postUpdateWrapper(this)}function h(e){se.call(ae,e)||(ie.test(e)||("production"!==t.env.NODE_ENV?F(!1,"Invalid tag: %s",e):g("65",e)),ae[e]=!0)}function m(e,t){return e.indexOf("-")>=0||null!=t.is}function v(e){var n=e.type;h(n),this._currentElement=e,this._tag=n.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,"production"!==t.env.NODE_ENV&&(this._ancestorInfo=null,ee.call(this,null))}var g=n(3),y=n(4),E=n(97),_=n(99),N=n(17),b=n(33),C=n(13),D=n(57),O=n(21),w=n(25),x=n(26),T=n(58),k=n(5),I=n(115),P=n(118),S=n(59),V=n(121),R=n(8),M=n(134),A=n(139),U=n(9),L=n(29),F=n(1),j=n(44),B=n(31),H=n(46),W=n(2),q=T,Y=O.deleteListener,K=k.getNodeFromInstance,z=x.listenTo,X=w.registrationNameModules,$={string:!0,number:!0},G="__html",Q={children:null,dangerouslySetInnerHTML:null,suppressContentEditableWarning:null},J=11,Z={},ee=U;"production"!==t.env.NODE_ENV&&(ee=function(e){var t=null!=this._contentDebugID,n=this._debugID,o=-n;if(null==e)return t&&R.debugTool.onUnmountComponent(this._contentDebugID),void(this._contentDebugID=null);H(null,String(e),this,this._ancestorInfo),this._contentDebugID=o,t?(R.debugTool.onBeforeUpdateComponent(o,e),R.debugTool.onUpdateComponent(o)):(R.debugTool.onBeforeMountComponent(o,e,n),R.debugTool.onMountComponent(o),R.debugTool.onSetChildren(n,[o]))});var te={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"},ne={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},oe={listing:!0,pre:!0,textarea:!0},re=y({menuitem:!0},ne),ie=/^[a-zA-Z][a-zA-Z:_\.\-\d]*$/,ae={},se={}.hasOwnProperty,ue=1;v.displayName="ReactDOMComponent",v.Mixin={mountComponent:function(e,n,o,r){this._rootNodeID=ue++,this._domID=o._idCounter++,this._hostParent=n,this._hostContainerInfo=o;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(d,this);break;case"input":I.mountWrapper(this,i,n),i=I.getHostProps(this,i),e.getReactMountReady().enqueue(d,this);break;case"option":P.mountWrapper(this,i,n),i=P.getHostProps(this,i);break;case"select":S.mountWrapper(this,i,n),i=S.getHostProps(this,i),e.getReactMountReady().enqueue(d,this);break;case"textarea":V.mountWrapper(this,i,n),i=V.getHostProps(this,i),e.getReactMountReady().enqueue(d,this)}a(this,i);var s,u;if(null!=n?(s=n._namespaceURI,u=n._tag):o._tag&&(s=o._namespaceURI,u=o._tag),(null==s||s===b.svg&&"foreignobject"===u)&&(s=b.html),s===b.html&&("svg"===this._tag?s=b.svg:"math"===this._tag&&(s=b.mathml)),this._namespaceURI=s,"production"!==t.env.NODE_ENV){var f;null!=n?f=n._ancestorInfo:o._tag&&(f=o._ancestorInfo),f&&H(this._tag,null,this,f),this._ancestorInfo=H.updatedAncestorInfo(f,this._tag,this)}var h;if(e.useCreateElement){var m,v=o._ownerDocument;if(s===b.html)if("script"===this._tag){var g=v.createElement("div"),y=this._currentElement.type;g.innerHTML="<"+y+"></"+y+">",m=g.removeChild(g.firstChild)}else m=i.is?v.createElement(this._currentElement.type,i.is):v.createElement(this._currentElement.type);else m=v.createElementNS(s,this._currentElement.type);k.precacheNode(this,m),this._flags|=q.hasCachedChildNodes,this._hostParent||D.setAttributeForRoot(m),this._updateDOMProperties(null,i,e);var _=N(m);this._createInitialChildren(e,i,r,_),h=_}else{var C=this._createOpenTagMarkupAndPutListeners(e,i),O=this._createContentMarkup(e,i,r);h=!O&&ne[this._tag]?C+"/>":C+">"+O+"</"+this._currentElement.type+">"}switch(this._tag){case"input":e.getReactMountReady().enqueue(c,this),i.autoFocus&&e.getReactMountReady().enqueue(E.focusDOMComponent,this);break;case"textarea":e.getReactMountReady().enqueue(l,this),i.autoFocus&&e.getReactMountReady().enqueue(E.focusDOMComponent,this);break;case"select":case"button":i.autoFocus&&e.getReactMountReady().enqueue(E.focusDOMComponent,this);break;case"option":e.getReactMountReady().enqueue(p,this)}return h},_createOpenTagMarkupAndPutListeners:function(e,n){var o="<"+this._currentElement.type;for(var r in n)if(n.hasOwnProperty(r)){var i=n[r];if(null!=i)if(X.hasOwnProperty(r))i&&s(this,r,i,e);else{"style"===r&&(i&&("production"!==t.env.NODE_ENV&&(this._previousStyle=i),i=this._previousStyleCopy=y({},n.style)),i=_.createMarkupForStyles(i,this));var a=null;null!=this._tag&&m(this._tag,n)?Q.hasOwnProperty(r)||(a=D.createMarkupForCustomAttribute(r,i)):a=D.createMarkupForProperty(r,i),a&&(o+=" "+a)}}return e.renderToStaticMarkup?o:(this._hostParent||(o+=" "+D.createMarkupForRoot()),o+=" "+D.createMarkupForID(this._domID))},_createContentMarkup:function(e,n,o){var r="",i=n.dangerouslySetInnerHTML;if(null!=i)null!=i.__html&&(r=i.__html);else{var a=$[typeof n.children]?n.children:null,s=null!=a?null:n.children;if(null!=a)r=L(a),"production"!==t.env.NODE_ENV&&ee.call(this,a);else if(null!=s){var u=this.mountChildren(s,e,o);r=u.join("")}}return oe[this._tag]&&"\n"===r.charAt(0)?"\n"+r:r},_createInitialChildren:function(e,n,o,r){var i=n.dangerouslySetInnerHTML;if(null!=i)null!=i.__html&&N.queueHTML(r,i.__html);else{var a=$[typeof n.children]?n.children:null,s=null!=a?null:n.children;if(null!=a)""!==a&&("production"!==t.env.NODE_ENV&&ee.call(this,a),N.queueText(r,a));else if(null!=s)for(var u=this.mountChildren(s,e,o),c=0;c<u.length;c++)N.queueChild(r,u[c])}},receiveComponent:function(e,t,n){var o=this._currentElement;this._currentElement=e,this.updateComponent(t,o,e,n)},updateComponent:function(e,t,n,o){var r=t.props,i=this._currentElement.props;switch(this._tag){case"input":r=I.getHostProps(this,r),i=I.getHostProps(this,i);break;case"option":r=P.getHostProps(this,r),i=P.getHostProps(this,i);break;case"select":r=S.getHostProps(this,r),i=S.getHostProps(this,i);break;case"textarea":r=V.getHostProps(this,r),i=V.getHostProps(this,i)}switch(a(this,i),this._updateDOMProperties(r,i,e),this._updateDOMChildren(r,i,e,o),this._tag){case"input":I.updateWrapper(this);break;case"textarea":V.updateWrapper(this);break;case"select":e.getReactMountReady().enqueue(f,this)}},_updateDOMProperties:function(e,n,o){var r,a,u;for(r in e)if(!n.hasOwnProperty(r)&&e.hasOwnProperty(r)&&null!=e[r])if("style"===r){var c=this._previousStyleCopy;for(a in c)c.hasOwnProperty(a)&&(u=u||{},u[a]="");this._previousStyleCopy=null}else X.hasOwnProperty(r)?e[r]&&Y(this,r):m(this._tag,e)?Q.hasOwnProperty(r)||D.deleteValueForAttribute(K(this),r):(C.properties[r]||C.isCustomAttribute(r))&&D.deleteValueForProperty(K(this),r);for(r in n){var l=n[r],p="style"===r?this._previousStyleCopy:null!=e?e[r]:void 0;if(n.hasOwnProperty(r)&&l!==p&&(null!=l||null!=p))if("style"===r)if(l?("production"!==t.env.NODE_ENV&&(i(this._previousStyleCopy,this._previousStyle,this),this._previousStyle=l),l=this._previousStyleCopy=y({},l)):this._previousStyleCopy=null,p){for(a in p)!p.hasOwnProperty(a)||l&&l.hasOwnProperty(a)||(u=u||{},u[a]="");for(a in l)l.hasOwnProperty(a)&&p[a]!==l[a]&&(u=u||{},u[a]=l[a])}else u=l;else if(X.hasOwnProperty(r))l?s(this,r,l,o):p&&Y(this,r);else if(m(this._tag,n))Q.hasOwnProperty(r)||D.setValueForAttribute(K(this),r,l);else if(C.properties[r]||C.isCustomAttribute(r)){var d=K(this);null!=l?D.setValueForProperty(d,r,l):D.deleteValueForProperty(d,r)}}u&&_.setValueForStyles(K(this),u,this)},_updateDOMChildren:function(e,n,o,r){var i=$[typeof e.children]?e.children:null,a=$[typeof n.children]?n.children:null,s=e.dangerouslySetInnerHTML&&e.dangerouslySetInnerHTML.__html,u=n.dangerouslySetInnerHTML&&n.dangerouslySetInnerHTML.__html,c=null!=i?null:e.children,l=null!=a?null:n.children,p=null!=i||null!=s,d=null!=a||null!=u;null!=c&&null==l?this.updateChildren(null,o,r):p&&!d&&(this.updateTextContent(""),"production"!==t.env.NODE_ENV&&R.debugTool.onSetChildren(this._debugID,[])),null!=a?i!==a&&(this.updateTextContent(""+a),"production"!==t.env.NODE_ENV&&ee.call(this,a)):null!=u?(s!==u&&this.updateMarkup(""+u),"production"!==t.env.NODE_ENV&&R.debugTool.onSetChildren(this._debugID,[])):null!=l&&("production"!==t.env.NODE_ENV&&ee.call(this,null),this.updateChildren(l,o,r))},getHostNode:function(){return K(this)},unmountComponent:function(e){switch(this._tag){case"audio":case"form":case"iframe":case"img":case"link":case"object":case"source":case"video":var n=this._wrapperState.listeners;if(n)for(var o=0;o<n.length;o++)n[o].remove();break;case"html":case"head":case"body":"production"!==t.env.NODE_ENV?F(!1,"<%s> tried to unmount. Because of cross-browser quirks it is impossible to unmount some top-level components (eg <html>, <head>, and <body>) reliably and efficiently. To fix this, have a single top-level component that never unmounts render these elements.",this._tag):g("66",this._tag)}this.unmountChildren(e),k.uncacheNode(this),O.deleteAllListeners(this),this._rootNodeID=0,this._domID=0,this._wrapperState=null,"production"!==t.env.NODE_ENV&&ee.call(this,null)},getPublicInstance:function(){return K(this)}},y(v.prototype,v.Mixin,M.Mixin),e.exports=v}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e,n){var o={_topLevelWrapper:e,_idCounter:1,_ownerDocument:n?n.nodeType===i?n:n.ownerDocument:null,_node:n,_tag:n?n.nodeName.toLowerCase():null,_namespaceURI:n?n.namespaceURI:null};return"production"!==t.env.NODE_ENV&&(o._ancestorInfo=n?r.updatedAncestorInfo(null,o._tag,null):null),o}var r=n(46),i=9;e.exports=o}).call(t,n(0))},function(e,t,n){"use strict";var o=n(4),r=n(17),i=n(5),a=function(e){this._currentElement=null,this._hostNode=null,this._hostParent=null,this._hostContainerInfo=null,this._domID=0};o(a.prototype,{mountComponent:function(e,t,n,o){var a=n._idCounter++;this._domID=a,this._hostParent=t,this._hostContainerInfo=n;var s=" react-empty: "+this._domID+" ";if(e.useCreateElement){var u=n._ownerDocument,c=u.createComment(s);return i.precacheNode(this,c),r(c)}return e.renderToStaticMarkup?"":"\x3c!--"+s+"--\x3e"},receiveComponent:function(){},getHostNode:function(){return i.getNodeFromInstance(this)},unmountComponent:function(){i.uncacheNode(this)}}),e.exports=a},function(e,t,n){"use strict";var o={useCreateElement:!0,useFiber:!1};e.exports=o},function(e,t,n){"use strict";var o=n(32),r=n(5),i={dangerouslyProcessChildrenUpdates:function(e,t){var n=r.getNodeFromInstance(e);o.processUpdates(n,t)}};e.exports=i},function(e,t,n){"use strict";(function(t){function o(){this._rootNodeID&&_.updateWrapper(this)}function r(e){return"checkbox"===e.type||"radio"===e.type?null!=e.checked:null!=e.value}function i(e){var n=this._currentElement.props,r=c.executeOnChange(n,e);p.asap(o,this);var i=n.name;if("radio"===n.type&&null!=i){for(var s=l.getNodeFromInstance(this),u=s;u.parentNode;)u=u.parentNode;for(var f=u.querySelectorAll("input[name="+JSON.stringify(""+i)+'][type="radio"]'),h=0;h<f.length;h++){var m=f[h];if(m!==s&&m.form===s.form){var v=l.getInstanceFromNode(m);v||("production"!==t.env.NODE_ENV?d(!1,"ReactDOMInput: Mixing React and non-React radio inputs with the same `name` is not supported."):a("90")),p.asap(o,v)}}}return r}var a=n(3),s=n(4),u=n(57),c=n(36),l=n(5),p=n(10),d=n(1),f=n(2),h=!1,m=!1,v=!1,g=!1,y=!1,E=!1,_={getHostProps:function(e,t){var n=c.getValue(t),o=c.getChecked(t);return s({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!=o?o:e._wrapperState.initialChecked,onChange:e._wrapperState.onChange})},mountWrapper:function(e,n){if("production"!==t.env.NODE_ENV){c.checkPropTypes("input",n,e._currentElement._owner);var o=e._currentElement._owner;void 0===n.valueLink||h||("production"!==t.env.NODE_ENV&&f(!1,"`valueLink` prop on `input` is deprecated; set `value` and `onChange` instead."),h=!0),void 0===n.checkedLink||m||("production"!==t.env.NODE_ENV&&f(!1,"`checkedLink` prop on `input` is deprecated; set `value` and `onChange` instead."),m=!0),void 0===n.checked||void 0===n.defaultChecked||g||("production"!==t.env.NODE_ENV&&f(!1,"%s contains an input of type %s with both checked and defaultChecked props. Input elements must be either controlled or uncontrolled (specify either the checked prop, or the defaultChecked prop, but not both). Decide between using a controlled or uncontrolled input element and remove one of these props. More info: https://fb.me/react-controlled-components",o&&o.getName()||"A component",n.type),g=!0),void 0===n.value||void 0===n.defaultValue||v||("production"!==t.env.NODE_ENV&&f(!1,"%s contains an input of type %s with both value and defaultValue props. Input elements must be either controlled or uncontrolled (specify either the value prop, or the defaultValue prop, but not both). Decide between using a controlled or uncontrolled input element and remove one of these props. More info: https://fb.me/react-controlled-components",o&&o.getName()||"A component",n.type),v=!0)}var a=n.defaultValue;e._wrapperState={initialChecked:null!=n.checked?n.checked:n.defaultChecked,initialValue:null!=n.value?n.value:a,listeners:null,onChange:i.bind(e)},"production"!==t.env.NODE_ENV&&(e._wrapperState.controlled=r(n))},updateWrapper:function(e){var n=e._currentElement.props;if("production"!==t.env.NODE_ENV){var o=r(n),i=e._currentElement._owner;e._wrapperState.controlled||!o||E||("production"!==t.env.NODE_ENV&&f(!1,"%s is changing an uncontrolled input of type %s to be controlled. Input elements should not switch from uncontrolled to controlled (or vice versa). Decide between using a controlled or uncontrolled input element for the lifetime of the component. More info: https://fb.me/react-controlled-components",i&&i.getName()||"A component",n.type),E=!0),!e._wrapperState.controlled||o||y||("production"!==t.env.NODE_ENV&&f(!1,"%s is changing a controlled input of type %s to be uncontrolled. Input elements should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled input element for the lifetime of the component. More info: https://fb.me/react-controlled-components",i&&i.getName()||"A component",n.type),y=!0)}var a=n.checked;null!=a&&u.setValueForProperty(l.getNodeFromInstance(e),"checked",a||!1);var s=l.getNodeFromInstance(e),p=c.getValue(n);if(null!=p){var d=""+p;d!==s.value&&(s.value=d)}else null==n.value&&null!=n.defaultValue&&s.defaultValue!==""+n.defaultValue&&(s.defaultValue=""+n.defaultValue),null==n.checked&&null!=n.defaultChecked&&(s.defaultChecked=!!n.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 o=n.name;""!==o&&(n.name=""),n.defaultChecked=!n.defaultChecked,n.defaultChecked=!n.defaultChecked,""!==o&&(n.name=o)}};e.exports=_}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e,n,o){if(c.hasOwnProperty(n)&&c[n])return!0;if(l.test(n)){var r=n.toLowerCase(),i=a.getPossibleStandardName.hasOwnProperty(r)?a.getPossibleStandardName[r]:null;if(null==i)return c[n]=!0,!1;if(n!==i)return"production"!==t.env.NODE_ENV&&u(!1,"Unknown ARIA attribute %s. Did you mean %s?%s",n,i,s.getStackAddendumByID(o)),c[n]=!0,!0}return!0}function r(e,n){var r=[];for(var i in n.props){o(n.type,i,e)||r.push(i)}var a=r.map(function(e){return"`"+e+"`"}).join(", ");1===r.length?"production"!==t.env.NODE_ENV&&u(!1,"Invalid aria prop %s on <%s> tag. For details, see https://fb.me/invalid-aria-prop%s",a,n.type,s.getStackAddendumByID(e)):r.length>1&&&#... aria props %s on <%s> tag. For details, see https://fb.me/invalid-aria-prop%s",a,n.type,s.getStackAddendumByID(e))}function i(e,t){null!=t&&"string"==typeof t.type&&(t.type.indexOf("-")>=0||t.props.is||r(e,t))}var a=n(13),s=n(7),u=n(2),c={},l=new RegExp("^(aria)-["+a.ATTRIBUTE_NAME_CHAR+"]*$"),p={onBeforeMountComponent:function(e,n){"production"!==t.env.NODE_ENV&&i(e,n)},onBeforeUpdateComponent:function(e,n){"production"!==t.env.NODE_ENV&&i(e,n)}};e.exports=p}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e,n){null!=n&&("input"!==n.type&&"textarea"!==n.type&&"select"!==n.type||null==n.props||null!==n.props.value||a||("production"!==t.env.NODE_ENV&&i(!1,"`value` prop on `%s` should not be null. Consider using the empty string to clear the component or `undefined` for uncontrolled components.%s",n.type,r.getStackAddendumByID(e)),a=!0))}var r=n(7),i=n(2),a=!1,s={onBeforeMountComponent:function(e,t){o(e,t)},onBeforeUpdateComponent:function(e,t){o(e,t)}};e.exports=s}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e){var n="";return i.Children.forEach(e,function(e){null!=e&&("string"==typeof e||"number"==typeof e?n+=e:c||(c=!0,"production"!==t.env.NODE_ENV&&u(!1,"Only strings and numbers are supported as <option> children.")))}),n}var r=n(4),i=n(19),a=n(5),s=n(59),u=n(2),c=!1,l={mountWrapper:function(e,n,r){"production"!==t.env.NODE_ENV&&"production"!==t.env.NODE_ENV&&u(null==n.selected,"Use the `defaultValue` or `value` props on <select> instead of setting `selected` on <option>.");var i=null;if(null!=r){var a=r;"optgroup"===a._tag&&(a=a._hostParent),null!=a&&"select"===a._tag&&(i=s.getSelectValueContext(a))}var c=null;if(null!=i){var l;if(l=null!=n.value?n.value+"":o(n.children),c=!1,Array.isArray(i)){for(var p=0;p<i.length;p++)if(""+i[p]===l){c=!0;break}}else c=""+i===l}e._wrapperState={selected:c}},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=r({selected:void 0,children:void 0},t);null!=e._wrapperState.selected&&(n.selected=e._wrapperState.selected);var i=o(t.children);return i&&(n.children=i),n}};e.exports=l}).call(t,n(0))},function(e,t,n){"use strict";function o(e,t,n,o){return e===n&&t===o}function r(e){var t=document.selection,n=t.createRange(),o=n.text.length,r=n.duplicate();r.moveToElementText(e),r.setEndPoint("EndToStart",n);var i=r.text.length;return{start:i,end:i+o}}function i(e){var t=window.getSelection&&window.getSelection();if(!t||0===t.rangeCount)return null;var n=t.anchorNode,r=t.anchorOffset,i=t.focusNode,a=t.focusOffset,s=t.getRangeAt(0);try{s.startContainer.nodeType,s.endContainer.nodeType}catch(e){return null}var u=o(t.anchorNode,t.anchorOffset,t.focusNode,t.focusOffset),c=u?0:s.toString().length,l=s.cloneRange();l.selectNodeContents(e),l.setEnd(s.startContainer,s.startOffset);var p=o(l.startContainer,l.startOffset,l.endContainer,l.endOffset),d=p?0:l.toString().length,f=d+c,h=document.createRange();h.setStart(n,r),h.setEnd(i,a);var m=h.collapsed;return{start:m?f:d,end:m?d:f}}function a(e,t){var n,o,r=document.selection.createRange().duplicate();void 0===t.end?(n=t.start,o=n):t.start>t.end?(n=t.end,o=t.start):(n=t.start,o=t.end),r.moveToElementText(e),r.moveStart("character",n),r.setEndPoint("EndToStart",r),r.moveEnd("character",o-n),r.select()}function s(e,t){if(window.getSelection){var n=window.getSelection(),o=e[l()].length,r=Math.min(t.start,o),i=void 0===t.end?r:Math.min(t.end,o);if(!n.extend&&r>i){var a=i;i=r,r=a}var s=c(e,r),u=c(e,i);if(s&&u){var p=document.createRange();p.setStart(s.node,s.offset),n.removeAllRanges(),r>i?(n.addRange(p),n.extend(u.node,u.offset)):(p.setEnd(u.node,u.offset),n.addRange(p))}}}var u=n(6),c=n(163),l=n(71),p=u.canUseDOM&&"selection"in document&&!("getSelection"in window),d={getOffsets:p?r:i,setOffsets:p?a:s};e.exports=d},function(e,t,n){"use strict";(function(t){var o=n(3),r=n(4),i=n(32),a=n(17),s=n(5),u=n(29),c=n(1),l=n(46),p=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};r(p.prototype,{mountComponent:function(e,n,o,r){if("production"!==t.env.NODE_ENV){var i;null!=n?i=n._ancestorInfo:null!=o&&(i=o._ancestorInfo),i&&l(null,this._stringText,this,i)}var c=o._idCounter++,p=" react-text: "+c+" ";if(this._domID=c,this._hostParent=n,e.useCreateElement){var d=o._ownerDocument,f=d.createComment(p),h=d.createComment(" /react-text "),m=a(d.createDocumentFragment());return a.queueChild(m,a(f)),this._stringText&&a.queueChild(m,a(d.createTextNode(this._stringText))),a.queueChild(m,a(h)),s.precacheNode(this,f),this._closingComment=h,m}var v=u(this._stringText);return e.renderToStaticMarkup?v:"\x3c!--"+p+"--\x3e"+v+"\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 o=this.getHostNode();i.replaceDelimitedText(o[0],o[1],n)}}},getHostNode:function(){var e=this._commentNodes;if(e)return e;if(!this._closingComment)for(var n=s.getNodeFromInstance(this),r=n.nextSibling;;){if(null==r&&("production"!==t.env.NODE_ENV?c(!1,"Missing closing comment for text component %s",this._domID):o("67",this._domID)),8===r.nodeType&&" /react-text "===r.nodeValue){this._closingComment=r;break}r=r.nextSibling}return e=[this._hostNode,this._closingComment],this._commentNodes=e,e},unmountComponent:function(){this._closingComment=null,this._commentNodes=null,s.uncacheNode(this)}}),e.exports=p}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(){this._rootNodeID&&h.updateWrapper(this)}function r(e){var t=this._currentElement.props,n=s.executeOnChange(t,e);return c.asap(o,this),n}var i=n(3),a=n(4),s=n(36),u=n(5),c=n(10),l=n(1),p=n(2),d=!1,f=!1,h={getHostProps:function(e,n){return null!=n.dangerouslySetInnerHTML&&("production"!==t.env.NODE_ENV?l(!1,"`dangerouslySetInnerHTML` does not make sense on <textarea>."):i("91")),a({},n,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue,onChange:e._wrapperState.onChange})},mountWrapper:function(e,n){"production"!==t.env.NODE_ENV&&(s.checkPropTypes("textarea",n,e._currentElement._owner),void 0===n.valueLink||d||("production"!==t.env.NODE_ENV&&p(!1,"`valueLink` prop on `textarea` is deprecated; set `value` and `onChange` instead."),d=!0),void 0===n.value||void 0===n.defaultValue||f||("production"!==t.env.NODE_ENV&&p(!1,"Textarea elements must be either controlled or uncontrolled (specify either the value prop, or the defaultValue prop, but not both). Decide between using a controlled or uncontrolled textarea and remove one of these props. More info: https://fb.me/react-controlled-components"),f=!0));var o=s.getValue(n),a=o;if(null==o){var u=n.defaultValue,c=n.children;null!=c&&("production"!==t.env.NODE_ENV&&"production"!==t.env.NODE_ENV&&p(!1,"Use the `defaultValue` or `value` props instead of setting children on <textarea>."),null!=u&&("production"!==t.env.NODE_ENV?l(!1,"If you supply `defaultValue` on a <textarea>, do not pass children."):i("92")),Array.isArray(c)&&(c.length<=1||("production"!==t.env.NODE_ENV?l(!1,"<textarea> can only have at most one child."):i("93")),c=c[0]),u=""+c),null==u&&(u=""),a=u}e._wrapperState={initialValue:""+a,listeners:null,onChange:r.bind(e)}},updateWrapper:function(e){var t=e._currentElement.props,n=u.getNodeFromInstance(e),o=s.getValue(t);if(null!=o){var r=""+o;r!==n.value&&(n.value=r),null==t.defaultValue&&(n.defaultValue=r)}null!=t.defaultValue&&(n.defaultValue=t.defaultValue)},postMountWrapper:function(e){var t=u.getNodeFromInstance(e),n=t.textContent;n===e._wrapperState.initialValue&&(t.value=n)}};e.exports=h}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e,n){"_hostNode"in e||("production"!==t.env.NODE_ENV?c(!1,"getNodeFromInstance: Invalid argument."):u("33")),"_hostNode"in n||("production"!==t.env.NODE_ENV?c(!1,"getNodeFromInstance: Invalid argument."):u("33"));for(var o=0,r=e;r;r=r._hostParent)o++;for(var i=0,a=n;a;a=a._hostParent)i++;for(;o-i>0;)e=e._hostParent,o--;for(;i-o>0;)n=n._hostParent,i--;for(var s=o;s--;){if(e===n)return e;e=e._hostParent,n=n._hostParent}return null}function r(e,n){"_hostNode"in e||("production"!==t.env.NODE_ENV?c(!1,"isAncestor: Invalid argument."):u("35")),"_hostNode"in n||("production"!==t.env.NODE_ENV?c(!1,"isAncestor: Invalid argument."):u("35"));for(;n;){if(n===e)return!0;n=n._hostParent}return!1}function i(e){return"_hostNode"in e||("production"!==t.env.NODE_ENV?c(!1,"getParentInstance: Invalid argument."):u("36")),e._hostParent}function a(e,t,n){for(var o=[];e;)o.push(e),e=e._hostParent;var r;for(r=o.length;r-- >0;)t(o[r],"captured",n);for(r=0;r<o.length;r++)t(o[r],"bubbled",n)}function s(e,t,n,r,i){for(var a=e&&t?o(e,t):null,s=[];e&&e!==a;)s.push(e),e=e._hostParent;for(var u=[];t&&t!==a;)u.push(t),t=t._hostParent;var c;for(c=0;c<s.length;c++)n(s[c],"bubbled",r);for(c=u.length;c-- >0;)n(u[c],"captured",i)}var u=n(3),c=n(1);e.exports={isAncestor:r,getLowestCommonAncestor:o,getParentInstance:i,traverseTwoPhase:a,traverseEnterLeave:s}}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e,t){null!=t&&"string"==typeof t.type&&(t.type.indexOf("-")>=0||t.props.is||p(e,t))}var r=n(13),i=n(25),a=n(7),s=n(2);if("production"!==t.env.NODE_ENV)var u={children:!0,dangerouslySetInnerHTML:!0,key:!0,ref:!0,autoFocus:!0,defaultValue:!0,valueLink:!0,defaultChecked:!0,checkedLink:!0,innerHTML:!0,suppressContentEditableWarning:!0,onFocusIn:!0,onFocusOut:!0},c={},l=function(e,n,o){if(r.properties.hasOwnProperty(n)||r.isCustomAttribute(n))return!0;if(u.hasOwnProperty(n)&&u[n]||c.hasOwnProperty(n)&&c[n])return!0;if(i.registrationNameModules.hasOwnProperty(n))return!0;c[n]=!0;var l=n.toLowerCase(),p=r.isCustomAttribute(l)?l:r.getPossibleStandardName.hasOwnProperty(l)?r.getPossibleStandardName[l]:null,d=i.possibleRegistrationNames.hasOwnProperty(l)?i.possibleRegistrationNames[l]:null;return null!=p?("production"!==t.env.NODE_ENV&&s(!1,"Unknown DOM property %s. Did you mean %s?%s",n,p,a.getStackAddendumByID(o)),!0):null!=d&&("production"!==t.env.NODE_ENV&&s(!1,"Unknown event handler property %s. Did you mean `%s`?%s",n,d,a.getStackAddendumByID(o)),!0)};var p=function(e,n){var o=[];for(var r in n.props){l(n.type,r,e)||o.push(r)}var i=o.map(function(e){return"`"+e+"`"}).join(", ");1===o.length?"production"!==t.env.NODE_ENV&&s(!1,"Unknown prop %s on <%s> tag. Remove this prop from the element. For details, see https://fb.me/react-unknown-prop%s",i,n.type,a.getStackAddendumByID(e)):o.length>1&&&... props %s on <%s> tag. Remove these props from the element. For details, see https://fb.me/react-unknown-prop%s",i,n.type,a.getStackAddendumByID(e))},d={onBeforeMountComponent:function(e,t){o(e,t)},onBeforeUpdateComponent:function(e,t){o(e,t)}};e.exports=d}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e,n,o,r,i,a,s,u){try{n.call(o,r,i,a,s,u)}catch(n){"production"!==t.env.NODE_ENV&&N(C[e],"Exception thrown by hook while handling %s: %s",e,n+"\n"+n.stack),C[e]=!0}}function r(e,t,n,r,i,a){for(var s=0;s<b.length;s++){var u=b[s],c=u[e];c&&o(e,c,u,t,n,r,i,a)}}function i(){y.purgeUnmountedComponents(),g.clearHistory()}function a(e){return e.reduce(function(e,t){var n=y.getOwnerID(t),o=y.getParentID(t);return e[t]={displayName:y.getDisplayName(t),text:y.getText(t),updateCount:y.getUpdateCount(t),childIDs:y.getChildIDs(t),ownerID:n||o&&y.getOwnerID(o)||0,parentID:o},e},{})}function s(){var e=k,t=T,n=g.getHistory();if(0===x)return k=0,T=[],void i();if(t.length||n.length){var o=y.getRegisteredIDs();O.push({duration:_()-e,measurements:t||[],operations:n||[],treeSnapshot:a(o)})}i(),k=_(),T=[]}function u(e){arguments.length>1&&void 0!==arguments[1]&&arguments[1]&&0===e||e||"production"!==t.env.NODE_ENV&&N(!1,"ReactDebugTool: debugID may not be empty.")}function c(e,n){0!==x&&(V&&!R&&("production"!==t.env.NODE_ENV&&N(!1,"There is an internal error in the React performance measurement code. Did not expect %s timer to start while %s timer is still in progress for %s instance.",n,V||"no",e===I?"the same":"another"),R=!0),P=_(),S=0,I=e,V=n)}function l(e,n){0!==x&&(V===n||R||("production"!==t.env.NODE_ENV&&N(!1,"There is an internal error in the React performance measurement code. We did not expect %s timer to stop while %s timer is still in progress for %s instance. Please report this as a bug in React.",n,V||"no",e===I?"the same":"another"),R=!0),D&&T.push({timerType:n,instanceID:e,duration:_()-P-S}),P=0,S=0,I=null,V=null)}function p(){var e={startTime:P,nestedFlushStartTime:_(),debugID:I,timerType:V};w.push(e),P=0,S=0,I=null,V=null}function d(){var e=w.pop(),t=e.startTime,n=e.nestedFlushStartTime,o=e.debugID,r=e.timerType,i=_()-n;P=t,S+=i,I=o,V=r}function f(e){if(!D||!A)return!1;var t=y.getElement(e);return null!=t&&"object"==typeof t&&!("string"==typeof t.type)}function h(e,t){if(f(e)){var n=e+"::"+t;M=_(),performance.mark(n)}}function m(e,t){if(f(e)){var n=e+"::"+t,o=y.getDisplayName(e)||"Unknown";if(_()-M>.1){var r=o+" ["+t+"]";performance.measure(r,n)}performance.clearMarks(n),performance.clearMeasures(r)}}var v=n(132),g=n(130),y=n(7),E=n(6),_=n(95),N=n(2),b=[],C={},D=!1,O=[],w=[],x=0,T=[],k=0,I=null,P=0,S=0,V=null,R=!1,M=0,A="undefined"!=typeof performance&&"function"==typeof performance.mark&&"function"==typeof performance.clearMarks&&"function"==typeof performance.measure&&"function"==typeof performance.clearMeasures,U={addHook:function(e){b.push(e)},removeHook:function(e){for(var t=0;t<b.length;t++)b[t]===e&&(b.splice(t,1),t--)},isProfiling:function(){return D},beginProfiling:function(){D||(D=!0,O.length=0,s(),U.addHook(g))},endProfiling:function(){D&&(D=!1,s(),U.removeHook(g))},getFlushHistory:function(){return O},onBeginFlush:function(){x++,s(),p(),r("onBeginFlush")},onEndFlush:function(){s(),x--,d(),r("onEndFlush")},onBeginLifeCycleTimer:function(e,t){u(e),r("onBeginLifeCycleTimer",e,t),h(e,t),c(e,t)},onEndLifeCycleTimer:function(e,t){u(e),l(e,t),m(e,t),r("onEndLifeCycleTimer",e,t)},onBeginProcessingChildContext:function(){r("onBeginProcessingChildContext")},onEndProcessingChildContext:function(){r("onEndProcessingChildContext")},onHostOperation:function(e){u(e.instanceID),r("onHostOperation",e)},onSetState:function(){r("onSetState")},onSetChildren:function(e,t){u(e),t.forEach(u),r("onSetChildren",e,t)},onBeforeMountComponent:function(e,t,n){u(e),u(n,!0),r("onBeforeMountComponent",e,t,n),h(e,"mount")},onMountComponent:function(e){u(e),m(e,"mount"),r("onMountComponent",e)},onBeforeUpdateComponent:function(e,t){u(e),r("onBeforeUpdateComponent",e,t),h(e,"update")},onUpdateComponent:function(e){u(e),m(e,"update"),r("onUpdateComponent",e)},onBeforeUnmountComponent:function(e){u(e),r("onBeforeUnmountComponent",e),h(e,"unmount")},onUnmountComponent:function(e){u(e),m(e,"unmount"),r("onUnmountComponent",e)},onTestEvent:function(){r("onTestEvent")}};U.addDevtool=U.addHook,U.removeDevtool=U.removeHook,U.addHook(v),U.addHook(y),/[?&]react_perf\b/.test(E.canUseDOM&&window.location.href||"")&&U.beginProfiling(),e.exports=U}).call(t,n(0))},function(e,t,n){"use strict";function o(){this.reinitializeTransaction()}var r=n(4),i=n(10),a=n(28),s=n(9),u={initialize:s,close:function(){d.isBatchingUpdates=!1}},c={initialize:s,close:i.flushBatchedUpdates.bind(i)},l=[c,u];r(o.prototype,a,{getTransactionWrappers:function(){return l}});var p=new o,d={isBatchingUpdates:!1,batchedUpdates:function(e,t,n,o,r,i){var a=d.isBatchingUpdates;return d.isBatchingUpdates=!0,a?e(t,n,o,r,i):p.perform(e,null,t,n,o,r,i)}};e.exports=d},function(e,t,n){"use strict";function o(){C||(C=!0,y.EventEmitter.injectReactEventListener(g),y.EventPluginHub.injectEventPluginOrder(s),y.EventPluginUtils.injectComponentTree(d),y.EventPluginUtils.injectTreeTraversal(h),y.EventPluginHub.injectEventPluginsByName({SimpleEventPlugin:b,EnterLeaveEventPlugin:u,ChangeEventPlugin:a,SelectEventPlugin:N,BeforeInputEventPlugin:i}),y.HostComponent.injectGenericComponentClass(p),y.HostComponent.injectTextComponentClass(m),y.DOMProperty.injectDOMPropertyConfig(r),y.DOMProperty.injectDOMPropertyConfig(c),y.DOMProperty.injectDOMPropertyConfig(_),y.EmptyComponent.injectEmptyComponentFactory(function(e){return new f(e)}),y.Updates.injectReconcileTransaction(E),y.Updates.injectBatchingStrategy(v),y.Component.injectEnvironment(l))}var r=n(96),i=n(98),a=n(100),s=n(102),u=n(103),c=n(105),l=n(107),p=n(110),d=n(5),f=n(112),h=n(122),m=n(120),v=n(125),g=n(129),y=n(131),E=n(137),_=n(142),N=n(143),b=n(144),C=!1;e.exports={inject:o}},function(e,t,n){"use strict";var o="function"==typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103;e.exports=o},function(e,t,n){"use strict";function o(e){r.enqueueEvents(e),r.processEventQueue(!1)}var r=n(21),i={handleTopLevel:function(e,t,n,i){o(r.extractEvents(e,t,n,i))}};e.exports=i},function(e,t,n){"use strict";function o(e){for(;e._hostParent;)e=e._hostParent;var t=p.getNodeFromInstance(e),n=t.parentNode;return p.getClosestInstanceFromNode(n)}function r(e,t){this.topLevelType=e,this.nativeEvent=t,this.ancestors=[]}function i(e){var t=f(e.nativeEvent),n=p.getClosestInstanceFromNode(t),r=n;do{e.ancestors.push(r),r=r&&o(r)}while(r);for(var i=0;i<e.ancestors.length;i++)n=e.ancestors[i],m._handleTopLevel(e.topLevelType,n,e.nativeEvent,f(e.nativeEvent))}function a(e){e(h(window))}var s=n(4),u=n(52),c=n(6),l=n(14),p=n(5),d=n(10),f=n(43),h=n(88);s(r.prototype,{destructor:function(){this.topLevelType=null,this.nativeEvent=null,this.ancestors.length=0}}),l.addPoolingTo(r,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?u.listen(n,t,m.dispatchEvent.bind(null,e)):null},trapCapturedEvent:function(e,t,n){return n?u.capture(n,t,m.dispatchEvent.bind(null,e)):null},monitorScrollValue:function(e){var t=a.bind(null,e);u.listen(window,"scroll",t)},dispatchEvent:function(e,t){if(m._enabled){var n=r.getPooled(e,t);try{d.batchedUpdates(i,n)}finally{r.release(n)}}}};e.exports=m},function(e,t,n){"use strict";var o=[],r={onHostOperation:function(e){o.push(e)},clearHistory:function(){r._preventClearing||(o=[])},getHistory:function(){return o}};e.exports=r},function(e,t,n){"use strict";var o=n(13),r=n(21),i=n(34),a=n(37),s=n(60),u=n(26),c=n(62),l=n(10),p={Component:a.injection,DOMProperty:o.injection,EmptyComponent:s.injection,EventPluginHub:r.injection,EventPluginUtils:i.injection,EventEmitter:u.injection,HostComponent:c.injection,Updates:l.injection};e.exports=p},function(e,t,n){"use strict";(function(t){var o=n(2);if("production"!==t.env.NODE_ENV)var r=!1,i=function(){"production"!==t.env.NODE_ENV&&o(!r,"setState(...): Cannot call setState() inside getChildContext()")};var a={onBeginProcessingChildContext:function(){r=!0},onEndProcessingChildContext:function(){r=!1},onSetState:function(){i()}};e.exports=a}).call(t,n(0))},function(e,t,n){"use strict";var o=n(155),r=/\/?>/,i=/^<\!\-\-/,a={CHECKSUM_ATTR_NAME:"data-react-checksum",addChecksumToMarkup:function(e){var t=o(e);return i.test(e)?e:e.replace(r," "+a.CHECKSUM_ATTR_NAME+'="'+t+'"$&')},canReuseMarkup:function(e,t){var n=t.getAttribute(a.CHECKSUM_ATTR_NAME);return n=n&&parseInt(n,10),o(e)===n}};e.exports=a},function(e,t,n){"use strict";(function(t){function o(e,t,n){return{type:"INSERT_MARKUP",content:e,fromIndex:null,fromNode:null,toIndex:n,afterNode:t}}function r(e,t,n){return{type:"MOVE_EXISTING",content:null,fromIndex:e._mountIndex,fromNode:m.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 s(e){return{type:"TEXT_CONTENT",content:e,fromIndex:null,fromNode:null,toIndex:null,afterNode:null}}function u(e,t){return t&&(e=e||[],e.push(t)),e}function c(e,t){p.processChildrenUpdates(e,t)}var l=n(3),p=n(37),d=n(23),f=n(8),h=n(11),m=n(18),v=n(106),g=n(9),y=n(159),E=n(1),_=g;if("production"!==t.env.NODE_ENV){var N=function(e){if(!e._debugID){var t;(t=d.get(e))&&(e=t)}return e._debugID};_=function(e){var t=N(this);0!==t&&f.debugTool.onSetChildren(t,e?Object.keys(e).map(function(t){return e[t]._debugID}):[])}}var b={Mixin:{_reconcilerInstantiateChildren:function(e,n,o){if("production"!==t.env.NODE_ENV){var r=N(this);if(this._currentElement)try{return h.current=this._currentElement._owner,v.instantiateChildren(e,n,o,r)}finally{h.current=null}}return v.instantiateChildren(e,n,o)},_reconcilerUpdateChildren:function(e,n,o,r,i,a){var s,u=0;if("production"!==t.env.NODE_ENV&&(u=N(this),this._currentElement)){try{h.current=this._currentElement._owner,s=y(n,u)}finally{h.current=null}return v.updateChildren(e,s,o,r,i,this,this._hostContainerInfo,a,u),s}return s=y(n,u),v.updateChildren(e,s,o,r,i,this,this._hostContainerInfo,a,u),s},mountChildren:function(e,n,o){var r=this._reconcilerInstantiateChildren(e,n,o);this._renderedChildren=r;var i=[],a=0;for(var s in r)if(r.hasOwnProperty(s)){var u=r[s],c=0;"production"!==t.env.NODE_ENV&&(c=N(this));var l=m.mountComponent(u,n,this,this._hostContainerInfo,o,c);u._mountIndex=a++,i.push(l)}return"production"!==t.env.NODE_ENV&&_.call(this,r),i},updateTextContent:function(e){var n=this._renderedChildren;v.unmountChildren(n,!1);for(var o in n)n.hasOwnProperty(o)&&("production"!==t.env.NODE_ENV?E(!1,"updateTextContent called on non-empty component."):l("118"));c(this,[s(e)])},updateMarkup:function(e){var n=this._renderedChildren;v.unmountChildren(n,!1);for(var o in n)n.hasOwnProperty(o)&&("production"!==t.env.NODE_ENV?E(!1,"updateTextContent called on non-empty component."):l("118"));c(this,[a(e)])},updateChildren:function(e,t,n){this._updateChildren(e,t,n)},_updateChildren:function(e,n,o){var r=this._renderedChildren,i={},a=[],s=this._reconcilerUpdateChildren(r,e,a,i,n,o);if(s||r){var l,p=null,d=0,f=0,h=0,v=null;for(l in s)if(s.hasOwnProperty(l)){var g=r&&r[l],y=s[l];g===y?(p=u(p,this.moveChild(g,v,d,f)),f=Math.max(g._mountIndex,f),g._mountIndex=d):(g&&(f=Math.max(g._mountIndex,f)),p=u(p,this._mountChildAtIndex(y,a[h],v,d,n,o)),h++),d++,v=m.getHostNode(y)}for(l in i)i.hasOwnProperty(l)&&(p=u(p,this._unmountChild(r[l],i[l])));p&&c(this,p),this._renderedChildren=s,"production"!==t.env.NODE_ENV&&_.call(this,s)}},unmountChildren:function(e){var t=this._renderedChildren;v.unmountChildren(t,e),this._renderedChildren=null},moveChild:function(e,t,n,o){if(e._mountIndex<o)return r(e,t,n)},createChild:function(e,t,n){return o(n,t,e._mountIndex)},removeChild:function(e,t){return i(e,t)},_mountChildAtIndex:function(e,t,n,o,r,i){return e._mountIndex=o,this.createChild(e,n,t)},_unmountChild:function(e,t){var n=this.removeChild(e,t);return e._mountIndex=null,n}}};e.exports=b}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e){return!(!e||"function"!=typeof e.attachRef||"function"!=typeof e.detachRef)}var r=n(3),i=n(1),a={addComponentAsRefTo:function(e,n,a){o(a)||("production"!==t.env.NODE_ENV?i(!1,"addComponentAsRefTo(...): Only a ReactOwner can have refs. You might be adding a ref to a component that was not created inside a component's `render` method, or you have multiple copies of React loaded (details: https://fb.me/react-refs-must-have-owner)."):r("119")),a.attachRef(n,e)},removeComponentAsRefFrom:function(e,n,a){o(a)||("production"!==t.env.NODE_ENV?i(!1,"removeComponentAsRefFrom(...): Only a ReactOwner can have refs. You might be removing a ref to a component that was not created inside a component's `render` method, or you have multiple copies of React loaded (details: https://fb.me/react-refs-must-have-owner)."):r("120"));var s=a.getPublicInstance();s&&s.refs[n]===e.getPublicInstance()&&a.detachRef(n)}};e.exports=a}).call(t,n(0))},function(e,t,n){"use strict";(function(t){var n={};"production"!==t.env.NODE_ENV&&(n={prop:"prop",context:"context",childContext:"child context"}),e.exports=n}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e){this.reinitializeTransaction(),this.renderToStaticMarkup=!1,this.reactMountReady=i.getPooled(null),this.useCreateElement=e}var r=n(4),i=n(56),a=n(14),s=n(26),u=n(63),c=n(8),l=n(28),p=n(39),d={initialize:u.getSelectionInformation,close:u.restoreSelection},f={initialize:function(){var e=s.isEnabled();return s.setEnabled(!1),e},close:function(e){s.setEnabled(e)}},h={initialize:function(){this.reactMountReady.reset()},close:function(){this.reactMountReady.notifyAll()}},m=[d,f,h];"production"!==t.env.NODE_ENV&&m.push({initialize:c.debugTool.onBeginFlush,close:c.debugTool.onEndFlush});var v={getTransactionWrappers:function(){return m},getReactMountReady:function(){return this.reactMountReady},getUpdateQueue:function(){return p},checkpoint:function(){return this.reactMountReady.checkpoint()},rollback:function(e){this.reactMountReady.rollback(e)},destructor:function(){i.release(this.reactMountReady),this.reactMountReady=null}};r(o.prototype,l,v),a.addPoolingTo(o),e.exports=o}).call(t,n(0))},function(e,t,n){"use strict";function o(e,t,n){"function"==typeof e?e(t.getPublicInstance()):i.addComponentAsRefTo(t,e,n)}function r(e,t,n){"function"==typeof e?e(null):i.removeComponentAsRefFrom(t,e,n)}var i=n(135),a={};a.attachRefs=function(e,t){if(null!==t&&"object"==typeof t){var n=t.ref;null!=n&&o(n,e,t._owner)}},a.shouldUpdateRefs=function(e,t){var n=null,o=null;null!==e&&"object"==typeof e&&(n=e.ref,o=e._owner);var r=null,i=null;return null!==t&&"object"==typeof t&&(r=t.ref,i=t._owner),n!==r||"string"==typeof r&&i!==o},a.detachRefs=function(e,t){if(null!==t&&"object"==typeof t){var n=t.ref;null!=n&&r(n,e,t._owner)}},e.exports=a},function(e,t,n){"use strict";(function(t){function o(e){this.reinitializeTransaction(),this.renderToStaticMarkup=e,this.useCreateElement=!1,this.updateQueue=new u(this)}var r=n(4),i=n(14),a=n(28),s=n(8),u=n(140),c=[];"production"!==t.env.NODE_ENV&&c.push({initialize:s.debugTool.onBeginFlush,close:s.debugTool.onEndFlush});var l={enqueue:function(){}},p={getTransactionWrappers:function(){return c},getReactMountReady:function(){return l},getUpdateQueue:function(){return this.updateQueue},destructor:function(){},checkpoint:function(){},rollback:function(){}};r(o.prototype,a,p),i.addPoolingTo(o),e.exports=o}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,n){if("production"!==t.env.NODE_ENV){var o=e.constructor;"production"!==t.env.NODE_ENV&&a(!1,"%s(...): Can only update a mounting component. This usually means you called %s() outside componentWillMount() on the server. This is a no-op. Please check the code for the %s component.",n,n,o&&(o.displayName||o.name)||"ReactClass")}}var i=n(39),a=n(2),s=function(){function e(t){o(this,e),this.transaction=t}return e.prototype.isMounted=function(e){return!1},e.prototype.enqueueCallback=function(e,t,n){this.transaction.isInTransaction()&&i.enqueueCallback(e,t,n)},e.prototype.enqueueForceUpdate=function(e){this.transaction.isInTransaction()?i.enqueueForceUpdate(e):r(e,"forceUpdate")},e.prototype.enqueueReplaceState=function(e,t){this.transaction.isInTransaction()?i.enqueueReplaceState(e,t):r(e,"replaceState")},e.prototype.enqueueSetState=function(e,t){this.transaction.isInTransaction()?i.enqueueSetState(e,t):r(e,"setState")},e}();e.exports=s}).call(t,n(0))},function(e,t,n){"use strict";e.exports="15.4.2"},function(e,t,n){"use strict";var o={xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace";},r={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",mathematical:0,mode:0,numOctaves:"numOctaves",offset:0,opacity:0,operator:0,order:0,orient:0,orientation:0,origin:0,overflow:0,overlinePosition:"overline-position",overlineThickness:"overline-thickness",paintOrder:"paint-order",panose1:"panose-1",pathLength:"pathLength",patternContentUnits:"patternContentUnits",patternTransform:"patternTransform",patternUnits:"patternUnits",pointerEvents:"pointer-events",points:0,pointsAtX:"pointsAtX",pointsAtY:"pointsAtY",pointsAtZ:"pointsAtZ",preserveAlpha:"preserveAlpha",preserveAspectRatio:"preserveAspectRatio",primitiveUnits:"primitiveUnits",r:0,radius:0,refX:"refX",refY:"refY",renderingIntent:"rendering-intent",repeatCount:"repeatCount",repeatDur:"repeatDur",requiredExtensions:"requiredExtensions",requiredFeatures:"requiredFeatures",restart:0,result:0,rotate:0,rx:0,ry:0,scale:0,seed:0,shapeRendering:"shape-rendering",slope:0,spacing:0,specularConstant:"specularConstant",specularExponent:"specularExponent",speed:0,spreadMethod:"spreadMethod",startOffset:"startOffset",stdDeviation:"stdDeviation",stemh:0,stemv:0,stitchTiles:"stitchTiles",stopColor:"stop-color",stopOpacity:"stop-opacity",strikethroughPosition:"strikethrough-position",strikethroughThickness:"strikethrough-thickness",string:0,stroke:0,strokeDasharray:"stroke-dasharray",strokeDashoffset:"stroke-dashoffset",strokeLinecap:"stroke-linecap",strokeLinejoin:"stroke-linejoin",strokeMiterlimit:"stroke-miterlimit",strokeOpacity:"stroke-opacity",strokeWidth:"stroke-width",surfaceScale:"surfaceScale",systemLanguage:"systemLanguage",tableValues:"tableValues",targetX:"targetX",targetY:"targetY",textAnchor:"text-anchor",textDecoration:"text-decoration",textRendering:"text-rendering",textLength:"textLength",to:0,transform:0,u1:0,u2:0,underlinePosition:"underline-position",underlineThickness:"underline-thickness",unicode:0,unicodeBidi:"unicode-bidi",unicodeRange:"unicode-range",unitsPerEm:"units-per-em",vAlphabetic:"v-alphabetic",vHanging:"v-hanging",vIdeographic:"v-ideographic",vMathematical:"v-mathematical",values:0,vectorEffect:"vector-effect",version:0,vertAdvY:"vert-adv-y",vertOriginX:"vert-origin-x",vertOriginY:"vert-origin-y",viewBox:"viewBox",viewTarget:"viewTarget",visibility:0,widths:0,wordSpacing:"word-spacing",writingMode:"writing-mode",x:0,xHeight:"x-height",x1:0,x2:0,xChannelSelector:"xChannelSelector",xlinkActuate:"xlink:actuate",xlinkArcrole:"xlink:arcrole",xlinkHref:"xlink:href",xlinkRole:"xlink:role",xlinkShow:"xlink:show",xlinkTitle:"xlink:title",xlinkType:"xlink:type",xmlBase:"xml:base",xmlns:0,xmlnsXlink:"xmlns:xlink",xmlLang:"xml:lang",xmlSpace:"xml:space",y:0,y1:0,y2:0,yChannelSelector:"yChannelSelector",z:0,zoomAndPan:"zoomAndPan"},i={Properties:{},DOMAttributeNamespaces:{xlinkActuate:o.xlink,xlinkArcrole:o.xlink,xlinkHref:o.xlink,xlinkRole:o.xlink,xlinkShow:o.xlink,xlinkTitle:o.xlink,xlinkType:o.xlink,xmlBase:o.xml,xmlLang:o.xml,xmlSpace:o.xml},DOMAttributeNames:{}};Object.keys(r).forEach(function(e){i.Properties[e]=0,r[e]&&(i.DOMAttributeNames[e]=r[e])}),e.exports=i},function(e,t,n){"use strict";function o(e){if("selectionStart"in e&&u.hasSelectionCapabilities(e))return{start:e.selectionStart,end:e.selectionEnd};if(window.getSelection){var t=window.getSelection();return{anchorNode:t.anchorNode,anchorOffset:t.anchorOffset,focusNode:t.focusNode,focusOffset:t.focusOffset}}if(document.selection){var n=document.selection.createRange();return{parentElement:n.parentElement(),text:n.text,top:n.boundingTop,left:n.boundingLeft}}}function r(e,t){if(y||null==m||m!==l())return null;var n=o(m);if(!g||!d(g,n)){g=n;var r=c.getPooled(h.select,v,e,t);return r.type="select",r.target=m,i.accumulateTwoPhaseDispatches(r),r}return null}var i=n(22),a=n(6),s=n(5),u=n(63),c=n(12),l=n(54),p=n(73),d=n(31),f=a.canUseDOM&&"documentMode"in document&&document.documentMode<=11,h={select:{phasedRegistrationNames:{bubbled:"onSelect",captured:"onSelectCapture"},dependencies:["topBlur","topContextMenu","topFocus","topKeyDown","topKeyUp","topMouseDown","topMouseUp","topSelectionChange"]}},m=null,v=null,g=null,y=!1,E=!1,_={eventTypes:h,extractEvents:function(e,t,n,o){if(!E)return null;var i=t?s.getNodeFromInstance(t):window;switch(e){case"topFocus":(p(i)||"true"===i.contentEditable)&&(m=i,v=t,g=null);break;case"topBlur":m=null,v=null,g=null;break;case"topMouseDown":y=!0;break;case"topContextMenu":case"topMouseUp":return y=!1,r(n,o);case"topSelectionChange":if(f)break;case"topKeyDown":case"topKeyUp":return r(n,o)}return null},didPutListener:function(e,t,n){"onSelect"===t&&(E=!0)}};e.exports=_},function(e,t,n){"use strict";(function(t){function o(e){return"."+e._rootNodeID}function r(e){return"button"===e||"input"===e||"select"===e||"textarea"===e}var i=n(3),a=n(52),s=n(22),u=n(5),c=n(145),l=n(146),p=n(12),d=n(149),f=n(151),h=n(27),m=n(148),v=n(152),g=n(153),y=n(24),E=n(154),_=n(9),N=n(41),b=n(1),C={},D={};["abort","animationEnd","animationIteration","animationStart","blur","canPlay","canPlayThrough","click","contextMenu","copy","cut","doubleClick","drag","dragEnd","dragEnter","dragExit","dragLeave","dragOver","dragStart","drop","durationChange","emptied","encrypted","ended","error","focus","input","invalid","keyDown","keyPress","keyUp","load","loadedData","loadedMetadata","loadStart","mouseDown","mouseMove","mouseOut","mouseOver","mouseUp","paste","pause","play","playing","progress","rateChange","reset","scroll","seeked","seeking","stalled","submit","suspend","timeUpdate","touchCancel","touchEnd","touchMove","touchStart","transitionEnd","volumeChange","waiting","wheel"].forEach(function(e){var t=e[0].toUpperCase()+e.slice(1),n="on"+t,o="top"+t,r={phasedRegistrationNames:{bubbled:n,captured:n+"Capture"},dependencies:[o]};C[e]=r,D[o]=r});var O={},w={eventTypes:C,extractEvents:function(e,n,o,r){var a=D[e];if(!a)return null;var u;switch(e){case"topAbort":case"topCanPlay":case"topCanPlayThrough":case"topDurationChange":case"topEmptied":case"topEncrypted":case"topEnded":case"topError":case"topInput":case"topInvalid":case"topLoad":case"topLoadedData":case"topLoadedMetadata":case"topLoadStart":case"topPause":case"topPlay":case"topPlaying":case"topProgress":case"topRateChange":case"topReset":case"topSeeked":case"topSeeking":case"topStalled":case"topSubmit":case"topSuspend":case"topTimeUpdate":case"topVolumeChange":case"topWaiting":u=p;break;case"topKeyPress":if(0===N(o))return null;case"topKeyDown":case"topKeyUp":u=f;break;case"topBlur":case"topFocus":u=d;break;case"topClick":if(2===o.button)return null;case"topDoubleClick":case"topMouseDown":case"topMouseMove":case"topMouseUp":case"topMouseOut":case"topMouseOver":case"topContextMenu":u=h;break;case"topDrag":case"topDragEnd":case"topDragEnter":case"topDragExit":case"topDragLeave":case"topDragOver":case"topDragStart":case"topDrop":u=m;break;case"topTouchCancel":case"topTouchEnd":case"topTouchMove":case"topTouchStart":u=v;break;case"topAnimationEnd":case"topAnimationIteration":case"topAnimationStart":u=c;break;case"topTransitionEnd":u=g;break;case"topScroll":u=y;break;case"topWheel":u=E;break;case"topCopy":case"topCut":case"topPaste":u=l}u||("production"!==t.env.NODE_ENV?b(!1,"SimpleEventPlugin: Unhandled event type, `%s`.",e):i("86",e));var _=u.getPooled(a,n,o,r);return s.accumulateTwoPhaseDispatches(_),_},didPutListener:function(e,t,n){if("onClick"===t&&!r(e._tag)){var i=o(e),s=u.getNodeFromInstance(e);O[i]||(O[i]=a.listen(s,"click",_))}},willDeleteListener:function(e,t){if("onClick"===t&&!r(e._tag)){var n=o(e);O[n].remove(),delete O[n]}}};e.exports=w}).call(t,n(0))},function(e,t,n){"use strict";function o(e,t,n,o){return r.call(this,e,t,n,o)}var r=n(12),i={animationName:null,elapsedTime:null,pseudoElement:null};r.augmentClass(o,i),e.exports=o},function(e,t,n){"use strict";function o(e,t,n,o){return r.call(this,e,t,n,o)}var r=n(12),i={clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}};r.augmentClass(o,i),e.exports=o},function(e,t,n){"use strict";function o(e,t,n,o){return r.call(this,e,t,n,o)}var r=n(12),i={data:null};r.augmentClass(o,i),e.exports=o},function(e,t,n){"use strict";function o(e,t,n,o){return r.call(this,e,t,n,o)}var r=n(27),i={dataTransfer:null};r.augmentClass(o,i),e.exports=o},function(e,t,n){"use strict";function o(e,t,n,o){return r.call(this,e,t,n,o)}var r=n(24),i={relatedTarget:null};r.augmentClass(o,i),e.exports=o},function(e,t,n){"use strict";function o(e,t,n,o){return r.call(this,e,t,n,o)}var r=n(12),i={data:null};r.augmentClass(o,i),e.exports=o},function(e,t,n){"use strict";function o(e,t,n,o){return r.call(this,e,t,n,o)}var r=n(24),i=n(41),a=n(160),s=n(42),u={key:a,location:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,repeat:null,locale:null,getModifierState:s,charCode:function(e){return"keypress"===e.type?i(e):0},keyCode:function(e){return"keydown"===e.type||"keyup"===e.type?e.keyCode:0},which:function(e){return"keypress"===e.type?i(e):"keydown"===e.type||"keyup"===e.type?e.keyCode:0}};r.augmentClass(o,u),e.exports=o},function(e,t,n){"use strict";function o(e,t,n,o){return r.call(this,e,t,n,o)}var r=n(24),i=n(42),a={touches:null,targetTouches:null,changedTouches:null,altKey:null,metaKey:null,ctrlKey:null,shiftKey:null,getModifierState:i};r.augmentClass(o,a),e.exports=o},function(e,t,n){"use strict";function o(e,t,n,o){return r.call(this,e,t,n,o)}var r=n(12),i={propertyName:null,elapsedTime:null,pseudoElement:null};r.augmentClass(o,i),e.exports=o},function(e,t,n){"use strict";function o(e,t,n,o){return r.call(this,e,t,n,o)}var r=n(27),i={deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:null,deltaMode:null};r.augmentClass(o,i),e.exports=o},function(e,t,n){"use strict";function o(e){for(var t=1,n=0,o=0,i=e.length,a=-4&i;o<a;){for(var s=Math.min(o+4096,a);o<s;o+=4)n+=(t+=e.charCodeAt(o))+(t+=e.charCodeAt(o+1))+(t+=e.charCodeAt(o+2))+(t+=e.charCodeAt(o+3));t%=r,n%=r}for(;o<i;o++)n+=t+=e.charCodeAt(o);return t%=r,n%=r,t|n<<16}var r=65521;e.exports=o},function(e,t,n){"use strict";(function(t){function o(e,o,p,d,f,h){for(var m in e)if(e.hasOwnProperty(m)){var v;try{"function"!=typeof e[m]&&("production"!==t.env.NODE_ENV?u(!1,"%s: %s type `%s` is invalid; it must be a function, usually from React.PropTypes.",d||"React class",a[p],m):i("84",d||"React class",a[p],m)),v=e[m](o,m,d,p,null,s)}catch(e){v=e}if("production"!==t.env.NODE_ENV&&c(!v||v instanceof Error,"%s: type specification of %s `%s` is invalid; the type checker function must return `null` or an `Error` but returned a %s. You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument).",d||"React class",a[p],m,typeof v),v instanceof Error&&!(v.message in l)){l[v.message]=!0;var g="";"production"!==t.env.NODE_ENV&&(r||(r=n(7)),null!==h?g=r.getStackAddendumByID(h):null!==f&&(g=r.getCurrentStackAddendum(f))),"production"!==t.env.NODE_ENV&&c(!1,"Failed %s type: %s%s",p,v.message,g)}}}var r,i=n(3),a=n(136),s=n(66),u=n(1),c=n(2);void 0!==t&&t.env&&"test"===t.env.NODE_ENV&&(r=n(7));var l={};e.exports=o}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e,n,o){if(null==n||"boolean"==typeof n||""===n)return"";if(isNaN(n)||0===n||a.hasOwnProperty(e)&&a[e])return""+n;if("string"==typeof n){if("production"!==t.env.NODE_ENV&&o&&"0"!==n){var r=o._currentElement._owner,u=r?r.getName():null;u&&!s[u]&&(s[u]={});var c=!1;if(u){var l=s[u];c=l[e],c||(l[e]=!0)}c||"production"!==t.env.NODE_ENV&&i(!1,"a `%s` tag (owner: `%s`) was passed a numeric string value for CSS property `%s` (value: `%s`) which will be treated as a unitless number in a future version of React.",o._currentElement.type,u||"unknown",e,n)}n=n.trim()}return n+"px"}var r=n(55),i=n(2),a=r.isUnitlessNumber,s={};e.exports=o}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e){if("production"!==t.env.NODE_ENV){var n=i.current;null!==n&&("production"!==t.env.NODE_ENV&&l(n._warnedAboutRefsInRender,"%s is accessing findDOMNode inside its render(). render() should be a pure function of props and state. It should never access something that requires stale data from the previous render, such as refs. Move this logic to componentDidMount and componentDidUpdate instead.",n.getName()||"A component"),n._warnedAboutRefsInRender=!0)}if(null==e)return null;if(1===e.nodeType)return e;var o=s.get(e);if(o)return o=u(o),o?a.getNodeFromInstance(o):null;"function"==typeof e.render?"production"!==t.env.NODE_ENV?c(!1,"findDOMNode was called on an unmounted component."):r("44"):"production"!==t.env.NODE_ENV?c(!1,"Element appears to be neither ReactComponent nor DOMNode (keys: %s)",Object.keys(e)):r("45",Object.keys(e))}var r=n(3),i=n(11),a=n(5),s=n(23),u=n(70),c=n(1),l=n(2);e.exports=o}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e,o,r,s){if(e&&"object"==typeof e){var c=e,l=void 0===c[r];"production"!==t.env.NODE_ENV&&(i||(i=n(7)),l||"production"!==t.env.NODE_ENV&&u(!1,"flattenChildren(...): Encountered two children with the same key, `%s`. Child keys must be unique; when two children share a key, only the first child will be used.%s",a.unescape(r),i.getStackAddendumByID(s))),l&&null!=o&&(c[r]=o)}}function r(e,n){if(null==e)return e;var r={};return"production"!==t.env.NODE_ENV?s(e,function(e,t,r){return o(e,t,r,n)},r):s(e,o,r),r}var i,a=n(35),s=n(75),u=n(2);void 0!==t&&t.env&&"test"===t.env.NODE_ENV&&(i=n(7)),e.exports=r}).call(t,n(0))},function(e,t,n){"use strict";function o(e){if(e.key){var t=i[e.key]||e.key;if("Unidentified"!==t)return t}if("keypress"===e.type){var n=r(e);return 13===n?"Enter":String.fromCharCode(n)}return"keydown"===e.type||"keyup"===e.type?a[e.keyCode]||"Unidentified":""}var r=n(41),i={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},a={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"};e.exports=o},function(e,t,n){"use strict";function o(e){var t=e&&(r&&e[r]||e[i]);if("function"==typeof t)return t}var r="function"==typeof Symbol&&Symbol.iterator,i="@@iterator";e.exports=o},function(e,t,n){"use strict";function o(){return r++}var r=1;e.exports=o},function(e,t,n){"use strict";function o(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function r(e){for(;e;){if(e.nextSibling)return e.nextSibling;e=e.parentNode}}function i(e,t){for(var n=o(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=o(r(n))}}e.exports=i},function(e,t,n){"use strict";function o(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 r(e){if(s[e])return s[e];if(!a[e])return e;var t=a[e];for(var n in t)if(t.hasOwnProperty(n)&&n in u)return s[e]=t[n];return""}var i=n(6),a={animationend:o("Animation","AnimationEnd"),animationiteration:o("Animation","AnimationIteration"),animationstart:o("Animation","AnimationStart"),transitionend:o("Transition","TransitionEnd")},s={},u={};i.canUseDOM&&(u=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=r},function(e,t,n){"use strict";function o(e){return'"'+r(e)+'"'}var r=n(29);e.exports=o},function(e,t,n){"use strict";var o=n(64);e.exports=o.renderSubtreeIntoContainer},function(e,t,n){"use strict";function o(e){var t={"=":"=0",":":"=2"};return"$"+(""+e).replace(/[=:]/g,function(e){return t[e]})}function r(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:o,unescape:r};e.exports=i},function(e,t,n){"use strict";(function(t){var o=n(16),r=n(1),i=function(e){var t=this;if(t.instancePool.length){var n=t.instancePool.pop();return t.call(n,e),n}return new t(e)},a=function(e,t){var n=this;if(n.instancePool.length){var o=n.instancePool.pop();return n.call(o,e,t),o}return new n(e,t)},s=function(e,t,n){var o=this;if(o.instancePool.length){var r=o.instancePool.pop();return o.call(r,e,t,n),r}return new o(e,t,n)},u=function(e,t,n,o){var r=this;if(r.instancePool.length){var i=r.instancePool.pop();return r.call(i,e,t,n,o),i}return new r(e,t,n,o)},c=function(e){var n=this;e instanceof n||("production"!==t.env.NODE_ENV?r(!1,"Trying to release an instance into a pool of a different type."):o("25")),e.destructor(),n.instancePool.length<n.poolSize&&n.instancePool.push(e)},l=i,p=function(e,t){var n=e;return n.instancePool=[],n.getPooled=t||l,n.poolSize||(n.poolSize=10),n.release=c,n},d={addPoolingTo:p,oneArgumentPooler:i,twoArgumentPooler:a,threeArgumentPooler:s,fourArgumentPooler:u};e.exports=d}).call(t,n(0))},function(e,t,n){"use strict";function o(e){return(""+e).replace(_,"$&/")}function r(e,t){this.func=e,this.context=t,this.count=0}function i(e,t,n){var o=e.func,r=e.context;o.call(r,t,e.count++)}function a(e,t,n){if(null==e)return e;var o=r.getPooled(t,n);g(e,i,o),r.release(o)}function s(e,t,n,o){this.result=e,this.keyPrefix=t,this.func=n,this.context=o,this.count=0}function u(e,t,n){var r=e.result,i=e.keyPrefix,a=e.func,s=e.context,u=a.call(s,t,e.count++);Array.isArray(u)?c(u,r,n,v.thatReturnsArgument):null!=u&&(m.isValidElement(u)&&(u=m.cloneAndReplaceKey(u,i+(!u.key||t&&t.key===u.key?"":o(u.key)+"/")+n)),r.push(u))}function c(e,t,n,r,i){var a="";null!=n&&(a=o(n)+"/");var c=s.getPooled(t,a,r,i);g(e,u,c),s.release(c)}function l(e,t,n){if(null==e)return e;var o=[];return c(e,o,null,t,n),o}function p(e,t,n){return null}function d(e,t){return g(e,p,null)}function f(e){var t=[];return c(e,t,null,v.thatReturnsArgument),t}var h=n(168),m=n(15),v=n(9),g=n(177),y=h.twoArgumentPooler,E=h.fourArgumentPooler,_=/\/+/g;r.prototype.destructor=function(){this.func=null,this.context=null,this.count=0},h.addPoolingTo(r,y),s.prototype.destructor=function(){this.result=null,this.keyPrefix=null,this.func=null,this.context=null,this.count=0},h.addPoolingTo(s,E);var N={forEach:a,map:l,mapIntoWithKeyPrefixInternal:c,count:d,toArray:f};e.exports=N},function(e,t,n){"use strict";(function(t){function o(e){return e}function r(e,n,o){for(var r in n)n.hasOwnProperty(r)&&"production"!==t.env.NODE_ENV&&N("function"==typeof n[r],"%s: %s type `%s` is invalid; it must be a function, usually from React.PropTypes.",e.displayName||"ReactClass",g[o],r)}function i(e,n){var o=D.hasOwnProperty(n)?D[n]:null;w.hasOwnProperty(n)&&"OVERRIDE_BASE"!==o&&("production"!==t.env.NODE_ENV?_(!1,"ReactClassInterface: You are attempting to override `%s` from your class specification. Ensure that your method names do not overlap with React methods.",n):f("73",n)),e&&"DEFINE_MANY"!==o&&"DEFINE_MANY_MERGED"!==o&&("production"!==t.env.NODE_ENV?_(!1,"ReactClassInterface: You are attempting to define `%s` on your component more than once. This conflict may be due to a mixin.",n):f("74",n))}function a(e,n){if(n){"function"==typeof n&&("production"!==t.env.NODE_ENV?_(!1,"ReactClass: You're attempting to use a component class or function as a mixin. Instead, just use a regular object."):f("75")),v.isValidElement(n)&&("production"!==t.env.NODE_ENV?_(!1,"ReactClass: You're attempting to use a component as a mixin. Instead, just use a regular object."):f("76"));var o=e.prototype,r=o.__reactAutoBindPairs;n.hasOwnProperty(b)&&O.mixins(e,n.mixins);for(var a in n)if(n.hasOwnProperty(a)&&a!==b){var s=n[a],u=o.hasOwnProperty(a);if(i(u,a),O.hasOwnProperty(a))O[a](e,s);else{var p=D.hasOwnProperty(a),d="function"==typeof s,h=d&&!p&&!u&&!1!==n.autobind;if(h)r.push(a,s),o[a]=s;else if(u){var m=D[a];(!p||"DEFINE_MANY_MERGED"!==m&&"DEFINE_MANY"!==m)&&("production"!==t.env.NODE_ENV?_(!1,"ReactClass: Unexpected spec policy %s for key %s when mixing in component specs.",m,a):f("77",m,a)),"DEFINE_MANY_MERGED"===m?o[a]=c(o[a],s):"DEFINE_MANY"===m&&(o[a]=l(o[a],s))}else o[a]=s,"production"!==t.env.NODE_ENV&&"function"==typeof s&&n.displayName&&(o[a].displayName=n.displayName+"_"+a)}}}else if("production"!==t.env.NODE_ENV){var g=typeof n,y="object"===g&&null!==n;"production"!==t.env.NODE_ENV&&N(y,"%s: You're attempting to include a mixin that is either null or not an object. Check the mixins included by the component, as well as any mixins they include themselves. Expected object but got %s.",e.displayName||"ReactClass",null===n?null:g)}}function s(e,n){if(n)for(var o in n){var r=n[o];if(n.hasOwnProperty(o)){var i=o in O;i&&("production"!==t.env.NODE_ENV?_(!1,'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.',o):f("78",o));var a=o in e;a&&("production"!==t.env.NODE_ENV?_(!1,"ReactClass: You are attempting to define `%s` on your component more than once. This conflict may be due to a mixin.",o):f("79",o)),e[o]=r}}}function u(e,n){e&&n&&"object"==typeof e&&"object"==typeof n||("production"!==t.env.NODE_ENV?_(!1,"mergeIntoWithNoDuplicateKeys(): Cannot merge non-objects."):f("80"));for(var o in n)n.hasOwnProperty(o)&&(void 0!==e[o]&&("production"!==t.env.NODE_ENV?_(!1,"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.",o):f("81",o)),e[o]=n[o]);return e}function c(e,t){return function(){var n=e.apply(this,arguments),o=t.apply(this,arguments);if(null==n)return o;if(null==o)return n;var r={};return u(r,n),u(r,o),r}}function l(e,t){return function(){e.apply(this,arguments),t.apply(this,arguments)}}function p(e,n){var o=n.bind(e);if("production"!==t.env.NODE_ENV){o.__reactBoundContext=e,o.__reactBoundMethod=n,o.__reactBoundArguments=null;var r=e.constructor.displayName,i=o.bind;o.bind=function(a){for(var s=arguments.length,u=Array(s>1?s-1:0),c=1;c<s;c++)u[c-1]=arguments[c];if(a!==e&&null!==a)"production"!==t.env.NODE_ENV&&N(!1,"bind(): React component methods may only be bound to the component instance. See %s",r);else if(!u.length)return"production"!==t.env.NODE_ENV&&N(!1,"bind(): You are binding a component method to the component. React does this for you automatically in a high-performance way, so you can safely remove this call. See %s",r),o;var l=i.apply(o,arguments);return l.__reactBoundContext=e,l.__reactBoundMethod=n,l.__reactBoundArguments=u,l}}return o}function d(e){for(var t=e.__reactAutoBindPairs,n=0;n<t.length;n+=2){var o=t[n],r=t[n+1];e[o]=p(e,r)}}var f=n(16),h=n(4),m=n(47),v=n(15),g=n(49),y=n(48),E=n(20),_=n(1),N=n(2),b="mixins",C=[],D={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"},O={displayName:function(e,t){e.displayName=t},mixins:function(e,t){if(t)for(var n=0;n<t.length;n++)a(e,t[n])},childContextTypes:function(e,n){"production"!==t.env.NODE_ENV&&r(e,n,"childContext"),e.childContextTypes=h({},e.childContextTypes,n)},contextTypes:function(e,n){"production"!==t.env.NODE_ENV&&r(e,n,"context"),e.contextTypes=h({},e.contextTypes,n)},getDefaultProps:function(e,t){e.getDefaultProps?e.getDefaultProps=c(e.getDefaultProps,t):e.getDefaultProps=t},propTypes:function(e,n){"production"!==t.env.NODE_ENV&&r(e,n,"prop"),e.propTypes=h({},e.propTypes,n)},statics:function(e,t){s(e,t)},autobind:function(){}},w={replaceState:function(e,t){this.updater.enqueueReplaceState(this,e),t&&this.updater.enqueueCallback(this,t,"replaceState")},isMounted:function(){return this.updater.isMounted(this)}},x=function(){};h(x.prototype,m.prototype,w);var T={createClass:function(e){var n=o(function(e,o,r){"production"!==t.env.NODE_ENV&&"production"!==t.env.NODE_ENV&&N(this instanceof n,"Something is calling a React component directly. Use a factory or JSX instead. See: https://fb.me/react-legacyfactory"),this.__reactAutoBindPairs.length&&d(this),this.props...||y,this.state=null;var i=this.getInitialState?this.getInitialState():null;"production"!==t.env.NODE_ENV&&void 0===i&&this.getInitialState._isMockFunction&&(i=null),("object"!=typeof i||Array.isArray(i))&&("production"!==t.env.NODE_ENV?_(!1,"%s.getInitialState(): must return an object or null",n.displayName||"ReactCompositeComponent"):f("82",n.displayName||"ReactCompositeComponent")),this.state=i});n.prototype=new x,n.prototype.constructor=n,n.prototype.__reactAutoBindPairs=[],C.forEach(a.bind(null,n)),a(n,e),n.getDefaultProps&&(n.defaultProps=n.getDefaultProps()),"production"!==t.env.NODE_ENV&&(n.getDefaultProps&&(n.getDefaultProps.isReactClassApproved={}),n.prototype.getInitialState&&(n.prototype.getInitialState.isReactClassApproved={})),n.prototype.render||("production"!==t.env.NODE_ENV?_(!1,"createClass(...): Class specification must implement a `render` method."):f("83")),"production"!==t.env.NODE_ENV&&("production"!==t.env.NODE_ENV&&N(!n.prototype.componentShouldUpdate,"%s has a method called componentShouldUpdate(). Did you mean shouldComponentUpdate()? The name is phrased as a question because the function is expected to return a value.",e.displayName||"A component"),"production"!==t.env.NODE_ENV&&N(!n.prototype.componentWillRecieveProps,"%s has a method called componentWillRecieveProps(). Did you mean componentWillReceiveProps()?",e.displayName||"A component"));for(var r in D)n.prototype[r]||(n.prototype[r]=null);return n},injection:{injectMixin:function(e){C.push(e)}}};e.exports=T}).call(t,n(0))},function(e,t,n){"use strict";(function(t){var o=n(15),r=o.createFactory;if("production"!==t.env.NODE_ENV){r=n(77).createFactory}var i={a:r("a"),abbr:r("abbr"),address:r("address"),area:r("area"),article:r("article"),aside:r("aside"),audio:r("audio"),b:r("b"),base:r("base"),bdi:r("bdi"),bdo:r("bdo"),big:r("big"),blockquote:r("blockquote"),body:r("body"),br:r("br"),button:r("button"),canvas:r("canvas"),caption:r("caption"),cite:r("cite"),code:r("code"),col:r("col"),colgroup:r("colgroup"),data:r("data"),datalist:r("datalist"),dd:r("dd"),del:r("del"),details:r("details"),dfn:r("dfn"),dialog:r("dialog"),div:r("div"),dl:r("dl"),dt:r("dt"),em:r("em"),embed:r("embed"),fieldset:r("fieldset"),figcaption:r("figcaption"),figure:r("figure"),footer:r("footer"),form:r("form"),h1:r("h1"),h2:r("h2"),h3:r("h3"),h4:r("h4"),h5:r("h5"),h6:r("h6"),head:r("head"),header:r("header"),hgroup:r("hgroup"),hr:r("hr"),html:r("html"),i:r("i"),iframe:r("iframe"),img:r("img"),input:r("input"),ins:r("ins"),kbd:r("kbd"),keygen:r("keygen"),label:r("label"),legend:r("legend"),li:r("li"),link:r("link"),main:r("main"),map:r("map"),mark:r("mark"),menu:r("menu"),menuitem:r("menuitem"),meta:r("meta"),meter:r("meter"),nav:r("nav"),noscript:r("noscript"),object:r("object"),ol:r("ol"),optgroup:r("optgroup"),option:r("option"),output:r("output"),p:r("p"),param:r("param"),picture:r("picture"),pre:r("pre"),progress:r("progress"),q:r("q"),rp:r("rp"),rt:r("rt"),ruby:r("ruby"),s:r("s"),samp:r("samp"),script:r("script"),section:r("section"),select:r("select"),small:r("small"),source:r("source"),span:r("span"),strong:r("strong"),style:r("style"),sub:r("sub"),summary:r("summary"),sup:r("sup"),table:r("table"),tbody:r("tbody"),td:r("td"),textarea:r("textarea"),tfoot:r("tfoot"),th:r("th"),thead:r("thead"),time:r("time"),title:r("title"),tr:r("tr"),track:r("track"),u:r("u"),ul:r("ul"),var:r("var"),video:r("video"),wbr:r("wbr"),circle:r("circle"),clipPath:r("clipPath"),defs:r("defs"),ellipse:r("ellipse"),g:r("g"),image:r("image"),line:r("line"),linearGradient:r("linearGradient"),mask:r("mask"),path:r("path"),pattern:r("pattern"),polygon:r("polygon"),polyline:r("polyline"),radialGradient:r("radialGradient"),rect:r("rect"),stop:r("stop"),svg:r("svg"),text:r("text"),tspan:r("tspan")};e.exports=i}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e,t){return e===t?0!==e||1/e==1/t:e!==e&&t!==t}function r(e){this.message=e,this.stack=""}function i(e){function n(n,i,a,s,u,c,l){if(s=s||D,c=c||a,"production"!==t.env.NODE_ENV&&l!==_&&"undefined"!=typeof console){var p=s+":"+a;o[p]||("production"!==t.env.NODE_ENV&&C(!1,"You are manually calling a React.PropTypes validation function for the `%s` prop on `%s`. This is deprecated and will not work in production with the next major version. You may be seeing this warning due to a third-party PropTypes library. See https://fb.me/react-warning-dont-call-proptypes for details.",c,s),o[p]=!0)}if(null==i[a]){var d=E[u];return n?new r(null===i[a]?"The "+d+" `"+c+"` is marked as required in `"+s+"`, but its value is `null`.":"The "+d+" `"+c+"` is marked as required in `"+s+"`, but its value is `undefined`."):null}return e(i,a,s,u,c)}if("production"!==t.env.NODE_ENV)var o={};var i=n.bind(null,!1);return i.isRequired=n.bind(null,!0),i}function a(e){function t(t,n,o,i,a,s){var u=t[n];if(m(u)!==e)return new r("Invalid "+E[i]+" `"+a+"` of type `"+v(u)+"` supplied to `"+o+"`, expected `"+e+"`.");return null}return i(t)}function s(e){function t(t,n,o,i,a){if("function"!=typeof e)return new r("Property `"+a+"` of component `"+o+"` has invalid PropType notation inside arrayOf.");var s=t[n];if(!Array.isArray(s)){return new r("Invalid "+E[i]+" `"+a+"` of type `"+m(s)+"` supplied to `"+o+"`, expected an array.")}for(var u=0;u<s.length;u++){var c=e(s,u,o,i,a+"["+u+"]",_);if(c instanceof Error)return c}return null}return i(t)}function u(e){function t(t,n,o,i,a){if(!(t[n]instanceof e)){var s=E[i],u=e.name||D;return new r("Invalid "+s+" `"+a+"` of type `"+g(t[n])+"` supplied to `"+o+"`, expected instance of `"+u+"`.")}return null}return i(t)}function c(e){function n(t,n,i,a,s){for(var u=t[n],c=0;c<e.length;c++)if(o(u,e[c]))return null;return new r("Invalid "+E[a]+" `"+s+"` of value `"+u+"` supplied to `"+i+"`, expected one of "+JSON.stringify(e)+".")}return Array.isArray(e)?i(n):("production"!==t.env.NODE_ENV&&C(!1,"Invalid argument supplied to oneOf, expected an instance of array."),N.thatReturnsNull)}function l(e){function t(t,n,o,i,a){if("function"!=typeof e)return new r("Property `"+a+"` of component `"+o+"` has invalid PropType notation inside objectOf.");var s=t[n],u=m(s);if("object"!==u){return new r("Invalid "+E[i]+" `"+a+"` of type `"+u+"` supplied to `"+o+"`, expected an object.")}for(var c in s)if(s.hasOwnProperty(c)){var l=e(s,c,o,i,a+"."+c,_);if(l instanceof Error)return l}return null}return i(t)}function p(e){function n(t,n,o,i,a){for(var s=0;s<e.length;s++){if(null==(0,e[s])(t,n,o,i,a,_))return null}return new r("Invalid "+E[i]+" `"+a+"` supplied to `"+o+"`.")}return Array.isArray(e)?i(n):("production"!==t.env.NODE_ENV&&C(!1,"Invalid argument supplied to oneOfType, expected an instance of array."),N.thatReturnsNull)}function d(e){function t(t,n,o,i,a){var s=t[n],u=m(s);if("object"!==u){return new r("Invalid "+E[i]+" `"+a+"` of type `"+u+"` supplied to `"+o+"`, expected `object`.")}for(var c in e){var l=e[c];if(l){var p=l(s,c,o,i,a+"."+c,_);if(p)return p}}return null}return i(t)}function f(e){switch(typeof e){case"number":case"string":case"undefined":return!0;case"boolean":return!e;case"object":if(Array.isArray(e))return e.every(f);if(null===e||y.isValidElement(e))return!0;var t=b(e);if(!t)return!1;var n,o=t.call(e);if(t!==e.entries){for(;!(n=o.next()).done;)if(!f(n.value))return!1}else for(;!(n=o.next()).done;){var r=n.value;if(r&&!f(r[1]))return!1}return!0;default:return!1}}function h(e,t){return"symbol"===e||("Symbol"===t["@@toStringTag"]||"function"==typeof Symbol&&t instanceof Symbol)}function m(e){var t=typeof e;return Array.isArray(e)?"array":e instanceof RegExp?"object":h(t,e)?"symbol":t}function v(e){var t=m(e);if("object"===t){if(e instanceof Date)return"date";if(e instanceof RegExp)return"regexp"}return t}function g(e){return e.constructor&&e.constructor.name?e.constructor.name:D}var y=n(15),E=n(49),_=n(78),N=n(9),b=n(51),C=n(2),D="<<anonymous>>",O={array:a("array"),bool:a("boolean"),func:a("function"),number:a("number"),object:a("object"),string:a("string"),symbol:a("symbol"),any:function(){return i(N.thatReturns(null))}(),arrayOf:s,element:function(){function e(e,t,n,o,i){var a=e[t];if(!y.isValidElement(a)){return new r("Invalid "+E[o]+" `"+i+"` of type `"+m(a)+"` supplied to `"+n+"`, expected a single ReactElement.")}return null}return i(e)}(),instanceOf:u,node:function(){function e(e,t,n,o,i){if(!f(e[t])){return new r("Invalid "+E[o]+" `"+i+"` supplied to `"+n+"`, expected a ReactNode.")}return null}return i(e)}(),objectOf:l,oneOf:c,oneOfType:p,shape:d};r.prototype=Error.prototype,e.exports=O}).call(t,n(0))},function(e,t,n){"use strict";function o(e,t,n){this.props=e,this.context=t,this.refs=u,this.updater=n||s}function r(){}var i=n(4),a=n(47),s=n(48),u=n(20);r.prototype=a.prototype,o.prototype=new r,o.prototype.constructor=o,i(o.prototype,a.prototype),o.prototype.isPureReactComponent=!0,e.exports=o},function(e,t,n){"use strict";e.exports="15.4.2"},function(e,t,n){"use strict";(function(t){function o(e,o,p,d,f,h){for(var m in e)if(e.hasOwnProperty(m)){var v;try{"function"!=typeof e[m]&&("production"!==t.env.NODE_ENV?u(!1,"%s: %s type `%s` is invalid; it must be a function, usually from React.PropTypes.",d||"React class",a[p],m):i("84",d||"React class",a[p],m)),v=e[m](o,m,d,p,null,s)}catch(e){v=e}if("production"!==t.env.NODE_ENV&&c(!v||v instanceof Error,"%s: type specification of %s `%s` is invalid; the type checker function must return `null` or an `Error` but returned a %s. You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument).",d||"React class",a[p],m,typeof v),v instanceof Error&&!(v.message in l)){l[v.message]=!0;var g="";"production"!==t.env.NODE_ENV&&(r||(r=n(7)),null!==h?g=r.getStackAddendumByID(h):null!==f&&(g=r.getCurrentStackAddendum(f))),"production"!==t.env.NODE_ENV&&c(!1,"Failed %s type: %s%s",p,v.message,g)}}}var r,i=n(16),a=n(49),s=n(78),u=n(1),c=n(2);void 0!==t&&t.env&&"test"===t.env.NODE_ENV&&(r=n(7));var l={};e.exports=o}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e){return i.isValidElement(e)||("production"!==t.env.NODE_ENV?a(!1,"React.Children.only expected to receive a single React element child."):r("143")),e}var r=n(16),i=n(15),a=n(1);e.exports=o}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e,t){return e&&"object"==typeof e&&null!=e.key?p.escape(e.key):t.toString(36)}function r(e,n,i,v){var g=typeof e;if("undefined"!==g&&"boolean"!==g||(e=null),null===e||"string"===g||"number"===g||"object"===g&&e.$$typeof===u)return i(v,e,""===n?f+o(e,0):n),1;var y,E,_=0,N=""===n?f:n+h;if(Array.isArray(e))for(var b=0;b<e.length;b++)y=e[b],E=N+o(y,b),_+=r(y,E,i,v);else{var C=c(e);if(C){var D,O=C.call(e);if(C!==e.entries)for(var w=0;!(D=O.next()).done;)y=D.value,E=N+o(y,w++),_+=r(y,E,i,v);else{if("production"!==t.env.NODE_ENV){var x="";if(s.current){var T=s.current.getName();T&&(x=" Check the render method of `"+T+"`.")}"production"!==t.env.NODE_ENV&&d(m,"Using Maps as children is not yet fully supported. It is an experimental feature that might be removed. Convert it to a sequence / iterable of keyed ReactElements instead.%s",x),m=!0}for(;!(D=O.next()).done;){var k=D.value;k&&(y=k[1],E=N+p.escape(k[0])+h+o(y,0),_+=r(y,E,i,v))}}}else if("object"===g){var I="";if("production"!==t.env.NODE_ENV&&(I=" If you meant to render a collection of children, use an array instead or wrap the object using createFragment(object) from the React add-ons.",e._isReactElement&&(I=" It looks like you're using an element created by a different version of React. Make sure to use only one copy of React."),s.current)){var P=s.current.getName();P&&(I+=" Check the render method of `"+P+"`.")}var S=String(e);"production"!==t.env.NODE_ENV?l(!1,"Objects are not valid as a React child (found: %s).%s","[object Object]"===S?"object with keys {"+Object.keys(e).join(", ")+"}":S,I):a("31","[object Object]"===S?"object with keys {"+Object.keys(e).join(", ")+"}":S,I)}}return _}function i(e,t,n){return null==e?0:r(e,"",t,n)}var a=n(16),s=n(11),u=n(76),c=n(51),l=n(1),p=n(167),d=n(2),f=".",h=":",m=!1;e.exports=i}).call(t,n(0))}])});
\ No newline at end of file
diff --git a/web/pgadmin/static/jsx/components.jsx b/web/pgadmin/static/jsx/components.jsx
new file mode 100644
index 00000000..5bcb5208
--- /dev/null
+++ b/web/pgadmin/static/jsx/components.jsx
@@ -0,0 +1,8 @@
+
+import React from 'react';
+import {render} from 'react-dom';
+
+export {
+  render,
+  React,
+};
\ No newline at end of file
diff --git a/web/pgadmin/utils/javascript/__init__.py b/web/pgadmin/utils/javascript/__init__.py
new file mode 100644
index 00000000..cac9a64a
--- /dev/null
+++ b/web/pgadmin/utils/javascript/__init__.py
@@ -0,0 +1,8 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2017, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+###########################################################################
diff --git a/web/pgadmin/utils/javascript/javascript_bundler.py b/web/pgadmin/utils/javascript/javascript_bundler.py
new file mode 100644
index 00000000..4ca2da67
--- /dev/null
+++ b/web/pgadmin/utils/javascript/javascript_bundler.py
@@ -0,0 +1,62 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2017, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import os
+from contextlib import contextmanager
+from subprocess import call
+from pgadmin.utils import u, fs_encoding, file_quote
+
+
+# enum-like for tracking whether we have
+class JsState:
+    NONE = 0
+    OLD = 1
+    NEW = 2
+
+
+class JavascriptBundler:
+    """Builds Javascript bundle files by delegating to webpack"""
+
+    def __init__(self):
+        self.jsState = JsState.NONE
+
+    def bundle(self):
+        try:
+            try_building_js()
+            self.jsState = JsState.NEW
+        except OSError:
+            webdir_path()
+            generatedJavascriptDir = os.path.join(webdir_path(), 'pgadmin', 'static', 'js', 'generated')
+            if os.path.exists(generatedJavascriptDir) and os.listdir(generatedJavascriptDir):
+                self.jsState = JsState.OLD
+            else:
+                self.jsState = JsState.NONE
+
+    def report(self):
+        return self.jsState
+
+
+@contextmanager
+def pushd(new_dir):
+    previous_dir = os.getcwd()
+    os.chdir(new_dir)
+    yield
+    os.chdir(previous_dir)
+
+
+def webdir_path():
+    dirname = os.path.dirname
+    thisPath = os.path.realpath(u(__file__, fs_encoding))
+    return dirname(dirname(dirname(dirname(thisPath))))
+
+
+def try_building_js():
+    with pushd(webdir_path()):
+        if call(['yarn', 'run', 'bundle']) != 0:
+            raise OSError('Error executing bundling the application')
diff --git a/web/pgadmin/utils/javascript/tests/__init__.py b/web/pgadmin/utils/javascript/tests/__init__.py
new file mode 100644
index 00000000..cac9a64a
--- /dev/null
+++ b/web/pgadmin/utils/javascript/tests/__init__.py
@@ -0,0 +1,8 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2017, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+###########################################################################
diff --git a/web/pgadmin/utils/javascript/tests/test_javascript_bundler.py b/web/pgadmin/utils/javascript/tests/test_javascript_bundler.py
new file mode 100644
index 00000000..6701138d
--- /dev/null
+++ b/web/pgadmin/utils/javascript/tests/test_javascript_bundler.py
@@ -0,0 +1,117 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2017, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+
+import sys
+
+from pgadmin.utils.route import BaseTestGenerator
+if sys.version_info < (3, 3):
+    import mock
+else:
+    import unittest.mock as mock
+
+
+class JavascriptBundlerTestCase(BaseTestGenerator):
+    """This tests that the javascript bundler tool causes the application to bundle,
+    and can be invoked before and after app start correctly"""
+
+    scenarios = [('scenario name: JavascriptBundlerTestCase', dict())]
+
+    def setUp(self):
+        self.mockSubprocess = mock.Mock()
+        self.mockOs = mock.Mock()
+        sys.modules['subprocess'] = self.mockSubprocess
+        sys.modules['os'] = self.mockOs
+
+    def runTest(self):
+        from pgadmin.utils.javascript.javascript_bundler import JavascriptBundler
+        from pgadmin.utils.javascript.javascript_bundler import JsState
+        self.JavascriptBundler = JavascriptBundler
+        self.JsState = JsState
+
+        self._bundling_succeeds()
+        self.resetTestState()
+        self._bundling_fails_and_there_is_no_existing_bundle()
+        self.resetTestState()
+        self._bundling_fails_when_bundling_returns_nonzero()
+        self.resetTestState()
+        self._bundling_fails_and_there_is_no_existing_bundle_directory()
+        self.resetTestState()
+        self._bundling_fails_but_there_was_existing_bundle()
+        self.resetTestState()
+
+    def resetTestState(self):
+        self.mockSubprocess.reset_mock()
+        self.mockSubprocess.call.side_effect = None
+        self.mockOs.reset_mock()
+        self.mockOs.listdir.side_effect = None
+        self.mockOs.path.exists.side_effect = None
+
+    def _bundling_succeeds(self):
+        javascriptBundler = self.JavascriptBundler()
+        self.assertEqual(len(self.mockSubprocess.method_calls), 0)
+        self.mockSubprocess.call.return_value = 0
+
+        self.mockOs.listdir.return_value = [u'history.js', u'reactComponents.js']
+
+        javascriptBundler.bundle()
+        self.mockSubprocess.call.assert_called_once_with(['yarn', 'run', 'bundle'])
+
+        reportedState = javascriptBundler.report()
+        expectedState = self.JsState.NEW
+        self.assertEqual(reportedState, expectedState)
+
+    def _bundling_fails_when_bundling_returns_nonzero(self):
+        javascriptBundler = self.JavascriptBundler()
+        self.assertEqual(len(self.mockSubprocess.method_calls), 0)
+        self.mockOs.listdir.return_value = []
+        self.mockSubprocess.call.return_value = 99
+
+        javascriptBundler.bundle()
+
+        reportedState = javascriptBundler.report()
+        expectedState = self.JsState.NONE
+        self.assertEqual(reportedState, expectedState)
+
+    def _bundling_fails_and_there_is_no_existing_bundle(self):
+        javascriptBundler = self.JavascriptBundler()
+        self.mockSubprocess.call.side_effect = OSError("mock exception behavior")
+        self.mockOs.path.exists.return_value = True
+        self.mockOs.listdir.return_value = []
+
+        javascriptBundler.bundle()
+
+        reportedState = javascriptBundler.report()
+        expectedState = self.JsState.NONE
+        self.assertEqual(reportedState, expectedState)
+
+    def _bundling_fails_and_there_is_no_existing_bundle_directory(self):
+        javascriptBundler = self.JavascriptBundler()
+        self.mockSubprocess.call.side_effect = OSError("mock exception behavior")
+        self.mockOs.path.exists.return_value = False
+        self.mockOs.listdir.side_effect = OSError("mock exception behavior")
+
+        javascriptBundler.bundle()
+
+        reportedState = javascriptBundler.report()
+        expectedState = self.JsState.NONE
+        self.assertEqual(reportedState, expectedState)
+
+    def _bundling_fails_but_there_was_existing_bundle(self):
+        javascriptBundler = self.JavascriptBundler()
+        self.mockSubprocess.call.side_effect = OSError("mock exception behavior")
+        self.mockOs.path.exists.return_value = True
+        self.mockOs.listdir.return_value = [u'history.js', u'reactComponents.js']
+
+        javascriptBundler.bundle()
+        self.mockSubprocess.call.assert_called_once_with(['yarn', 'run', 'bundle'])
+
+        reportedState = javascriptBundler.report()
+        expectedState = self.JsState.OLD
+        self.assertEqual(reportedState, expectedState)
diff --git a/web/regression/README b/web/regression/README
index f0d7282e..88edbd80 100644
--- a/web/regression/README
+++ b/web/regression/README
@@ -177,16 +177,17 @@ Javascript Tests:
 
     sudo port install nodejs7 yarn
 
+- See also the top-level pgadmin/README : Bundling Javascript
+
 - Javascript tests must be run from the web directory (since that is where node_modules and karma.conf reside):
 
     cd web/
 
 - Install the JS modules required for testing:
 
-    yarn
+    yarn install
 
 - Now run the tests:
 
-    yarn run karma start --single-run
-
-
+   yarn run test:karma
+   yarn run test:karma-once
diff --git a/web/regression/javascript/browser/menu_spec.js b/web/regression/javascript/browser/menu_spec.js
index 09f136fb..e13bfe5e 100644
--- a/web/regression/javascript/browser/menu_spec.js
+++ b/web/regression/javascript/browser/menu_spec.js
@@ -7,9 +7,11 @@
 //
 //////////////////////////////////////////////////////////////
 
-define(["browser/menu"
-], function () {
-  describe("MenuItem", function () {
+define([
+  'pgadmin',
+  'browser/menu',
+], function (pgAdmin) {
+  describe('MenuItem', function () {
     var MenuItem = pgAdmin.Browser.MenuItem;
     var menuItem;
 
diff --git a/web/regression/javascript/gettext_spec.js b/web/regression/javascript/gettext_spec.js
index 2ce98a23..54fc498d 100644
--- a/web/regression/javascript/gettext_spec.js
+++ b/web/regression/javascript/gettext_spec.js
@@ -7,45 +7,46 @@
 //
 //////////////////////////////////////////////////////////////////////////
 
-define(["sources/gettext", "translations"], function (gettext, translations) {
-  describe("translate", function () {
-    describe("when there is no translation", function () {
-      it("returns the original string", function () {
-        expect(gettext("something to be translated")).toEqual("something to be translated");
-      });
-
-      describe("when there are substitutions", function () {
-        it("interpolates a substitution", function () {
-          expect(gettext("translate text for %(person)s", {"person": "Sarah"})).toEqual("translate text for Sarah")
-        });
-
-        it("interpolates multiple substitutions", function () {
-          expect(gettext("translate '%(text)s' for %(person)s",
-            {
-              "text": "constitution",
-              "person": "Sarah"
-            }
-          )).toEqual("translate 'constitution' for Sarah")
-        });
-      });
+import gettext from 'sources/gettext';
+import translations from 'translations';
 
+describe('translate', function () {
+  describe('when there is no translation', function () {
+    it('returns the original string', function () {
+      expect(gettext('something to be translated')).toEqual('something to be translated');
     });
 
-    describe("when there is a translation", function () {
-      beforeEach(function () {
-        translations['something to be translated'] = 'etwas zum uebersetzen';
-        translations['another translation for %(person)s'] = 'eine weitere Uebersetzung fuer %(person)s';
+    describe('when there are substitutions', function () {
+      it('interpolates a substitution', function () {
+        expect(gettext('translate text for %(person)s', {'person': 'Sarah'})).toEqual('translate text for Sarah');
       });
 
-      it("returns the translation", function () {
-        expect(gettext("something to be translated")).toEqual("etwas zum uebersetzen");
+      it('interpolates multiple substitutions', function () {
+        expect(gettext('translate \'%(text)s\' for %(person)s',
+          {
+            'text': 'constitution',
+            'person': 'Sarah',
+          }
+        )).toEqual('translate \'constitution\' for Sarah');
       });
+    });
+
+  });
+
+  describe('when there is a translation', function () {
+    beforeEach(function () {
+      translations['something to be translated'] = 'etwas zum uebersetzen';
+      translations['another translation for %(person)s'] = 'eine weitere Uebersetzung fuer %(person)s';
+    });
+
+    it('returns the translation', function () {
+      expect(gettext('something to be translated')).toEqual('etwas zum uebersetzen');
+    });
 
-      describe("when there is a substitution", function () {
-        it("interpolates the substitution", function () {
-          expect(gettext("another translation for %(person)s", {"person": "Sarah"}))
-            .toEqual("eine weitere Uebersetzung fuer Sarah");
-        });
+    describe('when there is a substitution', function () {
+      it('interpolates the substitution', function () {
+        expect(gettext('another translation for %(person)s', {'person': 'Sarah'}))
+          .toEqual('eine weitere Uebersetzung fuer Sarah');
       });
     });
   });
diff --git a/web/regression/javascript/jasmine_capture_warnings_beforeall.js b/web/regression/javascript/jasmine_capture_warnings_beforeall.js
new file mode 100644
index 00000000..a83e6f61
--- /dev/null
+++ b/web/regression/javascript/jasmine_capture_warnings_beforeall.js
@@ -0,0 +1,23 @@
+//////////////////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2017, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////////////////
+
+/* eslint-disable no-console */
+
+beforeAll(function () {
+  spyOn(console, 'warn').and.callThrough();
+  spyOn(console, 'error').and.callThrough();
+});
+
+afterEach(function (done) {
+  setTimeout(function () {
+    expect(console.warn).not.toHaveBeenCalled();
+    expect(console.error).not.toHaveBeenCalled();
+    done();
+  }, 0);
+});
\ No newline at end of file
diff --git a/web/regression/javascript/selection/column_selector_spec.js b/web/regression/javascript/selection/column_selector_spec.js
index 7fa69aef..74d137a4 100644
--- a/web/regression/javascript/selection/column_selector_spec.js
+++ b/web/regression/javascript/selection/column_selector_spec.js
@@ -1,419 +1,423 @@
-define(
-  ["jquery",
-    "underscore",
-    "sources/selection/column_selector",
-    "sources/selection/active_cell_capture",
-    "sources/selection/grid_selector",
-    'sources/selection/xcell_selection_model',
-
-    "slickgrid",
-    'sources/slickgrid/pgslick.cellrangedecorator',
-    'sources/slickgrid/pgslick.cellrangeselector',
-    "slickgrid/slick.grid",
-  ],
-  function ($, _, ColumnSelector, ActiveCellCapture, GridSelector, XCellSelectionModel) {
-    var KEY_RIGHT = 39;
-    var KEY_LEFT = 37;
-    var KEY_UP = 38;
-    var KEY_DOWN = 40;
-
-    var Slick = window.Slick;
-    var SlickGrid = Slick.Grid;
-
-    describe("ColumnSelector", function () {
-      var container, data, columns, options;
-      beforeEach(function () {
-        container = $("<div></div>");
-        container.height(9999);
-        container.width(9999);
-
-        data = [{
-          'some-column-name': 'first value',
-          'second column': 'second value',
-          'third column': 'nonselectable value'
-        }, {
-          'some-column-name': 'row 1 - first value',
-          'second column': 'row 1 - second value',
-          'third column': 'row 1 - nonselectable value'
-        }];
-
-        columns = [
-          {
-            id: 'row-header-column',
-            name: 'row header column name',
-            selectable: false,
-            display_name: 'row header column name',
-            column_type: 'text'
-          },
-          {
-            id: '1',
-            name: 'some-column-name',
-            pos: 0,
-            display_name: 'some-column-name',
-            column_type: 'text'
-          },
-          {
-            id: '2',
-            name: 'second column',
-            pos: 1,
-            display_name: 'second column',
-            column_type: 'json'
-          },
-          {
-            id: 'third-column-id',
-            name: 'third column',
-            pos: 2,
-            display_name: 'third column',
-            column_type: 'text'
-          },
-          {
-            name: 'some-non-selectable-column',
-            selectable: false,
-            pos: 3,
-            display_name: 'some-non-selectable-column',
-            column_type: 'numeric'
-          }
-        ];
-      });
-
-      it("displays the name of the column", function () {
-        setupGrid(columns);
-
-        expect($(container.find('.slick-header-columns .slick-column-name')[1]).text())
-          .toContain('some-column-name');
-        expect($(container.find('.slick-header-columns .slick-column-name')[1]).text())
-          .toContain('text');
-        expect($(container.find('.slick-header-columns .slick-column-name')[2]).text())
-          .toContain('second column');
-        expect($(container.find('.slick-header-columns .slick-column-name')[2]).text())
-          .toContain('json');
-      });
-
-      it("preserves the other attributes of column definitions", function () {
-        var columnSelector = new ColumnSelector();
-        var selectableColumns = columnSelector.getColumnDefinitions(columns);
-
-        expect(selectableColumns[1].id).toBe('1');
-      });
-
-      describe("with ActiveCellCapture, CellSelectionModel, and GridSelector: selecting columns", function () {
-        var grid, cellSelectionModel;
-        beforeEach(function () {
-          var columnSelector = new ColumnSelector();
-          columns = columnSelector.getColumnDefinitions(columns);
-          data = [];
-          for (var i = 0; i < 10; i++) {
-            data.push({
-              'some-column-name': 'some-value-' + i,
-              'second column': 'second value ' + i,
-              'third column': 'third value ' + i,
-              'fourth column': 'fourth value ' + i,
-            });
-          }
-          grid = new SlickGrid(container, data, columns);
-
-          grid.registerPlugin(new ActiveCellCapture());
-          cellSelectionModel = new XCellSelectionModel();
-          grid.setSelectionModel(cellSelectionModel);
-
-          grid.registerPlugin(columnSelector);
-          grid.invalidate();
-          $("body").append(container);
-        });
-
-        afterEach(function () {
-          $("body").find(container).remove();
+//////////////////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2017, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////////////////
+
+import $ from 'jquery';
+
+import Slick from 'slickgrid';
+import 'slickgrid.grid';
+
+import ColumnSelector from 'sources/selection/column_selector';
+import ActiveCellCapture from 'sources/selection/active_cell_capture';
+import 'sources/selection/grid_selector';
+import XCellSelectionModel from 'sources/selection/xcell_selection_model';
+import 'sources/slickgrid/pgslick.cellrangedecorator';
+import 'sources/slickgrid/pgslick.cellrangeselector';
+
+describe('ColumnSelector', function () {
+  var container, data, columns, options;
+  var SlickGrid = Slick.Grid;
+  var KEY_RIGHT = 39;
+  var KEY_LEFT = 37;
+  var KEY_UP = 38;
+  var KEY_DOWN = 40;
+
+  beforeEach(function () {
+    container = $('<div></div>');
+    container.height(9999);
+    container.width(9999);
+
+    data = [{
+      'some-column-name': 'first value',
+      'second column': 'second value',
+      'third column': 'nonselectable value'
+    }, {
+      'some-column-name': 'row 1 - first value',
+      'second column': 'row 1 - second value',
+      'third column': 'row 1 - nonselectable value'
+    }];
+
+    columns = [
+      {
+        id: 'row-header-column',
+        name: 'row header column name',
+        selectable: false,
+        display_name: 'row header column name',
+        column_type: 'text'
+      },
+      {
+        id: '1',
+        name: 'some-column-name',
+        pos: 0,
+        display_name: 'some-column-name',
+        column_type: 'text'
+      },
+      {
+        id: '2',
+        name: 'second column',
+        pos: 1,
+        display_name: 'second column',
+        column_type: 'json'
+      },
+      {
+        id: 'third-column-id',
+        name: 'third column',
+        pos: 2,
+        display_name: 'third column',
+        column_type: 'text'
+      },
+      {
+        name: 'some-non-selectable-column',
+        selectable: false,
+        pos: 3,
+        display_name: 'some-non-selectable-column',
+        column_type: 'numeric'
+      }
+    ];
+  });
+
+  it('displays the name of the column', function () {
+    setupGrid(columns);
+
+    expect($(container.find('.slick-header-columns .slick-column-name')[1]).text())
+      .toContain('some-column-name');
+    expect($(container.find('.slick-header-columns .slick-column-name')[1]).text())
+      .toContain('text');
+    expect($(container.find('.slick-header-columns .slick-column-name')[2]).text())
+      .toContain('second column');
+    expect($(container.find('.slick-header-columns .slick-column-name')[2]).text())
+      .toContain('json');
+  });
+
+  it('preserves the other attributes of column definitions', function () {
+    var columnSelector = new ColumnSelector();
+    var selectableColumns = columnSelector.getColumnDefinitions(columns);
+
+    expect(selectableColumns[1].id).toBe('1');
+  });
+
+  describe('with ActiveCellCapture, CellSelectionModel, and GridSelector: selecting columns', function () {
+    var grid, cellSelectionModel;
+    beforeEach(function () {
+      var columnSelector = new ColumnSelector();
+      columns = columnSelector.getColumnDefinitions(columns);
+      data = [];
+      for (var i = 0; i < 10; i++) {
+        data.push({
+          'some-column-name': 'some-value-' + i,
+          'second column': 'second value ' + i,
+          'third column': 'third value ' + i,
+          'fourth column': 'fourth value ' + i,
         });
+      }
+      grid = new SlickGrid(container, data, columns);
 
-        describe("when the user clicks a column header", function () {
-          it("selects the column", function () {
-            container.find('.slick-header-column:contains(some-column-name)').click();
-            var selectedRanges = cellSelectionModel.getSelectedRanges();
-            expectOnlyTheFirstColumnToBeSelected(selectedRanges);
-          });
-
-          it("toggles a selected class to the header cell", function () {
-            container.find('.slick-header-column:contains(second column)').click();
-            expect($(container.find('.slick-header-column:contains(second column)')).hasClass('selected'))
-              .toBe(true);
+      grid.registerPlugin(new ActiveCellCapture());
+      cellSelectionModel = new XCellSelectionModel();
+      grid.setSelectionModel(cellSelectionModel);
 
-            container.find('.slick-header-column:contains(second column)').click();
-            expect($(container.find('.slick-header-column:contains(second column)')).hasClass('selected'))
-              .toBe(false);
-          });
-        });
+      grid.registerPlugin(columnSelector);
+      grid.invalidate();
+      $('body').append(container);
+    });
 
-        describe("when the user clicks an additional column header", function () {
-          beforeEach(function () {
-            container.find('.slick-header-column:contains(some-column-name)').click();
-            container.find('.slick-header-column:contains(second column)').click();
-          });
+    afterEach(function () {
+      $('body').find(container).remove();
+    });
 
-          it("selects additional columns", function () {
+    describe('when the user clicks a column header', function () {
+      it('selects the column', function () {
+        container.find('.slick-header-column:contains(some-column-name)').click();
+        var selectedRanges = cellSelectionModel.getSelectedRanges();
+        expectOnlyTheFirstColumnToBeSelected(selectedRanges);
+      });
 
-            var selectedRanges = cellSelectionModel.getSelectedRanges();
+      it('toggles a selected class to the header cell', function () {
+        container.find('.slick-header-column:contains(second column)').click();
+        expect($(container.find('.slick-header-column:contains(second column)')).hasClass('selected'))
+          .toBe(true);
 
-            expect(selectedRanges.length).toBe(2);
-            var column1 = selectedRanges[0];
-            expect(column1.fromCell).toBe(1);
-            expect(column1.toCell).toBe(1);
+        container.find('.slick-header-column:contains(second column)').click();
+        expect($(container.find('.slick-header-column:contains(second column)')).hasClass('selected'))
+          .toBe(false);
+      });
+    });
 
-            var column2 = selectedRanges[1];
-            expect(column2.fromCell).toBe(2);
-            expect(column2.toCell).toBe(2);
-          });
+    describe('when the user clicks an additional column header', function () {
+      beforeEach(function () {
+        container.find('.slick-header-column:contains(some-column-name)').click();
+        container.find('.slick-header-column:contains(second column)').click();
+      });
 
-          describe("and presses shift + right-arrow", function () {
-            beforeEach(function () {
-              pressShiftArrow(KEY_RIGHT);
-            });
-
-            it("keeps the last column selected", function () {
-              expect(cellSelectionModel.getSelectedRanges().length).toBe(1);
-            });
-
-            it("grows the selection to the right", function () {
-              var selectedRange = cellSelectionModel.getSelectedRanges()[0];
-              expect(selectedRange.fromCell).toBe(2);
-              expect(selectedRange.toCell).toBe(3);
-              expect(selectedRange.fromRow).toBe(0);
-              expect(selectedRange.toRow).toBe(9);
-            });
-
-            it("keeps selected class on columns 2 and 3", function () {
-              expect($(container.find('.slick-header-column:contains(second column)')).hasClass('selected'))
-                .toBe(true);
-              expect($(container.find('.slick-header-column:contains(third column)')).hasClass('selected'))
-                .toBe(true);
-              expect($(container.find('.slick-header-column:contains(some-column-name)')).hasClass('selected'))
-                .toBe(false);
-            });
-          });
+      it('selects additional columns', function () {
 
-          describe("when the user deselects the last selected column header", function () {
-            beforeEach(function () {
-              container.find('.slick-header-column:contains(second column)').click();
-            });
+        var selectedRanges = cellSelectionModel.getSelectedRanges();
 
-            describe("and presses shift + right-arrow", function () {
-              it("first and second columns are selected", function () {
-                pressShiftArrow(KEY_RIGHT);
+        expect(selectedRanges.length).toBe(2);
+        var column1 = selectedRanges[0];
+        expect(column1.fromCell).toBe(1);
+        expect(column1.toCell).toBe(1);
 
-                var selectedRanges = cellSelectionModel.getSelectedRanges();
+        var column2 = selectedRanges[1];
+        expect(column2.fromCell).toBe(2);
+        expect(column2.toCell).toBe(2);
+      });
 
-                expect(selectedRanges.length).toBe(1);
-                expect(selectedRanges[0].fromCell).toBe(1);
-                expect(selectedRanges[0].toCell).toBe(2);
-                expect(selectedRanges[0].fromRow).toBe(0);
-                expect(selectedRanges[0].toRow).toBe(9);
-              });
-            });
-          });
+      describe('and presses shift + right-arrow', function () {
+        beforeEach(function () {
+          pressShiftArrow(KEY_RIGHT);
         });
 
-        describe("when the user clicks a column header description", function () {
-          it("selects the column", function () {
-            container.find('.slick-header-columns span.column-description:contains(some-column-name)').click();
+        it('keeps the last column selected', function () {
+          expect(cellSelectionModel.getSelectedRanges().length).toBe(1);
+        });
 
-            var selectedRanges = cellSelectionModel.getSelectedRanges();
-            expectOnlyTheFirstColumnToBeSelected(selectedRanges);
-          });
+        it('grows the selection to the right', function () {
+          var selectedRange = cellSelectionModel.getSelectedRanges()[0];
+          expect(selectedRange.fromCell).toBe(2);
+          expect(selectedRange.toCell).toBe(3);
+          expect(selectedRange.fromRow).toBe(0);
+          expect(selectedRange.toRow).toBe(9);
+        });
 
-          it("toggles a selected class to the header cell", function () {
-            container.find('.slick-header-column span.column-description:contains(second column)').click();
-            expect($(container.find('.slick-header-column:contains(second column)')).hasClass('selected'))
-              .toBe(true);
+        it('keeps selected class on columns 2 and 3', function () {
+          expect($(container.find('.slick-header-column:contains(second column)')).hasClass('selected'))
+            .toBe(true);
+          expect($(container.find('.slick-header-column:contains(third column)')).hasClass('selected'))
+            .toBe(true);
+          expect($(container.find('.slick-header-column:contains(some-column-name)')).hasClass('selected'))
+            .toBe(false);
+        });
+      });
 
-            container.find('.slick-header-column span.column-description:contains(second column)').click();
-            expect($(container.find('.slick-header-column:contains(second column)')).hasClass('selected'))
-              .toBe(false);
-          });
+      describe('when the user deselects the last selected column header', function () {
+        beforeEach(function () {
+          container.find('.slick-header-column:contains(second column)').click();
         });
 
-        describe("when a row is selected", function () {
-          beforeEach(function () {
-            var selectedRanges = [new Slick.Range(0, 0, 0, 1)];
-            cellSelectionModel.setSelectedRanges(selectedRanges);
-          });
+        describe('and presses shift + right-arrow', function () {
+          it('first and second columns are selected', function () {
+            pressShiftArrow(KEY_RIGHT);
 
-          it("deselects the row", function () {
-            container.find('.slick-header-column')[1].click();
             var selectedRanges = cellSelectionModel.getSelectedRanges();
 
             expect(selectedRanges.length).toBe(1);
-
-            var column = selectedRanges[0];
-
-            expect(column.fromCell).toBe(1);
-            expect(column.toCell).toBe(1);
-            expect(column.fromRow).toBe(0);
-            expect(column.toRow).toBe(9);
+            expect(selectedRanges[0].fromCell).toBe(1);
+            expect(selectedRanges[0].toCell).toBe(2);
+            expect(selectedRanges[0].fromRow).toBe(0);
+            expect(selectedRanges[0].toRow).toBe(9);
           });
         });
+      });
+    });
 
-        describe("clicking a second time", function () {
-          beforeEach(function () {
-            container.find('.slick-header-column')[1].click();
-          });
+    describe('when the user clicks a column header description', function () {
+      it('selects the column', function () {
+        container.find('.slick-header-columns span.column-description:contains(some-column-name)').click();
 
-          it("deselects the column", function () {
-            container.find('.slick-header-column')[1].click();
-            var selectedRanges = cellSelectionModel.getSelectedRanges();
+        var selectedRanges = cellSelectionModel.getSelectedRanges();
+        expectOnlyTheFirstColumnToBeSelected(selectedRanges);
+      });
 
-            expect(selectedRanges.length).toEqual(0);
-          })
-        });
+      it('toggles a selected class to the header cell', function () {
+        container.find('.slick-header-column span.column-description:contains(second column)').click();
+        expect($(container.find('.slick-header-column:contains(second column)')).hasClass('selected'))
+          .toBe(true);
 
-        describe("when the column is not selectable", function () {
-          it("does not select the column", function () {
-            $(container.find('.slick-header-column:contains(some-non-selectable-column)')).click();
-            var selectedRanges = cellSelectionModel.getSelectedRanges();
+        container.find('.slick-header-column span.column-description:contains(second column)').click();
+        expect($(container.find('.slick-header-column:contains(second column)')).hasClass('selected'))
+          .toBe(false);
+      });
+    });
 
-            expect(selectedRanges.length).toEqual(0);
-          });
-        });
+    describe('when a row is selected', function () {
+      beforeEach(function () {
+        var selectedRanges = [new Slick.Range(0, 0, 0, 1)];
+        cellSelectionModel.setSelectedRanges(selectedRanges);
+      });
 
-        describe("when the column is deselected through setSelectedRanges", function () {
-          beforeEach(function () {
-            container.find('.slick-header-column')[1].click();
-          });
+      it('deselects the row', function () {
+        container.find('.slick-header-column')[1].click();
+        var selectedRanges = cellSelectionModel.getSelectedRanges();
 
-          it("removes selected class from header", function () {
-            cellSelectionModel.setSelectedRanges([]);
+        expect(selectedRanges.length).toBe(1);
 
-            expect($(container.find('.slick-header-column')[1]).hasClass('selected'))
-              .toBe(false);
-          });
-        });
+        var column = selectedRanges[0];
 
-        describe("when a non-column range was already selected", function () {
-          beforeEach(function () {
-            var selectedRanges = [new Slick.Range(0, 0, 2, 0)];
-            cellSelectionModel.setSelectedRanges(selectedRanges);
-          });
+        expect(column.fromCell).toBe(1);
+        expect(column.toCell).toBe(1);
+        expect(column.fromRow).toBe(0);
+        expect(column.toRow).toBe(9);
+      });
+    });
 
-          it("deselects the non-column range", function () {
-            container.find('.slick-header-column:contains(some-column-name)').click();
+    describe('clicking a second time', function () {
+      beforeEach(function () {
+        container.find('.slick-header-column')[1].click();
+      });
 
-            var selectedRanges = cellSelectionModel.getSelectedRanges();
-            expectOnlyTheFirstColumnToBeSelected(selectedRanges);
-          });
-        });
+      it('deselects the column', function () {
+        container.find('.slick-header-column')[1].click();
+        var selectedRanges = cellSelectionModel.getSelectedRanges();
 
-        describe('when a column is selected', function () {
-          beforeEach(function () {
-            container.find('.slick-header-column:contains(some-column-name)').click();
-          });
+        expect(selectedRanges.length).toEqual(0);
+      })
+    });
 
-          describe('when the user click a cell on the current range', function () {
-            beforeEach(function () {
-              container.find('.slick-cell.l1.r1')[1].click();
-            });
+    describe('when the column is not selectable', function () {
+      it('does not select the column', function () {
+        $(container.find('.slick-header-column:contains(some-non-selectable-column)')).click();
+        var selectedRanges = cellSelectionModel.getSelectedRanges();
 
-            it('column is deselected', function () {
+        expect(selectedRanges.length).toEqual(0);
+      });
+    });
 
-              var selectedRanges = cellSelectionModel.getSelectedRanges();
+    describe('when the column is deselected through setSelectedRanges', function () {
+      beforeEach(function () {
+        container.find('.slick-header-column')[1].click();
+      });
 
-              expect(selectedRanges.length).toBe(1);
+      it('removes selected class from header', function () {
+        cellSelectionModel.setSelectedRanges([]);
 
-              var column = selectedRanges[0];
+        expect($(container.find('.slick-header-column')[1]).hasClass('selected'))
+          .toBe(false);
+      });
+    });
 
-              expect(column.fromCell).toBe(1);
-              expect(column.toCell).toBe(1);
-              expect(column.fromRow).toBe(1);
-              expect(column.toRow).toBe(1);
-            });
+    describe('when a non-column range was already selected', function () {
+      beforeEach(function () {
+        var selectedRanges = [new Slick.Range(0, 0, 2, 0)];
+        cellSelectionModel.setSelectedRanges(selectedRanges);
+      });
 
-            it('keep select class on column header', function () {
-              expect($(container.find('.slick-header-column:contains(some-column-name)')).hasClass('selected'))
-                .toBeTruthy();
-            });
-          });
+      it('deselects the non-column range', function () {
+        container.find('.slick-header-column:contains(some-column-name)').click();
 
-          describe('when the user click a cell outside the current range', function () {
-            beforeEach(function () {
-              container.find('.slick-cell.l2.r2')[2].click();
-            });
+        var selectedRanges = cellSelectionModel.getSelectedRanges();
+        expectOnlyTheFirstColumnToBeSelected(selectedRanges);
+      });
+    });
 
-            it('column is deselected', function () {
+    describe('when a column is selected', function () {
+      beforeEach(function () {
+        container.find('.slick-header-column:contains(some-column-name)').click();
+      });
 
-              var selectedRanges = cellSelectionModel.getSelectedRanges();
+      describe('when the user click a cell on the current range', function () {
+        beforeEach(function () {
+          container.find('.slick-cell.l1.r1')[1].click();
+        });
 
-              expect(selectedRanges.length).toBe(1);
+        it('column is deselected', function () {
 
-              var column = selectedRanges[0];
+          var selectedRanges = cellSelectionModel.getSelectedRanges();
 
-              expect(column.fromCell).toBe(2);
-              expect(column.toCell).toBe(2);
-              expect(column.fromRow).toBe(2);
-              expect(column.toRow).toBe(2);
-            });
+          expect(selectedRanges.length).toBe(1);
 
-            it('remove select class on "some-column-name" column header', function () {
-              expect($(container.find('.slick-header-column:contains(some-column-name)')).hasClass('selected'))
-                .toBeFalsy();
-              expect($(container.find('.slick-header-column:contains(second column)')).hasClass('selected'))
-                .toBeTruthy();
-            });
-          });
+          var column = selectedRanges[0];
 
-          describe('when the user click in a row header', function () {
-            beforeEach(function () {
-              var selectedRanges = [new Slick.Range(1, 1, 1, 3)];
-              cellSelectionModel.setSelectedRanges(selectedRanges);
-            });
+          expect(column.fromCell).toBe(1);
+          expect(column.toCell).toBe(1);
+          expect(column.fromRow).toBe(1);
+          expect(column.toRow).toBe(1);
+        });
 
-            it('column is deselected', function () {
-              var selectedRanges = cellSelectionModel.getSelectedRanges();
+        it('keep select class on column header', function () {
+          expect($(container.find('.slick-header-column:contains(some-column-name)')).hasClass('selected'))
+            .toBeTruthy();
+        });
+      });
 
-              expect(selectedRanges.length).toBe(1);
+      describe('when the user click a cell outside the current range', function () {
+        beforeEach(function () {
+          container.find('.slick-cell.l2.r2')[2].click();
+        });
 
-              var column = selectedRanges[0];
+        it('column is deselected', function () {
 
-              expect(column.fromCell).toBe(1);
-              expect(column.toCell).toBe(3);
-              expect(column.fromRow).toBe(1);
-              expect(column.toRow).toBe(1);
-            });
+          var selectedRanges = cellSelectionModel.getSelectedRanges();
 
-            it('no column should have the class "selected"', function () {
-              expect($(container.find('.slick-header-column:contains(some-column-name)')).hasClass('selected'))
-                .toBeFalsy();
-            });
-          });
+          expect(selectedRanges.length).toBe(1);
+
+          var column = selectedRanges[0];
+
+          expect(column.fromCell).toBe(2);
+          expect(column.toCell).toBe(2);
+          expect(column.fromRow).toBe(2);
+          expect(column.toRow).toBe(2);
+        });
+
+        it('remove select class on \'some-column-name\' column header', function () {
+          expect($(container.find('.slick-header-column:contains(some-column-name)')).hasClass('selected'))
+            .toBeFalsy();
+          expect($(container.find('.slick-header-column:contains(second column)')).hasClass('selected'))
+            .toBeTruthy();
         });
       });
 
-      function setupGrid(columns) {
-        var columnSelector = new ColumnSelector();
-        columns = columnSelector.getColumnDefinitions(columns);
-        var grid = new SlickGrid(container, data, columns, options);
+      describe('when the user click in a row header', function () {
+        beforeEach(function () {
+          var selectedRanges = [new Slick.Range(1, 1, 1, 3)];
+          cellSelectionModel.setSelectedRanges(selectedRanges);
+        });
 
-        var cellSelectionModel = new XCellSelectionModel();
-        grid.setSelectionModel(cellSelectionModel);
+        it('column is deselected', function () {
+          var selectedRanges = cellSelectionModel.getSelectedRanges();
 
-        grid.registerPlugin(columnSelector);
-        grid.invalidate();
-      }
+          expect(selectedRanges.length).toBe(1);
 
-      function expectOnlyTheFirstColumnToBeSelected(selectedRanges) {
-        var row = selectedRanges[0];
+          var column = selectedRanges[0];
 
-        expect(selectedRanges.length).toEqual(1);
-        expect(row.fromCell).toBe(1);
-        expect(row.toCell).toBe(1);
-        expect(row.fromRow).toBe(0);
-        expect(row.toRow).toBe(9);
-      }
-
-      function pressShiftArrow(keyCode) {
-        var pressEvent = new $.Event("keydown");
-        pressEvent.shiftKey = true;
-        pressEvent.ctrlKey = false;
-        pressEvent.altKey = false;
-        pressEvent.which = keyCode;
+          expect(column.fromCell).toBe(1);
+          expect(column.toCell).toBe(3);
+          expect(column.fromRow).toBe(1);
+          expect(column.toRow).toBe(1);
+        });
 
-        $(container.find('.grid-canvas')).trigger(pressEvent);
-      }
+        it('no column should have the class \'selected\'', function () {
+          expect($(container.find('.slick-header-column:contains(some-column-name)')).hasClass('selected'))
+            .toBeFalsy();
+        });
+      });
     });
-  });
\ No newline at end of file
+  });
+
+  function setupGrid(columns) {
+    var columnSelector = new ColumnSelector();
+    columns = columnSelector.getColumnDefinitions(columns);
+    var grid = new SlickGrid(container, data, columns, options);
+
+    var cellSelectionModel = new XCellSelectionModel();
+    grid.setSelectionModel(cellSelectionModel);
+
+    grid.registerPlugin(columnSelector);
+    grid.invalidate();
+  }
+
+  function expectOnlyTheFirstColumnToBeSelected(selectedRanges) {
+    var row = selectedRanges[0];
+
+    expect(selectedRanges.length).toEqual(1);
+    expect(row.fromCell).toBe(1);
+    expect(row.toCell).toBe(1);
+    expect(row.fromRow).toBe(0);
+    expect(row.toRow).toBe(9);
+  }
+
+  function pressShiftArrow(keyCode) {
+    var pressEvent = new $.Event('keydown');
+    pressEvent.shiftKey = true;
+    pressEvent.ctrlKey = false;
+    pressEvent.altKey = false;
+    pressEvent.which = keyCode;
+
+    $(container.find('.grid-canvas')).trigger(pressEvent);
+  }
+});
diff --git a/web/regression/javascript/selection/copy_data_spec.js b/web/regression/javascript/selection/copy_data_spec.js
index 561576ce..2d6b6ad2 100644
--- a/web/regression/javascript/selection/copy_data_spec.js
+++ b/web/regression/javascript/selection/copy_data_spec.js
@@ -1,139 +1,142 @@
-/////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
 //
 // pgAdmin 4 - PostgreSQL Tools
 //
 // Copyright (C) 2013 - 2017, The pgAdmin Development Team
 // This software is released under the PostgreSQL Licence
 //
-//////////////////////////////////////////////////////////////
-
-define(
-  ["jquery",
-    "slickgrid/slick.grid",
-    "sources/selection/xcell_selection_model",
-    "sources/selection/copy_data",
-    "sources/selection/clipboard",
-    "sources/selection/range_selection_helper"
-  ],
-  function ($, SlickGrid, XCellSelectionModel, copyData, clipboard, RangeSelectionHelper) {
-    describe('copyData', function () {
-      var grid, sqlEditor, gridContainer, buttonPasteRow;
-
-      beforeEach(function () {
-        var data = [[1, "leopord", "12"],
-          [2, "lion", "13"],
-          [3, "puma", "9"]];
-
-        var columns = [
-          {
-            id: 'row-header-column',
-            name: 'row header column name',
-            selectable: false,
-            display_name: 'row header column name',
-            column_type: 'text'
-          },
-          {
-            name: "id",
-            pos: 0,
-            label: "id<br> numeric",
-            cell: "number",
-            can_edit: false,
-            type: "numeric"
-          }, {
-            name: "brand",
-            pos: 1,
-            label: "flavor<br> character varying",
-            cell: "string",
-            can_edit: false,
-            type: "character varying"
-          }, {
-            name: "size",
-            pos: 2,
-            label: "size<br> numeric",
-            cell: "number",
-            can_edit: false,
-            type: "numeric"
-          }
-          ]
-        ;
-        gridContainer = $("<div id='grid'></div>");
-        $("body").append(gridContainer);
-        buttonPasteRow = $("<button id='btn-paste-row' disabled></button>");
-        $("body").append(buttonPasteRow);
-        grid = new Slick.Grid("#grid", data, columns, {});
-        grid.setSelectionModel(new XCellSelectionModel());
-        sqlEditor = {slickgrid: grid};
-      });
+//////////////////////////////////////////////////////////////////////////
+
+import $ from 'jquery';
+
+import Slick from 'slickgrid';
+import 'slickgrid.grid';
+
+import clipboard from '../../../pgadmin/static/js/selection/clipboard';
+import copyData from '../../../pgadmin/static/js/selection/copy_data';
+import RangeSelectionHelper from 'sources/selection/range_selection_helper';
+import XCellSelectionModel from 'sources/selection/xcell_selection_model';
+
+describe('copyData', function () {
+  var grid, sqlEditor, gridContainer, buttonPasteRow;
+  var Slick, SlickGrid;
+
+  beforeEach(function () {
+    Slick = window.Slick;
+    SlickGrid = Slick.Grid;
+    var data = [[1, 'leopord', '12'],
+      [2, 'lion', '13'],
+      [3, 'puma', '9']];
+
+    var columns = [
+        {
+          id: 'row-header-column',
+          name: 'row header column name',
+          selectable: false,
+          display_name: 'row header column name',
+          column_type: 'text'
+        },
+        {
+          name: 'id',
+          pos: 0,
+          label: 'id<br> numeric',
+          cell: 'number',
+          can_edit: false,
+          type: 'numeric'
+        }, {
+          name: 'brand',
+          pos: 1,
+          label: 'flavor<br> character varying',
+          cell: 'string',
+          can_edit: false,
+          type: 'character varying'
+        }, {
+          name: 'size',
+          pos: 2,
+          label: 'size<br> numeric',
+          cell: 'number',
+          can_edit: false,
+          type: 'numeric'
+        }
+      ]
+    ;
+    gridContainer = $('<div id=\'grid\'></div>');
+    $('body').append(gridContainer);
+    buttonPasteRow = $('<button id=\'btn-paste-row\' disabled></button>');
+    $('body').append(buttonPasteRow);
+    grid = new Slick.Grid('#grid', data, columns, {});
+    grid.setSelectionModel(new XCellSelectionModel());
+    sqlEditor = {slickgrid: grid};
+  });
 
-      afterEach(function() {
-        gridContainer.remove();
-        buttonPasteRow.remove();
-      });
+  afterEach(function () {
+    gridContainer.remove();
+    buttonPasteRow.remove();
+  });
 
-      describe("when rows are selected", function () {
-        beforeEach(function () {
-          grid.getSelectionModel().setSelectedRanges([
-            RangeSelectionHelper.rangeForRow(grid, 0),
-            RangeSelectionHelper.rangeForRow(grid, 2)]
-          );
-        });
+  describe('when rows are selected', function () {
+    beforeEach(function () {
+      grid.getSelectionModel().setSelectedRanges([
+        RangeSelectionHelper.rangeForRow(grid, 0),
+        RangeSelectionHelper.rangeForRow(grid, 2)]
+      );
+    });
 
-        it("copies them", function () {
-          spyOn(clipboard, 'copyTextToClipboard');
+    it('copies them', function () {
+      spyOn(clipboard, 'copyTextToClipboard');
 
-          copyData.apply(sqlEditor);
+      copyData.apply(sqlEditor);
 
-          expect(sqlEditor.copied_rows.length).toBe(2);
+      expect(sqlEditor.copied_rows.length).toBe(2);
 
-          expect(clipboard.copyTextToClipboard).toHaveBeenCalled();
-          expect(clipboard.copyTextToClipboard.calls.mostRecent().args[0]).toContain("1,'leopord','12'");
-          expect(clipboard.copyTextToClipboard.calls.mostRecent().args[0]).toContain("3,'puma','9'");
-        });
+      expect(clipboard.copyTextToClipboard).toHaveBeenCalled();
+      expect(clipboard.copyTextToClipboard.calls.mostRecent().args[0]).toContain('1,\'leopord\',\'12\'');
+      expect(clipboard.copyTextToClipboard.calls.mostRecent().args[0]).toContain('3,\'puma\',\'9\'');
+    });
 
-        describe("when the user can edit the grid", function () {
-          it("enables the paste row button", function () {
-            copyData.apply(_.extend({can_edit: true}, sqlEditor));
+    describe('when the user can edit the grid', function () {
+      it('enables the paste row button', function () {
+        copyData.apply(_.extend({can_edit: true}, sqlEditor));
 
-            expect($("#btn-paste-row").prop('disabled')).toBe(false);
-          });
-        });
+        expect($('#btn-paste-row').prop('disabled')).toBe(false);
       });
+    });
+  });
 
-      describe("when a column is selected", function () {
-        beforeEach(function () {
-          var firstDataColumn = RangeSelectionHelper.rangeForColumn(grid, 1);
-          grid.getSelectionModel().setSelectedRanges([firstDataColumn])
-        });
+  describe('when a column is selected', function () {
+    beforeEach(function () {
+      var firstDataColumn = RangeSelectionHelper.rangeForColumn(grid, 1);
+      grid.getSelectionModel().setSelectedRanges([firstDataColumn]);
+    });
 
-        it("copies text to the clipboard", function () {
-          spyOn(clipboard, 'copyTextToClipboard');
+    it('copies text to the clipboard', function () {
+      spyOn(clipboard, 'copyTextToClipboard');
 
-          copyData.apply(sqlEditor);
+      copyData.apply(sqlEditor);
 
-          expect(clipboard.copyTextToClipboard).toHaveBeenCalled();
+      expect(clipboard.copyTextToClipboard).toHaveBeenCalled();
 
-          var copyArg = clipboard.copyTextToClipboard.calls.mostRecent().args[0];
-          var rowStrings = copyArg.split('\n');
-          expect(rowStrings[0]).toBe("1");
-          expect(rowStrings[1]).toBe("2");
-          expect(rowStrings[2]).toBe("3");
-        });
+      var copyArg = clipboard.copyTextToClipboard.calls.mostRecent().args[0];
+      var rowStrings = copyArg.split('\n');
+      expect(rowStrings[0]).toBe('1');
+      expect(rowStrings[1]).toBe('2');
+      expect(rowStrings[2]).toBe('3');
+    });
 
-        it("sets copied_rows to empty", function () {
-          copyData.apply(sqlEditor);
+    it('sets copied_rows to empty', function () {
+      copyData.apply(sqlEditor);
 
-          expect(sqlEditor.copied_rows.length).toBe(0);
-        });
+      expect(sqlEditor.copied_rows.length).toBe(0);
+    });
 
-        describe("when the user can edit the grid", function () {
-          beforeEach(function () {
-            copyData.apply(_.extend({can_edit: true}, sqlEditor));
-          });
+    describe('when the user can edit the grid', function () {
+      beforeEach(function () {
+        copyData.apply(_.extend({can_edit: true}, sqlEditor));
+      });
 
-          it("disables the paste row button", function () {
-            expect($("#btn-paste-row").prop('disabled')).toBe(true);
-          });
-        });
+      it('disables the paste row button', function () {
+        expect($('#btn-paste-row').prop('disabled')).toBe(true);
       });
     });
   });
+});
diff --git a/web/regression/javascript/selection/grid_selector_spec.js b/web/regression/javascript/selection/grid_selector_spec.js
index d79d417f..f7b39ee8 100644
--- a/web/regression/javascript/selection/grid_selector_spec.js
+++ b/web/regression/javascript/selection/grid_selector_spec.js
@@ -1,117 +1,130 @@
-define(["jquery",
-    "underscore",
-    "slickgrid/slick.grid",
-    "sources/selection/xcell_selection_model",
-    "sources/selection/grid_selector"
-  ],
-  function ($, _, SlickGrid, XCellSelectionModel, GridSelector) {
-    describe("GridSelector", function () {
-      var container, data, columns, gridSelector, xCellSelectionModel;
-
-      beforeEach(function () {
-        container = $("<div></div>");
-        container.height(9999);
-        columns = [{
-          id: '1',
-          name: 'some-column-name',
-          pos: 0
-        }, {
-          id: '2',
-          name: 'second column',
-          pos: 1
-        }];
-
-        gridSelector = new GridSelector();
-        columns = gridSelector.getColumnDefinitions(columns);
-
-        data = [];
-        for (var i = 0; i < 10; i++) {
-          data.push({'some-column-name': 'some-value-' + i, 'second column': 'second value ' + i});
-        }
-        var grid = new SlickGrid(container, data, columns);
-
-        xCellSelectionModel = new XCellSelectionModel();
-        grid.setSelectionModel(xCellSelectionModel);
-
-        grid.registerPlugin(gridSelector);
-        grid.invalidate();
-
-        $("body").append(container);
-      });
-
-      afterEach(function () {
-        $("body").find(container).remove();
-      });
+//////////////////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2017, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////////////////
+
+import $ from 'jquery';
+import _ from 'underscore';
+
+import Slick from 'slickgrid';
+import 'slickgrid.grid';
+
+import GridSelector from 'sources/selection/grid_selector';
+import XCellSelectionModel from 'sources/selection/xcell_selection_model';
+
+describe('GridSelector', function () {
+  var container, data, columns, gridSelector, xCellSelectionModel;
+  var Slick, SlickGrid;
+
+  beforeEach(function () {
+    Slick = window.Slick;
+    SlickGrid = Slick.Grid;
+    container = $('<div></div>');
+    container.height(9999);
+    columns = [{
+      id: '1',
+      name: 'some-column-name',
+      pos: 0
+    }, {
+      id: '2',
+      name: 'second column',
+      pos: 1
+    }];
+
+    gridSelector = new GridSelector();
+    columns = gridSelector.getColumnDefinitions(columns);
+
+    data = [];
+    for (var i = 0; i < 10; i++) {
+      data.push({'some-column-name': 'some-value-' + i, 'second column': 'second value ' + i});
+    }
+    var grid = new Slick.Grid(container, data, columns);
+
+    xCellSelectionModel = new XCellSelectionModel();
+    grid.setSelectionModel(xCellSelectionModel);
+
+    grid.registerPlugin(gridSelector);
+    grid.invalidate();
+
+    $('body').append(container);
+  });
 
-      it("renders an additional column on the left for selecting rows", function () {
-        expect(columns.length).toBe(3);
+  afterEach(function () {
+    $('body').find(container).remove();
+  });
 
-        var leftmostColumn = columns[0];
-        expect(leftmostColumn.id).toBe('row-header-column');
-      });
+  it('renders an additional column on the left for selecting rows', function () {
+    expect(columns.length).toBe(3);
 
-      it("renders a button for selecting all the cells", function () {
-        expect(container.find("[title='Select/Deselect All']").length).toBe(1);
-      });
+    var leftmostColumn = columns[0];
+    expect(leftmostColumn.id).toBe('row-header-column');
+  });
 
-      describe("when the cell for the select/deselect all is clicked", function () {
-        it("selects the whole grid", function () {
-          container.find("[title='Select/Deselect All']").parent().click();
+  it('renders a button for selecting all the cells', function () {
+    expect(container.find('[title=\'Select/Deselect All\']').length).toBe(1);
+  });
 
-          var selectedRanges = xCellSelectionModel.getSelectedRanges();
-          expect(selectedRanges.length).toBe(1);
-          var selectedRange = selectedRanges[0];
-          expect(selectedRange.fromCell).toBe(1);
-          expect(selectedRange.toCell).toBe(2);
-          expect(selectedRange.fromRow).toBe(0);
-          expect(selectedRange.toRow).toBe(9);
-        });
+  describe('when the cell for the select/deselect all is clicked', function () {
+    it('selects the whole grid', function () {
+      container.find('[title=\'Select/Deselect All\']').parent().click();
+
+      var selectedRanges = xCellSelectionModel.getSelectedRanges();
+      expect(selectedRanges.length).toBe(1);
+      var selectedRange = selectedRanges[0];
+      expect(selectedRange.fromCell).toBe(1);
+      expect(selectedRange.toCell).toBe(2);
+      expect(selectedRange.fromRow).toBe(0);
+      expect(selectedRange.toRow).toBe(9);
+    });
 
-        it("adds selected class", function () {
-          container.find("[title='Select/Deselect All']").parent().click();
+    it('adds selected class', function () {
+      container.find('[title=\'Select/Deselect All\']').parent().click();
 
-          expect($(container.find("[data-id='select-all']")).hasClass('selected')).toBeTruthy();
-        });
-      });
+      expect($(container.find('[data-id=\'select-all\']')).hasClass('selected')).toBeTruthy();
+    });
+  });
 
-      describe("when the select all button in the corner gets selected", function () {
+  describe('when the select all button in the corner gets selected', function () {
 
-        it("selects all the cells", function () {
-          container.find("[title='Select/Deselect All']").click();
+    it('selects all the cells', function () {
+      container.find('[title=\'Select/Deselect All\']').click();
 
-          var selectedRanges = xCellSelectionModel.getSelectedRanges();
-          expect(selectedRanges.length).toBe(1);
-          var selectedRange = selectedRanges[0];
-          expect(selectedRange.fromCell).toBe(1);
-          expect(selectedRange.toCell).toBe(2);
-          expect(selectedRange.fromRow).toBe(0);
-          expect(selectedRange.toRow).toBe(9);
-        });
+      var selectedRanges = xCellSelectionModel.getSelectedRanges();
+      expect(selectedRanges.length).toBe(1);
+      var selectedRange = selectedRanges[0];
+      expect(selectedRange.fromCell).toBe(1);
+      expect(selectedRange.toCell).toBe(2);
+      expect(selectedRange.fromRow).toBe(0);
+      expect(selectedRange.toRow).toBe(9);
+    });
 
-        describe("when the select all button in the corner gets deselected", function () {
-          beforeEach(function () {
-            container.find("[title='Select/Deselect All']").click();
-          });
+    describe('when the select all button in the corner gets deselected', function () {
+      beforeEach(function () {
+        container.find('[title=\'Select/Deselect All\']').click();
+      });
 
-          it("deselects all the cells", function () {
-            container.find("[title='Select/Deselect All']").click();
+      it('deselects all the cells', function () {
+        container.find('[title=\'Select/Deselect All\']').click();
 
-            var selectedRanges = xCellSelectionModel.getSelectedRanges();
-            expect(selectedRanges.length).toBe(0);
-          });
-        });
+        var selectedRanges = xCellSelectionModel.getSelectedRanges();
+        expect(selectedRanges.length).toBe(0);
+      });
+    });
 
-        describe("and then the underlying selection changes", function () {
-          beforeEach(function () {
-            container.find("[title='Select/Deselect All']").click();
-          });
+    describe('and then the underlying selection changes', function () {
+      beforeEach(function () {
+        container.find('[title=\'Select/Deselect All\']').click();
+      });
 
-          it("removes the selected class", function () {
-            container.find("[title='Select/Deselect All']").parent().click();
+      it('removes the selected class', function () {
+        container.find('[title=\'Select/Deselect All\']').parent().click();
 
-            expect($(container.find("[data-id='select-all']")).hasClass('selected')).toBeFalsy();
-          });
-        });
+        expect($(container.find('[data-id=\'select-all\']')).hasClass('selected')).toBeFalsy();
       });
     });
   });
+});
diff --git a/web/regression/javascript/selection/range_boundary_navigator_spec.js b/web/regression/javascript/selection/range_boundary_navigator_spec.js
index b1ca45eb..b57087f3 100644
--- a/web/regression/javascript/selection/range_boundary_navigator_spec.js
+++ b/web/regression/javascript/selection/range_boundary_navigator_spec.js
@@ -1,8 +1,20 @@
-define(['sources/selection/range_boundary_navigator'], function (rangeBoundaryNavigator) {
-
-  describe("#getUnion", function () {
-    describe("when the ranges completely overlap", function () {
-      it("returns a list with that range", function () {
+//////////////////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2017, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////////////////
+
+import rangeBoundaryNavigator from 'sources/selection/range_boundary_navigator';
+import Slick from 'slickgrid';
+
+describe('RangeBoundaryNavigator', function () {
+
+  describe('#getUnion', function () {
+    describe('when the ranges completely overlap', function () {
+      it('returns a list with that range', function () {
         var ranges = [[1, 4], [1, 4], [1, 4]];
 
         var union = rangeBoundaryNavigator.getUnion(ranges);
diff --git a/web/regression/javascript/selection/range_selection_helper_spec.js b/web/regression/javascript/selection/range_selection_helper_spec.js
index cc81189b..63c07259 100644
--- a/web/regression/javascript/selection/range_selection_helper_spec.js
+++ b/web/regression/javascript/selection/range_selection_helper_spec.js
@@ -1,70 +1,82 @@
-define([
-  'jquery',
-  'slickgrid/slick.grid',
-  'sources/selection/range_selection_helper'
-], function ($, SlickGrid, RangeSelectionHelper) {
-  describe("RangeSelectionHelper utility functions", function () {
-    var grid;
-    beforeEach(function () {
-      var container, data, columns, options;
-      container = $("<div></div>");
-      container.height(9999);
+import $ from 'jquery';
+import Slick from 'slickgrid';
+import 'slickgrid.grid';
+import RangeSelectionHelper from 'sources/selection/range_selection_helper';
 
-      columns = [{
-        id: '1',
-        name: 'some-column-name',
-        pos: 0
-      }, {
-        id: 'second-column-id',
-        name: 'second column',
-        pos: 1
-      }];
+describe("RangeSelectionHelper utility functions", function () {
+  var grid;
+  beforeEach(function () {
+    var container, data, columns, options;
+    container = $("<div></div>");
+    container.height(9999);
 
-      data = [];
-      for (var i = 0; i < 10; i++) {
-        data.push({'some-column-name': 'some-value-' + i, 'second column': 'second value ' + i});
-      }
+    columns = [{
+      id: '1',
+      name: 'some-column-name',
+      pos: 0
+    }, {
+      id: 'second-column-id',
+      name: 'second column',
+      pos: 1
+    }];
 
-      grid = new SlickGrid(container, data, columns, options);
-      grid.invalidate();
-    });
+    data = [];
+    for (var i = 0; i < 10; i++) {
+      data.push({'some-column-name': 'some-value-' + i, 'second column': 'second value ' + i});
+    }
+
+    grid = new Slick.Grid(container, data, columns, options);
+    grid.invalidate();
+  });
 
-    describe("#getIndexesOfCompleteRows", function () {
-      describe("when selected ranges are not rows", function () {
-        it("returns an empty array", function () {
-          var rowlessRanges = [RangeSelectionHelper.rangeForColumn(grid, 1)];
+  describe("#getIndexesOfCompleteRows", function () {
+    describe("when selected ranges are not rows", function () {
+      it("returns an empty array", function () {
+        var rowlessRanges = [RangeSelectionHelper.rangeForColumn(grid, 1)];
 
-          expect(RangeSelectionHelper.getIndexesOfCompleteRows(grid, rowlessRanges))
-            .toEqual([]);
+        expect(RangeSelectionHelper.getIndexesOfCompleteRows(grid, rowlessRanges))
+          .toEqual([]);
+      });
+    });
+    describe("when selected range", function () {
+      describe("is a single row", function () {
+        it("returns an array with one index", function () {
+          var singleRowRange = [RangeSelectionHelper.rangeForRow(grid, 1)];
+
+          expect(RangeSelectionHelper.getIndexesOfCompleteRows(grid, singleRowRange))
+            .toEqual([1]);
         });
       });
-      describe("when selected range", function () {
-        describe("is a single row", function () {
-          it("returns an array with one index", function () {
-            var singleRowRange = [RangeSelectionHelper.rangeForRow(grid, 1)];
 
-            expect(RangeSelectionHelper.getIndexesOfCompleteRows(grid, singleRowRange))
-              .toEqual([1]);
-          });
+      describe("is multiple rows", function () {
+        it("returns an array of each row's index", function () {
+          var multipleRowRange = [
+            RangeSelectionHelper.rangeForRow(grid, 0),
+            RangeSelectionHelper.rangeForRow(grid, 3),
+            RangeSelectionHelper.rangeForRow(grid, 2),
+          ];
+
+          var indexesOfCompleteRows = RangeSelectionHelper.getIndexesOfCompleteRows(grid, multipleRowRange);
+          indexesOfCompleteRows.sort();
+          expect(indexesOfCompleteRows).toEqual([0, 2, 3]);
         });
+      });
 
-        describe("is multiple rows", function () {
-          it("returns an array of each row's index", function () {
-            var multipleRowRange = [
-              RangeSelectionHelper.rangeForRow(grid, 0),
-              RangeSelectionHelper.rangeForRow(grid, 3),
-              RangeSelectionHelper.rangeForRow(grid, 2),
-            ];
+      describe("contains a multi row selection", function () {
+        it("returns an array of each individual row's index", function () {
+          var multipleRowRange = [
+            new Slick.Range(3, 0, 5, 1)
+          ];
 
-            var indexesOfCompleteRows = RangeSelectionHelper.getIndexesOfCompleteRows(grid, multipleRowRange);
-            indexesOfCompleteRows.sort();
-            expect(indexesOfCompleteRows).toEqual([0, 2, 3]);
-          });
+          var indexesOfCompleteRows = RangeSelectionHelper.getIndexesOfCompleteRows(grid, multipleRowRange);
+          indexesOfCompleteRows.sort();
+          expect(indexesOfCompleteRows).toEqual([3, 4, 5]);
         });
 
-        describe("contains a multi row selection", function () {
-          it("returns an array of each individual row's index", function () {
+        describe("and also contains a selection that is not a row", function () {
+          it("returns an array of only the complete rows' indexes", function () {
             var multipleRowRange = [
+              new Slick.Range(8, 1, 9, 1),
               new Slick.Range(3, 0, 5, 1)
             ];
 
@@ -72,22 +84,8 @@ define([
             indexesOfCompleteRows.sort();
             expect(indexesOfCompleteRows).toEqual([3, 4, 5]);
           });
-
-          describe("and also contains a selection that is not a row", function () {
-            it("returns an array of only the complete rows' indexes", function () {
-              var multipleRowRange = [
-                new Slick.Range(8, 1, 9, 1),
-                new Slick.Range(3, 0, 5, 1)
-              ];
-
-              var indexesOfCompleteRows = RangeSelectionHelper.getIndexesOfCompleteRows(grid, multipleRowRange);
-              indexesOfCompleteRows.sort();
-              expect(indexesOfCompleteRows).toEqual([3, 4, 5]);
-            });
-          });
         });
       });
     });
   });
-
 });
diff --git a/web/regression/javascript/selection/row_selector_spec.js b/web/regression/javascript/selection/row_selector_spec.js
index 23a5b12e..dbf65e26 100644
--- a/web/regression/javascript/selection/row_selector_spec.js
+++ b/web/regression/javascript/selection/row_selector_spec.js
@@ -1,321 +1,327 @@
-define(
-  ["jquery",
-    "underscore",
-    "slickgrid/slick.grid",
-    "sources/selection/active_cell_capture",
-    "sources/selection/row_selector",
-    'sources/selection/xcell_selection_model',
-
-    "slickgrid",
-    'sources/slickgrid/pgslick.cellrangedecorator',
-    'sources/slickgrid/pgslick.cellrangeselector',
-  ],
-  function ($, _, SlickGrid, ActiveCellCapture, RowSelector, XCellSelectionModel, Slick) {
-    var KEY_RIGHT = 39;
-    var KEY_LEFT = 37;
-    var KEY_UP = 38;
-    var KEY_DOWN = 40;
-    describe("RowSelector", function () {
-      var container, data, columnDefinitions, grid, cellSelectionModel;
+//////////////////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2017, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////////////////
+
+import $ from 'jquery';
+import _ from 'underscore';
+
+import Slick from 'slickgrid';
+import 'slickgrid.grid';
+
+import RowSelector from 'sources/selection/row_selector';
+import ActiveCellCapture from 'sources/selection/active_cell_capture';
+import XCellSelectionModel from 'sources/selection/xcell_selection_model';
+
+describe('RowSelector', function () {
+  var KEY_RIGHT = 39;
+  var KEY_LEFT = 37;
+  var KEY_UP = 38;
+  var KEY_DOWN = 40;
+  var container, data, columnDefinitions, grid, cellSelectionModel;
+  var SlickGrid = Slick.Grid;
+
+  beforeEach(function () {
+    container = $('<div></div>');
+    container.height(9999);
+    container.width(9999);
+
+    columnDefinitions = [{
+      id: '1',
+      name: 'some-column-name',
+      selectable: true,
+      pos: 0
+    }, {
+      id: '2',
+      name: 'second column',
+      selectable: true,
+      pos: 1
+    }];
+
+    var rowSelector = new RowSelector();
+    data = [];
+    for (var i = 0; i < 10; i++) {
+      data.push(['some-value-' + i, 'second value ' + i]);
+    }
+    columnDefinitions = rowSelector.getColumnDefinitions(columnDefinitions);
+    grid = new SlickGrid(container, data, columnDefinitions);
 
-      beforeEach(function () {
-        container = $("<div></div>");
-        container.height(9999);
-        container.width(9999);
-
-        columnDefinitions = [{
-          id: '1',
-          name: 'some-column-name',
-          selectable: true,
-          pos: 0
-        }, {
-          id: '2',
-          name: 'second column',
-          selectable: true,
-          pos: 1
-        }];
-
-        var rowSelector = new RowSelector();
-        data = [];
-        for (var i = 0; i < 10; i++) {
-          data.push(['some-value-' + i, 'second value ' + i]);
-        }
-        columnDefinitions = rowSelector.getColumnDefinitions(columnDefinitions);
-        grid = new SlickGrid(container, data, columnDefinitions);
-
-        grid.registerPlugin(new ActiveCellCapture());
-        cellSelectionModel = new XCellSelectionModel();
-        grid.setSelectionModel(cellSelectionModel);
-
-        grid.registerPlugin(rowSelector);
-        grid.invalidate();
-
-        $("body").append(container);
+    grid.registerPlugin(new ActiveCellCapture());
+    cellSelectionModel = new XCellSelectionModel();
+    grid.setSelectionModel(cellSelectionModel);
+
+    grid.registerPlugin(rowSelector);
+    grid.invalidate();
+
+    $('body').append(container);
+  });
+
+  afterEach(function () {
+    $('body').find(container).remove();
+  });
+
+  it('renders an additional column on the left', function () {
+    expect(columnDefinitions.length).toBe(3);
+
+    var leftmostColumn = columnDefinitions[0];
+    expect(leftmostColumn.id).toBe('row-header-column');
+    expect(leftmostColumn.name).toBe('');
+    expect(leftmostColumn.selectable).toBe(false);
+  });
+
+  it('renders a span on the leftmost column', function () {
+    expect(container.find('.slick-row').length).toBe(10);
+    expect(container.find('.slick-row .slick-cell:first-child span[data-cell-type="row-header-selector"]').length).toBe(10);
+  });
+
+  it('preserves the other attributes of column definitions', function () {
+    expect(columnDefinitions[1].id).toBe('1');
+    expect(columnDefinitions[1].selectable).toBe(true);
+  });
+
+  describe('selecting rows', function () {
+    describe('when the user clicks a row header span', function () {
+      it('selects the row', function () {
+        container.find('.slick-row .slick-cell:first-child span[data-cell-type="row-header-selector"]')[0].click();
+
+        var selectedRanges = cellSelectionModel.getSelectedRanges();
+        expectOnlyTheFirstRowToBeSelected(selectedRanges);
       });
 
-      afterEach(function () {
-        $("body").find(container).remove();
+      it('add selected class to parent of the span', function () {
+        container.find('.slick-row .slick-cell:first-child span[data-cell-type="row-header-selector"]')[5].click();
+
+        expect($(container.find('.slick-row .slick-cell:first-child ')[5])
+          .hasClass('selected')).toBeTruthy();
       });
+    });
 
-      it("renders an additional column on the left", function () {
-        expect(columnDefinitions.length).toBe(3);
+    describe('when the user clicks a row header', function () {
+      beforeEach(function () {
+        container.find('.slick-row .slick-cell:first-child')[1].click();
 
-        var leftmostColumn = columnDefinitions[0];
-        expect(leftmostColumn.id).toBe('row-header-column');
-        expect(leftmostColumn.name).toBe('');
-        expect(leftmostColumn.selectable).toBe(false);
       });
+      it('selects the row', function () {
 
-      it("renders a span on the leftmost column", function () {
-        expect(container.find('.slick-row').length).toBe(10);
-        expect(container.find('.slick-row .slick-cell:first-child span[data-cell-type="row-header-selector"]').length).toBe(10);
+        var selectedRanges = cellSelectionModel.getSelectedRanges();
+        var row = selectedRanges[0];
+
+        expect(selectedRanges.length).toEqual(1);
+        expect(row.fromCell).toBe(1);
+        expect(row.toCell).toBe(2);
+        expect(row.fromRow).toBe(1);
+        expect(row.toRow).toBe(1);
       });
 
-      it("preserves the other attributes of column definitions", function () {
-        expect(columnDefinitions[1].id).toBe('1');
-        expect(columnDefinitions[1].selectable).toBe(true);
+      it('add selected class to parent of the span', function () {
+
+        expect($(container.find('.slick-row .slick-cell:first-child ')[1])
+          .hasClass('selected')).toBeTruthy();
       });
 
-      describe("selecting rows", function () {
-        describe("when the user clicks a row header span", function () {
-          it("selects the row", function () {
-            container.find('.slick-row .slick-cell:first-child span[data-cell-type="row-header-selector"]')[0].click();
+      describe('when the user clicks again the same row header', function () {
+        it('add selected class to parent of the span', function () {
+          container.find('.slick-row .slick-cell:first-child span[data-cell-type="row-header-selector"]')[1].click();
 
-            var selectedRanges = cellSelectionModel.getSelectedRanges();
-            expectOnlyTheFirstRowToBeSelected(selectedRanges);
-          });
+          expect($(container.find('.slick-row .slick-cell:first-child ')[1])
+            .hasClass('selected')).toBeFalsy();
+        });
+      });
 
-          it("add selected class to parent of the span", function () {
-            container.find('.slick-row .slick-cell:first-child span[data-cell-type="row-header-selector"]')[5].click();
+      describe('and presses shift + down-arrow', function () {
+        beforeEach(function () {
+          pressShiftArrow(KEY_DOWN);
+        });
 
-            expect($(container.find('.slick-row .slick-cell:first-child ')[5])
-              .hasClass('selected')).toBeTruthy();
-          });
+        it('keeps the last row selected', function () {
+          expect(cellSelectionModel.getSelectedRanges().length).toBe(1);
         });
 
-        describe("when the user clicks a row header", function () {
-          beforeEach(function () {
-            container.find('.slick-row .slick-cell:first-child')[1].click();
+        it('grows the selection down', function () {
+          var selectedRanges = cellSelectionModel.getSelectedRanges();
 
-          });
-          it("selects the row", function () {
+          var row = selectedRanges[0];
 
-            var selectedRanges = cellSelectionModel.getSelectedRanges();
-            var row = selectedRanges[0];
+          expect(selectedRanges.length).toEqual(1);
+          expect(row.fromCell).toBe(1);
+          expect(row.toCell).toBe(2);
+          expect(row.fromRow).toBe(1);
+          expect(row.toRow).toBe(2);
+        });
 
-            expect(selectedRanges.length).toEqual(1);
-            expect(row.fromCell).toBe(1);
-            expect(row.toCell).toBe(2);
-            expect(row.fromRow).toBe(1);
-            expect(row.toRow).toBe(1);
-          });
+        it('keeps selected class on rows 1 and 2', function () {
+          expect($(container.find('.slick-row .slick-cell:first-child ')[0])
+            .hasClass('selected')).toBeFalsy();
+          expect($(container.find('.slick-row .slick-cell:first-child ')[1])
+            .hasClass('selected')).toBeTruthy();
+          expect($(container.find('.slick-row .slick-cell:first-child ')[2])
+            .hasClass('selected')).toBeTruthy();
+          expect($(container.find('.slick-row .slick-cell:first-child ')[3])
+            .hasClass('selected')).toBeFalsy();
+        });
+      });
 
-          it("add selected class to parent of the span", function () {
-
-            expect($(container.find('.slick-row .slick-cell:first-child ')[1])
-              .hasClass('selected')).toBeTruthy();
-          });
-
-          describe("when the user clicks again the same row header", function () {
-            it("add selected class to parent of the span", function () {
-              container.find('.slick-row .slick-cell:first-child span[data-cell-type="row-header-selector"]')[1].click();
-
-              expect($(container.find('.slick-row .slick-cell:first-child ')[1])
-                .hasClass('selected')).toBeFalsy();
-            });
-          });
-
-          describe("and presses shift + down-arrow", function () {
-            beforeEach(function () {
-              pressShiftArrow(KEY_DOWN);
-            });
-
-            it("keeps the last row selected", function () {
-              expect(cellSelectionModel.getSelectedRanges().length).toBe(1);
-            });
-
-            it("grows the selection down", function () {
-              var selectedRanges = cellSelectionModel.getSelectedRanges();
-
-              var row = selectedRanges[0];
-
-              expect(selectedRanges.length).toEqual(1);
-              expect(row.fromCell).toBe(1);
-              expect(row.toCell).toBe(2);
-              expect(row.fromRow).toBe(1);
-              expect(row.toRow).toBe(2);
-            });
-
-            it("keeps selected class on rows 1 and 2", function () {
-              expect($(container.find('.slick-row .slick-cell:first-child ')[0])
-                .hasClass('selected')).toBeFalsy();
-              expect($(container.find('.slick-row .slick-cell:first-child ')[1])
-                .hasClass('selected')).toBeTruthy();
-              expect($(container.find('.slick-row .slick-cell:first-child ')[2])
-                .hasClass('selected')).toBeTruthy();
-              expect($(container.find('.slick-row .slick-cell:first-child ')[3])
-                .hasClass('selected')).toBeFalsy();
-            });
-          });
-
-          describe('when the user clicks a cell on the current range', function () {
-            beforeEach(function () {
-              container.find('.slick-cell.l1.r1')[5].click();
-            });
-
-            it('row gets deselected', function () {
-
-              var selectedRanges = cellSelectionModel.getSelectedRanges();
-
-              expect(selectedRanges.length).toBe(1);
-
-              var newSelection = selectedRanges[0];
-
-              expect(newSelection.fromCell).toBe(1);
-              expect(newSelection.fromRow).toBe(5);
-              expect(newSelection.toCell).toBe(1);
-              expect(newSelection.toRow).toBe(5);
-            });
-
-            it('keep select class on row header', function () {
-              expect($(container.find('.slick-cell.l0.r0')[5]).hasClass('selected'))
-                .toBeTruthy();
-            });
-          });
-
-          describe('when the user clicks a cell outside the current range', function () {
-            beforeEach(function () {
-              container.find('.slick-cell.l2.r2')[2].click();
-            });
-
-            it('row gets deselected', function () {
-
-              var selectedRanges = cellSelectionModel.getSelectedRanges();
-
-              expect(selectedRanges.length).toBe(1);
-
-              var newSelection = selectedRanges[0];
-
-              expect(newSelection.fromCell).toBe(2);
-              expect(newSelection.fromRow).toBe(2);
-              expect(newSelection.toCell).toBe(2);
-              expect(newSelection.toRow).toBe(2);
-            });
-
-            it('remove select class on "some-column-name" column header', function () {
-              expect($(container.find('.slick-cell.l0.r0')[5]).hasClass('selected'))
-                .toBeFalsy();
-              expect($(container.find('.slick-cell.l0.r0')[2]).hasClass('selected'))
-                .toBeTruthy();
-            });
-          });
-
-          describe('when the user has a column selected', function () {
-            beforeEach(function () {
-              var selectedRanges = [new Slick.Range(0, 1, 9, 1)];
-              cellSelectionModel.setSelectedRanges(selectedRanges);
-            });
-
-            it('no row should have the class "selected"', function () {
-              expect($(container.find('.slick-cell.l0.r0')[0]).hasClass('selected'))
-                .toBeFalsy();
-              expect($(container.find('.slick-cell.l0.r0')[1]).hasClass('selected'))
-                .toBeFalsy();
-              expect($(container.find('.slick-cell.l0.r0')[2]).hasClass('selected'))
-                .toBeFalsy();
-              expect($(container.find('.slick-cell.l0.r0')[3]).hasClass('selected'))
-                .toBeFalsy();
-              expect($(container.find('.slick-cell.l0.r0')[4]).hasClass('selected'))
-                .toBeFalsy();
-              expect($(container.find('.slick-cell.l0.r0')[5]).hasClass('selected'))
-                .toBeFalsy();
-            });
-          });
+      describe('when the user clicks a cell on the current range', function () {
+        beforeEach(function () {
+          container.find('.slick-cell.l1.r1')[5].click();
         });
 
-        describe("when the user clicks multiple row headers", function () {
-          it("selects another row", function () {
-            container.find('.slick-row .slick-cell:first-child')[4].click();
-            container.find('.slick-row .slick-cell:first-child')[0].click();
+        it('row gets deselected', function () {
+
+          var selectedRanges = cellSelectionModel.getSelectedRanges();
 
-            var selectedRanges = cellSelectionModel.getSelectedRanges();
-            expect(selectedRanges.length).toEqual(2);
+          expect(selectedRanges.length).toBe(1);
 
-            var row1 = selectedRanges[0];
-            expect(row1.fromRow).toBe(4);
-            expect(row1.toRow).toBe(4);
+          var newSelection = selectedRanges[0];
+
+          expect(newSelection.fromCell).toBe(1);
+          expect(newSelection.fromRow).toBe(5);
+          expect(newSelection.toCell).toBe(1);
+          expect(newSelection.toRow).toBe(5);
+        });
+
+        it('keep select class on row header', function () {
+          expect($(container.find('.slick-cell.l0.r0')[5]).hasClass('selected'))
+            .toBeTruthy();
+        });
+      });
 
-            var row2 = selectedRanges[1];
-            expect(row2.fromRow).toBe(0);
-            expect(row2.toRow).toBe(0);
-          });
+      describe('when the user clicks a cell outside the current range', function () {
+        beforeEach(function () {
+          container.find('.slick-cell.l2.r2')[2].click();
         });
 
-        describe("when a column was already selected", function () {
-          beforeEach(function () {
-            var selectedRanges = [new Slick.Range(0, 0, 0, 1)];
-            cellSelectionModel.setSelectedRanges(selectedRanges);
-          });
+        it('row gets deselected', function () {
 
-          it("deselects the column", function () {
-            container.find('.slick-row .slick-cell:first-child')[0].click();
-            var selectedRanges = cellSelectionModel.getSelectedRanges();
+          var selectedRanges = cellSelectionModel.getSelectedRanges();
 
-            expectOnlyTheFirstRowToBeSelected(selectedRanges);
-          });
+          expect(selectedRanges.length).toBe(1);
+
+          var newSelection = selectedRanges[0];
+
+          expect(newSelection.fromCell).toBe(2);
+          expect(newSelection.fromRow).toBe(2);
+          expect(newSelection.toCell).toBe(2);
+          expect(newSelection.toRow).toBe(2);
         });
 
-        describe("when the row is deselected through setSelectedRanges", function () {
-          beforeEach(function () {
-            container.find('.slick-row .slick-cell:first-child')[4].click();
-          });
+        it('remove select class on "some-column-name" column header', function () {
+          expect($(container.find('.slick-cell.l0.r0')[5]).hasClass('selected'))
+            .toBeFalsy();
+          expect($(container.find('.slick-cell.l0.r0')[2]).hasClass('selected'))
+            .toBeTruthy();
+        });
+      });
 
-          it("should remove the selected class", function () {
-            cellSelectionModel.setSelectedRanges([]);
+      describe('when the user has a column selected', function () {
+        beforeEach(function () {
+          var selectedRanges = [new Slick.Range(0, 1, 9, 1)];
+          cellSelectionModel.setSelectedRanges(selectedRanges);
+        });
 
-            expect($(container.find('.slick-row .slick-cell:first-child span[data-cell-type="row-header-selector"]')[4])
-              .hasClass('selected')).toBeFalsy();
-          });
+        it('no row should have the class "selected"', function () {
+          expect($(container.find('.slick-cell.l0.r0')[0]).hasClass('selected'))
+            .toBeFalsy();
+          expect($(container.find('.slick-cell.l0.r0')[1]).hasClass('selected'))
+            .toBeFalsy();
+          expect($(container.find('.slick-cell.l0.r0')[2]).hasClass('selected'))
+            .toBeFalsy();
+          expect($(container.find('.slick-cell.l0.r0')[3]).hasClass('selected'))
+            .toBeFalsy();
+          expect($(container.find('.slick-cell.l0.r0')[4]).hasClass('selected'))
+            .toBeFalsy();
+          expect($(container.find('.slick-cell.l0.r0')[5]).hasClass('selected'))
+            .toBeFalsy();
         });
+      });
+    });
 
-        describe("click a second time", function () {
-          beforeEach(function () {
-            container.find('.slick-row .slick-cell:first-child')[1].click();
-          });
+    describe('when the user clicks multiple row headers', function () {
+      it('selects another row', function () {
+        container.find('.slick-row .slick-cell:first-child')[4].click();
+        container.find('.slick-row .slick-cell:first-child')[0].click();
 
-          it("removes the selected class", function () {
-            container.find('.slick-row .slick-cell:first-child')[1].click();
-            expect($(container.find('.slick-row .slick-cell:first-child span[data-cell-type="row-header-selector"]')[1])
-              .hasClass('selected')).toBeFalsy();
-          });
+        var selectedRanges = cellSelectionModel.getSelectedRanges();
+        expect(selectedRanges.length).toEqual(2);
 
-          it("unselects the row", function () {
-            container.find('.slick-row .slick-cell:first-child')[1].click();
-            var selectedRanges = cellSelectionModel.getSelectedRanges();
+        var row1 = selectedRanges[0];
+        expect(row1.fromRow).toBe(4);
+        expect(row1.toRow).toBe(4);
 
-            expect(selectedRanges.length).toEqual(0);
-          })
-        });
+        var row2 = selectedRanges[1];
+        expect(row2.fromRow).toBe(0);
+        expect(row2.toRow).toBe(0);
       });
+    });
 
-      function pressShiftArrow(keyCode) {
-        var pressEvent = new $.Event("keydown");
-        pressEvent.shiftKey = true;
-        pressEvent.ctrlKey = false;
-        pressEvent.altKey = false;
-        pressEvent.which = keyCode;
+    describe('when a column was already selected', function () {
+      beforeEach(function () {
+        var selectedRanges = [new Slick.Range(0, 0, 0, 1)];
+        cellSelectionModel.setSelectedRanges(selectedRanges);
+      });
 
-        $(container.find('.grid-canvas')).trigger(pressEvent);
-      }
+      it('deselects the column', function () {
+        container.find('.slick-row .slick-cell:first-child')[0].click();
+        var selectedRanges = cellSelectionModel.getSelectedRanges();
+
+        expectOnlyTheFirstRowToBeSelected(selectedRanges);
+      });
     });
 
-    function expectOnlyTheFirstRowToBeSelected(selectedRanges) {
-      var row = selectedRanges[0];
+    describe('when the row is deselected through setSelectedRanges', function () {
+      beforeEach(function () {
+        container.find('.slick-row .slick-cell:first-child')[4].click();
+      });
 
-      expect(selectedRanges.length).toEqual(1);
-      expect(row.fromCell).toBe(1);
-      expect(row.toCell).toBe(2);
-      expect(row.fromRow).toBe(0);
-      expect(row.toRow).toBe(0);
-    }
-  });
\ No newline at end of file
+      it('should remove the selected class', function () {
+        cellSelectionModel.setSelectedRanges([]);
+
+        expect($(container.find('.slick-row .slick-cell:first-child span[data-cell-type="row-header-selector"]')[4])
+          .hasClass('selected')).toBeFalsy();
+      });
+    });
+
+    describe('click a second time', function () {
+      beforeEach(function () {
+        container.find('.slick-row .slick-cell:first-child')[1].click();
+      });
+
+      it('removes the selected class', function () {
+        container.find('.slick-row .slick-cell:first-child')[1].click();
+        expect($(container.find('.slick-row .slick-cell:first-child span[data-cell-type="row-header-selector"]')[1])
+          .hasClass('selected')).toBeFalsy();
+      });
+
+      it('unselects the row', function () {
+        container.find('.slick-row .slick-cell:first-child')[1].click();
+        var selectedRanges = cellSelectionModel.getSelectedRanges();
+
+        expect(selectedRanges.length).toEqual(0);
+      })
+    });
+  });
+
+  function pressShiftArrow(keyCode) {
+    var pressEvent = new $.Event('keydown');
+    pressEvent.shiftKey = true;
+    pressEvent.ctrlKey = false;
+    pressEvent.altKey = false;
+    pressEvent.which = keyCode;
+
+    $(container.find('.grid-canvas')).trigger(pressEvent);
+  }
+
+  function expectOnlyTheFirstRowToBeSelected(selectedRanges) {
+    var row = selectedRanges[0];
+
+    expect(selectedRanges.length).toEqual(1);
+    expect(row.fromCell).toBe(1);
+    expect(row.toCell).toBe(2);
+    expect(row.fromRow).toBe(0);
+    expect(row.toRow).toBe(0);
+  }
+});
diff --git a/web/regression/javascript/selection/xcell_selection_model_spec.js b/web/regression/javascript/selection/xcell_selection_model_spec.js
index 1682c244..8f01035c 100644
--- a/web/regression/javascript/selection/xcell_selection_model_spec.js
+++ b/web/regression/javascript/selection/xcell_selection_model_spec.js
@@ -7,507 +7,505 @@
 //
 //////////////////////////////////////////////////////////////////////////
 
-define([
-  'sources/selection/xcell_selection_model',
-  "slickgrid/slick.grid",
-  'slickgrid',
-], function (XCellSelectionModel, SlickGrid, Slick) {
-  describe('XCellSelectionModel', function () {
-    var KEY_RIGHT = 39;
-    var KEY_LEFT = 37;
-    var KEY_UP = 38;
-    var KEY_DOWN = 40;
-
-    var container, grid;
-    var oldWindowParent = window.parent;
+import XCellSelectionModel from 'sources/selection/xcell_selection_model';
+import 'slickgrid.grid';
+import Slick from 'slickgrid';
+
+describe('XCellSelectionModel', function () {
+  var KEY_RIGHT = 39;
+  var KEY_LEFT = 37;
+  var KEY_UP = 38;
+  var KEY_DOWN = 40;
+
+  var container, grid;
+  var SlickGrid = Slick.Grid;
+  var oldWindowParent = window.parent;
+
+  beforeEach(function () {
+    window.parent = window;
+
+    var columns = [{
+      id: 'row-header-column',
+      name: 'row header column name',
+      selectable: false,
+    }, {
+      id: '1',
+      name: 'some-column-name',
+      pos: 0
+    }, {
+      id: 'second-column-id',
+      name: 'second column',
+      pos: 1
+    }, {
+      id: 'third-column-id',
+      name: 'third column',
+      pos: 2
+    },
+    ];
+
+    var data = [];
+    for (var i = 0; i < 10; i++) {
+      data.push({
+        'some-column-name': 'some-value-' + i,
+        'second column': 'second value ' + i,
+        'third column': 'third value ' + i,
+        'fourth column': 'fourth value ' + i,
+      });
+    }
+    container = $("<div></div>");
+    container.height(9999);
+    container.width(9999);
 
-    beforeEach(function () {
-      window.parent = window;
-
-      var columns = [{
-        id: 'row-header-column',
-        name: 'row header column name',
-        selectable: false,
-      }, {
-        id: '1',
-        name: 'some-column-name',
-        pos: 0
-      }, {
-        id: 'second-column-id',
-        name: 'second column',
-        pos: 1
-      }, {
-        id: 'third-column-id',
-        name: 'third column',
-        pos: 2
-      },
-      ];
-
-      var data = [];
-      for (var i = 0; i < 10; i++) {
-        data.push({
-          'some-column-name': 'some-value-' + i,
-          'second column': 'second value ' + i,
-          'third column': 'third value ' + i,
-          'fourth column': 'fourth value ' + i,
-        });
-      }
-      container = $("<div></div>");
-      container.height(9999);
-      container.width(9999);
-
-      grid = new SlickGrid(container, data, columns);
-      grid.setSelectionModel(new XCellSelectionModel());
-      $("body").append(container);
-    });
+    grid = new SlickGrid(container, data, columns);
+    grid.setSelectionModel(new XCellSelectionModel());
+    $("body").append(container);
+  });
 
-    afterEach(function () {
-      grid.destroy();
-      container.remove();
-      window.parent = oldWindowParent;
-    });
+  afterEach(function () {
+    grid.destroy();
+    container.remove();
+    window.parent = oldWindowParent;
+  });
 
-    describe('handleKeyDown', function () {
-      describe('when we press a random key', function () {
-        it('should not change the range', function () {
-          var range = new Slick.Range(1, 2);
-          grid.setActiveCell(1, 2);
-          grid.getSelectionModel().setSelectedRanges([range]);
-          pressKey(72);
+  describe('handleKeyDown', function () {
+    describe('when we press a random key', function () {
+      it('should not change the range', function () {
+        var range = new Slick.Range(1, 2);
+        grid.setActiveCell(1, 2);
+        grid.getSelectionModel().setSelectedRanges([range]);
+        pressKey(72);
 
-          expect(grid.getSelectionModel().getSelectedRanges()[0]).toEqual(range);
-        });
+        expect(grid.getSelectionModel().getSelectedRanges()[0]).toEqual(range);
       });
+    });
 
-      describe('when we press an arrow key ', function () {
-        it('should select the cell to the right', function () {
-          var range = new Slick.Range(1, 2);
-          grid.setActiveCell(1, 2);
-          grid.getSelectionModel().setSelectedRanges([range]);
-          pressKey(KEY_RIGHT);
+    describe('when we press an arrow key ', function () {
+      it('should select the cell to the right', function () {
+        var range = new Slick.Range(1, 2);
+        grid.setActiveCell(1, 2);
+        grid.getSelectionModel().setSelectedRanges([range]);
+        pressKey(KEY_RIGHT);
 
-          expectOneSelectedRange(1, 3, 1, 3);
-        });
+        expectOneSelectedRange(1, 3, 1, 3);
       });
+    });
 
-      describe('when we press shift', function () {
-        describe('and we press an arrow key', function () {
-          var scrollColumnIntoViewSpy, scrollRowIntoViewSpy;
+    describe('when we press shift', function () {
+      describe('and we press an arrow key', function () {
+        var scrollColumnIntoViewSpy, scrollRowIntoViewSpy;
 
-          beforeEach(function () {
-            scrollColumnIntoViewSpy = spyOn(grid, 'scrollColumnIntoView');
-            scrollRowIntoViewSpy = spyOn(grid, 'scrollRowIntoView');
-          });
+        beforeEach(function () {
+          scrollColumnIntoViewSpy = spyOn(grid, 'scrollColumnIntoView');
+          scrollRowIntoViewSpy = spyOn(grid, 'scrollRowIntoView');
+        });
 
-          describe('the right arrow', function () {
-            describe('when a cell is selected', function () {
-              beforeEach(function () {
-                var range = new Slick.Range(1, 1);
-                grid.setActiveCell(1, 1);
-                grid.getSelectionModel().setSelectedRanges([range]);
-                pressShiftPlusKey(KEY_RIGHT);
-              });
+        describe('the right arrow', function () {
+          describe('when a cell is selected', function () {
+            beforeEach(function () {
+              var range = new Slick.Range(1, 1);
+              grid.setActiveCell(1, 1);
+              grid.getSelectionModel().setSelectedRanges([range]);
+              pressShiftPlusKey(KEY_RIGHT);
+            });
 
-              it('increases the range by one to the right', function () {
-                expectOneSelectedRange(1, 1, 1, 2);
-              });
+            it('increases the range by one to the right', function () {
+              expectOneSelectedRange(1, 1, 1, 2);
+            });
 
-              it('should scroll the next column into view', function () {
-                expect(scrollColumnIntoViewSpy).toHaveBeenCalledWith(2);
-                expect(scrollRowIntoViewSpy).not.toHaveBeenCalled();
-              });
+            it('should scroll the next column into view', function () {
+              expect(scrollColumnIntoViewSpy).toHaveBeenCalledWith(2);
+              expect(scrollRowIntoViewSpy).not.toHaveBeenCalled();
+            });
 
-              it('pressing right again grows the range right', function () {
-                pressShiftPlusKey(KEY_RIGHT);
+            it('pressing right again grows the range right', function () {
+              pressShiftPlusKey(KEY_RIGHT);
 
-                expectOneSelectedRange(1, 1, 1, 3);
-              });
+              expectOneSelectedRange(1, 1, 1, 3);
+            });
 
-              it('then pressing left keeps the original selection', function () {
-                pressShiftPlusKey(KEY_LEFT);
+            it('then pressing left keeps the original selection', function () {
+              pressShiftPlusKey(KEY_LEFT);
 
-                expectOneSelectedRange(1, 1, 1, 1);
-              });
+              expectOneSelectedRange(1, 1, 1, 1);
             });
+          });
 
-            describe('when a column is selected', function () {
-              beforeEach(function () {
-                var range = new Slick.Range(0, 1, 9, 1);
-                grid.setActiveCell(0, 1);
-                grid.getSelectionModel().setSelectedRanges([range]);
-                pressShiftPlusKey(KEY_RIGHT);
-              });
+          describe('when a column is selected', function () {
+            beforeEach(function () {
+              var range = new Slick.Range(0, 1, 9, 1);
+              grid.setActiveCell(0, 1);
+              grid.getSelectionModel().setSelectedRanges([range]);
+              pressShiftPlusKey(KEY_RIGHT);
+            });
 
-              it('increases the range by one column to the right', function () {
-                expectOneSelectedRange(0, 1, 9, 2);
-              });
+            it('increases the range by one column to the right', function () {
+              expectOneSelectedRange(0, 1, 9, 2);
+            });
 
-              it('should scroll the next column into view', function () {
-                expect(scrollColumnIntoViewSpy).toHaveBeenCalledWith(2);
-                expect(scrollRowIntoViewSpy).not.toHaveBeenCalled();
-              });
+            it('should scroll the next column into view', function () {
+              expect(scrollColumnIntoViewSpy).toHaveBeenCalledWith(2);
+              expect(scrollRowIntoViewSpy).not.toHaveBeenCalled();
             });
           });
+        });
 
-          describe('the left arrow', function () {
-            describe('when a cell is selected', function () {
-              beforeEach(function () {
-                var range = new Slick.Range(1, 3);
-                grid.setActiveCell(1, 3);
-                grid.getSelectionModel().setSelectedRanges([range]);
-                pressShiftPlusKey(KEY_LEFT);
-              });
+        describe('the left arrow', function () {
+          describe('when a cell is selected', function () {
+            beforeEach(function () {
+              var range = new Slick.Range(1, 3);
+              grid.setActiveCell(1, 3);
+              grid.getSelectionModel().setSelectedRanges([range]);
+              pressShiftPlusKey(KEY_LEFT);
+            });
 
-              it('increases the range by one to the left', function () {
-                expectOneSelectedRange(1, 2, 1, 3);
-              });
+            it('increases the range by one to the left', function () {
+              expectOneSelectedRange(1, 2, 1, 3);
+            });
 
-              it('should scroll previous column into view', function () {
-                expect(scrollColumnIntoViewSpy).toHaveBeenCalledWith(2);
-                expect(scrollRowIntoViewSpy).not.toHaveBeenCalled();
-              });
+            it('should scroll previous column into view', function () {
+              expect(scrollColumnIntoViewSpy).toHaveBeenCalledWith(2);
+              expect(scrollRowIntoViewSpy).not.toHaveBeenCalled();
+            });
 
-              it('pressing left again grows the range the left', function () {
-                pressShiftPlusKey(KEY_LEFT);
+            it('pressing left again grows the range the left', function () {
+              pressShiftPlusKey(KEY_LEFT);
 
-                expectOneSelectedRange(1, 1, 1, 3);
-              });
+              expectOneSelectedRange(1, 1, 1, 3);
+            });
 
-              it('then pressing right keeps the original selection', function () {
-                pressShiftPlusKey(KEY_RIGHT);
+            it('then pressing right keeps the original selection', function () {
+              pressShiftPlusKey(KEY_RIGHT);
 
-                expectOneSelectedRange(1, 3, 1, 3);
-              });
+              expectOneSelectedRange(1, 3, 1, 3);
             });
+          });
 
-            describe('when a column is selected', function () {
-              beforeEach(function () {
-                var range = new Slick.Range(0, 2, 9, 2);
-                grid.setActiveCell(0, 2);
-                grid.getSelectionModel().setSelectedRanges([range]);
-                pressShiftPlusKey(KEY_LEFT);
-              });
+          describe('when a column is selected', function () {
+            beforeEach(function () {
+              var range = new Slick.Range(0, 2, 9, 2);
+              grid.setActiveCell(0, 2);
+              grid.getSelectionModel().setSelectedRanges([range]);
+              pressShiftPlusKey(KEY_LEFT);
+            });
 
-              it('increases the range by one column to the left', function () {
-                expectOneSelectedRange(0, 1, 9, 2);
-              });
+            it('increases the range by one column to the left', function () {
+              expectOneSelectedRange(0, 1, 9, 2);
+            });
 
-              it('should scroll previous column into view', function () {
-                expect(scrollColumnIntoViewSpy).toHaveBeenCalledWith(1);
-                expect(scrollRowIntoViewSpy).not.toHaveBeenCalled();
-              });
+            it('should scroll previous column into view', function () {
+              expect(scrollColumnIntoViewSpy).toHaveBeenCalledWith(1);
+              expect(scrollRowIntoViewSpy).not.toHaveBeenCalled();
             });
           });
+        });
 
-          describe('the up arrow', function () {
-            describe('when a cell is selected', function () {
-              beforeEach(function () {
-                var range = new Slick.Range(2, 2);
-                grid.setActiveCell(2, 2);
-                grid.getSelectionModel().setSelectedRanges([range]);
-                pressShiftPlusKey(KEY_UP);
-              });
+        describe('the up arrow', function () {
+          describe('when a cell is selected', function () {
+            beforeEach(function () {
+              var range = new Slick.Range(2, 2);
+              grid.setActiveCell(2, 2);
+              grid.getSelectionModel().setSelectedRanges([range]);
+              pressShiftPlusKey(KEY_UP);
+            });
 
-              it('increases the range by one up', function () {
-                expectOneSelectedRange(1, 2, 2, 2);
-              });
+            it('increases the range by one up', function () {
+              expectOneSelectedRange(1, 2, 2, 2);
+            });
 
-              it('should scroll the row above into view', function () {
-                expect(scrollRowIntoViewSpy).toHaveBeenCalledWith(1);
-                expect(scrollColumnIntoViewSpy).not.toHaveBeenCalled();
-              });
+            it('should scroll the row above into view', function () {
+              expect(scrollRowIntoViewSpy).toHaveBeenCalledWith(1);
+              expect(scrollColumnIntoViewSpy).not.toHaveBeenCalled();
+            });
 
-              it('pressing up again grows the range up', function () {
-                pressShiftPlusKey(KEY_UP);
+            it('pressing up again grows the range up', function () {
+              pressShiftPlusKey(KEY_UP);
 
-                expectOneSelectedRange(0, 2, 2, 2);
-              });
+              expectOneSelectedRange(0, 2, 2, 2);
+            });
 
-              it('then pressing down keeps the original selection', function () {
-                pressShiftPlusKey(KEY_DOWN);
+            it('then pressing down keeps the original selection', function () {
+              pressShiftPlusKey(KEY_DOWN);
 
-                expectOneSelectedRange(2, 2, 2, 2);
-              });
+              expectOneSelectedRange(2, 2, 2, 2);
             });
+          });
 
-            describe('when a row is selected', function () {
-              beforeEach(function () {
-                var range = new Slick.Range(2, 1, 2, 3);
-                grid.setActiveCell(2, 1);
-                grid.getSelectionModel().setSelectedRanges([range]);
-                pressShiftPlusKey(KEY_UP);
-              });
+          describe('when a row is selected', function () {
+            beforeEach(function () {
+              var range = new Slick.Range(2, 1, 2, 3);
+              grid.setActiveCell(2, 1);
+              grid.getSelectionModel().setSelectedRanges([range]);
+              pressShiftPlusKey(KEY_UP);
+            });
 
-              it('increases the range by one row up', function () {
-                expectOneSelectedRange(1, 1, 2, 3);
-              });
+            it('increases the range by one row up', function () {
+              expectOneSelectedRange(1, 1, 2, 3);
+            });
 
-              it('should scroll the row above into view', function () {
-                expect(scrollRowIntoViewSpy).toHaveBeenCalledWith(1);
-                expect(scrollColumnIntoViewSpy).not.toHaveBeenCalled();
-              });
+            it('should scroll the row above into view', function () {
+              expect(scrollRowIntoViewSpy).toHaveBeenCalledWith(1);
+              expect(scrollColumnIntoViewSpy).not.toHaveBeenCalled();
             });
           });
+        });
 
-          describe('the down arrow', function () {
-            describe('when a cell is selected', function () {
-              beforeEach(function () {
-                var range = new Slick.Range(2, 2);
-                grid.setActiveCell(2, 2);
-                grid.getSelectionModel().setSelectedRanges([range]);
-                pressShiftPlusKey(KEY_DOWN);
-              });
+        describe('the down arrow', function () {
+          describe('when a cell is selected', function () {
+            beforeEach(function () {
+              var range = new Slick.Range(2, 2);
+              grid.setActiveCell(2, 2);
+              grid.getSelectionModel().setSelectedRanges([range]);
+              pressShiftPlusKey(KEY_DOWN);
+            });
 
-              it('increases the range by one down', function () {
-                expectOneSelectedRange(2, 2, 3, 2);
-              });
+            it('increases the range by one down', function () {
+              expectOneSelectedRange(2, 2, 3, 2);
+            });
 
-              it('should scroll the row below into view', function () {
-                expect(scrollRowIntoViewSpy).toHaveBeenCalledWith(3);
-                expect(scrollColumnIntoViewSpy).not.toHaveBeenCalled();
-              });
+            it('should scroll the row below into view', function () {
+              expect(scrollRowIntoViewSpy).toHaveBeenCalledWith(3);
+              expect(scrollColumnIntoViewSpy).not.toHaveBeenCalled();
+            });
 
-              it('pressing down again grows the range down', function () {
-                pressShiftPlusKey(KEY_DOWN);
+            it('pressing down again grows the range down', function () {
+              pressShiftPlusKey(KEY_DOWN);
 
-                expectOneSelectedRange(2, 2, 4, 2);
-              });
+              expectOneSelectedRange(2, 2, 4, 2);
+            });
 
-              it('then pressing up keeps the original selection', function () {
-                pressShiftPlusKey(KEY_UP);
+            it('then pressing up keeps the original selection', function () {
+              pressShiftPlusKey(KEY_UP);
 
-                expectOneSelectedRange(2, 2, 2, 2);
-              });
+              expectOneSelectedRange(2, 2, 2, 2);
             });
+          });
 
-            describe('when a row is selected', function () {
-              beforeEach(function () {
-                var range = new Slick.Range(2, 1, 2, 3);
-                grid.setActiveCell(2, 1);
-                grid.getSelectionModel().setSelectedRanges([range]);
-                pressShiftPlusKey(KEY_DOWN);
-              });
+          describe('when a row is selected', function () {
+            beforeEach(function () {
+              var range = new Slick.Range(2, 1, 2, 3);
+              grid.setActiveCell(2, 1);
+              grid.getSelectionModel().setSelectedRanges([range]);
+              pressShiftPlusKey(KEY_DOWN);
+            });
 
-              it('increases the range by one row down', function () {
-                expectOneSelectedRange(2, 1, 3, 3);
-              });
+            it('increases the range by one row down', function () {
+              expectOneSelectedRange(2, 1, 3, 3);
+            });
 
-              it('should scroll the row below into view', function () {
-                expect(scrollRowIntoViewSpy).toHaveBeenCalledWith(3);
-                expect(scrollColumnIntoViewSpy).not.toHaveBeenCalled();
-              });
+            it('should scroll the row below into view', function () {
+              expect(scrollRowIntoViewSpy).toHaveBeenCalledWith(3);
+              expect(scrollColumnIntoViewSpy).not.toHaveBeenCalled();
             });
           });
+        });
 
-          describe('rectangular selection works', function () {
+        describe('rectangular selection works', function () {
 
-            it('in the down-and-rightward direction', function () {
-              var range = new Slick.Range(1, 1);
-              grid.setActiveCell(1, 1);
-              grid.getSelectionModel().setSelectedRanges([range]);
+          it('in the down-and-rightward direction', function () {
+            var range = new Slick.Range(1, 1);
+            grid.setActiveCell(1, 1);
+            grid.getSelectionModel().setSelectedRanges([range]);
 
-              pressShiftPlusKey(KEY_DOWN);
-              pressShiftPlusKey(KEY_DOWN);
-              pressShiftPlusKey(KEY_DOWN);
-              pressShiftPlusKey(KEY_RIGHT);
-              pressShiftPlusKey(KEY_RIGHT);
+            pressShiftPlusKey(KEY_DOWN);
+            pressShiftPlusKey(KEY_DOWN);
+            pressShiftPlusKey(KEY_DOWN);
+            pressShiftPlusKey(KEY_RIGHT);
+            pressShiftPlusKey(KEY_RIGHT);
 
-              expectOneSelectedRange(1, 1, 4, 3);
-            });
+            expectOneSelectedRange(1, 1, 4, 3);
+          });
 
-            it('in the up-and-leftward direction', function () {
-              var range = new Slick.Range(4, 3);
-              grid.setActiveCell(4, 3);
-              grid.getSelectionModel().setSelectedRanges([range]);
+          it('in the up-and-leftward direction', function () {
+            var range = new Slick.Range(4, 3);
+            grid.setActiveCell(4, 3);
+            grid.getSelectionModel().setSelectedRanges([range]);
 
-              pressShiftPlusKey(KEY_UP);
-              pressShiftPlusKey(KEY_UP);
-              pressShiftPlusKey(KEY_UP);
-              pressShiftPlusKey(KEY_LEFT);
-              pressShiftPlusKey(KEY_LEFT);
+            pressShiftPlusKey(KEY_UP);
+            pressShiftPlusKey(KEY_UP);
+            pressShiftPlusKey(KEY_UP);
+            pressShiftPlusKey(KEY_LEFT);
+            pressShiftPlusKey(KEY_LEFT);
 
-              expectOneSelectedRange(1, 1, 4, 3);
-            });
+            expectOneSelectedRange(1, 1, 4, 3);
+          });
 
-            it('in the up-and-rightward direction', function () {
-              var range = new Slick.Range(4, 1);
-              grid.setActiveCell(4, 1);
-              grid.getSelectionModel().setSelectedRanges([range]);
+          it('in the up-and-rightward direction', function () {
+            var range = new Slick.Range(4, 1);
+            grid.setActiveCell(4, 1);
+            grid.getSelectionModel().setSelectedRanges([range]);
 
-              pressShiftPlusKey(KEY_UP);
-              pressShiftPlusKey(KEY_UP);
-              pressShiftPlusKey(KEY_UP);
-              pressShiftPlusKey(KEY_RIGHT);
-              pressShiftPlusKey(KEY_RIGHT);
+            pressShiftPlusKey(KEY_UP);
+            pressShiftPlusKey(KEY_UP);
+            pressShiftPlusKey(KEY_UP);
+            pressShiftPlusKey(KEY_RIGHT);
+            pressShiftPlusKey(KEY_RIGHT);
 
-              expectOneSelectedRange(1, 1, 4, 3);
-            });
+            expectOneSelectedRange(1, 1, 4, 3);
+          });
 
-            it('in the down-and-leftward direction', function () {
-              var range = new Slick.Range(1, 3);
-              grid.setActiveCell(1, 3);
-              grid.getSelectionModel().setSelectedRanges([range]);
+          it('in the down-and-leftward direction', function () {
+            var range = new Slick.Range(1, 3);
+            grid.setActiveCell(1, 3);
+            grid.getSelectionModel().setSelectedRanges([range]);
 
-              pressShiftPlusKey(KEY_DOWN);
-              pressShiftPlusKey(KEY_DOWN);
-              pressShiftPlusKey(KEY_DOWN);
-              pressShiftPlusKey(KEY_LEFT);
-              pressShiftPlusKey(KEY_LEFT);
+            pressShiftPlusKey(KEY_DOWN);
+            pressShiftPlusKey(KEY_DOWN);
+            pressShiftPlusKey(KEY_DOWN);
+            pressShiftPlusKey(KEY_LEFT);
+            pressShiftPlusKey(KEY_LEFT);
 
-              expectOneSelectedRange(1, 1, 4, 3);
-            });
+            expectOneSelectedRange(1, 1, 4, 3);
           });
+        });
 
-          describe('and we are on an edge', function () {
-            var range;
+        describe('and we are on an edge', function () {
+          var range;
 
-            beforeEach(function () {
-              range = new Slick.Range(2, 1);
-              grid.setActiveCell(2, 1);
-              grid.getSelectionModel().setSelectedRanges([range]);
-            });
+          beforeEach(function () {
+            range = new Slick.Range(2, 1);
+            grid.setActiveCell(2, 1);
+            grid.getSelectionModel().setSelectedRanges([range]);
+          });
 
-            it('we still have the selected range before we arrowed', function () {
-              pressShiftPlusKey(KEY_LEFT);
-              expectOneSelectedRange(2, 1, 2, 1);
-            });
+          it('we still have the selected range before we arrowed', function () {
+            pressShiftPlusKey(KEY_LEFT);
+            expectOneSelectedRange(2, 1, 2, 1);
           });
         });
       });
     });
+  });
 
-    describe('when we drag and drop', function () {
-      var dd;
-      // We could not find an elegant way to calculate this value
-      // after changing window size we saw this was a constant value
-      var offsetLeftColumns = 100;
+  describe('when we drag and drop', function () {
+    var dd;
+    // We could not find an elegant way to calculate this value
+    // after changing window size we saw this was a constant value
+    var offsetLeftColumns = 100;
 
-      function cellTopPosition($cell, rowNumber) {
-        return $(grid.getCanvasNode()).offset().top + $cell[0].scrollHeight * rowNumber;
-      }
+    function cellTopPosition($cell, rowNumber) {
+      return $(grid.getCanvasNode()).offset().top + $cell[0].scrollHeight * rowNumber;
+    }
+
+    function cellLeftPosition(columnNumber) {
+      return $(grid.getCanvasNode()).offset().left + offsetLeftColumns * columnNumber;
+    }
 
-      function cellLeftPosition(columnNumber) {
-        return $(grid.getCanvasNode()).offset().left + offsetLeftColumns * columnNumber;
-      }
+    beforeEach(function () {
+      var initialPosition = {cell: 3, row: 4};
+      var $cell = $($('.slick-cell.l3')[initialPosition.row]);
+      var event = {
+        target: $cell,
+        isPropagationStopped: jasmine.createSpy('isPropagationStopped').and.returnValue(false),
+        isImmediatePropagationStopped: jasmine.createSpy('isImmediatePropagationStopped').and.returnValue(false),
+        stopImmediatePropagation: jasmine.createSpy('stopImmediatePropagation')
+      };
+
+      dd = {
+        grid: grid,
+        startX: cellLeftPosition(initialPosition.cell),
+        startY: cellTopPosition($cell, initialPosition.row)
+      };
+
+      grid.onDragStart.notify(dd, event, grid);
+    });
 
+    describe('when the drop happens outside of the grid', function () {
       beforeEach(function () {
-        var initialPosition = {cell: 3, row: 4};
-        var $cell = $($('.slick-cell.l3')[initialPosition.row]);
+        var $cell = $($('.slick-cell.l1')[1]);
+        var finalPosition = {cell: 1, row: 1};
+
         var event = {
           target: $cell,
           isPropagationStopped: jasmine.createSpy('isPropagationStopped').and.returnValue(false),
           isImmediatePropagationStopped: jasmine.createSpy('isImmediatePropagationStopped').and.returnValue(false),
-          stopImmediatePropagation: jasmine.createSpy('stopImmediatePropagation')
-        };
+          stopImmediatePropagation: jasmine.createSpy('stopImmediatePropagation'),
 
-        dd = {
-          grid: grid,
-          startX: cellLeftPosition(initialPosition.cell),
-          startY: cellTopPosition($cell, initialPosition.row)
+          pageX: cellLeftPosition(finalPosition.cell),
+          pageY: cellTopPosition($cell, finalPosition.row)
         };
 
-        grid.onDragStart.notify(dd, event, grid);
+        grid.onDrag.notify(dd, event, grid);
+        $(window).mouseup();
       });
+      it('should call handleDragEnd from CellRangeSelector', function () {
+        var newRange = grid.getSelectionModel().getSelectedRanges();
 
-      describe('when the drop happens outside of the grid', function () {
-        beforeEach(function () {
-          var $cell = $($('.slick-cell.l1')[1]);
-          var finalPosition = {cell: 1, row: 1};
-
-          var event = {
-            target: $cell,
-            isPropagationStopped: jasmine.createSpy('isPropagationStopped').and.returnValue(false),
-            isImmediatePropagationStopped: jasmine.createSpy('isImmediatePropagationStopped').and.returnValue(false),
-            stopImmediatePropagation: jasmine.createSpy('stopImmediatePropagation'),
-
-            pageX: cellLeftPosition(finalPosition.cell),
-            pageY: cellTopPosition($cell, finalPosition.row)
-          };
+        expect(newRange.length).toBe(1);
 
-          grid.onDrag.notify(dd, event, grid);
-          $(window).mouseup();
-        });
-        it('should call handleDragEnd from CellRangeSelector', function () {
-          var newRange = grid.getSelectionModel().getSelectedRanges();
-
-          expect(newRange.length).toBe(1);
-
-          expect(newRange[0].fromCell).toBe(1);
-          expect(newRange[0].toCell).toBe(3);
-          expect(newRange[0].fromRow).toBe(1);
-          expect(newRange[0].toRow).toBe(4);
-        });
+        expect(newRange[0].fromCell).toBe(1);
+        expect(newRange[0].toCell).toBe(3);
+        expect(newRange[0].fromRow).toBe(1);
+        expect(newRange[0].toRow).toBe(4);
       });
     });
+  });
 
-    describe('when we mouse up and no drag and drop occured', function () {
-      beforeEach(function () {
-        grid.onDragEnd.notify = jasmine.createSpy('notify');
-        grid.onDragEnd.notify.calls.reset();
-        $(window).mouseup();
-      });
+  describe('when we mouse up and no drag and drop occured', function () {
+    beforeEach(function () {
+      grid.onDragEnd.notify = jasmine.createSpy('notify');
+      grid.onDragEnd.notify.calls.reset();
+      $(window).mouseup();
+    });
 
-      it('do not notify onDragEnd', function () {
-        expect(grid.onDragEnd.notify).not.toHaveBeenCalled()
-      });
+    it('do not notify onDragEnd', function () {
+      expect(grid.onDragEnd.notify).not.toHaveBeenCalled()
     });
+  });
+
+  describe('setSelectedRows', function () {
 
-    describe('setSelectedRows', function () {
+    beforeEach(function () {
+      grid.getSelectionModel().setSelectedRanges(
+        [new Slick.Range(1, 1, 1, 1)]
+      );
+    });
 
+    describe('when passed an empty array', function () {
       beforeEach(function () {
-        grid.getSelectionModel().setSelectedRanges(
-          [new Slick.Range(1, 1, 1, 1)]
-        );
+        grid.getSelectionModel().setSelectedRows([]);
       });
-
-      describe('when passed an empty array', function () {
-        beforeEach(function () {
-          grid.getSelectionModel().setSelectedRows([]);
-        });
-        it('clears ranges', function () {
-          var newRanges = grid.getSelectionModel().getSelectedRanges();
-          expect(newRanges.length).toEqual(0);
-        });
-      });
-
-      it('sets ranges corresponding to rows', function () {
-        grid.getSelectionModel().setSelectedRows([0, 2]);
-
-        var selectedRanges = grid.getSelectionModel().getSelectedRanges();
-
-        expect(selectedRanges.length).toBe(2);
-        expectRangeToMatch(selectedRanges[0], 0, 1, 0, 3);
-        expectRangeToMatch(selectedRanges[1], 2, 1, 2, 3);
+      it('clears ranges', function () {
+        var newRanges = grid.getSelectionModel().getSelectedRanges();
+        expect(newRanges.length).toEqual(0);
       });
     });
 
-    function pressKey(keyCode) {
-      var pressEvent = new $.Event("keydown");
-      pressEvent.which = keyCode;
-
-      $(container.find('.grid-canvas')).trigger(pressEvent);
-    }
-
-    function pressShiftPlusKey(keyCode) {
-      var pressEvent = new $.Event("keydown");
-      pressEvent.shiftKey = true;
-      pressEvent.which = keyCode;
-
-      $(container.find('.grid-canvas')).trigger(pressEvent);
-    }
+    it('sets ranges corresponding to rows', function () {
+      grid.getSelectionModel().setSelectedRows([0, 2]);
 
-    function expectOneSelectedRange(fromRow, fromCell, toRow, toCell) {
       var selectedRanges = grid.getSelectionModel().getSelectedRanges();
-      expect(selectedRanges.length).toBe(1);
-      expectRangeToMatch(selectedRanges[0], fromRow, fromCell, toRow, toCell);
-    }
 
-    function expectRangeToMatch(range, fromRow, fromCell, toRow, toCell) {
-      expect(range.fromRow).toBe(fromRow);
-      expect(range.toRow).toBe(toRow);
-      expect(range.fromCell).toBe(fromCell);
-      expect(range.toCell).toBe(toCell);
-    }
+      expect(selectedRanges.length).toBe(2);
+      expectRangeToMatch(selectedRanges[0], 0, 1, 0, 3);
+      expectRangeToMatch(selectedRanges[1], 2, 1, 2, 3);
+    });
   });
-})
-;
\ No newline at end of file
+
+  function pressKey(keyCode) {
+    var pressEvent = new $.Event("keydown");
+    pressEvent.which = keyCode;
+
+    $(container.find('.grid-canvas')).trigger(pressEvent);
+  }
+
+  function pressShiftPlusKey(keyCode) {
+    var pressEvent = new $.Event("keydown");
+    pressEvent.shiftKey = true;
+    pressEvent.which = keyCode;
+
+    $(container.find('.grid-canvas')).trigger(pressEvent);
+  }
+
+  function expectOneSelectedRange(fromRow, fromCell, toRow, toCell) {
+    var selectedRanges = grid.getSelectionModel().getSelectedRanges();
+    expect(selectedRanges.length).toBe(1);
+    expectRangeToMatch(selectedRanges[0], fromRow, fromCell, toRow, toCell);
+  }
+
+  function expectRangeToMatch(range, fromRow, fromCell, toRow, toCell) {
+    expect(range.fromRow).toBe(fromRow);
+    expect(range.toRow).toBe(toRow);
+    expect(range.fromCell).toBe(fromCell);
+    expect(range.toCell).toBe(toCell);
+  }
+});
diff --git a/web/regression/javascript/slickgrid/cell_selector_spec.js b/web/regression/javascript/slickgrid/cell_selector_spec.js
index ed7c0aee..b32fdf80 100644
--- a/web/regression/javascript/slickgrid/cell_selector_spec.js
+++ b/web/regression/javascript/slickgrid/cell_selector_spec.js
@@ -7,71 +7,69 @@
 //
 //////////////////////////////////////////////////////////////
 
-define(["jquery",
-    "slickgrid/slick.grid",
-    "sources/selection/xcell_selection_model",
-    "sources/slickgrid/cell_selector",
-    "sources/selection/range_selection_helper"
-  ],
-  function ($, SlickGrid, XCellSelectionModel, CellSelector, RangeSelectionHelper) {
-    describe("CellSelector", function () {
-      var container, columns, cellSelector, data, cellSelectionModel, grid;
-      beforeEach(function () {
-        container = $("<div></div>");
-        container.height(9999);
-        container.width(9999);
-        columns = [{
-          name: 'some-column-name',
-        }, {
-          name: 'second column',
-        }];
+import $ from "jquery";
+import SlickGrid from "slickgrid.grid";
+import XCellSelectionModel from "sources/selection/xcell_selection_model";
+import CellSelector from "sources/slickgrid/cell_selector";
+import RangeSelectionHelper from "sources/selection/range_selection_helper";
 
-        cellSelector = new CellSelector();
+describe("CellSelector", function () {
+  var container, columns, cellSelector, data, cellSelectionModel, grid;
+  beforeEach(function () {
+    container = $("<div></div>");
+    container.height(9999);
+    container.width(9999);
+    columns = [{
+      name: 'some-column-name',
+    }, {
+      name: 'second column',
+    }];
 
-        data = [];
-        for (var i = 0; i < 10; i++) {
-          data.push({'some-column-name': 'some-value-' + i, 'second column': 'second value ' + i});
-        }
-        grid = new SlickGrid(container, data, columns);
+    cellSelector = new CellSelector();
 
-        cellSelectionModel = new XCellSelectionModel();
-        grid.setSelectionModel(cellSelectionModel);
+    data = [];
+    for (var i = 0; i < 10; i++) {
+      data.push({'some-column-name': 'some-value-' + i, 'second column': 'second value ' + i});
+    }
+    grid = new Slick.Grid(container, data, columns);
 
-        grid.registerPlugin(cellSelector);
-        grid.invalidate();
+    cellSelectionModel = new XCellSelectionModel();
+    grid.setSelectionModel(cellSelectionModel);
 
-        $("body").append(container);
-      });
+    grid.registerPlugin(cellSelector);
+    grid.invalidate();
 
-      afterEach(function () {
-        $("body").find(container).remove();
-      });
+    $("body").append(container);
+  });
 
-      describe("when the user clicks or tabs to a cell", function () {
-        it("sets the selected range to that cell", function () {
-          var row = 1, column = 0;
-          $(container.find(".slick-row .slick-cell.l" + column)[row]).click();
+  afterEach(function () {
+    $("body").find(container).remove();
+  });
 
-          var selectedRanges = cellSelectionModel.getSelectedRanges();
-          expect(selectedRanges.length).toBe(1);
-          expect(selectedRanges[0].fromCell).toBe(0);
-          expect(selectedRanges[0].toCell).toBe(0);
-          expect(selectedRanges[0].fromRow).toBe(1);
-          expect(selectedRanges[0].toRow).toBe(1);
-        });
+  describe("when the user clicks or tabs to a cell", function () {
+    it("sets the selected range to that cell", function () {
+      var row = 1, column = 0;
+      $(container.find(".slick-row .slick-cell.l" + column)[row]).click();
 
-        it("deselects previously selected ranges", function () {
-          var row2Range = RangeSelectionHelper.rangeForRow(grid, 2);
-          var ranges = RangeSelectionHelper.addRange(cellSelectionModel.getSelectedRanges(),
-            row2Range);
-          cellSelectionModel.setSelectedRanges(ranges);
+      var selectedRanges = cellSelectionModel.getSelectedRanges();
+      expect(selectedRanges.length).toBe(1);
+      expect(selectedRanges[0].fromCell).toBe(0);
+      expect(selectedRanges[0].toCell).toBe(0);
+      expect(selectedRanges[0].fromRow).toBe(1);
+      expect(selectedRanges[0].toRow).toBe(1);
+    });
+
+    it("deselects previously selected ranges", function () {
+      var row2Range = RangeSelectionHelper.rangeForRow(grid, 2);
+      var ranges = RangeSelectionHelper.addRange(cellSelectionModel.getSelectedRanges(),
+        row2Range);
+      cellSelectionModel.setSelectedRanges(ranges);
 
-          var row = 4, column = 1;
-          $(container.find(".slick-row .slick-cell.l" + column)[row]).click();
+      var row = 4, column = 1;
+      $(container.find(".slick-row .slick-cell.l" + column)[row]).click();
 
-          expect(RangeSelectionHelper.isRangeSelected(cellSelectionModel.getSelectedRanges(), row2Range))
-            .toBe(false);
-        });
-      });
+      expect(RangeSelectionHelper.isRangeSelected(cellSelectionModel.getSelectedRanges(), row2Range))
+        .toBe(false);
     });
-  });
\ No newline at end of file
+  });
+});
diff --git a/web/regression/javascript/slickgrid/event_handlers/handle_query_output_keyboard_event_spec.js b/web/regression/javascript/slickgrid/event_handlers/handle_query_output_keyboard_event_spec.js
index 14768227..884ae415 100644
--- a/web/regression/javascript/slickgrid/event_handlers/handle_query_output_keyboard_event_spec.js
+++ b/web/regression/javascript/slickgrid/event_handlers/handle_query_output_keyboard_event_spec.js
@@ -7,137 +7,139 @@
 //
 //////////////////////////////////////////////////////////////
 
-define([
-    'sources/slickgrid/event_handlers/handle_query_output_keyboard_event',
-    'sources/selection/clipboard',
-    'sources/selection/range_selection_helper',
-    'sources/selection/xcell_selection_model',
-    'slickgrid'
-  ],
-function (handleQueryOutputKeyboardEvent, clipboard, RangeSelectionHelper, XCellSelectionModel) {
-  var Slick = window.Slick;
-
-  describe('#handleQueryOutputKeyboardEvent', function () {
-    var event, view, grid, slickEvent;
+import HandleQueryOutputKeyboardEvent from 'sources/slickgrid/event_handlers/handle_query_output_keyboard_event';
+import clipboard from 'sources/selection/clipboard';
+import RangeSelectionHelper from 'sources/selection/range_selection_helper';
+import XCellSelectionModel from 'sources/selection/xcell_selection_model';
+import Slick from 'slickgrid';
+import 'slickgrid.grid';
+
+
+describe('#handleQueryOutputKeyboardEvent', function () {
+  var event, view, grid, slickEvent;
+  var SlickGrid = Slick.Grid;
+  var handleQueryOutputKeyboardEvent;
+
+  beforeEach(function () {
+    event = {
+      shiftKey: false,
+      ctrlKey: false,
+      metaKey: false,
+      which: -1,
+      keyCode: -1,
+      preventDefault: jasmine.createSpy('preventDefault')
+    };
+
+    var data = [['', '0,0-cell-content', '0,1-cell-content'],
+      ['', '1,0-cell-content', '1,1-cell-content'],
+      ['', '2,0-cell-content', '2,1-cell-content']];
+    var columnDefinitions = [{name: 'checkboxColumn'}, {pos: 1, name: 'firstColumn'}, {
+      pos: 2,
+      name: 'secondColumn'
+    }];
+    grid = new SlickGrid($('<div></div>'), data, columnDefinitions);
+    grid.setSelectionModel(new XCellSelectionModel());
+
+    slickEvent = {
+      grid: grid
+    };
+
+    view = {};
+    spyOn(clipboard, 'copyTextToClipboard');
+    handleQueryOutputKeyboardEvent = HandleQueryOutputKeyboardEvent.bind(window);
+    debugger
+  });
+
+  describe("when a range is selected", function () {
     beforeEach(function () {
-      event = {
-        shiftKey: false,
-        ctrlKey: false,
-        metaKey: false,
-        which: -1,
-        keyCode: -1,
-        preventDefault: jasmine.createSpy('preventDefault')
-      };
-
-      var data = [['', '0,0-cell-content', '0,1-cell-content'],
-        ['', '1,0-cell-content', '1,1-cell-content'],
-        ['', '2,0-cell-content', '2,1-cell-content']];
-      var columnDefinitions = [{name: 'checkboxColumn'}, {pos: 1, name: 'firstColumn'}, {
-        pos: 2,
-        name: 'secondColumn'
-      }];
-      grid = new Slick.Grid($('<div></div>'), data, columnDefinitions);
-      grid.setSelectionModel(new XCellSelectionModel());
-
-      slickEvent = {
-        grid: grid
-      };
-
-      view = {};
-      spyOn(clipboard, 'copyTextToClipboard');
+      grid.getSelectionModel().setSelectedRanges([
+        RangeSelectionHelper.rangeForRow(grid, 0),
+        RangeSelectionHelper.rangeForRow(grid, 2),
+      ]);
     });
 
-    describe("when a range is selected", function () {
+    describe("pressing Command + C", function () {
       beforeEach(function () {
-        grid.getSelectionModel().setSelectedRanges([
-          RangeSelectionHelper.rangeForRow(grid, 0),
-          RangeSelectionHelper.rangeForRow(grid, 2),
-        ]);
+        event.metaKey = true;
+        event.keyCode = 67;
       });
 
-      describe("pressing Command + C", function () {
-        beforeEach(function () {
-          event.metaKey = true;
-          event.keyCode = 67;
-        });
-
-        it("copies the cell content to the clipboard", function () {
-          handleQueryOutputKeyboardEvent(event, slickEvent);
+      it("copies the cell content to the clipboard", function () {
+        handleQueryOutputKeyboardEvent(event, slickEvent);
 
-          expect(clipboard.copyTextToClipboard).toHaveBeenCalledWith("'0,0-cell-content','0,1-cell-content'\n'2,0-cell-content','2,1-cell-content'");
-        });
+        expect(clipboard.copyTextToClipboard).toHaveBeenCalledWith("'0,0-cell-content','0,1-cell-content'\n'2,0-cell-content','2,1-cell-content'");
       });
+    });
 
-      describe("pressing Ctrl + C", function () {
-        beforeEach(function () {
-          event.ctrlKey = true;
-          event.keyCode = 67;
-        });
+    describe("pressing Ctrl + C", function () {
+      beforeEach(function () {
+        event.ctrlKey = true;
+        event.keyCode = 67;
+      });
 
-        it("copies the cell content to the clipboard", function () {
-          handleQueryOutputKeyboardEvent(event, slickEvent);
+      it("copies the cell content to the clipboard", function () {
+        handleQueryOutputKeyboardEvent(event, slickEvent);
 
-          expect(clipboard.copyTextToClipboard).toHaveBeenCalledWith("'0,0-cell-content','0,1-cell-content'\n'2,0-cell-content','2,1-cell-content'");
-        });
+        expect(clipboard.copyTextToClipboard).toHaveBeenCalledWith("'0,0-cell-content','0,1-cell-content'\n'2,0-cell-content','2,1-cell-content'");
       });
+    });
 
-      describe("pressing Command + A", function () {
-        beforeEach(function () {
-          event.metaKey = true;
-          event.keyCode = 65;
-        });
+    describe("pressing Command + A", function () {
+      beforeEach(function () {
+        event.metaKey = true;
+        event.keyCode = 65;
+      });
 
-        it("selects the entire grid to ranges", function () {
-          handleQueryOutputKeyboardEvent(event, slickEvent);
+      it("selects the entire grid to ranges", function () {
+        handleQueryOutputKeyboardEvent(event, slickEvent);
 
-          expect(RangeSelectionHelper.isEntireGridSelected(grid)).toBeTruthy();
-          expect(grid.getSelectionModel().getSelectedRanges().length).toBe(1);
-        });
+        expect(RangeSelectionHelper.isEntireGridSelected(grid)).toBeTruthy();
+        expect(grid.getSelectionModel().getSelectedRanges().length).toBe(1);
       });
+    });
 
-      describe("pressing Ctrl + A", function () {
-        beforeEach(function () {
-          event.ctrlKey = true;
-          event.keyCode = 65;
-        });
+    describe("pressing Ctrl + A", function () {
+      beforeEach(function () {
+        event.ctrlKey = true;
+        event.keyCode = 65;
+      });
 
-        it("selects the entire grid to ranges", function () {
-          handleQueryOutputKeyboardEvent(event, slickEvent);
+      it("selects the entire grid to ranges", function () {
+        handleQueryOutputKeyboardEvent(event, slickEvent);
 
-          expect(RangeSelectionHelper.isEntireGridSelected(grid)).toBeTruthy();
-          expect(grid.getSelectionModel().getSelectedRanges().length).toBe(1);
-        });
+        expect(RangeSelectionHelper.isEntireGridSelected(grid)).toBeTruthy();
+        expect(grid.getSelectionModel().getSelectedRanges().length).toBe(1);
       });
     });
+  });
 
-    describe("when no ranges are selected", function () {
-      describe("pressing Command + A", function () {
-        beforeEach(function () {
-          event.metaKey = true;
-          event.keyCode = 65;
-        });
+  describe("when no ranges are selected", function () {
+    describe("pressing Command + A", function () {
+      beforeEach(function () {
+        event.metaKey = true;
+        event.keyCode = 65;
+      });
 
-        it("selects the entire grid to ranges", function () {
-          handleQueryOutputKeyboardEvent(event, slickEvent);
+      it("selects the entire grid to ranges", function () {
+        handleQueryOutputKeyboardEvent(event, slickEvent);
 
-          expect(RangeSelectionHelper.isEntireGridSelected(grid)).toBeTruthy();
-          expect(grid.getSelectionModel().getSelectedRanges().length).toBe(1);
-        });
+        expect(RangeSelectionHelper.isEntireGridSelected(grid)).toBeTruthy();
+        expect(grid.getSelectionModel().getSelectedRanges().length).toBe(1);
       });
+    });
 
-      describe("pressing Ctrl + A", function () {
-        beforeEach(function () {
-          event.ctrlKey = true;
-          event.keyCode = 65;
-        });
+    describe("pressing Ctrl + A", function () {
+      beforeEach(function () {
+        event.ctrlKey = true;
+        event.keyCode = 65;
+      });
 
-        it("selects the entire grid to ranges", function () {
-          handleQueryOutputKeyboardEvent(event, slickEvent);
+      it("selects the entire grid to ranges", function () {
+        handleQueryOutputKeyboardEvent(event, slickEvent);
 
-          expect(RangeSelectionHelper.isEntireGridSelected(grid)).toBeTruthy();
-          expect(grid.getSelectionModel().getSelectedRanges().length).toBe(1);
-        });
+        expect(RangeSelectionHelper.isEntireGridSelected(grid)).toBeTruthy();
+        expect(grid.getSelectionModel().getSelectedRanges().length).toBe(1);
       });
     });
   });
-});
\ No newline at end of file
+});
diff --git a/web/regression/javascript/test-main.js b/web/regression/javascript/test-main.js
deleted file mode 100644
index 4c5f09a0..00000000
--- a/web/regression/javascript/test-main.js
+++ /dev/null
@@ -1,139 +0,0 @@
-//////////////////////////////////////////////////////////////////////////
-//
-// pgAdmin 4 - PostgreSQL Tools
-//
-// Copyright (C) 2013 - 2017, The pgAdmin Development Team
-// This software is released under the PostgreSQL Licence
-//
-//////////////////////////////////////////////////////////////////////////
-
-var allTestFiles = [];
-var TEST_REGEXP = /(spec|test)\.js$/i;
-
-// Get a list of all the test files to include
-Object.keys(window.__karma__.files).forEach(function (file) {
-  if (TEST_REGEXP.test(file)) {
-    // Normalize paths to RequireJS module names.
-    // If you require sub-dependencies of test files to be loaded as-is (requiring file extension)
-    // then do not normalize the paths
-    var normalizedTestModule = file.replace(/^\/base\/|\.js$/g, '');
-    allTestFiles.push(normalizedTestModule)
-  }
-});
-
-var sourcesDir = '/base/pgadmin/static/';
-require.config({
-  // Karma serves files under /base, which is the basePath from your config file
-  baseUrl: '/base',
-
-  paths: {
-    'pgadmin': sourcesDir + 'js/pgadmin',
-    'alertify': sourcesDir + 'vendor/alertifyjs/alertify',
-    'jquery': sourcesDir + 'vendor/jquery/jquery-1.11.2',
-    'jquery.ui': sourcesDir + 'vendor/jquery-ui/jquery-ui-1.11.3',
-    'jquery.event.drag': sourcesDir + 'vendor/jquery-ui/jquery.event.drag-2.2',
-    'underscore': sourcesDir + 'vendor/underscore/underscore',
-    'underscore.string': sourcesDir + 'vendor/underscore/underscore.string',
-    'slickgrid': sourcesDir + 'vendor/slickgrid/slick.core',
-    'slickgrid/slick.grid': sourcesDir + 'vendor/slickgrid/slick.grid',
-    'translations': '/base/regression/javascript/fake_translations',
-    'pgadmin.browser.endpoints': '/base/regression/javascript/fake_endpoints',
-    'sources': sourcesDir + 'js',
-    'browser': '/base/pgadmin/browser/static/js'
-  },
-
-  shim: {
-    'underscore': {
-      exports: '_'
-    },
-    "slickgrid": {
-      "deps": [
-        'jquery', "jquery.ui", "jquery.event.drag"
-      ],
-      "exports": 'window.Slick'
-    },
-    "slickgrid/slick.grid": {
-      "deps": [
-        'jquery', "jquery.ui", "jquery.event.drag", "slickgrid"
-      ],
-      "exports": 'window.Slick.Grid'
-    },
-    "sources/slickgrid/pgslick.cellrangedecorator": {
-      "deps": [
-        "jquery"
-      ],
-      "exports": 'PGRowRangeDecorator'
-    },
-    "sources/slickgrid/pgslick.cellrangeselector": {
-      "deps": [
-        "jquery", "sources/slickgrid/pgslick.cellrangedecorator"
-      ],
-      "exports": 'PGCellRangeSelector'
-    },
-    "sources/selection/xcell_selection_model": {
-      "deps": [
-        "jquery", "sources/slickgrid/pgslick.cellrangeselector"
-      ],
-      "exports": 'XCellSelectionModel'
-    },
-    "backbone": {
-      "deps": ['underscore', 'jquery'],
-      "exports": 'Backbone'
-    },
-    "backbone.paginator": {
-      "deps": ['underscore', 'jquery', 'backbone']
-    },
-    "bootstrap": {
-      "deps": ['jquery'],
-    },
-    "backgrid": {
-      "deps": ['backform'],
-      "exports": 'Backgrid',
-    },
-    "backgrid.select.all": {
-      "deps": ['backgrid']
-    },
-    "backgrid.paginator": {
-      "deps": ['backgrid', 'backbone.paginator']
-    },
-    "backgrid.filter": {
-      "deps": ['backgrid']
-    },
-    "backgrid.sizeable.columns": {
-      "deps": ['backgrid']
-    },
-    "bootstrap.switch": {
-      "deps": ['jquery', 'bootstrap'],
-      "exports": 'jQuery.fn.bootstrapSwitch'
-    },
-    "select2": {
-      "deps": ['jquery'],
-      "exports": 'jQuery.fn.select2'
-    },
-    "bootstrap.datepicker": {
-      "deps": ['jquery', 'bootstrap'],
-      "exports": 'jQuery.fn.datepicker'
-    },
-    "bootstrap.datetimepicker": {
-      "deps": ['jquery', 'bootstrap', 'moment'],
-      "exports": 'jQuery.fn.datetimepicker'
-    },
-    "pgadmin.backgrid": {
-      "deps": ["backgrid", "bootstrap.datetimepicker", "bootstrap.switch"],
-    },
-    "pgadmin.backform": {
-      "deps": ['backform', "pgadmin.backgrid", "select2"],
-    },
-    "jquery.event.drag": {
-      "deps": ['jquery'], "exports": 'jQuery.fn.drag'
-    },
-    "jquery.ui": {"deps": ['jquery']}
-  },
-
-  // dynamically load all test files
-  deps: allTestFiles,
-
-  // we have to kickoff jasmine, as it is asynchronous
-  callback: window.__karma__.start
-});
-
diff --git a/web/regression/requirements.txt b/web/regression/requirements.txt
index 5959a183..f44953d5 100644
--- a/web/regression/requirements.txt
+++ b/web/regression/requirements.txt
@@ -4,6 +4,7 @@ testscenarios==0.5.0
 testtools==2.0.0
 traceback2==1.4.0
 unittest2==1.1.0
+mock~=2.0.0
 
 # Leave this at the end because there is a bug where the '--install-option' is applied to all subsequent requirements
 chromedriver_installer==0.0.6 --install-option='--chromedriver-version=2.29'
diff --git a/web/webpack.config.js b/web/webpack.config.js
new file mode 100644
index 00000000..91586592
--- /dev/null
+++ b/web/webpack.config.js
@@ -0,0 +1,29 @@
+/* eslint-env node */
+
+module.exports = {
+  context: __dirname + '/pgadmin/static/jsx',
+  entry: './components.jsx',
+  output: {
+    libraryTarget: 'amd',
+    path: __dirname + '/pgadmin/static/js/generated',
+    filename: 'reactComponents.js',
+  },
+
+  module: {
+    rules: [{
+      test: /\.jsx?$/,
+      exclude: /node_modules/,
+      use: {
+        loader: 'babel-loader',
+        options: {
+          presets: ['es2015', 'react'],
+        },
+      },
+    },
+    ],
+  },
+
+  resolve: {
+    extensions: ['.js', '.jsx'],
+  },
+};
\ No newline at end of file
diff --git a/web/webpack.test.config.js b/web/webpack.test.config.js
new file mode 100644
index 00000000..226020e9
--- /dev/null
+++ b/web/webpack.test.config.js
@@ -0,0 +1,71 @@
+/* eslint-env node */
+const path = require('path');
+const webpack = require('webpack');
+
+const sourcesDir = path.resolve(__dirname, 'pgadmin/static');
+const regressionDir = path.resolve(__dirname, 'regression');
+
+module.exports = {
+  plugins: [
+    new webpack.ProvidePlugin({
+      $: 'jquery',
+      jQuery: 'jquery',
+      _: 'underscore',
+      'underscore.string': 'underscore.string',
+    }),
+  ],
+
+  module: {
+    rules: [
+      {
+        test: /\.jsx?$/,
+        exclude: [/node_modules/, /vendor/],
+        use: {
+          loader: 'babel-loader',
+          options: {
+            presets: ['es2015'],
+          },
+        },
+      },
+      {
+        test: /.*slickgrid\/slick\.(?!core)*/,
+        loader: 'imports-loader?' +
+        'jquery.ui' +
+        ',jquery.event.drag' +
+        ',slickgrid',
+      }, {
+        test: /.*slickgrid\/plugins\/slick\.rowselectionmodel/,
+        loader: 'imports-loader?' +
+        'jquery.ui' +
+        ',jquery.event.drag' +
+        ',slickgrid' +
+        '!exports-loader?' +
+        'Slick.RowSelectionModel',
+      }, {
+        test: /.*slickgrid\/slick\.core.*/,
+        loader: 'imports-loader?' +
+        'jquery.ui' +
+        ',jquery.event.drag' +
+        '!exports-loader?' +
+        'Slick',
+      }],
+  },
+
+  resolve: {
+    alias: {
+      'alertify': sourcesDir + '/vendor/alertifyjs/alertify',
+      'jquery': sourcesDir + '/vendor/jquery/jquery-1.11.2',
+      'jquery.ui': sourcesDir + '/vendor/jquery-ui/jquery-ui-1.11.3',
+      'jquery.event.drag': sourcesDir + '/vendor/jquery-ui/jquery.event.drag-2.2',
+      'sources': sourcesDir + '/js',
+      'underscore.string': sourcesDir + '/vendor/underscore/underscore.string',
+      'translations': regressionDir + '/javascript/fake_translations',
+      'pgadmin.browser.endpoints': regressionDir + '/javascript/fake_endpoints',
+      'slickgrid': sourcesDir + '/vendor/slickgrid/slick.core',
+      'slickgrid.grid': sourcesDir + '/vendor/slickgrid/slick.grid',
+      'slickgrid.rowselectionmodel': sourcesDir + '/vendor/slickgrid/plugins/slick.rowselectionmodel',
+      'browser': path.resolve(__dirname, 'pgadmin/browser/static/js'),
+      'pgadmin': sourcesDir + '/js/pgadmin',
+    },
+  },
+};
diff --git a/web/yarn.lock b/web/yarn.lock
index e69de29b..bfd9171d 100644
--- a/web/yarn.lock
+++ b/web/yarn.lock
@@ -0,0 +1,4526 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+JSONStream@^1.0.3:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.1.tgz#707f761e01dae9e16f1bcf93703b78c709665...;
+  dependencies:
+    jsonparse "^1.2.0"
+    through ">=2.2.7 <3"
+
+abbrev@1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f";
+
[email protected]:
+  version "1.3.3"
+  resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca...;
+  dependencies:
+    mime-types "~2.1.11"
+    negotiator "0.6.1"
+
+acorn-dynamic-import@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef67950...;
+  dependencies:
+    acorn "^4.0.3"
+
+acorn-jsx@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36...;
+  dependencies:
+    acorn "^3.0.4"
+
+acorn@^3.0.4:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a";
+
+acorn@^4.0.3, acorn@^4.0.4:
+  version "4.0.13"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787";
+
+acorn@^5.0.1:
+  version "5.0.3"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.0.3.tgz#c460df08491463f028ccb82eab3730bf01087b3d";
+
[email protected]:
+  version "0.8.2"
+  resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f";
+
+ajv-keywords@^1.0.0, ajv-keywords@^1.1.1:
+  version "1.5.1"
+  resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b8...;
+
+ajv@^4.7.0, ajv@^4.9.1:
+  version "4.11.8"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536";
+  dependencies:
+    co "^4.6.0"
+    json-stable-stringify "^1.0.1"
+
+align-text@^0.1.1, align-text@^0.1.3:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad...;
+  dependencies:
+    kind-of "^3.0.2"
+    longest "^1.0.1"
+    repeat-string "^1.5.2"
+
+amdefine@>=0.0.4:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5&...;
+
+ansi-escapes@^1.1.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911...;
+
+ansi-regex@^2.0.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d65...;
+
+ansi-styles@^2.2.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c...;
+
+anymatch@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507&...;
+  dependencies:
+    arrify "^1.0.0"
+    micromatch "^2.1.5"
+
+aproba@^1.0.3:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.2.tgz#45c6629094de4e96f693ef7eab74ae079c240fc1";
+
+are-we-there-yet@~1.1.2:
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373...;
+  dependencies:
+    delegates "^1.0.0"
+    readable-stream "^2.0.6"
+
+argparse@^1.0.7:
+  version "1.0.9"
+  resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86&...;
+  dependencies:
+    sprintf-js "~1.0.2"
+
+arr-diff@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf&...;
+  dependencies:
+    arr-flatten "^1.0.1"
+
+arr-flatten@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.3.tgz#a274ed85ac08849b6bd7847c4580745dc51...;
+
+array-filter@~0.0.0:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67ca...;
+
+array-map@~0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa66...;
+
+array-reduce@~0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278...;
+
+array-slice@^0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86...;
+
+array-union@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f2477...;
+  dependencies:
+    array-uniq "^1.0.1"
+
+array-uniq@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24f...;
+
+array-unique@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c5...;
+
+array.prototype.find@^2.0.1:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/array.prototype.find/-/array.prototype.find-2.0.4.tgz#556a5c5362c086483...;
+  dependencies:
+    define-properties "^1.1.2"
+    es-abstract "^1.7.0"
+
[email protected]:
+  version "0.0.6"
+  resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a27...;
+
+arrify@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d";
+
+asap@~2.0.3:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.5.tgz#522765b50c3510490e52d7dcfe085ef9ba96958f";
+
+asn1.js@^4.0.0:
+  version "4.9.1"
+  resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.9.1.tgz#48ba240b45a9280e94748990ba597d216617fd40...;
+  dependencies:
+    bn.js "^4.0.0"
+    inherits "^2.0.1"
+    minimalistic-assert "^1.0.0"
+
+asn1@~0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86";
+
[email protected], assert-plus@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4...;
+
+assert-plus@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101...;
+
+assert@^1.1.1, assert@^1.4.0:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91";
+  dependencies:
+    util "0.10.3"
+
+astw@^2.0.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/astw/-/astw-2.2.0.tgz#7bd41784d32493987aeb239b6b4e1c57a873b917";
+  dependencies:
+    acorn "^4.0.3"
+
+async-each@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d336...;
+
+async@^2.1.2:
+  version "2.4.1"
+  resolved "https://registry.yarnpkg.com/async/-/async-2.4.1.tgz#62a56b279c98a11d0987096a01cc3eeb8eb7bbd7";
+  dependencies:
+    lodash "^4.14.0"
+
+async@~0.9.0:
+  version "0.9.2"
+  resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d";
+
+asynckit@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79&...;
+
+aws-sign2@~0.6.0:
+  version "0.6.0"
+  resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794...;
+
+aws4@^1.2.1:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e";
+
+axios@^0.16.1:
+  version "0.16.2"
+  resolved "https://registry.yarnpkg.com/axios/-/axios-0.16.2.tgz#ba4f92f17167dfbab40983785454b9ac149c3c6d";
+  dependencies:
+    follow-redirects "^1.2.3"
+    is-buffer "^1.1.5"
+
+babel-code-frame@^6.16.0, babel-code-frame@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574...;
+  dependencies:
+    chalk "^1.1.0"
+    esutils "^2.0.2"
+    js-tokens "^3.0.0"
+
+babel-core@^6.0.0, babel-core@^6.0.14, babel-core@^6.24.1, babel-core@~6.24.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.24.1.tgz#8c428564dce1e1f41fb337ec34f4c3b022b5...;
+  dependencies:
+    babel-code-frame "^6.22.0"
+    babel-generator "^6.24.1"
+    babel-helpers "^6.24.1"
+    babel-messages "^6.23.0"
+    babel-register "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+    babylon "^6.11.0"
+    convert-source-map "^1.1.0"
+    debug "^2.1.1"
+    json5 "^0.5.0"
+    lodash "^4.2.0"
+    minimatch "^3.0.2"
+    path-is-absolute "^1.0.0"
+    private "^0.1.6"
+    slash "^1.0.0"
+    source-map "^0.5.0"
+
+babel-generator@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.24.1.tgz#e715f486c58ded25649d888944...;
+  dependencies:
+    babel-messages "^6.23.0"
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+    detect-indent "^4.0.0"
+    jsesc "^1.3.0"
+    lodash "^4.2.0"
+    source-map "^0.5.0"
+    trim-right "^1.0.1"
+
+babel-helper-builder-react-jsx@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.24.1....;
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+    esutils "^2.0.0"
+
+babel-helper-call-delegate@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6...;
+  dependencies:
+    babel-helper-hoist-variables "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-helper-define-map@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz#7a9747f258...;
+  dependencies:
+    babel-helper-function-name "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+    lodash "^4.2.0"
+
+babel-helper-function-name@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d347...;
+  dependencies:
+    babel-helper-get-function-arity "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-helper-get-function-arity@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24....;
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-helper-hoist-variables@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#...;
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-helper-optimise-call-expression@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expr...;
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-helper-regex@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz#d36e22fab1008d79d886...;
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+    lodash "^4.2.0"
+
+babel-helper-replace-supers@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf...;
+  dependencies:
+    babel-helper-optimise-call-expression "^6.24.1"
+    babel-messages "^6.23.0"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-helpers@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26...;
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+
+babel-loader@~6.4.1:
+  version "6.4.1"
+  resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-6.4.1.tgz#0b34112d5b0748a8dcdbf51acf6f9bd42...;
+  dependencies:
+    find-cache-dir "^0.1.1"
+    loader-utils "^0.2.16"
+    mkdirp "^0.5.1"
+    object-assign "^4.0.1"
+
+babel-messages@^6.23.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5e...;
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-check-es2015-constants@^6.22.0, babel-plugin-check-es2015-constants@^6.3.13:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constan...;
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-syntax-flow@^6.18.0:
+  version "6.18.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a...;
+
+babel-plugin-syntax-jsx@^6.3.13, babel-plugin-syntax-jsx@^6.8.0:
+  version "6.18.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e...;
+
+babel-plugin-transform-es2015-arrow-functions@^6.22.0, babel-plugin-transform-es2015-arrow-functions@^6.3.13:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-...;
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoped-functions@^6.22.0, babel-plugin-transform-es2015-block-scoped-functions@^6.3.13:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-tra...;
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoping@^6.24.1, babel-plugin-transform-es2015-block-scoping@^6.9.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es...;
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+    lodash "^4.2.0"
+
+babel-plugin-transform-es2015-classes@^6.24.1, babel-plugin-transform-es2015-classes@^6.9.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-c...;
+  dependencies:
+    babel-helper-define-map "^6.24.1"
+    babel-helper-function-name "^6.24.1"
+    babel-helper-optimise-call-expression "^6.24.1"
+    babel-helper-replace-supers "^6.24.1"
+    babel-messages "^6.23.0"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-computed-properties@^6.24.1, babel-plugin-transform-es2015-computed-properties@^6.3.13:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transf...;
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-destructuring@^6.22.0, babel-plugin-transform-es2015-destructuring@^6.9.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es...;
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-duplicate-keys@^6.24.1, babel-plugin-transform-es2015-duplicate-keys@^6.6.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-e...;
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-for-of@^6.22.0, babel-plugin-transform-es2015-for-of@^6.6.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-fo...;
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-function-name@^6.24.1, babel-plugin-transform-es2015-function-name@^6.9.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es...;
+  dependencies:
+    babel-helper-function-name "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-literals@^6.22.0, babel-plugin-transform-es2015-literals@^6.3.13:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-...;
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-modules-amd@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es20...;
+  dependencies:
+    babel-plugin-transform-es2015-modules-commonjs "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-modules-commonjs@^6.24.1, babel-plugin-transform-es2015-modules-commonjs@^6.6.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform...;
+  dependencies:
+    babel-plugin-transform-strict-mode "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-modules-systemjs@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform...;
+  dependencies:
+    babel-helper-hoist-variables "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-modules-umd@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es20...;
+  dependencies:
+    babel-plugin-transform-es2015-modules-amd "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-object-super@^6.24.1, babel-plugin-transform-es2015-object-super@^6.3.13:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2...;
+  dependencies:
+    babel-helper-replace-supers "^6.24.1"
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-parameters@^6.24.1, babel-plugin-transform-es2015-parameters@^6.9.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es201...;
+  dependencies:
+    babel-helper-call-delegate "^6.24.1"
+    babel-helper-get-function-arity "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-shorthand-properties@^6.24.1, babel-plugin-transform-es2015-shorthand-properties@^6.3.13:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-trans...;
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-spread@^6.22.0, babel-plugin-transform-es2015-spread@^6.3.13:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-sp...;
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-sticky-regex@^6.24.1, babel-plugin-transform-es2015-sticky-regex@^6.3.13:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2...;
+  dependencies:
+    babel-helper-regex "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-template-literals@^6.22.0, babel-plugin-transform-es2015-template-literals@^6.6.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transfor...;
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-typeof-symbol@^6.22.0, babel-plugin-transform-es2015-typeof-symbol@^6.6.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es...;
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-unicode-regex@^6.24.1, babel-plugin-transform-es2015-unicode-regex@^6.3.13:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es...;
+  dependencies:
+    babel-helper-regex "^6.24.1"
+    babel-runtime "^6.22.0"
+    regexpu-core "^2.0.0"
+
+babel-plugin-transform-flow-strip-types@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-s...;
+  dependencies:
+    babel-plugin-syntax-flow "^6.18.0"
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-react-display-name@^6.23.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-reac...;
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-react-jsx-self@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-js...;
+  dependencies:
+    babel-plugin-syntax-jsx "^6.8.0"
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-react-jsx-source@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-...;
+  dependencies:
+    babel-plugin-syntax-jsx "^6.8.0"
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-react-jsx@^6.23.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.2...;
+  dependencies:
+    babel-helper-builder-react-jsx "^6.24.1"
+    babel-plugin-syntax-jsx "^6.8.0"
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-regenerator@^6.24.1, babel-plugin-transform-regenerator@^6.9.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator...;
+  dependencies:
+    regenerator-transform "0.9.11"
+
+babel-plugin-transform-strict-mode@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode...;
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-polyfill@^6.23.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177...;
+  dependencies:
+    babel-runtime "^6.22.0"
+    core-js "^2.4.0"
+    regenerator-runtime "^0.10.0"
+
+babel-preset-es2015-without-strict@~0.0.4:
+  version "0.0.4"
+  resolved "https://registry.yarnpkg.com/babel-preset-es2015-without-strict/-/babel-preset-es2015-without-strict...;
+  dependencies:
+    babel-plugin-check-es2015-constants "^6.3.13"
+    babel-plugin-transform-es2015-arrow-functions "^6.3.13"
+    babel-plugin-transform-es2015-block-scoped-functions "^6.3.13"
+    babel-plugin-transform-es2015-block-scoping "^6.9.0"
+    babel-plugin-transform-es2015-classes "^6.9.0"
+    babel-plugin-transform-es2015-computed-properties "^6.3.13"
+    babel-plugin-transform-es2015-destructuring "^6.9.0"
+    babel-plugin-transform-es2015-duplicate-keys "^6.6.0"
+    babel-plugin-transform-es2015-for-of "^6.6.0"
+    babel-plugin-transform-es2015-function-name "^6.9.0"
+    babel-plugin-transform-es2015-literals "^6.3.13"
+    babel-plugin-transform-es2015-modules-commonjs "^6.6.0"
+    babel-plugin-transform-es2015-object-super "^6.3.13"
+    babel-plugin-transform-es2015-parameters "^6.9.0"
+    babel-plugin-transform-es2015-shorthand-properties "^6.3.13"
+    babel-plugin-transform-es2015-spread "^6.3.13"
+    babel-plugin-transform-es2015-sticky-regex "^6.3.13"
+    babel-plugin-transform-es2015-template-literals "^6.6.0"
+    babel-plugin-transform-es2015-typeof-symbol "^6.6.0"
+    babel-plugin-transform-es2015-unicode-regex "^6.3.13"
+    babel-plugin-transform-regenerator "^6.9.0"
+
+babel-preset-es2015@~6.24.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea7...;
+  dependencies:
+    babel-plugin-check-es2015-constants "^6.22.0"
+    babel-plugin-transform-es2015-arrow-functions "^6.22.0"
+    babel-plugin-transform-es2015-block-scoped-functions "^6.22.0"
+    babel-plugin-transform-es2015-block-scoping "^6.24.1"
+    babel-plugin-transform-es2015-classes "^6.24.1"
+    babel-plugin-transform-es2015-computed-properties "^6.24.1"
+    babel-plugin-transform-es2015-destructuring "^6.22.0"
+    babel-plugin-transform-es2015-duplicate-keys "^6.24.1"
+    babel-plugin-transform-es2015-for-of "^6.22.0"
+    babel-plugin-transform-es2015-function-name "^6.24.1"
+    babel-plugin-transform-es2015-literals "^6.22.0"
+    babel-plugin-transform-es2015-modules-amd "^6.24.1"
+    babel-plugin-transform-es2015-modules-commonjs "^6.24.1"
+    babel-plugin-transform-es2015-modules-systemjs "^6.24.1"
+    babel-plugin-transform-es2015-modules-umd "^6.24.1"
+    babel-plugin-transform-es2015-object-super "^6.24.1"
+    babel-plugin-transform-es2015-parameters "^6.24.1"
+    babel-plugin-transform-es2015-shorthand-properties "^6.24.1"
+    babel-plugin-transform-es2015-spread "^6.22.0"
+    babel-plugin-transform-es2015-sticky-regex "^6.24.1"
+    babel-plugin-transform-es2015-template-literals "^6.22.0"
+    babel-plugin-transform-es2015-typeof-symbol "^6.22.0"
+    babel-plugin-transform-es2015-unicode-regex "^6.24.1"
+    babel-plugin-transform-regenerator "^6.24.1"
+
+babel-preset-flow@^6.23.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz#e71218887085ae9a24b5be...;
+  dependencies:
+    babel-plugin-transform-flow-strip-types "^6.22.0"
+
+babel-preset-react@~6.23.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.23.0.tgz#eb7cee4de98a3f94502c...;
+  dependencies:
+    babel-plugin-syntax-jsx "^6.3.13"
+    babel-plugin-transform-react-display-name "^6.23.0"
+    babel-plugin-transform-react-jsx "^6.23.0"
+    babel-plugin-transform-react-jsx-self "^6.22.0"
+    babel-plugin-transform-react-jsx-source "^6.22.0"
+    babel-preset-flow "^6.23.0"
+
+babel-register@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.1.tgz#7e10e13a2f71065bdfad5a1787ba...;
+  dependencies:
+    babel-core "^6.24.1"
+    babel-runtime "^6.22.0"
+    core-js "^2.4.0"
+    home-or-tmp "^2.0.0"
+    lodash "^4.2.0"
+    mkdirp "^0.5.1"
+    source-map-support "^0.4.2"
+
+babel-runtime@^6.18.0, babel-runtime@^6.22.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb3...;
+  dependencies:
+    core-js "^2.4.0"
+    regenerator-runtime "^0.10.0"
+
+babel-template@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.24.1.tgz#04ae514f1f93b3a2537f2a0f60a5...;
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+    babylon "^6.11.0"
+    lodash "^4.2.0"
+
+babel-traverse@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.24.1.tgz#ab36673fd356f9a0948659e7b338...;
+  dependencies:
+    babel-code-frame "^6.22.0"
+    babel-messages "^6.23.0"
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+    babylon "^6.15.0"
+    debug "^2.2.0"
+    globals "^9.0.0"
+    invariant "^2.2.0"
+    lodash "^4.2.0"
+
+babel-types@^6.19.0, babel-types@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.24.1.tgz#a136879dc15b3606bda0d90c1fc74304c2...;
+  dependencies:
+    babel-runtime "^6.22.0"
+    esutils "^2.0.2"
+    lodash "^4.2.0"
+    to-fast-properties "^1.0.1"
+
+babelify@~7.3.0:
+  version "7.3.0"
+  resolved "https://registry.yarnpkg.com/babelify/-/babelify-7.3.0.tgz#aa56aede7067fd7bd549666ee16dc285087e88e5&...;
+  dependencies:
+    babel-core "^6.0.14"
+    object-assign "^4.0.0"
+
+babylon@^6.11.0, babylon@^6.15.0:
+  version "6.17.2"
+  resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.2.tgz#201d25ef5f892c41bae49488b08db0dd476e9f5c&#...;
+
[email protected]:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947";
+
+balanced-match@^0.4.1:
+  version "0.4.2"
+  resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302...;
+
[email protected]:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad...;
+
+base64-js@^1.0.2:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.0.tgz#a39992d723584811982be5e290bb6a53d86700f...;
+
[email protected]:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6&...;
+
+bcrypt-pbkdf@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c3346...;
+  dependencies:
+    tweetnacl "^0.14.3"
+
+better-assert@~1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68fa...;
+  dependencies:
+    callsite "1.0.0"
+
+big.js@^3.1.3:
+  version "3.1.3"
+  resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.1.3.tgz#4cada2193652eb3ca9ec8e55c9015669c9806978";
+
+binary-extensions@^1.0.0:
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa588...;
+
[email protected]:
+  version "0.0.4"
+  resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921";
+
+block-stream@*:
+  version "0.0.9"
+  resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b33...;
+  dependencies:
+    inherits "~2.0.0"
+
+bluebird@^3.3.0:
+  version "3.5.0"
+  resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c&...;
+
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
+  version "4.11.6"
+  resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215";
+
+body-parser@^1.16.1:
+  version "1.17.2"
+  resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.17.2.tgz#f8892abc8f9e627d42aedafbca66bf5ab9...;
+  dependencies:
+    bytes "2.4.0"
+    content-type "~1.0.2"
+    debug "2.6.7"
+    depd "~1.1.0"
+    http-errors "~1.6.1"
+    iconv-lite "0.4.15"
+    on-finished "~2.3.0"
+    qs "6.4.0"
+    raw-body "~2.2.0"
+    type-is "~1.6.15"
+
+boolbase@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e&...;
+
[email protected]:
+  version "2.10.1"
+  resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f";
+  dependencies:
+    hoek "2.x.x"
+
+brace-expansion@^1.1.7:
+  version "1.1.7"
+  resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.7.tgz#3effc3c50e000531fb720eaff80...;
+  dependencies:
+    balanced-match "^0.4.1"
+    concat-map "0.0.1"
+
+braces@^0.1.2:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/braces/-/braces-0.1.5.tgz#c085711085291d8b75fdd74eab0f8597280711e6";
+  dependencies:
+    expand-range "^0.1.0"
+
+braces@^1.8.2:
+  version "1.8.5"
+  resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7";
+  dependencies:
+    expand-range "^1.8.1"
+    preserve "^0.2.0"
+    repeat-element "^1.1.2"
+
+brorand@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f...;
+
+browser-pack@^6.0.1:
+  version "6.0.2"
+  resolved "https://registry.yarnpkg.com/browser-pack/-/browser-pack-6.0.2.tgz#f86cd6cef4f5300c8e63e07a4d512f65f...;
+  dependencies:
+    JSONStream "^1.0.3"
+    combine-source-map "~0.7.1"
+    defined "^1.0.0"
+    through2 "^2.0.0"
+    umd "^3.0.0"
+
+browser-resolve@^1.11.0, browser-resolve@^1.7.0:
+  version "1.11.2"
+  resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b...;
+  dependencies:
+    resolve "1.1.7"
+
+browserify-aes@^1.0.0, browserify-aes@^1.0.4:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.0.6.tgz#5e7725dbdef1fd5930d4ebab48567...;
+  dependencies:
+    buffer-xor "^1.0.2"
+    cipher-base "^1.0.0"
+    create-hash "^1.1.0"
+    evp_bytestokey "^1.0.0"
+    inherits "^2.0.1"
+
+browserify-cipher@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.0.tgz#9988244874bf5ed4e28da95...;
+  dependencies:
+    browserify-aes "^1.0.4"
+    browserify-des "^1.0.0"
+    evp_bytestokey "^1.0.0"
+
+browserify-des@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.0.tgz#daa277717470922ed2fe18594118a...;
+  dependencies:
+    cipher-base "^1.0.1"
+    des.js "^1.0.0"
+    inherits "^2.0.1"
+
+browserify-rsa@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a...;
+  dependencies:
+    bn.js "^4.1.0"
+    randombytes "^2.0.1"
+
+browserify-sign@^4.0.0:
+  version "4.0.4"
+  resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e6...;
+  dependencies:
+    bn.js "^4.1.1"
+    browserify-rsa "^4.0.0"
+    create-hash "^1.1.0"
+    create-hmac "^1.1.2"
+    elliptic "^6.0.0"
+    inherits "^2.0.1"
+    parse-asn1 "^5.0.0"
+
+browserify-zlib@^0.1.4, browserify-zlib@~0.1.2:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241...;
+  dependencies:
+    pako "~0.2.0"
+
+browserify@^14.0.0, browserify@~14.1.0:
+  version "14.1.0"
+  resolved "https://registry.yarnpkg.com/browserify/-/browserify-14.1.0.tgz#0508cc1e7bf4c152312c2fa523e676c0b0b9...;
+  dependencies:
+    JSONStream "^1.0.3"
+    assert "^1.4.0"
+    browser-pack "^6.0.1"
+    browser-resolve "^1.11.0"
+    browserify-zlib "~0.1.2"
+    buffer "^5.0.2"
+    cached-path-relative "^1.0.0"
+    concat-stream "~1.5.1"
+    console-browserify "^1.1.0"
+    constants-browserify "~1.0.0"
+    crypto-browserify "^3.0.0"
+    defined "^1.0.0"
+    deps-sort "^2.0.0"
+    domain-browser "~1.1.0"
+    duplexer2 "~0.1.2"
+    events "~1.1.0"
+    glob "^7.1.0"
+    has "^1.0.0"
+    htmlescape "^1.1.0"
+    https-browserify "~0.0.0"
+    inherits "~2.0.1"
+    insert-module-globals "^7.0.0"
+    labeled-stream-splicer "^2.0.0"
+    module-deps "^4.0.8"
+    os-browserify "~0.1.1"
+    parents "^1.0.1"
+    path-browserify "~0.0.0"
+    process "~0.11.0"
+    punycode "^1.3.2"
+    querystring-es3 "~0.2.0"
+    read-only-stream "^2.0.0"
+    readable-stream "^2.0.2"
+    resolve "^1.1.4"
+    shasum "^1.0.0"
+    shell-quote "^1.6.1"
+    stream-browserify "^2.0.0"
+    stream-http "^2.0.0"
+    string_decoder "~0.10.0"
+    subarg "^1.0.0"
+    syntax-error "^1.1.1"
+    through2 "^2.0.0"
+    timers-browserify "^1.0.1"
+    tty-browserify "~0.0.0"
+    url "~0.11.0"
+    util "~0.10.1"
+    vm-browserify "~0.0.1"
+    xtend "^4.0.0"
+
+buffer-xor@^1.0.2:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe...;
+
+buffer@^4.3.0:
+  version "4.9.1"
+  resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298";
+  dependencies:
+    base64-js "^1.0.2"
+    ieee754 "^1.1.4"
+    isarray "^1.0.0"
+
+buffer@^5.0.2:
+  version "5.0.6"
+  resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.0.6.tgz#2ea669f7eec0b6eda05b08f8b5ff661b28573588";
+  dependencies:
+    base64-js "^1.0.2"
+    ieee754 "^1.1.4"
+
+builtin-modules@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94...;
+
+builtin-status-codes@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c...;
+
[email protected]:
+  version "2.4.0"
+  resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339";
+
+cached-path-relative@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/cached-path-relative/-/cached-path-relative-1.0.1.tgz#d09c4b52800aa4c07...;
+
+caller-path@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e8257...;
+  dependencies:
+    callsites "^0.2.0"
+
[email protected]:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20&...;
+
+callsites@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350c...;
+
+camelcase@^1.0.2:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a3...;
+
+camelcase@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0...;
+
+caseless@~0.11.0:
+  version "0.11.0"
+  resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7...;
+
+caseless@~0.12.0:
+  version "0.12.0"
+  resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc...;
+
+center-align@^0.1.1:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907...;
+  dependencies:
+    align-text "^0.1.3"
+    lazy-cache "^1.0.3"
+
+chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98";
+  dependencies:
+    ansi-styles "^2.2.1"
+    escape-string-regexp "^1.0.2"
+    has-ansi "^2.0.0"
+    strip-ansi "^3.0.0"
+    supports-color "^2.0.0"
+
+cheerio@^0.22.0:
+  version "0.22.0"
+  resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.22.0.tgz#a9baa860a3f9b595a6b81b1a86873121ed3a269e&#...;
+  dependencies:
+    css-select "~1.2.0"
+    dom-serializer "~0.1.0"
+    entities "~1.1.1"
+    htmlparser2 "^3.9.1"
+    lodash.assignin "^4.0.9"
+    lodash.bind "^4.1.4"
+    lodash.defaults "^4.0.1"
+    lodash.filter "^4.4.0"
+    lodash.flatten "^4.2.0"
+    lodash.foreach "^4.3.0"
+    lodash.map "^4.4.0"
+    lodash.merge "^4.4.0"
+    lodash.pick "^4.2.1"
+    lodash.reduce "^4.4.0"
+    lodash.reject "^4.4.0"
+    lodash.some "^4.4.0"
+
+chokidar@^1.0.0, chokidar@^1.4.1, chokidar@^1.4.3:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468&...;
+  dependencies:
+    anymatch "^1.3.0"
+    async-each "^1.0.0"
+    glob-parent "^2.0.0"
+    inherits "^2.0.1"
+    is-binary-path "^1.0.0"
+    is-glob "^2.0.0"
+    path-is-absolute "^1.0.0"
+    readdirp "^2.0.0"
+  optionalDependencies:
+    fsevents "^1.0.0"
+
+cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.3.tgz#eeabf194419ce900da3018c207d212f2a6d...;
+  dependencies:
+    inherits "^2.0.1"
+
+circular-json@^0.3.1:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a3...;
+
+cli-cursor@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2...;
+  dependencies:
+    restore-cursor "^1.0.1"
+
+cli-width@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00...;
+
+cliui@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1";
+  dependencies:
+    center-align "^0.1.1"
+    right-align "^0.1.1"
+    wordwrap "0.0.2"
+
+cliui@^3.2.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d";
+  dependencies:
+    string-width "^1.0.1"
+    strip-ansi "^3.0.1"
+    wrap-ansi "^2.0.0"
+
+co@^4.6.0:
+  version "4.6.0"
+  resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184";
+
+code-point-at@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3...;
+
+colors@^1.1.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63";
+
+combine-lists@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/combine-lists/-/combine-lists-1.0.1.tgz#458c07e09e0d900fc28b70a3fec2dac...;
+  dependencies:
+    lodash "^4.5.0"
+
+combine-source-map@~0.7.1:
+  version "0.7.2"
+  resolved "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.7.2.tgz#0870312856b307a87cc4a...;
+  dependencies:
+    convert-source-map "~1.1.0"
+    inline-source-map "~0.6.0"
+    lodash.memoize "~3.0.3"
+    source-map "~0.5.3"
+
+combined-stream@^1.0.5, combined-stream@~1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c...;
+  dependencies:
+    delayed-stream "~1.0.0"
+
+commander@^2.9.0:
+  version "2.9.0"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d...;
+  dependencies:
+    graceful-readlink ">= 1.0.0"
+
+commondir@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253...;
+
[email protected]:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3...;
+
[email protected]:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af...;
+
[email protected]:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7...;
+
[email protected]:
+  version "0.0.3"
+  resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae...;
+
[email protected]:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d4...;
+
[email protected]:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.0.tgz#53f7d43c51c5e43f81c8fdd03321c63...;
+  dependencies:
+    inherits "~2.0.1"
+    readable-stream "~2.0.0"
+    typedarray "~0.0.5"
+
+concat-stream@^1.5.2:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e...;
+  dependencies:
+    inherits "^2.0.3"
+    readable-stream "^2.2.2"
+    typedarray "^0.0.6"
+
+concat-stream@~1.5.0, concat-stream@~1.5.1:
+  version "1.5.2"
+  resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.2.tgz#708978624d856af41a5a741defdd261...;
+  dependencies:
+    inherits "~2.0.1"
+    readable-stream "~2.0.0"
+    typedarray "~0.0.5"
+
+connect@^3.6.0:
+  version "3.6.2"
+  resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.2.tgz#694e8d20681bfe490282c8ab886be98f09f42fe7...;
+  dependencies:
+    debug "2.6.7"
+    finalhandler "1.0.3"
+    parseurl "~1.3.1"
+    utils-merge "1.0.0"
+
+console-browserify@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b2...;
+  dependencies:
+    date-now "^0.1.4"
+
+console-control-strings@^1.0.0, console-control-strings@~1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db...;
+
+constants-browserify@^1.0.0, constants-browserify@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aa...;
+
+content-type@~1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df...;
+
+convert-source-map@^1.1.0, convert-source-map@^1.1.3:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9...;
+
+convert-source-map@~1.1.0:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3...;
+
[email protected]:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb";
+
+core-js@^1.0.0:
+  version "1.2.7"
+  resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636...;
+
+core-js@^2.2.0, core-js@^2.4.0:
+  version "2.4.1"
+  resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e...;
+
+core-util-is@~1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754...;
+
+create-ecdh@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a3530...;
+  dependencies:
+    bn.js "^4.1.0"
+    elliptic "^6.0.0"
+
+create-hash@^1.1.0, create-hash@^1.1.1, create-hash@^1.1.2:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f581917...;
+  dependencies:
+    cipher-base "^1.0.1"
+    inherits "^2.0.1"
+    ripemd160 "^2.0.0"
+    sha.js "^2.4.0"
+
+create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
+  version "1.1.6"
+  resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.6.tgz#acb9e221a4e17bdb076e90657c42b93e372...;
+  dependencies:
+    cipher-base "^1.0.3"
+    create-hash "^1.1.0"
+    inherits "^2.0.1"
+    ripemd160 "^2.0.0"
+    safe-buffer "^5.0.1"
+    sha.js "^2.4.8"
+
[email protected]:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b...;
+  dependencies:
+    boom "2.x.x"
+
+crypto-browserify@^3.0.0, crypto-browserify@^3.11.0:
+  version "3.11.0"
+  resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.11.0.tgz#3652a0906ab9b2a7e0c3ce...;
+  dependencies:
+    browserify-cipher "^1.0.0"
+    browserify-sign "^4.0.0"
+    create-ecdh "^4.0.0"
+    create-hash "^1.1.0"
+    create-hmac "^1.1.0"
+    diffie-hellman "^5.0.0"
+    inherits "^2.0.1"
+    pbkdf2 "^3.0.3"
+    public-encrypt "^4.0.0"
+    randombytes "^2.0.0"
+
+css-select@~1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec...;
+  dependencies:
+    boolbase "~1.0.0"
+    css-what "2.1"
+    domutils "1.5.1"
+    nth-check "~1.0.1"
+
[email protected]:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd&...;
+
+custom-event@~1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5...;
+
+d@1:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f";
+  dependencies:
+    es5-ext "^0.10.9"
+
+dashdash@^1.12.0:
+  version "1.14.1"
+  resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0...;
+  dependencies:
+    assert-plus "^1.0.0"
+
+date-now@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b&...;
+
[email protected]:
+  version "0.7.4"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39";
+
[email protected]:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da";
+  dependencies:
+    ms "0.7.1"
+
[email protected]:
+  version "2.3.3"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c";
+  dependencies:
+    ms "0.7.2"
+
[email protected]:
+  version "2.6.7"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.7.tgz#92bad1f6d05bbb6bba22cca88bcd0ec894c2861e";
+  dependencies:
+    ms "2.0.0"
+
+debug@^2.1.1, debug@^2.2.0, debug@^2.4.5:
+  version "2.6.8"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc";
+  dependencies:
+    ms "2.0.0"
+
+decamelize@^1.0.0, decamelize@^1.1.1:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191...;
+
+deep-extend@~0.4.0:
+  version "0.4.2"
+  resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d...;
+
+deep-is@~0.1.3:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34...;
+
+define-properties@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb73719...;
+  dependencies:
+    foreach "^2.0.5"
+    object-keys "^1.0.8"
+
+defined@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693...;
+
+del@^2.0.2:
+  version "2.2.2"
+  resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8";
+  dependencies:
+    globby "^5.0.0"
+    is-path-cwd "^1.0.0"
+    is-path-in-cwd "^1.0.0"
+    object-assign "^4.0.1"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+    rimraf "^2.2.8"
+
+delayed-stream@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2...;
+
+delegates@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9...;
+
[email protected], depd@~1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3";
+
+deps-sort@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/deps-sort/-/deps-sort-2.0.0.tgz#091724902e84658260eb910748cccd1af6e21fb...;
+  dependencies:
+    JSONStream "^1.0.3"
+    shasum "^1.0.0"
+    subarg "^1.0.0"
+    through2 "^2.0.0"
+
+des.js@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc";
+  dependencies:
+    inherits "^2.0.1"
+    minimalistic-assert "^1.0.0"
+
+detect-indent@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a...;
+  dependencies:
+    repeating "^2.0.0"
+
+detective@^4.0.0:
+  version "4.5.0"
+  resolved "https://registry.yarnpkg.com/detective/-/detective-4.5.0.tgz#6e5a8c6b26e6c7a254b1c6b6d7490d98ec91edd...;
+  dependencies:
+    acorn "^4.0.3"
+    defined "^1.0.0"
+
+di@^0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c";
+
+diffie-hellman@^5.0.0:
+  version "5.0.2"
+  resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded...;
+  dependencies:
+    bn.js "^4.1.0"
+    miller-rabin "^4.0.0"
+    randombytes "^2.0.0"
+
+doctrine@^1.2.2:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa&...;
+  dependencies:
+    esutils "^2.0.2"
+    isarray "^1.0.0"
+
+doctrine@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.0.tgz#c73d8d2909d22291e1a007a395804da8b665fe63&...;
+  dependencies:
+    esutils "^2.0.2"
+    isarray "^1.0.0"
+
+dom-serialize@^2.2.0:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59...;
+  dependencies:
+    custom-event "~1.0.0"
+    ent "~2.2.0"
+    extend "^3.0.0"
+    void-elements "^2.0.0"
+
+dom-serializer@0, dom-serializer@~0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e29...;
+  dependencies:
+    domelementtype "~1.1.1"
+    entities "~1.1.1"
+
+domain-browser@^1.1.1, domain-browser@~1.1.0:
+  version "1.1.7"
+  resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b...;
+
+domelementtype@1, domelementtype@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e...;
+
+domelementtype@~1.1.1:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299...;
+
+domhandler@^2.3.0:
+  version "2.4.1"
+  resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.1.tgz#892e47000a99be55bbf3774ffea0561d8879c...;
+  dependencies:
+    domelementtype "1"
+
[email protected], domutils@^1.5.1:
+  version "1.5.1"
+  resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf&...;
+  dependencies:
+    dom-serializer "0"
+    domelementtype "1"
+
+duplexer2@^0.1.2, duplexer2@~0.1.0, duplexer2@~0.1.2:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc...;
+  dependencies:
+    readable-stream "^2.0.2"
+
+ecc-jsbn@~0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505&...;
+  dependencies:
+    jsbn "~0.1.0"
+
[email protected]:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d&...;
+
+elliptic@^6.0.0:
+  version "6.4.0"
+  resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df&...;
+  dependencies:
+    bn.js "^4.4.0"
+    brorand "^1.0.1"
+    hash.js "^1.0.0"
+    hmac-drbg "^1.0.0"
+    inherits "^2.0.1"
+    minimalistic-assert "^1.0.0"
+    minimalistic-crypto-utils "^1.0.0"
+
+emojis-list@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1...;
+
+encodeurl@~1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d2...;
+
+encoding@^0.1.11:
+  version "0.1.12"
+  resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb...;
+  dependencies:
+    iconv-lite "~0.4.13"
+
[email protected]:
+  version "1.8.3"
+  resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.3.tgz#1798ed93451246453d4c6f635...;
+  dependencies:
+    component-emitter "1.2.1"
+    component-inherit "0.0.3"
+    debug "2.3.3"
+    engine.io-parser "1.3.2"
+    has-cors "1.1.0"
+    indexof "0.0.1"
+    parsejson "0.0.3"
+    parseqs "0.0.5"
+    parseuri "0.0.5"
+    ws "1.1.2"
+    xmlhttprequest-ssl "1.5.3"
+    yeast "0.1.2"
+
[email protected]:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-1.3.2.tgz#937b079f0007d0893ec56d46c...;
+  dependencies:
+    after "0.8.2"
+    arraybuffer.slice "0.0.6"
+    base64-arraybuffer "0.1.5"
+    blob "0.0.4"
+    has-binary "0.1.7"
+    wtf-8 "1.0.0"
+
[email protected]:
+  version "1.8.3"
+  resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-1.8.3.tgz#8de7f97895d20d39b85f88eeee777b2bd42b13d...;
+  dependencies:
+    accepts "1.3.3"
+    base64id "1.0.0"
+    cookie "0.3.1"
+    debug "2.3.3"
+    engine.io-parser "1.3.2"
+    ws "1.1.2"
+
+enhanced-resolve@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.1.0.tgz#9f4b626f577245edcf4b2ad83...;
+  dependencies:
+    graceful-fs "^4.1.2"
+    memory-fs "^0.4.0"
+    object-assign "^4.0.1"
+    tapable "^0.2.5"
+
+ent@~2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d";
+
+entities@^1.1.1, entities@~1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0&...;
+
+enzyme@~2.8.2:
+  version "2.8.2"
+  resolved "https://registry.yarnpkg.com/enzyme/-/enzyme-2.8.2.tgz#6c8bcb05012abc4aa4bc3213fb23780b9b5b1714";
+  dependencies:
+    cheerio "^0.22.0"
+    function.prototype.name "^1.0.0"
+    is-subset "^0.1.1"
+    lodash "^4.17.2"
+    object-is "^1.0.1"
+    object.assign "^4.0.4"
+    object.entries "^1.0.3"
+    object.values "^1.0.3"
+    prop-types "^15.5.4"
+    uuid "^2.0.3"
+
+errno@^0.1.3:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d";
+  dependencies:
+    prr "~0.0.0"
+
+error-ex@^1.2.0:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc&...;
+  dependencies:
+    is-arrayish "^0.2.1"
+
+es-abstract@^1.6.1, es-abstract@^1.7.0:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.7.0.tgz#dfade774e01bfcd97f96180298c449c8623...;
+  dependencies:
+    es-to-primitive "^1.1.1"
+    function-bind "^1.1.0"
+    is-callable "^1.1.3"
+    is-regex "^1.0.3"
+
+es-to-primitive@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb...;
+  dependencies:
+    is-callable "^1.1.1"
+    is-date-object "^1.0.1"
+    is-symbol "^1.0.1"
+
+es5-ext@^0.10.14, es5-ext@^0.10.9, es5-ext@~0.10.14:
+  version "0.10.23"
+  resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.23.tgz#7578b51be974207a5487821b56538c224e4e7b38&...;
+  dependencies:
+    es6-iterator "2"
+    es6-symbol "~3.1"
+
+es6-iterator@2, es6-iterator@^2.0.1, es6-iterator@~2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.1.tgz#8e319c9f0453bf575d374940a655920e5...;
+  dependencies:
+    d "1"
+    es5-ext "^0.10.14"
+    es6-symbol "^3.1"
+
+es6-map@^0.1.3:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0...;
+  dependencies:
+    d "1"
+    es5-ext "~0.10.14"
+    es6-iterator "~2.0.1"
+    es6-set "~0.1.5"
+    es6-symbol "~3.1.1"
+    event-emitter "~0.3.5"
+
+es6-promise@~4.0.3:
+  version "4.0.5"
+  resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.0.5.tgz#7882f30adde5b240ccfa7f7d78c54833095...;
+
+es6-set@~0.1.5:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1...;
+  dependencies:
+    d "1"
+    es5-ext "~0.10.14"
+    es6-iterator "~2.0.1"
+    es6-symbol "3.1.1"
+    event-emitter "~0.3.5"
+
[email protected], es6-symbol@^3.1, es6-symbol@^3.1.1, es6-symbol@~3.1, es6-symbol@~3.1.1:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715c...;
+  dependencies:
+    d "1"
+    es5-ext "~0.10.14"
+
+es6-weak-map@^2.0.1:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772...;
+  dependencies:
+    d "1"
+    es5-ext "^0.10.14"
+    es6-iterator "^2.0.1"
+    es6-symbol "^3.1.1"
+
+escape-html@~1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1...;
+
+escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff...;
+
+escope@^3.6.0:
+  version "3.6.0"
+  resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3";
+  dependencies:
+    es6-map "^0.1.3"
+    es6-weak-map "^2.0.1"
+    esrecurse "^4.1.0"
+    estraverse "^4.1.1"
+
+eslint-plugin-react@^6.10.3:
+  version "6.10.3"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-6.10.3.tgz#c5435beb06774e12c7...;
+  dependencies:
+    array.prototype.find "^2.0.1"
+    doctrine "^1.2.2"
+    has "^1.0.1"
+    jsx-ast-utils "^1.3.4"
+    object.assign "^4.0.4"
+
+eslint@^3.19.0:
+  version "3.19.0"
+  resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.19.0.tgz#c8fc6201c7f40dd08941b87c085767386a679acc";
+  dependencies:
+    babel-code-frame "^6.16.0"
+    chalk "^1.1.3"
+    concat-stream "^1.5.2"
+    debug "^2.1.1"
+    doctrine "^2.0.0"
+    escope "^3.6.0"
+    espree "^3.4.0"
+    esquery "^1.0.0"
+    estraverse "^4.2.0"
+    esutils "^2.0.2"
+    file-entry-cache "^2.0.0"
+    glob "^7.0.3"
+    globals "^9.14.0"
+    ignore "^3.2.0"
+    imurmurhash "^0.1.4"
+    inquirer "^0.12.0"
+    is-my-json-valid "^2.10.0"
+    is-resolvable "^1.0.0"
+    js-yaml "^3.5.1"
+    json-stable-stringify "^1.0.0"
+    levn "^0.3.0"
+    lodash "^4.0.0"
+    mkdirp "^0.5.0"
+    natural-compare "^1.4.0"
+    optionator "^0.8.2"
+    path-is-inside "^1.0.1"
+    pluralize "^1.2.1"
+    progress "^1.1.8"
+    require-uncached "^1.0.2"
+    shelljs "^0.7.5"
+    strip-bom "^3.0.0"
+    strip-json-comments "~2.0.1"
+    table "^3.7.8"
+    text-table "~0.2.0"
+    user-home "^2.0.0"
+
+espree@^3.4.0:
+  version "3.4.3"
+  resolved "https://registry.yarnpkg.com/espree/-/espree-3.4.3.tgz#2910b5ccd49ce893c2ffffaab4fd8b3a31b82374";
+  dependencies:
+    acorn "^5.0.1"
+    acorn-jsx "^3.0.0"
+
+esprima@^3.1.1:
+  version "3.1.3"
+  resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633...;
+
+esquery@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa...;
+  dependencies:
+    estraverse "^4.0.0"
+
+esrecurse@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.1.0.tgz#4713b6536adf7f2ac4f327d559e7756bff64822...;
+  dependencies:
+    estraverse "~4.1.0"
+    object-assign "^4.0.1"
+
+estraverse@^4.0.0, estraverse@^4.1.1, estraverse@^4.2.0:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bd...;
+
+estraverse@~4.1.0:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.1.1.tgz#f6caca728933a850ef90661d0e17982ba4711...;
+
+esutils@^2.0.0, esutils@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b...;
+
+event-emitter@~0.3.5:
+  version "0.3.5"
+  resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce838406...;
+  dependencies:
+    d "1"
+    es5-ext "~0.10.14"
+
[email protected]:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224e...;
+
+events@^1.0.0, events@~1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924";
+
+evp_bytestokey@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz#497b66ad9fef65cd7c08a6180824b...;
+  dependencies:
+    create-hash "^1.1.1"
+
+exit-hook@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff...;
+
+expand-braces@^0.1.1:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/expand-braces/-/expand-braces-0.1.2.tgz#488b1d1d2451cb3d3a6b192cfc030f4...;
+  dependencies:
+    array-slice "^0.2.3"
+    array-unique "^0.2.1"
+    braces "^0.1.2"
+
+expand-brackets@^0.1.4:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72...;
+  dependencies:
+    is-posix-bracket "^0.1.0"
+
+expand-range@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-0.1.1.tgz#4cb8eda0993ca56fa4f41fc42f3cbb4cc...;
+  dependencies:
+    is-number "^0.1.1"
+    repeat-string "^0.2.2"
+
+expand-range@^1.8.1:
+  version "1.8.2"
+  resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644...;
+  dependencies:
+    fill-range "^2.1.0"
+
+exports-loader@~0.6.4:
+  version "0.6.4"
+  resolved "https://registry.yarnpkg.com/exports-loader/-/exports-loader-0.6.4.tgz#d70fc6121975b35fc12830cf52754...;
+  dependencies:
+    loader-utils "^1.0.2"
+    source-map "0.5.x"
+
+extend@^3.0.0, extend@~3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444";
+
+extglob@^0.3.1:
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1...;
+  dependencies:
+    is-extglob "^1.0.0"
+
+extract-zip@~1.5.0:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.5.0.tgz#92ccf6d81ef70a9fa4c1747114ccef6d868...;
+  dependencies:
+    concat-stream "1.5.0"
+    debug "0.7.4"
+    mkdirp "0.5.0"
+    yauzl "2.4.1"
+
[email protected]:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd...;
+
+fast-levenshtein@~2.0.4:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e8...;
+
+fbjs@^0.8.1, fbjs@^0.8.4, fbjs@^0.8.9:
+  version "0.8.12"
+  resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.12.tgz#10b5d92f76d45575fd63a217d4ea02bea2f8ed04";
+  dependencies:
+    core-js "^1.0.0"
+    isomorphic-fetch "^2.1.1"
+    loose-envify "^1.0.0"
+    object-assign "^4.1.0"
+    promise "^7.1.1"
+    setimmediate "^1.0.5"
+    ua-parser-js "^0.7.9"
+
+fd-slicer@~1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e6...;
+  dependencies:
+    pend "~1.2.0"
+
+figures@^1.3.5:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e...;
+  dependencies:
+    escape-string-regexp "^1.0.5"
+    object-assign "^4.1.0"
+
+file-entry-cache@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84...;
+  dependencies:
+    flat-cache "^1.2.1"
+    object-assign "^4.0.1"
+
+filename-regex@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e3...;
+
+fill-range@^2.1.0:
+  version "2.2.3"
+  resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a...;
+  dependencies:
+    is-number "^2.1.0"
+    isobject "^2.0.0"
+    randomatic "^1.1.3"
+    repeat-element "^1.1.2"
+    repeat-string "^1.5.2"
+
[email protected]:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.3.tgz#ef47e77950e999780e86022a560e3217e...;
+  dependencies:
+    debug "2.6.7"
+    encodeurl "~1.0.1"
+    escape-html "~1.0.3"
+    on-finished "~2.3.0"
+    parseurl "~1.3.1"
+    statuses "~1.3.1"
+    unpipe "~1.0.0"
+
+find-cache-dir@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c...;
+  dependencies:
+    commondir "^1.0.1"
+    mkdirp "^0.5.1"
+    pkg-dir "^1.0.0"
+
+find-up@^1.0.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f...;
+  dependencies:
+    path-exists "^2.0.0"
+    pinkie-promise "^2.0.0"
+
+flat-cache@^1.2.1:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.2.tgz#fa86714e72c21db88601761ecf2f555d1abc6...;
+  dependencies:
+    circular-json "^0.3.1"
+    del "^2.0.2"
+    graceful-fs "^4.1.2"
+    write "^0.2.1"
+
+follow-redirects@^1.2.3:
+  version "1.2.3"
+  resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.2.3.tgz#01abaeca85e3609837d9fcda3...;
+  dependencies:
+    debug "^2.4.5"
+
+for-in@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80";
+
+for-own@^0.1.4:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce...;
+  dependencies:
+    for-in "^1.0.1"
+
+foreach@^2.0.5:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99...;
+
+forever-agent@~0.6.1:
+  version "0.6.1"
+  resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d...;
+
+form-data@~2.1.1:
+  version "2.1.4"
+  resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d...;
+  dependencies:
+    asynckit "^0.4.0"
+    combined-stream "^1.0.5"
+    mime-types "^2.1.12"
+
+fs-extra@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950&...;
+  dependencies:
+    graceful-fs "^4.1.2"
+    jsonfile "^2.1.0"
+    klaw "^1.0.0"
+
+fs.realpath@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb0141199...;
+
+fsevents@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.1.tgz#f19fd28f43eeaf761680e519a203c4d0b3d31aff&...;
+  dependencies:
+    nan "^2.3.0"
+    node-pre-gyp "^0.6.29"
+
+fstream-ignore@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada...;
+  dependencies:
+    fstream "^1.0.0"
+    inherits "2"
+    minimatch "^3.0.0"
+
+fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2:
+  version "1.0.11"
+  resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171&#...;
+  dependencies:
+    graceful-fs "^4.1.2"
+    inherits "~2.0.0"
+    mkdirp ">=0.5 0"
+    rimraf "2"
+
+function-bind@^1.0.2, function-bind@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f752946...;
+
+function.prototype.name@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.0.0.tgz#5f523ca64e4...;
+  dependencies:
+    define-properties "^1.1.2"
+    function-bind "^1.1.0"
+    is-callable "^1.1.2"
+
+gauge@~2.7.3:
+  version "2.7.4"
+  resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7";
+  dependencies:
+    aproba "^1.0.3"
+    console-control-strings "^1.0.0"
+    has-unicode "^2.0.0"
+    object-assign "^4.1.0"
+    signal-exit "^3.0.0"
+    string-width "^1.0.1"
+    strip-ansi "^3.0.1"
+    wide-align "^1.1.0"
+
+generate-function@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e909333...;
+
+generate-object-property@^1.1.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c403...;
+  dependencies:
+    is-property "^1.0.0"
+
+get-caller-file@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c155...;
+
+getpass@^0.1.1:
+  version "0.1.7"
+  resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa...;
+  dependencies:
+    assert-plus "^1.0.0"
+
+glob-base@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c...;
+  dependencies:
+    glob-parent "^2.0.0"
+    is-glob "^2.0.0"
+
+glob-parent@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6e...;
+  dependencies:
+    is-glob "^2.0.0"
+
+glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.0, glob@^7.1.1:
+  version "7.1.2"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15";
+  dependencies:
+    fs.realpath "^1.0.0"
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "^3.0.4"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
+globals@^9.0.0, globals@^9.14.0:
+  version "9.18.0"
+  resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a&#...;
+
+globby@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d";
+  dependencies:
+    array-union "^1.0.1"
+    arrify "^1.0.0"
+    glob "^7.0.3"
+    object-assign "^4.0.1"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+
+graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9:
+  version "4.1.11"
+  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a02...;
+
+"graceful-readlink@>= 1.0.0":
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f...;
+
+har-schema@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c01513...;
+
+har-validator@~2.0.6:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70e...;
+  dependencies:
+    chalk "^1.1.1"
+    commander "^2.9.0"
+    is-my-json-valid "^2.12.4"
+    pinkie-promise "^2.0.0"
+
+har-validator@~4.2.1:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5...;
+  dependencies:
+    ajv "^4.9.1"
+    har-schema "^1.0.5"
+
+has-ansi@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91&...;
+  dependencies:
+    ansi-regex "^2.0.0"
+
[email protected]:
+  version "0.1.7"
+  resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.7.tgz#68e61eb16210c9545a0a5cce06a873912fe1e...;
+  dependencies:
+    isarray "0.0.1"
+
[email protected]:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39&...;
+
+has-flag@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa&...;
+
+has-unicode@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de...;
+
+has@^1.0.0, has@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28";
+  dependencies:
+    function-bind "^1.0.2"
+
+hash-base@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e...;
+  dependencies:
+    inherits "^2.0.1"
+
+hash.js@^1.0.0, hash.js@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.0.3.tgz#1332ff00156c0a0ffdd8236013d07b77a0451573...;
+  dependencies:
+    inherits "^2.0.1"
+
+hasha@~2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/hasha/-/hasha-2.2.0.tgz#78d7cbfc1e6d66303fe79837365984517b2f6ee1";
+  dependencies:
+    is-stream "^1.0.1"
+    pinkie-promise "^2.0.0"
+
+hat@^0.0.3:
+  version "0.0.3"
+  resolved "https://registry.yarnpkg.com/hat/-/hat-0.0.3.tgz#bb014a9e64b3788aed8005917413d4ff3d502d8a";
+
+hawk@~3.1.3:
+  version "3.1.3"
+  resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4";
+  dependencies:
+    boom "2.x.x"
+    cryptiles "2.x.x"
+    hoek "2.x.x"
+    sntp "1.x.x"
+
+hmac-drbg@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a...;
+  dependencies:
+    hash.js "^1.0.3"
+    minimalistic-assert "^1.0.0"
+    minimalistic-crypto-utils "^1.0.1"
+
[email protected]:
+  version "2.16.3"
+  resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed";
+
+home-or-tmp@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a78...;
+  dependencies:
+    os-homedir "^1.0.0"
+    os-tmpdir "^1.0.1"
+
+hosted-git-info@^2.1.4:
+  version "2.4.2"
+  resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.4.2.tgz#0076b9f46a270506ddbaaea5649...;
+
+htmlescape@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/htmlescape/-/htmlescape-1.1.1.tgz#3a03edc2214bca3b66424a3e7959349509cb0...;
+
+htmlparser2@^3.9.1:
+  version "3.9.2"
+  resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.9.2.tgz#1bdf87acca0f3f9e53fa4fcceb0f4b4cbb0...;
+  dependencies:
+    domelementtype "^1.3.0"
+    domhandler "^2.3.0"
+    domutils "^1.5.1"
+    entities "^1.1.1"
+    inherits "^2.0.1"
+    readable-stream "^2.0.2"
+
+http-errors@~1.6.1:
+  version "1.6.1"
+  resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.1.tgz#5f8b8ed98aca545656bf572997387f904a7...;
+  dependencies:
+    depd "1.1.0"
+    inherits "2.0.3"
+    setprototypeof "1.0.3"
+    statuses ">= 1.3.1 < 2"
+
+http-proxy@^1.13.0:
+  version "1.16.2"
+  resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f3...;
+  dependencies:
+    eventemitter3 "1.x.x"
+    requires-port "1.x.x"
+
+http-signature@~1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e13...;
+  dependencies:
+    assert-plus "^0.2.0"
+    jsprim "^1.2.2"
+    sshpk "^1.7.0"
+
[email protected], https-browserify@~0.0.0:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24...;
+
[email protected], iconv-lite@~0.4.13:
+  version "0.4.15"
+  resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825e...;
+
+ieee754@^1.1.4:
+  version "1.1.8"
+  resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4...;
+
+ignore@^3.2.0:
+  version "3.3.3"
+  resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.3.tgz#432352e57accd87ab3110e82d3fea0e47812156d";
+
+"imports-loader@git+https://github.com/webpack-contrib/imports-loader.git#44d6f48463b256a17c1ba6fd9b5cc1449b4e379d";:
+  version "0.7.1"
+  resolved "git+https://github.com/webpack-contrib/imports-loader.git#44d6f48463b256a17c1ba6fd9b5cc1449b4e379d";
+  dependencies:
+    loader-utils "^1.0.2"
+    source-map "^0.5.6"
+
+imurmurhash@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231...;
+
[email protected]:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d...;
+
+inflight@^1.0.4:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9&...;
+  dependencies:
+    once "^1.3.0"
+    wrappy "1"
+
+inherits@2, [email protected], inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de&...;
+
[email protected]:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1&...;
+
+ini@~1.3.0:
+  version "1.3.4"
+  resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e";
+
+inline-source-map@~0.6.0:
+  version "0.6.2"
+  resolved "https://registry.yarnpkg.com/inline-source-map/-/inline-source-map-0.6.2.tgz#f9393471c18a79d1724f863...;
+  dependencies:
+    source-map "~0.5.3"
+
+inquirer@^0.12.0:
+  version "0.12.0"
+  resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e...;
+  dependencies:
+    ansi-escapes "^1.1.0"
+    ansi-regex "^2.0.0"
+    chalk "^1.0.0"
+    cli-cursor "^1.0.1"
+    cli-width "^2.0.0"
+    figures "^1.3.5"
+    lodash "^4.3.0"
+    readline2 "^1.0.1"
+    run-async "^0.1.0"
+    rx-lite "^3.1.2"
+    string-width "^1.0.1"
+    strip-ansi "^3.0.0"
+    through "^2.3.6"
+
+insert-module-globals@^7.0.0:
+  version "7.0.1"
+  resolved "https://registry.yarnpkg.com/insert-module-globals/-/insert-module-globals-7.0.1.tgz#c03bf4e01cb086d...;
+  dependencies:
+    JSONStream "^1.0.3"
+    combine-source-map "~0.7.1"
+    concat-stream "~1.5.1"
+    is-buffer "^1.1.0"
+    lexical-scope "^1.2.0"
+    process "~0.11.0"
+    through2 "^2.0.0"
+    xtend "^4.0.0"
+
+interpret@^1.0.0:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.3.tgz#cbc35c62eeee73f19ab7b10a801511401afc0f9...;
+
+invariant@^2.2.0:
+  version "2.2.2"
+  resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae6036...;
+  dependencies:
+    loose-envify "^1.0.0"
+
+invert-kv@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb...;
+
+is-arrayish@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a9...;
+
+is-binary-path@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd...;
+  dependencies:
+    binary-extensions "^1.0.0"
+
+is-buffer@^1.1.0, is-buffer@^1.1.5:
+  version "1.1.5"
+  resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eec...;
+
+is-builtin-module@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c...;
+  dependencies:
+    builtin-modules "^1.0.0"
+
+is-callable@^1.1.1, is-callable@^1.1.2, is-callable@^1.1.3:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7...;
+
+is-date-object@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01...;
+
+is-dotfile@^1.0.0:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a...;
+
+is-equal-shallow@^0.1.3:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac...;
+  dependencies:
+    is-primitive "^2.0.0"
+
+is-extendable@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472...;
+
+is-extglob@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc620...;
+
+is-finite@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0a...;
+  dependencies:
+    number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f0...;
+  dependencies:
+    number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f1...;
+
+is-glob@^2.0.0, is-glob@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863...;
+  dependencies:
+    is-extglob "^1.0.0"
+
+is-my-json-valid@^2.10.0, is-my-json-valid@^2.12.4:
+  version "2.16.0"
+  resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz#f079dd9bfdae65ee2038aae8...;
+  dependencies:
+    generate-function "^2.0.0"
+    generate-object-property "^1.1.0"
+    jsonpointer "^4.0.0"
+    xtend "^4.0.0"
+
+is-number@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/is-number/-/is-number-0.1.1.tgz#69a7af116963d47206ec9bd9b48a14216f1e380...;
+
+is-number@^2.0.2, is-number@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908...;
+  dependencies:
+    kind-of "^3.0.2"
+
+is-path-cwd@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f...;
+
+is-path-in-cwd@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003b...;
+  dependencies:
+    is-path-inside "^1.0.0"
+
+is-path-inside@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717b...;
+  dependencies:
+    path-is-inside "^1.0.1"
+
+is-posix-bracket@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fb...;
+
+is-primitive@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a8721...;
+
+is-property@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095...;
+
+is-regex@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491&...;
+  dependencies:
+    has "^1.0.1"
+
+is-resolvable@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf...;
+  dependencies:
+    tryit "^1.0.1"
+
+is-stream@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca4...;
+
+is-subset@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a...;
+
+is-symbol@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b66057...;
+
+is-typedarray@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f9601...;
+
+is-utf8@^0.2.0:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72...;
+
[email protected], isarray@~0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf...;
+
[email protected], isarray@^1.0.0, isarray@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11...;
+
+isbinaryfile@^3.0.0:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69...;
+
+isexe@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10";
+
+isobject@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89&...;
+  dependencies:
+    isarray "1.0.0"
+
+isomorphic-fetch@^2.1.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f72950747...;
+  dependencies:
+    node-fetch "^1.0.1"
+    whatwg-fetch ">=0.10.0"
+
+isstream@~0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a&...;
+
+jasmine-core@~2.5.2:
+  version "2.5.2"
+  resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-2.5.2.tgz#6f61bd79061e27f43e6f9355e44b3c6ca...;
+
+jodid25519@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782...;
+  dependencies:
+    jsbn "~0.1.0"
+
+js-string-escape@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1...;
+
+js-tokens@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d...;
+
+js-yaml@^3.5.1:
+  version "3.8.4"
+  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.4.tgz#520b4564f86573ba96662af85a8cafa7b4b5a6f6...;
+  dependencies:
+    argparse "^1.0.7"
+    esprima "^3.1.1"
+
+jsbn@~0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513";
+
+jsesc@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b";
+
+jsesc@~0.5.0:
+  version "0.5.0"
+  resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d";
+
+json-loader@^0.5.4:
+  version "0.5.4"
+  resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.4.tgz#8baa1365a632f58a3c46d20175fc6002c96...;
+
[email protected]:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882...;
+
+json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff5...;
+  dependencies:
+    jsonify "~0.0.0"
+
+json-stable-stringify@~0.0.0:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz#611c23e814db375...;
+  dependencies:
+    jsonify "~0.0.0"
+
+json-stringify-safe@~5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f...;
+
[email protected]:
+  version "3.3.2"
+  resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1";
+
+json5@^0.5.0:
+  version "0.5.1"
+  resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821";
+
+jsonfile@^2.1.0:
+  version "2.4.0"
+  resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8&...;
+  optionalDependencies:
+    graceful-fs "^4.1.6"
+
+jsonify@~0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73...;
+
+jsonparse@^1.2.0:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f136628...;
+
+jsonpointer@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978...;
+
+jsprim@^1.2.2:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.0.tgz#a3b87e40298d8c380552d8cc7628a0bb95a22918";
+  dependencies:
+    assert-plus "1.0.0"
+    extsprintf "1.0.2"
+    json-schema "0.2.3"
+    verror "1.3.6"
+
+jsx-ast-utils@^1.3.4:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz#3867213e8dd79bf1e8f2300c0cfc1ef...;
+
+karma-babel-preprocessor@^6.0.1:
+  version "6.0.1"
+  resolved "https://registry.yarnpkg.com/karma-babel-preprocessor/-/karma-babel-preprocessor-6.0.1.tgz#7ae1d3e64...;
+  dependencies:
+    babel-core "^6.0.0"
+
+karma-browserify@~5.1.1:
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/karma-browserify/-/karma-browserify-5.1.1.tgz#f642d70d776d9ab3b73526c57...;
+  dependencies:
+    convert-source-map "^1.1.3"
+    hat "^0.0.3"
+    js-string-escape "^1.0.0"
+    lodash "^3.10.1"
+    minimatch "^3.0.0"
+    os-shim "^0.1.3"
+
+karma-jasmine-html-reporter@~0.2.2:
+  version "0.2.2"
+  resolved "https://registry.yarnpkg.com/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-0.2.2.tgz#48a...;
+  dependencies:
+    karma-jasmine "^1.0.2"
+
+karma-jasmine@^1.0.2, karma-jasmine@~1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/karma-jasmine/-/karma-jasmine-1.1.0.tgz#22e4c06bf9a182e5294d1f705e37338...;
+
+karma-phantomjs-launcher@~1.0.2:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/karma-phantomjs-launcher/-/karma-phantomjs-launcher-1.0.4.tgz#d23ca3480...;
+  dependencies:
+    lodash "^4.0.1"
+    phantomjs-prebuilt "^2.1.7"
+
+karma-requirejs@~1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/karma-requirejs/-/karma-requirejs-1.1.0.tgz#fddae2cb87d7ebc16fb02228935...;
+
+karma-sourcemap-loader@~0.3.7:
+  version "0.3.7"
+  resolved "https://registry.yarnpkg.com/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.7.tgz#91322c77f8f13...;
+  dependencies:
+    graceful-fs "^4.1.2"
+
+karma-webpack@~2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/karma-webpack/-/karma-webpack-2.0.3.tgz#39cebf5ca2580139b27f9ae69b78816...;
+  dependencies:
+    async "~0.9.0"
+    loader-utils "^0.2.5"
+    lodash "^3.8.0"
+    source-map "^0.1.41"
+    webpack-dev-middleware "^1.0.11"
+
+karma@~1.5.0:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/karma/-/karma-1.5.0.tgz#9c4c14f0400bef2c04c8e8e6bff59371025cc009";
+  dependencies:
+    bluebird "^3.3.0"
+    body-parser "^1.16.1"
+    chokidar "^1.4.1"
+    colors "^1.1.0"
+    combine-lists "^1.0.0"
+    connect "^3.6.0"
+    core-js "^2.2.0"
+    di "^0.0.1"
+    dom-serialize "^2.2.0"
+    expand-braces "^0.1.1"
+    glob "^7.1.1"
+    graceful-fs "^4.1.2"
+    http-proxy "^1.13.0"
+    isbinaryfile "^3.0.0"
+    lodash "^3.8.0"
+    log4js "^0.6.31"
+    mime "^1.3.4"
+    minimatch "^3.0.0"
+    optimist "^0.6.1"
+    qjobs "^1.1.4"
+    range-parser "^1.2.0"
+    rimraf "^2.6.0"
+    safe-buffer "^5.0.1"
+    socket.io "1.7.3"
+    source-map "^0.5.3"
+    tmp "0.0.31"
+    useragent "^2.1.12"
+
+kew@~0.7.0:
+  version "0.7.0"
+  resolved "https://registry.yarnpkg.com/kew/-/kew-0.7.0.tgz#79d93d2d33363d6fdd2970b335d9141ad591d79b";
+
+kind-of@^3.0.2:
+  version "3.2.2"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64...;
+  dependencies:
+    is-buffer "^1.1.5"
+
+klaw@^1.0.0:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439";
+  optionalDependencies:
+    graceful-fs "^4.1.9"
+
+labeled-stream-splicer@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/labeled-stream-splicer/-/labeled-stream-splicer-2.0.0.tgz#a52e1d138024c...;
+  dependencies:
+    inherits "^2.0.1"
+    isarray "~0.0.1"
+    stream-splicer "^2.0.0"
+
+lazy-cache@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446...;
+
+lcid@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835";
+  dependencies:
+    invert-kv "^1.0.0"
+
+levn@^0.3.0, levn@~0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee";
+  dependencies:
+    prelude-ls "~1.1.2"
+    type-check "~0.3.2"
+
+lexical-scope@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/lexical-scope/-/lexical-scope-1.2.0.tgz#fcea5edc704a4b3a8796cdca419c3a0...;
+  dependencies:
+    astw "^2.0.0"
+
+load-json-file@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59...;
+  dependencies:
+    graceful-fs "^4.1.2"
+    parse-json "^2.2.0"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+    strip-bom "^2.0.0"
+
+loader-runner@^2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26...;
+
+loader-utils@^0.2.16, loader-utils@^0.2.5:
+  version "0.2.17"
+  resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c02...;
+  dependencies:
+    big.js "^3.1.3"
+    emojis-list "^2.0.0"
+    json5 "^0.5.0"
+    object-assign "^4.0.1"
+
+loader-utils@^1.0.2:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754...;
+  dependencies:
+    big.js "^3.1.3"
+    emojis-list "^2.0.0"
+    json5 "^0.5.0"
+
+lodash.assignin@^4.0.9:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e...;
+
+lodash.bind@^4.1.4:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db16...;
+
+lodash.defaults@^4.0.1:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f...;
+
+lodash.filter@^4.4.0:
+  version "4.6.0"
+  resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e4...;
+
+lodash.flatten@^4.2.0:
+  version "4.4.0"
+  resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef2...;
+
+lodash.foreach@^4.3.0:
+  version "4.5.0"
+  resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec351...;
+
+lodash.map@^4.4.0:
+  version "4.6.0"
+  resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f...;
+
+lodash.memoize@~3.0.3:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-3.0.4.tgz#2dcbd2c287cbc0a55cc42328bd0c7...;
+
+lodash.merge@^4.4.0:
+  version "4.6.0"
+  resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.0.tgz#69884ba144ac33fe699737a6086deffad...;
+
+lodash.pick@^4.2.1:
+  version "4.4.0"
+  resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03...;
+
+lodash.reduce@^4.4.0:
+  version "4.6.0"
+  resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f...;
+
+lodash.reject@^4.4.0:
+  version "4.6.0"
+  resolved "https://registry.yarnpkg.com/lodash.reject/-/lodash.reject-4.6.0.tgz#80d6492dc1470864bbf583533b651f4...;
+
+lodash.some@^4.4.0:
+  version "4.6.0"
+  resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb...;
+
+lodash@^3.10.1, lodash@^3.8.0:
+  version "3.10.1"
+  resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6";
+
+lodash@^4.0.0, lodash@^4.0.1, lodash@^4.14.0, lodash@^4.17.2, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.5.0:
+  version "4.17.4"
+  resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae";
+
+log4js@^0.6.31:
+  version "0.6.38"
+  resolved "https://registry.yarnpkg.com/log4js/-/log4js-0.6.38.tgz#2c494116695d6fb25480943d3fc872e662a522fd";
+  dependencies:
+    readable-stream "~1.0.2"
+    semver "~4.3.3"
+
+longest@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097...;
+
+loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d...;
+  dependencies:
+    js-tokens "^3.0.0"
+
[email protected]:
+  version "2.2.4"
+  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.2.4.tgz#6c658619becf14031d0d0b594b16042ce4dc063...;
+
[email protected]:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce001685452632...;
+
+memory-fs@^0.4.0, memory-fs@~0.4.1:
+  version "0.4.1"
+  resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc55...;
+  dependencies:
+    errno "^0.1.3"
+    readable-stream "^2.0.1"
+
+micromatch@^2.1.5:
+  version "2.3.11"
+  resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c...;
+  dependencies:
+    arr-diff "^2.0.0"
+    array-unique "^0.2.1"
+    braces "^1.8.2"
+    expand-brackets "^0.1.4"
+    extglob "^0.3.1"
+    filename-regex "^2.0.0"
+    is-extglob "^1.0.0"
+    is-glob "^2.0.1"
+    kind-of "^3.0.2"
+    normalize-path "^2.0.1"
+    object.omit "^2.0.0"
+    parse-glob "^3.0.4"
+    regex-cache "^0.4.2"
+
+miller-rabin@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.0.tgz#4a62fb1d42933c05583982f4c716f6fb9...;
+  dependencies:
+    bn.js "^4.0.0"
+    brorand "^1.0.1"
+
+mime-db@~1.27.0:
+  version "1.27.0"
+  resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1&#...;
+
+mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.7:
+  version "2.1.15"
+  resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc9...;
+  dependencies:
+    mime-db "~1.27.0"
+
+mime@^1.3.4:
+  version "1.3.6"
+  resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.6.tgz#591d84d3653a6b0b4a3b9df8de5aa8108e72e5e0";
+
+minimalistic-assert@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836b...;
+
+minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1...;
+
+minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d3208...;
+  dependencies:
+    brace-expansion "^1.1.7"
+
[email protected], minimist@~0.0.1:
+  version "0.0.8"
+  resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d&...;
+
+minimist@^1.1.0, minimist@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284&...;
+
[email protected]:
+  version "0.5.0"
+  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12";
+  dependencies:
+    minimist "0.0.8"
+
+"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0:
+  version "0.5.1"
+  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903";
+  dependencies:
+    minimist "0.0.8"
+
+module-deps@^4.0.8:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-4.1.1.tgz#23215833f1da13fd606ccb8087b44852dcb...;
+  dependencies:
+    JSONStream "^1.0.3"
+    browser-resolve "^1.7.0"
+    cached-path-relative "^1.0.0"
+    concat-stream "~1.5.0"
+    defined "^1.0.0"
+    detective "^4.0.0"
+    duplexer2 "^0.1.2"
+    inherits "^2.0.1"
+    parents "^1.0.0"
+    readable-stream "^2.0.2"
+    resolve "^1.1.3"
+    stream-combiner2 "^1.1.1"
+    subarg "^1.0.0"
+    through2 "^2.0.0"
+    xtend "^4.0.0"
+
[email protected]:
+  version "0.7.1"
+  resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098";
+
[email protected]:
+  version "0.7.2"
+  resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765";
+
[email protected]:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8";
+
[email protected]:
+  version "0.0.5"
+  resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372f...;
+
+nan@^2.3.0:
+  version "2.6.2"
+  resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45";
+
+natural-compare@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdb...;
+
[email protected]:
+  version "0.6.1"
+  resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0...;
+
+node-fetch@^1.0.1:
+  version "1.7.1"
+  resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.1.tgz#899cb3d0a3c92f952c47f1b876f4c8aeabd40...;
+  dependencies:
+    encoding "^0.1.11"
+    is-stream "^1.0.1"
+
+node-libs-browser@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.0.0.tgz#a3a59ec97024985b46e9583...;
+  dependencies:
+    assert "^1.1.1"
+    browserify-zlib "^0.1.4"
+    buffer "^4.3.0"
+    console-browserify "^1.1.0"
+    constants-browserify "^1.0.0"
+    crypto-browserify "^3.11.0"
+    domain-browser "^1.1.1"
+    events "^1.0.0"
+    https-browserify "0.0.1"
+    os-browserify "^0.2.0"
+    path-browserify "0.0.0"
+    process "^0.11.0"
+    punycode "^1.2.4"
+    querystring-es3 "^0.2.0"
+    readable-stream "^2.0.5"
+    stream-browserify "^2.0.1"
+    stream-http "^2.3.1"
+    string_decoder "^0.10.25"
+    timers-browserify "^2.0.2"
+    tty-browserify "0.0.0"
+    url "^0.11.0"
+    util "^0.10.3"
+    vm-browserify "0.0.4"
+
+node-pre-gyp@^0.6.29:
+  version "0.6.36"
+  resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz#db604112cb74e0d477554e9b505b17ab...;
+  dependencies:
+    mkdirp "^0.5.1"
+    nopt "^4.0.1"
+    npmlog "^4.0.2"
+    rc "^1.1.7"
+    request "^2.81.0"
+    rimraf "^2.6.1"
+    semver "^5.3.0"
+    tar "^2.2.1"
+    tar-pack "^3.4.0"
+
+nopt@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d";
+  dependencies:
+    abbrev "1"
+    osenv "^0.1.4"
+
+normalize-package-data@^2.3.2:
+  version "2.3.8"
+  resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.8.tgz#d819eda2a9ded...;
+  dependencies:
+    hosted-git-info "^2.1.4"
+    is-builtin-module "^1.0.0"
+    semver "2 || 3 || 4 || 5"
+    validate-npm-package-license "^3.0.1"
+
+normalize-path@^2.0.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa2...;
+  dependencies:
+    remove-trailing-separator "^1.0.1"
+
+npmlog@^4.0.2:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.0.tgz#dc59bee85f64f00ed424efb2af0783df25d1c0b5";
+  dependencies:
+    are-we-there-yet "~1.1.2"
+    console-control-strings "~1.1.0"
+    gauge "~2.7.3"
+    set-blocking "~2.0.0"
+
+nth-check@~1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae...;
+  dependencies:
+    boolbase "~1.0.0"
+
+number-is-nan@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb879031833...;
+
+oauth-sign@~0.8.1:
+  version "0.8.2"
+  resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9...;
+
[email protected]:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd5...;
+
+object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8b...;
+
[email protected]:
+  version "0.0.3"
+  resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f40...;
+
+object-is@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.1.tgz#0aa60ec9989a0b3ed795cf4d06f62cf1ad6539b...;
+
+object-keys@^1.0.10, object-keys@^1.0.8:
+  version "1.0.11"
+  resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d...;
+
+object.assign@^4.0.4:
+  version "4.0.4"
+  resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.0.4.tgz#b1c9cc044ef1b9fe63606fc141abbb3...;
+  dependencies:
+    define-properties "^1.1.2"
+    function-bind "^1.1.0"
+    object-keys "^1.0.10"
+
+object.entries@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.0.4.tgz#1bf9a4dd2288f5b33f3a993d25766...;
+  dependencies:
+    define-properties "^1.1.2"
+    es-abstract "^1.6.1"
+    function-bind "^1.1.0"
+    has "^1.0.1"
+
+object.omit@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54e...;
+  dependencies:
+    for-own "^0.1.4"
+    is-extendable "^0.1.1"
+
+object.values@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.0.4.tgz#e524da09b4f66ff05df457546ec72ac...;
+  dependencies:
+    define-properties "^1.1.2"
+    es-abstract "^1.6.1"
+    function-bind "^1.1.0"
+    has "^1.0.1"
+
+on-finished@~2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d9...;
+  dependencies:
+    ee-first "1.1.1"
+
+once@^1.3.0, once@^1.3.3:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1";
+  dependencies:
+    wrappy "1"
+
+onetime@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789...;
+
+optimist@^0.6.1:
+  version "0.6.1"
+  resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686&...;
+  dependencies:
+    minimist "~0.0.1"
+    wordwrap "~0.0.2"
+
+optionator@^0.8.2:
+  version "0.8.2"
+  resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180ae...;
+  dependencies:
+    deep-is "~0.1.3"
+    fast-levenshtein "~2.0.4"
+    levn "~0.3.0"
+    prelude-ls "~1.1.2"
+    type-check "~0.3.2"
+    wordwrap "~1.0.0"
+
+options@>=0.0.5:
+  version "0.0.6"
+  resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f...;
+
+os-browserify@^0.2.0:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.2.1.tgz#63fc4ccee5d2d7763d26bbf8601078e...;
+
+os-browserify@~0.1.1:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.1.2.tgz#49ca0293e0b19590a5f5de10c7f265a...;
+
+os-homedir@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7...;
+
+os-locale@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d...;
+  dependencies:
+    lcid "^1.0.0"
+
+os-shim@^0.1.3:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917...;
+
+os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa127...;
+
+osenv@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644";
+  dependencies:
+    os-homedir "^1.0.0"
+    os-tmpdir "^1.0.0"
+
+outpipe@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/outpipe/-/outpipe-1.1.1.tgz#50cf8616365e87e031e29a5ec9339a3da4725fa2...;
+  dependencies:
+    shell-quote "^1.4.2"
+
+pako@~0.2.0:
+  version "0.2.9"
+  resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75";
+
+parents@^1.0.0, parents@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/parents/-/parents-1.0.1.tgz#fedd4d2bf193a77745fe71e371d73c3307d9c751...;
+  dependencies:
+    path-platform "~0.11.15"
+
+parse-asn1@^5.0.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.0.tgz#37c4f9b7ed3ab65c74817b5f2480937fbf97c...;
+  dependencies:
+    asn1.js "^4.0.0"
+    browserify-aes "^1.0.0"
+    create-hash "^1.1.0"
+    evp_bytestokey "^1.0.0"
+    pbkdf2 "^3.0.3"
+
+parse-glob@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a3883...;
+  dependencies:
+    glob-base "^0.3.0"
+    is-dotfile "^1.0.0"
+    is-extglob "^1.0.0"
+    is-glob "^2.0.0"
+
+parse-json@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4...;
+  dependencies:
+    error-ex "^1.2.0"
+
[email protected]:
+  version "0.0.3"
+  resolved "https://registry.yarnpkg.com/parsejson/-/parsejson-0.0.3.tgz#ab7e3759f209ece99437973f7d0f1f64ae0e64a...;
+  dependencies:
+    better-assert "~1.0.0"
+
[email protected]:
+  version "0.0.5"
+  resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d...;
+  dependencies:
+    better-assert "~1.0.0"
+
[email protected]:
+  version "0.0.5"
+  resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a&...;
+  dependencies:
+    better-assert "~1.0.0"
+
+parseurl@~1.3.1:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56&...;
+
[email protected], path-browserify@~0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec...;
+
+path-exists@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c70227...;
+  dependencies:
+    pinkie-promise "^2.0.0"
+
+path-is-absolute@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf...;
+
+path-is-inside@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027fa...;
+
+path-parse@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c...;
+
+path-platform@~0.11.15:
+  version "0.11.15"
+  resolved "https://registry.yarnpkg.com/path-platform/-/path-platform-0.11.15.tgz#e864217f74c36850f0852b78dc7bf...;
+
+path-type@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe44...;
+  dependencies:
+    graceful-fs "^4.1.2"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+
+pbkdf2@^3.0.3:
+  version "3.0.12"
+  resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.12.tgz#be36785c5067ea48d806ff923288c5f750b6b8a2";
+  dependencies:
+    create-hash "^1.1.2"
+    create-hmac "^1.1.4"
+    ripemd160 "^2.0.1"
+    safe-buffer "^5.0.1"
+    sha.js "^2.4.8"
+
+pend@~1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50";
+
+performance-now@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d9...;
+
+phantomjs-prebuilt@^2.1.7:
+  version "2.1.14"
+  resolved "https://registry.yarnpkg.com/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.14.tgz#d53d311fcfb7d1d08ddb...;
+  dependencies:
+    es6-promise "~4.0.3"
+    extract-zip "~1.5.0"
+    fs-extra "~1.0.0"
+    hasha "~2.2.0"
+    kew "~0.7.0"
+    progress "~1.1.8"
+    request "~2.79.0"
+    request-progress "~2.0.1"
+    which "~1.2.10"
+
+pify@^2.0.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c";
+
+pinkie-promise@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b1787762...;
+  dependencies:
+    pinkie "^2.0.0"
+
+pinkie@^2.0.0:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870";
+
+pkg-dir@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4...;
+  dependencies:
+    find-up "^1.0.0"
+
+pluralize@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c4...;
+
+prelude-ls@~1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97d...;
+
+preserve@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b&...;
+
+private@^0.1.6:
+  version "0.1.7"
+  resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1...;
+
+process-nextick-args@~1.0.6:
+  version "1.0.7"
+  resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f...;
+
+process@^0.11.0, process@~0.11.0:
+  version "0.11.10"
+  resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182&...;
+
+progress@^1.1.8, progress@~1.1.8:
+  version "1.1.8"
+  resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be&...;
+
+promise@^7.1.1:
+  version "7.1.1"
+  resolved "https://registry.yarnpkg.com/promise/-/promise-7.1.1.tgz#489654c692616b8aa55b0724fa809bb7db49c5bf...;
+  dependencies:
+    asap "~2.0.3"
+
+prop-types@^15.5.4:
+  version "15.5.10"
+  resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.5.10.tgz#2797dfc3126182e3a95e3dfbb2e893ddd74...;
+  dependencies:
+    fbjs "^0.8.9"
+    loose-envify "^1.3.1"
+
+prr@~0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a";
+
+public-encrypt@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693ca...;
+  dependencies:
+    bn.js "^4.1.0"
+    browserify-rsa "^4.0.0"
+    create-hash "^1.1.0"
+    parse-asn1 "^5.0.0"
+    randombytes "^2.0.1"
+
[email protected]:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d&...;
+
+punycode@^1.2.4, punycode@^1.3.2, punycode@^1.4.1:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e&...;
+
+qjobs@^1.1.4:
+  version "1.1.5"
+  resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.1.5.tgz#659de9f2cf8dcc27a1481276f205377272382e73";
+
[email protected], qs@~6.4.0:
+  version "6.4.0"
+  resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233";
+
+qs@~6.3.0:
+  version "6.3.2"
+  resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c";
+
+querystring-es3@^0.2.0, querystring-es3@~0.2.0:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596f...;
+
[email protected]:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e7470058785...;
+
+randomatic@^1.1.3:
+  version "1.1.6"
+  resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec...;
+  dependencies:
+    is-number "^2.0.2"
+    kind-of "^3.0.2"
+
+randombytes@^2.0.0, randombytes@^2.0.1:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.4.tgz#9551df208422c8f80eb58e2326dd0b840ff...;
+  dependencies:
+    safe-buffer "^5.0.1"
+
+range-parser@^1.0.3, range-parser@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f61109...;
+
+raw-body@~2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.2.0.tgz#994976cf6a5096a41162840492f0bdc5d6e7fb96&...;
+  dependencies:
+    bytes "2.4.0"
+    iconv-lite "0.4.15"
+    unpipe "1.0.0"
+
+rc@^1.1.7:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95";
+  dependencies:
+    deep-extend "~0.4.0"
+    ini "~1.3.0"
+    minimist "^1.2.0"
+    strip-json-comments "~2.0.1"
+
+react-addons-test-utils@~15.4.2:
+  version "15.4.2"
+  resolved "https://registry.yarnpkg.com/react-addons-test-utils/-/react-addons-test-utils-15.4.2.tgz#93bcaa718f...;
+  dependencies:
+    fbjs "^0.8.4"
+    object-assign "^4.1.0"
+
+react-dom@~15.4.2:
+  version "15.4.2"
+  resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-15.4.2.tgz#015363f05b0a1fd52ae9efdd3a0060d9069520...;
+  dependencies:
+    fbjs "^0.8.1"
+    loose-envify "^1.1.0"
+    object-assign "^4.1.0"
+
+react@~15.4.2:
+  version "15.4.2"
+  resolved "https://registry.yarnpkg.com/react/-/react-15.4.2.tgz#41f7991b26185392ba9bae96c8889e7e018397ef";
+  dependencies:
+    fbjs "^0.8.4"
+    loose-envify "^1.1.0"
+    object-assign "^4.1.0"
+
+read-only-stream@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/read-only-stream/-/read-only-stream-2.0.0.tgz#2724fd6a8113d73764ac288d4...;
+  dependencies:
+    readable-stream "^2.0.2"
+
+read-pkg-up@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b64...;
+  dependencies:
+    find-up "^1.0.0"
+    read-pkg "^1.0.0"
+
+read-pkg@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28&...;
+  dependencies:
+    load-json-file "^1.0.0"
+    normalize-package-data "^2.3.2"
+    path-type "^1.0.0"
+
+readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.6:
+  version "2.2.11"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.11.tgz#0796b31f8d7688007ff0b93a80...;
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.1"
+    isarray "~1.0.0"
+    process-nextick-args "~1.0.6"
+    safe-buffer "~5.0.1"
+    string_decoder "~1.0.0"
+    util-deprecate "~1.0.1"
+
+readable-stream@~1.0.2:
+  version "1.0.34"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4...;
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.1"
+    isarray "0.0.1"
+    string_decoder "~0.10.x"
+
+readable-stream@~2.0.0:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfc...;
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.1"
+    isarray "~1.0.0"
+    process-nextick-args "~1.0.6"
+    string_decoder "~0.10.x"
+    util-deprecate "~1.0.1"
+
+readdirp@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78&...;
+  dependencies:
+    graceful-fs "^4.1.2"
+    minimatch "^3.0.2"
+    readable-stream "^2.0.2"
+    set-immediate-shim "^1.0.1"
+
+readline2@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e3...;
+  dependencies:
+    code-point-at "^1.0.0"
+    is-fullwidth-code-point "^1.0.0"
+    mute-stream "0.0.5"
+
+rechoir@^0.6.2:
+  version "0.6.2"
+  resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384...;
+  dependencies:
+    resolve "^1.1.6"
+
+regenerate@^1.2.1:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19...;
+
+regenerator-runtime@^0.10.0:
+  version "0.10.5"
+  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedd...;
+
[email protected]:
+  version "0.9.11"
+  resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.11.tgz#3a7d067520cb7b...;
+  dependencies:
+    babel-runtime "^6.18.0"
+    babel-types "^6.19.0"
+    private "^0.1.6"
+
+regex-cache@^0.4.2:
+  version "0.4.3"
+  resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d71...;
+  dependencies:
+    is-equal-shallow "^0.1.3"
+    is-primitive "^2.0.0"
+
+regexpu-core@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6e...;
+  dependencies:
+    regenerate "^1.2.1"
+    regjsgen "^0.2.0"
+    regjsparser "^0.1.4"
+
+regjsgen@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7&...;
+
+regjsparser@^0.1.4:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ea...;
+  dependencies:
+    jsesc "~0.5.0"
+
+remove-trailing-separator@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz#69b062d...;
+
+repeat-element@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f...;
+
+repeat-string@^0.2.2:
+  version "0.2.2"
+  resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-0.2.2.tgz#c7a8d3236068362059a7e4651fc6884...;
+
+repeat-string@^1.5.2:
+  version "1.6.1"
+  resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a77628...;
+
+repeating@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dd...;
+  dependencies:
+    is-finite "^1.0.0"
+
+request-progress@~2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-2.0.1.tgz#5d36bb57961c673aa5b788dbc...;
+  dependencies:
+    throttleit "^1.0.0"
+
+request@^2.81.0:
+  version "2.81.0"
+  resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0&#...;
+  dependencies:
+    aws-sign2 "~0.6.0"
+    aws4 "^1.2.1"
+    caseless "~0.12.0"
+    combined-stream "~1.0.5"
+    extend "~3.0.0"
+    forever-agent "~0.6.1"
+    form-data "~2.1.1"
+    har-validator "~4.2.1"
+    hawk "~3.1.3"
+    http-signature "~1.1.0"
+    is-typedarray "~1.0.0"
+    isstream "~0.1.2"
+    json-stringify-safe "~5.0.1"
+    mime-types "~2.1.7"
+    oauth-sign "~0.8.1"
+    performance-now "^0.2.0"
+    qs "~6.4.0"
+    safe-buffer "^5.0.1"
+    stringstream "~0.0.4"
+    tough-cookie "~2.3.0"
+    tunnel-agent "^0.6.0"
+    uuid "^3.0.0"
+
+request@~2.79.0:
+  version "2.79.0"
+  resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de&#...;
+  dependencies:
+    aws-sign2 "~0.6.0"
+    aws4 "^1.2.1"
+    caseless "~0.11.0"
+    combined-stream "~1.0.5"
+    extend "~3.0.0"
+    forever-agent "~0.6.1"
+    form-data "~2.1.1"
+    har-validator "~2.0.6"
+    hawk "~3.1.3"
+    http-signature "~1.1.0"
+    is-typedarray "~1.0.0"
+    isstream "~0.1.2"
+    json-stringify-safe "~5.0.1"
+    mime-types "~2.1.7"
+    oauth-sign "~0.8.1"
+    qs "~6.3.0"
+    stringstream "~0.0.4"
+    tough-cookie "~2.3.0"
+    tunnel-agent "~0.4.1"
+    uuid "^3.0.0"
+
+require-directory@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e234...;
+
+require-main-filename@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784...;
+
+require-uncached@^1.0.2:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4...;
+  dependencies:
+    caller-path "^0.1.0"
+    resolve-from "^1.0.0"
+
+requirejs@~2.3.3:
+  version "2.3.3"
+  resolved "https://registry.yarnpkg.com/requirejs/-/requirejs-2.3.3.tgz#aa59fd3a0287eaf407959a138228044b5dd6a6a...;
+
[email protected]:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e69...;
+
+resolve-from@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e9...;
+
[email protected]:
+  version "1.1.7"
+  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b...;
+
+resolve@^1.1.3, resolve@^1.1.4, resolve@^1.1.6:
+  version "1.3.3"
+  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.3.tgz#655907c3469a8680dc2de3a275a8fdd69691f0e5...;
+  dependencies:
+    path-parse "^1.0.5"
+
+restore-cursor@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed299147915225...;
+  dependencies:
+    exit-hook "^1.0.0"
+    onetime "^1.0.0"
+
+right-align@^0.1.1:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148...;
+  dependencies:
+    align-text "^0.1.1"
+
+rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.6.0, rimraf@^2.6.1:
+  version "2.6.1"
+  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d";
+  dependencies:
+    glob "^7.0.5"
+
+ripemd160@^2.0.0, ripemd160@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e...;
+  dependencies:
+    hash-base "^2.0.0"
+    inherits "^2.0.1"
+
+run-async@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e38...;
+  dependencies:
+    once "^1.3.0"
+
+rx-lite@^3.1.2:
+  version "3.1.2"
+  resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102...;
+
+safe-buffer@^5.0.1:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.0.tgz#fe4c8460397f9eaaaa58e73be46273408a4...;
+
+safe-buffer@~5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de5791...;
+
+"semver@2 || 3 || 4 || 5", semver@^5.3.0:
+  version "5.3.0"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f";
+
+semver@~4.3.3:
+  version "4.3.6"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da";
+
+set-blocking@^2.0.0, set-blocking@~2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b...;
+
+set-immediate-shim@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc4...;
+
+setimmediate@^1.0.4, setimmediate@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab78...;
+
[email protected]:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0c...;
+
+sha.js@^2.4.0, sha.js@^2.4.8, sha.js@~2.4.4:
+  version "2.4.8"
+  resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.8.tgz#37068c2c476b6baf402d14a49c67f597921f634f";
+  dependencies:
+    inherits "^2.0.1"
+
+shasum@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/shasum/-/shasum-1.0.2.tgz#e7012310d8f417f4deb5712150e5678b87ae565f";
+  dependencies:
+    json-stable-stringify "~0.0.0"
+    sha.js "~2.4.4"
+
+shell-quote@^1.4.2, shell-quote@^1.6.1:
+  version "1.6.1"
+  resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f4...;
+  dependencies:
+    array-filter "~0.0.0"
+    array-map "~0.0.0"
+    array-reduce "~0.0.0"
+    jsonify "~0.0.0"
+
+shelljs@^0.7.5:
+  version "0.7.8"
+  resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.8.tgz#decbcf874b0d1e5fb72e14b164a9683048e9acb3...;
+  dependencies:
+    glob "^7.0.0"
+    interpret "^1.0.0"
+    rechoir "^0.6.2"
+
+signal-exit@^3.0.0:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b736...;
+
+slash@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55";
+
[email protected]:
+  version "0.0.4"
+  resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831...;
+
[email protected]:
+  version "1.0.9"
+  resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198";
+  dependencies:
+    hoek "2.x.x"
+
[email protected]:
+  version "0.5.0"
+  resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz#cb6d4bb8bec81e1078b9967...;
+  dependencies:
+    debug "2.3.3"
+    socket.io-parser "2.3.1"
+
[email protected]:
+  version "1.7.3"
+  resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-1.7.3.tgz#b30e86aa10d5ef3546601c09c...;
+  dependencies:
+    backo2 "1.0.2"
+    component-bind "1.0.0"
+    component-emitter "1.2.1"
+    debug "2.3.3"
+    engine.io-client "1.8.3"
+    has-binary "0.1.7"
+    indexof "0.0.1"
+    object-component "0.0.3"
+    parseuri "0.0.5"
+    socket.io-parser "2.3.1"
+    to-array "0.1.4"
+
[email protected]:
+  version "2.3.1"
+  resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-2.3.1.tgz#dd532025103ce429697326bef...;
+  dependencies:
+    component-emitter "1.1.2"
+    debug "2.2.0"
+    isarray "0.0.1"
+    json3 "3.3.2"
+
[email protected]:
+  version "1.7.3"
+  resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-1.7.3.tgz#b8af9caba00949e568e369f1327ea9be9ea2461...;
+  dependencies:
+    debug "2.3.3"
+    engine.io "1.8.3"
+    has-binary "0.1.7"
+    object-assign "4.1.0"
+    socket.io-adapter "0.5.0"
+    socket.io-client "1.7.3"
+    socket.io-parser "2.3.1"
+
+source-list-map@^1.1.1:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-1.1.2.tgz#9889019d1024cce55cdc0694983...;
+
+source-map-support@^0.4.2:
+  version "0.4.15"
+  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.15.tgz#03202df65c06d2bd8c7e...;
+  dependencies:
+    source-map "^0.5.6"
+
[email protected], source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1, source-map@~0.5.3:
+  version "0.5.6"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f...;
+
+source-map@^0.1.41:
+  version "0.1.43"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e...;
+  dependencies:
+    amdefine ">=0.0.4"
+
+spdx-correct@~1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4...;
+  dependencies:
+    spdx-license-ids "^1.0.2"
+
+spdx-expression-parse@~1.0.0:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed...;
+
+spdx-license-ids@^1.0.2:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d...;
+
+sprintf-js@~1.0.2:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297...;
+
+sshpk@^1.7.0:
+  version "1.13.0"
+  resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.0.tgz#ff2a3e4fd04497555fed97b39a0fd82fafb3a33c";
+  dependencies:
+    asn1 "~0.2.3"
+    assert-plus "^1.0.0"
+    dashdash "^1.12.0"
+    getpass "^0.1.1"
+  optionalDependencies:
+    bcrypt-pbkdf "^1.0.0"
+    ecc-jsbn "~0.1.1"
+    jodid25519 "^1.0.0"
+    jsbn "~0.1.0"
+    tweetnacl "~0.14.0"
+
+"statuses@>= 1.3.1 < 2", statuses@~1.3.1:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e&...;
+
+stream-browserify@^2.0.0, stream-browserify@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e451...;
+  dependencies:
+    inherits "~2.0.1"
+    readable-stream "^2.0.2"
+
+stream-combiner2@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad47...;
+  dependencies:
+    duplexer2 "~0.1.0"
+    readable-stream "^2.0.2"
+
+stream-http@^2.0.0, stream-http@^2.3.1:
+  version "2.7.1"
+  resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.7.1.tgz#546a51741ad5a6b07e9e31b0b10441a917d...;
+  dependencies:
+    builtin-status-codes "^3.0.0"
+    inherits "^2.0.1"
+    readable-stream "^2.2.6"
+    to-arraybuffer "^1.0.0"
+    xtend "^4.0.0"
+
+stream-splicer@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/stream-splicer/-/stream-splicer-2.0.0.tgz#1b63be438a133e4b671cc19351976...;
+  dependencies:
+    inherits "^2.0.1"
+    readable-stream "^2.0.2"
+
+string-width@^1.0.1, string-width@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b...;
+  dependencies:
+    code-point-at "^1.0.0"
+    is-fullwidth-code-point "^1.0.0"
+    strip-ansi "^3.0.0"
+
+string-width@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2ee...;
+  dependencies:
+    is-fullwidth-code-point "^2.0.0"
+    strip-ansi "^3.0.0"
+
+string_decoder@^0.10.25, string_decoder@~0.10.0, string_decoder@~0.10.x:
+  version "0.10.31"
+  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301...;
+
+string_decoder@~1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.2.tgz#b29e1f4e1125fa97a10382b8a5337...;
+  dependencies:
+    safe-buffer "~5.0.1"
+
+stringstream@~0.0.4:
+  version "0.0.5"
+  resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a8...;
+
+strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63...;
+  dependencies:
+    ansi-regex "^2.0.0"
+
+strip-bom@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0...;
+  dependencies:
+    is-utf8 "^0.2.0"
+
+strip-bom@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed...;
+
+strip-json-comments@~2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0...;
+
+subarg@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2";
+  dependencies:
+    minimist "^1.1.0"
+
+supports-color@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa401170846299...;
+
+supports-color@^3.1.0:
+  version "3.2.3"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3...;
+  dependencies:
+    has-flag "^1.0.0"
+
+syntax-error@^1.1.1:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/syntax-error/-/syntax-error-1.3.0.tgz#1ed9266c4d40be75dc55bf9bb1cb77062...;
+  dependencies:
+    acorn "^4.0.3"
+
+table@^3.7.8:
+  version "3.8.3"
+  resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f";
+  dependencies:
+    ajv "^4.7.0"
+    ajv-keywords "^1.0.0"
+    chalk "^1.1.1"
+    lodash "^4.0.0"
+    slice-ansi "0.0.4"
+    string-width "^2.0.0"
+
+tapable@^0.2.5, tapable@~0.2.5:
+  version "0.2.6"
+  resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.6.tgz#206be8e188860b514425375e6f1ae89bfb01fd8d...;
+
+tar-pack@^3.4.0:
+  version "3.4.0"
+  resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984&...;
+  dependencies:
+    debug "^2.2.0"
+    fstream "^1.0.10"
+    fstream-ignore "^1.0.5"
+    once "^1.3.3"
+    readable-stream "^2.1.4"
+    rimraf "^2.5.1"
+    tar "^2.2.1"
+    uid-number "^0.0.6"
+
+tar@^2.2.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1";
+  dependencies:
+    block-stream "*"
+    fstream "^1.0.2"
+    inherits "2"
+
+text-table@~0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa57...;
+
+throttleit@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528a...;
+
+through2@^2.0.0:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be&...;
+  dependencies:
+    readable-stream "^2.1.5"
+    xtend "~4.0.1"
+
+"through@>=2.2.7 <3", through@^2.3.6:
+  version "2.3.8"
+  resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5...;
+
+timers-browserify@^1.0.1:
+  version "1.4.2"
+  resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-1.4.2.tgz#c9c58b575be8407375cb5e2...;
+  dependencies:
+    process "~0.11.0"
+
+timers-browserify@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.2.tgz#ab4883cf597dcd50af21134...;
+  dependencies:
+    setimmediate "^1.0.4"
+
[email protected], [email protected]:
+  version "0.0.31"
+  resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7";
+  dependencies:
+    os-tmpdir "~1.0.1"
+
[email protected]:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890&...;
+
+to-arraybuffer@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a...;
+
+to-fast-properties@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231...;
+
+tough-cookie@~2.3.0:
+  version "2.3.2"
+  resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150...;
+  dependencies:
+    punycode "^1.4.1"
+
+trim-right@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6...;
+
+tryit@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb";
+
[email protected], tty-browserify@~0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d52...;
+
+tunnel-agent@^0.6.0:
+  version "0.6.0"
+  resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f...;
+  dependencies:
+    safe-buffer "^5.0.1"
+
+tunnel-agent@~0.4.1:
+  version "0.4.3"
+  resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828...;
+
+tweetnacl@^0.14.3, tweetnacl@~0.14.0:
+  version "0.14.5"
+  resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f...;
+
+type-check@~0.3.2:
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520d...;
+  dependencies:
+    prelude-ls "~1.1.2"
+
+type-is@~1.6.15:
+  version "1.6.15"
+  resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410&#...;
+  dependencies:
+    media-typer "0.3.0"
+    mime-types "~2.1.15"
+
+typedarray@^0.0.6, typedarray@~0.0.5:
+  version "0.0.6"
+  resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830...;
+
+ua-parser-js@^0.7.9:
+  version "0.7.12"
+  resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.12.tgz#04c81a99bdd5dc52263ea29d24c6bf8d...;
+
+uglify-js@^2.8.5:
+  version "2.8.28"
+  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.28.tgz#e335032df9bb20dcb918f164589d5af47f3883...;
+  dependencies:
+    source-map "~0.5.1"
+    yargs "~3.10.0"
+  optionalDependencies:
+    uglify-to-browserify "~1.0.0"
+
+uglify-to-browserify@~1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe...;
+
+uid-number@^0.0.6:
+  version "0.0.6"
+  resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663ba...;
+
[email protected]:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa";
+
+umd@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/umd/-/umd-3.0.1.tgz#8ae556e11011f63c2596708a8837259f01b3d60e";
+
+underscore@~1.8.3:
+  version "1.8.3"
+  resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5...;
+
[email protected], unpipe@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec";
+
+url@^0.11.0, url@~0.11.0:
+  version "0.11.0"
+  resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1";
+  dependencies:
+    punycode "1.3.2"
+    querystring "0.2.0"
+
+user-home@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9...;
+  dependencies:
+    os-homedir "^1.0.0"
+
+useragent@^2.1.12:
+  version "2.1.13"
+  resolved "https://registry.yarnpkg.com/useragent/-/useragent-2.1.13.tgz#bba43e8aa24d5ceb83c2937473e102e21df74c...;
+  dependencies:
+    lru-cache "2.2.x"
+    tmp "0.0.x"
+
+util-deprecate@~1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28...;
+
[email protected], util@^0.10.3, util@~0.10.1:
+  version "0.10.3"
+  resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9";
+  dependencies:
+    inherits "2.0.1"
+
[email protected]:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287...;
+
+uuid@^2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a";
+
+uuid@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1";
+
+validate-npm-package-license@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2...;
+  dependencies:
+    spdx-correct "~1.0.0"
+    spdx-expression-parse "~1.0.0"
+
[email protected]:
+  version "1.3.6"
+  resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c";
+  dependencies:
+    extsprintf "1.0.2"
+
[email protected], vm-browserify@~0.0.1:
+  version "0.0.4"
+  resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87...;
+  dependencies:
+    indexof "0.0.1"
+
+void-elements@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e9...;
+
+watchify@~3.9.0:
+  version "3.9.0"
+  resolved "https://registry.yarnpkg.com/watchify/-/watchify-3.9.0.tgz#f075fd2e8a86acde84cedba6e5c2a0bedd523d9e&...;
+  dependencies:
+    anymatch "^1.3.0"
+    browserify "^14.0.0"
+    chokidar "^1.0.0"
+    defined "^1.0.0"
+    outpipe "^1.1.0"
+    through2 "^2.0.0"
+    xtend "^4.0.0"
+
+watchpack@^1.3.1:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.3.1.tgz#7d8693907b28ce6013e7f3610aa2a1acf07dad8...;
+  dependencies:
+    async "^2.1.2"
+    chokidar "^1.4.3"
+    graceful-fs "^4.1.2"
+
+webpack-dev-middleware@^1.0.11:
+  version "1.10.2"
+  resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.10.2.tgz#2e252ce1dfb0...;
+  dependencies:
+    memory-fs "~0.4.1"
+    mime "^1.3.4"
+    path-is-absolute "^1.0.0"
+    range-parser "^1.0.3"
+
+webpack-sources@^0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-0.2.3.tgz#17c62bfaf13c707f9d02c479e0d...;
+  dependencies:
+    source-list-map "^1.1.1"
+    source-map "~0.5.3"
+
+webpack@~2.3.1:
+  version "2.3.3"
+  resolved "https://registry.yarnpkg.com/webpack/-/webpack-2.3.3.tgz#eecc083c18fb7bf958ea4f40b57a6640c5a0cc78...;
+  dependencies:
+    acorn "^4.0.4"
+    acorn-dynamic-import "^2.0.0"
+    ajv "^4.7.0"
+    ajv-keywords "^1.1.1"
+    async "^2.1.2"
+    enhanced-resolve "^3.0.0"
+    interpret "^1.0.0"
+    json-loader "^0.5.4"
+    loader-runner "^2.3.0"
+    loader-utils "^0.2.16"
+    memory-fs "~0.4.1"
+    mkdirp "~0.5.0"
+    node-libs-browser "^2.0.0"
+    source-map "^0.5.3"
+    supports-color "^3.1.0"
+    tapable "~0.2.5"
+    uglify-js "^2.8.5"
+    watchpack "^1.3.1"
+    webpack-sources "^0.2.3"
+    yargs "^6.0.0"
+
+whatwg-fetch@>=0.10.0:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b4421...;
+
+which-module@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b960...;
+
+which@~1.2.10:
+  version "1.2.14"
+  resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5";
+  dependencies:
+    isexe "^2.0.0"
+
+wide-align@^1.1.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341...;
+  dependencies:
+    string-width "^1.0.2"
+
[email protected]:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94...;
+
[email protected]:
+  version "0.0.2"
+  resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f&...;
+
+wordwrap@~0.0.2:
+  version "0.0.3"
+  resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107&...;
+
+wordwrap@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb&...;
+
+wrap-ansi@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd8...;
+  dependencies:
+    string-width "^1.0.1"
+    strip-ansi "^3.0.1"
+
+wrappy@1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f";
+
+write@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757";
+  dependencies:
+    mkdirp "^0.5.1"
+
[email protected]:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.2.tgz#8a244fa052401e08c9886cf44a85189e1fd4067f";
+  dependencies:
+    options ">=0.0.5"
+    ultron "1.0.x"
+
[email protected]:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/wtf-8/-/wtf-8-1.0.0.tgz#392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a";
+
[email protected]:
+  version "1.5.3"
+  resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz#185a888c04eca46c3e407...;
+
+xtend@^4.0.0, xtend@~4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af";
+
+y18n@^3.2.1:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41";
+
+yargs-parser@^4.2.0:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9...;
+  dependencies:
+    camelcase "^3.0.0"
+
+yargs@^6.0.0:
+  version "6.6.0"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208";
+  dependencies:
+    camelcase "^3.0.0"
+    cliui "^3.2.0"
+    decamelize "^1.1.1"
+    get-caller-file "^1.0.1"
+    os-locale "^1.4.0"
+    read-pkg-up "^1.0.1"
+    require-directory "^2.1.1"
+    require-main-filename "^1.0.1"
+    set-blocking "^2.0.0"
+    string-width "^1.0.2"
+    which-module "^1.0.0"
+    y18n "^3.2.1"
+    yargs-parser "^4.2.0"
+
+yargs@~3.10.0:
+  version "3.10.0"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1";
+  dependencies:
+    camelcase "^1.0.2"
+    cliui "^2.1.0"
+    decamelize "^1.0.0"
+    window-size "0.1.0"
+
[email protected]:
+  version "2.4.1"
+  resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005";
+  dependencies:
+    fd-slicer "~1.0.1"
+
[email protected]:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419";


-- 
Sent via pgadmin-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgadmin-hackers


Attachments:

  [text/plain] 02-bring-react-into-the-codebase-Dave.diff (530.4K, 2-02-bring-react-into-the-codebase-Dave.diff)
  download | inline diff:
diff --git a/pkg/mac/build.sh b/pkg/mac/build.sh
index a138a8a5..cd2908ef 100755
--- a/pkg/mac/build.sh
+++ b/pkg/mac/build.sh
@@ -178,6 +178,11 @@ _complete_bundle() {
     # run complete-bundle to copy the dependent libraries and frameworks and fix the rpaths
     ./complete-bundle.sh "$BUILDROOT/$APP_BUNDLE_NAME" || { echo complete-bundle.sh failed; exit 1; }
 
+    pushd $SOURCEDIR/web
+        yarn install
+        yarn run webpacker
+    popd
+
     # copy the web directory to the bundle as it is required by runtime
     cp -r $SOURCEDIR/web "$BUILDROOT/$APP_BUNDLE_NAME/Contents/Resources/" || exit 1
     cd "$BUILDROOT/$APP_BUNDLE_NAME/Contents/Resources/web"
diff --git a/pkg/pip/build.sh b/pkg/pip/build.sh
index 3ceaec4f..e9d88350 100755
--- a/pkg/pip/build.sh
+++ b/pkg/pip/build.sh
@@ -57,6 +57,15 @@ do
     tar cf - $FILE | (cd ../pip-build/pgadmin4; tar xf -)
 done
 
+yarn install
+yarn run webpacker
+
+for FILE in `ls -d pgAdmin/static/js/generated/*`
+do
+    echo Adding $FILE
+    tar cf - $FILE | (cd ../pip-build/pgadmin4; tar xf -)
+done
+
 cd ../docs
 for FILE in `git ls-files`
 do
diff --git a/pkg/src/build.sh b/pkg/src/build.sh
index a2c6f90e..bf6bc284 100755
--- a/pkg/src/build.sh
+++ b/pkg/src/build.sh
@@ -69,6 +69,17 @@ do
     tar cf - $FILE | (cd src-build/$TARBALL_NAME; tar xf -)
 done
 
+pushd web
+    yarn install
+    yarn run webpacker
+
+    for FILE in `ls -d pgAdmin/static/js/generated/*`
+    do
+        echo Adding $FILE
+        tar cf - $FILE | (cd ../src-build/$TARBALL_NAME/web; tar xf -)
+    done
+popd
+
 # Create the tarball
 echo Creating tarball...
 cd src-build
diff --git a/web/.eslintrc.js b/web/.eslintrc.js
new file mode 100644
index 00000000..c60569db
--- /dev/null
+++ b/web/.eslintrc.js
@@ -0,0 +1,45 @@
+module.exports = {
+  'env': {
+    'browser': true,
+    'es6': true,
+    'amd': true,
+    'jasmine': true,
+  },
+  'extends': 'eslint:recommended',
+  'parserOptions': {
+    'ecmaFeatures': {
+      'experimentalObjectRestSpread': true,
+      'jsx': true
+    },
+    'sourceType': 'module'
+  },
+  'plugins': [
+    'react'
+  ],
+  'globals': {
+    '_': true,
+    'module': true,
+  },
+  'rules': {
+    'indent': [
+      'error',
+      2
+    ],
+    'linebreak-style': [
+      'error',
+      'unix'
+    ],
+    'quotes': [
+      'error',
+      'single'
+    ],
+    'semi': [
+      'error',
+      'always'
+    ],
+    'comma-dangle': [
+      'error',
+      'always-multiline'
+    ]
+  }
+};
\ No newline at end of file
diff --git a/web/karma.conf.js b/web/karma.conf.js
index baa912c7..feeee77f 100644
--- a/web/karma.conf.js
+++ b/web/karma.conf.js
@@ -1,63 +1,54 @@
 // Karma configuration
 // Generated on Wed Mar 01 2017 14:19:28 GMT-0500 (EST)
+const webpackConfig = require('./webpack.test.config.js');
 
-module.exports = function(config) {
+module.exports = function (config) {
   config.set({
-
-    // base path that will be used to resolve all patterns (eg. files, exclude)
-    basePath: '',
-
-
-    // frameworks to use
-    // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
-    frameworks: ['jasmine', 'requirejs'],
-
-
-    // list of files / patterns to load in the browser
+    frameworks: ['jasmine'],
+    plugins: [
+      'karma-webpack',
+      'karma-phantomjs-launcher',
+      'karma-jasmine',
+      'karma-jasmine-html-reporter',
+    ],
     files: [
-      'regression/javascript/test-main.js',
-      {pattern: 'regression/javascript/**/*.js', included: false},
+      {pattern: 'pgadmin/static/**/*.js', included: false},
       {pattern: 'pgadmin/static/vendor/**/*.js', included: false},
-      {pattern: 'pgadmin/static/js/**/*.js', included: false},
       {pattern: 'pgadmin/browser/static/js/**/*.js', included: false},
-      {pattern: 'pgadmin/static/img/*.png', included: false}
+      'regression/javascript/**/*.jsx',
+      'regression/javascript/**/*.js',
     ],
 
-
     // list of files to exclude
     exclude: [
       'pgadmin/static/vendor/**/*[Tt]est.js',
       'pgadmin/static/vendor/**/*[Ss]pec.js'
     ],
 
-
     // preprocess matching files before serving them to the browser
     // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
     preprocessors: {
+      'regression/javascript/**/*.js': ['webpack'],
+      // 'regression/javascript/**/*.jsx': ['webpack'],
     },
 
+    webpack: webpackConfig,
+    webpackMiddleware: {
+      stats: 'errors-only',
+    },
 
-    // test results reporter to use
-    // possible values: 'dots', 'progress'
-    // available reporters: https://npmjs.org/browse/keyword/karma-reporter
-    reporters: ['progress'],
-
-
-    // web server port
     port: 9876,
 
-
     // enable / disable colors in the output (reporters and logs)
     colors: true,
 
-
     // level of logging
     // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
-    logLevel: config.LOG_INFO,
+    logLevel: config.LOG_WARN,
 
 
     // enable / disable watching file and executing tests whenever any file changes
-    autoWatch: false,
+    autoWatch: true,
 
 
     // start these browsers
@@ -67,10 +58,10 @@ module.exports = function(config) {
 
     // Continuous Integration mode
     // if true, Karma captures browsers, runs the tests and exits
-    singleRun: true,
+    singleRun: false,
 
     // Concurrency level
     // how many browser should be started simultaneous
     concurrency: Infinity
-  })
-}
+  });
+};
diff --git a/web/package.json b/web/package.json
index 80e4e5ad..40070da0 100644
--- a/web/package.json
+++ b/web/package.json
@@ -1,10 +1,43 @@
 {
   "devDependencies": {
-    "jasmine-core": "^2.5.2",
-    "karma": "^1.5.0",
-    "karma-jasmine": "^1.1.0",
-    "karma-phantomjs-launcher": "^1.0.2",
-    "karma-requirejs": "^1.1.0",
-    "requirejs": "^2.3.3"
+    "babel-core": "~6.24.0",
+    "babel-loader": "~6.4.1",
+    "babel-preset-es2015": "~6.24.0",
+    "babel-preset-react": "~6.23.0",
+    "enzyme": "~2.8.2",
+    "jasmine-core": "~2.5.2",
+    "karma": "~1.5.0",
+    "karma-babel-preprocessor": "^6.0.1",
+    "karma-browserify": "~5.1.1",
+    "karma-jasmine": "~1.1.0",
+    "karma-jasmine-html-reporter": "~0.2.2",
+    "karma-phantomjs-launcher": "~1.0.2",
+    "karma-requirejs": "~1.1.0",
+    "karma-sourcemap-loader": "~0.3.7",
+    "karma-webpack": "~2.0.3",
+    "react-addons-test-utils": "~15.4.2",
+    "webpack": "~2.3.1"
+  },
+  "dependencies": {
+    "axios": "^0.16.1",
+    "babel-plugin-transform-es2015-modules-amd": "^6.24.1",
+    "babel-polyfill": "^6.23.0",
+    "babel-preset-es2015-without-strict": "~0.0.4",
+    "babelify": "~7.3.0",
+    "browserify": "~14.1.0",
+    "exports-loader": "~0.6.4",
+    "imports-loader": "git+https://github.com/webpack-contrib/imports-loader.git#44d6f48463b256a17c1ba6fd9b5cc1449b4e379d",
+    "react": "~15.4.2",
+    "react-dom": "~15.4.2",
+    "requirejs": "~2.3.3",
+    "underscore": "~1.8.3",
+    "watchify": "~3.9.0"
+  },
+  "scripts": {
+    "bundle": "yarn run webpack -- --optimize-minimize --config webpack.config.js",
+    "test:karma-once": "yarn run karma start -- --single-run",
+    "test:karma": "yarn run karma start",
+    "test:feature": "yarn run bundle && python regression/runtests.py --pkg feature_tests",
+    "test": "yarn run test:karma-once && yarn run bundle && python regression/runtests.py"
   }
 }
diff --git a/web/pgAdmin4.py b/web/pgAdmin4.py
index 24e1564a..1db49584 100644
--- a/web/pgAdmin4.py
+++ b/web/pgAdmin4.py
@@ -22,17 +22,36 @@ if sys.path[0] != root:
 
 import config
 from pgadmin import create_app
+from pgadmin.utils import u, fs_encoding, file_quote
+
+if config.DEBUG:
+    from pgadmin.utils.javascript.javascript_bundler import JavascriptBundler, JsState
 
 # Get the config database schema version. We store this in pgadmin.model
 # as it turns out that putting it in the config files isn't a great idea
 from pgadmin.model import SCHEMA_VERSION
 config.SETTINGS_SCHEMA_VERSION = SCHEMA_VERSION
 
+##########################################################################
+# Sanity checks
+##########################################################################
+
+# Check if the database exists. If it does not, create it.
+if not os.path.isfile(config.SQLITE_PATH):
+    setupfile = os.path.join(
+        os.path.dirname(os.path.realpath(u(__file__, fs_encoding))), u'setup.py'
+    )
+    exec(open(file_quote(setupfile), 'r').read())
 
 ##########################################################################
-# Server starup
+# Server startup
 ##########################################################################
 
+# Build Javascript files
+if config.DEBUG:
+    javascriptBundler = JavascriptBundler()
+    javascriptBundler.bundle()
+
 # Create the app!
 app = create_app()
 
@@ -41,6 +60,13 @@ if config.DEBUG:
 else:
     app.debug = False
 
+# respond to JS
+if config.DEBUG:
+    if javascriptBundler.report() == JsState.NONE:
+        app.logger.error("Unable to generate javascript")
+        app.logger.error("To run the app ensure that yarn install command runs successfully")
+        raise Exception("No generated javascript, aborting")
+
 # Start the web server. The port number should have already been set by the
 # runtime if we're running in desktop mode, otherwise we'll just use the
 # Flask default.
diff --git a/web/pgadmin/static/js/generated/reactComponents.js b/web/pgadmin/static/js/generated/reactComponents.js
new file mode 100644
index 00000000..234cf494
--- /dev/null
+++ b/web/pgadmin/static/js/generated/reactComponents.js
@@ -0,0 +1,20 @@
+define(function(){return function(e){function t(o){if(n[o])return n[o].exports;var r=n[o]={i:o,l:!1,exports:{}};return e[o].call(r.exports,r,r.exports,t),r.l=!0,r.exports}var n={};return t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,o){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:o})},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=81)}([function(e,t){function n(){throw new Error("setTimeout has not been defined")}function o(){throw new Error("clearTimeout has not been defined")}function r(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===o||!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&&f&&(m=!1,f.length?h=f.concat(h):v=-1,h.length&&s())}function s(){if(!m){var e=r(a);m=!0;for(var t=h.length;t;){for(f=h,h=[];++v<t;)f&&f[v].run();v=-1,t=h.length}f=null,m=!1,i(e)}}function u(e,t){this.fun=e,this.array=t}function c(){}var l,p,d=e.exports={};!function(){try{l="function"==typeof setTimeout?setTimeout:n}catch(e){l=n}try{p="function"==typeof clearTimeout?clearTimeout:o}catch(e){p=o}}();var f,h=[],m=!1,v=-1;d.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 u(e,t)),1!==h.length||m||r(s)},u.prototype.run=function(){this.fun.apply(null,this.array)},d.title="browser",d.browser=!0,d.env={},d.argv=[],d.version="",d.versions={},d.on=c,d.addListener=c,d.once=c,d.off=c,d.removeListener=c,d.removeAllListeners=c,d.emit=c,d.prependListener=c,d.prependOnceListener=c,d.listeners=function(e){return[]},d.binding=function(e){throw new Error("process.binding is not supported")},d.cwd=function(){return"/"},d.chdir=function(e){throw new Error("process.chdir is not supported")},d.umask=function(){return 0}},function(e,t,n){"use strict";(function(t){function n(e,t,n,r,i,a,s,u){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,s,u],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){};"production"!==t.env.NODE_ENV&&(o=function(e){if(void 0===e)throw new Error("invariant requires an error message argument")}),e.exports=n}).call(t,n(0))},function(e,t,n){"use strict";(function(t){var o=n(9),r=o;"production"!==t.env.NODE_ENV&&function(){var e=function(e){for(var t=arguments.length,n=Array(t>1?t-1:0),o=1;o<t;o++)n[o-1]=arguments[o];var r=0,i="Warning: "+e.replace(/%s/g,function(){return n[r++]});"undefined"!=typeof console&&console.error(i);try{throw new Error(i)}catch(e){}};r=function(t,n){if(void 0===n)throw new Error("`warning(condition, format, ...args)` requires a warning message argument");if(0!==n.indexOf("Failed Composite propType: ")&&!t){for(var o=arguments.length,r=Array(o>2?o-2:0),i=2;i<o;i++)r[i-2]=arguments[i];e.apply(void 0,[n].concat(r))}}}(),e.exports=r}).call(t,n(0))},function(e,t,n){"use strict";function o(e){for(var t=arguments.length-1,n="Minified React error #"+e+"; visit http://facebook.github.io/react/docs/error-decoder.html?invariant="+e,o=0;o<t;o++)n+="&args[]="+encodeURIComponent(arguments[o+1]);n+=" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.";var r=new Error(n);throw r.name="Invariant Violation",r.framesToPop=1,r}e.exports=o},function(e,t,n){"use strict";function o(e){if(null===e||void 0===e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}/*
+object-assign
+(c) Sindre Sorhus
+@license MIT
+*/
+var r=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 o={};return"abcdefghijklmnopqrst".split("").forEach(function(e){o[e]=e}),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},o)).join("")}catch(e){return!1}}()?Object.assign:function(e,t){for(var n,s,u=o(e),c=1;c<arguments.length;c++){n=Object(arguments[c]);for(var l in n)i.call(n,l)&&(u[l]=n[l]);if(r){s=r(n);for(var p=0;p<s.length;p++)a.call(n,s[p])&&(u[s[p]]=n[s[p]])}}return u}},function(e,t,n){"use strict";(function(t){function o(e,t){return 1===e.nodeType&&e.getAttribute(m)===String(t)||8===e.nodeType&&e.nodeValue===" react-text: "+t+" "||8===e.nodeType&&e.nodeValue===" react-empty: "+t+" "}function r(e){for(var t;t=e._renderedComponent;)e=t;return e}function i(e,t){var n=r(e);n._hostNode=t,t[g]=n}function a(e){var t=e._hostNode;t&&(delete t[g],e._hostNode=null)}function s(e,n){if(!(e._flags&v.hasCachedChildNodes)){var a=e._renderedChildren,s=n.firstChild;e:for(var u in a)if(a.hasOwnProperty(u)){var c=a[u],l=r(c)._domID;if(0!==l){for(;null!==s;s=s.nextSibling)if(o(s,l)){i(c,s);continue e}"production"!==t.env.NODE_ENV?h(!1,"Unable to find element with ID %s.",l):p("32",l)}}e._flags|=v.hasCachedChildNodes}}function u(e){if(e[g])return e[g];for(var t=[];!e[g];){if(t.push(e),!e.parentNode)return null;e=e.parentNode}for(var n,o;e&&(o=e[g]);e=t.pop())n=o,t.length&&s(o,e);return n}function c(e){var t=u(e);return null!=t&&t._hostNode===e?t:null}function l(e){if(void 0===e._hostNode&&("production"!==t.env.NODE_ENV?h(!1,"getNodeFromInstance: Invalid argument."):p("33")),e._hostNode)return e._hostNode;for(var n=[];!e._hostNode;)n.push(e),e._hostParent||("production"!==t.env.NODE_ENV?h(!1,"React DOM tree root should always have a node reference."):p("34")),e=e._hostParent;for(;n.length;e=n.pop())s(e,e._hostNode);return e._hostNode}var p=n(3),d=n(13),f=n(58),h=n(1),m=d.ID_ATTRIBUTE_NAME,v=f,g="__reactInternalInstance$"+Math.random().toString(36).slice(2),y={getClosestInstanceFromNode:u,getInstanceFromNode:c,getNodeFromInstance:l,precacheChildNodes:s,precacheNode:i,uncacheNode:a};e.exports=y}).call(t,n(0))},function(e,t,n){"use strict";var o=!("undefined"==typeof window||!window.document||!window.document.createElement),r={canUseDOM:o,canUseWorkers:"undefined"!=typeof Worker,canUseEventListeners:o&&!(!window.addEventListener&&!window.attachEvent),canUseViewport:o&&!!window.screen,isInWorker:!o};e.exports=r},function(e,t,n){"use strict";(function(t){function o(e){var t=Function.prototype.toString,n=Object.prototype.hasOwnProperty,o=RegExp("^"+t.call(n).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");try{var r=t.call(e);return o.test(r)}catch(e){return!1}}function r(e){var t=c(e);if(t){var n=t.childIDs;l(e),n.forEach(r)}}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 s(e){var n,o=x.getDisplayName(e),r=x.getElement(e),a=x.getOwnerID(e);return a&&(n=x.getDisplayName(a)),"production"!==t.env.NODE_ENV&&y(r,"ReactComponentTreeHook: Missing React element for debugID %s when building stack",e),i(o,r&&r._source,n)}var u,c,l,p,d,f,h,m=n(16),v=n(11),g=n(1),y=n(2),E="function"==typeof Array.from&&"function"==typeof Map&&o(Map)&&null!=Map.prototype&&"function"==typeof Map.prototype.keys&&o(Map.prototype.keys)&&"function"==typeof Set&&o(Set)&&null!=Set.prototype&&"function"==typeof Set.prototype.keys&&o(Set.prototype.keys);if(E){var _=new Map,N=new Set;u=function(e,t){_.set(e,t)},c=function(e){return _.get(e)},l=function(e){_.delete(e)},p=function(){return Array.from(_.keys())},d=function(e){N.add(e)},f=function(e){N.delete(e)},h=function(){return Array.from(N.keys())}}else{var b={},C={},D=function(e){return"."+e},O=function(e){return parseInt(e.substr(1),10)};u=function(e,t){var n=D(e);b[n]=t},c=function(e){var t=D(e);return b[t]},l=function(e){var t=D(e);delete b[t]},p=function(){return Object.keys(b).map(O)},d=function(e){var t=D(e);C[t]=!0},f=function(e){var t=D(e);delete C[t]},h=function(){return Object.keys(C).map(O)}}var w=[],x={onSetChildren:function(e,n){var o=c(e);o||("production"!==t.env.NODE_ENV?g(!1,"Item must have been set"):m("144")),o.childIDs=n;for(var r=0;r<n.length;r++){var i=n[r],a=c(i);a||("production"!==t.env.NODE_ENV?g(!1,"Expected hook events to fire for the child before its parent includes it in onSetChildren()."):m("140")),null==a.childIDs&&"object"==typeof a.element&&null!=a.element&&("production"!==t.env.NODE_ENV?g(!1,"Expected onSetChildren() to fire for a container child before its parent includes it in onSetChildren()."):m("141")),a.isMounted||("production"!==t.env.NODE_ENV?g(!1,"Expected onMountComponent() to fire for the child before its parent includes it in onSetChildren()."):m("71")),null==a.parentID&&(a.parentID=e),a.parentID!==e&&("production"!==t.env.NODE_ENV?g(!1,"Expected onBeforeMountComponent() parent and onSetChildren() to be consistent (%s has parents %s and %s).",i,a.parentID,e):m("142",i,a.parentID,e))}},onBeforeMountComponent:function(e,t,n){u(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 n=c(e);n||("production"!==t.env.NODE_ENV?g(!1,"Item must have been set"):m("144")),n.isMounted=!0,0===n.parentID&&d(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&&f(e)}w.push(e)},purgeUnmountedComponents:function(){if(!x._preventPurging){for(var e=0;e<w.length;e++){r(w[e])}w.length=0}},isMounted:function(e){var t=c(e);return!!t&&t.isMounted},getCurrentStackAddendum:function(e){var t="";if(e){var n=a(e),o=e._owner;t+=i(n,e._source,o&&o.getName())}var r=v.current,s=r&&r._debugID;return t+=x.getStackAddendumByID(s)},getStackAddendumByID:function(e){for(var t="";e;)t+=s(e),e=x.getParentID(e);return t},getChildIDs:function(e){var t=c(e);return t?t.childIDs:[]},getDisplayName:function(e){var t=x.getElement(e);return t?a(t):null},getElement:function(e){var t=c(e);return t?t.element:null},getOwnerID:function(e){var t=x.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=x.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};e.exports=x}).call(t,n(0))},function(e,t,n){"use strict";(function(t){var o=null;if("production"!==t.env.NODE_ENV){o=n(124)}e.exports={debugTool:o}}).call(t,n(0))},function(e,t,n){"use strict";function o(e){return function(){return e}}var r=function(){};r.thatReturns=o,r.thatReturnsFalse=o(!1),r.thatReturnsTrue=o(!0),r.thatReturnsNull=o(null),r.thatReturnsThis=function(){return this},r.thatReturnsArgument=function(e){return e},e.exports=r},function(e,t,n){"use strict";(function(t){function o(){T.ReactReconcileTransaction&&b||("production"!==t.env.NODE_ENV?g(!1,"ReactUpdates: must inject a reconcile transaction class and batching strategy"):l("123"))}function r(){this.reinitializeTransaction(),this.dirtyComponentsLength=null,this.callbackQueue=d.getPooled(),this.reconcileTransaction=T.ReactReconcileTransaction.getPooled(!0)}function i(e,t,n,r,i,a){return o(),b.batchedUpdates(e,t,n,r,i,a)}function a(e,t){return e._mountOrder-t._mountOrder}function s(e){var n=e.dirtyComponentsLength;n!==y.length&&("production"!==t.env.NODE_ENV?g(!1,"Expected flush transaction's stored dirty-components length (%s) to match dirty-components array length (%s).",n,y.length):l("124",n,y.length)),y.sort(a),E++;for(var o=0;o<n;o++){var r=y[o],i=r._pendingCallbacks;r._pendingCallbacks=null;var s;if(h.logTopLevelRenders){var u=r;r._currentElement.type.isReactTopLevelWrapper&&(u=r._renderedComponent),s="React update: "+u.getName(),console.time(s)}if(m.performUpdateIfNecessary(r,e.reconcileTransaction,E),s&&console.timeEnd(s),i)for(var c=0;c<i.length;c++)e.callbackQueue.enqueue(i[c],r.getPublicInstance())}}function u(e){if(o(),!b.isBatchingUpdates)return void b.batchedUpdates(u,e);y.push(e),null==e._updateBatchNumber&&(e._updateBatchNumber=E+1)}function c(e,n){b.isBatchingUpdates||("production"!==t.env.NODE_ENV?g(!1,"ReactUpdates.asap: Can't enqueue an asap callback in a context whereupdates are not being batched."):l("125")),_.enqueue(e,n),N=!0}var l=n(3),p=n(4),d=n(56),f=n(14),h=n(61),m=n(18),v=n(28),g=n(1),y=[],E=0,_=d.getPooled(),N=!1,b=null,C={initialize:function(){this.dirtyComponentsLength=y.length},close:function(){this.dirtyComponentsLength!==y.length?(y.splice(0,this.dirtyComponentsLength),w()):y.length=0}},D={initialize:function(){this.callbackQueue.reset()},close:function(){this.callbackQueue.notifyAll()}},O=[C,D];p(r.prototype,v,{getTransactionWrappers:function(){return O},destructor:function(){this.dirtyComponentsLength=null,d.release(this.callbackQueue),this.callbackQueue=null,T.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)}}),f.addPoolingTo(r);var w=function(){for(;y.length||N;){if(y.length){var e=r.getPooled();e.perform(s,null,e),r.release(e)}if(N){N=!1;var t=_;_=d.getPooled(),t.notifyAll(),d.release(t)}}},x={injectReconcileTransaction:function(e){e||("production"!==t.env.NODE_ENV?g(!1,"ReactUpdates: must provide a reconcile transaction class"):l("126")),T.ReactReconcileTransaction=e},injectBatchingStrategy:function(e){e||("production"!==t.env.NODE_ENV?g(!1,"ReactUpdates: must provide a batching strategy"):l("127")),"function"!=typeof e.batchedUpdates&&("production"!==t.env.NODE_ENV?g(!1,"ReactUpdates: must provide a batchedUpdates() function"):l("128")),"boolean"!=typeof e.isBatchingUpdates&&("production"!==t.env.NODE_ENV?g(!1,"ReactUpdates: must provide an isBatchingUpdates boolean attribute"):l("129")),b=e}},T={ReactReconcileTransaction:null,batchedUpdates:i,enqueueUpdate:u,flushBatchedUpdates:w,injection:x,asap:c};e.exports=T}).call(t,n(0))},function(e,t,n){"use strict";var o={current:null};e.exports=o},function(e,t,n){"use strict";(function(t){function o(e,n,o,r){"production"!==t.env.NODE_ENV&&(delete this.nativeEvent,delete this.preventDefault,delete this.stopPropagation),this.dispatchConfig=e,this._targetInst=n,this.nativeEvent=o;var i=this.constructor.Interface;for(var a in i)if(i.hasOwnProperty(a)){"production"!==t.env.NODE_ENV&&delete this[a];var u=i[a];u?this[a]=u(o):"target"===a?this.target=r:this[a]=o[a]}var c=null!=o.defaultPrevented?o.defaultPrevented:!1===o.returnValue;return this.isDefaultPrevented=c?s.thatReturnsTrue:s.thatReturnsFalse,this.isPropagationStopped=s.thatReturnsFalse,this}function r(e,n){function o(e){return i(a?"setting the method":"setting the property","This is effectively a no-op"),e}function r(){return i(a?"accessing the method":"accessing the property",a?"This is a no-op function":"This is set to null"),n}function i(n,o){"production"!==t.env.NODE_ENV&&u(!1,"This synthetic event is reused for performance reasons. If you're seeing this, you're %s `%s` on a released/nullified synthetic event. %s. If you must keep the original synthetic event around, use event.persist(). See https://fb.me/react-event-pooling for more information.",n,e,o)}var a="function"==typeof n;return{configurable:!0,set:o,get:r}}var i=n(4),a=n(14),s=n(9),u=n(2),c=!1,l="function"==typeof Proxy,p=["dispatchConfig","_targetInst","nativeEvent","isDefaultPrevented","isPropagationStopped","_dispatchListeners","_dispatchInstances"],d={type:null,target:null,currentTarget:s.thatReturnsNull,eventPhase:null,bubbles:null,cancelable:null,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:null,isTrusted:null};i(o.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():"unknown"!=typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=s.thatReturnsTrue)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():"unknown"!=typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=s.thatReturnsTrue)},persist:function(){this.isPersistent=s.thatReturnsTrue},isPersistent:s.thatReturnsFalse,destructor:function(){var e=this.constructor.Interface;for(var n in e)"production"!==t.env.NODE_ENV?Object.defineProperty(this,n,r(n,e[n])):this[n]=null;for(var o=0;o<p.length;o++)this[p[o]]=null;"production"!==t.env.NODE_ENV&&(Object.defineProperty(this,"nativeEvent",r("nativeEvent",null)),Object.defineProperty(this,"preventDefault",r("preventDefault",s)),Object.defineProperty(this,"stopPropagation",r("stopPropagation",s)))}}),o.Interface=d,"production"!==t.env.NODE_ENV&&l&&(o=new Proxy(o,{construct:function(e,t){return this.apply(e,Object.create(e.prototype),t)},apply:function(e,n,o){return new Proxy(e.apply(n,o),{set:function(e,n,o){return"isPersistent"===n||e.constructor.Interface.hasOwnProperty(n)||-1!==p.indexOf(n)||("production"!==t.env.NODE_ENV&&u(c||e.isPersistent(),"This synthetic event is reused for performance reasons. If you're seeing this, you're adding a new property in the synthetic event object. The property is never released. See https://fb.me/react-event-pooling for more information."),c=!0),e[n]=o,!0}})}})),o.augmentClass=function(e,t){var n=this,o=function(){};o.prototype=n.prototype;var r=new o;i(r,e.prototype),e.prototype=r,e.prototype.constructor=e,e.Interface=i({},n.Interface,t),e.augmentClass=n.augmentClass,a.addPoolingTo(e,a.fourArgumentPooler)},a.addPoolingTo(o,a.fourArgumentPooler),e.exports=o}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e,t){return(e&t)===t}var r=n(3),i=n(1),a={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 n=a,s=e.Properties||{},c=e.DOMAttributeNamespaces||{},l=e.DOMAttributeNames||{},p=e.DOMPropertyNames||{},d=e.DOMMutationMethods||{};e.isCustomAttribute&&u._isCustomAttributeFunctions.push(e.isCustomAttribute);for(var f in s){u.properties.hasOwnProperty(f)&&("production"!==t.env.NODE_ENV?i(!1,"injectDOMPropertyConfig(...): You're trying to inject DOM property '%s' which has already been injected. You may be accidentally injecting the same DOM property config twice, or you may be injecting two configs that have conflicting property names.",f):r("48",f));var h=f.toLowerCase(),m=s[f],v={attributeName:h,attributeNamespace:null,propertyName:f,mutationMethod:null,mustUseProperty:o(m,n.MUST_USE_PROPERTY),hasBooleanValue:o(m,n.HAS_BOOLEAN_VALUE),hasNumericValue:o(m,n.HAS_NUMERIC_VALUE),hasPositiveNumericValue:o(m,n.HAS_POSITIVE_NUMERIC_VALUE),hasOverloadedBooleanValue:o(m,n.HAS_OVERLOADED_BOOLEAN_VALUE)};if(v.hasBooleanValue+v.hasNumericValue+v.hasOverloadedBooleanValue<=1||("production"!==t.env.NODE_ENV?i(!1,"DOMProperty: Value can be one of boolean, overloaded boolean, or numeric value, but not a combination: %s",f):r("50",f)),"production"!==t.env.NODE_ENV&&(u.getPossibleStandardName[h]=f),l.hasOwnProperty(f)){var g=l[f];v.attributeName=g,"production"!==t.env.NODE_ENV&&(u.getPossibleStandardName[g]=f)}c.hasOwnProperty(f)&&(v.attributeNamespace=c[f]),p.hasOwnProperty(f)&&(v.propertyName=p[f]),d.hasOwnProperty(f)&&(v.mutationMethod=d[f]),u.properties[f]=v}}},s=":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:s,ATTRIBUTE_NAME_CHAR:s+"\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040",properties:{},getPossibleStandardName:"production"!==t.env.NODE_ENV?{autofocus:"autoFocus"}: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:a};e.exports=u}).call(t,n(0))},function(e,t,n){"use strict";(function(t){var o=n(3),r=n(1),i=function(e){var t=this;if(t.instancePool.length){var n=t.instancePool.pop();return t.call(n,e),n}return new t(e)},a=function(e,t){var n=this;if(n.instancePool.length){var o=n.instancePool.pop();return n.call(o,e,t),o}return new n(e,t)},s=function(e,t,n){var o=this;if(o.instancePool.length){var r=o.instancePool.pop();return o.call(r,e,t,n),r}return new o(e,t,n)},u=function(e,t,n,o){var r=this;if(r.instancePool.length){var i=r.instancePool.pop();return r.call(i,e,t,n,o),i}return new r(e,t,n,o)},c=function(e){var n=this;e instanceof n||("production"!==t.env.NODE_ENV?r(!1,"Trying to release an instance into a pool of a different type."):o("25")),e.destructor(),n.instancePool.length<n.poolSize&&n.instancePool.push(e)},l=i,p=function(e,t){var n=e;return n.instancePool=[],n.getPooled=t||l,n.poolSize||(n.poolSize=10),n.release=c,n},d={addPoolingTo:p,oneArgumentPooler:i,twoArgumentPooler:a,threeArgumentPooler:s,fourArgumentPooler:u};e.exports=d}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e){if("production"!==t.env.NODE_ENV&&f.call(e,"ref")){var n=Object.getOwnPropertyDescriptor(e,"ref").get;if(n&&n.isReactWarning)return!1}return void 0!==e.ref}function r(e){if("production"!==t.env.NODE_ENV&&f.call(e,"key")){var n=Object.getOwnPropertyDescriptor(e,"key").get;if(n&&n.isReactWarning)return!1}return void 0!==e.key}function i(e,n){var o=function(){s||(s=!0,"production"!==t.env.NODE_ENV&&p(!1,"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://fb.me/react-special-props)",n))};o.isReactWarning=!0,Object.defineProperty(e,"key",{get:o,configurable:!0})}function a(e,n){var o=function(){u||(u=!0,"production"!==t.env.NODE_ENV&&p(!1,"%s: `ref` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://fb.me/react-special-props)",n))};o.isReactWarning=!0,Object.defineProperty(e,"ref",{get:o,configurable:!0})}var s,u,c=n(4),l=n(11),p=n(2),d=n(50),f=Object.prototype.hasOwnProperty,h=n(76),m={key:!0,ref:!0,__self:!0,__source:!0},v=function(e,n,o,r,i,a,s){var u={$$typeof:h,type:e,key:n,ref:o,props:s,_owner:a};return"production"!==t.env.NODE_ENV&&(u._store={},d?(Object.defineProperty(u._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:!1}),Object.defineProperty(u,"_self",{configurable:!1,enumerable:!1,writable:!1,value:r}),Object.defineProperty(u,"_source",{configurable:!1,enumerable:!1,writable:!1,value:i})):(u._store.validated=!1,u._self=r,u._source=i),Object.freeze&&(Object.freeze(u.props),Object.freeze(u))),u};v.createElement=function(e,n,s){var u,c={},p=null,d=null,g=null,y=null;if(null!=n){o(n)&&(d=n.ref),r(n)&&(p=""+n.key),g=void 0===n.__self?null:n.__self,y=void 0===n.__source?null:n.__source;for(u in n)f.call(n,u)&&!m.hasOwnProperty(u)&&(c[u]=n[u])}var E=arguments.length-2;if(1===E)c.children=s;else if(E>1){for(var _=Array(E),N=0;N<E;N++)_[N]=arguments[N+2];"production"!==t.env.NODE_ENV&&Object.freeze&&Object.freeze(_),c.children=_}if(e&&e.defaultProps){var b=e.defaultProps;for(u in b)void 0===c[u]&&(c[u]=b[u])}if("production"!==t.env.NODE_ENV&&(p||d)&&(void 0===c.$$typeof||c.$$typeof!==h)){var C="function"==typeof e?e.displayName||e.name||"Unknown":e;p&&i(c,C),d&&a(c,C)}return v(e,p,d,g,y,l.current,c)},v.createFactory=function(e){var t=v.createElement.bind(null,e);return t.type=e,t},v.cloneAndReplaceKey=function(e,t){return v(e.type,t,e.ref,e._self,e._source,e._owner,e.props)},v.cloneElement=function(e,t,n){var i,a=c({},e.props),s=e.key,u=e.ref,p=e._self,d=e._source,h=e._owner;if(null!=t){o(t)&&(u=t.ref,h=l.current),r(t)&&(s=""+t.key);var g;e.type&&e.type.defaultProps&&(g=e.type.defaultProps);for(i in t)f.call(t,i)&&!m.hasOwnProperty(i)&&(void 0===t[i]&&void 0!==g?a[i]=g[i]:a[i]=t[i])}var y=arguments.length-2;if(1===y)a.children=n;else if(y>1){for(var E=Array(y),_=0;_<y;_++)E[_]=arguments[_+2];a.children=E}return v(e.type,s,u,p,d,h,a)},v.isValidElement=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===h},e.exports=v}).call(t,n(0))},function(e,t,n){"use strict";function o(e){for(var t=arguments.length-1,n="Minified React error #"+e+"; visit http://facebook.github.io/react/docs/error-decoder.html?invariant="+e,o=0;o<t;o++)n+="&args[]="+encodeURIComponent(arguments[o+1]);n+=" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.";var r=new Error(n);throw r.name="Invariant Violation",r.framesToPop=1,r}e.exports=o},function(e,t,n){"use strict";function o(e){if(h){var t=e.node,n=e.children;if(n.length)for(var o=0;o<n.length;o++)m(t,n[o],null);else null!=e.html?p(t,e.html):null!=e.text&&f(t,e.text)}}function r(e,t){e.parentNode.replaceChild(t.node,e),o(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 s(e,t){h?e.text=t:f(e.node,t)}function u(){return this.node.nodeName}function c(e){return{node:e,children:[],html:null,text:null,toString:u}}var l=n(33),p=n(30),d=n(40),f=n(74),h="undefined"!=typeof document&&"number"==typeof document.documentMode||"undefined"!=typeof navigator&&"string"==typeof navigator.userAgent&&/\bEdge\/\d/.test(navigator.userAgent),m=d(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)?(o(t),e.insertBefore(t.node,n)):(e.insertBefore(t.node,n),o(t))});c.insertTreeBefore=m,c.replaceChildWithTree=r,c.queueChild=i,c.queueHTML=a,c.queueText=s,e.exports=c},function(e,t,n){"use strict";(function(t){function o(){r.attachRefs(this,this._currentElement)}var r=n(138),i=n(8),a=n(2),s={mountComponent:function(e,n,r,a,s,u){"production"!==t.env.NODE_ENV&&0!==e._debugID&&i.debugTool.onBeforeMountComponent(e._debugID,e._currentElement,u);var c=e.mountComponent(n,r,a,s,u);return e._currentElement&&null!=e._currentElement.ref&&n.getReactMountReady().enqueue(o,e),"production"!==t.env.NODE_ENV&&0!==e._debugID&&i.debugTool.onMountComponent(e._debugID),c},getHostNode:function(e){return e.getHostNode()},unmountComponent:function(e,n){"production"!==t.env.NODE_ENV&&0!==e._debugID&&i.debugTool.onBeforeUnmountComponent(e._debugID),r.detachRefs(e,e._currentElement),e.unmountComponent(n),"production"!==t.env.NODE_ENV&&0!==e._debugID&&i.debugTool.onUnmountComponent(e._debugID)},receiveComponent:function(e,n,a,s){var u=e._currentElement;if(n!==u||s!==e._context){"production"!==t.env.NODE_ENV&&0!==e._debugID&&i.debugTool.onBeforeUpdateComponent(e._debugID,n);var c=r.shouldUpdateRefs(u,n);c&&r.detachRefs(e,u),e.receiveComponent(n,a,s),c&&e._currentElement&&null!=e._currentElement.ref&&a.getReactMountReady().enqueue(o,e),"production"!==t.env.NODE_ENV&&0!==e._debugID&&i.debugTool.onUpdateComponent(e._debugID)}},performUpdateIfNecessary:function(e,n,o){if(e._updateBatchNumber!==o)return void("production"!==t.env.NODE_ENV&&a(null==e._updateBatchNumber||e._updateBatchNumber===o+1,"performUpdateIfNecessary: Unexpected batch number (current %s, pending %s)",o,e._updateBatchNumber));"production"!==t.env.NODE_ENV&&0!==e._debugID&&i.debugTool.onBeforeUpdateComponent(e._debugID,e._currentElement),e.performUpdateIfNecessary(n),"production"!==t.env.NODE_ENV&&0!==e._debugID&&i.debugTool.onUpdateComponent(e._debugID)}};e.exports=s}).call(t,n(0))},function(e,t,n){"use strict";(function(t){var o=n(4),r=n(169),i=n(47),a=n(173),s=n(170),u=n(171),c=n(15),l=n(172),p=n(174),d=n(176),f=n(2),h=c.createElement,m=c.createFactory,v=c.cloneElement;if("production"!==t.env.NODE_ENV){var g=n(77);h=g.createElement,m=g.createFactory,v=g.cloneElement}var y=o;if("production"!==t.env.NODE_ENV){var E=!1;y=function(){return"production"!==t.env.NODE_ENV&&f(E,"React.__spread is deprecated and should not be used. Use Object.assign directly or another helper function with similar semantics. You may be seeing this warning due to your compiler. See https://fb.me/react-spread-deprecation for more details."),E=!0,o.apply(null,arguments)}}var _={Children:{map:r.map,forEach:r.forEach,count:r.count,toArray:r.toArray,only:d},Component:i,PureComponent:a,createElement:h,cloneElement:v,isValidElement:c.isValidElement,PropTypes:l,createClass:s.createClass,createFactory:m,createMixin:function(e){return e},DOM:u,version:p,__spread:y};e.exports=_}).call(t,n(0))},function(e,t,n){"use strict";(function(t){var n={};"production"!==t.env.NODE_ENV&&Object.freeze(n),e.exports=n}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e){return"button"===e||"input"===e||"select"===e||"textarea"===e}function r(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||!o(t));default:return!1}}var i=n(3),a=n(25),s=n(34),u=n(38),c=n(68),l=n(69),p=n(1),d={},f=null,h=function(e,t){e&&(s.executeDispatchesInOrder(e,t),e.isPersistent()||e.constructor.release(e))},m=function(e){return h(e,!0)},v=function(e){return h(e,!1)},g=function(e){return"."+e._rootNodeID},y={injection:{injectEventPluginOrder:a.injectEventPluginOrder,injectEventPluginsByName:a.injectEventPluginsByName},putListener:function(e,n,o){"function"!=typeof o&&("production"!==t.env.NODE_ENV?p(!1,"Expected %s listener to be a function, instead got type %s",n,typeof o):i("94",n,typeof o));var r=g(e);(d[n]||(d[n]={}))[r]=o;var s=a.registrationNameModules[n];s&&s.didPutListener&&s.didPutListener(e,n,o)},getListener:function(e,t){var n=d[t];if(r(t,e._currentElement.type,e._currentElement.props))return null;var o=g(e);return n&&n[o]},deleteListener:function(e,t){var n=a.registrationNameModules[t];n&&n.willDeleteListener&&n.willDeleteListener(e,t);var o=d[t];if(o){delete o[g(e)]}},deleteAllListeners:function(e){var t=g(e);for(var n in d)if(d.hasOwnProperty(n)&&d[n][t]){var o=a.registrationNameModules[n];o&&o.willDeleteListener&&o.willDeleteListener(e,n),delete d[n][t]}},extractEvents:function(e,t,n,o){for(var r,i=a.plugins,s=0;s<i.length;s++){var u=i[s];if(u){var l=u.extractEvents(e,t,n,o);l&&(r=c(r,l))}}return r},enqueueEvents:function(e){e&&(f=c(f,e))},processEventQueue:function(e){var n=f;f=null,e?l(n,m):l(n,v),f&&("production"!==t.env.NODE_ENV?p(!1,"processEventQueue(): Additional events were enqueued while processing an event queue. Support for this has not yet been implemented."):i("95")),u.rethrowCaughtError()},__purge:function(){d={}},__getListenerBank:function(){return d}};e.exports=y}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e,t,n){var o=t.dispatchConfig.phasedRegistrationNames[n];return y(e,o)}function r(e,n,r){"production"!==t.env.NODE_ENV&&"production"!==t.env.NODE_ENV&&g(e,"Dispatching inst must not be null");var i=o(e,r,n);i&&(r._dispatchListeners=m(r._dispatchListeners,i),r._dispatchInstances=m(r._dispatchInstances,e))}function i(e){e&&e.dispatchConfig.phasedRegistrationNames&&h.traverseTwoPhase(e._targetInst,r,e)}function a(e){if(e&&e.dispatchConfig.phasedRegistrationNames){var t=e._targetInst,n=t?h.getParentInstance(t):null;h.traverseTwoPhase(n,r,e)}}function s(e,t,n){if(n&&n.dispatchConfig.registrationName){var o=n.dispatchConfig.registrationName,r=y(e,o);r&&(n._dispatchListeners=m(n._dispatchListeners,r),n._dispatchInstances=m(n._dispatchInstances,e))}}function u(e){e&&e.dispatchConfig.registrationName&&s(e._targetInst,null,e)}function c(e){v(e,i)}function l(e){v(e,a)}function p(e,t,n,o){h.traverseEnterLeave(n,o,s,e,t)}function d(e){v(e,u)}var f=n(21),h=n(34),m=n(68),v=n(69),g=n(2),y=f.getListener,E={accumulateTwoPhaseDispatches:c,accumulateTwoPhaseDispatchesSkipTarget:l,accumulateDirectDispatches:d,accumulateEnterLeaveDispatches:p};e.exports=E}).call(t,n(0))},function(e,t,n){"use strict";var o={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=o},function(e,t,n){"use strict";function o(e,t,n,o){return r.call(this,e,t,n,o)}var r=n(12),i=n(43),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}};r.augmentClass(o,a),e.exports=o},function(e,t,n){"use strict";(function(t){function o(){if(u)for(var e in c){var n=c[e],o=u.indexOf(e);if(o>-1||("production"!==t.env.NODE_ENV?s(!1,"EventPluginRegistry: Cannot inject event plugins that do not exist in the plugin ordering, `%s`.",e):a("96",e)),!l.plugins[o]){n.extractEvents||("production"!==t.env.NODE_ENV?s(!1,"EventPluginRegistry: Event plugins must implement an `extractEvents` method, but `%s` does not.",e):a("97",e)),l.plugins[o]=n;var i=n.eventTypes;for(var p in i)r(i[p],n,p)||("production"!==t.env.NODE_ENV?s(!1,"EventPluginRegistry: Failed to publish event `%s` for plugin `%s`.",p,e):a("98",p,e))}}}function r(e,n,o){l.eventNameDispatchConfigs.hasOwnProperty(o)&&("production"!==t.env.NODE_ENV?s(!1,"EventPluginHub: More than one plugin attempted to publish the same event name, `%s`.",o):a("99",o)),l.eventNameDispatchConfigs[o]=e;var r=e.phasedRegistrationNames;if(r){for(var u in r)if(r.hasOwnProperty(u)){var c=r[u];i(c,n,o)}return!0}return!!e.registrationName&&(i(e.registrationName,n,o),!0)}function i(e,n,o){if(l.registrationNameModules[e]&&("production"!==t.env.NODE_ENV?s(!1,"EventPluginHub: More than one plugin attempted to publish the same registration name, `%s`.",e):a("100",e)),l.registrationNameModules[e]=n,l.registrationNameDependencies[e]=n.eventTypes[o].dependencies,"production"!==t.env.NODE_ENV){var r=e.toLowerCase();l.possibleRegistrationNames[r]=e,"onDoubleClick"===e&&(l.possibleRegistrationNames.ondblclick=e)}}var a=n(3),s=n(1),u=null,c={},l={plugins:[],eventNameDispatchConfigs:{},registrationNameModules:{},registrationNameDependencies:{},possibleRegistrationNames:"production"!==t.env.NODE_ENV?{}:null,injectEventPluginOrder:function(e){u&&("production"!==t.env.NODE_ENV?s(!1,"EventPluginRegistry: Cannot inject event plugin ordering more than once. You are likely trying to load more than one copy of React."):a("101")),u=Array.prototype.slice.call(e),o()},injectEventPluginsByName:function(e){var n=!1;for(var r in e)if(e.hasOwnProperty(r)){var i=e[r];c.hasOwnProperty(r)&&c[r]===i||(c[r]&&("production"!==t.env.NODE_ENV?s(!1,"EventPluginRegistry: Cannot inject two different event plugins using the same name, `%s`.",r):a("102",r)),c[r]=i,n=!0)}n&&o()},getPluginModuleForEvent:function(e){var t=e.dispatchConfig;if(t.registrationName)return l.registrationNameModules[t.registrationName]||null;if(void 0!==t.phasedRegistrationNames){var n=t.phasedRegistrationNames;for(var o in n)if(n.hasOwnProperty(o)){var r=l.registrationNameModules[n[o]];if(r)return r}}return null},_resetEventPlugins:function(){u=null;for(var e in c)c.hasOwnProperty(e)&&delete c[e];l.plugins.length=0;var n=l.eventNameDispatchConfigs;for(var o in n)n.hasOwnProperty(o)&&delete n[o];var r=l.registrationNameModules;for(var i in r)r.hasOwnProperty(i)&&delete r[i];if("production"!==t.env.NODE_ENV){var a=l.possibleRegistrationNames;for(var s in a)a.hasOwnProperty(s)&&delete a[s]}}};e.exports=l}).call(t,n(0))},function(e,t,n){"use strict";function o(e){return Object.prototype.hasOwnProperty.call(e,m)||(e[m]=f++,p[e[m]]={}),p[e[m]]}var r,i=n(4),a=n(25),s=n(128),u=n(67),c=n(164),l=n(44),p={},d=!1,f=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({},s,{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,r=o(n),i=a.registrationNameDependencies[e],s=0;s<i.length;s++){var u=i[s];r.hasOwnProperty(u)&&r[u]||("topWheel"===u?l("wheel")?v.ReactEventListener.trapBubbledEvent("topWheel","wheel",n):l("mousewheel")?v.ReactEventListener.trapBubbledEvent("topWheel","mousewheel",n):v.ReactEventListener.trapBubbledEvent("topWheel","DOMMouseScroll",n):"topScroll"===u?l("scroll",!0)?v.ReactEventListener.trapCapturedEvent("topScroll","scroll",n):v.ReactEventListener.trapBubbledEvent("topScroll","scroll",v.ReactEventListener.WINDOW_HANDLE):"topFocus"===u||"topBlur"===u?(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)),r.topBlur=!0,r.topFocus=!0):h.hasOwnProperty(u)&&v.ReactEventListener.trapBubbledEvent(u,h[u],n),r[u]=!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===r&&(r=v.supportsEventPageXY()),!r&&!d){var e=u.refreshScrollValues;v.ReactEventListener.monitorScrollValue(e),d=!0}}});e.exports=v},function(e,t,n){"use strict";function o(e,t,n,o){return r.call(this,e,t,n,o)}var r=n(24),i=n(67),a=n(42),s={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}};r.augmentClass(o,s),e.exports=o},function(e,t,n){"use strict";(function(t){var o=n(3),r=n(1),i={},a={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,n,i,a,s,u,c,l){this.isInTransaction()&&("production"!==t.env.NODE_ENV?r(!1,"Transaction.perform(...): Cannot initialize a transaction when there is already an outstanding transaction."):o("27"));var p,d;try{this._isInTransaction=!0,p=!0,this.initializeAll(0),d=e.call(n,i,a,s,u,c,l),p=!1}finally{try{if(p)try{this.closeAll(0)}catch(e){}else this.closeAll(0)}finally{this._isInTransaction=!1}}return d},initializeAll:function(e){for(var t=this.transactionWrappers,n=e;n<t.length;n++){var o=t[n];try{this.wrapperInitData[n]=i,this.wrapperInitData[n]=o.initialize?o.initialize.call(this):null}finally{if(this.wrapperInitData[n]===i)try{this.initializeAll(n+1)}catch(e){}}}},closeAll:function(e){this.isInTransaction()||("production"!==t.env.NODE_ENV?r(!1,"Transaction.closeAll(): Cannot close transaction when none are open."):o("28"));for(var n=this.transactionWrappers,a=e;a<n.length;a++){var s,u=n[a],c=this.wrapperInitData[a];try{s=!0,c!==i&&u.close&&u.close.call(this,c),s=!1}finally{if(s)try{this.closeAll(a+1)}catch(e){}}}this.wrapperInitData.length=0}};e.exports=a}).call(t,n(0))},function(e,t,n){"use strict";function o(e){var t=""+e,n=i.exec(t);if(!n)return t;var o,r="",a=0,s=0;for(a=n.index;a<t.length;a++){switch(t.charCodeAt(a)){case 34:o="&quot;";break;case 38:o="&amp;";break;case 39:o="&#x27;";break;case 60:o="&lt;";break;case 62:o="&gt;";break;default:continue}s!==a&&(r+=t.substring(s,a)),s=a+1,r+=o}return s!==a?r+t.substring(s,a):r}function r(e){return"boolean"==typeof e||"number"==typeof e?""+e:o(e)}var i=/["'&<>]/;e.exports=r},function(e,t,n){"use strict";var o,r=n(6),i=n(33),a=/^[ \r\n\t\f]/,s=/<(!--|link|noscript|meta|script|style)[ \r\n\t\f\/>]/,u=n(40),c=u(function(e,t){if(e.namespaceURI!==i.svg||"innerHTML"in e)e.innerHTML=t;else{o=o||document.createElement("div"),o.innerHTML="<svg>"+t+"</svg>";for(var n=o.firstChild;n.firstChild;)e.appendChild(n.firstChild)}});if(r.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]&&s.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 o(e,t){return e===t?0!==e||0!==t||1/e==1/t:e!==e&&t!==t}function r(e,t){if(o(e,t))return!0;if("object"!=typeof e||null===e||"object"!=typeof t||null===t)return!1;var n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(var a=0;a<n.length;a++)if(!i.call(t,n[a])||!o(e[n[a]],t[n[a]]))return!1;return!0}var i=Object.prototype.hasOwnProperty;e.exports=r},function(e,t,n){"use strict";(function(t){function o(e,t){return Array.isArray(t)&&(t=t[1]),t?t.nextSibling:e.firstChild}function r(e,t,n){l.insertTreeBefore(e,t,n)}function i(e,t,n){Array.isArray(t)?s(e,t[0],t[1],n):g(e,t,n)}function a(e,t){if(Array.isArray(t)){var n=t[1];t=t[0],u(e,t,n),e.removeChild(n)}e.removeChild(t)}function s(e,t,n,o){for(var r=t;;){var i=r.nextSibling;if(g(e,r,o),r===n)break;r=i}}function u(e,t,n){for(;;){var o=t.nextSibling;if(o===n)break;e.removeChild(o)}}function c(e,n,o){var r=e.parentNode,i=e.nextSibling;i===n?o&&g(r,document.createTextNode(o),i):o?(v(i,o),u(r,i,n)):u(r,e,n),"production"!==t.env.NODE_ENV&&f.debugTool.onHostOperation({instanceID:d.getInstanceFromNode(e)._debugID,type:"replace text",payload:o})}var l=n(17),p=n(101),d=n(5),f=n(8),h=n(40),m=n(30),v=n(74),g=h(function(e,t,n){e.insertBefore(t,n)}),y=p.dangerouslyReplaceNodeWithMarkup;"production"!==t.env.NODE_ENV&&(y=function(e,t,n){if(p.dangerouslyReplaceNodeWithMarkup(e,t),0!==n._debugID)f.debugTool.onHostOperation({instanceID:n._debugID,type:"replace with",payload:t.toString()});else{var o=d.getInstanceFromNode(t.node);0!==o._debugID&&f.debugTool.onHostOperation({instanceID:o._debugID,type:"mount",payload:t.toString()})}});var E={dangerouslyReplaceNodeWithMarkup:y,replaceDelimitedText:c,processUpdates:function(e,n){if("production"!==t.env.NODE_ENV)var s=d.getInstanceFromNode(e)._debugID;for(var u=0;u<n.length;u++){var c=n[u];switch(c.type){case"INSERT_MARKUP":r(e,c.content,o(e,c.afterNode)),"production"!==t.env.NODE_ENV&&f.debugTool.onHostOperation({instanceID:s,type:"insert child",payload:{toIndex:c.toIndex,content:c.content.toString()}});break;case"MOVE_EXISTING":i(e,c.fromNode,o(e,c.afterNode)),"production"!==t.env.NODE_ENV&&f.debugTool.onHostOperation({instanceID:s,type:"move child",payload:{fromIndex:c.fromIndex,toIndex:c.toIndex}});break;case"SET_MARKUP":m(e,c.content),"production"!==t.env.NODE_ENV&&f.debugTool.onHostOperation({instanceID:s,type:"replace children",payload:c.content.toString()});break;case"TEXT_CONTENT":v(e,c.content),"production"!==t.env.NODE_ENV&&f.debugTool.onHostOperation({instanceID:s,type:"replace text",payload:c.content.toString()});break;case"REMOVE_NODE":a(e,c.fromNode),"production"!==t.env.NODE_ENV&&f.debugTool.onHostOperation({instanceID:s,type:"remove child",payload:{fromIndex:c.fromIndex}})}}}};e.exports=E}).call(t,n(0))},function(e,t,n){"use strict";var o={html:"http://www.w3.org/1999/xhtml",mathml:"http://www.w3.org/1998/Math/MathML",svg:"http://www.w3.org/2000/svg"};e.exports=o},function(e,t,n){"use strict";(function(t){function o(e){return"topMouseUp"===e||"topTouchEnd"===e||"topTouchCancel"===e}function r(e){return"topMouseMove"===e||"topTouchMove"===e}function i(e){return"topMouseDown"===e||"topTouchStart"===e}function a(e,t,n,o){var r=e.type||"unknown-event";e.currentTarget=_.getNodeFromInstance(o),t?v.invokeGuardedCallbackWithCatch(r,n,e):v.invokeGuardedCallback(r,n,e),e.currentTarget=null}function s(e,n){var o=e._dispatchListeners,r=e._dispatchInstances;if("production"!==t.env.NODE_ENV&&h(e),Array.isArray(o))for(var i=0;i<o.length&&!e.isPropagationStopped();i++)a(e,n,o[i],r[i]);else o&&a(e,n,o,r);e._dispatchListeners=null,e._dispatchInstances=null}function u(e){var n=e._dispatchListeners,o=e._dispatchInstances;if("production"!==t.env.NODE_ENV&&h(e),Array.isArray(n)){for(var r=0;r<n.length&&!e.isPropagationStopped();r++)if(n[r](e,o[r]))return o[r]}else if(n&&n(e,o))return o;return null}function c(e){var t=u(e);return e._dispatchInstances=null,e._dispatchListeners=null,t}function l(e){"production"!==t.env.NODE_ENV&&h(e);var n=e._dispatchListeners,o=e._dispatchInstances;Array.isArray(n)&&("production"!==t.env.NODE_ENV?g(!1,"executeDirectDispatch(...): Invalid `event`."):m("103")),e.currentTarget=n?_.getNodeFromInstance(o):null;var r=n?n(e):null;return e.currentTarget=null,e._dispatchListeners=null,e._dispatchInstances=null,r}function p(e){return!!e._dispatchListeners}var d,f,h,m=n(3),v=n(38),g=n(1),y=n(2),E={injectComponentTree:function(e){d=e,"production"!==t.env.NODE_ENV&&"production"!==t.env.NODE_ENV&&y(e&&e.getNodeFromInstance&&e.getInstanceFromNode,"EventPluginUtils.injection.injectComponentTree(...): Injected module is missing getNodeFromInstance or getInstanceFromNode.")},injectTreeTraversal:function(e){f=e,"production"!==t.env.NODE_ENV&&"production"!==t.env.NODE_ENV&&y(e&&e.isAncestor&&e.getLowestCommonAncestor,"EventPluginUtils.injection.injectTreeTraversal(...): Injected module is missing isAncestor or getLowestCommonAncestor.")}};"production"!==t.env.NODE_ENV&&(h=function(e){var n=e._dispatchListeners,o=e._dispatchInstances,r=Array.isArray(n),i=r?n.length:n?1:0,a=Array.isArray(o),s=a?o.length:o?1:0;"production"!==t.env.NODE_ENV&&y(a===r&&s===i,"EventPluginUtils: Invalid `event`.")});var _={isEndish:o,isMoveish:r,isStartish:i,executeDirectDispatch:l,executeDispatchesInOrder:s,executeDispatchesInOrderStopAtTrue:c,hasDispatches:p,getInstanceFromNode:function(e){return d.getInstanceFromNode(e)},getNodeFromInstance:function(e){return d.getNodeFromInstance(e)},isAncestor:function(e,t){return f.isAncestor(e,t)},getLowestCommonAncestor:function(e,t){return f.getLowestCommonAncestor(e,t)},getParentInstance:function(e){return f.getParentInstance(e)},traverseTwoPhase:function(e,t,n){return f.traverseTwoPhase(e,t,n)},traverseEnterLeave:function(e,t,n,o,r){return f.traverseEnterLeave(e,t,n,o,r)},injection:E};e.exports=_}).call(t,n(0))},function(e,t,n){"use strict";function o(e){var t={"=":"=0",":":"=2"};return"$"+(""+e).replace(/[=:]/g,function(e){return t[e]})}function r(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:o,unescape:r};e.exports=i},function(e,t,n){"use strict";(function(t){function o(e){null!=e.checkedLink&&null!=e.valueLink&&("production"!==t.env.NODE_ENV?l(!1,"Cannot provide a checkedLink and a valueLink. If you want to use checkedLink, you probably don't want to use valueLink and vice versa."):s("87"))}function r(e){o(e),(null!=e.value||null!=e.onChange)&&("production"!==t.env.NODE_ENV?l(!1,"Cannot provide a valueLink and a value or onChange event. If you want to use value or onChange, you probably don't want to use valueLink."):s("88"))}function i(e){o(e),(null!=e.checked||null!=e.onChange)&&("production"!==t.env.NODE_ENV?l(!1,"Cannot provide a checkedLink and a checked property or onChange event. If you want to use checked or onChange, you probably don't want to use checkedLink"):s("89"))}function a(e){if(e){var t=e.getName();if(t)return" Check the render method of `"+t+"`."}return""}var s=n(3),u=n(19),c=n(66),l=n(1),p=n(2),d={button:!0,checkbox:!0,image:!0,hidden:!0,radio:!0,reset:!0,submit:!0},f={value:function(e,t,n){return!e[t]||d[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:u.PropTypes.func},h={},m={checkPropTypes:function(e,n,o){for(var r in f){if(f.hasOwnProperty(r))var i=f[r](n,r,e,"prop",null,c);if(i instanceof Error&&!(i.message in h)){h[i.message]=!0;var s=a(o);"production"!==t.env.NODE_ENV&&p(!1,"Failed form propType: %s%s",i.message,s)}}},getValue:function(e){return e.valueLink?(r(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?(r(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}).call(t,n(0))},function(e,t,n){"use strict";(function(t){var o=n(3),r=n(1),i=!1,a={replaceNodeWithMarkup:null,processChildrenUpdates:null,injection:{injectEnvironment:function(e){i&&("production"!==t.env.NODE_ENV?r(!1,"ReactCompositeComponent: injectEnvironment() can only be called once."):o("104")),a.replaceNodeWithMarkup=e.replaceNodeWithMarkup,a.processChildrenUpdates=e.processChildrenUpdates,i=!0}}};e.exports=a}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function n(e,t,n){try{t(n)}catch(e){null===o&&(o=e)}}var o=null,r={invokeGuardedCallback:n,invokeGuardedCallbackWithCatch:n,rethrowCaughtError:function(){if(o){var e=o;throw o=null,e}}};if("production"!==t.env.NODE_ENV&&"undefined"!=typeof window&&"function"==typeof window.dispatchEvent&&"undefined"!=typeof document&&"function"==typeof document.createEvent){var i=document.createElement("react");r.invokeGuardedCallback=function(e,t,n){var o=t.bind(null,n),r="react-"+e;i.addEventListener(r,o,!1);var a=document.createEvent("Event");a.initEvent(r,!1,!1),i.dispatchEvent(a),i.removeEventListener(r,o,!1)}}e.exports=r}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e){l.enqueueUpdate(e)}function r(e){var t=typeof e;if("object"!==t)return t;var n=e.constructor&&e.constructor.name||t,o=Object.keys(e);return o.length>0&&o.length<20?n+" (keys: "+o.join(", ")+")":n}function i(e,n){var o=u.get(e);if(!o){if("production"!==t.env.NODE_ENV){var r=e.constructor;"production"!==t.env.NODE_ENV&&d(!n,"%s(...): Can only update a mounted or mounting component. This usually means you called %s() on an unmounted component. This is a no-op. Please check the code for the %s component.",n,n,r&&(r.displayName||r.name)||"ReactClass")}return null}return"production"!==t.env.NODE_ENV&&"production"!==t.env.NODE_ENV&&d(null==s.current,"%s(...): Cannot update during an existing state transition (such as within `render` or another component's constructor). Render methods should be a pure function of props and state; constructor side-effects are an anti-pattern, but can be moved to `componentWillMount`.",n),o}var a=n(3),s=n(11),u=n(23),c=n(8),l=n(10),p=n(1),d=n(2),f={isMounted:function(e){if("production"!==t.env.NODE_ENV){var n=s.current;null!==n&&("production"!==t.env.NODE_ENV&&d(n._warnedAboutRefsInRender,"%s is accessing isMounted inside its render() function. render() should be a pure function of props and state. It should never access something that requires stale data from the previous render, such as refs. Move this logic to componentDidMount and componentDidUpdate instead.",n.getName()||"A component"),n._warnedAboutRefsInRender=!0)}var o=u.get(e);return!!o&&!!o._renderedComponent},enqueueCallback:function(e,t,n){f.validateCallback(t,n);var r=i(e);if(!r)return null;r._pendingCallbacks?r._pendingCallbacks.push(t):r._pendingCallbacks=[t],o(r)},enqueueCallbackInternal:function(e,t){e._pendingCallbacks?e._pendingCallbacks.push(t):e._pendingCallbacks=[t],o(e)},enqueueForceUpdate:function(e){var t=i(e,"forceUpdate");t&&(t._pendingForceUpdate=!0,o(t))},enqueueReplaceState:function(e,t){var n=i(e,"replaceState");n&&(n._pendingStateQueue=[t],n._pendingReplaceState=!0,o(n))},enqueueSetState:function(e,n){"production"!==t.env.NODE_ENV&&(c.debugTool.onSetState(),"production"!==t.env.NODE_ENV&&d(null!=n,"setState(...): You passed an undefined or null state object; instead, use forceUpdate()."));var r=i(e,"setState");if(r){(r._pendingStateQueue||(r._pendingStateQueue=[])).push(n),o(r)}},enqueueElementInternal:function(e,t,n){e._pendingElement=t,e._context=n,o(e)},validateCallback:function(e,n){e&&"function"!=typeof e&&("production"!==t.env.NODE_ENV?p(!1,"%s(...): Expected the last optional `callback` argument to be a function. Instead received: %s.",n,r(e)):a("122",n,r(e)))}};e.exports=f}).call(t,n(0))},function(e,t,n){"use strict";var o=function(e){return"undefined"!=typeof MSApp&&MSApp.execUnsafeLocalFunction?function(t,n,o,r){MSApp.execUnsafeLocalFunction(function(){return e(t,n,o,r)})}:e};e.exports=o},function(e,t,n){"use strict";function o(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=o},function(e,t,n){"use strict";function o(e){var t=this,n=t.nativeEvent;if(n.getModifierState)return n.getModifierState(e);var o=i[e];return!!o&&!!n[o]}function r(e){return o}var i={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};e.exports=r},function(e,t,n){"use strict";function o(e){var t=e.target||e.srcElement||window;return t.correspondingUseElement&&(t=t.correspondingUseElement),3===t.nodeType?t.parentNode:t}e.exports=o},function(e,t,n){"use strict";/**
+ * Checks if an event is supported in the current execution environment.
+ *
+ * NOTE: This will not work correctly for non-generic events such as `change`,
+ * `reset`, `load`, `error`, and `select`.
+ *
+ * Borrows from Modernizr.
+ *
+ * @param {string} eventNameSuffix Event name, e.g. "click".
+ * @param {?boolean} capture Check if the capture phase is supported.
+ * @return {boolean} True if the event is supported.
+ * @internal
+ * @license Modernizr 3.0.0pre (Custom Build) | MIT
+ */
+function o(e,t){if(!i.canUseDOM||t&&!("addEventListener"in document))return!1;var n="on"+e,o=n in document;if(!o){var a=document.createElement("div");a.setAttribute(n,"return;"),o="function"==typeof a[n]}return!o&&r&&"wheel"===e&&(o=document.implementation.hasFeature("Events.wheel","3.0")),o}var r,i=n(6);i.canUseDOM&&(r=document.implementation&&document.implementation.hasFeature&&!0!==document.implementation.hasFeature("","")),e.exports=o},function(e,t,n){"use strict";function o(e,t){var n=null===e||!1===e,o=null===t||!1===t;if(n||o)return n===o;var r=typeof e,i=typeof t;return"string"===r||"number"===r?"string"===i||"number"===i:"object"===i&&e.type===t.type&&e.key===t.key}e.exports=o},function(e,t,n){"use strict";(function(t){var o=n(4),r=n(9),i=n(2),a=r;if("production"!==t.env.NODE_ENV){var s=["address","applet","area","article","aside","base","basefont","bgsound","blockquote","body","br","button","caption","center","col","colgroup","dd","details","dir","div","dl","dt","embed","fieldset","figcaption","figure","footer","form","frame","frameset","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","iframe","img","input","isindex","li","link","listing","main","marquee","menu","menuitem","meta","nav","noembed","noframes","noscript","object","ol","p","param","plaintext","pre","script","section","select","source","style","summary","table","tbody","td","template","textarea","tfoot","th","thead","title","tr","track","ul","wbr","xmp"],u=["applet","caption","html","table","td","th","marquee","object","template","foreignObject","desc","title"],c=u.concat(["button"]),l=["dd","dt","li","option","optgroup","p","rp","rt"],p={current:null,formTag:null,aTagInScope:null,buttonTagInScope:null,nobrTagInScope:null,pTagInButtonScope:null,listItemTagAutoclosing:null,dlItemTagAutoclosing:null},d=function(e,t,n){var r=o({},e||p),i={tag:t,instance:n};return-1!==u.indexOf(t)&&(r.aTagInScope=null,r.buttonTagInScope=null,r.nobrTagInScope=null),-1!==c.indexOf(t)&&(r.pTagInButtonScope=null),-1!==s.indexOf(t)&&"address"!==t&&"div"!==t&&"p"!==t&&(r.listItemTagAutoclosing=null,r.dlItemTagAutoclosing=null),r.current=i,"form"===t&&(r.formTag=i),"a"===t&&(r.aTagInScope=i),"button"===t&&(r.buttonTagInScope=i),"nobr"===t&&(r.nobrTagInScope=i),"p"===t&&(r.pTagInButtonScope=i),"li"===t&&(r.listItemTagAutoclosing=i),"dd"!==t&&"dt"!==t||(r.dlItemTagAutoclosing=i),r},f=function(e,t){switch(t){case"select":return"option"===e||"optgroup"===e||"#text"===e;case"optgroup":return"option"===e||"#text"===e;case"option":return"#text"===e;case"tr":return"th"===e||"td"===e||"style"===e||"script"===e||"template"===e;case"tbody":case"thead":case"tfoot":return"tr"===e||"style"===e||"script"===e||"template"===e;case"colgroup":return"col"===e||"template"===e;case"table":return"caption"===e||"colgroup"===e||"tbody"===e||"tfoot"===e||"thead"===e||"style"===e||"script"===e||"template"===e;case"head":return"base"===e||"basefont"===e||"bgsound"===e||"link"===e||"meta"===e||"title"===e||"noscript"===e||"noframes"===e||"style"===e||"script"===e||"template"===e;case"html":return"head"===e||"body"===e;case"#document":return"html"===e}switch(e){case"h1":case"h2":case"h3":case"h4":case"h5":case"h6":return"h1"!==t&&"h2"!==t&&"h3"!==t&&"h4"!==t&&"h5"!==t&&"h6"!==t;case"rp":case"rt":return-1===l.indexOf(t);case"body":case"caption":case"col":case"colgroup":case"frame":case"head":case"html":case"tbody":case"td":case"tfoot":case"th":case"thead":case"tr":return null==t}return!0},h=function(e,t){switch(e){case"address":case"article":case"aside":case"blockquote":case"center":case"details":case"dialog":case"dir":case"div":case"dl":case"fieldset":case"figcaption":case"figure":case"footer":case"header":case"hgroup":case"main":case"menu":case"nav":case"ol":case"p":case"section":case"summary":case"ul":case"pre":case"listing":case"table":case"hr":case"xmp":case"h1":case"h2":case"h3":case"h4":case"h5":case"h6":return t.pTagInButtonScope;case"form":return t.formTag||t.pTagInButtonScope;case"li":return t.listItemTagAutoclosing;case"dd":case"dt":return t.dlItemTagAutoclosing;case"button":return t.buttonTagInScope;case"a":return t.aTagInScope;case"nobr":return t.nobrTagInScope}return null},m=function(e){if(!e)return[];var t=[];do{t.push(e)}while(e=e._currentElement._owner);return t.reverse(),t},v={};a=function(e,n,o,r){r=r||p;var a=r.current,s=a&&a.tag;null!=n&&("production"!==t.env.NODE_ENV&&i(null==e,"validateDOMNesting: when childText is passed, childTag should be null"),e="#text");var u=f(e,s)?null:a,c=u?null:h(e,r),l=u||c;if(l){var d,g=l.tag,y=l.instance,E=o&&o._currentElement._owner,_=y&&y._currentElement._owner,N=m(E),b=m(_),C=Math.min(N.length,b.length),D=-1;for(d=0;d<C&&N[d]===b[d];d++)D=d;var O=N.slice(D+1).map(function(e){return e.getName()||"(unknown)"}),w=b.slice(D+1).map(function(e){return e.getName()||"(unknown)"}),x=[].concat(-1!==D?N[D].getName()||"(unknown)":[],w,g,c?["..."]:[],O,e).join(" > "),T=!!u+"|"+e+"|"+g+"|"+x;if(v[T])return;v[T]=!0;var k=e,I="";if("#text"===e?/\S/.test(n)?k="Text nodes":(k="Whitespace text nodes",I=" Make sure you don't have any extra whitespace between tags on each line of your source code."):k="<"+e+">",u){var P="";"table"===g&&"tr"===e&&(P+=" Add a <tbody> to your code to match the DOM tree generated by the browser."),"production"!==t.env.NODE_ENV&&i(!1,"validateDOMNesting(...): %s cannot appear as a child of <%s>.%s See %s.%s",k,g,I,x,P)}else"production"!==t.env.NODE_ENV&&i(!1,"validateDOMNesting(...): %s cannot appear as a descendant of <%s>. See %s.",k,g,x)}},a.updatedAncestorInfo=d,a.isTagValidInContext=function(e,t){t=t||p;var n=t.current,o=n&&n.tag;return f(e,o)&&!h(e,t)}}e.exports=a}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e,t,n){this.props=e,this.context=t,this.refs=s,this.updater=n||i}var r=n(16),i=n(48),a=n(50),s=n(20),u=n(1),c=n(2);if(o.prototype.isReactComponent={},o.prototype.setState=function(e,n){"object"!=typeof e&&"function"!=typeof e&&null!=e&&("production"!==t.env.NODE_ENV?u(!1,"setState(...): takes an object of state variables to update or a function which returns an object of state variables."):r("85")),this.updater.enqueueSetState(this,e),n&&this.updater.enqueueCallback(this,n,"setState")},o.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this),e&&this.updater.enqueueCallback(this,e,"forceUpdate")},"production"!==t.env.NODE_ENV){var l={isMounted:["isMounted","Instead, make sure to clean up subscriptions and pending requests in componentWillUnmount to prevent memory leaks."],replaceState:["replaceState","Refactor your code to use setState instead (see https://github.com/facebook/react/issues/3236)."]};for(var p in l)l.hasOwnProperty(p)&&function(e,n){a&&Object.defineProperty(o.prototype,e,{get:function(){"production"!==t.env.NODE_ENV&&c(!1,"%s(...) is deprecated in plain JavaScript React classes. %s",n[0],n[1])}})}(p,l[p])}e.exports=o}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e,n){if("production"!==t.env.NODE_ENV){var o=e.constructor;"production"!==t.env.NODE_ENV&&r(!1,"%s(...): Can only update a mounted or mounting component. This usually means you called %s() on an unmounted component. This is a no-op. Please check the code for the %s component.",n,n,o&&(o.displayName||o.name)||"ReactClass")}}var r=n(2),i={isMounted:function(e){return!1},enqueueCallback:function(e,t){},enqueueForceUpdate:function(e){o(e,"forceUpdate")},enqueueReplaceState:function(e,t){o(e,"replaceState")},enqueueSetState:function(e,t){o(e,"setState")}};e.exports=i}).call(t,n(0))},function(e,t,n){"use strict";(function(t){var n={};"production"!==t.env.NODE_ENV&&(n={prop:"prop",context:"context",childContext:"child context"}),e.exports=n}).call(t,n(0))},function(e,t,n){"use strict";(function(t){var n=!1;if("production"!==t.env.NODE_ENV)try{Object.defineProperty({},"x",{get:function(){}}),n=!0}catch(e){}e.exports=n}).call(t,n(0))},function(e,t,n){"use strict";function o(e){var t=e&&(r&&e[r]||e[i]);if("function"==typeof t)return t}var r="function"==typeof Symbol&&Symbol.iterator,i="@@iterator";e.exports=o},function(e,t,n){"use strict";(function(t){var o=n(9),r={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,n,r){return e.addEventListener?(e.addEventListener(n,r,!0),{remove:function(){e.removeEventListener(n,r,!0)}}):("production"!==t.env.NODE_ENV&&console.error("Attempted to listen to events during the capture phase on a browser that does not support the capture phase. Your application will not receive some events."),{remove:o})},registerDefault:function(){}};e.exports=r}).call(t,n(0))},function(e,t,n){"use strict";function o(e){try{e.focus()}catch(e){}}e.exports=o},function(e,t,n){"use strict";function o(e){if(void 0===(e=e||("undefined"!=typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(t){return e.body}}e.exports=o},function(e,t,n){"use strict";function o(e,t){return e+t.charAt(0).toUpperCase()+t.substring(1)}var r={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,gridColumn:!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(r).forEach(function(e){i.forEach(function(t){r[o(t,e)]=r[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}},s={isUnitlessNumber:r,shorthandPropertyExpansions:a};e.exports=s},function(e,t,n){"use strict";(function(t){function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var r=n(3),i=n(14),a=n(1),s=function(){function e(t){o(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,n=this._contexts,o=this._arg;if(e&&n){e.length!==n.length&&("production"!==t.env.NODE_ENV?a(!1,"Mismatched list of contexts in callback queue"):r("24")),this._callbacks=null,this._contexts=null;for(var i=0;i<e.length;i++)e[i].call(n[i],o);e.length=0,n.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(s)}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e){return!!d.hasOwnProperty(e)||!p.hasOwnProperty(e)&&(l.test(e)?(d[e]=!0,!0):(p[e]=!0,"production"!==t.env.NODE_ENV&&c(!1,"Invalid attribute name: `%s`",e),!1))}function r(e,t){return null==t||e.hasBooleanValue&&!t||e.hasNumericValue&&isNaN(t)||e.hasPositiveNumericValue&&t<1||e.hasOverloadedBooleanValue&&!1===t}var i=n(13),a=n(5),s=n(8),u=n(165),c=n(2),l=new RegExp("^["+i.ATTRIBUTE_NAME_START_CHAR+"]["+i.ATTRIBUTE_NAME_CHAR+"]*$"),p={},d={},f={createMarkupForID:function(e){return i.ID_ATTRIBUTE_NAME+"="+u(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(r(n,t))return"";var o=n.attributeName;return n.hasBooleanValue||n.hasOverloadedBooleanValue&&!0===t?o+'=""':o+"="+u(t)}return i.isCustomAttribute(e)?null==t?"":e+"="+u(t):null},createMarkupForCustomAttribute:function(e,t){return o(e)&&null!=t?e+"="+u(t):""},setValueForProperty:function(e,n,o){var u=i.properties.hasOwnProperty(n)?i.properties[n]:null;if(u){var c=u.mutationMethod;if(c)c(e,o);else{if(r(u,o))return void this.deleteValueForProperty(e,n);if(u.mustUseProperty)e[u.propertyName]=o;else{var l=u.attributeName,p=u.attributeNamespace;p?e.setAttributeNS(p,l,""+o):u.hasBooleanValue||u.hasOverloadedBooleanValue&&!0===o?e.setAttribute(l,""):e.setAttribute(l,""+o)}}}else if(i.isCustomAttribute(n))return void f.setValueForAttribute(e,n,o);if("production"!==t.env.NODE_ENV){var d={};d[n]=o,s.debugTool.onHostOperation({instanceID:a.getInstanceFromNode(e)._debugID,type:"update attribute",payload:d})}},setValueForAttribute:function(e,n,r){if(o(n)&&(null==r?e.removeAttribute(n):e.setAttribute(n,""+r),"production"!==t.env.NODE_ENV)){var i={};i[n]=r,s.debugTool.onHostOperation({instanceID:a.getInstanceFromNode(e)._debugID,type:"update attribute",payload:i})}},deleteValueForAttribute:function(e,n){e.removeAttribute(n),"production"!==t.env.NODE_ENV&&s.debugTool.onHostOperation({instanceID:a.getInstanceFromNode(e)._debugID,type:"remove attribute",payload:n})},deleteValueForProperty:function(e,n){var o=i.properties.hasOwnProperty(n)?i.properties[n]:null;if(o){var r=o.mutationMethod;if(r)r(e,void 0);else if(o.mustUseProperty){var u=o.propertyName;o.hasBooleanValue?e[u]=!1:e[u]=""}else e.removeAttribute(o.attributeName)}else i.isCustomAttribute(n)&&e.removeAttribute(n);"production"!==t.env.NODE_ENV&&s.debugTool.onHostOperation({instanceID:a.getInstanceFromNode(e)._debugID,type:"remove attribute",payload:n})}};e.exports=f}).call(t,n(0))},function(e,t,n){"use strict";var o={hasCachedChildNodes:1};e.exports=o},function(e,t,n){"use strict";(function(t){function o(){if(this._rootNodeID&&this._wrapperState.pendingUpdate){this._wrapperState.pendingUpdate=!1;var e=this._currentElement.props,t=c.getValue(e);null!=t&&a(this,Boolean(e.multiple),t)}}function r(e){if(e){var t=e.getName();if(t)return" Check the render method of `"+t+"`."}return""}function i(e,n){var o=e._currentElement._owner;c.checkPropTypes("select",n,o),void 0===n.valueLink||f||("production"!==t.env.NODE_ENV&&d(!1,"`valueLink` prop on `select` is deprecated; set `value` and `onChange` instead."),f=!0);for(var i=0;i<m.length;i++){var a=m[i];if(null!=n[a]){var s=Array.isArray(n[a]);n.multiple&&!s?"production"!==t.env.NODE_ENV&&d(!1,"The `%s` prop supplied to <select> must be an array if `multiple` is true.%s",a,r(o)):!n.multiple&&s&&"production"!==t.env.NODE_ENV&&d(!1,"The `%s` prop supplied to <select> must be a scalar value if `multiple` is false.%s",a,r(o))}}}function a(e,t,n){var o,r,i=l.getNodeFromInstance(e).options;if(t){for(o={},r=0;r<n.length;r++)o[""+n[r]]=!0;for(r=0;r<i.length;r++){var a=o.hasOwnProperty(i[r].value);i[r].selected!==a&&(i[r].selected=a)}}else{for(o=""+n,r=0;r<i.length;r++)if(i[r].value===o)return void(i[r].selected=!0);i.length&&(i[0].selected=!0)}}function s(e){var t=this._currentElement.props,n=c.executeOnChange(t,e);return this._rootNodeID&&(this._wrapperState.pendingUpdate=!0),p.asap(o,this),n}var u=n(4),c=n(36),l=n(5),p=n(10),d=n(2),f=!1,h=!1,m=["value","defaultValue"],v={getHostProps:function(e,t){return u({},t,{onChange:e._wrapperState.onChange,value:void 0})},mountWrapper:function(e,n){"production"!==t.env.NODE_ENV&&i(e,n);var o=c.getValue(n);e._wrapperState={pendingUpdate:!1,initialValue:null!=o?o:n.defaultValue,listeners:null,onChange:s.bind(e),wasMultiple:Boolean(n.multiple)},void 0===n.value||void 0===n.defaultValue||h||("production"!==t.env.NODE_ENV&&d(!1,"Select elements must be either controlled or uncontrolled (specify either the value prop, or the defaultValue prop, but not both). Decide between using a controlled or uncontrolled select element and remove one of these props. More info: https://fb.me/react-controlled-components"),h=!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 o=c.getValue(t);null!=o?(e._wrapperState.pendingUpdate=!1,a(e,Boolean(t.multiple),o)):n!==Boolean(t.multiple)&&(null!=t.defaultValue?a(e,Boolean(t.multiple),t.defaultValue):a(e,Boolean(t.multiple),t.multiple?[]:""))}};e.exports=v}).call(t,n(0))},function(e,t,n){"use strict";var o,r={injectEmptyComponentFactory:function(e){o=e}},i={create:function(e){return o(e)}};i.injection=r,e.exports=i},function(e,t,n){"use strict";var o={logTopLevelRenders:!1};e.exports=o},function(e,t,n){"use strict";(function(t){function o(e){return u||("production"!==t.env.NODE_ENV?s(!1,"There is no registered component for the tag %s",e.type):a("111",e.type)),new u(e)}function r(e){return new c(e)}function i(e){return e instanceof c}var a=n(3),s=n(1),u=null,c=null,l={injectGenericComponentClass:function(e){u=e},injectTextComponentClass:function(e){c=e}},p={createInternalComponent:o,createInstanceForText:r,isTextComponent:i,injection:l};e.exports=p}).call(t,n(0))},function(e,t,n){"use strict";function o(e){return i(document.documentElement,e)}var r=n(119),i=n(84),a=n(53),s=n(54),u={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=s();return{focusedElem:e,selectionRange:u.hasSelectionCapabilities(e)?u.getSelection(e):null}},restoreSelection:function(e){var t=s(),n=e.focusedElem,r=e.selectionRange;t!==n&&o(n)&&(u.hasSelectionCapabilities(n)&&u.setSelection(n,r),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=r.getOffsets(e);return t||{start:0,end:0}},setSelection:function(e,t){var n=t.start,o=t.end;if(void 0===o&&(o=n),"selectionStart"in e)e.selectionStart=n,e.selectionEnd=Math.min(o,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",o-n),i.select()}else r.setOffsets(e,t)}};e.exports=u},function(e,t,n){"use strict";(function(t){function o(e,t){for(var n=Math.min(e.length,t.length),o=0;o<n;o++)if(e.charAt(o)!==t.charAt(o))return o;return e.length===t.length?-1:n}function r(e){return e?e.nodeType===j?e.documentElement:e.firstChild:null}function i(e){return e.getAttribute&&e.getAttribute(U)||""}function a(e,t,n,o,r){var i;if(D.logTopLevelRenders){var a=e._currentElement.props.child,s=a.type;i="React mount: "+("string"==typeof s?s:s.displayName||s.name),console.time(i)}var u=T.mountComponent(e,n,null,b(e,t),r,0);i&&console.timeEnd(i),e._renderedComponent._topLevelWrapper=e,Y._mountImageIntoNode(u,t,e,o,n)}function s(e,t,n,o){var r=I.ReactReconcileTransaction.getPooled(!n&&C.useCreateElement);r.perform(a,null,e,t,r,n,o),I.ReactReconcileTransaction.release(r)}function u(e,n,o){for("production"!==t.env.NODE_ENV&&w.debugTool.onBeginFlush(),T.unmountComponent(e,o),"production"!==t.env.NODE_ENV&&w.debugTool.onEndFlush(),n.nodeType===j&&(n=n.documentElement);n.lastChild;)n.removeChild(n.lastChild)}function c(e){var t=r(e);if(t){var n=N.getInstanceFromNode(t);return!(!n||!n._hostParent)}}function l(e){var t=r(e);return!(!t||!d(t)||N.getInstanceFromNode(t))}function p(e){return!(!e||e.nodeType!==F&&e.nodeType!==j&&e.nodeType!==B)}function d(e){return p(e)&&(e.hasAttribute(L)||e.hasAttribute(U))}function f(e){var t=r(e),n=t&&N.getInstanceFromNode(t);return n&&!n._hostParent?n:null}function h(e){var t=f(e);return t?t._hostContainerInfo._topLevelWrapper:null}var m=n(3),v=n(17),g=n(13),y=n(19),E=n(26),_=n(11),N=n(5),b=n(111),C=n(113),D=n(61),O=n(23),w=n(8),x=n(133),T=n(18),k=n(39),I=n(10),P=n(20),S=n(72),V=n(1),R=n(30),M=n(45),A=n(2),U=g.ID_ATTRIBUTE_NAME,L=g.ROOT_ATTRIBUTE_NAME,F=1,j=9,B=11,H={},W=1,q=function(){this.rootID=W++};q.prototype.isReactComponent={},"production"!==t.env.NODE_ENV&&(q.displayName="TopLevelWrapper"),q.prototype.render=function(){return this.props.child},q.isReactTopLevelWrapper=!0;var Y={TopLevelWrapper:q,_instancesByReactRootID:H,scrollMonitor:function(e,t){t()},_updateRootComponent:function(e,t,n,o,r){return Y.scrollMonitor(o,function(){k.enqueueElementInternal(e,t,n),r&&k.enqueueCallbackInternal(e,r)}),e},_renderNewRootComponent:function(e,n,o,r){"production"!==t.env.NODE_ENV&&A(null==_.current,"_renderNewRootComponent(): Render methods should be a pure function of props and state; triggering nested component updates from render is not allowed. If necessary, trigger nested updates in componentDidUpdate. Check the render method of %s.",_.current&&_.current.getName()||"ReactCompositeComponent"),p(n)||("production"!==t.env.NODE_ENV?V(!1,"_registerComponent(...): Target container is not a DOM element."):m("37")),E.ensureScrollValueMonitoring();var i=S(e,!1);I.batchedUpdates(s,i,n,o,r);var a=i._instance.rootID;return H[a]=i,i},renderSubtreeIntoContainer:function(e,n,o,r){return null!=e&&O.has(e)||("production"!==t.env.NODE_ENV?V(!1,"parentComponent must be a valid React Component"):m("38")),Y._renderSubtreeIntoContainer(e,n,o,r)},_renderSubtreeIntoContainer:function(e,n,o,a){k.validateCallback(a,"ReactDOM.render"),y.isValidElement(n)||("production"!==t.env.NODE_ENV?V(!1,"ReactDOM.render(): Invalid component element.%s","string"==typeof n?" Instead of passing a string like 'div', pass React.createElement('div') or <div />.":"function"==typeof n?" Instead of passing a class like Foo, pass React.createElement(Foo) or <Foo />.":null!=n&&void 0!==n.props?" This may be caused by unintentionally loading two independent copies of React.":""):m("39","string"==typeof n?" Instead of passing a string like 'div', pass React.createElement('div') or <div />.":"function"==typeof n?" Instead of passing a class like Foo, pass React.createElement(Foo) or <Foo />.":null!=n&&void 0!==n.props?" This may be caused by unintentionally loading two independent copies of React.":"")),"production"!==t.env.NODE_ENV&&A(!o||!o.tagName||"BODY"!==o.tagName.toUpperCase(),"render(): Rendering components directly into document.body is discouraged, since its children are often manipulated by third-party scripts and browser extensions. This may lead to subtle reconciliation issues. Try rendering into a container element created for your app.");var s,u=y.createElement(q,{child:n});if(e){var l=O.get(e);s=l._processChildContext(l._context)}else s=P;var p=h(o);if(p){var d=p._currentElement,f=d.props.child;if(M(f,n)){var v=p._renderedComponent.getPublicInstance(),g=a&&function(){a.call(v)};return Y._updateRootComponent(p,u,s,o,g),v}Y.unmountComponentAtNode(o)}var E=r(o),_=E&&!!i(E),N=c(o);if("production"!==t.env.NODE_ENV&&("production"!==t.env.NODE_ENV&&A(!N,"render(...): Replacing React-rendered children with a new root component. If you intended to update the children of this node, you should instead have the existing children update their state and render the new components instead of calling ReactDOM.render."),!_||E.nextSibling))for(var b=E;b;){if(i(b)){"production"!==t.env.NODE_ENV&&A(!1,"render(): Target node has markup rendered by React, but there are unrelated nodes as well. This is most commonly caused by white-space inserted around server-rendered markup.");break}b=b.nextSibling}var C=_&&!p&&!N,D=Y._renderNewRootComponent(u,o,C,s)._renderedComponent.getPublicInstance();return a&&a.call(D),D},render:function(e,t,n){return Y._renderSubtreeIntoContainer(null,e,t,n)},unmountComponentAtNode:function(e){"production"!==t.env.NODE_ENV&&A(null==_.current,"unmountComponentAtNode(): Render methods should be a pure function of props and state; triggering nested component updates from render is not allowed. If necessary, trigger nested updates in componentDidUpdate. Check the render method of %s.",_.current&&_.current.getName()||"ReactCompositeComponent"),p(e)||("production"!==t.env.NODE_ENV?V(!1,"unmountComponentAtNode(...): Target container is not a DOM element."):m("40")),"production"!==t.env.NODE_ENV&&"production"!==t.env.NODE_ENV&&A(!l(e),"unmountComponentAtNode(): The node you're attempting to unmount was rendered by another copy of React.");var n=h(e);if(!n){var o=c(e),r=1===e.nodeType&&e.hasAttribute(L);return"production"!==t.env.NODE_ENV&&"production"!==t.env.NODE_ENV&&A(!o,"unmountComponentAtNode(): The node you're attempting to unmount was rendered by React and is not a top-level container. %s",r?"You may have accidentally passed in a React root node instead of its container.":"Instead, have the parent component update its state and rerender in order to remove this component."),!1}return delete H[n._instance.rootID],I.batchedUpdates(u,n,e,!1),!0},_mountImageIntoNode:function(e,n,i,a,s){if(p(n)||("production"!==t.env.NODE_ENV?V(!1,"mountComponentIntoNode(...): Target container is not valid."):m("41")),a){var u=r(n);if(x.canReuseMarkup(e,u))return void N.precacheNode(i,u);var c=u.getAttribute(x.CHECKSUM_ATTR_NAME);u.removeAttribute(x.CHECKSUM_ATTR_NAME);var l=u.outerHTML;u.setAttribute(x.CHECKSUM_ATTR_NAME,c);var d=e;if("production"!==t.env.NODE_ENV){var f;n.nodeType===F?(f=document.createElement("div"),f.innerHTML=e,d=f.innerHTML):(f=document.createElement("iframe"),document.body.appendChild(f),f.contentDocument.write(e),d=f.contentDocument.documentElement.outerHTML,document.body.removeChild(f))}var h=o(d,l),g=" (client) "+d.substring(h-20,h+20)+"\n (server) "+l.substring(h-20,h+20);n.nodeType===j&&("production"!==t.env.NODE_ENV?V(!1,"You're trying to render a component to the document using server rendering but the checksum was invalid. This usually means you rendered a different component type or props on the client from the one on the server, or your render() methods are impure. React cannot handle this case due to cross-browser quirks by rendering at the document root. You should look for environment dependent code in your components and ensure the props are the same client and server side:\n%s",g):m("42",g)),"production"!==t.env.NODE_ENV&&"production"!==t.env.NODE_ENV&&A(!1,"React attempted to reuse markup in a container but the checksum was invalid. This generally means that you are using server rendering and the markup generated on the server was not what the client was expecting. React injected new markup to compensate which works but you have lost many of the benefits of server rendering. Instead, figure out why the markup being generated is different on the client or server:\n%s",g)}if(n.nodeType===j&&("production"!==t.env.NODE_ENV?V(!1,"You're trying to render a component to the document but you didn't use server rendering. We can't do this without using server rendering due to cross-browser quirks. See ReactDOMServer.renderToString() for server rendering."):m("43")),s.useCreateElement){for(;n.lastChild;)n.removeChild(n.lastChild);v.insertTreeBefore(n,e,null)}else R(n,e),N.precacheNode(i,n.firstChild);if("production"!==t.env.NODE_ENV){var y=N.getInstanceFromNode(n.firstChild);0!==y._debugID&&w.debugTool.onHostOperation({instanceID:y._debugID,type:"mount",payload:e.toString()})}}};e.exports=Y}).call(t,n(0))},function(e,t,n){"use strict";(function(t){var o=n(3),r=n(19),i=n(1),a={HOST:0,COMPOSITE:1,EMPTY:2,getType:function(e){return null===e||!1===e?a.EMPTY:r.isValidElement(e)?"function"==typeof e.type?a.COMPOSITE:a.HOST:void("production"!==t.env.NODE_ENV?i(!1,"Unexpected node: %s",e):o("26",e))}};e.exports=a}).call(t,n(0))},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 o={currentScrollLeft:0,currentScrollTop:0,refreshScrollValues:function(e){o.currentScrollLeft=e.x,o.currentScrollTop=e.y}};e.exports=o},function(e,t,n){"use strict";(function(t){function o(e,n){return null==n&&("production"!==t.env.NODE_ENV?i(!1,"accumulateInto(...): Accumulated items must not be null or undefined."):r("30")),null==e?n:Array.isArray(e)?Array.isArray(n)?(e.push.apply(e,n),e):(e.push(n),e):Array.isArray(n)?[e].concat(n):[e,n]}var r=n(3),i=n(1);e.exports=o}).call(t,n(0))},function(e,t,n){"use strict";function o(e,t,n){Array.isArray(e)?e.forEach(t,n):e&&t.call(n,e)}e.exports=o},function(e,t,n){"use strict";function o(e){for(var t;(t=e._renderedNodeType)===r.COMPOSITE;)e=e._renderedComponent;return t===r.HOST?e._renderedComponent:t===r.EMPTY?null:void 0}var r=n(65);e.exports=o},function(e,t,n){"use strict";function o(){return!i&&r.canUseDOM&&(i="textContent"in document.documentElement?"textContent":"innerText"),i}var r=n(6),i=null;e.exports=o},function(e,t,n){"use strict";(function(t){function o(e){if(e){var t=e.getName();if(t)return" Check the render method of `"+t+"`."}return""}function r(e){return"function"==typeof e&&void 0!==e.prototype&&"function"==typeof e.prototype.mountComponent&&"function"==typeof e.prototype.receiveComponent}function i(e,n){var s;if(null===e||!1===e)s=c.create(i);else if("object"==typeof e){var u=e,m=u.type;if("function"!=typeof m&&"string"!=typeof m){var v="";"production"!==t.env.NODE_ENV&&(void 0===m||"object"==typeof m&&null!==m&&0===Object.keys(m).length)&&(v+=" You likely forgot to export your component from the file it's defined in."),v+=o(u._owner),"production"!==t.env.NODE_ENV?d(!1,"Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s",null==m?m:typeof m,v):a("130",null==m?m:typeof m,v)}"string"==typeof u.type?s=l.createInternalComponent(u):r(u.type)?(s=new u.type(u),s.getHostNode||(s.getHostNode=s.getNativeNode)):s=new h(u)}else"string"==typeof e||"number"==typeof e?s=l.createInstanceForText(e):"production"!==t.env.NODE_ENV?d(!1,"Encountered invalid React node of type %s",typeof e):a("131",typeof e);return"production"!==t.env.NODE_ENV&&"production"!==t.env.NODE_ENV&&f("function"==typeof s.mountComponent&&"function"==typeof s.receiveComponent&&"function"==typeof s.getHostNode&&"function"==typeof s.unmountComponent,"Only React Components can be mounted."),s._mountIndex=0,s._mountImage=null,"production"!==t.env.NODE_ENV&&(s._debugID=n?p():0),"production"!==t.env.NODE_ENV&&Object.preventExtensions&&Object.preventExtensions(s),s}var a=n(3),s=n(4),u=n(108),c=n(60),l=n(62),p=n(162),d=n(1),f=n(2),h=function(e){this.construct(e)};s(h.prototype,u,{_instantiateReactComponent:i}),e.exports=i}).call(t,n(0))},function(e,t,n){"use strict";function o(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!r[e.type]:"textarea"===t}var r={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=o},function(e,t,n){"use strict";var o=n(6),r=n(29),i=n(30),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};o.canUseDOM&&("textContent"in document.documentElement||(a=function(e,t){if(3===e.nodeType)return void(e.nodeValue=t);i(e,r(t))})),e.exports=a},function(e,t,n){"use strict";(function(t){function o(e,t){return e&&"object"==typeof e&&null!=e.key?p.escape(e.key):t.toString(36)}function r(e,n,i,v){var g=typeof e;if("undefined"!==g&&"boolean"!==g||(e=null),null===e||"string"===g||"number"===g||"object"===g&&e.$$typeof===u)return i(v,e,""===n?f+o(e,0):n),1;var y,E,_=0,N=""===n?f:n+h;if(Array.isArray(e))for(var b=0;b<e.length;b++)y=e[b],E=N+o(y,b),_+=r(y,E,i,v);else{var C=c(e);if(C){var D,O=C.call(e);if(C!==e.entries)for(var w=0;!(D=O.next()).done;)y=D.value,E=N+o(y,w++),_+=r(y,E,i,v);else{if("production"!==t.env.NODE_ENV){var x="";if(s.current){var T=s.current.getName();T&&(x=" Check the render method of `"+T+"`.")}"production"!==t.env.NODE_ENV&&d(m,"Using Maps as children is not yet fully supported. It is an experimental feature that might be removed. Convert it to a sequence / iterable of keyed ReactElements instead.%s",x),m=!0}for(;!(D=O.next()).done;){var k=D.value;k&&(y=k[1],E=N+p.escape(k[0])+h+o(y,0),_+=r(y,E,i,v))}}}else if("object"===g){var I="";if("production"!==t.env.NODE_ENV&&(I=" If you meant to render a collection of children, use an array instead or wrap the object using createFragment(object) from the React add-ons.",e._isReactElement&&(I=" It looks like you're using an element created by a different version of React. Make sure to use only one copy of React."),s.current)){var P=s.current.getName();P&&(I+=" Check the render method of `"+P+"`.")}var S=String(e);"production"!==t.env.NODE_ENV?l(!1,"Objects are not valid as a React child (found: %s).%s","[object Object]"===S?"object with keys {"+Object.keys(e).join(", ")+"}":S,I):a("31","[object Object]"===S?"object with keys {"+Object.keys(e).join(", ")+"}":S,I)}}return _}function i(e,t,n){return null==e?0:r(e,"",t,n)}var a=n(3),s=n(11),u=n(127),c=n(161),l=n(1),p=n(35),d=n(2),f=".",h=":",m=!1;e.exports=i}).call(t,n(0))},function(e,t,n){"use strict";var o="function"==typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103;e.exports=o},function(e,t,n){"use strict";(function(t){function o(){if(u.current){var e=u.current.getName();if(e)return" Check the render method of `"+e+"`."}return""}function r(e){var t=o();if(!t){var n="string"==typeof e?e:e.displayName||e.name;n&&(t=" Check the top-level render call using <"+n+">.")}return t}function i(e,n){if(e._store&&!e._store.validated&&null==e.key){e._store.validated=!0;var o=m.uniqueKey||(m.uniqueKey={}),i=r(n);if(!o[i]){o[i]=!0;var a="";e&&e._owner&&e._owner!==u.current&&(a=" It was passed a child from "+e._owner.getName()+"."),"production"!==t.env.NODE_ENV&&h(!1,'Each child in an array or iterator should have a unique "key" prop.%s%s See https://fb.me/react-warning-keys for more information.%s',i,a,c.getCurrentStackAddendum(e))}}}function a(e,t){if("object"==typeof e)if(Array.isArray(e))for(var n=0;n<e.length;n++){var o=e[n];l.isValidElement(o)&&i(o,t)}else if(l.isValidElement(e))e._store&&(e._store.validated=!0);else if(e){var r=f(e);if(r&&r!==e.entries)for(var a,s=r.call(e);!(a=s.next()).done;)l.isValidElement(a.value)&&i(a.value,t)}}function s(e){var n=e.type;if("function"==typeof n){var o=n.displayName||n.name;n.propTypes&&p(n.propTypes,e.props,"prop",o,e,null),"function"==typeof n.getDefaultProps&&"production"!==t.env.NODE_ENV&&h(n.getDefaultProps.isReactClassApproved,"getDefaultProps is only used on classic React.createClass definitions. Use a static property named `defaultProps` instead.")}}var u=n(11),c=n(7),l=n(15),p=n(175),d=n(50),f=n(51),h=n(2),m={},v={createElement:function(e,n,r){var i="string"==typeof e||"function"==typeof e;if(!i&&"function"!=typeof e&&"string"!=typeof e){var u="";(void 0===e||"object"==typeof e&&null!==e&&0===Object.keys(e).length)&&(u+=" You likely forgot to export your component from the file it's defined in."),u+=o(),"production"!==t.env.NODE_ENV&&h(!1,"React.createElement: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s",null==e?e:typeof e,u)}var c=l.createElement.apply(this,arguments);if(null==c)return c;if(i)for(var p=2;p<arguments.length;p++)a(arguments[p],e);return s(c),c},createFactory:function(e){var n=v.createElement.bind(null,e);return n.type=e,"production"!==t.env.NODE_ENV&&d&&Object.defineProperty(n,"type",{enumerable:!1,get:function(){return"production"!==t.env.NODE_ENV&&h(!1,"Factory.type is deprecated. Access the class directly before passing it to createFactory."),Object.defineProperty(this,"type",{value:e}),e}}),n},cloneElement:function(e,t,n){for(var o=l.cloneElement.apply(this,arguments),r=2;r<arguments.length;r++)a(arguments[r],o.type);return s(o),o}};e.exports=v}).call(t,n(0))},function(e,t,n){"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},function(e,t,n){"use strict";e.exports=n(109)},function(e,t,n){"use strict";e.exports=n(19)},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.React=t.render=void 0;var o=n(80),r=function(e){return e&&e.__esModule?e:{default:e}}(o),i=n(79);t.render=i.render,t.React=r.default},function(e,t,n){"use strict";function o(e){return e.replace(r,function(e,t){return t.toUpperCase()})}var r=/-(.)/g;e.exports=o},function(e,t,n){"use strict";function o(e){return r(e.replace(i,"ms-"))}var r=n(82),i=/^-ms-/;e.exports=o},function(e,t,n){"use strict";function o(e,t){return!(!e||!t)&&(e===t||!r(e)&&(r(t)?o(e,t.parentNode):"contains"in e?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}var r=n(92);e.exports=o},function(e,t,n){"use strict";(function(t){function o(e){var n=e.length;if((Array.isArray(e)||"object"!=typeof e&&"function"!=typeof e)&&("production"!==t.env.NODE_ENV?a(!1,"toArray: Array-like object expected"):a(!1)),"number"!=typeof n&&("production"!==t.env.NODE_ENV?a(!1,"toArray: Object needs a length property"):a(!1)),0===n||n-1 in e||("production"!==t.env.NODE_ENV?a(!1,"toArray: Object should have keys for indices"):a(!1)),"function"==typeof e.callee&&("production"!==t.env.NODE_ENV?a(!1,"toArray: Object can't be `arguments`. Use rest params (function(...args) {}) or Array.from() instead."):a(!1)),e.hasOwnProperty)try{return Array.prototype.slice.call(e)}catch(e){}for(var o=Array(n),r=0;r<n;r++)o[r]=e[r];return o}function r(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 r(e)?Array.isArray(e)?e.slice():o(e):[e]}var a=n(1);e.exports=i}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e){var t=e.match(l);return t&&t[1].toLowerCase()}function r(e,n){var r=c;c||("production"!==t.env.NODE_ENV?u(!1,"createNodesFromMarkup dummy not initialized"):u(!1));var i=o(e),l=i&&s(i);if(l){r.innerHTML=l[1]+e+l[2];for(var p=l[0];p--;)r=r.lastChild}else r.innerHTML=e;var d=r.getElementsByTagName("script");d.length&&(n||("production"!==t.env.NODE_ENV?u(!1,"createNodesFromMarkup(...): Unexpected <script> element rendered."):u(!1)),a(d).forEach(n));for(var f=Array.from(r.childNodes);r.lastChild;)r.removeChild(r.lastChild);return f}var i=n(6),a=n(85),s=n(87),u=n(1),c=i.canUseDOM?document.createElement("div"):null,l=/^\s*<(\w+)/;e.exports=r}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e){return a||("production"!==t.env.NODE_ENV?i(!1,"Markup wrapping node not initialized"):i(!1)),d.hasOwnProperty(e)||(e="*"),s.hasOwnProperty(e)||(a.innerHTML="*"===e?"<link />":"<"+e+"></"+e+">",s[e]=!a.firstChild),s[e]?d[e]:null}var r=n(6),i=n(1),a=r.canUseDOM?document.createElement("div"):null,s={},u=[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>"],d={"*":[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:u,option:u,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){d[e]=p,s[e]=!0}),e.exports=o}).call(t,n(0))},function(e,t,n){"use strict";function o(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=o},function(e,t,n){"use strict";function o(e){return e.replace(r,"-$1").toLowerCase()}var r=/([A-Z])/g;e.exports=o},function(e,t,n){"use strict";function o(e){return r(e).replace(i,"-ms-")}var r=n(89),i=/^ms-/;e.exports=o},function(e,t,n){"use strict";function o(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=o},function(e,t,n){"use strict";function o(e){return r(e)&&3==e.nodeType}var r=n(91);e.exports=o},function(e,t,n){"use strict";function o(e){var t={};return function(n){return t.hasOwnProperty(n)||(t[n]=e.call(this,n)),t[n]}}e.exports=o},function(e,t,n){"use strict";var o,r=n(6);r.canUseDOM&&(o=window.performance||window.msPerformance||window.webkitPerformance),e.exports=o||{}},function(e,t,n){"use strict";var o,r=n(94);o=r.now?function(){return r.now()}:function(){return Date.now()},e.exports=o},function(e,t,n){"use strict";var o={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=o},function(e,t,n){"use strict";var o=n(5),r=n(53),i={focusDOMComponent:function(){r(o.getNodeFromInstance(this))}};e.exports=i},function(e,t,n){"use strict";function o(e){return(e.ctrlKey||e.altKey||e.metaKey)&&!(e.ctrlKey&&e.altKey)}function r(e){switch(e){case"topCompositionStart":return O.compositionStart;case"topCompositionEnd":return O.compositionEnd;case"topCompositionUpdate":return O.compositionUpdate}}function i(e,t){return"topKeyDown"===e&&t.keyCode===y}function a(e,t){switch(e){case"topKeyUp":return-1!==g.indexOf(t.keyCode);case"topKeyDown":return t.keyCode!==y;case"topKeyPress":case"topMouseDown":case"topBlur":return!0;default:return!1}}function s(e){var t=e.detail;return"object"==typeof t&&"data"in t?t.data:null}function u(e,t,n,o){var u,c;if(E?u=r(e):x?a(e,n)&&(u=O.compositionEnd):i(e,n)&&(u=O.compositionStart),!u)return null;b&&(x||u!==O.compositionStart?u===O.compositionEnd&&x&&(c=x.getData()):x=h.getPooled(o));var l=m.getPooled(u,t,n,o);if(c)l.data=c;else{var p=s(n);null!==p&&(l.data=p)}return d.accumulateTwoPhaseDispatches(l),l}function c(e,t){switch(e){case"topCompositionEnd":return s(t);case"topKeyPress":return t.which!==C?null:(w=!0,D);case"topTextInput":var n=t.data;return n===D&&w?null:n;default:return null}}function l(e,t){if(x){if("topCompositionEnd"===e||!E&&a(e,t)){var n=x.getData();return h.release(x),x=null,n}return null}switch(e){case"topPaste":return null;case"topKeyPress":return t.which&&!o(t)?String.fromCharCode(t.which):null;case"topCompositionEnd":return b?null:t.data;default:return null}}function p(e,t,n,o){var r;if(!(r=N?c(e,n):l(e,n)))return null;var i=v.getPooled(O.beforeInput,t,n,o);return i.data=r,d.accumulateTwoPhaseDispatches(i),i}var d=n(22),f=n(6),h=n(104),m=n(147),v=n(150),g=[9,13,27,32],y=229,E=f.canUseDOM&&"CompositionEvent"in window,_=null;f.canUseDOM&&"documentMode"in document&&(_=document.documentMode);var N=f.canUseDOM&&"TextEvent"in window&&!_&&!function(){var e=window.opera;return"object"==typeof e&&"function"==typeof e.version&&parseInt(e.version(),10)<=12}(),b=f.canUseDOM&&(!E||_&&_>8&&_<=11),C=32,D=String.fromCharCode(C),O={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"]}},w=!1,x=null,T={eventTypes:O,extractEvents:function(e,t,n,o){return[u(e,t,n,o),p(e,t,n,o)]}};e.exports=T},function(e,t,n){"use strict";(function(t){var o=n(55),r=n(6),i=n(8),a=n(83),s=n(157),u=n(90),c=n(93),l=n(2),p=c(function(e){return u(e)}),d=!1,f="cssFloat";if(r.canUseDOM){var h=document.createElement("div").style;try{h.font=""}catch(e){d=!0}void 0===document.documentElement.style.cssFloat&&(f="styleFloat")}if("production"!==t.env.NODE_ENV)var m=/^(?:webkit|moz|o)[A-Z]/,v=/;\s*$/,g={},y={},E=!1,_=function(e,n){g.hasOwnProperty(e)&&g[e]||(g[e]=!0,"production"!==t.env.NODE_ENV&&l(!1,"Unsupported style property %s. Did you mean %s?%s",e,a(e),D(n)))},N=function(e,n){g.hasOwnProperty(e)&&g[e]||(g[e]=!0,"production"!==t.env.NODE_ENV&&l(!1,"Unsupported vendor-prefixed style property %s. Did you mean %s?%s",e,e.charAt(0).toUpperCase()+e.slice(1),D(n)))},b=function(e,n,o){y.hasOwnProperty(n)&&y[n]||(y[n]=!0,"production"!==t.env.NODE_ENV&&l(!1,'Style property values shouldn\'t contain a semicolon.%s Try "%s: %s" instead.',D(o),e,n.replace(v,"")))},C=function(e,n,o){E||(E=!0,"production"!==t.env.NODE_ENV&&l(!1,"`NaN` is an invalid value for the `%s` css style property.%s",e,D(o)))},D=function(e){if(e){var t=e.getName();if(t)return" Check the render method of `"+t+"`."}return""},O=function(e,t,n){var o;n&&(o=n._currentElement._owner),e.indexOf("-")>-1?_(e,o):m.test(e)?N(e,o):v.test(t)&&b(e,t,o),"number"==typeof t&&isNaN(t)&&C(e,0,o)};var w={createMarkupForStyles:function(e,n){var o="";for(var r in e)if(e.hasOwnProperty(r)){var i=e[r];"production"!==t.env.NODE_ENV&&O(r,i,n),null!=i&&(o+=p(r)+":",o+=s(r,i,n)+";")}return o||null},setValueForStyles:function(e,n,r){"production"!==t.env.NODE_ENV&&i.debugTool.onHostOperation({instanceID:r._debugID,type:"update styles",payload:n});var a=e.style;for(var u in n)if(n.hasOwnProperty(u)){"production"!==t.env.NODE_ENV&&O(u,n[u],r);var c=s(u,n[u],r);if("float"!==u&&"cssFloat"!==u||(u=f),c)a[u]=c;else{var l=d&&o.shorthandPropertyExpansions[u];if(l)for(var p in l)a[p]="";else a[u]=""}}}};e.exports=w}).call(t,n(0))},function(e,t,n){"use strict";function o(e){var t=e.nodeName&&e.nodeName.toLowerCase();return"select"===t||"input"===t&&"file"===e.type}function r(e){var t=C.getPooled(x.change,k,e,D(e));E.accumulateTwoPhaseDispatches(t),b.batchedUpdates(i,t)}function i(e){y.enqueueEvents(e),y.processEventQueue(!1)}function a(e,t){T=e,k=t,T.attachEvent("onchange",r)}function s(){T&&(T.detachEvent("onchange",r),T=null,k=null)}function u(e,t){if("topChange"===e)return t}function c(e,t,n){"topFocus"===e?(s(),a(t,n)):"topBlur"===e&&s()}function l(e,t){T=e,k=t,I=e.value,P=Object.getOwnPropertyDescriptor(e.constructor.prototype,"value"),Object.defineProperty(T,"value",R),T.attachEvent?T.attachEvent("onpropertychange",d):T.addEventListener("propertychange",d,!1)}function p(){T&&(delete T.value,T.detachEvent?T.detachEvent("onpropertychange",d):T.removeEventListener("propertychange",d,!1),T=null,k=null,I=null,P=null)}function d(e){if("value"===e.propertyName){var t=e.srcElement.value;t!==I&&(I=t,r(e))}}function f(e,t){if("topInput"===e)return t}function h(e,t,n){"topFocus"===e?(p(),l(t,n)):"topBlur"===e&&p()}function m(e,t){if(("topSelectionChange"===e||"topKeyUp"===e||"topKeyDown"===e)&&T&&T.value!==I)return I=T.value,k}function v(e){return e.nodeName&&"input"===e.nodeName.toLowerCase()&&("checkbox"===e.type||"radio"===e.type)}function g(e,t){if("topClick"===e)return t}var y=n(21),E=n(22),_=n(6),N=n(5),b=n(10),C=n(12),D=n(43),O=n(44),w=n(73),x={change:{phasedRegistrationNames:{bubbled:"onChange",captured:"onChangeCapture"},dependencies:["topBlur","topChange","topClick","topFocus","topInput","topKeyDown","topKeyUp","topSelectionChange"]}},T=null,k=null,I=null,P=null,S=!1;_.canUseDOM&&(S=O("change")&&(!document.documentMode||document.documentMode>8));var V=!1;_.canUseDOM&&(V=O("input")&&(!document.documentMode||document.documentMode>11));var R={get:function(){return P.get.call(this)},set:function(e){I=""+e,P.set.call(this,e)}},M={eventTypes:x,extractEvents:function(e,t,n,r){var i,a,s=t?N.getNodeFromInstance(t):window;if(o(s)?S?i=u:a=c:w(s)?V?i=f:(i=m,a=h):v(s)&&(i=g),i){var l=i(e,t);if(l){var p=C.getPooled(x.change,l,n,r);return p.type="change",E.accumulateTwoPhaseDispatches(p),p}}a&&a(e,s,t)}};e.exports=M},function(e,t,n){"use strict";(function(t){var o=n(3),r=n(17),i=n(6),a=n(86),s=n(9),u=n(1),c={dangerouslyReplaceNodeWithMarkup:function(e,n){if(i.canUseDOM||("production"!==t.env.NODE_ENV?u(!1,"dangerouslyReplaceNodeWithMarkup(...): Cannot render markup in a worker thread. Make sure `window` and `document` are available globally before requiring React when unit testing or use ReactDOMServer.renderToString() for server rendering."):o("56")),n||("production"!==t.env.NODE_ENV?u(!1,"dangerouslyReplaceNodeWithMarkup(...): Missing markup."):o("57")),"HTML"===e.nodeName&&("production"!==t.env.NODE_ENV?u(!1,"dangerouslyReplaceNodeWithMarkup(...): Cannot replace markup of the <html> node. This is because browser quirks make this unreliable and/or slow. If you want to render to the root you must use server rendering. See ReactDOMServer.renderToString()."):o("58")),"string"==typeof n){var c=a(n,s)[0];e.parentNode.replaceChild(c,e)}else r.replaceChildWithTree(e,n)}};e.exports=c}).call(t,n(0))},function(e,t,n){"use strict";var o=["ResponderEventPlugin","SimpleEventPlugin","TapEventPlugin","EnterLeaveEventPlugin","ChangeEventPlugin","SelectEventPlugin","BeforeInputEventPlugin"];e.exports=o},function(e,t,n){"use strict";var o=n(22),r=n(5),i=n(27),a={mouseEnter:{registrationName:"onMouseEnter",dependencies:["topMouseOut","topMouseOver"]},mouseLeave:{registrationName:"onMouseLeave",dependencies:["topMouseOut","topMouseOver"]}},s={eventTypes:a,extractEvents:function(e,t,n,s){if("topMouseOver"===e&&(n.relatedTarget||n.fromElement))return null;if("topMouseOut"!==e&&"topMouseOver"!==e)return null;var u;if(s.window===s)u=s;else{var c=s.ownerDocument;u=c?c.defaultView||c.parentWindow:window}var l,p;if("topMouseOut"===e){l=t;var d=n.relatedTarget||n.toElement;p=d?r.getClosestInstanceFromNode(d):null}else l=null,p=t;if(l===p)return null;var f=null==l?u:r.getNodeFromInstance(l),h=null==p?u:r.getNodeFromInstance(p),m=i.getPooled(a.mouseLeave,l,n,s);m.type="mouseleave",m.target=f,m.relatedTarget=h;var v=i.getPooled(a.mouseEnter,p,n,s);return v.type="mouseenter",v.target=h,v.relatedTarget=f,o.accumulateEnterLeaveDispatches(m,v,l,p),[m,v]}};e.exports=s},function(e,t,n){"use strict";function o(e){this._root=e,this._startText=this.getText(),this._fallbackText=null}var r=n(4),i=n(14),a=n(71);r(o.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,o=n.length,r=this.getText(),i=r.length;for(e=0;e<o&&n[e]===r[e];e++);var a=o-e;for(t=1;t<=a&&n[o-t]===r[i-t];t++);var s=t>1?1-t:void 0;return this._fallbackText=r.slice(e,s),this._fallbackText}}),i.addPoolingTo(o),e.exports=o},function(e,t,n){"use strict";var o=n(13),r=o.injection.MUST_USE_PROPERTY,i=o.injection.HAS_BOOLEAN_VALUE,a=o.injection.HAS_NUMERIC_VALUE,s=o.injection.HAS_POSITIVE_NUMERIC_VALUE,u=o.injection.HAS_OVERLOADED_BOOLEAN_VALUE,c={isCustomAttribute:RegExp.prototype.test.bind(new RegExp("^(data|aria)-["+o.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:r|i,cite:0,classID:0,className:0,cols:s,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:u,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:r|i,muted:r|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:s,rowSpan:a,sandbox:0,scope:0,scoped:i,scrolling:0,seamless:i,selected:r|i,shape:0,size:s,sizes:0,span:s,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:{}};e.exports=c},function(e,t,n){"use strict";(function(t){function o(e,o,i,u){var c=void 0===e[i];"production"!==t.env.NODE_ENV&&(r||(r=n(7)),c||"production"!==t.env.NODE_ENV&&l(!1,"flattenChildren(...): Encountered two children with the same key, `%s`. Child keys must be unique; when two children share a key, only the first child will be used.%s",s.unescape(i),r.getStackAddendumByID(u))),null!=o&&c&&(e[i]=a(o,!0))}var r,i=n(18),a=n(72),s=n(35),u=n(45),c=n(75),l=n(2);void 0!==t&&t.env&&"test"===t.env.NODE_ENV&&(r=n(7));var p={instantiateChildren:function(e,n,r,i){if(null==e)return null;var a={};return"production"!==t.env.NODE_ENV?c(e,function(e,t,n){return o(e,t,n,i)},a):c(e,o,a),a},updateChildren:function(e,t,n,o,r,s,c,l,p){if(t||e){var d,f;for(d in t)if(t.hasOwnProperty(d)){f=e&&e[d];var h=f&&f._currentElement,m=t[d];if(null!=f&&u(h,m))i.receiveComponent(f,m,r,l),t[d]=f;else{f&&(o[d]=i.getHostNode(f),i.unmountComponent(f,!1));var v=a(m,!0);t[d]=v;var g=i.mountComponent(v,r,s,c,l,p);n.push(g)}}for(d in e)!e.hasOwnProperty(d)||t&&t.hasOwnProperty(d)||(f=e[d],o[d]=i.getHostNode(f),i.unmountComponent(f,!1))}},unmountChildren:function(e,t){for(var n in e)if(e.hasOwnProperty(n)){var o=e[n];i.unmountComponent(o,t)}}};e.exports=p}).call(t,n(0))},function(e,t,n){"use strict";var o=n(32),r=n(114),i={processChildrenUpdates:r.dangerouslyProcessChildrenUpdates,replaceNodeWithMarkup:o.dangerouslyReplaceNodeWithMarkup};e.exports=i},function(e,t,n){"use strict";(function(t){function o(e){}function r(e,n){"production"!==t.env.NODE_ENV&&("production"!==t.env.NODE_ENV&&C(null===n||!1===n||l.isValidElement(n),"%s(...): A valid React element (or null) must be returned. You may have returned undefined, an array or some other invalid object.",e.displayName||e.name||"Component"),"production"!==t.env.NODE_ENV&&C(!e.childContextTypes,"%s(...): childContextTypes cannot be defined on a functional component.",e.displayName||e.name||"Component"))}function i(e){return!(!e.prototype||!e.prototype.isReactComponent)}function a(e){return!(!e.prototype||!e.prototype.isPureReactComponent)}function s(e,t,n){if(0===t)return e();m.debugTool.onBeginLifeCycleTimer(t,n);try{return e()}finally{m.debugTool.onEndLifeCycleTimer(t,n)}}var u=n(3),c=n(4),l=n(19),p=n(37),d=n(11),f=n(38),h=n(23),m=n(8),v=n(65),g=n(18);if("production"!==t.env.NODE_ENV)var y=n(156);var E=n(20),_=n(1),N=n(31),b=n(45),C=n(2),D={ImpureClass:0,PureClass:1,StatelessFunctional:2};o.prototype.render=function(){var e=h.get(this)._currentElement.type,t=e(this.props,this.context,this.updater);return r(e,t),t};var O=1,w={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,"production"!==t.env.NODE_ENV&&(this._warnedAboutRefsInRender=!1)},mountComponent:function(e,n,c,p){var d=this;this._context=p,this._mountOrder=O++,this._hostParent=n,this._hostContainerInfo=c;var f,m=this._currentElement.props,v=this._processContext(p),g=this._currentElement.type,y=e.getUpdateQueue(),N=i(g),b=this._constructComponent(N,m,v,y);if(N||null!=b&&null!=b.render?a(g)?this._compositeType=D.PureClass:this._compositeType=D.ImpureClass:(f=b,r(g,f),null===b||!1===b||l.isValidElement(b)||("production"!==t.env.NODE_ENV?_(!1,"%s(...): A valid React element (or null) must be returned. You may have returned undefined, an array or some other invalid object.",g.displayName||g.name||"Component"):u("105",g.displayName||g.name||"Component")),b=new o(g),this._compositeType=D.StatelessFunctional),"production"!==t.env.NODE_ENV){null==b.render&&"production"!==t.env.NODE_ENV&&C(!1,"%s(...): No `render` method found on the returned component instance: you may have forgotten to define `render`.",g.displayName||g.name||"Component");var w=b.props!==m,x=g.displayName||g.name||"Component";"production"!==t.env.NODE_ENV&&C(void 0===b.props||!w,"%s(...): When calling super() in `%s`, make sure to pass up the same props that your component's constructor was passed.",x,x)}b.props=m,b.context=v,b.refs=E,b.updater=y,this._instance=b,h.set(b,this),"production"!==t.env.NODE_ENV&&("production"!==t.env.NODE_ENV&&C(!b.getInitialState||b.getInitialState.isReactClassApproved||b.state,"getInitialState was defined on %s, a plain JavaScript class. This is only supported for classes created using React.createClass. Did you mean to define a state property instead?",this.getName()||"a component"),"production"!==t.env.NODE_ENV&&C(!b.getDefaultProps||b.getDefaultProps.isReactClassApproved,"getDefaultProps was defined on %s, a plain JavaScript class. This is only supported for classes created using React.createClass. Use a static property to define defaultProps instead.",this.getName()||"a component"),"production"!==t.env.NODE_ENV&&C(!b.propTypes,"propTypes was defined as an instance property on %s. Use a static property to define propTypes instead.",this.getName()||"a component"),"production"!==t.env.NODE_ENV&&C(!b.contextTypes,"contextTypes was defined as an instance property on %s. Use a static property to define contextTypes instead.",this.getName()||"a component"),"production"!==t.env.NODE_ENV&&C("function"!=typeof b.componentShouldUpdate,"%s has a method called componentShouldUpdate(). Did you mean shouldComponentUpdate()? The name is phrased as a question because the function is expected to return a value.",this.getName()||"A component"),"production"!==t.env.NODE_ENV&&C("function"!=typeof b.componentDidUnmount,"%s has a method called componentDidUnmount(). But there is no such lifecycle method. Did you mean componentWillUnmount()?",this.getName()||"A component"),"production"!==t.env.NODE_ENV&&C("function"!=typeof b.componentWillRecieveProps,"%s has a method called componentWillRecieveProps(). Did you mean componentWillReceiveProps()?",this.getName()||"A component"));var T=b.state;void 0===T&&(b.state=T=null),("object"!=typeof T||Array.isArray(T))&&("production"!==t.env.NODE_ENV?_(!1,"%s.state: must be set to an object or null",this.getName()||"ReactCompositeComponent"):u("106",this.getName()||"ReactCompositeComponent")),this._pendingStateQueue=null,this._pendingReplaceState=!1,this._pendingForceUpdate=!1;var k;return k=b.unstable_handleError?this.performInitialMountWithErrorHandling(f,n,c,e,p):this.performInitialMount(f,n,c,e,p),b.componentDidMount&&("production"!==t.env.NODE_ENV?e.getReactMountReady().enqueue(function(){s(function(){return b.componentDidMount()},d._debugID,"componentDidMount")}):e.getReactMountReady().enqueue(b.componentDidMount,b)),k},_constructComponent:function(e,n,o,r){if("production"===t.env.NODE_ENV)return this._constructComponentWithoutOwner(e,n,o,r);d.current=this;try{return this._constructComponentWithoutOwner(e,n,o,r)}finally{d.current=null}},_constructComponentWithoutOwner:function(e,n,o,r){var i=this._currentElement.type;return e?"production"!==t.env.NODE_ENV?s(function(){return new i(n,o,r)},this._debugID,"ctor"):new i(n,o,r):"production"!==t.env.NODE_ENV?s(function(){return i(n,o,r)},this._debugID,"render"):i(n,o,r)},performInitialMountWithErrorHandling:function(e,t,n,o,r){var i,a=o.checkpoint();try{i=this.performInitialMount(e,t,n,o,r)}catch(s){o.rollback(a),this._instance.unstable_handleError(s),this._pendingStateQueue&&(this._instance.state=this._processPendingState(this._instance.props,this._instance.context)),a=o.checkpoint(),this._renderedComponent.unmountComponent(!0),o.rollback(a),i=this.performInitialMount(e,t,n,o,r)}return i},performInitialMount:function(e,n,o,r,i){var a=this._instance,u=0;"production"!==t.env.NODE_ENV&&(u=this._debugID),a.componentWillMount&&("production"!==t.env.NODE_ENV?s(function(){return a.componentWillMount()},u,"componentWillMount"):a.componentWillMount(),this._pendingStateQueue&&(a.state=this._processPendingState(a.props,a.context))),void 0===e&&(e=this._renderValidatedComponent());var c=v.getType(e);this._renderedNodeType=c;var l=this._instantiateReactComponent(e,c!==v.EMPTY);this._renderedComponent=l;var p=g.mountComponent(l,r,n,o,this._processChildContext(i),u);if("production"!==t.env.NODE_ENV&&0!==u){var d=0!==l._debugID?[l._debugID]:[];m.debugTool.onSetChildren(u,d)}return p},getHostNode:function(){return g.getHostNode(this._renderedComponent)},unmountComponent:function(e){if(this._renderedComponent){var n=this._instance;if(n.componentWillUnmount&&!n._calledComponentWillUnmount)if(n._calledComponentWillUnmount=!0,e){var o=this.getName()+".componentWillUnmount()";f.invokeGuardedCallback(o,n.componentWillUnmount.bind(n))}else"production"!==t.env.NODE_ENV?s(function(){return n.componentWillUnmount()},this._debugID,"componentWillUnmount"):n.componentWillUnmount();this._renderedComponent&&(g.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,h.remove(n)}},_maskContext:function(e){var t=this._currentElement.type,n=t.contextTypes;if(!n)return E;var o={};for(var r in n)o[r]=e[r];return o},_processContext:function(e){var n=this._maskContext(e);if("production"!==t.env.NODE_ENV){var o=this._currentElement.type;o.contextTypes&&this._checkContextTypes(o.contextTypes,n,"context")}return n},_processChildContext:function(e){var n,o=this._currentElement.type,r=this._instance;if(r.getChildContext)if("production"!==t.env.NODE_ENV){m.debugTool.onBeginProcessingChildContext();try{n=r.getChildContext()}finally{m.debugTool.onEndProcessingChildContext()}}else n=r.getChildContext();if(n){"object"!=typeof o.childContextTypes&&("production"!==t.env.NODE_ENV?_(!1,"%s.getChildContext(): childContextTypes must be defined in order to use getChildContext().",this.getName()||"ReactCompositeComponent"):u("107",this.getName()||"ReactCompositeComponent")),"production"!==t.env.NODE_ENV&&this._checkContextTypes(o.childContextTypes,n,"childContext");for(var i in n)i in o.childContextTypes||("production"!==t.env.NODE_ENV?_(!1,'%s.getChildContext(): key "%s" is not defined in childContextTypes.',this.getName()||"ReactCompositeComponent",i):u("108",this.getName()||"ReactCompositeComponent",i));return c({},e,n)}return e},_checkContextTypes:function(e,n,o){"production"!==t.env.NODE_ENV&&y(e,n,o,this.getName(),null,this._debugID)},receiveComponent:function(e,t,n){var o=this._currentElement,r=this._context;this._pendingElement=null,this.updateComponent(t,o,e,r,n)},performUpdateIfNecessary:function(e){null!=this._pendingElement?g.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,n,o,r,i){var a=this._instance;null==a&&("production"!==t.env.NODE_ENV?_(!1,"Attempted to update component `%s` that has already been unmounted (or failed to mount).",this.getName()||"ReactCompositeComponent"):u("136",this.getName()||"ReactCompositeComponent"));var c,l=!1;this._context===i?c=a.context:(c=this._processContext(i),l=!0);var p=n.props,d=o.props;n!==o&&(l=!0),l&&a.componentWillReceiveProps&&("production"!==t.env.NODE_ENV?s(function(){return a.componentWillReceiveProps(d,c)},this._debugID,"componentWillReceiveProps"):a.componentWillReceiveProps(d,c));var f=this._processPendingState(d,c),h=!0;this._pendingForceUpdate||(a.shouldComponentUpdate?h="production"!==t.env.NODE_ENV?s(function(){return a.shouldComponentUpdate(d,f,c)},this._debugID,"shouldComponentUpdate"):a.shouldComponentUpdate(d,f,c):this._compositeType===D.PureClass&&(h=!N(p,d)||!N(a.state,f))),"production"!==t.env.NODE_ENV&&"production"!==t.env.NODE_ENV&&C(void 0!==h,"%s.shouldComponentUpdate(): Returned undefined instead of a boolean value. Make sure to return true or false.",this.getName()||"ReactCompositeComponent"),this._updateBatchNumber=null,h?(this._pendingForceUpdate=!1,this._performComponentUpdate(o,d,f,c,e,i)):(this._currentElement=o,this._context=i,a.props=d,a.state=f,a.context=c)},_processPendingState:function(e,t){var n=this._instance,o=this._pendingStateQueue,r=this._pendingReplaceState;if(this._pendingReplaceState=!1,this._pendingStateQueue=null,!o)return n.state;if(r&&1===o.length)return o[0];for(var i=c({},r?o[0]:n.state),a=r?1:0;a<o.length;a++){var s=o[a];c(i,"function"==typeof s?s.call(n,i,e,t):s)}return i},_performComponentUpdate:function(e,n,o,r,i,a){var u,c,l,p=this,d=this._instance,f=Boolean(d.componentDidUpdate);f&&(u=d.props,c=d.state,l=d.context),d.componentWillUpdate&&("production"!==t.env.NODE_ENV?s(function(){return d.componentWillUpdate(n,o,r)},this._debugID,"componentWillUpdate"):d.componentWillUpdate(n,o,r)),this._currentElement=e,this._context=a,d.props=n,d.state=o,d.context=r,this._updateRenderedComponent(i,a),f&&("production"!==t.env.NODE_ENV?i.getReactMountReady().enqueue(function(){s(d.componentDidUpdate.bind(d,u,c,l),p._debugID,"componentDidUpdate")}):i.getReactMountReady().enqueue(d.componentDidUpdate.bind(d,u,c,l),d))},_updateRenderedComponent:function(e,n){var o=this._renderedComponent,r=o._currentElement,i=this._renderValidatedComponent(),a=0;if("production"!==t.env.NODE_ENV&&(a=this._debugID),b(r,i))g.receiveComponent(o,i,e,this._processChildContext(n));else{var s=g.getHostNode(o);g.unmountComponent(o,!1);var u=v.getType(i);this._renderedNodeType=u;var c=this._instantiateReactComponent(i,u!==v.EMPTY);this._renderedComponent=c;var l=g.mountComponent(c,e,this._hostParent,this._hostContainerInfo,this._processChildContext(n),a);if("production"!==t.env.NODE_ENV&&0!==a){var p=0!==c._debugID?[c._debugID]:[];m.debugTool.onSetChildren(a,p)}this._replaceNodeWithMarkup(s,l,o)}},_replaceNodeWithMarkup:function(e,t,n){p.replaceNodeWithMarkup(e,t,n)},_renderValidatedComponentWithoutOwnerOrContext:function(){var e,n=this._instance;return e="production"!==t.env.NODE_ENV?s(function(){return n.render()},this._debugID,"render"):n.render(),"production"!==t.env.NODE_ENV&&void 0===e&&n.render._isMockFunction&&(e=null),e},_renderValidatedComponent:function(){var e;if("production"!==t.env.NODE_ENV||this._compositeType!==D.StatelessFunctional){d.current=this;try{e=this._renderValidatedComponentWithoutOwnerOrContext()}finally{d.current=null}}else e=this._renderValidatedComponentWithoutOwnerOrContext();return null===e||!1===e||l.isValidElement(e)||("production"!==t.env.NODE_ENV?_(!1,"%s.render(): A valid React element (or null) must be returned. You may have returned undefined, an array or some other invalid object.",this.getName()||"ReactCompositeComponent"):u("109",this.getName()||"ReactCompositeComponent")),e},attachRef:function(e,n){var o=this.getPublicInstance();null==o&&("production"!==t.env.NODE_ENV?_(!1,"Stateless function components cannot have refs."):u("110"));var r=n.getPublicInstance();if("production"!==t.env.NODE_ENV){var i=n&&n.getName?n.getName():"a component";"production"!==t.env.NODE_ENV&&C(null!=r||n._compositeType!==D.StatelessFunctional,'Stateless function components cannot be given refs (See ref "%s" in %s created by %s). Attempts to access this ref will fail.',e,i,this.getName())}(o.refs===E?o.refs={}:o.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===D.StatelessFunctional?null:e},_instantiateReactComponent:null};e.exports=w}).call(t,n(0))},function(e,t,n){"use strict";(function(t){var o=n(5),r=n(126),i=n(64),a=n(18),s=n(10),u=n(141),c=n(158),l=n(70),p=n(166),d=n(2);r.inject();var f={findDOMNode:c,render:i.render,unmountComponentAtNode:i.unmountComponentAtNode,version:u,unstable_batchedUpdates:s.batchedUpdates,unstable_renderSubtreeIntoContainer:p};if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.inject&&__REACT_DEVTOOLS_GLOBAL_HOOK__.inject({ComponentTree:{getClosestInstanceFromNode:o.getClosestInstanceFromNode,getNodeFromInstance:function(e){return e._renderedComponent&&(e=l(e)),e?o.getNodeFromInstance(e):null}},Mount:i,Reconciler:a}),"production"!==t.env.NODE_ENV){if(n(6).canUseDOM&&window.top===window.self){if("undefined"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&(navigator.userAgent.indexOf("Chrome")>-1&&-1===navigator.userAgent.indexOf("Edge")||navigator.userAgent.indexOf("Firefox")>-1)){var h=-1===window.location.protocol.indexOf("http")&&-1===navigator.userAgent.indexOf("Firefox");console.debug("Download the React DevTools "+(h?"and use an HTTP server (instead of a file: URL) ":"")+"for a better development experience: https://fb.me/react-devtools")}var m=function(){};"production"!==t.env.NODE_ENV&&d(-1!==(m.name||m.toString()).indexOf("testFn"),"It looks like you're using a minified copy of the development build of React. When deploying React apps to production, make sure to use the production build which skips development warnings and is faster. See https://fb.me/react-minification for more details.");var v=document.documentMode&&document.documentMode<8;"production"!==t.env.NODE_ENV&&d(!v,'Internet Explorer is running in compatibility mode; please add the following tag to your HTML to prevent this from happening: <meta http-equiv="X-UA-Compatible" content="IE=edge" />');for(var g=[Array.isArray,Array.prototype.every,Array.prototype.forEach,Array.prototype.indexOf,Array.prototype.map,Date.now,Function.prototype.bind,Object.keys,String.prototype.trim],y=0;y<g.length;y++)if(!g[y]){"production"!==t.env.NODE_ENV&&d(!1,"One or more ES5 shims expected by React are not available: https://fb.me/react-warning-polyfills");break}}}if("production"!==t.env.NODE_ENV){var E=n(8),_=n(123),N=n(117),b=n(116);E.debugTool.addHook(_),E.debugTool.addHook(N),E.debugTool.addHook(b)}e.exports=f}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(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 r(e){if("object"==typeof e){if(Array.isArray(e))return"["+e.map(r).join(", ")+"]";var t=[];for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){var o=/^[a-z$_][\w$_]*$/i.test(n)?n:JSON.stringify(n);t.push(o+": "+r(e[n]))}return"{"+t.join(", ")+"}"}return"string"==typeof e?JSON.stringify(e):"function"==typeof e?"[function object]":String(e)}function i(e,n,o){if(null!=e&&null!=n&&!B(e,n)){var i,a=o._tag,s=o._currentElement._owner;s&&(i=s.getName());var u=i+"|"+a;Z.hasOwnProperty(u)||(Z[u]=!0,"production"!==t.env.NODE_ENV&&W(!1,"`%s` was passed a style object that has previously been mutated. Mutating `style` is deprecated. Consider cloning it beforehand. Check the `render` %s. Previous style: %s. Mutated style: %s.",a,s?"of `"+i+"`":"using <"+a+">",r(e),r(n)))}}function a(e,n){n&&(re[e._tag]&&(null!=n.children||null!=n.dangerouslySetInnerHTML)&&("production"!==t.env.NODE_ENV?F(!1,"%s is a void element tag and must neither have `children` nor use `dangerouslySetInnerHTML`.%s",e._tag,e._currentElement._owner?" Check the render method of "+e._currentElement._owner.getName()+".":""):g("137",e._tag,e._currentElement._owner?" Check the render method of "+e._currentElement._owner.getName()+".":"")),null!=n.dangerouslySetInnerHTML&&(null!=n.children&&("production"!==t.env.NODE_ENV?F(!1,"Can only set one of `children` or `props.dangerouslySetInnerHTML`."):g("60")),"object"==typeof n.dangerouslySetInnerHTML&&G in n.dangerouslySetInnerHTML||("production"!==t.env.NODE_ENV?F(!1,"`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. Please visit https://fb.me/react-invariant-dangerously-set-inner-html for more information."):g("61"))),"production"!==t.env.NODE_ENV&&("production"!==t.env.NODE_ENV&&W(null==n.innerHTML,"Directly setting property `innerHTML` is not permitted. For more information, lookup documentation on `dangerouslySetInnerHTML`."),"production"!==t.env.NODE_ENV&&W(n.suppressContentEditableWarning||!n.contentEditable||null==n.children,"A component is `contentEditable` and contains `children` managed by React. It is now your responsibility to guarantee that none of those nodes are unexpectedly modified or duplicated. This is probably not intentional."),"production"!==t.env.NODE_ENV&&W(null==n.onFocusIn&&null==n.onFocusOut,"React uses onFocus and onBlur instead of onFocusIn and onFocusOut. All React events are normalized to bubble, so onFocusIn and onFocusOut are not needed/supported by React.")),null!=n.style&&"object"!=typeof n.style&&("production"!==t.env.NODE_ENV?F(!1,"The `style` prop expects a mapping from style properties to values, not a string. For example, style={{marginRight: spacing + 'em'}} when using JSX.%s",o(e)):g("62",o(e))))}function s(e,n,o,r){if(!(r instanceof A)){"production"!==t.env.NODE_ENV&&"production"!==t.env.NODE_ENV&&W("onScroll"!==n||j("scroll",!0),"This browser doesn't support the `onScroll` event");var i=e._hostContainerInfo,a=i._node&&i._node.nodeType===J,s=a?i._node:i._ownerDocument;z(n,s),r.getReactMountReady().enqueue(u,{inst:e,registrationName:n,listener:o})}}function u(){var e=this;O.putListener(e.inst,e.registrationName,e.listener)}function c(){var e=this;I.postMountWrapper(e)}function l(){var e=this;V.postMountWrapper(e)}function p(){var e=this;P.postMountWrapper(e)}function d(){var e=this;e._rootNodeID||("production"!==t.env.NODE_ENV?F(!1,"Must be mounted to trap events"):g("63"));var n=K(e);switch(n||("production"!==t.env.NODE_ENV?F(!1,"trapBubbledEvent(...): Requires node to be rendered."):g("64")),e._tag){case"iframe":case"object":e._wrapperState.listeners=[x.trapBubbledEvent("topLoad","load",n)];break;case"video":case"audio":e._wrapperState.listeners=[];for(var o in te)te.hasOwnProperty(o)&&e._wrapperState.listeners.push(x.trapBubbledEvent(o,te[o],n));break;case"source":e._wrapperState.listeners=[x.trapBubbledEvent("topError","error",n)];break;case"img":e._wrapperState.listeners=[x.trapBubbledEvent("topError","error",n),x.trapBubbledEvent("topLoad","load",n)];break;case"form":e._wrapperState.listeners=[x.trapBubbledEvent("topReset","reset",n),x.trapBubbledEvent("topSubmit","submit",n)];break;case"input":case"select":case"textarea":e._wrapperState.listeners=[x.trapBubbledEvent("topInvalid","invalid",n)]}}function f(){S.postUpdateWrapper(this)}function h(e){se.call(ae,e)||(ie.test(e)||("production"!==t.env.NODE_ENV?F(!1,"Invalid tag: %s",e):g("65",e)),ae[e]=!0)}function m(e,t){return e.indexOf("-")>=0||null!=t.is}function v(e){var n=e.type;h(n),this._currentElement=e,this._tag=n.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,"production"!==t.env.NODE_ENV&&(this._ancestorInfo=null,ee.call(this,null))}var g=n(3),y=n(4),E=n(97),_=n(99),N=n(17),b=n(33),C=n(13),D=n(57),O=n(21),w=n(25),x=n(26),T=n(58),k=n(5),I=n(115),P=n(118),S=n(59),V=n(121),R=n(8),M=n(134),A=n(139),U=n(9),L=n(29),F=n(1),j=n(44),B=n(31),H=n(46),W=n(2),q=T,Y=O.deleteListener,K=k.getNodeFromInstance,z=x.listenTo,X=w.registrationNameModules,$={string:!0,number:!0},G="__html",Q={children:null,dangerouslySetInnerHTML:null,suppressContentEditableWarning:null},J=11,Z={},ee=U;"production"!==t.env.NODE_ENV&&(ee=function(e){var t=null!=this._contentDebugID,n=this._debugID,o=-n;if(null==e)return t&&R.debugTool.onUnmountComponent(this._contentDebugID),void(this._contentDebugID=null);H(null,String(e),this,this._ancestorInfo),this._contentDebugID=o,t?(R.debugTool.onBeforeUpdateComponent(o,e),R.debugTool.onUpdateComponent(o)):(R.debugTool.onBeforeMountComponent(o,e,n),R.debugTool.onMountComponent(o),R.debugTool.onSetChildren(n,[o]))});var te={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"},ne={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},oe={listing:!0,pre:!0,textarea:!0},re=y({menuitem:!0},ne),ie=/^[a-zA-Z][a-zA-Z:_\.\-\d]*$/,ae={},se={}.hasOwnProperty,ue=1;v.displayName="ReactDOMComponent",v.Mixin={mountComponent:function(e,n,o,r){this._rootNodeID=ue++,this._domID=o._idCounter++,this._hostParent=n,this._hostContainerInfo=o;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(d,this);break;case"input":I.mountWrapper(this,i,n),i=I.getHostProps(this,i),e.getReactMountReady().enqueue(d,this);break;case"option":P.mountWrapper(this,i,n),i=P.getHostProps(this,i);break;case"select":S.mountWrapper(this,i,n),i=S.getHostProps(this,i),e.getReactMountReady().enqueue(d,this);break;case"textarea":V.mountWrapper(this,i,n),i=V.getHostProps(this,i),e.getReactMountReady().enqueue(d,this)}a(this,i);var s,u;if(null!=n?(s=n._namespaceURI,u=n._tag):o._tag&&(s=o._namespaceURI,u=o._tag),(null==s||s===b.svg&&"foreignobject"===u)&&(s=b.html),s===b.html&&("svg"===this._tag?s=b.svg:"math"===this._tag&&(s=b.mathml)),this._namespaceURI=s,"production"!==t.env.NODE_ENV){var f;null!=n?f=n._ancestorInfo:o._tag&&(f=o._ancestorInfo),f&&H(this._tag,null,this,f),this._ancestorInfo=H.updatedAncestorInfo(f,this._tag,this)}var h;if(e.useCreateElement){var m,v=o._ownerDocument;if(s===b.html)if("script"===this._tag){var g=v.createElement("div"),y=this._currentElement.type;g.innerHTML="<"+y+"></"+y+">",m=g.removeChild(g.firstChild)}else m=i.is?v.createElement(this._currentElement.type,i.is):v.createElement(this._currentElement.type);else m=v.createElementNS(s,this._currentElement.type);k.precacheNode(this,m),this._flags|=q.hasCachedChildNodes,this._hostParent||D.setAttributeForRoot(m),this._updateDOMProperties(null,i,e);var _=N(m);this._createInitialChildren(e,i,r,_),h=_}else{var C=this._createOpenTagMarkupAndPutListeners(e,i),O=this._createContentMarkup(e,i,r);h=!O&&ne[this._tag]?C+"/>":C+">"+O+"</"+this._currentElement.type+">"}switch(this._tag){case"input":e.getReactMountReady().enqueue(c,this),i.autoFocus&&e.getReactMountReady().enqueue(E.focusDOMComponent,this);break;case"textarea":e.getReactMountReady().enqueue(l,this),i.autoFocus&&e.getReactMountReady().enqueue(E.focusDOMComponent,this);break;case"select":case"button":i.autoFocus&&e.getReactMountReady().enqueue(E.focusDOMComponent,this);break;case"option":e.getReactMountReady().enqueue(p,this)}return h},_createOpenTagMarkupAndPutListeners:function(e,n){var o="<"+this._currentElement.type;for(var r in n)if(n.hasOwnProperty(r)){var i=n[r];if(null!=i)if(X.hasOwnProperty(r))i&&s(this,r,i,e);else{"style"===r&&(i&&("production"!==t.env.NODE_ENV&&(this._previousStyle=i),i=this._previousStyleCopy=y({},n.style)),i=_.createMarkupForStyles(i,this));var a=null;null!=this._tag&&m(this._tag,n)?Q.hasOwnProperty(r)||(a=D.createMarkupForCustomAttribute(r,i)):a=D.createMarkupForProperty(r,i),a&&(o+=" "+a)}}return e.renderToStaticMarkup?o:(this._hostParent||(o+=" "+D.createMarkupForRoot()),o+=" "+D.createMarkupForID(this._domID))},_createContentMarkup:function(e,n,o){var r="",i=n.dangerouslySetInnerHTML;if(null!=i)null!=i.__html&&(r=i.__html);else{var a=$[typeof n.children]?n.children:null,s=null!=a?null:n.children;if(null!=a)r=L(a),"production"!==t.env.NODE_ENV&&ee.call(this,a);else if(null!=s){var u=this.mountChildren(s,e,o);r=u.join("")}}return oe[this._tag]&&"\n"===r.charAt(0)?"\n"+r:r},_createInitialChildren:function(e,n,o,r){var i=n.dangerouslySetInnerHTML;if(null!=i)null!=i.__html&&N.queueHTML(r,i.__html);else{var a=$[typeof n.children]?n.children:null,s=null!=a?null:n.children;if(null!=a)""!==a&&("production"!==t.env.NODE_ENV&&ee.call(this,a),N.queueText(r,a));else if(null!=s)for(var u=this.mountChildren(s,e,o),c=0;c<u.length;c++)N.queueChild(r,u[c])}},receiveComponent:function(e,t,n){var o=this._currentElement;this._currentElement=e,this.updateComponent(t,o,e,n)},updateComponent:function(e,t,n,o){var r=t.props,i=this._currentElement.props;switch(this._tag){case"input":r=I.getHostProps(this,r),i=I.getHostProps(this,i);break;case"option":r=P.getHostProps(this,r),i=P.getHostProps(this,i);break;case"select":r=S.getHostProps(this,r),i=S.getHostProps(this,i);break;case"textarea":r=V.getHostProps(this,r),i=V.getHostProps(this,i)}switch(a(this,i),this._updateDOMProperties(r,i,e),this._updateDOMChildren(r,i,e,o),this._tag){case"input":I.updateWrapper(this);break;case"textarea":V.updateWrapper(this);break;case"select":e.getReactMountReady().enqueue(f,this)}},_updateDOMProperties:function(e,n,o){var r,a,u;for(r in e)if(!n.hasOwnProperty(r)&&e.hasOwnProperty(r)&&null!=e[r])if("style"===r){var c=this._previousStyleCopy;for(a in c)c.hasOwnProperty(a)&&(u=u||{},u[a]="");this._previousStyleCopy=null}else X.hasOwnProperty(r)?e[r]&&Y(this,r):m(this._tag,e)?Q.hasOwnProperty(r)||D.deleteValueForAttribute(K(this),r):(C.properties[r]||C.isCustomAttribute(r))&&D.deleteValueForProperty(K(this),r);for(r in n){var l=n[r],p="style"===r?this._previousStyleCopy:null!=e?e[r]:void 0;if(n.hasOwnProperty(r)&&l!==p&&(null!=l||null!=p))if("style"===r)if(l?("production"!==t.env.NODE_ENV&&(i(this._previousStyleCopy,this._previousStyle,this),this._previousStyle=l),l=this._previousStyleCopy=y({},l)):this._previousStyleCopy=null,p){for(a in p)!p.hasOwnProperty(a)||l&&l.hasOwnProperty(a)||(u=u||{},u[a]="");for(a in l)l.hasOwnProperty(a)&&p[a]!==l[a]&&(u=u||{},u[a]=l[a])}else u=l;else if(X.hasOwnProperty(r))l?s(this,r,l,o):p&&Y(this,r);else if(m(this._tag,n))Q.hasOwnProperty(r)||D.setValueForAttribute(K(this),r,l);else if(C.properties[r]||C.isCustomAttribute(r)){var d=K(this);null!=l?D.setValueForProperty(d,r,l):D.deleteValueForProperty(d,r)}}u&&_.setValueForStyles(K(this),u,this)},_updateDOMChildren:function(e,n,o,r){var i=$[typeof e.children]?e.children:null,a=$[typeof n.children]?n.children:null,s=e.dangerouslySetInnerHTML&&e.dangerouslySetInnerHTML.__html,u=n.dangerouslySetInnerHTML&&n.dangerouslySetInnerHTML.__html,c=null!=i?null:e.children,l=null!=a?null:n.children,p=null!=i||null!=s,d=null!=a||null!=u;null!=c&&null==l?this.updateChildren(null,o,r):p&&!d&&(this.updateTextContent(""),"production"!==t.env.NODE_ENV&&R.debugTool.onSetChildren(this._debugID,[])),null!=a?i!==a&&(this.updateTextContent(""+a),"production"!==t.env.NODE_ENV&&ee.call(this,a)):null!=u?(s!==u&&this.updateMarkup(""+u),"production"!==t.env.NODE_ENV&&R.debugTool.onSetChildren(this._debugID,[])):null!=l&&("production"!==t.env.NODE_ENV&&ee.call(this,null),this.updateChildren(l,o,r))},getHostNode:function(){return K(this)},unmountComponent:function(e){switch(this._tag){case"audio":case"form":case"iframe":case"img":case"link":case"object":case"source":case"video":var n=this._wrapperState.listeners;if(n)for(var o=0;o<n.length;o++)n[o].remove();break;case"html":case"head":case"body":"production"!==t.env.NODE_ENV?F(!1,"<%s> tried to unmount. Because of cross-browser quirks it is impossible to unmount some top-level components (eg <html>, <head>, and <body>) reliably and efficiently. To fix this, have a single top-level component that never unmounts render these elements.",this._tag):g("66",this._tag)}this.unmountChildren(e),k.uncacheNode(this),O.deleteAllListeners(this),this._rootNodeID=0,this._domID=0,this._wrapperState=null,"production"!==t.env.NODE_ENV&&ee.call(this,null)},getPublicInstance:function(){return K(this)}},y(v.prototype,v.Mixin,M.Mixin),e.exports=v}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e,n){var o={_topLevelWrapper:e,_idCounter:1,_ownerDocument:n?n.nodeType===i?n:n.ownerDocument:null,_node:n,_tag:n?n.nodeName.toLowerCase():null,_namespaceURI:n?n.namespaceURI:null};return"production"!==t.env.NODE_ENV&&(o._ancestorInfo=n?r.updatedAncestorInfo(null,o._tag,null):null),o}var r=n(46),i=9;e.exports=o}).call(t,n(0))},function(e,t,n){"use strict";var o=n(4),r=n(17),i=n(5),a=function(e){this._currentElement=null,this._hostNode=null,this._hostParent=null,this._hostContainerInfo=null,this._domID=0};o(a.prototype,{mountComponent:function(e,t,n,o){var a=n._idCounter++;this._domID=a,this._hostParent=t,this._hostContainerInfo=n;var s=" react-empty: "+this._domID+" ";if(e.useCreateElement){var u=n._ownerDocument,c=u.createComment(s);return i.precacheNode(this,c),r(c)}return e.renderToStaticMarkup?"":"\x3c!--"+s+"--\x3e"},receiveComponent:function(){},getHostNode:function(){return i.getNodeFromInstance(this)},unmountComponent:function(){i.uncacheNode(this)}}),e.exports=a},function(e,t,n){"use strict";var o={useCreateElement:!0,useFiber:!1};e.exports=o},function(e,t,n){"use strict";var o=n(32),r=n(5),i={dangerouslyProcessChildrenUpdates:function(e,t){var n=r.getNodeFromInstance(e);o.processUpdates(n,t)}};e.exports=i},function(e,t,n){"use strict";(function(t){function o(){this._rootNodeID&&_.updateWrapper(this)}function r(e){return"checkbox"===e.type||"radio"===e.type?null!=e.checked:null!=e.value}function i(e){var n=this._currentElement.props,r=c.executeOnChange(n,e);p.asap(o,this);var i=n.name;if("radio"===n.type&&null!=i){for(var s=l.getNodeFromInstance(this),u=s;u.parentNode;)u=u.parentNode;for(var f=u.querySelectorAll("input[name="+JSON.stringify(""+i)+'][type="radio"]'),h=0;h<f.length;h++){var m=f[h];if(m!==s&&m.form===s.form){var v=l.getInstanceFromNode(m);v||("production"!==t.env.NODE_ENV?d(!1,"ReactDOMInput: Mixing React and non-React radio inputs with the same `name` is not supported."):a("90")),p.asap(o,v)}}}return r}var a=n(3),s=n(4),u=n(57),c=n(36),l=n(5),p=n(10),d=n(1),f=n(2),h=!1,m=!1,v=!1,g=!1,y=!1,E=!1,_={getHostProps:function(e,t){var n=c.getValue(t),o=c.getChecked(t);return s({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!=o?o:e._wrapperState.initialChecked,onChange:e._wrapperState.onChange})},mountWrapper:function(e,n){if("production"!==t.env.NODE_ENV){c.checkPropTypes("input",n,e._currentElement._owner);var o=e._currentElement._owner;void 0===n.valueLink||h||("production"!==t.env.NODE_ENV&&f(!1,"`valueLink` prop on `input` is deprecated; set `value` and `onChange` instead."),h=!0),void 0===n.checkedLink||m||("production"!==t.env.NODE_ENV&&f(!1,"`checkedLink` prop on `input` is deprecated; set `value` and `onChange` instead."),m=!0),void 0===n.checked||void 0===n.defaultChecked||g||("production"!==t.env.NODE_ENV&&f(!1,"%s contains an input of type %s with both checked and defaultChecked props. Input elements must be either controlled or uncontrolled (specify either the checked prop, or the defaultChecked prop, but not both). Decide between using a controlled or uncontrolled input element and remove one of these props. More info: https://fb.me/react-controlled-components",o&&o.getName()||"A component",n.type),g=!0),void 0===n.value||void 0===n.defaultValue||v||("production"!==t.env.NODE_ENV&&f(!1,"%s contains an input of type %s with both value and defaultValue props. Input elements must be either controlled or uncontrolled (specify either the value prop, or the defaultValue prop, but not both). Decide between using a controlled or uncontrolled input element and remove one of these props. More info: https://fb.me/react-controlled-components",o&&o.getName()||"A component",n.type),v=!0)}var a=n.defaultValue;e._wrapperState={initialChecked:null!=n.checked?n.checked:n.defaultChecked,initialValue:null!=n.value?n.value:a,listeners:null,onChange:i.bind(e)},"production"!==t.env.NODE_ENV&&(e._wrapperState.controlled=r(n))},updateWrapper:function(e){var n=e._currentElement.props;if("production"!==t.env.NODE_ENV){var o=r(n),i=e._currentElement._owner;e._wrapperState.controlled||!o||E||("production"!==t.env.NODE_ENV&&f(!1,"%s is changing an uncontrolled input of type %s to be controlled. Input elements should not switch from uncontrolled to controlled (or vice versa). Decide between using a controlled or uncontrolled input element for the lifetime of the component. More info: https://fb.me/react-controlled-components",i&&i.getName()||"A component",n.type),E=!0),!e._wrapperState.controlled||o||y||("production"!==t.env.NODE_ENV&&f(!1,"%s is changing a controlled input of type %s to be uncontrolled. Input elements should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled input element for the lifetime of the component. More info: https://fb.me/react-controlled-components",i&&i.getName()||"A component",n.type),y=!0)}var a=n.checked;null!=a&&u.setValueForProperty(l.getNodeFromInstance(e),"checked",a||!1);var s=l.getNodeFromInstance(e),p=c.getValue(n);if(null!=p){var d=""+p;d!==s.value&&(s.value=d)}else null==n.value&&null!=n.defaultValue&&s.defaultValue!==""+n.defaultValue&&(s.defaultValue=""+n.defaultValue),null==n.checked&&null!=n.defaultChecked&&(s.defaultChecked=!!n.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 o=n.name;""!==o&&(n.name=""),n.defaultChecked=!n.defaultChecked,n.defaultChecked=!n.defaultChecked,""!==o&&(n.name=o)}};e.exports=_}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e,n,o){if(c.hasOwnProperty(n)&&c[n])return!0;if(l.test(n)){var r=n.toLowerCase(),i=a.getPossibleStandardName.hasOwnProperty(r)?a.getPossibleStandardName[r]:null;if(null==i)return c[n]=!0,!1;if(n!==i)return"production"!==t.env.NODE_ENV&&u(!1,"Unknown ARIA attribute %s. Did you mean %s?%s",n,i,s.getStackAddendumByID(o)),c[n]=!0,!0}return!0}function r(e,n){var r=[];for(var i in n.props){o(n.type,i,e)||r.push(i)}var a=r.map(function(e){return"`"+e+"`"}).join(", ");1===r.length?"production"!==t.env.NODE_ENV&&u(!1,"Invalid aria prop %s on <%s> tag. For details, see https://fb.me/invalid-aria-prop%s",a,n.type,s.getStackAddendumByID(e)):r.length>1&&"production"!==t.env.NODE_ENV&&u(!1,"Invalid aria props %s on <%s> tag. For details, see https://fb.me/invalid-aria-prop%s",a,n.type,s.getStackAddendumByID(e))}function i(e,t){null!=t&&"string"==typeof t.type&&(t.type.indexOf("-")>=0||t.props.is||r(e,t))}var a=n(13),s=n(7),u=n(2),c={},l=new RegExp("^(aria)-["+a.ATTRIBUTE_NAME_CHAR+"]*$"),p={onBeforeMountComponent:function(e,n){"production"!==t.env.NODE_ENV&&i(e,n)},onBeforeUpdateComponent:function(e,n){"production"!==t.env.NODE_ENV&&i(e,n)}};e.exports=p}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e,n){null!=n&&("input"!==n.type&&"textarea"!==n.type&&"select"!==n.type||null==n.props||null!==n.props.value||a||("production"!==t.env.NODE_ENV&&i(!1,"`value` prop on `%s` should not be null. Consider using the empty string to clear the component or `undefined` for uncontrolled components.%s",n.type,r.getStackAddendumByID(e)),a=!0))}var r=n(7),i=n(2),a=!1,s={onBeforeMountComponent:function(e,t){o(e,t)},onBeforeUpdateComponent:function(e,t){o(e,t)}};e.exports=s}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e){var n="";return i.Children.forEach(e,function(e){null!=e&&("string"==typeof e||"number"==typeof e?n+=e:c||(c=!0,"production"!==t.env.NODE_ENV&&u(!1,"Only strings and numbers are supported as <option> children.")))}),n}var r=n(4),i=n(19),a=n(5),s=n(59),u=n(2),c=!1,l={mountWrapper:function(e,n,r){"production"!==t.env.NODE_ENV&&"production"!==t.env.NODE_ENV&&u(null==n.selected,"Use the `defaultValue` or `value` props on <select> instead of setting `selected` on <option>.");var i=null;if(null!=r){var a=r;"optgroup"===a._tag&&(a=a._hostParent),null!=a&&"select"===a._tag&&(i=s.getSelectValueContext(a))}var c=null;if(null!=i){var l;if(l=null!=n.value?n.value+"":o(n.children),c=!1,Array.isArray(i)){for(var p=0;p<i.length;p++)if(""+i[p]===l){c=!0;break}}else c=""+i===l}e._wrapperState={selected:c}},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=r({selected:void 0,children:void 0},t);null!=e._wrapperState.selected&&(n.selected=e._wrapperState.selected);var i=o(t.children);return i&&(n.children=i),n}};e.exports=l}).call(t,n(0))},function(e,t,n){"use strict";function o(e,t,n,o){return e===n&&t===o}function r(e){var t=document.selection,n=t.createRange(),o=n.text.length,r=n.duplicate();r.moveToElementText(e),r.setEndPoint("EndToStart",n);var i=r.text.length;return{start:i,end:i+o}}function i(e){var t=window.getSelection&&window.getSelection();if(!t||0===t.rangeCount)return null;var n=t.anchorNode,r=t.anchorOffset,i=t.focusNode,a=t.focusOffset,s=t.getRangeAt(0);try{s.startContainer.nodeType,s.endContainer.nodeType}catch(e){return null}var u=o(t.anchorNode,t.anchorOffset,t.focusNode,t.focusOffset),c=u?0:s.toString().length,l=s.cloneRange();l.selectNodeContents(e),l.setEnd(s.startContainer,s.startOffset);var p=o(l.startContainer,l.startOffset,l.endContainer,l.endOffset),d=p?0:l.toString().length,f=d+c,h=document.createRange();h.setStart(n,r),h.setEnd(i,a);var m=h.collapsed;return{start:m?f:d,end:m?d:f}}function a(e,t){var n,o,r=document.selection.createRange().duplicate();void 0===t.end?(n=t.start,o=n):t.start>t.end?(n=t.end,o=t.start):(n=t.start,o=t.end),r.moveToElementText(e),r.moveStart("character",n),r.setEndPoint("EndToStart",r),r.moveEnd("character",o-n),r.select()}function s(e,t){if(window.getSelection){var n=window.getSelection(),o=e[l()].length,r=Math.min(t.start,o),i=void 0===t.end?r:Math.min(t.end,o);if(!n.extend&&r>i){var a=i;i=r,r=a}var s=c(e,r),u=c(e,i);if(s&&u){var p=document.createRange();p.setStart(s.node,s.offset),n.removeAllRanges(),r>i?(n.addRange(p),n.extend(u.node,u.offset)):(p.setEnd(u.node,u.offset),n.addRange(p))}}}var u=n(6),c=n(163),l=n(71),p=u.canUseDOM&&"selection"in document&&!("getSelection"in window),d={getOffsets:p?r:i,setOffsets:p?a:s};e.exports=d},function(e,t,n){"use strict";(function(t){var o=n(3),r=n(4),i=n(32),a=n(17),s=n(5),u=n(29),c=n(1),l=n(46),p=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};r(p.prototype,{mountComponent:function(e,n,o,r){if("production"!==t.env.NODE_ENV){var i;null!=n?i=n._ancestorInfo:null!=o&&(i=o._ancestorInfo),i&&l(null,this._stringText,this,i)}var c=o._idCounter++,p=" react-text: "+c+" ";if(this._domID=c,this._hostParent=n,e.useCreateElement){var d=o._ownerDocument,f=d.createComment(p),h=d.createComment(" /react-text "),m=a(d.createDocumentFragment());return a.queueChild(m,a(f)),this._stringText&&a.queueChild(m,a(d.createTextNode(this._stringText))),a.queueChild(m,a(h)),s.precacheNode(this,f),this._closingComment=h,m}var v=u(this._stringText);return e.renderToStaticMarkup?v:"\x3c!--"+p+"--\x3e"+v+"\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 o=this.getHostNode();i.replaceDelimitedText(o[0],o[1],n)}}},getHostNode:function(){var e=this._commentNodes;if(e)return e;if(!this._closingComment)for(var n=s.getNodeFromInstance(this),r=n.nextSibling;;){if(null==r&&("production"!==t.env.NODE_ENV?c(!1,"Missing closing comment for text component %s",this._domID):o("67",this._domID)),8===r.nodeType&&" /react-text "===r.nodeValue){this._closingComment=r;break}r=r.nextSibling}return e=[this._hostNode,this._closingComment],this._commentNodes=e,e},unmountComponent:function(){this._closingComment=null,this._commentNodes=null,s.uncacheNode(this)}}),e.exports=p}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(){this._rootNodeID&&h.updateWrapper(this)}function r(e){var t=this._currentElement.props,n=s.executeOnChange(t,e);return c.asap(o,this),n}var i=n(3),a=n(4),s=n(36),u=n(5),c=n(10),l=n(1),p=n(2),d=!1,f=!1,h={getHostProps:function(e,n){return null!=n.dangerouslySetInnerHTML&&("production"!==t.env.NODE_ENV?l(!1,"`dangerouslySetInnerHTML` does not make sense on <textarea>."):i("91")),a({},n,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue,onChange:e._wrapperState.onChange})},mountWrapper:function(e,n){"production"!==t.env.NODE_ENV&&(s.checkPropTypes("textarea",n,e._currentElement._owner),void 0===n.valueLink||d||("production"!==t.env.NODE_ENV&&p(!1,"`valueLink` prop on `textarea` is deprecated; set `value` and `onChange` instead."),d=!0),void 0===n.value||void 0===n.defaultValue||f||("production"!==t.env.NODE_ENV&&p(!1,"Textarea elements must be either controlled or uncontrolled (specify either the value prop, or the defaultValue prop, but not both). Decide between using a controlled or uncontrolled textarea and remove one of these props. More info: https://fb.me/react-controlled-components"),f=!0));var o=s.getValue(n),a=o;if(null==o){var u=n.defaultValue,c=n.children;null!=c&&("production"!==t.env.NODE_ENV&&"production"!==t.env.NODE_ENV&&p(!1,"Use the `defaultValue` or `value` props instead of setting children on <textarea>."),null!=u&&("production"!==t.env.NODE_ENV?l(!1,"If you supply `defaultValue` on a <textarea>, do not pass children."):i("92")),Array.isArray(c)&&(c.length<=1||("production"!==t.env.NODE_ENV?l(!1,"<textarea> can only have at most one child."):i("93")),c=c[0]),u=""+c),null==u&&(u=""),a=u}e._wrapperState={initialValue:""+a,listeners:null,onChange:r.bind(e)}},updateWrapper:function(e){var t=e._currentElement.props,n=u.getNodeFromInstance(e),o=s.getValue(t);if(null!=o){var r=""+o;r!==n.value&&(n.value=r),null==t.defaultValue&&(n.defaultValue=r)}null!=t.defaultValue&&(n.defaultValue=t.defaultValue)},postMountWrapper:function(e){var t=u.getNodeFromInstance(e),n=t.textContent;n===e._wrapperState.initialValue&&(t.value=n)}};e.exports=h}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e,n){"_hostNode"in e||("production"!==t.env.NODE_ENV?c(!1,"getNodeFromInstance: Invalid argument."):u("33")),"_hostNode"in n||("production"!==t.env.NODE_ENV?c(!1,"getNodeFromInstance: Invalid argument."):u("33"));for(var o=0,r=e;r;r=r._hostParent)o++;for(var i=0,a=n;a;a=a._hostParent)i++;for(;o-i>0;)e=e._hostParent,o--;for(;i-o>0;)n=n._hostParent,i--;for(var s=o;s--;){if(e===n)return e;e=e._hostParent,n=n._hostParent}return null}function r(e,n){"_hostNode"in e||("production"!==t.env.NODE_ENV?c(!1,"isAncestor: Invalid argument."):u("35")),"_hostNode"in n||("production"!==t.env.NODE_ENV?c(!1,"isAncestor: Invalid argument."):u("35"));for(;n;){if(n===e)return!0;n=n._hostParent}return!1}function i(e){return"_hostNode"in e||("production"!==t.env.NODE_ENV?c(!1,"getParentInstance: Invalid argument."):u("36")),e._hostParent}function a(e,t,n){for(var o=[];e;)o.push(e),e=e._hostParent;var r;for(r=o.length;r-- >0;)t(o[r],"captured",n);for(r=0;r<o.length;r++)t(o[r],"bubbled",n)}function s(e,t,n,r,i){for(var a=e&&t?o(e,t):null,s=[];e&&e!==a;)s.push(e),e=e._hostParent;for(var u=[];t&&t!==a;)u.push(t),t=t._hostParent;var c;for(c=0;c<s.length;c++)n(s[c],"bubbled",r);for(c=u.length;c-- >0;)n(u[c],"captured",i)}var u=n(3),c=n(1);e.exports={isAncestor:r,getLowestCommonAncestor:o,getParentInstance:i,traverseTwoPhase:a,traverseEnterLeave:s}}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e,t){null!=t&&"string"==typeof t.type&&(t.type.indexOf("-")>=0||t.props.is||p(e,t))}var r=n(13),i=n(25),a=n(7),s=n(2);if("production"!==t.env.NODE_ENV)var u={children:!0,dangerouslySetInnerHTML:!0,key:!0,ref:!0,autoFocus:!0,defaultValue:!0,valueLink:!0,defaultChecked:!0,checkedLink:!0,innerHTML:!0,suppressContentEditableWarning:!0,onFocusIn:!0,onFocusOut:!0},c={},l=function(e,n,o){if(r.properties.hasOwnProperty(n)||r.isCustomAttribute(n))return!0;if(u.hasOwnProperty(n)&&u[n]||c.hasOwnProperty(n)&&c[n])return!0;if(i.registrationNameModules.hasOwnProperty(n))return!0;c[n]=!0;var l=n.toLowerCase(),p=r.isCustomAttribute(l)?l:r.getPossibleStandardName.hasOwnProperty(l)?r.getPossibleStandardName[l]:null,d=i.possibleRegistrationNames.hasOwnProperty(l)?i.possibleRegistrationNames[l]:null;return null!=p?("production"!==t.env.NODE_ENV&&s(!1,"Unknown DOM property %s. Did you mean %s?%s",n,p,a.getStackAddendumByID(o)),!0):null!=d&&("production"!==t.env.NODE_ENV&&s(!1,"Unknown event handler property %s. Did you mean `%s`?%s",n,d,a.getStackAddendumByID(o)),!0)};var p=function(e,n){var o=[];for(var r in n.props){l(n.type,r,e)||o.push(r)}var i=o.map(function(e){return"`"+e+"`"}).join(", ");1===o.length?"production"!==t.env.NODE_ENV&&s(!1,"Unknown prop %s on <%s> tag. Remove this prop from the element. For details, see https://fb.me/react-unknown-prop%s",i,n.type,a.getStackAddendumByID(e)):o.length>1&&"production"!==t.env.NODE_ENV&&s(!1,"Unknown props %s on <%s> tag. Remove these props from the element. For details, see https://fb.me/react-unknown-prop%s",i,n.type,a.getStackAddendumByID(e))},d={onBeforeMountComponent:function(e,t){o(e,t)},onBeforeUpdateComponent:function(e,t){o(e,t)}};e.exports=d}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e,n,o,r,i,a,s,u){try{n.call(o,r,i,a,s,u)}catch(n){"production"!==t.env.NODE_ENV&&N(C[e],"Exception thrown by hook while handling %s: %s",e,n+"\n"+n.stack),C[e]=!0}}function r(e,t,n,r,i,a){for(var s=0;s<b.length;s++){var u=b[s],c=u[e];c&&o(e,c,u,t,n,r,i,a)}}function i(){y.purgeUnmountedComponents(),g.clearHistory()}function a(e){return e.reduce(function(e,t){var n=y.getOwnerID(t),o=y.getParentID(t);return e[t]={displayName:y.getDisplayName(t),text:y.getText(t),updateCount:y.getUpdateCount(t),childIDs:y.getChildIDs(t),ownerID:n||o&&y.getOwnerID(o)||0,parentID:o},e},{})}function s(){var e=k,t=T,n=g.getHistory();if(0===x)return k=0,T=[],void i();if(t.length||n.length){var o=y.getRegisteredIDs();O.push({duration:_()-e,measurements:t||[],operations:n||[],treeSnapshot:a(o)})}i(),k=_(),T=[]}function u(e){arguments.length>1&&void 0!==arguments[1]&&arguments[1]&&0===e||e||"production"!==t.env.NODE_ENV&&N(!1,"ReactDebugTool: debugID may not be empty.")}function c(e,n){0!==x&&(V&&!R&&("production"!==t.env.NODE_ENV&&N(!1,"There is an internal error in the React performance measurement code. Did not expect %s timer to start while %s timer is still in progress for %s instance.",n,V||"no",e===I?"the same":"another"),R=!0),P=_(),S=0,I=e,V=n)}function l(e,n){0!==x&&(V===n||R||("production"!==t.env.NODE_ENV&&N(!1,"There is an internal error in the React performance measurement code. We did not expect %s timer to stop while %s timer is still in progress for %s instance. Please report this as a bug in React.",n,V||"no",e===I?"the same":"another"),R=!0),D&&T.push({timerType:n,instanceID:e,duration:_()-P-S}),P=0,S=0,I=null,V=null)}function p(){var e={startTime:P,nestedFlushStartTime:_(),debugID:I,timerType:V};w.push(e),P=0,S=0,I=null,V=null}function d(){var e=w.pop(),t=e.startTime,n=e.nestedFlushStartTime,o=e.debugID,r=e.timerType,i=_()-n;P=t,S+=i,I=o,V=r}function f(e){if(!D||!A)return!1;var t=y.getElement(e);return null!=t&&"object"==typeof t&&!("string"==typeof t.type)}function h(e,t){if(f(e)){var n=e+"::"+t;M=_(),performance.mark(n)}}function m(e,t){if(f(e)){var n=e+"::"+t,o=y.getDisplayName(e)||"Unknown";if(_()-M>.1){var r=o+" ["+t+"]";performance.measure(r,n)}performance.clearMarks(n),performance.clearMeasures(r)}}var v=n(132),g=n(130),y=n(7),E=n(6),_=n(95),N=n(2),b=[],C={},D=!1,O=[],w=[],x=0,T=[],k=0,I=null,P=0,S=0,V=null,R=!1,M=0,A="undefined"!=typeof performance&&"function"==typeof performance.mark&&"function"==typeof performance.clearMarks&&"function"==typeof performance.measure&&"function"==typeof performance.clearMeasures,U={addHook:function(e){b.push(e)},removeHook:function(e){for(var t=0;t<b.length;t++)b[t]===e&&(b.splice(t,1),t--)},isProfiling:function(){return D},beginProfiling:function(){D||(D=!0,O.length=0,s(),U.addHook(g))},endProfiling:function(){D&&(D=!1,s(),U.removeHook(g))},getFlushHistory:function(){return O},onBeginFlush:function(){x++,s(),p(),r("onBeginFlush")},onEndFlush:function(){s(),x--,d(),r("onEndFlush")},onBeginLifeCycleTimer:function(e,t){u(e),r("onBeginLifeCycleTimer",e,t),h(e,t),c(e,t)},onEndLifeCycleTimer:function(e,t){u(e),l(e,t),m(e,t),r("onEndLifeCycleTimer",e,t)},onBeginProcessingChildContext:function(){r("onBeginProcessingChildContext")},onEndProcessingChildContext:function(){r("onEndProcessingChildContext")},onHostOperation:function(e){u(e.instanceID),r("onHostOperation",e)},onSetState:function(){r("onSetState")},onSetChildren:function(e,t){u(e),t.forEach(u),r("onSetChildren",e,t)},onBeforeMountComponent:function(e,t,n){u(e),u(n,!0),r("onBeforeMountComponent",e,t,n),h(e,"mount")},onMountComponent:function(e){u(e),m(e,"mount"),r("onMountComponent",e)},onBeforeUpdateComponent:function(e,t){u(e),r("onBeforeUpdateComponent",e,t),h(e,"update")},onUpdateComponent:function(e){u(e),m(e,"update"),r("onUpdateComponent",e)},onBeforeUnmountComponent:function(e){u(e),r("onBeforeUnmountComponent",e),h(e,"unmount")},onUnmountComponent:function(e){u(e),m(e,"unmount"),r("onUnmountComponent",e)},onTestEvent:function(){r("onTestEvent")}};U.addDevtool=U.addHook,U.removeDevtool=U.removeHook,U.addHook(v),U.addHook(y),/[?&]react_perf\b/.test(E.canUseDOM&&window.location.href||"")&&U.beginProfiling(),e.exports=U}).call(t,n(0))},function(e,t,n){"use strict";function o(){this.reinitializeTransaction()}var r=n(4),i=n(10),a=n(28),s=n(9),u={initialize:s,close:function(){d.isBatchingUpdates=!1}},c={initialize:s,close:i.flushBatchedUpdates.bind(i)},l=[c,u];r(o.prototype,a,{getTransactionWrappers:function(){return l}});var p=new o,d={isBatchingUpdates:!1,batchedUpdates:function(e,t,n,o,r,i){var a=d.isBatchingUpdates;return d.isBatchingUpdates=!0,a?e(t,n,o,r,i):p.perform(e,null,t,n,o,r,i)}};e.exports=d},function(e,t,n){"use strict";function o(){C||(C=!0,y.EventEmitter.injectReactEventListener(g),y.EventPluginHub.injectEventPluginOrder(s),y.EventPluginUtils.injectComponentTree(d),y.EventPluginUtils.injectTreeTraversal(h),y.EventPluginHub.injectEventPluginsByName({SimpleEventPlugin:b,EnterLeaveEventPlugin:u,ChangeEventPlugin:a,SelectEventPlugin:N,BeforeInputEventPlugin:i}),y.HostComponent.injectGenericComponentClass(p),y.HostComponent.injectTextComponentClass(m),y.DOMProperty.injectDOMPropertyConfig(r),y.DOMProperty.injectDOMPropertyConfig(c),y.DOMProperty.injectDOMPropertyConfig(_),y.EmptyComponent.injectEmptyComponentFactory(function(e){return new f(e)}),y.Updates.injectReconcileTransaction(E),y.Updates.injectBatchingStrategy(v),y.Component.injectEnvironment(l))}var r=n(96),i=n(98),a=n(100),s=n(102),u=n(103),c=n(105),l=n(107),p=n(110),d=n(5),f=n(112),h=n(122),m=n(120),v=n(125),g=n(129),y=n(131),E=n(137),_=n(142),N=n(143),b=n(144),C=!1;e.exports={inject:o}},function(e,t,n){"use strict";var o="function"==typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103;e.exports=o},function(e,t,n){"use strict";function o(e){r.enqueueEvents(e),r.processEventQueue(!1)}var r=n(21),i={handleTopLevel:function(e,t,n,i){o(r.extractEvents(e,t,n,i))}};e.exports=i},function(e,t,n){"use strict";function o(e){for(;e._hostParent;)e=e._hostParent;var t=p.getNodeFromInstance(e),n=t.parentNode;return p.getClosestInstanceFromNode(n)}function r(e,t){this.topLevelType=e,this.nativeEvent=t,this.ancestors=[]}function i(e){var t=f(e.nativeEvent),n=p.getClosestInstanceFromNode(t),r=n;do{e.ancestors.push(r),r=r&&o(r)}while(r);for(var i=0;i<e.ancestors.length;i++)n=e.ancestors[i],m._handleTopLevel(e.topLevelType,n,e.nativeEvent,f(e.nativeEvent))}function a(e){e(h(window))}var s=n(4),u=n(52),c=n(6),l=n(14),p=n(5),d=n(10),f=n(43),h=n(88);s(r.prototype,{destructor:function(){this.topLevelType=null,this.nativeEvent=null,this.ancestors.length=0}}),l.addPoolingTo(r,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?u.listen(n,t,m.dispatchEvent.bind(null,e)):null},trapCapturedEvent:function(e,t,n){return n?u.capture(n,t,m.dispatchEvent.bind(null,e)):null},monitorScrollValue:function(e){var t=a.bind(null,e);u.listen(window,"scroll",t)},dispatchEvent:function(e,t){if(m._enabled){var n=r.getPooled(e,t);try{d.batchedUpdates(i,n)}finally{r.release(n)}}}};e.exports=m},function(e,t,n){"use strict";var o=[],r={onHostOperation:function(e){o.push(e)},clearHistory:function(){r._preventClearing||(o=[])},getHistory:function(){return o}};e.exports=r},function(e,t,n){"use strict";var o=n(13),r=n(21),i=n(34),a=n(37),s=n(60),u=n(26),c=n(62),l=n(10),p={Component:a.injection,DOMProperty:o.injection,EmptyComponent:s.injection,EventPluginHub:r.injection,EventPluginUtils:i.injection,EventEmitter:u.injection,HostComponent:c.injection,Updates:l.injection};e.exports=p},function(e,t,n){"use strict";(function(t){var o=n(2);if("production"!==t.env.NODE_ENV)var r=!1,i=function(){"production"!==t.env.NODE_ENV&&o(!r,"setState(...): Cannot call setState() inside getChildContext()")};var a={onBeginProcessingChildContext:function(){r=!0},onEndProcessingChildContext:function(){r=!1},onSetState:function(){i()}};e.exports=a}).call(t,n(0))},function(e,t,n){"use strict";var o=n(155),r=/\/?>/,i=/^<\!\-\-/,a={CHECKSUM_ATTR_NAME:"data-react-checksum",addChecksumToMarkup:function(e){var t=o(e);return i.test(e)?e:e.replace(r," "+a.CHECKSUM_ATTR_NAME+'="'+t+'"$&')},canReuseMarkup:function(e,t){var n=t.getAttribute(a.CHECKSUM_ATTR_NAME);return n=n&&parseInt(n,10),o(e)===n}};e.exports=a},function(e,t,n){"use strict";(function(t){function o(e,t,n){return{type:"INSERT_MARKUP",content:e,fromIndex:null,fromNode:null,toIndex:n,afterNode:t}}function r(e,t,n){return{type:"MOVE_EXISTING",content:null,fromIndex:e._mountIndex,fromNode:m.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 s(e){return{type:"TEXT_CONTENT",content:e,fromIndex:null,fromNode:null,toIndex:null,afterNode:null}}function u(e,t){return t&&(e=e||[],e.push(t)),e}function c(e,t){p.processChildrenUpdates(e,t)}var l=n(3),p=n(37),d=n(23),f=n(8),h=n(11),m=n(18),v=n(106),g=n(9),y=n(159),E=n(1),_=g;if("production"!==t.env.NODE_ENV){var N=function(e){if(!e._debugID){var t;(t=d.get(e))&&(e=t)}return e._debugID};_=function(e){var t=N(this);0!==t&&f.debugTool.onSetChildren(t,e?Object.keys(e).map(function(t){return e[t]._debugID}):[])}}var b={Mixin:{_reconcilerInstantiateChildren:function(e,n,o){if("production"!==t.env.NODE_ENV){var r=N(this);if(this._currentElement)try{return h.current=this._currentElement._owner,v.instantiateChildren(e,n,o,r)}finally{h.current=null}}return v.instantiateChildren(e,n,o)},_reconcilerUpdateChildren:function(e,n,o,r,i,a){var s,u=0;if("production"!==t.env.NODE_ENV&&(u=N(this),this._currentElement)){try{h.current=this._currentElement._owner,s=y(n,u)}finally{h.current=null}return v.updateChildren(e,s,o,r,i,this,this._hostContainerInfo,a,u),s}return s=y(n,u),v.updateChildren(e,s,o,r,i,this,this._hostContainerInfo,a,u),s},mountChildren:function(e,n,o){var r=this._reconcilerInstantiateChildren(e,n,o);this._renderedChildren=r;var i=[],a=0;for(var s in r)if(r.hasOwnProperty(s)){var u=r[s],c=0;"production"!==t.env.NODE_ENV&&(c=N(this));var l=m.mountComponent(u,n,this,this._hostContainerInfo,o,c);u._mountIndex=a++,i.push(l)}return"production"!==t.env.NODE_ENV&&_.call(this,r),i},updateTextContent:function(e){var n=this._renderedChildren;v.unmountChildren(n,!1);for(var o in n)n.hasOwnProperty(o)&&("production"!==t.env.NODE_ENV?E(!1,"updateTextContent called on non-empty component."):l("118"));c(this,[s(e)])},updateMarkup:function(e){var n=this._renderedChildren;v.unmountChildren(n,!1);for(var o in n)n.hasOwnProperty(o)&&("production"!==t.env.NODE_ENV?E(!1,"updateTextContent called on non-empty component."):l("118"));c(this,[a(e)])},updateChildren:function(e,t,n){this._updateChildren(e,t,n)},_updateChildren:function(e,n,o){var r=this._renderedChildren,i={},a=[],s=this._reconcilerUpdateChildren(r,e,a,i,n,o);if(s||r){var l,p=null,d=0,f=0,h=0,v=null;for(l in s)if(s.hasOwnProperty(l)){var g=r&&r[l],y=s[l];g===y?(p=u(p,this.moveChild(g,v,d,f)),f=Math.max(g._mountIndex,f),g._mountIndex=d):(g&&(f=Math.max(g._mountIndex,f)),p=u(p,this._mountChildAtIndex(y,a[h],v,d,n,o)),h++),d++,v=m.getHostNode(y)}for(l in i)i.hasOwnProperty(l)&&(p=u(p,this._unmountChild(r[l],i[l])));p&&c(this,p),this._renderedChildren=s,"production"!==t.env.NODE_ENV&&_.call(this,s)}},unmountChildren:function(e){var t=this._renderedChildren;v.unmountChildren(t,e),this._renderedChildren=null},moveChild:function(e,t,n,o){if(e._mountIndex<o)return r(e,t,n)},createChild:function(e,t,n){return o(n,t,e._mountIndex)},removeChild:function(e,t){return i(e,t)},_mountChildAtIndex:function(e,t,n,o,r,i){return e._mountIndex=o,this.createChild(e,n,t)},_unmountChild:function(e,t){var n=this.removeChild(e,t);return e._mountIndex=null,n}}};e.exports=b}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e){return!(!e||"function"!=typeof e.attachRef||"function"!=typeof e.detachRef)}var r=n(3),i=n(1),a={addComponentAsRefTo:function(e,n,a){o(a)||("production"!==t.env.NODE_ENV?i(!1,"addComponentAsRefTo(...): Only a ReactOwner can have refs. You might be adding a ref to a component that was not created inside a component's `render` method, or you have multiple copies of React loaded (details: https://fb.me/react-refs-must-have-owner)."):r("119")),a.attachRef(n,e)},removeComponentAsRefFrom:function(e,n,a){o(a)||("production"!==t.env.NODE_ENV?i(!1,"removeComponentAsRefFrom(...): Only a ReactOwner can have refs. You might be removing a ref to a component that was not created inside a component's `render` method, or you have multiple copies of React loaded (details: https://fb.me/react-refs-must-have-owner)."):r("120"));var s=a.getPublicInstance();s&&s.refs[n]===e.getPublicInstance()&&a.detachRef(n)}};e.exports=a}).call(t,n(0))},function(e,t,n){"use strict";(function(t){var n={};"production"!==t.env.NODE_ENV&&(n={prop:"prop",context:"context",childContext:"child context"}),e.exports=n}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e){this.reinitializeTransaction(),this.renderToStaticMarkup=!1,this.reactMountReady=i.getPooled(null),this.useCreateElement=e}var r=n(4),i=n(56),a=n(14),s=n(26),u=n(63),c=n(8),l=n(28),p=n(39),d={initialize:u.getSelectionInformation,close:u.restoreSelection},f={initialize:function(){var e=s.isEnabled();return s.setEnabled(!1),e},close:function(e){s.setEnabled(e)}},h={initialize:function(){this.reactMountReady.reset()},close:function(){this.reactMountReady.notifyAll()}},m=[d,f,h];"production"!==t.env.NODE_ENV&&m.push({initialize:c.debugTool.onBeginFlush,close:c.debugTool.onEndFlush});var v={getTransactionWrappers:function(){return m},getReactMountReady:function(){return this.reactMountReady},getUpdateQueue:function(){return p},checkpoint:function(){return this.reactMountReady.checkpoint()},rollback:function(e){this.reactMountReady.rollback(e)},destructor:function(){i.release(this.reactMountReady),this.reactMountReady=null}};r(o.prototype,l,v),a.addPoolingTo(o),e.exports=o}).call(t,n(0))},function(e,t,n){"use strict";function o(e,t,n){"function"==typeof e?e(t.getPublicInstance()):i.addComponentAsRefTo(t,e,n)}function r(e,t,n){"function"==typeof e?e(null):i.removeComponentAsRefFrom(t,e,n)}var i=n(135),a={};a.attachRefs=function(e,t){if(null!==t&&"object"==typeof t){var n=t.ref;null!=n&&o(n,e,t._owner)}},a.shouldUpdateRefs=function(e,t){var n=null,o=null;null!==e&&"object"==typeof e&&(n=e.ref,o=e._owner);var r=null,i=null;return null!==t&&"object"==typeof t&&(r=t.ref,i=t._owner),n!==r||"string"==typeof r&&i!==o},a.detachRefs=function(e,t){if(null!==t&&"object"==typeof t){var n=t.ref;null!=n&&r(n,e,t._owner)}},e.exports=a},function(e,t,n){"use strict";(function(t){function o(e){this.reinitializeTransaction(),this.renderToStaticMarkup=e,this.useCreateElement=!1,this.updateQueue=new u(this)}var r=n(4),i=n(14),a=n(28),s=n(8),u=n(140),c=[];"production"!==t.env.NODE_ENV&&c.push({initialize:s.debugTool.onBeginFlush,close:s.debugTool.onEndFlush});var l={enqueue:function(){}},p={getTransactionWrappers:function(){return c},getReactMountReady:function(){return l},getUpdateQueue:function(){return this.updateQueue},destructor:function(){},checkpoint:function(){},rollback:function(){}};r(o.prototype,a,p),i.addPoolingTo(o),e.exports=o}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function r(e,n){if("production"!==t.env.NODE_ENV){var o=e.constructor;"production"!==t.env.NODE_ENV&&a(!1,"%s(...): Can only update a mounting component. This usually means you called %s() outside componentWillMount() on the server. This is a no-op. Please check the code for the %s component.",n,n,o&&(o.displayName||o.name)||"ReactClass")}}var i=n(39),a=n(2),s=function(){function e(t){o(this,e),this.transaction=t}return e.prototype.isMounted=function(e){return!1},e.prototype.enqueueCallback=function(e,t,n){this.transaction.isInTransaction()&&i.enqueueCallback(e,t,n)},e.prototype.enqueueForceUpdate=function(e){this.transaction.isInTransaction()?i.enqueueForceUpdate(e):r(e,"forceUpdate")},e.prototype.enqueueReplaceState=function(e,t){this.transaction.isInTransaction()?i.enqueueReplaceState(e,t):r(e,"replaceState")},e.prototype.enqueueSetState=function(e,t){this.transaction.isInTransaction()?i.enqueueSetState(e,t):r(e,"setState")},e}();e.exports=s}).call(t,n(0))},function(e,t,n){"use strict";e.exports="15.4.2"},function(e,t,n){"use strict";var o={xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace"},r={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",mathematical:0,mode:0,numOctaves:"numOctaves",offset:0,opacity:0,operator:0,order:0,orient:0,orientation:0,origin:0,overflow:0,overlinePosition:"overline-position",overlineThickness:"overline-thickness",paintOrder:"paint-order",panose1:"panose-1",pathLength:"pathLength",patternContentUnits:"patternContentUnits",patternTransform:"patternTransform",patternUnits:"patternUnits",pointerEvents:"pointer-events",points:0,pointsAtX:"pointsAtX",pointsAtY:"pointsAtY",pointsAtZ:"pointsAtZ",preserveAlpha:"preserveAlpha",preserveAspectRatio:"preserveAspectRatio",primitiveUnits:"primitiveUnits",r:0,radius:0,refX:"refX",refY:"refY",renderingIntent:"rendering-intent",repeatCount:"repeatCount",repeatDur:"repeatDur",requiredExtensions:"requiredExtensions",requiredFeatures:"requiredFeatures",restart:0,result:0,rotate:0,rx:0,ry:0,scale:0,seed:0,shapeRendering:"shape-rendering",slope:0,spacing:0,specularConstant:"specularConstant",specularExponent:"specularExponent",speed:0,spreadMethod:"spreadMethod",startOffset:"startOffset",stdDeviation:"stdDeviation",stemh:0,stemv:0,stitchTiles:"stitchTiles",stopColor:"stop-color",stopOpacity:"stop-opacity",strikethroughPosition:"strikethrough-position",strikethroughThickness:"strikethrough-thickness",string:0,stroke:0,strokeDasharray:"stroke-dasharray",strokeDashoffset:"stroke-dashoffset",strokeLinecap:"stroke-linecap",strokeLinejoin:"stroke-linejoin",strokeMiterlimit:"stroke-miterlimit",strokeOpacity:"stroke-opacity",strokeWidth:"stroke-width",surfaceScale:"surfaceScale",systemLanguage:"systemLanguage",tableValues:"tableValues",targetX:"targetX",targetY:"targetY",textAnchor:"text-anchor",textDecoration:"text-decoration",textRendering:"text-rendering",textLength:"textLength",to:0,transform:0,u1:0,u2:0,underlinePosition:"underline-position",underlineThickness:"underline-thickness",unicode:0,unicodeBidi:"unicode-bidi",unicodeRange:"unicode-range",unitsPerEm:"units-per-em",vAlphabetic:"v-alphabetic",vHanging:"v-hanging",vIdeographic:"v-ideographic",vMathematical:"v-mathematical",values:0,vectorEffect:"vector-effect",version:0,vertAdvY:"vert-adv-y",vertOriginX:"vert-origin-x",vertOriginY:"vert-origin-y",viewBox:"viewBox",viewTarget:"viewTarget",visibility:0,widths:0,wordSpacing:"word-spacing",writingMode:"writing-mode",x:0,xHeight:"x-height",x1:0,x2:0,xChannelSelector:"xChannelSelector",xlinkActuate:"xlink:actuate",xlinkArcrole:"xlink:arcrole",xlinkHref:"xlink:href",xlinkRole:"xlink:role",xlinkShow:"xlink:show",xlinkTitle:"xlink:title",xlinkType:"xlink:type",xmlBase:"xml:base",xmlns:0,xmlnsXlink:"xmlns:xlink",xmlLang:"xml:lang",xmlSpace:"xml:space",y:0,y1:0,y2:0,yChannelSelector:"yChannelSelector",z:0,zoomAndPan:"zoomAndPan"},i={Properties:{},DOMAttributeNamespaces:{xlinkActuate:o.xlink,xlinkArcrole:o.xlink,xlinkHref:o.xlink,xlinkRole:o.xlink,xlinkShow:o.xlink,xlinkTitle:o.xlink,xlinkType:o.xlink,xmlBase:o.xml,xmlLang:o.xml,xmlSpace:o.xml},DOMAttributeNames:{}};Object.keys(r).forEach(function(e){i.Properties[e]=0,r[e]&&(i.DOMAttributeNames[e]=r[e])}),e.exports=i},function(e,t,n){"use strict";function o(e){if("selectionStart"in e&&u.hasSelectionCapabilities(e))return{start:e.selectionStart,end:e.selectionEnd};if(window.getSelection){var t=window.getSelection();return{anchorNode:t.anchorNode,anchorOffset:t.anchorOffset,focusNode:t.focusNode,focusOffset:t.focusOffset}}if(document.selection){var n=document.selection.createRange();return{parentElement:n.parentElement(),text:n.text,top:n.boundingTop,left:n.boundingLeft}}}function r(e,t){if(y||null==m||m!==l())return null;var n=o(m);if(!g||!d(g,n)){g=n;var r=c.getPooled(h.select,v,e,t);return r.type="select",r.target=m,i.accumulateTwoPhaseDispatches(r),r}return null}var i=n(22),a=n(6),s=n(5),u=n(63),c=n(12),l=n(54),p=n(73),d=n(31),f=a.canUseDOM&&"documentMode"in document&&document.documentMode<=11,h={select:{phasedRegistrationNames:{bubbled:"onSelect",captured:"onSelectCapture"},dependencies:["topBlur","topContextMenu","topFocus","topKeyDown","topKeyUp","topMouseDown","topMouseUp","topSelectionChange"]}},m=null,v=null,g=null,y=!1,E=!1,_={eventTypes:h,extractEvents:function(e,t,n,o){if(!E)return null;var i=t?s.getNodeFromInstance(t):window;switch(e){case"topFocus":(p(i)||"true"===i.contentEditable)&&(m=i,v=t,g=null);break;case"topBlur":m=null,v=null,g=null;break;case"topMouseDown":y=!0;break;case"topContextMenu":case"topMouseUp":return y=!1,r(n,o);case"topSelectionChange":if(f)break;case"topKeyDown":case"topKeyUp":return r(n,o)}return null},didPutListener:function(e,t,n){"onSelect"===t&&(E=!0)}};e.exports=_},function(e,t,n){"use strict";(function(t){function o(e){return"."+e._rootNodeID}function r(e){return"button"===e||"input"===e||"select"===e||"textarea"===e}var i=n(3),a=n(52),s=n(22),u=n(5),c=n(145),l=n(146),p=n(12),d=n(149),f=n(151),h=n(27),m=n(148),v=n(152),g=n(153),y=n(24),E=n(154),_=n(9),N=n(41),b=n(1),C={},D={};["abort","animationEnd","animationIteration","animationStart","blur","canPlay","canPlayThrough","click","contextMenu","copy","cut","doubleClick","drag","dragEnd","dragEnter","dragExit","dragLeave","dragOver","dragStart","drop","durationChange","emptied","encrypted","ended","error","focus","input","invalid","keyDown","keyPress","keyUp","load","loadedData","loadedMetadata","loadStart","mouseDown","mouseMove","mouseOut","mouseOver","mouseUp","paste","pause","play","playing","progress","rateChange","reset","scroll","seeked","seeking","stalled","submit","suspend","timeUpdate","touchCancel","touchEnd","touchMove","touchStart","transitionEnd","volumeChange","waiting","wheel"].forEach(function(e){var t=e[0].toUpperCase()+e.slice(1),n="on"+t,o="top"+t,r={phasedRegistrationNames:{bubbled:n,captured:n+"Capture"},dependencies:[o]};C[e]=r,D[o]=r});var O={},w={eventTypes:C,extractEvents:function(e,n,o,r){var a=D[e];if(!a)return null;var u;switch(e){case"topAbort":case"topCanPlay":case"topCanPlayThrough":case"topDurationChange":case"topEmptied":case"topEncrypted":case"topEnded":case"topError":case"topInput":case"topInvalid":case"topLoad":case"topLoadedData":case"topLoadedMetadata":case"topLoadStart":case"topPause":case"topPlay":case"topPlaying":case"topProgress":case"topRateChange":case"topReset":case"topSeeked":case"topSeeking":case"topStalled":case"topSubmit":case"topSuspend":case"topTimeUpdate":case"topVolumeChange":case"topWaiting":u=p;break;case"topKeyPress":if(0===N(o))return null;case"topKeyDown":case"topKeyUp":u=f;break;case"topBlur":case"topFocus":u=d;break;case"topClick":if(2===o.button)return null;case"topDoubleClick":case"topMouseDown":case"topMouseMove":case"topMouseUp":case"topMouseOut":case"topMouseOver":case"topContextMenu":u=h;break;case"topDrag":case"topDragEnd":case"topDragEnter":case"topDragExit":case"topDragLeave":case"topDragOver":case"topDragStart":case"topDrop":u=m;break;case"topTouchCancel":case"topTouchEnd":case"topTouchMove":case"topTouchStart":u=v;break;case"topAnimationEnd":case"topAnimationIteration":case"topAnimationStart":u=c;break;case"topTransitionEnd":u=g;break;case"topScroll":u=y;break;case"topWheel":u=E;break;case"topCopy":case"topCut":case"topPaste":u=l}u||("production"!==t.env.NODE_ENV?b(!1,"SimpleEventPlugin: Unhandled event type, `%s`.",e):i("86",e));var _=u.getPooled(a,n,o,r);return s.accumulateTwoPhaseDispatches(_),_},didPutListener:function(e,t,n){if("onClick"===t&&!r(e._tag)){var i=o(e),s=u.getNodeFromInstance(e);O[i]||(O[i]=a.listen(s,"click",_))}},willDeleteListener:function(e,t){if("onClick"===t&&!r(e._tag)){var n=o(e);O[n].remove(),delete O[n]}}};e.exports=w}).call(t,n(0))},function(e,t,n){"use strict";function o(e,t,n,o){return r.call(this,e,t,n,o)}var r=n(12),i={animationName:null,elapsedTime:null,pseudoElement:null};r.augmentClass(o,i),e.exports=o},function(e,t,n){"use strict";function o(e,t,n,o){return r.call(this,e,t,n,o)}var r=n(12),i={clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}};r.augmentClass(o,i),e.exports=o},function(e,t,n){"use strict";function o(e,t,n,o){return r.call(this,e,t,n,o)}var r=n(12),i={data:null};r.augmentClass(o,i),e.exports=o},function(e,t,n){"use strict";function o(e,t,n,o){return r.call(this,e,t,n,o)}var r=n(27),i={dataTransfer:null};r.augmentClass(o,i),e.exports=o},function(e,t,n){"use strict";function o(e,t,n,o){return r.call(this,e,t,n,o)}var r=n(24),i={relatedTarget:null};r.augmentClass(o,i),e.exports=o},function(e,t,n){"use strict";function o(e,t,n,o){return r.call(this,e,t,n,o)}var r=n(12),i={data:null};r.augmentClass(o,i),e.exports=o},function(e,t,n){"use strict";function o(e,t,n,o){return r.call(this,e,t,n,o)}var r=n(24),i=n(41),a=n(160),s=n(42),u={key:a,location:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,repeat:null,locale:null,getModifierState:s,charCode:function(e){return"keypress"===e.type?i(e):0},keyCode:function(e){return"keydown"===e.type||"keyup"===e.type?e.keyCode:0},which:function(e){return"keypress"===e.type?i(e):"keydown"===e.type||"keyup"===e.type?e.keyCode:0}};r.augmentClass(o,u),e.exports=o},function(e,t,n){"use strict";function o(e,t,n,o){return r.call(this,e,t,n,o)}var r=n(24),i=n(42),a={touches:null,targetTouches:null,changedTouches:null,altKey:null,metaKey:null,ctrlKey:null,shiftKey:null,getModifierState:i};r.augmentClass(o,a),e.exports=o},function(e,t,n){"use strict";function o(e,t,n,o){return r.call(this,e,t,n,o)}var r=n(12),i={propertyName:null,elapsedTime:null,pseudoElement:null};r.augmentClass(o,i),e.exports=o},function(e,t,n){"use strict";function o(e,t,n,o){return r.call(this,e,t,n,o)}var r=n(27),i={deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:null,deltaMode:null};r.augmentClass(o,i),e.exports=o},function(e,t,n){"use strict";function o(e){for(var t=1,n=0,o=0,i=e.length,a=-4&i;o<a;){for(var s=Math.min(o+4096,a);o<s;o+=4)n+=(t+=e.charCodeAt(o))+(t+=e.charCodeAt(o+1))+(t+=e.charCodeAt(o+2))+(t+=e.charCodeAt(o+3));t%=r,n%=r}for(;o<i;o++)n+=t+=e.charCodeAt(o);return t%=r,n%=r,t|n<<16}var r=65521;e.exports=o},function(e,t,n){"use strict";(function(t){function o(e,o,p,d,f,h){for(var m in e)if(e.hasOwnProperty(m)){var v;try{"function"!=typeof e[m]&&("production"!==t.env.NODE_ENV?u(!1,"%s: %s type `%s` is invalid; it must be a function, usually from React.PropTypes.",d||"React class",a[p],m):i("84",d||"React class",a[p],m)),v=e[m](o,m,d,p,null,s)}catch(e){v=e}if("production"!==t.env.NODE_ENV&&c(!v||v instanceof Error,"%s: type specification of %s `%s` is invalid; the type checker function must return `null` or an `Error` but returned a %s. You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument).",d||"React class",a[p],m,typeof v),v instanceof Error&&!(v.message in l)){l[v.message]=!0;var g="";"production"!==t.env.NODE_ENV&&(r||(r=n(7)),null!==h?g=r.getStackAddendumByID(h):null!==f&&(g=r.getCurrentStackAddendum(f))),"production"!==t.env.NODE_ENV&&c(!1,"Failed %s type: %s%s",p,v.message,g)}}}var r,i=n(3),a=n(136),s=n(66),u=n(1),c=n(2);void 0!==t&&t.env&&"test"===t.env.NODE_ENV&&(r=n(7));var l={};e.exports=o}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e,n,o){if(null==n||"boolean"==typeof n||""===n)return"";if(isNaN(n)||0===n||a.hasOwnProperty(e)&&a[e])return""+n;if("string"==typeof n){if("production"!==t.env.NODE_ENV&&o&&"0"!==n){var r=o._currentElement._owner,u=r?r.getName():null;u&&!s[u]&&(s[u]={});var c=!1;if(u){var l=s[u];c=l[e],c||(l[e]=!0)}c||"production"!==t.env.NODE_ENV&&i(!1,"a `%s` tag (owner: `%s`) was passed a numeric string value for CSS property `%s` (value: `%s`) which will be treated as a unitless number in a future version of React.",o._currentElement.type,u||"unknown",e,n)}n=n.trim()}return n+"px"}var r=n(55),i=n(2),a=r.isUnitlessNumber,s={};e.exports=o}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e){if("production"!==t.env.NODE_ENV){var n=i.current;null!==n&&("production"!==t.env.NODE_ENV&&l(n._warnedAboutRefsInRender,"%s is accessing findDOMNode inside its render(). render() should be a pure function of props and state. It should never access something that requires stale data from the previous render, such as refs. Move this logic to componentDidMount and componentDidUpdate instead.",n.getName()||"A component"),n._warnedAboutRefsInRender=!0)}if(null==e)return null;if(1===e.nodeType)return e;var o=s.get(e);if(o)return o=u(o),o?a.getNodeFromInstance(o):null;"function"==typeof e.render?"production"!==t.env.NODE_ENV?c(!1,"findDOMNode was called on an unmounted component."):r("44"):"production"!==t.env.NODE_ENV?c(!1,"Element appears to be neither ReactComponent nor DOMNode (keys: %s)",Object.keys(e)):r("45",Object.keys(e))}var r=n(3),i=n(11),a=n(5),s=n(23),u=n(70),c=n(1),l=n(2);e.exports=o}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e,o,r,s){if(e&&"object"==typeof e){var c=e,l=void 0===c[r];"production"!==t.env.NODE_ENV&&(i||(i=n(7)),l||"production"!==t.env.NODE_ENV&&u(!1,"flattenChildren(...): Encountered two children with the same key, `%s`. Child keys must be unique; when two children share a key, only the first child will be used.%s",a.unescape(r),i.getStackAddendumByID(s))),l&&null!=o&&(c[r]=o)}}function r(e,n){if(null==e)return e;var r={};return"production"!==t.env.NODE_ENV?s(e,function(e,t,r){return o(e,t,r,n)},r):s(e,o,r),r}var i,a=n(35),s=n(75),u=n(2);void 0!==t&&t.env&&"test"===t.env.NODE_ENV&&(i=n(7)),e.exports=r}).call(t,n(0))},function(e,t,n){"use strict";function o(e){if(e.key){var t=i[e.key]||e.key;if("Unidentified"!==t)return t}if("keypress"===e.type){var n=r(e);return 13===n?"Enter":String.fromCharCode(n)}return"keydown"===e.type||"keyup"===e.type?a[e.keyCode]||"Unidentified":""}var r=n(41),i={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},a={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"};e.exports=o},function(e,t,n){"use strict";function o(e){var t=e&&(r&&e[r]||e[i]);if("function"==typeof t)return t}var r="function"==typeof Symbol&&Symbol.iterator,i="@@iterator";e.exports=o},function(e,t,n){"use strict";function o(){return r++}var r=1;e.exports=o},function(e,t,n){"use strict";function o(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function r(e){for(;e;){if(e.nextSibling)return e.nextSibling;e=e.parentNode}}function i(e,t){for(var n=o(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=o(r(n))}}e.exports=i},function(e,t,n){"use strict";function o(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 r(e){if(s[e])return s[e];if(!a[e])return e;var t=a[e];for(var n in t)if(t.hasOwnProperty(n)&&n in u)return s[e]=t[n];return""}var i=n(6),a={animationend:o("Animation","AnimationEnd"),animationiteration:o("Animation","AnimationIteration"),animationstart:o("Animation","AnimationStart"),transitionend:o("Transition","TransitionEnd")},s={},u={};i.canUseDOM&&(u=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=r},function(e,t,n){"use strict";function o(e){return'"'+r(e)+'"'}var r=n(29);e.exports=o},function(e,t,n){"use strict";var o=n(64);e.exports=o.renderSubtreeIntoContainer},function(e,t,n){"use strict";function o(e){var t={"=":"=0",":":"=2"};return"$"+(""+e).replace(/[=:]/g,function(e){return t[e]})}function r(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:o,unescape:r};e.exports=i},function(e,t,n){"use strict";(function(t){var o=n(16),r=n(1),i=function(e){var t=this;if(t.instancePool.length){var n=t.instancePool.pop();return t.call(n,e),n}return new t(e)},a=function(e,t){var n=this;if(n.instancePool.length){var o=n.instancePool.pop();return n.call(o,e,t),o}return new n(e,t)},s=function(e,t,n){var o=this;if(o.instancePool.length){var r=o.instancePool.pop();return o.call(r,e,t,n),r}return new o(e,t,n)},u=function(e,t,n,o){var r=this;if(r.instancePool.length){var i=r.instancePool.pop();return r.call(i,e,t,n,o),i}return new r(e,t,n,o)},c=function(e){var n=this;e instanceof n||("production"!==t.env.NODE_ENV?r(!1,"Trying to release an instance into a pool of a different type."):o("25")),e.destructor(),n.instancePool.length<n.poolSize&&n.instancePool.push(e)},l=i,p=function(e,t){var n=e;return n.instancePool=[],n.getPooled=t||l,n.poolSize||(n.poolSize=10),n.release=c,n},d={addPoolingTo:p,oneArgumentPooler:i,twoArgumentPooler:a,threeArgumentPooler:s,fourArgumentPooler:u};e.exports=d}).call(t,n(0))},function(e,t,n){"use strict";function o(e){return(""+e).replace(_,"$&/")}function r(e,t){this.func=e,this.context=t,this.count=0}function i(e,t,n){var o=e.func,r=e.context;o.call(r,t,e.count++)}function a(e,t,n){if(null==e)return e;var o=r.getPooled(t,n);g(e,i,o),r.release(o)}function s(e,t,n,o){this.result=e,this.keyPrefix=t,this.func=n,this.context=o,this.count=0}function u(e,t,n){var r=e.result,i=e.keyPrefix,a=e.func,s=e.context,u=a.call(s,t,e.count++);Array.isArray(u)?c(u,r,n,v.thatReturnsArgument):null!=u&&(m.isValidElement(u)&&(u=m.cloneAndReplaceKey(u,i+(!u.key||t&&t.key===u.key?"":o(u.key)+"/")+n)),r.push(u))}function c(e,t,n,r,i){var a="";null!=n&&(a=o(n)+"/");var c=s.getPooled(t,a,r,i);g(e,u,c),s.release(c)}function l(e,t,n){if(null==e)return e;var o=[];return c(e,o,null,t,n),o}function p(e,t,n){return null}function d(e,t){return g(e,p,null)}function f(e){var t=[];return c(e,t,null,v.thatReturnsArgument),t}var h=n(168),m=n(15),v=n(9),g=n(177),y=h.twoArgumentPooler,E=h.fourArgumentPooler,_=/\/+/g;r.prototype.destructor=function(){this.func=null,this.context=null,this.count=0},h.addPoolingTo(r,y),s.prototype.destructor=function(){this.result=null,this.keyPrefix=null,this.func=null,this.context=null,this.count=0},h.addPoolingTo(s,E);var N={forEach:a,map:l,mapIntoWithKeyPrefixInternal:c,count:d,toArray:f};e.exports=N},function(e,t,n){"use strict";(function(t){function o(e){return e}function r(e,n,o){for(var r in n)n.hasOwnProperty(r)&&"production"!==t.env.NODE_ENV&&N("function"==typeof n[r],"%s: %s type `%s` is invalid; it must be a function, usually from React.PropTypes.",e.displayName||"ReactClass",g[o],r)}function i(e,n){var o=D.hasOwnProperty(n)?D[n]:null;w.hasOwnProperty(n)&&"OVERRIDE_BASE"!==o&&("production"!==t.env.NODE_ENV?_(!1,"ReactClassInterface: You are attempting to override `%s` from your class specification. Ensure that your method names do not overlap with React methods.",n):f("73",n)),e&&"DEFINE_MANY"!==o&&"DEFINE_MANY_MERGED"!==o&&("production"!==t.env.NODE_ENV?_(!1,"ReactClassInterface: You are attempting to define `%s` on your component more than once. This conflict may be due to a mixin.",n):f("74",n))}function a(e,n){if(n){"function"==typeof n&&("production"!==t.env.NODE_ENV?_(!1,"ReactClass: You're attempting to use a component class or function as a mixin. Instead, just use a regular object."):f("75")),v.isValidElement(n)&&("production"!==t.env.NODE_ENV?_(!1,"ReactClass: You're attempting to use a component as a mixin. Instead, just use a regular object."):f("76"));var o=e.prototype,r=o.__reactAutoBindPairs;n.hasOwnProperty(b)&&O.mixins(e,n.mixins);for(var a in n)if(n.hasOwnProperty(a)&&a!==b){var s=n[a],u=o.hasOwnProperty(a);if(i(u,a),O.hasOwnProperty(a))O[a](e,s);else{var p=D.hasOwnProperty(a),d="function"==typeof s,h=d&&!p&&!u&&!1!==n.autobind;if(h)r.push(a,s),o[a]=s;else if(u){var m=D[a];(!p||"DEFINE_MANY_MERGED"!==m&&"DEFINE_MANY"!==m)&&("production"!==t.env.NODE_ENV?_(!1,"ReactClass: Unexpected spec policy %s for key %s when mixing in component specs.",m,a):f("77",m,a)),"DEFINE_MANY_MERGED"===m?o[a]=c(o[a],s):"DEFINE_MANY"===m&&(o[a]=l(o[a],s))}else o[a]=s,"production"!==t.env.NODE_ENV&&"function"==typeof s&&n.displayName&&(o[a].displayName=n.displayName+"_"+a)}}}else if("production"!==t.env.NODE_ENV){var g=typeof n,y="object"===g&&null!==n;"production"!==t.env.NODE_ENV&&N(y,"%s: You're attempting to include a mixin that is either null or not an object. Check the mixins included by the component, as well as any mixins they include themselves. Expected object but got %s.",e.displayName||"ReactClass",null===n?null:g)}}function s(e,n){if(n)for(var o in n){var r=n[o];if(n.hasOwnProperty(o)){var i=o in O;i&&("production"!==t.env.NODE_ENV?_(!1,'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.',o):f("78",o));var a=o in e;a&&("production"!==t.env.NODE_ENV?_(!1,"ReactClass: You are attempting to define `%s` on your component more than once. This conflict may be due to a mixin.",o):f("79",o)),e[o]=r}}}function u(e,n){e&&n&&"object"==typeof e&&"object"==typeof n||("production"!==t.env.NODE_ENV?_(!1,"mergeIntoWithNoDuplicateKeys(): Cannot merge non-objects."):f("80"));for(var o in n)n.hasOwnProperty(o)&&(void 0!==e[o]&&("production"!==t.env.NODE_ENV?_(!1,"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.",o):f("81",o)),e[o]=n[o]);return e}function c(e,t){return function(){var n=e.apply(this,arguments),o=t.apply(this,arguments);if(null==n)return o;if(null==o)return n;var r={};return u(r,n),u(r,o),r}}function l(e,t){return function(){e.apply(this,arguments),t.apply(this,arguments)}}function p(e,n){var o=n.bind(e);if("production"!==t.env.NODE_ENV){o.__reactBoundContext=e,o.__reactBoundMethod=n,o.__reactBoundArguments=null;var r=e.constructor.displayName,i=o.bind;o.bind=function(a){for(var s=arguments.length,u=Array(s>1?s-1:0),c=1;c<s;c++)u[c-1]=arguments[c];if(a!==e&&null!==a)"production"!==t.env.NODE_ENV&&N(!1,"bind(): React component methods may only be bound to the component instance. See %s",r);else if(!u.length)return"production"!==t.env.NODE_ENV&&N(!1,"bind(): You are binding a component method to the component. React does this for you automatically in a high-performance way, so you can safely remove this call. See %s",r),o;var l=i.apply(o,arguments);return l.__reactBoundContext=e,l.__reactBoundMethod=n,l.__reactBoundArguments=u,l}}return o}function d(e){for(var t=e.__reactAutoBindPairs,n=0;n<t.length;n+=2){var o=t[n],r=t[n+1];e[o]=p(e,r)}}var f=n(16),h=n(4),m=n(47),v=n(15),g=n(49),y=n(48),E=n(20),_=n(1),N=n(2),b="mixins",C=[],D={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"},O={displayName:function(e,t){e.displayName=t},mixins:function(e,t){if(t)for(var n=0;n<t.length;n++)a(e,t[n])},childContextTypes:function(e,n){"production"!==t.env.NODE_ENV&&r(e,n,"childContext"),e.childContextTypes=h({},e.childContextTypes,n)},contextTypes:function(e,n){"production"!==t.env.NODE_ENV&&r(e,n,"context"),e.contextTypes=h({},e.contextTypes,n)},getDefaultProps:function(e,t){e.getDefaultProps?e.getDefaultProps=c(e.getDefaultProps,t):e.getDefaultProps=t},propTypes:function(e,n){"production"!==t.env.NODE_ENV&&r(e,n,"prop"),e.propTypes=h({},e.propTypes,n)},statics:function(e,t){s(e,t)},autobind:function(){}},w={replaceState:function(e,t){this.updater.enqueueReplaceState(this,e),t&&this.updater.enqueueCallback(this,t,"replaceState")},isMounted:function(){return this.updater.isMounted(this)}},x=function(){};h(x.prototype,m.prototype,w);var T={createClass:function(e){var n=o(function(e,o,r){"production"!==t.env.NODE_ENV&&"production"!==t.env.NODE_ENV&&N(this instanceof n,"Something is calling a React component directly. Use a factory or JSX instead. See: https://fb.me/react-legacyfactory"),this.__reactAutoBindPairs.length&&d(this),this.props=e,this.context=o,this.refs=E,this.updater=r||y,this.state=null;var i=this.getInitialState?this.getInitialState():null;"production"!==t.env.NODE_ENV&&void 0===i&&this.getInitialState._isMockFunction&&(i=null),("object"!=typeof i||Array.isArray(i))&&("production"!==t.env.NODE_ENV?_(!1,"%s.getInitialState(): must return an object or null",n.displayName||"ReactCompositeComponent"):f("82",n.displayName||"ReactCompositeComponent")),this.state=i});n.prototype=new x,n.prototype.constructor=n,n.prototype.__reactAutoBindPairs=[],C.forEach(a.bind(null,n)),a(n,e),n.getDefaultProps&&(n.defaultProps=n.getDefaultProps()),"production"!==t.env.NODE_ENV&&(n.getDefaultProps&&(n.getDefaultProps.isReactClassApproved={}),n.prototype.getInitialState&&(n.prototype.getInitialState.isReactClassApproved={})),n.prototype.render||("production"!==t.env.NODE_ENV?_(!1,"createClass(...): Class specification must implement a `render` method."):f("83")),"production"!==t.env.NODE_ENV&&("production"!==t.env.NODE_ENV&&N(!n.prototype.componentShouldUpdate,"%s has a method called componentShouldUpdate(). Did you mean shouldComponentUpdate()? The name is phrased as a question because the function is expected to return a value.",e.displayName||"A component"),"production"!==t.env.NODE_ENV&&N(!n.prototype.componentWillRecieveProps,"%s has a method called componentWillRecieveProps(). Did you mean componentWillReceiveProps()?",e.displayName||"A component"));for(var r in D)n.prototype[r]||(n.prototype[r]=null);return n},injection:{injectMixin:function(e){C.push(e)}}};e.exports=T}).call(t,n(0))},function(e,t,n){"use strict";(function(t){var o=n(15),r=o.createFactory;if("production"!==t.env.NODE_ENV){r=n(77).createFactory}var i={a:r("a"),abbr:r("abbr"),address:r("address"),area:r("area"),article:r("article"),aside:r("aside"),audio:r("audio"),b:r("b"),base:r("base"),bdi:r("bdi"),bdo:r("bdo"),big:r("big"),blockquote:r("blockquote"),body:r("body"),br:r("br"),button:r("button"),canvas:r("canvas"),caption:r("caption"),cite:r("cite"),code:r("code"),col:r("col"),colgroup:r("colgroup"),data:r("data"),datalist:r("datalist"),dd:r("dd"),del:r("del"),details:r("details"),dfn:r("dfn"),dialog:r("dialog"),div:r("div"),dl:r("dl"),dt:r("dt"),em:r("em"),embed:r("embed"),fieldset:r("fieldset"),figcaption:r("figcaption"),figure:r("figure"),footer:r("footer"),form:r("form"),h1:r("h1"),h2:r("h2"),h3:r("h3"),h4:r("h4"),h5:r("h5"),h6:r("h6"),head:r("head"),header:r("header"),hgroup:r("hgroup"),hr:r("hr"),html:r("html"),i:r("i"),iframe:r("iframe"),img:r("img"),input:r("input"),ins:r("ins"),kbd:r("kbd"),keygen:r("keygen"),label:r("label"),legend:r("legend"),li:r("li"),link:r("link"),main:r("main"),map:r("map"),mark:r("mark"),menu:r("menu"),menuitem:r("menuitem"),meta:r("meta"),meter:r("meter"),nav:r("nav"),noscript:r("noscript"),object:r("object"),ol:r("ol"),optgroup:r("optgroup"),option:r("option"),output:r("output"),p:r("p"),param:r("param"),picture:r("picture"),pre:r("pre"),progress:r("progress"),q:r("q"),rp:r("rp"),rt:r("rt"),ruby:r("ruby"),s:r("s"),samp:r("samp"),script:r("script"),section:r("section"),select:r("select"),small:r("small"),source:r("source"),span:r("span"),strong:r("strong"),style:r("style"),sub:r("sub"),summary:r("summary"),sup:r("sup"),table:r("table"),tbody:r("tbody"),td:r("td"),textarea:r("textarea"),tfoot:r("tfoot"),th:r("th"),thead:r("thead"),time:r("time"),title:r("title"),tr:r("tr"),track:r("track"),u:r("u"),ul:r("ul"),var:r("var"),video:r("video"),wbr:r("wbr"),circle:r("circle"),clipPath:r("clipPath"),defs:r("defs"),ellipse:r("ellipse"),g:r("g"),image:r("image"),line:r("line"),linearGradient:r("linearGradient"),mask:r("mask"),path:r("path"),pattern:r("pattern"),polygon:r("polygon"),polyline:r("polyline"),radialGradient:r("radialGradient"),rect:r("rect"),stop:r("stop"),svg:r("svg"),text:r("text"),tspan:r("tspan")};e.exports=i}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e,t){return e===t?0!==e||1/e==1/t:e!==e&&t!==t}function r(e){this.message=e,this.stack=""}function i(e){function n(n,i,a,s,u,c,l){if(s=s||D,c=c||a,"production"!==t.env.NODE_ENV&&l!==_&&"undefined"!=typeof console){var p=s+":"+a;o[p]||("production"!==t.env.NODE_ENV&&C(!1,"You are manually calling a React.PropTypes validation function for the `%s` prop on `%s`. This is deprecated and will not work in production with the next major version. You may be seeing this warning due to a third-party PropTypes library. See https://fb.me/react-warning-dont-call-proptypes for details.",c,s),o[p]=!0)}if(null==i[a]){var d=E[u];return n?new r(null===i[a]?"The "+d+" `"+c+"` is marked as required in `"+s+"`, but its value is `null`.":"The "+d+" `"+c+"` is marked as required in `"+s+"`, but its value is `undefined`."):null}return e(i,a,s,u,c)}if("production"!==t.env.NODE_ENV)var o={};var i=n.bind(null,!1);return i.isRequired=n.bind(null,!0),i}function a(e){function t(t,n,o,i,a,s){var u=t[n];if(m(u)!==e)return new r("Invalid "+E[i]+" `"+a+"` of type `"+v(u)+"` supplied to `"+o+"`, expected `"+e+"`.");return null}return i(t)}function s(e){function t(t,n,o,i,a){if("function"!=typeof e)return new r("Property `"+a+"` of component `"+o+"` has invalid PropType notation inside arrayOf.");var s=t[n];if(!Array.isArray(s)){return new r("Invalid "+E[i]+" `"+a+"` of type `"+m(s)+"` supplied to `"+o+"`, expected an array.")}for(var u=0;u<s.length;u++){var c=e(s,u,o,i,a+"["+u+"]",_);if(c instanceof Error)return c}return null}return i(t)}function u(e){function t(t,n,o,i,a){if(!(t[n]instanceof e)){var s=E[i],u=e.name||D;return new r("Invalid "+s+" `"+a+"` of type `"+g(t[n])+"` supplied to `"+o+"`, expected instance of `"+u+"`.")}return null}return i(t)}function c(e){function n(t,n,i,a,s){for(var u=t[n],c=0;c<e.length;c++)if(o(u,e[c]))return null;return new r("Invalid "+E[a]+" `"+s+"` of value `"+u+"` supplied to `"+i+"`, expected one of "+JSON.stringify(e)+".")}return Array.isArray(e)?i(n):("production"!==t.env.NODE_ENV&&C(!1,"Invalid argument supplied to oneOf, expected an instance of array."),N.thatReturnsNull)}function l(e){function t(t,n,o,i,a){if("function"!=typeof e)return new r("Property `"+a+"` of component `"+o+"` has invalid PropType notation inside objectOf.");var s=t[n],u=m(s);if("object"!==u){return new r("Invalid "+E[i]+" `"+a+"` of type `"+u+"` supplied to `"+o+"`, expected an object.")}for(var c in s)if(s.hasOwnProperty(c)){var l=e(s,c,o,i,a+"."+c,_);if(l instanceof Error)return l}return null}return i(t)}function p(e){function n(t,n,o,i,a){for(var s=0;s<e.length;s++){if(null==(0,e[s])(t,n,o,i,a,_))return null}return new r("Invalid "+E[i]+" `"+a+"` supplied to `"+o+"`.")}return Array.isArray(e)?i(n):("production"!==t.env.NODE_ENV&&C(!1,"Invalid argument supplied to oneOfType, expected an instance of array."),N.thatReturnsNull)}function d(e){function t(t,n,o,i,a){var s=t[n],u=m(s);if("object"!==u){return new r("Invalid "+E[i]+" `"+a+"` of type `"+u+"` supplied to `"+o+"`, expected `object`.")}for(var c in e){var l=e[c];if(l){var p=l(s,c,o,i,a+"."+c,_);if(p)return p}}return null}return i(t)}function f(e){switch(typeof e){case"number":case"string":case"undefined":return!0;case"boolean":return!e;case"object":if(Array.isArray(e))return e.every(f);if(null===e||y.isValidElement(e))return!0;var t=b(e);if(!t)return!1;var n,o=t.call(e);if(t!==e.entries){for(;!(n=o.next()).done;)if(!f(n.value))return!1}else for(;!(n=o.next()).done;){var r=n.value;if(r&&!f(r[1]))return!1}return!0;default:return!1}}function h(e,t){return"symbol"===e||("Symbol"===t["@@toStringTag"]||"function"==typeof Symbol&&t instanceof Symbol)}function m(e){var t=typeof e;return Array.isArray(e)?"array":e instanceof RegExp?"object":h(t,e)?"symbol":t}function v(e){var t=m(e);if("object"===t){if(e instanceof Date)return"date";if(e instanceof RegExp)return"regexp"}return t}function g(e){return e.constructor&&e.constructor.name?e.constructor.name:D}var y=n(15),E=n(49),_=n(78),N=n(9),b=n(51),C=n(2),D="<<anonymous>>",O={array:a("array"),bool:a("boolean"),func:a("function"),number:a("number"),object:a("object"),string:a("string"),symbol:a("symbol"),any:function(){return i(N.thatReturns(null))}(),arrayOf:s,element:function(){function e(e,t,n,o,i){var a=e[t];if(!y.isValidElement(a)){return new r("Invalid "+E[o]+" `"+i+"` of type `"+m(a)+"` supplied to `"+n+"`, expected a single ReactElement.")}return null}return i(e)}(),instanceOf:u,node:function(){function e(e,t,n,o,i){if(!f(e[t])){return new r("Invalid "+E[o]+" `"+i+"` supplied to `"+n+"`, expected a ReactNode.")}return null}return i(e)}(),objectOf:l,oneOf:c,oneOfType:p,shape:d};r.prototype=Error.prototype,e.exports=O}).call(t,n(0))},function(e,t,n){"use strict";function o(e,t,n){this.props=e,this.context=t,this.refs=u,this.updater=n||s}function r(){}var i=n(4),a=n(47),s=n(48),u=n(20);r.prototype=a.prototype,o.prototype=new r,o.prototype.constructor=o,i(o.prototype,a.prototype),o.prototype.isPureReactComponent=!0,e.exports=o},function(e,t,n){"use strict";e.exports="15.4.2"},function(e,t,n){"use strict";(function(t){function o(e,o,p,d,f,h){for(var m in e)if(e.hasOwnProperty(m)){var v;try{"function"!=typeof e[m]&&("production"!==t.env.NODE_ENV?u(!1,"%s: %s type `%s` is invalid; it must be a function, usually from React.PropTypes.",d||"React class",a[p],m):i("84",d||"React class",a[p],m)),v=e[m](o,m,d,p,null,s)}catch(e){v=e}if("production"!==t.env.NODE_ENV&&c(!v||v instanceof Error,"%s: type specification of %s `%s` is invalid; the type checker function must return `null` or an `Error` but returned a %s. You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument).",d||"React class",a[p],m,typeof v),v instanceof Error&&!(v.message in l)){l[v.message]=!0;var g="";"production"!==t.env.NODE_ENV&&(r||(r=n(7)),null!==h?g=r.getStackAddendumByID(h):null!==f&&(g=r.getCurrentStackAddendum(f))),"production"!==t.env.NODE_ENV&&c(!1,"Failed %s type: %s%s",p,v.message,g)}}}var r,i=n(16),a=n(49),s=n(78),u=n(1),c=n(2);void 0!==t&&t.env&&"test"===t.env.NODE_ENV&&(r=n(7));var l={};e.exports=o}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e){return i.isValidElement(e)||("production"!==t.env.NODE_ENV?a(!1,"React.Children.only expected to receive a single React element child."):r("143")),e}var r=n(16),i=n(15),a=n(1);e.exports=o}).call(t,n(0))},function(e,t,n){"use strict";(function(t){function o(e,t){return e&&"object"==typeof e&&null!=e.key?p.escape(e.key):t.toString(36)}function r(e,n,i,v){var g=typeof e;if("undefined"!==g&&"boolean"!==g||(e=null),null===e||"string"===g||"number"===g||"object"===g&&e.$$typeof===u)return i(v,e,""===n?f+o(e,0):n),1;var y,E,_=0,N=""===n?f:n+h;if(Array.isArray(e))for(var b=0;b<e.length;b++)y=e[b],E=N+o(y,b),_+=r(y,E,i,v);else{var C=c(e);if(C){var D,O=C.call(e);if(C!==e.entries)for(var w=0;!(D=O.next()).done;)y=D.value,E=N+o(y,w++),_+=r(y,E,i,v);else{if("production"!==t.env.NODE_ENV){var x="";if(s.current){var T=s.current.getName();T&&(x=" Check the render method of `"+T+"`.")}"production"!==t.env.NODE_ENV&&d(m,"Using Maps as children is not yet fully supported. It is an experimental feature that might be removed. Convert it to a sequence / iterable of keyed ReactElements instead.%s",x),m=!0}for(;!(D=O.next()).done;){var k=D.value;k&&(y=k[1],E=N+p.escape(k[0])+h+o(y,0),_+=r(y,E,i,v))}}}else if("object"===g){var I="";if("production"!==t.env.NODE_ENV&&(I=" If you meant to render a collection of children, use an array instead or wrap the object using createFragment(object) from the React add-ons.",e._isReactElement&&(I=" It looks like you're using an element created by a different version of React. Make sure to use only one copy of React."),s.current)){var P=s.current.getName();P&&(I+=" Check the render method of `"+P+"`.")}var S=String(e);"production"!==t.env.NODE_ENV?l(!1,"Objects are not valid as a React child (found: %s).%s","[object Object]"===S?"object with keys {"+Object.keys(e).join(", ")+"}":S,I):a("31","[object Object]"===S?"object with keys {"+Object.keys(e).join(", ")+"}":S,I)}}return _}function i(e,t,n){return null==e?0:r(e,"",t,n)}var a=n(16),s=n(11),u=n(76),c=n(51),l=n(1),p=n(167),d=n(2),f=".",h=":",m=!1;e.exports=i}).call(t,n(0))}])});
\ No newline at end of file
diff --git a/web/pgadmin/static/jsx/components.jsx b/web/pgadmin/static/jsx/components.jsx
new file mode 100644
index 00000000..5bcb5208
--- /dev/null
+++ b/web/pgadmin/static/jsx/components.jsx
@@ -0,0 +1,8 @@
+
+import React from 'react';
+import {render} from 'react-dom';
+
+export {
+  render,
+  React,
+};
\ No newline at end of file
diff --git a/web/pgadmin/utils/javascript/__init__.py b/web/pgadmin/utils/javascript/__init__.py
new file mode 100644
index 00000000..cac9a64a
--- /dev/null
+++ b/web/pgadmin/utils/javascript/__init__.py
@@ -0,0 +1,8 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2017, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+###########################################################################
diff --git a/web/pgadmin/utils/javascript/javascript_bundler.py b/web/pgadmin/utils/javascript/javascript_bundler.py
new file mode 100644
index 00000000..4ca2da67
--- /dev/null
+++ b/web/pgadmin/utils/javascript/javascript_bundler.py
@@ -0,0 +1,62 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2017, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import os
+from contextlib import contextmanager
+from subprocess import call
+from pgadmin.utils import u, fs_encoding, file_quote
+
+
+# enum-like for tracking whether we have
+class JsState:
+    NONE = 0
+    OLD = 1
+    NEW = 2
+
+
+class JavascriptBundler:
+    """Builds Javascript bundle files by delegating to webpack"""
+
+    def __init__(self):
+        self.jsState = JsState.NONE
+
+    def bundle(self):
+        try:
+            try_building_js()
+            self.jsState = JsState.NEW
+        except OSError:
+            webdir_path()
+            generatedJavascriptDir = os.path.join(webdir_path(), 'pgadmin', 'static', 'js', 'generated')
+            if os.path.exists(generatedJavascriptDir) and os.listdir(generatedJavascriptDir):
+                self.jsState = JsState.OLD
+            else:
+                self.jsState = JsState.NONE
+
+    def report(self):
+        return self.jsState
+
+
+@contextmanager
+def pushd(new_dir):
+    previous_dir = os.getcwd()
+    os.chdir(new_dir)
+    yield
+    os.chdir(previous_dir)
+
+
+def webdir_path():
+    dirname = os.path.dirname
+    thisPath = os.path.realpath(u(__file__, fs_encoding))
+    return dirname(dirname(dirname(dirname(thisPath))))
+
+
+def try_building_js():
+    with pushd(webdir_path()):
+        if call(['yarn', 'run', 'bundle']) != 0:
+            raise OSError('Error executing bundling the application')
diff --git a/web/pgadmin/utils/javascript/tests/__init__.py b/web/pgadmin/utils/javascript/tests/__init__.py
new file mode 100644
index 00000000..cac9a64a
--- /dev/null
+++ b/web/pgadmin/utils/javascript/tests/__init__.py
@@ -0,0 +1,8 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2017, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+###########################################################################
diff --git a/web/pgadmin/utils/javascript/tests/test_javascript_bundler.py b/web/pgadmin/utils/javascript/tests/test_javascript_bundler.py
new file mode 100644
index 00000000..6701138d
--- /dev/null
+++ b/web/pgadmin/utils/javascript/tests/test_javascript_bundler.py
@@ -0,0 +1,117 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2017, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+
+import sys
+
+from pgadmin.utils.route import BaseTestGenerator
+if sys.version_info < (3, 3):
+    import mock
+else:
+    import unittest.mock as mock
+
+
+class JavascriptBundlerTestCase(BaseTestGenerator):
+    """This tests that the javascript bundler tool causes the application to bundle,
+    and can be invoked before and after app start correctly"""
+
+    scenarios = [('scenario name: JavascriptBundlerTestCase', dict())]
+
+    def setUp(self):
+        self.mockSubprocess = mock.Mock()
+        self.mockOs = mock.Mock()
+        sys.modules['subprocess'] = self.mockSubprocess
+        sys.modules['os'] = self.mockOs
+
+    def runTest(self):
+        from pgadmin.utils.javascript.javascript_bundler import JavascriptBundler
+        from pgadmin.utils.javascript.javascript_bundler import JsState
+        self.JavascriptBundler = JavascriptBundler
+        self.JsState = JsState
+
+        self._bundling_succeeds()
+        self.resetTestState()
+        self._bundling_fails_and_there_is_no_existing_bundle()
+        self.resetTestState()
+        self._bundling_fails_when_bundling_returns_nonzero()
+        self.resetTestState()
+        self._bundling_fails_and_there_is_no_existing_bundle_directory()
+        self.resetTestState()
+        self._bundling_fails_but_there_was_existing_bundle()
+        self.resetTestState()
+
+    def resetTestState(self):
+        self.mockSubprocess.reset_mock()
+        self.mockSubprocess.call.side_effect = None
+        self.mockOs.reset_mock()
+        self.mockOs.listdir.side_effect = None
+        self.mockOs.path.exists.side_effect = None
+
+    def _bundling_succeeds(self):
+        javascriptBundler = self.JavascriptBundler()
+        self.assertEqual(len(self.mockSubprocess.method_calls), 0)
+        self.mockSubprocess.call.return_value = 0
+
+        self.mockOs.listdir.return_value = [u'history.js', u'reactComponents.js']
+
+        javascriptBundler.bundle()
+        self.mockSubprocess.call.assert_called_once_with(['yarn', 'run', 'bundle'])
+
+        reportedState = javascriptBundler.report()
+        expectedState = self.JsState.NEW
+        self.assertEqual(reportedState, expectedState)
+
+    def _bundling_fails_when_bundling_returns_nonzero(self):
+        javascriptBundler = self.JavascriptBundler()
+        self.assertEqual(len(self.mockSubprocess.method_calls), 0)
+        self.mockOs.listdir.return_value = []
+        self.mockSubprocess.call.return_value = 99
+
+        javascriptBundler.bundle()
+
+        reportedState = javascriptBundler.report()
+        expectedState = self.JsState.NONE
+        self.assertEqual(reportedState, expectedState)
+
+    def _bundling_fails_and_there_is_no_existing_bundle(self):
+        javascriptBundler = self.JavascriptBundler()
+        self.mockSubprocess.call.side_effect = OSError("mock exception behavior")
+        self.mockOs.path.exists.return_value = True
+        self.mockOs.listdir.return_value = []
+
+        javascriptBundler.bundle()
+
+        reportedState = javascriptBundler.report()
+        expectedState = self.JsState.NONE
+        self.assertEqual(reportedState, expectedState)
+
+    def _bundling_fails_and_there_is_no_existing_bundle_directory(self):
+        javascriptBundler = self.JavascriptBundler()
+        self.mockSubprocess.call.side_effect = OSError("mock exception behavior")
+        self.mockOs.path.exists.return_value = False
+        self.mockOs.listdir.side_effect = OSError("mock exception behavior")
+
+        javascriptBundler.bundle()
+
+        reportedState = javascriptBundler.report()
+        expectedState = self.JsState.NONE
+        self.assertEqual(reportedState, expectedState)
+
+    def _bundling_fails_but_there_was_existing_bundle(self):
+        javascriptBundler = self.JavascriptBundler()
+        self.mockSubprocess.call.side_effect = OSError("mock exception behavior")
+        self.mockOs.path.exists.return_value = True
+        self.mockOs.listdir.return_value = [u'history.js', u'reactComponents.js']
+
+        javascriptBundler.bundle()
+        self.mockSubprocess.call.assert_called_once_with(['yarn', 'run', 'bundle'])
+
+        reportedState = javascriptBundler.report()
+        expectedState = self.JsState.OLD
+        self.assertEqual(reportedState, expectedState)
diff --git a/web/regression/README b/web/regression/README
index f0d7282e..88edbd80 100644
--- a/web/regression/README
+++ b/web/regression/README
@@ -177,16 +177,17 @@ Javascript Tests:
 
     sudo port install nodejs7 yarn
 
+- See also the top-level pgadmin/README : Bundling Javascript
+
 - Javascript tests must be run from the web directory (since that is where node_modules and karma.conf reside):
 
     cd web/
 
 - Install the JS modules required for testing:
 
-    yarn
+    yarn install
 
 - Now run the tests:
 
-    yarn run karma start --single-run
-
-
+   yarn run test:karma
+   yarn run test:karma-once
diff --git a/web/regression/javascript/browser/menu_spec.js b/web/regression/javascript/browser/menu_spec.js
index 09f136fb..e13bfe5e 100644
--- a/web/regression/javascript/browser/menu_spec.js
+++ b/web/regression/javascript/browser/menu_spec.js
@@ -7,9 +7,11 @@
 //
 //////////////////////////////////////////////////////////////
 
-define(["browser/menu"
-], function () {
-  describe("MenuItem", function () {
+define([
+  'pgadmin',
+  'browser/menu',
+], function (pgAdmin) {
+  describe('MenuItem', function () {
     var MenuItem = pgAdmin.Browser.MenuItem;
     var menuItem;
 
diff --git a/web/regression/javascript/gettext_spec.js b/web/regression/javascript/gettext_spec.js
index 2ce98a23..54fc498d 100644
--- a/web/regression/javascript/gettext_spec.js
+++ b/web/regression/javascript/gettext_spec.js
@@ -7,45 +7,46 @@
 //
 //////////////////////////////////////////////////////////////////////////
 
-define(["sources/gettext", "translations"], function (gettext, translations) {
-  describe("translate", function () {
-    describe("when there is no translation", function () {
-      it("returns the original string", function () {
-        expect(gettext("something to be translated")).toEqual("something to be translated");
-      });
-
-      describe("when there are substitutions", function () {
-        it("interpolates a substitution", function () {
-          expect(gettext("translate text for %(person)s", {"person": "Sarah"})).toEqual("translate text for Sarah")
-        });
-
-        it("interpolates multiple substitutions", function () {
-          expect(gettext("translate '%(text)s' for %(person)s",
-            {
-              "text": "constitution",
-              "person": "Sarah"
-            }
-          )).toEqual("translate 'constitution' for Sarah")
-        });
-      });
+import gettext from 'sources/gettext';
+import translations from 'translations';
 
+describe('translate', function () {
+  describe('when there is no translation', function () {
+    it('returns the original string', function () {
+      expect(gettext('something to be translated')).toEqual('something to be translated');
     });
 
-    describe("when there is a translation", function () {
-      beforeEach(function () {
-        translations['something to be translated'] = 'etwas zum uebersetzen';
-        translations['another translation for %(person)s'] = 'eine weitere Uebersetzung fuer %(person)s';
+    describe('when there are substitutions', function () {
+      it('interpolates a substitution', function () {
+        expect(gettext('translate text for %(person)s', {'person': 'Sarah'})).toEqual('translate text for Sarah');
       });
 
-      it("returns the translation", function () {
-        expect(gettext("something to be translated")).toEqual("etwas zum uebersetzen");
+      it('interpolates multiple substitutions', function () {
+        expect(gettext('translate \'%(text)s\' for %(person)s',
+          {
+            'text': 'constitution',
+            'person': 'Sarah',
+          }
+        )).toEqual('translate \'constitution\' for Sarah');
       });
+    });
+
+  });
+
+  describe('when there is a translation', function () {
+    beforeEach(function () {
+      translations['something to be translated'] = 'etwas zum uebersetzen';
+      translations['another translation for %(person)s'] = 'eine weitere Uebersetzung fuer %(person)s';
+    });
+
+    it('returns the translation', function () {
+      expect(gettext('something to be translated')).toEqual('etwas zum uebersetzen');
+    });
 
-      describe("when there is a substitution", function () {
-        it("interpolates the substitution", function () {
-          expect(gettext("another translation for %(person)s", {"person": "Sarah"}))
-            .toEqual("eine weitere Uebersetzung fuer Sarah");
-        });
+    describe('when there is a substitution', function () {
+      it('interpolates the substitution', function () {
+        expect(gettext('another translation for %(person)s', {'person': 'Sarah'}))
+          .toEqual('eine weitere Uebersetzung fuer Sarah');
       });
     });
   });
diff --git a/web/regression/javascript/jasmine_capture_warnings_beforeall.js b/web/regression/javascript/jasmine_capture_warnings_beforeall.js
new file mode 100644
index 00000000..a83e6f61
--- /dev/null
+++ b/web/regression/javascript/jasmine_capture_warnings_beforeall.js
@@ -0,0 +1,23 @@
+//////////////////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2017, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////////////////
+
+/* eslint-disable no-console */
+
+beforeAll(function () {
+  spyOn(console, 'warn').and.callThrough();
+  spyOn(console, 'error').and.callThrough();
+});
+
+afterEach(function (done) {
+  setTimeout(function () {
+    expect(console.warn).not.toHaveBeenCalled();
+    expect(console.error).not.toHaveBeenCalled();
+    done();
+  }, 0);
+});
\ No newline at end of file
diff --git a/web/regression/javascript/selection/column_selector_spec.js b/web/regression/javascript/selection/column_selector_spec.js
index 7fa69aef..74d137a4 100644
--- a/web/regression/javascript/selection/column_selector_spec.js
+++ b/web/regression/javascript/selection/column_selector_spec.js
@@ -1,419 +1,423 @@
-define(
-  ["jquery",
-    "underscore",
-    "sources/selection/column_selector",
-    "sources/selection/active_cell_capture",
-    "sources/selection/grid_selector",
-    'sources/selection/xcell_selection_model',
-
-    "slickgrid",
-    'sources/slickgrid/pgslick.cellrangedecorator',
-    'sources/slickgrid/pgslick.cellrangeselector',
-    "slickgrid/slick.grid",
-  ],
-  function ($, _, ColumnSelector, ActiveCellCapture, GridSelector, XCellSelectionModel) {
-    var KEY_RIGHT = 39;
-    var KEY_LEFT = 37;
-    var KEY_UP = 38;
-    var KEY_DOWN = 40;
-
-    var Slick = window.Slick;
-    var SlickGrid = Slick.Grid;
-
-    describe("ColumnSelector", function () {
-      var container, data, columns, options;
-      beforeEach(function () {
-        container = $("<div></div>");
-        container.height(9999);
-        container.width(9999);
-
-        data = [{
-          'some-column-name': 'first value',
-          'second column': 'second value',
-          'third column': 'nonselectable value'
-        }, {
-          'some-column-name': 'row 1 - first value',
-          'second column': 'row 1 - second value',
-          'third column': 'row 1 - nonselectable value'
-        }];
-
-        columns = [
-          {
-            id: 'row-header-column',
-            name: 'row header column name',
-            selectable: false,
-            display_name: 'row header column name',
-            column_type: 'text'
-          },
-          {
-            id: '1',
-            name: 'some-column-name',
-            pos: 0,
-            display_name: 'some-column-name',
-            column_type: 'text'
-          },
-          {
-            id: '2',
-            name: 'second column',
-            pos: 1,
-            display_name: 'second column',
-            column_type: 'json'
-          },
-          {
-            id: 'third-column-id',
-            name: 'third column',
-            pos: 2,
-            display_name: 'third column',
-            column_type: 'text'
-          },
-          {
-            name: 'some-non-selectable-column',
-            selectable: false,
-            pos: 3,
-            display_name: 'some-non-selectable-column',
-            column_type: 'numeric'
-          }
-        ];
-      });
-
-      it("displays the name of the column", function () {
-        setupGrid(columns);
-
-        expect($(container.find('.slick-header-columns .slick-column-name')[1]).text())
-          .toContain('some-column-name');
-        expect($(container.find('.slick-header-columns .slick-column-name')[1]).text())
-          .toContain('text');
-        expect($(container.find('.slick-header-columns .slick-column-name')[2]).text())
-          .toContain('second column');
-        expect($(container.find('.slick-header-columns .slick-column-name')[2]).text())
-          .toContain('json');
-      });
-
-      it("preserves the other attributes of column definitions", function () {
-        var columnSelector = new ColumnSelector();
-        var selectableColumns = columnSelector.getColumnDefinitions(columns);
-
-        expect(selectableColumns[1].id).toBe('1');
-      });
-
-      describe("with ActiveCellCapture, CellSelectionModel, and GridSelector: selecting columns", function () {
-        var grid, cellSelectionModel;
-        beforeEach(function () {
-          var columnSelector = new ColumnSelector();
-          columns = columnSelector.getColumnDefinitions(columns);
-          data = [];
-          for (var i = 0; i < 10; i++) {
-            data.push({
-              'some-column-name': 'some-value-' + i,
-              'second column': 'second value ' + i,
-              'third column': 'third value ' + i,
-              'fourth column': 'fourth value ' + i,
-            });
-          }
-          grid = new SlickGrid(container, data, columns);
-
-          grid.registerPlugin(new ActiveCellCapture());
-          cellSelectionModel = new XCellSelectionModel();
-          grid.setSelectionModel(cellSelectionModel);
-
-          grid.registerPlugin(columnSelector);
-          grid.invalidate();
-          $("body").append(container);
-        });
-
-        afterEach(function () {
-          $("body").find(container).remove();
+//////////////////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2017, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////////////////
+
+import $ from 'jquery';
+
+import Slick from 'slickgrid';
+import 'slickgrid.grid';
+
+import ColumnSelector from 'sources/selection/column_selector';
+import ActiveCellCapture from 'sources/selection/active_cell_capture';
+import 'sources/selection/grid_selector';
+import XCellSelectionModel from 'sources/selection/xcell_selection_model';
+import 'sources/slickgrid/pgslick.cellrangedecorator';
+import 'sources/slickgrid/pgslick.cellrangeselector';
+
+describe('ColumnSelector', function () {
+  var container, data, columns, options;
+  var SlickGrid = Slick.Grid;
+  var KEY_RIGHT = 39;
+  var KEY_LEFT = 37;
+  var KEY_UP = 38;
+  var KEY_DOWN = 40;
+
+  beforeEach(function () {
+    container = $('<div></div>');
+    container.height(9999);
+    container.width(9999);
+
+    data = [{
+      'some-column-name': 'first value',
+      'second column': 'second value',
+      'third column': 'nonselectable value'
+    }, {
+      'some-column-name': 'row 1 - first value',
+      'second column': 'row 1 - second value',
+      'third column': 'row 1 - nonselectable value'
+    }];
+
+    columns = [
+      {
+        id: 'row-header-column',
+        name: 'row header column name',
+        selectable: false,
+        display_name: 'row header column name',
+        column_type: 'text'
+      },
+      {
+        id: '1',
+        name: 'some-column-name',
+        pos: 0,
+        display_name: 'some-column-name',
+        column_type: 'text'
+      },
+      {
+        id: '2',
+        name: 'second column',
+        pos: 1,
+        display_name: 'second column',
+        column_type: 'json'
+      },
+      {
+        id: 'third-column-id',
+        name: 'third column',
+        pos: 2,
+        display_name: 'third column',
+        column_type: 'text'
+      },
+      {
+        name: 'some-non-selectable-column',
+        selectable: false,
+        pos: 3,
+        display_name: 'some-non-selectable-column',
+        column_type: 'numeric'
+      }
+    ];
+  });
+
+  it('displays the name of the column', function () {
+    setupGrid(columns);
+
+    expect($(container.find('.slick-header-columns .slick-column-name')[1]).text())
+      .toContain('some-column-name');
+    expect($(container.find('.slick-header-columns .slick-column-name')[1]).text())
+      .toContain('text');
+    expect($(container.find('.slick-header-columns .slick-column-name')[2]).text())
+      .toContain('second column');
+    expect($(container.find('.slick-header-columns .slick-column-name')[2]).text())
+      .toContain('json');
+  });
+
+  it('preserves the other attributes of column definitions', function () {
+    var columnSelector = new ColumnSelector();
+    var selectableColumns = columnSelector.getColumnDefinitions(columns);
+
+    expect(selectableColumns[1].id).toBe('1');
+  });
+
+  describe('with ActiveCellCapture, CellSelectionModel, and GridSelector: selecting columns', function () {
+    var grid, cellSelectionModel;
+    beforeEach(function () {
+      var columnSelector = new ColumnSelector();
+      columns = columnSelector.getColumnDefinitions(columns);
+      data = [];
+      for (var i = 0; i < 10; i++) {
+        data.push({
+          'some-column-name': 'some-value-' + i,
+          'second column': 'second value ' + i,
+          'third column': 'third value ' + i,
+          'fourth column': 'fourth value ' + i,
         });
+      }
+      grid = new SlickGrid(container, data, columns);
 
-        describe("when the user clicks a column header", function () {
-          it("selects the column", function () {
-            container.find('.slick-header-column:contains(some-column-name)').click();
-            var selectedRanges = cellSelectionModel.getSelectedRanges();
-            expectOnlyTheFirstColumnToBeSelected(selectedRanges);
-          });
-
-          it("toggles a selected class to the header cell", function () {
-            container.find('.slick-header-column:contains(second column)').click();
-            expect($(container.find('.slick-header-column:contains(second column)')).hasClass('selected'))
-              .toBe(true);
+      grid.registerPlugin(new ActiveCellCapture());
+      cellSelectionModel = new XCellSelectionModel();
+      grid.setSelectionModel(cellSelectionModel);
 
-            container.find('.slick-header-column:contains(second column)').click();
-            expect($(container.find('.slick-header-column:contains(second column)')).hasClass('selected'))
-              .toBe(false);
-          });
-        });
+      grid.registerPlugin(columnSelector);
+      grid.invalidate();
+      $('body').append(container);
+    });
 
-        describe("when the user clicks an additional column header", function () {
-          beforeEach(function () {
-            container.find('.slick-header-column:contains(some-column-name)').click();
-            container.find('.slick-header-column:contains(second column)').click();
-          });
+    afterEach(function () {
+      $('body').find(container).remove();
+    });
 
-          it("selects additional columns", function () {
+    describe('when the user clicks a column header', function () {
+      it('selects the column', function () {
+        container.find('.slick-header-column:contains(some-column-name)').click();
+        var selectedRanges = cellSelectionModel.getSelectedRanges();
+        expectOnlyTheFirstColumnToBeSelected(selectedRanges);
+      });
 
-            var selectedRanges = cellSelectionModel.getSelectedRanges();
+      it('toggles a selected class to the header cell', function () {
+        container.find('.slick-header-column:contains(second column)').click();
+        expect($(container.find('.slick-header-column:contains(second column)')).hasClass('selected'))
+          .toBe(true);
 
-            expect(selectedRanges.length).toBe(2);
-            var column1 = selectedRanges[0];
-            expect(column1.fromCell).toBe(1);
-            expect(column1.toCell).toBe(1);
+        container.find('.slick-header-column:contains(second column)').click();
+        expect($(container.find('.slick-header-column:contains(second column)')).hasClass('selected'))
+          .toBe(false);
+      });
+    });
 
-            var column2 = selectedRanges[1];
-            expect(column2.fromCell).toBe(2);
-            expect(column2.toCell).toBe(2);
-          });
+    describe('when the user clicks an additional column header', function () {
+      beforeEach(function () {
+        container.find('.slick-header-column:contains(some-column-name)').click();
+        container.find('.slick-header-column:contains(second column)').click();
+      });
 
-          describe("and presses shift + right-arrow", function () {
-            beforeEach(function () {
-              pressShiftArrow(KEY_RIGHT);
-            });
-
-            it("keeps the last column selected", function () {
-              expect(cellSelectionModel.getSelectedRanges().length).toBe(1);
-            });
-
-            it("grows the selection to the right", function () {
-              var selectedRange = cellSelectionModel.getSelectedRanges()[0];
-              expect(selectedRange.fromCell).toBe(2);
-              expect(selectedRange.toCell).toBe(3);
-              expect(selectedRange.fromRow).toBe(0);
-              expect(selectedRange.toRow).toBe(9);
-            });
-
-            it("keeps selected class on columns 2 and 3", function () {
-              expect($(container.find('.slick-header-column:contains(second column)')).hasClass('selected'))
-                .toBe(true);
-              expect($(container.find('.slick-header-column:contains(third column)')).hasClass('selected'))
-                .toBe(true);
-              expect($(container.find('.slick-header-column:contains(some-column-name)')).hasClass('selected'))
-                .toBe(false);
-            });
-          });
+      it('selects additional columns', function () {
 
-          describe("when the user deselects the last selected column header", function () {
-            beforeEach(function () {
-              container.find('.slick-header-column:contains(second column)').click();
-            });
+        var selectedRanges = cellSelectionModel.getSelectedRanges();
 
-            describe("and presses shift + right-arrow", function () {
-              it("first and second columns are selected", function () {
-                pressShiftArrow(KEY_RIGHT);
+        expect(selectedRanges.length).toBe(2);
+        var column1 = selectedRanges[0];
+        expect(column1.fromCell).toBe(1);
+        expect(column1.toCell).toBe(1);
 
-                var selectedRanges = cellSelectionModel.getSelectedRanges();
+        var column2 = selectedRanges[1];
+        expect(column2.fromCell).toBe(2);
+        expect(column2.toCell).toBe(2);
+      });
 
-                expect(selectedRanges.length).toBe(1);
-                expect(selectedRanges[0].fromCell).toBe(1);
-                expect(selectedRanges[0].toCell).toBe(2);
-                expect(selectedRanges[0].fromRow).toBe(0);
-                expect(selectedRanges[0].toRow).toBe(9);
-              });
-            });
-          });
+      describe('and presses shift + right-arrow', function () {
+        beforeEach(function () {
+          pressShiftArrow(KEY_RIGHT);
         });
 
-        describe("when the user clicks a column header description", function () {
-          it("selects the column", function () {
-            container.find('.slick-header-columns span.column-description:contains(some-column-name)').click();
+        it('keeps the last column selected', function () {
+          expect(cellSelectionModel.getSelectedRanges().length).toBe(1);
+        });
 
-            var selectedRanges = cellSelectionModel.getSelectedRanges();
-            expectOnlyTheFirstColumnToBeSelected(selectedRanges);
-          });
+        it('grows the selection to the right', function () {
+          var selectedRange = cellSelectionModel.getSelectedRanges()[0];
+          expect(selectedRange.fromCell).toBe(2);
+          expect(selectedRange.toCell).toBe(3);
+          expect(selectedRange.fromRow).toBe(0);
+          expect(selectedRange.toRow).toBe(9);
+        });
 
-          it("toggles a selected class to the header cell", function () {
-            container.find('.slick-header-column span.column-description:contains(second column)').click();
-            expect($(container.find('.slick-header-column:contains(second column)')).hasClass('selected'))
-              .toBe(true);
+        it('keeps selected class on columns 2 and 3', function () {
+          expect($(container.find('.slick-header-column:contains(second column)')).hasClass('selected'))
+            .toBe(true);
+          expect($(container.find('.slick-header-column:contains(third column)')).hasClass('selected'))
+            .toBe(true);
+          expect($(container.find('.slick-header-column:contains(some-column-name)')).hasClass('selected'))
+            .toBe(false);
+        });
+      });
 
-            container.find('.slick-header-column span.column-description:contains(second column)').click();
-            expect($(container.find('.slick-header-column:contains(second column)')).hasClass('selected'))
-              .toBe(false);
-          });
+      describe('when the user deselects the last selected column header', function () {
+        beforeEach(function () {
+          container.find('.slick-header-column:contains(second column)').click();
         });
 
-        describe("when a row is selected", function () {
-          beforeEach(function () {
-            var selectedRanges = [new Slick.Range(0, 0, 0, 1)];
-            cellSelectionModel.setSelectedRanges(selectedRanges);
-          });
+        describe('and presses shift + right-arrow', function () {
+          it('first and second columns are selected', function () {
+            pressShiftArrow(KEY_RIGHT);
 
-          it("deselects the row", function () {
-            container.find('.slick-header-column')[1].click();
             var selectedRanges = cellSelectionModel.getSelectedRanges();
 
             expect(selectedRanges.length).toBe(1);
-
-            var column = selectedRanges[0];
-
-            expect(column.fromCell).toBe(1);
-            expect(column.toCell).toBe(1);
-            expect(column.fromRow).toBe(0);
-            expect(column.toRow).toBe(9);
+            expect(selectedRanges[0].fromCell).toBe(1);
+            expect(selectedRanges[0].toCell).toBe(2);
+            expect(selectedRanges[0].fromRow).toBe(0);
+            expect(selectedRanges[0].toRow).toBe(9);
           });
         });
+      });
+    });
 
-        describe("clicking a second time", function () {
-          beforeEach(function () {
-            container.find('.slick-header-column')[1].click();
-          });
+    describe('when the user clicks a column header description', function () {
+      it('selects the column', function () {
+        container.find('.slick-header-columns span.column-description:contains(some-column-name)').click();
 
-          it("deselects the column", function () {
-            container.find('.slick-header-column')[1].click();
-            var selectedRanges = cellSelectionModel.getSelectedRanges();
+        var selectedRanges = cellSelectionModel.getSelectedRanges();
+        expectOnlyTheFirstColumnToBeSelected(selectedRanges);
+      });
 
-            expect(selectedRanges.length).toEqual(0);
-          })
-        });
+      it('toggles a selected class to the header cell', function () {
+        container.find('.slick-header-column span.column-description:contains(second column)').click();
+        expect($(container.find('.slick-header-column:contains(second column)')).hasClass('selected'))
+          .toBe(true);
 
-        describe("when the column is not selectable", function () {
-          it("does not select the column", function () {
-            $(container.find('.slick-header-column:contains(some-non-selectable-column)')).click();
-            var selectedRanges = cellSelectionModel.getSelectedRanges();
+        container.find('.slick-header-column span.column-description:contains(second column)').click();
+        expect($(container.find('.slick-header-column:contains(second column)')).hasClass('selected'))
+          .toBe(false);
+      });
+    });
 
-            expect(selectedRanges.length).toEqual(0);
-          });
-        });
+    describe('when a row is selected', function () {
+      beforeEach(function () {
+        var selectedRanges = [new Slick.Range(0, 0, 0, 1)];
+        cellSelectionModel.setSelectedRanges(selectedRanges);
+      });
 
-        describe("when the column is deselected through setSelectedRanges", function () {
-          beforeEach(function () {
-            container.find('.slick-header-column')[1].click();
-          });
+      it('deselects the row', function () {
+        container.find('.slick-header-column')[1].click();
+        var selectedRanges = cellSelectionModel.getSelectedRanges();
 
-          it("removes selected class from header", function () {
-            cellSelectionModel.setSelectedRanges([]);
+        expect(selectedRanges.length).toBe(1);
 
-            expect($(container.find('.slick-header-column')[1]).hasClass('selected'))
-              .toBe(false);
-          });
-        });
+        var column = selectedRanges[0];
 
-        describe("when a non-column range was already selected", function () {
-          beforeEach(function () {
-            var selectedRanges = [new Slick.Range(0, 0, 2, 0)];
-            cellSelectionModel.setSelectedRanges(selectedRanges);
-          });
+        expect(column.fromCell).toBe(1);
+        expect(column.toCell).toBe(1);
+        expect(column.fromRow).toBe(0);
+        expect(column.toRow).toBe(9);
+      });
+    });
 
-          it("deselects the non-column range", function () {
-            container.find('.slick-header-column:contains(some-column-name)').click();
+    describe('clicking a second time', function () {
+      beforeEach(function () {
+        container.find('.slick-header-column')[1].click();
+      });
 
-            var selectedRanges = cellSelectionModel.getSelectedRanges();
-            expectOnlyTheFirstColumnToBeSelected(selectedRanges);
-          });
-        });
+      it('deselects the column', function () {
+        container.find('.slick-header-column')[1].click();
+        var selectedRanges = cellSelectionModel.getSelectedRanges();
 
-        describe('when a column is selected', function () {
-          beforeEach(function () {
-            container.find('.slick-header-column:contains(some-column-name)').click();
-          });
+        expect(selectedRanges.length).toEqual(0);
+      })
+    });
 
-          describe('when the user click a cell on the current range', function () {
-            beforeEach(function () {
-              container.find('.slick-cell.l1.r1')[1].click();
-            });
+    describe('when the column is not selectable', function () {
+      it('does not select the column', function () {
+        $(container.find('.slick-header-column:contains(some-non-selectable-column)')).click();
+        var selectedRanges = cellSelectionModel.getSelectedRanges();
 
-            it('column is deselected', function () {
+        expect(selectedRanges.length).toEqual(0);
+      });
+    });
 
-              var selectedRanges = cellSelectionModel.getSelectedRanges();
+    describe('when the column is deselected through setSelectedRanges', function () {
+      beforeEach(function () {
+        container.find('.slick-header-column')[1].click();
+      });
 
-              expect(selectedRanges.length).toBe(1);
+      it('removes selected class from header', function () {
+        cellSelectionModel.setSelectedRanges([]);
 
-              var column = selectedRanges[0];
+        expect($(container.find('.slick-header-column')[1]).hasClass('selected'))
+          .toBe(false);
+      });
+    });
 
-              expect(column.fromCell).toBe(1);
-              expect(column.toCell).toBe(1);
-              expect(column.fromRow).toBe(1);
-              expect(column.toRow).toBe(1);
-            });
+    describe('when a non-column range was already selected', function () {
+      beforeEach(function () {
+        var selectedRanges = [new Slick.Range(0, 0, 2, 0)];
+        cellSelectionModel.setSelectedRanges(selectedRanges);
+      });
 
-            it('keep select class on column header', function () {
-              expect($(container.find('.slick-header-column:contains(some-column-name)')).hasClass('selected'))
-                .toBeTruthy();
-            });
-          });
+      it('deselects the non-column range', function () {
+        container.find('.slick-header-column:contains(some-column-name)').click();
 
-          describe('when the user click a cell outside the current range', function () {
-            beforeEach(function () {
-              container.find('.slick-cell.l2.r2')[2].click();
-            });
+        var selectedRanges = cellSelectionModel.getSelectedRanges();
+        expectOnlyTheFirstColumnToBeSelected(selectedRanges);
+      });
+    });
 
-            it('column is deselected', function () {
+    describe('when a column is selected', function () {
+      beforeEach(function () {
+        container.find('.slick-header-column:contains(some-column-name)').click();
+      });
 
-              var selectedRanges = cellSelectionModel.getSelectedRanges();
+      describe('when the user click a cell on the current range', function () {
+        beforeEach(function () {
+          container.find('.slick-cell.l1.r1')[1].click();
+        });
 
-              expect(selectedRanges.length).toBe(1);
+        it('column is deselected', function () {
 
-              var column = selectedRanges[0];
+          var selectedRanges = cellSelectionModel.getSelectedRanges();
 
-              expect(column.fromCell).toBe(2);
-              expect(column.toCell).toBe(2);
-              expect(column.fromRow).toBe(2);
-              expect(column.toRow).toBe(2);
-            });
+          expect(selectedRanges.length).toBe(1);
 
-            it('remove select class on "some-column-name" column header', function () {
-              expect($(container.find('.slick-header-column:contains(some-column-name)')).hasClass('selected'))
-                .toBeFalsy();
-              expect($(container.find('.slick-header-column:contains(second column)')).hasClass('selected'))
-                .toBeTruthy();
-            });
-          });
+          var column = selectedRanges[0];
 
-          describe('when the user click in a row header', function () {
-            beforeEach(function () {
-              var selectedRanges = [new Slick.Range(1, 1, 1, 3)];
-              cellSelectionModel.setSelectedRanges(selectedRanges);
-            });
+          expect(column.fromCell).toBe(1);
+          expect(column.toCell).toBe(1);
+          expect(column.fromRow).toBe(1);
+          expect(column.toRow).toBe(1);
+        });
 
-            it('column is deselected', function () {
-              var selectedRanges = cellSelectionModel.getSelectedRanges();
+        it('keep select class on column header', function () {
+          expect($(container.find('.slick-header-column:contains(some-column-name)')).hasClass('selected'))
+            .toBeTruthy();
+        });
+      });
 
-              expect(selectedRanges.length).toBe(1);
+      describe('when the user click a cell outside the current range', function () {
+        beforeEach(function () {
+          container.find('.slick-cell.l2.r2')[2].click();
+        });
 
-              var column = selectedRanges[0];
+        it('column is deselected', function () {
 
-              expect(column.fromCell).toBe(1);
-              expect(column.toCell).toBe(3);
-              expect(column.fromRow).toBe(1);
-              expect(column.toRow).toBe(1);
-            });
+          var selectedRanges = cellSelectionModel.getSelectedRanges();
 
-            it('no column should have the class "selected"', function () {
-              expect($(container.find('.slick-header-column:contains(some-column-name)')).hasClass('selected'))
-                .toBeFalsy();
-            });
-          });
+          expect(selectedRanges.length).toBe(1);
+
+          var column = selectedRanges[0];
+
+          expect(column.fromCell).toBe(2);
+          expect(column.toCell).toBe(2);
+          expect(column.fromRow).toBe(2);
+          expect(column.toRow).toBe(2);
+        });
+
+        it('remove select class on \'some-column-name\' column header', function () {
+          expect($(container.find('.slick-header-column:contains(some-column-name)')).hasClass('selected'))
+            .toBeFalsy();
+          expect($(container.find('.slick-header-column:contains(second column)')).hasClass('selected'))
+            .toBeTruthy();
         });
       });
 
-      function setupGrid(columns) {
-        var columnSelector = new ColumnSelector();
-        columns = columnSelector.getColumnDefinitions(columns);
-        var grid = new SlickGrid(container, data, columns, options);
+      describe('when the user click in a row header', function () {
+        beforeEach(function () {
+          var selectedRanges = [new Slick.Range(1, 1, 1, 3)];
+          cellSelectionModel.setSelectedRanges(selectedRanges);
+        });
 
-        var cellSelectionModel = new XCellSelectionModel();
-        grid.setSelectionModel(cellSelectionModel);
+        it('column is deselected', function () {
+          var selectedRanges = cellSelectionModel.getSelectedRanges();
 
-        grid.registerPlugin(columnSelector);
-        grid.invalidate();
-      }
+          expect(selectedRanges.length).toBe(1);
 
-      function expectOnlyTheFirstColumnToBeSelected(selectedRanges) {
-        var row = selectedRanges[0];
+          var column = selectedRanges[0];
 
-        expect(selectedRanges.length).toEqual(1);
-        expect(row.fromCell).toBe(1);
-        expect(row.toCell).toBe(1);
-        expect(row.fromRow).toBe(0);
-        expect(row.toRow).toBe(9);
-      }
-
-      function pressShiftArrow(keyCode) {
-        var pressEvent = new $.Event("keydown");
-        pressEvent.shiftKey = true;
-        pressEvent.ctrlKey = false;
-        pressEvent.altKey = false;
-        pressEvent.which = keyCode;
+          expect(column.fromCell).toBe(1);
+          expect(column.toCell).toBe(3);
+          expect(column.fromRow).toBe(1);
+          expect(column.toRow).toBe(1);
+        });
 
-        $(container.find('.grid-canvas')).trigger(pressEvent);
-      }
+        it('no column should have the class \'selected\'', function () {
+          expect($(container.find('.slick-header-column:contains(some-column-name)')).hasClass('selected'))
+            .toBeFalsy();
+        });
+      });
     });
-  });
\ No newline at end of file
+  });
+
+  function setupGrid(columns) {
+    var columnSelector = new ColumnSelector();
+    columns = columnSelector.getColumnDefinitions(columns);
+    var grid = new SlickGrid(container, data, columns, options);
+
+    var cellSelectionModel = new XCellSelectionModel();
+    grid.setSelectionModel(cellSelectionModel);
+
+    grid.registerPlugin(columnSelector);
+    grid.invalidate();
+  }
+
+  function expectOnlyTheFirstColumnToBeSelected(selectedRanges) {
+    var row = selectedRanges[0];
+
+    expect(selectedRanges.length).toEqual(1);
+    expect(row.fromCell).toBe(1);
+    expect(row.toCell).toBe(1);
+    expect(row.fromRow).toBe(0);
+    expect(row.toRow).toBe(9);
+  }
+
+  function pressShiftArrow(keyCode) {
+    var pressEvent = new $.Event('keydown');
+    pressEvent.shiftKey = true;
+    pressEvent.ctrlKey = false;
+    pressEvent.altKey = false;
+    pressEvent.which = keyCode;
+
+    $(container.find('.grid-canvas')).trigger(pressEvent);
+  }
+});
diff --git a/web/regression/javascript/selection/copy_data_spec.js b/web/regression/javascript/selection/copy_data_spec.js
index 561576ce..2d6b6ad2 100644
--- a/web/regression/javascript/selection/copy_data_spec.js
+++ b/web/regression/javascript/selection/copy_data_spec.js
@@ -1,139 +1,142 @@
-/////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
 //
 // pgAdmin 4 - PostgreSQL Tools
 //
 // Copyright (C) 2013 - 2017, The pgAdmin Development Team
 // This software is released under the PostgreSQL Licence
 //
-//////////////////////////////////////////////////////////////
-
-define(
-  ["jquery",
-    "slickgrid/slick.grid",
-    "sources/selection/xcell_selection_model",
-    "sources/selection/copy_data",
-    "sources/selection/clipboard",
-    "sources/selection/range_selection_helper"
-  ],
-  function ($, SlickGrid, XCellSelectionModel, copyData, clipboard, RangeSelectionHelper) {
-    describe('copyData', function () {
-      var grid, sqlEditor, gridContainer, buttonPasteRow;
-
-      beforeEach(function () {
-        var data = [[1, "leopord", "12"],
-          [2, "lion", "13"],
-          [3, "puma", "9"]];
-
-        var columns = [
-          {
-            id: 'row-header-column',
-            name: 'row header column name',
-            selectable: false,
-            display_name: 'row header column name',
-            column_type: 'text'
-          },
-          {
-            name: "id",
-            pos: 0,
-            label: "id<br> numeric",
-            cell: "number",
-            can_edit: false,
-            type: "numeric"
-          }, {
-            name: "brand",
-            pos: 1,
-            label: "flavor<br> character varying",
-            cell: "string",
-            can_edit: false,
-            type: "character varying"
-          }, {
-            name: "size",
-            pos: 2,
-            label: "size<br> numeric",
-            cell: "number",
-            can_edit: false,
-            type: "numeric"
-          }
-          ]
-        ;
-        gridContainer = $("<div id='grid'></div>");
-        $("body").append(gridContainer);
-        buttonPasteRow = $("<button id='btn-paste-row' disabled></button>");
-        $("body").append(buttonPasteRow);
-        grid = new Slick.Grid("#grid", data, columns, {});
-        grid.setSelectionModel(new XCellSelectionModel());
-        sqlEditor = {slickgrid: grid};
-      });
+//////////////////////////////////////////////////////////////////////////
+
+import $ from 'jquery';
+
+import Slick from 'slickgrid';
+import 'slickgrid.grid';
+
+import clipboard from '../../../pgadmin/static/js/selection/clipboard';
+import copyData from '../../../pgadmin/static/js/selection/copy_data';
+import RangeSelectionHelper from 'sources/selection/range_selection_helper';
+import XCellSelectionModel from 'sources/selection/xcell_selection_model';
+
+describe('copyData', function () {
+  var grid, sqlEditor, gridContainer, buttonPasteRow;
+  var Slick, SlickGrid;
+
+  beforeEach(function () {
+    Slick = window.Slick;
+    SlickGrid = Slick.Grid;
+    var data = [[1, 'leopord', '12'],
+      [2, 'lion', '13'],
+      [3, 'puma', '9']];
+
+    var columns = [
+        {
+          id: 'row-header-column',
+          name: 'row header column name',
+          selectable: false,
+          display_name: 'row header column name',
+          column_type: 'text'
+        },
+        {
+          name: 'id',
+          pos: 0,
+          label: 'id<br> numeric',
+          cell: 'number',
+          can_edit: false,
+          type: 'numeric'
+        }, {
+          name: 'brand',
+          pos: 1,
+          label: 'flavor<br> character varying',
+          cell: 'string',
+          can_edit: false,
+          type: 'character varying'
+        }, {
+          name: 'size',
+          pos: 2,
+          label: 'size<br> numeric',
+          cell: 'number',
+          can_edit: false,
+          type: 'numeric'
+        }
+      ]
+    ;
+    gridContainer = $('<div id=\'grid\'></div>');
+    $('body').append(gridContainer);
+    buttonPasteRow = $('<button id=\'btn-paste-row\' disabled></button>');
+    $('body').append(buttonPasteRow);
+    grid = new Slick.Grid('#grid', data, columns, {});
+    grid.setSelectionModel(new XCellSelectionModel());
+    sqlEditor = {slickgrid: grid};
+  });
 
-      afterEach(function() {
-        gridContainer.remove();
-        buttonPasteRow.remove();
-      });
+  afterEach(function () {
+    gridContainer.remove();
+    buttonPasteRow.remove();
+  });
 
-      describe("when rows are selected", function () {
-        beforeEach(function () {
-          grid.getSelectionModel().setSelectedRanges([
-            RangeSelectionHelper.rangeForRow(grid, 0),
-            RangeSelectionHelper.rangeForRow(grid, 2)]
-          );
-        });
+  describe('when rows are selected', function () {
+    beforeEach(function () {
+      grid.getSelectionModel().setSelectedRanges([
+        RangeSelectionHelper.rangeForRow(grid, 0),
+        RangeSelectionHelper.rangeForRow(grid, 2)]
+      );
+    });
 
-        it("copies them", function () {
-          spyOn(clipboard, 'copyTextToClipboard');
+    it('copies them', function () {
+      spyOn(clipboard, 'copyTextToClipboard');
 
-          copyData.apply(sqlEditor);
+      copyData.apply(sqlEditor);
 
-          expect(sqlEditor.copied_rows.length).toBe(2);
+      expect(sqlEditor.copied_rows.length).toBe(2);
 
-          expect(clipboard.copyTextToClipboard).toHaveBeenCalled();
-          expect(clipboard.copyTextToClipboard.calls.mostRecent().args[0]).toContain("1,'leopord','12'");
-          expect(clipboard.copyTextToClipboard.calls.mostRecent().args[0]).toContain("3,'puma','9'");
-        });
+      expect(clipboard.copyTextToClipboard).toHaveBeenCalled();
+      expect(clipboard.copyTextToClipboard.calls.mostRecent().args[0]).toContain('1,\'leopord\',\'12\'');
+      expect(clipboard.copyTextToClipboard.calls.mostRecent().args[0]).toContain('3,\'puma\',\'9\'');
+    });
 
-        describe("when the user can edit the grid", function () {
-          it("enables the paste row button", function () {
-            copyData.apply(_.extend({can_edit: true}, sqlEditor));
+    describe('when the user can edit the grid', function () {
+      it('enables the paste row button', function () {
+        copyData.apply(_.extend({can_edit: true}, sqlEditor));
 
-            expect($("#btn-paste-row").prop('disabled')).toBe(false);
-          });
-        });
+        expect($('#btn-paste-row').prop('disabled')).toBe(false);
       });
+    });
+  });
 
-      describe("when a column is selected", function () {
-        beforeEach(function () {
-          var firstDataColumn = RangeSelectionHelper.rangeForColumn(grid, 1);
-          grid.getSelectionModel().setSelectedRanges([firstDataColumn])
-        });
+  describe('when a column is selected', function () {
+    beforeEach(function () {
+      var firstDataColumn = RangeSelectionHelper.rangeForColumn(grid, 1);
+      grid.getSelectionModel().setSelectedRanges([firstDataColumn]);
+    });
 
-        it("copies text to the clipboard", function () {
-          spyOn(clipboard, 'copyTextToClipboard');
+    it('copies text to the clipboard', function () {
+      spyOn(clipboard, 'copyTextToClipboard');
 
-          copyData.apply(sqlEditor);
+      copyData.apply(sqlEditor);
 
-          expect(clipboard.copyTextToClipboard).toHaveBeenCalled();
+      expect(clipboard.copyTextToClipboard).toHaveBeenCalled();
 
-          var copyArg = clipboard.copyTextToClipboard.calls.mostRecent().args[0];
-          var rowStrings = copyArg.split('\n');
-          expect(rowStrings[0]).toBe("1");
-          expect(rowStrings[1]).toBe("2");
-          expect(rowStrings[2]).toBe("3");
-        });
+      var copyArg = clipboard.copyTextToClipboard.calls.mostRecent().args[0];
+      var rowStrings = copyArg.split('\n');
+      expect(rowStrings[0]).toBe('1');
+      expect(rowStrings[1]).toBe('2');
+      expect(rowStrings[2]).toBe('3');
+    });
 
-        it("sets copied_rows to empty", function () {
-          copyData.apply(sqlEditor);
+    it('sets copied_rows to empty', function () {
+      copyData.apply(sqlEditor);
 
-          expect(sqlEditor.copied_rows.length).toBe(0);
-        });
+      expect(sqlEditor.copied_rows.length).toBe(0);
+    });
 
-        describe("when the user can edit the grid", function () {
-          beforeEach(function () {
-            copyData.apply(_.extend({can_edit: true}, sqlEditor));
-          });
+    describe('when the user can edit the grid', function () {
+      beforeEach(function () {
+        copyData.apply(_.extend({can_edit: true}, sqlEditor));
+      });
 
-          it("disables the paste row button", function () {
-            expect($("#btn-paste-row").prop('disabled')).toBe(true);
-          });
-        });
+      it('disables the paste row button', function () {
+        expect($('#btn-paste-row').prop('disabled')).toBe(true);
       });
     });
   });
+});
diff --git a/web/regression/javascript/selection/grid_selector_spec.js b/web/regression/javascript/selection/grid_selector_spec.js
index d79d417f..f7b39ee8 100644
--- a/web/regression/javascript/selection/grid_selector_spec.js
+++ b/web/regression/javascript/selection/grid_selector_spec.js
@@ -1,117 +1,130 @@
-define(["jquery",
-    "underscore",
-    "slickgrid/slick.grid",
-    "sources/selection/xcell_selection_model",
-    "sources/selection/grid_selector"
-  ],
-  function ($, _, SlickGrid, XCellSelectionModel, GridSelector) {
-    describe("GridSelector", function () {
-      var container, data, columns, gridSelector, xCellSelectionModel;
-
-      beforeEach(function () {
-        container = $("<div></div>");
-        container.height(9999);
-        columns = [{
-          id: '1',
-          name: 'some-column-name',
-          pos: 0
-        }, {
-          id: '2',
-          name: 'second column',
-          pos: 1
-        }];
-
-        gridSelector = new GridSelector();
-        columns = gridSelector.getColumnDefinitions(columns);
-
-        data = [];
-        for (var i = 0; i < 10; i++) {
-          data.push({'some-column-name': 'some-value-' + i, 'second column': 'second value ' + i});
-        }
-        var grid = new SlickGrid(container, data, columns);
-
-        xCellSelectionModel = new XCellSelectionModel();
-        grid.setSelectionModel(xCellSelectionModel);
-
-        grid.registerPlugin(gridSelector);
-        grid.invalidate();
-
-        $("body").append(container);
-      });
-
-      afterEach(function () {
-        $("body").find(container).remove();
-      });
+//////////////////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2017, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////////////////
+
+import $ from 'jquery';
+import _ from 'underscore';
+
+import Slick from 'slickgrid';
+import 'slickgrid.grid';
+
+import GridSelector from 'sources/selection/grid_selector';
+import XCellSelectionModel from 'sources/selection/xcell_selection_model';
+
+describe('GridSelector', function () {
+  var container, data, columns, gridSelector, xCellSelectionModel;
+  var Slick, SlickGrid;
+
+  beforeEach(function () {
+    Slick = window.Slick;
+    SlickGrid = Slick.Grid;
+    container = $('<div></div>');
+    container.height(9999);
+    columns = [{
+      id: '1',
+      name: 'some-column-name',
+      pos: 0
+    }, {
+      id: '2',
+      name: 'second column',
+      pos: 1
+    }];
+
+    gridSelector = new GridSelector();
+    columns = gridSelector.getColumnDefinitions(columns);
+
+    data = [];
+    for (var i = 0; i < 10; i++) {
+      data.push({'some-column-name': 'some-value-' + i, 'second column': 'second value ' + i});
+    }
+    var grid = new Slick.Grid(container, data, columns);
+
+    xCellSelectionModel = new XCellSelectionModel();
+    grid.setSelectionModel(xCellSelectionModel);
+
+    grid.registerPlugin(gridSelector);
+    grid.invalidate();
+
+    $('body').append(container);
+  });
 
-      it("renders an additional column on the left for selecting rows", function () {
-        expect(columns.length).toBe(3);
+  afterEach(function () {
+    $('body').find(container).remove();
+  });
 
-        var leftmostColumn = columns[0];
-        expect(leftmostColumn.id).toBe('row-header-column');
-      });
+  it('renders an additional column on the left for selecting rows', function () {
+    expect(columns.length).toBe(3);
 
-      it("renders a button for selecting all the cells", function () {
-        expect(container.find("[title='Select/Deselect All']").length).toBe(1);
-      });
+    var leftmostColumn = columns[0];
+    expect(leftmostColumn.id).toBe('row-header-column');
+  });
 
-      describe("when the cell for the select/deselect all is clicked", function () {
-        it("selects the whole grid", function () {
-          container.find("[title='Select/Deselect All']").parent().click();
+  it('renders a button for selecting all the cells', function () {
+    expect(container.find('[title=\'Select/Deselect All\']').length).toBe(1);
+  });
 
-          var selectedRanges = xCellSelectionModel.getSelectedRanges();
-          expect(selectedRanges.length).toBe(1);
-          var selectedRange = selectedRanges[0];
-          expect(selectedRange.fromCell).toBe(1);
-          expect(selectedRange.toCell).toBe(2);
-          expect(selectedRange.fromRow).toBe(0);
-          expect(selectedRange.toRow).toBe(9);
-        });
+  describe('when the cell for the select/deselect all is clicked', function () {
+    it('selects the whole grid', function () {
+      container.find('[title=\'Select/Deselect All\']').parent().click();
+
+      var selectedRanges = xCellSelectionModel.getSelectedRanges();
+      expect(selectedRanges.length).toBe(1);
+      var selectedRange = selectedRanges[0];
+      expect(selectedRange.fromCell).toBe(1);
+      expect(selectedRange.toCell).toBe(2);
+      expect(selectedRange.fromRow).toBe(0);
+      expect(selectedRange.toRow).toBe(9);
+    });
 
-        it("adds selected class", function () {
-          container.find("[title='Select/Deselect All']").parent().click();
+    it('adds selected class', function () {
+      container.find('[title=\'Select/Deselect All\']').parent().click();
 
-          expect($(container.find("[data-id='select-all']")).hasClass('selected')).toBeTruthy();
-        });
-      });
+      expect($(container.find('[data-id=\'select-all\']')).hasClass('selected')).toBeTruthy();
+    });
+  });
 
-      describe("when the select all button in the corner gets selected", function () {
+  describe('when the select all button in the corner gets selected', function () {
 
-        it("selects all the cells", function () {
-          container.find("[title='Select/Deselect All']").click();
+    it('selects all the cells', function () {
+      container.find('[title=\'Select/Deselect All\']').click();
 
-          var selectedRanges = xCellSelectionModel.getSelectedRanges();
-          expect(selectedRanges.length).toBe(1);
-          var selectedRange = selectedRanges[0];
-          expect(selectedRange.fromCell).toBe(1);
-          expect(selectedRange.toCell).toBe(2);
-          expect(selectedRange.fromRow).toBe(0);
-          expect(selectedRange.toRow).toBe(9);
-        });
+      var selectedRanges = xCellSelectionModel.getSelectedRanges();
+      expect(selectedRanges.length).toBe(1);
+      var selectedRange = selectedRanges[0];
+      expect(selectedRange.fromCell).toBe(1);
+      expect(selectedRange.toCell).toBe(2);
+      expect(selectedRange.fromRow).toBe(0);
+      expect(selectedRange.toRow).toBe(9);
+    });
 
-        describe("when the select all button in the corner gets deselected", function () {
-          beforeEach(function () {
-            container.find("[title='Select/Deselect All']").click();
-          });
+    describe('when the select all button in the corner gets deselected', function () {
+      beforeEach(function () {
+        container.find('[title=\'Select/Deselect All\']').click();
+      });
 
-          it("deselects all the cells", function () {
-            container.find("[title='Select/Deselect All']").click();
+      it('deselects all the cells', function () {
+        container.find('[title=\'Select/Deselect All\']').click();
 
-            var selectedRanges = xCellSelectionModel.getSelectedRanges();
-            expect(selectedRanges.length).toBe(0);
-          });
-        });
+        var selectedRanges = xCellSelectionModel.getSelectedRanges();
+        expect(selectedRanges.length).toBe(0);
+      });
+    });
 
-        describe("and then the underlying selection changes", function () {
-          beforeEach(function () {
-            container.find("[title='Select/Deselect All']").click();
-          });
+    describe('and then the underlying selection changes', function () {
+      beforeEach(function () {
+        container.find('[title=\'Select/Deselect All\']').click();
+      });
 
-          it("removes the selected class", function () {
-            container.find("[title='Select/Deselect All']").parent().click();
+      it('removes the selected class', function () {
+        container.find('[title=\'Select/Deselect All\']').parent().click();
 
-            expect($(container.find("[data-id='select-all']")).hasClass('selected')).toBeFalsy();
-          });
-        });
+        expect($(container.find('[data-id=\'select-all\']')).hasClass('selected')).toBeFalsy();
       });
     });
   });
+});
diff --git a/web/regression/javascript/selection/range_boundary_navigator_spec.js b/web/regression/javascript/selection/range_boundary_navigator_spec.js
index b1ca45eb..b57087f3 100644
--- a/web/regression/javascript/selection/range_boundary_navigator_spec.js
+++ b/web/regression/javascript/selection/range_boundary_navigator_spec.js
@@ -1,8 +1,20 @@
-define(['sources/selection/range_boundary_navigator'], function (rangeBoundaryNavigator) {
-
-  describe("#getUnion", function () {
-    describe("when the ranges completely overlap", function () {
-      it("returns a list with that range", function () {
+//////////////////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2017, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////////////////
+
+import rangeBoundaryNavigator from 'sources/selection/range_boundary_navigator';
+import Slick from 'slickgrid';
+
+describe('RangeBoundaryNavigator', function () {
+
+  describe('#getUnion', function () {
+    describe('when the ranges completely overlap', function () {
+      it('returns a list with that range', function () {
         var ranges = [[1, 4], [1, 4], [1, 4]];
 
         var union = rangeBoundaryNavigator.getUnion(ranges);
diff --git a/web/regression/javascript/selection/range_selection_helper_spec.js b/web/regression/javascript/selection/range_selection_helper_spec.js
index cc81189b..63c07259 100644
--- a/web/regression/javascript/selection/range_selection_helper_spec.js
+++ b/web/regression/javascript/selection/range_selection_helper_spec.js
@@ -1,70 +1,82 @@
-define([
-  'jquery',
-  'slickgrid/slick.grid',
-  'sources/selection/range_selection_helper'
-], function ($, SlickGrid, RangeSelectionHelper) {
-  describe("RangeSelectionHelper utility functions", function () {
-    var grid;
-    beforeEach(function () {
-      var container, data, columns, options;
-      container = $("<div></div>");
-      container.height(9999);
+import $ from 'jquery';
+import Slick from 'slickgrid';
+import 'slickgrid.grid';
+import RangeSelectionHelper from 'sources/selection/range_selection_helper';
 
-      columns = [{
-        id: '1',
-        name: 'some-column-name',
-        pos: 0
-      }, {
-        id: 'second-column-id',
-        name: 'second column',
-        pos: 1
-      }];
+describe("RangeSelectionHelper utility functions", function () {
+  var grid;
+  beforeEach(function () {
+    var container, data, columns, options;
+    container = $("<div></div>");
+    container.height(9999);
 
-      data = [];
-      for (var i = 0; i < 10; i++) {
-        data.push({'some-column-name': 'some-value-' + i, 'second column': 'second value ' + i});
-      }
+    columns = [{
+      id: '1',
+      name: 'some-column-name',
+      pos: 0
+    }, {
+      id: 'second-column-id',
+      name: 'second column',
+      pos: 1
+    }];
 
-      grid = new SlickGrid(container, data, columns, options);
-      grid.invalidate();
-    });
+    data = [];
+    for (var i = 0; i < 10; i++) {
+      data.push({'some-column-name': 'some-value-' + i, 'second column': 'second value ' + i});
+    }
+
+    grid = new Slick.Grid(container, data, columns, options);
+    grid.invalidate();
+  });
 
-    describe("#getIndexesOfCompleteRows", function () {
-      describe("when selected ranges are not rows", function () {
-        it("returns an empty array", function () {
-          var rowlessRanges = [RangeSelectionHelper.rangeForColumn(grid, 1)];
+  describe("#getIndexesOfCompleteRows", function () {
+    describe("when selected ranges are not rows", function () {
+      it("returns an empty array", function () {
+        var rowlessRanges = [RangeSelectionHelper.rangeForColumn(grid, 1)];
 
-          expect(RangeSelectionHelper.getIndexesOfCompleteRows(grid, rowlessRanges))
-            .toEqual([]);
+        expect(RangeSelectionHelper.getIndexesOfCompleteRows(grid, rowlessRanges))
+          .toEqual([]);
+      });
+    });
+    describe("when selected range", function () {
+      describe("is a single row", function () {
+        it("returns an array with one index", function () {
+          var singleRowRange = [RangeSelectionHelper.rangeForRow(grid, 1)];
+
+          expect(RangeSelectionHelper.getIndexesOfCompleteRows(grid, singleRowRange))
+            .toEqual([1]);
         });
       });
-      describe("when selected range", function () {
-        describe("is a single row", function () {
-          it("returns an array with one index", function () {
-            var singleRowRange = [RangeSelectionHelper.rangeForRow(grid, 1)];
 
-            expect(RangeSelectionHelper.getIndexesOfCompleteRows(grid, singleRowRange))
-              .toEqual([1]);
-          });
+      describe("is multiple rows", function () {
+        it("returns an array of each row's index", function () {
+          var multipleRowRange = [
+            RangeSelectionHelper.rangeForRow(grid, 0),
+            RangeSelectionHelper.rangeForRow(grid, 3),
+            RangeSelectionHelper.rangeForRow(grid, 2),
+          ];
+
+          var indexesOfCompleteRows = RangeSelectionHelper.getIndexesOfCompleteRows(grid, multipleRowRange);
+          indexesOfCompleteRows.sort();
+          expect(indexesOfCompleteRows).toEqual([0, 2, 3]);
         });
+      });
 
-        describe("is multiple rows", function () {
-          it("returns an array of each row's index", function () {
-            var multipleRowRange = [
-              RangeSelectionHelper.rangeForRow(grid, 0),
-              RangeSelectionHelper.rangeForRow(grid, 3),
-              RangeSelectionHelper.rangeForRow(grid, 2),
-            ];
+      describe("contains a multi row selection", function () {
+        it("returns an array of each individual row's index", function () {
+          var multipleRowRange = [
+            new Slick.Range(3, 0, 5, 1)
+          ];
 
-            var indexesOfCompleteRows = RangeSelectionHelper.getIndexesOfCompleteRows(grid, multipleRowRange);
-            indexesOfCompleteRows.sort();
-            expect(indexesOfCompleteRows).toEqual([0, 2, 3]);
-          });
+          var indexesOfCompleteRows = RangeSelectionHelper.getIndexesOfCompleteRows(grid, multipleRowRange);
+          indexesOfCompleteRows.sort();
+          expect(indexesOfCompleteRows).toEqual([3, 4, 5]);
         });
 
-        describe("contains a multi row selection", function () {
-          it("returns an array of each individual row's index", function () {
+        describe("and also contains a selection that is not a row", function () {
+          it("returns an array of only the complete rows' indexes", function () {
             var multipleRowRange = [
+              new Slick.Range(8, 1, 9, 1),
               new Slick.Range(3, 0, 5, 1)
             ];
 
@@ -72,22 +84,8 @@ define([
             indexesOfCompleteRows.sort();
             expect(indexesOfCompleteRows).toEqual([3, 4, 5]);
           });
-
-          describe("and also contains a selection that is not a row", function () {
-            it("returns an array of only the complete rows' indexes", function () {
-              var multipleRowRange = [
-                new Slick.Range(8, 1, 9, 1),
-                new Slick.Range(3, 0, 5, 1)
-              ];
-
-              var indexesOfCompleteRows = RangeSelectionHelper.getIndexesOfCompleteRows(grid, multipleRowRange);
-              indexesOfCompleteRows.sort();
-              expect(indexesOfCompleteRows).toEqual([3, 4, 5]);
-            });
-          });
         });
       });
     });
   });
-
 });
diff --git a/web/regression/javascript/selection/row_selector_spec.js b/web/regression/javascript/selection/row_selector_spec.js
index 23a5b12e..dbf65e26 100644
--- a/web/regression/javascript/selection/row_selector_spec.js
+++ b/web/regression/javascript/selection/row_selector_spec.js
@@ -1,321 +1,327 @@
-define(
-  ["jquery",
-    "underscore",
-    "slickgrid/slick.grid",
-    "sources/selection/active_cell_capture",
-    "sources/selection/row_selector",
-    'sources/selection/xcell_selection_model',
-
-    "slickgrid",
-    'sources/slickgrid/pgslick.cellrangedecorator',
-    'sources/slickgrid/pgslick.cellrangeselector',
-  ],
-  function ($, _, SlickGrid, ActiveCellCapture, RowSelector, XCellSelectionModel, Slick) {
-    var KEY_RIGHT = 39;
-    var KEY_LEFT = 37;
-    var KEY_UP = 38;
-    var KEY_DOWN = 40;
-    describe("RowSelector", function () {
-      var container, data, columnDefinitions, grid, cellSelectionModel;
+//////////////////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2017, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////////////////
+
+import $ from 'jquery';
+import _ from 'underscore';
+
+import Slick from 'slickgrid';
+import 'slickgrid.grid';
+
+import RowSelector from 'sources/selection/row_selector';
+import ActiveCellCapture from 'sources/selection/active_cell_capture';
+import XCellSelectionModel from 'sources/selection/xcell_selection_model';
+
+describe('RowSelector', function () {
+  var KEY_RIGHT = 39;
+  var KEY_LEFT = 37;
+  var KEY_UP = 38;
+  var KEY_DOWN = 40;
+  var container, data, columnDefinitions, grid, cellSelectionModel;
+  var SlickGrid = Slick.Grid;
+
+  beforeEach(function () {
+    container = $('<div></div>');
+    container.height(9999);
+    container.width(9999);
+
+    columnDefinitions = [{
+      id: '1',
+      name: 'some-column-name',
+      selectable: true,
+      pos: 0
+    }, {
+      id: '2',
+      name: 'second column',
+      selectable: true,
+      pos: 1
+    }];
+
+    var rowSelector = new RowSelector();
+    data = [];
+    for (var i = 0; i < 10; i++) {
+      data.push(['some-value-' + i, 'second value ' + i]);
+    }
+    columnDefinitions = rowSelector.getColumnDefinitions(columnDefinitions);
+    grid = new SlickGrid(container, data, columnDefinitions);
 
-      beforeEach(function () {
-        container = $("<div></div>");
-        container.height(9999);
-        container.width(9999);
-
-        columnDefinitions = [{
-          id: '1',
-          name: 'some-column-name',
-          selectable: true,
-          pos: 0
-        }, {
-          id: '2',
-          name: 'second column',
-          selectable: true,
-          pos: 1
-        }];
-
-        var rowSelector = new RowSelector();
-        data = [];
-        for (var i = 0; i < 10; i++) {
-          data.push(['some-value-' + i, 'second value ' + i]);
-        }
-        columnDefinitions = rowSelector.getColumnDefinitions(columnDefinitions);
-        grid = new SlickGrid(container, data, columnDefinitions);
-
-        grid.registerPlugin(new ActiveCellCapture());
-        cellSelectionModel = new XCellSelectionModel();
-        grid.setSelectionModel(cellSelectionModel);
-
-        grid.registerPlugin(rowSelector);
-        grid.invalidate();
-
-        $("body").append(container);
+    grid.registerPlugin(new ActiveCellCapture());
+    cellSelectionModel = new XCellSelectionModel();
+    grid.setSelectionModel(cellSelectionModel);
+
+    grid.registerPlugin(rowSelector);
+    grid.invalidate();
+
+    $('body').append(container);
+  });
+
+  afterEach(function () {
+    $('body').find(container).remove();
+  });
+
+  it('renders an additional column on the left', function () {
+    expect(columnDefinitions.length).toBe(3);
+
+    var leftmostColumn = columnDefinitions[0];
+    expect(leftmostColumn.id).toBe('row-header-column');
+    expect(leftmostColumn.name).toBe('');
+    expect(leftmostColumn.selectable).toBe(false);
+  });
+
+  it('renders a span on the leftmost column', function () {
+    expect(container.find('.slick-row').length).toBe(10);
+    expect(container.find('.slick-row .slick-cell:first-child span[data-cell-type="row-header-selector"]').length).toBe(10);
+  });
+
+  it('preserves the other attributes of column definitions', function () {
+    expect(columnDefinitions[1].id).toBe('1');
+    expect(columnDefinitions[1].selectable).toBe(true);
+  });
+
+  describe('selecting rows', function () {
+    describe('when the user clicks a row header span', function () {
+      it('selects the row', function () {
+        container.find('.slick-row .slick-cell:first-child span[data-cell-type="row-header-selector"]')[0].click();
+
+        var selectedRanges = cellSelectionModel.getSelectedRanges();
+        expectOnlyTheFirstRowToBeSelected(selectedRanges);
       });
 
-      afterEach(function () {
-        $("body").find(container).remove();
+      it('add selected class to parent of the span', function () {
+        container.find('.slick-row .slick-cell:first-child span[data-cell-type="row-header-selector"]')[5].click();
+
+        expect($(container.find('.slick-row .slick-cell:first-child ')[5])
+          .hasClass('selected')).toBeTruthy();
       });
+    });
 
-      it("renders an additional column on the left", function () {
-        expect(columnDefinitions.length).toBe(3);
+    describe('when the user clicks a row header', function () {
+      beforeEach(function () {
+        container.find('.slick-row .slick-cell:first-child')[1].click();
 
-        var leftmostColumn = columnDefinitions[0];
-        expect(leftmostColumn.id).toBe('row-header-column');
-        expect(leftmostColumn.name).toBe('');
-        expect(leftmostColumn.selectable).toBe(false);
       });
+      it('selects the row', function () {
 
-      it("renders a span on the leftmost column", function () {
-        expect(container.find('.slick-row').length).toBe(10);
-        expect(container.find('.slick-row .slick-cell:first-child span[data-cell-type="row-header-selector"]').length).toBe(10);
+        var selectedRanges = cellSelectionModel.getSelectedRanges();
+        var row = selectedRanges[0];
+
+        expect(selectedRanges.length).toEqual(1);
+        expect(row.fromCell).toBe(1);
+        expect(row.toCell).toBe(2);
+        expect(row.fromRow).toBe(1);
+        expect(row.toRow).toBe(1);
       });
 
-      it("preserves the other attributes of column definitions", function () {
-        expect(columnDefinitions[1].id).toBe('1');
-        expect(columnDefinitions[1].selectable).toBe(true);
+      it('add selected class to parent of the span', function () {
+
+        expect($(container.find('.slick-row .slick-cell:first-child ')[1])
+          .hasClass('selected')).toBeTruthy();
       });
 
-      describe("selecting rows", function () {
-        describe("when the user clicks a row header span", function () {
-          it("selects the row", function () {
-            container.find('.slick-row .slick-cell:first-child span[data-cell-type="row-header-selector"]')[0].click();
+      describe('when the user clicks again the same row header', function () {
+        it('add selected class to parent of the span', function () {
+          container.find('.slick-row .slick-cell:first-child span[data-cell-type="row-header-selector"]')[1].click();
 
-            var selectedRanges = cellSelectionModel.getSelectedRanges();
-            expectOnlyTheFirstRowToBeSelected(selectedRanges);
-          });
+          expect($(container.find('.slick-row .slick-cell:first-child ')[1])
+            .hasClass('selected')).toBeFalsy();
+        });
+      });
 
-          it("add selected class to parent of the span", function () {
-            container.find('.slick-row .slick-cell:first-child span[data-cell-type="row-header-selector"]')[5].click();
+      describe('and presses shift + down-arrow', function () {
+        beforeEach(function () {
+          pressShiftArrow(KEY_DOWN);
+        });
 
-            expect($(container.find('.slick-row .slick-cell:first-child ')[5])
-              .hasClass('selected')).toBeTruthy();
-          });
+        it('keeps the last row selected', function () {
+          expect(cellSelectionModel.getSelectedRanges().length).toBe(1);
         });
 
-        describe("when the user clicks a row header", function () {
-          beforeEach(function () {
-            container.find('.slick-row .slick-cell:first-child')[1].click();
+        it('grows the selection down', function () {
+          var selectedRanges = cellSelectionModel.getSelectedRanges();
 
-          });
-          it("selects the row", function () {
+          var row = selectedRanges[0];
 
-            var selectedRanges = cellSelectionModel.getSelectedRanges();
-            var row = selectedRanges[0];
+          expect(selectedRanges.length).toEqual(1);
+          expect(row.fromCell).toBe(1);
+          expect(row.toCell).toBe(2);
+          expect(row.fromRow).toBe(1);
+          expect(row.toRow).toBe(2);
+        });
 
-            expect(selectedRanges.length).toEqual(1);
-            expect(row.fromCell).toBe(1);
-            expect(row.toCell).toBe(2);
-            expect(row.fromRow).toBe(1);
-            expect(row.toRow).toBe(1);
-          });
+        it('keeps selected class on rows 1 and 2', function () {
+          expect($(container.find('.slick-row .slick-cell:first-child ')[0])
+            .hasClass('selected')).toBeFalsy();
+          expect($(container.find('.slick-row .slick-cell:first-child ')[1])
+            .hasClass('selected')).toBeTruthy();
+          expect($(container.find('.slick-row .slick-cell:first-child ')[2])
+            .hasClass('selected')).toBeTruthy();
+          expect($(container.find('.slick-row .slick-cell:first-child ')[3])
+            .hasClass('selected')).toBeFalsy();
+        });
+      });
 
-          it("add selected class to parent of the span", function () {
-
-            expect($(container.find('.slick-row .slick-cell:first-child ')[1])
-              .hasClass('selected')).toBeTruthy();
-          });
-
-          describe("when the user clicks again the same row header", function () {
-            it("add selected class to parent of the span", function () {
-              container.find('.slick-row .slick-cell:first-child span[data-cell-type="row-header-selector"]')[1].click();
-
-              expect($(container.find('.slick-row .slick-cell:first-child ')[1])
-                .hasClass('selected')).toBeFalsy();
-            });
-          });
-
-          describe("and presses shift + down-arrow", function () {
-            beforeEach(function () {
-              pressShiftArrow(KEY_DOWN);
-            });
-
-            it("keeps the last row selected", function () {
-              expect(cellSelectionModel.getSelectedRanges().length).toBe(1);
-            });
-
-            it("grows the selection down", function () {
-              var selectedRanges = cellSelectionModel.getSelectedRanges();
-
-              var row = selectedRanges[0];
-
-              expect(selectedRanges.length).toEqual(1);
-              expect(row.fromCell).toBe(1);
-              expect(row.toCell).toBe(2);
-              expect(row.fromRow).toBe(1);
-              expect(row.toRow).toBe(2);
-            });
-
-            it("keeps selected class on rows 1 and 2", function () {
-              expect($(container.find('.slick-row .slick-cell:first-child ')[0])
-                .hasClass('selected')).toBeFalsy();
-              expect($(container.find('.slick-row .slick-cell:first-child ')[1])
-                .hasClass('selected')).toBeTruthy();
-              expect($(container.find('.slick-row .slick-cell:first-child ')[2])
-                .hasClass('selected')).toBeTruthy();
-              expect($(container.find('.slick-row .slick-cell:first-child ')[3])
-                .hasClass('selected')).toBeFalsy();
-            });
-          });
-
-          describe('when the user clicks a cell on the current range', function () {
-            beforeEach(function () {
-              container.find('.slick-cell.l1.r1')[5].click();
-            });
-
-            it('row gets deselected', function () {
-
-              var selectedRanges = cellSelectionModel.getSelectedRanges();
-
-              expect(selectedRanges.length).toBe(1);
-
-              var newSelection = selectedRanges[0];
-
-              expect(newSelection.fromCell).toBe(1);
-              expect(newSelection.fromRow).toBe(5);
-              expect(newSelection.toCell).toBe(1);
-              expect(newSelection.toRow).toBe(5);
-            });
-
-            it('keep select class on row header', function () {
-              expect($(container.find('.slick-cell.l0.r0')[5]).hasClass('selected'))
-                .toBeTruthy();
-            });
-          });
-
-          describe('when the user clicks a cell outside the current range', function () {
-            beforeEach(function () {
-              container.find('.slick-cell.l2.r2')[2].click();
-            });
-
-            it('row gets deselected', function () {
-
-              var selectedRanges = cellSelectionModel.getSelectedRanges();
-
-              expect(selectedRanges.length).toBe(1);
-
-              var newSelection = selectedRanges[0];
-
-              expect(newSelection.fromCell).toBe(2);
-              expect(newSelection.fromRow).toBe(2);
-              expect(newSelection.toCell).toBe(2);
-              expect(newSelection.toRow).toBe(2);
-            });
-
-            it('remove select class on "some-column-name" column header', function () {
-              expect($(container.find('.slick-cell.l0.r0')[5]).hasClass('selected'))
-                .toBeFalsy();
-              expect($(container.find('.slick-cell.l0.r0')[2]).hasClass('selected'))
-                .toBeTruthy();
-            });
-          });
-
-          describe('when the user has a column selected', function () {
-            beforeEach(function () {
-              var selectedRanges = [new Slick.Range(0, 1, 9, 1)];
-              cellSelectionModel.setSelectedRanges(selectedRanges);
-            });
-
-            it('no row should have the class "selected"', function () {
-              expect($(container.find('.slick-cell.l0.r0')[0]).hasClass('selected'))
-                .toBeFalsy();
-              expect($(container.find('.slick-cell.l0.r0')[1]).hasClass('selected'))
-                .toBeFalsy();
-              expect($(container.find('.slick-cell.l0.r0')[2]).hasClass('selected'))
-                .toBeFalsy();
-              expect($(container.find('.slick-cell.l0.r0')[3]).hasClass('selected'))
-                .toBeFalsy();
-              expect($(container.find('.slick-cell.l0.r0')[4]).hasClass('selected'))
-                .toBeFalsy();
-              expect($(container.find('.slick-cell.l0.r0')[5]).hasClass('selected'))
-                .toBeFalsy();
-            });
-          });
+      describe('when the user clicks a cell on the current range', function () {
+        beforeEach(function () {
+          container.find('.slick-cell.l1.r1')[5].click();
         });
 
-        describe("when the user clicks multiple row headers", function () {
-          it("selects another row", function () {
-            container.find('.slick-row .slick-cell:first-child')[4].click();
-            container.find('.slick-row .slick-cell:first-child')[0].click();
+        it('row gets deselected', function () {
+
+          var selectedRanges = cellSelectionModel.getSelectedRanges();
 
-            var selectedRanges = cellSelectionModel.getSelectedRanges();
-            expect(selectedRanges.length).toEqual(2);
+          expect(selectedRanges.length).toBe(1);
 
-            var row1 = selectedRanges[0];
-            expect(row1.fromRow).toBe(4);
-            expect(row1.toRow).toBe(4);
+          var newSelection = selectedRanges[0];
+
+          expect(newSelection.fromCell).toBe(1);
+          expect(newSelection.fromRow).toBe(5);
+          expect(newSelection.toCell).toBe(1);
+          expect(newSelection.toRow).toBe(5);
+        });
+
+        it('keep select class on row header', function () {
+          expect($(container.find('.slick-cell.l0.r0')[5]).hasClass('selected'))
+            .toBeTruthy();
+        });
+      });
 
-            var row2 = selectedRanges[1];
-            expect(row2.fromRow).toBe(0);
-            expect(row2.toRow).toBe(0);
-          });
+      describe('when the user clicks a cell outside the current range', function () {
+        beforeEach(function () {
+          container.find('.slick-cell.l2.r2')[2].click();
         });
 
-        describe("when a column was already selected", function () {
-          beforeEach(function () {
-            var selectedRanges = [new Slick.Range(0, 0, 0, 1)];
-            cellSelectionModel.setSelectedRanges(selectedRanges);
-          });
+        it('row gets deselected', function () {
 
-          it("deselects the column", function () {
-            container.find('.slick-row .slick-cell:first-child')[0].click();
-            var selectedRanges = cellSelectionModel.getSelectedRanges();
+          var selectedRanges = cellSelectionModel.getSelectedRanges();
 
-            expectOnlyTheFirstRowToBeSelected(selectedRanges);
-          });
+          expect(selectedRanges.length).toBe(1);
+
+          var newSelection = selectedRanges[0];
+
+          expect(newSelection.fromCell).toBe(2);
+          expect(newSelection.fromRow).toBe(2);
+          expect(newSelection.toCell).toBe(2);
+          expect(newSelection.toRow).toBe(2);
         });
 
-        describe("when the row is deselected through setSelectedRanges", function () {
-          beforeEach(function () {
-            container.find('.slick-row .slick-cell:first-child')[4].click();
-          });
+        it('remove select class on "some-column-name" column header', function () {
+          expect($(container.find('.slick-cell.l0.r0')[5]).hasClass('selected'))
+            .toBeFalsy();
+          expect($(container.find('.slick-cell.l0.r0')[2]).hasClass('selected'))
+            .toBeTruthy();
+        });
+      });
 
-          it("should remove the selected class", function () {
-            cellSelectionModel.setSelectedRanges([]);
+      describe('when the user has a column selected', function () {
+        beforeEach(function () {
+          var selectedRanges = [new Slick.Range(0, 1, 9, 1)];
+          cellSelectionModel.setSelectedRanges(selectedRanges);
+        });
 
-            expect($(container.find('.slick-row .slick-cell:first-child span[data-cell-type="row-header-selector"]')[4])
-              .hasClass('selected')).toBeFalsy();
-          });
+        it('no row should have the class "selected"', function () {
+          expect($(container.find('.slick-cell.l0.r0')[0]).hasClass('selected'))
+            .toBeFalsy();
+          expect($(container.find('.slick-cell.l0.r0')[1]).hasClass('selected'))
+            .toBeFalsy();
+          expect($(container.find('.slick-cell.l0.r0')[2]).hasClass('selected'))
+            .toBeFalsy();
+          expect($(container.find('.slick-cell.l0.r0')[3]).hasClass('selected'))
+            .toBeFalsy();
+          expect($(container.find('.slick-cell.l0.r0')[4]).hasClass('selected'))
+            .toBeFalsy();
+          expect($(container.find('.slick-cell.l0.r0')[5]).hasClass('selected'))
+            .toBeFalsy();
         });
+      });
+    });
 
-        describe("click a second time", function () {
-          beforeEach(function () {
-            container.find('.slick-row .slick-cell:first-child')[1].click();
-          });
+    describe('when the user clicks multiple row headers', function () {
+      it('selects another row', function () {
+        container.find('.slick-row .slick-cell:first-child')[4].click();
+        container.find('.slick-row .slick-cell:first-child')[0].click();
 
-          it("removes the selected class", function () {
-            container.find('.slick-row .slick-cell:first-child')[1].click();
-            expect($(container.find('.slick-row .slick-cell:first-child span[data-cell-type="row-header-selector"]')[1])
-              .hasClass('selected')).toBeFalsy();
-          });
+        var selectedRanges = cellSelectionModel.getSelectedRanges();
+        expect(selectedRanges.length).toEqual(2);
 
-          it("unselects the row", function () {
-            container.find('.slick-row .slick-cell:first-child')[1].click();
-            var selectedRanges = cellSelectionModel.getSelectedRanges();
+        var row1 = selectedRanges[0];
+        expect(row1.fromRow).toBe(4);
+        expect(row1.toRow).toBe(4);
 
-            expect(selectedRanges.length).toEqual(0);
-          })
-        });
+        var row2 = selectedRanges[1];
+        expect(row2.fromRow).toBe(0);
+        expect(row2.toRow).toBe(0);
       });
+    });
 
-      function pressShiftArrow(keyCode) {
-        var pressEvent = new $.Event("keydown");
-        pressEvent.shiftKey = true;
-        pressEvent.ctrlKey = false;
-        pressEvent.altKey = false;
-        pressEvent.which = keyCode;
+    describe('when a column was already selected', function () {
+      beforeEach(function () {
+        var selectedRanges = [new Slick.Range(0, 0, 0, 1)];
+        cellSelectionModel.setSelectedRanges(selectedRanges);
+      });
 
-        $(container.find('.grid-canvas')).trigger(pressEvent);
-      }
+      it('deselects the column', function () {
+        container.find('.slick-row .slick-cell:first-child')[0].click();
+        var selectedRanges = cellSelectionModel.getSelectedRanges();
+
+        expectOnlyTheFirstRowToBeSelected(selectedRanges);
+      });
     });
 
-    function expectOnlyTheFirstRowToBeSelected(selectedRanges) {
-      var row = selectedRanges[0];
+    describe('when the row is deselected through setSelectedRanges', function () {
+      beforeEach(function () {
+        container.find('.slick-row .slick-cell:first-child')[4].click();
+      });
 
-      expect(selectedRanges.length).toEqual(1);
-      expect(row.fromCell).toBe(1);
-      expect(row.toCell).toBe(2);
-      expect(row.fromRow).toBe(0);
-      expect(row.toRow).toBe(0);
-    }
-  });
\ No newline at end of file
+      it('should remove the selected class', function () {
+        cellSelectionModel.setSelectedRanges([]);
+
+        expect($(container.find('.slick-row .slick-cell:first-child span[data-cell-type="row-header-selector"]')[4])
+          .hasClass('selected')).toBeFalsy();
+      });
+    });
+
+    describe('click a second time', function () {
+      beforeEach(function () {
+        container.find('.slick-row .slick-cell:first-child')[1].click();
+      });
+
+      it('removes the selected class', function () {
+        container.find('.slick-row .slick-cell:first-child')[1].click();
+        expect($(container.find('.slick-row .slick-cell:first-child span[data-cell-type="row-header-selector"]')[1])
+          .hasClass('selected')).toBeFalsy();
+      });
+
+      it('unselects the row', function () {
+        container.find('.slick-row .slick-cell:first-child')[1].click();
+        var selectedRanges = cellSelectionModel.getSelectedRanges();
+
+        expect(selectedRanges.length).toEqual(0);
+      })
+    });
+  });
+
+  function pressShiftArrow(keyCode) {
+    var pressEvent = new $.Event('keydown');
+    pressEvent.shiftKey = true;
+    pressEvent.ctrlKey = false;
+    pressEvent.altKey = false;
+    pressEvent.which = keyCode;
+
+    $(container.find('.grid-canvas')).trigger(pressEvent);
+  }
+
+  function expectOnlyTheFirstRowToBeSelected(selectedRanges) {
+    var row = selectedRanges[0];
+
+    expect(selectedRanges.length).toEqual(1);
+    expect(row.fromCell).toBe(1);
+    expect(row.toCell).toBe(2);
+    expect(row.fromRow).toBe(0);
+    expect(row.toRow).toBe(0);
+  }
+});
diff --git a/web/regression/javascript/selection/xcell_selection_model_spec.js b/web/regression/javascript/selection/xcell_selection_model_spec.js
index 1682c244..8f01035c 100644
--- a/web/regression/javascript/selection/xcell_selection_model_spec.js
+++ b/web/regression/javascript/selection/xcell_selection_model_spec.js
@@ -7,507 +7,505 @@
 //
 //////////////////////////////////////////////////////////////////////////
 
-define([
-  'sources/selection/xcell_selection_model',
-  "slickgrid/slick.grid",
-  'slickgrid',
-], function (XCellSelectionModel, SlickGrid, Slick) {
-  describe('XCellSelectionModel', function () {
-    var KEY_RIGHT = 39;
-    var KEY_LEFT = 37;
-    var KEY_UP = 38;
-    var KEY_DOWN = 40;
-
-    var container, grid;
-    var oldWindowParent = window.parent;
+import XCellSelectionModel from 'sources/selection/xcell_selection_model';
+import 'slickgrid.grid';
+import Slick from 'slickgrid';
+
+describe('XCellSelectionModel', function () {
+  var KEY_RIGHT = 39;
+  var KEY_LEFT = 37;
+  var KEY_UP = 38;
+  var KEY_DOWN = 40;
+
+  var container, grid;
+  var SlickGrid = Slick.Grid;
+  var oldWindowParent = window.parent;
+
+  beforeEach(function () {
+    window.parent = window;
+
+    var columns = [{
+      id: 'row-header-column',
+      name: 'row header column name',
+      selectable: false,
+    }, {
+      id: '1',
+      name: 'some-column-name',
+      pos: 0
+    }, {
+      id: 'second-column-id',
+      name: 'second column',
+      pos: 1
+    }, {
+      id: 'third-column-id',
+      name: 'third column',
+      pos: 2
+    },
+    ];
+
+    var data = [];
+    for (var i = 0; i < 10; i++) {
+      data.push({
+        'some-column-name': 'some-value-' + i,
+        'second column': 'second value ' + i,
+        'third column': 'third value ' + i,
+        'fourth column': 'fourth value ' + i,
+      });
+    }
+    container = $("<div></div>");
+    container.height(9999);
+    container.width(9999);
 
-    beforeEach(function () {
-      window.parent = window;
-
-      var columns = [{
-        id: 'row-header-column',
-        name: 'row header column name',
-        selectable: false,
-      }, {
-        id: '1',
-        name: 'some-column-name',
-        pos: 0
-      }, {
-        id: 'second-column-id',
-        name: 'second column',
-        pos: 1
-      }, {
-        id: 'third-column-id',
-        name: 'third column',
-        pos: 2
-      },
-      ];
-
-      var data = [];
-      for (var i = 0; i < 10; i++) {
-        data.push({
-          'some-column-name': 'some-value-' + i,
-          'second column': 'second value ' + i,
-          'third column': 'third value ' + i,
-          'fourth column': 'fourth value ' + i,
-        });
-      }
-      container = $("<div></div>");
-      container.height(9999);
-      container.width(9999);
-
-      grid = new SlickGrid(container, data, columns);
-      grid.setSelectionModel(new XCellSelectionModel());
-      $("body").append(container);
-    });
+    grid = new SlickGrid(container, data, columns);
+    grid.setSelectionModel(new XCellSelectionModel());
+    $("body").append(container);
+  });
 
-    afterEach(function () {
-      grid.destroy();
-      container.remove();
-      window.parent = oldWindowParent;
-    });
+  afterEach(function () {
+    grid.destroy();
+    container.remove();
+    window.parent = oldWindowParent;
+  });
 
-    describe('handleKeyDown', function () {
-      describe('when we press a random key', function () {
-        it('should not change the range', function () {
-          var range = new Slick.Range(1, 2);
-          grid.setActiveCell(1, 2);
-          grid.getSelectionModel().setSelectedRanges([range]);
-          pressKey(72);
+  describe('handleKeyDown', function () {
+    describe('when we press a random key', function () {
+      it('should not change the range', function () {
+        var range = new Slick.Range(1, 2);
+        grid.setActiveCell(1, 2);
+        grid.getSelectionModel().setSelectedRanges([range]);
+        pressKey(72);
 
-          expect(grid.getSelectionModel().getSelectedRanges()[0]).toEqual(range);
-        });
+        expect(grid.getSelectionModel().getSelectedRanges()[0]).toEqual(range);
       });
+    });
 
-      describe('when we press an arrow key ', function () {
-        it('should select the cell to the right', function () {
-          var range = new Slick.Range(1, 2);
-          grid.setActiveCell(1, 2);
-          grid.getSelectionModel().setSelectedRanges([range]);
-          pressKey(KEY_RIGHT);
+    describe('when we press an arrow key ', function () {
+      it('should select the cell to the right', function () {
+        var range = new Slick.Range(1, 2);
+        grid.setActiveCell(1, 2);
+        grid.getSelectionModel().setSelectedRanges([range]);
+        pressKey(KEY_RIGHT);
 
-          expectOneSelectedRange(1, 3, 1, 3);
-        });
+        expectOneSelectedRange(1, 3, 1, 3);
       });
+    });
 
-      describe('when we press shift', function () {
-        describe('and we press an arrow key', function () {
-          var scrollColumnIntoViewSpy, scrollRowIntoViewSpy;
+    describe('when we press shift', function () {
+      describe('and we press an arrow key', function () {
+        var scrollColumnIntoViewSpy, scrollRowIntoViewSpy;
 
-          beforeEach(function () {
-            scrollColumnIntoViewSpy = spyOn(grid, 'scrollColumnIntoView');
-            scrollRowIntoViewSpy = spyOn(grid, 'scrollRowIntoView');
-          });
+        beforeEach(function () {
+          scrollColumnIntoViewSpy = spyOn(grid, 'scrollColumnIntoView');
+          scrollRowIntoViewSpy = spyOn(grid, 'scrollRowIntoView');
+        });
 
-          describe('the right arrow', function () {
-            describe('when a cell is selected', function () {
-              beforeEach(function () {
-                var range = new Slick.Range(1, 1);
-                grid.setActiveCell(1, 1);
-                grid.getSelectionModel().setSelectedRanges([range]);
-                pressShiftPlusKey(KEY_RIGHT);
-              });
+        describe('the right arrow', function () {
+          describe('when a cell is selected', function () {
+            beforeEach(function () {
+              var range = new Slick.Range(1, 1);
+              grid.setActiveCell(1, 1);
+              grid.getSelectionModel().setSelectedRanges([range]);
+              pressShiftPlusKey(KEY_RIGHT);
+            });
 
-              it('increases the range by one to the right', function () {
-                expectOneSelectedRange(1, 1, 1, 2);
-              });
+            it('increases the range by one to the right', function () {
+              expectOneSelectedRange(1, 1, 1, 2);
+            });
 
-              it('should scroll the next column into view', function () {
-                expect(scrollColumnIntoViewSpy).toHaveBeenCalledWith(2);
-                expect(scrollRowIntoViewSpy).not.toHaveBeenCalled();
-              });
+            it('should scroll the next column into view', function () {
+              expect(scrollColumnIntoViewSpy).toHaveBeenCalledWith(2);
+              expect(scrollRowIntoViewSpy).not.toHaveBeenCalled();
+            });
 
-              it('pressing right again grows the range right', function () {
-                pressShiftPlusKey(KEY_RIGHT);
+            it('pressing right again grows the range right', function () {
+              pressShiftPlusKey(KEY_RIGHT);
 
-                expectOneSelectedRange(1, 1, 1, 3);
-              });
+              expectOneSelectedRange(1, 1, 1, 3);
+            });
 
-              it('then pressing left keeps the original selection', function () {
-                pressShiftPlusKey(KEY_LEFT);
+            it('then pressing left keeps the original selection', function () {
+              pressShiftPlusKey(KEY_LEFT);
 
-                expectOneSelectedRange(1, 1, 1, 1);
-              });
+              expectOneSelectedRange(1, 1, 1, 1);
             });
+          });
 
-            describe('when a column is selected', function () {
-              beforeEach(function () {
-                var range = new Slick.Range(0, 1, 9, 1);
-                grid.setActiveCell(0, 1);
-                grid.getSelectionModel().setSelectedRanges([range]);
-                pressShiftPlusKey(KEY_RIGHT);
-              });
+          describe('when a column is selected', function () {
+            beforeEach(function () {
+              var range = new Slick.Range(0, 1, 9, 1);
+              grid.setActiveCell(0, 1);
+              grid.getSelectionModel().setSelectedRanges([range]);
+              pressShiftPlusKey(KEY_RIGHT);
+            });
 
-              it('increases the range by one column to the right', function () {
-                expectOneSelectedRange(0, 1, 9, 2);
-              });
+            it('increases the range by one column to the right', function () {
+              expectOneSelectedRange(0, 1, 9, 2);
+            });
 
-              it('should scroll the next column into view', function () {
-                expect(scrollColumnIntoViewSpy).toHaveBeenCalledWith(2);
-                expect(scrollRowIntoViewSpy).not.toHaveBeenCalled();
-              });
+            it('should scroll the next column into view', function () {
+              expect(scrollColumnIntoViewSpy).toHaveBeenCalledWith(2);
+              expect(scrollRowIntoViewSpy).not.toHaveBeenCalled();
             });
           });
+        });
 
-          describe('the left arrow', function () {
-            describe('when a cell is selected', function () {
-              beforeEach(function () {
-                var range = new Slick.Range(1, 3);
-                grid.setActiveCell(1, 3);
-                grid.getSelectionModel().setSelectedRanges([range]);
-                pressShiftPlusKey(KEY_LEFT);
-              });
+        describe('the left arrow', function () {
+          describe('when a cell is selected', function () {
+            beforeEach(function () {
+              var range = new Slick.Range(1, 3);
+              grid.setActiveCell(1, 3);
+              grid.getSelectionModel().setSelectedRanges([range]);
+              pressShiftPlusKey(KEY_LEFT);
+            });
 
-              it('increases the range by one to the left', function () {
-                expectOneSelectedRange(1, 2, 1, 3);
-              });
+            it('increases the range by one to the left', function () {
+              expectOneSelectedRange(1, 2, 1, 3);
+            });
 
-              it('should scroll previous column into view', function () {
-                expect(scrollColumnIntoViewSpy).toHaveBeenCalledWith(2);
-                expect(scrollRowIntoViewSpy).not.toHaveBeenCalled();
-              });
+            it('should scroll previous column into view', function () {
+              expect(scrollColumnIntoViewSpy).toHaveBeenCalledWith(2);
+              expect(scrollRowIntoViewSpy).not.toHaveBeenCalled();
+            });
 
-              it('pressing left again grows the range the left', function () {
-                pressShiftPlusKey(KEY_LEFT);
+            it('pressing left again grows the range the left', function () {
+              pressShiftPlusKey(KEY_LEFT);
 
-                expectOneSelectedRange(1, 1, 1, 3);
-              });
+              expectOneSelectedRange(1, 1, 1, 3);
+            });
 
-              it('then pressing right keeps the original selection', function () {
-                pressShiftPlusKey(KEY_RIGHT);
+            it('then pressing right keeps the original selection', function () {
+              pressShiftPlusKey(KEY_RIGHT);
 
-                expectOneSelectedRange(1, 3, 1, 3);
-              });
+              expectOneSelectedRange(1, 3, 1, 3);
             });
+          });
 
-            describe('when a column is selected', function () {
-              beforeEach(function () {
-                var range = new Slick.Range(0, 2, 9, 2);
-                grid.setActiveCell(0, 2);
-                grid.getSelectionModel().setSelectedRanges([range]);
-                pressShiftPlusKey(KEY_LEFT);
-              });
+          describe('when a column is selected', function () {
+            beforeEach(function () {
+              var range = new Slick.Range(0, 2, 9, 2);
+              grid.setActiveCell(0, 2);
+              grid.getSelectionModel().setSelectedRanges([range]);
+              pressShiftPlusKey(KEY_LEFT);
+            });
 
-              it('increases the range by one column to the left', function () {
-                expectOneSelectedRange(0, 1, 9, 2);
-              });
+            it('increases the range by one column to the left', function () {
+              expectOneSelectedRange(0, 1, 9, 2);
+            });
 
-              it('should scroll previous column into view', function () {
-                expect(scrollColumnIntoViewSpy).toHaveBeenCalledWith(1);
-                expect(scrollRowIntoViewSpy).not.toHaveBeenCalled();
-              });
+            it('should scroll previous column into view', function () {
+              expect(scrollColumnIntoViewSpy).toHaveBeenCalledWith(1);
+              expect(scrollRowIntoViewSpy).not.toHaveBeenCalled();
             });
           });
+        });
 
-          describe('the up arrow', function () {
-            describe('when a cell is selected', function () {
-              beforeEach(function () {
-                var range = new Slick.Range(2, 2);
-                grid.setActiveCell(2, 2);
-                grid.getSelectionModel().setSelectedRanges([range]);
-                pressShiftPlusKey(KEY_UP);
-              });
+        describe('the up arrow', function () {
+          describe('when a cell is selected', function () {
+            beforeEach(function () {
+              var range = new Slick.Range(2, 2);
+              grid.setActiveCell(2, 2);
+              grid.getSelectionModel().setSelectedRanges([range]);
+              pressShiftPlusKey(KEY_UP);
+            });
 
-              it('increases the range by one up', function () {
-                expectOneSelectedRange(1, 2, 2, 2);
-              });
+            it('increases the range by one up', function () {
+              expectOneSelectedRange(1, 2, 2, 2);
+            });
 
-              it('should scroll the row above into view', function () {
-                expect(scrollRowIntoViewSpy).toHaveBeenCalledWith(1);
-                expect(scrollColumnIntoViewSpy).not.toHaveBeenCalled();
-              });
+            it('should scroll the row above into view', function () {
+              expect(scrollRowIntoViewSpy).toHaveBeenCalledWith(1);
+              expect(scrollColumnIntoViewSpy).not.toHaveBeenCalled();
+            });
 
-              it('pressing up again grows the range up', function () {
-                pressShiftPlusKey(KEY_UP);
+            it('pressing up again grows the range up', function () {
+              pressShiftPlusKey(KEY_UP);
 
-                expectOneSelectedRange(0, 2, 2, 2);
-              });
+              expectOneSelectedRange(0, 2, 2, 2);
+            });
 
-              it('then pressing down keeps the original selection', function () {
-                pressShiftPlusKey(KEY_DOWN);
+            it('then pressing down keeps the original selection', function () {
+              pressShiftPlusKey(KEY_DOWN);
 
-                expectOneSelectedRange(2, 2, 2, 2);
-              });
+              expectOneSelectedRange(2, 2, 2, 2);
             });
+          });
 
-            describe('when a row is selected', function () {
-              beforeEach(function () {
-                var range = new Slick.Range(2, 1, 2, 3);
-                grid.setActiveCell(2, 1);
-                grid.getSelectionModel().setSelectedRanges([range]);
-                pressShiftPlusKey(KEY_UP);
-              });
+          describe('when a row is selected', function () {
+            beforeEach(function () {
+              var range = new Slick.Range(2, 1, 2, 3);
+              grid.setActiveCell(2, 1);
+              grid.getSelectionModel().setSelectedRanges([range]);
+              pressShiftPlusKey(KEY_UP);
+            });
 
-              it('increases the range by one row up', function () {
-                expectOneSelectedRange(1, 1, 2, 3);
-              });
+            it('increases the range by one row up', function () {
+              expectOneSelectedRange(1, 1, 2, 3);
+            });
 
-              it('should scroll the row above into view', function () {
-                expect(scrollRowIntoViewSpy).toHaveBeenCalledWith(1);
-                expect(scrollColumnIntoViewSpy).not.toHaveBeenCalled();
-              });
+            it('should scroll the row above into view', function () {
+              expect(scrollRowIntoViewSpy).toHaveBeenCalledWith(1);
+              expect(scrollColumnIntoViewSpy).not.toHaveBeenCalled();
             });
           });
+        });
 
-          describe('the down arrow', function () {
-            describe('when a cell is selected', function () {
-              beforeEach(function () {
-                var range = new Slick.Range(2, 2);
-                grid.setActiveCell(2, 2);
-                grid.getSelectionModel().setSelectedRanges([range]);
-                pressShiftPlusKey(KEY_DOWN);
-              });
+        describe('the down arrow', function () {
+          describe('when a cell is selected', function () {
+            beforeEach(function () {
+              var range = new Slick.Range(2, 2);
+              grid.setActiveCell(2, 2);
+              grid.getSelectionModel().setSelectedRanges([range]);
+              pressShiftPlusKey(KEY_DOWN);
+            });
 
-              it('increases the range by one down', function () {
-                expectOneSelectedRange(2, 2, 3, 2);
-              });
+            it('increases the range by one down', function () {
+              expectOneSelectedRange(2, 2, 3, 2);
+            });
 
-              it('should scroll the row below into view', function () {
-                expect(scrollRowIntoViewSpy).toHaveBeenCalledWith(3);
-                expect(scrollColumnIntoViewSpy).not.toHaveBeenCalled();
-              });
+            it('should scroll the row below into view', function () {
+              expect(scrollRowIntoViewSpy).toHaveBeenCalledWith(3);
+              expect(scrollColumnIntoViewSpy).not.toHaveBeenCalled();
+            });
 
-              it('pressing down again grows the range down', function () {
-                pressShiftPlusKey(KEY_DOWN);
+            it('pressing down again grows the range down', function () {
+              pressShiftPlusKey(KEY_DOWN);
 
-                expectOneSelectedRange(2, 2, 4, 2);
-              });
+              expectOneSelectedRange(2, 2, 4, 2);
+            });
 
-              it('then pressing up keeps the original selection', function () {
-                pressShiftPlusKey(KEY_UP);
+            it('then pressing up keeps the original selection', function () {
+              pressShiftPlusKey(KEY_UP);
 
-                expectOneSelectedRange(2, 2, 2, 2);
-              });
+              expectOneSelectedRange(2, 2, 2, 2);
             });
+          });
 
-            describe('when a row is selected', function () {
-              beforeEach(function () {
-                var range = new Slick.Range(2, 1, 2, 3);
-                grid.setActiveCell(2, 1);
-                grid.getSelectionModel().setSelectedRanges([range]);
-                pressShiftPlusKey(KEY_DOWN);
-              });
+          describe('when a row is selected', function () {
+            beforeEach(function () {
+              var range = new Slick.Range(2, 1, 2, 3);
+              grid.setActiveCell(2, 1);
+              grid.getSelectionModel().setSelectedRanges([range]);
+              pressShiftPlusKey(KEY_DOWN);
+            });
 
-              it('increases the range by one row down', function () {
-                expectOneSelectedRange(2, 1, 3, 3);
-              });
+            it('increases the range by one row down', function () {
+              expectOneSelectedRange(2, 1, 3, 3);
+            });
 
-              it('should scroll the row below into view', function () {
-                expect(scrollRowIntoViewSpy).toHaveBeenCalledWith(3);
-                expect(scrollColumnIntoViewSpy).not.toHaveBeenCalled();
-              });
+            it('should scroll the row below into view', function () {
+              expect(scrollRowIntoViewSpy).toHaveBeenCalledWith(3);
+              expect(scrollColumnIntoViewSpy).not.toHaveBeenCalled();
             });
           });
+        });
 
-          describe('rectangular selection works', function () {
+        describe('rectangular selection works', function () {
 
-            it('in the down-and-rightward direction', function () {
-              var range = new Slick.Range(1, 1);
-              grid.setActiveCell(1, 1);
-              grid.getSelectionModel().setSelectedRanges([range]);
+          it('in the down-and-rightward direction', function () {
+            var range = new Slick.Range(1, 1);
+            grid.setActiveCell(1, 1);
+            grid.getSelectionModel().setSelectedRanges([range]);
 
-              pressShiftPlusKey(KEY_DOWN);
-              pressShiftPlusKey(KEY_DOWN);
-              pressShiftPlusKey(KEY_DOWN);
-              pressShiftPlusKey(KEY_RIGHT);
-              pressShiftPlusKey(KEY_RIGHT);
+            pressShiftPlusKey(KEY_DOWN);
+            pressShiftPlusKey(KEY_DOWN);
+            pressShiftPlusKey(KEY_DOWN);
+            pressShiftPlusKey(KEY_RIGHT);
+            pressShiftPlusKey(KEY_RIGHT);
 
-              expectOneSelectedRange(1, 1, 4, 3);
-            });
+            expectOneSelectedRange(1, 1, 4, 3);
+          });
 
-            it('in the up-and-leftward direction', function () {
-              var range = new Slick.Range(4, 3);
-              grid.setActiveCell(4, 3);
-              grid.getSelectionModel().setSelectedRanges([range]);
+          it('in the up-and-leftward direction', function () {
+            var range = new Slick.Range(4, 3);
+            grid.setActiveCell(4, 3);
+            grid.getSelectionModel().setSelectedRanges([range]);
 
-              pressShiftPlusKey(KEY_UP);
-              pressShiftPlusKey(KEY_UP);
-              pressShiftPlusKey(KEY_UP);
-              pressShiftPlusKey(KEY_LEFT);
-              pressShiftPlusKey(KEY_LEFT);
+            pressShiftPlusKey(KEY_UP);
+            pressShiftPlusKey(KEY_UP);
+            pressShiftPlusKey(KEY_UP);
+            pressShiftPlusKey(KEY_LEFT);
+            pressShiftPlusKey(KEY_LEFT);
 
-              expectOneSelectedRange(1, 1, 4, 3);
-            });
+            expectOneSelectedRange(1, 1, 4, 3);
+          });
 
-            it('in the up-and-rightward direction', function () {
-              var range = new Slick.Range(4, 1);
-              grid.setActiveCell(4, 1);
-              grid.getSelectionModel().setSelectedRanges([range]);
+          it('in the up-and-rightward direction', function () {
+            var range = new Slick.Range(4, 1);
+            grid.setActiveCell(4, 1);
+            grid.getSelectionModel().setSelectedRanges([range]);
 
-              pressShiftPlusKey(KEY_UP);
-              pressShiftPlusKey(KEY_UP);
-              pressShiftPlusKey(KEY_UP);
-              pressShiftPlusKey(KEY_RIGHT);
-              pressShiftPlusKey(KEY_RIGHT);
+            pressShiftPlusKey(KEY_UP);
+            pressShiftPlusKey(KEY_UP);
+            pressShiftPlusKey(KEY_UP);
+            pressShiftPlusKey(KEY_RIGHT);
+            pressShiftPlusKey(KEY_RIGHT);
 
-              expectOneSelectedRange(1, 1, 4, 3);
-            });
+            expectOneSelectedRange(1, 1, 4, 3);
+          });
 
-            it('in the down-and-leftward direction', function () {
-              var range = new Slick.Range(1, 3);
-              grid.setActiveCell(1, 3);
-              grid.getSelectionModel().setSelectedRanges([range]);
+          it('in the down-and-leftward direction', function () {
+            var range = new Slick.Range(1, 3);
+            grid.setActiveCell(1, 3);
+            grid.getSelectionModel().setSelectedRanges([range]);
 
-              pressShiftPlusKey(KEY_DOWN);
-              pressShiftPlusKey(KEY_DOWN);
-              pressShiftPlusKey(KEY_DOWN);
-              pressShiftPlusKey(KEY_LEFT);
-              pressShiftPlusKey(KEY_LEFT);
+            pressShiftPlusKey(KEY_DOWN);
+            pressShiftPlusKey(KEY_DOWN);
+            pressShiftPlusKey(KEY_DOWN);
+            pressShiftPlusKey(KEY_LEFT);
+            pressShiftPlusKey(KEY_LEFT);
 
-              expectOneSelectedRange(1, 1, 4, 3);
-            });
+            expectOneSelectedRange(1, 1, 4, 3);
           });
+        });
 
-          describe('and we are on an edge', function () {
-            var range;
+        describe('and we are on an edge', function () {
+          var range;
 
-            beforeEach(function () {
-              range = new Slick.Range(2, 1);
-              grid.setActiveCell(2, 1);
-              grid.getSelectionModel().setSelectedRanges([range]);
-            });
+          beforeEach(function () {
+            range = new Slick.Range(2, 1);
+            grid.setActiveCell(2, 1);
+            grid.getSelectionModel().setSelectedRanges([range]);
+          });
 
-            it('we still have the selected range before we arrowed', function () {
-              pressShiftPlusKey(KEY_LEFT);
-              expectOneSelectedRange(2, 1, 2, 1);
-            });
+          it('we still have the selected range before we arrowed', function () {
+            pressShiftPlusKey(KEY_LEFT);
+            expectOneSelectedRange(2, 1, 2, 1);
           });
         });
       });
     });
+  });
 
-    describe('when we drag and drop', function () {
-      var dd;
-      // We could not find an elegant way to calculate this value
-      // after changing window size we saw this was a constant value
-      var offsetLeftColumns = 100;
+  describe('when we drag and drop', function () {
+    var dd;
+    // We could not find an elegant way to calculate this value
+    // after changing window size we saw this was a constant value
+    var offsetLeftColumns = 100;
 
-      function cellTopPosition($cell, rowNumber) {
-        return $(grid.getCanvasNode()).offset().top + $cell[0].scrollHeight * rowNumber;
-      }
+    function cellTopPosition($cell, rowNumber) {
+      return $(grid.getCanvasNode()).offset().top + $cell[0].scrollHeight * rowNumber;
+    }
+
+    function cellLeftPosition(columnNumber) {
+      return $(grid.getCanvasNode()).offset().left + offsetLeftColumns * columnNumber;
+    }
 
-      function cellLeftPosition(columnNumber) {
-        return $(grid.getCanvasNode()).offset().left + offsetLeftColumns * columnNumber;
-      }
+    beforeEach(function () {
+      var initialPosition = {cell: 3, row: 4};
+      var $cell = $($('.slick-cell.l3')[initialPosition.row]);
+      var event = {
+        target: $cell,
+        isPropagationStopped: jasmine.createSpy('isPropagationStopped').and.returnValue(false),
+        isImmediatePropagationStopped: jasmine.createSpy('isImmediatePropagationStopped').and.returnValue(false),
+        stopImmediatePropagation: jasmine.createSpy('stopImmediatePropagation')
+      };
+
+      dd = {
+        grid: grid,
+        startX: cellLeftPosition(initialPosition.cell),
+        startY: cellTopPosition($cell, initialPosition.row)
+      };
+
+      grid.onDragStart.notify(dd, event, grid);
+    });
 
+    describe('when the drop happens outside of the grid', function () {
       beforeEach(function () {
-        var initialPosition = {cell: 3, row: 4};
-        var $cell = $($('.slick-cell.l3')[initialPosition.row]);
+        var $cell = $($('.slick-cell.l1')[1]);
+        var finalPosition = {cell: 1, row: 1};
+
         var event = {
           target: $cell,
           isPropagationStopped: jasmine.createSpy('isPropagationStopped').and.returnValue(false),
           isImmediatePropagationStopped: jasmine.createSpy('isImmediatePropagationStopped').and.returnValue(false),
-          stopImmediatePropagation: jasmine.createSpy('stopImmediatePropagation')
-        };
+          stopImmediatePropagation: jasmine.createSpy('stopImmediatePropagation'),
 
-        dd = {
-          grid: grid,
-          startX: cellLeftPosition(initialPosition.cell),
-          startY: cellTopPosition($cell, initialPosition.row)
+          pageX: cellLeftPosition(finalPosition.cell),
+          pageY: cellTopPosition($cell, finalPosition.row)
         };
 
-        grid.onDragStart.notify(dd, event, grid);
+        grid.onDrag.notify(dd, event, grid);
+        $(window).mouseup();
       });
+      it('should call handleDragEnd from CellRangeSelector', function () {
+        var newRange = grid.getSelectionModel().getSelectedRanges();
 
-      describe('when the drop happens outside of the grid', function () {
-        beforeEach(function () {
-          var $cell = $($('.slick-cell.l1')[1]);
-          var finalPosition = {cell: 1, row: 1};
-
-          var event = {
-            target: $cell,
-            isPropagationStopped: jasmine.createSpy('isPropagationStopped').and.returnValue(false),
-            isImmediatePropagationStopped: jasmine.createSpy('isImmediatePropagationStopped').and.returnValue(false),
-            stopImmediatePropagation: jasmine.createSpy('stopImmediatePropagation'),
-
-            pageX: cellLeftPosition(finalPosition.cell),
-            pageY: cellTopPosition($cell, finalPosition.row)
-          };
+        expect(newRange.length).toBe(1);
 
-          grid.onDrag.notify(dd, event, grid);
-          $(window).mouseup();
-        });
-        it('should call handleDragEnd from CellRangeSelector', function () {
-          var newRange = grid.getSelectionModel().getSelectedRanges();
-
-          expect(newRange.length).toBe(1);
-
-          expect(newRange[0].fromCell).toBe(1);
-          expect(newRange[0].toCell).toBe(3);
-          expect(newRange[0].fromRow).toBe(1);
-          expect(newRange[0].toRow).toBe(4);
-        });
+        expect(newRange[0].fromCell).toBe(1);
+        expect(newRange[0].toCell).toBe(3);
+        expect(newRange[0].fromRow).toBe(1);
+        expect(newRange[0].toRow).toBe(4);
       });
     });
+  });
 
-    describe('when we mouse up and no drag and drop occured', function () {
-      beforeEach(function () {
-        grid.onDragEnd.notify = jasmine.createSpy('notify');
-        grid.onDragEnd.notify.calls.reset();
-        $(window).mouseup();
-      });
+  describe('when we mouse up and no drag and drop occured', function () {
+    beforeEach(function () {
+      grid.onDragEnd.notify = jasmine.createSpy('notify');
+      grid.onDragEnd.notify.calls.reset();
+      $(window).mouseup();
+    });
 
-      it('do not notify onDragEnd', function () {
-        expect(grid.onDragEnd.notify).not.toHaveBeenCalled()
-      });
+    it('do not notify onDragEnd', function () {
+      expect(grid.onDragEnd.notify).not.toHaveBeenCalled()
     });
+  });
+
+  describe('setSelectedRows', function () {
 
-    describe('setSelectedRows', function () {
+    beforeEach(function () {
+      grid.getSelectionModel().setSelectedRanges(
+        [new Slick.Range(1, 1, 1, 1)]
+      );
+    });
 
+    describe('when passed an empty array', function () {
       beforeEach(function () {
-        grid.getSelectionModel().setSelectedRanges(
-          [new Slick.Range(1, 1, 1, 1)]
-        );
+        grid.getSelectionModel().setSelectedRows([]);
       });
-
-      describe('when passed an empty array', function () {
-        beforeEach(function () {
-          grid.getSelectionModel().setSelectedRows([]);
-        });
-        it('clears ranges', function () {
-          var newRanges = grid.getSelectionModel().getSelectedRanges();
-          expect(newRanges.length).toEqual(0);
-        });
-      });
-
-      it('sets ranges corresponding to rows', function () {
-        grid.getSelectionModel().setSelectedRows([0, 2]);
-
-        var selectedRanges = grid.getSelectionModel().getSelectedRanges();
-
-        expect(selectedRanges.length).toBe(2);
-        expectRangeToMatch(selectedRanges[0], 0, 1, 0, 3);
-        expectRangeToMatch(selectedRanges[1], 2, 1, 2, 3);
+      it('clears ranges', function () {
+        var newRanges = grid.getSelectionModel().getSelectedRanges();
+        expect(newRanges.length).toEqual(0);
       });
     });
 
-    function pressKey(keyCode) {
-      var pressEvent = new $.Event("keydown");
-      pressEvent.which = keyCode;
-
-      $(container.find('.grid-canvas')).trigger(pressEvent);
-    }
-
-    function pressShiftPlusKey(keyCode) {
-      var pressEvent = new $.Event("keydown");
-      pressEvent.shiftKey = true;
-      pressEvent.which = keyCode;
-
-      $(container.find('.grid-canvas')).trigger(pressEvent);
-    }
+    it('sets ranges corresponding to rows', function () {
+      grid.getSelectionModel().setSelectedRows([0, 2]);
 
-    function expectOneSelectedRange(fromRow, fromCell, toRow, toCell) {
       var selectedRanges = grid.getSelectionModel().getSelectedRanges();
-      expect(selectedRanges.length).toBe(1);
-      expectRangeToMatch(selectedRanges[0], fromRow, fromCell, toRow, toCell);
-    }
 
-    function expectRangeToMatch(range, fromRow, fromCell, toRow, toCell) {
-      expect(range.fromRow).toBe(fromRow);
-      expect(range.toRow).toBe(toRow);
-      expect(range.fromCell).toBe(fromCell);
-      expect(range.toCell).toBe(toCell);
-    }
+      expect(selectedRanges.length).toBe(2);
+      expectRangeToMatch(selectedRanges[0], 0, 1, 0, 3);
+      expectRangeToMatch(selectedRanges[1], 2, 1, 2, 3);
+    });
   });
-})
-;
\ No newline at end of file
+
+  function pressKey(keyCode) {
+    var pressEvent = new $.Event("keydown");
+    pressEvent.which = keyCode;
+
+    $(container.find('.grid-canvas')).trigger(pressEvent);
+  }
+
+  function pressShiftPlusKey(keyCode) {
+    var pressEvent = new $.Event("keydown");
+    pressEvent.shiftKey = true;
+    pressEvent.which = keyCode;
+
+    $(container.find('.grid-canvas')).trigger(pressEvent);
+  }
+
+  function expectOneSelectedRange(fromRow, fromCell, toRow, toCell) {
+    var selectedRanges = grid.getSelectionModel().getSelectedRanges();
+    expect(selectedRanges.length).toBe(1);
+    expectRangeToMatch(selectedRanges[0], fromRow, fromCell, toRow, toCell);
+  }
+
+  function expectRangeToMatch(range, fromRow, fromCell, toRow, toCell) {
+    expect(range.fromRow).toBe(fromRow);
+    expect(range.toRow).toBe(toRow);
+    expect(range.fromCell).toBe(fromCell);
+    expect(range.toCell).toBe(toCell);
+  }
+});
diff --git a/web/regression/javascript/slickgrid/cell_selector_spec.js b/web/regression/javascript/slickgrid/cell_selector_spec.js
index ed7c0aee..b32fdf80 100644
--- a/web/regression/javascript/slickgrid/cell_selector_spec.js
+++ b/web/regression/javascript/slickgrid/cell_selector_spec.js
@@ -7,71 +7,69 @@
 //
 //////////////////////////////////////////////////////////////
 
-define(["jquery",
-    "slickgrid/slick.grid",
-    "sources/selection/xcell_selection_model",
-    "sources/slickgrid/cell_selector",
-    "sources/selection/range_selection_helper"
-  ],
-  function ($, SlickGrid, XCellSelectionModel, CellSelector, RangeSelectionHelper) {
-    describe("CellSelector", function () {
-      var container, columns, cellSelector, data, cellSelectionModel, grid;
-      beforeEach(function () {
-        container = $("<div></div>");
-        container.height(9999);
-        container.width(9999);
-        columns = [{
-          name: 'some-column-name',
-        }, {
-          name: 'second column',
-        }];
+import $ from "jquery";
+import SlickGrid from "slickgrid.grid";
+import XCellSelectionModel from "sources/selection/xcell_selection_model";
+import CellSelector from "sources/slickgrid/cell_selector";
+import RangeSelectionHelper from "sources/selection/range_selection_helper";
 
-        cellSelector = new CellSelector();
+describe("CellSelector", function () {
+  var container, columns, cellSelector, data, cellSelectionModel, grid;
+  beforeEach(function () {
+    container = $("<div></div>");
+    container.height(9999);
+    container.width(9999);
+    columns = [{
+      name: 'some-column-name',
+    }, {
+      name: 'second column',
+    }];
 
-        data = [];
-        for (var i = 0; i < 10; i++) {
-          data.push({'some-column-name': 'some-value-' + i, 'second column': 'second value ' + i});
-        }
-        grid = new SlickGrid(container, data, columns);
+    cellSelector = new CellSelector();
 
-        cellSelectionModel = new XCellSelectionModel();
-        grid.setSelectionModel(cellSelectionModel);
+    data = [];
+    for (var i = 0; i < 10; i++) {
+      data.push({'some-column-name': 'some-value-' + i, 'second column': 'second value ' + i});
+    }
+    grid = new Slick.Grid(container, data, columns);
 
-        grid.registerPlugin(cellSelector);
-        grid.invalidate();
+    cellSelectionModel = new XCellSelectionModel();
+    grid.setSelectionModel(cellSelectionModel);
 
-        $("body").append(container);
-      });
+    grid.registerPlugin(cellSelector);
+    grid.invalidate();
 
-      afterEach(function () {
-        $("body").find(container).remove();
-      });
+    $("body").append(container);
+  });
 
-      describe("when the user clicks or tabs to a cell", function () {
-        it("sets the selected range to that cell", function () {
-          var row = 1, column = 0;
-          $(container.find(".slick-row .slick-cell.l" + column)[row]).click();
+  afterEach(function () {
+    $("body").find(container).remove();
+  });
 
-          var selectedRanges = cellSelectionModel.getSelectedRanges();
-          expect(selectedRanges.length).toBe(1);
-          expect(selectedRanges[0].fromCell).toBe(0);
-          expect(selectedRanges[0].toCell).toBe(0);
-          expect(selectedRanges[0].fromRow).toBe(1);
-          expect(selectedRanges[0].toRow).toBe(1);
-        });
+  describe("when the user clicks or tabs to a cell", function () {
+    it("sets the selected range to that cell", function () {
+      var row = 1, column = 0;
+      $(container.find(".slick-row .slick-cell.l" + column)[row]).click();
 
-        it("deselects previously selected ranges", function () {
-          var row2Range = RangeSelectionHelper.rangeForRow(grid, 2);
-          var ranges = RangeSelectionHelper.addRange(cellSelectionModel.getSelectedRanges(),
-            row2Range);
-          cellSelectionModel.setSelectedRanges(ranges);
+      var selectedRanges = cellSelectionModel.getSelectedRanges();
+      expect(selectedRanges.length).toBe(1);
+      expect(selectedRanges[0].fromCell).toBe(0);
+      expect(selectedRanges[0].toCell).toBe(0);
+      expect(selectedRanges[0].fromRow).toBe(1);
+      expect(selectedRanges[0].toRow).toBe(1);
+    });
+
+    it("deselects previously selected ranges", function () {
+      var row2Range = RangeSelectionHelper.rangeForRow(grid, 2);
+      var ranges = RangeSelectionHelper.addRange(cellSelectionModel.getSelectedRanges(),
+        row2Range);
+      cellSelectionModel.setSelectedRanges(ranges);
 
-          var row = 4, column = 1;
-          $(container.find(".slick-row .slick-cell.l" + column)[row]).click();
+      var row = 4, column = 1;
+      $(container.find(".slick-row .slick-cell.l" + column)[row]).click();
 
-          expect(RangeSelectionHelper.isRangeSelected(cellSelectionModel.getSelectedRanges(), row2Range))
-            .toBe(false);
-        });
-      });
+      expect(RangeSelectionHelper.isRangeSelected(cellSelectionModel.getSelectedRanges(), row2Range))
+        .toBe(false);
     });
-  });
\ No newline at end of file
+  });
+});
diff --git a/web/regression/javascript/slickgrid/event_handlers/handle_query_output_keyboard_event_spec.js b/web/regression/javascript/slickgrid/event_handlers/handle_query_output_keyboard_event_spec.js
index 14768227..884ae415 100644
--- a/web/regression/javascript/slickgrid/event_handlers/handle_query_output_keyboard_event_spec.js
+++ b/web/regression/javascript/slickgrid/event_handlers/handle_query_output_keyboard_event_spec.js
@@ -7,137 +7,139 @@
 //
 //////////////////////////////////////////////////////////////
 
-define([
-    'sources/slickgrid/event_handlers/handle_query_output_keyboard_event',
-    'sources/selection/clipboard',
-    'sources/selection/range_selection_helper',
-    'sources/selection/xcell_selection_model',
-    'slickgrid'
-  ],
-function (handleQueryOutputKeyboardEvent, clipboard, RangeSelectionHelper, XCellSelectionModel) {
-  var Slick = window.Slick;
-
-  describe('#handleQueryOutputKeyboardEvent', function () {
-    var event, view, grid, slickEvent;
+import HandleQueryOutputKeyboardEvent from 'sources/slickgrid/event_handlers/handle_query_output_keyboard_event';
+import clipboard from 'sources/selection/clipboard';
+import RangeSelectionHelper from 'sources/selection/range_selection_helper';
+import XCellSelectionModel from 'sources/selection/xcell_selection_model';
+import Slick from 'slickgrid';
+import 'slickgrid.grid';
+
+
+describe('#handleQueryOutputKeyboardEvent', function () {
+  var event, view, grid, slickEvent;
+  var SlickGrid = Slick.Grid;
+  var handleQueryOutputKeyboardEvent;
+
+  beforeEach(function () {
+    event = {
+      shiftKey: false,
+      ctrlKey: false,
+      metaKey: false,
+      which: -1,
+      keyCode: -1,
+      preventDefault: jasmine.createSpy('preventDefault')
+    };
+
+    var data = [['', '0,0-cell-content', '0,1-cell-content'],
+      ['', '1,0-cell-content', '1,1-cell-content'],
+      ['', '2,0-cell-content', '2,1-cell-content']];
+    var columnDefinitions = [{name: 'checkboxColumn'}, {pos: 1, name: 'firstColumn'}, {
+      pos: 2,
+      name: 'secondColumn'
+    }];
+    grid = new SlickGrid($('<div></div>'), data, columnDefinitions);
+    grid.setSelectionModel(new XCellSelectionModel());
+
+    slickEvent = {
+      grid: grid
+    };
+
+    view = {};
+    spyOn(clipboard, 'copyTextToClipboard');
+    handleQueryOutputKeyboardEvent = HandleQueryOutputKeyboardEvent.bind(window);
+    debugger
+  });
+
+  describe("when a range is selected", function () {
     beforeEach(function () {
-      event = {
-        shiftKey: false,
-        ctrlKey: false,
-        metaKey: false,
-        which: -1,
-        keyCode: -1,
-        preventDefault: jasmine.createSpy('preventDefault')
-      };
-
-      var data = [['', '0,0-cell-content', '0,1-cell-content'],
-        ['', '1,0-cell-content', '1,1-cell-content'],
-        ['', '2,0-cell-content', '2,1-cell-content']];
-      var columnDefinitions = [{name: 'checkboxColumn'}, {pos: 1, name: 'firstColumn'}, {
-        pos: 2,
-        name: 'secondColumn'
-      }];
-      grid = new Slick.Grid($('<div></div>'), data, columnDefinitions);
-      grid.setSelectionModel(new XCellSelectionModel());
-
-      slickEvent = {
-        grid: grid
-      };
-
-      view = {};
-      spyOn(clipboard, 'copyTextToClipboard');
+      grid.getSelectionModel().setSelectedRanges([
+        RangeSelectionHelper.rangeForRow(grid, 0),
+        RangeSelectionHelper.rangeForRow(grid, 2),
+      ]);
     });
 
-    describe("when a range is selected", function () {
+    describe("pressing Command + C", function () {
       beforeEach(function () {
-        grid.getSelectionModel().setSelectedRanges([
-          RangeSelectionHelper.rangeForRow(grid, 0),
-          RangeSelectionHelper.rangeForRow(grid, 2),
-        ]);
+        event.metaKey = true;
+        event.keyCode = 67;
       });
 
-      describe("pressing Command + C", function () {
-        beforeEach(function () {
-          event.metaKey = true;
-          event.keyCode = 67;
-        });
-
-        it("copies the cell content to the clipboard", function () {
-          handleQueryOutputKeyboardEvent(event, slickEvent);
+      it("copies the cell content to the clipboard", function () {
+        handleQueryOutputKeyboardEvent(event, slickEvent);
 
-          expect(clipboard.copyTextToClipboard).toHaveBeenCalledWith("'0,0-cell-content','0,1-cell-content'\n'2,0-cell-content','2,1-cell-content'");
-        });
+        expect(clipboard.copyTextToClipboard).toHaveBeenCalledWith("'0,0-cell-content','0,1-cell-content'\n'2,0-cell-content','2,1-cell-content'");
       });
+    });
 
-      describe("pressing Ctrl + C", function () {
-        beforeEach(function () {
-          event.ctrlKey = true;
-          event.keyCode = 67;
-        });
+    describe("pressing Ctrl + C", function () {
+      beforeEach(function () {
+        event.ctrlKey = true;
+        event.keyCode = 67;
+      });
 
-        it("copies the cell content to the clipboard", function () {
-          handleQueryOutputKeyboardEvent(event, slickEvent);
+      it("copies the cell content to the clipboard", function () {
+        handleQueryOutputKeyboardEvent(event, slickEvent);
 
-          expect(clipboard.copyTextToClipboard).toHaveBeenCalledWith("'0,0-cell-content','0,1-cell-content'\n'2,0-cell-content','2,1-cell-content'");
-        });
+        expect(clipboard.copyTextToClipboard).toHaveBeenCalledWith("'0,0-cell-content','0,1-cell-content'\n'2,0-cell-content','2,1-cell-content'");
       });
+    });
 
-      describe("pressing Command + A", function () {
-        beforeEach(function () {
-          event.metaKey = true;
-          event.keyCode = 65;
-        });
+    describe("pressing Command + A", function () {
+      beforeEach(function () {
+        event.metaKey = true;
+        event.keyCode = 65;
+      });
 
-        it("selects the entire grid to ranges", function () {
-          handleQueryOutputKeyboardEvent(event, slickEvent);
+      it("selects the entire grid to ranges", function () {
+        handleQueryOutputKeyboardEvent(event, slickEvent);
 
-          expect(RangeSelectionHelper.isEntireGridSelected(grid)).toBeTruthy();
-          expect(grid.getSelectionModel().getSelectedRanges().length).toBe(1);
-        });
+        expect(RangeSelectionHelper.isEntireGridSelected(grid)).toBeTruthy();
+        expect(grid.getSelectionModel().getSelectedRanges().length).toBe(1);
       });
+    });
 
-      describe("pressing Ctrl + A", function () {
-        beforeEach(function () {
-          event.ctrlKey = true;
-          event.keyCode = 65;
-        });
+    describe("pressing Ctrl + A", function () {
+      beforeEach(function () {
+        event.ctrlKey = true;
+        event.keyCode = 65;
+      });
 
-        it("selects the entire grid to ranges", function () {
-          handleQueryOutputKeyboardEvent(event, slickEvent);
+      it("selects the entire grid to ranges", function () {
+        handleQueryOutputKeyboardEvent(event, slickEvent);
 
-          expect(RangeSelectionHelper.isEntireGridSelected(grid)).toBeTruthy();
-          expect(grid.getSelectionModel().getSelectedRanges().length).toBe(1);
-        });
+        expect(RangeSelectionHelper.isEntireGridSelected(grid)).toBeTruthy();
+        expect(grid.getSelectionModel().getSelectedRanges().length).toBe(1);
       });
     });
+  });
 
-    describe("when no ranges are selected", function () {
-      describe("pressing Command + A", function () {
-        beforeEach(function () {
-          event.metaKey = true;
-          event.keyCode = 65;
-        });
+  describe("when no ranges are selected", function () {
+    describe("pressing Command + A", function () {
+      beforeEach(function () {
+        event.metaKey = true;
+        event.keyCode = 65;
+      });
 
-        it("selects the entire grid to ranges", function () {
-          handleQueryOutputKeyboardEvent(event, slickEvent);
+      it("selects the entire grid to ranges", function () {
+        handleQueryOutputKeyboardEvent(event, slickEvent);
 
-          expect(RangeSelectionHelper.isEntireGridSelected(grid)).toBeTruthy();
-          expect(grid.getSelectionModel().getSelectedRanges().length).toBe(1);
-        });
+        expect(RangeSelectionHelper.isEntireGridSelected(grid)).toBeTruthy();
+        expect(grid.getSelectionModel().getSelectedRanges().length).toBe(1);
       });
+    });
 
-      describe("pressing Ctrl + A", function () {
-        beforeEach(function () {
-          event.ctrlKey = true;
-          event.keyCode = 65;
-        });
+    describe("pressing Ctrl + A", function () {
+      beforeEach(function () {
+        event.ctrlKey = true;
+        event.keyCode = 65;
+      });
 
-        it("selects the entire grid to ranges", function () {
-          handleQueryOutputKeyboardEvent(event, slickEvent);
+      it("selects the entire grid to ranges", function () {
+        handleQueryOutputKeyboardEvent(event, slickEvent);
 
-          expect(RangeSelectionHelper.isEntireGridSelected(grid)).toBeTruthy();
-          expect(grid.getSelectionModel().getSelectedRanges().length).toBe(1);
-        });
+        expect(RangeSelectionHelper.isEntireGridSelected(grid)).toBeTruthy();
+        expect(grid.getSelectionModel().getSelectedRanges().length).toBe(1);
       });
     });
   });
-});
\ No newline at end of file
+});
diff --git a/web/regression/javascript/test-main.js b/web/regression/javascript/test-main.js
deleted file mode 100644
index 4c5f09a0..00000000
--- a/web/regression/javascript/test-main.js
+++ /dev/null
@@ -1,139 +0,0 @@
-//////////////////////////////////////////////////////////////////////////
-//
-// pgAdmin 4 - PostgreSQL Tools
-//
-// Copyright (C) 2013 - 2017, The pgAdmin Development Team
-// This software is released under the PostgreSQL Licence
-//
-//////////////////////////////////////////////////////////////////////////
-
-var allTestFiles = [];
-var TEST_REGEXP = /(spec|test)\.js$/i;
-
-// Get a list of all the test files to include
-Object.keys(window.__karma__.files).forEach(function (file) {
-  if (TEST_REGEXP.test(file)) {
-    // Normalize paths to RequireJS module names.
-    // If you require sub-dependencies of test files to be loaded as-is (requiring file extension)
-    // then do not normalize the paths
-    var normalizedTestModule = file.replace(/^\/base\/|\.js$/g, '');
-    allTestFiles.push(normalizedTestModule)
-  }
-});
-
-var sourcesDir = '/base/pgadmin/static/';
-require.config({
-  // Karma serves files under /base, which is the basePath from your config file
-  baseUrl: '/base',
-
-  paths: {
-    'pgadmin': sourcesDir + 'js/pgadmin',
-    'alertify': sourcesDir + 'vendor/alertifyjs/alertify',
-    'jquery': sourcesDir + 'vendor/jquery/jquery-1.11.2',
-    'jquery.ui': sourcesDir + 'vendor/jquery-ui/jquery-ui-1.11.3',
-    'jquery.event.drag': sourcesDir + 'vendor/jquery-ui/jquery.event.drag-2.2',
-    'underscore': sourcesDir + 'vendor/underscore/underscore',
-    'underscore.string': sourcesDir + 'vendor/underscore/underscore.string',
-    'slickgrid': sourcesDir + 'vendor/slickgrid/slick.core',
-    'slickgrid/slick.grid': sourcesDir + 'vendor/slickgrid/slick.grid',
-    'translations': '/base/regression/javascript/fake_translations',
-    'pgadmin.browser.endpoints': '/base/regression/javascript/fake_endpoints',
-    'sources': sourcesDir + 'js',
-    'browser': '/base/pgadmin/browser/static/js'
-  },
-
-  shim: {
-    'underscore': {
-      exports: '_'
-    },
-    "slickgrid": {
-      "deps": [
-        'jquery', "jquery.ui", "jquery.event.drag"
-      ],
-      "exports": 'window.Slick'
-    },
-    "slickgrid/slick.grid": {
-      "deps": [
-        'jquery', "jquery.ui", "jquery.event.drag", "slickgrid"
-      ],
-      "exports": 'window.Slick.Grid'
-    },
-    "sources/slickgrid/pgslick.cellrangedecorator": {
-      "deps": [
-        "jquery"
-      ],
-      "exports": 'PGRowRangeDecorator'
-    },
-    "sources/slickgrid/pgslick.cellrangeselector": {
-      "deps": [
-        "jquery", "sources/slickgrid/pgslick.cellrangedecorator"
-      ],
-      "exports": 'PGCellRangeSelector'
-    },
-    "sources/selection/xcell_selection_model": {
-      "deps": [
-        "jquery", "sources/slickgrid/pgslick.cellrangeselector"
-      ],
-      "exports": 'XCellSelectionModel'
-    },
-    "backbone": {
-      "deps": ['underscore', 'jquery'],
-      "exports": 'Backbone'
-    },
-    "backbone.paginator": {
-      "deps": ['underscore', 'jquery', 'backbone']
-    },
-    "bootstrap": {
-      "deps": ['jquery'],
-    },
-    "backgrid": {
-      "deps": ['backform'],
-      "exports": 'Backgrid',
-    },
-    "backgrid.select.all": {
-      "deps": ['backgrid']
-    },
-    "backgrid.paginator": {
-      "deps": ['backgrid', 'backbone.paginator']
-    },
-    "backgrid.filter": {
-      "deps": ['backgrid']
-    },
-    "backgrid.sizeable.columns": {
-      "deps": ['backgrid']
-    },
-    "bootstrap.switch": {
-      "deps": ['jquery', 'bootstrap'],
-      "exports": 'jQuery.fn.bootstrapSwitch'
-    },
-    "select2": {
-      "deps": ['jquery'],
-      "exports": 'jQuery.fn.select2'
-    },
-    "bootstrap.datepicker": {
-      "deps": ['jquery', 'bootstrap'],
-      "exports": 'jQuery.fn.datepicker'
-    },
-    "bootstrap.datetimepicker": {
-      "deps": ['jquery', 'bootstrap', 'moment'],
-      "exports": 'jQuery.fn.datetimepicker'
-    },
-    "pgadmin.backgrid": {
-      "deps": ["backgrid", "bootstrap.datetimepicker", "bootstrap.switch"],
-    },
-    "pgadmin.backform": {
-      "deps": ['backform', "pgadmin.backgrid", "select2"],
-    },
-    "jquery.event.drag": {
-      "deps": ['jquery'], "exports": 'jQuery.fn.drag'
-    },
-    "jquery.ui": {"deps": ['jquery']}
-  },
-
-  // dynamically load all test files
-  deps: allTestFiles,
-
-  // we have to kickoff jasmine, as it is asynchronous
-  callback: window.__karma__.start
-});
-
diff --git a/web/regression/requirements.txt b/web/regression/requirements.txt
index 5959a183..f44953d5 100644
--- a/web/regression/requirements.txt
+++ b/web/regression/requirements.txt
@@ -4,6 +4,7 @@ testscenarios==0.5.0
 testtools==2.0.0
 traceback2==1.4.0
 unittest2==1.1.0
+mock~=2.0.0
 
 # Leave this at the end because there is a bug where the '--install-option' is applied to all subsequent requirements
 chromedriver_installer==0.0.6 --install-option='--chromedriver-version=2.29'
diff --git a/web/webpack.config.js b/web/webpack.config.js
new file mode 100644
index 00000000..91586592
--- /dev/null
+++ b/web/webpack.config.js
@@ -0,0 +1,29 @@
+/* eslint-env node */
+
+module.exports = {
+  context: __dirname + '/pgadmin/static/jsx',
+  entry: './components.jsx',
+  output: {
+    libraryTarget: 'amd',
+    path: __dirname + '/pgadmin/static/js/generated',
+    filename: 'reactComponents.js',
+  },
+
+  module: {
+    rules: [{
+      test: /\.jsx?$/,
+      exclude: /node_modules/,
+      use: {
+        loader: 'babel-loader',
+        options: {
+          presets: ['es2015', 'react'],
+        },
+      },
+    },
+    ],
+  },
+
+  resolve: {
+    extensions: ['.js', '.jsx'],
+  },
+};
\ No newline at end of file
diff --git a/web/webpack.test.config.js b/web/webpack.test.config.js
new file mode 100644
index 00000000..226020e9
--- /dev/null
+++ b/web/webpack.test.config.js
@@ -0,0 +1,71 @@
+/* eslint-env node */
+const path = require('path');
+const webpack = require('webpack');
+
+const sourcesDir = path.resolve(__dirname, 'pgadmin/static');
+const regressionDir = path.resolve(__dirname, 'regression');
+
+module.exports = {
+  plugins: [
+    new webpack.ProvidePlugin({
+      $: 'jquery',
+      jQuery: 'jquery',
+      _: 'underscore',
+      'underscore.string': 'underscore.string',
+    }),
+  ],
+
+  module: {
+    rules: [
+      {
+        test: /\.jsx?$/,
+        exclude: [/node_modules/, /vendor/],
+        use: {
+          loader: 'babel-loader',
+          options: {
+            presets: ['es2015'],
+          },
+        },
+      },
+      {
+        test: /.*slickgrid\/slick\.(?!core)*/,
+        loader: 'imports-loader?' +
+        'jquery.ui' +
+        ',jquery.event.drag' +
+        ',slickgrid',
+      }, {
+        test: /.*slickgrid\/plugins\/slick\.rowselectionmodel/,
+        loader: 'imports-loader?' +
+        'jquery.ui' +
+        ',jquery.event.drag' +
+        ',slickgrid' +
+        '!exports-loader?' +
+        'Slick.RowSelectionModel',
+      }, {
+        test: /.*slickgrid\/slick\.core.*/,
+        loader: 'imports-loader?' +
+        'jquery.ui' +
+        ',jquery.event.drag' +
+        '!exports-loader?' +
+        'Slick',
+      }],
+  },
+
+  resolve: {
+    alias: {
+      'alertify': sourcesDir + '/vendor/alertifyjs/alertify',
+      'jquery': sourcesDir + '/vendor/jquery/jquery-1.11.2',
+      'jquery.ui': sourcesDir + '/vendor/jquery-ui/jquery-ui-1.11.3',
+      'jquery.event.drag': sourcesDir + '/vendor/jquery-ui/jquery.event.drag-2.2',
+      'sources': sourcesDir + '/js',
+      'underscore.string': sourcesDir + '/vendor/underscore/underscore.string',
+      'translations': regressionDir + '/javascript/fake_translations',
+      'pgadmin.browser.endpoints': regressionDir + '/javascript/fake_endpoints',
+      'slickgrid': sourcesDir + '/vendor/slickgrid/slick.core',
+      'slickgrid.grid': sourcesDir + '/vendor/slickgrid/slick.grid',
+      'slickgrid.rowselectionmodel': sourcesDir + '/vendor/slickgrid/plugins/slick.rowselectionmodel',
+      'browser': path.resolve(__dirname, 'pgadmin/browser/static/js'),
+      'pgadmin': sourcesDir + '/js/pgadmin',
+    },
+  },
+};
diff --git a/web/yarn.lock b/web/yarn.lock
index e69de29b..bfd9171d 100644
--- a/web/yarn.lock
+++ b/web/yarn.lock
@@ -0,0 +1,4526 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+JSONStream@^1.0.3:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.1.tgz#707f761e01dae9e16f1bcf93703b78c70966579a"
+  dependencies:
+    jsonparse "^1.2.0"
+    through ">=2.2.7 <3"
+
+abbrev@1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f"
+
[email protected]:
+  version "1.3.3"
+  resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca"
+  dependencies:
+    mime-types "~2.1.11"
+    negotiator "0.6.1"
+
+acorn-dynamic-import@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4"
+  dependencies:
+    acorn "^4.0.3"
+
+acorn-jsx@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b"
+  dependencies:
+    acorn "^3.0.4"
+
+acorn@^3.0.4:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
+
+acorn@^4.0.3, acorn@^4.0.4:
+  version "4.0.13"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
+
+acorn@^5.0.1:
+  version "5.0.3"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.0.3.tgz#c460df08491463f028ccb82eab3730bf01087b3d"
+
[email protected]:
+  version "0.8.2"
+  resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f"
+
+ajv-keywords@^1.0.0, ajv-keywords@^1.1.1:
+  version "1.5.1"
+  resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c"
+
+ajv@^4.7.0, ajv@^4.9.1:
+  version "4.11.8"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536"
+  dependencies:
+    co "^4.6.0"
+    json-stable-stringify "^1.0.1"
+
+align-text@^0.1.1, align-text@^0.1.3:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
+  dependencies:
+    kind-of "^3.0.2"
+    longest "^1.0.1"
+    repeat-string "^1.5.2"
+
+amdefine@>=0.0.4:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
+
+ansi-escapes@^1.1.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e"
+
+ansi-regex@^2.0.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+
+ansi-styles@^2.2.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+
+anymatch@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507"
+  dependencies:
+    arrify "^1.0.0"
+    micromatch "^2.1.5"
+
+aproba@^1.0.3:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.2.tgz#45c6629094de4e96f693ef7eab74ae079c240fc1"
+
+are-we-there-yet@~1.1.2:
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d"
+  dependencies:
+    delegates "^1.0.0"
+    readable-stream "^2.0.6"
+
+argparse@^1.0.7:
+  version "1.0.9"
+  resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86"
+  dependencies:
+    sprintf-js "~1.0.2"
+
+arr-diff@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf"
+  dependencies:
+    arr-flatten "^1.0.1"
+
+arr-flatten@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.3.tgz#a274ed85ac08849b6bd7847c4580745dc51adfb1"
+
+array-filter@~0.0.0:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec"
+
+array-map@~0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662"
+
+array-reduce@~0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b"
+
+array-slice@^0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5"
+
+array-union@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
+  dependencies:
+    array-uniq "^1.0.1"
+
+array-uniq@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
+
+array-unique@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53"
+
+array.prototype.find@^2.0.1:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/array.prototype.find/-/array.prototype.find-2.0.4.tgz#556a5c5362c08648323ddaeb9de9d14bc1864c90"
+  dependencies:
+    define-properties "^1.1.2"
+    es-abstract "^1.7.0"
+
[email protected]:
+  version "0.0.6"
+  resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca"
+
+arrify@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
+
+asap@~2.0.3:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.5.tgz#522765b50c3510490e52d7dcfe085ef9ba96958f"
+
+asn1.js@^4.0.0:
+  version "4.9.1"
+  resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.9.1.tgz#48ba240b45a9280e94748990ba597d216617fd40"
+  dependencies:
+    bn.js "^4.0.0"
+    inherits "^2.0.1"
+    minimalistic-assert "^1.0.0"
+
+asn1@~0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86"
+
[email protected], assert-plus@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
+
+assert-plus@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234"
+
+assert@^1.1.1, assert@^1.4.0:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91"
+  dependencies:
+    util "0.10.3"
+
+astw@^2.0.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/astw/-/astw-2.2.0.tgz#7bd41784d32493987aeb239b6b4e1c57a873b917"
+  dependencies:
+    acorn "^4.0.3"
+
+async-each@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
+
+async@^2.1.2:
+  version "2.4.1"
+  resolved "https://registry.yarnpkg.com/async/-/async-2.4.1.tgz#62a56b279c98a11d0987096a01cc3eeb8eb7bbd7"
+  dependencies:
+    lodash "^4.14.0"
+
+async@~0.9.0:
+  version "0.9.2"
+  resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d"
+
+asynckit@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+
+aws-sign2@~0.6.0:
+  version "0.6.0"
+  resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f"
+
+aws4@^1.2.1:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e"
+
+axios@^0.16.1:
+  version "0.16.2"
+  resolved "https://registry.yarnpkg.com/axios/-/axios-0.16.2.tgz#ba4f92f17167dfbab40983785454b9ac149c3c6d"
+  dependencies:
+    follow-redirects "^1.2.3"
+    is-buffer "^1.1.5"
+
+babel-code-frame@^6.16.0, babel-code-frame@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4"
+  dependencies:
+    chalk "^1.1.0"
+    esutils "^2.0.2"
+    js-tokens "^3.0.0"
+
+babel-core@^6.0.0, babel-core@^6.0.14, babel-core@^6.24.1, babel-core@~6.24.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.24.1.tgz#8c428564dce1e1f41fb337ec34f4c3b022b5ad83"
+  dependencies:
+    babel-code-frame "^6.22.0"
+    babel-generator "^6.24.1"
+    babel-helpers "^6.24.1"
+    babel-messages "^6.23.0"
+    babel-register "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+    babylon "^6.11.0"
+    convert-source-map "^1.1.0"
+    debug "^2.1.1"
+    json5 "^0.5.0"
+    lodash "^4.2.0"
+    minimatch "^3.0.2"
+    path-is-absolute "^1.0.0"
+    private "^0.1.6"
+    slash "^1.0.0"
+    source-map "^0.5.0"
+
+babel-generator@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.24.1.tgz#e715f486c58ded25649d888944d52aa07c5d9497"
+  dependencies:
+    babel-messages "^6.23.0"
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+    detect-indent "^4.0.0"
+    jsesc "^1.3.0"
+    lodash "^4.2.0"
+    source-map "^0.5.0"
+    trim-right "^1.0.1"
+
+babel-helper-builder-react-jsx@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.24.1.tgz#0ad7917e33c8d751e646daca4e77cc19377d2cbc"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+    esutils "^2.0.0"
+
+babel-helper-call-delegate@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d"
+  dependencies:
+    babel-helper-hoist-variables "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-helper-define-map@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz#7a9747f258d8947d32d515f6aa1c7bd02204a080"
+  dependencies:
+    babel-helper-function-name "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+    lodash "^4.2.0"
+
+babel-helper-function-name@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9"
+  dependencies:
+    babel-helper-get-function-arity "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-helper-get-function-arity@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-helper-hoist-variables@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-helper-optimise-call-expression@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-helper-regex@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz#d36e22fab1008d79d88648e32116868128456ce8"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+    lodash "^4.2.0"
+
+babel-helper-replace-supers@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a"
+  dependencies:
+    babel-helper-optimise-call-expression "^6.24.1"
+    babel-messages "^6.23.0"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-helpers@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+
+babel-loader@~6.4.1:
+  version "6.4.1"
+  resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-6.4.1.tgz#0b34112d5b0748a8dcdbf51acf6f9bd42d50b8ca"
+  dependencies:
+    find-cache-dir "^0.1.1"
+    loader-utils "^0.2.16"
+    mkdirp "^0.5.1"
+    object-assign "^4.0.1"
+
+babel-messages@^6.23.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-check-es2015-constants@^6.22.0, babel-plugin-check-es2015-constants@^6.3.13:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-syntax-flow@^6.18.0:
+  version "6.18.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d"
+
+babel-plugin-syntax-jsx@^6.3.13, babel-plugin-syntax-jsx@^6.8.0:
+  version "6.18.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946"
+
+babel-plugin-transform-es2015-arrow-functions@^6.22.0, babel-plugin-transform-es2015-arrow-functions@^6.3.13:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoped-functions@^6.22.0, babel-plugin-transform-es2015-block-scoped-functions@^6.3.13:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoping@^6.24.1, babel-plugin-transform-es2015-block-scoping@^6.9.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz#76c295dc3a4741b1665adfd3167215dcff32a576"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+    lodash "^4.2.0"
+
+babel-plugin-transform-es2015-classes@^6.24.1, babel-plugin-transform-es2015-classes@^6.9.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db"
+  dependencies:
+    babel-helper-define-map "^6.24.1"
+    babel-helper-function-name "^6.24.1"
+    babel-helper-optimise-call-expression "^6.24.1"
+    babel-helper-replace-supers "^6.24.1"
+    babel-messages "^6.23.0"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-computed-properties@^6.24.1, babel-plugin-transform-es2015-computed-properties@^6.3.13:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-destructuring@^6.22.0, babel-plugin-transform-es2015-destructuring@^6.9.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-duplicate-keys@^6.24.1, babel-plugin-transform-es2015-duplicate-keys@^6.6.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-for-of@^6.22.0, babel-plugin-transform-es2015-for-of@^6.6.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-function-name@^6.24.1, babel-plugin-transform-es2015-function-name@^6.9.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b"
+  dependencies:
+    babel-helper-function-name "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-literals@^6.22.0, babel-plugin-transform-es2015-literals@^6.3.13:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-modules-amd@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154"
+  dependencies:
+    babel-plugin-transform-es2015-modules-commonjs "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-modules-commonjs@^6.24.1, babel-plugin-transform-es2015-modules-commonjs@^6.6.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz#d3e310b40ef664a36622200097c6d440298f2bfe"
+  dependencies:
+    babel-plugin-transform-strict-mode "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-modules-systemjs@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23"
+  dependencies:
+    babel-helper-hoist-variables "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-modules-umd@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468"
+  dependencies:
+    babel-plugin-transform-es2015-modules-amd "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-object-super@^6.24.1, babel-plugin-transform-es2015-object-super@^6.3.13:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d"
+  dependencies:
+    babel-helper-replace-supers "^6.24.1"
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-parameters@^6.24.1, babel-plugin-transform-es2015-parameters@^6.9.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b"
+  dependencies:
+    babel-helper-call-delegate "^6.24.1"
+    babel-helper-get-function-arity "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-template "^6.24.1"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-shorthand-properties@^6.24.1, babel-plugin-transform-es2015-shorthand-properties@^6.3.13:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-spread@^6.22.0, babel-plugin-transform-es2015-spread@^6.3.13:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-sticky-regex@^6.24.1, babel-plugin-transform-es2015-sticky-regex@^6.3.13:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc"
+  dependencies:
+    babel-helper-regex "^6.24.1"
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-template-literals@^6.22.0, babel-plugin-transform-es2015-template-literals@^6.6.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-typeof-symbol@^6.22.0, babel-plugin-transform-es2015-typeof-symbol@^6.6.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-unicode-regex@^6.24.1, babel-plugin-transform-es2015-unicode-regex@^6.3.13:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9"
+  dependencies:
+    babel-helper-regex "^6.24.1"
+    babel-runtime "^6.22.0"
+    regexpu-core "^2.0.0"
+
+babel-plugin-transform-flow-strip-types@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf"
+  dependencies:
+    babel-plugin-syntax-flow "^6.18.0"
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-react-display-name@^6.23.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.23.0.tgz#4398910c358441dc4cef18787264d0412ed36b37"
+  dependencies:
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-react-jsx-self@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz#df6d80a9da2612a121e6ddd7558bcbecf06e636e"
+  dependencies:
+    babel-plugin-syntax-jsx "^6.8.0"
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-react-jsx-source@^6.22.0:
+  version "6.22.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz#66ac12153f5cd2d17b3c19268f4bf0197f44ecd6"
+  dependencies:
+    babel-plugin-syntax-jsx "^6.8.0"
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-react-jsx@^6.23.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3"
+  dependencies:
+    babel-helper-builder-react-jsx "^6.24.1"
+    babel-plugin-syntax-jsx "^6.8.0"
+    babel-runtime "^6.22.0"
+
+babel-plugin-transform-regenerator@^6.24.1, babel-plugin-transform-regenerator@^6.9.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz#b8da305ad43c3c99b4848e4fe4037b770d23c418"
+  dependencies:
+    regenerator-transform "0.9.11"
+
+babel-plugin-transform-strict-mode@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+
+babel-polyfill@^6.23.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d"
+  dependencies:
+    babel-runtime "^6.22.0"
+    core-js "^2.4.0"
+    regenerator-runtime "^0.10.0"
+
+babel-preset-es2015-without-strict@~0.0.4:
+  version "0.0.4"
+  resolved "https://registry.yarnpkg.com/babel-preset-es2015-without-strict/-/babel-preset-es2015-without-strict-0.0.4.tgz#88c9f36e79d4762c58347b1a698a07c35b6bda5d"
+  dependencies:
+    babel-plugin-check-es2015-constants "^6.3.13"
+    babel-plugin-transform-es2015-arrow-functions "^6.3.13"
+    babel-plugin-transform-es2015-block-scoped-functions "^6.3.13"
+    babel-plugin-transform-es2015-block-scoping "^6.9.0"
+    babel-plugin-transform-es2015-classes "^6.9.0"
+    babel-plugin-transform-es2015-computed-properties "^6.3.13"
+    babel-plugin-transform-es2015-destructuring "^6.9.0"
+    babel-plugin-transform-es2015-duplicate-keys "^6.6.0"
+    babel-plugin-transform-es2015-for-of "^6.6.0"
+    babel-plugin-transform-es2015-function-name "^6.9.0"
+    babel-plugin-transform-es2015-literals "^6.3.13"
+    babel-plugin-transform-es2015-modules-commonjs "^6.6.0"
+    babel-plugin-transform-es2015-object-super "^6.3.13"
+    babel-plugin-transform-es2015-parameters "^6.9.0"
+    babel-plugin-transform-es2015-shorthand-properties "^6.3.13"
+    babel-plugin-transform-es2015-spread "^6.3.13"
+    babel-plugin-transform-es2015-sticky-regex "^6.3.13"
+    babel-plugin-transform-es2015-template-literals "^6.6.0"
+    babel-plugin-transform-es2015-typeof-symbol "^6.6.0"
+    babel-plugin-transform-es2015-unicode-regex "^6.3.13"
+    babel-plugin-transform-regenerator "^6.9.0"
+
+babel-preset-es2015@~6.24.0:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939"
+  dependencies:
+    babel-plugin-check-es2015-constants "^6.22.0"
+    babel-plugin-transform-es2015-arrow-functions "^6.22.0"
+    babel-plugin-transform-es2015-block-scoped-functions "^6.22.0"
+    babel-plugin-transform-es2015-block-scoping "^6.24.1"
+    babel-plugin-transform-es2015-classes "^6.24.1"
+    babel-plugin-transform-es2015-computed-properties "^6.24.1"
+    babel-plugin-transform-es2015-destructuring "^6.22.0"
+    babel-plugin-transform-es2015-duplicate-keys "^6.24.1"
+    babel-plugin-transform-es2015-for-of "^6.22.0"
+    babel-plugin-transform-es2015-function-name "^6.24.1"
+    babel-plugin-transform-es2015-literals "^6.22.0"
+    babel-plugin-transform-es2015-modules-amd "^6.24.1"
+    babel-plugin-transform-es2015-modules-commonjs "^6.24.1"
+    babel-plugin-transform-es2015-modules-systemjs "^6.24.1"
+    babel-plugin-transform-es2015-modules-umd "^6.24.1"
+    babel-plugin-transform-es2015-object-super "^6.24.1"
+    babel-plugin-transform-es2015-parameters "^6.24.1"
+    babel-plugin-transform-es2015-shorthand-properties "^6.24.1"
+    babel-plugin-transform-es2015-spread "^6.22.0"
+    babel-plugin-transform-es2015-sticky-regex "^6.24.1"
+    babel-plugin-transform-es2015-template-literals "^6.22.0"
+    babel-plugin-transform-es2015-typeof-symbol "^6.22.0"
+    babel-plugin-transform-es2015-unicode-regex "^6.24.1"
+    babel-plugin-transform-regenerator "^6.24.1"
+
+babel-preset-flow@^6.23.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz#e71218887085ae9a24b5be4169affb599816c49d"
+  dependencies:
+    babel-plugin-transform-flow-strip-types "^6.22.0"
+
+babel-preset-react@~6.23.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.23.0.tgz#eb7cee4de98a3f94502c28565332da9819455195"
+  dependencies:
+    babel-plugin-syntax-jsx "^6.3.13"
+    babel-plugin-transform-react-display-name "^6.23.0"
+    babel-plugin-transform-react-jsx "^6.23.0"
+    babel-plugin-transform-react-jsx-self "^6.22.0"
+    babel-plugin-transform-react-jsx-source "^6.22.0"
+    babel-preset-flow "^6.23.0"
+
+babel-register@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.1.tgz#7e10e13a2f71065bdfad5a1787ba45bca6ded75f"
+  dependencies:
+    babel-core "^6.24.1"
+    babel-runtime "^6.22.0"
+    core-js "^2.4.0"
+    home-or-tmp "^2.0.0"
+    lodash "^4.2.0"
+    mkdirp "^0.5.1"
+    source-map-support "^0.4.2"
+
+babel-runtime@^6.18.0, babel-runtime@^6.22.0:
+  version "6.23.0"
+  resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b"
+  dependencies:
+    core-js "^2.4.0"
+    regenerator-runtime "^0.10.0"
+
+babel-template@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.24.1.tgz#04ae514f1f93b3a2537f2a0f60a5a45fb8308333"
+  dependencies:
+    babel-runtime "^6.22.0"
+    babel-traverse "^6.24.1"
+    babel-types "^6.24.1"
+    babylon "^6.11.0"
+    lodash "^4.2.0"
+
+babel-traverse@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.24.1.tgz#ab36673fd356f9a0948659e7b338d5feadb31695"
+  dependencies:
+    babel-code-frame "^6.22.0"
+    babel-messages "^6.23.0"
+    babel-runtime "^6.22.0"
+    babel-types "^6.24.1"
+    babylon "^6.15.0"
+    debug "^2.2.0"
+    globals "^9.0.0"
+    invariant "^2.2.0"
+    lodash "^4.2.0"
+
+babel-types@^6.19.0, babel-types@^6.24.1:
+  version "6.24.1"
+  resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.24.1.tgz#a136879dc15b3606bda0d90c1fc74304c2ff0975"
+  dependencies:
+    babel-runtime "^6.22.0"
+    esutils "^2.0.2"
+    lodash "^4.2.0"
+    to-fast-properties "^1.0.1"
+
+babelify@~7.3.0:
+  version "7.3.0"
+  resolved "https://registry.yarnpkg.com/babelify/-/babelify-7.3.0.tgz#aa56aede7067fd7bd549666ee16dc285087e88e5"
+  dependencies:
+    babel-core "^6.0.14"
+    object-assign "^4.0.0"
+
+babylon@^6.11.0, babylon@^6.15.0:
+  version "6.17.2"
+  resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.2.tgz#201d25ef5f892c41bae49488b08db0dd476e9f5c"
+
[email protected]:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947"
+
+balanced-match@^0.4.1:
+  version "0.4.2"
+  resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838"
+
[email protected]:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8"
+
+base64-js@^1.0.2:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.0.tgz#a39992d723584811982be5e290bb6a53d86700f1"
+
[email protected]:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6"
+
+bcrypt-pbkdf@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d"
+  dependencies:
+    tweetnacl "^0.14.3"
+
+better-assert@~1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522"
+  dependencies:
+    callsite "1.0.0"
+
+big.js@^3.1.3:
+  version "3.1.3"
+  resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.1.3.tgz#4cada2193652eb3ca9ec8e55c9015669c9806978"
+
+binary-extensions@^1.0.0:
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774"
+
[email protected]:
+  version "0.0.4"
+  resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921"
+
+block-stream@*:
+  version "0.0.9"
+  resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a"
+  dependencies:
+    inherits "~2.0.0"
+
+bluebird@^3.3.0:
+  version "3.5.0"
+  resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c"
+
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
+  version "4.11.6"
+  resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215"
+
+body-parser@^1.16.1:
+  version "1.17.2"
+  resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.17.2.tgz#f8892abc8f9e627d42aedafbca66bf5ab99104ee"
+  dependencies:
+    bytes "2.4.0"
+    content-type "~1.0.2"
+    debug "2.6.7"
+    depd "~1.1.0"
+    http-errors "~1.6.1"
+    iconv-lite "0.4.15"
+    on-finished "~2.3.0"
+    qs "6.4.0"
+    raw-body "~2.2.0"
+    type-is "~1.6.15"
+
+boolbase@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
+
[email protected]:
+  version "2.10.1"
+  resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f"
+  dependencies:
+    hoek "2.x.x"
+
+brace-expansion@^1.1.7:
+  version "1.1.7"
+  resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.7.tgz#3effc3c50e000531fb720eaff80f0ae8ef23cf59"
+  dependencies:
+    balanced-match "^0.4.1"
+    concat-map "0.0.1"
+
+braces@^0.1.2:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/braces/-/braces-0.1.5.tgz#c085711085291d8b75fdd74eab0f8597280711e6"
+  dependencies:
+    expand-range "^0.1.0"
+
+braces@^1.8.2:
+  version "1.8.5"
+  resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7"
+  dependencies:
+    expand-range "^1.8.1"
+    preserve "^0.2.0"
+    repeat-element "^1.1.2"
+
+brorand@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+
+browser-pack@^6.0.1:
+  version "6.0.2"
+  resolved "https://registry.yarnpkg.com/browser-pack/-/browser-pack-6.0.2.tgz#f86cd6cef4f5300c8e63e07a4d512f65fbff4531"
+  dependencies:
+    JSONStream "^1.0.3"
+    combine-source-map "~0.7.1"
+    defined "^1.0.0"
+    through2 "^2.0.0"
+    umd "^3.0.0"
+
+browser-resolve@^1.11.0, browser-resolve@^1.7.0:
+  version "1.11.2"
+  resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce"
+  dependencies:
+    resolve "1.1.7"
+
+browserify-aes@^1.0.0, browserify-aes@^1.0.4:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.0.6.tgz#5e7725dbdef1fd5930d4ebab48567ce451c48a0a"
+  dependencies:
+    buffer-xor "^1.0.2"
+    cipher-base "^1.0.0"
+    create-hash "^1.1.0"
+    evp_bytestokey "^1.0.0"
+    inherits "^2.0.1"
+
+browserify-cipher@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.0.tgz#9988244874bf5ed4e28da95666dcd66ac8fc363a"
+  dependencies:
+    browserify-aes "^1.0.4"
+    browserify-des "^1.0.0"
+    evp_bytestokey "^1.0.0"
+
+browserify-des@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.0.tgz#daa277717470922ed2fe18594118a175439721dd"
+  dependencies:
+    cipher-base "^1.0.1"
+    des.js "^1.0.0"
+    inherits "^2.0.1"
+
+browserify-rsa@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524"
+  dependencies:
+    bn.js "^4.1.0"
+    randombytes "^2.0.1"
+
+browserify-sign@^4.0.0:
+  version "4.0.4"
+  resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298"
+  dependencies:
+    bn.js "^4.1.1"
+    browserify-rsa "^4.0.0"
+    create-hash "^1.1.0"
+    create-hmac "^1.1.2"
+    elliptic "^6.0.0"
+    inherits "^2.0.1"
+    parse-asn1 "^5.0.0"
+
+browserify-zlib@^0.1.4, browserify-zlib@~0.1.2:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d"
+  dependencies:
+    pako "~0.2.0"
+
+browserify@^14.0.0, browserify@~14.1.0:
+  version "14.1.0"
+  resolved "https://registry.yarnpkg.com/browserify/-/browserify-14.1.0.tgz#0508cc1e7bf4c152312c2fa523e676c0b0b92311"
+  dependencies:
+    JSONStream "^1.0.3"
+    assert "^1.4.0"
+    browser-pack "^6.0.1"
+    browser-resolve "^1.11.0"
+    browserify-zlib "~0.1.2"
+    buffer "^5.0.2"
+    cached-path-relative "^1.0.0"
+    concat-stream "~1.5.1"
+    console-browserify "^1.1.0"
+    constants-browserify "~1.0.0"
+    crypto-browserify "^3.0.0"
+    defined "^1.0.0"
+    deps-sort "^2.0.0"
+    domain-browser "~1.1.0"
+    duplexer2 "~0.1.2"
+    events "~1.1.0"
+    glob "^7.1.0"
+    has "^1.0.0"
+    htmlescape "^1.1.0"
+    https-browserify "~0.0.0"
+    inherits "~2.0.1"
+    insert-module-globals "^7.0.0"
+    labeled-stream-splicer "^2.0.0"
+    module-deps "^4.0.8"
+    os-browserify "~0.1.1"
+    parents "^1.0.1"
+    path-browserify "~0.0.0"
+    process "~0.11.0"
+    punycode "^1.3.2"
+    querystring-es3 "~0.2.0"
+    read-only-stream "^2.0.0"
+    readable-stream "^2.0.2"
+    resolve "^1.1.4"
+    shasum "^1.0.0"
+    shell-quote "^1.6.1"
+    stream-browserify "^2.0.0"
+    stream-http "^2.0.0"
+    string_decoder "~0.10.0"
+    subarg "^1.0.0"
+    syntax-error "^1.1.1"
+    through2 "^2.0.0"
+    timers-browserify "^1.0.1"
+    tty-browserify "~0.0.0"
+    url "~0.11.0"
+    util "~0.10.1"
+    vm-browserify "~0.0.1"
+    xtend "^4.0.0"
+
+buffer-xor@^1.0.2:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+
+buffer@^4.3.0:
+  version "4.9.1"
+  resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298"
+  dependencies:
+    base64-js "^1.0.2"
+    ieee754 "^1.1.4"
+    isarray "^1.0.0"
+
+buffer@^5.0.2:
+  version "5.0.6"
+  resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.0.6.tgz#2ea669f7eec0b6eda05b08f8b5ff661b28573588"
+  dependencies:
+    base64-js "^1.0.2"
+    ieee754 "^1.1.4"
+
+builtin-modules@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
+
+builtin-status-codes@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
+
[email protected]:
+  version "2.4.0"
+  resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339"
+
+cached-path-relative@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/cached-path-relative/-/cached-path-relative-1.0.1.tgz#d09c4b52800aa4c078e2dd81a869aac90d2e54e7"
+
+caller-path@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f"
+  dependencies:
+    callsites "^0.2.0"
+
[email protected]:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20"
+
+callsites@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca"
+
+camelcase@^1.0.2:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
+
+camelcase@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
+
+caseless@~0.11.0:
+  version "0.11.0"
+  resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7"
+
+caseless@~0.12.0:
+  version "0.12.0"
+  resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
+
+center-align@^0.1.1:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad"
+  dependencies:
+    align-text "^0.1.3"
+    lazy-cache "^1.0.3"
+
+chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1, chalk@^1.1.3:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+  dependencies:
+    ansi-styles "^2.2.1"
+    escape-string-regexp "^1.0.2"
+    has-ansi "^2.0.0"
+    strip-ansi "^3.0.0"
+    supports-color "^2.0.0"
+
+cheerio@^0.22.0:
+  version "0.22.0"
+  resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.22.0.tgz#a9baa860a3f9b595a6b81b1a86873121ed3a269e"
+  dependencies:
+    css-select "~1.2.0"
+    dom-serializer "~0.1.0"
+    entities "~1.1.1"
+    htmlparser2 "^3.9.1"
+    lodash.assignin "^4.0.9"
+    lodash.bind "^4.1.4"
+    lodash.defaults "^4.0.1"
+    lodash.filter "^4.4.0"
+    lodash.flatten "^4.2.0"
+    lodash.foreach "^4.3.0"
+    lodash.map "^4.4.0"
+    lodash.merge "^4.4.0"
+    lodash.pick "^4.2.1"
+    lodash.reduce "^4.4.0"
+    lodash.reject "^4.4.0"
+    lodash.some "^4.4.0"
+
+chokidar@^1.0.0, chokidar@^1.4.1, chokidar@^1.4.3:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468"
+  dependencies:
+    anymatch "^1.3.0"
+    async-each "^1.0.0"
+    glob-parent "^2.0.0"
+    inherits "^2.0.1"
+    is-binary-path "^1.0.0"
+    is-glob "^2.0.0"
+    path-is-absolute "^1.0.0"
+    readdirp "^2.0.0"
+  optionalDependencies:
+    fsevents "^1.0.0"
+
+cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.3.tgz#eeabf194419ce900da3018c207d212f2a6df0a07"
+  dependencies:
+    inherits "^2.0.1"
+
+circular-json@^0.3.1:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.1.tgz#be8b36aefccde8b3ca7aa2d6afc07a37242c0d2d"
+
+cli-cursor@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987"
+  dependencies:
+    restore-cursor "^1.0.1"
+
+cli-width@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a"
+
+cliui@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1"
+  dependencies:
+    center-align "^0.1.1"
+    right-align "^0.1.1"
+    wordwrap "0.0.2"
+
+cliui@^3.2.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
+  dependencies:
+    string-width "^1.0.1"
+    strip-ansi "^3.0.1"
+    wrap-ansi "^2.0.0"
+
+co@^4.6.0:
+  version "4.6.0"
+  resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
+
+code-point-at@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+
+colors@^1.1.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63"
+
+combine-lists@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/combine-lists/-/combine-lists-1.0.1.tgz#458c07e09e0d900fc28b70a3fec2dacd1d2cb7f6"
+  dependencies:
+    lodash "^4.5.0"
+
+combine-source-map@~0.7.1:
+  version "0.7.2"
+  resolved "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.7.2.tgz#0870312856b307a87cc4ac486f3a9a62aeccc09e"
+  dependencies:
+    convert-source-map "~1.1.0"
+    inline-source-map "~0.6.0"
+    lodash.memoize "~3.0.3"
+    source-map "~0.5.3"
+
+combined-stream@^1.0.5, combined-stream@~1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009"
+  dependencies:
+    delayed-stream "~1.0.0"
+
+commander@^2.9.0:
+  version "2.9.0"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4"
+  dependencies:
+    graceful-readlink ">= 1.0.0"
+
+commondir@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
+
[email protected]:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1"
+
[email protected]:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3"
+
[email protected]:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
+
[email protected]:
+  version "0.0.3"
+  resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143"
+
[email protected]:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+
[email protected]:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.0.tgz#53f7d43c51c5e43f81c8fdd03321c631be68d611"
+  dependencies:
+    inherits "~2.0.1"
+    readable-stream "~2.0.0"
+    typedarray "~0.0.5"
+
+concat-stream@^1.5.2:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7"
+  dependencies:
+    inherits "^2.0.3"
+    readable-stream "^2.2.2"
+    typedarray "^0.0.6"
+
+concat-stream@~1.5.0, concat-stream@~1.5.1:
+  version "1.5.2"
+  resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.5.2.tgz#708978624d856af41a5a741defdd261da752c266"
+  dependencies:
+    inherits "~2.0.1"
+    readable-stream "~2.0.0"
+    typedarray "~0.0.5"
+
+connect@^3.6.0:
+  version "3.6.2"
+  resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.2.tgz#694e8d20681bfe490282c8ab886be98f09f42fe7"
+  dependencies:
+    debug "2.6.7"
+    finalhandler "1.0.3"
+    parseurl "~1.3.1"
+    utils-merge "1.0.0"
+
+console-browserify@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10"
+  dependencies:
+    date-now "^0.1.4"
+
+console-control-strings@^1.0.0, console-control-strings@~1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
+
+constants-browserify@^1.0.0, constants-browserify@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
+
+content-type@~1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed"
+
+convert-source-map@^1.1.0, convert-source-map@^1.1.3:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5"
+
+convert-source-map@~1.1.0:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3bf3673888e204699860"
+
[email protected]:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
+
+core-js@^1.0.0:
+  version "1.2.7"
+  resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636"
+
+core-js@^2.2.0, core-js@^2.4.0:
+  version "2.4.1"
+  resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e"
+
+core-util-is@~1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+
+create-ecdh@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d"
+  dependencies:
+    bn.js "^4.1.0"
+    elliptic "^6.0.0"
+
+create-hash@^1.1.0, create-hash@^1.1.1, create-hash@^1.1.2:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd"
+  dependencies:
+    cipher-base "^1.0.1"
+    inherits "^2.0.1"
+    ripemd160 "^2.0.0"
+    sha.js "^2.4.0"
+
+create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
+  version "1.1.6"
+  resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.6.tgz#acb9e221a4e17bdb076e90657c42b93e3726cf06"
+  dependencies:
+    cipher-base "^1.0.3"
+    create-hash "^1.1.0"
+    inherits "^2.0.1"
+    ripemd160 "^2.0.0"
+    safe-buffer "^5.0.1"
+    sha.js "^2.4.8"
+
[email protected]:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8"
+  dependencies:
+    boom "2.x.x"
+
+crypto-browserify@^3.0.0, crypto-browserify@^3.11.0:
+  version "3.11.0"
+  resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.11.0.tgz#3652a0906ab9b2a7e0c3ce66a408e957a2485522"
+  dependencies:
+    browserify-cipher "^1.0.0"
+    browserify-sign "^4.0.0"
+    create-ecdh "^4.0.0"
+    create-hash "^1.1.0"
+    create-hmac "^1.1.0"
+    diffie-hellman "^5.0.0"
+    inherits "^2.0.1"
+    pbkdf2 "^3.0.3"
+    public-encrypt "^4.0.0"
+    randombytes "^2.0.0"
+
+css-select@~1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858"
+  dependencies:
+    boolbase "~1.0.0"
+    css-what "2.1"
+    domutils "1.5.1"
+    nth-check "~1.0.1"
+
[email protected]:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd"
+
+custom-event@~1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425"
+
+d@1:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f"
+  dependencies:
+    es5-ext "^0.10.9"
+
+dashdash@^1.12.0:
+  version "1.14.1"
+  resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
+  dependencies:
+    assert-plus "^1.0.0"
+
+date-now@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
+
[email protected]:
+  version "0.7.4"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39"
+
[email protected]:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da"
+  dependencies:
+    ms "0.7.1"
+
[email protected]:
+  version "2.3.3"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c"
+  dependencies:
+    ms "0.7.2"
+
[email protected]:
+  version "2.6.7"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.7.tgz#92bad1f6d05bbb6bba22cca88bcd0ec894c2861e"
+  dependencies:
+    ms "2.0.0"
+
+debug@^2.1.1, debug@^2.2.0, debug@^2.4.5:
+  version "2.6.8"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc"
+  dependencies:
+    ms "2.0.0"
+
+decamelize@^1.0.0, decamelize@^1.1.1:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+
+deep-extend@~0.4.0:
+  version "0.4.2"
+  resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f"
+
+deep-is@~0.1.3:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
+
+define-properties@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94"
+  dependencies:
+    foreach "^2.0.5"
+    object-keys "^1.0.8"
+
+defined@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
+
+del@^2.0.2:
+  version "2.2.2"
+  resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8"
+  dependencies:
+    globby "^5.0.0"
+    is-path-cwd "^1.0.0"
+    is-path-in-cwd "^1.0.0"
+    object-assign "^4.0.1"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+    rimraf "^2.2.8"
+
+delayed-stream@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+
+delegates@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
+
[email protected], depd@~1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3"
+
+deps-sort@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/deps-sort/-/deps-sort-2.0.0.tgz#091724902e84658260eb910748cccd1af6e21fb5"
+  dependencies:
+    JSONStream "^1.0.3"
+    shasum "^1.0.0"
+    subarg "^1.0.0"
+    through2 "^2.0.0"
+
+des.js@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc"
+  dependencies:
+    inherits "^2.0.1"
+    minimalistic-assert "^1.0.0"
+
+detect-indent@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
+  dependencies:
+    repeating "^2.0.0"
+
+detective@^4.0.0:
+  version "4.5.0"
+  resolved "https://registry.yarnpkg.com/detective/-/detective-4.5.0.tgz#6e5a8c6b26e6c7a254b1c6b6d7490d98ec91edd1"
+  dependencies:
+    acorn "^4.0.3"
+    defined "^1.0.0"
+
+di@^0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c"
+
+diffie-hellman@^5.0.0:
+  version "5.0.2"
+  resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e"
+  dependencies:
+    bn.js "^4.1.0"
+    miller-rabin "^4.0.0"
+    randombytes "^2.0.0"
+
+doctrine@^1.2.2:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa"
+  dependencies:
+    esutils "^2.0.2"
+    isarray "^1.0.0"
+
+doctrine@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.0.tgz#c73d8d2909d22291e1a007a395804da8b665fe63"
+  dependencies:
+    esutils "^2.0.2"
+    isarray "^1.0.0"
+
+dom-serialize@^2.2.0:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b"
+  dependencies:
+    custom-event "~1.0.0"
+    ent "~2.2.0"
+    extend "^3.0.0"
+    void-elements "^2.0.0"
+
+dom-serializer@0, dom-serializer@~0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82"
+  dependencies:
+    domelementtype "~1.1.1"
+    entities "~1.1.1"
+
+domain-browser@^1.1.1, domain-browser@~1.1.0:
+  version "1.1.7"
+  resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc"
+
+domelementtype@1, domelementtype@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2"
+
+domelementtype@~1.1.1:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b"
+
+domhandler@^2.3.0:
+  version "2.4.1"
+  resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.1.tgz#892e47000a99be55bbf3774ffea0561d8879c259"
+  dependencies:
+    domelementtype "1"
+
[email protected], domutils@^1.5.1:
+  version "1.5.1"
+  resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf"
+  dependencies:
+    dom-serializer "0"
+    domelementtype "1"
+
+duplexer2@^0.1.2, duplexer2@~0.1.0, duplexer2@~0.1.2:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1"
+  dependencies:
+    readable-stream "^2.0.2"
+
+ecc-jsbn@~0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505"
+  dependencies:
+    jsbn "~0.1.0"
+
[email protected]:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+
+elliptic@^6.0.0:
+  version "6.4.0"
+  resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df"
+  dependencies:
+    bn.js "^4.4.0"
+    brorand "^1.0.1"
+    hash.js "^1.0.0"
+    hmac-drbg "^1.0.0"
+    inherits "^2.0.1"
+    minimalistic-assert "^1.0.0"
+    minimalistic-crypto-utils "^1.0.0"
+
+emojis-list@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
+
+encodeurl@~1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20"
+
+encoding@^0.1.11:
+  version "0.1.12"
+  resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb"
+  dependencies:
+    iconv-lite "~0.4.13"
+
[email protected]:
+  version "1.8.3"
+  resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.3.tgz#1798ed93451246453d4c6f635d7a201fe940d5ab"
+  dependencies:
+    component-emitter "1.2.1"
+    component-inherit "0.0.3"
+    debug "2.3.3"
+    engine.io-parser "1.3.2"
+    has-cors "1.1.0"
+    indexof "0.0.1"
+    parsejson "0.0.3"
+    parseqs "0.0.5"
+    parseuri "0.0.5"
+    ws "1.1.2"
+    xmlhttprequest-ssl "1.5.3"
+    yeast "0.1.2"
+
[email protected]:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-1.3.2.tgz#937b079f0007d0893ec56d46cb220b8cb435220a"
+  dependencies:
+    after "0.8.2"
+    arraybuffer.slice "0.0.6"
+    base64-arraybuffer "0.1.5"
+    blob "0.0.4"
+    has-binary "0.1.7"
+    wtf-8 "1.0.0"
+
[email protected]:
+  version "1.8.3"
+  resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-1.8.3.tgz#8de7f97895d20d39b85f88eeee777b2bd42b13d4"
+  dependencies:
+    accepts "1.3.3"
+    base64id "1.0.0"
+    cookie "0.3.1"
+    debug "2.3.3"
+    engine.io-parser "1.3.2"
+    ws "1.1.2"
+
+enhanced-resolve@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.1.0.tgz#9f4b626f577245edcf4b2ad83d86e17f4f421dec"
+  dependencies:
+    graceful-fs "^4.1.2"
+    memory-fs "^0.4.0"
+    object-assign "^4.0.1"
+    tapable "^0.2.5"
+
+ent@~2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d"
+
+entities@^1.1.1, entities@~1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0"
+
+enzyme@~2.8.2:
+  version "2.8.2"
+  resolved "https://registry.yarnpkg.com/enzyme/-/enzyme-2.8.2.tgz#6c8bcb05012abc4aa4bc3213fb23780b9b5b1714"
+  dependencies:
+    cheerio "^0.22.0"
+    function.prototype.name "^1.0.0"
+    is-subset "^0.1.1"
+    lodash "^4.17.2"
+    object-is "^1.0.1"
+    object.assign "^4.0.4"
+    object.entries "^1.0.3"
+    object.values "^1.0.3"
+    prop-types "^15.5.4"
+    uuid "^2.0.3"
+
+errno@^0.1.3:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d"
+  dependencies:
+    prr "~0.0.0"
+
+error-ex@^1.2.0:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc"
+  dependencies:
+    is-arrayish "^0.2.1"
+
+es-abstract@^1.6.1, es-abstract@^1.7.0:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.7.0.tgz#dfade774e01bfcd97f96180298c449c8623fb94c"
+  dependencies:
+    es-to-primitive "^1.1.1"
+    function-bind "^1.1.0"
+    is-callable "^1.1.3"
+    is-regex "^1.0.3"
+
+es-to-primitive@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d"
+  dependencies:
+    is-callable "^1.1.1"
+    is-date-object "^1.0.1"
+    is-symbol "^1.0.1"
+
+es5-ext@^0.10.14, es5-ext@^0.10.9, es5-ext@~0.10.14:
+  version "0.10.23"
+  resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.23.tgz#7578b51be974207a5487821b56538c224e4e7b38"
+  dependencies:
+    es6-iterator "2"
+    es6-symbol "~3.1"
+
+es6-iterator@2, es6-iterator@^2.0.1, es6-iterator@~2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.1.tgz#8e319c9f0453bf575d374940a655920e59ca5512"
+  dependencies:
+    d "1"
+    es5-ext "^0.10.14"
+    es6-symbol "^3.1"
+
+es6-map@^0.1.3:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0"
+  dependencies:
+    d "1"
+    es5-ext "~0.10.14"
+    es6-iterator "~2.0.1"
+    es6-set "~0.1.5"
+    es6-symbol "~3.1.1"
+    event-emitter "~0.3.5"
+
+es6-promise@~4.0.3:
+  version "4.0.5"
+  resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.0.5.tgz#7882f30adde5b240ccfa7f7d78c548330951ae42"
+
+es6-set@~0.1.5:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1"
+  dependencies:
+    d "1"
+    es5-ext "~0.10.14"
+    es6-iterator "~2.0.1"
+    es6-symbol "3.1.1"
+    event-emitter "~0.3.5"
+
[email protected], es6-symbol@^3.1, es6-symbol@^3.1.1, es6-symbol@~3.1, es6-symbol@~3.1.1:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77"
+  dependencies:
+    d "1"
+    es5-ext "~0.10.14"
+
+es6-weak-map@^2.0.1:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f"
+  dependencies:
+    d "1"
+    es5-ext "^0.10.14"
+    es6-iterator "^2.0.1"
+    es6-symbol "^3.1.1"
+
+escape-html@~1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+
+escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+
+escope@^3.6.0:
+  version "3.6.0"
+  resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3"
+  dependencies:
+    es6-map "^0.1.3"
+    es6-weak-map "^2.0.1"
+    esrecurse "^4.1.0"
+    estraverse "^4.1.1"
+
+eslint-plugin-react@^6.10.3:
+  version "6.10.3"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-6.10.3.tgz#c5435beb06774e12c7db2f6abaddcbf900cd3f78"
+  dependencies:
+    array.prototype.find "^2.0.1"
+    doctrine "^1.2.2"
+    has "^1.0.1"
+    jsx-ast-utils "^1.3.4"
+    object.assign "^4.0.4"
+
+eslint@^3.19.0:
+  version "3.19.0"
+  resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.19.0.tgz#c8fc6201c7f40dd08941b87c085767386a679acc"
+  dependencies:
+    babel-code-frame "^6.16.0"
+    chalk "^1.1.3"
+    concat-stream "^1.5.2"
+    debug "^2.1.1"
+    doctrine "^2.0.0"
+    escope "^3.6.0"
+    espree "^3.4.0"
+    esquery "^1.0.0"
+    estraverse "^4.2.0"
+    esutils "^2.0.2"
+    file-entry-cache "^2.0.0"
+    glob "^7.0.3"
+    globals "^9.14.0"
+    ignore "^3.2.0"
+    imurmurhash "^0.1.4"
+    inquirer "^0.12.0"
+    is-my-json-valid "^2.10.0"
+    is-resolvable "^1.0.0"
+    js-yaml "^3.5.1"
+    json-stable-stringify "^1.0.0"
+    levn "^0.3.0"
+    lodash "^4.0.0"
+    mkdirp "^0.5.0"
+    natural-compare "^1.4.0"
+    optionator "^0.8.2"
+    path-is-inside "^1.0.1"
+    pluralize "^1.2.1"
+    progress "^1.1.8"
+    require-uncached "^1.0.2"
+    shelljs "^0.7.5"
+    strip-bom "^3.0.0"
+    strip-json-comments "~2.0.1"
+    table "^3.7.8"
+    text-table "~0.2.0"
+    user-home "^2.0.0"
+
+espree@^3.4.0:
+  version "3.4.3"
+  resolved "https://registry.yarnpkg.com/espree/-/espree-3.4.3.tgz#2910b5ccd49ce893c2ffffaab4fd8b3a31b82374"
+  dependencies:
+    acorn "^5.0.1"
+    acorn-jsx "^3.0.0"
+
+esprima@^3.1.1:
+  version "3.1.3"
+  resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
+
+esquery@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa"
+  dependencies:
+    estraverse "^4.0.0"
+
+esrecurse@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.1.0.tgz#4713b6536adf7f2ac4f327d559e7756bff648220"
+  dependencies:
+    estraverse "~4.1.0"
+    object-assign "^4.0.1"
+
+estraverse@^4.0.0, estraverse@^4.1.1, estraverse@^4.2.0:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
+
+estraverse@~4.1.0:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.1.1.tgz#f6caca728933a850ef90661d0e17982ba47111a2"
+
+esutils@^2.0.0, esutils@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
+
+event-emitter@~0.3.5:
+  version "0.3.5"
+  resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
+  dependencies:
+    d "1"
+    es5-ext "~0.10.14"
+
[email protected]:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508"
+
+events@^1.0.0, events@~1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"
+
+evp_bytestokey@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz#497b66ad9fef65cd7c08a6180824ba1476b66e53"
+  dependencies:
+    create-hash "^1.1.1"
+
+exit-hook@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8"
+
+expand-braces@^0.1.1:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/expand-braces/-/expand-braces-0.1.2.tgz#488b1d1d2451cb3d3a6b192cfc030f44c5855fea"
+  dependencies:
+    array-slice "^0.2.3"
+    array-unique "^0.2.1"
+    braces "^0.1.2"
+
+expand-brackets@^0.1.4:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
+  dependencies:
+    is-posix-bracket "^0.1.0"
+
+expand-range@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-0.1.1.tgz#4cb8eda0993ca56fa4f41fc42f3cbb4ccadff044"
+  dependencies:
+    is-number "^0.1.1"
+    repeat-string "^0.2.2"
+
+expand-range@^1.8.1:
+  version "1.8.2"
+  resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337"
+  dependencies:
+    fill-range "^2.1.0"
+
+exports-loader@~0.6.4:
+  version "0.6.4"
+  resolved "https://registry.yarnpkg.com/exports-loader/-/exports-loader-0.6.4.tgz#d70fc6121975b35fc12830cf52754be2740fc886"
+  dependencies:
+    loader-utils "^1.0.2"
+    source-map "0.5.x"
+
+extend@^3.0.0, extend@~3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444"
+
+extglob@^0.3.1:
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1"
+  dependencies:
+    is-extglob "^1.0.0"
+
+extract-zip@~1.5.0:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.5.0.tgz#92ccf6d81ef70a9fa4c1747114ccef6d8688a6c4"
+  dependencies:
+    concat-stream "1.5.0"
+    debug "0.7.4"
+    mkdirp "0.5.0"
+    yauzl "2.4.1"
+
[email protected]:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550"
+
+fast-levenshtein@~2.0.4:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+
+fbjs@^0.8.1, fbjs@^0.8.4, fbjs@^0.8.9:
+  version "0.8.12"
+  resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.12.tgz#10b5d92f76d45575fd63a217d4ea02bea2f8ed04"
+  dependencies:
+    core-js "^1.0.0"
+    isomorphic-fetch "^2.1.1"
+    loose-envify "^1.0.0"
+    object-assign "^4.1.0"
+    promise "^7.1.1"
+    setimmediate "^1.0.5"
+    ua-parser-js "^0.7.9"
+
+fd-slicer@~1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65"
+  dependencies:
+    pend "~1.2.0"
+
+figures@^1.3.5:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e"
+  dependencies:
+    escape-string-regexp "^1.0.5"
+    object-assign "^4.1.0"
+
+file-entry-cache@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361"
+  dependencies:
+    flat-cache "^1.2.1"
+    object-assign "^4.0.1"
+
+filename-regex@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"
+
+fill-range@^2.1.0:
+  version "2.2.3"
+  resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723"
+  dependencies:
+    is-number "^2.1.0"
+    isobject "^2.0.0"
+    randomatic "^1.1.3"
+    repeat-element "^1.1.2"
+    repeat-string "^1.5.2"
+
[email protected]:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.3.tgz#ef47e77950e999780e86022a560e3217e0d0cc89"
+  dependencies:
+    debug "2.6.7"
+    encodeurl "~1.0.1"
+    escape-html "~1.0.3"
+    on-finished "~2.3.0"
+    parseurl "~1.3.1"
+    statuses "~1.3.1"
+    unpipe "~1.0.0"
+
+find-cache-dir@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9"
+  dependencies:
+    commondir "^1.0.1"
+    mkdirp "^0.5.1"
+    pkg-dir "^1.0.0"
+
+find-up@^1.0.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
+  dependencies:
+    path-exists "^2.0.0"
+    pinkie-promise "^2.0.0"
+
+flat-cache@^1.2.1:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.2.2.tgz#fa86714e72c21db88601761ecf2f555d1abc6b96"
+  dependencies:
+    circular-json "^0.3.1"
+    del "^2.0.2"
+    graceful-fs "^4.1.2"
+    write "^0.2.1"
+
+follow-redirects@^1.2.3:
+  version "1.2.3"
+  resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.2.3.tgz#01abaeca85e3609837d9fcda3167a7e42fdaca21"
+  dependencies:
+    debug "^2.4.5"
+
+for-in@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+
+for-own@^0.1.4:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce"
+  dependencies:
+    for-in "^1.0.1"
+
+foreach@^2.0.5:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99"
+
+forever-agent@~0.6.1:
+  version "0.6.1"
+  resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
+
+form-data@~2.1.1:
+  version "2.1.4"
+  resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1"
+  dependencies:
+    asynckit "^0.4.0"
+    combined-stream "^1.0.5"
+    mime-types "^2.1.12"
+
+fs-extra@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950"
+  dependencies:
+    graceful-fs "^4.1.2"
+    jsonfile "^2.1.0"
+    klaw "^1.0.0"
+
+fs.realpath@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+
+fsevents@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.1.tgz#f19fd28f43eeaf761680e519a203c4d0b3d31aff"
+  dependencies:
+    nan "^2.3.0"
+    node-pre-gyp "^0.6.29"
+
+fstream-ignore@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105"
+  dependencies:
+    fstream "^1.0.0"
+    inherits "2"
+    minimatch "^3.0.0"
+
+fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2:
+  version "1.0.11"
+  resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171"
+  dependencies:
+    graceful-fs "^4.1.2"
+    inherits "~2.0.0"
+    mkdirp ">=0.5 0"
+    rimraf "2"
+
+function-bind@^1.0.2, function-bind@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771"
+
+function.prototype.name@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.0.0.tgz#5f523ca64e491a5f95aba80cc1e391080a14482e"
+  dependencies:
+    define-properties "^1.1.2"
+    function-bind "^1.1.0"
+    is-callable "^1.1.2"
+
+gauge@~2.7.3:
+  version "2.7.4"
+  resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
+  dependencies:
+    aproba "^1.0.3"
+    console-control-strings "^1.0.0"
+    has-unicode "^2.0.0"
+    object-assign "^4.1.0"
+    signal-exit "^3.0.0"
+    string-width "^1.0.1"
+    strip-ansi "^3.0.1"
+    wide-align "^1.1.0"
+
+generate-function@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74"
+
+generate-object-property@^1.1.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0"
+  dependencies:
+    is-property "^1.0.0"
+
+get-caller-file@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5"
+
+getpass@^0.1.1:
+  version "0.1.7"
+  resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
+  dependencies:
+    assert-plus "^1.0.0"
+
+glob-base@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"
+  dependencies:
+    glob-parent "^2.0.0"
+    is-glob "^2.0.0"
+
+glob-parent@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28"
+  dependencies:
+    is-glob "^2.0.0"
+
+glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.0, glob@^7.1.1:
+  version "7.1.2"
+  resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
+  dependencies:
+    fs.realpath "^1.0.0"
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "^3.0.4"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
+globals@^9.0.0, globals@^9.14.0:
+  version "9.18.0"
+  resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
+
+globby@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d"
+  dependencies:
+    array-union "^1.0.1"
+    arrify "^1.0.0"
+    glob "^7.0.3"
+    object-assign "^4.0.1"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+
+graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9:
+  version "4.1.11"
+  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
+
+"graceful-readlink@>= 1.0.0":
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
+
+har-schema@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e"
+
+har-validator@~2.0.6:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d"
+  dependencies:
+    chalk "^1.1.1"
+    commander "^2.9.0"
+    is-my-json-valid "^2.12.4"
+    pinkie-promise "^2.0.0"
+
+har-validator@~4.2.1:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a"
+  dependencies:
+    ajv "^4.9.1"
+    har-schema "^1.0.5"
+
+has-ansi@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+  dependencies:
+    ansi-regex "^2.0.0"
+
[email protected]:
+  version "0.1.7"
+  resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.7.tgz#68e61eb16210c9545a0a5cce06a873912fe1e68c"
+  dependencies:
+    isarray "0.0.1"
+
[email protected]:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39"
+
+has-flag@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa"
+
+has-unicode@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
+
+has@^1.0.0, has@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28"
+  dependencies:
+    function-bind "^1.0.2"
+
+hash-base@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1"
+  dependencies:
+    inherits "^2.0.1"
+
+hash.js@^1.0.0, hash.js@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.0.3.tgz#1332ff00156c0a0ffdd8236013d07b77a0451573"
+  dependencies:
+    inherits "^2.0.1"
+
+hasha@~2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/hasha/-/hasha-2.2.0.tgz#78d7cbfc1e6d66303fe79837365984517b2f6ee1"
+  dependencies:
+    is-stream "^1.0.1"
+    pinkie-promise "^2.0.0"
+
+hat@^0.0.3:
+  version "0.0.3"
+  resolved "https://registry.yarnpkg.com/hat/-/hat-0.0.3.tgz#bb014a9e64b3788aed8005917413d4ff3d502d8a"
+
+hawk@~3.1.3:
+  version "3.1.3"
+  resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4"
+  dependencies:
+    boom "2.x.x"
+    cryptiles "2.x.x"
+    hoek "2.x.x"
+    sntp "1.x.x"
+
+hmac-drbg@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+  dependencies:
+    hash.js "^1.0.3"
+    minimalistic-assert "^1.0.0"
+    minimalistic-crypto-utils "^1.0.1"
+
[email protected]:
+  version "2.16.3"
+  resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed"
+
+home-or-tmp@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
+  dependencies:
+    os-homedir "^1.0.0"
+    os-tmpdir "^1.0.1"
+
+hosted-git-info@^2.1.4:
+  version "2.4.2"
+  resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.4.2.tgz#0076b9f46a270506ddbaaea56496897460612a67"
+
+htmlescape@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/htmlescape/-/htmlescape-1.1.1.tgz#3a03edc2214bca3b66424a3e7959349509cb0351"
+
+htmlparser2@^3.9.1:
+  version "3.9.2"
+  resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.9.2.tgz#1bdf87acca0f3f9e53fa4fcceb0f4b4cbb00b338"
+  dependencies:
+    domelementtype "^1.3.0"
+    domhandler "^2.3.0"
+    domutils "^1.5.1"
+    entities "^1.1.1"
+    inherits "^2.0.1"
+    readable-stream "^2.0.2"
+
+http-errors@~1.6.1:
+  version "1.6.1"
+  resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.1.tgz#5f8b8ed98aca545656bf572997387f904a722257"
+  dependencies:
+    depd "1.1.0"
+    inherits "2.0.3"
+    setprototypeof "1.0.3"
+    statuses ">= 1.3.1 < 2"
+
+http-proxy@^1.13.0:
+  version "1.16.2"
+  resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742"
+  dependencies:
+    eventemitter3 "1.x.x"
+    requires-port "1.x.x"
+
+http-signature@~1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf"
+  dependencies:
+    assert-plus "^0.2.0"
+    jsprim "^1.2.2"
+    sshpk "^1.7.0"
+
[email protected], https-browserify@~0.0.0:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82"
+
[email protected], iconv-lite@~0.4.13:
+  version "0.4.15"
+  resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb"
+
+ieee754@^1.1.4:
+  version "1.1.8"
+  resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4"
+
+ignore@^3.2.0:
+  version "3.3.3"
+  resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.3.tgz#432352e57accd87ab3110e82d3fea0e47812156d"
+
+"imports-loader@git+https://github.com/webpack-contrib/imports-loader.git#44d6f48463b256a17c1ba6fd9b5cc1449b4e379d":
+  version "0.7.1"
+  resolved "git+https://github.com/webpack-contrib/imports-loader.git#44d6f48463b256a17c1ba6fd9b5cc1449b4e379d"
+  dependencies:
+    loader-utils "^1.0.2"
+    source-map "^0.5.6"
+
+imurmurhash@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+
[email protected]:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
+
+inflight@^1.0.4:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+  dependencies:
+    once "^1.3.0"
+    wrappy "1"
+
+inherits@2, [email protected], inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+
[email protected]:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
+
+ini@~1.3.0:
+  version "1.3.4"
+  resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e"
+
+inline-source-map@~0.6.0:
+  version "0.6.2"
+  resolved "https://registry.yarnpkg.com/inline-source-map/-/inline-source-map-0.6.2.tgz#f9393471c18a79d1724f863fa38b586370ade2a5"
+  dependencies:
+    source-map "~0.5.3"
+
+inquirer@^0.12.0:
+  version "0.12.0"
+  resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e"
+  dependencies:
+    ansi-escapes "^1.1.0"
+    ansi-regex "^2.0.0"
+    chalk "^1.0.0"
+    cli-cursor "^1.0.1"
+    cli-width "^2.0.0"
+    figures "^1.3.5"
+    lodash "^4.3.0"
+    readline2 "^1.0.1"
+    run-async "^0.1.0"
+    rx-lite "^3.1.2"
+    string-width "^1.0.1"
+    strip-ansi "^3.0.0"
+    through "^2.3.6"
+
+insert-module-globals@^7.0.0:
+  version "7.0.1"
+  resolved "https://registry.yarnpkg.com/insert-module-globals/-/insert-module-globals-7.0.1.tgz#c03bf4e01cb086d5b5e5ace8ad0afe7889d638c3"
+  dependencies:
+    JSONStream "^1.0.3"
+    combine-source-map "~0.7.1"
+    concat-stream "~1.5.1"
+    is-buffer "^1.1.0"
+    lexical-scope "^1.2.0"
+    process "~0.11.0"
+    through2 "^2.0.0"
+    xtend "^4.0.0"
+
+interpret@^1.0.0:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.3.tgz#cbc35c62eeee73f19ab7b10a801511401afc0f90"
+
+invariant@^2.2.0:
+  version "2.2.2"
+  resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360"
+  dependencies:
+    loose-envify "^1.0.0"
+
+invert-kv@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
+
+is-arrayish@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+
+is-binary-path@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
+  dependencies:
+    binary-extensions "^1.0.0"
+
+is-buffer@^1.1.0, is-buffer@^1.1.5:
+  version "1.1.5"
+  resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc"
+
+is-builtin-module@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe"
+  dependencies:
+    builtin-modules "^1.0.0"
+
+is-callable@^1.1.1, is-callable@^1.1.2, is-callable@^1.1.3:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2"
+
+is-date-object@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16"
+
+is-dotfile@^1.0.0:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1"
+
+is-equal-shallow@^0.1.3:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534"
+  dependencies:
+    is-primitive "^2.0.0"
+
+is-extendable@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+
+is-extglob@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0"
+
+is-finite@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
+  dependencies:
+    number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
+  dependencies:
+    number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+
+is-glob@^2.0.0, is-glob@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
+  dependencies:
+    is-extglob "^1.0.0"
+
+is-my-json-valid@^2.10.0, is-my-json-valid@^2.12.4:
+  version "2.16.0"
+  resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz#f079dd9bfdae65ee2038aae8acbc86ab109e3693"
+  dependencies:
+    generate-function "^2.0.0"
+    generate-object-property "^1.1.0"
+    jsonpointer "^4.0.0"
+    xtend "^4.0.0"
+
+is-number@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/is-number/-/is-number-0.1.1.tgz#69a7af116963d47206ec9bd9b48a14216f1e3806"
+
+is-number@^2.0.2, is-number@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
+  dependencies:
+    kind-of "^3.0.2"
+
+is-path-cwd@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d"
+
+is-path-in-cwd@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc"
+  dependencies:
+    is-path-inside "^1.0.0"
+
+is-path-inside@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f"
+  dependencies:
+    path-is-inside "^1.0.1"
+
+is-posix-bracket@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
+
+is-primitive@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
+
+is-property@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84"
+
+is-regex@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491"
+  dependencies:
+    has "^1.0.1"
+
+is-resolvable@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62"
+  dependencies:
+    tryit "^1.0.1"
+
+is-stream@^1.0.1:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
+
+is-subset@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6"
+
+is-symbol@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572"
+
+is-typedarray@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+
+is-utf8@^0.2.0:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
+
[email protected], isarray@~0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
+
[email protected], isarray@^1.0.0, isarray@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+
+isbinaryfile@^3.0.0:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621"
+
+isexe@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+
+isobject@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+  dependencies:
+    isarray "1.0.0"
+
+isomorphic-fetch@^2.1.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9"
+  dependencies:
+    node-fetch "^1.0.1"
+    whatwg-fetch ">=0.10.0"
+
+isstream@~0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
+
+jasmine-core@~2.5.2:
+  version "2.5.2"
+  resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-2.5.2.tgz#6f61bd79061e27f43e6f9355e44b3c6cab6ff297"
+
+jodid25519@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967"
+  dependencies:
+    jsbn "~0.1.0"
+
+js-string-escape@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef"
+
+js-tokens@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7"
+
+js-yaml@^3.5.1:
+  version "3.8.4"
+  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.4.tgz#520b4564f86573ba96662af85a8cafa7b4b5a6f6"
+  dependencies:
+    argparse "^1.0.7"
+    esprima "^3.1.1"
+
+jsbn@~0.1.0:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
+
+jsesc@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
+
+jsesc@~0.5.0:
+  version "0.5.0"
+  resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
+
+json-loader@^0.5.4:
+  version "0.5.4"
+  resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.4.tgz#8baa1365a632f58a3c46d20175fc6002c96e37de"
+
[email protected]:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
+
+json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
+  dependencies:
+    jsonify "~0.0.0"
+
+json-stable-stringify@~0.0.0:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz#611c23e814db375527df851193db59dd2af27f45"
+  dependencies:
+    jsonify "~0.0.0"
+
+json-stringify-safe@~5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
+
[email protected]:
+  version "3.3.2"
+  resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1"
+
+json5@^0.5.0:
+  version "0.5.1"
+  resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
+
+jsonfile@^2.1.0:
+  version "2.4.0"
+  resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8"
+  optionalDependencies:
+    graceful-fs "^4.1.6"
+
+jsonify@~0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
+
+jsonparse@^1.2.0:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280"
+
+jsonpointer@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9"
+
+jsprim@^1.2.2:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.0.tgz#a3b87e40298d8c380552d8cc7628a0bb95a22918"
+  dependencies:
+    assert-plus "1.0.0"
+    extsprintf "1.0.2"
+    json-schema "0.2.3"
+    verror "1.3.6"
+
+jsx-ast-utils@^1.3.4:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz#3867213e8dd79bf1e8f2300c0cfc1efb182c0df1"
+
+karma-babel-preprocessor@^6.0.1:
+  version "6.0.1"
+  resolved "https://registry.yarnpkg.com/karma-babel-preprocessor/-/karma-babel-preprocessor-6.0.1.tgz#7ae1d3e64950dbe11f421b74040ab08fb5a66c21"
+  dependencies:
+    babel-core "^6.0.0"
+
+karma-browserify@~5.1.1:
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/karma-browserify/-/karma-browserify-5.1.1.tgz#f642d70d776d9ab3b73526c5732abcfea2400319"
+  dependencies:
+    convert-source-map "^1.1.3"
+    hat "^0.0.3"
+    js-string-escape "^1.0.0"
+    lodash "^3.10.1"
+    minimatch "^3.0.0"
+    os-shim "^0.1.3"
+
+karma-jasmine-html-reporter@~0.2.2:
+  version "0.2.2"
+  resolved "https://registry.yarnpkg.com/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-0.2.2.tgz#48a8e5ef18807617ee2b5e33c1194c35b439524c"
+  dependencies:
+    karma-jasmine "^1.0.2"
+
+karma-jasmine@^1.0.2, karma-jasmine@~1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/karma-jasmine/-/karma-jasmine-1.1.0.tgz#22e4c06bf9a182e5294d1f705e3733811b810acf"
+
+karma-phantomjs-launcher@~1.0.2:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/karma-phantomjs-launcher/-/karma-phantomjs-launcher-1.0.4.tgz#d23ca34801bda9863ad318e3bb4bd4062b13acd2"
+  dependencies:
+    lodash "^4.0.1"
+    phantomjs-prebuilt "^2.1.7"
+
+karma-requirejs@~1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/karma-requirejs/-/karma-requirejs-1.1.0.tgz#fddae2cb87d7ebc16fb0222893564d7fee578798"
+
+karma-sourcemap-loader@~0.3.7:
+  version "0.3.7"
+  resolved "https://registry.yarnpkg.com/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.7.tgz#91322c77f8f13d46fed062b042e1009d4c4505d8"
+  dependencies:
+    graceful-fs "^4.1.2"
+
+karma-webpack@~2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/karma-webpack/-/karma-webpack-2.0.3.tgz#39cebf5ca2580139b27f9ae69b78816b9c82fae6"
+  dependencies:
+    async "~0.9.0"
+    loader-utils "^0.2.5"
+    lodash "^3.8.0"
+    source-map "^0.1.41"
+    webpack-dev-middleware "^1.0.11"
+
+karma@~1.5.0:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/karma/-/karma-1.5.0.tgz#9c4c14f0400bef2c04c8e8e6bff59371025cc009"
+  dependencies:
+    bluebird "^3.3.0"
+    body-parser "^1.16.1"
+    chokidar "^1.4.1"
+    colors "^1.1.0"
+    combine-lists "^1.0.0"
+    connect "^3.6.0"
+    core-js "^2.2.0"
+    di "^0.0.1"
+    dom-serialize "^2.2.0"
+    expand-braces "^0.1.1"
+    glob "^7.1.1"
+    graceful-fs "^4.1.2"
+    http-proxy "^1.13.0"
+    isbinaryfile "^3.0.0"
+    lodash "^3.8.0"
+    log4js "^0.6.31"
+    mime "^1.3.4"
+    minimatch "^3.0.0"
+    optimist "^0.6.1"
+    qjobs "^1.1.4"
+    range-parser "^1.2.0"
+    rimraf "^2.6.0"
+    safe-buffer "^5.0.1"
+    socket.io "1.7.3"
+    source-map "^0.5.3"
+    tmp "0.0.31"
+    useragent "^2.1.12"
+
+kew@~0.7.0:
+  version "0.7.0"
+  resolved "https://registry.yarnpkg.com/kew/-/kew-0.7.0.tgz#79d93d2d33363d6fdd2970b335d9141ad591d79b"
+
+kind-of@^3.0.2:
+  version "3.2.2"
+  resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+  dependencies:
+    is-buffer "^1.1.5"
+
+klaw@^1.0.0:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439"
+  optionalDependencies:
+    graceful-fs "^4.1.9"
+
+labeled-stream-splicer@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/labeled-stream-splicer/-/labeled-stream-splicer-2.0.0.tgz#a52e1d138024c00b86b1c0c91f677918b8ae0a59"
+  dependencies:
+    inherits "^2.0.1"
+    isarray "~0.0.1"
+    stream-splicer "^2.0.0"
+
+lazy-cache@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
+
+lcid@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
+  dependencies:
+    invert-kv "^1.0.0"
+
+levn@^0.3.0, levn@~0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
+  dependencies:
+    prelude-ls "~1.1.2"
+    type-check "~0.3.2"
+
+lexical-scope@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/lexical-scope/-/lexical-scope-1.2.0.tgz#fcea5edc704a4b3a8796cdca419c3a0afaf22df4"
+  dependencies:
+    astw "^2.0.0"
+
+load-json-file@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
+  dependencies:
+    graceful-fs "^4.1.2"
+    parse-json "^2.2.0"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+    strip-bom "^2.0.0"
+
+loader-runner@^2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2"
+
+loader-utils@^0.2.16, loader-utils@^0.2.5:
+  version "0.2.17"
+  resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348"
+  dependencies:
+    big.js "^3.1.3"
+    emojis-list "^2.0.0"
+    json5 "^0.5.0"
+    object-assign "^4.0.1"
+
+loader-utils@^1.0.2:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd"
+  dependencies:
+    big.js "^3.1.3"
+    emojis-list "^2.0.0"
+    json5 "^0.5.0"
+
+lodash.assignin@^4.0.9:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2"
+
+lodash.bind@^4.1.4:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35"
+
+lodash.defaults@^4.0.1:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c"
+
+lodash.filter@^4.4.0:
+  version "4.6.0"
+  resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace"
+
+lodash.flatten@^4.2.0:
+  version "4.4.0"
+  resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f"
+
+lodash.foreach@^4.3.0:
+  version "4.5.0"
+  resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53"
+
+lodash.map@^4.4.0:
+  version "4.6.0"
+  resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3"
+
+lodash.memoize@~3.0.3:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-3.0.4.tgz#2dcbd2c287cbc0a55cc42328bd0c736150d53e3f"
+
+lodash.merge@^4.4.0:
+  version "4.6.0"
+  resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.0.tgz#69884ba144ac33fe699737a6086deffadd0f89c5"
+
+lodash.pick@^4.2.1:
+  version "4.4.0"
+  resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3"
+
+lodash.reduce@^4.4.0:
+  version "4.6.0"
+  resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b"
+
+lodash.reject@^4.4.0:
+  version "4.6.0"
+  resolved "https://registry.yarnpkg.com/lodash.reject/-/lodash.reject-4.6.0.tgz#80d6492dc1470864bbf583533b651f42a9f52415"
+
+lodash.some@^4.4.0:
+  version "4.6.0"
+  resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d"
+
+lodash@^3.10.1, lodash@^3.8.0:
+  version "3.10.1"
+  resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6"
+
+lodash@^4.0.0, lodash@^4.0.1, lodash@^4.14.0, lodash@^4.17.2, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.5.0:
+  version "4.17.4"
+  resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae"
+
+log4js@^0.6.31:
+  version "0.6.38"
+  resolved "https://registry.yarnpkg.com/log4js/-/log4js-0.6.38.tgz#2c494116695d6fb25480943d3fc872e662a522fd"
+  dependencies:
+    readable-stream "~1.0.2"
+    semver "~4.3.3"
+
+longest@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
+
+loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848"
+  dependencies:
+    js-tokens "^3.0.0"
+
[email protected]:
+  version "2.2.4"
+  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.2.4.tgz#6c658619becf14031d0d0b594b16042ce4dc063d"
+
[email protected]:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+
+memory-fs@^0.4.0, memory-fs@~0.4.1:
+  version "0.4.1"
+  resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
+  dependencies:
+    errno "^0.1.3"
+    readable-stream "^2.0.1"
+
+micromatch@^2.1.5:
+  version "2.3.11"
+  resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565"
+  dependencies:
+    arr-diff "^2.0.0"
+    array-unique "^0.2.1"
+    braces "^1.8.2"
+    expand-brackets "^0.1.4"
+    extglob "^0.3.1"
+    filename-regex "^2.0.0"
+    is-extglob "^1.0.0"
+    is-glob "^2.0.1"
+    kind-of "^3.0.2"
+    normalize-path "^2.0.1"
+    object.omit "^2.0.0"
+    parse-glob "^3.0.4"
+    regex-cache "^0.4.2"
+
+miller-rabin@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.0.tgz#4a62fb1d42933c05583982f4c716f6fb9e6c6d3d"
+  dependencies:
+    bn.js "^4.0.0"
+    brorand "^1.0.1"
+
+mime-db@~1.27.0:
+  version "1.27.0"
+  resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1"
+
+mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.7:
+  version "2.1.15"
+  resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed"
+  dependencies:
+    mime-db "~1.27.0"
+
+mime@^1.3.4:
+  version "1.3.6"
+  resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.6.tgz#591d84d3653a6b0b4a3b9df8de5aa8108e72e5e0"
+
+minimalistic-assert@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3"
+
+minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
+
+minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+  dependencies:
+    brace-expansion "^1.1.7"
+
[email protected], minimist@~0.0.1:
+  version "0.0.8"
+  resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
+
+minimist@^1.1.0, minimist@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
+
[email protected]:
+  version "0.5.0"
+  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12"
+  dependencies:
+    minimist "0.0.8"
+
+"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0:
+  version "0.5.1"
+  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
+  dependencies:
+    minimist "0.0.8"
+
+module-deps@^4.0.8:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/module-deps/-/module-deps-4.1.1.tgz#23215833f1da13fd606ccb8087b44852dcb821fd"
+  dependencies:
+    JSONStream "^1.0.3"
+    browser-resolve "^1.7.0"
+    cached-path-relative "^1.0.0"
+    concat-stream "~1.5.0"
+    defined "^1.0.0"
+    detective "^4.0.0"
+    duplexer2 "^0.1.2"
+    inherits "^2.0.1"
+    parents "^1.0.0"
+    readable-stream "^2.0.2"
+    resolve "^1.1.3"
+    stream-combiner2 "^1.1.1"
+    subarg "^1.0.0"
+    through2 "^2.0.0"
+    xtend "^4.0.0"
+
[email protected]:
+  version "0.7.1"
+  resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098"
+
[email protected]:
+  version "0.7.2"
+  resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765"
+
[email protected]:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+
[email protected]:
+  version "0.0.5"
+  resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0"
+
+nan@^2.3.0:
+  version "2.6.2"
+  resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45"
+
+natural-compare@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+
[email protected]:
+  version "0.6.1"
+  resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
+
+node-fetch@^1.0.1:
+  version "1.7.1"
+  resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.1.tgz#899cb3d0a3c92f952c47f1b876f4c8aeabd400d5"
+  dependencies:
+    encoding "^0.1.11"
+    is-stream "^1.0.1"
+
+node-libs-browser@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.0.0.tgz#a3a59ec97024985b46e958379646f96c4b616646"
+  dependencies:
+    assert "^1.1.1"
+    browserify-zlib "^0.1.4"
+    buffer "^4.3.0"
+    console-browserify "^1.1.0"
+    constants-browserify "^1.0.0"
+    crypto-browserify "^3.11.0"
+    domain-browser "^1.1.1"
+    events "^1.0.0"
+    https-browserify "0.0.1"
+    os-browserify "^0.2.0"
+    path-browserify "0.0.0"
+    process "^0.11.0"
+    punycode "^1.2.4"
+    querystring-es3 "^0.2.0"
+    readable-stream "^2.0.5"
+    stream-browserify "^2.0.1"
+    stream-http "^2.3.1"
+    string_decoder "^0.10.25"
+    timers-browserify "^2.0.2"
+    tty-browserify "0.0.0"
+    url "^0.11.0"
+    util "^0.10.3"
+    vm-browserify "0.0.4"
+
+node-pre-gyp@^0.6.29:
+  version "0.6.36"
+  resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz#db604112cb74e0d477554e9b505b17abddfab786"
+  dependencies:
+    mkdirp "^0.5.1"
+    nopt "^4.0.1"
+    npmlog "^4.0.2"
+    rc "^1.1.7"
+    request "^2.81.0"
+    rimraf "^2.6.1"
+    semver "^5.3.0"
+    tar "^2.2.1"
+    tar-pack "^3.4.0"
+
+nopt@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
+  dependencies:
+    abbrev "1"
+    osenv "^0.1.4"
+
+normalize-package-data@^2.3.2:
+  version "2.3.8"
+  resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.8.tgz#d819eda2a9dedbd1ffa563ea4071d936782295bb"
+  dependencies:
+    hosted-git-info "^2.1.4"
+    is-builtin-module "^1.0.0"
+    semver "2 || 3 || 4 || 5"
+    validate-npm-package-license "^3.0.1"
+
+normalize-path@^2.0.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+  dependencies:
+    remove-trailing-separator "^1.0.1"
+
+npmlog@^4.0.2:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.0.tgz#dc59bee85f64f00ed424efb2af0783df25d1c0b5"
+  dependencies:
+    are-we-there-yet "~1.1.2"
+    console-control-strings "~1.1.0"
+    gauge "~2.7.3"
+    set-blocking "~2.0.0"
+
+nth-check@~1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4"
+  dependencies:
+    boolbase "~1.0.0"
+
+number-is-nan@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+
+oauth-sign@~0.8.1:
+  version "0.8.2"
+  resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
+
[email protected]:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0"
+
+object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+
[email protected]:
+  version "0.0.3"
+  resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291"
+
+object-is@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.1.tgz#0aa60ec9989a0b3ed795cf4d06f62cf1ad6539b6"
+
+object-keys@^1.0.10, object-keys@^1.0.8:
+  version "1.0.11"
+  resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d"
+
+object.assign@^4.0.4:
+  version "4.0.4"
+  resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.0.4.tgz#b1c9cc044ef1b9fe63606fc141abbb32e14730cc"
+  dependencies:
+    define-properties "^1.1.2"
+    function-bind "^1.1.0"
+    object-keys "^1.0.10"
+
+object.entries@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.0.4.tgz#1bf9a4dd2288f5b33f3a993d257661f05d161a5f"
+  dependencies:
+    define-properties "^1.1.2"
+    es-abstract "^1.6.1"
+    function-bind "^1.1.0"
+    has "^1.0.1"
+
+object.omit@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"
+  dependencies:
+    for-own "^0.1.4"
+    is-extendable "^0.1.1"
+
+object.values@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.0.4.tgz#e524da09b4f66ff05df457546ec72ac99f13069a"
+  dependencies:
+    define-properties "^1.1.2"
+    es-abstract "^1.6.1"
+    function-bind "^1.1.0"
+    has "^1.0.1"
+
+on-finished@~2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
+  dependencies:
+    ee-first "1.1.1"
+
+once@^1.3.0, once@^1.3.3:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+  dependencies:
+    wrappy "1"
+
+onetime@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789"
+
+optimist@^0.6.1:
+  version "0.6.1"
+  resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686"
+  dependencies:
+    minimist "~0.0.1"
+    wordwrap "~0.0.2"
+
+optionator@^0.8.2:
+  version "0.8.2"
+  resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64"
+  dependencies:
+    deep-is "~0.1.3"
+    fast-levenshtein "~2.0.4"
+    levn "~0.3.0"
+    prelude-ls "~1.1.2"
+    type-check "~0.3.2"
+    wordwrap "~1.0.0"
+
+options@>=0.0.5:
+  version "0.0.6"
+  resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f"
+
+os-browserify@^0.2.0:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.2.1.tgz#63fc4ccee5d2d7763d26bbf8601078e6c2e0044f"
+
+os-browserify@~0.1.1:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.1.2.tgz#49ca0293e0b19590a5f5de10c7f265a617d8fe54"
+
+os-homedir@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
+
+os-locale@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9"
+  dependencies:
+    lcid "^1.0.0"
+
+os-shim@^0.1.3:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917"
+
+os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+
+osenv@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644"
+  dependencies:
+    os-homedir "^1.0.0"
+    os-tmpdir "^1.0.0"
+
+outpipe@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/outpipe/-/outpipe-1.1.1.tgz#50cf8616365e87e031e29a5ec9339a3da4725fa2"
+  dependencies:
+    shell-quote "^1.4.2"
+
+pako@~0.2.0:
+  version "0.2.9"
+  resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75"
+
+parents@^1.0.0, parents@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/parents/-/parents-1.0.1.tgz#fedd4d2bf193a77745fe71e371d73c3307d9c751"
+  dependencies:
+    path-platform "~0.11.15"
+
+parse-asn1@^5.0.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.0.tgz#37c4f9b7ed3ab65c74817b5f2480937fbf97c712"
+  dependencies:
+    asn1.js "^4.0.0"
+    browserify-aes "^1.0.0"
+    create-hash "^1.1.0"
+    evp_bytestokey "^1.0.0"
+    pbkdf2 "^3.0.3"
+
+parse-glob@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c"
+  dependencies:
+    glob-base "^0.3.0"
+    is-dotfile "^1.0.0"
+    is-extglob "^1.0.0"
+    is-glob "^2.0.0"
+
+parse-json@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
+  dependencies:
+    error-ex "^1.2.0"
+
[email protected]:
+  version "0.0.3"
+  resolved "https://registry.yarnpkg.com/parsejson/-/parsejson-0.0.3.tgz#ab7e3759f209ece99437973f7d0f1f64ae0e64ab"
+  dependencies:
+    better-assert "~1.0.0"
+
[email protected]:
+  version "0.0.5"
+  resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d"
+  dependencies:
+    better-assert "~1.0.0"
+
[email protected]:
+  version "0.0.5"
+  resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a"
+  dependencies:
+    better-assert "~1.0.0"
+
+parseurl@~1.3.1:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56"
+
[email protected], path-browserify@~0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a"
+
+path-exists@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
+  dependencies:
+    pinkie-promise "^2.0.0"
+
+path-is-absolute@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+
+path-is-inside@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
+
+path-parse@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1"
+
+path-platform@~0.11.15:
+  version "0.11.15"
+  resolved "https://registry.yarnpkg.com/path-platform/-/path-platform-0.11.15.tgz#e864217f74c36850f0852b78dc7bf7d4a5721bf2"
+
+path-type@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
+  dependencies:
+    graceful-fs "^4.1.2"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+
+pbkdf2@^3.0.3:
+  version "3.0.12"
+  resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.12.tgz#be36785c5067ea48d806ff923288c5f750b6b8a2"
+  dependencies:
+    create-hash "^1.1.2"
+    create-hmac "^1.1.4"
+    ripemd160 "^2.0.1"
+    safe-buffer "^5.0.1"
+    sha.js "^2.4.8"
+
+pend@~1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
+
+performance-now@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5"
+
+phantomjs-prebuilt@^2.1.7:
+  version "2.1.14"
+  resolved "https://registry.yarnpkg.com/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.14.tgz#d53d311fcfb7d1d08ddb24014558f1188c516da0"
+  dependencies:
+    es6-promise "~4.0.3"
+    extract-zip "~1.5.0"
+    fs-extra "~1.0.0"
+    hasha "~2.2.0"
+    kew "~0.7.0"
+    progress "~1.1.8"
+    request "~2.79.0"
+    request-progress "~2.0.1"
+    which "~1.2.10"
+
+pify@^2.0.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+
+pinkie-promise@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
+  dependencies:
+    pinkie "^2.0.0"
+
+pinkie@^2.0.0:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
+
+pkg-dir@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4"
+  dependencies:
+    find-up "^1.0.0"
+
+pluralize@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45"
+
+prelude-ls@~1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
+
+preserve@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
+
+private@^0.1.6:
+  version "0.1.7"
+  resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1"
+
+process-nextick-args@~1.0.6:
+  version "1.0.7"
+  resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
+
+process@^0.11.0, process@~0.11.0:
+  version "0.11.10"
+  resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
+
+progress@^1.1.8, progress@~1.1.8:
+  version "1.1.8"
+  resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be"
+
+promise@^7.1.1:
+  version "7.1.1"
+  resolved "https://registry.yarnpkg.com/promise/-/promise-7.1.1.tgz#489654c692616b8aa55b0724fa809bb7db49c5bf"
+  dependencies:
+    asap "~2.0.3"
+
+prop-types@^15.5.4:
+  version "15.5.10"
+  resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.5.10.tgz#2797dfc3126182e3a95e3dfbb2e893ddd7456154"
+  dependencies:
+    fbjs "^0.8.9"
+    loose-envify "^1.3.1"
+
+prr@~0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a"
+
+public-encrypt@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6"
+  dependencies:
+    bn.js "^4.1.0"
+    browserify-rsa "^4.0.0"
+    create-hash "^1.1.0"
+    parse-asn1 "^5.0.0"
+    randombytes "^2.0.1"
+
[email protected]:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
+
+punycode@^1.2.4, punycode@^1.3.2, punycode@^1.4.1:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
+
+qjobs@^1.1.4:
+  version "1.1.5"
+  resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.1.5.tgz#659de9f2cf8dcc27a1481276f205377272382e73"
+
[email protected], qs@~6.4.0:
+  version "6.4.0"
+  resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233"
+
+qs@~6.3.0:
+  version "6.3.2"
+  resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c"
+
+querystring-es3@^0.2.0, querystring-es3@~0.2.0:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
+
[email protected]:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
+
+randomatic@^1.1.3:
+  version "1.1.6"
+  resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb"
+  dependencies:
+    is-number "^2.0.2"
+    kind-of "^3.0.2"
+
+randombytes@^2.0.0, randombytes@^2.0.1:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.4.tgz#9551df208422c8f80eb58e2326dd0b840ff22efd"
+  dependencies:
+    safe-buffer "^5.0.1"
+
+range-parser@^1.0.3, range-parser@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e"
+
+raw-body@~2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.2.0.tgz#994976cf6a5096a41162840492f0bdc5d6e7fb96"
+  dependencies:
+    bytes "2.4.0"
+    iconv-lite "0.4.15"
+    unpipe "1.0.0"
+
+rc@^1.1.7:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95"
+  dependencies:
+    deep-extend "~0.4.0"
+    ini "~1.3.0"
+    minimist "^1.2.0"
+    strip-json-comments "~2.0.1"
+
+react-addons-test-utils@~15.4.2:
+  version "15.4.2"
+  resolved "https://registry.yarnpkg.com/react-addons-test-utils/-/react-addons-test-utils-15.4.2.tgz#93bcaa718fcae7360d42e8fb1c09756cc36302a2"
+  dependencies:
+    fbjs "^0.8.4"
+    object-assign "^4.1.0"
+
+react-dom@~15.4.2:
+  version "15.4.2"
+  resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-15.4.2.tgz#015363f05b0a1fd52ae9efdd3a0060d90695208f"
+  dependencies:
+    fbjs "^0.8.1"
+    loose-envify "^1.1.0"
+    object-assign "^4.1.0"
+
+react@~15.4.2:
+  version "15.4.2"
+  resolved "https://registry.yarnpkg.com/react/-/react-15.4.2.tgz#41f7991b26185392ba9bae96c8889e7e018397ef"
+  dependencies:
+    fbjs "^0.8.4"
+    loose-envify "^1.1.0"
+    object-assign "^4.1.0"
+
+read-only-stream@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/read-only-stream/-/read-only-stream-2.0.0.tgz#2724fd6a8113d73764ac288d4386270c1dbf17f0"
+  dependencies:
+    readable-stream "^2.0.2"
+
+read-pkg-up@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
+  dependencies:
+    find-up "^1.0.0"
+    read-pkg "^1.0.0"
+
+read-pkg@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
+  dependencies:
+    load-json-file "^1.0.0"
+    normalize-package-data "^2.3.2"
+    path-type "^1.0.0"
+
+readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.6:
+  version "2.2.11"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.11.tgz#0796b31f8d7688007ff0b93a8088d34aa17c0f72"
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.1"
+    isarray "~1.0.0"
+    process-nextick-args "~1.0.6"
+    safe-buffer "~5.0.1"
+    string_decoder "~1.0.0"
+    util-deprecate "~1.0.1"
+
+readable-stream@~1.0.2:
+  version "1.0.34"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.1"
+    isarray "0.0.1"
+    string_decoder "~0.10.x"
+
+readable-stream@~2.0.0:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e"
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.1"
+    isarray "~1.0.0"
+    process-nextick-args "~1.0.6"
+    string_decoder "~0.10.x"
+    util-deprecate "~1.0.1"
+
+readdirp@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78"
+  dependencies:
+    graceful-fs "^4.1.2"
+    minimatch "^3.0.2"
+    readable-stream "^2.0.2"
+    set-immediate-shim "^1.0.1"
+
+readline2@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35"
+  dependencies:
+    code-point-at "^1.0.0"
+    is-fullwidth-code-point "^1.0.0"
+    mute-stream "0.0.5"
+
+rechoir@^0.6.2:
+  version "0.6.2"
+  resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384"
+  dependencies:
+    resolve "^1.1.6"
+
+regenerate@^1.2.1:
+  version "1.3.2"
+  resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260"
+
+regenerator-runtime@^0.10.0:
+  version "0.10.5"
+  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658"
+
[email protected]:
+  version "0.9.11"
+  resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.11.tgz#3a7d067520cb7b7176769eb5ff868691befe1283"
+  dependencies:
+    babel-runtime "^6.18.0"
+    babel-types "^6.19.0"
+    private "^0.1.6"
+
+regex-cache@^0.4.2:
+  version "0.4.3"
+  resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145"
+  dependencies:
+    is-equal-shallow "^0.1.3"
+    is-primitive "^2.0.0"
+
+regexpu-core@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240"
+  dependencies:
+    regenerate "^1.2.1"
+    regjsgen "^0.2.0"
+    regjsparser "^0.1.4"
+
+regjsgen@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7"
+
+regjsparser@^0.1.4:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c"
+  dependencies:
+    jsesc "~0.5.0"
+
+remove-trailing-separator@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz#69b062d978727ad14dc6b56ba4ab772fd8d70511"
+
+repeat-element@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a"
+
+repeat-string@^0.2.2:
+  version "0.2.2"
+  resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-0.2.2.tgz#c7a8d3236068362059a7e4651fc6884e8b1fb4ae"
+
+repeat-string@^1.5.2:
+  version "1.6.1"
+  resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+
+repeating@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
+  dependencies:
+    is-finite "^1.0.0"
+
+request-progress@~2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-2.0.1.tgz#5d36bb57961c673aa5b788dbc8141fdf23b44e08"
+  dependencies:
+    throttleit "^1.0.0"
+
+request@^2.81.0:
+  version "2.81.0"
+  resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0"
+  dependencies:
+    aws-sign2 "~0.6.0"
+    aws4 "^1.2.1"
+    caseless "~0.12.0"
+    combined-stream "~1.0.5"
+    extend "~3.0.0"
+    forever-agent "~0.6.1"
+    form-data "~2.1.1"
+    har-validator "~4.2.1"
+    hawk "~3.1.3"
+    http-signature "~1.1.0"
+    is-typedarray "~1.0.0"
+    isstream "~0.1.2"
+    json-stringify-safe "~5.0.1"
+    mime-types "~2.1.7"
+    oauth-sign "~0.8.1"
+    performance-now "^0.2.0"
+    qs "~6.4.0"
+    safe-buffer "^5.0.1"
+    stringstream "~0.0.4"
+    tough-cookie "~2.3.0"
+    tunnel-agent "^0.6.0"
+    uuid "^3.0.0"
+
+request@~2.79.0:
+  version "2.79.0"
+  resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de"
+  dependencies:
+    aws-sign2 "~0.6.0"
+    aws4 "^1.2.1"
+    caseless "~0.11.0"
+    combined-stream "~1.0.5"
+    extend "~3.0.0"
+    forever-agent "~0.6.1"
+    form-data "~2.1.1"
+    har-validator "~2.0.6"
+    hawk "~3.1.3"
+    http-signature "~1.1.0"
+    is-typedarray "~1.0.0"
+    isstream "~0.1.2"
+    json-stringify-safe "~5.0.1"
+    mime-types "~2.1.7"
+    oauth-sign "~0.8.1"
+    qs "~6.3.0"
+    stringstream "~0.0.4"
+    tough-cookie "~2.3.0"
+    tunnel-agent "~0.4.1"
+    uuid "^3.0.0"
+
+require-directory@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+
+require-main-filename@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
+
+require-uncached@^1.0.2:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3"
+  dependencies:
+    caller-path "^0.1.0"
+    resolve-from "^1.0.0"
+
+requirejs@~2.3.3:
+  version "2.3.3"
+  resolved "https://registry.yarnpkg.com/requirejs/-/requirejs-2.3.3.tgz#aa59fd3a0287eaf407959a138228044b5dd6a6a3"
+
[email protected]:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
+
+resolve-from@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226"
+
[email protected]:
+  version "1.1.7"
+  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
+
+resolve@^1.1.3, resolve@^1.1.4, resolve@^1.1.6:
+  version "1.3.3"
+  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.3.tgz#655907c3469a8680dc2de3a275a8fdd69691f0e5"
+  dependencies:
+    path-parse "^1.0.5"
+
+restore-cursor@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541"
+  dependencies:
+    exit-hook "^1.0.0"
+    onetime "^1.0.0"
+
+right-align@^0.1.1:
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
+  dependencies:
+    align-text "^0.1.1"
+
+rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.6.0, rimraf@^2.6.1:
+  version "2.6.1"
+  resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d"
+  dependencies:
+    glob "^7.0.5"
+
+ripemd160@^2.0.0, ripemd160@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7"
+  dependencies:
+    hash-base "^2.0.0"
+    inherits "^2.0.1"
+
+run-async@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389"
+  dependencies:
+    once "^1.3.0"
+
+rx-lite@^3.1.2:
+  version "3.1.2"
+  resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102"
+
+safe-buffer@^5.0.1:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.0.tgz#fe4c8460397f9eaaaa58e73be46273408a45e223"
+
+safe-buffer@~5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7"
+
+"semver@2 || 3 || 4 || 5", semver@^5.3.0:
+  version "5.3.0"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
+
+semver@~4.3.3:
+  version "4.3.6"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da"
+
+set-blocking@^2.0.0, set-blocking@~2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+
+set-immediate-shim@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
+
+setimmediate@^1.0.4, setimmediate@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
+
[email protected]:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04"
+
+sha.js@^2.4.0, sha.js@^2.4.8, sha.js@~2.4.4:
+  version "2.4.8"
+  resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.8.tgz#37068c2c476b6baf402d14a49c67f597921f634f"
+  dependencies:
+    inherits "^2.0.1"
+
+shasum@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/shasum/-/shasum-1.0.2.tgz#e7012310d8f417f4deb5712150e5678b87ae565f"
+  dependencies:
+    json-stable-stringify "~0.0.0"
+    sha.js "~2.4.4"
+
+shell-quote@^1.4.2, shell-quote@^1.6.1:
+  version "1.6.1"
+  resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767"
+  dependencies:
+    array-filter "~0.0.0"
+    array-map "~0.0.0"
+    array-reduce "~0.0.0"
+    jsonify "~0.0.0"
+
+shelljs@^0.7.5:
+  version "0.7.8"
+  resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.8.tgz#decbcf874b0d1e5fb72e14b164a9683048e9acb3"
+  dependencies:
+    glob "^7.0.0"
+    interpret "^1.0.0"
+    rechoir "^0.6.2"
+
+signal-exit@^3.0.0:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
+
+slash@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
+
[email protected]:
+  version "0.0.4"
+  resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35"
+
[email protected]:
+  version "1.0.9"
+  resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198"
+  dependencies:
+    hoek "2.x.x"
+
[email protected]:
+  version "0.5.0"
+  resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz#cb6d4bb8bec81e1078b99677f9ced0046066bb8b"
+  dependencies:
+    debug "2.3.3"
+    socket.io-parser "2.3.1"
+
[email protected]:
+  version "1.7.3"
+  resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-1.7.3.tgz#b30e86aa10d5ef3546601c09cde4765e381da377"
+  dependencies:
+    backo2 "1.0.2"
+    component-bind "1.0.0"
+    component-emitter "1.2.1"
+    debug "2.3.3"
+    engine.io-client "1.8.3"
+    has-binary "0.1.7"
+    indexof "0.0.1"
+    object-component "0.0.3"
+    parseuri "0.0.5"
+    socket.io-parser "2.3.1"
+    to-array "0.1.4"
+
[email protected]:
+  version "2.3.1"
+  resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-2.3.1.tgz#dd532025103ce429697326befd64005fcfe5b4a0"
+  dependencies:
+    component-emitter "1.1.2"
+    debug "2.2.0"
+    isarray "0.0.1"
+    json3 "3.3.2"
+
[email protected]:
+  version "1.7.3"
+  resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-1.7.3.tgz#b8af9caba00949e568e369f1327ea9be9ea2461b"
+  dependencies:
+    debug "2.3.3"
+    engine.io "1.8.3"
+    has-binary "0.1.7"
+    object-assign "4.1.0"
+    socket.io-adapter "0.5.0"
+    socket.io-client "1.7.3"
+    socket.io-parser "2.3.1"
+
+source-list-map@^1.1.1:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-1.1.2.tgz#9889019d1024cce55cdc069498337ef6186a11a1"
+
+source-map-support@^0.4.2:
+  version "0.4.15"
+  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.15.tgz#03202df65c06d2bd8c7ec2362a193056fef8d3b1"
+  dependencies:
+    source-map "^0.5.6"
+
[email protected], source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1, source-map@~0.5.3:
+  version "0.5.6"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412"
+
+source-map@^0.1.41:
+  version "0.1.43"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346"
+  dependencies:
+    amdefine ">=0.0.4"
+
+spdx-correct@~1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40"
+  dependencies:
+    spdx-license-ids "^1.0.2"
+
+spdx-expression-parse@~1.0.0:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c"
+
+spdx-license-ids@^1.0.2:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57"
+
+sprintf-js@~1.0.2:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+
+sshpk@^1.7.0:
+  version "1.13.0"
+  resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.0.tgz#ff2a3e4fd04497555fed97b39a0fd82fafb3a33c"
+  dependencies:
+    asn1 "~0.2.3"
+    assert-plus "^1.0.0"
+    dashdash "^1.12.0"
+    getpass "^0.1.1"
+  optionalDependencies:
+    bcrypt-pbkdf "^1.0.0"
+    ecc-jsbn "~0.1.1"
+    jodid25519 "^1.0.0"
+    jsbn "~0.1.0"
+    tweetnacl "~0.14.0"
+
+"statuses@>= 1.3.1 < 2", statuses@~1.3.1:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e"
+
+stream-browserify@^2.0.0, stream-browserify@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db"
+  dependencies:
+    inherits "~2.0.1"
+    readable-stream "^2.0.2"
+
+stream-combiner2@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe"
+  dependencies:
+    duplexer2 "~0.1.0"
+    readable-stream "^2.0.2"
+
+stream-http@^2.0.0, stream-http@^2.3.1:
+  version "2.7.1"
+  resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.7.1.tgz#546a51741ad5a6b07e9e31b0b10441a917df528a"
+  dependencies:
+    builtin-status-codes "^3.0.0"
+    inherits "^2.0.1"
+    readable-stream "^2.2.6"
+    to-arraybuffer "^1.0.0"
+    xtend "^4.0.0"
+
+stream-splicer@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/stream-splicer/-/stream-splicer-2.0.0.tgz#1b63be438a133e4b671cc1935197600175910d83"
+  dependencies:
+    inherits "^2.0.1"
+    readable-stream "^2.0.2"
+
+string-width@^1.0.1, string-width@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
+  dependencies:
+    code-point-at "^1.0.0"
+    is-fullwidth-code-point "^1.0.0"
+    strip-ansi "^3.0.0"
+
+string-width@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e"
+  dependencies:
+    is-fullwidth-code-point "^2.0.0"
+    strip-ansi "^3.0.0"
+
+string_decoder@^0.10.25, string_decoder@~0.10.0, string_decoder@~0.10.x:
+  version "0.10.31"
+  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
+
+string_decoder@~1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.2.tgz#b29e1f4e1125fa97a10382b8a533737b7491e179"
+  dependencies:
+    safe-buffer "~5.0.1"
+
+stringstream@~0.0.4:
+  version "0.0.5"
+  resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878"
+
+strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+  dependencies:
+    ansi-regex "^2.0.0"
+
+strip-bom@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
+  dependencies:
+    is-utf8 "^0.2.0"
+
+strip-bom@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
+
+strip-json-comments@~2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+
+subarg@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2"
+  dependencies:
+    minimist "^1.1.0"
+
+supports-color@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+
+supports-color@^3.1.0:
+  version "3.2.3"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6"
+  dependencies:
+    has-flag "^1.0.0"
+
+syntax-error@^1.1.1:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/syntax-error/-/syntax-error-1.3.0.tgz#1ed9266c4d40be75dc55bf9bb1cb77062bb96ca1"
+  dependencies:
+    acorn "^4.0.3"
+
+table@^3.7.8:
+  version "3.8.3"
+  resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f"
+  dependencies:
+    ajv "^4.7.0"
+    ajv-keywords "^1.0.0"
+    chalk "^1.1.1"
+    lodash "^4.0.0"
+    slice-ansi "0.0.4"
+    string-width "^2.0.0"
+
+tapable@^0.2.5, tapable@~0.2.5:
+  version "0.2.6"
+  resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.6.tgz#206be8e188860b514425375e6f1ae89bfb01fd8d"
+
+tar-pack@^3.4.0:
+  version "3.4.0"
+  resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984"
+  dependencies:
+    debug "^2.2.0"
+    fstream "^1.0.10"
+    fstream-ignore "^1.0.5"
+    once "^1.3.3"
+    readable-stream "^2.1.4"
+    rimraf "^2.5.1"
+    tar "^2.2.1"
+    uid-number "^0.0.6"
+
+tar@^2.2.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1"
+  dependencies:
+    block-stream "*"
+    fstream "^1.0.2"
+    inherits "2"
+
+text-table@~0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
+
+throttleit@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c"
+
+through2@^2.0.0:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be"
+  dependencies:
+    readable-stream "^2.1.5"
+    xtend "~4.0.1"
+
+"through@>=2.2.7 <3", through@^2.3.6:
+  version "2.3.8"
+  resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+
+timers-browserify@^1.0.1:
+  version "1.4.2"
+  resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-1.4.2.tgz#c9c58b575be8407375cb5e2462dacee74359f41d"
+  dependencies:
+    process "~0.11.0"
+
+timers-browserify@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.2.tgz#ab4883cf597dcd50af211349a00fbca56ac86b86"
+  dependencies:
+    setimmediate "^1.0.4"
+
[email protected], [email protected]:
+  version "0.0.31"
+  resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7"
+  dependencies:
+    os-tmpdir "~1.0.1"
+
[email protected]:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890"
+
+to-arraybuffer@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
+
+to-fast-properties@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
+
+tough-cookie@~2.3.0:
+  version "2.3.2"
+  resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a"
+  dependencies:
+    punycode "^1.4.1"
+
+trim-right@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
+
+tryit@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb"
+
[email protected], tty-browserify@~0.0.0:
+  version "0.0.0"
+  resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
+
+tunnel-agent@^0.6.0:
+  version "0.6.0"
+  resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
+  dependencies:
+    safe-buffer "^5.0.1"
+
+tunnel-agent@~0.4.1:
+  version "0.4.3"
+  resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb"
+
+tweetnacl@^0.14.3, tweetnacl@~0.14.0:
+  version "0.14.5"
+  resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
+
+type-check@~0.3.2:
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
+  dependencies:
+    prelude-ls "~1.1.2"
+
+type-is@~1.6.15:
+  version "1.6.15"
+  resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410"
+  dependencies:
+    media-typer "0.3.0"
+    mime-types "~2.1.15"
+
+typedarray@^0.0.6, typedarray@~0.0.5:
+  version "0.0.6"
+  resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+
+ua-parser-js@^0.7.9:
+  version "0.7.12"
+  resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.12.tgz#04c81a99bdd5dc52263ea29d24c6bf8d4818a4bb"
+
+uglify-js@^2.8.5:
+  version "2.8.28"
+  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.28.tgz#e335032df9bb20dcb918f164589d5af47f38834a"
+  dependencies:
+    source-map "~0.5.1"
+    yargs "~3.10.0"
+  optionalDependencies:
+    uglify-to-browserify "~1.0.0"
+
+uglify-to-browserify@~1.0.0:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7"
+
+uid-number@^0.0.6:
+  version "0.0.6"
+  resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81"
+
[email protected]:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa"
+
+umd@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/umd/-/umd-3.0.1.tgz#8ae556e11011f63c2596708a8837259f01b3d60e"
+
+underscore@~1.8.3:
+  version "1.8.3"
+  resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022"
+
[email protected], unpipe@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+
+url@^0.11.0, url@~0.11.0:
+  version "0.11.0"
+  resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
+  dependencies:
+    punycode "1.3.2"
+    querystring "0.2.0"
+
+user-home@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f"
+  dependencies:
+    os-homedir "^1.0.0"
+
+useragent@^2.1.12:
+  version "2.1.13"
+  resolved "https://registry.yarnpkg.com/useragent/-/useragent-2.1.13.tgz#bba43e8aa24d5ceb83c2937473e102e21df74c10"
+  dependencies:
+    lru-cache "2.2.x"
+    tmp "0.0.x"
+
+util-deprecate@~1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+
[email protected], util@^0.10.3, util@~0.10.1:
+  version "0.10.3"
+  resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
+  dependencies:
+    inherits "2.0.1"
+
[email protected]:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8"
+
+uuid@^2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a"
+
+uuid@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1"
+
+validate-npm-package-license@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc"
+  dependencies:
+    spdx-correct "~1.0.0"
+    spdx-expression-parse "~1.0.0"
+
[email protected]:
+  version "1.3.6"
+  resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c"
+  dependencies:
+    extsprintf "1.0.2"
+
[email protected], vm-browserify@~0.0.1:
+  version "0.0.4"
+  resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73"
+  dependencies:
+    indexof "0.0.1"
+
+void-elements@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec"
+
+watchify@~3.9.0:
+  version "3.9.0"
+  resolved "https://registry.yarnpkg.com/watchify/-/watchify-3.9.0.tgz#f075fd2e8a86acde84cedba6e5c2a0bedd523d9e"
+  dependencies:
+    anymatch "^1.3.0"
+    browserify "^14.0.0"
+    chokidar "^1.0.0"
+    defined "^1.0.0"
+    outpipe "^1.1.0"
+    through2 "^2.0.0"
+    xtend "^4.0.0"
+
+watchpack@^1.3.1:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.3.1.tgz#7d8693907b28ce6013e7f3610aa2a1acf07dad87"
+  dependencies:
+    async "^2.1.2"
+    chokidar "^1.4.3"
+    graceful-fs "^4.1.2"
+
+webpack-dev-middleware@^1.0.11:
+  version "1.10.2"
+  resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.10.2.tgz#2e252ce1dfb020dbda1ccb37df26f30ab014dbd1"
+  dependencies:
+    memory-fs "~0.4.1"
+    mime "^1.3.4"
+    path-is-absolute "^1.0.0"
+    range-parser "^1.0.3"
+
+webpack-sources@^0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-0.2.3.tgz#17c62bfaf13c707f9d02c479e0dcdde8380697fb"
+  dependencies:
+    source-list-map "^1.1.1"
+    source-map "~0.5.3"
+
+webpack@~2.3.1:
+  version "2.3.3"
+  resolved "https://registry.yarnpkg.com/webpack/-/webpack-2.3.3.tgz#eecc083c18fb7bf958ea4f40b57a6640c5a0cc78"
+  dependencies:
+    acorn "^4.0.4"
+    acorn-dynamic-import "^2.0.0"
+    ajv "^4.7.0"
+    ajv-keywords "^1.1.1"
+    async "^2.1.2"
+    enhanced-resolve "^3.0.0"
+    interpret "^1.0.0"
+    json-loader "^0.5.4"
+    loader-runner "^2.3.0"
+    loader-utils "^0.2.16"
+    memory-fs "~0.4.1"
+    mkdirp "~0.5.0"
+    node-libs-browser "^2.0.0"
+    source-map "^0.5.3"
+    supports-color "^3.1.0"
+    tapable "~0.2.5"
+    uglify-js "^2.8.5"
+    watchpack "^1.3.1"
+    webpack-sources "^0.2.3"
+    yargs "^6.0.0"
+
+whatwg-fetch@>=0.10.0:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84"
+
+which-module@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
+
+which@~1.2.10:
+  version "1.2.14"
+  resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5"
+  dependencies:
+    isexe "^2.0.0"
+
+wide-align@^1.1.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710"
+  dependencies:
+    string-width "^1.0.2"
+
[email protected]:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
+
[email protected]:
+  version "0.0.2"
+  resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
+
+wordwrap@~0.0.2:
+  version "0.0.3"
+  resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107"
+
+wordwrap@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
+
+wrap-ansi@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
+  dependencies:
+    string-width "^1.0.1"
+    strip-ansi "^3.0.1"
+
+wrappy@1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+
+write@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757"
+  dependencies:
+    mkdirp "^0.5.1"
+
[email protected]:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.2.tgz#8a244fa052401e08c9886cf44a85189e1fd4067f"
+  dependencies:
+    options ">=0.0.5"
+    ultron "1.0.x"
+
[email protected]:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/wtf-8/-/wtf-8-1.0.0.tgz#392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a"
+
[email protected]:
+  version "1.5.3"
+  resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz#185a888c04eca46c3e4070d99f7b49de3528992d"
+
+xtend@^4.0.0, xtend@~4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
+
+y18n@^3.2.1:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
+
+yargs-parser@^4.2.0:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c"
+  dependencies:
+    camelcase "^3.0.0"
+
+yargs@^6.0.0:
+  version "6.6.0"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208"
+  dependencies:
+    camelcase "^3.0.0"
+    cliui "^3.2.0"
+    decamelize "^1.1.1"
+    get-caller-file "^1.0.1"
+    os-locale "^1.4.0"
+    read-pkg-up "^1.0.1"
+    require-directory "^2.1.1"
+    require-main-filename "^1.0.1"
+    set-blocking "^2.0.0"
+    string-width "^1.0.2"
+    which-module "^1.0.0"
+    y18n "^3.2.1"
+    yargs-parser "^4.2.0"
+
+yargs@~3.10.0:
+  version "3.10.0"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"
+  dependencies:
+    camelcase "^1.0.2"
+    cliui "^2.1.0"
+    decamelize "^1.0.0"
+    window-size "0.1.0"
+
[email protected]:
+  version "2.4.1"
+  resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005"
+  dependencies:
+    fd-slicer "~1.0.1"
+
[email protected]:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419"


view thread (45+ messages)  latest in thread

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: [email protected]
  Cc: [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected]
  Subject: Re: [pgAdmin4] [PATCH] History Tab rewrite in React
  In-Reply-To: <CA+OCxoxtxBO-mWfUokBu1WG8VH4E6MrHj16mrKT=L0svYvKfGg@mail.gmail.com>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox