From bf5b7c9222bd1aa7f869a8aa9908d7d5b6bf9275 Mon Sep 17 00:00:00 2001 From: root Date: Tue, 25 Feb 2020 19:24:06 +0100 Subject: [PATCH] Changes of Linux stable v0.0.10 --- .../stable/app_bootstrap/autoStart/linux.js | 3 +- appasar/stable/app_bootstrap/bootstrap.js | 15 +- appasar/stable/app_bootstrap/buildInfo.js | 2 +- appasar/stable/app_bootstrap/errorHandler.js | 13 +- appasar/stable/app_bootstrap/hostUpdater.js | 67 +- .../stable/app_bootstrap/installDevTools.js | 2 +- appasar/stable/app_bootstrap/ipcMain.js | 2 +- appasar/stable/app_bootstrap/request.js | 242 +- .../stable/app_bootstrap/singleInstance.js | 4 +- appasar/stable/app_bootstrap/splash/index.js | 25747 +--------------- appasar/stable/app_bootstrap/splashScreen.js | 55 +- .../app_bootstrap/startupMenu/darwin.js | 2 +- .../stable/app_bootstrap/startupMenu/index.js | 2 +- .../stable/app_bootstrap/startupMenu/linux.js | 2 +- .../stable/app_bootstrap/startupMenu/win32.js | 2 +- appasar/stable/common/Backoff.js | 2 +- appasar/stable/common/FeatureFlags.js | 2 +- appasar/stable/common/Settings.js | 2 +- appasar/stable/common/moduleUpdater.js | 499 +- electronasar/stable/browser/api/app.js | 117 - .../stable/browser/api/auto-updater.js | 7 - .../api/auto-updater/auto-updater-native.js | 10 - .../api/auto-updater/auto-updater-win.js | 74 - .../api/auto-updater/squirrel-update-win.js | 119 - .../stable/browser/api/browser-view.js | 16 - .../stable/browser/api/browser-window.js | 191 - .../stable/browser/api/content-tracing.js | 3 - .../stable/browser/api/crash-reporter.js | 14 - electronasar/stable/browser/api/dialog.js | 312 - .../stable/browser/api/exports/electron.js | 15 - .../stable/browser/api/global-shortcut.js | 3 - .../stable/browser/api/in-app-purchase.js | 20 - electronasar/stable/browser/api/ipc-main.js | 10 - .../stable/browser/api/menu-item-roles.js | 297 - electronasar/stable/browser/api/menu-item.js | 85 - electronasar/stable/browser/api/menu-utils.js | 176 - electronasar/stable/browser/api/menu.js | 258 - .../stable/browser/api/module-list.js | 46 - .../browser/api/navigation-controller.js | 179 - electronasar/stable/browser/api/net-log.js | 28 - electronasar/stable/browser/api/net.js | 372 - .../stable/browser/api/notification.js | 10 - .../stable/browser/api/power-monitor.js | 25 - .../stable/browser/api/power-save-blocker.js | 3 - electronasar/stable/browser/api/protocol.js | 29 - electronasar/stable/browser/api/screen.js | 10 - electronasar/stable/browser/api/session.js | 24 - .../stable/browser/api/system-preferences.js | 10 - .../stable/browser/api/top-level-window.js | 24 - electronasar/stable/browser/api/touch-bar.js | 343 - electronasar/stable/browser/api/tray.js | 8 - electronasar/stable/browser/api/view.js | 11 - .../stable/browser/api/web-contents-view.js | 15 - .../stable/browser/api/web-contents.js | 507 - .../stable/browser/chrome-extension.js | 446 - .../stable/browser/desktop-capturer.js | 73 - .../stable/browser/guest-view-manager.js | 451 - .../stable/browser/guest-window-manager.js | 368 - electronasar/stable/browser/init.js | 188 - .../stable/browser/ipc-main-internal.js | 10 - .../stable/browser/objects-registry.js | 116 - electronasar/stable/browser/rpc-server.js | 558 - electronasar/stable/common/api/clipboard.js | 31 - electronasar/stable/common/api/deprecate.js | 95 - .../stable/common/api/deprecations.js | 11 - .../stable/common/api/exports/electron.js | 31 - electronasar/stable/common/api/is-promise.js | 14 - electronasar/stable/common/api/module-list.js | 12 - .../stable/common/api/native-image.js | 3 - electronasar/stable/common/api/shell.js | 3 - .../stable/common/atom-binding-setup.js | 15 - electronasar/stable/common/buffer-utils.js | 66 - electronasar/stable/common/crash-reporter.js | 123 - electronasar/stable/common/error-utils.js | 39 - electronasar/stable/common/init.js | 53 - .../stable/common/parse-features-string.js | 21 - .../stable/common/reset-search-paths.js | 45 - .../stable/common/web-view-methods.js | 70 - .../stable/renderer/api/crash-reporter.js | 12 - .../stable/renderer/api/desktop-capturer.js | 48 - .../stable/renderer/api/exports/electron.js | 23 - .../stable/renderer/api/ipc-renderer.js | 30 - .../stable/renderer/api/module-list.js | 21 - electronasar/stable/renderer/api/remote.js | 355 - electronasar/stable/renderer/api/screen.js | 4 - electronasar/stable/renderer/api/web-frame.js | 67 - .../stable/renderer/callbacks-registry.js | 59 - electronasar/stable/renderer/chrome-api.js | 190 - .../renderer/content-scripts-injector.js | 101 - .../stable/renderer/extensions/event.js | 26 - .../stable/renderer/extensions/i18n.js | 88 - .../stable/renderer/extensions/storage.js | 138 - .../renderer/extensions/web-navigation.js | 23 - electronasar/stable/renderer/init.js | 176 - electronasar/stable/renderer/inspector.js | 138 - .../stable/renderer/ipc-renderer-internal.js | 26 - electronasar/stable/renderer/override.js | 18 - electronasar/stable/renderer/remote.js | 10 - .../stable/renderer/security-warnings.js | 339 - .../stable/renderer/web-frame-init.js | 24 - .../renderer/web-view/guest-view-internal.js | 108 - .../renderer/web-view/web-view-attributes.js | 281 - .../renderer/web-view/web-view-constants.js | 28 - .../stable/renderer/web-view/web-view.js | 346 - electronasar/stable/renderer/window-setup.js | 192 - electronasar/stable/worker/init.js | 37 - 106 files changed, 604 insertions(+), 35182 deletions(-) delete mode 100644 electronasar/stable/browser/api/app.js delete mode 100644 electronasar/stable/browser/api/auto-updater.js delete mode 100644 electronasar/stable/browser/api/auto-updater/auto-updater-native.js delete mode 100644 electronasar/stable/browser/api/auto-updater/auto-updater-win.js delete mode 100644 electronasar/stable/browser/api/auto-updater/squirrel-update-win.js delete mode 100644 electronasar/stable/browser/api/browser-view.js delete mode 100644 electronasar/stable/browser/api/browser-window.js delete mode 100644 electronasar/stable/browser/api/content-tracing.js delete mode 100644 electronasar/stable/browser/api/crash-reporter.js delete mode 100644 electronasar/stable/browser/api/dialog.js delete mode 100644 electronasar/stable/browser/api/exports/electron.js delete mode 100644 electronasar/stable/browser/api/global-shortcut.js delete mode 100644 electronasar/stable/browser/api/in-app-purchase.js delete mode 100644 electronasar/stable/browser/api/ipc-main.js delete mode 100644 electronasar/stable/browser/api/menu-item-roles.js delete mode 100644 electronasar/stable/browser/api/menu-item.js delete mode 100644 electronasar/stable/browser/api/menu-utils.js delete mode 100644 electronasar/stable/browser/api/menu.js delete mode 100644 electronasar/stable/browser/api/module-list.js delete mode 100644 electronasar/stable/browser/api/navigation-controller.js delete mode 100644 electronasar/stable/browser/api/net-log.js delete mode 100644 electronasar/stable/browser/api/net.js delete mode 100644 electronasar/stable/browser/api/notification.js delete mode 100644 electronasar/stable/browser/api/power-monitor.js delete mode 100644 electronasar/stable/browser/api/power-save-blocker.js delete mode 100644 electronasar/stable/browser/api/protocol.js delete mode 100644 electronasar/stable/browser/api/screen.js delete mode 100644 electronasar/stable/browser/api/session.js delete mode 100644 electronasar/stable/browser/api/system-preferences.js delete mode 100644 electronasar/stable/browser/api/top-level-window.js delete mode 100644 electronasar/stable/browser/api/touch-bar.js delete mode 100644 electronasar/stable/browser/api/tray.js delete mode 100644 electronasar/stable/browser/api/view.js delete mode 100644 electronasar/stable/browser/api/web-contents-view.js delete mode 100644 electronasar/stable/browser/api/web-contents.js delete mode 100644 electronasar/stable/browser/chrome-extension.js delete mode 100644 electronasar/stable/browser/desktop-capturer.js delete mode 100644 electronasar/stable/browser/guest-view-manager.js delete mode 100644 electronasar/stable/browser/guest-window-manager.js delete mode 100644 electronasar/stable/browser/init.js delete mode 100644 electronasar/stable/browser/ipc-main-internal.js delete mode 100644 electronasar/stable/browser/objects-registry.js delete mode 100644 electronasar/stable/browser/rpc-server.js delete mode 100644 electronasar/stable/common/api/clipboard.js delete mode 100644 electronasar/stable/common/api/deprecate.js delete mode 100644 electronasar/stable/common/api/deprecations.js delete mode 100644 electronasar/stable/common/api/exports/electron.js delete mode 100644 electronasar/stable/common/api/is-promise.js delete mode 100644 electronasar/stable/common/api/module-list.js delete mode 100644 electronasar/stable/common/api/native-image.js delete mode 100644 electronasar/stable/common/api/shell.js delete mode 100644 electronasar/stable/common/atom-binding-setup.js delete mode 100644 electronasar/stable/common/buffer-utils.js delete mode 100644 electronasar/stable/common/crash-reporter.js delete mode 100644 electronasar/stable/common/error-utils.js delete mode 100644 electronasar/stable/common/init.js delete mode 100644 electronasar/stable/common/parse-features-string.js delete mode 100644 electronasar/stable/common/reset-search-paths.js delete mode 100644 electronasar/stable/common/web-view-methods.js delete mode 100644 electronasar/stable/renderer/api/crash-reporter.js delete mode 100644 electronasar/stable/renderer/api/desktop-capturer.js delete mode 100644 electronasar/stable/renderer/api/exports/electron.js delete mode 100644 electronasar/stable/renderer/api/ipc-renderer.js delete mode 100644 electronasar/stable/renderer/api/module-list.js delete mode 100644 electronasar/stable/renderer/api/remote.js delete mode 100644 electronasar/stable/renderer/api/screen.js delete mode 100644 electronasar/stable/renderer/api/web-frame.js delete mode 100644 electronasar/stable/renderer/callbacks-registry.js delete mode 100644 electronasar/stable/renderer/chrome-api.js delete mode 100644 electronasar/stable/renderer/content-scripts-injector.js delete mode 100644 electronasar/stable/renderer/extensions/event.js delete mode 100644 electronasar/stable/renderer/extensions/i18n.js delete mode 100644 electronasar/stable/renderer/extensions/storage.js delete mode 100644 electronasar/stable/renderer/extensions/web-navigation.js delete mode 100644 electronasar/stable/renderer/init.js delete mode 100644 electronasar/stable/renderer/inspector.js delete mode 100644 electronasar/stable/renderer/ipc-renderer-internal.js delete mode 100644 electronasar/stable/renderer/override.js delete mode 100644 electronasar/stable/renderer/remote.js delete mode 100644 electronasar/stable/renderer/security-warnings.js delete mode 100644 electronasar/stable/renderer/web-frame-init.js delete mode 100644 electronasar/stable/renderer/web-view/guest-view-internal.js delete mode 100644 electronasar/stable/renderer/web-view/web-view-attributes.js delete mode 100644 electronasar/stable/renderer/web-view/web-view-constants.js delete mode 100644 electronasar/stable/renderer/web-view/web-view.js delete mode 100644 electronasar/stable/renderer/window-setup.js delete mode 100644 electronasar/stable/worker/init.js diff --git a/appasar/stable/app_bootstrap/autoStart/linux.js b/appasar/stable/app_bootstrap/autoStart/linux.js index 4097e7f..e1895f1 100644 --- a/appasar/stable/app_bootstrap/autoStart/linux.js +++ b/appasar/stable/app_bootstrap/autoStart/linux.js @@ -31,7 +31,8 @@ const exePath = _electron.app.getPath('exe'); const exeDir = _path2.default.dirname(exePath); const iconPath = _path2.default.join(exeDir, 'discord.png'); const autostartDir = _path2.default.join(_electron.app.getPath('appData'), 'autostart'); -const autostartFileName = _path2.default.join(autostartDir, _electron.app.getName() + '-' + _buildInfo2.default.releaseChannel + '.desktop'); +const electronAppName = _electron.app.name ? _electron.app.name : _electron.app.getName(); +const autostartFileName = _path2.default.join(autostartDir, electronAppName + '-' + _buildInfo2.default.releaseChannel + '.desktop'); const desktopFile = `[Desktop Entry] Type=Application Exec=${exePath} diff --git a/appasar/stable/app_bootstrap/bootstrap.js b/appasar/stable/app_bootstrap/bootstrap.js index a5b4928..2083fb4 100644 --- a/appasar/stable/app_bootstrap/bootstrap.js +++ b/appasar/stable/app_bootstrap/bootstrap.js @@ -35,14 +35,17 @@ appSettings.init(); const Constants = require('./Constants'); const GPUSettings = require('./GPUSettings'); -const settings = appSettings.getSettings(); -// TODO: this is a copy of gpuSettings.getEnableHardwareAcceleration -if (!settings.get('enableHardwareAcceleration', true)) { - app.disableHardwareAcceleration(); +function setupHardwareAcceleration() { + const settings = appSettings.getSettings(); + const electronMajor = parseInt(process.versions.electron.split('.')[0]); + const allowed = process.env.DISCORD_ENABLE_HARDWARE_ACCELERATION || buildInfo.releaseChannel === 'development' || !(electronMajor === 7 && process.platform === 'darwin'); + // TODO: this is a copy of gpuSettings.getEnableHardwareAcceleration + if (!allowed || !settings.get('enableHardwareAcceleration', true)) { + app.disableHardwareAcceleration(); + } } -// [adill] disables color correction based on monitor's color profile -app.commandLine.appendSwitch('force-color-profile', 'srgb'); +setupHardwareAcceleration(); // [adill] work around chrome 66 disabling autoplay by default app.commandLine.appendSwitch('autoplay-policy', 'no-user-gesture-required'); diff --git a/appasar/stable/app_bootstrap/buildInfo.js b/appasar/stable/app_bootstrap/buildInfo.js index 1e83b40..0e77420 100644 --- a/appasar/stable/app_bootstrap/buildInfo.js +++ b/appasar/stable/app_bootstrap/buildInfo.js @@ -13,4 +13,4 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de const buildInfo = require(_path2.default.join(process.resourcesPath, 'build_info.json')); exports.default = buildInfo; -module.exports = exports['default']; \ No newline at end of file +module.exports = exports.default; \ No newline at end of file diff --git a/appasar/stable/app_bootstrap/errorHandler.js b/appasar/stable/app_bootstrap/errorHandler.js index d2b2d7e..cac1672 100644 --- a/appasar/stable/app_bootstrap/errorHandler.js +++ b/appasar/stable/app_bootstrap/errorHandler.js @@ -28,11 +28,16 @@ function init() { // show a similar error message to the error handler, except exit out the app // after the error message has been closed function fatal(err) { - _electron.dialog.showMessageBox({ + const options = { type: 'error', message: 'A fatal Javascript error occured', detail: err && err.stack ? err.stack : String(err) - }, () => { - _electron.app.quit(); - }); + }; + const callback = _ => _electron.app.quit(); + const electronMajor = parseInt(process.versions.electron.split('.')[0]); + if (electronMajor >= 6) { + _electron.dialog.showMessageBox(null, options).then(callback); + } else { + _electron.dialog.showMessageBox(options, callback); + } } \ No newline at end of file diff --git a/appasar/stable/app_bootstrap/hostUpdater.js b/appasar/stable/app_bootstrap/hostUpdater.js index 5dd9f8e..f5d7b0c 100644 --- a/appasar/stable/app_bootstrap/hostUpdater.js +++ b/appasar/stable/app_bootstrap/hostUpdater.js @@ -4,22 +4,24 @@ Object.defineProperty(exports, "__esModule", { value: true }); -var _events = require('events'); - -var _squirrelUpdate = require('./squirrelUpdate'); - -var squirrelUpdate = _interopRequireWildcard(_squirrelUpdate); - var _electron = require('electron'); +var _events = require('events'); + var _request = require('./request'); var _request2 = _interopRequireDefault(_request); -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +var _squirrelUpdate = require('./squirrelUpdate'); + +var squirrelUpdate = _interopRequireWildcard(_squirrelUpdate); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } + function versionParse(verString) { return verString.split('.').map(i => parseInt(i)); } @@ -127,43 +129,50 @@ class AutoUpdaterLinux extends _events.EventEmitter { this.updateUrl = url; } + quitAndInstall() { + // Just restart. The splash screen will hit the update manually state and + // prompt the user to download the new package. + _electron.app.relaunch(); + _electron.app.quit(); + } + checkForUpdates() { - const currVersion = versionParse(_electron.app.getVersion()); - this.emit('checking-for-update'); + var _this = this; - _request2.default.get({ url: this.updateUrl, encoding: null }, (error, response, body) => { - if (error) { - console.error('[Updates] Error fetching ' + this.updateUrl + ': ' + error); - this.emit('error', error); - return; - } + return _asyncToGenerator(function* () { + const currVersion = versionParse(_electron.app.getVersion()); + _this.emit('checking-for-update'); + + try { + const response = yield _request2.default.get(_this.updateUrl); + + if (response.statusCode === 204) { + // you are up to date + _this.emit('update-not-available'); + return; + } - if (response.statusCode === 204) { - // you are up to date - this.emit('update-not-available'); - } else if (response.statusCode === 200) { let latestVerStr = ''; let latestVersion = []; try { - const latestMetadata = JSON.parse(body); + const latestMetadata = JSON.parse(response.body); latestVerStr = latestMetadata.name; latestVersion = versionParse(latestVerStr); - } catch (e) {} + } catch (_) {} if (versionNewer(latestVersion, currVersion)) { console.log('[Updates] You are out of date!'); // you need to update - this.emit('update-manually', latestVerStr); + _this.emit('update-manually', latestVerStr); } else { console.log('[Updates] You are living in the future!'); - this.emit('update-not-available'); + _this.emit('update-not-available'); } - } else { - // something is wrong - console.error(`[Updates] Error: fetch returned: ${response.statusCode}`); - this.emit('update-not-available'); + } catch (err) { + console.error('[Updates] Error fetching ' + _this.updateUrl + ': ' + err.message); + _this.emit('error', err); } - }); + })(); } } @@ -186,4 +195,4 @@ switch (process.platform) { } exports.default = autoUpdater; -module.exports = exports['default']; \ No newline at end of file +module.exports = exports.default; \ No newline at end of file diff --git a/appasar/stable/app_bootstrap/installDevTools.js b/appasar/stable/app_bootstrap/installDevTools.js index ca17e45..e840307 100644 --- a/appasar/stable/app_bootstrap/installDevTools.js +++ b/appasar/stable/app_bootstrap/installDevTools.js @@ -15,4 +15,4 @@ function installDevTools() { } exports.default = installDevTools; -module.exports = exports['default']; \ No newline at end of file +module.exports = exports.default; \ No newline at end of file diff --git a/appasar/stable/app_bootstrap/ipcMain.js b/appasar/stable/app_bootstrap/ipcMain.js index 8b9cc21..a4091b0 100644 --- a/appasar/stable/app_bootstrap/ipcMain.js +++ b/appasar/stable/app_bootstrap/ipcMain.js @@ -10,4 +10,4 @@ exports.default = { on: (event, callback) => _electron.ipcMain.on(`DISCORD_${event}`, callback), removeListener: (event, callback) => _electron.ipcMain.removeListener(`DISCORD_${event}`, callback) }; -module.exports = exports['default']; \ No newline at end of file +module.exports = exports.default; \ No newline at end of file diff --git a/appasar/stable/app_bootstrap/request.js b/appasar/stable/app_bootstrap/request.js index 58e1730..f56dcc3 100644 --- a/appasar/stable/app_bootstrap/request.js +++ b/appasar/stable/app_bootstrap/request.js @@ -6,6 +6,84 @@ Object.defineProperty(exports, "__esModule", { var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; +let electronRequest = (() => { + var _ref = _asyncToGenerator(function* ({ method, url, headers, qs, timeout, body, stream }) { + yield _electron.app.whenReady(); + + const { net, session } = require('electron'); + const req = net.request({ + method, + url: `${url}${qs != null ? `?${_querystring2.default.stringify(qs)}` : ''}`, + redirect: 'follow', + session: session.defaultSession + }); + + if (headers != null) { + for (const headerKey of Object.keys(headers)) { + req.setHeader(headerKey, headers[headerKey]); + } + } + + if (body != null) { + req.write(body, 'utf-8'); + } + + return new Promise(function (resolve, reject) { + const reqTimeout = setTimeout(function () { + req.abort(); + reject(new Error(`network timeout: ${url}`)); + }, timeout != null ? timeout : DEFAULT_REQUEST_TIMEOUT); + + req.on('login', function (authInfo, callback) { + return callback(); + }); + + req.on('response', function (response) { + clearTimeout(reqTimeout); + handleHTTPResponse(resolve, reject, response, stream); + }); + + req.on('error', function (err) { + clearTimeout(reqTimeout); + reject(err); + }); + + req.end(); + }); + }); + + return function electronRequest(_x) { + return _ref.apply(this, arguments); + }; +})(); + +let requestWithMethod = (() => { + var _ref2 = _asyncToGenerator(function* (method, options) { + if (typeof options === 'string') { + options = { url: options }; + } + + options = _extends({}, options, { method }); + + try { + return yield electronRequest(options); + } catch (err) { + console.log(`Error downloading with electron net: ${err.message}`); + console.log('Falling back to node net library..'); + } + + return nodeRequest(options); + }); + + return function requestWithMethod(_x2, _x3) { + return _ref2.apply(this, arguments); + }; +})(); + +// only supports get for now, since retrying is non-idempotent and +// we'd want to grovel the errors to make sure it's safe to retry + + var _electron = require('electron'); var _querystring = require('querystring'); @@ -16,101 +94,89 @@ var _request = require('request'); var _request2 = _interopRequireDefault(_request); -var _events = require('events'); - -var _events2 = _interopRequireDefault(_events); - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -function _log(_msg) { - // console.log('[Request] ' + _msg); +function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } + +const DEFAULT_REQUEST_TIMEOUT = 30000; + +function makeHTTPResponse({ method, url, headers, statusCode, statusMessage }, body) { + return { + method, + url, + headers, + statusCode, + statusMessage, + body + }; } -function requestWithMethod(method, origOpts, origCallback) { - if (typeof origOpts == 'string') { - origOpts = { url: origOpts }; - } - - const opts = _extends({}, origOpts, { method }); - - let callback; - if (origCallback || opts.callback) { - const origOptsCallback = opts.callback; - delete opts.callback; - callback = (...args) => { - if (origCallback) { - origCallback.apply(this, args); - } - if (origOptsCallback) { - origOptsCallback.apply(this, args); - } - }; - } - - const strictOpts = _extends({}, opts, { strictSSL: true }); - const laxOpts = _extends({}, opts, { strictSSL: false }); - - const rv = new _events2.default(); - - if (callback) { - _log('have callback, so wrapping'); - rv.on('response', response => { - const chunks = []; - response.on('data', chunk => chunks.push(chunk)); - response.on('end', () => { - callback(null, response, Buffer.concat(chunks)); - }); - }); - rv.on('error', error => callback(error)); - } - - const requestTypes = [{ - factory: function () { - return (0, _request2.default)(strictOpts); - }, - method: 'node_request_strict' - }, { - factory: function () { - const qs = _querystring2.default.stringify(strictOpts.qs); - const nr = _electron.net.request(_extends({}, strictOpts, { url: `${strictOpts.url}?${qs}` })); - nr.end(); - return nr; - }, - method: 'electron_net_request_strict' - }, { - factory: function () { - return (0, _request2.default)(laxOpts); - }, - method: 'node_request_lax' - }]; - - function attempt(index) { - const { factory, method } = requestTypes[index]; - _log(`Attempt #${index + 1}: ${method}`); - factory().on('response', response => { - _log(`${method} success! emitting response ${response}`); - rv.emit('response', response); - }).on('error', error => { - if (index + 1 < requestTypes.length) { - _log(`${method} failure, trying next option`); - attempt(index + 1); - } else { - _log(`${method} failure, out of options`); - rv.emit('error', error); - } - }); - } - - attempt(0); - - return rv; +function makeHTTPStatusError(response) { + const err = new Error(`HTTP Error: Status Code ${response.statusCode}`); + err.response = response; + return err; +} + +function handleHTTPResponse(resolve, reject, response, stream) { + const totalBytes = parseInt(response.headers['content-length'] || 1, 10); + let receivedBytes = 0; + const chunks = []; + + // don't stream response if it's a failure + if (response.statusCode >= 300) { + stream = null; + } + + response.on('data', chunk => { + if (stream != null) { + receivedBytes += chunk.length; + stream.write(chunk); + stream.emit('progress', { totalBytes, receivedBytes }); + return; + } + + chunks.push(chunk); + }); + + response.on('end', () => { + if (stream != null) { + stream.on('finish', () => resolve(makeHTTPResponse(response, null))); + stream.end(); + return; + } + + const res = makeHTTPResponse(response, Buffer.concat(chunks)); + + if (res.statusCode >= 300) { + reject(makeHTTPStatusError(res)); + return; + } + + resolve(res); + }); +} + +function nodeRequest({ method, url, headers, qs, timeout, body, stream }) { + return new Promise((resolve, reject) => { + const req = (0, _request2.default)({ + method, + url, + qs, + headers, + followAllRedirects: true, + encoding: null, + timeout: timeout != null ? timeout : DEFAULT_REQUEST_TIMEOUT, + body + }); + + req.on('response', response => handleHTTPResponse(resolve, reject, response, stream)); + req.on('error', err => reject(err)); + }); } -// only supports get for now, since retrying is non-idempotent and -// we'd want to grovel the errors to make sure it's safe to retry for (const method of ['get']) { - requestWithMethod[method] = requestWithMethod.bind(null, method); + requestWithMethod[method] = requestWithMethod.bind(null, method.toUpperCase()); } exports.default = requestWithMethod; -module.exports = exports['default']; \ No newline at end of file +module.exports = exports.default; \ No newline at end of file diff --git a/appasar/stable/app_bootstrap/singleInstance.js b/appasar/stable/app_bootstrap/singleInstance.js index a7d305c..03cf578 100644 --- a/appasar/stable/app_bootstrap/singleInstance.js +++ b/appasar/stable/app_bootstrap/singleInstance.js @@ -90,9 +90,9 @@ function tryStart(socketPath, callback, otherAppFound) { } function makeSocketPath() { - let name = _electron.app.getName(); + let name = _electron.app.name ? _electron.app.name : _electron.app.getName(); if (_buildInfo2.default.releaseChannel !== 'stable') { - name = _electron.app.getName() + _buildInfo2.default.releaseChannel; + name += _buildInfo2.default.releaseChannel; } if (process.platform === 'win32') { diff --git a/appasar/stable/app_bootstrap/splash/index.js b/appasar/stable/app_bootstrap/splash/index.js index 737b244..cdbdd03 100644 --- a/appasar/stable/app_bootstrap/splash/index.js +++ b/appasar/stable/app_bootstrap/splash/index.js @@ -1,25742 +1,47 @@ -/******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { -/******/ configurable: false, -/******/ enumerable: true, -/******/ get: getter -/******/ }); -/******/ } -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 85); -/******/ }) -/************************************************************************/ -/******/ ([ -/* 0 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -/** - * Use invariant() to assert state which your program assumes to be true. - * - * Provide sprintf-style format (only %s is supported) and arguments - * to provide information about what broke and what you were - * expecting. - * - * The invariant message will be stripped in production, but the invariant - * will remain to ensure logic does not differ in production. - */ - -var validateFormat = function validateFormat(format) {}; - -if (process.env.NODE_ENV !== 'production') { - validateFormat = function validateFormat(format) { - if (format === undefined) { - throw new Error('invariant requires an error message argument'); - } - }; -} - -function invariant(condition, format, a, b, c, d, e, f) { - validateFormat(format); - - if (!condition) { - var error; - if (format === undefined) { - error = new Error('Minified exception occurred; use the non-minified dev environment ' + 'for the full error message and additional helpful warnings.'); - } else { - var args = [a, b, c, d, e, f]; - var argIndex = 0; - error = new Error(format.replace(/%s/g, function () { - return args[argIndex++]; - })); - error.name = 'Invariant Violation'; - } - - error.framesToPop = 1; // we don't care about invariant's own frame - throw error; - } -} - -module.exports = invariant; - -/***/ }), -/* 1 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2014-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var emptyFunction = __webpack_require__(7); - -/** - * Similar to invariant but only logs a warning if the condition is not met. - * This can be used to log issues in development environments in critical - * paths. Removing the logging code for production environments will keep the - * same logic and follow the same code paths. - */ - -var warning = emptyFunction; - -if (process.env.NODE_ENV !== 'production') { - var printWarning = function printWarning(format) { - for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } - - var argIndex = 0; - var message = 'Warning: ' + format.replace(/%s/g, function () { - return args[argIndex++]; - }); - if (typeof console !== 'undefined') { - console.error(message); - } - try { - // --- Welcome to debugging React --- - // This error was thrown as a convenience so that you can use this stack - // to find the callsite that caused this warning to fire. - throw new Error(message); - } catch (x) {} - }; - - warning = function warning(condition, format) { - if (format === undefined) { - throw new Error('`warning(condition, format, ...args)` requires a warning ' + 'message argument'); - } - - if (format.indexOf('Failed Composite propType: ') === 0) { - return; // Ignore CompositeComponent proptype check. - } - - if (!condition) { - for (var _len2 = arguments.length, args = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) { - args[_key2 - 2] = arguments[_key2]; - } - - printWarning.apply(undefined, [format].concat(args)); - } - }; -} - -module.exports = warning; - -/***/ }), -/* 2 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * - */ - - -/** - * WARNING: DO NOT manually require this module. - * This is a replacement for `invariant(...)` used by the error code system - * and will _only_ be required by the corresponding babel pass. - * It always throws. - */ - -function reactProdInvariant(code) { - var argCount = arguments.length - 1; - - var message = 'Minified React error #' + code + '; visit ' + 'http://facebook.github.io/react/docs/error-decoder.html?invariant=' + code; - - for (var argIdx = 0; argIdx < argCount; argIdx++) { - message += '&args[]=' + encodeURIComponent(arguments[argIdx + 1]); - } - - message += ' for the full message or use the non-minified dev environment' + ' for full errors and additional helpful warnings.'; - - var error = new Error(message); - error.name = 'Invariant Violation'; - error.framesToPop = 1; // we don't care about reactProdInvariant's own frame - - throw error; -} - -module.exports = reactProdInvariant; - -/***/ }), -/* 3 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; +!function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=9)}([function(e,t,n){e.exports=n(28)()},function(e,t,n){"use strict";e.exports=n(19)},function(e,t,n){var r; +/*! + Copyright (c) 2016 Jed Watson. + Licensed under the MIT License (MIT), see + http://jedwatson.github.io/classnames +*/ +/*! + Copyright (c) 2016 Jed Watson. + Licensed under the MIT License (MIT), see + http://jedwatson.github.io/classnames +*/ +!function(){"use strict";var n={}.hasOwnProperty;function o(){for(var e=[],t=0;t=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}(this.props,[]);return function(e){c.forEach(function(t){return delete e[t]})}(o),o.className=this.props.inputClassName,o.id=this.state.inputId,o.style=n,a.default.createElement("div",{className:this.props.className,style:t},this.renderStyles(),a.default.createElement("input",r({},o,{ref:this.inputRef})),a.default.createElement("div",{ref:this.sizerRef,style:s},e),this.props.placeholder?a.default.createElement("div",{ref:this.placeHolderSizerRef,style:s},this.props.placeholder):null)}}]),t}();h.propTypes={className:l.default.string,defaultValue:l.default.any,id:l.default.string,injectStyles:l.default.bool,inputClassName:l.default.string,inputRef:l.default.func,inputStyle:l.default.object,minWidth:l.default.oneOfType([l.default.number,l.default.string]),onAutosize:l.default.func,onChange:l.default.func,placeholder:l.default.string,placeholderIsMinWidth:l.default.bool,style:l.default.object,value:l.default.any},h.defaultProps={minWidth:1,injectStyles:!0},t.default=h},function(e,t,n){"use strict";n(10);var r=a(n(1)),o=a(n(3)),i=a(n(23));function a(e){return e&&e.__esModule?e:{default:e}}o.default.render(r.default.createElement(i.default,null),document.getElementById("splash-mount"))},function(e,t,n){var r=n(11);"string"==typeof r&&(r=[[e.i,r,""]]);var o={hmr:!0,transform:void 0};n(17)(r,o);r.locals&&(e.exports=r.locals)},function(e,t,n){var r=n(12);(t=e.exports=n(6)(!1)).i(n(13),""),t.push([e.i,"@font-face {\n font-family: Whitney;\n font-style: normal;\n font-weight: 400;\n src: url("+r(n(14))+") format('woff');\n}\n@font-face {\n font-family: Whitney;\n font-style: medium;\n font-weight: 600;\n src: url("+r(n(15))+') format(\'woff\');\n}\n* {\n box-sizing: border-box;\n -webkit-user-select: none;\n cursor: default;\n}\nbody,\nhtml {\n -webkit-app-region: drag;\n padding: 0;\n margin: 0;\n overflow: hidden;\n width: 300px;\n height: 300px;\n}\n#splash {\n -webkit-app-region: drag;\n background: #282b30;\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n z-index: 3000;\n transform: translateZ(0);\n padding-bottom: 40px;\n}\n#splash .splash-inner {\n text-align: center;\n}\n#splash .splash-inner img,\n#splash .splash-inner video {\n size: 200px;\n}\n#splash .splash-inner video {\n visibility: hidden;\n}\n#splash .splash-inner video.loaded {\n visibility: visible;\n}\n#splash .splash-inner > span {\n color: #8a8e94;\n font-size: 12px;\n font-family: Whitney, "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;\n font-weight: 600;\n text-transform: uppercase;\n display: block;\n}\n#splash .splash-inner > span.quote {\n margin-bottom: 10px;\n color: #fff;\n font-weight: 400;\n font-style: italic;\n font-size: 16px;\n}\n#splash .splash-inner-dl .dice-image {\n position: absolute;\n left: 77px;\n top: 45px;\n width: 146px;\n height: 100px;\n background: url('+r(n(16))+') center center no-repeat;\n background-size: 146px 100px;\n}\n#splash .splash-inner-dl .dl-update-message {\n font-family: Whitney, "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;\n font-style: medium;\n font-size: 18px;\n color: #fff;\n padding-left: 20px;\n padding-right: 20px;\n top: 169px;\n left: 0;\n margin: 0;\n position: absolute;\n text-align: center;\n}\n#splash .splash-inner-dl .dl-version-message {\n font-family: Whitney, "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;\n font-style: medium;\n font-size: 12px;\n color: #8a8e94;\n text-transform: uppercase;\n position: absolute;\n width: 100%;\n bottom: 12px;\n left: 0;\n margin: 0;\n text-align: center;\n}\n#splash .splash-inner-dl .dl-select-frame {\n -webkit-app-region: no-drag;\n font-family: Whitney, "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;\n overflow: hidden;\n position: absolute;\n width: 100%;\n height: 130px;\n top: 220px;\n left: 0;\n margin: 0;\n}\n#splash .splash-inner-dl .dl-select-frame .Select {\n position: absolute;\n left: 0;\n top: 0;\n width: 165px;\n height: 44px;\n margin-left: 20px;\n margin-right: 10px;\n color: #fff;\n}\n#splash .splash-inner-dl .dl-select-frame .Select-control {\n border: 1px solid;\n border-color: rgba(255,255,255,0.3);\n border-radius: 3px;\n background: #282b30;\n height: 44px;\n}\n#splash .splash-inner-dl .dl-select-frame .Select-menu-outer {\n background: #282b30;\n}\n#splash .splash-inner-dl .dl-select-frame .Select-menu {\n max-height: 80px;\n}\n#splash .splash-inner-dl .dl-select-frame .Select-option {\n color: #8a8e94;\n line-height: 15px;\n padding: 5px 10px;\n}\n#splash .splash-inner-dl .dl-select-frame .Select-option.is-focused {\n color: #fff;\n background-color: #697ec4;\n}\n#splash .splash-inner-dl .dl-select-frame .Select-value {\n color: #fff;\n bottom: 0;\n align-items: center;\n display: flex;\n}\n#splash .splash-inner-dl .dl-select-frame .Select-input {\n outline: none;\n}\n#splash .splash-inner-dl .dl-select-frame .dl-button {\n position: absolute;\n left: 195px;\n top: 0;\n width: 85px;\n height: 44px;\n background-color: #7289da;\n color: #fff;\n font-size: 14px;\n font-weight: 600;\n border-radius: 3px;\n display: flex;\n justify-content: center;\n align-items: center;\n}\n#splash .splash-inner-dl .dl-select-frame .dl-button:hover {\n background-color: #697ec4;\n}\n.progress {\n display: flex;\n justify-content: center;\n margin-top: 10px;\n}\n.progress .progress-bar {\n height: 8px;\n border-radius: 4px;\n width: 180px;\n background-color: rgba(255,255,255,0.1);\n}\n.progress .progress-bar .complete {\n border-radius: 4px;\n box-shadow: 0px 2px 4px 0px rgba(0,0,0,0.1), inset 0px 1px 0px 0px rgba(255,255,255,0.1);\n height: 100%;\n background-color: #737f8d;\n}\n.progress-placeholder {\n margin-top: 10px;\n height: 8px;\n}\n',""])},function(e,t){e.exports=function(e){return"string"!=typeof e?e:(/^['"].*['"]$/.test(e)&&(e=e.slice(1,-1)),/["'() \t\n]/.test(e)?'"'+e.replace(/"/g,'\\"').replace(/\n/g,"\\n")+'"':e)}},function(e,t,n){(e.exports=n(6)(!1)).push([e.i,"/**\n * React Select\n * ============\n * Created by Jed Watson and Joss Mackison for KeystoneJS, http://www.keystonejs.com/\n * https://twitter.com/jedwatson https://twitter.com/jossmackison https://twitter.com/keystonejs\n * MIT License: https://github.com/keystonejs/react-select\n*/\n.Select {\n position: relative;\n}\n.Select,\n.Select div,\n.Select input,\n.Select span {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n.Select.is-disabled > .Select-control {\n background-color: #f6f6f6;\n}\n.Select.is-disabled .Select-arrow-zone {\n cursor: default;\n pointer-events: none;\n}\n.Select-control {\n background-color: #fff;\n border-color: #d9d9d9 #ccc #b3b3b3;\n border-radius: 4px;\n border: 1px solid #ccc;\n color: #333;\n cursor: default;\n display: table;\n height: 36px;\n outline: none;\n overflow: hidden;\n position: relative;\n width: 100%;\n}\n.Select-control:hover {\n box-shadow: 0 1px 0 rgba(0, 0, 0, 0.06);\n}\n.is-searchable.is-open > .Select-control {\n cursor: text;\n}\n.is-open > .Select-control {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n background: #fff;\n border-color: #b3b3b3 #ccc #d9d9d9;\n}\n.is-open > .Select-control > .Select-arrow {\n border-color: transparent transparent #999;\n border-width: 0 5px 5px;\n}\n.is-searchable.is-focused:not(.is-open) > .Select-control {\n cursor: text;\n}\n.is-focused:not(.is-open) > .Select-control {\n border-color: #08c #0099e6 #0099e6;\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 0 5px -1px rgba(0, 136, 204, 0.5);\n}\n.Select-placeholder {\n bottom: 0;\n color: #aaa;\n left: 0;\n line-height: 34px;\n padding-left: 10px;\n padding-right: 10px;\n position: absolute;\n right: 0;\n top: 0;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.has-value > .Select-control > .Select-placeholder {\n color: #333;\n}\n.Select-value {\n color: #aaa;\n left: 0;\n padding: 8px 52px 8px 10px;\n position: absolute;\n right: -15px;\n top: 0;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.has-value > .Select-control > .Select-value {\n color: #333;\n}\n.Select-input {\n height: 34px;\n padding-left: 10px;\n padding-right: 10px;\n vertical-align: middle;\n}\n.Select-input > input {\n background: none transparent;\n border: 0 none;\n box-shadow: none;\n cursor: default;\n display: inline-block;\n font-family: inherit;\n font-size: inherit;\n height: 34px;\n margin: 0;\n outline: none;\n padding: 0;\n -webkit-appearance: none;\n}\n.is-focused .Select-input > input {\n cursor: text;\n}\n.Select-control:not(.is-searchable) > .Select-input {\n outline: none;\n}\n.Select-loading-zone {\n cursor: pointer;\n display: table-cell;\n position: relative;\n text-align: center;\n vertical-align: middle;\n width: 16px;\n}\n.Select-loading {\n -webkit-animation: Select-animation-spin 400ms infinite linear;\n -o-animation: Select-animation-spin 400ms infinite linear;\n animation: Select-animation-spin 400ms infinite linear;\n width: 16px;\n height: 16px;\n box-sizing: border-box;\n border-radius: 50%;\n border: 2px solid #ccc;\n border-right-color: #333;\n display: inline-block;\n position: relative;\n vertical-align: middle;\n}\n.Select-clear-zone {\n -webkit-animation: Select-animation-fadeIn 200ms;\n -o-animation: Select-animation-fadeIn 200ms;\n animation: Select-animation-fadeIn 200ms;\n color: #999;\n cursor: pointer;\n display: table-cell;\n position: relative;\n text-align: center;\n vertical-align: middle;\n width: 17px;\n}\n.Select-clear-zone:hover {\n color: #d0021b;\n}\n.Select-clear {\n display: inline-block;\n font-size: 18px;\n line-height: 1;\n}\n.Select--multi .Select-clear-zone {\n width: 17px;\n}\n.Select-arrow-zone {\n cursor: pointer;\n display: table-cell;\n position: relative;\n text-align: center;\n vertical-align: middle;\n width: 25px;\n padding-right: 5px;\n}\n.Select-arrow {\n border-color: #999 transparent transparent;\n border-style: solid;\n border-width: 5px 5px 2.5px;\n display: inline-block;\n height: 0;\n width: 0;\n}\n.is-open .Select-arrow,\n.Select-arrow-zone:hover > .Select-arrow {\n border-top-color: #666;\n}\n@-webkit-keyframes Select-animation-fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n@keyframes Select-animation-fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n.Select-menu-outer {\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n background-color: #fff;\n border: 1px solid #ccc;\n border-top-color: #e6e6e6;\n box-shadow: 0 1px 0 rgba(0, 0, 0, 0.06);\n box-sizing: border-box;\n margin-top: -1px;\n max-height: 200px;\n position: absolute;\n top: 100%;\n width: 100%;\n z-index: 1000;\n -webkit-overflow-scrolling: touch;\n}\n.Select-menu {\n max-height: 198px;\n overflow-y: auto;\n}\n.Select-option {\n box-sizing: border-box;\n color: #666666;\n cursor: pointer;\n display: block;\n padding: 8px 10px;\n}\n.Select-option:last-child {\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.Select-option.is-focused {\n background-color: #f2f9fc;\n color: #333;\n}\n.Select-option.is-disabled {\n color: #cccccc;\n cursor: not-allowed;\n}\n.Select-noresults,\n.Select-search-prompt,\n.Select-searching {\n box-sizing: border-box;\n color: #999999;\n cursor: default;\n display: block;\n padding: 8px 10px;\n}\n.Select--multi .Select-input {\n vertical-align: middle;\n margin-left: 10px;\n padding: 0;\n}\n.Select--multi.has-value .Select-input {\n margin-left: 5px;\n}\n.Select-item {\n background-color: #f2f9fc;\n border-radius: 2px;\n border: 1px solid #c9e6f2;\n color: #08c;\n display: inline-block;\n font-size: 0.9em;\n margin-left: 5px;\n margin-top: 5px;\n vertical-align: top;\n}\n.Select-item-icon,\n.Select-item-label {\n display: inline-block;\n vertical-align: middle;\n}\n.Select-item-label {\n border-bottom-right-radius: 2px;\n border-top-right-radius: 2px;\n cursor: default;\n padding: 2px 5px;\n}\n.Select-item-label .Select-item-label__a {\n color: #08c;\n cursor: pointer;\n}\n.Select-item-icon {\n cursor: pointer;\n border-bottom-left-radius: 2px;\n border-top-left-radius: 2px;\n border-right: 1px solid #c9e6f2;\n padding: 1px 5px 3px;\n}\n.Select-item-icon:hover,\n.Select-item-icon:focus {\n background-color: #ddeff7;\n color: #0077b3;\n}\n.Select-item-icon:active {\n background-color: #c9e6f2;\n}\n.Select--multi.is-disabled .Select-item {\n background-color: #f2f2f2;\n border: 1px solid #d9d9d9;\n color: #888;\n}\n.Select--multi.is-disabled .Select-item-icon {\n cursor: not-allowed;\n border-right: 1px solid #d9d9d9;\n}\n.Select--multi.is-disabled .Select-item-icon:hover,\n.Select--multi.is-disabled .Select-item-icon:focus,\n.Select--multi.is-disabled .Select-item-icon:active {\n background-color: #f2f2f2;\n}\n@keyframes Select-animation-spin {\n to {\n transform: rotate(1turn);\n }\n}\n@-webkit-keyframes Select-animation-spin {\n to {\n -webkit-transform: rotate(1turn);\n }\n}\n",""])},function(e,t,n){e.exports=n.p+"d153359b5d87601d2b9c708b7ae2db02.woff"},function(e,t,n){e.exports=n.p+"a934ab008c7f6a2274ec441f6be0696a.woff"},function(e,t,n){e.exports=n.p+"abddffb32a4a35627c3857a06c751424.png"},function(e,t,n){var r,o,i={},a=(r=function(){return window&&document&&document.all&&!window.atob},function(){return void 0===o&&(o=r.apply(this,arguments)),o}),l=function(e){var t={};return function(e){if(void 0===t[e]){var n=function(e){return document.querySelector(e)}.call(this,e);if(n instanceof window.HTMLIFrameElement)try{n=n.contentDocument.head}catch(e){n=null}t[e]=n}return t[e]}}(),u=null,s=0,c=[],p=n(18);function f(e,t){for(var n=0;n=0&&c.splice(t,1)}function v(e){var t=document.createElement("style");return e.attrs.type="text/css",y(t,e.attrs),h(e,t),t}function y(e,t){Object.keys(t).forEach(function(n){e.setAttribute(n,t[n])})}function g(e,t){var n,r,o,i;if(t.transform&&e.css){if(!(i=t.transform(e.css)))return function(){};e.css=i}if(t.singleton){var a=s++;n=u||(u=v(t)),r=x.bind(null,n,a,!1),o=x.bind(null,n,a,!0)}else e.sourceMap&&"function"==typeof URL&&"function"==typeof URL.createObjectURL&&"function"==typeof URL.revokeObjectURL&&"function"==typeof Blob&&"function"==typeof btoa?(n=function(e){var t=document.createElement("link");return e.attrs.type="text/css",e.attrs.rel="stylesheet",y(t,e.attrs),h(e,t),t}(t),r=function(e,t,n){var r=n.css,o=n.sourceMap,i=void 0===t.convertToAbsoluteUrls&&o;(t.convertToAbsoluteUrls||i)&&(r=p(r));o&&(r+="\n/*# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(o))))+" */");var a=new Blob([r],{type:"text/css"}),l=e.href;e.href=URL.createObjectURL(a),l&&URL.revokeObjectURL(l)}.bind(null,n,t),o=function(){m(n),n.href&&URL.revokeObjectURL(n.href)}):(n=v(t),r=function(e,t){var n=t.css,r=t.media;r&&e.setAttribute("media",r);if(e.styleSheet)e.styleSheet.cssText=n;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(n))}}.bind(null,n),o=function(){m(n)});return r(e),function(t){if(t){if(t.css===e.css&&t.media===e.media&&t.sourceMap===e.sourceMap)return;r(e=t)}else o()}}e.exports=function(e,t){if("undefined"!=typeof DEBUG&&DEBUG&&"object"!=typeof document)throw new Error("The style-loader cannot be used in a non-browser environment");(t=t||{}).attrs="object"==typeof t.attrs?t.attrs:{},t.singleton||(t.singleton=a()),t.insertInto||(t.insertInto="head"),t.insertAt||(t.insertAt="bottom");var n=d(e,t);return f(n,t),function(e){for(var r=[],o=0;o DOMProperty.isValid['id'] - * true - * > DOMProperty.isValid['foobar'] - * undefined - * - * Although this may be confusing, it performs better in general. - * - * @see http://jsperf.com/key-exists - * @see http://jsperf.com/key-missing - */ -var DOMProperty = { - ID_ATTRIBUTE_NAME: 'data-reactid', - ROOT_ATTRIBUTE_NAME: 'data-reactroot', - - ATTRIBUTE_NAME_START_CHAR: ATTRIBUTE_NAME_START_CHAR, - ATTRIBUTE_NAME_CHAR: ATTRIBUTE_NAME_START_CHAR + '\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040', - - /** - * Map from property "standard name" to an object with info about how to set - * the property in the DOM. Each object contains: - * - * attributeName: - * Used when rendering markup or with `*Attribute()`. - * attributeNamespace - * propertyName: - * Used on DOM node instances. (This includes properties that mutate due to - * external factors.) - * mutationMethod: - * If non-null, used instead of the property or `setAttribute()` after - * initial render. - * mustUseProperty: - * Whether the property must be accessed and mutated as an object property. - * hasBooleanValue: - * Whether the property should be removed when set to a falsey value. - * hasNumericValue: - * Whether the property must be numeric or parse as a numeric and should be - * removed when set to a falsey value. - * hasPositiveNumericValue: - * Whether the property must be positive numeric or parse as a positive - * numeric and should be removed when set to a falsey value. - * hasOverloadedBooleanValue: - * Whether the property can be used as a flag as well as with a value. - * Removed when strictly equal to false; present without a value when - * strictly equal to true; present with a value otherwise. - */ - properties: {}, - - /** - * Mapping from lowercase property names to the properly cased version, used - * to warn in the case of missing properties. Available only in __DEV__. - * - * autofocus is predefined, because adding it to the property whitelist - * causes unintended side effects. - * - * @type {Object} - */ - getPossibleStandardName: process.env.NODE_ENV !== 'production' ? { autofocus: 'autoFocus' } : null, - - /** - * All of the isCustomAttribute() functions that have been injected. - */ - _isCustomAttributeFunctions: [], - - /** - * Checks whether a property name is a custom attribute. - * @method - */ - isCustomAttribute: function (attributeName) { - for (var i = 0; i < DOMProperty._isCustomAttributeFunctions.length; i++) { - var isCustomAttributeFn = DOMProperty._isCustomAttributeFunctions[i]; - if (isCustomAttributeFn(attributeName)) { - return true; - } - } - return false; - }, - - injection: DOMPropertyInjection -}; - -module.exports = DOMProperty; - -/***/ }), -/* 13 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2014-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var _assign = __webpack_require__(3); - -var ReactCurrentOwner = __webpack_require__(9); - -var warning = __webpack_require__(1); -var canDefineProperty = __webpack_require__(24); -var hasOwnProperty = Object.prototype.hasOwnProperty; - -var REACT_ELEMENT_TYPE = __webpack_require__(54); - -var RESERVED_PROPS = { - key: true, - ref: true, - __self: true, - __source: true -}; - -var specialPropKeyWarningShown, specialPropRefWarningShown; - -function hasValidRef(config) { - if (process.env.NODE_ENV !== 'production') { - if (hasOwnProperty.call(config, 'ref')) { - var getter = Object.getOwnPropertyDescriptor(config, 'ref').get; - if (getter && getter.isReactWarning) { - return false; - } - } - } - return config.ref !== undefined; -} - -function hasValidKey(config) { - if (process.env.NODE_ENV !== 'production') { - if (hasOwnProperty.call(config, 'key')) { - var getter = Object.getOwnPropertyDescriptor(config, 'key').get; - if (getter && getter.isReactWarning) { - return false; - } - } - } - return config.key !== undefined; -} - -function defineKeyPropWarningGetter(props, displayName) { - var warnAboutAccessingKey = function () { - if (!specialPropKeyWarningShown) { - specialPropKeyWarningShown = true; - process.env.NODE_ENV !== 'production' ? warning(false, '%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)', displayName) : void 0; - } - }; - warnAboutAccessingKey.isReactWarning = true; - Object.defineProperty(props, 'key', { - get: warnAboutAccessingKey, - configurable: true - }); -} - -function defineRefPropWarningGetter(props, displayName) { - var warnAboutAccessingRef = function () { - if (!specialPropRefWarningShown) { - specialPropRefWarningShown = true; - process.env.NODE_ENV !== 'production' ? warning(false, '%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)', displayName) : void 0; - } - }; - warnAboutAccessingRef.isReactWarning = true; - Object.defineProperty(props, 'ref', { - get: warnAboutAccessingRef, - configurable: true - }); -} - -/** - * Factory method to create a new React element. This no longer adheres to - * the class pattern, so do not use new to call it. Also, no instanceof check - * will work. Instead test $$typeof field against Symbol.for('react.element') to check - * if something is a React Element. - * - * @param {*} type - * @param {*} key - * @param {string|object} ref - * @param {*} self A *temporary* helper to detect places where `this` is - * different from the `owner` when React.createElement is called, so that we - * can warn. We want to get rid of owner and replace string `ref`s with arrow - * functions, and as long as `this` and owner are the same, there will be no - * change in behavior. - * @param {*} source An annotation object (added by a transpiler or otherwise) - * indicating filename, line number, and/or other information. - * @param {*} owner - * @param {*} props - * @internal - */ -var ReactElement = function (type, key, ref, self, source, owner, props) { - var element = { - // This tag allow us to uniquely identify this as a React Element - $$typeof: REACT_ELEMENT_TYPE, - - // Built-in properties that belong on the element - type: type, - key: key, - ref: ref, - props: props, - - // Record the component responsible for creating this element. - _owner: owner - }; - - if (process.env.NODE_ENV !== 'production') { - // The validation flag is currently mutative. We put it on - // an external backing store so that we can freeze the whole object. - // This can be replaced with a WeakMap once they are implemented in - // commonly used development environments. - element._store = {}; - - // To make comparing ReactElements easier for testing purposes, we make - // the validation flag non-enumerable (where possible, which should - // include every environment we run tests in), so the test framework - // ignores it. - if (canDefineProperty) { - Object.defineProperty(element._store, 'validated', { - configurable: false, - enumerable: false, - writable: true, - value: false - }); - // self and source are DEV only properties. - Object.defineProperty(element, '_self', { - configurable: false, - enumerable: false, - writable: false, - value: self - }); - // Two elements created in two different places should be considered - // equal for testing purposes and therefore we hide it from enumeration. - Object.defineProperty(element, '_source', { - configurable: false, - enumerable: false, - writable: false, - value: source - }); - } else { - element._store.validated = false; - element._self = self; - element._source = source; - } - if (Object.freeze) { - Object.freeze(element.props); - Object.freeze(element); - } - } - - return element; -}; - -/** - * Create and return a new ReactElement of the given type. - * See https://facebook.github.io/react/docs/top-level-api.html#react.createelement - */ -ReactElement.createElement = function (type, config, children) { - var propName; - - // Reserved names are extracted - var props = {}; - - var key = null; - var ref = null; - var self = null; - var source = null; - - if (config != null) { - if (hasValidRef(config)) { - ref = config.ref; - } - if (hasValidKey(config)) { - key = '' + config.key; - } - - self = config.__self === undefined ? null : config.__self; - source = config.__source === undefined ? null : config.__source; - // Remaining properties are added to a new props object - for (propName in config) { - if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { - props[propName] = config[propName]; - } - } - } - - // Children can be more than one argument, and those are transferred onto - // the newly allocated props object. - var childrenLength = arguments.length - 2; - if (childrenLength === 1) { - props.children = children; - } else if (childrenLength > 1) { - var childArray = Array(childrenLength); - for (var i = 0; i < childrenLength; i++) { - childArray[i] = arguments[i + 2]; - } - if (process.env.NODE_ENV !== 'production') { - if (Object.freeze) { - Object.freeze(childArray); - } - } - props.children = childArray; - } - - // Resolve default props - if (type && type.defaultProps) { - var defaultProps = type.defaultProps; - for (propName in defaultProps) { - if (props[propName] === undefined) { - props[propName] = defaultProps[propName]; - } - } - } - if (process.env.NODE_ENV !== 'production') { - if (key || ref) { - if (typeof props.$$typeof === 'undefined' || props.$$typeof !== REACT_ELEMENT_TYPE) { - var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type; - if (key) { - defineKeyPropWarningGetter(props, displayName); - } - if (ref) { - defineRefPropWarningGetter(props, displayName); - } - } - } - } - return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props); -}; - -/** - * Return a function that produces ReactElements of a given type. - * See https://facebook.github.io/react/docs/top-level-api.html#react.createfactory - */ -ReactElement.createFactory = function (type) { - var factory = ReactElement.createElement.bind(null, type); - // Expose the type on the factory and the prototype so that it can be - // easily accessed on elements. E.g. `.type === Foo`. - // This should not be named `constructor` since this may not be the function - // that created the element, and it may not even be a constructor. - // Legacy hook TODO: Warn if this is accessed - factory.type = type; - return factory; -}; - -ReactElement.cloneAndReplaceKey = function (oldElement, newKey) { - var newElement = ReactElement(oldElement.type, newKey, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, oldElement.props); - - return newElement; -}; - -/** - * Clone and return a new ReactElement using element as the starting point. - * See https://facebook.github.io/react/docs/top-level-api.html#react.cloneelement - */ -ReactElement.cloneElement = function (element, config, children) { - var propName; - - // Original props are copied - var props = _assign({}, element.props); - - // Reserved names are extracted - var key = element.key; - var ref = element.ref; - // Self is preserved since the owner is preserved. - var self = element._self; - // Source is preserved since cloneElement is unlikely to be targeted by a - // transpiler, and the original source is probably a better indicator of the - // true owner. - var source = element._source; - - // Owner will be preserved, unless ref is overridden - var owner = element._owner; - - if (config != null) { - if (hasValidRef(config)) { - // Silently steal the ref from the parent. - ref = config.ref; - owner = ReactCurrentOwner.current; - } - if (hasValidKey(config)) { - key = '' + config.key; - } - - // Remaining properties override existing props - var defaultProps; - if (element.type && element.type.defaultProps) { - defaultProps = element.type.defaultProps; - } - for (propName in config) { - if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) { - if (config[propName] === undefined && defaultProps !== undefined) { - // Resolve default props - props[propName] = defaultProps[propName]; - } else { - props[propName] = config[propName]; - } - } - } - } - - // Children can be more than one argument, and those are transferred onto - // the newly allocated props object. - var childrenLength = arguments.length - 2; - if (childrenLength === 1) { - props.children = children; - } else if (childrenLength > 1) { - var childArray = Array(childrenLength); - for (var i = 0; i < childrenLength; i++) { - childArray[i] = arguments[i + 2]; - } - props.children = childArray; - } - - return ReactElement(element.type, key, ref, self, source, owner, props); -}; - -/** - * Verifies the object is a ReactElement. - * See https://facebook.github.io/react/docs/top-level-api.html#react.isvalidelement - * @param {?object} object - * @return {boolean} True if `object` is a valid component. - * @final - */ -ReactElement.isValidElement = function (object) { - return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE; -}; - -module.exports = ReactElement; - -/***/ }), -/* 14 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * - */ - - - -var _prodInvariant = __webpack_require__(2); - -var invariant = __webpack_require__(0); - -/** - * Static poolers. Several custom versions for each potential number of - * arguments. A completely generic pooler is easy to implement, but would - * require accessing the `arguments` object. In each of these, `this` refers to - * the Class itself, not an instance. If any others are needed, simply add them - * here, or in their own files. - */ -var oneArgumentPooler = function (copyFieldsFrom) { - var Klass = this; - if (Klass.instancePool.length) { - var instance = Klass.instancePool.pop(); - Klass.call(instance, copyFieldsFrom); - return instance; - } else { - return new Klass(copyFieldsFrom); - } -}; - -var twoArgumentPooler = function (a1, a2) { - var Klass = this; - if (Klass.instancePool.length) { - var instance = Klass.instancePool.pop(); - Klass.call(instance, a1, a2); - return instance; - } else { - return new Klass(a1, a2); - } -}; - -var threeArgumentPooler = function (a1, a2, a3) { - var Klass = this; - if (Klass.instancePool.length) { - var instance = Klass.instancePool.pop(); - Klass.call(instance, a1, a2, a3); - return instance; - } else { - return new Klass(a1, a2, a3); - } -}; - -var fourArgumentPooler = function (a1, a2, a3, a4) { - var Klass = this; - if (Klass.instancePool.length) { - var instance = Klass.instancePool.pop(); - Klass.call(instance, a1, a2, a3, a4); - return instance; - } else { - return new Klass(a1, a2, a3, a4); - } -}; - -var standardReleaser = function (instance) { - var Klass = this; - !(instance instanceof Klass) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Trying to release an instance into a pool of a different type.') : _prodInvariant('25') : void 0; - instance.destructor(); - if (Klass.instancePool.length < Klass.poolSize) { - Klass.instancePool.push(instance); - } -}; - -var DEFAULT_POOL_SIZE = 10; -var DEFAULT_POOLER = oneArgumentPooler; - -/** - * Augments `CopyConstructor` to be a poolable class, augmenting only the class - * itself (statically) not adding any prototypical fields. Any CopyConstructor - * you give this may have a `poolSize` property, and will look for a - * prototypical `destructor` on instances. - * - * @param {Function} CopyConstructor Constructor that can be used to reset. - * @param {Function} pooler Customizable pooler. - */ -var addPoolingTo = function (CopyConstructor, pooler) { - // Casting as any so that flow ignores the actual implementation and trusts - // it to match the type we declared - var NewKlass = CopyConstructor; - NewKlass.instancePool = []; - NewKlass.getPooled = pooler || DEFAULT_POOLER; - if (!NewKlass.poolSize) { - NewKlass.poolSize = DEFAULT_POOL_SIZE; - } - NewKlass.release = standardReleaser; - return NewKlass; -}; - -var PooledClass = { - addPoolingTo: addPoolingTo, - oneArgumentPooler: oneArgumentPooler, - twoArgumentPooler: twoArgumentPooler, - threeArgumentPooler: threeArgumentPooler, - fourArgumentPooler: fourArgumentPooler -}; - -module.exports = PooledClass; - -/***/ }), -/* 15 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var _assign = __webpack_require__(3); - -var ReactBaseClasses = __webpack_require__(52); -var ReactChildren = __webpack_require__(94); -var ReactDOMFactories = __webpack_require__(98); -var ReactElement = __webpack_require__(13); -var ReactPropTypes = __webpack_require__(102); -var ReactVersion = __webpack_require__(104); - -var createReactClass = __webpack_require__(105); -var onlyChild = __webpack_require__(107); - -var createElement = ReactElement.createElement; -var createFactory = ReactElement.createFactory; -var cloneElement = ReactElement.cloneElement; - -if (process.env.NODE_ENV !== 'production') { - var lowPriorityWarning = __webpack_require__(32); - var canDefineProperty = __webpack_require__(24); - var ReactElementValidator = __webpack_require__(56); - var didWarnPropTypesDeprecated = false; - createElement = ReactElementValidator.createElement; - createFactory = ReactElementValidator.createFactory; - cloneElement = ReactElementValidator.cloneElement; -} - -var __spread = _assign; -var createMixin = function (mixin) { - return mixin; -}; - -if (process.env.NODE_ENV !== 'production') { - var warnedForSpread = false; - var warnedForCreateMixin = false; - __spread = function () { - lowPriorityWarning(warnedForSpread, '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.'); - warnedForSpread = true; - return _assign.apply(null, arguments); - }; - - createMixin = function (mixin) { - lowPriorityWarning(warnedForCreateMixin, 'React.createMixin is deprecated and should not be used. ' + 'In React v16.0, it will be removed. ' + 'You can use this mixin directly instead. ' + 'See https://fb.me/createmixin-was-never-implemented for more info.'); - warnedForCreateMixin = true; - return mixin; - }; -} - -var React = { - // Modern - - Children: { - map: ReactChildren.map, - forEach: ReactChildren.forEach, - count: ReactChildren.count, - toArray: ReactChildren.toArray, - only: onlyChild - }, - - Component: ReactBaseClasses.Component, - PureComponent: ReactBaseClasses.PureComponent, - - createElement: createElement, - cloneElement: cloneElement, - isValidElement: ReactElement.isValidElement, - - // Classic - - PropTypes: ReactPropTypes, - createClass: createReactClass, - createFactory: createFactory, - createMixin: createMixin, - - // This looks DOM specific but these are actually isomorphic helpers - // since they are just generating DOM strings. - DOM: ReactDOMFactories, - - version: ReactVersion, - - // Deprecated hook for JSX spread, don't use this for anything. - __spread: __spread -}; - -if (process.env.NODE_ENV !== 'production') { - var warnedForCreateClass = false; - if (canDefineProperty) { - Object.defineProperty(React, 'PropTypes', { - get: function () { - lowPriorityWarning(didWarnPropTypesDeprecated, 'Accessing PropTypes via the main React package is deprecated,' + ' and will be removed in React v16.0.' + ' Use the latest available v15.* prop-types package from npm instead.' + ' For info on usage, compatibility, migration and more, see ' + 'https://fb.me/prop-types-docs'); - didWarnPropTypesDeprecated = true; - return ReactPropTypes; - } - }); - - Object.defineProperty(React, 'createClass', { - get: function () { - lowPriorityWarning(warnedForCreateClass, 'Accessing createClass via the main React package is deprecated,' + ' and will be removed in React v16.0.' + " Use a plain JavaScript class instead. If you're not yet " + 'ready to migrate, create-react-class v15.* is available ' + 'on npm as a temporary, drop-in replacement. ' + 'For more info see https://fb.me/react-create-class'); - warnedForCreateClass = true; - return createReactClass; - } - }); - } - - // React.DOM factories are deprecated. Wrap these methods so that - // invocations of the React.DOM namespace and alert users to switch - // to the `react-dom-factories` package. - React.DOM = {}; - var warnedForFactories = false; - Object.keys(ReactDOMFactories).forEach(function (factory) { - React.DOM[factory] = function () { - if (!warnedForFactories) { - lowPriorityWarning(false, 'Accessing factories like React.DOM.%s has been deprecated ' + 'and will be removed in v16.0+. Use the ' + 'react-dom-factories package instead. ' + ' Version 1.0 provides a drop-in replacement.' + ' For more info, see https://fb.me/react-dom-factories', factory); - warnedForFactories = true; - } - return ReactDOMFactories[factory].apply(ReactDOMFactories, arguments); - }; - }); -} - -module.exports = React; - -/***/ }), -/* 16 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * - */ - - -/** - * WARNING: DO NOT manually require this module. - * This is a replacement for `invariant(...)` used by the error code system - * and will _only_ be required by the corresponding babel pass. - * It always throws. - */ - -function reactProdInvariant(code) { - var argCount = arguments.length - 1; - - var message = 'Minified React error #' + code + '; visit ' + 'http://facebook.github.io/react/docs/error-decoder.html?invariant=' + code; - - for (var argIdx = 0; argIdx < argCount; argIdx++) { - message += '&args[]=' + encodeURIComponent(arguments[argIdx + 1]); - } - - message += ' for the full message or use the non-minified dev environment' + ' for full errors and additional helpful warnings.'; - - var error = new Error(message); - error.name = 'Invariant Violation'; - error.framesToPop = 1; // we don't care about reactProdInvariant's own frame - - throw error; -} - -module.exports = reactProdInvariant; - -/***/ }), -/* 17 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var ReactRef = __webpack_require__(116); -var ReactInstrumentation = __webpack_require__(8); - -var warning = __webpack_require__(1); - -/** - * Helper to call ReactRef.attachRefs with this composite component, split out - * to avoid allocations in the transaction mount-ready queue. - */ -function attachRefs() { - ReactRef.attachRefs(this, this._currentElement); -} - -var ReactReconciler = { - /** - * Initializes the component, renders markup, and registers event listeners. - * - * @param {ReactComponent} internalInstance - * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction - * @param {?object} the containing host component instance - * @param {?object} info about the host container - * @return {?string} Rendered markup to be inserted into the DOM. - * @final - * @internal - */ - mountComponent: function (internalInstance, transaction, hostParent, hostContainerInfo, context, parentDebugID) // 0 in production and for roots - { - if (process.env.NODE_ENV !== 'production') { - if (internalInstance._debugID !== 0) { - ReactInstrumentation.debugTool.onBeforeMountComponent(internalInstance._debugID, internalInstance._currentElement, parentDebugID); - } - } - var markup = internalInstance.mountComponent(transaction, hostParent, hostContainerInfo, context, parentDebugID); - if (internalInstance._currentElement && internalInstance._currentElement.ref != null) { - transaction.getReactMountReady().enqueue(attachRefs, internalInstance); - } - if (process.env.NODE_ENV !== 'production') { - if (internalInstance._debugID !== 0) { - ReactInstrumentation.debugTool.onMountComponent(internalInstance._debugID); - } - } - return markup; - }, - - /** - * Returns a value that can be passed to - * ReactComponentEnvironment.replaceNodeWithMarkup. - */ - getHostNode: function (internalInstance) { - return internalInstance.getHostNode(); - }, - - /** - * Releases any resources allocated by `mountComponent`. - * - * @final - * @internal - */ - unmountComponent: function (internalInstance, safely) { - if (process.env.NODE_ENV !== 'production') { - if (internalInstance._debugID !== 0) { - ReactInstrumentation.debugTool.onBeforeUnmountComponent(internalInstance._debugID); - } - } - ReactRef.detachRefs(internalInstance, internalInstance._currentElement); - internalInstance.unmountComponent(safely); - if (process.env.NODE_ENV !== 'production') { - if (internalInstance._debugID !== 0) { - ReactInstrumentation.debugTool.onUnmountComponent(internalInstance._debugID); - } - } - }, - - /** - * Update a component using a new element. - * - * @param {ReactComponent} internalInstance - * @param {ReactElement} nextElement - * @param {ReactReconcileTransaction} transaction - * @param {object} context - * @internal - */ - receiveComponent: function (internalInstance, nextElement, transaction, context) { - var prevElement = internalInstance._currentElement; - - if (nextElement === prevElement && context === internalInstance._context) { - // Since elements are immutable after the owner is rendered, - // we can do a cheap identity compare here to determine if this is a - // superfluous reconcile. It's possible for state to be mutable but such - // change should trigger an update of the owner which would recreate - // the element. We explicitly check for the existence of an owner since - // it's possible for an element created outside a composite to be - // deeply mutated and reused. - - // TODO: Bailing out early is just a perf optimization right? - // TODO: Removing the return statement should affect correctness? - return; - } - - if (process.env.NODE_ENV !== 'production') { - if (internalInstance._debugID !== 0) { - ReactInstrumentation.debugTool.onBeforeUpdateComponent(internalInstance._debugID, nextElement); - } - } - - var refsChanged = ReactRef.shouldUpdateRefs(prevElement, nextElement); - - if (refsChanged) { - ReactRef.detachRefs(internalInstance, prevElement); - } - - internalInstance.receiveComponent(nextElement, transaction, context); - - if (refsChanged && internalInstance._currentElement && internalInstance._currentElement.ref != null) { - transaction.getReactMountReady().enqueue(attachRefs, internalInstance); - } - - if (process.env.NODE_ENV !== 'production') { - if (internalInstance._debugID !== 0) { - ReactInstrumentation.debugTool.onUpdateComponent(internalInstance._debugID); - } - } - }, - - /** - * Flush any dirty changes in a component. - * - * @param {ReactComponent} internalInstance - * @param {ReactReconcileTransaction} transaction - * @internal - */ - performUpdateIfNecessary: function (internalInstance, transaction, updateBatchNumber) { - if (internalInstance._updateBatchNumber !== updateBatchNumber) { - // The component's enqueued batch number should always be the current - // batch or the following one. - process.env.NODE_ENV !== 'production' ? warning(internalInstance._updateBatchNumber == null || internalInstance._updateBatchNumber === updateBatchNumber + 1, 'performUpdateIfNecessary: Unexpected batch number (current %s, ' + 'pending %s)', updateBatchNumber, internalInstance._updateBatchNumber) : void 0; - return; - } - if (process.env.NODE_ENV !== 'production') { - if (internalInstance._debugID !== 0) { - ReactInstrumentation.debugTool.onBeforeUpdateComponent(internalInstance._debugID, internalInstance._currentElement); - } - } - internalInstance.performUpdateIfNecessary(transaction); - if (process.env.NODE_ENV !== 'production') { - if (internalInstance._debugID !== 0) { - ReactInstrumentation.debugTool.onUpdateComponent(internalInstance._debugID); - } - } - } -}; - -module.exports = ReactReconciler; - -/***/ }), -/* 18 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2015-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var DOMNamespaces = __webpack_require__(41); -var setInnerHTML = __webpack_require__(29); - -var createMicrosoftUnsafeLocalFunction = __webpack_require__(42); -var setTextContent = __webpack_require__(68); - -var ELEMENT_NODE_TYPE = 1; -var DOCUMENT_FRAGMENT_NODE_TYPE = 11; - -/** - * In IE (8-11) and Edge, appending nodes with no children is dramatically - * faster than appending a full subtree, so we essentially queue up the - * .appendChild calls here and apply them so each node is added to its parent - * before any children are added. - * - * In other browsers, doing so is slower or neutral compared to the other order - * (in Firefox, twice as slow) so we only do this inversion in IE. - * - * See https://github.com/spicyj/innerhtml-vs-createelement-vs-clonenode. - */ -var enableLazy = typeof document !== 'undefined' && typeof document.documentMode === 'number' || typeof navigator !== 'undefined' && typeof navigator.userAgent === 'string' && /\bEdge\/\d/.test(navigator.userAgent); - -function insertTreeChildren(tree) { - if (!enableLazy) { - return; - } - var node = tree.node; - var children = tree.children; - if (children.length) { - for (var i = 0; i < children.length; i++) { - insertTreeBefore(node, children[i], null); - } - } else if (tree.html != null) { - setInnerHTML(node, tree.html); - } else if (tree.text != null) { - setTextContent(node, tree.text); - } -} - -var insertTreeBefore = createMicrosoftUnsafeLocalFunction(function (parentNode, tree, referenceNode) { - // DocumentFragments aren't actually part of the DOM after insertion so - // appending children won't update the DOM. We need to ensure the fragment - // is properly populated first, breaking out of our lazy approach for just - // this level. Also, some plugins (like Flash Player) will read - // nodes immediately upon insertion into the DOM, so - // must also be populated prior to insertion into the DOM. - if (tree.node.nodeType === DOCUMENT_FRAGMENT_NODE_TYPE || tree.node.nodeType === ELEMENT_NODE_TYPE && tree.node.nodeName.toLowerCase() === 'object' && (tree.node.namespaceURI == null || tree.node.namespaceURI === DOMNamespaces.html)) { - insertTreeChildren(tree); - parentNode.insertBefore(tree.node, referenceNode); - } else { - parentNode.insertBefore(tree.node, referenceNode); - insertTreeChildren(tree); - } -}); - -function replaceChildWithTree(oldNode, newTree) { - oldNode.parentNode.replaceChild(newTree.node, oldNode); - insertTreeChildren(newTree); -} - -function queueChild(parentTree, childTree) { - if (enableLazy) { - parentTree.children.push(childTree); - } else { - parentTree.node.appendChild(childTree.node); - } -} - -function queueHTML(tree, html) { - if (enableLazy) { - tree.html = html; - } else { - setInnerHTML(tree.node, html); - } -} - -function queueText(tree, text) { - if (enableLazy) { - tree.text = text; - } else { - setTextContent(tree.node, text); - } -} - -function toString() { - return this.node.nodeName; -} - -function DOMLazyTree(node) { - return { - node: node, - children: [], - html: null, - text: null, - toString: toString - }; -} - -DOMLazyTree.insertTreeBefore = insertTreeBefore; -DOMLazyTree.replaceChildWithTree = replaceChildWithTree; -DOMLazyTree.queueChild = queueChild; -DOMLazyTree.queueHTML = queueHTML; -DOMLazyTree.queueText = queueText; - -module.exports = DOMLazyTree; - -/***/ }), -/* 19 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -module.exports = __webpack_require__(15); - - -/***/ }), -/* 20 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var EventPluginHub = __webpack_require__(21); -var EventPluginUtils = __webpack_require__(35); - -var accumulateInto = __webpack_require__(60); -var forEachAccumulated = __webpack_require__(61); -var warning = __webpack_require__(1); - -var getListener = EventPluginHub.getListener; - -/** - * Some event types have a notion of different registration names for different - * "phases" of propagation. This finds listeners by a given phase. - */ -function listenerAtPhase(inst, event, propagationPhase) { - var registrationName = event.dispatchConfig.phasedRegistrationNames[propagationPhase]; - return getListener(inst, registrationName); -} - -/** - * Tags a `SyntheticEvent` with dispatched listeners. Creating this function - * here, allows us to not have to bind or create functions for each event. - * Mutating the event's members allows us to not have to create a wrapping - * "dispatch" object that pairs the event with the listener. - */ -function accumulateDirectionalDispatches(inst, phase, event) { - if (process.env.NODE_ENV !== 'production') { - process.env.NODE_ENV !== 'production' ? warning(inst, 'Dispatching inst must not be null') : void 0; - } - var listener = listenerAtPhase(inst, event, phase); - if (listener) { - event._dispatchListeners = accumulateInto(event._dispatchListeners, listener); - event._dispatchInstances = accumulateInto(event._dispatchInstances, inst); - } -} - -/** - * Collect dispatches (must be entirely collected before dispatching - see unit - * tests). Lazily allocate the array to conserve memory. We must loop through - * each event and perform the traversal for each one. We cannot perform a - * single traversal for the entire collection of events because each event may - * have a different target. - */ -function accumulateTwoPhaseDispatchesSingle(event) { - if (event && event.dispatchConfig.phasedRegistrationNames) { - EventPluginUtils.traverseTwoPhase(event._targetInst, accumulateDirectionalDispatches, event); - } -} - -/** - * Same as `accumulateTwoPhaseDispatchesSingle`, but skips over the targetID. - */ -function accumulateTwoPhaseDispatchesSingleSkipTarget(event) { - if (event && event.dispatchConfig.phasedRegistrationNames) { - var targetInst = event._targetInst; - var parentInst = targetInst ? EventPluginUtils.getParentInstance(targetInst) : null; - EventPluginUtils.traverseTwoPhase(parentInst, accumulateDirectionalDispatches, event); - } -} - -/** - * Accumulates without regard to direction, does not look for phased - * registration names. Same as `accumulateDirectDispatchesSingle` but without - * requiring that the `dispatchMarker` be the same as the dispatched ID. - */ -function accumulateDispatches(inst, ignoredDirection, event) { - if (event && event.dispatchConfig.registrationName) { - var registrationName = event.dispatchConfig.registrationName; - var listener = getListener(inst, registrationName); - if (listener) { - event._dispatchListeners = accumulateInto(event._dispatchListeners, listener); - event._dispatchInstances = accumulateInto(event._dispatchInstances, inst); - } - } -} - -/** - * Accumulates dispatches on an `SyntheticEvent`, but only for the - * `dispatchMarker`. - * @param {SyntheticEvent} event - */ -function accumulateDirectDispatchesSingle(event) { - if (event && event.dispatchConfig.registrationName) { - accumulateDispatches(event._targetInst, null, event); - } -} - -function accumulateTwoPhaseDispatches(events) { - forEachAccumulated(events, accumulateTwoPhaseDispatchesSingle); -} - -function accumulateTwoPhaseDispatchesSkipTarget(events) { - forEachAccumulated(events, accumulateTwoPhaseDispatchesSingleSkipTarget); -} - -function accumulateEnterLeaveDispatches(leave, enter, from, to) { - EventPluginUtils.traverseEnterLeave(from, to, accumulateDispatches, leave, enter); -} - -function accumulateDirectDispatches(events) { - forEachAccumulated(events, accumulateDirectDispatchesSingle); -} - -/** - * A small set of propagation patterns, each of which will accept a small amount - * of information, and generate a set of "dispatch ready event objects" - which - * are sets of events that have already been annotated with a set of dispatched - * listener functions/ids. The API is designed this way to discourage these - * propagation strategies from actually executing the dispatches, since we - * always want to collect the entire set of dispatches before executing event a - * single one. - * - * @constructor EventPropagators - */ -var EventPropagators = { - accumulateTwoPhaseDispatches: accumulateTwoPhaseDispatches, - accumulateTwoPhaseDispatchesSkipTarget: accumulateTwoPhaseDispatchesSkipTarget, - accumulateDirectDispatches: accumulateDirectDispatches, - accumulateEnterLeaveDispatches: accumulateEnterLeaveDispatches -}; - -module.exports = EventPropagators; - -/***/ }), -/* 21 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var _prodInvariant = __webpack_require__(2); - -var EventPluginRegistry = __webpack_require__(26); -var EventPluginUtils = __webpack_require__(35); -var ReactErrorUtils = __webpack_require__(36); - -var accumulateInto = __webpack_require__(60); -var forEachAccumulated = __webpack_require__(61); -var invariant = __webpack_require__(0); - -/** - * Internal store for event listeners - */ -var listenerBank = {}; - -/** - * Internal queue of events that have accumulated their dispatches and are - * waiting to have their dispatches executed. - */ -var eventQueue = null; - -/** - * Dispatches an event and releases it back into the pool, unless persistent. - * - * @param {?object} event Synthetic event to be dispatched. - * @param {boolean} simulated If the event is simulated (changes exn behavior) - * @private - */ -var executeDispatchesAndRelease = function (event, simulated) { - if (event) { - EventPluginUtils.executeDispatchesInOrder(event, simulated); - - if (!event.isPersistent()) { - event.constructor.release(event); - } - } -}; -var executeDispatchesAndReleaseSimulated = function (e) { - return executeDispatchesAndRelease(e, true); -}; -var executeDispatchesAndReleaseTopLevel = function (e) { - return executeDispatchesAndRelease(e, false); -}; - -var getDictionaryKey = function (inst) { - // Prevents V8 performance issue: - // https://github.com/facebook/react/pull/7232 - return '.' + inst._rootNodeID; -}; - -function isInteractive(tag) { - return tag === 'button' || tag === 'input' || tag === 'select' || tag === 'textarea'; -} - -function shouldPreventMouseEvent(name, type, props) { - switch (name) { - case 'onClick': - case 'onClickCapture': - case 'onDoubleClick': - case 'onDoubleClickCapture': - case 'onMouseDown': - case 'onMouseDownCapture': - case 'onMouseMove': - case 'onMouseMoveCapture': - case 'onMouseUp': - case 'onMouseUpCapture': - return !!(props.disabled && isInteractive(type)); - default: - return false; - } -} - -/** - * This is a unified interface for event plugins to be installed and configured. - * - * Event plugins can implement the following properties: - * - * `extractEvents` {function(string, DOMEventTarget, string, object): *} - * Required. When a top-level event is fired, this method is expected to - * extract synthetic events that will in turn be queued and dispatched. - * - * `eventTypes` {object} - * Optional, plugins that fire events must publish a mapping of registration - * names that are used to register listeners. Values of this mapping must - * be objects that contain `registrationName` or `phasedRegistrationNames`. - * - * `executeDispatch` {function(object, function, string)} - * Optional, allows plugins to override how an event gets dispatched. By - * default, the listener is simply invoked. - * - * Each plugin that is injected into `EventsPluginHub` is immediately operable. - * - * @public - */ -var EventPluginHub = { - /** - * Methods for injecting dependencies. - */ - injection: { - /** - * @param {array} InjectedEventPluginOrder - * @public - */ - injectEventPluginOrder: EventPluginRegistry.injectEventPluginOrder, - - /** - * @param {object} injectedNamesToPlugins Map from names to plugin modules. - */ - injectEventPluginsByName: EventPluginRegistry.injectEventPluginsByName - }, - - /** - * Stores `listener` at `listenerBank[registrationName][key]`. Is idempotent. - * - * @param {object} inst The instance, which is the source of events. - * @param {string} registrationName Name of listener (e.g. `onClick`). - * @param {function} listener The callback to store. - */ - putListener: function (inst, registrationName, listener) { - !(typeof listener === 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Expected %s listener to be a function, instead got type %s', registrationName, typeof listener) : _prodInvariant('94', registrationName, typeof listener) : void 0; - - var key = getDictionaryKey(inst); - var bankForRegistrationName = listenerBank[registrationName] || (listenerBank[registrationName] = {}); - bankForRegistrationName[key] = listener; - - var PluginModule = EventPluginRegistry.registrationNameModules[registrationName]; - if (PluginModule && PluginModule.didPutListener) { - PluginModule.didPutListener(inst, registrationName, listener); - } - }, - - /** - * @param {object} inst The instance, which is the source of events. - * @param {string} registrationName Name of listener (e.g. `onClick`). - * @return {?function} The stored callback. - */ - getListener: function (inst, registrationName) { - // TODO: shouldPreventMouseEvent is DOM-specific and definitely should not - // live here; needs to be moved to a better place soon - var bankForRegistrationName = listenerBank[registrationName]; - if (shouldPreventMouseEvent(registrationName, inst._currentElement.type, inst._currentElement.props)) { - return null; - } - var key = getDictionaryKey(inst); - return bankForRegistrationName && bankForRegistrationName[key]; - }, - - /** - * Deletes a listener from the registration bank. - * - * @param {object} inst The instance, which is the source of events. - * @param {string} registrationName Name of listener (e.g. `onClick`). - */ - deleteListener: function (inst, registrationName) { - var PluginModule = EventPluginRegistry.registrationNameModules[registrationName]; - if (PluginModule && PluginModule.willDeleteListener) { - PluginModule.willDeleteListener(inst, registrationName); - } - - var bankForRegistrationName = listenerBank[registrationName]; - // TODO: This should never be null -- when is it? - if (bankForRegistrationName) { - var key = getDictionaryKey(inst); - delete bankForRegistrationName[key]; - } - }, - - /** - * Deletes all listeners for the DOM element with the supplied ID. - * - * @param {object} inst The instance, which is the source of events. - */ - deleteAllListeners: function (inst) { - var key = getDictionaryKey(inst); - for (var registrationName in listenerBank) { - if (!listenerBank.hasOwnProperty(registrationName)) { - continue; - } - - if (!listenerBank[registrationName][key]) { - continue; - } - - var PluginModule = EventPluginRegistry.registrationNameModules[registrationName]; - if (PluginModule && PluginModule.willDeleteListener) { - PluginModule.willDeleteListener(inst, registrationName); - } - - delete listenerBank[registrationName][key]; - } - }, - - /** - * Allows registered plugins an opportunity to extract events from top-level - * native browser events. - * - * @return {*} An accumulation of synthetic events. - * @internal - */ - extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) { - var events; - var plugins = EventPluginRegistry.plugins; - for (var i = 0; i < plugins.length; i++) { - // Not every plugin in the ordering may be loaded at runtime. - var possiblePlugin = plugins[i]; - if (possiblePlugin) { - var extractedEvents = possiblePlugin.extractEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget); - if (extractedEvents) { - events = accumulateInto(events, extractedEvents); - } - } - } - return events; - }, - - /** - * Enqueues a synthetic event that should be dispatched when - * `processEventQueue` is invoked. - * - * @param {*} events An accumulation of synthetic events. - * @internal - */ - enqueueEvents: function (events) { - if (events) { - eventQueue = accumulateInto(eventQueue, events); - } - }, - - /** - * Dispatches all synthetic events on the event queue. - * - * @internal - */ - processEventQueue: function (simulated) { - // Set `eventQueue` to null before processing it so that we can tell if more - // events get enqueued while processing. - var processingEventQueue = eventQueue; - eventQueue = null; - if (simulated) { - forEachAccumulated(processingEventQueue, executeDispatchesAndReleaseSimulated); - } else { - forEachAccumulated(processingEventQueue, executeDispatchesAndReleaseTopLevel); - } - !!eventQueue ? process.env.NODE_ENV !== 'production' ? invariant(false, 'processEventQueue(): Additional events were enqueued while processing an event queue. Support for this has not yet been implemented.') : _prodInvariant('95') : void 0; - // This would be a good time to rethrow if any of the event handlers threw. - ReactErrorUtils.rethrowCaughtError(); - }, - - /** - * These are needed for tests only. Do not use! - */ - __purge: function () { - listenerBank = {}; - }, - - __getListenerBank: function () { - return listenerBank; - } -}; - -module.exports = EventPluginHub; - -/***/ }), -/* 22 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var SyntheticEvent = __webpack_require__(11); - -var getEventTarget = __webpack_require__(37); - -/** - * @interface UIEvent - * @see http://www.w3.org/TR/DOM-Level-3-Events/ - */ -var UIEventInterface = { - view: function (event) { - if (event.view) { - return event.view; - } - - var target = getEventTarget(event); - if (target.window === target) { - // target is a window object - return target; - } - - var doc = target.ownerDocument; - // TODO: Figure out why `ownerDocument` is sometimes undefined in IE8. - if (doc) { - return doc.defaultView || doc.parentWindow; - } else { - return window; - } - }, - detail: function (event) { - return event.detail || 0; - } -}; - -/** - * @param {object} dispatchConfig Configuration used to dispatch this event. - * @param {string} dispatchMarker Marker identifying the event target. - * @param {object} nativeEvent Native browser event. - * @extends {SyntheticEvent} - */ -function SyntheticUIEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) { - return SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget); -} - -SyntheticEvent.augmentClass(SyntheticUIEvent, UIEventInterface); - -module.exports = SyntheticUIEvent; - -/***/ }), -/* 23 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -/** - * `ReactInstanceMap` maintains a mapping from a public facing stateful - * instance (key) and the internal representation (value). This allows public - * methods to accept the user facing instance as an argument and map them back - * to internal methods. - */ - -// TODO: Replace this with ES6: var ReactInstanceMap = new Map(); - -var ReactInstanceMap = { - /** - * This API should be called `delete` but we'd have to make sure to always - * transform these to strings for IE support. When this transform is fully - * supported we can rename it. - */ - remove: function (key) { - key._reactInternalInstance = undefined; - }, - - get: function (key) { - return key._reactInternalInstance; - }, - - has: function (key) { - return key._reactInternalInstance !== undefined; - }, - - set: function (key, value) { - key._reactInternalInstance = value; - } -}; - -module.exports = ReactInstanceMap; - -/***/ }), -/* 24 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * - */ - - - -var canDefineProperty = false; -if (process.env.NODE_ENV !== 'production') { - try { - // $FlowFixMe https://github.com/facebook/flow/issues/285 - Object.defineProperty({}, 'x', { get: function () {} }); - canDefineProperty = true; - } catch (x) { - // IE will fail on defineProperty - } -} - -module.exports = canDefineProperty; - -/***/ }), -/* 25 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var emptyObject = {}; - -if (process.env.NODE_ENV !== 'production') { - Object.freeze(emptyObject); -} - -module.exports = emptyObject; - -/***/ }), -/* 26 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * - */ - - - -var _prodInvariant = __webpack_require__(2); - -var invariant = __webpack_require__(0); - -/** - * Injectable ordering of event plugins. - */ -var eventPluginOrder = null; - -/** - * Injectable mapping from names to event plugin modules. - */ -var namesToPlugins = {}; - -/** - * Recomputes the plugin list using the injected plugins and plugin ordering. - * - * @private - */ -function recomputePluginOrdering() { - if (!eventPluginOrder) { - // Wait until an `eventPluginOrder` is injected. - return; - } - for (var pluginName in namesToPlugins) { - var pluginModule = namesToPlugins[pluginName]; - var pluginIndex = eventPluginOrder.indexOf(pluginName); - !(pluginIndex > -1) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginRegistry: Cannot inject event plugins that do not exist in the plugin ordering, `%s`.', pluginName) : _prodInvariant('96', pluginName) : void 0; - if (EventPluginRegistry.plugins[pluginIndex]) { - continue; - } - !pluginModule.extractEvents ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginRegistry: Event plugins must implement an `extractEvents` method, but `%s` does not.', pluginName) : _prodInvariant('97', pluginName) : void 0; - EventPluginRegistry.plugins[pluginIndex] = pluginModule; - var publishedEvents = pluginModule.eventTypes; - for (var eventName in publishedEvents) { - !publishEventForPlugin(publishedEvents[eventName], pluginModule, eventName) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginRegistry: Failed to publish event `%s` for plugin `%s`.', eventName, pluginName) : _prodInvariant('98', eventName, pluginName) : void 0; - } - } -} - -/** - * Publishes an event so that it can be dispatched by the supplied plugin. - * - * @param {object} dispatchConfig Dispatch configuration for the event. - * @param {object} PluginModule Plugin publishing the event. - * @return {boolean} True if the event was successfully published. - * @private - */ -function publishEventForPlugin(dispatchConfig, pluginModule, eventName) { - !!EventPluginRegistry.eventNameDispatchConfigs.hasOwnProperty(eventName) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginHub: More than one plugin attempted to publish the same event name, `%s`.', eventName) : _prodInvariant('99', eventName) : void 0; - EventPluginRegistry.eventNameDispatchConfigs[eventName] = dispatchConfig; - - var phasedRegistrationNames = dispatchConfig.phasedRegistrationNames; - if (phasedRegistrationNames) { - for (var phaseName in phasedRegistrationNames) { - if (phasedRegistrationNames.hasOwnProperty(phaseName)) { - var phasedRegistrationName = phasedRegistrationNames[phaseName]; - publishRegistrationName(phasedRegistrationName, pluginModule, eventName); - } - } - return true; - } else if (dispatchConfig.registrationName) { - publishRegistrationName(dispatchConfig.registrationName, pluginModule, eventName); - return true; - } - return false; -} - -/** - * Publishes a registration name that is used to identify dispatched events and - * can be used with `EventPluginHub.putListener` to register listeners. - * - * @param {string} registrationName Registration name to add. - * @param {object} PluginModule Plugin publishing the event. - * @private - */ -function publishRegistrationName(registrationName, pluginModule, eventName) { - !!EventPluginRegistry.registrationNameModules[registrationName] ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginHub: More than one plugin attempted to publish the same registration name, `%s`.', registrationName) : _prodInvariant('100', registrationName) : void 0; - EventPluginRegistry.registrationNameModules[registrationName] = pluginModule; - EventPluginRegistry.registrationNameDependencies[registrationName] = pluginModule.eventTypes[eventName].dependencies; - - if (process.env.NODE_ENV !== 'production') { - var lowerCasedName = registrationName.toLowerCase(); - EventPluginRegistry.possibleRegistrationNames[lowerCasedName] = registrationName; - - if (registrationName === 'onDoubleClick') { - EventPluginRegistry.possibleRegistrationNames.ondblclick = registrationName; - } - } -} - -/** - * Registers plugins so that they can extract and dispatch events. - * - * @see {EventPluginHub} - */ -var EventPluginRegistry = { - /** - * Ordered list of injected plugins. - */ - plugins: [], - - /** - * Mapping from event name to dispatch config - */ - eventNameDispatchConfigs: {}, - - /** - * Mapping from registration name to plugin module - */ - registrationNameModules: {}, - - /** - * Mapping from registration name to event name - */ - registrationNameDependencies: {}, - - /** - * Mapping from lowercase registration names to the properly cased version, - * used to warn in the case of missing event handlers. Available - * only in __DEV__. - * @type {Object} - */ - possibleRegistrationNames: process.env.NODE_ENV !== 'production' ? {} : null, - // Trust the developer to only use possibleRegistrationNames in __DEV__ - - /** - * Injects an ordering of plugins (by plugin name). This allows the ordering - * to be decoupled from injection of the actual plugins so that ordering is - * always deterministic regardless of packaging, on-the-fly injection, etc. - * - * @param {array} InjectedEventPluginOrder - * @internal - * @see {EventPluginHub.injection.injectEventPluginOrder} - */ - injectEventPluginOrder: function (injectedEventPluginOrder) { - !!eventPluginOrder ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginRegistry: Cannot inject event plugin ordering more than once. You are likely trying to load more than one copy of React.') : _prodInvariant('101') : void 0; - // Clone the ordering so it cannot be dynamically mutated. - eventPluginOrder = Array.prototype.slice.call(injectedEventPluginOrder); - recomputePluginOrdering(); - }, - - /** - * Injects plugins to be used by `EventPluginHub`. The plugin names must be - * in the ordering injected by `injectEventPluginOrder`. - * - * Plugins can be injected as part of page initialization or on-the-fly. - * - * @param {object} injectedNamesToPlugins Map from names to plugin modules. - * @internal - * @see {EventPluginHub.injection.injectEventPluginsByName} - */ - injectEventPluginsByName: function (injectedNamesToPlugins) { - var isOrderingDirty = false; - for (var pluginName in injectedNamesToPlugins) { - if (!injectedNamesToPlugins.hasOwnProperty(pluginName)) { - continue; - } - var pluginModule = injectedNamesToPlugins[pluginName]; - if (!namesToPlugins.hasOwnProperty(pluginName) || namesToPlugins[pluginName] !== pluginModule) { - !!namesToPlugins[pluginName] ? process.env.NODE_ENV !== 'production' ? invariant(false, 'EventPluginRegistry: Cannot inject two different event plugins using the same name, `%s`.', pluginName) : _prodInvariant('102', pluginName) : void 0; - namesToPlugins[pluginName] = pluginModule; - isOrderingDirty = true; - } - } - if (isOrderingDirty) { - recomputePluginOrdering(); - } - }, - - /** - * Looks up the plugin for the supplied event. - * - * @param {object} event A synthetic event. - * @return {?object} The plugin that created the supplied event. - * @internal - */ - getPluginModuleForEvent: function (event) { - var dispatchConfig = event.dispatchConfig; - if (dispatchConfig.registrationName) { - return EventPluginRegistry.registrationNameModules[dispatchConfig.registrationName] || null; - } - if (dispatchConfig.phasedRegistrationNames !== undefined) { - // pulling phasedRegistrationNames out of dispatchConfig helps Flow see - // that it is not undefined. - var phasedRegistrationNames = dispatchConfig.phasedRegistrationNames; - - for (var phase in phasedRegistrationNames) { - if (!phasedRegistrationNames.hasOwnProperty(phase)) { - continue; - } - var pluginModule = EventPluginRegistry.registrationNameModules[phasedRegistrationNames[phase]]; - if (pluginModule) { - return pluginModule; - } - } - } - return null; - }, - - /** - * Exposed for unit testing. - * @private - */ - _resetEventPlugins: function () { - eventPluginOrder = null; - for (var pluginName in namesToPlugins) { - if (namesToPlugins.hasOwnProperty(pluginName)) { - delete namesToPlugins[pluginName]; - } - } - EventPluginRegistry.plugins.length = 0; - - var eventNameDispatchConfigs = EventPluginRegistry.eventNameDispatchConfigs; - for (var eventName in eventNameDispatchConfigs) { - if (eventNameDispatchConfigs.hasOwnProperty(eventName)) { - delete eventNameDispatchConfigs[eventName]; - } - } - - var registrationNameModules = EventPluginRegistry.registrationNameModules; - for (var registrationName in registrationNameModules) { - if (registrationNameModules.hasOwnProperty(registrationName)) { - delete registrationNameModules[registrationName]; - } - } - - if (process.env.NODE_ENV !== 'production') { - var possibleRegistrationNames = EventPluginRegistry.possibleRegistrationNames; - for (var lowerCasedName in possibleRegistrationNames) { - if (possibleRegistrationNames.hasOwnProperty(lowerCasedName)) { - delete possibleRegistrationNames[lowerCasedName]; - } - } - } - } -}; - -module.exports = EventPluginRegistry; - -/***/ }), -/* 27 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * - */ - - - -var _prodInvariant = __webpack_require__(2); - -var invariant = __webpack_require__(0); - -var OBSERVED_ERROR = {}; - -/** - * `Transaction` creates a black box that is able to wrap any method such that - * certain invariants are maintained before and after the method is invoked - * (Even if an exception is thrown while invoking the wrapped method). Whoever - * instantiates a transaction can provide enforcers of the invariants at - * creation time. The `Transaction` class itself will supply one additional - * automatic invariant for you - the invariant that any transaction instance - * should not be run while it is already being run. You would typically create a - * single instance of a `Transaction` for reuse multiple times, that potentially - * is used to wrap several different methods. Wrappers are extremely simple - - * they only require implementing two methods. - * - *
- *                       wrappers (injected at creation time)
- *                                      +        +
- *                                      |        |
- *                    +-----------------|--------|--------------+
- *                    |                 v        |              |
- *                    |      +---------------+   |              |
- *                    |   +--|    wrapper1   |---|----+         |
- *                    |   |  +---------------+   v    |         |
- *                    |   |          +-------------+  |         |
- *                    |   |     +----|   wrapper2  |--------+   |
- *                    |   |     |    +-------------+  |     |   |
- *                    |   |     |                     |     |   |
- *                    |   v     v                     v     v   | wrapper
- *                    | +---+ +---+   +---------+   +---+ +---+ | invariants
- * perform(anyMethod) | |   | |   |   |         |   |   | |   | | maintained
- * +----------------->|-|---|-|---|-->|anyMethod|---|---|-|---|-|-------->
- *                    | |   | |   |   |         |   |   | |   | |
- *                    | |   | |   |   |         |   |   | |   | |
- *                    | |   | |   |   |         |   |   | |   | |
- *                    | +---+ +---+   +---------+   +---+ +---+ |
- *                    |  initialize                    close    |
- *                    +-----------------------------------------+
- * 
- * - * Use cases: - * - Preserving the input selection ranges before/after reconciliation. - * Restoring selection even in the event of an unexpected error. - * - Deactivating events while rearranging the DOM, preventing blurs/focuses, - * while guaranteeing that afterwards, the event system is reactivated. - * - Flushing a queue of collected DOM mutations to the main UI thread after a - * reconciliation takes place in a worker thread. - * - Invoking any collected `componentDidUpdate` callbacks after rendering new - * content. - * - (Future use case): Wrapping particular flushes of the `ReactWorker` queue - * to preserve the `scrollTop` (an automatic scroll aware DOM). - * - (Future use case): Layout calculations before and after DOM updates. - * - * Transactional plugin API: - * - A module that has an `initialize` method that returns any precomputation. - * - and a `close` method that accepts the precomputation. `close` is invoked - * when the wrapped process is completed, or has failed. - * - * @param {Array} transactionWrapper Wrapper modules - * that implement `initialize` and `close`. - * @return {Transaction} Single transaction for reuse in thread. - * - * @class Transaction - */ -var TransactionImpl = { - /** - * Sets up this instance so that it is prepared for collecting metrics. Does - * so such that this setup method may be used on an instance that is already - * initialized, in a way that does not consume additional memory upon reuse. - * That can be useful if you decide to make your subclass of this mixin a - * "PooledClass". - */ - reinitializeTransaction: function () { - this.transactionWrappers = this.getTransactionWrappers(); - if (this.wrapperInitData) { - this.wrapperInitData.length = 0; - } else { - this.wrapperInitData = []; - } - this._isInTransaction = false; - }, - - _isInTransaction: false, - - /** - * @abstract - * @return {Array} Array of transaction wrappers. - */ - getTransactionWrappers: null, - - isInTransaction: function () { - return !!this._isInTransaction; - }, - - /* eslint-disable space-before-function-paren */ - - /** - * Executes the function within a safety window. Use this for the top level - * methods that result in large amounts of computation/mutations that would - * need to be safety checked. The optional arguments helps prevent the need - * to bind in many cases. - * - * @param {function} method Member of scope to call. - * @param {Object} scope Scope to invoke from. - * @param {Object?=} a Argument to pass to the method. - * @param {Object?=} b Argument to pass to the method. - * @param {Object?=} c Argument to pass to the method. - * @param {Object?=} d Argument to pass to the method. - * @param {Object?=} e Argument to pass to the method. - * @param {Object?=} f Argument to pass to the method. - * - * @return {*} Return value from `method`. - */ - perform: function (method, scope, a, b, c, d, e, f) { - /* eslint-enable space-before-function-paren */ - !!this.isInTransaction() ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Transaction.perform(...): Cannot initialize a transaction when there is already an outstanding transaction.') : _prodInvariant('27') : void 0; - var errorThrown; - var ret; - try { - this._isInTransaction = true; - // Catching errors makes debugging more difficult, so we start with - // errorThrown set to true before setting it to false after calling - // close -- if it's still set to true in the finally block, it means - // one of these calls threw. - errorThrown = true; - this.initializeAll(0); - ret = method.call(scope, a, b, c, d, e, f); - errorThrown = false; - } finally { - try { - if (errorThrown) { - // If `method` throws, prefer to show that stack trace over any thrown - // by invoking `closeAll`. - try { - this.closeAll(0); - } catch (err) {} - } else { - // Since `method` didn't throw, we don't want to silence the exception - // here. - this.closeAll(0); - } - } finally { - this._isInTransaction = false; - } - } - return ret; - }, - - initializeAll: function (startIndex) { - var transactionWrappers = this.transactionWrappers; - for (var i = startIndex; i < transactionWrappers.length; i++) { - var wrapper = transactionWrappers[i]; - try { - // Catching errors makes debugging more difficult, so we start with the - // OBSERVED_ERROR state before overwriting it with the real return value - // of initialize -- if it's still set to OBSERVED_ERROR in the finally - // block, it means wrapper.initialize threw. - this.wrapperInitData[i] = OBSERVED_ERROR; - this.wrapperInitData[i] = wrapper.initialize ? wrapper.initialize.call(this) : null; - } finally { - if (this.wrapperInitData[i] === OBSERVED_ERROR) { - // The initializer for wrapper i threw an error; initialize the - // remaining wrappers but silence any exceptions from them to ensure - // that the first error is the one to bubble up. - try { - this.initializeAll(i + 1); - } catch (err) {} - } - } - } - }, - - /** - * Invokes each of `this.transactionWrappers.close[i]` functions, passing into - * them the respective return values of `this.transactionWrappers.init[i]` - * (`close`rs that correspond to initializers that failed will not be - * invoked). - */ - closeAll: function (startIndex) { - !this.isInTransaction() ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Transaction.closeAll(): Cannot close transaction when none are open.') : _prodInvariant('28') : void 0; - var transactionWrappers = this.transactionWrappers; - for (var i = startIndex; i < transactionWrappers.length; i++) { - var wrapper = transactionWrappers[i]; - var initData = this.wrapperInitData[i]; - var errorThrown; - try { - // Catching errors makes debugging more difficult, so we start with - // errorThrown set to true before setting it to false after calling - // close -- if it's still set to true in the finally block, it means - // wrapper.close threw. - errorThrown = true; - if (initData !== OBSERVED_ERROR && wrapper.close) { - wrapper.close.call(this, initData); - } - errorThrown = false; - } finally { - if (errorThrown) { - // The closer for wrapper i threw an error; close the remaining - // wrappers but silence any exceptions from them to ensure that the - // first error is the one to bubble up. - try { - this.closeAll(i + 1); - } catch (e) {} - } - } - } - this.wrapperInitData.length = 0; - } -}; - -module.exports = TransactionImpl; - -/***/ }), -/* 28 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var SyntheticUIEvent = __webpack_require__(22); -var ViewportMetrics = __webpack_require__(67); - -var getEventModifierState = __webpack_require__(39); - -/** - * @interface MouseEvent - * @see http://www.w3.org/TR/DOM-Level-3-Events/ - */ -var MouseEventInterface = { - screenX: null, - screenY: null, - clientX: null, - clientY: null, - ctrlKey: null, - shiftKey: null, - altKey: null, - metaKey: null, - getModifierState: getEventModifierState, - button: function (event) { - // Webkit, Firefox, IE9+ - // which: 1 2 3 - // button: 0 1 2 (standard) - var button = event.button; - if ('which' in event) { - return button; - } - // IE<9 - // which: undefined - // button: 0 0 0 - // button: 1 4 2 (onmouseup) - return button === 2 ? 2 : button === 4 ? 1 : 0; - }, - buttons: null, - relatedTarget: function (event) { - return event.relatedTarget || (event.fromElement === event.srcElement ? event.toElement : event.fromElement); - }, - // "Proprietary" Interface. - pageX: function (event) { - return 'pageX' in event ? event.pageX : event.clientX + ViewportMetrics.currentScrollLeft; - }, - pageY: function (event) { - return 'pageY' in event ? event.pageY : event.clientY + ViewportMetrics.currentScrollTop; - } -}; - -/** - * @param {object} dispatchConfig Configuration used to dispatch this event. - * @param {string} dispatchMarker Marker identifying the event target. - * @param {object} nativeEvent Native browser event. - * @extends {SyntheticUIEvent} - */ -function SyntheticMouseEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) { - return SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget); -} - -SyntheticUIEvent.augmentClass(SyntheticMouseEvent, MouseEventInterface); - -module.exports = SyntheticMouseEvent; - -/***/ }), -/* 29 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var ExecutionEnvironment = __webpack_require__(5); -var DOMNamespaces = __webpack_require__(41); - -var WHITESPACE_TEST = /^[ \r\n\t\f]/; -var NONVISIBLE_TEST = /<(!--|link|noscript|meta|script|style)[ \r\n\t\f\/>]/; - -var createMicrosoftUnsafeLocalFunction = __webpack_require__(42); - -// SVG temp container for IE lacking innerHTML -var reusableSVGContainer; - -/** - * Set the innerHTML property of a node, ensuring that whitespace is preserved - * even in IE8. - * - * @param {DOMElement} node - * @param {string} html - * @internal - */ -var setInnerHTML = createMicrosoftUnsafeLocalFunction(function (node, html) { - // IE does not have innerHTML for SVG nodes, so instead we inject the - // new markup in a temp node and then move the child nodes across into - // the target node - if (node.namespaceURI === DOMNamespaces.svg && !('innerHTML' in node)) { - reusableSVGContainer = reusableSVGContainer || document.createElement('div'); - reusableSVGContainer.innerHTML = '' + html + ''; - var svgNode = reusableSVGContainer.firstChild; - while (svgNode.firstChild) { - node.appendChild(svgNode.firstChild); - } - } else { - node.innerHTML = html; - } -}); - -if (ExecutionEnvironment.canUseDOM) { - // IE8: When updating a just created node with innerHTML only leading - // whitespace is removed. When updating an existing node with innerHTML - // whitespace in root TextNodes is also collapsed. - // @see quirksmode.org/bugreports/archives/2004/11/innerhtml_and_t.html - - // Feature detection; only IE8 is known to behave improperly like this. - var testElement = document.createElement('div'); - testElement.innerHTML = ' '; - if (testElement.innerHTML === '') { - setInnerHTML = function (node, html) { - // Magic theory: IE8 supposedly differentiates between added and updated - // nodes when processing innerHTML, innerHTML on updated nodes suffers - // from worse whitespace behavior. Re-adding a node like this triggers - // the initial and more favorable whitespace behavior. - // TODO: What to do on a detached node? - if (node.parentNode) { - node.parentNode.replaceChild(node, node); - } - - // We also implement a workaround for non-visible tags disappearing into - // thin air on IE8, this only happens if there is no visible text - // in-front of the non-visible tags. Piggyback on the whitespace fix - // and simply check if any non-visible tags appear in the source. - if (WHITESPACE_TEST.test(html) || html[0] === '<' && NONVISIBLE_TEST.test(html)) { - // Recover leading whitespace by temporarily prepending any character. - // \uFEFF has the potential advantage of being zero-width/invisible. - // UglifyJS drops U+FEFF chars when parsing, so use String.fromCharCode - // in hopes that this is preserved even if "\uFEFF" is transformed to - // the actual Unicode character (by Babel, for example). - // https://github.com/mishoo/UglifyJS2/blob/v2.4.20/lib/parse.js#L216 - node.innerHTML = String.fromCharCode(0xfeff) + html; - - // deleteData leaves an empty `TextNode` which offsets the index of all - // children. Definitely want to avoid this. - var textNode = node.firstChild; - if (textNode.data.length === 1) { - node.removeChild(textNode); - } else { - textNode.deleteData(0, 1); - } - } else { - node.innerHTML = html; - } - }; - } - testElement = null; -} - -module.exports = setInnerHTML; - -/***/ }), -/* 30 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2016-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * Based on the escape-html library, which is used under the MIT License below: - * - * Copyright (c) 2012-2013 TJ Holowaychuk - * Copyright (c) 2015 Andreas Lubbe - * Copyright (c) 2015 Tiancheng "Timothy" Gu - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files (the - * 'Software'), to deal in the Software without restriction, including - * without limitation the rights to use, copy, modify, merge, publish, - * distribute, sublicense, and/or sell copies of the Software, and to - * permit persons to whom the Software is furnished to do so, subject to - * the following conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - - - -// code copied and modified from escape-html -/** - * Module variables. - * @private - */ - -var matchHtmlRegExp = /["'&<>]/; - -/** - * Escape special characters in the given string of html. - * - * @param {string} string The string to escape for inserting into HTML - * @return {string} - * @public - */ - -function escapeHtml(string) { - var str = '' + string; - var match = matchHtmlRegExp.exec(str); - - if (!match) { - return str; - } - - var escape; - var html = ''; - var index = 0; - var lastIndex = 0; - - for (index = match.index; index < str.length; index++) { - switch (str.charCodeAt(index)) { - case 34: - // " - escape = '"'; - break; - case 38: - // & - escape = '&'; - break; - case 39: - // ' - escape = '''; // modified from escape-html; used to be ''' - break; - case 60: - // < - escape = '<'; - break; - case 62: - // > - escape = '>'; - break; - default: - continue; - } - - if (lastIndex !== index) { - html += str.substring(lastIndex, index); - } - - lastIndex = index + 1; - html += escape; - } - - return lastIndex !== index ? html + str.substring(lastIndex, index) : html; -} -// end code copied and modified from escape-html - -/** - * Escapes text to prevent scripting attacks. - * - * @param {*} text Text value to escape. - * @return {string} An escaped string. - */ -function escapeTextContentForBrowser(text) { - if (typeof text === 'boolean' || typeof text === 'number') { - // this shortcircuit helps perf for types that we know will never have - // special characters, especially given that this function is used often - // for numeric dom ids. - return '' + text; - } - return escapeHtml(text); -} - -module.exports = escapeTextContentForBrowser; - -/***/ }), -/* 31 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var _assign = __webpack_require__(3); - -var EventPluginRegistry = __webpack_require__(26); -var ReactEventEmitterMixin = __webpack_require__(142); -var ViewportMetrics = __webpack_require__(67); - -var getVendorPrefixedEventName = __webpack_require__(143); -var isEventSupported = __webpack_require__(38); - -/** - * Summary of `ReactBrowserEventEmitter` event handling: - * - * - Top-level delegation is used to trap most native browser events. This - * may only occur in the main thread and is the responsibility of - * ReactEventListener, which is injected and can therefore support pluggable - * event sources. This is the only work that occurs in the main thread. - * - * - We normalize and de-duplicate events to account for browser quirks. This - * may be done in the worker thread. - * - * - Forward these native events (with the associated top-level type used to - * trap it) to `EventPluginHub`, which in turn will ask plugins if they want - * to extract any synthetic events. - * - * - The `EventPluginHub` will then process each event by annotating them with - * "dispatches", a sequence of listeners and IDs that care about that event. - * - * - The `EventPluginHub` then dispatches the events. - * - * Overview of React and the event system: - * - * +------------+ . - * | DOM | . - * +------------+ . - * | . - * v . - * +------------+ . - * | ReactEvent | . - * | Listener | . - * +------------+ . +-----------+ - * | . +--------+|SimpleEvent| - * | . | |Plugin | - * +-----|------+ . v +-----------+ - * | | | . +--------------+ +------------+ - * | +-----------.--->|EventPluginHub| | Event | - * | | . | | +-----------+ | Propagators| - * | ReactEvent | . | | |TapEvent | |------------| - * | Emitter | . | |<---+|Plugin | |other plugin| - * | | . | | +-----------+ | utilities | - * | +-----------.--->| | +------------+ - * | | | . +--------------+ - * +-----|------+ . ^ +-----------+ - * | . | |Enter/Leave| - * + . +-------+|Plugin | - * +-------------+ . +-----------+ - * | application | . - * |-------------| . - * | | . - * | | . - * +-------------+ . - * . - * React Core . General Purpose Event Plugin System - */ - -var hasEventPageXY; -var alreadyListeningTo = {}; -var isMonitoringScrollValue = false; -var reactTopListenersCounter = 0; - -// For events like 'submit' which don't consistently bubble (which we trap at a -// lower node than `document`), binding at `document` would cause duplicate -// events so we don't include them here -var topEventMapping = { - topAbort: 'abort', - topAnimationEnd: getVendorPrefixedEventName('animationend') || 'animationend', - topAnimationIteration: getVendorPrefixedEventName('animationiteration') || 'animationiteration', - topAnimationStart: getVendorPrefixedEventName('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: getVendorPrefixedEventName('transitionend') || 'transitionend', - topVolumeChange: 'volumechange', - topWaiting: 'waiting', - topWheel: 'wheel' -}; - -/** - * To ensure no conflicts with other potential React instances on the page - */ -var topListenersIDKey = '_reactListenersID' + String(Math.random()).slice(2); - -function getListeningForDocument(mountAt) { - // In IE8, `mountAt` is a host object and doesn't have `hasOwnProperty` - // directly. - if (!Object.prototype.hasOwnProperty.call(mountAt, topListenersIDKey)) { - mountAt[topListenersIDKey] = reactTopListenersCounter++; - alreadyListeningTo[mountAt[topListenersIDKey]] = {}; - } - return alreadyListeningTo[mountAt[topListenersIDKey]]; -} - -/** - * `ReactBrowserEventEmitter` is used to attach top-level event listeners. For - * example: - * - * EventPluginHub.putListener('myID', 'onClick', myFunction); - * - * This would allocate a "registration" of `('onClick', myFunction)` on 'myID'. - * - * @internal - */ -var ReactBrowserEventEmitter = _assign({}, ReactEventEmitterMixin, { - /** - * Injectable event backend - */ - ReactEventListener: null, - - injection: { - /** - * @param {object} ReactEventListener - */ - injectReactEventListener: function (ReactEventListener) { - ReactEventListener.setHandleTopLevel(ReactBrowserEventEmitter.handleTopLevel); - ReactBrowserEventEmitter.ReactEventListener = ReactEventListener; - } - }, - - /** - * Sets whether or not any created callbacks should be enabled. - * - * @param {boolean} enabled True if callbacks should be enabled. - */ - setEnabled: function (enabled) { - if (ReactBrowserEventEmitter.ReactEventListener) { - ReactBrowserEventEmitter.ReactEventListener.setEnabled(enabled); - } - }, - - /** - * @return {boolean} True if callbacks are enabled. - */ - isEnabled: function () { - return !!(ReactBrowserEventEmitter.ReactEventListener && ReactBrowserEventEmitter.ReactEventListener.isEnabled()); - }, - - /** - * We listen for bubbled touch events on the document object. - * - * Firefox v8.01 (and possibly others) exhibited strange behavior when - * mounting `onmousemove` events at some node that was not the document - * element. The symptoms were that if your mouse is not moving over something - * contained within that mount point (for example on the background) the - * top-level listeners for `onmousemove` won't be called. However, if you - * register the `mousemove` on the document object, then it will of course - * catch all `mousemove`s. This along with iOS quirks, justifies restricting - * top-level listeners to the document object only, at least for these - * movement types of events and possibly all events. - * - * @see http://www.quirksmode.org/blog/archives/2010/09/click_event_del.html - * - * Also, `keyup`/`keypress`/`keydown` do not bubble to the window on IE, but - * they bubble to document. - * - * @param {string} registrationName Name of listener (e.g. `onClick`). - * @param {object} contentDocumentHandle Document which owns the container - */ - listenTo: function (registrationName, contentDocumentHandle) { - var mountAt = contentDocumentHandle; - var isListening = getListeningForDocument(mountAt); - var dependencies = EventPluginRegistry.registrationNameDependencies[registrationName]; - - for (var i = 0; i < dependencies.length; i++) { - var dependency = dependencies[i]; - if (!(isListening.hasOwnProperty(dependency) && isListening[dependency])) { - if (dependency === 'topWheel') { - if (isEventSupported('wheel')) { - ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent('topWheel', 'wheel', mountAt); - } else if (isEventSupported('mousewheel')) { - ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent('topWheel', 'mousewheel', mountAt); - } else { - // Firefox needs to capture a different mouse scroll event. - // @see http://www.quirksmode.org/dom/events/tests/scroll.html - ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent('topWheel', 'DOMMouseScroll', mountAt); - } - } else if (dependency === 'topScroll') { - if (isEventSupported('scroll', true)) { - ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent('topScroll', 'scroll', mountAt); - } else { - ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent('topScroll', 'scroll', ReactBrowserEventEmitter.ReactEventListener.WINDOW_HANDLE); - } - } else if (dependency === 'topFocus' || dependency === 'topBlur') { - if (isEventSupported('focus', true)) { - ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent('topFocus', 'focus', mountAt); - ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent('topBlur', 'blur', mountAt); - } else if (isEventSupported('focusin')) { - // IE has `focusin` and `focusout` events which bubble. - // @see http://www.quirksmode.org/blog/archives/2008/04/delegating_the.html - ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent('topFocus', 'focusin', mountAt); - ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent('topBlur', 'focusout', mountAt); - } - - // to make sure blur and focus event listeners are only attached once - isListening.topBlur = true; - isListening.topFocus = true; - } else if (topEventMapping.hasOwnProperty(dependency)) { - ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(dependency, topEventMapping[dependency], mountAt); - } - - isListening[dependency] = true; - } - } - }, - - trapBubbledEvent: function (topLevelType, handlerBaseName, handle) { - return ReactBrowserEventEmitter.ReactEventListener.trapBubbledEvent(topLevelType, handlerBaseName, handle); - }, - - trapCapturedEvent: function (topLevelType, handlerBaseName, handle) { - return ReactBrowserEventEmitter.ReactEventListener.trapCapturedEvent(topLevelType, handlerBaseName, handle); - }, - - /** - * Protect against document.createEvent() returning null - * Some popup blocker extensions appear to do this: - * https://github.com/facebook/react/issues/6887 - */ - supportsEventPageXY: function () { - if (!document.createEvent) { - return false; - } - var ev = document.createEvent('MouseEvent'); - return ev != null && 'pageX' in ev; - }, - - /** - * Listens to window scroll and resize events. We cache scroll values so that - * application code can access them without triggering reflows. - * - * ViewportMetrics is only used by SyntheticMouse/TouchEvent and only when - * pageX/pageY isn't supported (legacy browsers). - * - * NOTE: Scroll events do not bubble. - * - * @see http://www.quirksmode.org/dom/events/scroll.html - */ - ensureScrollValueMonitoring: function () { - if (hasEventPageXY === undefined) { - hasEventPageXY = ReactBrowserEventEmitter.supportsEventPageXY(); - } - if (!hasEventPageXY && !isMonitoringScrollValue) { - var refresh = ViewportMetrics.refreshScrollValues; - ReactBrowserEventEmitter.ReactEventListener.monitorScrollValue(refresh); - isMonitoringScrollValue = true; - } - } -}); - -module.exports = ReactBrowserEventEmitter; - -/***/ }), -/* 32 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2014-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -/** - * Forked from fbjs/warning: - * https://github.com/facebook/fbjs/blob/e66ba20ad5be433eb54423f2b097d829324d9de6/packages/fbjs/src/__forks__/warning.js - * - * Only change is we use console.warn instead of console.error, - * and do nothing when 'console' is not supported. - * This really simplifies the code. - * --- - * Similar to invariant but only logs a warning if the condition is not met. - * This can be used to log issues in development environments in critical - * paths. Removing the logging code for production environments will keep the - * same logic and follow the same code paths. - */ - -var lowPriorityWarning = function () {}; - -if (process.env.NODE_ENV !== 'production') { - var printWarning = function (format) { - for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } - - var argIndex = 0; - var message = 'Warning: ' + format.replace(/%s/g, function () { - return args[argIndex++]; - }); - if (typeof console !== 'undefined') { - console.warn(message); - } - try { - // --- Welcome to debugging React --- - // This error was thrown as a convenience so that you can use this stack - // to find the callsite that caused this warning to fire. - throw new Error(message); - } catch (x) {} - }; - - lowPriorityWarning = function (condition, format) { - if (format === undefined) { - throw new Error('`warning(condition, format, ...args)` requires a warning ' + 'message argument'); - } - if (!condition) { - for (var _len2 = arguments.length, args = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) { - args[_key2 - 2] = arguments[_key2]; - } - - printWarning.apply(undefined, [format].concat(args)); - } - }; -} - -module.exports = lowPriorityWarning; - -/***/ }), -/* 33 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - - - -var ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED'; - -module.exports = ReactPropTypesSecret; - - -/***/ }), -/* 34 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -module.exports = __webpack_require__(108); - - -/***/ }), -/* 35 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var _prodInvariant = __webpack_require__(2); - -var ReactErrorUtils = __webpack_require__(36); - -var invariant = __webpack_require__(0); -var warning = __webpack_require__(1); - -/** - * Injected dependencies: - */ - -/** - * - `ComponentTree`: [required] Module that can convert between React instances - * and actual node references. - */ -var ComponentTree; -var TreeTraversal; -var injection = { - injectComponentTree: function (Injected) { - ComponentTree = Injected; - if (process.env.NODE_ENV !== 'production') { - process.env.NODE_ENV !== 'production' ? warning(Injected && Injected.getNodeFromInstance && Injected.getInstanceFromNode, 'EventPluginUtils.injection.injectComponentTree(...): Injected ' + 'module is missing getNodeFromInstance or getInstanceFromNode.') : void 0; - } - }, - injectTreeTraversal: function (Injected) { - TreeTraversal = Injected; - if (process.env.NODE_ENV !== 'production') { - process.env.NODE_ENV !== 'production' ? warning(Injected && Injected.isAncestor && Injected.getLowestCommonAncestor, 'EventPluginUtils.injection.injectTreeTraversal(...): Injected ' + 'module is missing isAncestor or getLowestCommonAncestor.') : void 0; - } - } -}; - -function isEndish(topLevelType) { - return topLevelType === 'topMouseUp' || topLevelType === 'topTouchEnd' || topLevelType === 'topTouchCancel'; -} - -function isMoveish(topLevelType) { - return topLevelType === 'topMouseMove' || topLevelType === 'topTouchMove'; -} -function isStartish(topLevelType) { - return topLevelType === 'topMouseDown' || topLevelType === 'topTouchStart'; -} - -var validateEventDispatches; -if (process.env.NODE_ENV !== 'production') { - validateEventDispatches = function (event) { - var dispatchListeners = event._dispatchListeners; - var dispatchInstances = event._dispatchInstances; - - var listenersIsArr = Array.isArray(dispatchListeners); - var listenersLen = listenersIsArr ? dispatchListeners.length : dispatchListeners ? 1 : 0; - - var instancesIsArr = Array.isArray(dispatchInstances); - var instancesLen = instancesIsArr ? dispatchInstances.length : dispatchInstances ? 1 : 0; - - process.env.NODE_ENV !== 'production' ? warning(instancesIsArr === listenersIsArr && instancesLen === listenersLen, 'EventPluginUtils: Invalid `event`.') : void 0; - }; -} - -/** - * Dispatch the event to the listener. - * @param {SyntheticEvent} event SyntheticEvent to handle - * @param {boolean} simulated If the event is simulated (changes exn behavior) - * @param {function} listener Application-level callback - * @param {*} inst Internal component instance - */ -function executeDispatch(event, simulated, listener, inst) { - var type = event.type || 'unknown-event'; - event.currentTarget = EventPluginUtils.getNodeFromInstance(inst); - if (simulated) { - ReactErrorUtils.invokeGuardedCallbackWithCatch(type, listener, event); - } else { - ReactErrorUtils.invokeGuardedCallback(type, listener, event); - } - event.currentTarget = null; -} - -/** - * Standard/simple iteration through an event's collected dispatches. - */ -function executeDispatchesInOrder(event, simulated) { - var dispatchListeners = event._dispatchListeners; - var dispatchInstances = event._dispatchInstances; - if (process.env.NODE_ENV !== 'production') { - validateEventDispatches(event); - } - if (Array.isArray(dispatchListeners)) { - for (var i = 0; i < dispatchListeners.length; i++) { - if (event.isPropagationStopped()) { - break; - } - // Listeners and Instances are two parallel arrays that are always in sync. - executeDispatch(event, simulated, dispatchListeners[i], dispatchInstances[i]); - } - } else if (dispatchListeners) { - executeDispatch(event, simulated, dispatchListeners, dispatchInstances); - } - event._dispatchListeners = null; - event._dispatchInstances = null; -} - -/** - * Standard/simple iteration through an event's collected dispatches, but stops - * at the first dispatch execution returning true, and returns that id. - * - * @return {?string} id of the first dispatch execution who's listener returns - * true, or null if no listener returned true. - */ -function executeDispatchesInOrderStopAtTrueImpl(event) { - var dispatchListeners = event._dispatchListeners; - var dispatchInstances = event._dispatchInstances; - if (process.env.NODE_ENV !== 'production') { - validateEventDispatches(event); - } - if (Array.isArray(dispatchListeners)) { - for (var i = 0; i < dispatchListeners.length; i++) { - if (event.isPropagationStopped()) { - break; - } - // Listeners and Instances are two parallel arrays that are always in sync. - if (dispatchListeners[i](event, dispatchInstances[i])) { - return dispatchInstances[i]; - } - } - } else if (dispatchListeners) { - if (dispatchListeners(event, dispatchInstances)) { - return dispatchInstances; - } - } - return null; -} - -/** - * @see executeDispatchesInOrderStopAtTrueImpl - */ -function executeDispatchesInOrderStopAtTrue(event) { - var ret = executeDispatchesInOrderStopAtTrueImpl(event); - event._dispatchInstances = null; - event._dispatchListeners = null; - return ret; -} - -/** - * Execution of a "direct" dispatch - there must be at most one dispatch - * accumulated on the event or it is considered an error. It doesn't really make - * sense for an event with multiple dispatches (bubbled) to keep track of the - * return values at each dispatch execution, but it does tend to make sense when - * dealing with "direct" dispatches. - * - * @return {*} The return value of executing the single dispatch. - */ -function executeDirectDispatch(event) { - if (process.env.NODE_ENV !== 'production') { - validateEventDispatches(event); - } - var dispatchListener = event._dispatchListeners; - var dispatchInstance = event._dispatchInstances; - !!Array.isArray(dispatchListener) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'executeDirectDispatch(...): Invalid `event`.') : _prodInvariant('103') : void 0; - event.currentTarget = dispatchListener ? EventPluginUtils.getNodeFromInstance(dispatchInstance) : null; - var res = dispatchListener ? dispatchListener(event) : null; - event.currentTarget = null; - event._dispatchListeners = null; - event._dispatchInstances = null; - return res; -} - -/** - * @param {SyntheticEvent} event - * @return {boolean} True iff number of dispatches accumulated is greater than 0. - */ -function hasDispatches(event) { - return !!event._dispatchListeners; -} - -/** - * General utilities that are useful in creating custom Event Plugins. - */ -var EventPluginUtils = { - isEndish: isEndish, - isMoveish: isMoveish, - isStartish: isStartish, - - executeDirectDispatch: executeDirectDispatch, - executeDispatchesInOrder: executeDispatchesInOrder, - executeDispatchesInOrderStopAtTrue: executeDispatchesInOrderStopAtTrue, - hasDispatches: hasDispatches, - - getInstanceFromNode: function (node) { - return ComponentTree.getInstanceFromNode(node); - }, - getNodeFromInstance: function (node) { - return ComponentTree.getNodeFromInstance(node); - }, - isAncestor: function (a, b) { - return TreeTraversal.isAncestor(a, b); - }, - getLowestCommonAncestor: function (a, b) { - return TreeTraversal.getLowestCommonAncestor(a, b); - }, - getParentInstance: function (inst) { - return TreeTraversal.getParentInstance(inst); - }, - traverseTwoPhase: function (target, fn, arg) { - return TreeTraversal.traverseTwoPhase(target, fn, arg); - }, - traverseEnterLeave: function (from, to, fn, argFrom, argTo) { - return TreeTraversal.traverseEnterLeave(from, to, fn, argFrom, argTo); - }, - - injection: injection -}; - -module.exports = EventPluginUtils; - -/***/ }), -/* 36 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * - */ - - - -var caughtError = null; - -/** - * Call a function while guarding against errors that happens within it. - * - * @param {String} name of the guard to use for logging or debugging - * @param {Function} func The function to invoke - * @param {*} a First argument - * @param {*} b Second argument - */ -function invokeGuardedCallback(name, func, a) { - try { - func(a); - } catch (x) { - if (caughtError === null) { - caughtError = x; - } - } -} - -var ReactErrorUtils = { - invokeGuardedCallback: invokeGuardedCallback, - - /** - * Invoked by ReactTestUtils.Simulate so that any errors thrown by the event - * handler are sure to be rethrown by rethrowCaughtError. - */ - invokeGuardedCallbackWithCatch: invokeGuardedCallback, - - /** - * During execution of guarded functions we will capture the first error which - * we will rethrow to be handled by the top level error handler. - */ - rethrowCaughtError: function () { - if (caughtError) { - var error = caughtError; - caughtError = null; - throw error; - } - } -}; - -if (process.env.NODE_ENV !== 'production') { - /** - * To help development we can get better devtools integration by simulating a - * real browser event. - */ - if (typeof window !== 'undefined' && typeof window.dispatchEvent === 'function' && typeof document !== 'undefined' && typeof document.createEvent === 'function') { - var fakeNode = document.createElement('react'); - ReactErrorUtils.invokeGuardedCallback = function (name, func, a) { - var boundFunc = function () { - func(a); - }; - var evtType = 'react-' + name; - fakeNode.addEventListener(evtType, boundFunc, false); - var evt = document.createEvent('Event'); - evt.initEvent(evtType, false, false); - fakeNode.dispatchEvent(evt); - fakeNode.removeEventListener(evtType, boundFunc, false); - }; - } -} - -module.exports = ReactErrorUtils; - -/***/ }), -/* 37 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -/** - * Gets the target node from a native browser event by accounting for - * inconsistencies in browser DOM APIs. - * - * @param {object} nativeEvent Native browser event. - * @return {DOMEventTarget} Target node. - */ - -function getEventTarget(nativeEvent) { - var target = nativeEvent.target || nativeEvent.srcElement || window; - - // Normalize SVG element events #4963 - if (target.correspondingUseElement) { - target = target.correspondingUseElement; - } - - // Safari may fire events on text nodes (Node.TEXT_NODE is 3). - // @see http://www.quirksmode.org/js/events_properties.html - return target.nodeType === 3 ? target.parentNode : target; -} - -module.exports = getEventTarget; - -/***/ }), -/* 38 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var ExecutionEnvironment = __webpack_require__(5); - -var useHasFeature; -if (ExecutionEnvironment.canUseDOM) { - useHasFeature = document.implementation && document.implementation.hasFeature && - // always returns true in newer browsers as per the standard. - // @see http://dom.spec.whatwg.org/#dom-domimplementation-hasfeature - document.implementation.hasFeature('', '') !== true; -} - -/** - * 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 isEventSupported(eventNameSuffix, capture) { - if (!ExecutionEnvironment.canUseDOM || capture && !('addEventListener' in document)) { - return false; - } - - var eventName = 'on' + eventNameSuffix; - var isSupported = eventName in document; - - if (!isSupported) { - var element = document.createElement('div'); - element.setAttribute(eventName, 'return;'); - isSupported = typeof element[eventName] === 'function'; - } - - if (!isSupported && useHasFeature && eventNameSuffix === 'wheel') { - // This is the only way to test support for the `wheel` event in IE9+. - isSupported = document.implementation.hasFeature('Events.wheel', '3.0'); - } - - return isSupported; -} - -module.exports = isEventSupported; - -/***/ }), -/* 39 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -/** - * Translation from modifier key to the associated property in the event. - * @see http://www.w3.org/TR/DOM-Level-3-Events/#keys-Modifiers - */ - -var modifierKeyToProp = { - Alt: 'altKey', - Control: 'ctrlKey', - Meta: 'metaKey', - Shift: 'shiftKey' -}; - -// IE8 does not implement getModifierState so we simply map it to the only -// modifier keys exposed by the event itself, does not support Lock-keys. -// Currently, all major browsers except Chrome seems to support Lock-keys. -function modifierStateGetter(keyArg) { - var syntheticEvent = this; - var nativeEvent = syntheticEvent.nativeEvent; - if (nativeEvent.getModifierState) { - return nativeEvent.getModifierState(keyArg); - } - var keyProp = modifierKeyToProp[keyArg]; - return keyProp ? !!nativeEvent[keyProp] : false; -} - -function getEventModifierState(nativeEvent) { - return modifierStateGetter; -} - -module.exports = getEventModifierState; - -/***/ }), -/* 40 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var DOMLazyTree = __webpack_require__(18); -var Danger = __webpack_require__(127); -var ReactDOMComponentTree = __webpack_require__(4); -var ReactInstrumentation = __webpack_require__(8); - -var createMicrosoftUnsafeLocalFunction = __webpack_require__(42); -var setInnerHTML = __webpack_require__(29); -var setTextContent = __webpack_require__(68); - -function getNodeAfter(parentNode, node) { - // Special case for text components, which return [open, close] comments - // from getHostNode. - if (Array.isArray(node)) { - node = node[1]; - } - return node ? node.nextSibling : parentNode.firstChild; -} - -/** - * Inserts `childNode` as a child of `parentNode` at the `index`. - * - * @param {DOMElement} parentNode Parent node in which to insert. - * @param {DOMElement} childNode Child node to insert. - * @param {number} index Index at which to insert the child. - * @internal - */ -var insertChildAt = createMicrosoftUnsafeLocalFunction(function (parentNode, childNode, referenceNode) { - // We rely exclusively on `insertBefore(node, null)` instead of also using - // `appendChild(node)`. (Using `undefined` is not allowed by all browsers so - // we are careful to use `null`.) - parentNode.insertBefore(childNode, referenceNode); -}); - -function insertLazyTreeChildAt(parentNode, childTree, referenceNode) { - DOMLazyTree.insertTreeBefore(parentNode, childTree, referenceNode); -} - -function moveChild(parentNode, childNode, referenceNode) { - if (Array.isArray(childNode)) { - moveDelimitedText(parentNode, childNode[0], childNode[1], referenceNode); - } else { - insertChildAt(parentNode, childNode, referenceNode); - } -} - -function removeChild(parentNode, childNode) { - if (Array.isArray(childNode)) { - var closingComment = childNode[1]; - childNode = childNode[0]; - removeDelimitedText(parentNode, childNode, closingComment); - parentNode.removeChild(closingComment); - } - parentNode.removeChild(childNode); -} - -function moveDelimitedText(parentNode, openingComment, closingComment, referenceNode) { - var node = openingComment; - while (true) { - var nextNode = node.nextSibling; - insertChildAt(parentNode, node, referenceNode); - if (node === closingComment) { - break; - } - node = nextNode; - } -} - -function removeDelimitedText(parentNode, startNode, closingComment) { - while (true) { - var node = startNode.nextSibling; - if (node === closingComment) { - // The closing comment is removed by ReactMultiChild. - break; - } else { - parentNode.removeChild(node); - } - } -} - -function replaceDelimitedText(openingComment, closingComment, stringText) { - var parentNode = openingComment.parentNode; - var nodeAfterComment = openingComment.nextSibling; - if (nodeAfterComment === closingComment) { - // There are no text nodes between the opening and closing comments; insert - // a new one if stringText isn't empty. - if (stringText) { - insertChildAt(parentNode, document.createTextNode(stringText), nodeAfterComment); - } - } else { - if (stringText) { - // Set the text content of the first node after the opening comment, and - // remove all following nodes up until the closing comment. - setTextContent(nodeAfterComment, stringText); - removeDelimitedText(parentNode, nodeAfterComment, closingComment); - } else { - removeDelimitedText(parentNode, openingComment, closingComment); - } - } - - if (process.env.NODE_ENV !== 'production') { - ReactInstrumentation.debugTool.onHostOperation({ - instanceID: ReactDOMComponentTree.getInstanceFromNode(openingComment)._debugID, - type: 'replace text', - payload: stringText - }); - } -} - -var dangerouslyReplaceNodeWithMarkup = Danger.dangerouslyReplaceNodeWithMarkup; -if (process.env.NODE_ENV !== 'production') { - dangerouslyReplaceNodeWithMarkup = function (oldChild, markup, prevInstance) { - Danger.dangerouslyReplaceNodeWithMarkup(oldChild, markup); - if (prevInstance._debugID !== 0) { - ReactInstrumentation.debugTool.onHostOperation({ - instanceID: prevInstance._debugID, - type: 'replace with', - payload: markup.toString() - }); - } else { - var nextInstance = ReactDOMComponentTree.getInstanceFromNode(markup.node); - if (nextInstance._debugID !== 0) { - ReactInstrumentation.debugTool.onHostOperation({ - instanceID: nextInstance._debugID, - type: 'mount', - payload: markup.toString() - }); - } - } - }; -} - -/** - * Operations for updating with DOM children. - */ -var DOMChildrenOperations = { - dangerouslyReplaceNodeWithMarkup: dangerouslyReplaceNodeWithMarkup, - - replaceDelimitedText: replaceDelimitedText, - - /** - * Updates a component's children by processing a series of updates. The - * update configurations are each expected to have a `parentNode` property. - * - * @param {array} updates List of update configurations. - * @internal - */ - processUpdates: function (parentNode, updates) { - if (process.env.NODE_ENV !== 'production') { - var parentNodeDebugID = ReactDOMComponentTree.getInstanceFromNode(parentNode)._debugID; - } - - for (var k = 0; k < updates.length; k++) { - var update = updates[k]; - switch (update.type) { - case 'INSERT_MARKUP': - insertLazyTreeChildAt(parentNode, update.content, getNodeAfter(parentNode, update.afterNode)); - if (process.env.NODE_ENV !== 'production') { - ReactInstrumentation.debugTool.onHostOperation({ - instanceID: parentNodeDebugID, - type: 'insert child', - payload: { - toIndex: update.toIndex, - content: update.content.toString() - } - }); - } - break; - case 'MOVE_EXISTING': - moveChild(parentNode, update.fromNode, getNodeAfter(parentNode, update.afterNode)); - if (process.env.NODE_ENV !== 'production') { - ReactInstrumentation.debugTool.onHostOperation({ - instanceID: parentNodeDebugID, - type: 'move child', - payload: { fromIndex: update.fromIndex, toIndex: update.toIndex } - }); - } - break; - case 'SET_MARKUP': - setInnerHTML(parentNode, update.content); - if (process.env.NODE_ENV !== 'production') { - ReactInstrumentation.debugTool.onHostOperation({ - instanceID: parentNodeDebugID, - type: 'replace children', - payload: update.content.toString() - }); - } - break; - case 'TEXT_CONTENT': - setTextContent(parentNode, update.content); - if (process.env.NODE_ENV !== 'production') { - ReactInstrumentation.debugTool.onHostOperation({ - instanceID: parentNodeDebugID, - type: 'replace text', - payload: update.content.toString() - }); - } - break; - case 'REMOVE_NODE': - removeChild(parentNode, update.fromNode); - if (process.env.NODE_ENV !== 'production') { - ReactInstrumentation.debugTool.onHostOperation({ - instanceID: parentNodeDebugID, - type: 'remove child', - payload: { fromIndex: update.fromIndex } - }); - } - break; - } - } - } -}; - -module.exports = DOMChildrenOperations; - -/***/ }), -/* 41 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var DOMNamespaces = { - html: 'http://www.w3.org/1999/xhtml', - mathml: 'http://www.w3.org/1998/Math/MathML', - svg: 'http://www.w3.org/2000/svg' -}; - -module.exports = DOMNamespaces; - -/***/ }), -/* 42 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - -/* globals MSApp */ - - - -/** - * Create a function which has 'unsafe' privileges (required by windows8 apps) - */ - -var createMicrosoftUnsafeLocalFunction = function (func) { - if (typeof MSApp !== 'undefined' && MSApp.execUnsafeLocalFunction) { - return function (arg0, arg1, arg2, arg3) { - MSApp.execUnsafeLocalFunction(function () { - return func(arg0, arg1, arg2, arg3); - }); - }; - } else { - return func; - } -}; - -module.exports = createMicrosoftUnsafeLocalFunction; - -/***/ }), -/* 43 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var _prodInvariant = __webpack_require__(2); - -var ReactPropTypesSecret = __webpack_require__(72); -var propTypesFactory = __webpack_require__(57); - -var React = __webpack_require__(15); -var PropTypes = propTypesFactory(React.isValidElement); - -var invariant = __webpack_require__(0); -var warning = __webpack_require__(1); - -var hasReadOnlyValue = { - button: true, - checkbox: true, - image: true, - hidden: true, - radio: true, - reset: true, - submit: true -}; - -function _assertSingleLink(inputProps) { - !(inputProps.checkedLink == null || inputProps.valueLink == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Cannot provide a checkedLink and a valueLink. If you want to use checkedLink, you probably don\'t want to use valueLink and vice versa.') : _prodInvariant('87') : void 0; -} -function _assertValueLink(inputProps) { - _assertSingleLink(inputProps); - !(inputProps.value == null && inputProps.onChange == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, '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.') : _prodInvariant('88') : void 0; -} - -function _assertCheckedLink(inputProps) { - _assertSingleLink(inputProps); - !(inputProps.checked == null && inputProps.onChange == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, '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') : _prodInvariant('89') : void 0; -} - -var propTypes = { - value: function (props, propName, componentName) { - if (!props[propName] || hasReadOnlyValue[props.type] || props.onChange || props.readOnly || props.disabled) { - return null; - } - return 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 (props, propName, componentName) { - if (!props[propName] || props.onChange || props.readOnly || props.disabled) { - return null; - } - return 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: PropTypes.func -}; - -var loggedTypeFailures = {}; -function getDeclarationErrorAddendum(owner) { - if (owner) { - var name = owner.getName(); - if (name) { - return ' Check the render method of `' + name + '`.'; - } - } - return ''; -} - -/** - * Provide a linked `value` attribute for controlled forms. You should not use - * this outside of the ReactDOM controlled form components. - */ -var LinkedValueUtils = { - checkPropTypes: function (tagName, props, owner) { - for (var propName in propTypes) { - if (propTypes.hasOwnProperty(propName)) { - var error = propTypes[propName](props, propName, tagName, 'prop', null, ReactPropTypesSecret); - } - if (error instanceof Error && !(error.message in loggedTypeFailures)) { - // Only monitor this failure once because there tends to be a lot of the - // same error. - loggedTypeFailures[error.message] = true; - - var addendum = getDeclarationErrorAddendum(owner); - process.env.NODE_ENV !== 'production' ? warning(false, 'Failed form propType: %s%s', error.message, addendum) : void 0; - } - } - }, - - /** - * @param {object} inputProps Props for form component - * @return {*} current value of the input either from value prop or link. - */ - getValue: function (inputProps) { - if (inputProps.valueLink) { - _assertValueLink(inputProps); - return inputProps.valueLink.value; - } - return inputProps.value; - }, - - /** - * @param {object} inputProps Props for form component - * @return {*} current checked status of the input either from checked prop - * or link. - */ - getChecked: function (inputProps) { - if (inputProps.checkedLink) { - _assertCheckedLink(inputProps); - return inputProps.checkedLink.value; - } - return inputProps.checked; - }, - - /** - * @param {object} inputProps Props for form component - * @param {SyntheticEvent} event change event to handle - */ - executeOnChange: function (inputProps, event) { - if (inputProps.valueLink) { - _assertValueLink(inputProps); - return inputProps.valueLink.requestChange(event.target.value); - } else if (inputProps.checkedLink) { - _assertCheckedLink(inputProps); - return inputProps.checkedLink.requestChange(event.target.checked); - } else if (inputProps.onChange) { - return inputProps.onChange.call(undefined, event); - } - } -}; - -module.exports = LinkedValueUtils; - -/***/ }), -/* 44 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2014-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * - */ - - - -var _prodInvariant = __webpack_require__(2); - -var invariant = __webpack_require__(0); - -var injected = false; - -var ReactComponentEnvironment = { - /** - * Optionally injectable hook for swapping out mount images in the middle of - * the tree. - */ - replaceNodeWithMarkup: null, - - /** - * Optionally injectable hook for processing a queue of child updates. Will - * later move into MultiChildComponents. - */ - processChildrenUpdates: null, - - injection: { - injectEnvironment: function (environment) { - !!injected ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactCompositeComponent: injectEnvironment() can only be called once.') : _prodInvariant('104') : void 0; - ReactComponentEnvironment.replaceNodeWithMarkup = environment.replaceNodeWithMarkup; - ReactComponentEnvironment.processChildrenUpdates = environment.processChildrenUpdates; - injected = true; - } - } -}; - -module.exports = ReactComponentEnvironment; - -/***/ }), -/* 45 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @typechecks - * - */ - -/*eslint-disable no-self-compare */ - - - -var hasOwnProperty = Object.prototype.hasOwnProperty; - -/** - * inlined Object.is polyfill to avoid requiring consumers ship their own - * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is - */ -function is(x, y) { - // SameValue algorithm - if (x === y) { - // Steps 1-5, 7-10 - // Steps 6.b-6.e: +0 != -0 - // Added the nonzero y check to make Flow happy, but it is redundant - return x !== 0 || y !== 0 || 1 / x === 1 / y; - } else { - // Step 6.a: NaN == NaN - return x !== x && y !== y; - } -} - -/** - * Performs equality by iterating through keys on an object and returning false - * when any key has values which are not strictly equal between the arguments. - * Returns true when the values of all keys are strictly equal. - */ -function shallowEqual(objA, objB) { - if (is(objA, objB)) { - return true; - } - - if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) { - return false; - } - - var keysA = Object.keys(objA); - var keysB = Object.keys(objB); - - if (keysA.length !== keysB.length) { - return false; - } - - // Test for A's keys different from B. - for (var i = 0; i < keysA.length; i++) { - if (!hasOwnProperty.call(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]])) { - return false; - } - } - - return true; -} - -module.exports = shallowEqual; - -/***/ }), -/* 46 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -/** - * Given a `prevElement` and `nextElement`, determines if the existing - * instance should be updated as opposed to being destroyed or replaced by a new - * instance. Both arguments are elements. This ensures that this logic can - * operate on stateless trees without any backing instance. - * - * @param {?object} prevElement - * @param {?object} nextElement - * @return {boolean} True if the existing instance should be updated. - * @protected - */ - -function shouldUpdateReactComponent(prevElement, nextElement) { - var prevEmpty = prevElement === null || prevElement === false; - var nextEmpty = nextElement === null || nextElement === false; - if (prevEmpty || nextEmpty) { - return prevEmpty === nextEmpty; - } - - var prevType = typeof prevElement; - var nextType = typeof nextElement; - if (prevType === 'string' || prevType === 'number') { - return nextType === 'string' || nextType === 'number'; - } else { - return nextType === 'object' && prevElement.type === nextElement.type && prevElement.key === nextElement.key; - } -} - -module.exports = shouldUpdateReactComponent; - -/***/ }), -/* 47 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * - */ - - - -/** - * Escape and wrap key so it is safe to use as a reactid - * - * @param {string} key to be escaped. - * @return {string} the escaped key. - */ - -function escape(key) { - var escapeRegex = /[=:]/g; - var escaperLookup = { - '=': '=0', - ':': '=2' - }; - var escapedString = ('' + key).replace(escapeRegex, function (match) { - return escaperLookup[match]; - }); - - return '$' + escapedString; -} - -/** - * Unescape and unwrap key for human-readable display - * - * @param {string} key to unescape. - * @return {string} the unescaped key. - */ -function unescape(key) { - var unescapeRegex = /(=0|=2)/g; - var unescaperLookup = { - '=0': '=', - '=2': ':' - }; - var keySubstring = key[0] === '.' && key[1] === '$' ? key.substring(2) : key.substring(1); - - return ('' + keySubstring).replace(unescapeRegex, function (match) { - return unescaperLookup[match]; - }); -} - -var KeyEscapeUtils = { - escape: escape, - unescape: unescape -}; - -module.exports = KeyEscapeUtils; - -/***/ }), -/* 48 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2015-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var _prodInvariant = __webpack_require__(2); - -var ReactCurrentOwner = __webpack_require__(9); -var ReactInstanceMap = __webpack_require__(23); -var ReactInstrumentation = __webpack_require__(8); -var ReactUpdates = __webpack_require__(10); - -var invariant = __webpack_require__(0); -var warning = __webpack_require__(1); - -function enqueueUpdate(internalInstance) { - ReactUpdates.enqueueUpdate(internalInstance); -} - -function formatUnexpectedArgument(arg) { - var type = typeof arg; - if (type !== 'object') { - return type; - } - var displayName = arg.constructor && arg.constructor.name || type; - var keys = Object.keys(arg); - if (keys.length > 0 && keys.length < 20) { - return displayName + ' (keys: ' + keys.join(', ') + ')'; - } - return displayName; -} - -function getInternalInstanceReadyForUpdate(publicInstance, callerName) { - var internalInstance = ReactInstanceMap.get(publicInstance); - if (!internalInstance) { - if (process.env.NODE_ENV !== 'production') { - var ctor = publicInstance.constructor; - // Only warn when we have a callerName. Otherwise we should be silent. - // We're probably calling from enqueueCallback. We don't want to warn - // there because we already warned for the corresponding lifecycle method. - process.env.NODE_ENV !== 'production' ? warning(!callerName, '%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.', callerName, callerName, ctor && (ctor.displayName || ctor.name) || 'ReactClass') : void 0; - } - return null; - } - - if (process.env.NODE_ENV !== 'production') { - process.env.NODE_ENV !== 'production' ? warning(ReactCurrentOwner.current == null, '%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`.', callerName) : void 0; - } - - return internalInstance; -} - -/** - * ReactUpdateQueue allows for state updates to be scheduled into a later - * reconciliation step. - */ -var ReactUpdateQueue = { - /** - * Checks whether or not this composite component is mounted. - * @param {ReactClass} publicInstance The instance we want to test. - * @return {boolean} True if mounted, false otherwise. - * @protected - * @final - */ - isMounted: function (publicInstance) { - if (process.env.NODE_ENV !== 'production') { - var owner = ReactCurrentOwner.current; - if (owner !== null) { - process.env.NODE_ENV !== 'production' ? warning(owner._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.', owner.getName() || 'A component') : void 0; - owner._warnedAboutRefsInRender = true; - } - } - var internalInstance = ReactInstanceMap.get(publicInstance); - if (internalInstance) { - // During componentWillMount and render this will still be null but after - // that will always render to something. At least for now. So we can use - // this hack. - return !!internalInstance._renderedComponent; - } else { - return false; - } - }, - - /** - * Enqueue a callback that will be executed after all the pending updates - * have processed. - * - * @param {ReactClass} publicInstance The instance to use as `this` context. - * @param {?function} callback Called after state is updated. - * @param {string} callerName Name of the calling function in the public API. - * @internal - */ - enqueueCallback: function (publicInstance, callback, callerName) { - ReactUpdateQueue.validateCallback(callback, callerName); - var internalInstance = getInternalInstanceReadyForUpdate(publicInstance); - - // Previously we would throw an error if we didn't have an internal - // instance. Since we want to make it a no-op instead, we mirror the same - // behavior we have in other enqueue* methods. - // We also need to ignore callbacks in componentWillMount. See - // enqueueUpdates. - if (!internalInstance) { - return null; - } - - if (internalInstance._pendingCallbacks) { - internalInstance._pendingCallbacks.push(callback); - } else { - internalInstance._pendingCallbacks = [callback]; - } - // TODO: The callback here is ignored when setState is called from - // componentWillMount. Either fix it or disallow doing so completely in - // favor of getInitialState. Alternatively, we can disallow - // componentWillMount during server-side rendering. - enqueueUpdate(internalInstance); - }, - - enqueueCallbackInternal: function (internalInstance, callback) { - if (internalInstance._pendingCallbacks) { - internalInstance._pendingCallbacks.push(callback); - } else { - internalInstance._pendingCallbacks = [callback]; - } - enqueueUpdate(internalInstance); - }, - - /** - * Forces an update. This should only be invoked when it is known with - * certainty that we are **not** in a DOM transaction. - * - * You may want to call this when you know that some deeper aspect of the - * component's state has changed but `setState` was not called. - * - * This will not invoke `shouldComponentUpdate`, but it will invoke - * `componentWillUpdate` and `componentDidUpdate`. - * - * @param {ReactClass} publicInstance The instance that should rerender. - * @internal - */ - enqueueForceUpdate: function (publicInstance) { - var internalInstance = getInternalInstanceReadyForUpdate(publicInstance, 'forceUpdate'); - - if (!internalInstance) { - return; - } - - internalInstance._pendingForceUpdate = true; - - enqueueUpdate(internalInstance); - }, - - /** - * Replaces all of the state. Always use this or `setState` to mutate state. - * You should treat `this.state` as immutable. - * - * There is no guarantee that `this.state` will be immediately updated, so - * accessing `this.state` after calling this method may return the old value. - * - * @param {ReactClass} publicInstance The instance that should rerender. - * @param {object} completeState Next state. - * @internal - */ - enqueueReplaceState: function (publicInstance, completeState, callback) { - var internalInstance = getInternalInstanceReadyForUpdate(publicInstance, 'replaceState'); - - if (!internalInstance) { - return; - } - - internalInstance._pendingStateQueue = [completeState]; - internalInstance._pendingReplaceState = true; - - // Future-proof 15.5 - if (callback !== undefined && callback !== null) { - ReactUpdateQueue.validateCallback(callback, 'replaceState'); - if (internalInstance._pendingCallbacks) { - internalInstance._pendingCallbacks.push(callback); - } else { - internalInstance._pendingCallbacks = [callback]; - } - } - - enqueueUpdate(internalInstance); - }, - - /** - * Sets a subset of the state. This only exists because _pendingState is - * internal. This provides a merging strategy that is not available to deep - * properties which is confusing. TODO: Expose pendingState or don't use it - * during the merge. - * - * @param {ReactClass} publicInstance The instance that should rerender. - * @param {object} partialState Next partial state to be merged with state. - * @internal - */ - enqueueSetState: function (publicInstance, partialState) { - if (process.env.NODE_ENV !== 'production') { - ReactInstrumentation.debugTool.onSetState(); - process.env.NODE_ENV !== 'production' ? warning(partialState != null, 'setState(...): You passed an undefined or null state object; ' + 'instead, use forceUpdate().') : void 0; - } - - var internalInstance = getInternalInstanceReadyForUpdate(publicInstance, 'setState'); - - if (!internalInstance) { - return; - } - - var queue = internalInstance._pendingStateQueue || (internalInstance._pendingStateQueue = []); - queue.push(partialState); - - enqueueUpdate(internalInstance); - }, - - enqueueElementInternal: function (internalInstance, nextElement, nextContext) { - internalInstance._pendingElement = nextElement; - // TODO: introduce _pendingContext instead of setting it directly. - internalInstance._context = nextContext; - enqueueUpdate(internalInstance); - }, - - validateCallback: function (callback, callerName) { - !(!callback || typeof callback === 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s(...): Expected the last optional `callback` argument to be a function. Instead received: %s.', callerName, formatUnexpectedArgument(callback)) : _prodInvariant('122', callerName, formatUnexpectedArgument(callback)) : void 0; - } -}; - -module.exports = ReactUpdateQueue; - -/***/ }), -/* 49 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2015-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var _assign = __webpack_require__(3); - -var emptyFunction = __webpack_require__(7); -var warning = __webpack_require__(1); - -var validateDOMNesting = emptyFunction; - -if (process.env.NODE_ENV !== 'production') { - // This validation code was written based on the HTML5 parsing spec: - // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope - // - // Note: this does not catch all invalid nesting, nor does it try to (as it's - // not clear what practical benefit doing so provides); instead, we warn only - // for cases where the parser will give a parse tree differing from what React - // intended. For example,
is invalid but we don't warn - // because it still parses correctly; we do warn for other cases like nested - //

tags where the beginning of the second element implicitly closes the - // first, causing a confusing mess. - - // https://html.spec.whatwg.org/multipage/syntax.html#special - var specialTags = ['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']; - - // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope - var inScopeTags = ['applet', 'caption', 'html', 'table', 'td', 'th', 'marquee', 'object', 'template', - - // https://html.spec.whatwg.org/multipage/syntax.html#html-integration-point - // TODO: Distinguish by namespace here -- for , including it here - // errs on the side of fewer warnings - 'foreignObject', 'desc', 'title']; - - // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-button-scope - var buttonScopeTags = inScopeTags.concat(['button']); - - // https://html.spec.whatwg.org/multipage/syntax.html#generate-implied-end-tags - var impliedEndTags = ['dd', 'dt', 'li', 'option', 'optgroup', 'p', 'rp', 'rt']; - - var emptyAncestorInfo = { - current: null, - - formTag: null, - aTagInScope: null, - buttonTagInScope: null, - nobrTagInScope: null, - pTagInButtonScope: null, - - listItemTagAutoclosing: null, - dlItemTagAutoclosing: null - }; - - var updatedAncestorInfo = function (oldInfo, tag, instance) { - var ancestorInfo = _assign({}, oldInfo || emptyAncestorInfo); - var info = { tag: tag, instance: instance }; - - if (inScopeTags.indexOf(tag) !== -1) { - ancestorInfo.aTagInScope = null; - ancestorInfo.buttonTagInScope = null; - ancestorInfo.nobrTagInScope = null; - } - if (buttonScopeTags.indexOf(tag) !== -1) { - ancestorInfo.pTagInButtonScope = null; - } - - // See rules for 'li', 'dd', 'dt' start tags in - // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody - if (specialTags.indexOf(tag) !== -1 && tag !== 'address' && tag !== 'div' && tag !== 'p') { - ancestorInfo.listItemTagAutoclosing = null; - ancestorInfo.dlItemTagAutoclosing = null; - } - - ancestorInfo.current = info; - - if (tag === 'form') { - ancestorInfo.formTag = info; - } - if (tag === 'a') { - ancestorInfo.aTagInScope = info; - } - if (tag === 'button') { - ancestorInfo.buttonTagInScope = info; - } - if (tag === 'nobr') { - ancestorInfo.nobrTagInScope = info; - } - if (tag === 'p') { - ancestorInfo.pTagInButtonScope = info; - } - if (tag === 'li') { - ancestorInfo.listItemTagAutoclosing = info; - } - if (tag === 'dd' || tag === 'dt') { - ancestorInfo.dlItemTagAutoclosing = info; - } - - return ancestorInfo; - }; - - /** - * Returns whether - */ - var isTagValidWithParent = function (tag, parentTag) { - // First, let's check if we're in an unusual parsing mode... - switch (parentTag) { - // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inselect - case 'select': - return tag === 'option' || tag === 'optgroup' || tag === '#text'; - case 'optgroup': - return tag === 'option' || tag === '#text'; - // Strictly speaking, seeing an <option> doesn't mean we're in a <select> - // but - case 'option': - return tag === '#text'; - // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intd - // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incaption - // No special behavior since these rules fall back to "in body" mode for - // all except special table nodes which cause bad parsing behavior anyway. - - // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intr - case 'tr': - return tag === 'th' || tag === 'td' || tag === 'style' || tag === 'script' || tag === 'template'; - // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intbody - case 'tbody': - case 'thead': - case 'tfoot': - return tag === 'tr' || tag === 'style' || tag === 'script' || tag === 'template'; - // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incolgroup - case 'colgroup': - return tag === 'col' || tag === 'template'; - // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intable - case 'table': - return tag === 'caption' || tag === 'colgroup' || tag === 'tbody' || tag === 'tfoot' || tag === 'thead' || tag === 'style' || tag === 'script' || tag === 'template'; - // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inhead - case 'head': - return tag === 'base' || tag === 'basefont' || tag === 'bgsound' || tag === 'link' || tag === 'meta' || tag === 'title' || tag === 'noscript' || tag === 'noframes' || tag === 'style' || tag === 'script' || tag === 'template'; - // https://html.spec.whatwg.org/multipage/semantics.html#the-html-element - case 'html': - return tag === 'head' || tag === 'body'; - case '#document': - return tag === 'html'; - } - - // Probably in the "in body" parsing mode, so we outlaw only tag combos - // where the parsing rules cause implicit opens or closes to be added. - // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody - switch (tag) { - case 'h1': - case 'h2': - case 'h3': - case 'h4': - case 'h5': - case 'h6': - return parentTag !== 'h1' && parentTag !== 'h2' && parentTag !== 'h3' && parentTag !== 'h4' && parentTag !== 'h5' && parentTag !== 'h6'; - - case 'rp': - case 'rt': - return impliedEndTags.indexOf(parentTag) === -1; - - 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': - // These tags are only valid with a few parents that have special child - // parsing rules -- if we're down here, then none of those matched and - // so we allow it only if we don't know what the parent is, as all other - // cases are invalid. - return parentTag == null; - } - - return true; - }; - - /** - * Returns whether - */ - var findInvalidAncestorForTag = function (tag, ancestorInfo) { - switch (tag) { - 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 ancestorInfo.pTagInButtonScope; - - case 'form': - return ancestorInfo.formTag || ancestorInfo.pTagInButtonScope; - - case 'li': - return ancestorInfo.listItemTagAutoclosing; - - case 'dd': - case 'dt': - return ancestorInfo.dlItemTagAutoclosing; - - case 'button': - return ancestorInfo.buttonTagInScope; - - case 'a': - // Spec says something about storing a list of markers, but it sounds - // equivalent to this check. - return ancestorInfo.aTagInScope; - - case 'nobr': - return ancestorInfo.nobrTagInScope; - } - - return null; - }; - - /** - * Given a ReactCompositeComponent instance, return a list of its recursive - * owners, starting at the root and ending with the instance itself. - */ - var findOwnerStack = function (instance) { - if (!instance) { - return []; - } - - var stack = []; - do { - stack.push(instance); - } while (instance = instance._currentElement._owner); - stack.reverse(); - return stack; - }; - - var didWarn = {}; - - validateDOMNesting = function (childTag, childText, childInstance, ancestorInfo) { - ancestorInfo = ancestorInfo || emptyAncestorInfo; - var parentInfo = ancestorInfo.current; - var parentTag = parentInfo && parentInfo.tag; - - if (childText != null) { - process.env.NODE_ENV !== 'production' ? warning(childTag == null, 'validateDOMNesting: when childText is passed, childTag should be null') : void 0; - childTag = '#text'; - } - - var invalidParent = isTagValidWithParent(childTag, parentTag) ? null : parentInfo; - var invalidAncestor = invalidParent ? null : findInvalidAncestorForTag(childTag, ancestorInfo); - var problematic = invalidParent || invalidAncestor; - - if (problematic) { - var ancestorTag = problematic.tag; - var ancestorInstance = problematic.instance; - - var childOwner = childInstance && childInstance._currentElement._owner; - var ancestorOwner = ancestorInstance && ancestorInstance._currentElement._owner; - - var childOwners = findOwnerStack(childOwner); - var ancestorOwners = findOwnerStack(ancestorOwner); - - var minStackLen = Math.min(childOwners.length, ancestorOwners.length); - var i; - - var deepestCommon = -1; - for (i = 0; i < minStackLen; i++) { - if (childOwners[i] === ancestorOwners[i]) { - deepestCommon = i; - } else { - break; - } - } - - var UNKNOWN = '(unknown)'; - var childOwnerNames = childOwners.slice(deepestCommon + 1).map(function (inst) { - return inst.getName() || UNKNOWN; - }); - var ancestorOwnerNames = ancestorOwners.slice(deepestCommon + 1).map(function (inst) { - return inst.getName() || UNKNOWN; - }); - var ownerInfo = [].concat( - // If the parent and child instances have a common owner ancestor, start - // with that -- otherwise we just start with the parent's owners. - deepestCommon !== -1 ? childOwners[deepestCommon].getName() || UNKNOWN : [], ancestorOwnerNames, ancestorTag, - // If we're warning about an invalid (non-parent) ancestry, add '...' - invalidAncestor ? ['...'] : [], childOwnerNames, childTag).join(' > '); - - var warnKey = !!invalidParent + '|' + childTag + '|' + ancestorTag + '|' + ownerInfo; - if (didWarn[warnKey]) { - return; - } - didWarn[warnKey] = true; - - var tagDisplayName = childTag; - var whitespaceInfo = ''; - if (childTag === '#text') { - if (/\S/.test(childText)) { - tagDisplayName = 'Text nodes'; - } else { - tagDisplayName = 'Whitespace text nodes'; - whitespaceInfo = " Make sure you don't have any extra whitespace between tags on " + 'each line of your source code.'; - } - } else { - tagDisplayName = '<' + childTag + '>'; - } - - if (invalidParent) { - var info = ''; - if (ancestorTag === 'table' && childTag === 'tr') { - info += ' Add a <tbody> to your code to match the DOM tree generated by ' + 'the browser.'; - } - process.env.NODE_ENV !== 'production' ? warning(false, 'validateDOMNesting(...): %s cannot appear as a child of <%s>.%s ' + 'See %s.%s', tagDisplayName, ancestorTag, whitespaceInfo, ownerInfo, info) : void 0; - } else { - process.env.NODE_ENV !== 'production' ? warning(false, 'validateDOMNesting(...): %s cannot appear as a descendant of ' + '<%s>. See %s.', tagDisplayName, ancestorTag, ownerInfo) : void 0; - } - } - }; - - validateDOMNesting.updatedAncestorInfo = updatedAncestorInfo; - - // For testing - validateDOMNesting.isTagValidInContext = function (tag, ancestorInfo) { - ancestorInfo = ancestorInfo || emptyAncestorInfo; - var parentInfo = ancestorInfo.current; - var parentTag = parentInfo && parentInfo.tag; - return isTagValidWithParent(tag, parentTag) && !findInvalidAncestorForTag(tag, ancestorInfo); - }; -} - -module.exports = validateDOMNesting; - -/***/ }), -/* 50 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -/** - * `charCode` represents the actual "character code" and is safe to use with - * `String.fromCharCode`. As such, only keys that correspond to printable - * characters produce a valid `charCode`, the only exception to this is Enter. - * The Tab-key is considered non-printable and does not have a `charCode`, - * presumably because it does not produce a tab-character in browsers. - * - * @param {object} nativeEvent Native browser event. - * @return {number} Normalized `charCode` property. - */ - -function getEventCharCode(nativeEvent) { - var charCode; - var keyCode = nativeEvent.keyCode; - - if ('charCode' in nativeEvent) { - charCode = nativeEvent.charCode; - - // FF does not set `charCode` for the Enter-key, check against `keyCode`. - if (charCode === 0 && keyCode === 13) { - charCode = 13; - } - } else { - // IE8 does not implement `charCode`, but `keyCode` has the correct value. - charCode = keyCode; - } - - // Some non-printable keys are reported in `charCode`/`keyCode`, discard them. - // Must not discard the (non-)printable Enter-key. - if (charCode >= 32 || charCode === 13) { - return charCode; - } - - return 0; -} - -module.exports = getEventCharCode; - -/***/ }), -/* 51 */ -/***/ (function(module, exports) { - -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ -// css base code, injected by the css-loader -module.exports = function(useSourceMap) { - var list = []; - - // return the list of modules as css string - list.toString = function toString() { - return this.map(function (item) { - var content = cssWithMappingToString(item, useSourceMap); - if(item[2]) { - return "@media " + item[2] + "{" + content + "}"; - } else { - return content; - } - }).join(""); - }; - - // import a list of modules into the list - list.i = function(modules, mediaQuery) { - if(typeof modules === "string") - modules = [[null, modules, ""]]; - var alreadyImportedModules = {}; - for(var i = 0; i < this.length; i++) { - var id = this[i][0]; - if(typeof id === "number") - alreadyImportedModules[id] = true; - } - for(i = 0; i < modules.length; i++) { - var item = modules[i]; - // skip already imported module - // this implementation is not 100% perfect for weird media query combinations - // when a module is imported multiple times with different media queries. - // I hope this will never occur (Hey this way we have smaller bundles) - if(typeof item[0] !== "number" || !alreadyImportedModules[item[0]]) { - if(mediaQuery && !item[2]) { - item[2] = mediaQuery; - } else if(mediaQuery) { - item[2] = "(" + item[2] + ") and (" + mediaQuery + ")"; - } - list.push(item); - } - } - }; - return list; -}; - -function cssWithMappingToString(item, useSourceMap) { - var content = item[1] || ''; - var cssMapping = item[3]; - if (!cssMapping) { - return content; - } - - if (useSourceMap && typeof btoa === 'function') { - var sourceMapping = toComment(cssMapping); - var sourceURLs = cssMapping.sources.map(function (source) { - return '/*# sourceURL=' + cssMapping.sourceRoot + source + ' */' - }); - - return [content].concat(sourceURLs).concat([sourceMapping]).join('\n'); - } - - return [content].join('\n'); -} - -// Adapted from convert-source-map (MIT) -function toComment(sourceMap) { - // eslint-disable-next-line no-undef - var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))); - var data = 'sourceMappingURL=data:application/json;charset=utf-8;base64,' + base64; - - return '/*# ' + data + ' */'; -} - - -/***/ }), -/* 52 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var _prodInvariant = __webpack_require__(16), - _assign = __webpack_require__(3); - -var ReactNoopUpdateQueue = __webpack_require__(53); - -var canDefineProperty = __webpack_require__(24); -var emptyObject = __webpack_require__(25); -var invariant = __webpack_require__(0); -var lowPriorityWarning = __webpack_require__(32); - -/** - * Base class helpers for the updating state of a component. - */ -function ReactComponent(props, context, updater) { - this.props = props; - this.context = context; - this.refs = emptyObject; - // We initialize the default updater but the real one gets injected by the - // renderer. - this.updater = updater || ReactNoopUpdateQueue; -} - -ReactComponent.prototype.isReactComponent = {}; - -/** - * Sets a subset of the state. Always use this to mutate - * state. You should treat `this.state` as immutable. - * - * There is no guarantee that `this.state` will be immediately updated, so - * accessing `this.state` after calling this method may return the old value. - * - * There is no guarantee that calls to `setState` will run synchronously, - * as they may eventually be batched together. You can provide an optional - * callback that will be executed when the call to setState is actually - * completed. - * - * When a function is provided to setState, it will be called at some point in - * the future (not synchronously). It will be called with the up to date - * component arguments (state, props, context). These values can be different - * from this.* because your function may be called after receiveProps but before - * shouldComponentUpdate, and this new state, props, and context will not yet be - * assigned to this. - * - * @param {object|function} partialState Next partial state or function to - * produce next partial state to be merged with current state. - * @param {?function} callback Called after state is updated. - * @final - * @protected - */ -ReactComponent.prototype.setState = function (partialState, callback) { - !(typeof partialState === 'object' || typeof partialState === 'function' || partialState == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'setState(...): takes an object of state variables to update or a function which returns an object of state variables.') : _prodInvariant('85') : void 0; - this.updater.enqueueSetState(this, partialState); - if (callback) { - this.updater.enqueueCallback(this, callback, 'setState'); - } -}; - -/** - * Forces an update. This should only be invoked when it is known with - * certainty that we are **not** in a DOM transaction. - * - * You may want to call this when you know that some deeper aspect of the - * component's state has changed but `setState` was not called. - * - * This will not invoke `shouldComponentUpdate`, but it will invoke - * `componentWillUpdate` and `componentDidUpdate`. - * - * @param {?function} callback Called after update is complete. - * @final - * @protected - */ -ReactComponent.prototype.forceUpdate = function (callback) { - this.updater.enqueueForceUpdate(this); - if (callback) { - this.updater.enqueueCallback(this, callback, 'forceUpdate'); - } -}; - -/** - * Deprecated APIs. These APIs used to exist on classic React classes but since - * we would like to deprecate them, we're not going to move them over to this - * modern base class. Instead, we define a getter that warns if it's accessed. - */ -if (process.env.NODE_ENV !== 'production') { - var deprecatedAPIs = { - 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).'] - }; - var defineDeprecationWarning = function (methodName, info) { - if (canDefineProperty) { - Object.defineProperty(ReactComponent.prototype, methodName, { - get: function () { - lowPriorityWarning(false, '%s(...) is deprecated in plain JavaScript React classes. %s', info[0], info[1]); - return undefined; - } - }); - } - }; - for (var fnName in deprecatedAPIs) { - if (deprecatedAPIs.hasOwnProperty(fnName)) { - defineDeprecationWarning(fnName, deprecatedAPIs[fnName]); - } - } -} - -/** - * Base class helpers for the updating state of a component. - */ -function ReactPureComponent(props, context, updater) { - // Duplicated from ReactComponent. - this.props = props; - this.context = context; - this.refs = emptyObject; - // We initialize the default updater but the real one gets injected by the - // renderer. - this.updater = updater || ReactNoopUpdateQueue; -} - -function ComponentDummy() {} -ComponentDummy.prototype = ReactComponent.prototype; -ReactPureComponent.prototype = new ComponentDummy(); -ReactPureComponent.prototype.constructor = ReactPureComponent; -// Avoid an extra prototype jump for these methods. -_assign(ReactPureComponent.prototype, ReactComponent.prototype); -ReactPureComponent.prototype.isPureReactComponent = true; - -module.exports = { - Component: ReactComponent, - PureComponent: ReactPureComponent -}; - -/***/ }), -/* 53 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2015-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var warning = __webpack_require__(1); - -function warnNoop(publicInstance, callerName) { - if (process.env.NODE_ENV !== 'production') { - var constructor = publicInstance.constructor; - process.env.NODE_ENV !== 'production' ? warning(false, '%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.', callerName, callerName, constructor && (constructor.displayName || constructor.name) || 'ReactClass') : void 0; - } -} - -/** - * This is the abstract API for an update queue. - */ -var ReactNoopUpdateQueue = { - /** - * Checks whether or not this composite component is mounted. - * @param {ReactClass} publicInstance The instance we want to test. - * @return {boolean} True if mounted, false otherwise. - * @protected - * @final - */ - isMounted: function (publicInstance) { - return false; - }, - - /** - * Enqueue a callback that will be executed after all the pending updates - * have processed. - * - * @param {ReactClass} publicInstance The instance to use as `this` context. - * @param {?function} callback Called after state is updated. - * @internal - */ - enqueueCallback: function (publicInstance, callback) {}, - - /** - * Forces an update. This should only be invoked when it is known with - * certainty that we are **not** in a DOM transaction. - * - * You may want to call this when you know that some deeper aspect of the - * component's state has changed but `setState` was not called. - * - * This will not invoke `shouldComponentUpdate`, but it will invoke - * `componentWillUpdate` and `componentDidUpdate`. - * - * @param {ReactClass} publicInstance The instance that should rerender. - * @internal - */ - enqueueForceUpdate: function (publicInstance) { - warnNoop(publicInstance, 'forceUpdate'); - }, - - /** - * Replaces all of the state. Always use this or `setState` to mutate state. - * You should treat `this.state` as immutable. - * - * There is no guarantee that `this.state` will be immediately updated, so - * accessing `this.state` after calling this method may return the old value. - * - * @param {ReactClass} publicInstance The instance that should rerender. - * @param {object} completeState Next state. - * @internal - */ - enqueueReplaceState: function (publicInstance, completeState) { - warnNoop(publicInstance, 'replaceState'); - }, - - /** - * Sets a subset of the state. This only exists because _pendingState is - * internal. This provides a merging strategy that is not available to deep - * properties which is confusing. TODO: Expose pendingState or don't use it - * during the merge. - * - * @param {ReactClass} publicInstance The instance that should rerender. - * @param {object} partialState Next partial state to be merged with state. - * @internal - */ - enqueueSetState: function (publicInstance, partialState) { - warnNoop(publicInstance, 'setState'); - } -}; - -module.exports = ReactNoopUpdateQueue; - -/***/ }), -/* 54 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2014-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * - */ - - - -// The Symbol used to tag the ReactElement type. If there is no native Symbol -// nor polyfill, then a plain number is used for performance. - -var REACT_ELEMENT_TYPE = typeof Symbol === 'function' && Symbol['for'] && Symbol['for']('react.element') || 0xeac7; - -module.exports = REACT_ELEMENT_TYPE; - -/***/ }), -/* 55 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * - */ - - - -/* global Symbol */ - -var ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator; -var FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec. - -/** - * Returns the iterator method function contained on the iterable object. - * - * Be sure to invoke the function with the iterable as context: - * - * var iteratorFn = getIteratorFn(myIterable); - * if (iteratorFn) { - * var iterator = iteratorFn.call(myIterable); - * ... - * } - * - * @param {?object} maybeIterable - * @return {?function} - */ -function getIteratorFn(maybeIterable) { - var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]); - if (typeof iteratorFn === 'function') { - return iteratorFn; - } -} - -module.exports = getIteratorFn; - -/***/ }), -/* 56 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2014-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - -/** - * ReactElementValidator provides a wrapper around a element factory - * which validates the props passed to the element. This is intended to be - * used only in DEV and could be replaced by a static type checker for languages - * that support it. - */ - - - -var ReactCurrentOwner = __webpack_require__(9); -var ReactComponentTreeHook = __webpack_require__(6); -var ReactElement = __webpack_require__(13); - -var checkReactTypeSpec = __webpack_require__(99); - -var canDefineProperty = __webpack_require__(24); -var getIteratorFn = __webpack_require__(55); -var warning = __webpack_require__(1); -var lowPriorityWarning = __webpack_require__(32); - -function getDeclarationErrorAddendum() { - if (ReactCurrentOwner.current) { - var name = ReactCurrentOwner.current.getName(); - if (name) { - return ' Check the render method of `' + name + '`.'; - } - } - return ''; -} - -function getSourceInfoErrorAddendum(elementProps) { - if (elementProps !== null && elementProps !== undefined && elementProps.__source !== undefined) { - var source = elementProps.__source; - var fileName = source.fileName.replace(/^.*[\\\/]/, ''); - var lineNumber = source.lineNumber; - return ' Check your code at ' + fileName + ':' + lineNumber + '.'; - } - return ''; -} - -/** - * Warn if there's no key explicitly set on dynamic arrays of children or - * object keys are not valid. This allows us to keep track of children between - * updates. - */ -var ownerHasKeyUseWarning = {}; - -function getCurrentComponentErrorInfo(parentType) { - var info = getDeclarationErrorAddendum(); - - if (!info) { - var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name; - if (parentName) { - info = ' Check the top-level render call using <' + parentName + '>.'; - } - } - return info; -} - -/** - * Warn if the element doesn't have an explicit key assigned to it. - * This element is in an array. The array could grow and shrink or be - * reordered. All children that haven't already been validated are required to - * have a "key" property assigned to it. Error statuses are cached so a warning - * will only be shown once. - * - * @internal - * @param {ReactElement} element Element that requires a key. - * @param {*} parentType element's parent's type. - */ -function validateExplicitKey(element, parentType) { - if (!element._store || element._store.validated || element.key != null) { - return; - } - element._store.validated = true; - - var memoizer = ownerHasKeyUseWarning.uniqueKey || (ownerHasKeyUseWarning.uniqueKey = {}); - - var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType); - if (memoizer[currentComponentErrorInfo]) { - return; - } - memoizer[currentComponentErrorInfo] = true; - - // Usually the current owner is the offender, but if it accepts children as a - // property, it may be the creator of the child that's responsible for - // assigning it a key. - var childOwner = ''; - if (element && element._owner && element._owner !== ReactCurrentOwner.current) { - // Give the component that originally created this child. - childOwner = ' It was passed a child from ' + element._owner.getName() + '.'; - } - - process.env.NODE_ENV !== 'production' ? warning(false, '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', currentComponentErrorInfo, childOwner, ReactComponentTreeHook.getCurrentStackAddendum(element)) : void 0; -} - -/** - * Ensure that every element either is passed in a static location, in an - * array with an explicit keys property defined, or in an object literal - * with valid key property. - * - * @internal - * @param {ReactNode} node Statically passed child of any type. - * @param {*} parentType node's parent's type. - */ -function validateChildKeys(node, parentType) { - if (typeof node !== 'object') { - return; - } - if (Array.isArray(node)) { - for (var i = 0; i < node.length; i++) { - var child = node[i]; - if (ReactElement.isValidElement(child)) { - validateExplicitKey(child, parentType); - } - } - } else if (ReactElement.isValidElement(node)) { - // This element was passed in a valid location. - if (node._store) { - node._store.validated = true; - } - } else if (node) { - var iteratorFn = getIteratorFn(node); - // Entry iterators provide implicit keys. - if (iteratorFn) { - if (iteratorFn !== node.entries) { - var iterator = iteratorFn.call(node); - var step; - while (!(step = iterator.next()).done) { - if (ReactElement.isValidElement(step.value)) { - validateExplicitKey(step.value, parentType); - } - } - } - } - } -} - -/** - * Given an element, validate that its props follow the propTypes definition, - * provided by the type. - * - * @param {ReactElement} element - */ -function validatePropTypes(element) { - var componentClass = element.type; - if (typeof componentClass !== 'function') { - return; - } - var name = componentClass.displayName || componentClass.name; - if (componentClass.propTypes) { - checkReactTypeSpec(componentClass.propTypes, element.props, 'prop', name, element, null); - } - if (typeof componentClass.getDefaultProps === 'function') { - process.env.NODE_ENV !== 'production' ? warning(componentClass.getDefaultProps.isReactClassApproved, 'getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.') : void 0; - } -} - -var ReactElementValidator = { - createElement: function (type, props, children) { - var validType = typeof type === 'string' || typeof type === 'function'; - // We warn in this case but don't throw. We expect the element creation to - // succeed and there will likely be errors in render. - if (!validType) { - if (typeof type !== 'function' && typeof type !== 'string') { - var info = ''; - if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) { - info += ' You likely forgot to export your component from the file ' + "it's defined in."; - } - - var sourceInfo = getSourceInfoErrorAddendum(props); - if (sourceInfo) { - info += sourceInfo; - } else { - info += getDeclarationErrorAddendum(); - } - - info += ReactComponentTreeHook.getCurrentStackAddendum(); - - var currentSource = props !== null && props !== undefined && props.__source !== undefined ? props.__source : null; - ReactComponentTreeHook.pushNonStandardWarningStack(true, currentSource); - process.env.NODE_ENV !== 'production' ? warning(false, 'React.createElement: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', type == null ? type : typeof type, info) : void 0; - ReactComponentTreeHook.popNonStandardWarningStack(); - } - } - - var element = ReactElement.createElement.apply(this, arguments); - - // The result can be nullish if a mock or a custom function is used. - // TODO: Drop this when these are no longer allowed as the type argument. - if (element == null) { - return element; - } - - // Skip key warning if the type isn't valid since our key validation logic - // doesn't expect a non-string/function type and can throw confusing errors. - // We don't want exception behavior to differ between dev and prod. - // (Rendering will throw with a helpful message and as soon as the type is - // fixed, the key warnings will appear.) - if (validType) { - for (var i = 2; i < arguments.length; i++) { - validateChildKeys(arguments[i], type); - } - } - - validatePropTypes(element); - - return element; - }, - - createFactory: function (type) { - var validatedFactory = ReactElementValidator.createElement.bind(null, type); - // Legacy hook TODO: Warn if this is accessed - validatedFactory.type = type; - - if (process.env.NODE_ENV !== 'production') { - if (canDefineProperty) { - Object.defineProperty(validatedFactory, 'type', { - enumerable: false, - get: function () { - lowPriorityWarning(false, 'Factory.type is deprecated. Access the class directly ' + 'before passing it to createFactory.'); - Object.defineProperty(this, 'type', { - value: type - }); - return type; - } - }); - } - } - - return validatedFactory; - }, - - cloneElement: function (element, props, children) { - var newElement = ReactElement.cloneElement.apply(this, arguments); - for (var i = 2; i < arguments.length; i++) { - validateChildKeys(arguments[i], newElement.type); - } - validatePropTypes(newElement); - return newElement; - } -}; - -module.exports = ReactElementValidator; - -/***/ }), -/* 57 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - - - -// React 15.5 references this module, and assumes PropTypes are still callable in production. -// Therefore we re-export development-only version with all the PropTypes checks here. -// However if one is migrating to the `prop-types` npm library, they will go through the -// `index.js` entry point, and it will branch depending on the environment. -var factory = __webpack_require__(58); -module.exports = function(isValidElement) { - // It is still allowed in 15.5. - var throwOnDirectAccess = false; - return factory(isValidElement, throwOnDirectAccess); -}; - - -/***/ }), -/* 58 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - - - -var emptyFunction = __webpack_require__(7); -var invariant = __webpack_require__(0); -var warning = __webpack_require__(1); -var assign = __webpack_require__(3); - -var ReactPropTypesSecret = __webpack_require__(33); -var checkPropTypes = __webpack_require__(103); - -module.exports = function(isValidElement, throwOnDirectAccess) { - /* global Symbol */ - var ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator; - var FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec. - - /** - * Returns the iterator method function contained on the iterable object. - * - * Be sure to invoke the function with the iterable as context: - * - * var iteratorFn = getIteratorFn(myIterable); - * if (iteratorFn) { - * var iterator = iteratorFn.call(myIterable); - * ... - * } - * - * @param {?object} maybeIterable - * @return {?function} - */ - function getIteratorFn(maybeIterable) { - var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]); - if (typeof iteratorFn === 'function') { - return iteratorFn; - } - } - - /** - * Collection of methods that allow declaration and validation of props that are - * supplied to React components. Example usage: - * - * var Props = require('ReactPropTypes'); - * var MyArticle = React.createClass({ - * propTypes: { - * // An optional string prop named "description". - * description: Props.string, - * - * // A required enum prop named "category". - * category: Props.oneOf(['News','Photos']).isRequired, - * - * // A prop named "dialog" that requires an instance of Dialog. - * dialog: Props.instanceOf(Dialog).isRequired - * }, - * render: function() { ... } - * }); - * - * A more formal specification of how these methods are used: - * - * type := array|bool|func|object|number|string|oneOf([...])|instanceOf(...) - * decl := ReactPropTypes.{type}(.isRequired)? - * - * Each and every declaration produces a function with the same signature. This - * allows the creation of custom validation functions. For example: - * - * var MyLink = React.createClass({ - * propTypes: { - * // An optional string or URI prop named "href". - * href: function(props, propName, componentName) { - * var propValue = props[propName]; - * if (propValue != null && typeof propValue !== 'string' && - * !(propValue instanceof URI)) { - * return new Error( - * 'Expected a string or an URI for ' + propName + ' in ' + - * componentName - * ); - * } - * } - * }, - * render: function() {...} - * }); - * - * @internal - */ - - var ANONYMOUS = '<<anonymous>>'; - - // Important! - // Keep this list in sync with production version in `./factoryWithThrowingShims.js`. - var ReactPropTypes = { - array: createPrimitiveTypeChecker('array'), - bool: createPrimitiveTypeChecker('boolean'), - func: createPrimitiveTypeChecker('function'), - number: createPrimitiveTypeChecker('number'), - object: createPrimitiveTypeChecker('object'), - string: createPrimitiveTypeChecker('string'), - symbol: createPrimitiveTypeChecker('symbol'), - - any: createAnyTypeChecker(), - arrayOf: createArrayOfTypeChecker, - element: createElementTypeChecker(), - instanceOf: createInstanceTypeChecker, - node: createNodeChecker(), - objectOf: createObjectOfTypeChecker, - oneOf: createEnumTypeChecker, - oneOfType: createUnionTypeChecker, - shape: createShapeTypeChecker, - exact: createStrictShapeTypeChecker, - }; - - /** - * inlined Object.is polyfill to avoid requiring consumers ship their own - * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is - */ - /*eslint-disable no-self-compare*/ - function is(x, y) { - // SameValue algorithm - if (x === y) { - // Steps 1-5, 7-10 - // Steps 6.b-6.e: +0 != -0 - return x !== 0 || 1 / x === 1 / y; - } else { - // Step 6.a: NaN == NaN - return x !== x && y !== y; - } - } - /*eslint-enable no-self-compare*/ - - /** - * We use an Error-like object for backward compatibility as people may call - * PropTypes directly and inspect their output. However, we don't use real - * Errors anymore. We don't inspect their stack anyway, and creating them - * is prohibitively expensive if they are created too often, such as what - * happens in oneOfType() for any type before the one that matched. - */ - function PropTypeError(message) { - this.message = message; - this.stack = ''; - } - // Make `instanceof Error` still work for returned errors. - PropTypeError.prototype = Error.prototype; - - function createChainableTypeChecker(validate) { - if (process.env.NODE_ENV !== 'production') { - var manualPropTypeCallCache = {}; - var manualPropTypeWarningCount = 0; - } - function checkType(isRequired, props, propName, componentName, location, propFullName, secret) { - componentName = componentName || ANONYMOUS; - propFullName = propFullName || propName; - - if (secret !== ReactPropTypesSecret) { - if (throwOnDirectAccess) { - // New behavior only for users of `prop-types` package - invariant( - false, - 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' + - 'Use `PropTypes.checkPropTypes()` to call them. ' + - 'Read more at http://fb.me/use-check-prop-types' - ); - } else if (process.env.NODE_ENV !== 'production' && typeof console !== 'undefined') { - // Old behavior for people using React.PropTypes - var cacheKey = componentName + ':' + propName; - if ( - !manualPropTypeCallCache[cacheKey] && - // Avoid spamming the console because they are often not actionable except for lib authors - manualPropTypeWarningCount < 3 - ) { - warning( - false, - 'You are manually calling a React.PropTypes validation ' + - 'function for the `%s` prop on `%s`. This is deprecated ' + - 'and will throw in the standalone `prop-types` package. ' + - 'You may be seeing this warning due to a third-party PropTypes ' + - 'library. See https://fb.me/react-warning-dont-call-proptypes ' + 'for details.', - propFullName, - componentName - ); - manualPropTypeCallCache[cacheKey] = true; - manualPropTypeWarningCount++; - } - } - } - if (props[propName] == null) { - if (isRequired) { - if (props[propName] === null) { - return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required ' + ('in `' + componentName + '`, but its value is `null`.')); - } - return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required in ' + ('`' + componentName + '`, but its value is `undefined`.')); - } - return null; - } else { - return validate(props, propName, componentName, location, propFullName); - } - } - - var chainedCheckType = checkType.bind(null, false); - chainedCheckType.isRequired = checkType.bind(null, true); - - return chainedCheckType; - } - - function createPrimitiveTypeChecker(expectedType) { - function validate(props, propName, componentName, location, propFullName, secret) { - var propValue = props[propName]; - var propType = getPropType(propValue); - if (propType !== expectedType) { - // `propValue` being instance of, say, date/regexp, pass the 'object' - // check, but we can offer a more precise error message here rather than - // 'of type `object`'. - var preciseType = getPreciseType(propValue); - - return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + preciseType + '` supplied to `' + componentName + '`, expected ') + ('`' + expectedType + '`.')); - } - return null; - } - return createChainableTypeChecker(validate); - } - - function createAnyTypeChecker() { - return createChainableTypeChecker(emptyFunction.thatReturnsNull); - } - - function createArrayOfTypeChecker(typeChecker) { - function validate(props, propName, componentName, location, propFullName) { - if (typeof typeChecker !== 'function') { - return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside arrayOf.'); - } - var propValue = props[propName]; - if (!Array.isArray(propValue)) { - var propType = getPropType(propValue); - return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an array.')); - } - for (var i = 0; i < propValue.length; i++) { - var error = typeChecker(propValue, i, componentName, location, propFullName + '[' + i + ']', ReactPropTypesSecret); - if (error instanceof Error) { - return error; - } - } - return null; - } - return createChainableTypeChecker(validate); - } - - function createElementTypeChecker() { - function validate(props, propName, componentName, location, propFullName) { - var propValue = props[propName]; - if (!isValidElement(propValue)) { - var propType = getPropType(propValue); - return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement.')); - } - return null; - } - return createChainableTypeChecker(validate); - } - - function createInstanceTypeChecker(expectedClass) { - function validate(props, propName, componentName, location, propFullName) { - if (!(props[propName] instanceof expectedClass)) { - var expectedClassName = expectedClass.name || ANONYMOUS; - var actualClassName = getClassName(props[propName]); - return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + actualClassName + '` supplied to `' + componentName + '`, expected ') + ('instance of `' + expectedClassName + '`.')); - } - return null; - } - return createChainableTypeChecker(validate); - } - - function createEnumTypeChecker(expectedValues) { - if (!Array.isArray(expectedValues)) { - process.env.NODE_ENV !== 'production' ? warning(false, 'Invalid argument supplied to oneOf, expected an instance of array.') : void 0; - return emptyFunction.thatReturnsNull; - } - - function validate(props, propName, componentName, location, propFullName) { - var propValue = props[propName]; - for (var i = 0; i < expectedValues.length; i++) { - if (is(propValue, expectedValues[i])) { - return null; - } - } - - var valuesString = JSON.stringify(expectedValues); - return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of value `' + propValue + '` ' + ('supplied to `' + componentName + '`, expected one of ' + valuesString + '.')); - } - return createChainableTypeChecker(validate); - } - - function createObjectOfTypeChecker(typeChecker) { - function validate(props, propName, componentName, location, propFullName) { - if (typeof typeChecker !== 'function') { - return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside objectOf.'); - } - var propValue = props[propName]; - var propType = getPropType(propValue); - if (propType !== 'object') { - return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an object.')); - } - for (var key in propValue) { - if (propValue.hasOwnProperty(key)) { - var error = typeChecker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret); - if (error instanceof Error) { - return error; - } - } - } - return null; - } - return createChainableTypeChecker(validate); - } - - function createUnionTypeChecker(arrayOfTypeCheckers) { - if (!Array.isArray(arrayOfTypeCheckers)) { - process.env.NODE_ENV !== 'production' ? warning(false, 'Invalid argument supplied to oneOfType, expected an instance of array.') : void 0; - return emptyFunction.thatReturnsNull; - } - - for (var i = 0; i < arrayOfTypeCheckers.length; i++) { - var checker = arrayOfTypeCheckers[i]; - if (typeof checker !== 'function') { - warning( - false, - 'Invalid argument supplied to oneOfType. Expected an array of check functions, but ' + - 'received %s at index %s.', - getPostfixForTypeWarning(checker), - i - ); - return emptyFunction.thatReturnsNull; - } - } - - function validate(props, propName, componentName, location, propFullName) { - for (var i = 0; i < arrayOfTypeCheckers.length; i++) { - var checker = arrayOfTypeCheckers[i]; - if (checker(props, propName, componentName, location, propFullName, ReactPropTypesSecret) == null) { - return null; - } - } - - return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`.')); - } - return createChainableTypeChecker(validate); - } - - function createNodeChecker() { - function validate(props, propName, componentName, location, propFullName) { - if (!isNode(props[propName])) { - return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a ReactNode.')); - } - return null; - } - return createChainableTypeChecker(validate); - } - - function createShapeTypeChecker(shapeTypes) { - function validate(props, propName, componentName, location, propFullName) { - var propValue = props[propName]; - var propType = getPropType(propValue); - if (propType !== 'object') { - return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.')); - } - for (var key in shapeTypes) { - var checker = shapeTypes[key]; - if (!checker) { - continue; - } - var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret); - if (error) { - return error; - } - } - return null; - } - return createChainableTypeChecker(validate); - } - - function createStrictShapeTypeChecker(shapeTypes) { - function validate(props, propName, componentName, location, propFullName) { - var propValue = props[propName]; - var propType = getPropType(propValue); - if (propType !== 'object') { - return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.')); - } - // We need to check all keys in case some are required but missing from - // props. - var allKeys = assign({}, props[propName], shapeTypes); - for (var key in allKeys) { - var checker = shapeTypes[key]; - if (!checker) { - return new PropTypeError( - 'Invalid ' + location + ' `' + propFullName + '` key `' + key + '` supplied to `' + componentName + '`.' + - '\nBad object: ' + JSON.stringify(props[propName], null, ' ') + - '\nValid keys: ' + JSON.stringify(Object.keys(shapeTypes), null, ' ') - ); - } - var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret); - if (error) { - return error; - } - } - return null; - } - - return createChainableTypeChecker(validate); - } - - function isNode(propValue) { - switch (typeof propValue) { - case 'number': - case 'string': - case 'undefined': - return true; - case 'boolean': - return !propValue; - case 'object': - if (Array.isArray(propValue)) { - return propValue.every(isNode); - } - if (propValue === null || isValidElement(propValue)) { - return true; - } - - var iteratorFn = getIteratorFn(propValue); - if (iteratorFn) { - var iterator = iteratorFn.call(propValue); - var step; - if (iteratorFn !== propValue.entries) { - while (!(step = iterator.next()).done) { - if (!isNode(step.value)) { - return false; - } - } - } else { - // Iterator will provide entry [k,v] tuples rather than values. - while (!(step = iterator.next()).done) { - var entry = step.value; - if (entry) { - if (!isNode(entry[1])) { - return false; - } - } - } - } - } else { - return false; - } - - return true; - default: - return false; - } - } - - function isSymbol(propType, propValue) { - // Native Symbol. - if (propType === 'symbol') { - return true; - } - - // 19.4.3.5 Symbol.prototype[@@toStringTag] === 'Symbol' - if (propValue['@@toStringTag'] === 'Symbol') { - return true; - } - - // Fallback for non-spec compliant Symbols which are polyfilled. - if (typeof Symbol === 'function' && propValue instanceof Symbol) { - return true; - } - - return false; - } - - // Equivalent of `typeof` but with special handling for array and regexp. - function getPropType(propValue) { - var propType = typeof propValue; - if (Array.isArray(propValue)) { - return 'array'; - } - if (propValue instanceof RegExp) { - // Old webkits (at least until Android 4.0) return 'function' rather than - // 'object' for typeof a RegExp. We'll normalize this here so that /bla/ - // passes PropTypes.object. - return 'object'; - } - if (isSymbol(propType, propValue)) { - return 'symbol'; - } - return propType; - } - - // This handles more types than `getPropType`. Only used for error messages. - // See `createPrimitiveTypeChecker`. - function getPreciseType(propValue) { - if (typeof propValue === 'undefined' || propValue === null) { - return '' + propValue; - } - var propType = getPropType(propValue); - if (propType === 'object') { - if (propValue instanceof Date) { - return 'date'; - } else if (propValue instanceof RegExp) { - return 'regexp'; - } - } - return propType; - } - - // Returns a string that is postfixed to a warning about an invalid type. - // For example, "undefined" or "of type array" - function getPostfixForTypeWarning(value) { - var type = getPreciseType(value); - switch (type) { - case 'array': - case 'object': - return 'an ' + type; - case 'boolean': - case 'date': - case 'regexp': - return 'a ' + type; - default: - return type; - } - } - - // Returns class name of the object, if any. - function getClassName(propValue) { - if (!propValue.constructor || !propValue.constructor.name) { - return ANONYMOUS; - } - return propValue.constructor.name; - } - - ReactPropTypes.checkPropTypes = checkPropTypes; - ReactPropTypes.PropTypes = ReactPropTypes; - - return ReactPropTypes; -}; - - -/***/ }), -/* 59 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2015-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var ReactDOMComponentFlags = { - hasCachedChildNodes: 1 << 0 -}; - -module.exports = ReactDOMComponentFlags; - -/***/ }), -/* 60 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2014-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * - */ - - - -var _prodInvariant = __webpack_require__(2); - -var invariant = __webpack_require__(0); - -/** - * Accumulates items that must not be null or undefined into the first one. This - * is used to conserve memory by avoiding array allocations, and thus sacrifices - * API cleanness. Since `current` can be null before being passed in and not - * null after this function, make sure to assign it back to `current`: - * - * `a = accumulateInto(a, b);` - * - * This API should be sparingly used. Try `accumulate` for something cleaner. - * - * @return {*|array<*>} An accumulation of items. - */ - -function accumulateInto(current, next) { - !(next != null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'accumulateInto(...): Accumulated items must not be null or undefined.') : _prodInvariant('30') : void 0; - - if (current == null) { - return next; - } - - // Both are not empty. Warning: Never call x.concat(y) when you are not - // certain that x is an Array (x could be a string with concat method). - if (Array.isArray(current)) { - if (Array.isArray(next)) { - current.push.apply(current, next); - return current; - } - current.push(next); - return current; - } - - if (Array.isArray(next)) { - // A bit too dangerous to mutate `next`. - return [current].concat(next); - } - - return [current, next]; -} - -module.exports = accumulateInto; - -/***/ }), -/* 61 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * - */ - - - -/** - * @param {array} arr an "accumulation" of items which is either an Array or - * a single item. Useful when paired with the `accumulate` module. This is a - * simple utility that allows us to reason about a collection of items, but - * handling the case when there is exactly one item (and we do not need to - * allocate an array). - */ - -function forEachAccumulated(arr, cb, scope) { - if (Array.isArray(arr)) { - arr.forEach(cb, scope); - } else if (arr) { - cb.call(scope, arr); - } -} - -module.exports = forEachAccumulated; - -/***/ }), -/* 62 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var ExecutionEnvironment = __webpack_require__(5); - -var contentKey = null; - -/** - * Gets the key used to access text content on a DOM node. - * - * @return {?string} Key used to access text content. - * @internal - */ -function getTextContentAccessor() { - if (!contentKey && ExecutionEnvironment.canUseDOM) { - // Prefer textContent to innerText because many browsers support both but - // SVG <text> elements don't support innerText even when <div> does. - contentKey = 'textContent' in document.documentElement ? 'textContent' : 'innerText'; - } - return contentKey; -} - -module.exports = getTextContentAccessor; - -/***/ }), -/* 63 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * - */ - - - -var _prodInvariant = __webpack_require__(2); - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -var PooledClass = __webpack_require__(14); - -var invariant = __webpack_require__(0); - -/** - * A specialized pseudo-event module to help keep track of components waiting to - * be notified when their DOM representations are available for use. - * - * This implements `PooledClass`, so you should never need to instantiate this. - * Instead, use `CallbackQueue.getPooled()`. - * - * @class ReactMountReady - * @implements PooledClass - * @internal - */ - -var CallbackQueue = function () { - function CallbackQueue(arg) { - _classCallCheck(this, CallbackQueue); - - this._callbacks = null; - this._contexts = null; - this._arg = arg; - } - - /** - * Enqueues a callback to be invoked when `notifyAll` is invoked. - * - * @param {function} callback Invoked when `notifyAll` is invoked. - * @param {?object} context Context to call `callback` with. - * @internal - */ - - - CallbackQueue.prototype.enqueue = function enqueue(callback, context) { - this._callbacks = this._callbacks || []; - this._callbacks.push(callback); - this._contexts = this._contexts || []; - this._contexts.push(context); - }; - - /** - * Invokes all enqueued callbacks and clears the queue. This is invoked after - * the DOM representation of a component has been created or updated. - * - * @internal - */ - - - CallbackQueue.prototype.notifyAll = function notifyAll() { - var callbacks = this._callbacks; - var contexts = this._contexts; - var arg = this._arg; - if (callbacks && contexts) { - !(callbacks.length === contexts.length) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Mismatched list of contexts in callback queue') : _prodInvariant('24') : void 0; - this._callbacks = null; - this._contexts = null; - for (var i = 0; i < callbacks.length; i++) { - callbacks[i].call(contexts[i], arg); - } - callbacks.length = 0; - contexts.length = 0; - } - }; - - CallbackQueue.prototype.checkpoint = function checkpoint() { - return this._callbacks ? this._callbacks.length : 0; - }; - - CallbackQueue.prototype.rollback = function rollback(len) { - if (this._callbacks && this._contexts) { - this._callbacks.length = len; - this._contexts.length = len; - } - }; - - /** - * Resets the internal queue. - * - * @internal - */ - - - CallbackQueue.prototype.reset = function reset() { - this._callbacks = null; - this._contexts = null; - }; - - /** - * `PooledClass` looks for this. - */ - - - CallbackQueue.prototype.destructor = function destructor() { - this.reset(); - }; - - return CallbackQueue; -}(); - -module.exports = PooledClass.addPoolingTo(CallbackQueue); - -/***/ }), -/* 64 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * - */ - - - -var ReactFeatureFlags = { - // When true, call console.time() before and .timeEnd() after each top-level - // render (both initial renders and updates). Useful when looking at prod-mode - // timeline profiles in Chrome, for example. - logTopLevelRenders: false -}; - -module.exports = ReactFeatureFlags; - -/***/ }), -/* 65 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var ReactDOMComponentTree = __webpack_require__(4); - -function isCheckable(elem) { - var type = elem.type; - var nodeName = elem.nodeName; - return nodeName && nodeName.toLowerCase() === 'input' && (type === 'checkbox' || type === 'radio'); -} - -function getTracker(inst) { - return inst._wrapperState.valueTracker; -} - -function attachTracker(inst, tracker) { - inst._wrapperState.valueTracker = tracker; -} - -function detachTracker(inst) { - inst._wrapperState.valueTracker = null; -} - -function getValueFromNode(node) { - var value; - if (node) { - value = isCheckable(node) ? '' + node.checked : node.value; - } - return value; -} - -var inputValueTracking = { - // exposed for testing - _getTrackerFromNode: function (node) { - return getTracker(ReactDOMComponentTree.getInstanceFromNode(node)); - }, - - - track: function (inst) { - if (getTracker(inst)) { - return; - } - - var node = ReactDOMComponentTree.getNodeFromInstance(inst); - var valueField = isCheckable(node) ? 'checked' : 'value'; - var descriptor = Object.getOwnPropertyDescriptor(node.constructor.prototype, valueField); - - var currentValue = '' + node[valueField]; - - // if someone has already defined a value or Safari, then bail - // and don't track value will cause over reporting of changes, - // but it's better then a hard failure - // (needed for certain tests that spyOn input values and Safari) - if (node.hasOwnProperty(valueField) || typeof descriptor.get !== 'function' || typeof descriptor.set !== 'function') { - return; - } - - Object.defineProperty(node, valueField, { - enumerable: descriptor.enumerable, - configurable: true, - get: function () { - return descriptor.get.call(this); - }, - set: function (value) { - currentValue = '' + value; - descriptor.set.call(this, value); - } - }); - - attachTracker(inst, { - getValue: function () { - return currentValue; - }, - setValue: function (value) { - currentValue = '' + value; - }, - stopTracking: function () { - detachTracker(inst); - delete node[valueField]; - } - }); - }, - - updateValueIfChanged: function (inst) { - if (!inst) { - return false; - } - var tracker = getTracker(inst); - - if (!tracker) { - inputValueTracking.track(inst); - return true; - } - - var lastValue = tracker.getValue(); - var nextValue = getValueFromNode(ReactDOMComponentTree.getNodeFromInstance(inst)); - - if (nextValue !== lastValue) { - tracker.setValue(nextValue); - return true; - } - - return false; - }, - stopTracking: function (inst) { - var tracker = getTracker(inst); - if (tracker) { - tracker.stopTracking(); - } - } -}; - -module.exports = inputValueTracking; - -/***/ }), -/* 66 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * - */ - - - -/** - * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary - */ - -var supportedInputTypes = { - color: true, - date: true, - datetime: true, - 'datetime-local': true, - email: true, - month: true, - number: true, - password: true, - range: true, - search: true, - tel: true, - text: true, - time: true, - url: true, - week: true -}; - -function isTextInputElement(elem) { - var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase(); - - if (nodeName === 'input') { - return !!supportedInputTypes[elem.type]; - } - - if (nodeName === 'textarea') { - return true; - } - - return false; -} - -module.exports = isTextInputElement; - -/***/ }), -/* 67 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var ViewportMetrics = { - currentScrollLeft: 0, - - currentScrollTop: 0, - - refreshScrollValues: function (scrollPosition) { - ViewportMetrics.currentScrollLeft = scrollPosition.x; - ViewportMetrics.currentScrollTop = scrollPosition.y; - } -}; - -module.exports = ViewportMetrics; - -/***/ }), -/* 68 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var ExecutionEnvironment = __webpack_require__(5); -var escapeTextContentForBrowser = __webpack_require__(30); -var setInnerHTML = __webpack_require__(29); - -/** - * Set the textContent property of a node, ensuring that whitespace is preserved - * even in IE8. innerText is a poor substitute for textContent and, among many - * issues, inserts <br> instead of the literal newline chars. innerHTML behaves - * as it should. - * - * @param {DOMElement} node - * @param {string} text - * @internal - */ -var setTextContent = function (node, text) { - if (text) { - var firstChild = node.firstChild; - - if (firstChild && firstChild === node.lastChild && firstChild.nodeType === 3) { - firstChild.nodeValue = text; - return; - } - } - node.textContent = text; -}; - -if (ExecutionEnvironment.canUseDOM) { - if (!('textContent' in document.documentElement)) { - setTextContent = function (node, text) { - if (node.nodeType === 3) { - node.nodeValue = text; - return; - } - setInnerHTML(node, escapeTextContentForBrowser(text)); - }; - } -} - -module.exports = setTextContent; - -/***/ }), -/* 69 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -/** - * @param {DOMElement} node input/textarea to focus - */ - -function focusNode(node) { - // IE8 can throw "Can't move focus to the control because it is invisible, - // not enabled, or of a type that does not accept the focus." for all kinds of - // reasons that are too expensive and fragile to test. - try { - node.focus(); - } catch (e) {} -} - -module.exports = focusNode; - -/***/ }), -/* 70 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -/** - * CSS properties which accept numbers but are not in units of "px". - */ - -var isUnitlessNumber = { - animationIterationCount: true, - borderImageOutset: true, - borderImageSlice: true, - borderImageWidth: true, - boxFlex: true, - boxFlexGroup: true, - boxOrdinalGroup: true, - columnCount: true, - columns: true, - flex: true, - flexGrow: true, - flexPositive: true, - flexShrink: true, - flexNegative: true, - flexOrder: true, - gridRow: true, - gridRowEnd: true, - gridRowSpan: true, - gridRowStart: true, - gridColumn: true, - gridColumnEnd: true, - gridColumnSpan: true, - gridColumnStart: true, - fontWeight: true, - lineClamp: true, - lineHeight: true, - opacity: true, - order: true, - orphans: true, - tabSize: true, - widows: true, - zIndex: true, - zoom: true, - - // SVG-related properties - fillOpacity: true, - floodOpacity: true, - stopOpacity: true, - strokeDasharray: true, - strokeDashoffset: true, - strokeMiterlimit: true, - strokeOpacity: true, - strokeWidth: true -}; - -/** - * @param {string} prefix vendor-specific prefix, eg: Webkit - * @param {string} key style name, eg: transitionDuration - * @return {string} style name prefixed with `prefix`, properly camelCased, eg: - * WebkitTransitionDuration - */ -function prefixKey(prefix, key) { - return prefix + key.charAt(0).toUpperCase() + key.substring(1); -} - -/** - * Support style names that may come passed in prefixed by adding permutations - * of vendor prefixes. - */ -var prefixes = ['Webkit', 'ms', 'Moz', 'O']; - -// Using Object.keys here, or else the vanilla for-in loop makes IE8 go into an -// infinite loop, because it iterates over the newly added props too. -Object.keys(isUnitlessNumber).forEach(function (prop) { - prefixes.forEach(function (prefix) { - isUnitlessNumber[prefixKey(prefix, prop)] = isUnitlessNumber[prop]; - }); -}); - -/** - * Most style properties can be unset by doing .style[prop] = '' but IE8 - * doesn't like doing that with shorthand properties so for the properties that - * IE8 breaks on, which are listed here, we instead unset each of the - * individual properties. See http://bugs.jquery.com/ticket/12385. - * The 4-value 'clock' properties like margin, padding, border-width seem to - * behave without any problems. Curiously, list-style works too without any - * special prodding. - */ -var shorthandPropertyExpansions = { - background: { - backgroundAttachment: true, - backgroundColor: true, - backgroundImage: true, - backgroundPositionX: true, - backgroundPositionY: true, - backgroundRepeat: true - }, - backgroundPosition: { - backgroundPositionX: true, - backgroundPositionY: true - }, - border: { - borderWidth: true, - borderStyle: true, - borderColor: true - }, - borderBottom: { - borderBottomWidth: true, - borderBottomStyle: true, - borderBottomColor: true - }, - borderLeft: { - borderLeftWidth: true, - borderLeftStyle: true, - borderLeftColor: true - }, - borderRight: { - borderRightWidth: true, - borderRightStyle: true, - borderRightColor: true - }, - borderTop: { - borderTopWidth: true, - borderTopStyle: true, - borderTopColor: true - }, - font: { - fontStyle: true, - fontVariant: true, - fontWeight: true, - fontSize: true, - lineHeight: true, - fontFamily: true - }, - outline: { - outlineWidth: true, - outlineStyle: true, - outlineColor: true - } -}; - -var CSSProperty = { - isUnitlessNumber: isUnitlessNumber, - shorthandPropertyExpansions: shorthandPropertyExpansions -}; - -module.exports = CSSProperty; - -/***/ }), -/* 71 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var DOMProperty = __webpack_require__(12); -var ReactDOMComponentTree = __webpack_require__(4); -var ReactInstrumentation = __webpack_require__(8); - -var quoteAttributeValueForBrowser = __webpack_require__(141); -var warning = __webpack_require__(1); - -var VALID_ATTRIBUTE_NAME_REGEX = new RegExp('^[' + DOMProperty.ATTRIBUTE_NAME_START_CHAR + '][' + DOMProperty.ATTRIBUTE_NAME_CHAR + ']*$'); -var illegalAttributeNameCache = {}; -var validatedAttributeNameCache = {}; - -function isAttributeNameSafe(attributeName) { - if (validatedAttributeNameCache.hasOwnProperty(attributeName)) { - return true; - } - if (illegalAttributeNameCache.hasOwnProperty(attributeName)) { - return false; - } - if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName)) { - validatedAttributeNameCache[attributeName] = true; - return true; - } - illegalAttributeNameCache[attributeName] = true; - process.env.NODE_ENV !== 'production' ? warning(false, 'Invalid attribute name: `%s`', attributeName) : void 0; - return false; -} - -function shouldIgnoreValue(propertyInfo, value) { - return value == null || propertyInfo.hasBooleanValue && !value || propertyInfo.hasNumericValue && isNaN(value) || propertyInfo.hasPositiveNumericValue && value < 1 || propertyInfo.hasOverloadedBooleanValue && value === false; -} - -/** - * Operations for dealing with DOM properties. - */ -var DOMPropertyOperations = { - /** - * Creates markup for the ID property. - * - * @param {string} id Unescaped ID. - * @return {string} Markup string. - */ - createMarkupForID: function (id) { - return DOMProperty.ID_ATTRIBUTE_NAME + '=' + quoteAttributeValueForBrowser(id); - }, - - setAttributeForID: function (node, id) { - node.setAttribute(DOMProperty.ID_ATTRIBUTE_NAME, id); - }, - - createMarkupForRoot: function () { - return DOMProperty.ROOT_ATTRIBUTE_NAME + '=""'; - }, - - setAttributeForRoot: function (node) { - node.setAttribute(DOMProperty.ROOT_ATTRIBUTE_NAME, ''); - }, - - /** - * Creates markup for a property. - * - * @param {string} name - * @param {*} value - * @return {?string} Markup string, or null if the property was invalid. - */ - createMarkupForProperty: function (name, value) { - var propertyInfo = DOMProperty.properties.hasOwnProperty(name) ? DOMProperty.properties[name] : null; - if (propertyInfo) { - if (shouldIgnoreValue(propertyInfo, value)) { - return ''; - } - var attributeName = propertyInfo.attributeName; - if (propertyInfo.hasBooleanValue || propertyInfo.hasOverloadedBooleanValue && value === true) { - return attributeName + '=""'; - } - return attributeName + '=' + quoteAttributeValueForBrowser(value); - } else if (DOMProperty.isCustomAttribute(name)) { - if (value == null) { - return ''; - } - return name + '=' + quoteAttributeValueForBrowser(value); - } - return null; - }, - - /** - * Creates markup for a custom property. - * - * @param {string} name - * @param {*} value - * @return {string} Markup string, or empty string if the property was invalid. - */ - createMarkupForCustomAttribute: function (name, value) { - if (!isAttributeNameSafe(name) || value == null) { - return ''; - } - return name + '=' + quoteAttributeValueForBrowser(value); - }, - - /** - * Sets the value for a property on a node. - * - * @param {DOMElement} node - * @param {string} name - * @param {*} value - */ - setValueForProperty: function (node, name, value) { - var propertyInfo = DOMProperty.properties.hasOwnProperty(name) ? DOMProperty.properties[name] : null; - if (propertyInfo) { - var mutationMethod = propertyInfo.mutationMethod; - if (mutationMethod) { - mutationMethod(node, value); - } else if (shouldIgnoreValue(propertyInfo, value)) { - this.deleteValueForProperty(node, name); - return; - } else if (propertyInfo.mustUseProperty) { - // Contrary to `setAttribute`, object properties are properly - // `toString`ed by IE8/9. - node[propertyInfo.propertyName] = value; - } else { - var attributeName = propertyInfo.attributeName; - var namespace = propertyInfo.attributeNamespace; - // `setAttribute` with objects becomes only `[object]` in IE8/9, - // ('' + value) makes it output the correct toString()-value. - if (namespace) { - node.setAttributeNS(namespace, attributeName, '' + value); - } else if (propertyInfo.hasBooleanValue || propertyInfo.hasOverloadedBooleanValue && value === true) { - node.setAttribute(attributeName, ''); - } else { - node.setAttribute(attributeName, '' + value); - } - } - } else if (DOMProperty.isCustomAttribute(name)) { - DOMPropertyOperations.setValueForAttribute(node, name, value); - return; - } - - if (process.env.NODE_ENV !== 'production') { - var payload = {}; - payload[name] = value; - ReactInstrumentation.debugTool.onHostOperation({ - instanceID: ReactDOMComponentTree.getInstanceFromNode(node)._debugID, - type: 'update attribute', - payload: payload - }); - } - }, - - setValueForAttribute: function (node, name, value) { - if (!isAttributeNameSafe(name)) { - return; - } - if (value == null) { - node.removeAttribute(name); - } else { - node.setAttribute(name, '' + value); - } - - if (process.env.NODE_ENV !== 'production') { - var payload = {}; - payload[name] = value; - ReactInstrumentation.debugTool.onHostOperation({ - instanceID: ReactDOMComponentTree.getInstanceFromNode(node)._debugID, - type: 'update attribute', - payload: payload - }); - } - }, - - /** - * Deletes an attributes from a node. - * - * @param {DOMElement} node - * @param {string} name - */ - deleteValueForAttribute: function (node, name) { - node.removeAttribute(name); - if (process.env.NODE_ENV !== 'production') { - ReactInstrumentation.debugTool.onHostOperation({ - instanceID: ReactDOMComponentTree.getInstanceFromNode(node)._debugID, - type: 'remove attribute', - payload: name - }); - } - }, - - /** - * Deletes the value for a property on a node. - * - * @param {DOMElement} node - * @param {string} name - */ - deleteValueForProperty: function (node, name) { - var propertyInfo = DOMProperty.properties.hasOwnProperty(name) ? DOMProperty.properties[name] : null; - if (propertyInfo) { - var mutationMethod = propertyInfo.mutationMethod; - if (mutationMethod) { - mutationMethod(node, undefined); - } else if (propertyInfo.mustUseProperty) { - var propName = propertyInfo.propertyName; - if (propertyInfo.hasBooleanValue) { - node[propName] = false; - } else { - node[propName] = ''; - } - } else { - node.removeAttribute(propertyInfo.attributeName); - } - } else if (DOMProperty.isCustomAttribute(name)) { - node.removeAttribute(name); - } - - if (process.env.NODE_ENV !== 'production') { - ReactInstrumentation.debugTool.onHostOperation({ - instanceID: ReactDOMComponentTree.getInstanceFromNode(node)._debugID, - type: 'remove attribute', - payload: name - }); - } - } -}; - -module.exports = DOMPropertyOperations; - -/***/ }), -/* 72 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * - */ - - - -var ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED'; - -module.exports = ReactPropTypesSecret; - -/***/ }), -/* 73 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var _assign = __webpack_require__(3); - -var LinkedValueUtils = __webpack_require__(43); -var ReactDOMComponentTree = __webpack_require__(4); -var ReactUpdates = __webpack_require__(10); - -var warning = __webpack_require__(1); - -var didWarnValueLink = false; -var didWarnValueDefaultValue = false; - -function updateOptionsIfPendingUpdateAndMounted() { - if (this._rootNodeID && this._wrapperState.pendingUpdate) { - this._wrapperState.pendingUpdate = false; - - var props = this._currentElement.props; - var value = LinkedValueUtils.getValue(props); - - if (value != null) { - updateOptions(this, Boolean(props.multiple), value); - } - } -} - -function getDeclarationErrorAddendum(owner) { - if (owner) { - var name = owner.getName(); - if (name) { - return ' Check the render method of `' + name + '`.'; - } - } - return ''; -} - -var valuePropNames = ['value', 'defaultValue']; - -/** - * Validation function for `value` and `defaultValue`. - * @private - */ -function checkSelectPropTypes(inst, props) { - var owner = inst._currentElement._owner; - LinkedValueUtils.checkPropTypes('select', props, owner); - - if (props.valueLink !== undefined && !didWarnValueLink) { - process.env.NODE_ENV !== 'production' ? warning(false, '`valueLink` prop on `select` is deprecated; set `value` and `onChange` instead.') : void 0; - didWarnValueLink = true; - } - - for (var i = 0; i < valuePropNames.length; i++) { - var propName = valuePropNames[i]; - if (props[propName] == null) { - continue; - } - var isArray = Array.isArray(props[propName]); - if (props.multiple && !isArray) { - process.env.NODE_ENV !== 'production' ? warning(false, 'The `%s` prop supplied to <select> must be an array if ' + '`multiple` is true.%s', propName, getDeclarationErrorAddendum(owner)) : void 0; - } else if (!props.multiple && isArray) { - process.env.NODE_ENV !== 'production' ? warning(false, 'The `%s` prop supplied to <select> must be a scalar ' + 'value if `multiple` is false.%s', propName, getDeclarationErrorAddendum(owner)) : void 0; - } - } -} - -/** - * @param {ReactDOMComponent} inst - * @param {boolean} multiple - * @param {*} propValue A stringable (with `multiple`, a list of stringables). - * @private - */ -function updateOptions(inst, multiple, propValue) { - var selectedValue, i; - var options = ReactDOMComponentTree.getNodeFromInstance(inst).options; - - if (multiple) { - selectedValue = {}; - for (i = 0; i < propValue.length; i++) { - selectedValue['' + propValue[i]] = true; - } - for (i = 0; i < options.length; i++) { - var selected = selectedValue.hasOwnProperty(options[i].value); - if (options[i].selected !== selected) { - options[i].selected = selected; - } - } - } else { - // Do not set `select.value` as exact behavior isn't consistent across all - // browsers for all cases. - selectedValue = '' + propValue; - for (i = 0; i < options.length; i++) { - if (options[i].value === selectedValue) { - options[i].selected = true; - return; - } - } - if (options.length) { - options[0].selected = true; - } - } -} - -/** - * Implements a <select> host component that allows optionally setting the - * props `value` and `defaultValue`. If `multiple` is false, the prop must be a - * stringable. If `multiple` is true, the prop must be an array of stringables. - * - * If `value` is not supplied (or null/undefined), user actions that change the - * selected option will trigger updates to the rendered options. - * - * If it is supplied (and not null/undefined), the rendered options will not - * update in response to user actions. Instead, the `value` prop must change in - * order for the rendered options to update. - * - * If `defaultValue` is provided, any options with the supplied values will be - * selected. - */ -var ReactDOMSelect = { - getHostProps: function (inst, props) { - return _assign({}, props, { - onChange: inst._wrapperState.onChange, - value: undefined - }); - }, - - mountWrapper: function (inst, props) { - if (process.env.NODE_ENV !== 'production') { - checkSelectPropTypes(inst, props); - } - - var value = LinkedValueUtils.getValue(props); - inst._wrapperState = { - pendingUpdate: false, - initialValue: value != null ? value : props.defaultValue, - listeners: null, - onChange: _handleChange.bind(inst), - wasMultiple: Boolean(props.multiple) - }; - - if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValueDefaultValue) { - process.env.NODE_ENV !== 'production' ? warning(false, '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') : void 0; - didWarnValueDefaultValue = true; - } - }, - - getSelectValueContext: function (inst) { - // ReactDOMOption looks at this initial value so the initial generated - // markup has correct `selected` attributes - return inst._wrapperState.initialValue; - }, - - postUpdateWrapper: function (inst) { - var props = inst._currentElement.props; - - // After the initial mount, we control selected-ness manually so don't pass - // this value down - inst._wrapperState.initialValue = undefined; - - var wasMultiple = inst._wrapperState.wasMultiple; - inst._wrapperState.wasMultiple = Boolean(props.multiple); - - var value = LinkedValueUtils.getValue(props); - if (value != null) { - inst._wrapperState.pendingUpdate = false; - updateOptions(inst, Boolean(props.multiple), value); - } else if (wasMultiple !== Boolean(props.multiple)) { - // For simplicity, reapply `defaultValue` if `multiple` is toggled. - if (props.defaultValue != null) { - updateOptions(inst, Boolean(props.multiple), props.defaultValue); - } else { - // Revert the select back to its default unselected state. - updateOptions(inst, Boolean(props.multiple), props.multiple ? [] : ''); - } - } - } -}; - -function _handleChange(event) { - var props = this._currentElement.props; - var returnValue = LinkedValueUtils.executeOnChange(props, event); - - if (this._rootNodeID) { - this._wrapperState.pendingUpdate = true; - } - ReactUpdates.asap(updateOptionsIfPendingUpdateAndMounted, this); - return returnValue; -} - -module.exports = ReactDOMSelect; - -/***/ }), -/* 74 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var _prodInvariant = __webpack_require__(2), - _assign = __webpack_require__(3); - -var ReactCompositeComponent = __webpack_require__(149); -var ReactEmptyComponent = __webpack_require__(76); -var ReactHostComponent = __webpack_require__(77); - -var getNextDebugID = __webpack_require__(152); -var invariant = __webpack_require__(0); -var warning = __webpack_require__(1); - -// To avoid a cyclic dependency, we create the final class in this module -var ReactCompositeComponentWrapper = function (element) { - this.construct(element); -}; - -function getDeclarationErrorAddendum(owner) { - if (owner) { - var name = owner.getName(); - if (name) { - return ' Check the render method of `' + name + '`.'; - } - } - return ''; -} - -/** - * Check if the type reference is a known internal type. I.e. not a user - * provided composite type. - * - * @param {function} type - * @return {boolean} Returns true if this is a valid internal type. - */ -function isInternalComponentType(type) { - return typeof type === 'function' && typeof type.prototype !== 'undefined' && typeof type.prototype.mountComponent === 'function' && typeof type.prototype.receiveComponent === 'function'; -} - -/** - * Given a ReactNode, create an instance that will actually be mounted. - * - * @param {ReactNode} node - * @param {boolean} shouldHaveDebugID - * @return {object} A new instance of the element's constructor. - * @protected - */ -function instantiateReactComponent(node, shouldHaveDebugID) { - var instance; - - if (node === null || node === false) { - instance = ReactEmptyComponent.create(instantiateReactComponent); - } else if (typeof node === 'object') { - var element = node; - var type = element.type; - if (typeof type !== 'function' && typeof type !== 'string') { - var info = ''; - if (process.env.NODE_ENV !== 'production') { - if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) { - info += ' You likely forgot to export your component from the file ' + "it's defined in."; - } - } - info += getDeclarationErrorAddendum(element._owner); - true ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s', type == null ? type : typeof type, info) : _prodInvariant('130', type == null ? type : typeof type, info) : void 0; - } - - // Special case string values - if (typeof element.type === 'string') { - instance = ReactHostComponent.createInternalComponent(element); - } else if (isInternalComponentType(element.type)) { - // This is temporarily available for custom components that are not string - // representations. I.e. ART. Once those are updated to use the string - // representation, we can drop this code path. - instance = new element.type(element); - - // We renamed this. Allow the old name for compat. :( - if (!instance.getHostNode) { - instance.getHostNode = instance.getNativeNode; - } - } else { - instance = new ReactCompositeComponentWrapper(element); - } - } else if (typeof node === 'string' || typeof node === 'number') { - instance = ReactHostComponent.createInstanceForText(node); - } else { - true ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Encountered invalid React node of type %s', typeof node) : _prodInvariant('131', typeof node) : void 0; - } - - if (process.env.NODE_ENV !== 'production') { - process.env.NODE_ENV !== 'production' ? warning(typeof instance.mountComponent === 'function' && typeof instance.receiveComponent === 'function' && typeof instance.getHostNode === 'function' && typeof instance.unmountComponent === 'function', 'Only React Components can be mounted.') : void 0; - } - - // These two fields are used by the DOM and ART diffing algorithms - // respectively. Instead of using expandos on components, we should be - // storing the state needed by the diffing algorithms elsewhere. - instance._mountIndex = 0; - instance._mountImage = null; - - if (process.env.NODE_ENV !== 'production') { - instance._debugID = shouldHaveDebugID ? getNextDebugID() : 0; - } - - // Internal instances should fully constructed at this point, so they should - // not get any new fields added to them at this point. - if (process.env.NODE_ENV !== 'production') { - if (Object.preventExtensions) { - Object.preventExtensions(instance); - } - } - - return instance; -} - -_assign(ReactCompositeComponentWrapper.prototype, ReactCompositeComponent, { - _instantiateReactComponent: instantiateReactComponent -}); - -module.exports = instantiateReactComponent; - -/***/ }), -/* 75 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * - */ - - - -var _prodInvariant = __webpack_require__(2); - -var React = __webpack_require__(15); - -var invariant = __webpack_require__(0); - -var ReactNodeTypes = { - HOST: 0, - COMPOSITE: 1, - EMPTY: 2, - - getType: function (node) { - if (node === null || node === false) { - return ReactNodeTypes.EMPTY; - } else if (React.isValidElement(node)) { - if (typeof node.type === 'function') { - return ReactNodeTypes.COMPOSITE; - } else { - return ReactNodeTypes.HOST; - } - } - true ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Unexpected node: %s', node) : _prodInvariant('26', node) : void 0; - } -}; - -module.exports = ReactNodeTypes; - -/***/ }), -/* 76 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2014-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var emptyComponentFactory; - -var ReactEmptyComponentInjection = { - injectEmptyComponentFactory: function (factory) { - emptyComponentFactory = factory; - } -}; - -var ReactEmptyComponent = { - create: function (instantiate) { - return emptyComponentFactory(instantiate); - } -}; - -ReactEmptyComponent.injection = ReactEmptyComponentInjection; - -module.exports = ReactEmptyComponent; - -/***/ }), -/* 77 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2014-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var _prodInvariant = __webpack_require__(2); - -var invariant = __webpack_require__(0); - -var genericComponentClass = null; -var textComponentClass = null; - -var ReactHostComponentInjection = { - // This accepts a class that receives the tag string. This is a catch all - // that can render any kind of tag. - injectGenericComponentClass: function (componentClass) { - genericComponentClass = componentClass; - }, - // This accepts a text component class that takes the text string to be - // rendered as props. - injectTextComponentClass: function (componentClass) { - textComponentClass = componentClass; - } -}; - -/** - * Get a host internal component class for a specific tag. - * - * @param {ReactElement} element The element to create. - * @return {function} The internal class constructor function. - */ -function createInternalComponent(element) { - !genericComponentClass ? process.env.NODE_ENV !== 'production' ? invariant(false, 'There is no registered component for the tag %s', element.type) : _prodInvariant('111', element.type) : void 0; - return new genericComponentClass(element); -} - -/** - * @param {ReactText} text - * @return {ReactComponent} - */ -function createInstanceForText(text) { - return new textComponentClass(text); -} - -/** - * @param {ReactComponent} component - * @return {boolean} - */ -function isTextComponent(component) { - return component instanceof textComponentClass; -} - -var ReactHostComponent = { - createInternalComponent: createInternalComponent, - createInstanceForText: createInstanceForText, - isTextComponent: isTextComponent, - injection: ReactHostComponentInjection -}; - -module.exports = ReactHostComponent; - -/***/ }), -/* 78 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var _prodInvariant = __webpack_require__(2); - -var ReactCurrentOwner = __webpack_require__(9); -var REACT_ELEMENT_TYPE = __webpack_require__(153); - -var getIteratorFn = __webpack_require__(154); -var invariant = __webpack_require__(0); -var KeyEscapeUtils = __webpack_require__(47); -var warning = __webpack_require__(1); - -var SEPARATOR = '.'; -var SUBSEPARATOR = ':'; - -/** - * This is inlined from ReactElement since this file is shared between - * isomorphic and renderers. We could extract this to a - * - */ - -/** - * TODO: Test that a single child and an array with one item have the same key - * pattern. - */ - -var didWarnAboutMaps = false; - -/** - * Generate a key string that identifies a component within a set. - * - * @param {*} component A component that could contain a manual key. - * @param {number} index Index that is used if a manual key is not provided. - * @return {string} - */ -function getComponentKey(component, index) { - // Do some typechecking here since we call this blindly. We want to ensure - // that we don't block potential future ES APIs. - if (component && typeof component === 'object' && component.key != null) { - // Explicit key - return KeyEscapeUtils.escape(component.key); - } - // Implicit key determined by the index in the set - return index.toString(36); -} - -/** - * @param {?*} children Children tree container. - * @param {!string} nameSoFar Name of the key path so far. - * @param {!function} callback Callback to invoke with each child found. - * @param {?*} traverseContext Used to pass information throughout the traversal - * process. - * @return {!number} The number of children in this subtree. - */ -function traverseAllChildrenImpl(children, nameSoFar, callback, traverseContext) { - var type = typeof children; - - if (type === 'undefined' || type === 'boolean') { - // All of the above are perceived as null. - children = null; - } - - if (children === null || type === 'string' || type === 'number' || - // The following is inlined from ReactElement. This means we can optimize - // some checks. React Fiber also inlines this logic for similar purposes. - type === 'object' && children.$$typeof === REACT_ELEMENT_TYPE) { - callback(traverseContext, children, - // If it's the only child, treat the name as if it was wrapped in an array - // so that it's consistent if the number of children grows. - nameSoFar === '' ? SEPARATOR + getComponentKey(children, 0) : nameSoFar); - return 1; - } - - var child; - var nextName; - var subtreeCount = 0; // Count of children found in the current subtree. - var nextNamePrefix = nameSoFar === '' ? SEPARATOR : nameSoFar + SUBSEPARATOR; - - if (Array.isArray(children)) { - for (var i = 0; i < children.length; i++) { - child = children[i]; - nextName = nextNamePrefix + getComponentKey(child, i); - subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext); - } - } else { - var iteratorFn = getIteratorFn(children); - if (iteratorFn) { - var iterator = iteratorFn.call(children); - var step; - if (iteratorFn !== children.entries) { - var ii = 0; - while (!(step = iterator.next()).done) { - child = step.value; - nextName = nextNamePrefix + getComponentKey(child, ii++); - subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext); - } - } else { - if (process.env.NODE_ENV !== 'production') { - var mapsAsChildrenAddendum = ''; - if (ReactCurrentOwner.current) { - var mapsAsChildrenOwnerName = ReactCurrentOwner.current.getName(); - if (mapsAsChildrenOwnerName) { - mapsAsChildrenAddendum = ' Check the render method of `' + mapsAsChildrenOwnerName + '`.'; - } - } - process.env.NODE_ENV !== 'production' ? warning(didWarnAboutMaps, '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', mapsAsChildrenAddendum) : void 0; - didWarnAboutMaps = true; - } - // Iterator will provide entry [k,v] tuples rather than values. - while (!(step = iterator.next()).done) { - var entry = step.value; - if (entry) { - child = entry[1]; - nextName = nextNamePrefix + KeyEscapeUtils.escape(entry[0]) + SUBSEPARATOR + getComponentKey(child, 0); - subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext); - } - } - } - } else if (type === 'object') { - var addendum = ''; - if (process.env.NODE_ENV !== 'production') { - addendum = ' 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.'; - if (children._isReactElement) { - addendum = " It looks like you're using an element created by a different " + 'version of React. Make sure to use only one copy of React.'; - } - if (ReactCurrentOwner.current) { - var name = ReactCurrentOwner.current.getName(); - if (name) { - addendum += ' Check the render method of `' + name + '`.'; - } - } - } - var childrenString = String(children); - true ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Objects are not valid as a React child (found: %s).%s', childrenString === '[object Object]' ? 'object with keys {' + Object.keys(children).join(', ') + '}' : childrenString, addendum) : _prodInvariant('31', childrenString === '[object Object]' ? 'object with keys {' + Object.keys(children).join(', ') + '}' : childrenString, addendum) : void 0; - } - } - - return subtreeCount; -} - -/** - * Traverses children that are typically specified as `props.children`, but - * might also be specified through attributes: - * - * - `traverseAllChildren(this.props.children, ...)` - * - `traverseAllChildren(this.props.leftPanelChildren, ...)` - * - * The `traverseContext` is an optional argument that is passed through the - * entire traversal. It can be used to store accumulations or anything else that - * the callback might find relevant. - * - * @param {?*} children Children tree object. - * @param {!function} callback To invoke upon traversing each child. - * @param {?*} traverseContext Context for traversal. - * @return {!number} The number of children in this subtree. - */ -function traverseAllChildren(children, callback, traverseContext) { - if (children == null) { - return 0; - } - - return traverseAllChildrenImpl(children, '', callback, traverseContext); -} - -module.exports = traverseAllChildren; - -/***/ }), -/* 79 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @typechecks - */ - -var emptyFunction = __webpack_require__(7); - -/** - * Upstream version of event listener. Does not take into account specific - * nature of platform. - */ -var EventListener = { - /** - * Listen to DOM events during the bubble phase. - * - * @param {DOMEventTarget} target DOM element to register listener on. - * @param {string} eventType Event type, e.g. 'click' or 'mouseover'. - * @param {function} callback Callback function. - * @return {object} Object with a `remove` method. - */ - listen: function listen(target, eventType, callback) { - if (target.addEventListener) { - target.addEventListener(eventType, callback, false); - return { - remove: function remove() { - target.removeEventListener(eventType, callback, false); - } - }; - } else if (target.attachEvent) { - target.attachEvent('on' + eventType, callback); - return { - remove: function remove() { - target.detachEvent('on' + eventType, callback); - } - }; - } - }, - - /** - * Listen to DOM events during the capture phase. - * - * @param {DOMEventTarget} target DOM element to register listener on. - * @param {string} eventType Event type, e.g. 'click' or 'mouseover'. - * @param {function} callback Callback function. - * @return {object} Object with a `remove` method. - */ - capture: function capture(target, eventType, callback) { - if (target.addEventListener) { - target.addEventListener(eventType, callback, true); - return { - remove: function remove() { - target.removeEventListener(eventType, callback, true); - } - }; - } else { - if (process.env.NODE_ENV !== 'production') { - 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.'); - } - return { - remove: emptyFunction - }; - } - }, - - registerDefault: function registerDefault() {} -}; - -module.exports = EventListener; - -/***/ }), -/* 80 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var ReactDOMSelection = __webpack_require__(166); - -var containsNode = __webpack_require__(168); -var focusNode = __webpack_require__(69); -var getActiveElement = __webpack_require__(81); - -function isInDocument(node) { - return containsNode(document.documentElement, node); -} - -/** - * @ReactInputSelection: React input selection module. Based on Selection.js, - * but modified to be suitable for react and has a couple of bug fixes (doesn't - * assume buttons have range selections allowed). - * Input selection module for React. - */ -var ReactInputSelection = { - hasSelectionCapabilities: function (elem) { - var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase(); - return nodeName && (nodeName === 'input' && elem.type === 'text' || nodeName === 'textarea' || elem.contentEditable === 'true'); - }, - - getSelectionInformation: function () { - var focusedElem = getActiveElement(); - return { - focusedElem: focusedElem, - selectionRange: ReactInputSelection.hasSelectionCapabilities(focusedElem) ? ReactInputSelection.getSelection(focusedElem) : null - }; - }, - - /** - * @restoreSelection: If any selection information was potentially lost, - * restore it. This is useful when performing operations that could remove dom - * nodes and place them back in, resulting in focus being lost. - */ - restoreSelection: function (priorSelectionInformation) { - var curFocusedElem = getActiveElement(); - var priorFocusedElem = priorSelectionInformation.focusedElem; - var priorSelectionRange = priorSelectionInformation.selectionRange; - if (curFocusedElem !== priorFocusedElem && isInDocument(priorFocusedElem)) { - if (ReactInputSelection.hasSelectionCapabilities(priorFocusedElem)) { - ReactInputSelection.setSelection(priorFocusedElem, priorSelectionRange); - } - focusNode(priorFocusedElem); - } - }, - - /** - * @getSelection: Gets the selection bounds of a focused textarea, input or - * contentEditable node. - * -@input: Look up selection bounds of this input - * -@return {start: selectionStart, end: selectionEnd} - */ - getSelection: function (input) { - var selection; - - if ('selectionStart' in input) { - // Modern browser with input or textarea. - selection = { - start: input.selectionStart, - end: input.selectionEnd - }; - } else if (document.selection && input.nodeName && input.nodeName.toLowerCase() === 'input') { - // IE8 input. - var range = document.selection.createRange(); - // There can only be one selection per document in IE, so it must - // be in our element. - if (range.parentElement() === input) { - selection = { - start: -range.moveStart('character', -input.value.length), - end: -range.moveEnd('character', -input.value.length) - }; - } - } else { - // Content editable or old IE textarea. - selection = ReactDOMSelection.getOffsets(input); - } - - return selection || { start: 0, end: 0 }; - }, - - /** - * @setSelection: Sets the selection bounds of a textarea or input and focuses - * the input. - * -@input Set selection bounds of this input or textarea - * -@offsets Object of same form that is returned from get* - */ - setSelection: function (input, offsets) { - var start = offsets.start; - var end = offsets.end; - if (end === undefined) { - end = start; - } - - if ('selectionStart' in input) { - input.selectionStart = start; - input.selectionEnd = Math.min(end, input.value.length); - } else if (document.selection && input.nodeName && input.nodeName.toLowerCase() === 'input') { - var range = input.createTextRange(); - range.collapse(true); - range.moveStart('character', start); - range.moveEnd('character', end - start); - range.select(); - } else { - ReactDOMSelection.setOffsets(input, offsets); - } - } -}; - -module.exports = ReactInputSelection; - -/***/ }), -/* 81 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @typechecks - */ - -/* eslint-disable fb-www/typeof-undefined */ - -/** - * Same as document.activeElement but wraps in a try-catch block. In IE it is - * not safe to call document.activeElement if there is nothing focused. - * - * The activeElement will be null only if the document or document body is not - * yet defined. - * - * @param {?DOMDocument} doc Defaults to current document. - * @return {?DOMElement} - */ -function getActiveElement(doc) /*?DOMElement*/{ - doc = doc || (typeof document !== 'undefined' ? document : undefined); - if (typeof doc === 'undefined') { - return null; - } - try { - return doc.activeElement || doc.body; - } catch (e) { - return doc.body; - } -} - -module.exports = getActiveElement; - -/***/ }), -/* 82 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var _prodInvariant = __webpack_require__(2); - -var DOMLazyTree = __webpack_require__(18); -var DOMProperty = __webpack_require__(12); -var React = __webpack_require__(15); -var ReactBrowserEventEmitter = __webpack_require__(31); -var ReactCurrentOwner = __webpack_require__(9); -var ReactDOMComponentTree = __webpack_require__(4); -var ReactDOMContainerInfo = __webpack_require__(183); -var ReactDOMFeatureFlags = __webpack_require__(184); -var ReactFeatureFlags = __webpack_require__(64); -var ReactInstanceMap = __webpack_require__(23); -var ReactInstrumentation = __webpack_require__(8); -var ReactMarkupChecksum = __webpack_require__(185); -var ReactReconciler = __webpack_require__(17); -var ReactUpdateQueue = __webpack_require__(48); -var ReactUpdates = __webpack_require__(10); - -var emptyObject = __webpack_require__(25); -var instantiateReactComponent = __webpack_require__(74); -var invariant = __webpack_require__(0); -var setInnerHTML = __webpack_require__(29); -var shouldUpdateReactComponent = __webpack_require__(46); -var warning = __webpack_require__(1); - -var ATTR_NAME = DOMProperty.ID_ATTRIBUTE_NAME; -var ROOT_ATTR_NAME = DOMProperty.ROOT_ATTRIBUTE_NAME; - -var ELEMENT_NODE_TYPE = 1; -var DOC_NODE_TYPE = 9; -var DOCUMENT_FRAGMENT_NODE_TYPE = 11; - -var instancesByReactRootID = {}; - -/** - * Finds the index of the first character - * that's not common between the two given strings. - * - * @return {number} the index of the character where the strings diverge - */ -function firstDifferenceIndex(string1, string2) { - var minLen = Math.min(string1.length, string2.length); - for (var i = 0; i < minLen; i++) { - if (string1.charAt(i) !== string2.charAt(i)) { - return i; - } - } - return string1.length === string2.length ? -1 : minLen; -} - -/** - * @param {DOMElement|DOMDocument} container DOM element that may contain - * a React component - * @return {?*} DOM element that may have the reactRoot ID, or null. - */ -function getReactRootElementInContainer(container) { - if (!container) { - return null; - } - - if (container.nodeType === DOC_NODE_TYPE) { - return container.documentElement; - } else { - return container.firstChild; - } -} - -function internalGetID(node) { - // If node is something like a window, document, or text node, none of - // which support attributes or a .getAttribute method, gracefully return - // the empty string, as if the attribute were missing. - return node.getAttribute && node.getAttribute(ATTR_NAME) || ''; -} - -/** - * Mounts this component and inserts it into the DOM. - * - * @param {ReactComponent} componentInstance The instance to mount. - * @param {DOMElement} container DOM element to mount into. - * @param {ReactReconcileTransaction} transaction - * @param {boolean} shouldReuseMarkup If true, do not insert markup - */ -function mountComponentIntoNode(wrapperInstance, container, transaction, shouldReuseMarkup, context) { - var markerName; - if (ReactFeatureFlags.logTopLevelRenders) { - var wrappedElement = wrapperInstance._currentElement.props.child; - var type = wrappedElement.type; - markerName = 'React mount: ' + (typeof type === 'string' ? type : type.displayName || type.name); - console.time(markerName); - } - - var markup = ReactReconciler.mountComponent(wrapperInstance, transaction, null, ReactDOMContainerInfo(wrapperInstance, container), context, 0 /* parentDebugID */ - ); - - if (markerName) { - console.timeEnd(markerName); - } - - wrapperInstance._renderedComponent._topLevelWrapper = wrapperInstance; - ReactMount._mountImageIntoNode(markup, container, wrapperInstance, shouldReuseMarkup, transaction); -} - -/** - * Batched mount. - * - * @param {ReactComponent} componentInstance The instance to mount. - * @param {DOMElement} container DOM element to mount into. - * @param {boolean} shouldReuseMarkup If true, do not insert markup - */ -function batchedMountComponentIntoNode(componentInstance, container, shouldReuseMarkup, context) { - var transaction = ReactUpdates.ReactReconcileTransaction.getPooled( - /* useCreateElement */ - !shouldReuseMarkup && ReactDOMFeatureFlags.useCreateElement); - transaction.perform(mountComponentIntoNode, null, componentInstance, container, transaction, shouldReuseMarkup, context); - ReactUpdates.ReactReconcileTransaction.release(transaction); -} - -/** - * Unmounts a component and removes it from the DOM. - * - * @param {ReactComponent} instance React component instance. - * @param {DOMElement} container DOM element to unmount from. - * @final - * @internal - * @see {ReactMount.unmountComponentAtNode} - */ -function unmountComponentFromNode(instance, container, safely) { - if (process.env.NODE_ENV !== 'production') { - ReactInstrumentation.debugTool.onBeginFlush(); - } - ReactReconciler.unmountComponent(instance, safely); - if (process.env.NODE_ENV !== 'production') { - ReactInstrumentation.debugTool.onEndFlush(); - } - - if (container.nodeType === DOC_NODE_TYPE) { - container = container.documentElement; - } - - // http://jsperf.com/emptying-a-node - while (container.lastChild) { - container.removeChild(container.lastChild); - } -} - -/** - * True if the supplied DOM node has a direct React-rendered child that is - * not a React root element. Useful for warning in `render`, - * `unmountComponentAtNode`, etc. - * - * @param {?DOMElement} node The candidate DOM node. - * @return {boolean} True if the DOM element contains a direct child that was - * rendered by React but is not a root element. - * @internal - */ -function hasNonRootReactChild(container) { - var rootEl = getReactRootElementInContainer(container); - if (rootEl) { - var inst = ReactDOMComponentTree.getInstanceFromNode(rootEl); - return !!(inst && inst._hostParent); - } -} - -/** - * True if the supplied DOM node is a React DOM element and - * it has been rendered by another copy of React. - * - * @param {?DOMElement} node The candidate DOM node. - * @return {boolean} True if the DOM has been rendered by another copy of React - * @internal - */ -function nodeIsRenderedByOtherInstance(container) { - var rootEl = getReactRootElementInContainer(container); - return !!(rootEl && isReactNode(rootEl) && !ReactDOMComponentTree.getInstanceFromNode(rootEl)); -} - -/** - * True if the supplied DOM node is a valid node element. - * - * @param {?DOMElement} node The candidate DOM node. - * @return {boolean} True if the DOM is a valid DOM node. - * @internal - */ -function isValidContainer(node) { - return !!(node && (node.nodeType === ELEMENT_NODE_TYPE || node.nodeType === DOC_NODE_TYPE || node.nodeType === DOCUMENT_FRAGMENT_NODE_TYPE)); -} - -/** - * True if the supplied DOM node is a valid React node element. - * - * @param {?DOMElement} node The candidate DOM node. - * @return {boolean} True if the DOM is a valid React DOM node. - * @internal - */ -function isReactNode(node) { - return isValidContainer(node) && (node.hasAttribute(ROOT_ATTR_NAME) || node.hasAttribute(ATTR_NAME)); -} - -function getHostRootInstanceInContainer(container) { - var rootEl = getReactRootElementInContainer(container); - var prevHostInstance = rootEl && ReactDOMComponentTree.getInstanceFromNode(rootEl); - return prevHostInstance && !prevHostInstance._hostParent ? prevHostInstance : null; -} - -function getTopLevelWrapperInContainer(container) { - var root = getHostRootInstanceInContainer(container); - return root ? root._hostContainerInfo._topLevelWrapper : null; -} - -/** - * Temporary (?) hack so that we can store all top-level pending updates on - * composites instead of having to worry about different types of components - * here. - */ -var topLevelRootCounter = 1; -var TopLevelWrapper = function () { - this.rootID = topLevelRootCounter++; -}; -TopLevelWrapper.prototype.isReactComponent = {}; -if (process.env.NODE_ENV !== 'production') { - TopLevelWrapper.displayName = 'TopLevelWrapper'; -} -TopLevelWrapper.prototype.render = function () { - return this.props.child; -}; -TopLevelWrapper.isReactTopLevelWrapper = true; - -/** - * Mounting is the process of initializing a React component by creating its - * representative DOM elements and inserting them into a supplied `container`. - * Any prior content inside `container` is destroyed in the process. - * - * ReactMount.render( - * component, - * document.getElementById('container') - * ); - * - * <div id="container"> <-- Supplied `container`. - * <div data-reactid=".3"> <-- Rendered reactRoot of React - * // ... component. - * </div> - * </div> - * - * Inside of `container`, the first element rendered is the "reactRoot". - */ -var ReactMount = { - TopLevelWrapper: TopLevelWrapper, - - /** - * Used by devtools. The keys are not important. - */ - _instancesByReactRootID: instancesByReactRootID, - - /** - * This is a hook provided to support rendering React components while - * ensuring that the apparent scroll position of its `container` does not - * change. - * - * @param {DOMElement} container The `container` being rendered into. - * @param {function} renderCallback This must be called once to do the render. - */ - scrollMonitor: function (container, renderCallback) { - renderCallback(); - }, - - /** - * Take a component that's already mounted into the DOM and replace its props - * @param {ReactComponent} prevComponent component instance already in the DOM - * @param {ReactElement} nextElement component instance to render - * @param {DOMElement} container container to render into - * @param {?function} callback function triggered on completion - */ - _updateRootComponent: function (prevComponent, nextElement, nextContext, container, callback) { - ReactMount.scrollMonitor(container, function () { - ReactUpdateQueue.enqueueElementInternal(prevComponent, nextElement, nextContext); - if (callback) { - ReactUpdateQueue.enqueueCallbackInternal(prevComponent, callback); - } - }); - - return prevComponent; - }, - - /** - * Render a new component into the DOM. Hooked by hooks! - * - * @param {ReactElement} nextElement element to render - * @param {DOMElement} container container to render into - * @param {boolean} shouldReuseMarkup if we should skip the markup insertion - * @return {ReactComponent} nextComponent - */ - _renderNewRootComponent: function (nextElement, container, shouldReuseMarkup, context) { - // Various parts of our code (such as ReactCompositeComponent's - // _renderValidatedComponent) assume that calls to render aren't nested; - // verify that that's the case. - process.env.NODE_ENV !== 'production' ? warning(ReactCurrentOwner.current == null, '_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.', ReactCurrentOwner.current && ReactCurrentOwner.current.getName() || 'ReactCompositeComponent') : void 0; - - !isValidContainer(container) ? process.env.NODE_ENV !== 'production' ? invariant(false, '_registerComponent(...): Target container is not a DOM element.') : _prodInvariant('37') : void 0; - - ReactBrowserEventEmitter.ensureScrollValueMonitoring(); - var componentInstance = instantiateReactComponent(nextElement, false); - - // The initial render is synchronous but any updates that happen during - // rendering, in componentWillMount or componentDidMount, will be batched - // according to the current batching strategy. - - ReactUpdates.batchedUpdates(batchedMountComponentIntoNode, componentInstance, container, shouldReuseMarkup, context); - - var wrapperID = componentInstance._instance.rootID; - instancesByReactRootID[wrapperID] = componentInstance; - - return componentInstance; - }, - - /** - * Renders a React component into the DOM in the supplied `container`. - * - * If the React component was previously rendered into `container`, this will - * perform an update on it and only mutate the DOM as necessary to reflect the - * latest React component. - * - * @param {ReactComponent} parentComponent The conceptual parent of this render tree. - * @param {ReactElement} nextElement Component element to render. - * @param {DOMElement} container DOM element to render into. - * @param {?function} callback function triggered on completion - * @return {ReactComponent} Component instance rendered in `container`. - */ - renderSubtreeIntoContainer: function (parentComponent, nextElement, container, callback) { - !(parentComponent != null && ReactInstanceMap.has(parentComponent)) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'parentComponent must be a valid React Component') : _prodInvariant('38') : void 0; - return ReactMount._renderSubtreeIntoContainer(parentComponent, nextElement, container, callback); - }, - - _renderSubtreeIntoContainer: function (parentComponent, nextElement, container, callback) { - ReactUpdateQueue.validateCallback(callback, 'ReactDOM.render'); - !React.isValidElement(nextElement) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactDOM.render(): Invalid component element.%s', typeof nextElement === 'string' ? " Instead of passing a string like 'div', pass " + "React.createElement('div') or <div />." : typeof nextElement === 'function' ? ' Instead of passing a class like Foo, pass ' + 'React.createElement(Foo) or <Foo />.' : // Check if it quacks like an element - nextElement != null && nextElement.props !== undefined ? ' This may be caused by unintentionally loading two independent ' + 'copies of React.' : '') : _prodInvariant('39', typeof nextElement === 'string' ? " Instead of passing a string like 'div', pass " + "React.createElement('div') or <div />." : typeof nextElement === 'function' ? ' Instead of passing a class like Foo, pass ' + 'React.createElement(Foo) or <Foo />.' : nextElement != null && nextElement.props !== undefined ? ' This may be caused by unintentionally loading two independent ' + 'copies of React.' : '') : void 0; - - process.env.NODE_ENV !== 'production' ? warning(!container || !container.tagName || container.tagName.toUpperCase() !== 'BODY', '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.') : void 0; - - var nextWrappedElement = React.createElement(TopLevelWrapper, { - child: nextElement - }); - - var nextContext; - if (parentComponent) { - var parentInst = ReactInstanceMap.get(parentComponent); - nextContext = parentInst._processChildContext(parentInst._context); - } else { - nextContext = emptyObject; - } - - var prevComponent = getTopLevelWrapperInContainer(container); - - if (prevComponent) { - var prevWrappedElement = prevComponent._currentElement; - var prevElement = prevWrappedElement.props.child; - if (shouldUpdateReactComponent(prevElement, nextElement)) { - var publicInst = prevComponent._renderedComponent.getPublicInstance(); - var updatedCallback = callback && function () { - callback.call(publicInst); - }; - ReactMount._updateRootComponent(prevComponent, nextWrappedElement, nextContext, container, updatedCallback); - return publicInst; - } else { - ReactMount.unmountComponentAtNode(container); - } - } - - var reactRootElement = getReactRootElementInContainer(container); - var containerHasReactMarkup = reactRootElement && !!internalGetID(reactRootElement); - var containerHasNonRootReactChild = hasNonRootReactChild(container); - - if (process.env.NODE_ENV !== 'production') { - process.env.NODE_ENV !== 'production' ? warning(!containerHasNonRootReactChild, '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.') : void 0; - - if (!containerHasReactMarkup || reactRootElement.nextSibling) { - var rootElementSibling = reactRootElement; - while (rootElementSibling) { - if (internalGetID(rootElementSibling)) { - process.env.NODE_ENV !== 'production' ? warning(false, '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.') : void 0; - break; - } - rootElementSibling = rootElementSibling.nextSibling; - } - } - } - - var shouldReuseMarkup = containerHasReactMarkup && !prevComponent && !containerHasNonRootReactChild; - var component = ReactMount._renderNewRootComponent(nextWrappedElement, container, shouldReuseMarkup, nextContext)._renderedComponent.getPublicInstance(); - if (callback) { - callback.call(component); - } - return component; - }, - - /** - * Renders a React component into the DOM in the supplied `container`. - * See https://facebook.github.io/react/docs/top-level-api.html#reactdom.render - * - * If the React component was previously rendered into `container`, this will - * perform an update on it and only mutate the DOM as necessary to reflect the - * latest React component. - * - * @param {ReactElement} nextElement Component element to render. - * @param {DOMElement} container DOM element to render into. - * @param {?function} callback function triggered on completion - * @return {ReactComponent} Component instance rendered in `container`. - */ - render: function (nextElement, container, callback) { - return ReactMount._renderSubtreeIntoContainer(null, nextElement, container, callback); - }, - - /** - * Unmounts and destroys the React component rendered in the `container`. - * See https://facebook.github.io/react/docs/top-level-api.html#reactdom.unmountcomponentatnode - * - * @param {DOMElement} container DOM element containing a React component. - * @return {boolean} True if a component was found in and unmounted from - * `container` - */ - unmountComponentAtNode: function (container) { - // Various parts of our code (such as ReactCompositeComponent's - // _renderValidatedComponent) assume that calls to render aren't nested; - // verify that that's the case. (Strictly speaking, unmounting won't cause a - // render but we still don't expect to be in a render call here.) - process.env.NODE_ENV !== 'production' ? warning(ReactCurrentOwner.current == null, '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.', ReactCurrentOwner.current && ReactCurrentOwner.current.getName() || 'ReactCompositeComponent') : void 0; - - !isValidContainer(container) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'unmountComponentAtNode(...): Target container is not a DOM element.') : _prodInvariant('40') : void 0; - - if (process.env.NODE_ENV !== 'production') { - process.env.NODE_ENV !== 'production' ? warning(!nodeIsRenderedByOtherInstance(container), "unmountComponentAtNode(): The node you're attempting to unmount " + 'was rendered by another copy of React.') : void 0; - } - - var prevComponent = getTopLevelWrapperInContainer(container); - if (!prevComponent) { - // Check if the node being unmounted was rendered by React, but isn't a - // root node. - var containerHasNonRootReactChild = hasNonRootReactChild(container); - - // Check if the container itself is a React root node. - var isContainerReactRoot = container.nodeType === 1 && container.hasAttribute(ROOT_ATTR_NAME); - - if (process.env.NODE_ENV !== 'production') { - process.env.NODE_ENV !== 'production' ? warning(!containerHasNonRootReactChild, "unmountComponentAtNode(): The node you're attempting to unmount " + 'was rendered by React and is not a top-level container. %s', isContainerReactRoot ? '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.') : void 0; - } - - return false; - } - delete instancesByReactRootID[prevComponent._instance.rootID]; - ReactUpdates.batchedUpdates(unmountComponentFromNode, prevComponent, container, false); - return true; - }, - - _mountImageIntoNode: function (markup, container, instance, shouldReuseMarkup, transaction) { - !isValidContainer(container) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'mountComponentIntoNode(...): Target container is not valid.') : _prodInvariant('41') : void 0; - - if (shouldReuseMarkup) { - var rootElement = getReactRootElementInContainer(container); - if (ReactMarkupChecksum.canReuseMarkup(markup, rootElement)) { - ReactDOMComponentTree.precacheNode(instance, rootElement); - return; - } else { - var checksum = rootElement.getAttribute(ReactMarkupChecksum.CHECKSUM_ATTR_NAME); - rootElement.removeAttribute(ReactMarkupChecksum.CHECKSUM_ATTR_NAME); - - var rootMarkup = rootElement.outerHTML; - rootElement.setAttribute(ReactMarkupChecksum.CHECKSUM_ATTR_NAME, checksum); - - var normalizedMarkup = markup; - if (process.env.NODE_ENV !== 'production') { - // because rootMarkup is retrieved from the DOM, various normalizations - // will have occurred which will not be present in `markup`. Here, - // insert markup into a <div> or <iframe> depending on the container - // type to perform the same normalizations before comparing. - var normalizer; - if (container.nodeType === ELEMENT_NODE_TYPE) { - normalizer = document.createElement('div'); - normalizer.innerHTML = markup; - normalizedMarkup = normalizer.innerHTML; - } else { - normalizer = document.createElement('iframe'); - document.body.appendChild(normalizer); - normalizer.contentDocument.write(markup); - normalizedMarkup = normalizer.contentDocument.documentElement.outerHTML; - document.body.removeChild(normalizer); - } - } - - var diffIndex = firstDifferenceIndex(normalizedMarkup, rootMarkup); - var difference = ' (client) ' + normalizedMarkup.substring(diffIndex - 20, diffIndex + 20) + '\n (server) ' + rootMarkup.substring(diffIndex - 20, diffIndex + 20); - - !(container.nodeType !== DOC_NODE_TYPE) ? process.env.NODE_ENV !== 'production' ? invariant(false, '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', difference) : _prodInvariant('42', difference) : void 0; - - if (process.env.NODE_ENV !== 'production') { - process.env.NODE_ENV !== 'production' ? warning(false, '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', difference) : void 0; - } - } - } - - !(container.nodeType !== DOC_NODE_TYPE) ? process.env.NODE_ENV !== 'production' ? invariant(false, '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.') : _prodInvariant('43') : void 0; - - if (transaction.useCreateElement) { - while (container.lastChild) { - container.removeChild(container.lastChild); - } - DOMLazyTree.insertTreeBefore(container, markup, null); - } else { - setInnerHTML(container, markup); - ReactDOMComponentTree.precacheNode(instance, container.firstChild); - } - - if (process.env.NODE_ENV !== 'production') { - var hostNode = ReactDOMComponentTree.getInstanceFromNode(container.firstChild); - if (hostNode._debugID !== 0) { - ReactInstrumentation.debugTool.onHostOperation({ - instanceID: hostNode._debugID, - type: 'mount', - payload: markup.toString() - }); - } - } - } -}; - -module.exports = ReactMount; - -/***/ }), -/* 83 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var ReactNodeTypes = __webpack_require__(75); - -function getHostComponentFromComposite(inst) { - var type; - - while ((type = inst._renderedNodeType) === ReactNodeTypes.COMPOSITE) { - inst = inst._renderedComponent; - } - - if (type === ReactNodeTypes.HOST) { - return inst._renderedComponent; - } else if (type === ReactNodeTypes.EMPTY) { - return null; - } -} - -module.exports = getHostComponentFromComposite; - -/***/ }), -/* 84 */ -/***/ (function(module, exports, __webpack_require__) { - -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -if (process.env.NODE_ENV !== 'production') { - var REACT_ELEMENT_TYPE = (typeof Symbol === 'function' && - Symbol.for && - Symbol.for('react.element')) || - 0xeac7; - - var isValidElement = function(object) { - return typeof object === 'object' && - object !== null && - object.$$typeof === REACT_ELEMENT_TYPE; - }; - - // By explicitly using `prop-types` you are opting into new development behavior. - // http://fb.me/prop-types-in-prod - var throwOnDirectAccess = true; - module.exports = __webpack_require__(58)(isValidElement, throwOnDirectAccess); -} else { - // By explicitly using `prop-types` you are opting into new production behavior. - // http://fb.me/prop-types-in-prod - module.exports = __webpack_require__(195)(); -} - - -/***/ }), -/* 85 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -__webpack_require__(86); - -var _react = __webpack_require__(19); - -var _react2 = _interopRequireDefault(_react); - -var _reactDom = __webpack_require__(34); - -var _reactDom2 = _interopRequireDefault(_reactDom); - -var _Splash = __webpack_require__(193); - -var _Splash2 = _interopRequireDefault(_Splash); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -_reactDom2.default.render(_react2.default.createElement(_Splash2.default, null), document.getElementById('splash-mount')); - -/***/ }), -/* 86 */ -/***/ (function(module, exports, __webpack_require__) { - -// style-loader: Adds some css to the DOM by adding a <style> tag - -// load the styles -var content = __webpack_require__(87); -if(typeof content === 'string') content = [[module.i, content, '']]; -// Prepare cssTransformation -var transform; - -var options = {"hmr":true} -options.transform = transform -// add the styles to the DOM -var update = __webpack_require__(92)(content, options); -if(content.locals) module.exports = content.locals; -// Hot Module Replacement -if(false) { - // When the styles change, update the <style> tags - if(!content.locals) { - module.hot.accept("!!../../../../node_modules/css-loader/index.js!../../../../node_modules/stylus-loader/index.js!./index.styl", function() { - var newContent = require("!!../../../../node_modules/css-loader/index.js!../../../../node_modules/stylus-loader/index.js!./index.styl"); - if(typeof newContent === 'string') newContent = [[module.id, newContent, '']]; - update(newContent); - }); - } - // When the module is disposed, remove the <style> tags - module.hot.dispose(function() { update(); }); -} - -/***/ }), -/* 87 */ -/***/ (function(module, exports, __webpack_require__) { - -exports = module.exports = __webpack_require__(51)(undefined); -// imports -exports.i(__webpack_require__(88), ""); - -// module -exports.push([module.i, "@font-face {\n font-family: Whitney;\n font-style: normal;\n font-weight: 400;\n src: url(" + __webpack_require__(89) + ") format('woff');\n}\n@font-face {\n font-family: Whitney;\n font-style: medium;\n font-weight: 600;\n src: url(" + __webpack_require__(90) + ") format('woff');\n}\n* {\n box-sizing: border-box;\n -webkit-user-select: none;\n cursor: default;\n}\nbody,\nhtml {\n -webkit-app-region: drag;\n padding: 0;\n margin: 0;\n overflow: hidden;\n width: 300px;\n height: 300px;\n}\n#splash {\n -webkit-app-region: drag;\n background: #282b30;\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n display: flex;\n justify-content: center;\n align-items: center;\n z-index: 3000;\n transform: translateZ(0);\n padding-bottom: 40px;\n}\n#splash .splash-inner {\n text-align: center;\n}\n#splash .splash-inner img,\n#splash .splash-inner video {\n size: 200px;\n}\n#splash .splash-inner video {\n visibility: hidden;\n}\n#splash .splash-inner video.loaded {\n visibility: visible;\n}\n#splash .splash-inner > span {\n color: #8a8e94;\n font-size: 12px;\n font-family: Whitney, \"Helvetica Neue\", Helvetica, Arial, \"Lucida Grande\", sans-serif;\n font-weight: 600;\n text-transform: uppercase;\n display: block;\n}\n#splash .splash-inner > span.quote {\n margin-bottom: 10px;\n color: #fff;\n font-weight: 400;\n font-style: italic;\n font-size: 16px;\n}\n#splash .splash-inner-dl .dice-image {\n position: absolute;\n left: 77px;\n top: 45px;\n width: 146px;\n height: 100px;\n background: url(" + __webpack_require__(91) + ") center center no-repeat;\n background-size: 146px 100px;\n}\n#splash .splash-inner-dl .dl-update-message {\n font-family: Whitney, \"Helvetica Neue\", Helvetica, Arial, \"Lucida Grande\", sans-serif;\n font-style: medium;\n font-size: 18px;\n color: #fff;\n padding-left: 20px;\n padding-right: 20px;\n top: 169px;\n left: 0;\n margin: 0;\n position: absolute;\n text-align: center;\n}\n#splash .splash-inner-dl .dl-version-message {\n font-family: Whitney, \"Helvetica Neue\", Helvetica, Arial, \"Lucida Grande\", sans-serif;\n font-style: medium;\n font-size: 12px;\n color: #8a8e94;\n text-transform: uppercase;\n position: absolute;\n width: 100%;\n bottom: 12px;\n left: 0;\n margin: 0;\n text-align: center;\n}\n#splash .splash-inner-dl .dl-select-frame {\n -webkit-app-region: no-drag;\n font-family: Whitney, \"Helvetica Neue\", Helvetica, Arial, \"Lucida Grande\", sans-serif;\n overflow: hidden;\n position: absolute;\n width: 100%;\n height: 130px;\n top: 220px;\n left: 0;\n margin: 0;\n}\n#splash .splash-inner-dl .dl-select-frame .Select {\n position: absolute;\n left: 0;\n top: 0;\n width: 165px;\n height: 44px;\n margin-left: 20px;\n margin-right: 10px;\n color: #fff;\n}\n#splash .splash-inner-dl .dl-select-frame .Select-control {\n border: 1px solid;\n border-color: rgba(255,255,255,0.3);\n border-radius: 3px;\n background: #282b30;\n height: 44px;\n}\n#splash .splash-inner-dl .dl-select-frame .Select-menu-outer {\n background: #282b30;\n}\n#splash .splash-inner-dl .dl-select-frame .Select-menu {\n max-height: 80px;\n}\n#splash .splash-inner-dl .dl-select-frame .Select-option {\n color: #8a8e94;\n line-height: 15px;\n padding: 5px 10px;\n}\n#splash .splash-inner-dl .dl-select-frame .Select-option.is-focused {\n color: #fff;\n background-color: #697ec4;\n}\n#splash .splash-inner-dl .dl-select-frame .Select-value {\n color: #fff;\n bottom: 0;\n align-items: center;\n display: flex;\n}\n#splash .splash-inner-dl .dl-select-frame .Select-input {\n outline: none;\n}\n#splash .splash-inner-dl .dl-select-frame .dl-button {\n position: absolute;\n left: 195px;\n top: 0;\n width: 85px;\n height: 44px;\n background-color: #7289da;\n color: #fff;\n font-size: 14px;\n font-weight: 600;\n border-radius: 3px;\n display: flex;\n justify-content: center;\n align-items: center;\n}\n#splash .splash-inner-dl .dl-select-frame .dl-button:hover {\n background-color: #697ec4;\n}\n.progress {\n display: flex;\n justify-content: center;\n margin-top: 10px;\n}\n.progress .progress-bar {\n height: 8px;\n border-radius: 4px;\n width: 180px;\n background-color: rgba(255,255,255,0.1);\n}\n.progress .progress-bar .complete {\n border-radius: 4px;\n box-shadow: 0px 2px 4px 0px rgba(0,0,0,0.1), inset 0px 1px 0px 0px rgba(255,255,255,0.1);\n height: 100%;\n background-color: #737f8d;\n}\n.progress-placeholder {\n margin-top: 10px;\n height: 8px;\n}\n", ""]); - -// exports - - -/***/ }), -/* 88 */ -/***/ (function(module, exports, __webpack_require__) { - -exports = module.exports = __webpack_require__(51)(undefined); -// imports - - -// module -exports.push([module.i, "/**\n * React Select\n * ============\n * Created by Jed Watson and Joss Mackison for KeystoneJS, http://www.keystonejs.com/\n * https://twitter.com/jedwatson https://twitter.com/jossmackison https://twitter.com/keystonejs\n * MIT License: https://github.com/keystonejs/react-select\n*/\n.Select {\n position: relative;\n}\n.Select,\n.Select div,\n.Select input,\n.Select span {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n.Select.is-disabled > .Select-control {\n background-color: #f6f6f6;\n}\n.Select.is-disabled .Select-arrow-zone {\n cursor: default;\n pointer-events: none;\n}\n.Select-control {\n background-color: #fff;\n border-color: #d9d9d9 #ccc #b3b3b3;\n border-radius: 4px;\n border: 1px solid #ccc;\n color: #333;\n cursor: default;\n display: table;\n height: 36px;\n outline: none;\n overflow: hidden;\n position: relative;\n width: 100%;\n}\n.Select-control:hover {\n box-shadow: 0 1px 0 rgba(0, 0, 0, 0.06);\n}\n.is-searchable.is-open > .Select-control {\n cursor: text;\n}\n.is-open > .Select-control {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n background: #fff;\n border-color: #b3b3b3 #ccc #d9d9d9;\n}\n.is-open > .Select-control > .Select-arrow {\n border-color: transparent transparent #999;\n border-width: 0 5px 5px;\n}\n.is-searchable.is-focused:not(.is-open) > .Select-control {\n cursor: text;\n}\n.is-focused:not(.is-open) > .Select-control {\n border-color: #08c #0099e6 #0099e6;\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 0 5px -1px rgba(0, 136, 204, 0.5);\n}\n.Select-placeholder {\n bottom: 0;\n color: #aaa;\n left: 0;\n line-height: 34px;\n padding-left: 10px;\n padding-right: 10px;\n position: absolute;\n right: 0;\n top: 0;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.has-value > .Select-control > .Select-placeholder {\n color: #333;\n}\n.Select-value {\n color: #aaa;\n left: 0;\n padding: 8px 52px 8px 10px;\n position: absolute;\n right: -15px;\n top: 0;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.has-value > .Select-control > .Select-value {\n color: #333;\n}\n.Select-input {\n height: 34px;\n padding-left: 10px;\n padding-right: 10px;\n vertical-align: middle;\n}\n.Select-input > input {\n background: none transparent;\n border: 0 none;\n box-shadow: none;\n cursor: default;\n display: inline-block;\n font-family: inherit;\n font-size: inherit;\n height: 34px;\n margin: 0;\n outline: none;\n padding: 0;\n -webkit-appearance: none;\n}\n.is-focused .Select-input > input {\n cursor: text;\n}\n.Select-control:not(.is-searchable) > .Select-input {\n outline: none;\n}\n.Select-loading-zone {\n cursor: pointer;\n display: table-cell;\n position: relative;\n text-align: center;\n vertical-align: middle;\n width: 16px;\n}\n.Select-loading {\n -webkit-animation: Select-animation-spin 400ms infinite linear;\n -o-animation: Select-animation-spin 400ms infinite linear;\n animation: Select-animation-spin 400ms infinite linear;\n width: 16px;\n height: 16px;\n box-sizing: border-box;\n border-radius: 50%;\n border: 2px solid #ccc;\n border-right-color: #333;\n display: inline-block;\n position: relative;\n vertical-align: middle;\n}\n.Select-clear-zone {\n -webkit-animation: Select-animation-fadeIn 200ms;\n -o-animation: Select-animation-fadeIn 200ms;\n animation: Select-animation-fadeIn 200ms;\n color: #999;\n cursor: pointer;\n display: table-cell;\n position: relative;\n text-align: center;\n vertical-align: middle;\n width: 17px;\n}\n.Select-clear-zone:hover {\n color: #d0021b;\n}\n.Select-clear {\n display: inline-block;\n font-size: 18px;\n line-height: 1;\n}\n.Select--multi .Select-clear-zone {\n width: 17px;\n}\n.Select-arrow-zone {\n cursor: pointer;\n display: table-cell;\n position: relative;\n text-align: center;\n vertical-align: middle;\n width: 25px;\n padding-right: 5px;\n}\n.Select-arrow {\n border-color: #999 transparent transparent;\n border-style: solid;\n border-width: 5px 5px 2.5px;\n display: inline-block;\n height: 0;\n width: 0;\n}\n.is-open .Select-arrow,\n.Select-arrow-zone:hover > .Select-arrow {\n border-top-color: #666;\n}\n@-webkit-keyframes Select-animation-fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n@keyframes Select-animation-fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n.Select-menu-outer {\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n background-color: #fff;\n border: 1px solid #ccc;\n border-top-color: #e6e6e6;\n box-shadow: 0 1px 0 rgba(0, 0, 0, 0.06);\n box-sizing: border-box;\n margin-top: -1px;\n max-height: 200px;\n position: absolute;\n top: 100%;\n width: 100%;\n z-index: 1000;\n -webkit-overflow-scrolling: touch;\n}\n.Select-menu {\n max-height: 198px;\n overflow-y: auto;\n}\n.Select-option {\n box-sizing: border-box;\n color: #666666;\n cursor: pointer;\n display: block;\n padding: 8px 10px;\n}\n.Select-option:last-child {\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.Select-option.is-focused {\n background-color: #f2f9fc;\n color: #333;\n}\n.Select-option.is-disabled {\n color: #cccccc;\n cursor: not-allowed;\n}\n.Select-noresults,\n.Select-search-prompt,\n.Select-searching {\n box-sizing: border-box;\n color: #999999;\n cursor: default;\n display: block;\n padding: 8px 10px;\n}\n.Select--multi .Select-input {\n vertical-align: middle;\n margin-left: 10px;\n padding: 0;\n}\n.Select--multi.has-value .Select-input {\n margin-left: 5px;\n}\n.Select-item {\n background-color: #f2f9fc;\n border-radius: 2px;\n border: 1px solid #c9e6f2;\n color: #08c;\n display: inline-block;\n font-size: 0.9em;\n margin-left: 5px;\n margin-top: 5px;\n vertical-align: top;\n}\n.Select-item-icon,\n.Select-item-label {\n display: inline-block;\n vertical-align: middle;\n}\n.Select-item-label {\n border-bottom-right-radius: 2px;\n border-top-right-radius: 2px;\n cursor: default;\n padding: 2px 5px;\n}\n.Select-item-label .Select-item-label__a {\n color: #08c;\n cursor: pointer;\n}\n.Select-item-icon {\n cursor: pointer;\n border-bottom-left-radius: 2px;\n border-top-left-radius: 2px;\n border-right: 1px solid #c9e6f2;\n padding: 1px 5px 3px;\n}\n.Select-item-icon:hover,\n.Select-item-icon:focus {\n background-color: #ddeff7;\n color: #0077b3;\n}\n.Select-item-icon:active {\n background-color: #c9e6f2;\n}\n.Select--multi.is-disabled .Select-item {\n background-color: #f2f2f2;\n border: 1px solid #d9d9d9;\n color: #888;\n}\n.Select--multi.is-disabled .Select-item-icon {\n cursor: not-allowed;\n border-right: 1px solid #d9d9d9;\n}\n.Select--multi.is-disabled .Select-item-icon:hover,\n.Select--multi.is-disabled .Select-item-icon:focus,\n.Select--multi.is-disabled .Select-item-icon:active {\n background-color: #f2f2f2;\n}\n@keyframes Select-animation-spin {\n to {\n transform: rotate(1turn);\n }\n}\n@-webkit-keyframes Select-animation-spin {\n to {\n -webkit-transform: rotate(1turn);\n }\n}\n", ""]); - -// exports - - -/***/ }), -/* 89 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = __webpack_require__.p + "d153359b5d87601d2b9c708b7ae2db02.woff"; - -/***/ }), -/* 90 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = __webpack_require__.p + "a934ab008c7f6a2274ec441f6be0696a.woff"; - -/***/ }), -/* 91 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = __webpack_require__.p + "abddffb32a4a35627c3857a06c751424.png"; - -/***/ }), -/* 92 */ -/***/ (function(module, exports, __webpack_require__) { - -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ - -var stylesInDom = {}; - -var memoize = function (fn) { - var memo; - - return function () { - if (typeof memo === "undefined") memo = fn.apply(this, arguments); - return memo; - }; -}; - -var isOldIE = memoize(function () { - // Test for IE <= 9 as proposed by Browserhacks - // @see http://browserhacks.com/#hack-e71d8692f65334173fee715c222cb805 - // Tests for existence of standard globals is to allow style-loader - // to operate correctly into non-standard environments - // @see https://github.com/webpack-contrib/style-loader/issues/177 - return window && document && document.all && !window.atob; -}); - -var getElement = (function (fn) { - var memo = {}; - - return function(selector) { - if (typeof memo[selector] === "undefined") { - var styleTarget = fn.call(this, selector); - // Special case to return head of iframe instead of iframe itself - if (styleTarget instanceof window.HTMLIFrameElement) { - try { - // This will throw an exception if access to iframe is blocked - // due to cross-origin restrictions - styleTarget = styleTarget.contentDocument.head; - } catch(e) { - styleTarget = null; - } - } - memo[selector] = styleTarget; - } - return memo[selector] - }; -})(function (target) { - return document.querySelector(target) -}); - -var singleton = null; -var singletonCounter = 0; -var stylesInsertedAtTop = []; - -var fixUrls = __webpack_require__(93); - -module.exports = function(list, options) { - if (typeof DEBUG !== "undefined" && DEBUG) { - if (typeof document !== "object") throw new Error("The style-loader cannot be used in a non-browser environment"); - } - - options = options || {}; - - options.attrs = typeof options.attrs === "object" ? options.attrs : {}; - - // Force single-tag solution on IE6-9, which has a hard limit on the # of <style> - // tags it will allow on a page - if (!options.singleton) options.singleton = isOldIE(); - - // By default, add <style> tags to the <head> element - if (!options.insertInto) options.insertInto = "head"; - - // By default, add <style> tags to the bottom of the target - if (!options.insertAt) options.insertAt = "bottom"; - - var styles = listToStyles(list, options); - - addStylesToDom(styles, options); - - return function update (newList) { - var mayRemove = []; - - for (var i = 0; i < styles.length; i++) { - var item = styles[i]; - var domStyle = stylesInDom[item.id]; - - domStyle.refs--; - mayRemove.push(domStyle); - } - - if(newList) { - var newStyles = listToStyles(newList, options); - addStylesToDom(newStyles, options); - } - - for (var i = 0; i < mayRemove.length; i++) { - var domStyle = mayRemove[i]; - - if(domStyle.refs === 0) { - for (var j = 0; j < domStyle.parts.length; j++) domStyle.parts[j](); - - delete stylesInDom[domStyle.id]; - } - } - }; -}; - -function addStylesToDom (styles, options) { - for (var i = 0; i < styles.length; i++) { - var item = styles[i]; - var domStyle = stylesInDom[item.id]; - - if(domStyle) { - domStyle.refs++; - - for(var j = 0; j < domStyle.parts.length; j++) { - domStyle.parts[j](item.parts[j]); - } - - for(; j < item.parts.length; j++) { - domStyle.parts.push(addStyle(item.parts[j], options)); - } - } else { - var parts = []; - - for(var j = 0; j < item.parts.length; j++) { - parts.push(addStyle(item.parts[j], options)); - } - - stylesInDom[item.id] = {id: item.id, refs: 1, parts: parts}; - } - } -} - -function listToStyles (list, options) { - var styles = []; - var newStyles = {}; - - for (var i = 0; i < list.length; i++) { - var item = list[i]; - var id = options.base ? item[0] + options.base : item[0]; - var css = item[1]; - var media = item[2]; - var sourceMap = item[3]; - var part = {css: css, media: media, sourceMap: sourceMap}; - - if(!newStyles[id]) styles.push(newStyles[id] = {id: id, parts: [part]}); - else newStyles[id].parts.push(part); - } - - return styles; -} - -function insertStyleElement (options, style) { - var target = getElement(options.insertInto) - - if (!target) { - throw new Error("Couldn't find a style target. This probably means that the value for the 'insertInto' parameter is invalid."); - } - - var lastStyleElementInsertedAtTop = stylesInsertedAtTop[stylesInsertedAtTop.length - 1]; - - if (options.insertAt === "top") { - if (!lastStyleElementInsertedAtTop) { - target.insertBefore(style, target.firstChild); - } else if (lastStyleElementInsertedAtTop.nextSibling) { - target.insertBefore(style, lastStyleElementInsertedAtTop.nextSibling); - } else { - target.appendChild(style); - } - stylesInsertedAtTop.push(style); - } else if (options.insertAt === "bottom") { - target.appendChild(style); - } else if (typeof options.insertAt === "object" && options.insertAt.before) { - var nextSibling = getElement(options.insertInto + " " + options.insertAt.before); - target.insertBefore(style, nextSibling); - } else { - throw new Error("[Style Loader]\n\n Invalid value for parameter 'insertAt' ('options.insertAt') found.\n Must be 'top', 'bottom', or Object.\n (https://github.com/webpack-contrib/style-loader#insertat)\n"); - } -} - -function removeStyleElement (style) { - if (style.parentNode === null) return false; - style.parentNode.removeChild(style); - - var idx = stylesInsertedAtTop.indexOf(style); - if(idx >= 0) { - stylesInsertedAtTop.splice(idx, 1); - } -} - -function createStyleElement (options) { - var style = document.createElement("style"); - - options.attrs.type = "text/css"; - - addAttrs(style, options.attrs); - insertStyleElement(options, style); - - return style; -} - -function createLinkElement (options) { - var link = document.createElement("link"); - - options.attrs.type = "text/css"; - options.attrs.rel = "stylesheet"; - - addAttrs(link, options.attrs); - insertStyleElement(options, link); - - return link; -} - -function addAttrs (el, attrs) { - Object.keys(attrs).forEach(function (key) { - el.setAttribute(key, attrs[key]); - }); -} - -function addStyle (obj, options) { - var style, update, remove, result; - - // If a transform function was defined, run it on the css - if (options.transform && obj.css) { - result = options.transform(obj.css); - - if (result) { - // If transform returns a value, use that instead of the original css. - // This allows running runtime transformations on the css. - obj.css = result; - } else { - // If the transform function returns a falsy value, don't add this css. - // This allows conditional loading of css - return function() { - // noop - }; - } - } - - if (options.singleton) { - var styleIndex = singletonCounter++; - - style = singleton || (singleton = createStyleElement(options)); - - update = applyToSingletonTag.bind(null, style, styleIndex, false); - remove = applyToSingletonTag.bind(null, style, styleIndex, true); - - } else if ( - obj.sourceMap && - typeof URL === "function" && - typeof URL.createObjectURL === "function" && - typeof URL.revokeObjectURL === "function" && - typeof Blob === "function" && - typeof btoa === "function" - ) { - style = createLinkElement(options); - update = updateLink.bind(null, style, options); - remove = function () { - removeStyleElement(style); - - if(style.href) URL.revokeObjectURL(style.href); - }; - } else { - style = createStyleElement(options); - update = applyToTag.bind(null, style); - remove = function () { - removeStyleElement(style); - }; - } - - update(obj); - - return function updateStyle (newObj) { - if (newObj) { - if ( - newObj.css === obj.css && - newObj.media === obj.media && - newObj.sourceMap === obj.sourceMap - ) { - return; - } - - update(obj = newObj); - } else { - remove(); - } - }; -} - -var replaceText = (function () { - var textStore = []; - - return function (index, replacement) { - textStore[index] = replacement; - - return textStore.filter(Boolean).join('\n'); - }; -})(); - -function applyToSingletonTag (style, index, remove, obj) { - var css = remove ? "" : obj.css; - - if (style.styleSheet) { - style.styleSheet.cssText = replaceText(index, css); - } else { - var cssNode = document.createTextNode(css); - var childNodes = style.childNodes; - - if (childNodes[index]) style.removeChild(childNodes[index]); - - if (childNodes.length) { - style.insertBefore(cssNode, childNodes[index]); - } else { - style.appendChild(cssNode); - } - } -} - -function applyToTag (style, obj) { - var css = obj.css; - var media = obj.media; - - if(media) { - style.setAttribute("media", media) - } - - if(style.styleSheet) { - style.styleSheet.cssText = css; - } else { - while(style.firstChild) { - style.removeChild(style.firstChild); - } - - style.appendChild(document.createTextNode(css)); - } -} - -function updateLink (link, options, obj) { - var css = obj.css; - var sourceMap = obj.sourceMap; - - /* - If convertToAbsoluteUrls isn't defined, but sourcemaps are enabled - and there is no publicPath defined then lets turn convertToAbsoluteUrls - on by default. Otherwise default to the convertToAbsoluteUrls option - directly - */ - var autoFixUrls = options.convertToAbsoluteUrls === undefined && sourceMap; - - if (options.convertToAbsoluteUrls || autoFixUrls) { - css = fixUrls(css); - } - - if (sourceMap) { - // http://stackoverflow.com/a/26603875 - css += "\n/*# sourceMappingURL=data:application/json;base64," + btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))) + " */"; - } - - var blob = new Blob([css], { type: "text/css" }); - - var oldSrc = link.href; - - link.href = URL.createObjectURL(blob); - - if(oldSrc) URL.revokeObjectURL(oldSrc); -} - - -/***/ }), -/* 93 */ -/***/ (function(module, exports) { - - -/** - * When source maps are enabled, `style-loader` uses a link element with a data-uri to - * embed the css on the page. This breaks all relative urls because now they are relative to a - * bundle instead of the current page. - * - * One solution is to only use full urls, but that may be impossible. - * - * Instead, this function "fixes" the relative urls to be absolute according to the current page location. - * - * A rudimentary test suite is located at `test/fixUrls.js` and can be run via the `npm test` command. - * - */ - -module.exports = function (css) { - // get current location - var location = typeof window !== "undefined" && window.location; - - if (!location) { - throw new Error("fixUrls requires window.location"); - } - - // blank or null? - if (!css || typeof css !== "string") { - return css; - } - - var baseUrl = location.protocol + "//" + location.host; - var currentDir = baseUrl + location.pathname.replace(/\/[^\/]*$/, "/"); - - // convert each url(...) - /* - This regular expression is just a way to recursively match brackets within - a string. - - /url\s*\( = Match on the word "url" with any whitespace after it and then a parens - ( = Start a capturing group - (?: = Start a non-capturing group - [^)(] = Match anything that isn't a parentheses - | = OR - \( = Match a start parentheses - (?: = Start another non-capturing groups - [^)(]+ = Match anything that isn't a parentheses - | = OR - \( = Match a start parentheses - [^)(]* = Match anything that isn't a parentheses - \) = Match a end parentheses - ) = End Group - *\) = Match anything and then a close parens - ) = Close non-capturing group - * = Match anything - ) = Close capturing group - \) = Match a close parens - - /gi = Get all matches, not the first. Be case insensitive. - */ - var fixedCss = css.replace(/url\s*\(((?:[^)(]|\((?:[^)(]+|\([^)(]*\))*\))*)\)/gi, function(fullMatch, origUrl) { - // strip quotes (if they exist) - var unquotedOrigUrl = origUrl - .trim() - .replace(/^"(.*)"$/, function(o, $1){ return $1; }) - .replace(/^'(.*)'$/, function(o, $1){ return $1; }); - - // already a full url? no change - if (/^(#|data:|http:\/\/|https:\/\/|file:\/\/\/)/i.test(unquotedOrigUrl)) { - return fullMatch; - } - - // convert the url to a full url - var newUrl; - - if (unquotedOrigUrl.indexOf("//") === 0) { - //TODO: should we add protocol? - newUrl = unquotedOrigUrl; - } else if (unquotedOrigUrl.indexOf("/") === 0) { - // path should be relative to the base url - newUrl = baseUrl + unquotedOrigUrl; // already starts with '/' - } else { - // path should be relative to current directory - newUrl = currentDir + unquotedOrigUrl.replace(/^\.\//, ""); // Strip leading './' - } - - // send back the fixed url(...) - return "url(" + JSON.stringify(newUrl) + ")"; - }); - - // send back the fixed css - return fixedCss; -}; - - -/***/ }), -/* 94 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var PooledClass = __webpack_require__(95); -var ReactElement = __webpack_require__(13); - -var emptyFunction = __webpack_require__(7); -var traverseAllChildren = __webpack_require__(96); - -var twoArgumentPooler = PooledClass.twoArgumentPooler; -var fourArgumentPooler = PooledClass.fourArgumentPooler; - -var userProvidedKeyEscapeRegex = /\/+/g; -function escapeUserProvidedKey(text) { - return ('' + text).replace(userProvidedKeyEscapeRegex, '$&/'); -} - -/** - * PooledClass representing the bookkeeping associated with performing a child - * traversal. Allows avoiding binding callbacks. - * - * @constructor ForEachBookKeeping - * @param {!function} forEachFunction Function to perform traversal with. - * @param {?*} forEachContext Context to perform context with. - */ -function ForEachBookKeeping(forEachFunction, forEachContext) { - this.func = forEachFunction; - this.context = forEachContext; - this.count = 0; -} -ForEachBookKeeping.prototype.destructor = function () { - this.func = null; - this.context = null; - this.count = 0; -}; -PooledClass.addPoolingTo(ForEachBookKeeping, twoArgumentPooler); - -function forEachSingleChild(bookKeeping, child, name) { - var func = bookKeeping.func, - context = bookKeeping.context; - - func.call(context, child, bookKeeping.count++); -} - -/** - * Iterates through children that are typically specified as `props.children`. - * - * See https://facebook.github.io/react/docs/top-level-api.html#react.children.foreach - * - * The provided forEachFunc(child, index) will be called for each - * leaf child. - * - * @param {?*} children Children tree container. - * @param {function(*, int)} forEachFunc - * @param {*} forEachContext Context for forEachContext. - */ -function forEachChildren(children, forEachFunc, forEachContext) { - if (children == null) { - return children; - } - var traverseContext = ForEachBookKeeping.getPooled(forEachFunc, forEachContext); - traverseAllChildren(children, forEachSingleChild, traverseContext); - ForEachBookKeeping.release(traverseContext); -} - -/** - * PooledClass representing the bookkeeping associated with performing a child - * mapping. Allows avoiding binding callbacks. - * - * @constructor MapBookKeeping - * @param {!*} mapResult Object containing the ordered map of results. - * @param {!function} mapFunction Function to perform mapping with. - * @param {?*} mapContext Context to perform mapping with. - */ -function MapBookKeeping(mapResult, keyPrefix, mapFunction, mapContext) { - this.result = mapResult; - this.keyPrefix = keyPrefix; - this.func = mapFunction; - this.context = mapContext; - this.count = 0; -} -MapBookKeeping.prototype.destructor = function () { - this.result = null; - this.keyPrefix = null; - this.func = null; - this.context = null; - this.count = 0; -}; -PooledClass.addPoolingTo(MapBookKeeping, fourArgumentPooler); - -function mapSingleChildIntoContext(bookKeeping, child, childKey) { - var result = bookKeeping.result, - keyPrefix = bookKeeping.keyPrefix, - func = bookKeeping.func, - context = bookKeeping.context; - - - var mappedChild = func.call(context, child, bookKeeping.count++); - if (Array.isArray(mappedChild)) { - mapIntoWithKeyPrefixInternal(mappedChild, result, childKey, emptyFunction.thatReturnsArgument); - } else if (mappedChild != null) { - if (ReactElement.isValidElement(mappedChild)) { - mappedChild = ReactElement.cloneAndReplaceKey(mappedChild, - // Keep both the (mapped) and old keys if they differ, just as - // traverseAllChildren used to do for objects as children - keyPrefix + (mappedChild.key && (!child || child.key !== mappedChild.key) ? escapeUserProvidedKey(mappedChild.key) + '/' : '') + childKey); - } - result.push(mappedChild); - } -} - -function mapIntoWithKeyPrefixInternal(children, array, prefix, func, context) { - var escapedPrefix = ''; - if (prefix != null) { - escapedPrefix = escapeUserProvidedKey(prefix) + '/'; - } - var traverseContext = MapBookKeeping.getPooled(array, escapedPrefix, func, context); - traverseAllChildren(children, mapSingleChildIntoContext, traverseContext); - MapBookKeeping.release(traverseContext); -} - -/** - * Maps children that are typically specified as `props.children`. - * - * See https://facebook.github.io/react/docs/top-level-api.html#react.children.map - * - * The provided mapFunction(child, key, index) will be called for each - * leaf child. - * - * @param {?*} children Children tree container. - * @param {function(*, int)} func The map function. - * @param {*} context Context for mapFunction. - * @return {object} Object containing the ordered map of results. - */ -function mapChildren(children, func, context) { - if (children == null) { - return children; - } - var result = []; - mapIntoWithKeyPrefixInternal(children, result, null, func, context); - return result; -} - -function forEachSingleChildDummy(traverseContext, child, name) { - return null; -} - -/** - * Count the number of children that are typically specified as - * `props.children`. - * - * See https://facebook.github.io/react/docs/top-level-api.html#react.children.count - * - * @param {?*} children Children tree container. - * @return {number} The number of children. - */ -function countChildren(children, context) { - return traverseAllChildren(children, forEachSingleChildDummy, null); -} - -/** - * Flatten a children object (typically specified as `props.children`) and - * return an array with appropriately re-keyed children. - * - * See https://facebook.github.io/react/docs/top-level-api.html#react.children.toarray - */ -function toArray(children) { - var result = []; - mapIntoWithKeyPrefixInternal(children, result, null, emptyFunction.thatReturnsArgument); - return result; -} - -var ReactChildren = { - forEach: forEachChildren, - map: mapChildren, - mapIntoWithKeyPrefixInternal: mapIntoWithKeyPrefixInternal, - count: countChildren, - toArray: toArray -}; - -module.exports = ReactChildren; - -/***/ }), -/* 95 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * - */ - - - -var _prodInvariant = __webpack_require__(16); - -var invariant = __webpack_require__(0); - -/** - * Static poolers. Several custom versions for each potential number of - * arguments. A completely generic pooler is easy to implement, but would - * require accessing the `arguments` object. In each of these, `this` refers to - * the Class itself, not an instance. If any others are needed, simply add them - * here, or in their own files. - */ -var oneArgumentPooler = function (copyFieldsFrom) { - var Klass = this; - if (Klass.instancePool.length) { - var instance = Klass.instancePool.pop(); - Klass.call(instance, copyFieldsFrom); - return instance; - } else { - return new Klass(copyFieldsFrom); - } -}; - -var twoArgumentPooler = function (a1, a2) { - var Klass = this; - if (Klass.instancePool.length) { - var instance = Klass.instancePool.pop(); - Klass.call(instance, a1, a2); - return instance; - } else { - return new Klass(a1, a2); - } -}; - -var threeArgumentPooler = function (a1, a2, a3) { - var Klass = this; - if (Klass.instancePool.length) { - var instance = Klass.instancePool.pop(); - Klass.call(instance, a1, a2, a3); - return instance; - } else { - return new Klass(a1, a2, a3); - } -}; - -var fourArgumentPooler = function (a1, a2, a3, a4) { - var Klass = this; - if (Klass.instancePool.length) { - var instance = Klass.instancePool.pop(); - Klass.call(instance, a1, a2, a3, a4); - return instance; - } else { - return new Klass(a1, a2, a3, a4); - } -}; - -var standardReleaser = function (instance) { - var Klass = this; - !(instance instanceof Klass) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Trying to release an instance into a pool of a different type.') : _prodInvariant('25') : void 0; - instance.destructor(); - if (Klass.instancePool.length < Klass.poolSize) { - Klass.instancePool.push(instance); - } -}; - -var DEFAULT_POOL_SIZE = 10; -var DEFAULT_POOLER = oneArgumentPooler; - -/** - * Augments `CopyConstructor` to be a poolable class, augmenting only the class - * itself (statically) not adding any prototypical fields. Any CopyConstructor - * you give this may have a `poolSize` property, and will look for a - * prototypical `destructor` on instances. - * - * @param {Function} CopyConstructor Constructor that can be used to reset. - * @param {Function} pooler Customizable pooler. - */ -var addPoolingTo = function (CopyConstructor, pooler) { - // Casting as any so that flow ignores the actual implementation and trusts - // it to match the type we declared - var NewKlass = CopyConstructor; - NewKlass.instancePool = []; - NewKlass.getPooled = pooler || DEFAULT_POOLER; - if (!NewKlass.poolSize) { - NewKlass.poolSize = DEFAULT_POOL_SIZE; - } - NewKlass.release = standardReleaser; - return NewKlass; -}; - -var PooledClass = { - addPoolingTo: addPoolingTo, - oneArgumentPooler: oneArgumentPooler, - twoArgumentPooler: twoArgumentPooler, - threeArgumentPooler: threeArgumentPooler, - fourArgumentPooler: fourArgumentPooler -}; - -module.exports = PooledClass; - -/***/ }), -/* 96 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var _prodInvariant = __webpack_require__(16); - -var ReactCurrentOwner = __webpack_require__(9); -var REACT_ELEMENT_TYPE = __webpack_require__(54); - -var getIteratorFn = __webpack_require__(55); -var invariant = __webpack_require__(0); -var KeyEscapeUtils = __webpack_require__(97); -var warning = __webpack_require__(1); - -var SEPARATOR = '.'; -var SUBSEPARATOR = ':'; - -/** - * This is inlined from ReactElement since this file is shared between - * isomorphic and renderers. We could extract this to a - * - */ - -/** - * TODO: Test that a single child and an array with one item have the same key - * pattern. - */ - -var didWarnAboutMaps = false; - -/** - * Generate a key string that identifies a component within a set. - * - * @param {*} component A component that could contain a manual key. - * @param {number} index Index that is used if a manual key is not provided. - * @return {string} - */ -function getComponentKey(component, index) { - // Do some typechecking here since we call this blindly. We want to ensure - // that we don't block potential future ES APIs. - if (component && typeof component === 'object' && component.key != null) { - // Explicit key - return KeyEscapeUtils.escape(component.key); - } - // Implicit key determined by the index in the set - return index.toString(36); -} - -/** - * @param {?*} children Children tree container. - * @param {!string} nameSoFar Name of the key path so far. - * @param {!function} callback Callback to invoke with each child found. - * @param {?*} traverseContext Used to pass information throughout the traversal - * process. - * @return {!number} The number of children in this subtree. - */ -function traverseAllChildrenImpl(children, nameSoFar, callback, traverseContext) { - var type = typeof children; - - if (type === 'undefined' || type === 'boolean') { - // All of the above are perceived as null. - children = null; - } - - if (children === null || type === 'string' || type === 'number' || - // The following is inlined from ReactElement. This means we can optimize - // some checks. React Fiber also inlines this logic for similar purposes. - type === 'object' && children.$$typeof === REACT_ELEMENT_TYPE) { - callback(traverseContext, children, - // If it's the only child, treat the name as if it was wrapped in an array - // so that it's consistent if the number of children grows. - nameSoFar === '' ? SEPARATOR + getComponentKey(children, 0) : nameSoFar); - return 1; - } - - var child; - var nextName; - var subtreeCount = 0; // Count of children found in the current subtree. - var nextNamePrefix = nameSoFar === '' ? SEPARATOR : nameSoFar + SUBSEPARATOR; - - if (Array.isArray(children)) { - for (var i = 0; i < children.length; i++) { - child = children[i]; - nextName = nextNamePrefix + getComponentKey(child, i); - subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext); - } - } else { - var iteratorFn = getIteratorFn(children); - if (iteratorFn) { - var iterator = iteratorFn.call(children); - var step; - if (iteratorFn !== children.entries) { - var ii = 0; - while (!(step = iterator.next()).done) { - child = step.value; - nextName = nextNamePrefix + getComponentKey(child, ii++); - subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext); - } - } else { - if (process.env.NODE_ENV !== 'production') { - var mapsAsChildrenAddendum = ''; - if (ReactCurrentOwner.current) { - var mapsAsChildrenOwnerName = ReactCurrentOwner.current.getName(); - if (mapsAsChildrenOwnerName) { - mapsAsChildrenAddendum = ' Check the render method of `' + mapsAsChildrenOwnerName + '`.'; - } - } - process.env.NODE_ENV !== 'production' ? warning(didWarnAboutMaps, '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', mapsAsChildrenAddendum) : void 0; - didWarnAboutMaps = true; - } - // Iterator will provide entry [k,v] tuples rather than values. - while (!(step = iterator.next()).done) { - var entry = step.value; - if (entry) { - child = entry[1]; - nextName = nextNamePrefix + KeyEscapeUtils.escape(entry[0]) + SUBSEPARATOR + getComponentKey(child, 0); - subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext); - } - } - } - } else if (type === 'object') { - var addendum = ''; - if (process.env.NODE_ENV !== 'production') { - addendum = ' 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.'; - if (children._isReactElement) { - addendum = " It looks like you're using an element created by a different " + 'version of React. Make sure to use only one copy of React.'; - } - if (ReactCurrentOwner.current) { - var name = ReactCurrentOwner.current.getName(); - if (name) { - addendum += ' Check the render method of `' + name + '`.'; - } - } - } - var childrenString = String(children); - true ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Objects are not valid as a React child (found: %s).%s', childrenString === '[object Object]' ? 'object with keys {' + Object.keys(children).join(', ') + '}' : childrenString, addendum) : _prodInvariant('31', childrenString === '[object Object]' ? 'object with keys {' + Object.keys(children).join(', ') + '}' : childrenString, addendum) : void 0; - } - } - - return subtreeCount; -} - -/** - * Traverses children that are typically specified as `props.children`, but - * might also be specified through attributes: - * - * - `traverseAllChildren(this.props.children, ...)` - * - `traverseAllChildren(this.props.leftPanelChildren, ...)` - * - * The `traverseContext` is an optional argument that is passed through the - * entire traversal. It can be used to store accumulations or anything else that - * the callback might find relevant. - * - * @param {?*} children Children tree object. - * @param {!function} callback To invoke upon traversing each child. - * @param {?*} traverseContext Context for traversal. - * @return {!number} The number of children in this subtree. - */ -function traverseAllChildren(children, callback, traverseContext) { - if (children == null) { - return 0; - } - - return traverseAllChildrenImpl(children, '', callback, traverseContext); -} - -module.exports = traverseAllChildren; - -/***/ }), -/* 97 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * - */ - - - -/** - * Escape and wrap key so it is safe to use as a reactid - * - * @param {string} key to be escaped. - * @return {string} the escaped key. - */ - -function escape(key) { - var escapeRegex = /[=:]/g; - var escaperLookup = { - '=': '=0', - ':': '=2' - }; - var escapedString = ('' + key).replace(escapeRegex, function (match) { - return escaperLookup[match]; - }); - - return '$' + escapedString; -} - -/** - * Unescape and unwrap key for human-readable display - * - * @param {string} key to unescape. - * @return {string} the unescaped key. - */ -function unescape(key) { - var unescapeRegex = /(=0|=2)/g; - var unescaperLookup = { - '=0': '=', - '=2': ':' - }; - var keySubstring = key[0] === '.' && key[1] === '$' ? key.substring(2) : key.substring(1); - - return ('' + keySubstring).replace(unescapeRegex, function (match) { - return unescaperLookup[match]; - }); -} - -var KeyEscapeUtils = { - escape: escape, - unescape: unescape -}; - -module.exports = KeyEscapeUtils; - -/***/ }), -/* 98 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var ReactElement = __webpack_require__(13); - -/** - * Create a factory that creates HTML tag elements. - * - * @private - */ -var createDOMFactory = ReactElement.createFactory; -if (process.env.NODE_ENV !== 'production') { - var ReactElementValidator = __webpack_require__(56); - createDOMFactory = ReactElementValidator.createFactory; -} - -/** - * Creates a mapping from supported HTML tags to `ReactDOMComponent` classes. - * - * @public - */ -var ReactDOMFactories = { - a: createDOMFactory('a'), - abbr: createDOMFactory('abbr'), - address: createDOMFactory('address'), - area: createDOMFactory('area'), - article: createDOMFactory('article'), - aside: createDOMFactory('aside'), - audio: createDOMFactory('audio'), - b: createDOMFactory('b'), - base: createDOMFactory('base'), - bdi: createDOMFactory('bdi'), - bdo: createDOMFactory('bdo'), - big: createDOMFactory('big'), - blockquote: createDOMFactory('blockquote'), - body: createDOMFactory('body'), - br: createDOMFactory('br'), - button: createDOMFactory('button'), - canvas: createDOMFactory('canvas'), - caption: createDOMFactory('caption'), - cite: createDOMFactory('cite'), - code: createDOMFactory('code'), - col: createDOMFactory('col'), - colgroup: createDOMFactory('colgroup'), - data: createDOMFactory('data'), - datalist: createDOMFactory('datalist'), - dd: createDOMFactory('dd'), - del: createDOMFactory('del'), - details: createDOMFactory('details'), - dfn: createDOMFactory('dfn'), - dialog: createDOMFactory('dialog'), - div: createDOMFactory('div'), - dl: createDOMFactory('dl'), - dt: createDOMFactory('dt'), - em: createDOMFactory('em'), - embed: createDOMFactory('embed'), - fieldset: createDOMFactory('fieldset'), - figcaption: createDOMFactory('figcaption'), - figure: createDOMFactory('figure'), - footer: createDOMFactory('footer'), - form: createDOMFactory('form'), - h1: createDOMFactory('h1'), - h2: createDOMFactory('h2'), - h3: createDOMFactory('h3'), - h4: createDOMFactory('h4'), - h5: createDOMFactory('h5'), - h6: createDOMFactory('h6'), - head: createDOMFactory('head'), - header: createDOMFactory('header'), - hgroup: createDOMFactory('hgroup'), - hr: createDOMFactory('hr'), - html: createDOMFactory('html'), - i: createDOMFactory('i'), - iframe: createDOMFactory('iframe'), - img: createDOMFactory('img'), - input: createDOMFactory('input'), - ins: createDOMFactory('ins'), - kbd: createDOMFactory('kbd'), - keygen: createDOMFactory('keygen'), - label: createDOMFactory('label'), - legend: createDOMFactory('legend'), - li: createDOMFactory('li'), - link: createDOMFactory('link'), - main: createDOMFactory('main'), - map: createDOMFactory('map'), - mark: createDOMFactory('mark'), - menu: createDOMFactory('menu'), - menuitem: createDOMFactory('menuitem'), - meta: createDOMFactory('meta'), - meter: createDOMFactory('meter'), - nav: createDOMFactory('nav'), - noscript: createDOMFactory('noscript'), - object: createDOMFactory('object'), - ol: createDOMFactory('ol'), - optgroup: createDOMFactory('optgroup'), - option: createDOMFactory('option'), - output: createDOMFactory('output'), - p: createDOMFactory('p'), - param: createDOMFactory('param'), - picture: createDOMFactory('picture'), - pre: createDOMFactory('pre'), - progress: createDOMFactory('progress'), - q: createDOMFactory('q'), - rp: createDOMFactory('rp'), - rt: createDOMFactory('rt'), - ruby: createDOMFactory('ruby'), - s: createDOMFactory('s'), - samp: createDOMFactory('samp'), - script: createDOMFactory('script'), - section: createDOMFactory('section'), - select: createDOMFactory('select'), - small: createDOMFactory('small'), - source: createDOMFactory('source'), - span: createDOMFactory('span'), - strong: createDOMFactory('strong'), - style: createDOMFactory('style'), - sub: createDOMFactory('sub'), - summary: createDOMFactory('summary'), - sup: createDOMFactory('sup'), - table: createDOMFactory('table'), - tbody: createDOMFactory('tbody'), - td: createDOMFactory('td'), - textarea: createDOMFactory('textarea'), - tfoot: createDOMFactory('tfoot'), - th: createDOMFactory('th'), - thead: createDOMFactory('thead'), - time: createDOMFactory('time'), - title: createDOMFactory('title'), - tr: createDOMFactory('tr'), - track: createDOMFactory('track'), - u: createDOMFactory('u'), - ul: createDOMFactory('ul'), - 'var': createDOMFactory('var'), - video: createDOMFactory('video'), - wbr: createDOMFactory('wbr'), - - // SVG - circle: createDOMFactory('circle'), - clipPath: createDOMFactory('clipPath'), - defs: createDOMFactory('defs'), - ellipse: createDOMFactory('ellipse'), - g: createDOMFactory('g'), - image: createDOMFactory('image'), - line: createDOMFactory('line'), - linearGradient: createDOMFactory('linearGradient'), - mask: createDOMFactory('mask'), - path: createDOMFactory('path'), - pattern: createDOMFactory('pattern'), - polygon: createDOMFactory('polygon'), - polyline: createDOMFactory('polyline'), - radialGradient: createDOMFactory('radialGradient'), - rect: createDOMFactory('rect'), - stop: createDOMFactory('stop'), - svg: createDOMFactory('svg'), - text: createDOMFactory('text'), - tspan: createDOMFactory('tspan') -}; - -module.exports = ReactDOMFactories; - -/***/ }), -/* 99 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var _prodInvariant = __webpack_require__(16); - -var ReactPropTypeLocationNames = __webpack_require__(100); -var ReactPropTypesSecret = __webpack_require__(101); - -var invariant = __webpack_require__(0); -var warning = __webpack_require__(1); - -var ReactComponentTreeHook; - -if (typeof process !== 'undefined' && process.env && process.env.NODE_ENV === 'test') { - // Temporary hack. - // Inline requires don't work well with Jest: - // https://github.com/facebook/react/issues/7240 - // Remove the inline requires when we don't need them anymore: - // https://github.com/facebook/react/pull/7178 - ReactComponentTreeHook = __webpack_require__(6); -} - -var loggedTypeFailures = {}; - -/** - * Assert that the values match with the type specs. - * Error messages are memorized and will only be shown once. - * - * @param {object} typeSpecs Map of name to a ReactPropType - * @param {object} values Runtime values that need to be type-checked - * @param {string} location e.g. "prop", "context", "child context" - * @param {string} componentName Name of the component for error messages. - * @param {?object} element The React element that is being type-checked - * @param {?number} debugID The React component instance that is being type-checked - * @private - */ -function checkReactTypeSpec(typeSpecs, values, location, componentName, element, debugID) { - for (var typeSpecName in typeSpecs) { - if (typeSpecs.hasOwnProperty(typeSpecName)) { - var error; - // Prop type validation may throw. In case they do, we don't want to - // fail the render phase where it didn't fail before. So we log it. - // After these have been cleaned up, we'll let them throw. - try { - // This is intentionally an invariant that gets caught. It's the same - // behavior as without this statement except with a better message. - !(typeof typeSpecs[typeSpecName] === 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s: %s type `%s` is invalid; it must be a function, usually from React.PropTypes.', componentName || 'React class', ReactPropTypeLocationNames[location], typeSpecName) : _prodInvariant('84', componentName || 'React class', ReactPropTypeLocationNames[location], typeSpecName) : void 0; - error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret); - } catch (ex) { - error = ex; - } - process.env.NODE_ENV !== 'production' ? warning(!error || error 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).', componentName || 'React class', ReactPropTypeLocationNames[location], typeSpecName, typeof error) : void 0; - if (error instanceof Error && !(error.message in loggedTypeFailures)) { - // Only monitor this failure once because there tends to be a lot of the - // same error. - loggedTypeFailures[error.message] = true; - - var componentStackInfo = ''; - - if (process.env.NODE_ENV !== 'production') { - if (!ReactComponentTreeHook) { - ReactComponentTreeHook = __webpack_require__(6); - } - if (debugID !== null) { - componentStackInfo = ReactComponentTreeHook.getStackAddendumByID(debugID); - } else if (element !== null) { - componentStackInfo = ReactComponentTreeHook.getCurrentStackAddendum(element); - } - } - - process.env.NODE_ENV !== 'production' ? warning(false, 'Failed %s type: %s%s', location, error.message, componentStackInfo) : void 0; - } - } - } -} - -module.exports = checkReactTypeSpec; - -/***/ }), -/* 100 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * - */ - - - -var ReactPropTypeLocationNames = {}; - -if (process.env.NODE_ENV !== 'production') { - ReactPropTypeLocationNames = { - prop: 'prop', - context: 'context', - childContext: 'child context' - }; -} - -module.exports = ReactPropTypeLocationNames; - -/***/ }), -/* 101 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * - */ - - - -var ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED'; - -module.exports = ReactPropTypesSecret; - -/***/ }), -/* 102 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var _require = __webpack_require__(13), - isValidElement = _require.isValidElement; - -var factory = __webpack_require__(57); - -module.exports = factory(isValidElement); - -/***/ }), -/* 103 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - - - -if (process.env.NODE_ENV !== 'production') { - var invariant = __webpack_require__(0); - var warning = __webpack_require__(1); - var ReactPropTypesSecret = __webpack_require__(33); - var loggedTypeFailures = {}; -} - -/** - * Assert that the values match with the type specs. - * Error messages are memorized and will only be shown once. - * - * @param {object} typeSpecs Map of name to a ReactPropType - * @param {object} values Runtime values that need to be type-checked - * @param {string} location e.g. "prop", "context", "child context" - * @param {string} componentName Name of the component for error messages. - * @param {?Function} getStack Returns the component stack. - * @private - */ -function checkPropTypes(typeSpecs, values, location, componentName, getStack) { - if (process.env.NODE_ENV !== 'production') { - for (var typeSpecName in typeSpecs) { - if (typeSpecs.hasOwnProperty(typeSpecName)) { - var error; - // Prop type validation may throw. In case they do, we don't want to - // fail the render phase where it didn't fail before. So we log it. - // After these have been cleaned up, we'll let them throw. - try { - // This is intentionally an invariant that gets caught. It's the same - // behavior as without this statement except with a better message. - invariant(typeof typeSpecs[typeSpecName] === 'function', '%s: %s type `%s` is invalid; it must be a function, usually from ' + 'the `prop-types` package, but received `%s`.', componentName || 'React class', location, typeSpecName, typeof typeSpecs[typeSpecName]); - error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret); - } catch (ex) { - error = ex; - } - warning(!error || error 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).', componentName || 'React class', location, typeSpecName, typeof error); - if (error instanceof Error && !(error.message in loggedTypeFailures)) { - // Only monitor this failure once because there tends to be a lot of the - // same error. - loggedTypeFailures[error.message] = true; - - var stack = getStack ? getStack() : ''; - - warning(false, 'Failed %s type: %s%s', location, error.message, stack != null ? stack : ''); - } - } - } - } -} - -module.exports = checkPropTypes; - - -/***/ }), -/* 104 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -module.exports = '15.6.2'; - -/***/ }), -/* 105 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var _require = __webpack_require__(52), - Component = _require.Component; - -var _require2 = __webpack_require__(13), - isValidElement = _require2.isValidElement; - -var ReactNoopUpdateQueue = __webpack_require__(53); -var factory = __webpack_require__(106); - -module.exports = factory(Component, isValidElement, ReactNoopUpdateQueue); - -/***/ }), -/* 106 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var _assign = __webpack_require__(3); - -var emptyObject = __webpack_require__(25); -var _invariant = __webpack_require__(0); - -if (process.env.NODE_ENV !== 'production') { - var warning = __webpack_require__(1); -} - -var MIXINS_KEY = 'mixins'; - -// Helper function to allow the creation of anonymous functions which do not -// have .name set to the name of the variable being assigned to. -function identity(fn) { - return fn; -} - -var ReactPropTypeLocationNames; -if (process.env.NODE_ENV !== 'production') { - ReactPropTypeLocationNames = { - prop: 'prop', - context: 'context', - childContext: 'child context' - }; -} else { - ReactPropTypeLocationNames = {}; -} - -function factory(ReactComponent, isValidElement, ReactNoopUpdateQueue) { - /** - * Policies that describe methods in `ReactClassInterface`. - */ - - var injectedMixins = []; - - /** - * Composite components are higher-level components that compose other composite - * or host components. - * - * To create a new type of `ReactClass`, pass a specification of - * your new class to `React.createClass`. The only requirement of your class - * specification is that you implement a `render` method. - * - * var MyComponent = React.createClass({ - * render: function() { - * return <div>Hello World</div>; - * } - * }); - * - * The class specification supports a specific protocol of methods that have - * special meaning (e.g. `render`). See `ReactClassInterface` for - * more the comprehensive protocol. Any other properties and methods in the - * class specification will be available on the prototype. - * - * @interface ReactClassInterface - * @internal - */ - var ReactClassInterface = { - /** - * An array of Mixin objects to include when defining your component. - * - * @type {array} - * @optional - */ - mixins: 'DEFINE_MANY', - - /** - * An object containing properties and methods that should be defined on - * the component's constructor instead of its prototype (static methods). - * - * @type {object} - * @optional - */ - statics: 'DEFINE_MANY', - - /** - * Definition of prop types for this component. - * - * @type {object} - * @optional - */ - propTypes: 'DEFINE_MANY', - - /** - * Definition of context types for this component. - * - * @type {object} - * @optional - */ - contextTypes: 'DEFINE_MANY', - - /** - * Definition of context types this component sets for its children. - * - * @type {object} - * @optional - */ - childContextTypes: 'DEFINE_MANY', - - // ==== Definition methods ==== - - /** - * Invoked when the component is mounted. Values in the mapping will be set on - * `this.props` if that prop is not specified (i.e. using an `in` check). - * - * This method is invoked before `getInitialState` and therefore cannot rely - * on `this.state` or use `this.setState`. - * - * @return {object} - * @optional - */ - getDefaultProps: 'DEFINE_MANY_MERGED', - - /** - * Invoked once before the component is mounted. The return value will be used - * as the initial value of `this.state`. - * - * getInitialState: function() { - * return { - * isOn: false, - * fooBaz: new BazFoo() - * } - * } - * - * @return {object} - * @optional - */ - getInitialState: 'DEFINE_MANY_MERGED', - - /** - * @return {object} - * @optional - */ - getChildContext: 'DEFINE_MANY_MERGED', - - /** - * Uses props from `this.props` and state from `this.state` to render the - * structure of the component. - * - * No guarantees are made about when or how often this method is invoked, so - * it must not have side effects. - * - * render: function() { - * var name = this.props.name; - * return <div>Hello, {name}!</div>; - * } - * - * @return {ReactComponent} - * @required - */ - render: 'DEFINE_ONCE', - - // ==== Delegate methods ==== - - /** - * Invoked when the component is initially created and about to be mounted. - * This may have side effects, but any external subscriptions or data created - * by this method must be cleaned up in `componentWillUnmount`. - * - * @optional - */ - componentWillMount: 'DEFINE_MANY', - - /** - * Invoked when the component has been mounted and has a DOM representation. - * However, there is no guarantee that the DOM node is in the document. - * - * Use this as an opportunity to operate on the DOM when the component has - * been mounted (initialized and rendered) for the first time. - * - * @param {DOMElement} rootNode DOM element representing the component. - * @optional - */ - componentDidMount: 'DEFINE_MANY', - - /** - * Invoked before the component receives new props. - * - * Use this as an opportunity to react to a prop transition by updating the - * state using `this.setState`. Current props are accessed via `this.props`. - * - * componentWillReceiveProps: function(nextProps, nextContext) { - * this.setState({ - * likesIncreasing: nextProps.likeCount > this.props.likeCount - * }); - * } - * - * NOTE: There is no equivalent `componentWillReceiveState`. An incoming prop - * transition may cause a state change, but the opposite is not true. If you - * need it, you are probably looking for `componentWillUpdate`. - * - * @param {object} nextProps - * @optional - */ - componentWillReceiveProps: 'DEFINE_MANY', - - /** - * Invoked while deciding if the component should be updated as a result of - * receiving new props, state and/or context. - * - * Use this as an opportunity to `return false` when you're certain that the - * transition to the new props/state/context will not require a component - * update. - * - * shouldComponentUpdate: function(nextProps, nextState, nextContext) { - * return !equal(nextProps, this.props) || - * !equal(nextState, this.state) || - * !equal(nextContext, this.context); - * } - * - * @param {object} nextProps - * @param {?object} nextState - * @param {?object} nextContext - * @return {boolean} True if the component should update. - * @optional - */ - shouldComponentUpdate: 'DEFINE_ONCE', - - /** - * Invoked when the component is about to update due to a transition from - * `this.props`, `this.state` and `this.context` to `nextProps`, `nextState` - * and `nextContext`. - * - * Use this as an opportunity to perform preparation before an update occurs. - * - * NOTE: You **cannot** use `this.setState()` in this method. - * - * @param {object} nextProps - * @param {?object} nextState - * @param {?object} nextContext - * @param {ReactReconcileTransaction} transaction - * @optional - */ - componentWillUpdate: 'DEFINE_MANY', - - /** - * Invoked when the component's DOM representation has been updated. - * - * Use this as an opportunity to operate on the DOM when the component has - * been updated. - * - * @param {object} prevProps - * @param {?object} prevState - * @param {?object} prevContext - * @param {DOMElement} rootNode DOM element representing the component. - * @optional - */ - componentDidUpdate: 'DEFINE_MANY', - - /** - * Invoked when the component is about to be removed from its parent and have - * its DOM representation destroyed. - * - * Use this as an opportunity to deallocate any external resources. - * - * NOTE: There is no `componentDidUnmount` since your component will have been - * destroyed by that point. - * - * @optional - */ - componentWillUnmount: 'DEFINE_MANY', - - // ==== Advanced methods ==== - - /** - * Updates the component's currently mounted DOM representation. - * - * By default, this implements React's rendering and reconciliation algorithm. - * Sophisticated clients may wish to override this. - * - * @param {ReactReconcileTransaction} transaction - * @internal - * @overridable - */ - updateComponent: 'OVERRIDE_BASE' - }; - - /** - * Mapping from class specification keys to special processing functions. - * - * Although these are declared like instance properties in the specification - * when defining classes using `React.createClass`, they are actually static - * and are accessible on the constructor instead of the prototype. Despite - * being static, they must be defined outside of the "statics" key under - * which all other static methods are defined. - */ - var RESERVED_SPEC_KEYS = { - displayName: function(Constructor, displayName) { - Constructor.displayName = displayName; - }, - mixins: function(Constructor, mixins) { - if (mixins) { - for (var i = 0; i < mixins.length; i++) { - mixSpecIntoComponent(Constructor, mixins[i]); - } - } - }, - childContextTypes: function(Constructor, childContextTypes) { - if (process.env.NODE_ENV !== 'production') { - validateTypeDef(Constructor, childContextTypes, 'childContext'); - } - Constructor.childContextTypes = _assign( - {}, - Constructor.childContextTypes, - childContextTypes - ); - }, - contextTypes: function(Constructor, contextTypes) { - if (process.env.NODE_ENV !== 'production') { - validateTypeDef(Constructor, contextTypes, 'context'); - } - Constructor.contextTypes = _assign( - {}, - Constructor.contextTypes, - contextTypes - ); - }, - /** - * Special case getDefaultProps which should move into statics but requires - * automatic merging. - */ - getDefaultProps: function(Constructor, getDefaultProps) { - if (Constructor.getDefaultProps) { - Constructor.getDefaultProps = createMergedResultFunction( - Constructor.getDefaultProps, - getDefaultProps - ); - } else { - Constructor.getDefaultProps = getDefaultProps; - } - }, - propTypes: function(Constructor, propTypes) { - if (process.env.NODE_ENV !== 'production') { - validateTypeDef(Constructor, propTypes, 'prop'); - } - Constructor.propTypes = _assign({}, Constructor.propTypes, propTypes); - }, - statics: function(Constructor, statics) { - mixStaticSpecIntoComponent(Constructor, statics); - }, - autobind: function() {} - }; - - function validateTypeDef(Constructor, typeDef, location) { - for (var propName in typeDef) { - if (typeDef.hasOwnProperty(propName)) { - // use a warning instead of an _invariant so components - // don't show up in prod but only in __DEV__ - if (process.env.NODE_ENV !== 'production') { - warning( - typeof typeDef[propName] === 'function', - '%s: %s type `%s` is invalid; it must be a function, usually from ' + - 'React.PropTypes.', - Constructor.displayName || 'ReactClass', - ReactPropTypeLocationNames[location], - propName - ); - } - } - } - } - - function validateMethodOverride(isAlreadyDefined, name) { - var specPolicy = ReactClassInterface.hasOwnProperty(name) - ? ReactClassInterface[name] - : null; - - // Disallow overriding of base class methods unless explicitly allowed. - if (ReactClassMixin.hasOwnProperty(name)) { - _invariant( - specPolicy === 'OVERRIDE_BASE', - 'ReactClassInterface: You are attempting to override ' + - '`%s` from your class specification. Ensure that your method names ' + - 'do not overlap with React methods.', - name - ); - } - - // Disallow defining methods more than once unless explicitly allowed. - if (isAlreadyDefined) { - _invariant( - specPolicy === 'DEFINE_MANY' || specPolicy === 'DEFINE_MANY_MERGED', - 'ReactClassInterface: You are attempting to define ' + - '`%s` on your component more than once. This conflict may be due ' + - 'to a mixin.', - name - ); - } - } - - /** - * Mixin helper which handles policy validation and reserved - * specification keys when building React classes. - */ - function mixSpecIntoComponent(Constructor, spec) { - if (!spec) { - if (process.env.NODE_ENV !== 'production') { - var typeofSpec = typeof spec; - var isMixinValid = typeofSpec === 'object' && spec !== null; - - if (process.env.NODE_ENV !== 'production') { - warning( - isMixinValid, - "%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.', - Constructor.displayName || 'ReactClass', - spec === null ? null : typeofSpec - ); - } - } - - return; - } - - _invariant( - typeof spec !== 'function', - "ReactClass: You're attempting to " + - 'use a component class or function as a mixin. Instead, just use a ' + - 'regular object.' - ); - _invariant( - !isValidElement(spec), - "ReactClass: You're attempting to " + - 'use a component as a mixin. Instead, just use a regular object.' - ); - - var proto = Constructor.prototype; - var autoBindPairs = proto.__reactAutoBindPairs; - - // By handling mixins before any other properties, we ensure the same - // chaining order is applied to methods with DEFINE_MANY policy, whether - // mixins are listed before or after these methods in the spec. - if (spec.hasOwnProperty(MIXINS_KEY)) { - RESERVED_SPEC_KEYS.mixins(Constructor, spec.mixins); - } - - for (var name in spec) { - if (!spec.hasOwnProperty(name)) { - continue; - } - - if (name === MIXINS_KEY) { - // We have already handled mixins in a special case above. - continue; - } - - var property = spec[name]; - var isAlreadyDefined = proto.hasOwnProperty(name); - validateMethodOverride(isAlreadyDefined, name); - - if (RESERVED_SPEC_KEYS.hasOwnProperty(name)) { - RESERVED_SPEC_KEYS[name](Constructor, property); - } else { - // Setup methods on prototype: - // The following member methods should not be automatically bound: - // 1. Expected ReactClass methods (in the "interface"). - // 2. Overridden methods (that were mixed in). - var isReactClassMethod = ReactClassInterface.hasOwnProperty(name); - var isFunction = typeof property === 'function'; - var shouldAutoBind = - isFunction && - !isReactClassMethod && - !isAlreadyDefined && - spec.autobind !== false; - - if (shouldAutoBind) { - autoBindPairs.push(name, property); - proto[name] = property; - } else { - if (isAlreadyDefined) { - var specPolicy = ReactClassInterface[name]; - - // These cases should already be caught by validateMethodOverride. - _invariant( - isReactClassMethod && - (specPolicy === 'DEFINE_MANY_MERGED' || - specPolicy === 'DEFINE_MANY'), - 'ReactClass: Unexpected spec policy %s for key %s ' + - 'when mixing in component specs.', - specPolicy, - name - ); - - // For methods which are defined more than once, call the existing - // methods before calling the new property, merging if appropriate. - if (specPolicy === 'DEFINE_MANY_MERGED') { - proto[name] = createMergedResultFunction(proto[name], property); - } else if (specPolicy === 'DEFINE_MANY') { - proto[name] = createChainedFunction(proto[name], property); - } - } else { - proto[name] = property; - if (process.env.NODE_ENV !== 'production') { - // Add verbose displayName to the function, which helps when looking - // at profiling tools. - if (typeof property === 'function' && spec.displayName) { - proto[name].displayName = spec.displayName + '_' + name; - } - } - } - } - } - } - } - - function mixStaticSpecIntoComponent(Constructor, statics) { - if (!statics) { - return; - } - for (var name in statics) { - var property = statics[name]; - if (!statics.hasOwnProperty(name)) { - continue; - } - - var isReserved = name in RESERVED_SPEC_KEYS; - _invariant( - !isReserved, - '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.', - name - ); - - var isInherited = name in Constructor; - _invariant( - !isInherited, - 'ReactClass: You are attempting to define ' + - '`%s` on your component more than once. This conflict may be ' + - 'due to a mixin.', - name - ); - Constructor[name] = property; - } - } - - /** - * Merge two objects, but throw if both contain the same key. - * - * @param {object} one The first object, which is mutated. - * @param {object} two The second object - * @return {object} one after it has been mutated to contain everything in two. - */ - function mergeIntoWithNoDuplicateKeys(one, two) { - _invariant( - one && two && typeof one === 'object' && typeof two === 'object', - 'mergeIntoWithNoDuplicateKeys(): Cannot merge non-objects.' - ); - - for (var key in two) { - if (two.hasOwnProperty(key)) { - _invariant( - one[key] === undefined, - '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.', - key - ); - one[key] = two[key]; - } - } - return one; - } - - /** - * Creates a function that invokes two functions and merges their return values. - * - * @param {function} one Function to invoke first. - * @param {function} two Function to invoke second. - * @return {function} Function that invokes the two argument functions. - * @private - */ - function createMergedResultFunction(one, two) { - return function mergedResult() { - var a = one.apply(this, arguments); - var b = two.apply(this, arguments); - if (a == null) { - return b; - } else if (b == null) { - return a; - } - var c = {}; - mergeIntoWithNoDuplicateKeys(c, a); - mergeIntoWithNoDuplicateKeys(c, b); - return c; - }; - } - - /** - * Creates a function that invokes two functions and ignores their return vales. - * - * @param {function} one Function to invoke first. - * @param {function} two Function to invoke second. - * @return {function} Function that invokes the two argument functions. - * @private - */ - function createChainedFunction(one, two) { - return function chainedFunction() { - one.apply(this, arguments); - two.apply(this, arguments); - }; - } - - /** - * Binds a method to the component. - * - * @param {object} component Component whose method is going to be bound. - * @param {function} method Method to be bound. - * @return {function} The bound method. - */ - function bindAutoBindMethod(component, method) { - var boundMethod = method.bind(component); - if (process.env.NODE_ENV !== 'production') { - boundMethod.__reactBoundContext = component; - boundMethod.__reactBoundMethod = method; - boundMethod.__reactBoundArguments = null; - var componentName = component.constructor.displayName; - var _bind = boundMethod.bind; - boundMethod.bind = function(newThis) { - for ( - var _len = arguments.length, - args = Array(_len > 1 ? _len - 1 : 0), - _key = 1; - _key < _len; - _key++ - ) { - args[_key - 1] = arguments[_key]; - } - - // User is trying to bind() an autobound method; we effectively will - // ignore the value of "this" that the user is trying to use, so - // let's warn. - if (newThis !== component && newThis !== null) { - if (process.env.NODE_ENV !== 'production') { - warning( - false, - 'bind(): React component methods may only be bound to the ' + - 'component instance. See %s', - componentName - ); - } - } else if (!args.length) { - if (process.env.NODE_ENV !== 'production') { - warning( - false, - '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', - componentName - ); - } - return boundMethod; - } - var reboundMethod = _bind.apply(boundMethod, arguments); - reboundMethod.__reactBoundContext = component; - reboundMethod.__reactBoundMethod = method; - reboundMethod.__reactBoundArguments = args; - return reboundMethod; - }; - } - return boundMethod; - } - - /** - * Binds all auto-bound methods in a component. - * - * @param {object} component Component whose method is going to be bound. - */ - function bindAutoBindMethods(component) { - var pairs = component.__reactAutoBindPairs; - for (var i = 0; i < pairs.length; i += 2) { - var autoBindKey = pairs[i]; - var method = pairs[i + 1]; - component[autoBindKey] = bindAutoBindMethod(component, method); - } - } - - var IsMountedPreMixin = { - componentDidMount: function() { - this.__isMounted = true; - } - }; - - var IsMountedPostMixin = { - componentWillUnmount: function() { - this.__isMounted = false; - } - }; - - /** - * Add more to the ReactClass base class. These are all legacy features and - * therefore not already part of the modern ReactComponent. - */ - var ReactClassMixin = { - /** - * TODO: This will be deprecated because state should always keep a consistent - * type signature and the only use case for this, is to avoid that. - */ - replaceState: function(newState, callback) { - this.updater.enqueueReplaceState(this, newState, callback); - }, - - /** - * Checks whether or not this composite component is mounted. - * @return {boolean} True if mounted, false otherwise. - * @protected - * @final - */ - isMounted: function() { - if (process.env.NODE_ENV !== 'production') { - warning( - this.__didWarnIsMounted, - '%s: isMounted is deprecated. Instead, make sure to clean up ' + - 'subscriptions and pending requests in componentWillUnmount to ' + - 'prevent memory leaks.', - (this.constructor && this.constructor.displayName) || - this.name || - 'Component' - ); - this.__didWarnIsMounted = true; - } - return !!this.__isMounted; - } - }; - - var ReactClassComponent = function() {}; - _assign( - ReactClassComponent.prototype, - ReactComponent.prototype, - ReactClassMixin - ); - - /** - * Creates a composite component class given a class specification. - * See https://facebook.github.io/react/docs/top-level-api.html#react.createclass - * - * @param {object} spec Class specification (which must define `render`). - * @return {function} Component constructor function. - * @public - */ - function createClass(spec) { - // To keep our warnings more understandable, we'll use a little hack here to - // ensure that Constructor.name !== 'Constructor'. This makes sure we don't - // unnecessarily identify a class without displayName as 'Constructor'. - var Constructor = identity(function(props, context, updater) { - // This constructor gets overridden by mocks. The argument is used - // by mocks to assert on what gets mounted. - - if (process.env.NODE_ENV !== 'production') { - warning( - this instanceof Constructor, - 'Something is calling a React component directly. Use a factory or ' + - 'JSX instead. See: https://fb.me/react-legacyfactory' - ); - } - - // Wire up auto-binding - if (this.__reactAutoBindPairs.length) { - bindAutoBindMethods(this); - } - - this.props = props; - this.context = context; - this.refs = emptyObject; - this.updater = updater || ReactNoopUpdateQueue; - - this.state = null; - - // ReactClasses doesn't have constructors. Instead, they use the - // getInitialState and componentWillMount methods for initialization. - - var initialState = this.getInitialState ? this.getInitialState() : null; - if (process.env.NODE_ENV !== 'production') { - // We allow auto-mocks to proceed as if they're returning null. - if ( - initialState === undefined && - this.getInitialState._isMockFunction - ) { - // This is probably bad practice. Consider warning here and - // deprecating this convenience. - initialState = null; - } - } - _invariant( - typeof initialState === 'object' && !Array.isArray(initialState), - '%s.getInitialState(): must return an object or null', - Constructor.displayName || 'ReactCompositeComponent' - ); - - this.state = initialState; - }); - Constructor.prototype = new ReactClassComponent(); - Constructor.prototype.constructor = Constructor; - Constructor.prototype.__reactAutoBindPairs = []; - - injectedMixins.forEach(mixSpecIntoComponent.bind(null, Constructor)); - - mixSpecIntoComponent(Constructor, IsMountedPreMixin); - mixSpecIntoComponent(Constructor, spec); - mixSpecIntoComponent(Constructor, IsMountedPostMixin); - - // Initialize the defaultProps property after all mixins have been merged. - if (Constructor.getDefaultProps) { - Constructor.defaultProps = Constructor.getDefaultProps(); - } - - if (process.env.NODE_ENV !== 'production') { - // This is a tag to indicate that the use of these method names is ok, - // since it's used with createClass. If it's not, then it's likely a - // mistake so we'll warn you to use the static property, property - // initializer or constructor respectively. - if (Constructor.getDefaultProps) { - Constructor.getDefaultProps.isReactClassApproved = {}; - } - if (Constructor.prototype.getInitialState) { - Constructor.prototype.getInitialState.isReactClassApproved = {}; - } - } - - _invariant( - Constructor.prototype.render, - 'createClass(...): Class specification must implement a `render` method.' - ); - - if (process.env.NODE_ENV !== 'production') { - warning( - !Constructor.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.', - spec.displayName || 'A component' - ); - warning( - !Constructor.prototype.componentWillRecieveProps, - '%s has a method called ' + - 'componentWillRecieveProps(). Did you mean componentWillReceiveProps()?', - spec.displayName || 'A component' - ); - } - - // Reduce time spent doing lookups by setting these on the prototype. - for (var methodName in ReactClassInterface) { - if (!Constructor.prototype[methodName]) { - Constructor.prototype[methodName] = null; - } - } - - return Constructor; - } - - return createClass; -} - -module.exports = factory; - - -/***/ }), -/* 107 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - -var _prodInvariant = __webpack_require__(16); - -var ReactElement = __webpack_require__(13); - -var invariant = __webpack_require__(0); - -/** - * Returns the first child in a collection of children and verifies that there - * is only one child in the collection. - * - * See https://facebook.github.io/react/docs/top-level-api.html#react.children.only - * - * The current implementation of this function assumes that a single child gets - * passed without a wrapper, but the purpose of this helper function is to - * abstract away the particular structure of children. - * - * @param {?object} children Child collection structure. - * @return {ReactElement} The first and only `ReactElement` contained in the - * structure. - */ -function onlyChild(children) { - !ReactElement.isValidElement(children) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'React.Children.only expected to receive a single React element child.') : _prodInvariant('143') : void 0; - return children; -} - -module.exports = onlyChild; - -/***/ }), -/* 108 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - -/* globals __REACT_DEVTOOLS_GLOBAL_HOOK__*/ - - - -var ReactDOMComponentTree = __webpack_require__(4); -var ReactDefaultInjection = __webpack_require__(109); -var ReactMount = __webpack_require__(82); -var ReactReconciler = __webpack_require__(17); -var ReactUpdates = __webpack_require__(10); -var ReactVersion = __webpack_require__(187); - -var findDOMNode = __webpack_require__(188); -var getHostComponentFromComposite = __webpack_require__(83); -var renderSubtreeIntoContainer = __webpack_require__(189); -var warning = __webpack_require__(1); - -ReactDefaultInjection.inject(); - -var ReactDOM = { - findDOMNode: findDOMNode, - render: ReactMount.render, - unmountComponentAtNode: ReactMount.unmountComponentAtNode, - version: ReactVersion, - - /* eslint-disable camelcase */ - unstable_batchedUpdates: ReactUpdates.batchedUpdates, - unstable_renderSubtreeIntoContainer: renderSubtreeIntoContainer - /* eslint-enable camelcase */ -}; - -// Inject the runtime into a devtools global hook regardless of browser. -// Allows for debugging when the hook is injected on the page. -if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' && typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.inject === 'function') { - __REACT_DEVTOOLS_GLOBAL_HOOK__.inject({ - ComponentTree: { - getClosestInstanceFromNode: ReactDOMComponentTree.getClosestInstanceFromNode, - getNodeFromInstance: function (inst) { - // inst is an internal instance (but could be a composite) - if (inst._renderedComponent) { - inst = getHostComponentFromComposite(inst); - } - if (inst) { - return ReactDOMComponentTree.getNodeFromInstance(inst); - } else { - return null; - } - } - }, - Mount: ReactMount, - Reconciler: ReactReconciler - }); -} - -if (process.env.NODE_ENV !== 'production') { - var ExecutionEnvironment = __webpack_require__(5); - if (ExecutionEnvironment.canUseDOM && window.top === window.self) { - // First check if devtools is not installed - if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined') { - // If we're in Chrome or Firefox, provide a download link if not installed. - if (navigator.userAgent.indexOf('Chrome') > -1 && navigator.userAgent.indexOf('Edge') === -1 || navigator.userAgent.indexOf('Firefox') > -1) { - // Firefox does not have the issue with devtools loaded over file:// - var showFileUrlMessage = window.location.protocol.indexOf('http') === -1 && navigator.userAgent.indexOf('Firefox') === -1; - console.debug('Download the React DevTools ' + (showFileUrlMessage ? 'and use an HTTP server (instead of a file: URL) ' : '') + 'for a better development experience: ' + 'https://fb.me/react-devtools'); - } - } - - var testFunc = function testFn() {}; - process.env.NODE_ENV !== 'production' ? warning((testFunc.name || testFunc.toString()).indexOf('testFn') !== -1, "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.') : void 0; - - // If we're in IE8, check to see if we are in compatibility mode and provide - // information on preventing compatibility mode - var ieCompatibilityMode = document.documentMode && document.documentMode < 8; - - process.env.NODE_ENV !== 'production' ? warning(!ieCompatibilityMode, '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" />') : void 0; - - var expectedFeatures = [ - // shims - Array.isArray, Array.prototype.every, Array.prototype.forEach, Array.prototype.indexOf, Array.prototype.map, Date.now, Function.prototype.bind, Object.keys, String.prototype.trim]; - - for (var i = 0; i < expectedFeatures.length; i++) { - if (!expectedFeatures[i]) { - process.env.NODE_ENV !== 'production' ? warning(false, 'One or more ES5 shims expected by React are not available: ' + 'https://fb.me/react-warning-polyfills') : void 0; - break; - } - } - } -} - -if (process.env.NODE_ENV !== 'production') { - var ReactInstrumentation = __webpack_require__(8); - var ReactDOMUnknownPropertyHook = __webpack_require__(190); - var ReactDOMNullInputValuePropHook = __webpack_require__(191); - var ReactDOMInvalidARIAHook = __webpack_require__(192); - - ReactInstrumentation.debugTool.addHook(ReactDOMUnknownPropertyHook); - ReactInstrumentation.debugTool.addHook(ReactDOMNullInputValuePropHook); - ReactInstrumentation.debugTool.addHook(ReactDOMInvalidARIAHook); -} - -module.exports = ReactDOM; - -/***/ }), -/* 109 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var ARIADOMPropertyConfig = __webpack_require__(110); -var BeforeInputEventPlugin = __webpack_require__(111); -var ChangeEventPlugin = __webpack_require__(115); -var DefaultEventPluginOrder = __webpack_require__(123); -var EnterLeaveEventPlugin = __webpack_require__(124); -var HTMLDOMPropertyConfig = __webpack_require__(125); -var ReactComponentBrowserEnvironment = __webpack_require__(126); -var ReactDOMComponent = __webpack_require__(132); -var ReactDOMComponentTree = __webpack_require__(4); -var ReactDOMEmptyComponent = __webpack_require__(158); -var ReactDOMTreeTraversal = __webpack_require__(159); -var ReactDOMTextComponent = __webpack_require__(160); -var ReactDefaultBatchingStrategy = __webpack_require__(161); -var ReactEventListener = __webpack_require__(162); -var ReactInjection = __webpack_require__(164); -var ReactReconcileTransaction = __webpack_require__(165); -var SVGDOMPropertyConfig = __webpack_require__(171); -var SelectEventPlugin = __webpack_require__(172); -var SimpleEventPlugin = __webpack_require__(173); - -var alreadyInjected = false; - -function inject() { - if (alreadyInjected) { - // TODO: This is currently true because these injections are shared between - // the client and the server package. They should be built independently - // and not share any injection state. Then this problem will be solved. - return; - } - alreadyInjected = true; - - ReactInjection.EventEmitter.injectReactEventListener(ReactEventListener); - - /** - * Inject modules for resolving DOM hierarchy and plugin ordering. - */ - ReactInjection.EventPluginHub.injectEventPluginOrder(DefaultEventPluginOrder); - ReactInjection.EventPluginUtils.injectComponentTree(ReactDOMComponentTree); - ReactInjection.EventPluginUtils.injectTreeTraversal(ReactDOMTreeTraversal); - - /** - * Some important event plugins included by default (without having to require - * them). - */ - ReactInjection.EventPluginHub.injectEventPluginsByName({ - SimpleEventPlugin: SimpleEventPlugin, - EnterLeaveEventPlugin: EnterLeaveEventPlugin, - ChangeEventPlugin: ChangeEventPlugin, - SelectEventPlugin: SelectEventPlugin, - BeforeInputEventPlugin: BeforeInputEventPlugin - }); - - ReactInjection.HostComponent.injectGenericComponentClass(ReactDOMComponent); - - ReactInjection.HostComponent.injectTextComponentClass(ReactDOMTextComponent); - - ReactInjection.DOMProperty.injectDOMPropertyConfig(ARIADOMPropertyConfig); - ReactInjection.DOMProperty.injectDOMPropertyConfig(HTMLDOMPropertyConfig); - ReactInjection.DOMProperty.injectDOMPropertyConfig(SVGDOMPropertyConfig); - - ReactInjection.EmptyComponent.injectEmptyComponentFactory(function (instantiate) { - return new ReactDOMEmptyComponent(instantiate); - }); - - ReactInjection.Updates.injectReconcileTransaction(ReactReconcileTransaction); - ReactInjection.Updates.injectBatchingStrategy(ReactDefaultBatchingStrategy); - - ReactInjection.Component.injectEnvironment(ReactComponentBrowserEnvironment); -} - -module.exports = { - inject: inject -}; - -/***/ }), -/* 110 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var ARIADOMPropertyConfig = { - Properties: { - // Global States and Properties - 'aria-current': 0, // state - 'aria-details': 0, - 'aria-disabled': 0, // state - 'aria-hidden': 0, // state - 'aria-invalid': 0, // state - 'aria-keyshortcuts': 0, - 'aria-label': 0, - 'aria-roledescription': 0, - // Widget Attributes - '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, - // Live Region Attributes - 'aria-atomic': 0, - 'aria-busy': 0, - 'aria-live': 0, - 'aria-relevant': 0, - // Drag-and-Drop Attributes - 'aria-dropeffect': 0, - 'aria-grabbed': 0, - // Relationship Attributes - '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: {} -}; - -module.exports = ARIADOMPropertyConfig; - -/***/ }), -/* 111 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var EventPropagators = __webpack_require__(20); -var ExecutionEnvironment = __webpack_require__(5); -var FallbackCompositionState = __webpack_require__(112); -var SyntheticCompositionEvent = __webpack_require__(113); -var SyntheticInputEvent = __webpack_require__(114); - -var END_KEYCODES = [9, 13, 27, 32]; // Tab, Return, Esc, Space -var START_KEYCODE = 229; - -var canUseCompositionEvent = ExecutionEnvironment.canUseDOM && 'CompositionEvent' in window; - -var documentMode = null; -if (ExecutionEnvironment.canUseDOM && 'documentMode' in document) { - documentMode = document.documentMode; -} - -// Webkit offers a very useful `textInput` event that can be used to -// directly represent `beforeInput`. The IE `textinput` event is not as -// useful, so we don't use it. -var canUseTextInputEvent = ExecutionEnvironment.canUseDOM && 'TextEvent' in window && !documentMode && !isPresto(); - -// In IE9+, we have access to composition events, but the data supplied -// by the native compositionend event may be incorrect. Japanese ideographic -// spaces, for instance (\u3000) are not recorded correctly. -var useFallbackCompositionData = ExecutionEnvironment.canUseDOM && (!canUseCompositionEvent || documentMode && documentMode > 8 && documentMode <= 11); - -/** - * Opera <= 12 includes TextEvent in window, but does not fire - * text input events. Rely on keypress instead. - */ -function isPresto() { - var opera = window.opera; - return typeof opera === 'object' && typeof opera.version === 'function' && parseInt(opera.version(), 10) <= 12; -} - -var SPACEBAR_CODE = 32; -var SPACEBAR_CHAR = String.fromCharCode(SPACEBAR_CODE); - -// Events and their corresponding property names. -var eventTypes = { - 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'] - } -}; - -// Track whether we've ever handled a keypress on the space key. -var hasSpaceKeypress = false; - -/** - * Return whether a native keypress event is assumed to be a command. - * This is required because Firefox fires `keypress` events for key commands - * (cut, copy, select-all, etc.) even though no character is inserted. - */ -function isKeypressCommand(nativeEvent) { - return (nativeEvent.ctrlKey || nativeEvent.altKey || nativeEvent.metaKey) && - // ctrlKey && altKey is equivalent to AltGr, and is not a command. - !(nativeEvent.ctrlKey && nativeEvent.altKey); -} - -/** - * Translate native top level events into event types. - * - * @param {string} topLevelType - * @return {object} - */ -function getCompositionEventType(topLevelType) { - switch (topLevelType) { - case 'topCompositionStart': - return eventTypes.compositionStart; - case 'topCompositionEnd': - return eventTypes.compositionEnd; - case 'topCompositionUpdate': - return eventTypes.compositionUpdate; - } -} - -/** - * Does our fallback best-guess model think this event signifies that - * composition has begun? - * - * @param {string} topLevelType - * @param {object} nativeEvent - * @return {boolean} - */ -function isFallbackCompositionStart(topLevelType, nativeEvent) { - return topLevelType === 'topKeyDown' && nativeEvent.keyCode === START_KEYCODE; -} - -/** - * Does our fallback mode think that this event is the end of composition? - * - * @param {string} topLevelType - * @param {object} nativeEvent - * @return {boolean} - */ -function isFallbackCompositionEnd(topLevelType, nativeEvent) { - switch (topLevelType) { - case 'topKeyUp': - // Command keys insert or clear IME input. - return END_KEYCODES.indexOf(nativeEvent.keyCode) !== -1; - case 'topKeyDown': - // Expect IME keyCode on each keydown. If we get any other - // code we must have exited earlier. - return nativeEvent.keyCode !== START_KEYCODE; - case 'topKeyPress': - case 'topMouseDown': - case 'topBlur': - // Events are not possible without cancelling IME. - return true; - default: - return false; - } -} - -/** - * Google Input Tools provides composition data via a CustomEvent, - * with the `data` property populated in the `detail` object. If this - * is available on the event object, use it. If not, this is a plain - * composition event and we have nothing special to extract. - * - * @param {object} nativeEvent - * @return {?string} - */ -function getDataFromCustomEvent(nativeEvent) { - var detail = nativeEvent.detail; - if (typeof detail === 'object' && 'data' in detail) { - return detail.data; - } - return null; -} - -// Track the current IME composition fallback object, if any. -var currentComposition = null; - -/** - * @return {?object} A SyntheticCompositionEvent. - */ -function extractCompositionEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget) { - var eventType; - var fallbackData; - - if (canUseCompositionEvent) { - eventType = getCompositionEventType(topLevelType); - } else if (!currentComposition) { - if (isFallbackCompositionStart(topLevelType, nativeEvent)) { - eventType = eventTypes.compositionStart; - } - } else if (isFallbackCompositionEnd(topLevelType, nativeEvent)) { - eventType = eventTypes.compositionEnd; - } - - if (!eventType) { - return null; - } - - if (useFallbackCompositionData) { - // The current composition is stored statically and must not be - // overwritten while composition continues. - if (!currentComposition && eventType === eventTypes.compositionStart) { - currentComposition = FallbackCompositionState.getPooled(nativeEventTarget); - } else if (eventType === eventTypes.compositionEnd) { - if (currentComposition) { - fallbackData = currentComposition.getData(); - } - } - } - - var event = SyntheticCompositionEvent.getPooled(eventType, targetInst, nativeEvent, nativeEventTarget); - - if (fallbackData) { - // Inject data generated from fallback path into the synthetic event. - // This matches the property of native CompositionEventInterface. - event.data = fallbackData; - } else { - var customData = getDataFromCustomEvent(nativeEvent); - if (customData !== null) { - event.data = customData; - } - } - - EventPropagators.accumulateTwoPhaseDispatches(event); - return event; -} - -/** - * @param {string} topLevelType Record from `EventConstants`. - * @param {object} nativeEvent Native browser event. - * @return {?string} The string corresponding to this `beforeInput` event. - */ -function getNativeBeforeInputChars(topLevelType, nativeEvent) { - switch (topLevelType) { - case 'topCompositionEnd': - return getDataFromCustomEvent(nativeEvent); - case 'topKeyPress': - /** - * If native `textInput` events are available, our goal is to make - * use of them. However, there is a special case: the spacebar key. - * In Webkit, preventing default on a spacebar `textInput` event - * cancels character insertion, but it *also* causes the browser - * to fall back to its default spacebar behavior of scrolling the - * page. - * - * Tracking at: - * https://code.google.com/p/chromium/issues/detail?id=355103 - * - * To avoid this issue, use the keypress event as if no `textInput` - * event is available. - */ - var which = nativeEvent.which; - if (which !== SPACEBAR_CODE) { - return null; - } - - hasSpaceKeypress = true; - return SPACEBAR_CHAR; - - case 'topTextInput': - // Record the characters to be added to the DOM. - var chars = nativeEvent.data; - - // If it's a spacebar character, assume that we have already handled - // it at the keypress level and bail immediately. Android Chrome - // doesn't give us keycodes, so we need to blacklist it. - if (chars === SPACEBAR_CHAR && hasSpaceKeypress) { - return null; - } - - return chars; - - default: - // For other native event types, do nothing. - return null; - } -} - -/** - * For browsers that do not provide the `textInput` event, extract the - * appropriate string to use for SyntheticInputEvent. - * - * @param {string} topLevelType Record from `EventConstants`. - * @param {object} nativeEvent Native browser event. - * @return {?string} The fallback string for this `beforeInput` event. - */ -function getFallbackBeforeInputChars(topLevelType, nativeEvent) { - // If we are currently composing (IME) and using a fallback to do so, - // try to extract the composed characters from the fallback object. - // If composition event is available, we extract a string only at - // compositionevent, otherwise extract it at fallback events. - if (currentComposition) { - if (topLevelType === 'topCompositionEnd' || !canUseCompositionEvent && isFallbackCompositionEnd(topLevelType, nativeEvent)) { - var chars = currentComposition.getData(); - FallbackCompositionState.release(currentComposition); - currentComposition = null; - return chars; - } - return null; - } - - switch (topLevelType) { - case 'topPaste': - // If a paste event occurs after a keypress, throw out the input - // chars. Paste events should not lead to BeforeInput events. - return null; - case 'topKeyPress': - /** - * As of v27, Firefox may fire keypress events even when no character - * will be inserted. A few possibilities: - * - * - `which` is `0`. Arrow keys, Esc key, etc. - * - * - `which` is the pressed key code, but no char is available. - * Ex: 'AltGr + d` in Polish. There is no modified character for - * this key combination and no character is inserted into the - * document, but FF fires the keypress for char code `100` anyway. - * No `input` event will occur. - * - * - `which` is the pressed key code, but a command combination is - * being used. Ex: `Cmd+C`. No character is inserted, and no - * `input` event will occur. - */ - if (nativeEvent.which && !isKeypressCommand(nativeEvent)) { - return String.fromCharCode(nativeEvent.which); - } - return null; - case 'topCompositionEnd': - return useFallbackCompositionData ? null : nativeEvent.data; - default: - return null; - } -} - -/** - * Extract a SyntheticInputEvent for `beforeInput`, based on either native - * `textInput` or fallback behavior. - * - * @return {?object} A SyntheticInputEvent. - */ -function extractBeforeInputEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget) { - var chars; - - if (canUseTextInputEvent) { - chars = getNativeBeforeInputChars(topLevelType, nativeEvent); - } else { - chars = getFallbackBeforeInputChars(topLevelType, nativeEvent); - } - - // If no characters are being inserted, no BeforeInput event should - // be fired. - if (!chars) { - return null; - } - - var event = SyntheticInputEvent.getPooled(eventTypes.beforeInput, targetInst, nativeEvent, nativeEventTarget); - - event.data = chars; - EventPropagators.accumulateTwoPhaseDispatches(event); - return event; -} - -/** - * Create an `onBeforeInput` event to match - * http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105/#events-inputevents. - * - * This event plugin is based on the native `textInput` event - * available in Chrome, Safari, Opera, and IE. This event fires after - * `onKeyPress` and `onCompositionEnd`, but before `onInput`. - * - * `beforeInput` is spec'd but not implemented in any browsers, and - * the `input` event does not provide any useful information about what has - * actually been added, contrary to the spec. Thus, `textInput` is the best - * available event to identify the characters that have actually been inserted - * into the target node. - * - * This plugin is also responsible for emitting `composition` events, thus - * allowing us to share composition fallback code for both `beforeInput` and - * `composition` event types. - */ -var BeforeInputEventPlugin = { - eventTypes: eventTypes, - - extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) { - return [extractCompositionEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget), extractBeforeInputEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget)]; - } -}; - -module.exports = BeforeInputEventPlugin; - -/***/ }), -/* 112 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var _assign = __webpack_require__(3); - -var PooledClass = __webpack_require__(14); - -var getTextContentAccessor = __webpack_require__(62); - -/** - * This helper class stores information about text content of a target node, - * allowing comparison of content before and after a given event. - * - * Identify the node where selection currently begins, then observe - * both its text content and its current position in the DOM. Since the - * browser may natively replace the target node during composition, we can - * use its position to find its replacement. - * - * @param {DOMEventTarget} root - */ -function FallbackCompositionState(root) { - this._root = root; - this._startText = this.getText(); - this._fallbackText = null; -} - -_assign(FallbackCompositionState.prototype, { - destructor: function () { - this._root = null; - this._startText = null; - this._fallbackText = null; - }, - - /** - * Get current text of input. - * - * @return {string} - */ - getText: function () { - if ('value' in this._root) { - return this._root.value; - } - return this._root[getTextContentAccessor()]; - }, - - /** - * Determine the differing substring between the initially stored - * text content and the current content. - * - * @return {string} - */ - getData: function () { - if (this._fallbackText) { - return this._fallbackText; - } - - var start; - var startValue = this._startText; - var startLength = startValue.length; - var end; - var endValue = this.getText(); - var endLength = endValue.length; - - for (start = 0; start < startLength; start++) { - if (startValue[start] !== endValue[start]) { - break; - } - } - - var minEnd = startLength - start; - for (end = 1; end <= minEnd; end++) { - if (startValue[startLength - end] !== endValue[endLength - end]) { - break; - } - } - - var sliceTail = end > 1 ? 1 - end : undefined; - this._fallbackText = endValue.slice(start, sliceTail); - return this._fallbackText; - } -}); - -PooledClass.addPoolingTo(FallbackCompositionState); - -module.exports = FallbackCompositionState; - -/***/ }), -/* 113 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var SyntheticEvent = __webpack_require__(11); - -/** - * @interface Event - * @see http://www.w3.org/TR/DOM-Level-3-Events/#events-compositionevents - */ -var CompositionEventInterface = { - data: null -}; - -/** - * @param {object} dispatchConfig Configuration used to dispatch this event. - * @param {string} dispatchMarker Marker identifying the event target. - * @param {object} nativeEvent Native browser event. - * @extends {SyntheticUIEvent} - */ -function SyntheticCompositionEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) { - return SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget); -} - -SyntheticEvent.augmentClass(SyntheticCompositionEvent, CompositionEventInterface); - -module.exports = SyntheticCompositionEvent; - -/***/ }), -/* 114 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var SyntheticEvent = __webpack_require__(11); - -/** - * @interface Event - * @see http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105 - * /#events-inputevents - */ -var InputEventInterface = { - data: null -}; - -/** - * @param {object} dispatchConfig Configuration used to dispatch this event. - * @param {string} dispatchMarker Marker identifying the event target. - * @param {object} nativeEvent Native browser event. - * @extends {SyntheticUIEvent} - */ -function SyntheticInputEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) { - return SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget); -} - -SyntheticEvent.augmentClass(SyntheticInputEvent, InputEventInterface); - -module.exports = SyntheticInputEvent; - -/***/ }), -/* 115 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var EventPluginHub = __webpack_require__(21); -var EventPropagators = __webpack_require__(20); -var ExecutionEnvironment = __webpack_require__(5); -var ReactDOMComponentTree = __webpack_require__(4); -var ReactUpdates = __webpack_require__(10); -var SyntheticEvent = __webpack_require__(11); - -var inputValueTracking = __webpack_require__(65); -var getEventTarget = __webpack_require__(37); -var isEventSupported = __webpack_require__(38); -var isTextInputElement = __webpack_require__(66); - -var eventTypes = { - change: { - phasedRegistrationNames: { - bubbled: 'onChange', - captured: 'onChangeCapture' - }, - dependencies: ['topBlur', 'topChange', 'topClick', 'topFocus', 'topInput', 'topKeyDown', 'topKeyUp', 'topSelectionChange'] - } -}; - -function createAndAccumulateChangeEvent(inst, nativeEvent, target) { - var event = SyntheticEvent.getPooled(eventTypes.change, inst, nativeEvent, target); - event.type = 'change'; - EventPropagators.accumulateTwoPhaseDispatches(event); - return event; -} -/** - * For IE shims - */ -var activeElement = null; -var activeElementInst = null; - -/** - * SECTION: handle `change` event - */ -function shouldUseChangeEvent(elem) { - var nodeName = elem.nodeName && elem.nodeName.toLowerCase(); - return nodeName === 'select' || nodeName === 'input' && elem.type === 'file'; -} - -var doesChangeEventBubble = false; -if (ExecutionEnvironment.canUseDOM) { - // See `handleChange` comment below - doesChangeEventBubble = isEventSupported('change') && (!document.documentMode || document.documentMode > 8); -} - -function manualDispatchChangeEvent(nativeEvent) { - var event = createAndAccumulateChangeEvent(activeElementInst, nativeEvent, getEventTarget(nativeEvent)); - - // If change and propertychange bubbled, we'd just bind to it like all the - // other events and have it go through ReactBrowserEventEmitter. Since it - // doesn't, we manually listen for the events and so we have to enqueue and - // process the abstract event manually. - // - // Batching is necessary here in order to ensure that all event handlers run - // before the next rerender (including event handlers attached to ancestor - // elements instead of directly on the input). Without this, controlled - // components don't work properly in conjunction with event bubbling because - // the component is rerendered and the value reverted before all the event - // handlers can run. See https://github.com/facebook/react/issues/708. - ReactUpdates.batchedUpdates(runEventInBatch, event); -} - -function runEventInBatch(event) { - EventPluginHub.enqueueEvents(event); - EventPluginHub.processEventQueue(false); -} - -function startWatchingForChangeEventIE8(target, targetInst) { - activeElement = target; - activeElementInst = targetInst; - activeElement.attachEvent('onchange', manualDispatchChangeEvent); -} - -function stopWatchingForChangeEventIE8() { - if (!activeElement) { - return; - } - activeElement.detachEvent('onchange', manualDispatchChangeEvent); - activeElement = null; - activeElementInst = null; -} - -function getInstIfValueChanged(targetInst, nativeEvent) { - var updated = inputValueTracking.updateValueIfChanged(targetInst); - var simulated = nativeEvent.simulated === true && ChangeEventPlugin._allowSimulatedPassThrough; - - if (updated || simulated) { - return targetInst; - } -} - -function getTargetInstForChangeEvent(topLevelType, targetInst) { - if (topLevelType === 'topChange') { - return targetInst; - } -} - -function handleEventsForChangeEventIE8(topLevelType, target, targetInst) { - if (topLevelType === 'topFocus') { - // stopWatching() should be a noop here but we call it just in case we - // missed a blur event somehow. - stopWatchingForChangeEventIE8(); - startWatchingForChangeEventIE8(target, targetInst); - } else if (topLevelType === 'topBlur') { - stopWatchingForChangeEventIE8(); - } -} - -/** - * SECTION: handle `input` event - */ -var isInputEventSupported = false; -if (ExecutionEnvironment.canUseDOM) { - // IE9 claims to support the input event but fails to trigger it when - // deleting text, so we ignore its input events. - - isInputEventSupported = isEventSupported('input') && (!document.documentMode || document.documentMode > 9); -} - -/** - * (For IE <=9) Starts tracking propertychange events on the passed-in element - * and override the value property so that we can distinguish user events from - * value changes in JS. - */ -function startWatchingForValueChange(target, targetInst) { - activeElement = target; - activeElementInst = targetInst; - activeElement.attachEvent('onpropertychange', handlePropertyChange); -} - -/** - * (For IE <=9) Removes the event listeners from the currently-tracked element, - * if any exists. - */ -function stopWatchingForValueChange() { - if (!activeElement) { - return; - } - activeElement.detachEvent('onpropertychange', handlePropertyChange); - - activeElement = null; - activeElementInst = null; -} - -/** - * (For IE <=9) Handles a propertychange event, sending a `change` event if - * the value of the active element has changed. - */ -function handlePropertyChange(nativeEvent) { - if (nativeEvent.propertyName !== 'value') { - return; - } - if (getInstIfValueChanged(activeElementInst, nativeEvent)) { - manualDispatchChangeEvent(nativeEvent); - } -} - -function handleEventsForInputEventPolyfill(topLevelType, target, targetInst) { - if (topLevelType === 'topFocus') { - // In IE8, we can capture almost all .value changes by adding a - // propertychange handler and looking for events with propertyName - // equal to 'value' - // In IE9, propertychange fires for most input events but is buggy and - // doesn't fire when text is deleted, but conveniently, selectionchange - // appears to fire in all of the remaining cases so we catch those and - // forward the event if the value has changed - // In either case, we don't want to call the event handler if the value - // is changed from JS so we redefine a setter for `.value` that updates - // our activeElementValue variable, allowing us to ignore those changes - // - // stopWatching() should be a noop here but we call it just in case we - // missed a blur event somehow. - stopWatchingForValueChange(); - startWatchingForValueChange(target, targetInst); - } else if (topLevelType === 'topBlur') { - stopWatchingForValueChange(); - } -} - -// For IE8 and IE9. -function getTargetInstForInputEventPolyfill(topLevelType, targetInst, nativeEvent) { - if (topLevelType === 'topSelectionChange' || topLevelType === 'topKeyUp' || topLevelType === 'topKeyDown') { - // On the selectionchange event, the target is just document which isn't - // helpful for us so just check activeElement instead. - // - // 99% of the time, keydown and keyup aren't necessary. IE8 fails to fire - // propertychange on the first input event after setting `value` from a - // script and fires only keydown, keypress, keyup. Catching keyup usually - // gets it and catching keydown lets us fire an event for the first - // keystroke if user does a key repeat (it'll be a little delayed: right - // before the second keystroke). Other input methods (e.g., paste) seem to - // fire selectionchange normally. - return getInstIfValueChanged(activeElementInst, nativeEvent); - } -} - -/** - * SECTION: handle `click` event - */ -function shouldUseClickEvent(elem) { - // Use the `click` event to detect changes to checkbox and radio inputs. - // This approach works across all browsers, whereas `change` does not fire - // until `blur` in IE8. - var nodeName = elem.nodeName; - return nodeName && nodeName.toLowerCase() === 'input' && (elem.type === 'checkbox' || elem.type === 'radio'); -} - -function getTargetInstForClickEvent(topLevelType, targetInst, nativeEvent) { - if (topLevelType === 'topClick') { - return getInstIfValueChanged(targetInst, nativeEvent); - } -} - -function getTargetInstForInputOrChangeEvent(topLevelType, targetInst, nativeEvent) { - if (topLevelType === 'topInput' || topLevelType === 'topChange') { - return getInstIfValueChanged(targetInst, nativeEvent); - } -} - -function handleControlledInputBlur(inst, node) { - // TODO: In IE, inst is occasionally null. Why? - if (inst == null) { - return; - } - - // Fiber and ReactDOM keep wrapper state in separate places - var state = inst._wrapperState || node._wrapperState; - - if (!state || !state.controlled || node.type !== 'number') { - return; - } - - // If controlled, assign the value attribute to the current value on blur - var value = '' + node.value; - if (node.getAttribute('value') !== value) { - node.setAttribute('value', value); - } -} - -/** - * This plugin creates an `onChange` event that normalizes change events - * across form elements. This event fires at a time when it's possible to - * change the element's value without seeing a flicker. - * - * Supported elements are: - * - input (see `isTextInputElement`) - * - textarea - * - select - */ -var ChangeEventPlugin = { - eventTypes: eventTypes, - - _allowSimulatedPassThrough: true, - _isInputEventSupported: isInputEventSupported, - - extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) { - var targetNode = targetInst ? ReactDOMComponentTree.getNodeFromInstance(targetInst) : window; - - var getTargetInstFunc, handleEventFunc; - if (shouldUseChangeEvent(targetNode)) { - if (doesChangeEventBubble) { - getTargetInstFunc = getTargetInstForChangeEvent; - } else { - handleEventFunc = handleEventsForChangeEventIE8; - } - } else if (isTextInputElement(targetNode)) { - if (isInputEventSupported) { - getTargetInstFunc = getTargetInstForInputOrChangeEvent; - } else { - getTargetInstFunc = getTargetInstForInputEventPolyfill; - handleEventFunc = handleEventsForInputEventPolyfill; - } - } else if (shouldUseClickEvent(targetNode)) { - getTargetInstFunc = getTargetInstForClickEvent; - } - - if (getTargetInstFunc) { - var inst = getTargetInstFunc(topLevelType, targetInst, nativeEvent); - if (inst) { - var event = createAndAccumulateChangeEvent(inst, nativeEvent, nativeEventTarget); - return event; - } - } - - if (handleEventFunc) { - handleEventFunc(topLevelType, targetNode, targetInst); - } - - // When blurring, set the value attribute for number inputs - if (topLevelType === 'topBlur') { - handleControlledInputBlur(targetInst, targetNode); - } - } -}; - -module.exports = ChangeEventPlugin; - -/***/ }), -/* 116 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * - */ - - - -var ReactOwner = __webpack_require__(117); - -var ReactRef = {}; - -function attachRef(ref, component, owner) { - if (typeof ref === 'function') { - ref(component.getPublicInstance()); - } else { - // Legacy ref - ReactOwner.addComponentAsRefTo(component, ref, owner); - } -} - -function detachRef(ref, component, owner) { - if (typeof ref === 'function') { - ref(null); - } else { - // Legacy ref - ReactOwner.removeComponentAsRefFrom(component, ref, owner); - } -} - -ReactRef.attachRefs = function (instance, element) { - if (element === null || typeof element !== 'object') { - return; - } - var ref = element.ref; - if (ref != null) { - attachRef(ref, instance, element._owner); - } -}; - -ReactRef.shouldUpdateRefs = function (prevElement, nextElement) { - // If either the owner or a `ref` has changed, make sure the newest owner - // has stored a reference to `this`, and the previous owner (if different) - // has forgotten the reference to `this`. We use the element instead - // of the public this.props because the post processing cannot determine - // a ref. The ref conceptually lives on the element. - - // TODO: Should this even be possible? The owner cannot change because - // it's forbidden by shouldUpdateReactComponent. The ref can change - // if you swap the keys of but not the refs. Reconsider where this check - // is made. It probably belongs where the key checking and - // instantiateReactComponent is done. - - var prevRef = null; - var prevOwner = null; - if (prevElement !== null && typeof prevElement === 'object') { - prevRef = prevElement.ref; - prevOwner = prevElement._owner; - } - - var nextRef = null; - var nextOwner = null; - if (nextElement !== null && typeof nextElement === 'object') { - nextRef = nextElement.ref; - nextOwner = nextElement._owner; - } - - return prevRef !== nextRef || - // If owner changes but we have an unchanged function ref, don't update refs - typeof nextRef === 'string' && nextOwner !== prevOwner; -}; - -ReactRef.detachRefs = function (instance, element) { - if (element === null || typeof element !== 'object') { - return; - } - var ref = element.ref; - if (ref != null) { - detachRef(ref, instance, element._owner); - } -}; - -module.exports = ReactRef; - -/***/ }), -/* 117 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * - */ - - - -var _prodInvariant = __webpack_require__(2); - -var invariant = __webpack_require__(0); - -/** - * @param {?object} object - * @return {boolean} True if `object` is a valid owner. - * @final - */ -function isValidOwner(object) { - return !!(object && typeof object.attachRef === 'function' && typeof object.detachRef === 'function'); -} - -/** - * ReactOwners are capable of storing references to owned components. - * - * All components are capable of //being// referenced by owner components, but - * only ReactOwner components are capable of //referencing// owned components. - * The named reference is known as a "ref". - * - * Refs are available when mounted and updated during reconciliation. - * - * var MyComponent = React.createClass({ - * render: function() { - * return ( - * <div onClick={this.handleClick}> - * <CustomComponent ref="custom" /> - * </div> - * ); - * }, - * handleClick: function() { - * this.refs.custom.handleClick(); - * }, - * componentDidMount: function() { - * this.refs.custom.initialize(); - * } - * }); - * - * Refs should rarely be used. When refs are used, they should only be done to - * control data that is not handled by React's data flow. - * - * @class ReactOwner - */ -var ReactOwner = { - /** - * Adds a component by ref to an owner component. - * - * @param {ReactComponent} component Component to reference. - * @param {string} ref Name by which to refer to the component. - * @param {ReactOwner} owner Component on which to record the ref. - * @final - * @internal - */ - addComponentAsRefTo: function (component, ref, owner) { - !isValidOwner(owner) ? process.env.NODE_ENV !== 'production' ? invariant(false, '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).') : _prodInvariant('119') : void 0; - owner.attachRef(ref, component); - }, - - /** - * Removes a component by ref from an owner component. - * - * @param {ReactComponent} component Component to dereference. - * @param {string} ref Name of the ref to remove. - * @param {ReactOwner} owner Component on which the ref is recorded. - * @final - * @internal - */ - removeComponentAsRefFrom: function (component, ref, owner) { - !isValidOwner(owner) ? process.env.NODE_ENV !== 'production' ? invariant(false, '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).') : _prodInvariant('120') : void 0; - var ownerPublicInstance = owner.getPublicInstance(); - // Check that `component`'s owner is still alive and that `component` is still the current ref - // because we do not want to detach the ref if another component stole it. - if (ownerPublicInstance && ownerPublicInstance.refs[ref] === component.getPublicInstance()) { - owner.detachRef(ref); - } - } -}; - -module.exports = ReactOwner; - -/***/ }), -/* 118 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2016-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * - */ - - - -var ReactInvalidSetStateWarningHook = __webpack_require__(119); -var ReactHostOperationHistoryHook = __webpack_require__(120); -var ReactComponentTreeHook = __webpack_require__(6); -var ExecutionEnvironment = __webpack_require__(5); - -var performanceNow = __webpack_require__(121); -var warning = __webpack_require__(1); - -var hooks = []; -var didHookThrowForEvent = {}; - -function callHook(event, fn, context, arg1, arg2, arg3, arg4, arg5) { - try { - fn.call(context, arg1, arg2, arg3, arg4, arg5); - } catch (e) { - process.env.NODE_ENV !== 'production' ? warning(didHookThrowForEvent[event], 'Exception thrown by hook while handling %s: %s', event, e + '\n' + e.stack) : void 0; - didHookThrowForEvent[event] = true; - } -} - -function emitEvent(event, arg1, arg2, arg3, arg4, arg5) { - for (var i = 0; i < hooks.length; i++) { - var hook = hooks[i]; - var fn = hook[event]; - if (fn) { - callHook(event, fn, hook, arg1, arg2, arg3, arg4, arg5); - } - } -} - -var isProfiling = false; -var flushHistory = []; -var lifeCycleTimerStack = []; -var currentFlushNesting = 0; -var currentFlushMeasurements = []; -var currentFlushStartTime = 0; -var currentTimerDebugID = null; -var currentTimerStartTime = 0; -var currentTimerNestedFlushDuration = 0; -var currentTimerType = null; - -var lifeCycleTimerHasWarned = false; - -function clearHistory() { - ReactComponentTreeHook.purgeUnmountedComponents(); - ReactHostOperationHistoryHook.clearHistory(); -} - -function getTreeSnapshot(registeredIDs) { - return registeredIDs.reduce(function (tree, id) { - var ownerID = ReactComponentTreeHook.getOwnerID(id); - var parentID = ReactComponentTreeHook.getParentID(id); - tree[id] = { - displayName: ReactComponentTreeHook.getDisplayName(id), - text: ReactComponentTreeHook.getText(id), - updateCount: ReactComponentTreeHook.getUpdateCount(id), - childIDs: ReactComponentTreeHook.getChildIDs(id), - // Text nodes don't have owners but this is close enough. - ownerID: ownerID || parentID && ReactComponentTreeHook.getOwnerID(parentID) || 0, - parentID: parentID - }; - return tree; - }, {}); -} - -function resetMeasurements() { - var previousStartTime = currentFlushStartTime; - var previousMeasurements = currentFlushMeasurements; - var previousOperations = ReactHostOperationHistoryHook.getHistory(); - - if (currentFlushNesting === 0) { - currentFlushStartTime = 0; - currentFlushMeasurements = []; - clearHistory(); - return; - } - - if (previousMeasurements.length || previousOperations.length) { - var registeredIDs = ReactComponentTreeHook.getRegisteredIDs(); - flushHistory.push({ - duration: performanceNow() - previousStartTime, - measurements: previousMeasurements || [], - operations: previousOperations || [], - treeSnapshot: getTreeSnapshot(registeredIDs) - }); - } - - clearHistory(); - currentFlushStartTime = performanceNow(); - currentFlushMeasurements = []; -} - -function checkDebugID(debugID) { - var allowRoot = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - - if (allowRoot && debugID === 0) { - return; - } - if (!debugID) { - process.env.NODE_ENV !== 'production' ? warning(false, 'ReactDebugTool: debugID may not be empty.') : void 0; - } -} - -function beginLifeCycleTimer(debugID, timerType) { - if (currentFlushNesting === 0) { - return; - } - if (currentTimerType && !lifeCycleTimerHasWarned) { - process.env.NODE_ENV !== 'production' ? warning(false, '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.', timerType, currentTimerType || 'no', debugID === currentTimerDebugID ? 'the same' : 'another') : void 0; - lifeCycleTimerHasWarned = true; - } - currentTimerStartTime = performanceNow(); - currentTimerNestedFlushDuration = 0; - currentTimerDebugID = debugID; - currentTimerType = timerType; -} - -function endLifeCycleTimer(debugID, timerType) { - if (currentFlushNesting === 0) { - return; - } - if (currentTimerType !== timerType && !lifeCycleTimerHasWarned) { - process.env.NODE_ENV !== 'production' ? warning(false, '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.', timerType, currentTimerType || 'no', debugID === currentTimerDebugID ? 'the same' : 'another') : void 0; - lifeCycleTimerHasWarned = true; - } - if (isProfiling) { - currentFlushMeasurements.push({ - timerType: timerType, - instanceID: debugID, - duration: performanceNow() - currentTimerStartTime - currentTimerNestedFlushDuration - }); - } - currentTimerStartTime = 0; - currentTimerNestedFlushDuration = 0; - currentTimerDebugID = null; - currentTimerType = null; -} - -function pauseCurrentLifeCycleTimer() { - var currentTimer = { - startTime: currentTimerStartTime, - nestedFlushStartTime: performanceNow(), - debugID: currentTimerDebugID, - timerType: currentTimerType - }; - lifeCycleTimerStack.push(currentTimer); - currentTimerStartTime = 0; - currentTimerNestedFlushDuration = 0; - currentTimerDebugID = null; - currentTimerType = null; -} - -function resumeCurrentLifeCycleTimer() { - var _lifeCycleTimerStack$ = lifeCycleTimerStack.pop(), - startTime = _lifeCycleTimerStack$.startTime, - nestedFlushStartTime = _lifeCycleTimerStack$.nestedFlushStartTime, - debugID = _lifeCycleTimerStack$.debugID, - timerType = _lifeCycleTimerStack$.timerType; - - var nestedFlushDuration = performanceNow() - nestedFlushStartTime; - currentTimerStartTime = startTime; - currentTimerNestedFlushDuration += nestedFlushDuration; - currentTimerDebugID = debugID; - currentTimerType = timerType; -} - -var lastMarkTimeStamp = 0; -var canUsePerformanceMeasure = typeof performance !== 'undefined' && typeof performance.mark === 'function' && typeof performance.clearMarks === 'function' && typeof performance.measure === 'function' && typeof performance.clearMeasures === 'function'; - -function shouldMark(debugID) { - if (!isProfiling || !canUsePerformanceMeasure) { - return false; - } - var element = ReactComponentTreeHook.getElement(debugID); - if (element == null || typeof element !== 'object') { - return false; - } - var isHostElement = typeof element.type === 'string'; - if (isHostElement) { - return false; - } - return true; -} - -function markBegin(debugID, markType) { - if (!shouldMark(debugID)) { - return; - } - - var markName = debugID + '::' + markType; - lastMarkTimeStamp = performanceNow(); - performance.mark(markName); -} - -function markEnd(debugID, markType) { - if (!shouldMark(debugID)) { - return; - } - - var markName = debugID + '::' + markType; - var displayName = ReactComponentTreeHook.getDisplayName(debugID) || 'Unknown'; - - // Chrome has an issue of dropping markers recorded too fast: - // https://bugs.chromium.org/p/chromium/issues/detail?id=640652 - // To work around this, we will not report very small measurements. - // I determined the magic number by tweaking it back and forth. - // 0.05ms was enough to prevent the issue, but I set it to 0.1ms to be safe. - // When the bug is fixed, we can `measure()` unconditionally if we want to. - var timeStamp = performanceNow(); - if (timeStamp - lastMarkTimeStamp > 0.1) { - var measurementName = displayName + ' [' + markType + ']'; - performance.measure(measurementName, markName); - } - - performance.clearMarks(markName); - if (measurementName) { - performance.clearMeasures(measurementName); - } -} - -var ReactDebugTool = { - addHook: function (hook) { - hooks.push(hook); - }, - removeHook: function (hook) { - for (var i = 0; i < hooks.length; i++) { - if (hooks[i] === hook) { - hooks.splice(i, 1); - i--; - } - } - }, - isProfiling: function () { - return isProfiling; - }, - beginProfiling: function () { - if (isProfiling) { - return; - } - - isProfiling = true; - flushHistory.length = 0; - resetMeasurements(); - ReactDebugTool.addHook(ReactHostOperationHistoryHook); - }, - endProfiling: function () { - if (!isProfiling) { - return; - } - - isProfiling = false; - resetMeasurements(); - ReactDebugTool.removeHook(ReactHostOperationHistoryHook); - }, - getFlushHistory: function () { - return flushHistory; - }, - onBeginFlush: function () { - currentFlushNesting++; - resetMeasurements(); - pauseCurrentLifeCycleTimer(); - emitEvent('onBeginFlush'); - }, - onEndFlush: function () { - resetMeasurements(); - currentFlushNesting--; - resumeCurrentLifeCycleTimer(); - emitEvent('onEndFlush'); - }, - onBeginLifeCycleTimer: function (debugID, timerType) { - checkDebugID(debugID); - emitEvent('onBeginLifeCycleTimer', debugID, timerType); - markBegin(debugID, timerType); - beginLifeCycleTimer(debugID, timerType); - }, - onEndLifeCycleTimer: function (debugID, timerType) { - checkDebugID(debugID); - endLifeCycleTimer(debugID, timerType); - markEnd(debugID, timerType); - emitEvent('onEndLifeCycleTimer', debugID, timerType); - }, - onBeginProcessingChildContext: function () { - emitEvent('onBeginProcessingChildContext'); - }, - onEndProcessingChildContext: function () { - emitEvent('onEndProcessingChildContext'); - }, - onHostOperation: function (operation) { - checkDebugID(operation.instanceID); - emitEvent('onHostOperation', operation); - }, - onSetState: function () { - emitEvent('onSetState'); - }, - onSetChildren: function (debugID, childDebugIDs) { - checkDebugID(debugID); - childDebugIDs.forEach(checkDebugID); - emitEvent('onSetChildren', debugID, childDebugIDs); - }, - onBeforeMountComponent: function (debugID, element, parentDebugID) { - checkDebugID(debugID); - checkDebugID(parentDebugID, true); - emitEvent('onBeforeMountComponent', debugID, element, parentDebugID); - markBegin(debugID, 'mount'); - }, - onMountComponent: function (debugID) { - checkDebugID(debugID); - markEnd(debugID, 'mount'); - emitEvent('onMountComponent', debugID); - }, - onBeforeUpdateComponent: function (debugID, element) { - checkDebugID(debugID); - emitEvent('onBeforeUpdateComponent', debugID, element); - markBegin(debugID, 'update'); - }, - onUpdateComponent: function (debugID) { - checkDebugID(debugID); - markEnd(debugID, 'update'); - emitEvent('onUpdateComponent', debugID); - }, - onBeforeUnmountComponent: function (debugID) { - checkDebugID(debugID); - emitEvent('onBeforeUnmountComponent', debugID); - markBegin(debugID, 'unmount'); - }, - onUnmountComponent: function (debugID) { - checkDebugID(debugID); - markEnd(debugID, 'unmount'); - emitEvent('onUnmountComponent', debugID); - }, - onTestEvent: function () { - emitEvent('onTestEvent'); - } -}; - -// TODO remove these when RN/www gets updated -ReactDebugTool.addDevtool = ReactDebugTool.addHook; -ReactDebugTool.removeDevtool = ReactDebugTool.removeHook; - -ReactDebugTool.addHook(ReactInvalidSetStateWarningHook); -ReactDebugTool.addHook(ReactComponentTreeHook); -var url = ExecutionEnvironment.canUseDOM && window.location.href || ''; -if (/[?&]react_perf\b/.test(url)) { - ReactDebugTool.beginProfiling(); -} - -module.exports = ReactDebugTool; - -/***/ }), -/* 119 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2016-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * - */ - - - -var warning = __webpack_require__(1); - -if (process.env.NODE_ENV !== 'production') { - var processingChildContext = false; - - var warnInvalidSetState = function () { - process.env.NODE_ENV !== 'production' ? warning(!processingChildContext, 'setState(...): Cannot call setState() inside getChildContext()') : void 0; - }; -} - -var ReactInvalidSetStateWarningHook = { - onBeginProcessingChildContext: function () { - processingChildContext = true; - }, - onEndProcessingChildContext: function () { - processingChildContext = false; - }, - onSetState: function () { - warnInvalidSetState(); - } -}; - -module.exports = ReactInvalidSetStateWarningHook; - -/***/ }), -/* 120 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2016-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * - */ - - - -var history = []; - -var ReactHostOperationHistoryHook = { - onHostOperation: function (operation) { - history.push(operation); - }, - clearHistory: function () { - if (ReactHostOperationHistoryHook._preventClearing) { - // Should only be used for tests. - return; - } - - history = []; - }, - getHistory: function () { - return history; - } -}; - -module.exports = ReactHostOperationHistoryHook; - -/***/ }), -/* 121 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @typechecks - */ - -var performance = __webpack_require__(122); - -var performanceNow; - -/** - * Detect if we can use `window.performance.now()` and gracefully fallback to - * `Date.now()` if it doesn't exist. We need to support Firefox < 15 for now - * because of Facebook's testing infrastructure. - */ -if (performance.now) { - performanceNow = function performanceNow() { - return performance.now(); - }; -} else { - performanceNow = function performanceNow() { - return Date.now(); - }; -} - -module.exports = performanceNow; - -/***/ }), -/* 122 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @typechecks - */ - - - -var ExecutionEnvironment = __webpack_require__(5); - -var performance; - -if (ExecutionEnvironment.canUseDOM) { - performance = window.performance || window.msPerformance || window.webkitPerformance; -} - -module.exports = performance || {}; - -/***/ }), -/* 123 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -/** - * Module that is injectable into `EventPluginHub`, that specifies a - * deterministic ordering of `EventPlugin`s. A convenient way to reason about - * plugins, without having to package every one of them. This is better than - * having plugins be ordered in the same order that they are injected because - * that ordering would be influenced by the packaging order. - * `ResponderEventPlugin` must occur before `SimpleEventPlugin` so that - * preventing default on events is convenient in `SimpleEventPlugin` handlers. - */ - -var DefaultEventPluginOrder = ['ResponderEventPlugin', 'SimpleEventPlugin', 'TapEventPlugin', 'EnterLeaveEventPlugin', 'ChangeEventPlugin', 'SelectEventPlugin', 'BeforeInputEventPlugin']; - -module.exports = DefaultEventPluginOrder; - -/***/ }), -/* 124 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var EventPropagators = __webpack_require__(20); -var ReactDOMComponentTree = __webpack_require__(4); -var SyntheticMouseEvent = __webpack_require__(28); - -var eventTypes = { - mouseEnter: { - registrationName: 'onMouseEnter', - dependencies: ['topMouseOut', 'topMouseOver'] - }, - mouseLeave: { - registrationName: 'onMouseLeave', - dependencies: ['topMouseOut', 'topMouseOver'] - } -}; - -var EnterLeaveEventPlugin = { - eventTypes: eventTypes, - - /** - * For almost every interaction we care about, there will be both a top-level - * `mouseover` and `mouseout` event that occurs. Only use `mouseout` so that - * we do not extract duplicate events. However, moving the mouse into the - * browser from outside will not fire a `mouseout` event. In this case, we use - * the `mouseover` top-level event. - */ - extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) { - if (topLevelType === 'topMouseOver' && (nativeEvent.relatedTarget || nativeEvent.fromElement)) { - return null; - } - if (topLevelType !== 'topMouseOut' && topLevelType !== 'topMouseOver') { - // Must not be a mouse in or mouse out - ignoring. - return null; - } - - var win; - if (nativeEventTarget.window === nativeEventTarget) { - // `nativeEventTarget` is probably a window object. - win = nativeEventTarget; - } else { - // TODO: Figure out why `ownerDocument` is sometimes undefined in IE8. - var doc = nativeEventTarget.ownerDocument; - if (doc) { - win = doc.defaultView || doc.parentWindow; - } else { - win = window; - } - } - - var from; - var to; - if (topLevelType === 'topMouseOut') { - from = targetInst; - var related = nativeEvent.relatedTarget || nativeEvent.toElement; - to = related ? ReactDOMComponentTree.getClosestInstanceFromNode(related) : null; - } else { - // Moving to a node from outside the window. - from = null; - to = targetInst; - } - - if (from === to) { - // Nothing pertains to our managed components. - return null; - } - - var fromNode = from == null ? win : ReactDOMComponentTree.getNodeFromInstance(from); - var toNode = to == null ? win : ReactDOMComponentTree.getNodeFromInstance(to); - - var leave = SyntheticMouseEvent.getPooled(eventTypes.mouseLeave, from, nativeEvent, nativeEventTarget); - leave.type = 'mouseleave'; - leave.target = fromNode; - leave.relatedTarget = toNode; - - var enter = SyntheticMouseEvent.getPooled(eventTypes.mouseEnter, to, nativeEvent, nativeEventTarget); - enter.type = 'mouseenter'; - enter.target = toNode; - enter.relatedTarget = fromNode; - - EventPropagators.accumulateEnterLeaveDispatches(leave, enter, from, to); - - return [leave, enter]; - } -}; - -module.exports = EnterLeaveEventPlugin; - -/***/ }), -/* 125 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var DOMProperty = __webpack_require__(12); - -var MUST_USE_PROPERTY = DOMProperty.injection.MUST_USE_PROPERTY; -var HAS_BOOLEAN_VALUE = DOMProperty.injection.HAS_BOOLEAN_VALUE; -var HAS_NUMERIC_VALUE = DOMProperty.injection.HAS_NUMERIC_VALUE; -var HAS_POSITIVE_NUMERIC_VALUE = DOMProperty.injection.HAS_POSITIVE_NUMERIC_VALUE; -var HAS_OVERLOADED_BOOLEAN_VALUE = DOMProperty.injection.HAS_OVERLOADED_BOOLEAN_VALUE; - -var HTMLDOMPropertyConfig = { - isCustomAttribute: RegExp.prototype.test.bind(new RegExp('^(data|aria)-[' + DOMProperty.ATTRIBUTE_NAME_CHAR + ']*$')), - Properties: { - /** - * Standard Properties - */ - accept: 0, - acceptCharset: 0, - accessKey: 0, - action: 0, - allowFullScreen: HAS_BOOLEAN_VALUE, - allowTransparency: 0, - alt: 0, - // specifies target context for links with `preload` type - as: 0, - async: HAS_BOOLEAN_VALUE, - autoComplete: 0, - // autoFocus is polyfilled/normalized by AutoFocusUtils - // autoFocus: HAS_BOOLEAN_VALUE, - autoPlay: HAS_BOOLEAN_VALUE, - capture: HAS_BOOLEAN_VALUE, - cellPadding: 0, - cellSpacing: 0, - charSet: 0, - challenge: 0, - checked: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE, - cite: 0, - classID: 0, - className: 0, - cols: HAS_POSITIVE_NUMERIC_VALUE, - colSpan: 0, - content: 0, - contentEditable: 0, - contextMenu: 0, - controls: HAS_BOOLEAN_VALUE, - controlsList: 0, - coords: 0, - crossOrigin: 0, - data: 0, // For `<object />` acts as `src`. - dateTime: 0, - 'default': HAS_BOOLEAN_VALUE, - defer: HAS_BOOLEAN_VALUE, - dir: 0, - disabled: HAS_BOOLEAN_VALUE, - download: HAS_OVERLOADED_BOOLEAN_VALUE, - draggable: 0, - encType: 0, - form: 0, - formAction: 0, - formEncType: 0, - formMethod: 0, - formNoValidate: HAS_BOOLEAN_VALUE, - formTarget: 0, - frameBorder: 0, - headers: 0, - height: 0, - hidden: HAS_BOOLEAN_VALUE, - 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: HAS_BOOLEAN_VALUE, - low: 0, - manifest: 0, - marginHeight: 0, - marginWidth: 0, - max: 0, - maxLength: 0, - media: 0, - mediaGroup: 0, - method: 0, - min: 0, - minLength: 0, - // Caution; `option.selected` is not updated if `select.multiple` is - // disabled with `removeAttribute`. - multiple: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE, - muted: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE, - name: 0, - nonce: 0, - noValidate: HAS_BOOLEAN_VALUE, - open: HAS_BOOLEAN_VALUE, - optimum: 0, - pattern: 0, - placeholder: 0, - playsInline: HAS_BOOLEAN_VALUE, - poster: 0, - preload: 0, - profile: 0, - radioGroup: 0, - readOnly: HAS_BOOLEAN_VALUE, - referrerPolicy: 0, - rel: 0, - required: HAS_BOOLEAN_VALUE, - reversed: HAS_BOOLEAN_VALUE, - role: 0, - rows: HAS_POSITIVE_NUMERIC_VALUE, - rowSpan: HAS_NUMERIC_VALUE, - sandbox: 0, - scope: 0, - scoped: HAS_BOOLEAN_VALUE, - scrolling: 0, - seamless: HAS_BOOLEAN_VALUE, - selected: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE, - shape: 0, - size: HAS_POSITIVE_NUMERIC_VALUE, - sizes: 0, - span: HAS_POSITIVE_NUMERIC_VALUE, - spellCheck: 0, - src: 0, - srcDoc: 0, - srcLang: 0, - srcSet: 0, - start: HAS_NUMERIC_VALUE, - step: 0, - style: 0, - summary: 0, - tabIndex: 0, - target: 0, - title: 0, - // Setting .type throws on non-<input> tags - type: 0, - useMap: 0, - value: 0, - width: 0, - wmode: 0, - wrap: 0, - - /** - * RDFa Properties - */ - about: 0, - datatype: 0, - inlist: 0, - prefix: 0, - // property is also supported for OpenGraph in meta tags. - property: 0, - resource: 0, - 'typeof': 0, - vocab: 0, - - /** - * Non-standard Properties - */ - // autoCapitalize and autoCorrect are supported in Mobile Safari for - // keyboard hints. - autoCapitalize: 0, - autoCorrect: 0, - // autoSave allows WebKit/Blink to persist values of input fields on page reloads - autoSave: 0, - // color is for Safari mask-icon link - color: 0, - // itemProp, itemScope, itemType are for - // Microdata support. See http://schema.org/docs/gs.html - itemProp: 0, - itemScope: HAS_BOOLEAN_VALUE, - itemType: 0, - // itemID and itemRef are for Microdata support as well but - // only specified in the WHATWG spec document. See - // https://html.spec.whatwg.org/multipage/microdata.html#microdata-dom-api - itemID: 0, - itemRef: 0, - // results show looking glass icon and recent searches on input - // search fields in WebKit/Blink - results: 0, - // IE-only attribute that specifies security restrictions on an iframe - // as an alternative to the sandbox attribute on IE<10 - security: 0, - // IE-only attribute that controls focus behavior - unselectable: 0 - }, - DOMAttributeNames: { - acceptCharset: 'accept-charset', - className: 'class', - htmlFor: 'for', - httpEquiv: 'http-equiv' - }, - DOMPropertyNames: {}, - DOMMutationMethods: { - value: function (node, value) { - if (value == null) { - return node.removeAttribute('value'); - } - - // Number inputs get special treatment due to some edge cases in - // Chrome. Let everything else assign the value attribute as normal. - // https://github.com/facebook/react/issues/7253#issuecomment-236074326 - if (node.type !== 'number' || node.hasAttribute('value') === false) { - node.setAttribute('value', '' + value); - } else if (node.validity && !node.validity.badInput && node.ownerDocument.activeElement !== node) { - // Don't assign an attribute if validation reports bad - // input. Chrome will clear the value. Additionally, don't - // operate on inputs that have focus, otherwise Chrome might - // strip off trailing decimal places and cause the user's - // cursor position to jump to the beginning of the input. - // - // In ReactDOMInput, we have an onBlur event that will trigger - // this function again when focus is lost. - node.setAttribute('value', '' + value); - } - } - } -}; - -module.exports = HTMLDOMPropertyConfig; - -/***/ }), -/* 126 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var DOMChildrenOperations = __webpack_require__(40); -var ReactDOMIDOperations = __webpack_require__(131); - -/** - * Abstracts away all functionality of the reconciler that requires knowledge of - * the browser context. TODO: These callers should be refactored to avoid the - * need for this injection. - */ -var ReactComponentBrowserEnvironment = { - processChildrenUpdates: ReactDOMIDOperations.dangerouslyProcessChildrenUpdates, - - replaceNodeWithMarkup: DOMChildrenOperations.dangerouslyReplaceNodeWithMarkup -}; - -module.exports = ReactComponentBrowserEnvironment; - -/***/ }), -/* 127 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var _prodInvariant = __webpack_require__(2); - -var DOMLazyTree = __webpack_require__(18); -var ExecutionEnvironment = __webpack_require__(5); - -var createNodesFromMarkup = __webpack_require__(128); -var emptyFunction = __webpack_require__(7); -var invariant = __webpack_require__(0); - -var Danger = { - /** - * Replaces a node with a string of markup at its current position within its - * parent. The markup must render into a single root node. - * - * @param {DOMElement} oldChild Child node to replace. - * @param {string} markup Markup to render in place of the child node. - * @internal - */ - dangerouslyReplaceNodeWithMarkup: function (oldChild, markup) { - !ExecutionEnvironment.canUseDOM ? process.env.NODE_ENV !== 'production' ? invariant(false, '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.') : _prodInvariant('56') : void 0; - !markup ? process.env.NODE_ENV !== 'production' ? invariant(false, 'dangerouslyReplaceNodeWithMarkup(...): Missing markup.') : _prodInvariant('57') : void 0; - !(oldChild.nodeName !== 'HTML') ? process.env.NODE_ENV !== 'production' ? invariant(false, '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().') : _prodInvariant('58') : void 0; - - if (typeof markup === 'string') { - var newChild = createNodesFromMarkup(markup, emptyFunction)[0]; - oldChild.parentNode.replaceChild(newChild, oldChild); - } else { - DOMLazyTree.replaceChildWithTree(oldChild, markup); - } - } -}; - -module.exports = Danger; - -/***/ }), -/* 128 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @typechecks - */ - -/*eslint-disable fb-www/unsafe-html*/ - -var ExecutionEnvironment = __webpack_require__(5); - -var createArrayFromMixed = __webpack_require__(129); -var getMarkupWrap = __webpack_require__(130); -var invariant = __webpack_require__(0); - -/** - * Dummy container used to render all markup. - */ -var dummyNode = ExecutionEnvironment.canUseDOM ? document.createElement('div') : null; - -/** - * Pattern used by `getNodeName`. - */ -var nodeNamePattern = /^\s*<(\w+)/; - -/** - * Extracts the `nodeName` of the first element in a string of markup. - * - * @param {string} markup String of markup. - * @return {?string} Node name of the supplied markup. - */ -function getNodeName(markup) { - var nodeNameMatch = markup.match(nodeNamePattern); - return nodeNameMatch && nodeNameMatch[1].toLowerCase(); -} - -/** - * Creates an array containing the nodes rendered from the supplied markup. The - * optionally supplied `handleScript` function will be invoked once for each - * <script> element that is rendered. If no `handleScript` function is supplied, - * an exception is thrown if any <script> elements are rendered. - * - * @param {string} markup A string of valid HTML markup. - * @param {?function} handleScript Invoked once for each rendered <script>. - * @return {array<DOMElement|DOMTextNode>} An array of rendered nodes. - */ -function createNodesFromMarkup(markup, handleScript) { - var node = dummyNode; - !!!dummyNode ? process.env.NODE_ENV !== 'production' ? invariant(false, 'createNodesFromMarkup dummy not initialized') : invariant(false) : void 0; - var nodeName = getNodeName(markup); - - var wrap = nodeName && getMarkupWrap(nodeName); - if (wrap) { - node.innerHTML = wrap[1] + markup + wrap[2]; - - var wrapDepth = wrap[0]; - while (wrapDepth--) { - node = node.lastChild; - } - } else { - node.innerHTML = markup; - } - - var scripts = node.getElementsByTagName('script'); - if (scripts.length) { - !handleScript ? process.env.NODE_ENV !== 'production' ? invariant(false, 'createNodesFromMarkup(...): Unexpected <script> element rendered.') : invariant(false) : void 0; - createArrayFromMixed(scripts).forEach(handleScript); - } - - var nodes = Array.from(node.childNodes); - while (node.lastChild) { - node.removeChild(node.lastChild); - } - return nodes; -} - -module.exports = createNodesFromMarkup; - -/***/ }), -/* 129 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @typechecks - */ - -var invariant = __webpack_require__(0); - -/** - * Convert array-like objects to arrays. - * - * This API assumes the caller knows the contents of the data type. For less - * well defined inputs use createArrayFromMixed. - * - * @param {object|function|filelist} obj - * @return {array} - */ -function toArray(obj) { - var length = obj.length; - - // Some browsers builtin objects can report typeof 'function' (e.g. NodeList - // in old versions of Safari). - !(!Array.isArray(obj) && (typeof obj === 'object' || typeof obj === 'function')) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'toArray: Array-like object expected') : invariant(false) : void 0; - - !(typeof length === 'number') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'toArray: Object needs a length property') : invariant(false) : void 0; - - !(length === 0 || length - 1 in obj) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'toArray: Object should have keys for indices') : invariant(false) : void 0; - - !(typeof obj.callee !== 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'toArray: Object can\'t be `arguments`. Use rest params ' + '(function(...args) {}) or Array.from() instead.') : invariant(false) : void 0; - - // Old IE doesn't give collections access to hasOwnProperty. Assume inputs - // without method will throw during the slice call and skip straight to the - // fallback. - if (obj.hasOwnProperty) { - try { - return Array.prototype.slice.call(obj); - } catch (e) { - // IE < 9 does not support Array#slice on collections objects - } - } - - // Fall back to copying key by key. This assumes all keys have a value, - // so will not preserve sparsely populated inputs. - var ret = Array(length); - for (var ii = 0; ii < length; ii++) { - ret[ii] = obj[ii]; - } - return ret; -} - -/** - * Perform a heuristic test to determine if an object is "array-like". - * - * A monk asked Joshu, a Zen master, "Has a dog Buddha nature?" - * Joshu replied: "Mu." - * - * This function determines if its argument has "array nature": it returns - * true if the argument is an actual array, an `arguments' object, or an - * HTMLCollection (e.g. node.childNodes or node.getElementsByTagName()). - * - * It will return false for other array-like objects like Filelist. - * - * @param {*} obj - * @return {boolean} - */ -function hasArrayNature(obj) { - return ( - // not null/false - !!obj && ( - // arrays are objects, NodeLists are functions in Safari - typeof obj == 'object' || typeof obj == 'function') && - // quacks like an array - 'length' in obj && - // not window - !('setInterval' in obj) && - // no DOM node should be considered an array-like - // a 'select' element has 'length' and 'item' properties on IE8 - typeof obj.nodeType != 'number' && ( - // a real array - Array.isArray(obj) || - // arguments - 'callee' in obj || - // HTMLCollection/NodeList - 'item' in obj) - ); -} - -/** - * Ensure that the argument is an array by wrapping it in an array if it is not. - * Creates a copy of the argument if it is already an array. - * - * This is mostly useful idiomatically: - * - * var createArrayFromMixed = require('createArrayFromMixed'); - * - * function takesOneOrMoreThings(things) { - * things = createArrayFromMixed(things); - * ... - * } - * - * This allows you to treat `things' as an array, but accept scalars in the API. - * - * If you need to convert an array-like object, like `arguments`, into an array - * use toArray instead. - * - * @param {*} obj - * @return {array} - */ -function createArrayFromMixed(obj) { - if (!hasArrayNature(obj)) { - return [obj]; - } else if (Array.isArray(obj)) { - return obj.slice(); - } else { - return toArray(obj); - } -} - -module.exports = createArrayFromMixed; - -/***/ }), -/* 130 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - -/*eslint-disable fb-www/unsafe-html */ - -var ExecutionEnvironment = __webpack_require__(5); - -var invariant = __webpack_require__(0); - -/** - * Dummy container used to detect which wraps are necessary. - */ -var dummyNode = ExecutionEnvironment.canUseDOM ? document.createElement('div') : null; - -/** - * Some browsers cannot use `innerHTML` to render certain elements standalone, - * so we wrap them, render the wrapped nodes, then extract the desired node. - * - * In IE8, certain elements cannot render alone, so wrap all elements ('*'). - */ - -var shouldWrap = {}; - -var selectWrap = [1, '<select multiple="true">', '</select>']; -var tableWrap = [1, '<table>', '</table>']; -var trWrap = [3, '<table><tbody><tr>', '</tr></tbody></table>']; - -var svgWrap = [1, '<svg xmlns="http://www.w3.org/2000/svg">', '</svg>']; - -var markupWrap = { - '*': [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': selectWrap, - 'option': selectWrap, - - 'caption': tableWrap, - 'colgroup': tableWrap, - 'tbody': tableWrap, - 'tfoot': tableWrap, - 'thead': tableWrap, - - 'td': trWrap, - 'th': trWrap -}; - -// Initialize the SVG elements since we know they'll always need to be wrapped -// consistently. If they are created inside a <div> they will be initialized in -// the wrong namespace (and will not display). -var svgElements = ['circle', 'clipPath', 'defs', 'ellipse', 'g', 'image', 'line', 'linearGradient', 'mask', 'path', 'pattern', 'polygon', 'polyline', 'radialGradient', 'rect', 'stop', 'text', 'tspan']; -svgElements.forEach(function (nodeName) { - markupWrap[nodeName] = svgWrap; - shouldWrap[nodeName] = true; -}); - -/** - * Gets the markup wrap configuration for the supplied `nodeName`. - * - * NOTE: This lazily detects which wraps are necessary for the current browser. - * - * @param {string} nodeName Lowercase `nodeName`. - * @return {?array} Markup wrap configuration, if applicable. - */ -function getMarkupWrap(nodeName) { - !!!dummyNode ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Markup wrapping node not initialized') : invariant(false) : void 0; - if (!markupWrap.hasOwnProperty(nodeName)) { - nodeName = '*'; - } - if (!shouldWrap.hasOwnProperty(nodeName)) { - if (nodeName === '*') { - dummyNode.innerHTML = '<link />'; - } else { - dummyNode.innerHTML = '<' + nodeName + '></' + nodeName + '>'; - } - shouldWrap[nodeName] = !dummyNode.firstChild; - } - return shouldWrap[nodeName] ? markupWrap[nodeName] : null; -} - -module.exports = getMarkupWrap; - -/***/ }), -/* 131 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var DOMChildrenOperations = __webpack_require__(40); -var ReactDOMComponentTree = __webpack_require__(4); - -/** - * Operations used to process updates to DOM nodes. - */ -var ReactDOMIDOperations = { - /** - * Updates a component's children by processing a series of updates. - * - * @param {array<object>} updates List of update configurations. - * @internal - */ - dangerouslyProcessChildrenUpdates: function (parentInst, updates) { - var node = ReactDOMComponentTree.getNodeFromInstance(parentInst); - DOMChildrenOperations.processUpdates(node, updates); - } -}; - -module.exports = ReactDOMIDOperations; - -/***/ }), -/* 132 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - -/* global hasOwnProperty:true */ - - - -var _prodInvariant = __webpack_require__(2), - _assign = __webpack_require__(3); - -var AutoFocusUtils = __webpack_require__(133); -var CSSPropertyOperations = __webpack_require__(134); -var DOMLazyTree = __webpack_require__(18); -var DOMNamespaces = __webpack_require__(41); -var DOMProperty = __webpack_require__(12); -var DOMPropertyOperations = __webpack_require__(71); -var EventPluginHub = __webpack_require__(21); -var EventPluginRegistry = __webpack_require__(26); -var ReactBrowserEventEmitter = __webpack_require__(31); -var ReactDOMComponentFlags = __webpack_require__(59); -var ReactDOMComponentTree = __webpack_require__(4); -var ReactDOMInput = __webpack_require__(144); -var ReactDOMOption = __webpack_require__(145); -var ReactDOMSelect = __webpack_require__(73); -var ReactDOMTextarea = __webpack_require__(146); -var ReactInstrumentation = __webpack_require__(8); -var ReactMultiChild = __webpack_require__(147); -var ReactServerRenderingTransaction = __webpack_require__(156); - -var emptyFunction = __webpack_require__(7); -var escapeTextContentForBrowser = __webpack_require__(30); -var invariant = __webpack_require__(0); -var isEventSupported = __webpack_require__(38); -var shallowEqual = __webpack_require__(45); -var inputValueTracking = __webpack_require__(65); -var validateDOMNesting = __webpack_require__(49); -var warning = __webpack_require__(1); - -var Flags = ReactDOMComponentFlags; -var deleteListener = EventPluginHub.deleteListener; -var getNode = ReactDOMComponentTree.getNodeFromInstance; -var listenTo = ReactBrowserEventEmitter.listenTo; -var registrationNameModules = EventPluginRegistry.registrationNameModules; - -// For quickly matching children type, to test if can be treated as content. -var CONTENT_TYPES = { string: true, number: true }; - -var STYLE = 'style'; -var HTML = '__html'; -var RESERVED_PROPS = { - children: null, - dangerouslySetInnerHTML: null, - suppressContentEditableWarning: null -}; - -// Node type for document fragments (Node.DOCUMENT_FRAGMENT_NODE). -var DOC_FRAGMENT_TYPE = 11; - -function getDeclarationErrorAddendum(internalInstance) { - if (internalInstance) { - var owner = internalInstance._currentElement._owner || null; - if (owner) { - var name = owner.getName(); - if (name) { - return ' This DOM node was rendered by `' + name + '`.'; - } - } - } - return ''; -} - -function friendlyStringify(obj) { - if (typeof obj === 'object') { - if (Array.isArray(obj)) { - return '[' + obj.map(friendlyStringify).join(', ') + ']'; - } else { - var pairs = []; - for (var key in obj) { - if (Object.prototype.hasOwnProperty.call(obj, key)) { - var keyEscaped = /^[a-z$_][\w$_]*$/i.test(key) ? key : JSON.stringify(key); - pairs.push(keyEscaped + ': ' + friendlyStringify(obj[key])); - } - } - return '{' + pairs.join(', ') + '}'; - } - } else if (typeof obj === 'string') { - return JSON.stringify(obj); - } else if (typeof obj === 'function') { - return '[function object]'; - } - // Differs from JSON.stringify in that undefined because undefined and that - // inf and nan don't become null - return String(obj); -} - -var styleMutationWarning = {}; - -function checkAndWarnForMutatedStyle(style1, style2, component) { - if (style1 == null || style2 == null) { - return; - } - if (shallowEqual(style1, style2)) { - return; - } - - var componentName = component._tag; - var owner = component._currentElement._owner; - var ownerName; - if (owner) { - ownerName = owner.getName(); - } - - var hash = ownerName + '|' + componentName; - - if (styleMutationWarning.hasOwnProperty(hash)) { - return; - } - - styleMutationWarning[hash] = true; - - process.env.NODE_ENV !== 'production' ? warning(false, '`%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.', componentName, owner ? 'of `' + ownerName + '`' : 'using <' + componentName + '>', friendlyStringify(style1), friendlyStringify(style2)) : void 0; -} - -/** - * @param {object} component - * @param {?object} props - */ -function assertValidProps(component, props) { - if (!props) { - return; - } - // Note the use of `==` which checks for null or undefined. - if (voidElementTags[component._tag]) { - !(props.children == null && props.dangerouslySetInnerHTML == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s is a void element tag and must neither have `children` nor use `dangerouslySetInnerHTML`.%s', component._tag, component._currentElement._owner ? ' Check the render method of ' + component._currentElement._owner.getName() + '.' : '') : _prodInvariant('137', component._tag, component._currentElement._owner ? ' Check the render method of ' + component._currentElement._owner.getName() + '.' : '') : void 0; - } - if (props.dangerouslySetInnerHTML != null) { - !(props.children == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Can only set one of `children` or `props.dangerouslySetInnerHTML`.') : _prodInvariant('60') : void 0; - !(typeof props.dangerouslySetInnerHTML === 'object' && HTML in props.dangerouslySetInnerHTML) ? process.env.NODE_ENV !== 'production' ? invariant(false, '`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. Please visit https://fb.me/react-invariant-dangerously-set-inner-html for more information.') : _prodInvariant('61') : void 0; - } - if (process.env.NODE_ENV !== 'production') { - process.env.NODE_ENV !== 'production' ? warning(props.innerHTML == null, 'Directly setting property `innerHTML` is not permitted. ' + 'For more information, lookup documentation on `dangerouslySetInnerHTML`.') : void 0; - process.env.NODE_ENV !== 'production' ? warning(props.suppressContentEditableWarning || !props.contentEditable || props.children == null, '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.') : void 0; - process.env.NODE_ENV !== 'production' ? warning(props.onFocusIn == null && props.onFocusOut == null, '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.') : void 0; - } - !(props.style == null || typeof props.style === 'object') ? process.env.NODE_ENV !== 'production' ? invariant(false, 'The `style` prop expects a mapping from style properties to values, not a string. For example, style={{marginRight: spacing + \'em\'}} when using JSX.%s', getDeclarationErrorAddendum(component)) : _prodInvariant('62', getDeclarationErrorAddendum(component)) : void 0; -} - -function enqueuePutListener(inst, registrationName, listener, transaction) { - if (transaction instanceof ReactServerRenderingTransaction) { - return; - } - if (process.env.NODE_ENV !== 'production') { - // IE8 has no API for event capturing and the `onScroll` event doesn't - // bubble. - process.env.NODE_ENV !== 'production' ? warning(registrationName !== 'onScroll' || isEventSupported('scroll', true), "This browser doesn't support the `onScroll` event") : void 0; - } - var containerInfo = inst._hostContainerInfo; - var isDocumentFragment = containerInfo._node && containerInfo._node.nodeType === DOC_FRAGMENT_TYPE; - var doc = isDocumentFragment ? containerInfo._node : containerInfo._ownerDocument; - listenTo(registrationName, doc); - transaction.getReactMountReady().enqueue(putListener, { - inst: inst, - registrationName: registrationName, - listener: listener - }); -} - -function putListener() { - var listenerToPut = this; - EventPluginHub.putListener(listenerToPut.inst, listenerToPut.registrationName, listenerToPut.listener); -} - -function inputPostMount() { - var inst = this; - ReactDOMInput.postMountWrapper(inst); -} - -function textareaPostMount() { - var inst = this; - ReactDOMTextarea.postMountWrapper(inst); -} - -function optionPostMount() { - var inst = this; - ReactDOMOption.postMountWrapper(inst); -} - -var setAndValidateContentChildDev = emptyFunction; -if (process.env.NODE_ENV !== 'production') { - setAndValidateContentChildDev = function (content) { - var hasExistingContent = this._contentDebugID != null; - var debugID = this._debugID; - // This ID represents the inlined child that has no backing instance: - var contentDebugID = -debugID; - - if (content == null) { - if (hasExistingContent) { - ReactInstrumentation.debugTool.onUnmountComponent(this._contentDebugID); - } - this._contentDebugID = null; - return; - } - - validateDOMNesting(null, String(content), this, this._ancestorInfo); - this._contentDebugID = contentDebugID; - if (hasExistingContent) { - ReactInstrumentation.debugTool.onBeforeUpdateComponent(contentDebugID, content); - ReactInstrumentation.debugTool.onUpdateComponent(contentDebugID); - } else { - ReactInstrumentation.debugTool.onBeforeMountComponent(contentDebugID, content, debugID); - ReactInstrumentation.debugTool.onMountComponent(contentDebugID); - ReactInstrumentation.debugTool.onSetChildren(debugID, [contentDebugID]); - } - }; -} - -// There are so many media events, it makes sense to just -// maintain a list rather than create a `trapBubbledEvent` for each -var mediaEvents = { - 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' -}; - -function trackInputValue() { - inputValueTracking.track(this); -} - -function trapBubbledEventsLocal() { - var inst = this; - // If a component renders to null or if another component fatals and causes - // the state of the tree to be corrupted, `node` here can be null. - !inst._rootNodeID ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Must be mounted to trap events') : _prodInvariant('63') : void 0; - var node = getNode(inst); - !node ? process.env.NODE_ENV !== 'production' ? invariant(false, 'trapBubbledEvent(...): Requires node to be rendered.') : _prodInvariant('64') : void 0; - - switch (inst._tag) { - case 'iframe': - case 'object': - inst._wrapperState.listeners = [ReactBrowserEventEmitter.trapBubbledEvent('topLoad', 'load', node)]; - break; - case 'video': - case 'audio': - inst._wrapperState.listeners = []; - // Create listener for each media event - for (var event in mediaEvents) { - if (mediaEvents.hasOwnProperty(event)) { - inst._wrapperState.listeners.push(ReactBrowserEventEmitter.trapBubbledEvent(event, mediaEvents[event], node)); - } - } - break; - case 'source': - inst._wrapperState.listeners = [ReactBrowserEventEmitter.trapBubbledEvent('topError', 'error', node)]; - break; - case 'img': - inst._wrapperState.listeners = [ReactBrowserEventEmitter.trapBubbledEvent('topError', 'error', node), ReactBrowserEventEmitter.trapBubbledEvent('topLoad', 'load', node)]; - break; - case 'form': - inst._wrapperState.listeners = [ReactBrowserEventEmitter.trapBubbledEvent('topReset', 'reset', node), ReactBrowserEventEmitter.trapBubbledEvent('topSubmit', 'submit', node)]; - break; - case 'input': - case 'select': - case 'textarea': - inst._wrapperState.listeners = [ReactBrowserEventEmitter.trapBubbledEvent('topInvalid', 'invalid', node)]; - break; - } -} - -function postUpdateSelectWrapper() { - ReactDOMSelect.postUpdateWrapper(this); -} - -// For HTML, certain tags should omit their close tag. We keep a whitelist for -// those special-case tags. - -var omittedCloseTags = { - area: true, - base: true, - br: true, - col: true, - embed: true, - hr: true, - img: true, - input: true, - keygen: true, - link: true, - meta: true, - param: true, - source: true, - track: true, - wbr: true - // NOTE: menuitem's close tag should be omitted, but that causes problems. -}; - -var newlineEatingTags = { - listing: true, - pre: true, - textarea: true -}; - -// For HTML, certain tags cannot have children. This has the same purpose as -// `omittedCloseTags` except that `menuitem` should still have its closing tag. - -var voidElementTags = _assign({ - menuitem: true -}, omittedCloseTags); - -// We accept any tag to be rendered but since this gets injected into arbitrary -// HTML, we want to make sure that it's a safe tag. -// http://www.w3.org/TR/REC-xml/#NT-Name - -var VALID_TAG_REGEX = /^[a-zA-Z][a-zA-Z:_\.\-\d]*$/; // Simplified subset -var validatedTagCache = {}; -var hasOwnProperty = {}.hasOwnProperty; - -function validateDangerousTag(tag) { - if (!hasOwnProperty.call(validatedTagCache, tag)) { - !VALID_TAG_REGEX.test(tag) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Invalid tag: %s', tag) : _prodInvariant('65', tag) : void 0; - validatedTagCache[tag] = true; - } -} - -function isCustomComponent(tagName, props) { - return tagName.indexOf('-') >= 0 || props.is != null; -} - -var globalIdCounter = 1; - -/** - * Creates a new React class that is idempotent and capable of containing other - * React components. It accepts event listeners and DOM properties that are - * valid according to `DOMProperty`. - * - * - Event listeners: `onClick`, `onMouseDown`, etc. - * - DOM properties: `className`, `name`, `title`, etc. - * - * The `style` property functions differently from the DOM API. It accepts an - * object mapping of style properties to values. - * - * @constructor ReactDOMComponent - * @extends ReactMultiChild - */ -function ReactDOMComponent(element) { - var tag = element.type; - validateDangerousTag(tag); - this._currentElement = element; - this._tag = tag.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; - if (process.env.NODE_ENV !== 'production') { - this._ancestorInfo = null; - setAndValidateContentChildDev.call(this, null); - } -} - -ReactDOMComponent.displayName = 'ReactDOMComponent'; - -ReactDOMComponent.Mixin = { - /** - * Generates root tag markup then recurses. This method has side effects and - * is not idempotent. - * - * @internal - * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction - * @param {?ReactDOMComponent} the parent component instance - * @param {?object} info about the host container - * @param {object} context - * @return {string} The computed markup. - */ - mountComponent: function (transaction, hostParent, hostContainerInfo, context) { - this._rootNodeID = globalIdCounter++; - this._domID = hostContainerInfo._idCounter++; - this._hostParent = hostParent; - this._hostContainerInfo = hostContainerInfo; - - var props = 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 - }; - transaction.getReactMountReady().enqueue(trapBubbledEventsLocal, this); - break; - case 'input': - ReactDOMInput.mountWrapper(this, props, hostParent); - props = ReactDOMInput.getHostProps(this, props); - transaction.getReactMountReady().enqueue(trackInputValue, this); - transaction.getReactMountReady().enqueue(trapBubbledEventsLocal, this); - break; - case 'option': - ReactDOMOption.mountWrapper(this, props, hostParent); - props = ReactDOMOption.getHostProps(this, props); - break; - case 'select': - ReactDOMSelect.mountWrapper(this, props, hostParent); - props = ReactDOMSelect.getHostProps(this, props); - transaction.getReactMountReady().enqueue(trapBubbledEventsLocal, this); - break; - case 'textarea': - ReactDOMTextarea.mountWrapper(this, props, hostParent); - props = ReactDOMTextarea.getHostProps(this, props); - transaction.getReactMountReady().enqueue(trackInputValue, this); - transaction.getReactMountReady().enqueue(trapBubbledEventsLocal, this); - break; - } - - assertValidProps(this, props); - - // We create tags in the namespace of their parent container, except HTML - // tags get no namespace. - var namespaceURI; - var parentTag; - if (hostParent != null) { - namespaceURI = hostParent._namespaceURI; - parentTag = hostParent._tag; - } else if (hostContainerInfo._tag) { - namespaceURI = hostContainerInfo._namespaceURI; - parentTag = hostContainerInfo._tag; - } - if (namespaceURI == null || namespaceURI === DOMNamespaces.svg && parentTag === 'foreignobject') { - namespaceURI = DOMNamespaces.html; - } - if (namespaceURI === DOMNamespaces.html) { - if (this._tag === 'svg') { - namespaceURI = DOMNamespaces.svg; - } else if (this._tag === 'math') { - namespaceURI = DOMNamespaces.mathml; - } - } - this._namespaceURI = namespaceURI; - - if (process.env.NODE_ENV !== 'production') { - var parentInfo; - if (hostParent != null) { - parentInfo = hostParent._ancestorInfo; - } else if (hostContainerInfo._tag) { - parentInfo = hostContainerInfo._ancestorInfo; - } - if (parentInfo) { - // parentInfo should always be present except for the top-level - // component when server rendering - validateDOMNesting(this._tag, null, this, parentInfo); - } - this._ancestorInfo = validateDOMNesting.updatedAncestorInfo(parentInfo, this._tag, this); - } - - var mountImage; - if (transaction.useCreateElement) { - var ownerDocument = hostContainerInfo._ownerDocument; - var el; - if (namespaceURI === DOMNamespaces.html) { - if (this._tag === 'script') { - // Create the script via .innerHTML so its "parser-inserted" flag is - // set to true and it does not execute - var div = ownerDocument.createElement('div'); - var type = this._currentElement.type; - div.innerHTML = '<' + type + '></' + type + '>'; - el = div.removeChild(div.firstChild); - } else if (props.is) { - el = ownerDocument.createElement(this._currentElement.type, props.is); - } else { - // Separate else branch instead of using `props.is || undefined` above becuase of a Firefox bug. - // See discussion in https://github.com/facebook/react/pull/6896 - // and discussion in https://bugzilla.mozilla.org/show_bug.cgi?id=1276240 - el = ownerDocument.createElement(this._currentElement.type); - } - } else { - el = ownerDocument.createElementNS(namespaceURI, this._currentElement.type); - } - ReactDOMComponentTree.precacheNode(this, el); - this._flags |= Flags.hasCachedChildNodes; - if (!this._hostParent) { - DOMPropertyOperations.setAttributeForRoot(el); - } - this._updateDOMProperties(null, props, transaction); - var lazyTree = DOMLazyTree(el); - this._createInitialChildren(transaction, props, context, lazyTree); - mountImage = lazyTree; - } else { - var tagOpen = this._createOpenTagMarkupAndPutListeners(transaction, props); - var tagContent = this._createContentMarkup(transaction, props, context); - if (!tagContent && omittedCloseTags[this._tag]) { - mountImage = tagOpen + '/>'; - } else { - mountImage = tagOpen + '>' + tagContent + '</' + this._currentElement.type + '>'; - } - } - - switch (this._tag) { - case 'input': - transaction.getReactMountReady().enqueue(inputPostMount, this); - if (props.autoFocus) { - transaction.getReactMountReady().enqueue(AutoFocusUtils.focusDOMComponent, this); - } - break; - case 'textarea': - transaction.getReactMountReady().enqueue(textareaPostMount, this); - if (props.autoFocus) { - transaction.getReactMountReady().enqueue(AutoFocusUtils.focusDOMComponent, this); - } - break; - case 'select': - if (props.autoFocus) { - transaction.getReactMountReady().enqueue(AutoFocusUtils.focusDOMComponent, this); - } - break; - case 'button': - if (props.autoFocus) { - transaction.getReactMountReady().enqueue(AutoFocusUtils.focusDOMComponent, this); - } - break; - case 'option': - transaction.getReactMountReady().enqueue(optionPostMount, this); - break; - } - - return mountImage; - }, - - /** - * Creates markup for the open tag and all attributes. - * - * This method has side effects because events get registered. - * - * Iterating over object properties is faster than iterating over arrays. - * @see http://jsperf.com/obj-vs-arr-iteration - * - * @private - * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction - * @param {object} props - * @return {string} Markup of opening tag. - */ - _createOpenTagMarkupAndPutListeners: function (transaction, props) { - var ret = '<' + this._currentElement.type; - - for (var propKey in props) { - if (!props.hasOwnProperty(propKey)) { - continue; - } - var propValue = props[propKey]; - if (propValue == null) { - continue; - } - if (registrationNameModules.hasOwnProperty(propKey)) { - if (propValue) { - enqueuePutListener(this, propKey, propValue, transaction); - } - } else { - if (propKey === STYLE) { - if (propValue) { - if (process.env.NODE_ENV !== 'production') { - // See `_updateDOMProperties`. style block - this._previousStyle = propValue; - } - propValue = this._previousStyleCopy = _assign({}, props.style); - } - propValue = CSSPropertyOperations.createMarkupForStyles(propValue, this); - } - var markup = null; - if (this._tag != null && isCustomComponent(this._tag, props)) { - if (!RESERVED_PROPS.hasOwnProperty(propKey)) { - markup = DOMPropertyOperations.createMarkupForCustomAttribute(propKey, propValue); - } - } else { - markup = DOMPropertyOperations.createMarkupForProperty(propKey, propValue); - } - if (markup) { - ret += ' ' + markup; - } - } - } - - // For static pages, no need to put React ID and checksum. Saves lots of - // bytes. - if (transaction.renderToStaticMarkup) { - return ret; - } - - if (!this._hostParent) { - ret += ' ' + DOMPropertyOperations.createMarkupForRoot(); - } - ret += ' ' + DOMPropertyOperations.createMarkupForID(this._domID); - return ret; - }, - - /** - * Creates markup for the content between the tags. - * - * @private - * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction - * @param {object} props - * @param {object} context - * @return {string} Content markup. - */ - _createContentMarkup: function (transaction, props, context) { - var ret = ''; - - // Intentional use of != to avoid catching zero/false. - var innerHTML = props.dangerouslySetInnerHTML; - if (innerHTML != null) { - if (innerHTML.__html != null) { - ret = innerHTML.__html; - } - } else { - var contentToUse = CONTENT_TYPES[typeof props.children] ? props.children : null; - var childrenToUse = contentToUse != null ? null : props.children; - if (contentToUse != null) { - // TODO: Validate that text is allowed as a child of this node - ret = escapeTextContentForBrowser(contentToUse); - if (process.env.NODE_ENV !== 'production') { - setAndValidateContentChildDev.call(this, contentToUse); - } - } else if (childrenToUse != null) { - var mountImages = this.mountChildren(childrenToUse, transaction, context); - ret = mountImages.join(''); - } - } - if (newlineEatingTags[this._tag] && ret.charAt(0) === '\n') { - // text/html ignores the first character in these tags if it's a newline - // Prefer to break application/xml over text/html (for now) by adding - // a newline specifically to get eaten by the parser. (Alternately for - // textareas, replacing "^\n" with "\r\n" doesn't get eaten, and the first - // \r is normalized out by HTMLTextAreaElement#value.) - // See: <http://www.w3.org/TR/html-polyglot/#newlines-in-textarea-and-pre> - // See: <http://www.w3.org/TR/html5/syntax.html#element-restrictions> - // See: <http://www.w3.org/TR/html5/syntax.html#newlines> - // See: Parsing of "textarea" "listing" and "pre" elements - // from <http://www.w3.org/TR/html5/syntax.html#parsing-main-inbody> - return '\n' + ret; - } else { - return ret; - } - }, - - _createInitialChildren: function (transaction, props, context, lazyTree) { - // Intentional use of != to avoid catching zero/false. - var innerHTML = props.dangerouslySetInnerHTML; - if (innerHTML != null) { - if (innerHTML.__html != null) { - DOMLazyTree.queueHTML(lazyTree, innerHTML.__html); - } - } else { - var contentToUse = CONTENT_TYPES[typeof props.children] ? props.children : null; - var childrenToUse = contentToUse != null ? null : props.children; - // TODO: Validate that text is allowed as a child of this node - if (contentToUse != null) { - // Avoid setting textContent when the text is empty. In IE11 setting - // textContent on a text area will cause the placeholder to not - // show within the textarea until it has been focused and blurred again. - // https://github.com/facebook/react/issues/6731#issuecomment-254874553 - if (contentToUse !== '') { - if (process.env.NODE_ENV !== 'production') { - setAndValidateContentChildDev.call(this, contentToUse); - } - DOMLazyTree.queueText(lazyTree, contentToUse); - } - } else if (childrenToUse != null) { - var mountImages = this.mountChildren(childrenToUse, transaction, context); - for (var i = 0; i < mountImages.length; i++) { - DOMLazyTree.queueChild(lazyTree, mountImages[i]); - } - } - } - }, - - /** - * Receives a next element and updates the component. - * - * @internal - * @param {ReactElement} nextElement - * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction - * @param {object} context - */ - receiveComponent: function (nextElement, transaction, context) { - var prevElement = this._currentElement; - this._currentElement = nextElement; - this.updateComponent(transaction, prevElement, nextElement, context); - }, - - /** - * Updates a DOM component after it has already been allocated and - * attached to the DOM. Reconciles the root DOM node, then recurses. - * - * @param {ReactReconcileTransaction} transaction - * @param {ReactElement} prevElement - * @param {ReactElement} nextElement - * @internal - * @overridable - */ - updateComponent: function (transaction, prevElement, nextElement, context) { - var lastProps = prevElement.props; - var nextProps = this._currentElement.props; - - switch (this._tag) { - case 'input': - lastProps = ReactDOMInput.getHostProps(this, lastProps); - nextProps = ReactDOMInput.getHostProps(this, nextProps); - break; - case 'option': - lastProps = ReactDOMOption.getHostProps(this, lastProps); - nextProps = ReactDOMOption.getHostProps(this, nextProps); - break; - case 'select': - lastProps = ReactDOMSelect.getHostProps(this, lastProps); - nextProps = ReactDOMSelect.getHostProps(this, nextProps); - break; - case 'textarea': - lastProps = ReactDOMTextarea.getHostProps(this, lastProps); - nextProps = ReactDOMTextarea.getHostProps(this, nextProps); - break; - } - - assertValidProps(this, nextProps); - this._updateDOMProperties(lastProps, nextProps, transaction); - this._updateDOMChildren(lastProps, nextProps, transaction, context); - - switch (this._tag) { - case 'input': - // Update the wrapper around inputs *after* updating props. This has to - // happen after `_updateDOMProperties`. Otherwise HTML5 input validations - // raise warnings and prevent the new value from being assigned. - ReactDOMInput.updateWrapper(this); - - // We also check that we haven't missed a value update, such as a - // Radio group shifting the checked value to another named radio input. - inputValueTracking.updateValueIfChanged(this); - break; - case 'textarea': - ReactDOMTextarea.updateWrapper(this); - break; - case 'select': - // <select> value update needs to occur after <option> children - // reconciliation - transaction.getReactMountReady().enqueue(postUpdateSelectWrapper, this); - break; - } - }, - - /** - * Reconciles the properties by detecting differences in property values and - * updating the DOM as necessary. This function is probably the single most - * critical path for performance optimization. - * - * TODO: Benchmark whether checking for changed values in memory actually - * improves performance (especially statically positioned elements). - * TODO: Benchmark the effects of putting this at the top since 99% of props - * do not change for a given reconciliation. - * TODO: Benchmark areas that can be improved with caching. - * - * @private - * @param {object} lastProps - * @param {object} nextProps - * @param {?DOMElement} node - */ - _updateDOMProperties: function (lastProps, nextProps, transaction) { - var propKey; - var styleName; - var styleUpdates; - for (propKey in lastProps) { - if (nextProps.hasOwnProperty(propKey) || !lastProps.hasOwnProperty(propKey) || lastProps[propKey] == null) { - continue; - } - if (propKey === STYLE) { - var lastStyle = this._previousStyleCopy; - for (styleName in lastStyle) { - if (lastStyle.hasOwnProperty(styleName)) { - styleUpdates = styleUpdates || {}; - styleUpdates[styleName] = ''; - } - } - this._previousStyleCopy = null; - } else if (registrationNameModules.hasOwnProperty(propKey)) { - if (lastProps[propKey]) { - // Only call deleteListener if there was a listener previously or - // else willDeleteListener gets called when there wasn't actually a - // listener (e.g., onClick={null}) - deleteListener(this, propKey); - } - } else if (isCustomComponent(this._tag, lastProps)) { - if (!RESERVED_PROPS.hasOwnProperty(propKey)) { - DOMPropertyOperations.deleteValueForAttribute(getNode(this), propKey); - } - } else if (DOMProperty.properties[propKey] || DOMProperty.isCustomAttribute(propKey)) { - DOMPropertyOperations.deleteValueForProperty(getNode(this), propKey); - } - } - for (propKey in nextProps) { - var nextProp = nextProps[propKey]; - var lastProp = propKey === STYLE ? this._previousStyleCopy : lastProps != null ? lastProps[propKey] : undefined; - if (!nextProps.hasOwnProperty(propKey) || nextProp === lastProp || nextProp == null && lastProp == null) { - continue; - } - if (propKey === STYLE) { - if (nextProp) { - if (process.env.NODE_ENV !== 'production') { - checkAndWarnForMutatedStyle(this._previousStyleCopy, this._previousStyle, this); - this._previousStyle = nextProp; - } - nextProp = this._previousStyleCopy = _assign({}, nextProp); - } else { - this._previousStyleCopy = null; - } - if (lastProp) { - // Unset styles on `lastProp` but not on `nextProp`. - for (styleName in lastProp) { - if (lastProp.hasOwnProperty(styleName) && (!nextProp || !nextProp.hasOwnProperty(styleName))) { - styleUpdates = styleUpdates || {}; - styleUpdates[styleName] = ''; - } - } - // Update styles that changed since `lastProp`. - for (styleName in nextProp) { - if (nextProp.hasOwnProperty(styleName) && lastProp[styleName] !== nextProp[styleName]) { - styleUpdates = styleUpdates || {}; - styleUpdates[styleName] = nextProp[styleName]; - } - } - } else { - // Relies on `updateStylesByID` not mutating `styleUpdates`. - styleUpdates = nextProp; - } - } else if (registrationNameModules.hasOwnProperty(propKey)) { - if (nextProp) { - enqueuePutListener(this, propKey, nextProp, transaction); - } else if (lastProp) { - deleteListener(this, propKey); - } - } else if (isCustomComponent(this._tag, nextProps)) { - if (!RESERVED_PROPS.hasOwnProperty(propKey)) { - DOMPropertyOperations.setValueForAttribute(getNode(this), propKey, nextProp); - } - } else if (DOMProperty.properties[propKey] || DOMProperty.isCustomAttribute(propKey)) { - var node = getNode(this); - // If we're updating to null or undefined, we should remove the property - // from the DOM node instead of inadvertently setting to a string. This - // brings us in line with the same behavior we have on initial render. - if (nextProp != null) { - DOMPropertyOperations.setValueForProperty(node, propKey, nextProp); - } else { - DOMPropertyOperations.deleteValueForProperty(node, propKey); - } - } - } - if (styleUpdates) { - CSSPropertyOperations.setValueForStyles(getNode(this), styleUpdates, this); - } - }, - - /** - * Reconciles the children with the various properties that affect the - * children content. - * - * @param {object} lastProps - * @param {object} nextProps - * @param {ReactReconcileTransaction} transaction - * @param {object} context - */ - _updateDOMChildren: function (lastProps, nextProps, transaction, context) { - var lastContent = CONTENT_TYPES[typeof lastProps.children] ? lastProps.children : null; - var nextContent = CONTENT_TYPES[typeof nextProps.children] ? nextProps.children : null; - - var lastHtml = lastProps.dangerouslySetInnerHTML && lastProps.dangerouslySetInnerHTML.__html; - var nextHtml = nextProps.dangerouslySetInnerHTML && nextProps.dangerouslySetInnerHTML.__html; - - // Note the use of `!=` which checks for null or undefined. - var lastChildren = lastContent != null ? null : lastProps.children; - var nextChildren = nextContent != null ? null : nextProps.children; - - // If we're switching from children to content/html or vice versa, remove - // the old content - var lastHasContentOrHtml = lastContent != null || lastHtml != null; - var nextHasContentOrHtml = nextContent != null || nextHtml != null; - if (lastChildren != null && nextChildren == null) { - this.updateChildren(null, transaction, context); - } else if (lastHasContentOrHtml && !nextHasContentOrHtml) { - this.updateTextContent(''); - if (process.env.NODE_ENV !== 'production') { - ReactInstrumentation.debugTool.onSetChildren(this._debugID, []); - } - } - - if (nextContent != null) { - if (lastContent !== nextContent) { - this.updateTextContent('' + nextContent); - if (process.env.NODE_ENV !== 'production') { - setAndValidateContentChildDev.call(this, nextContent); - } - } - } else if (nextHtml != null) { - if (lastHtml !== nextHtml) { - this.updateMarkup('' + nextHtml); - } - if (process.env.NODE_ENV !== 'production') { - ReactInstrumentation.debugTool.onSetChildren(this._debugID, []); - } - } else if (nextChildren != null) { - if (process.env.NODE_ENV !== 'production') { - setAndValidateContentChildDev.call(this, null); - } - - this.updateChildren(nextChildren, transaction, context); - } - }, - - getHostNode: function () { - return getNode(this); - }, - - /** - * Destroys all event registrations for this instance. Does not remove from - * the DOM. That must be done by the parent. - * - * @internal - */ - unmountComponent: function (safely) { - switch (this._tag) { - case 'audio': - case 'form': - case 'iframe': - case 'img': - case 'link': - case 'object': - case 'source': - case 'video': - var listeners = this._wrapperState.listeners; - if (listeners) { - for (var i = 0; i < listeners.length; i++) { - listeners[i].remove(); - } - } - break; - case 'input': - case 'textarea': - inputValueTracking.stopTracking(this); - break; - case 'html': - case 'head': - case 'body': - /** - * Components like <html> <head> and <body> can't be removed or added - * easily in a cross-browser way, however it's valuable to be able to - * take advantage of React's reconciliation for styling and <title> - * management. So we just document it and throw in dangerous cases. - */ - true ? process.env.NODE_ENV !== 'production' ? invariant(false, '<%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) : _prodInvariant('66', this._tag) : void 0; - break; - } - - this.unmountChildren(safely); - ReactDOMComponentTree.uncacheNode(this); - EventPluginHub.deleteAllListeners(this); - this._rootNodeID = 0; - this._domID = 0; - this._wrapperState = null; - - if (process.env.NODE_ENV !== 'production') { - setAndValidateContentChildDev.call(this, null); - } - }, - - getPublicInstance: function () { - return getNode(this); - } -}; - -_assign(ReactDOMComponent.prototype, ReactDOMComponent.Mixin, ReactMultiChild.Mixin); - -module.exports = ReactDOMComponent; - -/***/ }), -/* 133 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var ReactDOMComponentTree = __webpack_require__(4); - -var focusNode = __webpack_require__(69); - -var AutoFocusUtils = { - focusDOMComponent: function () { - focusNode(ReactDOMComponentTree.getNodeFromInstance(this)); - } -}; - -module.exports = AutoFocusUtils; - -/***/ }), -/* 134 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var CSSProperty = __webpack_require__(70); -var ExecutionEnvironment = __webpack_require__(5); -var ReactInstrumentation = __webpack_require__(8); - -var camelizeStyleName = __webpack_require__(135); -var dangerousStyleValue = __webpack_require__(137); -var hyphenateStyleName = __webpack_require__(138); -var memoizeStringOnly = __webpack_require__(140); -var warning = __webpack_require__(1); - -var processStyleName = memoizeStringOnly(function (styleName) { - return hyphenateStyleName(styleName); -}); - -var hasShorthandPropertyBug = false; -var styleFloatAccessor = 'cssFloat'; -if (ExecutionEnvironment.canUseDOM) { - var tempStyle = document.createElement('div').style; - try { - // IE8 throws "Invalid argument." if resetting shorthand style properties. - tempStyle.font = ''; - } catch (e) { - hasShorthandPropertyBug = true; - } - // IE8 only supports accessing cssFloat (standard) as styleFloat - if (document.documentElement.style.cssFloat === undefined) { - styleFloatAccessor = 'styleFloat'; - } -} - -if (process.env.NODE_ENV !== 'production') { - // 'msTransform' is correct, but the other prefixes should be capitalized - var badVendoredStyleNamePattern = /^(?:webkit|moz|o)[A-Z]/; - - // style values shouldn't contain a semicolon - var badStyleValueWithSemicolonPattern = /;\s*$/; - - var warnedStyleNames = {}; - var warnedStyleValues = {}; - var warnedForNaNValue = false; - - var warnHyphenatedStyleName = function (name, owner) { - if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) { - return; - } - - warnedStyleNames[name] = true; - process.env.NODE_ENV !== 'production' ? warning(false, 'Unsupported style property %s. Did you mean %s?%s', name, camelizeStyleName(name), checkRenderMessage(owner)) : void 0; - }; - - var warnBadVendoredStyleName = function (name, owner) { - if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) { - return; - } - - warnedStyleNames[name] = true; - process.env.NODE_ENV !== 'production' ? warning(false, 'Unsupported vendor-prefixed style property %s. Did you mean %s?%s', name, name.charAt(0).toUpperCase() + name.slice(1), checkRenderMessage(owner)) : void 0; - }; - - var warnStyleValueWithSemicolon = function (name, value, owner) { - if (warnedStyleValues.hasOwnProperty(value) && warnedStyleValues[value]) { - return; - } - - warnedStyleValues[value] = true; - process.env.NODE_ENV !== 'production' ? warning(false, "Style property values shouldn't contain a semicolon.%s " + 'Try "%s: %s" instead.', checkRenderMessage(owner), name, value.replace(badStyleValueWithSemicolonPattern, '')) : void 0; - }; - - var warnStyleValueIsNaN = function (name, value, owner) { - if (warnedForNaNValue) { - return; - } - - warnedForNaNValue = true; - process.env.NODE_ENV !== 'production' ? warning(false, '`NaN` is an invalid value for the `%s` css style property.%s', name, checkRenderMessage(owner)) : void 0; - }; - - var checkRenderMessage = function (owner) { - if (owner) { - var name = owner.getName(); - if (name) { - return ' Check the render method of `' + name + '`.'; - } - } - return ''; - }; - - /** - * @param {string} name - * @param {*} value - * @param {ReactDOMComponent} component - */ - var warnValidStyle = function (name, value, component) { - var owner; - if (component) { - owner = component._currentElement._owner; - } - if (name.indexOf('-') > -1) { - warnHyphenatedStyleName(name, owner); - } else if (badVendoredStyleNamePattern.test(name)) { - warnBadVendoredStyleName(name, owner); - } else if (badStyleValueWithSemicolonPattern.test(value)) { - warnStyleValueWithSemicolon(name, value, owner); - } - - if (typeof value === 'number' && isNaN(value)) { - warnStyleValueIsNaN(name, value, owner); - } - }; -} - -/** - * Operations for dealing with CSS properties. - */ -var CSSPropertyOperations = { - /** - * Serializes a mapping of style properties for use as inline styles: - * - * > createMarkupForStyles({width: '200px', height: 0}) - * "width:200px;height:0;" - * - * Undefined values are ignored so that declarative programming is easier. - * The result should be HTML-escaped before insertion into the DOM. - * - * @param {object} styles - * @param {ReactDOMComponent} component - * @return {?string} - */ - createMarkupForStyles: function (styles, component) { - var serialized = ''; - for (var styleName in styles) { - if (!styles.hasOwnProperty(styleName)) { - continue; - } - var isCustomProperty = styleName.indexOf('--') === 0; - var styleValue = styles[styleName]; - if (process.env.NODE_ENV !== 'production') { - if (!isCustomProperty) { - warnValidStyle(styleName, styleValue, component); - } - } - if (styleValue != null) { - serialized += processStyleName(styleName) + ':'; - serialized += dangerousStyleValue(styleName, styleValue, component, isCustomProperty) + ';'; - } - } - return serialized || null; - }, - - /** - * Sets the value for multiple styles on a node. If a value is specified as - * '' (empty string), the corresponding style property will be unset. - * - * @param {DOMElement} node - * @param {object} styles - * @param {ReactDOMComponent} component - */ - setValueForStyles: function (node, styles, component) { - if (process.env.NODE_ENV !== 'production') { - ReactInstrumentation.debugTool.onHostOperation({ - instanceID: component._debugID, - type: 'update styles', - payload: styles - }); - } - - var style = node.style; - for (var styleName in styles) { - if (!styles.hasOwnProperty(styleName)) { - continue; - } - var isCustomProperty = styleName.indexOf('--') === 0; - if (process.env.NODE_ENV !== 'production') { - if (!isCustomProperty) { - warnValidStyle(styleName, styles[styleName], component); - } - } - var styleValue = dangerousStyleValue(styleName, styles[styleName], component, isCustomProperty); - if (styleName === 'float' || styleName === 'cssFloat') { - styleName = styleFloatAccessor; - } - if (isCustomProperty) { - style.setProperty(styleName, styleValue); - } else if (styleValue) { - style[styleName] = styleValue; - } else { - var expansion = hasShorthandPropertyBug && CSSProperty.shorthandPropertyExpansions[styleName]; - if (expansion) { - // Shorthand property that IE8 won't like unsetting, so unset each - // component to placate it - for (var individualStyleName in expansion) { - style[individualStyleName] = ''; - } - } else { - style[styleName] = ''; - } - } - } - } -}; - -module.exports = CSSPropertyOperations; - -/***/ }), -/* 135 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @typechecks - */ - - - -var camelize = __webpack_require__(136); - -var msPattern = /^-ms-/; - -/** - * Camelcases a hyphenated CSS property name, for example: - * - * > camelizeStyleName('background-color') - * < "backgroundColor" - * > camelizeStyleName('-moz-transition') - * < "MozTransition" - * > camelizeStyleName('-ms-transition') - * < "msTransition" - * - * As Andi Smith suggests - * (http://www.andismith.com/blog/2012/02/modernizr-prefixed/), an `-ms` prefix - * is converted to lowercase `ms`. - * - * @param {string} string - * @return {string} - */ -function camelizeStyleName(string) { - return camelize(string.replace(msPattern, 'ms-')); -} - -module.exports = camelizeStyleName; - -/***/ }), -/* 136 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @typechecks - */ - -var _hyphenPattern = /-(.)/g; - -/** - * Camelcases a hyphenated string, for example: - * - * > camelize('background-color') - * < "backgroundColor" - * - * @param {string} string - * @return {string} - */ -function camelize(string) { - return string.replace(_hyphenPattern, function (_, character) { - return character.toUpperCase(); - }); -} - -module.exports = camelize; - -/***/ }), -/* 137 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var CSSProperty = __webpack_require__(70); -var warning = __webpack_require__(1); - -var isUnitlessNumber = CSSProperty.isUnitlessNumber; -var styleWarnings = {}; - -/** - * Convert a value into the proper css writable value. The style name `name` - * should be logical (no hyphens), as specified - * in `CSSProperty.isUnitlessNumber`. - * - * @param {string} name CSS property name such as `topMargin`. - * @param {*} value CSS property value such as `10px`. - * @param {ReactDOMComponent} component - * @return {string} Normalized style value with dimensions applied. - */ -function dangerousStyleValue(name, value, component, isCustomProperty) { - // Note that we've removed escapeTextForBrowser() calls here since the - // whole string will be escaped when the attribute is injected into - // the markup. If you provide unsafe user data here they can inject - // arbitrary CSS which may be problematic (I couldn't repro this): - // https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet - // http://www.thespanner.co.uk/2007/11/26/ultimate-xss-css-injection/ - // This is not an XSS hole but instead a potential CSS injection issue - // which has lead to a greater discussion about how we're going to - // trust URLs moving forward. See #2115901 - - var isEmpty = value == null || typeof value === 'boolean' || value === ''; - if (isEmpty) { - return ''; - } - - var isNonNumeric = isNaN(value); - if (isCustomProperty || isNonNumeric || value === 0 || isUnitlessNumber.hasOwnProperty(name) && isUnitlessNumber[name]) { - return '' + value; // cast to string - } - - if (typeof value === 'string') { - if (process.env.NODE_ENV !== 'production') { - // Allow '0' to pass through without warning. 0 is already special and - // doesn't require units, so we don't need to warn about it. - if (component && value !== '0') { - var owner = component._currentElement._owner; - var ownerName = owner ? owner.getName() : null; - if (ownerName && !styleWarnings[ownerName]) { - styleWarnings[ownerName] = {}; - } - var warned = false; - if (ownerName) { - var warnings = styleWarnings[ownerName]; - warned = warnings[name]; - if (!warned) { - warnings[name] = true; - } - } - if (!warned) { - process.env.NODE_ENV !== 'production' ? warning(false, '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.', component._currentElement.type, ownerName || 'unknown', name, value) : void 0; - } - } - } - value = value.trim(); - } - return value + 'px'; -} - -module.exports = dangerousStyleValue; - -/***/ }), -/* 138 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @typechecks - */ - - - -var hyphenate = __webpack_require__(139); - -var msPattern = /^ms-/; - -/** - * Hyphenates a camelcased CSS property name, for example: - * - * > hyphenateStyleName('backgroundColor') - * < "background-color" - * > hyphenateStyleName('MozTransition') - * < "-moz-transition" - * > hyphenateStyleName('msTransition') - * < "-ms-transition" - * - * As Modernizr suggests (http://modernizr.com/docs/#prefixed), an `ms` prefix - * is converted to `-ms-`. - * - * @param {string} string - * @return {string} - */ -function hyphenateStyleName(string) { - return hyphenate(string).replace(msPattern, '-ms-'); -} - -module.exports = hyphenateStyleName; - -/***/ }), -/* 139 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @typechecks - */ - -var _uppercasePattern = /([A-Z])/g; - -/** - * Hyphenates a camelcased string, for example: - * - * > hyphenate('backgroundColor') - * < "background-color" - * - * For CSS style names, use `hyphenateStyleName` instead which works properly - * with all vendor prefixes, including `ms`. - * - * @param {string} string - * @return {string} - */ -function hyphenate(string) { - return string.replace(_uppercasePattern, '-$1').toLowerCase(); -} - -module.exports = hyphenate; - -/***/ }), -/* 140 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * - * @typechecks static-only - */ - - - -/** - * Memoizes the return value of a function that accepts one string argument. - */ - -function memoizeStringOnly(callback) { - var cache = {}; - return function (string) { - if (!cache.hasOwnProperty(string)) { - cache[string] = callback.call(this, string); - } - return cache[string]; - }; -} - -module.exports = memoizeStringOnly; - -/***/ }), -/* 141 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var escapeTextContentForBrowser = __webpack_require__(30); - -/** - * Escapes attribute value to prevent scripting attacks. - * - * @param {*} value Value to escape. - * @return {string} An escaped string. - */ -function quoteAttributeValueForBrowser(value) { - return '"' + escapeTextContentForBrowser(value) + '"'; -} - -module.exports = quoteAttributeValueForBrowser; - -/***/ }), -/* 142 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var EventPluginHub = __webpack_require__(21); - -function runEventQueueInBatch(events) { - EventPluginHub.enqueueEvents(events); - EventPluginHub.processEventQueue(false); -} - -var ReactEventEmitterMixin = { - /** - * Streams a fired top-level event to `EventPluginHub` where plugins have the - * opportunity to create `ReactEvent`s to be dispatched. - */ - handleTopLevel: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) { - var events = EventPluginHub.extractEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget); - runEventQueueInBatch(events); - } -}; - -module.exports = ReactEventEmitterMixin; - -/***/ }), -/* 143 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var ExecutionEnvironment = __webpack_require__(5); - -/** - * Generate a mapping of standard vendor prefixes using the defined style property and event name. - * - * @param {string} styleProp - * @param {string} eventName - * @returns {object} - */ -function makePrefixMap(styleProp, eventName) { - var prefixes = {}; - - prefixes[styleProp.toLowerCase()] = eventName.toLowerCase(); - prefixes['Webkit' + styleProp] = 'webkit' + eventName; - prefixes['Moz' + styleProp] = 'moz' + eventName; - prefixes['ms' + styleProp] = 'MS' + eventName; - prefixes['O' + styleProp] = 'o' + eventName.toLowerCase(); - - return prefixes; -} - -/** - * A list of event names to a configurable list of vendor prefixes. - */ -var vendorPrefixes = { - animationend: makePrefixMap('Animation', 'AnimationEnd'), - animationiteration: makePrefixMap('Animation', 'AnimationIteration'), - animationstart: makePrefixMap('Animation', 'AnimationStart'), - transitionend: makePrefixMap('Transition', 'TransitionEnd') -}; - -/** - * Event names that have already been detected and prefixed (if applicable). - */ -var prefixedEventNames = {}; - -/** - * Element to check for prefixes on. - */ -var style = {}; - -/** - * Bootstrap if a DOM exists. - */ -if (ExecutionEnvironment.canUseDOM) { - style = document.createElement('div').style; - - // On some platforms, in particular some releases of Android 4.x, - // the un-prefixed "animation" and "transition" properties are defined on the - // style object but the events that fire will still be prefixed, so we need - // to check if the un-prefixed events are usable, and if not remove them from the map. - if (!('AnimationEvent' in window)) { - delete vendorPrefixes.animationend.animation; - delete vendorPrefixes.animationiteration.animation; - delete vendorPrefixes.animationstart.animation; - } - - // Same as above - if (!('TransitionEvent' in window)) { - delete vendorPrefixes.transitionend.transition; - } -} - -/** - * Attempts to determine the correct vendor prefixed event name. - * - * @param {string} eventName - * @returns {string} - */ -function getVendorPrefixedEventName(eventName) { - if (prefixedEventNames[eventName]) { - return prefixedEventNames[eventName]; - } else if (!vendorPrefixes[eventName]) { - return eventName; - } - - var prefixMap = vendorPrefixes[eventName]; - - for (var styleProp in prefixMap) { - if (prefixMap.hasOwnProperty(styleProp) && styleProp in style) { - return prefixedEventNames[eventName] = prefixMap[styleProp]; - } - } - - return ''; -} - -module.exports = getVendorPrefixedEventName; - -/***/ }), -/* 144 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var _prodInvariant = __webpack_require__(2), - _assign = __webpack_require__(3); - -var DOMPropertyOperations = __webpack_require__(71); -var LinkedValueUtils = __webpack_require__(43); -var ReactDOMComponentTree = __webpack_require__(4); -var ReactUpdates = __webpack_require__(10); - -var invariant = __webpack_require__(0); -var warning = __webpack_require__(1); - -var didWarnValueLink = false; -var didWarnCheckedLink = false; -var didWarnValueDefaultValue = false; -var didWarnCheckedDefaultChecked = false; -var didWarnControlledToUncontrolled = false; -var didWarnUncontrolledToControlled = false; - -function forceUpdateIfMounted() { - if (this._rootNodeID) { - // DOM component is still mounted; update - ReactDOMInput.updateWrapper(this); - } -} - -function isControlled(props) { - var usesChecked = props.type === 'checkbox' || props.type === 'radio'; - return usesChecked ? props.checked != null : props.value != null; -} - -/** - * Implements an <input> host component that allows setting these optional - * props: `checked`, `value`, `defaultChecked`, and `defaultValue`. - * - * If `checked` or `value` are not supplied (or null/undefined), user actions - * that affect the checked state or value will trigger updates to the element. - * - * If they are supplied (and not null/undefined), the rendered element will not - * trigger updates to the element. Instead, the props must change in order for - * the rendered element to be updated. - * - * The rendered element will be initialized as unchecked (or `defaultChecked`) - * with an empty value (or `defaultValue`). - * - * @see http://www.w3.org/TR/2012/WD-html5-20121025/the-input-element.html - */ -var ReactDOMInput = { - getHostProps: function (inst, props) { - var value = LinkedValueUtils.getValue(props); - var checked = LinkedValueUtils.getChecked(props); - - var hostProps = _assign({ - // Make sure we set .type before any other properties (setting .value - // before .type means .value is lost in IE11 and below) - type: undefined, - // Make sure we set .step before .value (setting .value before .step - // means .value is rounded on mount, based upon step precision) - step: undefined, - // Make sure we set .min & .max before .value (to ensure proper order - // in corner cases such as min or max deriving from value, e.g. Issue #7170) - min: undefined, - max: undefined - }, props, { - defaultChecked: undefined, - defaultValue: undefined, - value: value != null ? value : inst._wrapperState.initialValue, - checked: checked != null ? checked : inst._wrapperState.initialChecked, - onChange: inst._wrapperState.onChange - }); - - return hostProps; - }, - - mountWrapper: function (inst, props) { - if (process.env.NODE_ENV !== 'production') { - LinkedValueUtils.checkPropTypes('input', props, inst._currentElement._owner); - - var owner = inst._currentElement._owner; - - if (props.valueLink !== undefined && !didWarnValueLink) { - process.env.NODE_ENV !== 'production' ? warning(false, '`valueLink` prop on `input` is deprecated; set `value` and `onChange` instead.') : void 0; - didWarnValueLink = true; - } - if (props.checkedLink !== undefined && !didWarnCheckedLink) { - process.env.NODE_ENV !== 'production' ? warning(false, '`checkedLink` prop on `input` is deprecated; set `value` and `onChange` instead.') : void 0; - didWarnCheckedLink = true; - } - if (props.checked !== undefined && props.defaultChecked !== undefined && !didWarnCheckedDefaultChecked) { - process.env.NODE_ENV !== 'production' ? warning(false, '%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', owner && owner.getName() || 'A component', props.type) : void 0; - didWarnCheckedDefaultChecked = true; - } - if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValueDefaultValue) { - process.env.NODE_ENV !== 'production' ? warning(false, '%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', owner && owner.getName() || 'A component', props.type) : void 0; - didWarnValueDefaultValue = true; - } - } - - var defaultValue = props.defaultValue; - inst._wrapperState = { - initialChecked: props.checked != null ? props.checked : props.defaultChecked, - initialValue: props.value != null ? props.value : defaultValue, - listeners: null, - onChange: _handleChange.bind(inst), - controlled: isControlled(props) - }; - }, - - updateWrapper: function (inst) { - var props = inst._currentElement.props; - - if (process.env.NODE_ENV !== 'production') { - var controlled = isControlled(props); - var owner = inst._currentElement._owner; - - if (!inst._wrapperState.controlled && controlled && !didWarnUncontrolledToControlled) { - process.env.NODE_ENV !== 'production' ? warning(false, '%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', owner && owner.getName() || 'A component', props.type) : void 0; - didWarnUncontrolledToControlled = true; - } - if (inst._wrapperState.controlled && !controlled && !didWarnControlledToUncontrolled) { - process.env.NODE_ENV !== 'production' ? warning(false, '%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', owner && owner.getName() || 'A component', props.type) : void 0; - didWarnControlledToUncontrolled = true; - } - } - - // TODO: Shouldn't this be getChecked(props)? - var checked = props.checked; - if (checked != null) { - DOMPropertyOperations.setValueForProperty(ReactDOMComponentTree.getNodeFromInstance(inst), 'checked', checked || false); - } - - var node = ReactDOMComponentTree.getNodeFromInstance(inst); - var value = LinkedValueUtils.getValue(props); - if (value != null) { - if (value === 0 && node.value === '') { - node.value = '0'; - // Note: IE9 reports a number inputs as 'text', so check props instead. - } else if (props.type === 'number') { - // Simulate `input.valueAsNumber`. IE9 does not support it - var valueAsNumber = parseFloat(node.value, 10) || 0; - - if ( - // eslint-disable-next-line - value != valueAsNumber || - // eslint-disable-next-line - value == valueAsNumber && node.value != value) { - // Cast `value` to a string to ensure the value is set correctly. While - // browsers typically do this as necessary, jsdom doesn't. - node.value = '' + value; - } - } else if (node.value !== '' + value) { - // Cast `value` to a string to ensure the value is set correctly. While - // browsers typically do this as necessary, jsdom doesn't. - node.value = '' + value; - } - } else { - if (props.value == null && props.defaultValue != null) { - // In Chrome, assigning defaultValue to certain input types triggers input validation. - // For number inputs, the display value loses trailing decimal points. For email inputs, - // Chrome raises "The specified value <x> is not a valid email address". - // - // Here we check to see if the defaultValue has actually changed, avoiding these problems - // when the user is inputting text - // - // https://github.com/facebook/react/issues/7253 - if (node.defaultValue !== '' + props.defaultValue) { - node.defaultValue = '' + props.defaultValue; - } - } - if (props.checked == null && props.defaultChecked != null) { - node.defaultChecked = !!props.defaultChecked; - } - } - }, - - postMountWrapper: function (inst) { - var props = inst._currentElement.props; - - // This is in postMount because we need access to the DOM node, which is not - // available until after the component has mounted. - var node = ReactDOMComponentTree.getNodeFromInstance(inst); - - // Detach value from defaultValue. We won't do anything if we're working on - // submit or reset inputs as those values & defaultValues are linked. They - // are not resetable nodes so this operation doesn't matter and actually - // removes browser-default values (eg "Submit Query") when no value is - // provided. - - switch (props.type) { - case 'submit': - case 'reset': - break; - case 'color': - case 'date': - case 'datetime': - case 'datetime-local': - case 'month': - case 'time': - case 'week': - // This fixes the no-show issue on iOS Safari and Android Chrome: - // https://github.com/facebook/react/issues/7233 - node.value = ''; - node.value = node.defaultValue; - break; - default: - node.value = node.value; - break; - } - - // Normally, we'd just do `node.checked = node.checked` upon initial mount, less this bug - // this is needed to work around a chrome bug where setting defaultChecked - // will sometimes influence the value of checked (even after detachment). - // Reference: https://bugs.chromium.org/p/chromium/issues/detail?id=608416 - // We need to temporarily unset name to avoid disrupting radio button groups. - var name = node.name; - if (name !== '') { - node.name = ''; - } - node.defaultChecked = !node.defaultChecked; - node.defaultChecked = !node.defaultChecked; - if (name !== '') { - node.name = name; - } - } -}; - -function _handleChange(event) { - var props = this._currentElement.props; - - var returnValue = LinkedValueUtils.executeOnChange(props, event); - - // Here we use asap to wait until all updates have propagated, which - // is important when using controlled components within layers: - // https://github.com/facebook/react/issues/1698 - ReactUpdates.asap(forceUpdateIfMounted, this); - - var name = props.name; - if (props.type === 'radio' && name != null) { - var rootNode = ReactDOMComponentTree.getNodeFromInstance(this); - var queryRoot = rootNode; - - while (queryRoot.parentNode) { - queryRoot = queryRoot.parentNode; - } - - // If `rootNode.form` was non-null, then we could try `form.elements`, - // but that sometimes behaves strangely in IE8. We could also try using - // `form.getElementsByName`, but that will only return direct children - // and won't include inputs that use the HTML5 `form=` attribute. Since - // the input might not even be in a form, let's just use the global - // `querySelectorAll` to ensure we don't miss anything. - var group = queryRoot.querySelectorAll('input[name=' + JSON.stringify('' + name) + '][type="radio"]'); - - for (var i = 0; i < group.length; i++) { - var otherNode = group[i]; - if (otherNode === rootNode || otherNode.form !== rootNode.form) { - continue; - } - // This will throw if radio buttons rendered by different copies of React - // and the same name are rendered into the same form (same as #1939). - // That's probably okay; we don't support it just as we don't support - // mixing React radio buttons with non-React ones. - var otherInstance = ReactDOMComponentTree.getInstanceFromNode(otherNode); - !otherInstance ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactDOMInput: Mixing React and non-React radio inputs with the same `name` is not supported.') : _prodInvariant('90') : void 0; - // If this is a controlled radio button group, forcing the input that - // was previously checked to update will cause it to be come re-checked - // as appropriate. - ReactUpdates.asap(forceUpdateIfMounted, otherInstance); - } - } - - return returnValue; -} - -module.exports = ReactDOMInput; - -/***/ }), -/* 145 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var _assign = __webpack_require__(3); - -var React = __webpack_require__(15); -var ReactDOMComponentTree = __webpack_require__(4); -var ReactDOMSelect = __webpack_require__(73); - -var warning = __webpack_require__(1); -var didWarnInvalidOptionChildren = false; - -function flattenChildren(children) { - var content = ''; - - // Flatten children and warn if they aren't strings or numbers; - // invalid types are ignored. - React.Children.forEach(children, function (child) { - if (child == null) { - return; - } - if (typeof child === 'string' || typeof child === 'number') { - content += child; - } else if (!didWarnInvalidOptionChildren) { - didWarnInvalidOptionChildren = true; - process.env.NODE_ENV !== 'production' ? warning(false, 'Only strings and numbers are supported as <option> children.') : void 0; - } - }); - - return content; -} - -/** - * Implements an <option> host component that warns when `selected` is set. - */ -var ReactDOMOption = { - mountWrapper: function (inst, props, hostParent) { - // TODO (yungsters): Remove support for `selected` in <option>. - if (process.env.NODE_ENV !== 'production') { - process.env.NODE_ENV !== 'production' ? warning(props.selected == null, 'Use the `defaultValue` or `value` props on <select> instead of ' + 'setting `selected` on <option>.') : void 0; - } - - // Look up whether this option is 'selected' - var selectValue = null; - if (hostParent != null) { - var selectParent = hostParent; - - if (selectParent._tag === 'optgroup') { - selectParent = selectParent._hostParent; - } - - if (selectParent != null && selectParent._tag === 'select') { - selectValue = ReactDOMSelect.getSelectValueContext(selectParent); - } - } - - // If the value is null (e.g., no specified value or after initial mount) - // or missing (e.g., for <datalist>), we don't change props.selected - var selected = null; - if (selectValue != null) { - var value; - if (props.value != null) { - value = props.value + ''; - } else { - value = flattenChildren(props.children); - } - selected = false; - if (Array.isArray(selectValue)) { - // multiple - for (var i = 0; i < selectValue.length; i++) { - if ('' + selectValue[i] === value) { - selected = true; - break; - } - } - } else { - selected = '' + selectValue === value; - } - } - - inst._wrapperState = { selected: selected }; - }, - - postMountWrapper: function (inst) { - // value="" should make a value attribute (#6219) - var props = inst._currentElement.props; - if (props.value != null) { - var node = ReactDOMComponentTree.getNodeFromInstance(inst); - node.setAttribute('value', props.value); - } - }, - - getHostProps: function (inst, props) { - var hostProps = _assign({ selected: undefined, children: undefined }, props); - - // Read state only from initial mount because <select> updates value - // manually; we need the initial state only for server rendering - if (inst._wrapperState.selected != null) { - hostProps.selected = inst._wrapperState.selected; - } - - var content = flattenChildren(props.children); - - if (content) { - hostProps.children = content; - } - - return hostProps; - } -}; - -module.exports = ReactDOMOption; - -/***/ }), -/* 146 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var _prodInvariant = __webpack_require__(2), - _assign = __webpack_require__(3); - -var LinkedValueUtils = __webpack_require__(43); -var ReactDOMComponentTree = __webpack_require__(4); -var ReactUpdates = __webpack_require__(10); - -var invariant = __webpack_require__(0); -var warning = __webpack_require__(1); - -var didWarnValueLink = false; -var didWarnValDefaultVal = false; - -function forceUpdateIfMounted() { - if (this._rootNodeID) { - // DOM component is still mounted; update - ReactDOMTextarea.updateWrapper(this); - } -} - -/** - * Implements a <textarea> host component that allows setting `value`, and - * `defaultValue`. This differs from the traditional DOM API because value is - * usually set as PCDATA children. - * - * If `value` is not supplied (or null/undefined), user actions that affect the - * value will trigger updates to the element. - * - * If `value` is supplied (and not null/undefined), the rendered element will - * not trigger updates to the element. Instead, the `value` prop must change in - * order for the rendered element to be updated. - * - * The rendered element will be initialized with an empty value, the prop - * `defaultValue` if specified, or the children content (deprecated). - */ -var ReactDOMTextarea = { - getHostProps: function (inst, props) { - !(props.dangerouslySetInnerHTML == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, '`dangerouslySetInnerHTML` does not make sense on <textarea>.') : _prodInvariant('91') : void 0; - - // Always set children to the same thing. In IE9, the selection range will - // get reset if `textContent` is mutated. We could add a check in setTextContent - // to only set the value if/when the value differs from the node value (which would - // completely solve this IE9 bug), but Sebastian+Ben seemed to like this solution. - // The value can be a boolean or object so that's why it's forced to be a string. - var hostProps = _assign({}, props, { - value: undefined, - defaultValue: undefined, - children: '' + inst._wrapperState.initialValue, - onChange: inst._wrapperState.onChange - }); - - return hostProps; - }, - - mountWrapper: function (inst, props) { - if (process.env.NODE_ENV !== 'production') { - LinkedValueUtils.checkPropTypes('textarea', props, inst._currentElement._owner); - if (props.valueLink !== undefined && !didWarnValueLink) { - process.env.NODE_ENV !== 'production' ? warning(false, '`valueLink` prop on `textarea` is deprecated; set `value` and `onChange` instead.') : void 0; - didWarnValueLink = true; - } - if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValDefaultVal) { - process.env.NODE_ENV !== 'production' ? warning(false, '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') : void 0; - didWarnValDefaultVal = true; - } - } - - var value = LinkedValueUtils.getValue(props); - var initialValue = value; - - // Only bother fetching default value if we're going to use it - if (value == null) { - var defaultValue = props.defaultValue; - // TODO (yungsters): Remove support for children content in <textarea>. - var children = props.children; - if (children != null) { - if (process.env.NODE_ENV !== 'production') { - process.env.NODE_ENV !== 'production' ? warning(false, 'Use the `defaultValue` or `value` props instead of setting ' + 'children on <textarea>.') : void 0; - } - !(defaultValue == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'If you supply `defaultValue` on a <textarea>, do not pass children.') : _prodInvariant('92') : void 0; - if (Array.isArray(children)) { - !(children.length <= 1) ? process.env.NODE_ENV !== 'production' ? invariant(false, '<textarea> can only have at most one child.') : _prodInvariant('93') : void 0; - children = children[0]; - } - - defaultValue = '' + children; - } - if (defaultValue == null) { - defaultValue = ''; - } - initialValue = defaultValue; - } - - inst._wrapperState = { - initialValue: '' + initialValue, - listeners: null, - onChange: _handleChange.bind(inst) - }; - }, - - updateWrapper: function (inst) { - var props = inst._currentElement.props; - - var node = ReactDOMComponentTree.getNodeFromInstance(inst); - var value = LinkedValueUtils.getValue(props); - if (value != null) { - // Cast `value` to a string to ensure the value is set correctly. While - // browsers typically do this as necessary, jsdom doesn't. - var newValue = '' + value; - - // To avoid side effects (such as losing text selection), only set value if changed - if (newValue !== node.value) { - node.value = newValue; - } - if (props.defaultValue == null) { - node.defaultValue = newValue; - } - } - if (props.defaultValue != null) { - node.defaultValue = props.defaultValue; - } - }, - - postMountWrapper: function (inst) { - // This is in postMount because we need access to the DOM node, which is not - // available until after the component has mounted. - var node = ReactDOMComponentTree.getNodeFromInstance(inst); - var textContent = node.textContent; - - // Only set node.value if textContent is equal to the expected - // initial value. In IE10/IE11 there is a bug where the placeholder attribute - // will populate textContent as well. - // https://developer.microsoft.com/microsoft-edge/platform/issues/101525/ - if (textContent === inst._wrapperState.initialValue) { - node.value = textContent; - } - } -}; - -function _handleChange(event) { - var props = this._currentElement.props; - var returnValue = LinkedValueUtils.executeOnChange(props, event); - ReactUpdates.asap(forceUpdateIfMounted, this); - return returnValue; -} - -module.exports = ReactDOMTextarea; - -/***/ }), -/* 147 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var _prodInvariant = __webpack_require__(2); - -var ReactComponentEnvironment = __webpack_require__(44); -var ReactInstanceMap = __webpack_require__(23); -var ReactInstrumentation = __webpack_require__(8); - -var ReactCurrentOwner = __webpack_require__(9); -var ReactReconciler = __webpack_require__(17); -var ReactChildReconciler = __webpack_require__(148); - -var emptyFunction = __webpack_require__(7); -var flattenChildren = __webpack_require__(155); -var invariant = __webpack_require__(0); - -/** - * Make an update for markup to be rendered and inserted at a supplied index. - * - * @param {string} markup Markup that renders into an element. - * @param {number} toIndex Destination index. - * @private - */ -function makeInsertMarkup(markup, afterNode, toIndex) { - // NOTE: Null values reduce hidden classes. - return { - type: 'INSERT_MARKUP', - content: markup, - fromIndex: null, - fromNode: null, - toIndex: toIndex, - afterNode: afterNode - }; -} - -/** - * Make an update for moving an existing element to another index. - * - * @param {number} fromIndex Source index of the existing element. - * @param {number} toIndex Destination index of the element. - * @private - */ -function makeMove(child, afterNode, toIndex) { - // NOTE: Null values reduce hidden classes. - return { - type: 'MOVE_EXISTING', - content: null, - fromIndex: child._mountIndex, - fromNode: ReactReconciler.getHostNode(child), - toIndex: toIndex, - afterNode: afterNode - }; -} - -/** - * Make an update for removing an element at an index. - * - * @param {number} fromIndex Index of the element to remove. - * @private - */ -function makeRemove(child, node) { - // NOTE: Null values reduce hidden classes. - return { - type: 'REMOVE_NODE', - content: null, - fromIndex: child._mountIndex, - fromNode: node, - toIndex: null, - afterNode: null - }; -} - -/** - * Make an update for setting the markup of a node. - * - * @param {string} markup Markup that renders into an element. - * @private - */ -function makeSetMarkup(markup) { - // NOTE: Null values reduce hidden classes. - return { - type: 'SET_MARKUP', - content: markup, - fromIndex: null, - fromNode: null, - toIndex: null, - afterNode: null - }; -} - -/** - * Make an update for setting the text content. - * - * @param {string} textContent Text content to set. - * @private - */ -function makeTextContent(textContent) { - // NOTE: Null values reduce hidden classes. - return { - type: 'TEXT_CONTENT', - content: textContent, - fromIndex: null, - fromNode: null, - toIndex: null, - afterNode: null - }; -} - -/** - * Push an update, if any, onto the queue. Creates a new queue if none is - * passed and always returns the queue. Mutative. - */ -function enqueue(queue, update) { - if (update) { - queue = queue || []; - queue.push(update); - } - return queue; -} - -/** - * Processes any enqueued updates. - * - * @private - */ -function processQueue(inst, updateQueue) { - ReactComponentEnvironment.processChildrenUpdates(inst, updateQueue); -} - -var setChildrenForInstrumentation = emptyFunction; -if (process.env.NODE_ENV !== 'production') { - var getDebugID = function (inst) { - if (!inst._debugID) { - // Check for ART-like instances. TODO: This is silly/gross. - var internal; - if (internal = ReactInstanceMap.get(inst)) { - inst = internal; - } - } - return inst._debugID; - }; - setChildrenForInstrumentation = function (children) { - var debugID = getDebugID(this); - // TODO: React Native empty components are also multichild. - // This means they still get into this method but don't have _debugID. - if (debugID !== 0) { - ReactInstrumentation.debugTool.onSetChildren(debugID, children ? Object.keys(children).map(function (key) { - return children[key]._debugID; - }) : []); - } - }; -} - -/** - * ReactMultiChild are capable of reconciling multiple children. - * - * @class ReactMultiChild - * @internal - */ -var ReactMultiChild = { - /** - * Provides common functionality for components that must reconcile multiple - * children. This is used by `ReactDOMComponent` to mount, update, and - * unmount child components. - * - * @lends {ReactMultiChild.prototype} - */ - Mixin: { - _reconcilerInstantiateChildren: function (nestedChildren, transaction, context) { - if (process.env.NODE_ENV !== 'production') { - var selfDebugID = getDebugID(this); - if (this._currentElement) { - try { - ReactCurrentOwner.current = this._currentElement._owner; - return ReactChildReconciler.instantiateChildren(nestedChildren, transaction, context, selfDebugID); - } finally { - ReactCurrentOwner.current = null; - } - } - } - return ReactChildReconciler.instantiateChildren(nestedChildren, transaction, context); - }, - - _reconcilerUpdateChildren: function (prevChildren, nextNestedChildrenElements, mountImages, removedNodes, transaction, context) { - var nextChildren; - var selfDebugID = 0; - if (process.env.NODE_ENV !== 'production') { - selfDebugID = getDebugID(this); - if (this._currentElement) { - try { - ReactCurrentOwner.current = this._currentElement._owner; - nextChildren = flattenChildren(nextNestedChildrenElements, selfDebugID); - } finally { - ReactCurrentOwner.current = null; - } - ReactChildReconciler.updateChildren(prevChildren, nextChildren, mountImages, removedNodes, transaction, this, this._hostContainerInfo, context, selfDebugID); - return nextChildren; - } - } - nextChildren = flattenChildren(nextNestedChildrenElements, selfDebugID); - ReactChildReconciler.updateChildren(prevChildren, nextChildren, mountImages, removedNodes, transaction, this, this._hostContainerInfo, context, selfDebugID); - return nextChildren; - }, - - /** - * Generates a "mount image" for each of the supplied children. In the case - * of `ReactDOMComponent`, a mount image is a string of markup. - * - * @param {?object} nestedChildren Nested child maps. - * @return {array} An array of mounted representations. - * @internal - */ - mountChildren: function (nestedChildren, transaction, context) { - var children = this._reconcilerInstantiateChildren(nestedChildren, transaction, context); - this._renderedChildren = children; - - var mountImages = []; - var index = 0; - for (var name in children) { - if (children.hasOwnProperty(name)) { - var child = children[name]; - var selfDebugID = 0; - if (process.env.NODE_ENV !== 'production') { - selfDebugID = getDebugID(this); - } - var mountImage = ReactReconciler.mountComponent(child, transaction, this, this._hostContainerInfo, context, selfDebugID); - child._mountIndex = index++; - mountImages.push(mountImage); - } - } - - if (process.env.NODE_ENV !== 'production') { - setChildrenForInstrumentation.call(this, children); - } - - return mountImages; - }, - - /** - * Replaces any rendered children with a text content string. - * - * @param {string} nextContent String of content. - * @internal - */ - updateTextContent: function (nextContent) { - var prevChildren = this._renderedChildren; - // Remove any rendered children. - ReactChildReconciler.unmountChildren(prevChildren, false); - for (var name in prevChildren) { - if (prevChildren.hasOwnProperty(name)) { - true ? process.env.NODE_ENV !== 'production' ? invariant(false, 'updateTextContent called on non-empty component.') : _prodInvariant('118') : void 0; - } - } - // Set new text content. - var updates = [makeTextContent(nextContent)]; - processQueue(this, updates); - }, - - /** - * Replaces any rendered children with a markup string. - * - * @param {string} nextMarkup String of markup. - * @internal - */ - updateMarkup: function (nextMarkup) { - var prevChildren = this._renderedChildren; - // Remove any rendered children. - ReactChildReconciler.unmountChildren(prevChildren, false); - for (var name in prevChildren) { - if (prevChildren.hasOwnProperty(name)) { - true ? process.env.NODE_ENV !== 'production' ? invariant(false, 'updateTextContent called on non-empty component.') : _prodInvariant('118') : void 0; - } - } - var updates = [makeSetMarkup(nextMarkup)]; - processQueue(this, updates); - }, - - /** - * Updates the rendered children with new children. - * - * @param {?object} nextNestedChildrenElements Nested child element maps. - * @param {ReactReconcileTransaction} transaction - * @internal - */ - updateChildren: function (nextNestedChildrenElements, transaction, context) { - // Hook used by React ART - this._updateChildren(nextNestedChildrenElements, transaction, context); - }, - - /** - * @param {?object} nextNestedChildrenElements Nested child element maps. - * @param {ReactReconcileTransaction} transaction - * @final - * @protected - */ - _updateChildren: function (nextNestedChildrenElements, transaction, context) { - var prevChildren = this._renderedChildren; - var removedNodes = {}; - var mountImages = []; - var nextChildren = this._reconcilerUpdateChildren(prevChildren, nextNestedChildrenElements, mountImages, removedNodes, transaction, context); - if (!nextChildren && !prevChildren) { - return; - } - var updates = null; - var name; - // `nextIndex` will increment for each child in `nextChildren`, but - // `lastIndex` will be the last index visited in `prevChildren`. - var nextIndex = 0; - var lastIndex = 0; - // `nextMountIndex` will increment for each newly mounted child. - var nextMountIndex = 0; - var lastPlacedNode = null; - for (name in nextChildren) { - if (!nextChildren.hasOwnProperty(name)) { - continue; - } - var prevChild = prevChildren && prevChildren[name]; - var nextChild = nextChildren[name]; - if (prevChild === nextChild) { - updates = enqueue(updates, this.moveChild(prevChild, lastPlacedNode, nextIndex, lastIndex)); - lastIndex = Math.max(prevChild._mountIndex, lastIndex); - prevChild._mountIndex = nextIndex; - } else { - if (prevChild) { - // Update `lastIndex` before `_mountIndex` gets unset by unmounting. - lastIndex = Math.max(prevChild._mountIndex, lastIndex); - // The `removedNodes` loop below will actually remove the child. - } - // The child must be instantiated before it's mounted. - updates = enqueue(updates, this._mountChildAtIndex(nextChild, mountImages[nextMountIndex], lastPlacedNode, nextIndex, transaction, context)); - nextMountIndex++; - } - nextIndex++; - lastPlacedNode = ReactReconciler.getHostNode(nextChild); - } - // Remove children that are no longer present. - for (name in removedNodes) { - if (removedNodes.hasOwnProperty(name)) { - updates = enqueue(updates, this._unmountChild(prevChildren[name], removedNodes[name])); - } - } - if (updates) { - processQueue(this, updates); - } - this._renderedChildren = nextChildren; - - if (process.env.NODE_ENV !== 'production') { - setChildrenForInstrumentation.call(this, nextChildren); - } - }, - - /** - * Unmounts all rendered children. This should be used to clean up children - * when this component is unmounted. It does not actually perform any - * backend operations. - * - * @internal - */ - unmountChildren: function (safely) { - var renderedChildren = this._renderedChildren; - ReactChildReconciler.unmountChildren(renderedChildren, safely); - this._renderedChildren = null; - }, - - /** - * Moves a child component to the supplied index. - * - * @param {ReactComponent} child Component to move. - * @param {number} toIndex Destination index of the element. - * @param {number} lastIndex Last index visited of the siblings of `child`. - * @protected - */ - moveChild: function (child, afterNode, toIndex, lastIndex) { - // If the index of `child` is less than `lastIndex`, then it needs to - // be moved. Otherwise, we do not need to move it because a child will be - // inserted or moved before `child`. - if (child._mountIndex < lastIndex) { - return makeMove(child, afterNode, toIndex); - } - }, - - /** - * Creates a child component. - * - * @param {ReactComponent} child Component to create. - * @param {string} mountImage Markup to insert. - * @protected - */ - createChild: function (child, afterNode, mountImage) { - return makeInsertMarkup(mountImage, afterNode, child._mountIndex); - }, - - /** - * Removes a child component. - * - * @param {ReactComponent} child Child to remove. - * @protected - */ - removeChild: function (child, node) { - return makeRemove(child, node); - }, - - /** - * Mounts a child with the supplied name. - * - * NOTE: This is part of `updateChildren` and is here for readability. - * - * @param {ReactComponent} child Component to mount. - * @param {string} name Name of the child. - * @param {number} index Index at which to insert the child. - * @param {ReactReconcileTransaction} transaction - * @private - */ - _mountChildAtIndex: function (child, mountImage, afterNode, index, transaction, context) { - child._mountIndex = index; - return this.createChild(child, afterNode, mountImage); - }, - - /** - * Unmounts a rendered child. - * - * NOTE: This is part of `updateChildren` and is here for readability. - * - * @param {ReactComponent} child Component to unmount. - * @private - */ - _unmountChild: function (child, node) { - var update = this.removeChild(child, node); - child._mountIndex = null; - return update; - } - } -}; - -module.exports = ReactMultiChild; - -/***/ }), -/* 148 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2014-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var ReactReconciler = __webpack_require__(17); - -var instantiateReactComponent = __webpack_require__(74); -var KeyEscapeUtils = __webpack_require__(47); -var shouldUpdateReactComponent = __webpack_require__(46); -var traverseAllChildren = __webpack_require__(78); -var warning = __webpack_require__(1); - -var ReactComponentTreeHook; - -if (typeof process !== 'undefined' && process.env && process.env.NODE_ENV === 'test') { - // Temporary hack. - // Inline requires don't work well with Jest: - // https://github.com/facebook/react/issues/7240 - // Remove the inline requires when we don't need them anymore: - // https://github.com/facebook/react/pull/7178 - ReactComponentTreeHook = __webpack_require__(6); -} - -function instantiateChild(childInstances, child, name, selfDebugID) { - // We found a component instance. - var keyUnique = childInstances[name] === undefined; - if (process.env.NODE_ENV !== 'production') { - if (!ReactComponentTreeHook) { - ReactComponentTreeHook = __webpack_require__(6); - } - if (!keyUnique) { - process.env.NODE_ENV !== 'production' ? warning(false, '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', KeyEscapeUtils.unescape(name), ReactComponentTreeHook.getStackAddendumByID(selfDebugID)) : void 0; - } - } - if (child != null && keyUnique) { - childInstances[name] = instantiateReactComponent(child, true); - } -} - -/** - * ReactChildReconciler provides helpers for initializing or updating a set of - * children. Its output is suitable for passing it onto ReactMultiChild which - * does diffed reordering and insertion. - */ -var ReactChildReconciler = { - /** - * Generates a "mount image" for each of the supplied children. In the case - * of `ReactDOMComponent`, a mount image is a string of markup. - * - * @param {?object} nestedChildNodes Nested child maps. - * @return {?object} A set of child instances. - * @internal - */ - instantiateChildren: function (nestedChildNodes, transaction, context, selfDebugID) // 0 in production and for roots - { - if (nestedChildNodes == null) { - return null; - } - var childInstances = {}; - - if (process.env.NODE_ENV !== 'production') { - traverseAllChildren(nestedChildNodes, function (childInsts, child, name) { - return instantiateChild(childInsts, child, name, selfDebugID); - }, childInstances); - } else { - traverseAllChildren(nestedChildNodes, instantiateChild, childInstances); - } - return childInstances; - }, - - /** - * Updates the rendered children and returns a new set of children. - * - * @param {?object} prevChildren Previously initialized set of children. - * @param {?object} nextChildren Flat child element maps. - * @param {ReactReconcileTransaction} transaction - * @param {object} context - * @return {?object} A new set of child instances. - * @internal - */ - updateChildren: function (prevChildren, nextChildren, mountImages, removedNodes, transaction, hostParent, hostContainerInfo, context, selfDebugID) // 0 in production and for roots - { - // We currently don't have a way to track moves here but if we use iterators - // instead of for..in we can zip the iterators and check if an item has - // moved. - // TODO: If nothing has changed, return the prevChildren object so that we - // can quickly bailout if nothing has changed. - if (!nextChildren && !prevChildren) { - return; - } - var name; - var prevChild; - for (name in nextChildren) { - if (!nextChildren.hasOwnProperty(name)) { - continue; - } - prevChild = prevChildren && prevChildren[name]; - var prevElement = prevChild && prevChild._currentElement; - var nextElement = nextChildren[name]; - if (prevChild != null && shouldUpdateReactComponent(prevElement, nextElement)) { - ReactReconciler.receiveComponent(prevChild, nextElement, transaction, context); - nextChildren[name] = prevChild; - } else { - if (prevChild) { - removedNodes[name] = ReactReconciler.getHostNode(prevChild); - ReactReconciler.unmountComponent(prevChild, false); - } - // The child must be instantiated before it's mounted. - var nextChildInstance = instantiateReactComponent(nextElement, true); - nextChildren[name] = nextChildInstance; - // Creating mount image now ensures refs are resolved in right order - // (see https://github.com/facebook/react/pull/7101 for explanation). - var nextChildMountImage = ReactReconciler.mountComponent(nextChildInstance, transaction, hostParent, hostContainerInfo, context, selfDebugID); - mountImages.push(nextChildMountImage); - } - } - // Unmount children that are no longer present. - for (name in prevChildren) { - if (prevChildren.hasOwnProperty(name) && !(nextChildren && nextChildren.hasOwnProperty(name))) { - prevChild = prevChildren[name]; - removedNodes[name] = ReactReconciler.getHostNode(prevChild); - ReactReconciler.unmountComponent(prevChild, false); - } - } - }, - - /** - * Unmounts all rendered children. This should be used to clean up children - * when this component is unmounted. - * - * @param {?object} renderedChildren Previously initialized set of children. - * @internal - */ - unmountChildren: function (renderedChildren, safely) { - for (var name in renderedChildren) { - if (renderedChildren.hasOwnProperty(name)) { - var renderedChild = renderedChildren[name]; - ReactReconciler.unmountComponent(renderedChild, safely); - } - } - } -}; - -module.exports = ReactChildReconciler; - -/***/ }), -/* 149 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var _prodInvariant = __webpack_require__(2), - _assign = __webpack_require__(3); - -var React = __webpack_require__(15); -var ReactComponentEnvironment = __webpack_require__(44); -var ReactCurrentOwner = __webpack_require__(9); -var ReactErrorUtils = __webpack_require__(36); -var ReactInstanceMap = __webpack_require__(23); -var ReactInstrumentation = __webpack_require__(8); -var ReactNodeTypes = __webpack_require__(75); -var ReactReconciler = __webpack_require__(17); - -if (process.env.NODE_ENV !== 'production') { - var checkReactTypeSpec = __webpack_require__(150); -} - -var emptyObject = __webpack_require__(25); -var invariant = __webpack_require__(0); -var shallowEqual = __webpack_require__(45); -var shouldUpdateReactComponent = __webpack_require__(46); -var warning = __webpack_require__(1); - -var CompositeTypes = { - ImpureClass: 0, - PureClass: 1, - StatelessFunctional: 2 -}; - -function StatelessComponent(Component) {} -StatelessComponent.prototype.render = function () { - var Component = ReactInstanceMap.get(this)._currentElement.type; - var element = Component(this.props, this.context, this.updater); - warnIfInvalidElement(Component, element); - return element; -}; - -function warnIfInvalidElement(Component, element) { - if (process.env.NODE_ENV !== 'production') { - process.env.NODE_ENV !== 'production' ? warning(element === null || element === false || React.isValidElement(element), '%s(...): A valid React element (or null) must be returned. You may have ' + 'returned undefined, an array or some other invalid object.', Component.displayName || Component.name || 'Component') : void 0; - process.env.NODE_ENV !== 'production' ? warning(!Component.childContextTypes, '%s(...): childContextTypes cannot be defined on a functional component.', Component.displayName || Component.name || 'Component') : void 0; - } -} - -function shouldConstruct(Component) { - return !!(Component.prototype && Component.prototype.isReactComponent); -} - -function isPureComponent(Component) { - return !!(Component.prototype && Component.prototype.isPureReactComponent); -} - -// Separated into a function to contain deoptimizations caused by try/finally. -function measureLifeCyclePerf(fn, debugID, timerType) { - if (debugID === 0) { - // Top-level wrappers (see ReactMount) and empty components (see - // ReactDOMEmptyComponent) are invisible to hooks and devtools. - // Both are implementation details that should go away in the future. - return fn(); - } - - ReactInstrumentation.debugTool.onBeginLifeCycleTimer(debugID, timerType); - try { - return fn(); - } finally { - ReactInstrumentation.debugTool.onEndLifeCycleTimer(debugID, timerType); - } -} - -/** - * ------------------ The Life-Cycle of a Composite Component ------------------ - * - * - constructor: Initialization of state. The instance is now retained. - * - componentWillMount - * - render - * - [children's constructors] - * - [children's componentWillMount and render] - * - [children's componentDidMount] - * - componentDidMount - * - * Update Phases: - * - componentWillReceiveProps (only called if parent updated) - * - shouldComponentUpdate - * - componentWillUpdate - * - render - * - [children's constructors or receive props phases] - * - componentDidUpdate - * - * - componentWillUnmount - * - [children's componentWillUnmount] - * - [children destroyed] - * - (destroyed): The instance is now blank, released by React and ready for GC. - * - * ----------------------------------------------------------------------------- - */ - -/** - * An incrementing ID assigned to each component when it is mounted. This is - * used to enforce the order in which `ReactUpdates` updates dirty components. - * - * @private - */ -var nextMountID = 1; - -/** - * @lends {ReactCompositeComponent.prototype} - */ -var ReactCompositeComponent = { - /** - * Base constructor for all composite component. - * - * @param {ReactElement} element - * @final - * @internal - */ - construct: function (element) { - this._currentElement = element; - this._rootNodeID = 0; - this._compositeType = null; - this._instance = null; - this._hostParent = null; - this._hostContainerInfo = null; - - // See ReactUpdateQueue - this._updateBatchNumber = null; - this._pendingElement = null; - this._pendingStateQueue = null; - this._pendingReplaceState = false; - this._pendingForceUpdate = false; - - this._renderedNodeType = null; - this._renderedComponent = null; - this._context = null; - this._mountOrder = 0; - this._topLevelWrapper = null; - - // See ReactUpdates and ReactUpdateQueue. - this._pendingCallbacks = null; - - // ComponentWillUnmount shall only be called once - this._calledComponentWillUnmount = false; - - if (process.env.NODE_ENV !== 'production') { - this._warnedAboutRefsInRender = false; - } - }, - - /** - * Initializes the component, renders markup, and registers event listeners. - * - * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction - * @param {?object} hostParent - * @param {?object} hostContainerInfo - * @param {?object} context - * @return {?string} Rendered markup to be inserted into the DOM. - * @final - * @internal - */ - mountComponent: function (transaction, hostParent, hostContainerInfo, context) { - var _this = this; - - this._context = context; - this._mountOrder = nextMountID++; - this._hostParent = hostParent; - this._hostContainerInfo = hostContainerInfo; - - var publicProps = this._currentElement.props; - var publicContext = this._processContext(context); - - var Component = this._currentElement.type; - - var updateQueue = transaction.getUpdateQueue(); - - // Initialize the public class - var doConstruct = shouldConstruct(Component); - var inst = this._constructComponent(doConstruct, publicProps, publicContext, updateQueue); - var renderedElement; - - // Support functional components - if (!doConstruct && (inst == null || inst.render == null)) { - renderedElement = inst; - warnIfInvalidElement(Component, renderedElement); - !(inst === null || inst === false || React.isValidElement(inst)) ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s(...): A valid React element (or null) must be returned. You may have returned undefined, an array or some other invalid object.', Component.displayName || Component.name || 'Component') : _prodInvariant('105', Component.displayName || Component.name || 'Component') : void 0; - inst = new StatelessComponent(Component); - this._compositeType = CompositeTypes.StatelessFunctional; - } else { - if (isPureComponent(Component)) { - this._compositeType = CompositeTypes.PureClass; - } else { - this._compositeType = CompositeTypes.ImpureClass; - } - } - - if (process.env.NODE_ENV !== 'production') { - // This will throw later in _renderValidatedComponent, but add an early - // warning now to help debugging - if (inst.render == null) { - process.env.NODE_ENV !== 'production' ? warning(false, '%s(...): No `render` method found on the returned component ' + 'instance: you may have forgotten to define `render`.', Component.displayName || Component.name || 'Component') : void 0; - } - - var propsMutated = inst.props !== publicProps; - var componentName = Component.displayName || Component.name || 'Component'; - - process.env.NODE_ENV !== 'production' ? warning(inst.props === undefined || !propsMutated, '%s(...): When calling super() in `%s`, make sure to pass ' + "up the same props that your component's constructor was passed.", componentName, componentName) : void 0; - } - - // These should be set up in the constructor, but as a convenience for - // simpler class abstractions, we set them up after the fact. - inst.props = publicProps; - inst.context = publicContext; - inst.refs = emptyObject; - inst.updater = updateQueue; - - this._instance = inst; - - // Store a reference from the instance back to the internal representation - ReactInstanceMap.set(inst, this); - - if (process.env.NODE_ENV !== 'production') { - // Since plain JS classes are defined without any special initialization - // logic, we can not catch common errors early. Therefore, we have to - // catch them here, at initialization time, instead. - process.env.NODE_ENV !== 'production' ? warning(!inst.getInitialState || inst.getInitialState.isReactClassApproved || inst.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') : void 0; - process.env.NODE_ENV !== 'production' ? warning(!inst.getDefaultProps || inst.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') : void 0; - process.env.NODE_ENV !== 'production' ? warning(!inst.propTypes, 'propTypes was defined as an instance property on %s. Use a static ' + 'property to define propTypes instead.', this.getName() || 'a component') : void 0; - process.env.NODE_ENV !== 'production' ? warning(!inst.contextTypes, 'contextTypes was defined as an instance property on %s. Use a ' + 'static property to define contextTypes instead.', this.getName() || 'a component') : void 0; - process.env.NODE_ENV !== 'production' ? warning(typeof inst.componentShouldUpdate !== 'function', '%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') : void 0; - process.env.NODE_ENV !== 'production' ? warning(typeof inst.componentDidUnmount !== 'function', '%s has a method called ' + 'componentDidUnmount(). But there is no such lifecycle method. ' + 'Did you mean componentWillUnmount()?', this.getName() || 'A component') : void 0; - process.env.NODE_ENV !== 'production' ? warning(typeof inst.componentWillRecieveProps !== 'function', '%s has a method called ' + 'componentWillRecieveProps(). Did you mean componentWillReceiveProps()?', this.getName() || 'A component') : void 0; - } - - var initialState = inst.state; - if (initialState === undefined) { - inst.state = initialState = null; - } - !(typeof initialState === 'object' && !Array.isArray(initialState)) ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s.state: must be set to an object or null', this.getName() || 'ReactCompositeComponent') : _prodInvariant('106', this.getName() || 'ReactCompositeComponent') : void 0; - - this._pendingStateQueue = null; - this._pendingReplaceState = false; - this._pendingForceUpdate = false; - - var markup; - if (inst.unstable_handleError) { - markup = this.performInitialMountWithErrorHandling(renderedElement, hostParent, hostContainerInfo, transaction, context); - } else { - markup = this.performInitialMount(renderedElement, hostParent, hostContainerInfo, transaction, context); - } - - if (inst.componentDidMount) { - if (process.env.NODE_ENV !== 'production') { - transaction.getReactMountReady().enqueue(function () { - measureLifeCyclePerf(function () { - return inst.componentDidMount(); - }, _this._debugID, 'componentDidMount'); - }); - } else { - transaction.getReactMountReady().enqueue(inst.componentDidMount, inst); - } - } - - return markup; - }, - - _constructComponent: function (doConstruct, publicProps, publicContext, updateQueue) { - if (process.env.NODE_ENV !== 'production' && !doConstruct) { - ReactCurrentOwner.current = this; - try { - return this._constructComponentWithoutOwner(doConstruct, publicProps, publicContext, updateQueue); - } finally { - ReactCurrentOwner.current = null; - } - } else { - return this._constructComponentWithoutOwner(doConstruct, publicProps, publicContext, updateQueue); - } - }, - - _constructComponentWithoutOwner: function (doConstruct, publicProps, publicContext, updateQueue) { - var Component = this._currentElement.type; - - if (doConstruct) { - if (process.env.NODE_ENV !== 'production') { - return measureLifeCyclePerf(function () { - return new Component(publicProps, publicContext, updateQueue); - }, this._debugID, 'ctor'); - } else { - return new Component(publicProps, publicContext, updateQueue); - } - } - - // This can still be an instance in case of factory components - // but we'll count this as time spent rendering as the more common case. - if (process.env.NODE_ENV !== 'production') { - return measureLifeCyclePerf(function () { - return Component(publicProps, publicContext, updateQueue); - }, this._debugID, 'render'); - } else { - return Component(publicProps, publicContext, updateQueue); - } - }, - - performInitialMountWithErrorHandling: function (renderedElement, hostParent, hostContainerInfo, transaction, context) { - var markup; - var checkpoint = transaction.checkpoint(); - try { - markup = this.performInitialMount(renderedElement, hostParent, hostContainerInfo, transaction, context); - } catch (e) { - // Roll back to checkpoint, handle error (which may add items to the transaction), and take a new checkpoint - transaction.rollback(checkpoint); - this._instance.unstable_handleError(e); - if (this._pendingStateQueue) { - this._instance.state = this._processPendingState(this._instance.props, this._instance.context); - } - checkpoint = transaction.checkpoint(); - - this._renderedComponent.unmountComponent(true); - transaction.rollback(checkpoint); - - // Try again - we've informed the component about the error, so they can render an error message this time. - // If this throws again, the error will bubble up (and can be caught by a higher error boundary). - markup = this.performInitialMount(renderedElement, hostParent, hostContainerInfo, transaction, context); - } - return markup; - }, - - performInitialMount: function (renderedElement, hostParent, hostContainerInfo, transaction, context) { - var inst = this._instance; - - var debugID = 0; - if (process.env.NODE_ENV !== 'production') { - debugID = this._debugID; - } - - if (inst.componentWillMount) { - if (process.env.NODE_ENV !== 'production') { - measureLifeCyclePerf(function () { - return inst.componentWillMount(); - }, debugID, 'componentWillMount'); - } else { - inst.componentWillMount(); - } - // When mounting, calls to `setState` by `componentWillMount` will set - // `this._pendingStateQueue` without triggering a re-render. - if (this._pendingStateQueue) { - inst.state = this._processPendingState(inst.props, inst.context); - } - } - - // If not a stateless component, we now render - if (renderedElement === undefined) { - renderedElement = this._renderValidatedComponent(); - } - - var nodeType = ReactNodeTypes.getType(renderedElement); - this._renderedNodeType = nodeType; - var child = this._instantiateReactComponent(renderedElement, nodeType !== ReactNodeTypes.EMPTY /* shouldHaveDebugID */ - ); - this._renderedComponent = child; - - var markup = ReactReconciler.mountComponent(child, transaction, hostParent, hostContainerInfo, this._processChildContext(context), debugID); - - if (process.env.NODE_ENV !== 'production') { - if (debugID !== 0) { - var childDebugIDs = child._debugID !== 0 ? [child._debugID] : []; - ReactInstrumentation.debugTool.onSetChildren(debugID, childDebugIDs); - } - } - - return markup; - }, - - getHostNode: function () { - return ReactReconciler.getHostNode(this._renderedComponent); - }, - - /** - * Releases any resources allocated by `mountComponent`. - * - * @final - * @internal - */ - unmountComponent: function (safely) { - if (!this._renderedComponent) { - return; - } - - var inst = this._instance; - - if (inst.componentWillUnmount && !inst._calledComponentWillUnmount) { - inst._calledComponentWillUnmount = true; - - if (safely) { - var name = this.getName() + '.componentWillUnmount()'; - ReactErrorUtils.invokeGuardedCallback(name, inst.componentWillUnmount.bind(inst)); - } else { - if (process.env.NODE_ENV !== 'production') { - measureLifeCyclePerf(function () { - return inst.componentWillUnmount(); - }, this._debugID, 'componentWillUnmount'); - } else { - inst.componentWillUnmount(); - } - } - } - - if (this._renderedComponent) { - ReactReconciler.unmountComponent(this._renderedComponent, safely); - this._renderedNodeType = null; - this._renderedComponent = null; - this._instance = null; - } - - // Reset pending fields - // Even if this component is scheduled for another update in ReactUpdates, - // it would still be ignored because these fields are reset. - this._pendingStateQueue = null; - this._pendingReplaceState = false; - this._pendingForceUpdate = false; - this._pendingCallbacks = null; - this._pendingElement = null; - - // These fields do not really need to be reset since this object is no - // longer accessible. - this._context = null; - this._rootNodeID = 0; - this._topLevelWrapper = null; - - // Delete the reference from the instance to this internal representation - // which allow the internals to be properly cleaned up even if the user - // leaks a reference to the public instance. - ReactInstanceMap.remove(inst); - - // Some existing components rely on inst.props even after they've been - // destroyed (in event handlers). - // TODO: inst.props = null; - // TODO: inst.state = null; - // TODO: inst.context = null; - }, - - /** - * Filters the context object to only contain keys specified in - * `contextTypes` - * - * @param {object} context - * @return {?object} - * @private - */ - _maskContext: function (context) { - var Component = this._currentElement.type; - var contextTypes = Component.contextTypes; - if (!contextTypes) { - return emptyObject; - } - var maskedContext = {}; - for (var contextName in contextTypes) { - maskedContext[contextName] = context[contextName]; - } - return maskedContext; - }, - - /** - * Filters the context object to only contain keys specified in - * `contextTypes`, and asserts that they are valid. - * - * @param {object} context - * @return {?object} - * @private - */ - _processContext: function (context) { - var maskedContext = this._maskContext(context); - if (process.env.NODE_ENV !== 'production') { - var Component = this._currentElement.type; - if (Component.contextTypes) { - this._checkContextTypes(Component.contextTypes, maskedContext, 'context'); - } - } - return maskedContext; - }, - - /** - * @param {object} currentContext - * @return {object} - * @private - */ - _processChildContext: function (currentContext) { - var Component = this._currentElement.type; - var inst = this._instance; - var childContext; - - if (inst.getChildContext) { - if (process.env.NODE_ENV !== 'production') { - ReactInstrumentation.debugTool.onBeginProcessingChildContext(); - try { - childContext = inst.getChildContext(); - } finally { - ReactInstrumentation.debugTool.onEndProcessingChildContext(); - } - } else { - childContext = inst.getChildContext(); - } - } - - if (childContext) { - !(typeof Component.childContextTypes === 'object') ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s.getChildContext(): childContextTypes must be defined in order to use getChildContext().', this.getName() || 'ReactCompositeComponent') : _prodInvariant('107', this.getName() || 'ReactCompositeComponent') : void 0; - if (process.env.NODE_ENV !== 'production') { - this._checkContextTypes(Component.childContextTypes, childContext, 'child context'); - } - for (var name in childContext) { - !(name in Component.childContextTypes) ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s.getChildContext(): key "%s" is not defined in childContextTypes.', this.getName() || 'ReactCompositeComponent', name) : _prodInvariant('108', this.getName() || 'ReactCompositeComponent', name) : void 0; - } - return _assign({}, currentContext, childContext); - } - return currentContext; - }, - - /** - * Assert that the context types are valid - * - * @param {object} typeSpecs Map of context field to a ReactPropType - * @param {object} values Runtime values that need to be type-checked - * @param {string} location e.g. "prop", "context", "child context" - * @private - */ - _checkContextTypes: function (typeSpecs, values, location) { - if (process.env.NODE_ENV !== 'production') { - checkReactTypeSpec(typeSpecs, values, location, this.getName(), null, this._debugID); - } - }, - - receiveComponent: function (nextElement, transaction, nextContext) { - var prevElement = this._currentElement; - var prevContext = this._context; - - this._pendingElement = null; - - this.updateComponent(transaction, prevElement, nextElement, prevContext, nextContext); - }, - - /** - * If any of `_pendingElement`, `_pendingStateQueue`, or `_pendingForceUpdate` - * is set, update the component. - * - * @param {ReactReconcileTransaction} transaction - * @internal - */ - performUpdateIfNecessary: function (transaction) { - if (this._pendingElement != null) { - ReactReconciler.receiveComponent(this, this._pendingElement, transaction, this._context); - } else if (this._pendingStateQueue !== null || this._pendingForceUpdate) { - this.updateComponent(transaction, this._currentElement, this._currentElement, this._context, this._context); - } else { - this._updateBatchNumber = null; - } - }, - - /** - * Perform an update to a mounted component. The componentWillReceiveProps and - * shouldComponentUpdate methods are called, then (assuming the update isn't - * skipped) the remaining update lifecycle methods are called and the DOM - * representation is updated. - * - * By default, this implements React's rendering and reconciliation algorithm. - * Sophisticated clients may wish to override this. - * - * @param {ReactReconcileTransaction} transaction - * @param {ReactElement} prevParentElement - * @param {ReactElement} nextParentElement - * @internal - * @overridable - */ - updateComponent: function (transaction, prevParentElement, nextParentElement, prevUnmaskedContext, nextUnmaskedContext) { - var inst = this._instance; - !(inst != null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Attempted to update component `%s` that has already been unmounted (or failed to mount).', this.getName() || 'ReactCompositeComponent') : _prodInvariant('136', this.getName() || 'ReactCompositeComponent') : void 0; - - var willReceive = false; - var nextContext; - - // Determine if the context has changed or not - if (this._context === nextUnmaskedContext) { - nextContext = inst.context; - } else { - nextContext = this._processContext(nextUnmaskedContext); - willReceive = true; - } - - var prevProps = prevParentElement.props; - var nextProps = nextParentElement.props; - - // Not a simple state update but a props update - if (prevParentElement !== nextParentElement) { - willReceive = true; - } - - // An update here will schedule an update but immediately set - // _pendingStateQueue which will ensure that any state updates gets - // immediately reconciled instead of waiting for the next batch. - if (willReceive && inst.componentWillReceiveProps) { - if (process.env.NODE_ENV !== 'production') { - measureLifeCyclePerf(function () { - return inst.componentWillReceiveProps(nextProps, nextContext); - }, this._debugID, 'componentWillReceiveProps'); - } else { - inst.componentWillReceiveProps(nextProps, nextContext); - } - } - - var nextState = this._processPendingState(nextProps, nextContext); - var shouldUpdate = true; - - if (!this._pendingForceUpdate) { - if (inst.shouldComponentUpdate) { - if (process.env.NODE_ENV !== 'production') { - shouldUpdate = measureLifeCyclePerf(function () { - return inst.shouldComponentUpdate(nextProps, nextState, nextContext); - }, this._debugID, 'shouldComponentUpdate'); - } else { - shouldUpdate = inst.shouldComponentUpdate(nextProps, nextState, nextContext); - } - } else { - if (this._compositeType === CompositeTypes.PureClass) { - shouldUpdate = !shallowEqual(prevProps, nextProps) || !shallowEqual(inst.state, nextState); - } - } - } - - if (process.env.NODE_ENV !== 'production') { - process.env.NODE_ENV !== 'production' ? warning(shouldUpdate !== undefined, '%s.shouldComponentUpdate(): Returned undefined instead of a ' + 'boolean value. Make sure to return true or false.', this.getName() || 'ReactCompositeComponent') : void 0; - } - - this._updateBatchNumber = null; - if (shouldUpdate) { - this._pendingForceUpdate = false; - // Will set `this.props`, `this.state` and `this.context`. - this._performComponentUpdate(nextParentElement, nextProps, nextState, nextContext, transaction, nextUnmaskedContext); - } else { - // If it's determined that a component should not update, we still want - // to set props and state but we shortcut the rest of the update. - this._currentElement = nextParentElement; - this._context = nextUnmaskedContext; - inst.props = nextProps; - inst.state = nextState; - inst.context = nextContext; - } - }, - - _processPendingState: function (props, context) { - var inst = this._instance; - var queue = this._pendingStateQueue; - var replace = this._pendingReplaceState; - this._pendingReplaceState = false; - this._pendingStateQueue = null; - - if (!queue) { - return inst.state; - } - - if (replace && queue.length === 1) { - return queue[0]; - } - - var nextState = _assign({}, replace ? queue[0] : inst.state); - for (var i = replace ? 1 : 0; i < queue.length; i++) { - var partial = queue[i]; - _assign(nextState, typeof partial === 'function' ? partial.call(inst, nextState, props, context) : partial); - } - - return nextState; - }, - - /** - * Merges new props and state, notifies delegate methods of update and - * performs update. - * - * @param {ReactElement} nextElement Next element - * @param {object} nextProps Next public object to set as properties. - * @param {?object} nextState Next object to set as state. - * @param {?object} nextContext Next public object to set as context. - * @param {ReactReconcileTransaction} transaction - * @param {?object} unmaskedContext - * @private - */ - _performComponentUpdate: function (nextElement, nextProps, nextState, nextContext, transaction, unmaskedContext) { - var _this2 = this; - - var inst = this._instance; - - var hasComponentDidUpdate = Boolean(inst.componentDidUpdate); - var prevProps; - var prevState; - var prevContext; - if (hasComponentDidUpdate) { - prevProps = inst.props; - prevState = inst.state; - prevContext = inst.context; - } - - if (inst.componentWillUpdate) { - if (process.env.NODE_ENV !== 'production') { - measureLifeCyclePerf(function () { - return inst.componentWillUpdate(nextProps, nextState, nextContext); - }, this._debugID, 'componentWillUpdate'); - } else { - inst.componentWillUpdate(nextProps, nextState, nextContext); - } - } - - this._currentElement = nextElement; - this._context = unmaskedContext; - inst.props = nextProps; - inst.state = nextState; - inst.context = nextContext; - - this._updateRenderedComponent(transaction, unmaskedContext); - - if (hasComponentDidUpdate) { - if (process.env.NODE_ENV !== 'production') { - transaction.getReactMountReady().enqueue(function () { - measureLifeCyclePerf(inst.componentDidUpdate.bind(inst, prevProps, prevState, prevContext), _this2._debugID, 'componentDidUpdate'); - }); - } else { - transaction.getReactMountReady().enqueue(inst.componentDidUpdate.bind(inst, prevProps, prevState, prevContext), inst); - } - } - }, - - /** - * Call the component's `render` method and update the DOM accordingly. - * - * @param {ReactReconcileTransaction} transaction - * @internal - */ - _updateRenderedComponent: function (transaction, context) { - var prevComponentInstance = this._renderedComponent; - var prevRenderedElement = prevComponentInstance._currentElement; - var nextRenderedElement = this._renderValidatedComponent(); - - var debugID = 0; - if (process.env.NODE_ENV !== 'production') { - debugID = this._debugID; - } - - if (shouldUpdateReactComponent(prevRenderedElement, nextRenderedElement)) { - ReactReconciler.receiveComponent(prevComponentInstance, nextRenderedElement, transaction, this._processChildContext(context)); - } else { - var oldHostNode = ReactReconciler.getHostNode(prevComponentInstance); - ReactReconciler.unmountComponent(prevComponentInstance, false); - - var nodeType = ReactNodeTypes.getType(nextRenderedElement); - this._renderedNodeType = nodeType; - var child = this._instantiateReactComponent(nextRenderedElement, nodeType !== ReactNodeTypes.EMPTY /* shouldHaveDebugID */ - ); - this._renderedComponent = child; - - var nextMarkup = ReactReconciler.mountComponent(child, transaction, this._hostParent, this._hostContainerInfo, this._processChildContext(context), debugID); - - if (process.env.NODE_ENV !== 'production') { - if (debugID !== 0) { - var childDebugIDs = child._debugID !== 0 ? [child._debugID] : []; - ReactInstrumentation.debugTool.onSetChildren(debugID, childDebugIDs); - } - } - - this._replaceNodeWithMarkup(oldHostNode, nextMarkup, prevComponentInstance); - } - }, - - /** - * Overridden in shallow rendering. - * - * @protected - */ - _replaceNodeWithMarkup: function (oldHostNode, nextMarkup, prevInstance) { - ReactComponentEnvironment.replaceNodeWithMarkup(oldHostNode, nextMarkup, prevInstance); - }, - - /** - * @protected - */ - _renderValidatedComponentWithoutOwnerOrContext: function () { - var inst = this._instance; - var renderedElement; - - if (process.env.NODE_ENV !== 'production') { - renderedElement = measureLifeCyclePerf(function () { - return inst.render(); - }, this._debugID, 'render'); - } else { - renderedElement = inst.render(); - } - - if (process.env.NODE_ENV !== 'production') { - // We allow auto-mocks to proceed as if they're returning null. - if (renderedElement === undefined && inst.render._isMockFunction) { - // This is probably bad practice. Consider warning here and - // deprecating this convenience. - renderedElement = null; - } - } - - return renderedElement; - }, - - /** - * @private - */ - _renderValidatedComponent: function () { - var renderedElement; - if (process.env.NODE_ENV !== 'production' || this._compositeType !== CompositeTypes.StatelessFunctional) { - ReactCurrentOwner.current = this; - try { - renderedElement = this._renderValidatedComponentWithoutOwnerOrContext(); - } finally { - ReactCurrentOwner.current = null; - } - } else { - renderedElement = this._renderValidatedComponentWithoutOwnerOrContext(); - } - !( - // TODO: An `isValidNode` function would probably be more appropriate - renderedElement === null || renderedElement === false || React.isValidElement(renderedElement)) ? process.env.NODE_ENV !== 'production' ? invariant(false, '%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') : _prodInvariant('109', this.getName() || 'ReactCompositeComponent') : void 0; - - return renderedElement; - }, - - /** - * Lazily allocates the refs object and stores `component` as `ref`. - * - * @param {string} ref Reference name. - * @param {component} component Component to store as `ref`. - * @final - * @private - */ - attachRef: function (ref, component) { - var inst = this.getPublicInstance(); - !(inst != null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Stateless function components cannot have refs.') : _prodInvariant('110') : void 0; - var publicComponentInstance = component.getPublicInstance(); - if (process.env.NODE_ENV !== 'production') { - var componentName = component && component.getName ? component.getName() : 'a component'; - process.env.NODE_ENV !== 'production' ? warning(publicComponentInstance != null || component._compositeType !== CompositeTypes.StatelessFunctional, 'Stateless function components cannot be given refs ' + '(See ref "%s" in %s created by %s). ' + 'Attempts to access this ref will fail.', ref, componentName, this.getName()) : void 0; - } - var refs = inst.refs === emptyObject ? inst.refs = {} : inst.refs; - refs[ref] = publicComponentInstance; - }, - - /** - * Detaches a reference name. - * - * @param {string} ref Name to dereference. - * @final - * @private - */ - detachRef: function (ref) { - var refs = this.getPublicInstance().refs; - delete refs[ref]; - }, - - /** - * Get a text description of the component that can be used to identify it - * in error messages. - * @return {string} The name or null. - * @internal - */ - getName: function () { - var type = this._currentElement.type; - var constructor = this._instance && this._instance.constructor; - return type.displayName || constructor && constructor.displayName || type.name || constructor && constructor.name || null; - }, - - /** - * Get the publicly accessible representation of this component - i.e. what - * is exposed by refs and returned by render. Can be null for stateless - * components. - * - * @return {ReactComponent} the public component instance. - * @internal - */ - getPublicInstance: function () { - var inst = this._instance; - if (this._compositeType === CompositeTypes.StatelessFunctional) { - return null; - } - return inst; - }, - - // Stub - _instantiateReactComponent: null -}; - -module.exports = ReactCompositeComponent; - -/***/ }), -/* 150 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var _prodInvariant = __webpack_require__(2); - -var ReactPropTypeLocationNames = __webpack_require__(151); -var ReactPropTypesSecret = __webpack_require__(72); - -var invariant = __webpack_require__(0); -var warning = __webpack_require__(1); - -var ReactComponentTreeHook; - -if (typeof process !== 'undefined' && process.env && process.env.NODE_ENV === 'test') { - // Temporary hack. - // Inline requires don't work well with Jest: - // https://github.com/facebook/react/issues/7240 - // Remove the inline requires when we don't need them anymore: - // https://github.com/facebook/react/pull/7178 - ReactComponentTreeHook = __webpack_require__(6); -} - -var loggedTypeFailures = {}; - -/** - * Assert that the values match with the type specs. - * Error messages are memorized and will only be shown once. - * - * @param {object} typeSpecs Map of name to a ReactPropType - * @param {object} values Runtime values that need to be type-checked - * @param {string} location e.g. "prop", "context", "child context" - * @param {string} componentName Name of the component for error messages. - * @param {?object} element The React element that is being type-checked - * @param {?number} debugID The React component instance that is being type-checked - * @private - */ -function checkReactTypeSpec(typeSpecs, values, location, componentName, element, debugID) { - for (var typeSpecName in typeSpecs) { - if (typeSpecs.hasOwnProperty(typeSpecName)) { - var error; - // Prop type validation may throw. In case they do, we don't want to - // fail the render phase where it didn't fail before. So we log it. - // After these have been cleaned up, we'll let them throw. - try { - // This is intentionally an invariant that gets caught. It's the same - // behavior as without this statement except with a better message. - !(typeof typeSpecs[typeSpecName] === 'function') ? process.env.NODE_ENV !== 'production' ? invariant(false, '%s: %s type `%s` is invalid; it must be a function, usually from React.PropTypes.', componentName || 'React class', ReactPropTypeLocationNames[location], typeSpecName) : _prodInvariant('84', componentName || 'React class', ReactPropTypeLocationNames[location], typeSpecName) : void 0; - error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret); - } catch (ex) { - error = ex; - } - process.env.NODE_ENV !== 'production' ? warning(!error || error 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).', componentName || 'React class', ReactPropTypeLocationNames[location], typeSpecName, typeof error) : void 0; - if (error instanceof Error && !(error.message in loggedTypeFailures)) { - // Only monitor this failure once because there tends to be a lot of the - // same error. - loggedTypeFailures[error.message] = true; - - var componentStackInfo = ''; - - if (process.env.NODE_ENV !== 'production') { - if (!ReactComponentTreeHook) { - ReactComponentTreeHook = __webpack_require__(6); - } - if (debugID !== null) { - componentStackInfo = ReactComponentTreeHook.getStackAddendumByID(debugID); - } else if (element !== null) { - componentStackInfo = ReactComponentTreeHook.getCurrentStackAddendum(element); - } - } - - process.env.NODE_ENV !== 'production' ? warning(false, 'Failed %s type: %s%s', location, error.message, componentStackInfo) : void 0; - } - } - } -} - -module.exports = checkReactTypeSpec; - -/***/ }), -/* 151 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * - */ - - - -var ReactPropTypeLocationNames = {}; - -if (process.env.NODE_ENV !== 'production') { - ReactPropTypeLocationNames = { - prop: 'prop', - context: 'context', - childContext: 'child context' - }; -} - -module.exports = ReactPropTypeLocationNames; - -/***/ }), -/* 152 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * - */ - - - -var nextDebugID = 1; - -function getNextDebugID() { - return nextDebugID++; -} - -module.exports = getNextDebugID; - -/***/ }), -/* 153 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2014-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * - */ - - - -// The Symbol used to tag the ReactElement type. If there is no native Symbol -// nor polyfill, then a plain number is used for performance. - -var REACT_ELEMENT_TYPE = typeof Symbol === 'function' && Symbol['for'] && Symbol['for']('react.element') || 0xeac7; - -module.exports = REACT_ELEMENT_TYPE; - -/***/ }), -/* 154 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * - */ - - - -/* global Symbol */ - -var ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator; -var FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec. - -/** - * Returns the iterator method function contained on the iterable object. - * - * Be sure to invoke the function with the iterable as context: - * - * var iteratorFn = getIteratorFn(myIterable); - * if (iteratorFn) { - * var iterator = iteratorFn.call(myIterable); - * ... - * } - * - * @param {?object} maybeIterable - * @return {?function} - */ -function getIteratorFn(maybeIterable) { - var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]); - if (typeof iteratorFn === 'function') { - return iteratorFn; - } -} - -module.exports = getIteratorFn; - -/***/ }), -/* 155 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * - */ - - - -var KeyEscapeUtils = __webpack_require__(47); -var traverseAllChildren = __webpack_require__(78); -var warning = __webpack_require__(1); - -var ReactComponentTreeHook; - -if (typeof process !== 'undefined' && process.env && process.env.NODE_ENV === 'test') { - // Temporary hack. - // Inline requires don't work well with Jest: - // https://github.com/facebook/react/issues/7240 - // Remove the inline requires when we don't need them anymore: - // https://github.com/facebook/react/pull/7178 - ReactComponentTreeHook = __webpack_require__(6); -} - -/** - * @param {function} traverseContext Context passed through traversal. - * @param {?ReactComponent} child React child component. - * @param {!string} name String name of key path to child. - * @param {number=} selfDebugID Optional debugID of the current internal instance. - */ -function flattenSingleChildIntoContext(traverseContext, child, name, selfDebugID) { - // We found a component instance. - if (traverseContext && typeof traverseContext === 'object') { - var result = traverseContext; - var keyUnique = result[name] === undefined; - if (process.env.NODE_ENV !== 'production') { - if (!ReactComponentTreeHook) { - ReactComponentTreeHook = __webpack_require__(6); - } - if (!keyUnique) { - process.env.NODE_ENV !== 'production' ? warning(false, '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', KeyEscapeUtils.unescape(name), ReactComponentTreeHook.getStackAddendumByID(selfDebugID)) : void 0; - } - } - if (keyUnique && child != null) { - result[name] = child; - } - } -} - -/** - * Flattens children that are typically specified as `props.children`. Any null - * children will not be included in the resulting object. - * @return {!object} flattened children keyed by name. - */ -function flattenChildren(children, selfDebugID) { - if (children == null) { - return children; - } - var result = {}; - - if (process.env.NODE_ENV !== 'production') { - traverseAllChildren(children, function (traverseContext, child, name) { - return flattenSingleChildIntoContext(traverseContext, child, name, selfDebugID); - }, result); - } else { - traverseAllChildren(children, flattenSingleChildIntoContext, result); - } - return result; -} - -module.exports = flattenChildren; - -/***/ }), -/* 156 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2014-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var _assign = __webpack_require__(3); - -var PooledClass = __webpack_require__(14); -var Transaction = __webpack_require__(27); -var ReactInstrumentation = __webpack_require__(8); -var ReactServerUpdateQueue = __webpack_require__(157); - -/** - * Executed within the scope of the `Transaction` instance. Consider these as - * being member methods, but with an implied ordering while being isolated from - * each other. - */ -var TRANSACTION_WRAPPERS = []; - -if (process.env.NODE_ENV !== 'production') { - TRANSACTION_WRAPPERS.push({ - initialize: ReactInstrumentation.debugTool.onBeginFlush, - close: ReactInstrumentation.debugTool.onEndFlush - }); -} - -var noopCallbackQueue = { - enqueue: function () {} -}; - -/** - * @class ReactServerRenderingTransaction - * @param {boolean} renderToStaticMarkup - */ -function ReactServerRenderingTransaction(renderToStaticMarkup) { - this.reinitializeTransaction(); - this.renderToStaticMarkup = renderToStaticMarkup; - this.useCreateElement = false; - this.updateQueue = new ReactServerUpdateQueue(this); -} - -var Mixin = { - /** - * @see Transaction - * @abstract - * @final - * @return {array} Empty list of operation wrap procedures. - */ - getTransactionWrappers: function () { - return TRANSACTION_WRAPPERS; - }, - - /** - * @return {object} The queue to collect `onDOMReady` callbacks with. - */ - getReactMountReady: function () { - return noopCallbackQueue; - }, - - /** - * @return {object} The queue to collect React async events. - */ - getUpdateQueue: function () { - return this.updateQueue; - }, - - /** - * `PooledClass` looks for this, and will invoke this before allowing this - * instance to be reused. - */ - destructor: function () {}, - - checkpoint: function () {}, - - rollback: function () {} -}; - -_assign(ReactServerRenderingTransaction.prototype, Transaction, Mixin); - -PooledClass.addPoolingTo(ReactServerRenderingTransaction); - -module.exports = ReactServerRenderingTransaction; - -/***/ }), -/* 157 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2015-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * - */ - - - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -var ReactUpdateQueue = __webpack_require__(48); - -var warning = __webpack_require__(1); - -function warnNoop(publicInstance, callerName) { - if (process.env.NODE_ENV !== 'production') { - var constructor = publicInstance.constructor; - process.env.NODE_ENV !== 'production' ? warning(false, '%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.', callerName, callerName, constructor && (constructor.displayName || constructor.name) || 'ReactClass') : void 0; - } -} - -/** - * This is the update queue used for server rendering. - * It delegates to ReactUpdateQueue while server rendering is in progress and - * switches to ReactNoopUpdateQueue after the transaction has completed. - * @class ReactServerUpdateQueue - * @param {Transaction} transaction - */ - -var ReactServerUpdateQueue = function () { - function ReactServerUpdateQueue(transaction) { - _classCallCheck(this, ReactServerUpdateQueue); - - this.transaction = transaction; - } - - /** - * Checks whether or not this composite component is mounted. - * @param {ReactClass} publicInstance The instance we want to test. - * @return {boolean} True if mounted, false otherwise. - * @protected - * @final - */ - - - ReactServerUpdateQueue.prototype.isMounted = function isMounted(publicInstance) { - return false; - }; - - /** - * Enqueue a callback that will be executed after all the pending updates - * have processed. - * - * @param {ReactClass} publicInstance The instance to use as `this` context. - * @param {?function} callback Called after state is updated. - * @internal - */ - - - ReactServerUpdateQueue.prototype.enqueueCallback = function enqueueCallback(publicInstance, callback, callerName) { - if (this.transaction.isInTransaction()) { - ReactUpdateQueue.enqueueCallback(publicInstance, callback, callerName); - } - }; - - /** - * Forces an update. This should only be invoked when it is known with - * certainty that we are **not** in a DOM transaction. - * - * You may want to call this when you know that some deeper aspect of the - * component's state has changed but `setState` was not called. - * - * This will not invoke `shouldComponentUpdate`, but it will invoke - * `componentWillUpdate` and `componentDidUpdate`. - * - * @param {ReactClass} publicInstance The instance that should rerender. - * @internal - */ - - - ReactServerUpdateQueue.prototype.enqueueForceUpdate = function enqueueForceUpdate(publicInstance) { - if (this.transaction.isInTransaction()) { - ReactUpdateQueue.enqueueForceUpdate(publicInstance); - } else { - warnNoop(publicInstance, 'forceUpdate'); - } - }; - - /** - * Replaces all of the state. Always use this or `setState` to mutate state. - * You should treat `this.state` as immutable. - * - * There is no guarantee that `this.state` will be immediately updated, so - * accessing `this.state` after calling this method may return the old value. - * - * @param {ReactClass} publicInstance The instance that should rerender. - * @param {object|function} completeState Next state. - * @internal - */ - - - ReactServerUpdateQueue.prototype.enqueueReplaceState = function enqueueReplaceState(publicInstance, completeState) { - if (this.transaction.isInTransaction()) { - ReactUpdateQueue.enqueueReplaceState(publicInstance, completeState); - } else { - warnNoop(publicInstance, 'replaceState'); - } - }; - - /** - * Sets a subset of the state. This only exists because _pendingState is - * internal. This provides a merging strategy that is not available to deep - * properties which is confusing. TODO: Expose pendingState or don't use it - * during the merge. - * - * @param {ReactClass} publicInstance The instance that should rerender. - * @param {object|function} partialState Next partial state to be merged with state. - * @internal - */ - - - ReactServerUpdateQueue.prototype.enqueueSetState = function enqueueSetState(publicInstance, partialState) { - if (this.transaction.isInTransaction()) { - ReactUpdateQueue.enqueueSetState(publicInstance, partialState); - } else { - warnNoop(publicInstance, 'setState'); - } - }; - - return ReactServerUpdateQueue; -}(); - -module.exports = ReactServerUpdateQueue; - -/***/ }), -/* 158 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2014-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var _assign = __webpack_require__(3); - -var DOMLazyTree = __webpack_require__(18); -var ReactDOMComponentTree = __webpack_require__(4); - -var ReactDOMEmptyComponent = function (instantiate) { - // ReactCompositeComponent uses this: - this._currentElement = null; - // ReactDOMComponentTree uses these: - this._hostNode = null; - this._hostParent = null; - this._hostContainerInfo = null; - this._domID = 0; -}; -_assign(ReactDOMEmptyComponent.prototype, { - mountComponent: function (transaction, hostParent, hostContainerInfo, context) { - var domID = hostContainerInfo._idCounter++; - this._domID = domID; - this._hostParent = hostParent; - this._hostContainerInfo = hostContainerInfo; - - var nodeValue = ' react-empty: ' + this._domID + ' '; - if (transaction.useCreateElement) { - var ownerDocument = hostContainerInfo._ownerDocument; - var node = ownerDocument.createComment(nodeValue); - ReactDOMComponentTree.precacheNode(this, node); - return DOMLazyTree(node); - } else { - if (transaction.renderToStaticMarkup) { - // Normally we'd insert a comment node, but since this is a situation - // where React won't take over (static pages), we can simply return - // nothing. - return ''; - } - return '<!--' + nodeValue + '-->'; - } - }, - receiveComponent: function () {}, - getHostNode: function () { - return ReactDOMComponentTree.getNodeFromInstance(this); - }, - unmountComponent: function () { - ReactDOMComponentTree.uncacheNode(this); - } -}); - -module.exports = ReactDOMEmptyComponent; - -/***/ }), -/* 159 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2015-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var _prodInvariant = __webpack_require__(2); - -var invariant = __webpack_require__(0); - -/** - * Return the lowest common ancestor of A and B, or null if they are in - * different trees. - */ -function getLowestCommonAncestor(instA, instB) { - !('_hostNode' in instA) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'getNodeFromInstance: Invalid argument.') : _prodInvariant('33') : void 0; - !('_hostNode' in instB) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'getNodeFromInstance: Invalid argument.') : _prodInvariant('33') : void 0; - - var depthA = 0; - for (var tempA = instA; tempA; tempA = tempA._hostParent) { - depthA++; - } - var depthB = 0; - for (var tempB = instB; tempB; tempB = tempB._hostParent) { - depthB++; - } - - // If A is deeper, crawl up. - while (depthA - depthB > 0) { - instA = instA._hostParent; - depthA--; - } - - // If B is deeper, crawl up. - while (depthB - depthA > 0) { - instB = instB._hostParent; - depthB--; - } - - // Walk in lockstep until we find a match. - var depth = depthA; - while (depth--) { - if (instA === instB) { - return instA; - } - instA = instA._hostParent; - instB = instB._hostParent; - } - return null; -} - -/** - * Return if A is an ancestor of B. - */ -function isAncestor(instA, instB) { - !('_hostNode' in instA) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'isAncestor: Invalid argument.') : _prodInvariant('35') : void 0; - !('_hostNode' in instB) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'isAncestor: Invalid argument.') : _prodInvariant('35') : void 0; - - while (instB) { - if (instB === instA) { - return true; - } - instB = instB._hostParent; - } - return false; -} - -/** - * Return the parent instance of the passed-in instance. - */ -function getParentInstance(inst) { - !('_hostNode' in inst) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'getParentInstance: Invalid argument.') : _prodInvariant('36') : void 0; - - return inst._hostParent; -} - -/** - * Simulates the traversal of a two-phase, capture/bubble event dispatch. - */ -function traverseTwoPhase(inst, fn, arg) { - var path = []; - while (inst) { - path.push(inst); - inst = inst._hostParent; - } - var i; - for (i = path.length; i-- > 0;) { - fn(path[i], 'captured', arg); - } - for (i = 0; i < path.length; i++) { - fn(path[i], 'bubbled', arg); - } -} - -/** - * Traverses the ID hierarchy and invokes the supplied `cb` on any IDs that - * should would receive a `mouseEnter` or `mouseLeave` event. - * - * Does not invoke the callback on the nearest common ancestor because nothing - * "entered" or "left" that element. - */ -function traverseEnterLeave(from, to, fn, argFrom, argTo) { - var common = from && to ? getLowestCommonAncestor(from, to) : null; - var pathFrom = []; - while (from && from !== common) { - pathFrom.push(from); - from = from._hostParent; - } - var pathTo = []; - while (to && to !== common) { - pathTo.push(to); - to = to._hostParent; - } - var i; - for (i = 0; i < pathFrom.length; i++) { - fn(pathFrom[i], 'bubbled', argFrom); - } - for (i = pathTo.length; i-- > 0;) { - fn(pathTo[i], 'captured', argTo); - } -} - -module.exports = { - isAncestor: isAncestor, - getLowestCommonAncestor: getLowestCommonAncestor, - getParentInstance: getParentInstance, - traverseTwoPhase: traverseTwoPhase, - traverseEnterLeave: traverseEnterLeave -}; - -/***/ }), -/* 160 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var _prodInvariant = __webpack_require__(2), - _assign = __webpack_require__(3); - -var DOMChildrenOperations = __webpack_require__(40); -var DOMLazyTree = __webpack_require__(18); -var ReactDOMComponentTree = __webpack_require__(4); - -var escapeTextContentForBrowser = __webpack_require__(30); -var invariant = __webpack_require__(0); -var validateDOMNesting = __webpack_require__(49); - -/** - * Text nodes violate a couple assumptions that React makes about components: - * - * - When mounting text into the DOM, adjacent text nodes are merged. - * - Text nodes cannot be assigned a React root ID. - * - * This component is used to wrap strings between comment nodes so that they - * can undergo the same reconciliation that is applied to elements. - * - * TODO: Investigate representing React components in the DOM with text nodes. - * - * @class ReactDOMTextComponent - * @extends ReactComponent - * @internal - */ -var ReactDOMTextComponent = function (text) { - // TODO: This is really a ReactText (ReactNode), not a ReactElement - this._currentElement = text; - this._stringText = '' + text; - // ReactDOMComponentTree uses these: - this._hostNode = null; - this._hostParent = null; - - // Properties - this._domID = 0; - this._mountIndex = 0; - this._closingComment = null; - this._commentNodes = null; -}; - -_assign(ReactDOMTextComponent.prototype, { - /** - * Creates the markup for this text node. This node is not intended to have - * any features besides containing text content. - * - * @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction - * @return {string} Markup for this text node. - * @internal - */ - mountComponent: function (transaction, hostParent, hostContainerInfo, context) { - if (process.env.NODE_ENV !== 'production') { - var parentInfo; - if (hostParent != null) { - parentInfo = hostParent._ancestorInfo; - } else if (hostContainerInfo != null) { - parentInfo = hostContainerInfo._ancestorInfo; - } - if (parentInfo) { - // parentInfo should always be present except for the top-level - // component when server rendering - validateDOMNesting(null, this._stringText, this, parentInfo); - } - } - - var domID = hostContainerInfo._idCounter++; - var openingValue = ' react-text: ' + domID + ' '; - var closingValue = ' /react-text '; - this._domID = domID; - this._hostParent = hostParent; - if (transaction.useCreateElement) { - var ownerDocument = hostContainerInfo._ownerDocument; - var openingComment = ownerDocument.createComment(openingValue); - var closingComment = ownerDocument.createComment(closingValue); - var lazyTree = DOMLazyTree(ownerDocument.createDocumentFragment()); - DOMLazyTree.queueChild(lazyTree, DOMLazyTree(openingComment)); - if (this._stringText) { - DOMLazyTree.queueChild(lazyTree, DOMLazyTree(ownerDocument.createTextNode(this._stringText))); - } - DOMLazyTree.queueChild(lazyTree, DOMLazyTree(closingComment)); - ReactDOMComponentTree.precacheNode(this, openingComment); - this._closingComment = closingComment; - return lazyTree; - } else { - var escapedText = escapeTextContentForBrowser(this._stringText); - - if (transaction.renderToStaticMarkup) { - // Normally we'd wrap this between comment nodes for the reasons stated - // above, but since this is a situation where React won't take over - // (static pages), we can simply return the text as it is. - return escapedText; - } - - return '<!--' + openingValue + '-->' + escapedText + '<!--' + closingValue + '-->'; - } - }, - - /** - * Updates this component by updating the text content. - * - * @param {ReactText} nextText The next text content - * @param {ReactReconcileTransaction} transaction - * @internal - */ - receiveComponent: function (nextText, transaction) { - if (nextText !== this._currentElement) { - this._currentElement = nextText; - var nextStringText = '' + nextText; - if (nextStringText !== this._stringText) { - // TODO: Save this as pending props and use performUpdateIfNecessary - // and/or updateComponent to do the actual update for consistency with - // other component types? - this._stringText = nextStringText; - var commentNodes = this.getHostNode(); - DOMChildrenOperations.replaceDelimitedText(commentNodes[0], commentNodes[1], nextStringText); - } - } - }, - - getHostNode: function () { - var hostNode = this._commentNodes; - if (hostNode) { - return hostNode; - } - if (!this._closingComment) { - var openingComment = ReactDOMComponentTree.getNodeFromInstance(this); - var node = openingComment.nextSibling; - while (true) { - !(node != null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Missing closing comment for text component %s', this._domID) : _prodInvariant('67', this._domID) : void 0; - if (node.nodeType === 8 && node.nodeValue === ' /react-text ') { - this._closingComment = node; - break; - } - node = node.nextSibling; - } - } - hostNode = [this._hostNode, this._closingComment]; - this._commentNodes = hostNode; - return hostNode; - }, - - unmountComponent: function () { - this._closingComment = null; - this._commentNodes = null; - ReactDOMComponentTree.uncacheNode(this); - } -}); - -module.exports = ReactDOMTextComponent; - -/***/ }), -/* 161 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var _assign = __webpack_require__(3); - -var ReactUpdates = __webpack_require__(10); -var Transaction = __webpack_require__(27); - -var emptyFunction = __webpack_require__(7); - -var RESET_BATCHED_UPDATES = { - initialize: emptyFunction, - close: function () { - ReactDefaultBatchingStrategy.isBatchingUpdates = false; - } -}; - -var FLUSH_BATCHED_UPDATES = { - initialize: emptyFunction, - close: ReactUpdates.flushBatchedUpdates.bind(ReactUpdates) -}; - -var TRANSACTION_WRAPPERS = [FLUSH_BATCHED_UPDATES, RESET_BATCHED_UPDATES]; - -function ReactDefaultBatchingStrategyTransaction() { - this.reinitializeTransaction(); -} - -_assign(ReactDefaultBatchingStrategyTransaction.prototype, Transaction, { - getTransactionWrappers: function () { - return TRANSACTION_WRAPPERS; - } -}); - -var transaction = new ReactDefaultBatchingStrategyTransaction(); - -var ReactDefaultBatchingStrategy = { - isBatchingUpdates: false, - - /** - * Call the provided function in a context within which calls to `setState` - * and friends are batched such that components aren't updated unnecessarily. - */ - batchedUpdates: function (callback, a, b, c, d, e) { - var alreadyBatchingUpdates = ReactDefaultBatchingStrategy.isBatchingUpdates; - - ReactDefaultBatchingStrategy.isBatchingUpdates = true; - - // The code is written this way to avoid extra allocations - if (alreadyBatchingUpdates) { - return callback(a, b, c, d, e); - } else { - return transaction.perform(callback, null, a, b, c, d, e); - } - } -}; - -module.exports = ReactDefaultBatchingStrategy; - -/***/ }), -/* 162 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var _assign = __webpack_require__(3); - -var EventListener = __webpack_require__(79); -var ExecutionEnvironment = __webpack_require__(5); -var PooledClass = __webpack_require__(14); -var ReactDOMComponentTree = __webpack_require__(4); -var ReactUpdates = __webpack_require__(10); - -var getEventTarget = __webpack_require__(37); -var getUnboundedScrollPosition = __webpack_require__(163); - -/** - * Find the deepest React component completely containing the root of the - * passed-in instance (for use when entire React trees are nested within each - * other). If React trees are not nested, returns null. - */ -function findParent(inst) { - // TODO: It may be a good idea to cache this to prevent unnecessary DOM - // traversal, but caching is difficult to do correctly without using a - // mutation observer to listen for all DOM changes. - while (inst._hostParent) { - inst = inst._hostParent; - } - var rootNode = ReactDOMComponentTree.getNodeFromInstance(inst); - var container = rootNode.parentNode; - return ReactDOMComponentTree.getClosestInstanceFromNode(container); -} - -// Used to store ancestor hierarchy in top level callback -function TopLevelCallbackBookKeeping(topLevelType, nativeEvent) { - this.topLevelType = topLevelType; - this.nativeEvent = nativeEvent; - this.ancestors = []; -} -_assign(TopLevelCallbackBookKeeping.prototype, { - destructor: function () { - this.topLevelType = null; - this.nativeEvent = null; - this.ancestors.length = 0; - } -}); -PooledClass.addPoolingTo(TopLevelCallbackBookKeeping, PooledClass.twoArgumentPooler); - -function handleTopLevelImpl(bookKeeping) { - var nativeEventTarget = getEventTarget(bookKeeping.nativeEvent); - var targetInst = ReactDOMComponentTree.getClosestInstanceFromNode(nativeEventTarget); - - // Loop through the hierarchy, in case there's any nested components. - // It's important that we build the array of ancestors before calling any - // event handlers, because event handlers can modify the DOM, leading to - // inconsistencies with ReactMount's node cache. See #1105. - var ancestor = targetInst; - do { - bookKeeping.ancestors.push(ancestor); - ancestor = ancestor && findParent(ancestor); - } while (ancestor); - - for (var i = 0; i < bookKeeping.ancestors.length; i++) { - targetInst = bookKeeping.ancestors[i]; - ReactEventListener._handleTopLevel(bookKeeping.topLevelType, targetInst, bookKeeping.nativeEvent, getEventTarget(bookKeeping.nativeEvent)); - } -} - -function scrollValueMonitor(cb) { - var scrollPosition = getUnboundedScrollPosition(window); - cb(scrollPosition); -} - -var ReactEventListener = { - _enabled: true, - _handleTopLevel: null, - - WINDOW_HANDLE: ExecutionEnvironment.canUseDOM ? window : null, - - setHandleTopLevel: function (handleTopLevel) { - ReactEventListener._handleTopLevel = handleTopLevel; - }, - - setEnabled: function (enabled) { - ReactEventListener._enabled = !!enabled; - }, - - isEnabled: function () { - return ReactEventListener._enabled; - }, - - /** - * Traps top-level events by using event bubbling. - * - * @param {string} topLevelType Record from `EventConstants`. - * @param {string} handlerBaseName Event name (e.g. "click"). - * @param {object} element Element on which to attach listener. - * @return {?object} An object with a remove function which will forcefully - * remove the listener. - * @internal - */ - trapBubbledEvent: function (topLevelType, handlerBaseName, element) { - if (!element) { - return null; - } - return EventListener.listen(element, handlerBaseName, ReactEventListener.dispatchEvent.bind(null, topLevelType)); - }, - - /** - * Traps a top-level event by using event capturing. - * - * @param {string} topLevelType Record from `EventConstants`. - * @param {string} handlerBaseName Event name (e.g. "click"). - * @param {object} element Element on which to attach listener. - * @return {?object} An object with a remove function which will forcefully - * remove the listener. - * @internal - */ - trapCapturedEvent: function (topLevelType, handlerBaseName, element) { - if (!element) { - return null; - } - return EventListener.capture(element, handlerBaseName, ReactEventListener.dispatchEvent.bind(null, topLevelType)); - }, - - monitorScrollValue: function (refresh) { - var callback = scrollValueMonitor.bind(null, refresh); - EventListener.listen(window, 'scroll', callback); - }, - - dispatchEvent: function (topLevelType, nativeEvent) { - if (!ReactEventListener._enabled) { - return; - } - - var bookKeeping = TopLevelCallbackBookKeeping.getPooled(topLevelType, nativeEvent); - try { - // Event queue being processed in the same cycle allows - // `preventDefault`. - ReactUpdates.batchedUpdates(handleTopLevelImpl, bookKeeping); - } finally { - TopLevelCallbackBookKeeping.release(bookKeeping); - } - } -}; - -module.exports = ReactEventListener; - -/***/ }), -/* 163 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. + * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. + */var r=n(4),o="function"==typeof Symbol&&Symbol.for,i=o?Symbol.for("react.element"):60103,a=o?Symbol.for("react.portal"):60106,l=o?Symbol.for("react.fragment"):60107,u=o?Symbol.for("react.strict_mode"):60108,s=o?Symbol.for("react.profiler"):60114,c=o?Symbol.for("react.provider"):60109,p=o?Symbol.for("react.context"):60110,f=o?Symbol.for("react.concurrent_mode"):60111,d=o?Symbol.for("react.forward_ref"):60112,h=o?Symbol.for("react.suspense"):60113,m=o?Symbol.for("react.memo"):60115,v=o?Symbol.for("react.lazy"):60116,y="function"==typeof Symbol&&Symbol.iterator;function g(e){for(var t=arguments.length-1,n="https://reactjs.org/docs/error-decoder.html?invariant="+e,r=0;r<t;r++)n+="&args[]="+encodeURIComponent(arguments[r+1]);!function(e,t,n,r,o,i,a,l){if(!e){if(e=void 0,void 0===t)e=Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var u=[n,r,o,i,a,l],s=0;(e=Error(t.replace(/%s/g,function(){return u[s++]}))).name="Invariant Violation"}throw e.framesToPop=1,e}}(!1,"Minified React error #"+e+"; visit %s for the full message or use the non-minified dev environment for full errors and additional helpful warnings. ",n)}var b={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},E={};function x(e,t,n){this.props=e,this.context=t,this.refs=E,this.updater=n||b}function w(){}function k(e,t,n){this.props=e,this.context=t,this.refs=E,this.updater=n||b}x.prototype.isReactComponent={},x.prototype.setState=function(e,t){"object"!=typeof e&&"function"!=typeof e&&null!=e&&g("85"),this.updater.enqueueSetState(this,e,t,"setState")},x.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},w.prototype=x.prototype;var C=k.prototype=new w;C.constructor=k,r(C,x.prototype),C.isPureReactComponent=!0;var S={current:null},T={current:null},_=Object.prototype.hasOwnProperty,O={key:!0,ref:!0,__self:!0,__source:!0};function P(e,t,n){var r=void 0,o={},a=null,l=null;if(null!=t)for(r in void 0!==t.ref&&(l=t.ref),void 0!==t.key&&(a=""+t.key),t)_.call(t,r)&&!O.hasOwnProperty(r)&&(o[r]=t[r]);var u=arguments.length-2;if(1===u)o.children=n;else if(1<u){for(var s=Array(u),c=0;c<u;c++)s[c]=arguments[c+2];o.children=s}if(e&&e.defaultProps)for(r in u=e.defaultProps)void 0===o[r]&&(o[r]=u[r]);return{$$typeof:i,type:e,key:a,ref:l,props:o,_owner:T.current}}function F(e){return"object"==typeof e&&null!==e&&e.$$typeof===i}var D=/\/+/g,A=[];function N(e,t,n,r){if(A.length){var o=A.pop();return o.result=e,o.keyPrefix=t,o.func=n,o.context=r,o.count=0,o}return{result:e,keyPrefix:t,func:n,context:r,count:0}}function I(e){e.result=null,e.keyPrefix=null,e.func=null,e.context=null,e.count=0,10>A.length&&A.push(e)}function R(e,t,n){return null==e?0:function e(t,n,r,o){var l=typeof t;"undefined"!==l&&"boolean"!==l||(t=null);var u=!1;if(null===t)u=!0;else switch(l){case"string":case"number":u=!0;break;case"object":switch(t.$$typeof){case i:case a:u=!0}}if(u)return r(o,t,""===n?"."+M(t,0):n),1;if(u=0,n=""===n?".":n+":",Array.isArray(t))for(var s=0;s<t.length;s++){var c=n+M(l=t[s],s);u+=e(l,c,r,o)}else if(c=null===t||"object"!=typeof t?null:"function"==typeof(c=y&&t[y]||t["@@iterator"])?c:null,"function"==typeof c)for(t=c.call(t),s=0;!(l=t.next()).done;)u+=e(l=l.value,c=n+M(l,s++),r,o);else"object"===l&&g("31","[object Object]"==(r=""+t)?"object with keys {"+Object.keys(t).join(", ")+"}":r,"");return u}(e,"",t,n)}function M(e,t){return"object"==typeof e&&null!==e&&null!=e.key?function(e){var t={"=":"=0",":":"=2"};return"$"+(""+e).replace(/[=:]/g,function(e){return t[e]})}(e.key):t.toString(36)}function z(e,t){e.func.call(e.context,t,e.count++)}function V(e,t,n){var r=e.result,o=e.keyPrefix;e=e.func.call(e.context,t,e.count++),Array.isArray(e)?U(e,r,n,function(e){return e}):null!=e&&(F(e)&&(e=function(e,t){return{$$typeof:i,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(e,o+(!e.key||t&&t.key===e.key?"":(""+e.key).replace(D,"$&/")+"/")+n)),r.push(e))}function U(e,t,n,r,o){var i="";null!=n&&(i=(""+n).replace(D,"$&/")+"/"),R(e,V,t=N(t,i,r,o)),I(t)}function j(){var e=S.current;return null===e&&g("321"),e}var B={Children:{map:function(e,t,n){if(null==e)return e;var r=[];return U(e,r,null,t,n),r},forEach:function(e,t,n){if(null==e)return e;R(e,z,t=N(null,null,t,n)),I(t)},count:function(e){return R(e,function(){return null},null)},toArray:function(e){var t=[];return U(e,t,null,function(e){return e}),t},only:function(e){return F(e)||g("143"),e}},createRef:function(){return{current:null}},Component:x,PureComponent:k,createContext:function(e,t){return void 0===t&&(t=null),(e={$$typeof:p,_calculateChangedBits:t,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null}).Provider={$$typeof:c,_context:e},e.Consumer=e},forwardRef:function(e){return{$$typeof:d,render:e}},lazy:function(e){return{$$typeof:v,_ctor:e,_status:-1,_result:null}},memo:function(e,t){return{$$typeof:m,type:e,compare:void 0===t?null:t}},useCallback:function(e,t){return j().useCallback(e,t)},useContext:function(e,t){return j().useContext(e,t)},useEffect:function(e,t){return j().useEffect(e,t)},useImperativeHandle:function(e,t,n){return j().useImperativeHandle(e,t,n)},useDebugValue:function(){},useLayoutEffect:function(e,t){return j().useLayoutEffect(e,t)},useMemo:function(e,t){return j().useMemo(e,t)},useReducer:function(e,t,n){return j().useReducer(e,t,n)},useRef:function(e){return j().useRef(e)},useState:function(e){return j().useState(e)},Fragment:l,StrictMode:u,Suspense:h,createElement:P,cloneElement:function(e,t,n){null==e&&g("267",e);var o=void 0,a=r({},e.props),l=e.key,u=e.ref,s=e._owner;if(null!=t){void 0!==t.ref&&(u=t.ref,s=T.current),void 0!==t.key&&(l=""+t.key);var c=void 0;for(o in e.type&&e.type.defaultProps&&(c=e.type.defaultProps),t)_.call(t,o)&&!O.hasOwnProperty(o)&&(a[o]=void 0===t[o]&&void 0!==c?c[o]:t[o])}if(1===(o=arguments.length-2))a.children=n;else if(1<o){c=Array(o);for(var p=0;p<o;p++)c[p]=arguments[p+2];a.children=c}return{$$typeof:i,type:e.type,key:l,ref:u,props:a,_owner:s}},createFactory:function(e){var t=P.bind(null,e);return t.type=e,t},isValidElement:F,version:"16.8.6",unstable_ConcurrentMode:f,unstable_Profiler:s,__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:{ReactCurrentDispatcher:S,ReactCurrentOwner:T,assign:r}},L={default:B},W=L&&B||L;e.exports=W.default||W},function(e,t,n){"use strict"; +/** @license React v16.6.1 + * react-dom.production.min.js * - * @typechecks - */ - - - -/** - * Gets the scroll position of the supplied element or window. - * - * The return values are unbounded, unlike `getScrollPosition`. This means they - * may be negative or exceed the element boundaries (which is possible using - * inertial scrolling). - * - * @param {DOMWindow|DOMElement} scrollable - * @return {object} Map with `x` and `y` keys. - */ - -function getUnboundedScrollPosition(scrollable) { - if (scrollable.Window && scrollable instanceof scrollable.Window) { - return { - x: scrollable.pageXOffset || scrollable.document.documentElement.scrollLeft, - y: scrollable.pageYOffset || scrollable.document.documentElement.scrollTop - }; - } - return { - x: scrollable.scrollLeft, - y: scrollable.scrollTop - }; -} - -module.exports = getUnboundedScrollPosition; - -/***/ }), -/* 164 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var DOMProperty = __webpack_require__(12); -var EventPluginHub = __webpack_require__(21); -var EventPluginUtils = __webpack_require__(35); -var ReactComponentEnvironment = __webpack_require__(44); -var ReactEmptyComponent = __webpack_require__(76); -var ReactBrowserEventEmitter = __webpack_require__(31); -var ReactHostComponent = __webpack_require__(77); -var ReactUpdates = __webpack_require__(10); - -var ReactInjection = { - Component: ReactComponentEnvironment.injection, - DOMProperty: DOMProperty.injection, - EmptyComponent: ReactEmptyComponent.injection, - EventPluginHub: EventPluginHub.injection, - EventPluginUtils: EventPluginUtils.injection, - EventEmitter: ReactBrowserEventEmitter.injection, - HostComponent: ReactHostComponent.injection, - Updates: ReactUpdates.injection -}; - -module.exports = ReactInjection; - -/***/ }), -/* 165 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var _assign = __webpack_require__(3); - -var CallbackQueue = __webpack_require__(63); -var PooledClass = __webpack_require__(14); -var ReactBrowserEventEmitter = __webpack_require__(31); -var ReactInputSelection = __webpack_require__(80); -var ReactInstrumentation = __webpack_require__(8); -var Transaction = __webpack_require__(27); -var ReactUpdateQueue = __webpack_require__(48); - -/** - * Ensures that, when possible, the selection range (currently selected text - * input) is not disturbed by performing the transaction. - */ -var SELECTION_RESTORATION = { - /** - * @return {Selection} Selection information. - */ - initialize: ReactInputSelection.getSelectionInformation, - /** - * @param {Selection} sel Selection information returned from `initialize`. - */ - close: ReactInputSelection.restoreSelection -}; - -/** - * Suppresses events (blur/focus) that could be inadvertently dispatched due to - * high level DOM manipulations (like temporarily removing a text input from the - * DOM). - */ -var EVENT_SUPPRESSION = { - /** - * @return {boolean} The enabled status of `ReactBrowserEventEmitter` before - * the reconciliation. - */ - initialize: function () { - var currentlyEnabled = ReactBrowserEventEmitter.isEnabled(); - ReactBrowserEventEmitter.setEnabled(false); - return currentlyEnabled; - }, - - /** - * @param {boolean} previouslyEnabled Enabled status of - * `ReactBrowserEventEmitter` before the reconciliation occurred. `close` - * restores the previous value. - */ - close: function (previouslyEnabled) { - ReactBrowserEventEmitter.setEnabled(previouslyEnabled); - } -}; - -/** - * Provides a queue for collecting `componentDidMount` and - * `componentDidUpdate` callbacks during the transaction. - */ -var ON_DOM_READY_QUEUEING = { - /** - * Initializes the internal `onDOMReady` queue. - */ - initialize: function () { - this.reactMountReady.reset(); - }, - - /** - * After DOM is flushed, invoke all registered `onDOMReady` callbacks. - */ - close: function () { - this.reactMountReady.notifyAll(); - } -}; - -/** - * Executed within the scope of the `Transaction` instance. Consider these as - * being member methods, but with an implied ordering while being isolated from - * each other. - */ -var TRANSACTION_WRAPPERS = [SELECTION_RESTORATION, EVENT_SUPPRESSION, ON_DOM_READY_QUEUEING]; - -if (process.env.NODE_ENV !== 'production') { - TRANSACTION_WRAPPERS.push({ - initialize: ReactInstrumentation.debugTool.onBeginFlush, - close: ReactInstrumentation.debugTool.onEndFlush - }); -} - -/** - * Currently: - * - The order that these are listed in the transaction is critical: - * - Suppresses events. - * - Restores selection range. - * - * Future: - * - Restore document/overflow scroll positions that were unintentionally - * modified via DOM insertions above the top viewport boundary. - * - Implement/integrate with customized constraint based layout system and keep - * track of which dimensions must be remeasured. - * - * @class ReactReconcileTransaction - */ -function ReactReconcileTransaction(useCreateElement) { - this.reinitializeTransaction(); - // Only server-side rendering really needs this option (see - // `ReactServerRendering`), but server-side uses - // `ReactServerRenderingTransaction` instead. This option is here so that it's - // accessible and defaults to false when `ReactDOMComponent` and - // `ReactDOMTextComponent` checks it in `mountComponent`.` - this.renderToStaticMarkup = false; - this.reactMountReady = CallbackQueue.getPooled(null); - this.useCreateElement = useCreateElement; -} - -var Mixin = { - /** - * @see Transaction - * @abstract - * @final - * @return {array<object>} List of operation wrap procedures. - * TODO: convert to array<TransactionWrapper> - */ - getTransactionWrappers: function () { - return TRANSACTION_WRAPPERS; - }, - - /** - * @return {object} The queue to collect `onDOMReady` callbacks with. - */ - getReactMountReady: function () { - return this.reactMountReady; - }, - - /** - * @return {object} The queue to collect React async events. - */ - getUpdateQueue: function () { - return ReactUpdateQueue; - }, - - /** - * Save current transaction state -- if the return value from this method is - * passed to `rollback`, the transaction will be reset to that state. - */ - checkpoint: function () { - // reactMountReady is the our only stateful wrapper - return this.reactMountReady.checkpoint(); - }, - - rollback: function (checkpoint) { - this.reactMountReady.rollback(checkpoint); - }, - - /** - * `PooledClass` looks for this, and will invoke this before allowing this - * instance to be reused. - */ - destructor: function () { - CallbackQueue.release(this.reactMountReady); - this.reactMountReady = null; - } -}; - -_assign(ReactReconcileTransaction.prototype, Transaction, Mixin); - -PooledClass.addPoolingTo(ReactReconcileTransaction); - -module.exports = ReactReconcileTransaction; - -/***/ }), -/* 166 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var ExecutionEnvironment = __webpack_require__(5); - -var getNodeForCharacterOffset = __webpack_require__(167); -var getTextContentAccessor = __webpack_require__(62); - -/** - * While `isCollapsed` is available on the Selection object and `collapsed` - * is available on the Range object, IE11 sometimes gets them wrong. - * If the anchor/focus nodes and offsets are the same, the range is collapsed. - */ -function isCollapsed(anchorNode, anchorOffset, focusNode, focusOffset) { - return anchorNode === focusNode && anchorOffset === focusOffset; -} - -/** - * Get the appropriate anchor and focus node/offset pairs for IE. - * - * The catch here is that IE's selection API doesn't provide information - * about whether the selection is forward or backward, so we have to - * behave as though it's always forward. - * - * IE text differs from modern selection in that it behaves as though - * block elements end with a new line. This means character offsets will - * differ between the two APIs. - * - * @param {DOMElement} node - * @return {object} - */ -function getIEOffsets(node) { - var selection = document.selection; - var selectedRange = selection.createRange(); - var selectedLength = selectedRange.text.length; - - // Duplicate selection so we can move range without breaking user selection. - var fromStart = selectedRange.duplicate(); - fromStart.moveToElementText(node); - fromStart.setEndPoint('EndToStart', selectedRange); - - var startOffset = fromStart.text.length; - var endOffset = startOffset + selectedLength; - - return { - start: startOffset, - end: endOffset - }; -} - -/** - * @param {DOMElement} node - * @return {?object} - */ -function getModernOffsets(node) { - var selection = window.getSelection && window.getSelection(); - - if (!selection || selection.rangeCount === 0) { - return null; - } - - var anchorNode = selection.anchorNode; - var anchorOffset = selection.anchorOffset; - var focusNode = selection.focusNode; - var focusOffset = selection.focusOffset; - - var currentRange = selection.getRangeAt(0); - - // In Firefox, range.startContainer and range.endContainer can be "anonymous - // divs", e.g. the up/down buttons on an <input type="number">. Anonymous - // divs do not seem to expose properties, triggering a "Permission denied - // error" if any of its properties are accessed. The only seemingly possible - // way to avoid erroring is to access a property that typically works for - // non-anonymous divs and catch any error that may otherwise arise. See - // https://bugzilla.mozilla.org/show_bug.cgi?id=208427 - try { - /* eslint-disable no-unused-expressions */ - currentRange.startContainer.nodeType; - currentRange.endContainer.nodeType; - /* eslint-enable no-unused-expressions */ - } catch (e) { - return null; - } - - // If the node and offset values are the same, the selection is collapsed. - // `Selection.isCollapsed` is available natively, but IE sometimes gets - // this value wrong. - var isSelectionCollapsed = isCollapsed(selection.anchorNode, selection.anchorOffset, selection.focusNode, selection.focusOffset); - - var rangeLength = isSelectionCollapsed ? 0 : currentRange.toString().length; - - var tempRange = currentRange.cloneRange(); - tempRange.selectNodeContents(node); - tempRange.setEnd(currentRange.startContainer, currentRange.startOffset); - - var isTempRangeCollapsed = isCollapsed(tempRange.startContainer, tempRange.startOffset, tempRange.endContainer, tempRange.endOffset); - - var start = isTempRangeCollapsed ? 0 : tempRange.toString().length; - var end = start + rangeLength; - - // Detect whether the selection is backward. - var detectionRange = document.createRange(); - detectionRange.setStart(anchorNode, anchorOffset); - detectionRange.setEnd(focusNode, focusOffset); - var isBackward = detectionRange.collapsed; - - return { - start: isBackward ? end : start, - end: isBackward ? start : end - }; -} - -/** - * @param {DOMElement|DOMTextNode} node - * @param {object} offsets - */ -function setIEOffsets(node, offsets) { - var range = document.selection.createRange().duplicate(); - var start, end; - - if (offsets.end === undefined) { - start = offsets.start; - end = start; - } else if (offsets.start > offsets.end) { - start = offsets.end; - end = offsets.start; - } else { - start = offsets.start; - end = offsets.end; - } - - range.moveToElementText(node); - range.moveStart('character', start); - range.setEndPoint('EndToStart', range); - range.moveEnd('character', end - start); - range.select(); -} - -/** - * In modern non-IE browsers, we can support both forward and backward - * selections. - * - * Note: IE10+ supports the Selection object, but it does not support - * the `extend` method, which means that even in modern IE, it's not possible - * to programmatically create a backward selection. Thus, for all IE - * versions, we use the old IE API to create our selections. - * - * @param {DOMElement|DOMTextNode} node - * @param {object} offsets - */ -function setModernOffsets(node, offsets) { - if (!window.getSelection) { - return; - } - - var selection = window.getSelection(); - var length = node[getTextContentAccessor()].length; - var start = Math.min(offsets.start, length); - var end = offsets.end === undefined ? start : Math.min(offsets.end, length); - - // IE 11 uses modern selection, but doesn't support the extend method. - // Flip backward selections, so we can set with a single range. - if (!selection.extend && start > end) { - var temp = end; - end = start; - start = temp; - } - - var startMarker = getNodeForCharacterOffset(node, start); - var endMarker = getNodeForCharacterOffset(node, end); - - if (startMarker && endMarker) { - var range = document.createRange(); - range.setStart(startMarker.node, startMarker.offset); - selection.removeAllRanges(); - - if (start > end) { - selection.addRange(range); - selection.extend(endMarker.node, endMarker.offset); - } else { - range.setEnd(endMarker.node, endMarker.offset); - selection.addRange(range); - } - } -} - -var useIEOffsets = ExecutionEnvironment.canUseDOM && 'selection' in document && !('getSelection' in window); - -var ReactDOMSelection = { - /** - * @param {DOMElement} node - */ - getOffsets: useIEOffsets ? getIEOffsets : getModernOffsets, - - /** - * @param {DOMElement|DOMTextNode} node - * @param {object} offsets - */ - setOffsets: useIEOffsets ? setIEOffsets : setModernOffsets -}; - -module.exports = ReactDOMSelection; - -/***/ }), -/* 167 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -/** - * Given any node return the first leaf node without children. - * - * @param {DOMElement|DOMTextNode} node - * @return {DOMElement|DOMTextNode} - */ - -function getLeafNode(node) { - while (node && node.firstChild) { - node = node.firstChild; - } - return node; -} - -/** - * Get the next sibling within a container. This will walk up the - * DOM if a node's siblings have been exhausted. - * - * @param {DOMElement|DOMTextNode} node - * @return {?DOMElement|DOMTextNode} - */ -function getSiblingNode(node) { - while (node) { - if (node.nextSibling) { - return node.nextSibling; - } - node = node.parentNode; - } -} - -/** - * Get object describing the nodes which contain characters at offset. - * - * @param {DOMElement|DOMTextNode} root - * @param {number} offset - * @return {?object} - */ -function getNodeForCharacterOffset(root, offset) { - var node = getLeafNode(root); - var nodeStart = 0; - var nodeEnd = 0; - - while (node) { - if (node.nodeType === 3) { - nodeEnd = nodeStart + node.textContent.length; - - if (nodeStart <= offset && nodeEnd >= offset) { - return { - node: node, - offset: offset - nodeStart - }; - } - - nodeStart = nodeEnd; - } - - node = getLeafNode(getSiblingNode(node)); - } -} - -module.exports = getNodeForCharacterOffset; - -/***/ }), -/* 168 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * - */ - -var isTextNode = __webpack_require__(169); - -/*eslint-disable no-bitwise */ - -/** - * Checks if a given DOM node contains or is another DOM node. - */ -function containsNode(outerNode, innerNode) { - if (!outerNode || !innerNode) { - return false; - } else if (outerNode === innerNode) { - return true; - } else if (isTextNode(outerNode)) { - return false; - } else if (isTextNode(innerNode)) { - return containsNode(outerNode, innerNode.parentNode); - } else if ('contains' in outerNode) { - return outerNode.contains(innerNode); - } else if (outerNode.compareDocumentPosition) { - return !!(outerNode.compareDocumentPosition(innerNode) & 16); - } else { - return false; - } -} - -module.exports = containsNode; - -/***/ }), -/* 169 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @typechecks - */ - -var isNode = __webpack_require__(170); - -/** - * @param {*} object The object to check. - * @return {boolean} Whether or not the object is a DOM text node. - */ -function isTextNode(object) { - return isNode(object) && object.nodeType == 3; -} - -module.exports = isTextNode; - -/***/ }), -/* 170 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @typechecks - */ - -/** - * @param {*} object The object to check. - * @return {boolean} Whether or not the object is a DOM node. - */ -function isNode(object) { - var doc = object ? object.ownerDocument || object : document; - var defaultView = doc.defaultView || window; - return !!(object && (typeof defaultView.Node === 'function' ? object instanceof defaultView.Node : typeof object === 'object' && typeof object.nodeType === 'number' && typeof object.nodeName === 'string')); -} - -module.exports = isNode; - -/***/ }), -/* 171 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var NS = { - xlink: 'http://www.w3.org/1999/xlink', - xml: 'http://www.w3.org/XML/1998/namespace' -}; - -// We use attributes for everything SVG so let's avoid some duplication and run -// code instead. -// The following are all specified in the HTML config already so we exclude here. -// - class (as className) -// - color -// - height -// - id -// - lang -// - max -// - media -// - method -// - min -// - name -// - style -// - target -// - type -// - width -var ATTRS = { - 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' -}; - -var SVGDOMPropertyConfig = { - Properties: {}, - DOMAttributeNamespaces: { - xlinkActuate: NS.xlink, - xlinkArcrole: NS.xlink, - xlinkHref: NS.xlink, - xlinkRole: NS.xlink, - xlinkShow: NS.xlink, - xlinkTitle: NS.xlink, - xlinkType: NS.xlink, - xmlBase: NS.xml, - xmlLang: NS.xml, - xmlSpace: NS.xml - }, - DOMAttributeNames: {} -}; - -Object.keys(ATTRS).forEach(function (key) { - SVGDOMPropertyConfig.Properties[key] = 0; - if (ATTRS[key]) { - SVGDOMPropertyConfig.DOMAttributeNames[key] = ATTRS[key]; - } -}); - -module.exports = SVGDOMPropertyConfig; - -/***/ }), -/* 172 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var EventPropagators = __webpack_require__(20); -var ExecutionEnvironment = __webpack_require__(5); -var ReactDOMComponentTree = __webpack_require__(4); -var ReactInputSelection = __webpack_require__(80); -var SyntheticEvent = __webpack_require__(11); - -var getActiveElement = __webpack_require__(81); -var isTextInputElement = __webpack_require__(66); -var shallowEqual = __webpack_require__(45); - -var skipSelectionChangeEvent = ExecutionEnvironment.canUseDOM && 'documentMode' in document && document.documentMode <= 11; - -var eventTypes = { - select: { - phasedRegistrationNames: { - bubbled: 'onSelect', - captured: 'onSelectCapture' - }, - dependencies: ['topBlur', 'topContextMenu', 'topFocus', 'topKeyDown', 'topKeyUp', 'topMouseDown', 'topMouseUp', 'topSelectionChange'] - } -}; - -var activeElement = null; -var activeElementInst = null; -var lastSelection = null; -var mouseDown = false; - -// Track whether a listener exists for this plugin. If none exist, we do -// not extract events. See #3639. -var hasListener = false; - -/** - * Get an object which is a unique representation of the current selection. - * - * The return value will not be consistent across nodes or browsers, but - * two identical selections on the same node will return identical objects. - * - * @param {DOMElement} node - * @return {object} - */ -function getSelection(node) { - if ('selectionStart' in node && ReactInputSelection.hasSelectionCapabilities(node)) { - return { - start: node.selectionStart, - end: node.selectionEnd - }; - } else if (window.getSelection) { - var selection = window.getSelection(); - return { - anchorNode: selection.anchorNode, - anchorOffset: selection.anchorOffset, - focusNode: selection.focusNode, - focusOffset: selection.focusOffset - }; - } else if (document.selection) { - var range = document.selection.createRange(); - return { - parentElement: range.parentElement(), - text: range.text, - top: range.boundingTop, - left: range.boundingLeft - }; - } -} - -/** - * Poll selection to see whether it's changed. - * - * @param {object} nativeEvent - * @return {?SyntheticEvent} - */ -function constructSelectEvent(nativeEvent, nativeEventTarget) { - // Ensure we have the right element, and that the user is not dragging a - // selection (this matches native `select` event behavior). In HTML5, select - // fires only on input and textarea thus if there's no focused element we - // won't dispatch. - if (mouseDown || activeElement == null || activeElement !== getActiveElement()) { - return null; - } - - // Only fire when selection has actually changed. - var currentSelection = getSelection(activeElement); - if (!lastSelection || !shallowEqual(lastSelection, currentSelection)) { - lastSelection = currentSelection; - - var syntheticEvent = SyntheticEvent.getPooled(eventTypes.select, activeElementInst, nativeEvent, nativeEventTarget); - - syntheticEvent.type = 'select'; - syntheticEvent.target = activeElement; - - EventPropagators.accumulateTwoPhaseDispatches(syntheticEvent); - - return syntheticEvent; - } - - return null; -} - -/** - * This plugin creates an `onSelect` event that normalizes select events - * across form elements. - * - * Supported elements are: - * - input (see `isTextInputElement`) - * - textarea - * - contentEditable - * - * This differs from native browser implementations in the following ways: - * - Fires on contentEditable fields as well as inputs. - * - Fires for collapsed selection. - * - Fires after user input. - */ -var SelectEventPlugin = { - eventTypes: eventTypes, - - extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) { - if (!hasListener) { - return null; - } - - var targetNode = targetInst ? ReactDOMComponentTree.getNodeFromInstance(targetInst) : window; - - switch (topLevelType) { - // Track the input node that has focus. - case 'topFocus': - if (isTextInputElement(targetNode) || targetNode.contentEditable === 'true') { - activeElement = targetNode; - activeElementInst = targetInst; - lastSelection = null; - } - break; - case 'topBlur': - activeElement = null; - activeElementInst = null; - lastSelection = null; - break; - // Don't fire the event while the user is dragging. This matches the - // semantics of the native select event. - case 'topMouseDown': - mouseDown = true; - break; - case 'topContextMenu': - case 'topMouseUp': - mouseDown = false; - return constructSelectEvent(nativeEvent, nativeEventTarget); - // Chrome and IE fire non-standard event when selection is changed (and - // sometimes when it hasn't). IE's event fires out of order with respect - // to key and input events on deletion, so we discard it. - // - // Firefox doesn't support selectionchange, so check selection status - // after each key entry. The selection changes after keydown and before - // keyup, but we check on keydown as well in the case of holding down a - // key, when multiple keydown events are fired but only one keyup is. - // This is also our approach for IE handling, for the reason above. - case 'topSelectionChange': - if (skipSelectionChangeEvent) { - break; - } - // falls through - case 'topKeyDown': - case 'topKeyUp': - return constructSelectEvent(nativeEvent, nativeEventTarget); - } - - return null; - }, - - didPutListener: function (inst, registrationName, listener) { - if (registrationName === 'onSelect') { - hasListener = true; - } - } -}; - -module.exports = SelectEventPlugin; - -/***/ }), -/* 173 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * - */ - - - -var _prodInvariant = __webpack_require__(2); - -var EventListener = __webpack_require__(79); -var EventPropagators = __webpack_require__(20); -var ReactDOMComponentTree = __webpack_require__(4); -var SyntheticAnimationEvent = __webpack_require__(174); -var SyntheticClipboardEvent = __webpack_require__(175); -var SyntheticEvent = __webpack_require__(11); -var SyntheticFocusEvent = __webpack_require__(176); -var SyntheticKeyboardEvent = __webpack_require__(177); -var SyntheticMouseEvent = __webpack_require__(28); -var SyntheticDragEvent = __webpack_require__(179); -var SyntheticTouchEvent = __webpack_require__(180); -var SyntheticTransitionEvent = __webpack_require__(181); -var SyntheticUIEvent = __webpack_require__(22); -var SyntheticWheelEvent = __webpack_require__(182); - -var emptyFunction = __webpack_require__(7); -var getEventCharCode = __webpack_require__(50); -var invariant = __webpack_require__(0); - -/** - * Turns - * ['abort', ...] - * into - * eventTypes = { - * 'abort': { - * phasedRegistrationNames: { - * bubbled: 'onAbort', - * captured: 'onAbortCapture', - * }, - * dependencies: ['topAbort'], - * }, - * ... - * }; - * topLevelEventsToDispatchConfig = { - * 'topAbort': { sameConfig } - * }; - */ -var eventTypes = {}; -var topLevelEventsToDispatchConfig = {}; -['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 (event) { - var capitalizedEvent = event[0].toUpperCase() + event.slice(1); - var onEvent = 'on' + capitalizedEvent; - var topEvent = 'top' + capitalizedEvent; - - var type = { - phasedRegistrationNames: { - bubbled: onEvent, - captured: onEvent + 'Capture' - }, - dependencies: [topEvent] - }; - eventTypes[event] = type; - topLevelEventsToDispatchConfig[topEvent] = type; -}); - -var onClickListeners = {}; - -function getDictionaryKey(inst) { - // Prevents V8 performance issue: - // https://github.com/facebook/react/pull/7232 - return '.' + inst._rootNodeID; -} - -function isInteractive(tag) { - return tag === 'button' || tag === 'input' || tag === 'select' || tag === 'textarea'; -} - -var SimpleEventPlugin = { - eventTypes: eventTypes, - - extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) { - var dispatchConfig = topLevelEventsToDispatchConfig[topLevelType]; - if (!dispatchConfig) { - return null; - } - var EventConstructor; - switch (topLevelType) { - 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': - // HTML Events - // @see http://www.w3.org/TR/html5/index.html#events-0 - EventConstructor = SyntheticEvent; - break; - case 'topKeyPress': - // Firefox creates a keypress event for function keys too. This removes - // the unwanted keypress events. Enter is however both printable and - // non-printable. One would expect Tab to be as well (but it isn't). - if (getEventCharCode(nativeEvent) === 0) { - return null; - } - /* falls through */ - case 'topKeyDown': - case 'topKeyUp': - EventConstructor = SyntheticKeyboardEvent; - break; - case 'topBlur': - case 'topFocus': - EventConstructor = SyntheticFocusEvent; - break; - case 'topClick': - // Firefox creates a click event on right mouse clicks. This removes the - // unwanted click events. - if (nativeEvent.button === 2) { - return null; - } - /* falls through */ - case 'topDoubleClick': - case 'topMouseDown': - case 'topMouseMove': - case 'topMouseUp': - // TODO: Disabled elements should not respond to mouse events - /* falls through */ - case 'topMouseOut': - case 'topMouseOver': - case 'topContextMenu': - EventConstructor = SyntheticMouseEvent; - break; - case 'topDrag': - case 'topDragEnd': - case 'topDragEnter': - case 'topDragExit': - case 'topDragLeave': - case 'topDragOver': - case 'topDragStart': - case 'topDrop': - EventConstructor = SyntheticDragEvent; - break; - case 'topTouchCancel': - case 'topTouchEnd': - case 'topTouchMove': - case 'topTouchStart': - EventConstructor = SyntheticTouchEvent; - break; - case 'topAnimationEnd': - case 'topAnimationIteration': - case 'topAnimationStart': - EventConstructor = SyntheticAnimationEvent; - break; - case 'topTransitionEnd': - EventConstructor = SyntheticTransitionEvent; - break; - case 'topScroll': - EventConstructor = SyntheticUIEvent; - break; - case 'topWheel': - EventConstructor = SyntheticWheelEvent; - break; - case 'topCopy': - case 'topCut': - case 'topPaste': - EventConstructor = SyntheticClipboardEvent; - break; - } - !EventConstructor ? process.env.NODE_ENV !== 'production' ? invariant(false, 'SimpleEventPlugin: Unhandled event type, `%s`.', topLevelType) : _prodInvariant('86', topLevelType) : void 0; - var event = EventConstructor.getPooled(dispatchConfig, targetInst, nativeEvent, nativeEventTarget); - EventPropagators.accumulateTwoPhaseDispatches(event); - return event; - }, - - didPutListener: function (inst, registrationName, listener) { - // Mobile Safari does not fire properly bubble click events on - // non-interactive elements, which means delegated click listeners do not - // fire. The workaround for this bug involves attaching an empty click - // listener on the target node. - // http://www.quirksmode.org/blog/archives/2010/09/click_event_del.html - if (registrationName === 'onClick' && !isInteractive(inst._tag)) { - var key = getDictionaryKey(inst); - var node = ReactDOMComponentTree.getNodeFromInstance(inst); - if (!onClickListeners[key]) { - onClickListeners[key] = EventListener.listen(node, 'click', emptyFunction); - } - } - }, - - willDeleteListener: function (inst, registrationName) { - if (registrationName === 'onClick' && !isInteractive(inst._tag)) { - var key = getDictionaryKey(inst); - onClickListeners[key].remove(); - delete onClickListeners[key]; - } - } -}; - -module.exports = SimpleEventPlugin; - -/***/ }), -/* 174 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var SyntheticEvent = __webpack_require__(11); - -/** - * @interface Event - * @see http://www.w3.org/TR/css3-animations/#AnimationEvent-interface - * @see https://developer.mozilla.org/en-US/docs/Web/API/AnimationEvent - */ -var AnimationEventInterface = { - animationName: null, - elapsedTime: null, - pseudoElement: null -}; - -/** - * @param {object} dispatchConfig Configuration used to dispatch this event. - * @param {string} dispatchMarker Marker identifying the event target. - * @param {object} nativeEvent Native browser event. - * @extends {SyntheticEvent} - */ -function SyntheticAnimationEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) { - return SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget); -} - -SyntheticEvent.augmentClass(SyntheticAnimationEvent, AnimationEventInterface); - -module.exports = SyntheticAnimationEvent; - -/***/ }), -/* 175 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var SyntheticEvent = __webpack_require__(11); - -/** - * @interface Event - * @see http://www.w3.org/TR/clipboard-apis/ - */ -var ClipboardEventInterface = { - clipboardData: function (event) { - return 'clipboardData' in event ? event.clipboardData : window.clipboardData; - } -}; - -/** - * @param {object} dispatchConfig Configuration used to dispatch this event. - * @param {string} dispatchMarker Marker identifying the event target. - * @param {object} nativeEvent Native browser event. - * @extends {SyntheticUIEvent} - */ -function SyntheticClipboardEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) { - return SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget); -} - -SyntheticEvent.augmentClass(SyntheticClipboardEvent, ClipboardEventInterface); - -module.exports = SyntheticClipboardEvent; - -/***/ }), -/* 176 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var SyntheticUIEvent = __webpack_require__(22); - -/** - * @interface FocusEvent - * @see http://www.w3.org/TR/DOM-Level-3-Events/ - */ -var FocusEventInterface = { - relatedTarget: null -}; - -/** - * @param {object} dispatchConfig Configuration used to dispatch this event. - * @param {string} dispatchMarker Marker identifying the event target. - * @param {object} nativeEvent Native browser event. - * @extends {SyntheticUIEvent} - */ -function SyntheticFocusEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) { - return SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget); -} - -SyntheticUIEvent.augmentClass(SyntheticFocusEvent, FocusEventInterface); - -module.exports = SyntheticFocusEvent; - -/***/ }), -/* 177 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var SyntheticUIEvent = __webpack_require__(22); - -var getEventCharCode = __webpack_require__(50); -var getEventKey = __webpack_require__(178); -var getEventModifierState = __webpack_require__(39); - -/** - * @interface KeyboardEvent - * @see http://www.w3.org/TR/DOM-Level-3-Events/ - */ -var KeyboardEventInterface = { - key: getEventKey, - location: null, - ctrlKey: null, - shiftKey: null, - altKey: null, - metaKey: null, - repeat: null, - locale: null, - getModifierState: getEventModifierState, - // Legacy Interface - charCode: function (event) { - // `charCode` is the result of a KeyPress event and represents the value of - // the actual printable character. - - // KeyPress is deprecated, but its replacement is not yet final and not - // implemented in any major browser. Only KeyPress has charCode. - if (event.type === 'keypress') { - return getEventCharCode(event); - } - return 0; - }, - keyCode: function (event) { - // `keyCode` is the result of a KeyDown/Up event and represents the value of - // physical keyboard key. - - // The actual meaning of the value depends on the users' keyboard layout - // which cannot be detected. Assuming that it is a US keyboard layout - // provides a surprisingly accurate mapping for US and European users. - // Due to this, it is left to the user to implement at this time. - if (event.type === 'keydown' || event.type === 'keyup') { - return event.keyCode; - } - return 0; - }, - which: function (event) { - // `which` is an alias for either `keyCode` or `charCode` depending on the - // type of the event. - if (event.type === 'keypress') { - return getEventCharCode(event); - } - if (event.type === 'keydown' || event.type === 'keyup') { - return event.keyCode; - } - return 0; - } -}; - -/** - * @param {object} dispatchConfig Configuration used to dispatch this event. - * @param {string} dispatchMarker Marker identifying the event target. - * @param {object} nativeEvent Native browser event. - * @extends {SyntheticUIEvent} - */ -function SyntheticKeyboardEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) { - return SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget); -} - -SyntheticUIEvent.augmentClass(SyntheticKeyboardEvent, KeyboardEventInterface); - -module.exports = SyntheticKeyboardEvent; - -/***/ }), -/* 178 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var getEventCharCode = __webpack_require__(50); - -/** - * Normalization of deprecated HTML5 `key` values - * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names - */ -var normalizeKey = { - Esc: 'Escape', - Spacebar: ' ', - Left: 'ArrowLeft', - Up: 'ArrowUp', - Right: 'ArrowRight', - Down: 'ArrowDown', - Del: 'Delete', - Win: 'OS', - Menu: 'ContextMenu', - Apps: 'ContextMenu', - Scroll: 'ScrollLock', - MozPrintableKey: 'Unidentified' -}; - -/** - * Translation from legacy `keyCode` to HTML5 `key` - * Only special keys supported, all others depend on keyboard layout or browser - * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names - */ -var translateToKey = { - 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' -}; - -/** - * @param {object} nativeEvent Native browser event. - * @return {string} Normalized `key` property. - */ -function getEventKey(nativeEvent) { - if (nativeEvent.key) { - // Normalize inconsistent values reported by browsers due to - // implementations of a working draft specification. - - // FireFox implements `key` but returns `MozPrintableKey` for all - // printable characters (normalized to `Unidentified`), ignore it. - var key = normalizeKey[nativeEvent.key] || nativeEvent.key; - if (key !== 'Unidentified') { - return key; - } - } - - // Browser does not implement `key`, polyfill as much of it as we can. - if (nativeEvent.type === 'keypress') { - var charCode = getEventCharCode(nativeEvent); - - // The enter-key is technically both printable and non-printable and can - // thus be captured by `keypress`, no other non-printable key should. - return charCode === 13 ? 'Enter' : String.fromCharCode(charCode); - } - if (nativeEvent.type === 'keydown' || nativeEvent.type === 'keyup') { - // While user keyboard layout determines the actual meaning of each - // `keyCode` value, almost all function keys have a universal value. - return translateToKey[nativeEvent.keyCode] || 'Unidentified'; - } - return ''; -} - -module.exports = getEventKey; - -/***/ }), -/* 179 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var SyntheticMouseEvent = __webpack_require__(28); - -/** - * @interface DragEvent - * @see http://www.w3.org/TR/DOM-Level-3-Events/ - */ -var DragEventInterface = { - dataTransfer: null -}; - -/** - * @param {object} dispatchConfig Configuration used to dispatch this event. - * @param {string} dispatchMarker Marker identifying the event target. - * @param {object} nativeEvent Native browser event. - * @extends {SyntheticUIEvent} - */ -function SyntheticDragEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) { - return SyntheticMouseEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget); -} - -SyntheticMouseEvent.augmentClass(SyntheticDragEvent, DragEventInterface); - -module.exports = SyntheticDragEvent; - -/***/ }), -/* 180 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var SyntheticUIEvent = __webpack_require__(22); - -var getEventModifierState = __webpack_require__(39); - -/** - * @interface TouchEvent - * @see http://www.w3.org/TR/touch-events/ - */ -var TouchEventInterface = { - touches: null, - targetTouches: null, - changedTouches: null, - altKey: null, - metaKey: null, - ctrlKey: null, - shiftKey: null, - getModifierState: getEventModifierState -}; - -/** - * @param {object} dispatchConfig Configuration used to dispatch this event. - * @param {string} dispatchMarker Marker identifying the event target. - * @param {object} nativeEvent Native browser event. - * @extends {SyntheticUIEvent} - */ -function SyntheticTouchEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) { - return SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget); -} - -SyntheticUIEvent.augmentClass(SyntheticTouchEvent, TouchEventInterface); - -module.exports = SyntheticTouchEvent; - -/***/ }), -/* 181 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var SyntheticEvent = __webpack_require__(11); - -/** - * @interface Event - * @see http://www.w3.org/TR/2009/WD-css3-transitions-20090320/#transition-events- - * @see https://developer.mozilla.org/en-US/docs/Web/API/TransitionEvent - */ -var TransitionEventInterface = { - propertyName: null, - elapsedTime: null, - pseudoElement: null -}; - -/** - * @param {object} dispatchConfig Configuration used to dispatch this event. - * @param {string} dispatchMarker Marker identifying the event target. - * @param {object} nativeEvent Native browser event. - * @extends {SyntheticEvent} - */ -function SyntheticTransitionEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) { - return SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget); -} - -SyntheticEvent.augmentClass(SyntheticTransitionEvent, TransitionEventInterface); - -module.exports = SyntheticTransitionEvent; - -/***/ }), -/* 182 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var SyntheticMouseEvent = __webpack_require__(28); - -/** - * @interface WheelEvent - * @see http://www.w3.org/TR/DOM-Level-3-Events/ - */ -var WheelEventInterface = { - deltaX: function (event) { - return 'deltaX' in event ? event.deltaX : // Fallback to `wheelDeltaX` for Webkit and normalize (right is positive). - 'wheelDeltaX' in event ? -event.wheelDeltaX : 0; - }, - deltaY: function (event) { - return 'deltaY' in event ? event.deltaY : // Fallback to `wheelDeltaY` for Webkit and normalize (down is positive). - 'wheelDeltaY' in event ? -event.wheelDeltaY : // Fallback to `wheelDelta` for IE<9 and normalize (down is positive). - 'wheelDelta' in event ? -event.wheelDelta : 0; - }, - deltaZ: null, - - // Browsers without "deltaMode" is reporting in raw wheel delta where one - // notch on the scroll is always +/- 120, roughly equivalent to pixels. - // A good approximation of DOM_DELTA_LINE (1) is 5% of viewport size or - // ~40 pixels, for DOM_DELTA_SCREEN (2) it is 87.5% of viewport size. - deltaMode: null -}; - -/** - * @param {object} dispatchConfig Configuration used to dispatch this event. - * @param {string} dispatchMarker Marker identifying the event target. - * @param {object} nativeEvent Native browser event. - * @extends {SyntheticMouseEvent} - */ -function SyntheticWheelEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) { - return SyntheticMouseEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget); -} - -SyntheticMouseEvent.augmentClass(SyntheticWheelEvent, WheelEventInterface); - -module.exports = SyntheticWheelEvent; - -/***/ }), -/* 183 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var validateDOMNesting = __webpack_require__(49); - -var DOC_NODE_TYPE = 9; - -function ReactDOMContainerInfo(topLevelWrapper, node) { - var info = { - _topLevelWrapper: topLevelWrapper, - _idCounter: 1, - _ownerDocument: node ? node.nodeType === DOC_NODE_TYPE ? node : node.ownerDocument : null, - _node: node, - _tag: node ? node.nodeName.toLowerCase() : null, - _namespaceURI: node ? node.namespaceURI : null - }; - if (process.env.NODE_ENV !== 'production') { - info._ancestorInfo = node ? validateDOMNesting.updatedAncestorInfo(null, info._tag, null) : null; - } - return info; -} - -module.exports = ReactDOMContainerInfo; - -/***/ }), -/* 184 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var ReactDOMFeatureFlags = { - useCreateElement: true, - useFiber: false -}; - -module.exports = ReactDOMFeatureFlags; - -/***/ }), -/* 185 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var adler32 = __webpack_require__(186); - -var TAG_END = /\/?>/; -var COMMENT_START = /^<\!\-\-/; - -var ReactMarkupChecksum = { - CHECKSUM_ATTR_NAME: 'data-react-checksum', - - /** - * @param {string} markup Markup string - * @return {string} Markup string with checksum attribute attached - */ - addChecksumToMarkup: function (markup) { - var checksum = adler32(markup); - - // Add checksum (handle both parent tags, comments and self-closing tags) - if (COMMENT_START.test(markup)) { - return markup; - } else { - return markup.replace(TAG_END, ' ' + ReactMarkupChecksum.CHECKSUM_ATTR_NAME + '="' + checksum + '"$&'); - } - }, - - /** - * @param {string} markup to use - * @param {DOMElement} element root React element - * @returns {boolean} whether or not the markup is the same - */ - canReuseMarkup: function (markup, element) { - var existingChecksum = element.getAttribute(ReactMarkupChecksum.CHECKSUM_ATTR_NAME); - existingChecksum = existingChecksum && parseInt(existingChecksum, 10); - var markupChecksum = adler32(markup); - return markupChecksum === existingChecksum; - } -}; - -module.exports = ReactMarkupChecksum; - -/***/ }), -/* 186 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * - */ - - - -var MOD = 65521; - -// adler32 is not cryptographically strong, and is only used to sanity check that -// markup generated on the server matches the markup generated on the client. -// This implementation (a modified version of the SheetJS version) has been optimized -// for our use case, at the expense of conforming to the adler32 specification -// for non-ascii inputs. -function adler32(data) { - var a = 1; - var b = 0; - var i = 0; - var l = data.length; - var m = l & ~0x3; - while (i < m) { - var n = Math.min(i + 4096, m); - for (; i < n; i += 4) { - b += (a += data.charCodeAt(i)) + (a += data.charCodeAt(i + 1)) + (a += data.charCodeAt(i + 2)) + (a += data.charCodeAt(i + 3)); - } - a %= MOD; - b %= MOD; - } - for (; i < l; i++) { - b += a += data.charCodeAt(i); - } - a %= MOD; - b %= MOD; - return a | b << 16; -} - -module.exports = adler32; - -/***/ }), -/* 187 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -module.exports = '15.6.2'; - -/***/ }), -/* 188 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var _prodInvariant = __webpack_require__(2); - -var ReactCurrentOwner = __webpack_require__(9); -var ReactDOMComponentTree = __webpack_require__(4); -var ReactInstanceMap = __webpack_require__(23); - -var getHostComponentFromComposite = __webpack_require__(83); -var invariant = __webpack_require__(0); -var warning = __webpack_require__(1); - -/** - * Returns the DOM node rendered by this element. - * - * See https://facebook.github.io/react/docs/top-level-api.html#reactdom.finddomnode - * - * @param {ReactComponent|DOMElement} componentOrElement - * @return {?DOMElement} The root node of this element. - */ -function findDOMNode(componentOrElement) { - if (process.env.NODE_ENV !== 'production') { - var owner = ReactCurrentOwner.current; - if (owner !== null) { - process.env.NODE_ENV !== 'production' ? warning(owner._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.', owner.getName() || 'A component') : void 0; - owner._warnedAboutRefsInRender = true; - } - } - if (componentOrElement == null) { - return null; - } - if (componentOrElement.nodeType === 1) { - return componentOrElement; - } - - var inst = ReactInstanceMap.get(componentOrElement); - if (inst) { - inst = getHostComponentFromComposite(inst); - return inst ? ReactDOMComponentTree.getNodeFromInstance(inst) : null; - } - - if (typeof componentOrElement.render === 'function') { - true ? process.env.NODE_ENV !== 'production' ? invariant(false, 'findDOMNode was called on an unmounted component.') : _prodInvariant('44') : void 0; - } else { - true ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Element appears to be neither ReactComponent nor DOMNode (keys: %s)', Object.keys(componentOrElement)) : _prodInvariant('45', Object.keys(componentOrElement)) : void 0; - } -} - -module.exports = findDOMNode; - -/***/ }), -/* 189 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var ReactMount = __webpack_require__(82); - -module.exports = ReactMount.renderSubtreeIntoContainer; - -/***/ }), -/* 190 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - - - -var DOMProperty = __webpack_require__(12); -var EventPluginRegistry = __webpack_require__(26); -var ReactComponentTreeHook = __webpack_require__(6); - -var warning = __webpack_require__(1); - -if (process.env.NODE_ENV !== 'production') { - var reactProps = { - children: true, - dangerouslySetInnerHTML: true, - key: true, - ref: true, - - autoFocus: true, - defaultValue: true, - valueLink: true, - defaultChecked: true, - checkedLink: true, - innerHTML: true, - suppressContentEditableWarning: true, - onFocusIn: true, - onFocusOut: true - }; - var warnedProperties = {}; - - var validateProperty = function (tagName, name, debugID) { - if (DOMProperty.properties.hasOwnProperty(name) || DOMProperty.isCustomAttribute(name)) { - return true; - } - if (reactProps.hasOwnProperty(name) && reactProps[name] || warnedProperties.hasOwnProperty(name) && warnedProperties[name]) { - return true; - } - if (EventPluginRegistry.registrationNameModules.hasOwnProperty(name)) { - return true; - } - warnedProperties[name] = true; - var lowerCasedName = name.toLowerCase(); - - // data-* attributes should be lowercase; suggest the lowercase version - var standardName = DOMProperty.isCustomAttribute(lowerCasedName) ? lowerCasedName : DOMProperty.getPossibleStandardName.hasOwnProperty(lowerCasedName) ? DOMProperty.getPossibleStandardName[lowerCasedName] : null; - - var registrationName = EventPluginRegistry.possibleRegistrationNames.hasOwnProperty(lowerCasedName) ? EventPluginRegistry.possibleRegistrationNames[lowerCasedName] : null; - - if (standardName != null) { - process.env.NODE_ENV !== 'production' ? warning(false, 'Unknown DOM property %s. Did you mean %s?%s', name, standardName, ReactComponentTreeHook.getStackAddendumByID(debugID)) : void 0; - return true; - } else if (registrationName != null) { - process.env.NODE_ENV !== 'production' ? warning(false, 'Unknown event handler property %s. Did you mean `%s`?%s', name, registrationName, ReactComponentTreeHook.getStackAddendumByID(debugID)) : void 0; - return true; - } else { - // We were unable to guess which prop the user intended. - // It is likely that the user was just blindly spreading/forwarding props - // Components should be careful to only render valid props/attributes. - // Warning will be invoked in warnUnknownProperties to allow grouping. - return false; - } - }; -} - -var warnUnknownProperties = function (debugID, element) { - var unknownProps = []; - for (var key in element.props) { - var isValid = validateProperty(element.type, key, debugID); - if (!isValid) { - unknownProps.push(key); - } - } - - var unknownPropString = unknownProps.map(function (prop) { - return '`' + prop + '`'; - }).join(', '); - - if (unknownProps.length === 1) { - process.env.NODE_ENV !== 'production' ? warning(false, 'Unknown prop %s on <%s> tag. Remove this prop from the element. ' + 'For details, see https://fb.me/react-unknown-prop%s', unknownPropString, element.type, ReactComponentTreeHook.getStackAddendumByID(debugID)) : void 0; - } else if (unknownProps.length > 1) { - process.env.NODE_ENV !== 'production' ? warning(false, 'Unknown props %s on <%s> tag. Remove these props from the element. ' + 'For details, see https://fb.me/react-unknown-prop%s', unknownPropString, element.type, ReactComponentTreeHook.getStackAddendumByID(debugID)) : void 0; - } -}; - -function handleElement(debugID, element) { - if (element == null || typeof element.type !== 'string') { - return; - } - if (element.type.indexOf('-') >= 0 || element.props.is) { - return; - } - warnUnknownProperties(debugID, element); -} - -var ReactDOMUnknownPropertyHook = { - onBeforeMountComponent: function (debugID, element) { - handleElement(debugID, element); - }, - onBeforeUpdateComponent: function (debugID, element) { - handleElement(debugID, element); - } -}; - -module.exports = ReactDOMUnknownPropertyHook; - -/***/ }), -/* 191 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. + * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. + */var r=n(1),o=n(4),i=n(21);function a(e){for(var t=arguments.length-1,n="https://reactjs.org/docs/error-decoder.html?invariant="+e,r=0;r<t;r++)n+="&args[]="+encodeURIComponent(arguments[r+1]);!function(e,t,n,r,o,i,a,l){if(!e){if(e=void 0,void 0===t)e=Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var u=[n,r,o,i,a,l],s=0;(e=Error(t.replace(/%s/g,function(){return u[s++]}))).name="Invariant Violation"}throw e.framesToPop=1,e}}(!1,"Minified React error #"+e+"; visit %s for the full message or use the non-minified dev environment for full errors and additional helpful warnings. ",n)}r||a("227");var l=!1,u=null,s=!1,c=null,p={onError:function(e){l=!0,u=e}};function f(e,t,n,r,o,i,a,s,c){l=!1,u=null,function(e,t,n,r,o,i,a,l,u){var s=Array.prototype.slice.call(arguments,3);try{t.apply(n,s)}catch(e){this.onError(e)}}.apply(p,arguments)}var d=null,h={};function m(){if(d)for(var e in h){var t=h[e],n=d.indexOf(e);if(-1<n||a("96",e),!y[n])for(var r in t.extractEvents||a("97",e),y[n]=t,n=t.eventTypes){var o=void 0,i=n[r],l=t,u=r;g.hasOwnProperty(u)&&a("99",u),g[u]=i;var s=i.phasedRegistrationNames;if(s){for(o in s)s.hasOwnProperty(o)&&v(s[o],l,u);o=!0}else i.registrationName?(v(i.registrationName,l,u),o=!0):o=!1;o||a("98",r,e)}}}function v(e,t,n){b[e]&&a("100",e),b[e]=t,E[e]=t.eventTypes[n].dependencies}var y=[],g={},b={},E={},x=null,w=null,k=null;function C(e,t,n){var r=e.type||"unknown-event";e.currentTarget=k(n),function(e,t,n,r,o,i,p,d,h){if(f.apply(this,arguments),l){if(l){var m=u;l=!1,u=null}else a("198"),m=void 0;s||(s=!0,c=m)}}(r,t,void 0,e),e.currentTarget=null}function S(e,t){return null==t&&a("30"),null==e?t:Array.isArray(e)?Array.isArray(t)?(e.push.apply(e,t),e):(e.push(t),e):Array.isArray(t)?[e].concat(t):[e,t]}function T(e,t,n){Array.isArray(e)?e.forEach(t,n):e&&t.call(n,e)}var _=null;function O(e){if(e){var t=e._dispatchListeners,n=e._dispatchInstances;if(Array.isArray(t))for(var r=0;r<t.length&&!e.isPropagationStopped();r++)C(e,t[r],n[r]);else t&&C(e,t,n);e._dispatchListeners=null,e._dispatchInstances=null,e.isPersistent()||e.constructor.release(e)}}var P={injectEventPluginOrder:function(e){d&&a("101"),d=Array.prototype.slice.call(e),m()},injectEventPluginsByName:function(e){var t,n=!1;for(t in e)if(e.hasOwnProperty(t)){var r=e[t];h.hasOwnProperty(t)&&h[t]===r||(h[t]&&a("102",t),h[t]=r,n=!0)}n&&m()}};function F(e,t){var n=e.stateNode;if(!n)return null;var r=x(n);if(!r)return null;n=r[t];e:switch(t){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":(r=!r.disabled)||(r=!("button"===(e=e.type)||"input"===e||"select"===e||"textarea"===e)),e=!r;break e;default:e=!1}return e?null:(n&&"function"!=typeof n&&a("231",t,typeof n),n)}function D(e){if(null!==e&&(_=S(_,e)),e=_,_=null,e&&(T(e,O),_&&a("95"),s))throw e=c,s=!1,c=null,e}function A(e){if(e.__reactInternalInstance$)return e.__reactInternalInstance$;for(;!e.__reactInternalInstance$;){if(!e.parentNode)return null;e=e.parentNode}return 5===(e=e.__reactInternalInstance$).tag||6===e.tag?e:null}function N(e){return!(e=e.__reactInternalInstance$)||5!==e.tag&&6!==e.tag?null:e}function I(e){if(5===e.tag||6===e.tag)return e.stateNode;a("33")}function R(e){return e.__reactEventHandlers$||null}function M(e){do{e=e.return}while(e&&5!==e.tag);return e||null}function z(e,t,n){(t=F(e,n.dispatchConfig.phasedRegistrationNames[t]))&&(n._dispatchListeners=S(n._dispatchListeners,t),n._dispatchInstances=S(n._dispatchInstances,e))}function V(e){if(e&&e.dispatchConfig.phasedRegistrationNames){for(var t=e._targetInst,n=[];t;)n.push(t),t=M(t);for(t=n.length;0<t--;)z(n[t],"captured",e);for(t=0;t<n.length;t++)z(n[t],"bubbled",e)}}function U(e,t,n){e&&n&&n.dispatchConfig.registrationName&&(t=F(e,n.dispatchConfig.registrationName))&&(n._dispatchListeners=S(n._dispatchListeners,t),n._dispatchInstances=S(n._dispatchInstances,e))}function j(e){e&&e.dispatchConfig.registrationName&&U(e._targetInst,null,e)}function B(e){T(e,V)}var L=!("undefined"==typeof window||!window.document||!window.document.createElement);function W(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n}var K={animationend:W("Animation","AnimationEnd"),animationiteration:W("Animation","AnimationIteration"),animationstart:W("Animation","AnimationStart"),transitionend:W("Transition","TransitionEnd")},H={},q={};function $(e){if(H[e])return H[e];if(!K[e])return e;var t,n=K[e];for(t in n)if(n.hasOwnProperty(t)&&t in q)return H[e]=n[t];return e}L&&(q=document.createElement("div").style,"AnimationEvent"in window||(delete K.animationend.animation,delete K.animationiteration.animation,delete K.animationstart.animation),"TransitionEvent"in window||delete K.transitionend.transition);var Y=$("animationend"),Q=$("animationiteration"),G=$("animationstart"),X=$("transitionend"),J="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),Z=null,ee=null,te=null;function ne(){if(te)return te;var e,t,n=ee,r=n.length,o="value"in Z?Z.value:Z.textContent,i=o.length;for(e=0;e<r&&n[e]===o[e];e++);var a=r-e;for(t=1;t<=a&&n[r-t]===o[i-t];t++);return te=o.slice(e,1<t?1-t:void 0)}function re(){return!0}function oe(){return!1}function ie(e,t,n,r){for(var o in this.dispatchConfig=e,this._targetInst=t,this.nativeEvent=n,e=this.constructor.Interface)e.hasOwnProperty(o)&&((t=e[o])?this[o]=t(n):"target"===o?this.target=r:this[o]=n[o]);return this.isDefaultPrevented=(null!=n.defaultPrevented?n.defaultPrevented:!1===n.returnValue)?re:oe,this.isPropagationStopped=oe,this}function ae(e,t,n,r){if(this.eventPool.length){var o=this.eventPool.pop();return this.call(o,e,t,n,r),o}return new this(e,t,n,r)}function le(e){e instanceof this||a("279"),e.destructor(),10>this.eventPool.length&&this.eventPool.push(e)}function ue(e){e.eventPool=[],e.getPooled=ae,e.release=le}o(ie.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():"unknown"!=typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=re)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():"unknown"!=typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=re)},persist:function(){this.isPersistent=re},isPersistent:oe,destructor:function(){var e,t=this.constructor.Interface;for(e in t)this[e]=null;this.nativeEvent=this._targetInst=this.dispatchConfig=null,this.isPropagationStopped=this.isDefaultPrevented=oe,this._dispatchInstances=this._dispatchListeners=null}}),ie.Interface={type:null,target:null,currentTarget:function(){return null},eventPhase:null,bubbles:null,cancelable:null,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:null,isTrusted:null},ie.extend=function(e){function t(){}function n(){return r.apply(this,arguments)}var r=this;t.prototype=r.prototype;var i=new t;return o(i,n.prototype),n.prototype=i,n.prototype.constructor=n,n.Interface=o({},r.Interface,e),n.extend=r.extend,ue(n),n},ue(ie);var se=ie.extend({data:null}),ce=ie.extend({data:null}),pe=[9,13,27,32],fe=L&&"CompositionEvent"in window,de=null;L&&"documentMode"in document&&(de=document.documentMode);var he=L&&"TextEvent"in window&&!de,me=L&&(!fe||de&&8<de&&11>=de),ve=String.fromCharCode(32),ye={beforeInput:{phasedRegistrationNames:{bubbled:"onBeforeInput",captured:"onBeforeInputCapture"},dependencies:["compositionend","keypress","textInput","paste"]},compositionEnd:{phasedRegistrationNames:{bubbled:"onCompositionEnd",captured:"onCompositionEndCapture"},dependencies:"blur compositionend keydown keypress keyup mousedown".split(" ")},compositionStart:{phasedRegistrationNames:{bubbled:"onCompositionStart",captured:"onCompositionStartCapture"},dependencies:"blur compositionstart keydown keypress keyup mousedown".split(" ")},compositionUpdate:{phasedRegistrationNames:{bubbled:"onCompositionUpdate",captured:"onCompositionUpdateCapture"},dependencies:"blur compositionupdate keydown keypress keyup mousedown".split(" ")}},ge=!1;function be(e,t){switch(e){case"keyup":return-1!==pe.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"blur":return!0;default:return!1}}function Ee(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}var xe=!1;var we={eventTypes:ye,extractEvents:function(e,t,n,r){var o=void 0,i=void 0;if(fe)e:{switch(e){case"compositionstart":o=ye.compositionStart;break e;case"compositionend":o=ye.compositionEnd;break e;case"compositionupdate":o=ye.compositionUpdate;break e}o=void 0}else xe?be(e,n)&&(o=ye.compositionEnd):"keydown"===e&&229===n.keyCode&&(o=ye.compositionStart);return o?(me&&"ko"!==n.locale&&(xe||o!==ye.compositionStart?o===ye.compositionEnd&&xe&&(i=ne()):(ee="value"in(Z=r)?Z.value:Z.textContent,xe=!0)),o=se.getPooled(o,t,n,r),i?o.data=i:null!==(i=Ee(n))&&(o.data=i),B(o),i=o):i=null,(e=he?function(e,t){switch(e){case"compositionend":return Ee(t);case"keypress":return 32!==t.which?null:(ge=!0,ve);case"textInput":return(e=t.data)===ve&&ge?null:e;default:return null}}(e,n):function(e,t){if(xe)return"compositionend"===e||!fe&&be(e,t)?(e=ne(),te=ee=Z=null,xe=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case"compositionend":return me&&"ko"!==t.locale?null:t.data;default:return null}}(e,n))?((t=ce.getPooled(ye.beforeInput,t,n,r)).data=e,B(t)):t=null,null===i?t:null===t?i:[i,t]}},ke=null,Ce=null,Se=null;function Te(e){if(e=w(e)){"function"!=typeof ke&&a("280");var t=x(e.stateNode);ke(e.stateNode,e.type,t)}}function _e(e){Ce?Se?Se.push(e):Se=[e]:Ce=e}function Oe(){if(Ce){var e=Ce,t=Se;if(Se=Ce=null,Te(e),t)for(e=0;e<t.length;e++)Te(t[e])}}function Pe(e,t){return e(t)}function Fe(e,t,n){return e(t,n)}function De(){}var Ae=!1;function Ne(e,t){if(Ae)return e(t);Ae=!0;try{return Pe(e,t)}finally{Ae=!1,(null!==Ce||null!==Se)&&(De(),Oe())}}var Ie={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};function Re(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!Ie[e.type]:"textarea"===t}function Me(e){return(e=e.target||e.srcElement||window).correspondingUseElement&&(e=e.correspondingUseElement),3===e.nodeType?e.parentNode:e}function ze(e){if(!L)return!1;var t=(e="on"+e)in document;return t||((t=document.createElement("div")).setAttribute(e,"return;"),t="function"==typeof t[e]),t}function Ve(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===t||"radio"===t)}function Ue(e){e._valueTracker||(e._valueTracker=function(e){var t=Ve(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&void 0!==n&&"function"==typeof n.get&&"function"==typeof n.set){var o=n.get,i=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return o.call(this)},set:function(e){r=""+e,i.call(this,e)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(e){r=""+e},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}(e))}function je(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=Ve(e)?e.checked?"true":"false":e.value),(e=r)!==n&&(t.setValue(e),!0)}var Be=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;Be.hasOwnProperty("ReactCurrentDispatcher")||(Be.ReactCurrentDispatcher={current:null});var Le=/^(.*)[\\\/]/,We="function"==typeof Symbol&&Symbol.for,Ke=We?Symbol.for("react.element"):60103,He=We?Symbol.for("react.portal"):60106,qe=We?Symbol.for("react.fragment"):60107,$e=We?Symbol.for("react.strict_mode"):60108,Ye=We?Symbol.for("react.profiler"):60114,Qe=We?Symbol.for("react.provider"):60109,Ge=We?Symbol.for("react.context"):60110,Xe=We?Symbol.for("react.concurrent_mode"):60111,Je=We?Symbol.for("react.forward_ref"):60112,Ze=We?Symbol.for("react.suspense"):60113,et=We?Symbol.for("react.memo"):60115,tt=We?Symbol.for("react.lazy"):60116,nt="function"==typeof Symbol&&Symbol.iterator;function rt(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=nt&&e[nt]||e["@@iterator"])?e:null}function ot(e){if(null==e)return null;if("function"==typeof e)return e.displayName||e.name||null;if("string"==typeof e)return e;switch(e){case Xe:return"ConcurrentMode";case qe:return"Fragment";case He:return"Portal";case Ye:return"Profiler";case $e:return"StrictMode";case Ze:return"Suspense"}if("object"==typeof e)switch(e.$$typeof){case Ge:return"Context.Consumer";case Qe:return"Context.Provider";case Je:var t=e.render;return t=t.displayName||t.name||"",e.displayName||(""!==t?"ForwardRef("+t+")":"ForwardRef");case et:return ot(e.type);case tt:if(e=1===e._status?e._result:null)return ot(e)}return null}function it(e){var t="";do{e:switch(e.tag){case 3:case 4:case 6:case 7:case 10:case 9:var n="";break e;default:var r=e._debugOwner,o=e._debugSource,i=ot(e.type);n=null,r&&(n=ot(r.type)),r=i,i="",o?i=" (at "+o.fileName.replace(Le,"")+":"+o.lineNumber+")":n&&(i=" (created by "+n+")"),n="\n in "+(r||"Unknown")+i}t+=n,e=e.return}while(e);return t}var at=/^[: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][: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\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,lt=Object.prototype.hasOwnProperty,ut={},st={};function ct(e,t,n,r,o){this.acceptsBooleans=2===t||3===t||4===t,this.attributeName=r,this.attributeNamespace=o,this.mustUseProperty=n,this.propertyName=e,this.type=t}var pt={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){pt[e]=new ct(e,0,!1,e,null)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];pt[t]=new ct(t,1,!1,e[1],null)}),["contentEditable","draggable","spellCheck","value"].forEach(function(e){pt[e]=new ct(e,2,!1,e.toLowerCase(),null)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){pt[e]=new ct(e,2,!1,e,null)}),"allowFullScreen async autoFocus autoPlay controls default defer disabled formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){pt[e]=new ct(e,3,!1,e.toLowerCase(),null)}),["checked","multiple","muted","selected"].forEach(function(e){pt[e]=new ct(e,3,!0,e,null)}),["capture","download"].forEach(function(e){pt[e]=new ct(e,4,!1,e,null)}),["cols","rows","size","span"].forEach(function(e){pt[e]=new ct(e,6,!1,e,null)}),["rowSpan","start"].forEach(function(e){pt[e]=new ct(e,5,!1,e.toLowerCase(),null)});var ft=/[\-:]([a-z])/g;function dt(e){return e[1].toUpperCase()}function ht(e,t,n,r){var o=pt.hasOwnProperty(t)?pt[t]:null;(null!==o?0===o.type:!r&&(2<t.length&&("o"===t[0]||"O"===t[0])&&("n"===t[1]||"N"===t[1])))||(function(e,t,n,r){if(null==t||function(e,t,n,r){if(null!==n&&0===n.type)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return!r&&(null!==n?!n.acceptsBooleans:"data-"!==(e=e.toLowerCase().slice(0,5))&&"aria-"!==e);default:return!1}}(e,t,n,r))return!0;if(r)return!1;if(null!==n)switch(n.type){case 3:return!t;case 4:return!1===t;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}(t,n,o,r)&&(n=null),r||null===o?function(e){return!!lt.call(st,e)||!lt.call(ut,e)&&(at.test(e)?st[e]=!0:(ut[e]=!0,!1))}(t)&&(null===n?e.removeAttribute(t):e.setAttribute(t,""+n)):o.mustUseProperty?e[o.propertyName]=null===n?3!==o.type&&"":n:(t=o.attributeName,r=o.attributeNamespace,null===n?e.removeAttribute(t):(n=3===(o=o.type)||4===o&&!0===n?"":""+n,r?e.setAttributeNS(r,t,n):e.setAttribute(t,n))))}function mt(e){switch(typeof e){case"boolean":case"number":case"object":case"string":case"undefined":return e;default:return""}}function vt(e,t){var n=t.checked;return o({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=n?n:e._wrapperState.initialChecked})}function yt(e,t){var n=null==t.defaultValue?"":t.defaultValue,r=null!=t.checked?t.checked:t.defaultChecked;n=mt(null!=t.value?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:"checkbox"===t.type||"radio"===t.type?null!=t.checked:null!=t.value}}function gt(e,t){null!=(t=t.checked)&&ht(e,"checked",t,!1)}function bt(e,t){gt(e,t);var n=mt(t.value),r=t.type;if(null!=n)"number"===r?(0===n&&""===e.value||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if("submit"===r||"reset"===r)return void e.removeAttribute("value");t.hasOwnProperty("value")?xt(e,t.type,n):t.hasOwnProperty("defaultValue")&&xt(e,t.type,mt(t.defaultValue)),null==t.checked&&null!=t.defaultChecked&&(e.defaultChecked=!!t.defaultChecked)}function Et(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!("submit"!==r&&"reset"!==r||void 0!==t.value&&null!==t.value))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}""!==(n=e.name)&&(e.name=""),e.defaultChecked=!e.defaultChecked,e.defaultChecked=!!e._wrapperState.initialChecked,""!==n&&(e.name=n)}function xt(e,t,n){"number"===t&&e.ownerDocument.activeElement===e||(null==n?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(ft,dt);pt[t]=new ct(t,1,!1,e,null)}),"xlink:actuate xlink:arcrole xlink:href xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(ft,dt);pt[t]=new ct(t,1,!1,e,"http://www.w3.org/1999/xlink")}),["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(ft,dt);pt[t]=new ct(t,1,!1,e,"http://www.w3.org/XML/1998/namespace")}),["tabIndex","crossOrigin"].forEach(function(e){pt[e]=new ct(e,1,!1,e.toLowerCase(),null)});var wt={change:{phasedRegistrationNames:{bubbled:"onChange",captured:"onChangeCapture"},dependencies:"blur change click focus input keydown keyup selectionchange".split(" ")}};function kt(e,t,n){return(e=ie.getPooled(wt.change,e,t,n)).type="change",_e(n),B(e),e}var Ct=null,St=null;function Tt(e){D(e)}function _t(e){if(je(I(e)))return e}function Ot(e,t){if("change"===e)return t}var Pt=!1;function Ft(){Ct&&(Ct.detachEvent("onpropertychange",Dt),St=Ct=null)}function Dt(e){"value"===e.propertyName&&_t(St)&&Ne(Tt,e=kt(St,e,Me(e)))}function At(e,t,n){"focus"===e?(Ft(),St=n,(Ct=t).attachEvent("onpropertychange",Dt)):"blur"===e&&Ft()}function Nt(e){if("selectionchange"===e||"keyup"===e||"keydown"===e)return _t(St)}function It(e,t){if("click"===e)return _t(t)}function Rt(e,t){if("input"===e||"change"===e)return _t(t)}L&&(Pt=ze("input")&&(!document.documentMode||9<document.documentMode));var Mt={eventTypes:wt,_isInputEventSupported:Pt,extractEvents:function(e,t,n,r){var o=t?I(t):window,i=void 0,a=void 0,l=o.nodeName&&o.nodeName.toLowerCase();if("select"===l||"input"===l&&"file"===o.type?i=Ot:Re(o)?Pt?i=Rt:(i=Nt,a=At):(l=o.nodeName)&&"input"===l.toLowerCase()&&("checkbox"===o.type||"radio"===o.type)&&(i=It),i&&(i=i(e,t)))return kt(i,n,r);a&&a(e,o,t),"blur"===e&&(e=o._wrapperState)&&e.controlled&&"number"===o.type&&xt(o,"number",o.value)}},zt=ie.extend({view:null,detail:null}),Vt={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function Ut(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):!!(e=Vt[e])&&!!t[e]}function jt(){return Ut}var Bt=0,Lt=0,Wt=!1,Kt=!1,Ht=zt.extend({screenX:null,screenY:null,clientX:null,clientY:null,pageX:null,pageY:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,getModifierState:jt,button:null,buttons:null,relatedTarget:function(e){return e.relatedTarget||(e.fromElement===e.srcElement?e.toElement:e.fromElement)},movementX:function(e){if("movementX"in e)return e.movementX;var t=Bt;return Bt=e.screenX,Wt?"mousemove"===e.type?e.screenX-t:0:(Wt=!0,0)},movementY:function(e){if("movementY"in e)return e.movementY;var t=Lt;return Lt=e.screenY,Kt?"mousemove"===e.type?e.screenY-t:0:(Kt=!0,0)}}),qt=Ht.extend({pointerId:null,width:null,height:null,pressure:null,tangentialPressure:null,tiltX:null,tiltY:null,twist:null,pointerType:null,isPrimary:null}),$t={mouseEnter:{registrationName:"onMouseEnter",dependencies:["mouseout","mouseover"]},mouseLeave:{registrationName:"onMouseLeave",dependencies:["mouseout","mouseover"]},pointerEnter:{registrationName:"onPointerEnter",dependencies:["pointerout","pointerover"]},pointerLeave:{registrationName:"onPointerLeave",dependencies:["pointerout","pointerover"]}},Yt={eventTypes:$t,extractEvents:function(e,t,n,r){var o="mouseover"===e||"pointerover"===e,i="mouseout"===e||"pointerout"===e;if(o&&(n.relatedTarget||n.fromElement)||!i&&!o)return null;if(o=r.window===r?r:(o=r.ownerDocument)?o.defaultView||o.parentWindow:window,i?(i=t,t=(t=n.relatedTarget||n.toElement)?A(t):null):i=null,i===t)return null;var a=void 0,l=void 0,u=void 0,s=void 0;"mouseout"===e||"mouseover"===e?(a=Ht,l=$t.mouseLeave,u=$t.mouseEnter,s="mouse"):"pointerout"!==e&&"pointerover"!==e||(a=qt,l=$t.pointerLeave,u=$t.pointerEnter,s="pointer");var c=null==i?o:I(i);if(o=null==t?o:I(t),(e=a.getPooled(l,i,n,r)).type=s+"leave",e.target=c,e.relatedTarget=o,(n=a.getPooled(u,t,n,r)).type=s+"enter",n.target=o,n.relatedTarget=c,r=t,i&&r)e:{for(o=r,s=0,a=t=i;a;a=M(a))s++;for(a=0,u=o;u;u=M(u))a++;for(;0<s-a;)t=M(t),s--;for(;0<a-s;)o=M(o),a--;for(;s--;){if(t===o||t===o.alternate)break e;t=M(t),o=M(o)}t=null}else t=null;for(o=t,t=[];i&&i!==o&&(null===(s=i.alternate)||s!==o);)t.push(i),i=M(i);for(i=[];r&&r!==o&&(null===(s=r.alternate)||s!==o);)i.push(r),r=M(r);for(r=0;r<t.length;r++)U(t[r],"bubbled",e);for(r=i.length;0<r--;)U(i[r],"captured",n);return[e,n]}};function Qt(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t}var Gt=Object.prototype.hasOwnProperty;function Xt(e,t){if(Qt(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(r=0;r<n.length;r++)if(!Gt.call(t,n[r])||!Qt(e[n[r]],t[n[r]]))return!1;return!0}function Jt(e){var t=e;if(e.alternate)for(;t.return;)t=t.return;else{if(0!=(2&t.effectTag))return 1;for(;t.return;)if(0!=(2&(t=t.return).effectTag))return 1}return 3===t.tag?2:3}function Zt(e){2!==Jt(e)&&a("188")}function en(e){if(!(e=function(e){var t=e.alternate;if(!t)return 3===(t=Jt(e))&&a("188"),1===t?null:e;for(var n=e,r=t;;){var o=n.return,i=o?o.alternate:null;if(!o||!i)break;if(o.child===i.child){for(var l=o.child;l;){if(l===n)return Zt(o),e;if(l===r)return Zt(o),t;l=l.sibling}a("188")}if(n.return!==r.return)n=o,r=i;else{l=!1;for(var u=o.child;u;){if(u===n){l=!0,n=o,r=i;break}if(u===r){l=!0,r=o,n=i;break}u=u.sibling}if(!l){for(u=i.child;u;){if(u===n){l=!0,n=i,r=o;break}if(u===r){l=!0,r=i,n=o;break}u=u.sibling}l||a("189")}}n.alternate!==r&&a("190")}return 3!==n.tag&&a("188"),n.stateNode.current===n?e:t}(e)))return null;for(var t=e;;){if(5===t.tag||6===t.tag)return t;if(t.child)t.child.return=t,t=t.child;else{if(t===e)break;for(;!t.sibling;){if(!t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}}return null}var tn=ie.extend({animationName:null,elapsedTime:null,pseudoElement:null}),nn=ie.extend({clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),rn=zt.extend({relatedTarget:null});function on(e){var t=e.keyCode;return"charCode"in e?0===(e=e.charCode)&&13===t&&(e=13):e=t,10===e&&(e=13),32<=e||13===e?e:0}var an={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},ln={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"},un=zt.extend({key:function(e){if(e.key){var t=an[e.key]||e.key;if("Unidentified"!==t)return t}return"keypress"===e.type?13===(e=on(e))?"Enter":String.fromCharCode(e):"keydown"===e.type||"keyup"===e.type?ln[e.keyCode]||"Unidentified":""},location:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,repeat:null,locale:null,getModifierState:jt,charCode:function(e){return"keypress"===e.type?on(e):0},keyCode:function(e){return"keydown"===e.type||"keyup"===e.type?e.keyCode:0},which:function(e){return"keypress"===e.type?on(e):"keydown"===e.type||"keyup"===e.type?e.keyCode:0}}),sn=Ht.extend({dataTransfer:null}),cn=zt.extend({touches:null,targetTouches:null,changedTouches:null,altKey:null,metaKey:null,ctrlKey:null,shiftKey:null,getModifierState:jt}),pn=ie.extend({propertyName:null,elapsedTime:null,pseudoElement:null}),fn=Ht.extend({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}),dn=[["abort","abort"],[Y,"animationEnd"],[Q,"animationIteration"],[G,"animationStart"],["canplay","canPlay"],["canplaythrough","canPlayThrough"],["drag","drag"],["dragenter","dragEnter"],["dragexit","dragExit"],["dragleave","dragLeave"],["dragover","dragOver"],["durationchange","durationChange"],["emptied","emptied"],["encrypted","encrypted"],["ended","ended"],["error","error"],["gotpointercapture","gotPointerCapture"],["load","load"],["loadeddata","loadedData"],["loadedmetadata","loadedMetadata"],["loadstart","loadStart"],["lostpointercapture","lostPointerCapture"],["mousemove","mouseMove"],["mouseout","mouseOut"],["mouseover","mouseOver"],["playing","playing"],["pointermove","pointerMove"],["pointerout","pointerOut"],["pointerover","pointerOver"],["progress","progress"],["scroll","scroll"],["seeking","seeking"],["stalled","stalled"],["suspend","suspend"],["timeupdate","timeUpdate"],["toggle","toggle"],["touchmove","touchMove"],[X,"transitionEnd"],["waiting","waiting"],["wheel","wheel"]],hn={},mn={};function vn(e,t){var n=e[0],r="on"+((e=e[1])[0].toUpperCase()+e.slice(1));t={phasedRegistrationNames:{bubbled:r,captured:r+"Capture"},dependencies:[n],isInteractive:t},hn[e]=t,mn[n]=t}[["blur","blur"],["cancel","cancel"],["click","click"],["close","close"],["contextmenu","contextMenu"],["copy","copy"],["cut","cut"],["auxclick","auxClick"],["dblclick","doubleClick"],["dragend","dragEnd"],["dragstart","dragStart"],["drop","drop"],["focus","focus"],["input","input"],["invalid","invalid"],["keydown","keyDown"],["keypress","keyPress"],["keyup","keyUp"],["mousedown","mouseDown"],["mouseup","mouseUp"],["paste","paste"],["pause","pause"],["play","play"],["pointercancel","pointerCancel"],["pointerdown","pointerDown"],["pointerup","pointerUp"],["ratechange","rateChange"],["reset","reset"],["seeked","seeked"],["submit","submit"],["touchcancel","touchCancel"],["touchend","touchEnd"],["touchstart","touchStart"],["volumechange","volumeChange"]].forEach(function(e){vn(e,!0)}),dn.forEach(function(e){vn(e,!1)});var yn={eventTypes:hn,isInteractiveTopLevelEventType:function(e){return void 0!==(e=mn[e])&&!0===e.isInteractive},extractEvents:function(e,t,n,r){var o=mn[e];if(!o)return null;switch(e){case"keypress":if(0===on(n))return null;case"keydown":case"keyup":e=un;break;case"blur":case"focus":e=rn;break;case"click":if(2===n.button)return null;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":e=Ht;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":e=sn;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":e=cn;break;case Y:case Q:case G:e=tn;break;case X:e=pn;break;case"scroll":e=zt;break;case"wheel":e=fn;break;case"copy":case"cut":case"paste":e=nn;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":e=qt;break;default:e=ie}return B(t=e.getPooled(o,t,n,r)),t}},gn=yn.isInteractiveTopLevelEventType,bn=[];function En(e){var t=e.targetInst,n=t;do{if(!n){e.ancestors.push(n);break}var r;for(r=n;r.return;)r=r.return;if(!(r=3!==r.tag?null:r.stateNode.containerInfo))break;e.ancestors.push(n),n=A(r)}while(n);for(n=0;n<e.ancestors.length;n++){t=e.ancestors[n];var o=Me(e.nativeEvent);r=e.topLevelType;for(var i=e.nativeEvent,a=null,l=0;l<y.length;l++){var u=y[l];u&&(u=u.extractEvents(r,t,i,o))&&(a=S(a,u))}D(a)}}var xn=!0;function wn(e,t){if(!t)return null;var n=(gn(e)?Cn:Sn).bind(null,e);t.addEventListener(e,n,!1)}function kn(e,t){if(!t)return null;var n=(gn(e)?Cn:Sn).bind(null,e);t.addEventListener(e,n,!0)}function Cn(e,t){Fe(Sn,e,t)}function Sn(e,t){if(xn){var n=Me(t);if(null===(n=A(n))||"number"!=typeof n.tag||2===Jt(n)||(n=null),bn.length){var r=bn.pop();r.topLevelType=e,r.nativeEvent=t,r.targetInst=n,e=r}else e={topLevelType:e,nativeEvent:t,targetInst:n,ancestors:[]};try{Ne(En,e)}finally{e.topLevelType=null,e.nativeEvent=null,e.targetInst=null,e.ancestors.length=0,10>bn.length&&bn.push(e)}}}var Tn={},_n=0,On="_reactListenersID"+(""+Math.random()).slice(2);function Pn(e){return Object.prototype.hasOwnProperty.call(e,On)||(e[On]=_n++,Tn[e[On]]={}),Tn[e[On]]}function Fn(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}}function Dn(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function An(e,t){var n,r=Dn(e);for(e=0;r;){if(3===r.nodeType){if(n=e+r.textContent.length,e<=t&&n>=t)return{node:r,offset:t-e};e=n}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=Dn(r)}}function Nn(){for(var e=window,t=Fn();t instanceof e.HTMLIFrameElement;){try{var n="string"==typeof t.contentWindow.location.href}catch(e){n=!1}if(!n)break;t=Fn((e=t.contentWindow).document)}return t}function In(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&("input"===t&&("text"===e.type||"search"===e.type||"tel"===e.type||"url"===e.type||"password"===e.type)||"textarea"===t||"true"===e.contentEditable)}function Rn(e){var t=Nn(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&function e(t,n){return!(!t||!n)&&(t===n||(!t||3!==t.nodeType)&&(n&&3===n.nodeType?e(t,n.parentNode):"contains"in t?t.contains(n):!!t.compareDocumentPosition&&!!(16&t.compareDocumentPosition(n))))}(n.ownerDocument.documentElement,n)){if(null!==r&&In(n))if(t=r.start,void 0===(e=r.end)&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if((e=(t=n.ownerDocument||document)&&t.defaultView||window).getSelection){e=e.getSelection();var o=n.textContent.length,i=Math.min(r.start,o);r=void 0===r.end?i:Math.min(r.end,o),!e.extend&&i>r&&(o=r,r=i,i=o),o=An(n,i);var a=An(n,r);o&&a&&(1!==e.rangeCount||e.anchorNode!==o.node||e.anchorOffset!==o.offset||e.focusNode!==a.node||e.focusOffset!==a.offset)&&((t=t.createRange()).setStart(o.node,o.offset),e.removeAllRanges(),i>r?(e.addRange(t),e.extend(a.node,a.offset)):(t.setEnd(a.node,a.offset),e.addRange(t)))}for(t=[],e=n;e=e.parentNode;)1===e.nodeType&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for("function"==typeof n.focus&&n.focus(),n=0;n<t.length;n++)(e=t[n]).element.scrollLeft=e.left,e.element.scrollTop=e.top}}var Mn=L&&"documentMode"in document&&11>=document.documentMode,zn={select:{phasedRegistrationNames:{bubbled:"onSelect",captured:"onSelectCapture"},dependencies:"blur contextmenu dragend focus keydown keyup mousedown mouseup selectionchange".split(" ")}},Vn=null,Un=null,jn=null,Bn=!1;function Ln(e,t){var n=t.window===t?t.document:9===t.nodeType?t:t.ownerDocument;return Bn||null==Vn||Vn!==Fn(n)?null:("selectionStart"in(n=Vn)&&In(n)?n={start:n.selectionStart,end:n.selectionEnd}:n={anchorNode:(n=(n.ownerDocument&&n.ownerDocument.defaultView||window).getSelection()).anchorNode,anchorOffset:n.anchorOffset,focusNode:n.focusNode,focusOffset:n.focusOffset},jn&&Xt(jn,n)?null:(jn=n,(e=ie.getPooled(zn.select,Un,e,t)).type="select",e.target=Vn,B(e),e))}var Wn={eventTypes:zn,extractEvents:function(e,t,n,r){var o,i=r.window===r?r.document:9===r.nodeType?r:r.ownerDocument;if(!(o=!i)){e:{i=Pn(i),o=E.onSelect;for(var a=0;a<o.length;a++){var l=o[a];if(!i.hasOwnProperty(l)||!i[l]){i=!1;break e}}i=!0}o=!i}if(o)return null;switch(i=t?I(t):window,e){case"focus":(Re(i)||"true"===i.contentEditable)&&(Vn=i,Un=t,jn=null);break;case"blur":jn=Un=Vn=null;break;case"mousedown":Bn=!0;break;case"contextmenu":case"mouseup":case"dragend":return Bn=!1,Ln(n,r);case"selectionchange":if(Mn)break;case"keydown":case"keyup":return Ln(n,r)}return null}};function Kn(e,t){return e=o({children:void 0},t),(t=function(e){var t="";return r.Children.forEach(e,function(e){null!=e&&(t+=e)}),t}(t.children))&&(e.children=t),e}function Hn(e,t,n,r){if(e=e.options,t){t={};for(var o=0;o<n.length;o++)t["$"+n[o]]=!0;for(n=0;n<e.length;n++)o=t.hasOwnProperty("$"+e[n].value),e[n].selected!==o&&(e[n].selected=o),o&&r&&(e[n].defaultSelected=!0)}else{for(n=""+mt(n),t=null,o=0;o<e.length;o++){if(e[o].value===n)return e[o].selected=!0,void(r&&(e[o].defaultSelected=!0));null!==t||e[o].disabled||(t=e[o])}null!==t&&(t.selected=!0)}}function qn(e,t){return null!=t.dangerouslySetInnerHTML&&a("91"),o({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function $n(e,t){var n=t.value;null==n&&(n=t.defaultValue,null!=(t=t.children)&&(null!=n&&a("92"),Array.isArray(t)&&(1>=t.length||a("93"),t=t[0]),n=t),null==n&&(n="")),e._wrapperState={initialValue:mt(n)}}function Yn(e,t){var n=mt(t.value),r=mt(t.defaultValue);null!=n&&((n=""+n)!==e.value&&(e.value=n),null==t.defaultValue&&e.defaultValue!==n&&(e.defaultValue=n)),null!=r&&(e.defaultValue=""+r)}function Qn(e){var t=e.textContent;t===e._wrapperState.initialValue&&(e.value=t)}P.injectEventPluginOrder("ResponderEventPlugin SimpleEventPlugin EnterLeaveEventPlugin ChangeEventPlugin SelectEventPlugin BeforeInputEventPlugin".split(" ")),x=R,w=N,k=I,P.injectEventPluginsByName({SimpleEventPlugin:yn,EnterLeaveEventPlugin:Yt,ChangeEventPlugin:Mt,SelectEventPlugin:Wn,BeforeInputEventPlugin:we});var Gn={html:"http://www.w3.org/1999/xhtml",mathml:"http://www.w3.org/1998/Math/MathML",svg:"http://www.w3.org/2000/svg"};function Xn(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";case"math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function Jn(e,t){return null==e||"http://www.w3.org/1999/xhtml"===e?Xn(t):"http://www.w3.org/2000/svg"===e&&"foreignObject"===t?"http://www.w3.org/1999/xhtml":e}var Zn=void 0,er=function(e){return"undefined"!=typeof MSApp&&MSApp.execUnsafeLocalFunction?function(t,n,r,o){MSApp.execUnsafeLocalFunction(function(){return e(t,n)})}:e}(function(e,t){if(e.namespaceURI!==Gn.svg||"innerHTML"in e)e.innerHTML=t;else{for((Zn=Zn||document.createElement("div")).innerHTML="<svg>"+t+"</svg>",t=Zn.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function tr(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.nodeType)return void(n.nodeValue=t)}e.textContent=t}var nr={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},rr=["Webkit","ms","Moz","O"];function or(e,t,n){return null==t||"boolean"==typeof t||""===t?"":n||"number"!=typeof t||0===t||nr.hasOwnProperty(e)&&nr[e]?(""+t).trim():t+"px"}function ir(e,t){for(var n in e=e.style,t)if(t.hasOwnProperty(n)){var r=0===n.indexOf("--"),o=or(n,t[n],r);"float"===n&&(n="cssFloat"),r?e.setProperty(n,o):e[n]=o}}Object.keys(nr).forEach(function(e){rr.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),nr[t]=nr[e]})});var ar=o({menuitem:!0},{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});function lr(e,t){t&&(ar[e]&&(null!=t.children||null!=t.dangerouslySetInnerHTML)&&a("137",e,""),null!=t.dangerouslySetInnerHTML&&(null!=t.children&&a("60"),"object"==typeof t.dangerouslySetInnerHTML&&"__html"in t.dangerouslySetInnerHTML||a("61")),null!=t.style&&"object"!=typeof t.style&&a("62",""))}function ur(e,t){if(-1===e.indexOf("-"))return"string"==typeof t.is;switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}function sr(e,t){var n=Pn(e=9===e.nodeType||11===e.nodeType?e:e.ownerDocument);t=E[t];for(var r=0;r<t.length;r++){var o=t[r];if(!n.hasOwnProperty(o)||!n[o]){switch(o){case"scroll":kn("scroll",e);break;case"focus":case"blur":kn("focus",e),kn("blur",e),n.blur=!0,n.focus=!0;break;case"cancel":case"close":ze(o)&&kn(o,e);break;case"invalid":case"submit":case"reset":break;default:-1===J.indexOf(o)&&wn(o,e)}n[o]=!0}}}function cr(){}var pr=null,fr=null;function dr(e,t){switch(e){case"button":case"input":case"select":case"textarea":return!!t.autoFocus}return!1}function hr(e,t){return"textarea"===e||"option"===e||"noscript"===e||"string"==typeof t.children||"number"==typeof t.children||"object"==typeof t.dangerouslySetInnerHTML&&null!==t.dangerouslySetInnerHTML&&null!=t.dangerouslySetInnerHTML.__html}var mr="function"==typeof setTimeout?setTimeout:void 0,vr="function"==typeof clearTimeout?clearTimeout:void 0,yr=i.unstable_scheduleCallback,gr=i.unstable_cancelCallback;function br(e){for(e=e.nextSibling;e&&1!==e.nodeType&&3!==e.nodeType;)e=e.nextSibling;return e}function Er(e){for(e=e.firstChild;e&&1!==e.nodeType&&3!==e.nodeType;)e=e.nextSibling;return e}new Set;var xr=[],wr=-1;function kr(e){0>wr||(e.current=xr[wr],xr[wr]=null,wr--)}function Cr(e,t){xr[++wr]=e.current,e.current=t}var Sr={},Tr={current:Sr},_r={current:!1},Or=Sr;function Pr(e,t){var n=e.type.contextTypes;if(!n)return Sr;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var o,i={};for(o in n)i[o]=t[o];return r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=i),i}function Fr(e){return null!=(e=e.childContextTypes)}function Dr(e){kr(_r),kr(Tr)}function Ar(e){kr(_r),kr(Tr)}function Nr(e,t,n){Tr.current!==Sr&&a("168"),Cr(Tr,t),Cr(_r,n)}function Ir(e,t,n){var r=e.stateNode;if(e=t.childContextTypes,"function"!=typeof r.getChildContext)return n;for(var i in r=r.getChildContext())i in e||a("108",ot(t)||"Unknown",i);return o({},n,r)}function Rr(e){var t=e.stateNode;return t=t&&t.__reactInternalMemoizedMergedChildContext||Sr,Or=Tr.current,Cr(Tr,t),Cr(_r,_r.current),!0}function Mr(e,t,n){var r=e.stateNode;r||a("169"),n?(t=Ir(e,t,Or),r.__reactInternalMemoizedMergedChildContext=t,kr(_r),kr(Tr),Cr(Tr,t)):kr(_r),Cr(_r,n)}var zr=null,Vr=null;function Ur(e){return function(t){try{return e(t)}catch(e){}}}function jr(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.contextDependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.effectTag=0,this.lastEffect=this.firstEffect=this.nextEffect=null,this.childExpirationTime=this.expirationTime=0,this.alternate=null}function Br(e,t,n,r){return new jr(e,t,n,r)}function Lr(e){return!(!(e=e.prototype)||!e.isReactComponent)}function Wr(e,t){var n=e.alternate;return null===n?((n=Br(e.tag,t,e.key,e.mode)).elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.effectTag=0,n.nextEffect=null,n.firstEffect=null,n.lastEffect=null),n.childExpirationTime=e.childExpirationTime,n.expirationTime=e.expirationTime,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,n.contextDependencies=e.contextDependencies,n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Kr(e,t,n,r,o,i){var l=2;if(r=e,"function"==typeof e)Lr(e)&&(l=1);else if("string"==typeof e)l=5;else e:switch(e){case qe:return Hr(n.children,o,i,t);case Xe:return qr(n,3|o,i,t);case $e:return qr(n,2|o,i,t);case Ye:return(e=Br(12,n,t,4|o)).elementType=Ye,e.type=Ye,e.expirationTime=i,e;case Ze:return(e=Br(13,n,t,o)).elementType=Ze,e.type=Ze,e.expirationTime=i,e;default:if("object"==typeof e&&null!==e)switch(e.$$typeof){case Qe:l=10;break e;case Ge:l=9;break e;case Je:l=11;break e;case et:l=14;break e;case tt:l=16,r=null;break e}a("130",null==e?e:typeof e,"")}return(t=Br(l,n,t,o)).elementType=e,t.type=r,t.expirationTime=i,t}function Hr(e,t,n,r){return(e=Br(7,e,r,t)).expirationTime=n,e}function qr(e,t,n,r){return e=Br(8,e,r,t),t=0==(1&t)?$e:Xe,e.elementType=t,e.type=t,e.expirationTime=n,e}function $r(e,t,n){return(e=Br(6,e,null,t)).expirationTime=n,e}function Yr(e,t,n){return(t=Br(4,null!==e.children?e.children:[],e.key,t)).expirationTime=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Qr(e,t){e.didError=!1;var n=e.earliestPendingTime;0===n?e.earliestPendingTime=e.latestPendingTime=t:n<t?e.earliestPendingTime=t:e.latestPendingTime>t&&(e.latestPendingTime=t),Jr(t,e)}function Gr(e,t){e.didError=!1,e.latestPingedTime>=t&&(e.latestPingedTime=0);var n=e.earliestPendingTime,r=e.latestPendingTime;n===t?e.earliestPendingTime=r===t?e.latestPendingTime=0:r:r===t&&(e.latestPendingTime=n),n=e.earliestSuspendedTime,r=e.latestSuspendedTime,0===n?e.earliestSuspendedTime=e.latestSuspendedTime=t:n<t?e.earliestSuspendedTime=t:r>t&&(e.latestSuspendedTime=t),Jr(t,e)}function Xr(e,t){var n=e.earliestPendingTime;return n>t&&(t=n),(e=e.earliestSuspendedTime)>t&&(t=e),t}function Jr(e,t){var n=t.earliestSuspendedTime,r=t.latestSuspendedTime,o=t.earliestPendingTime,i=t.latestPingedTime;0===(o=0!==o?o:i)&&(0===e||r<e)&&(o=r),0!==(e=o)&&n>e&&(e=n),t.nextExpirationTimeToWorkOn=o,t.expirationTime=e}function Zr(e,t){if(e&&e.defaultProps)for(var n in t=o({},t),e=e.defaultProps)void 0===t[n]&&(t[n]=e[n]);return t}var eo=(new r.Component).refs;function to(e,t,n,r){n=null==(n=n(r,t=e.memoizedState))?t:o({},t,n),e.memoizedState=n,null!==(r=e.updateQueue)&&0===e.expirationTime&&(r.baseState=n)}var no={isMounted:function(e){return!!(e=e._reactInternalFiber)&&2===Jt(e)},enqueueSetState:function(e,t,n){e=e._reactInternalFiber;var r=gl(),o=qi(r=Ha(r,e));o.payload=t,null!=n&&(o.callback=n),Ua(),Yi(e,o),Ya(e,r)},enqueueReplaceState:function(e,t,n){e=e._reactInternalFiber;var r=gl(),o=qi(r=Ha(r,e));o.tag=ji,o.payload=t,null!=n&&(o.callback=n),Ua(),Yi(e,o),Ya(e,r)},enqueueForceUpdate:function(e,t){e=e._reactInternalFiber;var n=gl(),r=qi(n=Ha(n,e));r.tag=Bi,null!=t&&(r.callback=t),Ua(),Yi(e,r),Ya(e,n)}};function ro(e,t,n,r,o,i,a){return"function"==typeof(e=e.stateNode).shouldComponentUpdate?e.shouldComponentUpdate(r,i,a):!t.prototype||!t.prototype.isPureReactComponent||(!Xt(n,r)||!Xt(o,i))}function oo(e,t,n){var r=!1,o=Sr,i=t.contextType;return"object"==typeof i&&null!==i?i=Vi(i):(o=Fr(t)?Or:Tr.current,i=(r=null!=(r=t.contextTypes))?Pr(e,o):Sr),t=new t(n,i),e.memoizedState=null!==t.state&&void 0!==t.state?t.state:null,t.updater=no,e.stateNode=t,t._reactInternalFiber=e,r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=o,e.__reactInternalMemoizedMaskedChildContext=i),t}function io(e,t,n,r){e=t.state,"function"==typeof t.componentWillReceiveProps&&t.componentWillReceiveProps(n,r),"function"==typeof t.UNSAFE_componentWillReceiveProps&&t.UNSAFE_componentWillReceiveProps(n,r),t.state!==e&&no.enqueueReplaceState(t,t.state,null)}function ao(e,t,n,r){var o=e.stateNode;o.props=n,o.state=e.memoizedState,o.refs=eo;var i=t.contextType;"object"==typeof i&&null!==i?o.context=Vi(i):(i=Fr(t)?Or:Tr.current,o.context=Pr(e,i)),null!==(i=e.updateQueue)&&(Ji(e,i,n,o,r),o.state=e.memoizedState),"function"==typeof(i=t.getDerivedStateFromProps)&&(to(e,t,i,n),o.state=e.memoizedState),"function"==typeof t.getDerivedStateFromProps||"function"==typeof o.getSnapshotBeforeUpdate||"function"!=typeof o.UNSAFE_componentWillMount&&"function"!=typeof o.componentWillMount||(t=o.state,"function"==typeof o.componentWillMount&&o.componentWillMount(),"function"==typeof o.UNSAFE_componentWillMount&&o.UNSAFE_componentWillMount(),t!==o.state&&no.enqueueReplaceState(o,o.state,null),null!==(i=e.updateQueue)&&(Ji(e,i,n,o,r),o.state=e.memoizedState)),"function"==typeof o.componentDidMount&&(e.effectTag|=4)}var lo=Array.isArray;function uo(e,t,n){if(null!==(e=n.ref)&&"function"!=typeof e&&"object"!=typeof e){if(n._owner){n=n._owner;var r=void 0;n&&(1!==n.tag&&a("309"),r=n.stateNode),r||a("147",e);var o=""+e;return null!==t&&null!==t.ref&&"function"==typeof t.ref&&t.ref._stringRef===o?t.ref:((t=function(e){var t=r.refs;t===eo&&(t=r.refs={}),null===e?delete t[o]:t[o]=e})._stringRef=o,t)}"string"!=typeof e&&a("284"),n._owner||a("290",e)}return e}function so(e,t){"textarea"!==e.type&&a("31","[object Object]"===Object.prototype.toString.call(t)?"object with keys {"+Object.keys(t).join(", ")+"}":t,"")}function co(e){function t(t,n){if(e){var r=t.lastEffect;null!==r?(r.nextEffect=n,t.lastEffect=n):t.firstEffect=t.lastEffect=n,n.nextEffect=null,n.effectTag=8}}function n(n,r){if(!e)return null;for(;null!==r;)t(n,r),r=r.sibling;return null}function r(e,t){for(e=new Map;null!==t;)null!==t.key?e.set(t.key,t):e.set(t.index,t),t=t.sibling;return e}function o(e,t,n){return(e=Wr(e,t)).index=0,e.sibling=null,e}function i(t,n,r){return t.index=r,e?null!==(r=t.alternate)?(r=r.index)<n?(t.effectTag=2,n):r:(t.effectTag=2,n):n}function l(t){return e&&null===t.alternate&&(t.effectTag=2),t}function u(e,t,n,r){return null===t||6!==t.tag?((t=$r(n,e.mode,r)).return=e,t):((t=o(t,n)).return=e,t)}function s(e,t,n,r){return null!==t&&t.elementType===n.type?((r=o(t,n.props)).ref=uo(e,t,n),r.return=e,r):((r=Kr(n.type,n.key,n.props,null,e.mode,r)).ref=uo(e,t,n),r.return=e,r)}function c(e,t,n,r){return null===t||4!==t.tag||t.stateNode.containerInfo!==n.containerInfo||t.stateNode.implementation!==n.implementation?((t=Yr(n,e.mode,r)).return=e,t):((t=o(t,n.children||[])).return=e,t)}function p(e,t,n,r,i){return null===t||7!==t.tag?((t=Hr(n,e.mode,r,i)).return=e,t):((t=o(t,n)).return=e,t)}function f(e,t,n){if("string"==typeof t||"number"==typeof t)return(t=$r(""+t,e.mode,n)).return=e,t;if("object"==typeof t&&null!==t){switch(t.$$typeof){case Ke:return(n=Kr(t.type,t.key,t.props,null,e.mode,n)).ref=uo(e,null,t),n.return=e,n;case He:return(t=Yr(t,e.mode,n)).return=e,t}if(lo(t)||rt(t))return(t=Hr(t,e.mode,n,null)).return=e,t;so(e,t)}return null}function d(e,t,n,r){var o=null!==t?t.key:null;if("string"==typeof n||"number"==typeof n)return null!==o?null:u(e,t,""+n,r);if("object"==typeof n&&null!==n){switch(n.$$typeof){case Ke:return n.key===o?n.type===qe?p(e,t,n.props.children,r,o):s(e,t,n,r):null;case He:return n.key===o?c(e,t,n,r):null}if(lo(n)||rt(n))return null!==o?null:p(e,t,n,r,null);so(e,n)}return null}function h(e,t,n,r,o){if("string"==typeof r||"number"==typeof r)return u(t,e=e.get(n)||null,""+r,o);if("object"==typeof r&&null!==r){switch(r.$$typeof){case Ke:return e=e.get(null===r.key?n:r.key)||null,r.type===qe?p(t,e,r.props.children,o,r.key):s(t,e,r,o);case He:return c(t,e=e.get(null===r.key?n:r.key)||null,r,o)}if(lo(r)||rt(r))return p(t,e=e.get(n)||null,r,o,null);so(t,r)}return null}function m(o,a,l,u){for(var s=null,c=null,p=a,m=a=0,v=null;null!==p&&m<l.length;m++){p.index>m?(v=p,p=null):v=p.sibling;var y=d(o,p,l[m],u);if(null===y){null===p&&(p=v);break}e&&p&&null===y.alternate&&t(o,p),a=i(y,a,m),null===c?s=y:c.sibling=y,c=y,p=v}if(m===l.length)return n(o,p),s;if(null===p){for(;m<l.length;m++)(p=f(o,l[m],u))&&(a=i(p,a,m),null===c?s=p:c.sibling=p,c=p);return s}for(p=r(o,p);m<l.length;m++)(v=h(p,o,m,l[m],u))&&(e&&null!==v.alternate&&p.delete(null===v.key?m:v.key),a=i(v,a,m),null===c?s=v:c.sibling=v,c=v);return e&&p.forEach(function(e){return t(o,e)}),s}function v(o,l,u,s){var c=rt(u);"function"!=typeof c&&a("150"),null==(u=c.call(u))&&a("151");for(var p=c=null,m=l,v=l=0,y=null,g=u.next();null!==m&&!g.done;v++,g=u.next()){m.index>v?(y=m,m=null):y=m.sibling;var b=d(o,m,g.value,s);if(null===b){m||(m=y);break}e&&m&&null===b.alternate&&t(o,m),l=i(b,l,v),null===p?c=b:p.sibling=b,p=b,m=y}if(g.done)return n(o,m),c;if(null===m){for(;!g.done;v++,g=u.next())null!==(g=f(o,g.value,s))&&(l=i(g,l,v),null===p?c=g:p.sibling=g,p=g);return c}for(m=r(o,m);!g.done;v++,g=u.next())null!==(g=h(m,o,v,g.value,s))&&(e&&null!==g.alternate&&m.delete(null===g.key?v:g.key),l=i(g,l,v),null===p?c=g:p.sibling=g,p=g);return e&&m.forEach(function(e){return t(o,e)}),c}return function(e,r,i,u){var s="object"==typeof i&&null!==i&&i.type===qe&&null===i.key;s&&(i=i.props.children);var c="object"==typeof i&&null!==i;if(c)switch(i.$$typeof){case Ke:e:{for(c=i.key,s=r;null!==s;){if(s.key===c){if(7===s.tag?i.type===qe:s.elementType===i.type){n(e,s.sibling),(r=o(s,i.type===qe?i.props.children:i.props)).ref=uo(e,s,i),r.return=e,e=r;break e}n(e,s);break}t(e,s),s=s.sibling}i.type===qe?((r=Hr(i.props.children,e.mode,u,i.key)).return=e,e=r):((u=Kr(i.type,i.key,i.props,null,e.mode,u)).ref=uo(e,r,i),u.return=e,e=u)}return l(e);case He:e:{for(s=i.key;null!==r;){if(r.key===s){if(4===r.tag&&r.stateNode.containerInfo===i.containerInfo&&r.stateNode.implementation===i.implementation){n(e,r.sibling),(r=o(r,i.children||[])).return=e,e=r;break e}n(e,r);break}t(e,r),r=r.sibling}(r=Yr(i,e.mode,u)).return=e,e=r}return l(e)}if("string"==typeof i||"number"==typeof i)return i=""+i,null!==r&&6===r.tag?(n(e,r.sibling),(r=o(r,i)).return=e,e=r):(n(e,r),(r=$r(i,e.mode,u)).return=e,e=r),l(e);if(lo(i))return m(e,r,i,u);if(rt(i))return v(e,r,i,u);if(c&&so(e,i),void 0===i&&!s)switch(e.tag){case 1:case 0:a("152",(u=e.type).displayName||u.name||"Component")}return n(e,r)}}var po=co(!0),fo=co(!1),ho={},mo={current:ho},vo={current:ho},yo={current:ho};function go(e){return e===ho&&a("174"),e}function bo(e,t){Cr(yo,t),Cr(vo,e),Cr(mo,ho);var n=t.nodeType;switch(n){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:Jn(null,"");break;default:t=Jn(t=(n=8===n?t.parentNode:t).namespaceURI||null,n=n.tagName)}kr(mo),Cr(mo,t)}function Eo(e){kr(mo),kr(vo),kr(yo)}function xo(e){go(yo.current);var t=go(mo.current),n=Jn(t,e.type);t!==n&&(Cr(vo,e),Cr(mo,n))}function wo(e){vo.current===e&&(kr(mo),kr(vo))}var ko=0,Co=2,So=4,To=8,_o=16,Oo=32,Po=64,Fo=128,Do=Be.ReactCurrentDispatcher,Ao=0,No=null,Io=null,Ro=null,Mo=null,zo=null,Vo=null,Uo=0,jo=null,Bo=0,Lo=!1,Wo=null,Ko=0;function Ho(){a("321")}function qo(e,t){if(null===t)return!1;for(var n=0;n<t.length&&n<e.length;n++)if(!Qt(e[n],t[n]))return!1;return!0}function $o(e,t,n,r,o,i){if(Ao=i,No=t,Ro=null!==e?e.memoizedState:null,Do.current=null===Ro?ai:li,t=n(r,o),Lo){do{Lo=!1,Ko+=1,Ro=null!==e?e.memoizedState:null,Vo=Mo,jo=zo=Io=null,Do.current=li,t=n(r,o)}while(Lo);Wo=null,Ko=0}return Do.current=ii,(e=No).memoizedState=Mo,e.expirationTime=Uo,e.updateQueue=jo,e.effectTag|=Bo,e=null!==Io&&null!==Io.next,Ao=0,Vo=zo=Mo=Ro=Io=No=null,Uo=0,jo=null,Bo=0,e&&a("300"),t}function Yo(){Do.current=ii,Ao=0,Vo=zo=Mo=Ro=Io=No=null,Uo=0,jo=null,Bo=0,Lo=!1,Wo=null,Ko=0}function Qo(){var e={memoizedState:null,baseState:null,queue:null,baseUpdate:null,next:null};return null===zo?Mo=zo=e:zo=zo.next=e,zo}function Go(){if(null!==Vo)Vo=(zo=Vo).next,Ro=null!==(Io=Ro)?Io.next:null;else{null===Ro&&a("310");var e={memoizedState:(Io=Ro).memoizedState,baseState:Io.baseState,queue:Io.queue,baseUpdate:Io.baseUpdate,next:null};zo=null===zo?Mo=e:zo.next=e,Ro=Io.next}return zo}function Xo(e,t){return"function"==typeof t?t(e):t}function Jo(e){var t=Go(),n=t.queue;if(null===n&&a("311"),n.lastRenderedReducer=e,0<Ko){var r=n.dispatch;if(null!==Wo){var o=Wo.get(n);if(void 0!==o){Wo.delete(n);var i=t.memoizedState;do{i=e(i,o.action),o=o.next}while(null!==o);return Qt(i,t.memoizedState)||(gi=!0),t.memoizedState=i,t.baseUpdate===n.last&&(t.baseState=i),n.lastRenderedState=i,[i,r]}}return[t.memoizedState,r]}r=n.last;var l=t.baseUpdate;if(i=t.baseState,null!==l?(null!==r&&(r.next=null),r=l.next):r=null!==r?r.next:null,null!==r){var u=o=null,s=r,c=!1;do{var p=s.expirationTime;p<Ao?(c||(c=!0,u=l,o=i),p>Uo&&(Uo=p)):i=s.eagerReducer===e?s.eagerState:e(i,s.action),l=s,s=s.next}while(null!==s&&s!==r);c||(u=l,o=i),Qt(i,t.memoizedState)||(gi=!0),t.memoizedState=i,t.baseUpdate=u,t.baseState=o,n.lastRenderedState=i}return[t.memoizedState,n.dispatch]}function Zo(e,t,n,r){return e={tag:e,create:t,destroy:n,deps:r,next:null},null===jo?(jo={lastEffect:null}).lastEffect=e.next=e:null===(t=jo.lastEffect)?jo.lastEffect=e.next=e:(n=t.next,t.next=e,e.next=n,jo.lastEffect=e),e}function ei(e,t,n,r){var o=Qo();Bo|=e,o.memoizedState=Zo(t,n,void 0,void 0===r?null:r)}function ti(e,t,n,r){var o=Go();r=void 0===r?null:r;var i=void 0;if(null!==Io){var a=Io.memoizedState;if(i=a.destroy,null!==r&&qo(r,a.deps))return void Zo(ko,n,i,r)}Bo|=e,o.memoizedState=Zo(t,n,i,r)}function ni(e,t){return"function"==typeof t?(e=e(),t(e),function(){t(null)}):null!=t?(e=e(),t.current=e,function(){t.current=null}):void 0}function ri(){}function oi(e,t,n){25>Ko||a("301");var r=e.alternate;if(e===No||null!==r&&r===No)if(Lo=!0,e={expirationTime:Ao,action:n,eagerReducer:null,eagerState:null,next:null},null===Wo&&(Wo=new Map),void 0===(n=Wo.get(t)))Wo.set(t,e);else{for(t=n;null!==t.next;)t=t.next;t.next=e}else{Ua();var o=gl(),i={expirationTime:o=Ha(o,e),action:n,eagerReducer:null,eagerState:null,next:null},l=t.last;if(null===l)i.next=i;else{var u=l.next;null!==u&&(i.next=u),l.next=i}if(t.last=i,0===e.expirationTime&&(null===r||0===r.expirationTime)&&null!==(r=t.lastRenderedReducer))try{var s=t.lastRenderedState,c=r(s,n);if(i.eagerReducer=r,i.eagerState=c,Qt(c,s))return}catch(e){}Ya(e,o)}}var ii={readContext:Vi,useCallback:Ho,useContext:Ho,useEffect:Ho,useImperativeHandle:Ho,useLayoutEffect:Ho,useMemo:Ho,useReducer:Ho,useRef:Ho,useState:Ho,useDebugValue:Ho},ai={readContext:Vi,useCallback:function(e,t){return Qo().memoizedState=[e,void 0===t?null:t],e},useContext:Vi,useEffect:function(e,t){return ei(516,Fo|Po,e,t)},useImperativeHandle:function(e,t,n){return n=null!=n?n.concat([e]):null,ei(4,So|Oo,ni.bind(null,t,e),n)},useLayoutEffect:function(e,t){return ei(4,So|Oo,e,t)},useMemo:function(e,t){var n=Qo();return t=void 0===t?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=Qo();return t=void 0!==n?n(t):t,r.memoizedState=r.baseState=t,e=(e=r.queue={last:null,dispatch:null,lastRenderedReducer:e,lastRenderedState:t}).dispatch=oi.bind(null,No,e),[r.memoizedState,e]},useRef:function(e){return e={current:e},Qo().memoizedState=e},useState:function(e){var t=Qo();return"function"==typeof e&&(e=e()),t.memoizedState=t.baseState=e,e=(e=t.queue={last:null,dispatch:null,lastRenderedReducer:Xo,lastRenderedState:e}).dispatch=oi.bind(null,No,e),[t.memoizedState,e]},useDebugValue:ri},li={readContext:Vi,useCallback:function(e,t){var n=Go();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&qo(t,r[1])?r[0]:(n.memoizedState=[e,t],e)},useContext:Vi,useEffect:function(e,t){return ti(516,Fo|Po,e,t)},useImperativeHandle:function(e,t,n){return n=null!=n?n.concat([e]):null,ti(4,So|Oo,ni.bind(null,t,e),n)},useLayoutEffect:function(e,t){return ti(4,So|Oo,e,t)},useMemo:function(e,t){var n=Go();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&qo(t,r[1])?r[0]:(e=e(),n.memoizedState=[e,t],e)},useReducer:Jo,useRef:function(){return Go().memoizedState},useState:function(e){return Jo(Xo)},useDebugValue:ri},ui=null,si=null,ci=!1;function pi(e,t){var n=Br(5,null,null,0);n.elementType="DELETED",n.type="DELETED",n.stateNode=t,n.return=e,n.effectTag=8,null!==e.lastEffect?(e.lastEffect.nextEffect=n,e.lastEffect=n):e.firstEffect=e.lastEffect=n}function fi(e,t){switch(e.tag){case 5:var n=e.type;return null!==(t=1!==t.nodeType||n.toLowerCase()!==t.nodeName.toLowerCase()?null:t)&&(e.stateNode=t,!0);case 6:return null!==(t=""===e.pendingProps||3!==t.nodeType?null:t)&&(e.stateNode=t,!0);case 13:default:return!1}}function di(e){if(ci){var t=si;if(t){var n=t;if(!fi(e,t)){if(!(t=br(n))||!fi(e,t))return e.effectTag|=2,ci=!1,void(ui=e);pi(ui,n)}ui=e,si=Er(t)}else e.effectTag|=2,ci=!1,ui=e}}function hi(e){for(e=e.return;null!==e&&5!==e.tag&&3!==e.tag&&18!==e.tag;)e=e.return;ui=e}function mi(e){if(e!==ui)return!1;if(!ci)return hi(e),ci=!0,!1;var t=e.type;if(5!==e.tag||"head"!==t&&"body"!==t&&!hr(t,e.memoizedProps))for(t=si;t;)pi(e,t),t=br(t);return hi(e),si=ui?br(e.stateNode):null,!0}function vi(){si=ui=null,ci=!1}var yi=Be.ReactCurrentOwner,gi=!1;function bi(e,t,n,r){t.child=null===e?fo(t,null,n,r):po(t,e.child,n,r)}function Ei(e,t,n,r,o){n=n.render;var i=t.ref;return zi(t,o),r=$o(e,t,n,r,i,o),null===e||gi?(t.effectTag|=1,bi(e,t,r,o),t.child):(t.updateQueue=e.updateQueue,t.effectTag&=-517,e.expirationTime<=o&&(e.expirationTime=0),Pi(e,t,o))}function xi(e,t,n,r,o,i){if(null===e){var a=n.type;return"function"!=typeof a||Lr(a)||void 0!==a.defaultProps||null!==n.compare||void 0!==n.defaultProps?((e=Kr(n.type,null,r,null,t.mode,i)).ref=t.ref,e.return=t,t.child=e):(t.tag=15,t.type=a,wi(e,t,a,r,o,i))}return a=e.child,o<i&&(o=a.memoizedProps,(n=null!==(n=n.compare)?n:Xt)(o,r)&&e.ref===t.ref)?Pi(e,t,i):(t.effectTag|=1,(e=Wr(a,r)).ref=t.ref,e.return=t,t.child=e)}function wi(e,t,n,r,o,i){return null!==e&&Xt(e.memoizedProps,r)&&e.ref===t.ref&&(gi=!1,o<i)?Pi(e,t,i):Ci(e,t,n,r,i)}function ki(e,t){var n=t.ref;(null===e&&null!==n||null!==e&&e.ref!==n)&&(t.effectTag|=128)}function Ci(e,t,n,r,o){var i=Fr(n)?Or:Tr.current;return i=Pr(t,i),zi(t,o),n=$o(e,t,n,r,i,o),null===e||gi?(t.effectTag|=1,bi(e,t,n,o),t.child):(t.updateQueue=e.updateQueue,t.effectTag&=-517,e.expirationTime<=o&&(e.expirationTime=0),Pi(e,t,o))}function Si(e,t,n,r,o){if(Fr(n)){var i=!0;Rr(t)}else i=!1;if(zi(t,o),null===t.stateNode)null!==e&&(e.alternate=null,t.alternate=null,t.effectTag|=2),oo(t,n,r),ao(t,n,r,o),r=!0;else if(null===e){var a=t.stateNode,l=t.memoizedProps;a.props=l;var u=a.context,s=n.contextType;"object"==typeof s&&null!==s?s=Vi(s):s=Pr(t,s=Fr(n)?Or:Tr.current);var c=n.getDerivedStateFromProps,p="function"==typeof c||"function"==typeof a.getSnapshotBeforeUpdate;p||"function"!=typeof a.UNSAFE_componentWillReceiveProps&&"function"!=typeof a.componentWillReceiveProps||(l!==r||u!==s)&&io(t,a,r,s),Wi=!1;var f=t.memoizedState;u=a.state=f;var d=t.updateQueue;null!==d&&(Ji(t,d,r,a,o),u=t.memoizedState),l!==r||f!==u||_r.current||Wi?("function"==typeof c&&(to(t,n,c,r),u=t.memoizedState),(l=Wi||ro(t,n,l,r,f,u,s))?(p||"function"!=typeof a.UNSAFE_componentWillMount&&"function"!=typeof a.componentWillMount||("function"==typeof a.componentWillMount&&a.componentWillMount(),"function"==typeof a.UNSAFE_componentWillMount&&a.UNSAFE_componentWillMount()),"function"==typeof a.componentDidMount&&(t.effectTag|=4)):("function"==typeof a.componentDidMount&&(t.effectTag|=4),t.memoizedProps=r,t.memoizedState=u),a.props=r,a.state=u,a.context=s,r=l):("function"==typeof a.componentDidMount&&(t.effectTag|=4),r=!1)}else a=t.stateNode,l=t.memoizedProps,a.props=t.type===t.elementType?l:Zr(t.type,l),u=a.context,"object"==typeof(s=n.contextType)&&null!==s?s=Vi(s):s=Pr(t,s=Fr(n)?Or:Tr.current),(p="function"==typeof(c=n.getDerivedStateFromProps)||"function"==typeof a.getSnapshotBeforeUpdate)||"function"!=typeof a.UNSAFE_componentWillReceiveProps&&"function"!=typeof a.componentWillReceiveProps||(l!==r||u!==s)&&io(t,a,r,s),Wi=!1,u=t.memoizedState,f=a.state=u,null!==(d=t.updateQueue)&&(Ji(t,d,r,a,o),f=t.memoizedState),l!==r||u!==f||_r.current||Wi?("function"==typeof c&&(to(t,n,c,r),f=t.memoizedState),(c=Wi||ro(t,n,l,r,u,f,s))?(p||"function"!=typeof a.UNSAFE_componentWillUpdate&&"function"!=typeof a.componentWillUpdate||("function"==typeof a.componentWillUpdate&&a.componentWillUpdate(r,f,s),"function"==typeof a.UNSAFE_componentWillUpdate&&a.UNSAFE_componentWillUpdate(r,f,s)),"function"==typeof a.componentDidUpdate&&(t.effectTag|=4),"function"==typeof a.getSnapshotBeforeUpdate&&(t.effectTag|=256)):("function"!=typeof a.componentDidUpdate||l===e.memoizedProps&&u===e.memoizedState||(t.effectTag|=4),"function"!=typeof a.getSnapshotBeforeUpdate||l===e.memoizedProps&&u===e.memoizedState||(t.effectTag|=256),t.memoizedProps=r,t.memoizedState=f),a.props=r,a.state=f,a.context=s,r=c):("function"!=typeof a.componentDidUpdate||l===e.memoizedProps&&u===e.memoizedState||(t.effectTag|=4),"function"!=typeof a.getSnapshotBeforeUpdate||l===e.memoizedProps&&u===e.memoizedState||(t.effectTag|=256),r=!1);return Ti(e,t,n,r,i,o)}function Ti(e,t,n,r,o,i){ki(e,t);var a=0!=(64&t.effectTag);if(!r&&!a)return o&&Mr(t,n,!1),Pi(e,t,i);r=t.stateNode,yi.current=t;var l=a&&"function"!=typeof n.getDerivedStateFromError?null:r.render();return t.effectTag|=1,null!==e&&a?(t.child=po(t,e.child,null,i),t.child=po(t,null,l,i)):bi(e,t,l,i),t.memoizedState=r.state,o&&Mr(t,n,!0),t.child}function _i(e){var t=e.stateNode;t.pendingContext?Nr(0,t.pendingContext,t.pendingContext!==t.context):t.context&&Nr(0,t.context,!1),bo(e,t.containerInfo)}function Oi(e,t,n){var r=t.mode,o=t.pendingProps,i=t.memoizedState;if(0==(64&t.effectTag)){i=null;var a=!1}else i={timedOutAt:null!==i?i.timedOutAt:0},a=!0,t.effectTag&=-65;if(null===e)if(a){var l=o.fallback;e=Hr(null,r,0,null),0==(1&t.mode)&&(e.child=null!==t.memoizedState?t.child.child:t.child),r=Hr(l,r,n,null),e.sibling=r,(n=e).return=r.return=t}else n=r=fo(t,null,o.children,n);else null!==e.memoizedState?(l=(r=e.child).sibling,a?(n=o.fallback,o=Wr(r,r.pendingProps),0==(1&t.mode)&&((a=null!==t.memoizedState?t.child.child:t.child)!==r.child&&(o.child=a)),r=o.sibling=Wr(l,n,l.expirationTime),n=o,o.childExpirationTime=0,n.return=r.return=t):n=r=po(t,r.child,o.children,n)):(l=e.child,a?(a=o.fallback,(o=Hr(null,r,0,null)).child=l,0==(1&t.mode)&&(o.child=null!==t.memoizedState?t.child.child:t.child),(r=o.sibling=Hr(a,r,n,null)).effectTag|=2,n=o,o.childExpirationTime=0,n.return=r.return=t):r=n=po(t,l,o.children,n)),t.stateNode=e.stateNode;return t.memoizedState=i,t.child=n,r}function Pi(e,t,n){if(null!==e&&(t.contextDependencies=e.contextDependencies),t.childExpirationTime<n)return null;if(null!==e&&t.child!==e.child&&a("153"),null!==t.child){for(n=Wr(e=t.child,e.pendingProps,e.expirationTime),t.child=n,n.return=t;null!==e.sibling;)e=e.sibling,(n=n.sibling=Wr(e,e.pendingProps,e.expirationTime)).return=t;n.sibling=null}return t.child}function Fi(e,t,n){var r=t.expirationTime;if(null!==e){if(e.memoizedProps!==t.pendingProps||_r.current)gi=!0;else if(r<n){switch(gi=!1,t.tag){case 3:_i(t),vi();break;case 5:xo(t);break;case 1:Fr(t.type)&&Rr(t);break;case 4:bo(t,t.stateNode.containerInfo);break;case 10:Ri(t,t.memoizedProps.value);break;case 13:if(null!==t.memoizedState)return 0!==(r=t.child.childExpirationTime)&&r>=n?Oi(e,t,n):null!==(t=Pi(e,t,n))?t.sibling:null}return Pi(e,t,n)}}else gi=!1;switch(t.expirationTime=0,t.tag){case 2:r=t.elementType,null!==e&&(e.alternate=null,t.alternate=null,t.effectTag|=2),e=t.pendingProps;var o=Pr(t,Tr.current);if(zi(t,n),o=$o(null,t,r,e,o,n),t.effectTag|=1,"object"==typeof o&&null!==o&&"function"==typeof o.render&&void 0===o.$$typeof){if(t.tag=1,Yo(),Fr(r)){var i=!0;Rr(t)}else i=!1;t.memoizedState=null!==o.state&&void 0!==o.state?o.state:null;var l=r.getDerivedStateFromProps;"function"==typeof l&&to(t,r,l,e),o.updater=no,t.stateNode=o,o._reactInternalFiber=t,ao(t,r,e,n),t=Ti(null,t,r,!0,i,n)}else t.tag=0,bi(null,t,o,n),t=t.child;return t;case 16:switch(o=t.elementType,null!==e&&(e.alternate=null,t.alternate=null,t.effectTag|=2),i=t.pendingProps,e=function(e){var t=e._result;switch(e._status){case 1:return t;case 2:case 0:throw t;default:switch(e._status=0,(t=(t=e._ctor)()).then(function(t){0===e._status&&(t=t.default,e._status=1,e._result=t)},function(t){0===e._status&&(e._status=2,e._result=t)}),e._status){case 1:return e._result;case 2:throw e._result}throw e._result=t,t}}(o),t.type=e,o=t.tag=function(e){if("function"==typeof e)return Lr(e)?1:0;if(null!=e){if((e=e.$$typeof)===Je)return 11;if(e===et)return 14}return 2}(e),i=Zr(e,i),l=void 0,o){case 0:l=Ci(null,t,e,i,n);break;case 1:l=Si(null,t,e,i,n);break;case 11:l=Ei(null,t,e,i,n);break;case 14:l=xi(null,t,e,Zr(e.type,i),r,n);break;default:a("306",e,"")}return l;case 0:return r=t.type,o=t.pendingProps,Ci(e,t,r,o=t.elementType===r?o:Zr(r,o),n);case 1:return r=t.type,o=t.pendingProps,Si(e,t,r,o=t.elementType===r?o:Zr(r,o),n);case 3:return _i(t),null===(r=t.updateQueue)&&a("282"),o=null!==(o=t.memoizedState)?o.element:null,Ji(t,r,t.pendingProps,null,n),(r=t.memoizedState.element)===o?(vi(),t=Pi(e,t,n)):(o=t.stateNode,(o=(null===e||null===e.child)&&o.hydrate)&&(si=Er(t.stateNode.containerInfo),ui=t,o=ci=!0),o?(t.effectTag|=2,t.child=fo(t,null,r,n)):(bi(e,t,r,n),vi()),t=t.child),t;case 5:return xo(t),null===e&&di(t),r=t.type,o=t.pendingProps,i=null!==e?e.memoizedProps:null,l=o.children,hr(r,o)?l=null:null!==i&&hr(r,i)&&(t.effectTag|=16),ki(e,t),1!==n&&1&t.mode&&o.hidden?(t.expirationTime=t.childExpirationTime=1,t=null):(bi(e,t,l,n),t=t.child),t;case 6:return null===e&&di(t),null;case 13:return Oi(e,t,n);case 4:return bo(t,t.stateNode.containerInfo),r=t.pendingProps,null===e?t.child=po(t,null,r,n):bi(e,t,r,n),t.child;case 11:return r=t.type,o=t.pendingProps,Ei(e,t,r,o=t.elementType===r?o:Zr(r,o),n);case 7:return bi(e,t,t.pendingProps,n),t.child;case 8:case 12:return bi(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,o=t.pendingProps,l=t.memoizedProps,Ri(t,i=o.value),null!==l){var u=l.value;if(0===(i=Qt(u,i)?0:0|("function"==typeof r._calculateChangedBits?r._calculateChangedBits(u,i):1073741823))){if(l.children===o.children&&!_r.current){t=Pi(e,t,n);break e}}else for(null!==(u=t.child)&&(u.return=t);null!==u;){var s=u.contextDependencies;if(null!==s){l=u.child;for(var c=s.first;null!==c;){if(c.context===r&&0!=(c.observedBits&i)){1===u.tag&&((c=qi(n)).tag=Bi,Yi(u,c)),u.expirationTime<n&&(u.expirationTime=n),null!==(c=u.alternate)&&c.expirationTime<n&&(c.expirationTime=n),c=n;for(var p=u.return;null!==p;){var f=p.alternate;if(p.childExpirationTime<c)p.childExpirationTime=c,null!==f&&f.childExpirationTime<c&&(f.childExpirationTime=c);else{if(!(null!==f&&f.childExpirationTime<c))break;f.childExpirationTime=c}p=p.return}s.expirationTime<n&&(s.expirationTime=n);break}c=c.next}}else l=10===u.tag&&u.type===t.type?null:u.child;if(null!==l)l.return=u;else for(l=u;null!==l;){if(l===t){l=null;break}if(null!==(u=l.sibling)){u.return=l.return,l=u;break}l=l.return}u=l}}bi(e,t,o.children,n),t=t.child}return t;case 9:return o=t.type,r=(i=t.pendingProps).children,zi(t,n),r=r(o=Vi(o,i.unstable_observedBits)),t.effectTag|=1,bi(e,t,r,n),t.child;case 14:return i=Zr(o=t.type,t.pendingProps),xi(e,t,o,i=Zr(o.type,i),r,n);case 15:return wi(e,t,t.type,t.pendingProps,r,n);case 17:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:Zr(r,o),null!==e&&(e.alternate=null,t.alternate=null,t.effectTag|=2),t.tag=1,Fr(r)?(e=!0,Rr(t)):e=!1,zi(t,n),oo(t,r,o),ao(t,r,o,n),Ti(null,t,r,!0,e,n)}a("156")}var Di={current:null},Ai=null,Ni=null,Ii=null;function Ri(e,t){var n=e.type._context;Cr(Di,n._currentValue),n._currentValue=t}function Mi(e){var t=Di.current;kr(Di),e.type._context._currentValue=t}function zi(e,t){Ai=e,Ii=Ni=null;var n=e.contextDependencies;null!==n&&n.expirationTime>=t&&(gi=!0),e.contextDependencies=null}function Vi(e,t){return Ii!==e&&!1!==t&&0!==t&&("number"==typeof t&&1073741823!==t||(Ii=e,t=1073741823),t={context:e,observedBits:t,next:null},null===Ni?(null===Ai&&a("308"),Ni=t,Ai.contextDependencies={first:t,expirationTime:0}):Ni=Ni.next=t),e._currentValue}var Ui=0,ji=1,Bi=2,Li=3,Wi=!1;function Ki(e){return{baseState:e,firstUpdate:null,lastUpdate:null,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}function Hi(e){return{baseState:e.baseState,firstUpdate:e.firstUpdate,lastUpdate:e.lastUpdate,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}function qi(e){return{expirationTime:e,tag:Ui,payload:null,callback:null,next:null,nextEffect:null}}function $i(e,t){null===e.lastUpdate?e.firstUpdate=e.lastUpdate=t:(e.lastUpdate.next=t,e.lastUpdate=t)}function Yi(e,t){var n=e.alternate;if(null===n){var r=e.updateQueue,o=null;null===r&&(r=e.updateQueue=Ki(e.memoizedState))}else r=e.updateQueue,o=n.updateQueue,null===r?null===o?(r=e.updateQueue=Ki(e.memoizedState),o=n.updateQueue=Ki(n.memoizedState)):r=e.updateQueue=Hi(o):null===o&&(o=n.updateQueue=Hi(r));null===o||r===o?$i(r,t):null===r.lastUpdate||null===o.lastUpdate?($i(r,t),$i(o,t)):($i(r,t),o.lastUpdate=t)}function Qi(e,t){var n=e.updateQueue;null===(n=null===n?e.updateQueue=Ki(e.memoizedState):Gi(e,n)).lastCapturedUpdate?n.firstCapturedUpdate=n.lastCapturedUpdate=t:(n.lastCapturedUpdate.next=t,n.lastCapturedUpdate=t)}function Gi(e,t){var n=e.alternate;return null!==n&&t===n.updateQueue&&(t=e.updateQueue=Hi(t)),t}function Xi(e,t,n,r,i,a){switch(n.tag){case ji:return"function"==typeof(e=n.payload)?e.call(a,r,i):e;case Li:e.effectTag=-2049&e.effectTag|64;case Ui:if(null==(i="function"==typeof(e=n.payload)?e.call(a,r,i):e))break;return o({},r,i);case Bi:Wi=!0}return r}function Ji(e,t,n,r,o){Wi=!1;for(var i=(t=Gi(e,t)).baseState,a=null,l=0,u=t.firstUpdate,s=i;null!==u;){var c=u.expirationTime;c<o?(null===a&&(a=u,i=s),l<c&&(l=c)):(s=Xi(e,0,u,s,n,r),null!==u.callback&&(e.effectTag|=32,u.nextEffect=null,null===t.lastEffect?t.firstEffect=t.lastEffect=u:(t.lastEffect.nextEffect=u,t.lastEffect=u))),u=u.next}for(c=null,u=t.firstCapturedUpdate;null!==u;){var p=u.expirationTime;p<o?(null===c&&(c=u,null===a&&(i=s)),l<p&&(l=p)):(s=Xi(e,0,u,s,n,r),null!==u.callback&&(e.effectTag|=32,u.nextEffect=null,null===t.lastCapturedEffect?t.firstCapturedEffect=t.lastCapturedEffect=u:(t.lastCapturedEffect.nextEffect=u,t.lastCapturedEffect=u))),u=u.next}null===a&&(t.lastUpdate=null),null===c?t.lastCapturedUpdate=null:e.effectTag|=32,null===a&&null===c&&(i=s),t.baseState=i,t.firstUpdate=a,t.firstCapturedUpdate=c,e.expirationTime=l,e.memoizedState=s}function Zi(e,t,n){null!==t.firstCapturedUpdate&&(null!==t.lastUpdate&&(t.lastUpdate.next=t.firstCapturedUpdate,t.lastUpdate=t.lastCapturedUpdate),t.firstCapturedUpdate=t.lastCapturedUpdate=null),ea(t.firstEffect,n),t.firstEffect=t.lastEffect=null,ea(t.firstCapturedEffect,n),t.firstCapturedEffect=t.lastCapturedEffect=null}function ea(e,t){for(;null!==e;){var n=e.callback;if(null!==n){e.callback=null;var r=t;"function"!=typeof n&&a("191",n),n.call(r)}e=e.nextEffect}}function ta(e,t){return{value:e,source:t,stack:it(t)}}function na(e){e.effectTag|=4}var ra=void 0,oa=void 0,ia=void 0,aa=void 0;ra=function(e,t){for(var n=t.child;null!==n;){if(5===n.tag||6===n.tag)e.appendChild(n.stateNode);else if(4!==n.tag&&null!==n.child){n.child.return=n,n=n.child;continue}if(n===t)break;for(;null===n.sibling;){if(null===n.return||n.return===t)return;n=n.return}n.sibling.return=n.return,n=n.sibling}},oa=function(){},ia=function(e,t,n,r,i){var a=e.memoizedProps;if(a!==r){var l=t.stateNode;switch(go(mo.current),e=null,n){case"input":a=vt(l,a),r=vt(l,r),e=[];break;case"option":a=Kn(l,a),r=Kn(l,r),e=[];break;case"select":a=o({},a,{value:void 0}),r=o({},r,{value:void 0}),e=[];break;case"textarea":a=qn(l,a),r=qn(l,r),e=[];break;default:"function"!=typeof a.onClick&&"function"==typeof r.onClick&&(l.onclick=cr)}lr(n,r),l=n=void 0;var u=null;for(n in a)if(!r.hasOwnProperty(n)&&a.hasOwnProperty(n)&&null!=a[n])if("style"===n){var s=a[n];for(l in s)s.hasOwnProperty(l)&&(u||(u={}),u[l]="")}else"dangerouslySetInnerHTML"!==n&&"children"!==n&&"suppressContentEditableWarning"!==n&&"suppressHydrationWarning"!==n&&"autoFocus"!==n&&(b.hasOwnProperty(n)?e||(e=[]):(e=e||[]).push(n,null));for(n in r){var c=r[n];if(s=null!=a?a[n]:void 0,r.hasOwnProperty(n)&&c!==s&&(null!=c||null!=s))if("style"===n)if(s){for(l in s)!s.hasOwnProperty(l)||c&&c.hasOwnProperty(l)||(u||(u={}),u[l]="");for(l in c)c.hasOwnProperty(l)&&s[l]!==c[l]&&(u||(u={}),u[l]=c[l])}else u||(e||(e=[]),e.push(n,u)),u=c;else"dangerouslySetInnerHTML"===n?(c=c?c.__html:void 0,s=s?s.__html:void 0,null!=c&&s!==c&&(e=e||[]).push(n,""+c)):"children"===n?s===c||"string"!=typeof c&&"number"!=typeof c||(e=e||[]).push(n,""+c):"suppressContentEditableWarning"!==n&&"suppressHydrationWarning"!==n&&(b.hasOwnProperty(n)?(null!=c&&sr(i,n),e||s===c||(e=[])):(e=e||[]).push(n,c))}u&&(e=e||[]).push("style",u),i=e,(t.updateQueue=i)&&na(t)}},aa=function(e,t,n,r){n!==r&&na(t)};var la="function"==typeof WeakSet?WeakSet:Set;function ua(e,t){var n=t.source,r=t.stack;null===r&&null!==n&&(r=it(n)),null!==n&&ot(n.type),t=t.value,null!==e&&1===e.tag&&ot(e.type);try{console.error(t)}catch(e){setTimeout(function(){throw e})}}function sa(e){var t=e.ref;if(null!==t)if("function"==typeof t)try{t(null)}catch(t){Ka(e,t)}else t.current=null}function ca(e,t,n){if(null!==(n=null!==(n=n.updateQueue)?n.lastEffect:null)){var r=n=n.next;do{if((r.tag&e)!==ko){var o=r.destroy;r.destroy=void 0,void 0!==o&&o()}(r.tag&t)!==ko&&(o=r.create,r.destroy=o()),r=r.next}while(r!==n)}}function pa(e){switch("function"==typeof Vr&&Vr(e),e.tag){case 0:case 11:case 14:case 15:var t=e.updateQueue;if(null!==t&&null!==(t=t.lastEffect)){var n=t=t.next;do{var r=n.destroy;if(void 0!==r){var o=e;try{r()}catch(e){Ka(o,e)}}n=n.next}while(n!==t)}break;case 1:if(sa(e),"function"==typeof(t=e.stateNode).componentWillUnmount)try{t.props=e.memoizedProps,t.state=e.memoizedState,t.componentWillUnmount()}catch(t){Ka(e,t)}break;case 5:sa(e),e.stateNode.__reactEventHandlers$=null,e.stateNode.__reactInternalInstance$=null;break;case 6:e.stateNode.__reactEventHandlers$=null,e.stateNode.__reactInternalInstance$=null;break;case 4:ha(e)}e.stateNode=null,null!=e.alternate&&(e.alternate.stateNode=null)}function fa(e){return 5===e.tag||3===e.tag||4===e.tag}function da(e){e:{for(var t=e.return;null!==t;){if(fa(t)){var n=t;break e}t=t.return}a("160"),n=void 0}var r=t=void 0;switch(n.tag){case 5:t=n.stateNode,r=!1;break;case 3:case 4:t=n.stateNode.containerInfo,r=!0;break;default:a("161")}16&n.effectTag&&(tr(t,""),n.effectTag&=-17);e:t:for(n=e;;){for(;null===n.sibling;){if(null===n.return||fa(n.return)){n=null;break e}n=n.return}for(n.sibling.return=n.return,n=n.sibling;5!==n.tag&&6!==n.tag&&18!==n.tag;){if(2&n.effectTag)continue t;if(null===n.child||4===n.tag)continue t;n.child.return=n,n=n.child}if(!(2&n.effectTag)){n=n.stateNode;break e}}for(var o=e;;){if(5===o.tag||6===o.tag)if(n)if(r){var i=t,l=o.stateNode,u=n;8===i.nodeType?i.parentNode.insertBefore(l,u):i.insertBefore(l,u)}else t.insertBefore(o.stateNode,n);else r?(l=t,u=o.stateNode,8===l.nodeType?(i=l.parentNode).insertBefore(u,l):(i=l).appendChild(u),null!=(l=l._reactRootContainer)||null!==i.onclick||(i.onclick=cr)):t.appendChild(o.stateNode);else if(4!==o.tag&&null!==o.child){o.child.return=o,o=o.child;continue}if(o===e)break;for(;null===o.sibling;){if(null===o.return||o.return===e)return;o=o.return}o.sibling.return=o.return,o=o.sibling}}function ha(e){for(var t=e,n=!1,r=void 0,o=void 0;;){if(!n){n=t.return;e:for(;;){switch(null===n&&a("160"),n.tag){case 5:r=n.stateNode,o=!1;break e;case 3:case 4:r=n.stateNode.containerInfo,o=!0;break e}n=n.return}n=!0}if(5===t.tag||6===t.tag){var i=t.stateNode;e:for(var l=t,u=l;;)if(pa(u),null!==u.child&&4!==u.tag)u.child.return=u,u=u.child;else{if(u===l)break;for(;null===u.sibling;){if(null===u.return||u.return===l)break e;u=u.return}u.sibling.return=u.return,u=u.sibling}o?8===(l=r).nodeType?l.parentNode.removeChild(i):l.removeChild(i):r.removeChild(i)}else if(4===t.tag){if(null!==t.child){r=t.stateNode.containerInfo,o=!0,t.child.return=t,t=t.child;continue}}else if(pa(t),null!==t.child){t.child.return=t,t=t.child;continue}if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return;4===(t=t.return).tag&&(n=!1)}t.sibling.return=t.return,t=t.sibling}}function ma(e,t){switch(t.tag){case 0:case 11:case 14:case 15:ca(So,To,t);break;case 1:break;case 5:var n=t.stateNode;if(null!=n){var r=t.memoizedProps;e=null!==e?e.memoizedProps:r;var o=t.type,i=t.updateQueue;t.updateQueue=null,null!==i&&function(e,t,n,r,o){e.__reactEventHandlers$=o,"input"===n&&"radio"===o.type&&null!=o.name&>(e,o),ur(n,r),r=ur(n,o);for(var i=0;i<t.length;i+=2){var a=t[i],l=t[i+1];"style"===a?ir(e,l):"dangerouslySetInnerHTML"===a?er(e,l):"children"===a?tr(e,l):ht(e,a,l,r)}switch(n){case"input":bt(e,o);break;case"textarea":Yn(e,o);break;case"select":t=e._wrapperState.wasMultiple,e._wrapperState.wasMultiple=!!o.multiple,null!=(n=o.value)?Hn(e,!!o.multiple,n,!1):t!==!!o.multiple&&(null!=o.defaultValue?Hn(e,!!o.multiple,o.defaultValue,!0):Hn(e,!!o.multiple,o.multiple?[]:"",!1))}}(n,i,o,e,r)}break;case 6:null===t.stateNode&&a("162"),t.stateNode.nodeValue=t.memoizedProps;break;case 3:case 12:break;case 13:if(n=t.memoizedState,r=void 0,e=t,null===n?r=!1:(r=!0,e=t.child,0===n.timedOutAt&&(n.timedOutAt=gl())),null!==e&&function(e,t){for(var n=e;;){if(5===n.tag){var r=n.stateNode;if(t)r.style.display="none";else{r=n.stateNode;var o=n.memoizedProps.style;o=null!=o&&o.hasOwnProperty("display")?o.display:null,r.style.display=or("display",o)}}else if(6===n.tag)n.stateNode.nodeValue=t?"":n.memoizedProps;else{if(13===n.tag&&null!==n.memoizedState){(r=n.child.sibling).return=n,n=r;continue}if(null!==n.child){n.child.return=n,n=n.child;continue}}if(n===e)break;for(;null===n.sibling;){if(null===n.return||n.return===e)return;n=n.return}n.sibling.return=n.return,n=n.sibling}}(e,r),null!==(n=t.updateQueue)){t.updateQueue=null;var l=t.stateNode;null===l&&(l=t.stateNode=new la),n.forEach(function(e){var n=function(e,t){var n=e.stateNode;null!==n&&n.delete(t),t=Ha(t=gl(),e),null!==(e=$a(e,t))&&(Qr(e,t),0!==(t=e.expirationTime)&&bl(e,t))}.bind(null,t,e);l.has(e)||(l.add(e),e.then(n,n))})}break;case 17:break;default:a("163")}}var va="function"==typeof WeakMap?WeakMap:Map;function ya(e,t,n){(n=qi(n)).tag=Li,n.payload={element:null};var r=t.value;return n.callback=function(){Ol(r),ua(e,t)},n}function ga(e,t,n){(n=qi(n)).tag=Li;var r=e.type.getDerivedStateFromError;if("function"==typeof r){var o=t.value;n.payload=function(){return r(o)}}var i=e.stateNode;return null!==i&&"function"==typeof i.componentDidCatch&&(n.callback=function(){"function"!=typeof r&&(null===Ia?Ia=new Set([this]):Ia.add(this));var n=t.value,o=t.stack;ua(e,t),this.componentDidCatch(n,{componentStack:null!==o?o:""})}),n}function ba(e){switch(e.tag){case 1:Fr(e.type)&&Dr();var t=e.effectTag;return 2048&t?(e.effectTag=-2049&t|64,e):null;case 3:return Eo(),Ar(),0!=(64&(t=e.effectTag))&&a("285"),e.effectTag=-2049&t|64,e;case 5:return wo(e),null;case 13:return 2048&(t=e.effectTag)?(e.effectTag=-2049&t|64,e):null;case 18:return null;case 4:return Eo(),null;case 10:return Mi(e),null;default:return null}}var Ea=Be.ReactCurrentDispatcher,xa=Be.ReactCurrentOwner,wa=1073741822,ka=!1,Ca=null,Sa=null,Ta=0,_a=-1,Oa=!1,Pa=null,Fa=!1,Da=null,Aa=null,Na=null,Ia=null;function Ra(){if(null!==Ca)for(var e=Ca.return;null!==e;){var t=e;switch(t.tag){case 1:var n=t.type.childContextTypes;null!=n&&Dr();break;case 3:Eo(),Ar();break;case 5:wo(t);break;case 4:Eo();break;case 10:Mi(t)}e=e.return}Sa=null,Ta=0,_a=-1,Oa=!1,Ca=null}function Ma(){for(;null!==Pa;){var e=Pa.effectTag;if(16&e&&tr(Pa.stateNode,""),128&e){var t=Pa.alternate;null!==t&&(null!==(t=t.ref)&&("function"==typeof t?t(null):t.current=null))}switch(14&e){case 2:da(Pa),Pa.effectTag&=-3;break;case 6:da(Pa),Pa.effectTag&=-3,ma(Pa.alternate,Pa);break;case 4:ma(Pa.alternate,Pa);break;case 8:ha(e=Pa),e.return=null,e.child=null,e.memoizedState=null,e.updateQueue=null,null!==(e=e.alternate)&&(e.return=null,e.child=null,e.memoizedState=null,e.updateQueue=null)}Pa=Pa.nextEffect}}function za(){for(;null!==Pa;){if(256&Pa.effectTag)e:{var e=Pa.alternate,t=Pa;switch(t.tag){case 0:case 11:case 15:ca(Co,ko,t);break e;case 1:if(256&t.effectTag&&null!==e){var n=e.memoizedProps,r=e.memoizedState;t=(e=t.stateNode).getSnapshotBeforeUpdate(t.elementType===t.type?n:Zr(t.type,n),r),e.__reactInternalSnapshotBeforeUpdate=t}break e;case 3:case 5:case 6:case 4:case 17:break e;default:a("163")}}Pa=Pa.nextEffect}}function Va(e,t){for(;null!==Pa;){var n=Pa.effectTag;if(36&n){var r=Pa.alternate,o=Pa,i=t;switch(o.tag){case 0:case 11:case 15:ca(_o,Oo,o);break;case 1:var l=o.stateNode;if(4&o.effectTag)if(null===r)l.componentDidMount();else{var u=o.elementType===o.type?r.memoizedProps:Zr(o.type,r.memoizedProps);l.componentDidUpdate(u,r.memoizedState,l.__reactInternalSnapshotBeforeUpdate)}null!==(r=o.updateQueue)&&Zi(0,r,l);break;case 3:if(null!==(r=o.updateQueue)){if(l=null,null!==o.child)switch(o.child.tag){case 5:l=o.child.stateNode;break;case 1:l=o.child.stateNode}Zi(0,r,l)}break;case 5:i=o.stateNode,null===r&&4&o.effectTag&&dr(o.type,o.memoizedProps)&&i.focus();break;case 6:case 4:case 12:case 13:case 17:break;default:a("163")}}128&n&&(null!==(o=Pa.ref)&&(i=Pa.stateNode,"function"==typeof o?o(i):o.current=i)),512&n&&(Da=e),Pa=Pa.nextEffect}}function Ua(){null!==Aa&&gr(Aa),null!==Na&&Na()}function ja(e,t){Fa=ka=!0,e.current===t&&a("177");var n=e.pendingCommitExpirationTime;0===n&&a("261"),e.pendingCommitExpirationTime=0;var r=t.expirationTime,o=t.childExpirationTime;for(function(e,t){if(e.didError=!1,0===t)e.earliestPendingTime=0,e.latestPendingTime=0,e.earliestSuspendedTime=0,e.latestSuspendedTime=0,e.latestPingedTime=0;else{t<e.latestPingedTime&&(e.latestPingedTime=0);var n=e.latestPendingTime;0!==n&&(n>t?e.earliestPendingTime=e.latestPendingTime=0:e.earliestPendingTime>t&&(e.earliestPendingTime=e.latestPendingTime)),0===(n=e.earliestSuspendedTime)?Qr(e,t):t<e.latestSuspendedTime?(e.earliestSuspendedTime=0,e.latestSuspendedTime=0,e.latestPingedTime=0,Qr(e,t)):t>n&&Qr(e,t)}Jr(0,e)}(e,o>r?o:r),xa.current=null,r=void 0,1<t.effectTag?null!==t.lastEffect?(t.lastEffect.nextEffect=t,r=t.firstEffect):r=t:r=t.firstEffect,pr=xn,fr=function(){var e=Nn();if(In(e)){if("selectionStart"in e)var t={start:e.selectionStart,end:e.selectionEnd};else e:{var n=(t=(t=e.ownerDocument)&&t.defaultView||window).getSelection&&t.getSelection();if(n&&0!==n.rangeCount){t=n.anchorNode;var r=n.anchorOffset,o=n.focusNode;n=n.focusOffset;try{t.nodeType,o.nodeType}catch(e){t=null;break e}var i=0,a=-1,l=-1,u=0,s=0,c=e,p=null;t:for(;;){for(var f;c!==t||0!==r&&3!==c.nodeType||(a=i+r),c!==o||0!==n&&3!==c.nodeType||(l=i+n),3===c.nodeType&&(i+=c.nodeValue.length),null!==(f=c.firstChild);)p=c,c=f;for(;;){if(c===e)break t;if(p===t&&++u===r&&(a=i),p===o&&++s===n&&(l=i),null!==(f=c.nextSibling))break;p=(c=p).parentNode}c=f}t=-1===a||-1===l?null:{start:a,end:l}}else t=null}t=t||{start:0,end:0}}else t=null;return{focusedElem:e,selectionRange:t}}(),xn=!1,Pa=r;null!==Pa;){o=!1;var l=void 0;try{za()}catch(e){o=!0,l=e}o&&(null===Pa&&a("178"),Ka(Pa,l),null!==Pa&&(Pa=Pa.nextEffect))}for(Pa=r;null!==Pa;){o=!1,l=void 0;try{Ma()}catch(e){o=!0,l=e}o&&(null===Pa&&a("178"),Ka(Pa,l),null!==Pa&&(Pa=Pa.nextEffect))}for(Rn(fr),fr=null,xn=!!pr,pr=null,e.current=t,Pa=r;null!==Pa;){o=!1,l=void 0;try{Va(e,n)}catch(e){o=!0,l=e}o&&(null===Pa&&a("178"),Ka(Pa,l),null!==Pa&&(Pa=Pa.nextEffect))}if(null!==r&&null!==Da){var u=function(e,t){Na=Aa=Da=null;var n=el;el=!0;do{if(512&t.effectTag){var r=!1,o=void 0;try{var i=t;ca(Fo,ko,i),ca(ko,Po,i)}catch(e){r=!0,o=e}r&&Ka(t,o)}r=t.nextEffect,t.nextEffect=null,t=r}while(null!==t);el=n,0!==(n=e.expirationTime)&&bl(e,n),al||el||Cl(1073741823,!1)}.bind(null,e,r);Aa=i.unstable_runWithPriority(i.unstable_NormalPriority,function(){return yr(u)}),Na=u}else for(Pa=r;null!==Pa;)n=Pa.nextEffect,Pa.nextEffect=null,Pa=n;ka=Fa=!1,"function"==typeof zr&&zr(t.stateNode),n=t.expirationTime,0===(t=(t=t.childExpirationTime)>n?t:n)&&(Ia=null),function(e,t){e.expirationTime=t,e.finishedWork=null}(e,t)}function Ba(e){for(;;){var t=e.alternate,n=e.return,r=e.sibling;if(0==(1024&e.effectTag)){Ca=e;e:{var i=t,l=Ta,u=(t=e).pendingProps;switch(t.tag){case 2:case 16:break;case 15:case 0:break;case 1:Fr(t.type)&&Dr();break;case 3:Eo(),Ar(),(u=t.stateNode).pendingContext&&(u.context=u.pendingContext,u.pendingContext=null),null!==i&&null!==i.child||(mi(t),t.effectTag&=-3),oa(t);break;case 5:wo(t);var s=go(yo.current);if(l=t.type,null!==i&&null!=t.stateNode)ia(i,t,l,u,s),i.ref!==t.ref&&(t.effectTag|=128);else if(u){var c=go(mo.current);if(mi(t)){i=(u=t).stateNode;var p=u.type,f=u.memoizedProps,d=s;switch(i.__reactInternalInstance$=u,i.__reactEventHandlers$=f,l=void 0,s=p){case"iframe":case"object":wn("load",i);break;case"video":case"audio":for(p=0;p<J.length;p++)wn(J[p],i);break;case"source":wn("error",i);break;case"img":case"image":case"link":wn("error",i),wn("load",i);break;case"form":wn("reset",i),wn("submit",i);break;case"details":wn("toggle",i);break;case"input":yt(i,f),wn("invalid",i),sr(d,"onChange");break;case"select":i._wrapperState={wasMultiple:!!f.multiple},wn("invalid",i),sr(d,"onChange");break;case"textarea":$n(i,f),wn("invalid",i),sr(d,"onChange")}for(l in lr(s,f),p=null,f)f.hasOwnProperty(l)&&(c=f[l],"children"===l?"string"==typeof c?i.textContent!==c&&(p=["children",c]):"number"==typeof c&&i.textContent!==""+c&&(p=["children",""+c]):b.hasOwnProperty(l)&&null!=c&&sr(d,l));switch(s){case"input":Ue(i),Et(i,f,!0);break;case"textarea":Ue(i),Qn(i);break;case"select":case"option":break;default:"function"==typeof f.onClick&&(i.onclick=cr)}l=p,u.updateQueue=l,(u=null!==l)&&na(t)}else{f=t,d=l,i=u,p=9===s.nodeType?s:s.ownerDocument,c===Gn.html&&(c=Xn(d)),c===Gn.html?"script"===d?((i=p.createElement("div")).innerHTML="<script><\/script>",p=i.removeChild(i.firstChild)):"string"==typeof i.is?p=p.createElement(d,{is:i.is}):(p=p.createElement(d),"select"===d&&(d=p,i.multiple?d.multiple=!0:i.size&&(d.size=i.size))):p=p.createElementNS(c,d),(i=p).__reactInternalInstance$=f,i.__reactEventHandlers$=u,ra(i,t,!1,!1),d=i;var h=s,m=ur(p=l,f=u);switch(p){case"iframe":case"object":wn("load",d),s=f;break;case"video":case"audio":for(s=0;s<J.length;s++)wn(J[s],d);s=f;break;case"source":wn("error",d),s=f;break;case"img":case"image":case"link":wn("error",d),wn("load",d),s=f;break;case"form":wn("reset",d),wn("submit",d),s=f;break;case"details":wn("toggle",d),s=f;break;case"input":yt(d,f),s=vt(d,f),wn("invalid",d),sr(h,"onChange");break;case"option":s=Kn(d,f);break;case"select":d._wrapperState={wasMultiple:!!f.multiple},s=o({},f,{value:void 0}),wn("invalid",d),sr(h,"onChange");break;case"textarea":$n(d,f),s=qn(d,f),wn("invalid",d),sr(h,"onChange");break;default:s=f}lr(p,s),c=void 0;var v=p,y=d,g=s;for(c in g)if(g.hasOwnProperty(c)){var E=g[c];"style"===c?ir(y,E):"dangerouslySetInnerHTML"===c?null!=(E=E?E.__html:void 0)&&er(y,E):"children"===c?"string"==typeof E?("textarea"!==v||""!==E)&&tr(y,E):"number"==typeof E&&tr(y,""+E):"suppressContentEditableWarning"!==c&&"suppressHydrationWarning"!==c&&"autoFocus"!==c&&(b.hasOwnProperty(c)?null!=E&&sr(h,c):null!=E&&ht(y,c,E,m))}switch(p){case"input":Ue(d),Et(d,f,!1);break;case"textarea":Ue(d),Qn(d);break;case"option":null!=f.value&&d.setAttribute("value",""+mt(f.value));break;case"select":(s=d).multiple=!!f.multiple,null!=(d=f.value)?Hn(s,!!f.multiple,d,!1):null!=f.defaultValue&&Hn(s,!!f.multiple,f.defaultValue,!0);break;default:"function"==typeof s.onClick&&(d.onclick=cr)}(u=dr(l,u))&&na(t),t.stateNode=i}null!==t.ref&&(t.effectTag|=128)}else null===t.stateNode&&a("166");break;case 6:i&&null!=t.stateNode?aa(i,t,i.memoizedProps,u):("string"!=typeof u&&(null===t.stateNode&&a("166")),i=go(yo.current),go(mo.current),mi(t)?(l=(u=t).stateNode,i=u.memoizedProps,l.__reactInternalInstance$=u,(u=l.nodeValue!==i)&&na(t)):(l=t,(u=(9===i.nodeType?i:i.ownerDocument).createTextNode(u)).__reactInternalInstance$=t,l.stateNode=u));break;case 11:break;case 13:if(u=t.memoizedState,0!=(64&t.effectTag)){t.expirationTime=l,Ca=t;break e}u=null!==u,l=null!==i&&null!==i.memoizedState,null!==i&&!u&&l&&(null!==(i=i.child.sibling)&&(null!==(s=t.firstEffect)?(t.firstEffect=i,i.nextEffect=s):(t.firstEffect=t.lastEffect=i,i.nextEffect=null),i.effectTag=8)),(u||l)&&(t.effectTag|=4);break;case 7:case 8:case 12:break;case 4:Eo(),oa(t);break;case 10:Mi(t);break;case 9:case 14:break;case 17:Fr(t.type)&&Dr();break;case 18:break;default:a("156")}Ca=null}if(t=e,1===Ta||1!==t.childExpirationTime){for(u=0,l=t.child;null!==l;)(i=l.expirationTime)>u&&(u=i),(s=l.childExpirationTime)>u&&(u=s),l=l.sibling;t.childExpirationTime=u}if(null!==Ca)return Ca;null!==n&&0==(1024&n.effectTag)&&(null===n.firstEffect&&(n.firstEffect=e.firstEffect),null!==e.lastEffect&&(null!==n.lastEffect&&(n.lastEffect.nextEffect=e.firstEffect),n.lastEffect=e.lastEffect),1<e.effectTag&&(null!==n.lastEffect?n.lastEffect.nextEffect=e:n.firstEffect=e,n.lastEffect=e))}else{if(null!==(e=ba(e)))return e.effectTag&=1023,e;null!==n&&(n.firstEffect=n.lastEffect=null,n.effectTag|=1024)}if(null!==r)return r;if(null===n)break;e=n}return null}function La(e){var t=Fi(e.alternate,e,Ta);return e.memoizedProps=e.pendingProps,null===t&&(t=Ba(e)),xa.current=null,t}function Wa(e,t){ka&&a("243"),Ua(),ka=!0;var n=Ea.current;Ea.current=ii;var r=e.nextExpirationTimeToWorkOn;r===Ta&&e===Sa&&null!==Ca||(Ra(),Ta=r,Ca=Wr((Sa=e).current,null),e.pendingCommitExpirationTime=0);for(var o=!1;;){try{if(t)for(;null!==Ca&&!wl();)Ca=La(Ca);else for(;null!==Ca;)Ca=La(Ca)}catch(t){if(Ii=Ni=Ai=null,Yo(),null===Ca)o=!0,Ol(t);else{null===Ca&&a("271");var i=Ca,l=i.return;if(null!==l){e:{var u=e,s=l,c=i,p=t;if(l=Ta,c.effectTag|=1024,c.firstEffect=c.lastEffect=null,null!==p&&"object"==typeof p&&"function"==typeof p.then){var f=p;p=s;var d=-1,h=-1;do{if(13===p.tag){var m=p.alternate;if(null!==m&&null!==(m=m.memoizedState)){h=10*(1073741822-m.timedOutAt);break}"number"==typeof(m=p.pendingProps.maxDuration)&&(0>=m?d=0:(-1===d||m<d)&&(d=m))}p=p.return}while(null!==p);p=s;do{if((m=13===p.tag)&&(m=void 0!==p.memoizedProps.fallback&&null===p.memoizedState),m){if(null===(s=p.updateQueue)?((s=new Set).add(f),p.updateQueue=s):s.add(f),0==(1&p.mode)){p.effectTag|=64,c.effectTag&=-1957,1===c.tag&&(null===c.alternate?c.tag=17:((l=qi(1073741823)).tag=Bi,Yi(c,l))),c.expirationTime=1073741823;break e}s=l;var v=(c=u).pingCache;null===v?(v=c.pingCache=new va,m=new Set,v.set(f,m)):void 0===(m=v.get(f))&&(m=new Set,v.set(f,m)),m.has(s)||(m.add(s),c=qa.bind(null,c,f,s),f.then(c,c)),-1===d?u=1073741823:(-1===h&&(h=10*(1073741822-Xr(u,l))-5e3),u=h+d),0<=u&&_a<u&&(_a=u),p.effectTag|=2048,p.expirationTime=l;break e}p=p.return}while(null!==p);p=Error((ot(c.type)||"A React component")+" suspended while rendering, but no fallback UI was specified.\n\nAdd a <Suspense fallback=...> component higher in the tree to provide a loading indicator or placeholder to display."+it(c))}Oa=!0,p=ta(p,c),u=s;do{switch(u.tag){case 3:u.effectTag|=2048,u.expirationTime=l,Qi(u,l=ya(u,p,l));break e;case 1:if(d=p,h=u.type,c=u.stateNode,0==(64&u.effectTag)&&("function"==typeof h.getDerivedStateFromError||null!==c&&"function"==typeof c.componentDidCatch&&(null===Ia||!Ia.has(c)))){u.effectTag|=2048,u.expirationTime=l,Qi(u,l=ga(u,d,l));break e}}u=u.return}while(null!==u)}Ca=Ba(i);continue}o=!0,Ol(t)}}break}if(ka=!1,Ea.current=n,Ii=Ni=Ai=null,Yo(),o)Sa=null,e.finishedWork=null;else if(null!==Ca)e.finishedWork=null;else{if(null===(n=e.current.alternate)&&a("281"),Sa=null,Oa){if(o=e.latestPendingTime,i=e.latestSuspendedTime,l=e.latestPingedTime,0!==o&&o<r||0!==i&&i<r||0!==l&&l<r)return Gr(e,r),void yl(e,n,r,e.expirationTime,-1);if(!e.didError&&t)return e.didError=!0,r=e.nextExpirationTimeToWorkOn=r,t=e.expirationTime=1073741823,void yl(e,n,r,t,-1)}t&&-1!==_a?(Gr(e,r),(t=10*(1073741822-Xr(e,r)))<_a&&(_a=t),t=10*(1073741822-gl()),t=_a-t,yl(e,n,r,e.expirationTime,0>t?0:t)):(e.pendingCommitExpirationTime=r,e.finishedWork=n)}}function Ka(e,t){for(var n=e.return;null!==n;){switch(n.tag){case 1:var r=n.stateNode;if("function"==typeof n.type.getDerivedStateFromError||"function"==typeof r.componentDidCatch&&(null===Ia||!Ia.has(r)))return Yi(n,e=ga(n,e=ta(t,e),1073741823)),void Ya(n,1073741823);break;case 3:return Yi(n,e=ya(n,e=ta(t,e),1073741823)),void Ya(n,1073741823)}n=n.return}3===e.tag&&(Yi(e,n=ya(e,n=ta(t,e),1073741823)),Ya(e,1073741823))}function Ha(e,t){var n=i.unstable_getCurrentPriorityLevel(),r=void 0;if(0==(1&t.mode))r=1073741823;else if(ka&&!Fa)r=Ta;else{switch(n){case i.unstable_ImmediatePriority:r=1073741823;break;case i.unstable_UserBlockingPriority:r=1073741822-10*(1+((1073741822-e+15)/10|0));break;case i.unstable_NormalPriority:r=1073741822-25*(1+((1073741822-e+500)/25|0));break;case i.unstable_LowPriority:case i.unstable_IdlePriority:r=1;break;default:a("313")}null!==Sa&&r===Ta&&--r}return n===i.unstable_UserBlockingPriority&&(0===rl||r<rl)&&(rl=r),r}function qa(e,t,n){var r=e.pingCache;null!==r&&r.delete(t),null!==Sa&&Ta===n?Sa=null:(t=e.earliestSuspendedTime,r=e.latestSuspendedTime,0!==t&&n<=t&&n>=r&&(e.didError=!1,(0===(t=e.latestPingedTime)||t>n)&&(e.latestPingedTime=n),Jr(n,e),0!==(n=e.expirationTime)&&bl(e,n)))}function $a(e,t){e.expirationTime<t&&(e.expirationTime=t);var n=e.alternate;null!==n&&n.expirationTime<t&&(n.expirationTime=t);var r=e.return,o=null;if(null===r&&3===e.tag)o=e.stateNode;else for(;null!==r;){if(n=r.alternate,r.childExpirationTime<t&&(r.childExpirationTime=t),null!==n&&n.childExpirationTime<t&&(n.childExpirationTime=t),null===r.return&&3===r.tag){o=r.stateNode;break}r=r.return}return o}function Ya(e,t){null!==(e=$a(e,t))&&(!ka&&0!==Ta&&t>Ta&&Ra(),Qr(e,t),ka&&!Fa&&Sa===e||bl(e,e.expirationTime),dl>fl&&(dl=0,a("185")))}function Qa(e,t,n,r,o){return i.unstable_runWithPriority(i.unstable_ImmediatePriority,function(){return e(t,n,r,o)})}var Ga=null,Xa=null,Ja=0,Za=void 0,el=!1,tl=null,nl=0,rl=0,ol=!1,il=null,al=!1,ll=!1,ul=null,sl=i.unstable_now(),cl=1073741822-(sl/10|0),pl=cl,fl=50,dl=0,hl=null;function ml(){cl=1073741822-((i.unstable_now()-sl)/10|0)}function vl(e,t){if(0!==Ja){if(t<Ja)return;null!==Za&&i.unstable_cancelCallback(Za)}Ja=t,e=i.unstable_now()-sl,Za=i.unstable_scheduleCallback(kl,{timeout:10*(1073741822-t)-e})}function yl(e,t,n,r,o){e.expirationTime=r,0!==o||wl()?0<o&&(e.timeoutHandle=mr(function(e,t,n){e.pendingCommitExpirationTime=n,e.finishedWork=t,ml(),pl=cl,Sl(e,n)}.bind(null,e,t,n),o)):(e.pendingCommitExpirationTime=n,e.finishedWork=t)}function gl(){return el?pl:(El(),0!==nl&&1!==nl||(ml(),pl=cl),pl)}function bl(e,t){null===e.nextScheduledRoot?(e.expirationTime=t,null===Xa?(Ga=Xa=e,e.nextScheduledRoot=e):(Xa=Xa.nextScheduledRoot=e).nextScheduledRoot=Ga):t>e.expirationTime&&(e.expirationTime=t),el||(al?ll&&(tl=e,nl=1073741823,Tl(e,1073741823,!1)):1073741823===t?Cl(1073741823,!1):vl(e,t))}function El(){var e=0,t=null;if(null!==Xa)for(var n=Xa,r=Ga;null!==r;){var o=r.expirationTime;if(0===o){if((null===n||null===Xa)&&a("244"),r===r.nextScheduledRoot){Ga=Xa=r.nextScheduledRoot=null;break}if(r===Ga)Ga=o=r.nextScheduledRoot,Xa.nextScheduledRoot=o,r.nextScheduledRoot=null;else{if(r===Xa){(Xa=n).nextScheduledRoot=Ga,r.nextScheduledRoot=null;break}n.nextScheduledRoot=r.nextScheduledRoot,r.nextScheduledRoot=null}r=n.nextScheduledRoot}else{if(o>e&&(e=o,t=r),r===Xa)break;if(1073741823===e)break;n=r,r=r.nextScheduledRoot}}tl=t,nl=e}var xl=!1;function wl(){return!!xl||!!i.unstable_shouldYield()&&(xl=!0)}function kl(){try{if(!wl()&&null!==Ga){ml();var e=Ga;do{var t=e.expirationTime;0!==t&&cl<=t&&(e.nextExpirationTimeToWorkOn=cl),e=e.nextScheduledRoot}while(e!==Ga)}Cl(0,!0)}finally{xl=!1}}function Cl(e,t){if(El(),t)for(ml(),pl=cl;null!==tl&&0!==nl&&e<=nl&&!(xl&&cl>nl);)Tl(tl,nl,cl>nl),El(),ml(),pl=cl;else for(;null!==tl&&0!==nl&&e<=nl;)Tl(tl,nl,!1),El();if(t&&(Ja=0,Za=null),0!==nl&&vl(tl,nl),dl=0,hl=null,null!==ul)for(e=ul,ul=null,t=0;t<e.length;t++){var n=e[t];try{n._onComplete()}catch(e){ol||(ol=!0,il=e)}}if(ol)throw e=il,il=null,ol=!1,e}function Sl(e,t){el&&a("253"),tl=e,nl=t,Tl(e,t,!1),Cl(1073741823,!1)}function Tl(e,t,n){if(el&&a("245"),el=!0,n){var r=e.finishedWork;null!==r?_l(e,r,t):(e.finishedWork=null,-1!==(r=e.timeoutHandle)&&(e.timeoutHandle=-1,vr(r)),Wa(e,n),null!==(r=e.finishedWork)&&(wl()?e.finishedWork=r:_l(e,r,t)))}else null!==(r=e.finishedWork)?_l(e,r,t):(e.finishedWork=null,-1!==(r=e.timeoutHandle)&&(e.timeoutHandle=-1,vr(r)),Wa(e,n),null!==(r=e.finishedWork)&&_l(e,r,t));el=!1}function _l(e,t,n){var r=e.firstBatch;if(null!==r&&r._expirationTime>=n&&(null===ul?ul=[r]:ul.push(r),r._defer))return e.finishedWork=t,void(e.expirationTime=0);e.finishedWork=null,e===hl?dl++:(hl=e,dl=0),i.unstable_runWithPriority(i.unstable_ImmediatePriority,function(){ja(e,t)})}function Ol(e){null===tl&&a("246"),tl.expirationTime=0,ol||(ol=!0,il=e)}function Pl(e,t){var n=al;al=!0;try{return e(t)}finally{(al=n)||el||Cl(1073741823,!1)}}function Fl(e,t){if(al&&!ll){ll=!0;try{return e(t)}finally{ll=!1}}return e(t)}function Dl(e,t,n){al||el||0===rl||(Cl(rl,!1),rl=0);var r=al;al=!0;try{return i.unstable_runWithPriority(i.unstable_UserBlockingPriority,function(){return e(t,n)})}finally{(al=r)||el||Cl(1073741823,!1)}}function Al(e,t,n,r,o){var i=t.current;e:if(n){t:{2===Jt(n=n._reactInternalFiber)&&1===n.tag||a("170");var l=n;do{switch(l.tag){case 3:l=l.stateNode.context;break t;case 1:if(Fr(l.type)){l=l.stateNode.__reactInternalMemoizedMergedChildContext;break t}}l=l.return}while(null!==l);a("171"),l=void 0}if(1===n.tag){var u=n.type;if(Fr(u)){n=Ir(n,u,l);break e}}n=l}else n=Sr;return null===t.context?t.context=n:t.pendingContext=n,t=o,(o=qi(r)).payload={element:e},null!==(t=void 0===t?null:t)&&(o.callback=t),Ua(),Yi(i,o),Ya(i,r),r}function Nl(e,t,n,r){var o=t.current;return Al(e,t,n,o=Ha(gl(),o),r)}function Il(e){if(!(e=e.current).child)return null;switch(e.child.tag){case 5:default:return e.child.stateNode}}function Rl(e){var t=1073741822-25*(1+((1073741822-gl()+500)/25|0));t>=wa&&(t=wa-1),this._expirationTime=wa=t,this._root=e,this._callbacks=this._next=null,this._hasChildren=this._didComplete=!1,this._children=null,this._defer=!0}function Ml(){this._callbacks=null,this._didCommit=!1,this._onCommit=this._onCommit.bind(this)}function zl(e,t,n){e={current:t=Br(3,null,null,t?3:0),containerInfo:e,pendingChildren:null,pingCache:null,earliestPendingTime:0,latestPendingTime:0,earliestSuspendedTime:0,latestSuspendedTime:0,latestPingedTime:0,didError:!1,pendingCommitExpirationTime:0,finishedWork:null,timeoutHandle:-1,context:null,pendingContext:null,hydrate:n,nextExpirationTimeToWorkOn:0,expirationTime:0,firstBatch:null,nextScheduledRoot:null},this._internalRoot=t.stateNode=e}function Vl(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType&&(8!==e.nodeType||" react-mount-point-unstable "!==e.nodeValue))}function Ul(e,t,n,r,o){var i=n._reactRootContainer;if(i){if("function"==typeof o){var a=o;o=function(){var e=Il(i._internalRoot);a.call(e)}}null!=e?i.legacy_renderSubtreeIntoContainer(e,t,o):i.render(t,o)}else{if(i=n._reactRootContainer=function(e,t){if(t||(t=!(!(t=e?9===e.nodeType?e.documentElement:e.firstChild:null)||1!==t.nodeType||!t.hasAttribute("data-reactroot"))),!t)for(var n;n=e.lastChild;)e.removeChild(n);return new zl(e,!1,t)}(n,r),"function"==typeof o){var l=o;o=function(){var e=Il(i._internalRoot);l.call(e)}}Fl(function(){null!=e?i.legacy_renderSubtreeIntoContainer(e,t,o):i.render(t,o)})}return Il(i._internalRoot)}function jl(e,t){var n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;return Vl(t)||a("200"),function(e,t,n){var r=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:He,key:null==r?null:""+r,children:e,containerInfo:t,implementation:n}}(e,t,null,n)}ke=function(e,t,n){switch(t){case"input":if(bt(e,n),t=n.name,"radio"===n.type&&null!=t){for(n=e;n.parentNode;)n=n.parentNode;for(n=n.querySelectorAll("input[name="+JSON.stringify(""+t)+'][type="radio"]'),t=0;t<n.length;t++){var r=n[t];if(r!==e&&r.form===e.form){var o=R(r);o||a("90"),je(r),bt(r,o)}}}break;case"textarea":Yn(e,n);break;case"select":null!=(t=n.value)&&Hn(e,!!n.multiple,t,!1)}},Rl.prototype.render=function(e){this._defer||a("250"),this._hasChildren=!0,this._children=e;var t=this._root._internalRoot,n=this._expirationTime,r=new Ml;return Al(e,t,null,n,r._onCommit),r},Rl.prototype.then=function(e){if(this._didComplete)e();else{var t=this._callbacks;null===t&&(t=this._callbacks=[]),t.push(e)}},Rl.prototype.commit=function(){var e=this._root._internalRoot,t=e.firstBatch;if(this._defer&&null!==t||a("251"),this._hasChildren){var n=this._expirationTime;if(t!==this){this._hasChildren&&(n=this._expirationTime=t._expirationTime,this.render(this._children));for(var r=null,o=t;o!==this;)r=o,o=o._next;null===r&&a("251"),r._next=o._next,this._next=t,e.firstBatch=this}this._defer=!1,Sl(e,n),t=this._next,this._next=null,null!==(t=e.firstBatch=t)&&t._hasChildren&&t.render(t._children)}else this._next=null,this._defer=!1},Rl.prototype._onComplete=function(){if(!this._didComplete){this._didComplete=!0;var e=this._callbacks;if(null!==e)for(var t=0;t<e.length;t++)(0,e[t])()}},Ml.prototype.then=function(e){if(this._didCommit)e();else{var t=this._callbacks;null===t&&(t=this._callbacks=[]),t.push(e)}},Ml.prototype._onCommit=function(){if(!this._didCommit){this._didCommit=!0;var e=this._callbacks;if(null!==e)for(var t=0;t<e.length;t++){var n=e[t];"function"!=typeof n&&a("191",n),n()}}},zl.prototype.render=function(e,t){var n=this._internalRoot,r=new Ml;return null!==(t=void 0===t?null:t)&&r.then(t),Nl(e,n,null,r._onCommit),r},zl.prototype.unmount=function(e){var t=this._internalRoot,n=new Ml;return null!==(e=void 0===e?null:e)&&n.then(e),Nl(null,t,null,n._onCommit),n},zl.prototype.legacy_renderSubtreeIntoContainer=function(e,t,n){var r=this._internalRoot,o=new Ml;return null!==(n=void 0===n?null:n)&&o.then(n),Nl(t,r,e,o._onCommit),o},zl.prototype.createBatch=function(){var e=new Rl(this),t=e._expirationTime,n=this._internalRoot,r=n.firstBatch;if(null===r)n.firstBatch=e,e._next=null;else{for(n=null;null!==r&&r._expirationTime>=t;)n=r,r=r._next;e._next=r,null!==n&&(n._next=e)}return e},Pe=Pl,Fe=Dl,De=function(){el||0===rl||(Cl(rl,!1),rl=0)};var Bl,Ll,Wl={createPortal:jl,findDOMNode:function(e){if(null==e)return null;if(1===e.nodeType)return e;var t=e._reactInternalFiber;return void 0===t&&("function"==typeof e.render?a("188"):a("268",Object.keys(e))),e=null===(e=en(t))?null:e.stateNode},hydrate:function(e,t,n){return Vl(t)||a("200"),Ul(null,e,t,!0,n)},render:function(e,t,n){return Vl(t)||a("200"),Ul(null,e,t,!1,n)},unstable_renderSubtreeIntoContainer:function(e,t,n,r){return Vl(n)||a("200"),(null==e||void 0===e._reactInternalFiber)&&a("38"),Ul(e,t,n,!1,r)},unmountComponentAtNode:function(e){return Vl(e)||a("40"),!!e._reactRootContainer&&(Fl(function(){Ul(null,null,e,!1,function(){e._reactRootContainer=null})}),!0)},unstable_createPortal:function(){return jl.apply(void 0,arguments)},unstable_batchedUpdates:Pl,unstable_interactiveUpdates:Dl,flushSync:function(e,t){el&&a("187");var n=al;al=!0;try{return Qa(e,t)}finally{al=n,Cl(1073741823,!1)}},unstable_createRoot:function(e,t){return Vl(e)||a("299","unstable_createRoot"),new zl(e,!0,null!=t&&!0===t.hydrate)},unstable_flushControlled:function(e){var t=al;al=!0;try{Qa(e)}finally{(al=t)||el||Cl(1073741823,!1)}},__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:{Events:[N,I,R,P.injectEventPluginsByName,g,B,function(e){T(e,j)},_e,Oe,Sn,D]}};Ll=(Bl={findFiberByHostInstance:A,bundleType:0,version:"16.8.6",rendererPackageName:"react-dom"}).findFiberByHostInstance,function(e){if("undefined"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__)return!1;var t=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(t.isDisabled||!t.supportsFiber)return!0;try{var n=t.inject(e);zr=Ur(function(e){return t.onCommitFiberRoot(n,e)}),Vr=Ur(function(e){return t.onCommitFiberUnmount(n,e)})}catch(e){}}(o({},Bl,{overrideProps:null,currentDispatcherRef:Be.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return null===(e=en(e))?null:e.stateNode},findFiberByHostInstance:function(e){return Ll?Ll(e):null}}));var Kl={default:Wl},Hl=Kl&&Wl||Kl;e.exports=Hl.default||Hl},function(e,t,n){"use strict";e.exports=n(22)},function(e,t,n){"use strict"; +/** @license React v0.13.6 + * scheduler.production.min.js * - */ - - - -var ReactComponentTreeHook = __webpack_require__(6); - -var warning = __webpack_require__(1); - -var didWarnValueNull = false; - -function handleElement(debugID, element) { - if (element == null) { - return; - } - if (element.type !== 'input' && element.type !== 'textarea' && element.type !== 'select') { - return; - } - if (element.props != null && element.props.value === null && !didWarnValueNull) { - process.env.NODE_ENV !== 'production' ? warning(false, '`value` prop on `%s` should not be null. ' + 'Consider using the empty string to clear the component or `undefined` ' + 'for uncontrolled components.%s', element.type, ReactComponentTreeHook.getStackAddendumByID(debugID)) : void 0; - - didWarnValueNull = true; - } -} - -var ReactDOMNullInputValuePropHook = { - onBeforeMountComponent: function (debugID, element) { - handleElement(debugID, element); - }, - onBeforeUpdateComponent: function (debugID, element) { - handleElement(debugID, element); - } -}; - -module.exports = ReactDOMNullInputValuePropHook; - -/***/ }), -/* 192 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. + * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - * - */ - - - -var DOMProperty = __webpack_require__(12); -var ReactComponentTreeHook = __webpack_require__(6); - -var warning = __webpack_require__(1); - -var warnedProperties = {}; -var rARIA = new RegExp('^(aria)-[' + DOMProperty.ATTRIBUTE_NAME_CHAR + ']*$'); - -function validateProperty(tagName, name, debugID) { - if (warnedProperties.hasOwnProperty(name) && warnedProperties[name]) { - return true; - } - - if (rARIA.test(name)) { - var lowerCasedName = name.toLowerCase(); - var standardName = DOMProperty.getPossibleStandardName.hasOwnProperty(lowerCasedName) ? DOMProperty.getPossibleStandardName[lowerCasedName] : null; - - // If this is an aria-* attribute, but is not listed in the known DOM - // DOM properties, then it is an invalid aria-* attribute. - if (standardName == null) { - warnedProperties[name] = true; - return false; - } - // aria-* attributes should be lowercase; suggest the lowercase version. - if (name !== standardName) { - process.env.NODE_ENV !== 'production' ? warning(false, 'Unknown ARIA attribute %s. Did you mean %s?%s', name, standardName, ReactComponentTreeHook.getStackAddendumByID(debugID)) : void 0; - warnedProperties[name] = true; - return true; - } - } - - return true; -} - -function warnInvalidARIAProps(debugID, element) { - var invalidProps = []; - - for (var key in element.props) { - var isValid = validateProperty(element.type, key, debugID); - if (!isValid) { - invalidProps.push(key); - } - } - - var unknownPropString = invalidProps.map(function (prop) { - return '`' + prop + '`'; - }).join(', '); - - if (invalidProps.length === 1) { - process.env.NODE_ENV !== 'production' ? warning(false, 'Invalid aria prop %s on <%s> tag. ' + 'For details, see https://fb.me/invalid-aria-prop%s', unknownPropString, element.type, ReactComponentTreeHook.getStackAddendumByID(debugID)) : void 0; - } else if (invalidProps.length > 1) { - process.env.NODE_ENV !== 'production' ? warning(false, 'Invalid aria props %s on <%s> tag. ' + 'For details, see https://fb.me/invalid-aria-prop%s', unknownPropString, element.type, ReactComponentTreeHook.getStackAddendumByID(debugID)) : void 0; - } -} - -function handleElement(debugID, element) { - if (element == null || typeof element.type !== 'string') { - return; - } - if (element.type.indexOf('-') >= 0 || element.props.is) { - return; - } - - warnInvalidARIAProps(debugID, element); -} - -var ReactDOMInvalidARIAHook = { - onBeforeMountComponent: function (debugID, element) { - if (process.env.NODE_ENV !== 'production') { - handleElement(debugID, element); - } - }, - onBeforeUpdateComponent: function (debugID, element) { - if (process.env.NODE_ENV !== 'production') { - handleElement(debugID, element); - } - } -}; - -module.exports = ReactDOMInvalidARIAHook; - -/***/ }), -/* 193 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _react = __webpack_require__(19); - -var _react2 = _interopRequireDefault(_react); - -var _reactDom = __webpack_require__(34); - -var _reactDom2 = _interopRequireDefault(_reactDom); - -var _reactSelect = __webpack_require__(194); - -var _reactSelect2 = _interopRequireDefault(_reactSelect); - -var _electron = __webpack_require__(198); - -var _quotes_copy = __webpack_require__(199); - -var _quotes_copy2 = _interopRequireDefault(_quotes_copy); - -var _Progress = __webpack_require__(200); - -var _Progress2 = _interopRequireDefault(_Progress); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -const VIDEO_REF = 'video'; -const DOWNLOAD_OPTIONS = [{ value: 'deb', label: `Ubuntu (deb)` }, { value: 'tar.gz', label: `Linux (tar.gz)` }, { value: 'nope', label: `I'll figure it out` }]; -const RELEASE_CHANNEL = _electron.remote.getGlobal('releaseChannel'); -const LINUX_DOWNLOAD_URL_BASE = `https://discordapp.com/api/download/${RELEASE_CHANNEL}?platform=linux&format=`; - -const ipcRenderer = { - send: (event, ...args) => _electron.ipcRenderer.send(`DISCORD_${event}`, ...args), - on: (event, callback) => _electron.ipcRenderer.on(`DISCORD_${event}`, callback), - removeListener: (event, callback) => _electron.ipcRenderer.removeListener(`DISCORD_${event}`, callback) -}; - -const Splash = _react2.default.createClass({ - displayName: 'Splash', - - setInterval(interval, callback) { - this.clearInterval(); - - this._interval = window.setInterval(callback, interval); - }, - - clearInterval() { - if (this._interval) { - window.clearInterval(this._interval); - this._interval = null; - } - }, - - componentWillUnmount() { - this.clearInterval(); - }, - - getInitialState() { - return { - quote: _quotes_copy2.default[Math.floor(Math.random() * _quotes_copy2.default.length)], - videoLoaded: false, - status: 'checking-for-updates', - update: {}, - selectedDownload: 'deb' - }; - }, - - componentDidMount() { - _reactDom2.default.findDOMNode(this.refs[VIDEO_REF]).addEventListener('loadeddata', this.handleVideoLoaded); - this.setInterval(1000, this.updateCountdownSeconds); - ipcRenderer.on('SPLASH_UPDATE_STATE', (_e, state) => { - this.setState({ update: state }); - }); - ipcRenderer.on('SPLASH_SCREEN_QUOTE', (_e, quote) => { - this.setState({ quote }); - }); - ipcRenderer.send('SPLASH_SCREEN_READY'); - }, - - updateCountdownSeconds() { - if (this.state.update.seconds > 0) { - const newUpdateState = this.state.update; - newUpdateState.seconds -= 1; - this.setState({ update: newUpdateState }); - } - }, - - handleVideoLoaded() { - this.setState({ videoLoaded: true }); - }, - - handleDownloadChanged(selection) { - this.setState({ selectedDownload: selection.value }); - }, - - handleDownload() { - if (this.state.selectedDownload != 'nope') { - const url = LINUX_DOWNLOAD_URL_BASE + this.state.selectedDownload; - _electron.shell.openExternal(url, { activate: true }); - } - _electron.remote.app.quit(); - }, - - render() { - let statusText; - let progress = _react2.default.createElement( - 'div', - { className: 'progress-placeholder' }, - '\xA0' - ); - switch (this.state.update.status) { - case 'installing-updates': - statusText = _react2.default.createElement( - 'span', - null, - 'Installing Update ', - this.state.update.current, - ' of ', - this.state.update.total - ); - if (this.state.update.progress > 0) { - progress = _react2.default.createElement(_Progress2.default, { percent: this.state.update.progress }); - } - break; - case 'downloading-updates': - statusText = _react2.default.createElement( - 'span', - null, - 'Downloading Update ', - this.state.update.current, - ' of ', - this.state.update.total - ); - if (this.state.update.progress > 0) { - progress = _react2.default.createElement(_Progress2.default, { percent: this.state.update.progress }); - } - break; - case 'update-failure': - statusText = _react2.default.createElement( - 'span', - null, - 'Update Failed \u2014 Retrying in ', - this.state.update.seconds, - ' sec' - ); - break; - case 'launching': - statusText = _react2.default.createElement( - 'span', - null, - 'Starting' - ); - break; - case 'update-manually': - const buttonText = this.state.selectedDownload != 'nope' ? 'Download' : 'Okay'; - return _react2.default.createElement( - 'div', - { id: 'splash' }, - _react2.default.createElement( - 'div', - { className: 'splash-inner-dl' }, - _react2.default.createElement('div', { className: 'dice-image' }), - _react2.default.createElement( - 'div', - { className: 'dl-update-message' }, - 'Must be your lucky day, there\u2019s a new update!' - ), - _react2.default.createElement( - 'div', - { className: 'dl-select-frame' }, - _react2.default.createElement(_reactSelect2.default, { - value: this.state.selectedDownload, - autosize: false, - clearable: false, - searchable: false, - options: DOWNLOAD_OPTIONS, - disabled: false, - onChange: this.handleDownloadChanged - }), - _react2.default.createElement( - 'div', - { className: 'dl-button', onClick: this.handleDownload }, - buttonText - ) - ), - _react2.default.createElement( - 'div', - { className: 'dl-version-message' }, - 'Version ', - this.state.update.newVersion, - ' available' - ) - ) - ); - case 'checking-for-updates': - default: - statusText = _react2.default.createElement( - 'span', - null, - 'Checking For Updates' - ); - break; - } - - return _react2.default.createElement( - 'div', - { id: 'splash' }, - _react2.default.createElement( - 'div', - { className: 'splash-inner' }, - _react2.default.createElement( - 'video', - { - autoPlay: true, - width: 200, - height: 200, - loop: true, - ref: VIDEO_REF, - className: this.state.videoLoaded && 'loaded' || undefined }, - _react2.default.createElement('source', { src: '../videos/connecting.webm', type: 'video/webm' }) - ), - _react2.default.createElement( - 'span', - { className: 'quote' }, - this.state.quote - ), - statusText, - progress - ) - ); - } -}); - -exports.default = Splash; -module.exports = exports['default']; - -/***/ }), -/* 194 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Async", function() { return Async; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AsyncCreatable", function() { return AsyncCreatableSelect; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Creatable", function() { return CreatableSelect; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Value", function() { return Value; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Option", function() { return Option; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultMenuRenderer", function() { return menuRenderer; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultArrowRenderer", function() { return arrowRenderer; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultClearRenderer", function() { return clearRenderer; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultFilterOptions", function() { return filterOptions; }); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(19); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(84); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_react_dom__ = __webpack_require__(34); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_react_dom___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_react_dom__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_react_input_autosize__ = __webpack_require__(196); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_react_input_autosize___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_react_input_autosize__); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_classnames__ = __webpack_require__(197); -/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_classnames__); - - - - - - -function arrowRenderer(_ref) { - var onMouseDown = _ref.onMouseDown; - - return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement('span', { - className: 'Select-arrow', - onMouseDown: onMouseDown - }); -} - -arrowRenderer.propTypes = { - onMouseDown: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func -}; - -var map = [{ 'base': 'A', 'letters': /[\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F]/g }, { 'base': 'AA', 'letters': /[\uA732]/g }, { 'base': 'AE', 'letters': /[\u00C6\u01FC\u01E2]/g }, { 'base': 'AO', 'letters': /[\uA734]/g }, { 'base': 'AU', 'letters': /[\uA736]/g }, { 'base': 'AV', 'letters': /[\uA738\uA73A]/g }, { 'base': 'AY', 'letters': /[\uA73C]/g }, { 'base': 'B', 'letters': /[\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181]/g }, { 'base': 'C', 'letters': /[\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E]/g }, { 'base': 'D', 'letters': /[\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779]/g }, { 'base': 'DZ', 'letters': /[\u01F1\u01C4]/g }, { 'base': 'Dz', 'letters': /[\u01F2\u01C5]/g }, { 'base': 'E', 'letters': /[\u0045\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E]/g }, { 'base': 'F', 'letters': /[\u0046\u24BB\uFF26\u1E1E\u0191\uA77B]/g }, { 'base': 'G', 'letters': /[\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E]/g }, { 'base': 'H', 'letters': /[\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D]/g }, { 'base': 'I', 'letters': /[\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197]/g }, { 'base': 'J', 'letters': /[\u004A\u24BF\uFF2A\u0134\u0248]/g }, { 'base': 'K', 'letters': /[\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2]/g }, { 'base': 'L', 'letters': /[\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780]/g }, { 'base': 'LJ', 'letters': /[\u01C7]/g }, { 'base': 'Lj', 'letters': /[\u01C8]/g }, { 'base': 'M', 'letters': /[\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C]/g }, { 'base': 'N', 'letters': /[\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4]/g }, { 'base': 'NJ', 'letters': /[\u01CA]/g }, { 'base': 'Nj', 'letters': /[\u01CB]/g }, { 'base': 'O', 'letters': /[\u004F\u24C4\uFF2F\u00D2\u00D3\u00D4\u1ED2\u1ED0\u1ED6\u1ED4\u00D5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\u00D6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\u00D8\u01FE\u0186\u019F\uA74A\uA74C]/g }, { 'base': 'OI', 'letters': /[\u01A2]/g }, { 'base': 'OO', 'letters': /[\uA74E]/g }, { 'base': 'OU', 'letters': /[\u0222]/g }, { 'base': 'P', 'letters': /[\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754]/g }, { 'base': 'Q', 'letters': /[\u0051\u24C6\uFF31\uA756\uA758\u024A]/g }, { 'base': 'R', 'letters': /[\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782]/g }, { 'base': 'S', 'letters': /[\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784]/g }, { 'base': 'T', 'letters': /[\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786]/g }, { 'base': 'TZ', 'letters': /[\uA728]/g }, { 'base': 'U', 'letters': /[\u0055\u24CA\uFF35\u00D9\u00DA\u00DB\u0168\u1E78\u016A\u1E7A\u016C\u00DC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244]/g }, { 'base': 'V', 'letters': /[\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245]/g }, { 'base': 'VY', 'letters': /[\uA760]/g }, { 'base': 'W', 'letters': /[\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72]/g }, { 'base': 'X', 'letters': /[\u0058\u24CD\uFF38\u1E8A\u1E8C]/g }, { 'base': 'Y', 'letters': /[\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE]/g }, { 'base': 'Z', 'letters': /[\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762]/g }, { 'base': 'a', 'letters': /[\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250]/g }, { 'base': 'aa', 'letters': /[\uA733]/g }, { 'base': 'ae', 'letters': /[\u00E6\u01FD\u01E3]/g }, { 'base': 'ao', 'letters': /[\uA735]/g }, { 'base': 'au', 'letters': /[\uA737]/g }, { 'base': 'av', 'letters': /[\uA739\uA73B]/g }, { 'base': 'ay', 'letters': /[\uA73D]/g }, { 'base': 'b', 'letters': /[\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253]/g }, { 'base': 'c', 'letters': /[\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184]/g }, { 'base': 'd', 'letters': /[\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A]/g }, { 'base': 'dz', 'letters': /[\u01F3\u01C6]/g }, { 'base': 'e', 'letters': /[\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD]/g }, { 'base': 'f', 'letters': /[\u0066\u24D5\uFF46\u1E1F\u0192\uA77C]/g }, { 'base': 'g', 'letters': /[\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F]/g }, { 'base': 'h', 'letters': /[\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265]/g }, { 'base': 'hv', 'letters': /[\u0195]/g }, { 'base': 'i', 'letters': /[\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131]/g }, { 'base': 'j', 'letters': /[\u006A\u24D9\uFF4A\u0135\u01F0\u0249]/g }, { 'base': 'k', 'letters': /[\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3]/g }, { 'base': 'l', 'letters': /[\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747]/g }, { 'base': 'lj', 'letters': /[\u01C9]/g }, { 'base': 'm', 'letters': /[\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F]/g }, { 'base': 'n', 'letters': /[\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5]/g }, { 'base': 'nj', 'letters': /[\u01CC]/g }, { 'base': 'o', 'letters': /[\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275]/g }, { 'base': 'oi', 'letters': /[\u01A3]/g }, { 'base': 'ou', 'letters': /[\u0223]/g }, { 'base': 'oo', 'letters': /[\uA74F]/g }, { 'base': 'p', 'letters': /[\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755]/g }, { 'base': 'q', 'letters': /[\u0071\u24E0\uFF51\u024B\uA757\uA759]/g }, { 'base': 'r', 'letters': /[\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783]/g }, { 'base': 's', 'letters': /[\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B]/g }, { 'base': 't', 'letters': /[\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787]/g }, { 'base': 'tz', 'letters': /[\uA729]/g }, { 'base': 'u', 'letters': /[\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289]/g }, { 'base': 'v', 'letters': /[\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C]/g }, { 'base': 'vy', 'letters': /[\uA761]/g }, { 'base': 'w', 'letters': /[\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73]/g }, { 'base': 'x', 'letters': /[\u0078\u24E7\uFF58\u1E8B\u1E8D]/g }, { 'base': 'y', 'letters': /[\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF]/g }, { 'base': 'z', 'letters': /[\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763]/g }]; - -function stripDiacritics(str) { - for (var i = 0; i < map.length; i++) { - str = str.replace(map[i].letters, map[i].base); - } - return str; -} - -function trim(str) { - return str.replace(/^\s+|\s+$/g, ''); -} - -function filterOptions(options, filterValue, excludeOptions, props) { - var _this = this; - - if (props.ignoreAccents) { - filterValue = stripDiacritics(filterValue); - } - - if (props.ignoreCase) { - filterValue = filterValue.toLowerCase(); - } - - if (props.trimFilter) { - filterValue = trim(filterValue); - } - - if (excludeOptions) excludeOptions = excludeOptions.map(function (i) { - return i[props.valueKey]; - }); - - return options.filter(function (option) { - if (excludeOptions && excludeOptions.indexOf(option[props.valueKey]) > -1) return false; - if (props.filterOption) return props.filterOption.call(_this, option, filterValue); - if (!filterValue) return true; - var valueTest = String(option[props.valueKey]); - var labelTest = String(option[props.labelKey]); - - if (props.ignoreAccents) { - if (props.matchProp !== 'label') valueTest = stripDiacritics(valueTest); - if (props.matchProp !== 'value') labelTest = stripDiacritics(labelTest); - } - - if (props.ignoreCase) { - if (props.matchProp !== 'label') valueTest = valueTest.toLowerCase(); - if (props.matchProp !== 'value') labelTest = labelTest.toLowerCase(); - } - return props.matchPos === 'start' ? props.matchProp !== 'label' && valueTest.substr(0, filterValue.length) === filterValue || props.matchProp !== 'value' && labelTest.substr(0, filterValue.length) === filterValue : props.matchProp !== 'label' && valueTest.indexOf(filterValue) >= 0 || props.matchProp !== 'value' && labelTest.indexOf(filterValue) >= 0; - }); -} - -function menuRenderer(_ref) { - var focusedOption = _ref.focusedOption, - focusOption = _ref.focusOption, - inputValue = _ref.inputValue, - instancePrefix = _ref.instancePrefix, - labelKey = _ref.labelKey, - onFocus = _ref.onFocus, - onOptionRef = _ref.onOptionRef, - onSelect = _ref.onSelect, - optionClassName = _ref.optionClassName, - optionComponent = _ref.optionComponent, - optionRenderer = _ref.optionRenderer, - options = _ref.options, - removeValue = _ref.removeValue, - selectValue = _ref.selectValue, - valueArray = _ref.valueArray, - valueKey = _ref.valueKey; - - var Option = optionComponent; - - return options.map(function (option, i) { - var isSelected = valueArray && valueArray.some(function (x) { - return x[valueKey] == option[valueKey]; - }); - var isFocused = option === focusedOption; - var optionClass = __WEBPACK_IMPORTED_MODULE_4_classnames___default()(optionClassName, { - 'Select-option': true, - 'is-selected': isSelected, - 'is-focused': isFocused, - 'is-disabled': option.disabled - }); - - return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement( - Option, - { - className: optionClass, - focusOption: focusOption, - inputValue: inputValue, - instancePrefix: instancePrefix, - isDisabled: option.disabled, - isFocused: isFocused, - isSelected: isSelected, - key: 'option-' + i + '-' + option[valueKey], - onFocus: onFocus, - onSelect: onSelect, - option: option, - optionIndex: i, - ref: function ref(_ref2) { - onOptionRef(_ref2, isFocused); - }, - removeValue: removeValue, - selectValue: selectValue - }, - optionRenderer(option, i, inputValue) - ); - }); -} - -function clearRenderer() { - return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement('span', { - className: 'Select-clear', - dangerouslySetInnerHTML: { __html: '×' } - }); -} - -var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { - return typeof obj; -} : function (obj) { - return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; -}; - - - - - -var asyncGenerator = function () { - function AwaitValue(value) { - this.value = value; - } - - function AsyncGenerator(gen) { - var front, back; - - function send(key, arg) { - return new Promise(function (resolve, reject) { - var request = { - key: key, - arg: arg, - resolve: resolve, - reject: reject, - next: null - }; - - if (back) { - back = back.next = request; - } else { - front = back = request; - resume(key, arg); - } - }); - } - - function resume(key, arg) { - try { - var result = gen[key](arg); - var value = result.value; - - if (value instanceof AwaitValue) { - Promise.resolve(value.value).then(function (arg) { - resume("next", arg); - }, function (arg) { - resume("throw", arg); - }); - } else { - settle(result.done ? "return" : "normal", result.value); - } - } catch (err) { - settle("throw", err); - } - } - - function settle(type, value) { - switch (type) { - case "return": - front.resolve({ - value: value, - done: true - }); - break; - - case "throw": - front.reject(value); - break; - - default: - front.resolve({ - value: value, - done: false - }); - break; - } - - front = front.next; - - if (front) { - resume(front.key, front.arg); - } else { - back = null; - } - } - - this._invoke = send; - - if (typeof gen.return !== "function") { - this.return = undefined; - } - } - - if (typeof Symbol === "function" && Symbol.asyncIterator) { - AsyncGenerator.prototype[Symbol.asyncIterator] = function () { - return this; - }; - } - - AsyncGenerator.prototype.next = function (arg) { - return this._invoke("next", arg); - }; - - AsyncGenerator.prototype.throw = function (arg) { - return this._invoke("throw", arg); - }; - - AsyncGenerator.prototype.return = function (arg) { - return this._invoke("return", arg); - }; - - return { - wrap: function (fn) { - return function () { - return new AsyncGenerator(fn.apply(this, arguments)); - }; - }, - await: function (value) { - return new AwaitValue(value); - } - }; -}(); - - - - - -var classCallCheck = function (instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -}; - -var createClass = function () { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } - } - - return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps); - if (staticProps) defineProperties(Constructor, staticProps); - return Constructor; - }; -}(); - - - - - -var defineProperty = function (obj, key, value) { - if (key in obj) { - Object.defineProperty(obj, key, { - value: value, - enumerable: true, - configurable: true, - writable: true - }); - } else { - obj[key] = value; - } - - return obj; -}; - -var _extends = Object.assign || function (target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - - for (var key in source) { - if (Object.prototype.hasOwnProperty.call(source, key)) { - target[key] = source[key]; - } - } - } - - return target; -}; - - - -var inherits = function (subClass, superClass) { - if (typeof superClass !== "function" && superClass !== null) { - throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); - } - - subClass.prototype = Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - enumerable: false, - writable: true, - configurable: true - } - }); - if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; -}; - - - - - - - - - -var objectWithoutProperties = function (obj, keys) { - var target = {}; - - for (var i in obj) { - if (keys.indexOf(i) >= 0) continue; - if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; - target[i] = obj[i]; - } - - return target; -}; - -var possibleConstructorReturn = function (self, call) { - if (!self) { - throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - } - - return call && (typeof call === "object" || typeof call === "function") ? call : self; -}; - -var Option = function (_React$Component) { - inherits(Option, _React$Component); - - function Option(props) { - classCallCheck(this, Option); - - var _this = possibleConstructorReturn(this, (Option.__proto__ || Object.getPrototypeOf(Option)).call(this, props)); - - _this.handleMouseDown = _this.handleMouseDown.bind(_this); - _this.handleMouseEnter = _this.handleMouseEnter.bind(_this); - _this.handleMouseMove = _this.handleMouseMove.bind(_this); - _this.handleTouchStart = _this.handleTouchStart.bind(_this); - _this.handleTouchEnd = _this.handleTouchEnd.bind(_this); - _this.handleTouchMove = _this.handleTouchMove.bind(_this); - _this.onFocus = _this.onFocus.bind(_this); - return _this; - } - - createClass(Option, [{ - key: 'blockEvent', - value: function blockEvent(event) { - event.preventDefault(); - event.stopPropagation(); - if (event.target.tagName !== 'A' || !('href' in event.target)) { - return; - } - if (event.target.target) { - window.open(event.target.href, event.target.target); - } else { - window.location.href = event.target.href; - } - } - }, { - key: 'handleMouseDown', - value: function handleMouseDown(event) { - event.preventDefault(); - event.stopPropagation(); - this.props.onSelect(this.props.option, event); - } - }, { - key: 'handleMouseEnter', - value: function handleMouseEnter(event) { - this.onFocus(event); - } - }, { - key: 'handleMouseMove', - value: function handleMouseMove(event) { - this.onFocus(event); - } - }, { - key: 'handleTouchEnd', - value: function handleTouchEnd(event) { - // Check if the view is being dragged, In this case - // we don't want to fire the click event (because the user only wants to scroll) - if (this.dragging) return; - - this.handleMouseDown(event); - } - }, { - key: 'handleTouchMove', - value: function handleTouchMove(event) { - // Set a flag that the view is being dragged - this.dragging = true; - } - }, { - key: 'handleTouchStart', - value: function handleTouchStart(event) { - // Set a flag that the view is not being dragged - this.dragging = false; - } - }, { - key: 'onFocus', - value: function onFocus(event) { - if (!this.props.isFocused) { - this.props.onFocus(this.props.option, event); - } - } - }, { - key: 'render', - value: function render() { - var _props = this.props, - option = _props.option, - instancePrefix = _props.instancePrefix, - optionIndex = _props.optionIndex; - - var className = __WEBPACK_IMPORTED_MODULE_4_classnames___default()(this.props.className, option.className); - - return option.disabled ? __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement( - 'div', - { className: className, - onMouseDown: this.blockEvent, - onClick: this.blockEvent }, - this.props.children - ) : __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement( - 'div', - { className: className, - style: option.style, - role: 'option', - 'aria-label': option.label, - onMouseDown: this.handleMouseDown, - onMouseEnter: this.handleMouseEnter, - onMouseMove: this.handleMouseMove, - onTouchStart: this.handleTouchStart, - onTouchMove: this.handleTouchMove, - onTouchEnd: this.handleTouchEnd, - id: instancePrefix + '-option-' + optionIndex, - title: option.title }, - this.props.children - ); - } - }]); - return Option; -}(__WEBPACK_IMPORTED_MODULE_0_react___default.a.Component); - - - -Option.propTypes = { - children: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.node, - className: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, // className (based on mouse position) - instancePrefix: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string.isRequired, // unique prefix for the ids (used for aria) - isDisabled: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, // the option is disabled - isFocused: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, // the option is focused - isSelected: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, // the option is selected - onFocus: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, // method to handle mouseEnter on option element - onSelect: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, // method to handle click on option element - onUnfocus: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, // method to handle mouseLeave on option element - option: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object.isRequired, // object that is base for that option - optionIndex: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number // index of the option, used to generate unique ids for aria -}; - -var Value = function (_React$Component) { - inherits(Value, _React$Component); - - function Value(props) { - classCallCheck(this, Value); - - var _this = possibleConstructorReturn(this, (Value.__proto__ || Object.getPrototypeOf(Value)).call(this, props)); - - _this.handleMouseDown = _this.handleMouseDown.bind(_this); - _this.onRemove = _this.onRemove.bind(_this); - _this.handleTouchEndRemove = _this.handleTouchEndRemove.bind(_this); - _this.handleTouchMove = _this.handleTouchMove.bind(_this); - _this.handleTouchStart = _this.handleTouchStart.bind(_this); - return _this; - } - - createClass(Value, [{ - key: 'handleMouseDown', - value: function handleMouseDown(event) { - if (event.type === 'mousedown' && event.button !== 0) { - return; - } - if (this.props.onClick) { - event.stopPropagation(); - this.props.onClick(this.props.value, event); - return; - } - if (this.props.value.href) { - event.stopPropagation(); - } - } - }, { - key: 'onRemove', - value: function onRemove(event) { - event.preventDefault(); - event.stopPropagation(); - this.props.onRemove(this.props.value); - } - }, { - key: 'handleTouchEndRemove', - value: function handleTouchEndRemove(event) { - // Check if the view is being dragged, In this case - // we don't want to fire the click event (because the user only wants to scroll) - if (this.dragging) return; - - // Fire the mouse events - this.onRemove(event); - } - }, { - key: 'handleTouchMove', - value: function handleTouchMove(event) { - // Set a flag that the view is being dragged - this.dragging = true; - } - }, { - key: 'handleTouchStart', - value: function handleTouchStart(event) { - // Set a flag that the view is not being dragged - this.dragging = false; - } - }, { - key: 'renderRemoveIcon', - value: function renderRemoveIcon() { - if (this.props.disabled || !this.props.onRemove) return; - return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement( - 'span', - { className: 'Select-value-icon', - 'aria-hidden': 'true', - onMouseDown: this.onRemove, - onTouchEnd: this.handleTouchEndRemove, - onTouchStart: this.handleTouchStart, - onTouchMove: this.handleTouchMove }, - '\xD7' - ); - } - }, { - key: 'renderLabel', - value: function renderLabel() { - var className = 'Select-value-label'; - return this.props.onClick || this.props.value.href ? __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement( - 'a', - { className: className, href: this.props.value.href, target: this.props.value.target, onMouseDown: this.handleMouseDown, onTouchEnd: this.handleMouseDown }, - this.props.children - ) : __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement( - 'span', - { className: className, role: 'option', 'aria-selected': 'true', id: this.props.id }, - this.props.children - ); - } - }, { - key: 'render', - value: function render() { - return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement( - 'div', - { className: __WEBPACK_IMPORTED_MODULE_4_classnames___default()('Select-value', this.props.value.className), - style: this.props.value.style, - title: this.props.value.title - }, - this.renderRemoveIcon(), - this.renderLabel() - ); - } - }]); - return Value; -}(__WEBPACK_IMPORTED_MODULE_0_react___default.a.Component); - - - -Value.propTypes = { - children: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.node, - disabled: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, // disabled prop passed to ReactSelect - id: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, // Unique id for the value - used for aria - onClick: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, // method to handle click on value label - onRemove: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, // method to handle removal of the value - value: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object.isRequired // the option object for this value -}; - + */Object.defineProperty(t,"__esModule",{value:!0});var r=null,o=!1,i=3,a=-1,l=-1,u=!1,s=!1;function c(){if(!u){var e=r.expirationTime;s?C():s=!0,k(d,e)}}function p(){var e=r,t=r.next;if(r===t)r=null;else{var n=r.previous;r=n.next=t,t.previous=n}e.next=e.previous=null,n=e.callback,t=e.expirationTime,e=e.priorityLevel;var o=i,a=l;i=e,l=t;try{var u=n()}finally{i=o,l=a}if("function"==typeof u)if(u={callback:u,priorityLevel:e,expirationTime:t,next:null,previous:null},null===r)r=u.next=u.previous=u;else{n=null,e=r;do{if(e.expirationTime>=t){n=e;break}e=e.next}while(e!==r);null===n?n=r:n===r&&(r=u,c()),(t=n.previous).next=n.previous=u,u.next=n,u.previous=t}}function f(){if(-1===a&&null!==r&&1===r.priorityLevel){u=!0;try{do{p()}while(null!==r&&1===r.priorityLevel)}finally{u=!1,null!==r?c():s=!1}}}function d(e){u=!0;var n=o;o=e;try{if(e)for(;null!==r;){var i=t.unstable_now();if(!(r.expirationTime<=i))break;do{p()}while(null!==r&&r.expirationTime<=i)}else if(null!==r)do{p()}while(null!==r&&!S())}finally{u=!1,o=n,null!==r?c():s=!1,f()}}var h,m,v=Date,y="function"==typeof setTimeout?setTimeout:void 0,g="function"==typeof clearTimeout?clearTimeout:void 0,b="function"==typeof requestAnimationFrame?requestAnimationFrame:void 0,E="function"==typeof cancelAnimationFrame?cancelAnimationFrame:void 0;function x(e){h=b(function(t){g(m),e(t)}),m=y(function(){E(h),e(t.unstable_now())},100)}if("object"==typeof performance&&"function"==typeof performance.now){var w=performance;t.unstable_now=function(){return w.now()}}else t.unstable_now=function(){return v.now()};var k,C,S,T=null;if("undefined"!=typeof window?T=window:"undefined"!=typeof global&&(T=global),T&&T._schedMock){var _=T._schedMock;k=_[0],C=_[1],S=_[2],t.unstable_now=_[3]}else if("undefined"==typeof window||"function"!=typeof MessageChannel){var O=null,P=function(e){if(null!==O)try{O(e)}finally{O=null}};k=function(e){null!==O?setTimeout(k,0,e):(O=e,setTimeout(P,0,!1))},C=function(){O=null},S=function(){return!1}}else{"undefined"!=typeof console&&("function"!=typeof b&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills"),"function"!=typeof E&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills"));var F=null,D=!1,A=-1,N=!1,I=!1,R=0,M=33,z=33;S=function(){return R<=t.unstable_now()};var V=new MessageChannel,U=V.port2;V.port1.onmessage=function(){D=!1;var e=F,n=A;F=null,A=-1;var r=t.unstable_now(),o=!1;if(0>=R-r){if(!(-1!==n&&n<=r))return N||(N=!0,x(j)),F=e,void(A=n);o=!0}if(null!==e){I=!0;try{e(o)}finally{I=!1}}};var j=function(e){if(null!==F){x(j);var t=e-R+z;t<z&&M<z?(8>t&&(t=8),z=t<M?M:t):M=t,R=e+z,D||(D=!0,U.postMessage(void 0))}else N=!1};k=function(e,t){F=e,A=t,I||0>t?U.postMessage(void 0):N||(N=!0,x(j))},C=function(){F=null,D=!1,A=-1}}t.unstable_ImmediatePriority=1,t.unstable_UserBlockingPriority=2,t.unstable_NormalPriority=3,t.unstable_IdlePriority=5,t.unstable_LowPriority=4,t.unstable_runWithPriority=function(e,n){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var r=i,o=a;i=e,a=t.unstable_now();try{return n()}finally{i=r,a=o,f()}},t.unstable_next=function(e){switch(i){case 1:case 2:case 3:var n=3;break;default:n=i}var r=i,o=a;i=n,a=t.unstable_now();try{return e()}finally{i=r,a=o,f()}},t.unstable_scheduleCallback=function(e,n){var o=-1!==a?a:t.unstable_now();if("object"==typeof n&&null!==n&&"number"==typeof n.timeout)n=o+n.timeout;else switch(i){case 1:n=o+-1;break;case 2:n=o+250;break;case 5:n=o+1073741823;break;case 4:n=o+1e4;break;default:n=o+5e3}if(e={callback:e,priorityLevel:i,expirationTime:n,next:null,previous:null},null===r)r=e.next=e.previous=e,c();else{o=null;var l=r;do{if(l.expirationTime>n){o=l;break}l=l.next}while(l!==r);null===o?o=r:o===r&&(r=e,c()),(n=o.previous).next=o.previous=e,e.next=o,e.previous=n}return e},t.unstable_cancelCallback=function(e){var t=e.next;if(null!==t){if(t===e)r=null;else{e===r&&(r=t);var n=e.previous;n.next=t,t.previous=n}e.next=e.previous=null}},t.unstable_wrapCallback=function(e){var n=i;return function(){var r=i,o=a;i=n,a=t.unstable_now();try{return e.apply(this,arguments)}finally{i=r,a=o,f()}}},t.unstable_getCurrentPriorityLevel=function(){return i},t.unstable_shouldYield=function(){return!o&&(null!==r&&r.expirationTime<l||S())},t.unstable_continueExecution=function(){null!==r&&c()},t.unstable_pauseExecution=function(){},t.unstable_getFirstCallbackNode=function(){return r}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=c(n(1)),o=c(n(3)),i=c(n(24)),a=c(n(27)),l=n(33),u=c(n(34)),s=c(n(35));function c(e){return e&&e.__esModule?e:{default:e}}const p=[{value:"deb",label:"Ubuntu (deb)"},{value:"tar.gz",label:"Linux (tar.gz)"},{value:"nope",label:"I'll figure it out"}],f=`https://discordapp.com/api/download/${l.remote.getGlobal("releaseChannel")}?platform=linux&format=`,d=(e,...t)=>l.ipcRenderer.send(`DISCORD_${e}`,...t),h=(e,t)=>l.ipcRenderer.on(`DISCORD_${e}`,t),m=(0,i.default)({displayName:"Splash",setInterval(e,t){this.clearInterval(),this._interval=window.setInterval(t,e)},clearInterval(){this._interval&&(window.clearInterval(this._interval),this._interval=null)},componentWillUnmount(){this.clearInterval()},getInitialState:()=>({quote:u.default[Math.floor(Math.random()*u.default.length)],videoLoaded:!1,status:"checking-for-updates",update:{},selectedDownload:"deb"}),componentDidMount(){o.default.findDOMNode(this.refs.video).addEventListener("loadeddata",this.handleVideoLoaded),this.setInterval(1e3,this.updateCountdownSeconds),h("SPLASH_UPDATE_STATE",(e,t)=>{this.setState({update:t})}),h("SPLASH_SCREEN_QUOTE",(e,t)=>{this.setState({quote:t})}),d("SPLASH_SCREEN_READY")},updateCountdownSeconds(){if(this.state.update.seconds>0){const e=this.state.update;e.seconds-=1,this.setState({update:e})}},handleVideoLoaded(){this.setState({videoLoaded:!0})},handleDownloadChanged(e){this.setState({selectedDownload:e.value})},handleDownload(){if("nope"!=this.state.selectedDownload){const e=f+this.state.selectedDownload;l.shell.openExternal(e,{activate:!0})}l.remote.app.quit()},render(){let e,t=r.default.createElement("div",{className:"progress-placeholder"}," ");switch(this.state.update.status){case"installing-updates":e=r.default.createElement("span",null,"Installing Update ",this.state.update.current," of ",this.state.update.total),this.state.update.progress>0&&(t=r.default.createElement(s.default,{percent:this.state.update.progress}));break;case"downloading-updates":e=r.default.createElement("span",null,"Downloading Update ",this.state.update.current," of ",this.state.update.total),this.state.update.progress>0&&(t=r.default.createElement(s.default,{percent:this.state.update.progress}));break;case"update-failure":e=r.default.createElement("span",null,"Update Failed — Retrying in ",this.state.update.seconds," sec");break;case"launching":e=r.default.createElement("span",null,"Starting");break;case"update-manually":const n="nope"!=this.state.selectedDownload?"Download":"Okay";return r.default.createElement("div",{id:"splash"},r.default.createElement("div",{className:"splash-inner-dl"},r.default.createElement("div",{className:"dice-image"}),r.default.createElement("div",{className:"dl-update-message"},"Must be your lucky day, there’s a new update!"),r.default.createElement("div",{className:"dl-select-frame"},r.default.createElement(a.default,{value:this.state.selectedDownload,autosize:!1,clearable:!1,searchable:!1,options:p,disabled:!1,onChange:this.handleDownloadChanged}),r.default.createElement("div",{className:"dl-button",onClick:this.handleDownload},n)),r.default.createElement("div",{className:"dl-version-message"},"Version ",this.state.update.newVersion," available")));case"checking-for-updates":default:e=r.default.createElement("span",null,"Checking For Updates")}return r.default.createElement("div",{id:"splash"},r.default.createElement("div",{className:"splash-inner"},r.default.createElement("video",{autoPlay:!0,width:200,height:200,loop:!0,ref:"video",className:this.state.videoLoaded?"loaded":void 0},r.default.createElement("source",{src:"../videos/connecting.webm",type:"video/webm"})),r.default.createElement("span",{className:"quote"},this.state.quote),e,t))}});t.default=m,e.exports=t.default},function(e,t,n){"use strict";var r=n(1),o=n(25);if(void 0===r)throw Error("create-react-class could not find the React object. If you are using script tags, make sure that React is being loaded before create-react-class.");var i=(new r.Component).updater;e.exports=o(r.Component,r.isValidElement,i)},function(e,t,n){"use strict";var r=n(4),o=n(26),i=n(5),a="mixins";e.exports=function(e,t,n){var l=[],u={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",UNSAFE_componentWillMount:"DEFINE_MANY",UNSAFE_componentWillReceiveProps:"DEFINE_MANY",UNSAFE_componentWillUpdate:"DEFINE_MANY",updateComponent:"OVERRIDE_BASE"},s={getDerivedStateFromProps:"DEFINE_MANY_MERGED"},c={displayName:function(e,t){e.displayName=t},mixins:function(e,t){if(t)for(var n=0;n<t.length;n++)f(e,t[n])},childContextTypes:function(e,t){e.childContextTypes=r({},e.childContextTypes,t)},contextTypes:function(e,t){e.contextTypes=r({},e.contextTypes,t)},getDefaultProps:function(e,t){e.getDefaultProps?e.getDefaultProps=h(e.getDefaultProps,t):e.getDefaultProps=t},propTypes:function(e,t){e.propTypes=r({},e.propTypes,t)},statics:function(e,t){!function(e,t){if(t)for(var n in t){var r=t[n];if(t.hasOwnProperty(n)){var o=n in c;i(!o,'ReactClass: You are attempting to define a reserved property, `%s`, that shouldn\'t be on the "statics" key. Define it as an instance property instead; it will still be accessible on the constructor.',n);var a=n in e;if(a){var l=s.hasOwnProperty(n)?s[n]:null;return i("DEFINE_MANY_MERGED"===l,"ReactClass: You are attempting to define `%s` on your component more than once. This conflict may be due to a mixin.",n),void(e[n]=h(e[n],r))}e[n]=r}}}(e,t)},autobind:function(){}};function p(e,t){var n=u.hasOwnProperty(t)?u[t]:null;b.hasOwnProperty(t)&&i("OVERRIDE_BASE"===n,"ReactClassInterface: You are attempting to override `%s` from your class specification. Ensure that your method names do not overlap with React methods.",t),e&&i("DEFINE_MANY"===n||"DEFINE_MANY_MERGED"===n,"ReactClassInterface: You are attempting to define `%s` on your component more than once. This conflict may be due to a mixin.",t)}function f(e,n){if(n){i("function"!=typeof n,"ReactClass: You're attempting to use a component class or function as a mixin. Instead, just use a regular object."),i(!t(n),"ReactClass: You're attempting to use a component as a mixin. Instead, just use a regular object.");var r=e.prototype,o=r.__reactAutoBindPairs;for(var l in n.hasOwnProperty(a)&&c.mixins(e,n.mixins),n)if(n.hasOwnProperty(l)&&l!==a){var s=n[l],f=r.hasOwnProperty(l);if(p(f,l),c.hasOwnProperty(l))c[l](e,s);else{var d=u.hasOwnProperty(l);if("function"!=typeof s||d||f||!1===n.autobind)if(f){var v=u[l];i(d&&("DEFINE_MANY_MERGED"===v||"DEFINE_MANY"===v),"ReactClass: Unexpected spec policy %s for key %s when mixing in component specs.",v,l),"DEFINE_MANY_MERGED"===v?r[l]=h(r[l],s):"DEFINE_MANY"===v&&(r[l]=m(r[l],s))}else r[l]=s;else o.push(l,s),r[l]=s}}}}function d(e,t){for(var n in i(e&&t&&"object"==typeof e&&"object"==typeof t,"mergeIntoWithNoDuplicateKeys(): Cannot merge non-objects."),t)t.hasOwnProperty(n)&&(i(void 0===e[n],"mergeIntoWithNoDuplicateKeys(): Tried to merge two objects with the same key: `%s`. This conflict may be due to a mixin; in particular, this may be caused by two getInitialState() or getDefaultProps() methods returning objects with clashing keys.",n),e[n]=t[n]);return e}function h(e,t){return function(){var n=e.apply(this,arguments),r=t.apply(this,arguments);if(null==n)return r;if(null==r)return n;var o={};return d(o,n),d(o,r),o}}function m(e,t){return function(){e.apply(this,arguments),t.apply(this,arguments)}}function v(e,t){return t.bind(e)}var y={componentDidMount:function(){this.__isMounted=!0}},g={componentWillUnmount:function(){this.__isMounted=!1}},b={replaceState:function(e,t){this.updater.enqueueReplaceState(this,e,t)},isMounted:function(){return!!this.__isMounted}},E=function(){};return r(E.prototype,e.prototype,b),function(e){var t=function(e,r,a){this.__reactAutoBindPairs.length&&function(e){for(var t=e.__reactAutoBindPairs,n=0;n<t.length;n+=2){var r=t[n],o=t[n+1];e[r]=v(e,o)}}(this),this.props=e,this.context=r,this.refs=o,this.updater=a||n,this.state=null;var l=this.getInitialState?this.getInitialState():null;i("object"==typeof l&&!Array.isArray(l),"%s.getInitialState(): must return an object or null",t.displayName||"ReactCompositeComponent"),this.state=l};for(var r in t.prototype=new E,t.prototype.constructor=t,t.prototype.__reactAutoBindPairs=[],l.forEach(f.bind(null,t)),f(t,y),f(t,e),f(t,g),t.getDefaultProps&&(t.defaultProps=t.getDefaultProps()),i(t.prototype.render,"createClass(...): Class specification must implement a `render` method."),u)t.prototype[r]||(t.prototype[r]=null);return t}}},function(e,t,n){"use strict";e.exports={}},function(e,t,n){"use strict";n.r(t),n.d(t,"Async",function(){return M}),n.d(t,"AsyncCreatable",function(){return K}),n.d(t,"Creatable",function(){return z}),n.d(t,"Value",function(){return _}),n.d(t,"Option",function(){return T}),n.d(t,"defaultMenuRenderer",function(){return v}),n.d(t,"defaultArrowRenderer",function(){return f}),n.d(t,"defaultClearRenderer",function(){return y}),n.d(t,"defaultFilterOptions",function(){return m});var r=n(1),o=n.n(r),i=n(0),a=n.n(i),l=n(3),u=n(8),s=n.n(u),c=n(2),p=n.n(c);function f(e){var t=e.onMouseDown;return o.a.createElement("span",{className:"Select-arrow",onMouseDown:t})}f.propTypes={onMouseDown:a.a.func};var d=[{base:"A",letters:/[\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F]/g},{base:"AA",letters:/[\uA732]/g},{base:"AE",letters:/[\u00C6\u01FC\u01E2]/g},{base:"AO",letters:/[\uA734]/g},{base:"AU",letters:/[\uA736]/g},{base:"AV",letters:/[\uA738\uA73A]/g},{base:"AY",letters:/[\uA73C]/g},{base:"B",letters:/[\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181]/g},{base:"C",letters:/[\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E]/g},{base:"D",letters:/[\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779]/g},{base:"DZ",letters:/[\u01F1\u01C4]/g},{base:"Dz",letters:/[\u01F2\u01C5]/g},{base:"E",letters:/[\u0045\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E]/g},{base:"F",letters:/[\u0046\u24BB\uFF26\u1E1E\u0191\uA77B]/g},{base:"G",letters:/[\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E]/g},{base:"H",letters:/[\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D]/g},{base:"I",letters:/[\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197]/g},{base:"J",letters:/[\u004A\u24BF\uFF2A\u0134\u0248]/g},{base:"K",letters:/[\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2]/g},{base:"L",letters:/[\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780]/g},{base:"LJ",letters:/[\u01C7]/g},{base:"Lj",letters:/[\u01C8]/g},{base:"M",letters:/[\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C]/g},{base:"N",letters:/[\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4]/g},{base:"NJ",letters:/[\u01CA]/g},{base:"Nj",letters:/[\u01CB]/g},{base:"O",letters:/[\u004F\u24C4\uFF2F\u00D2\u00D3\u00D4\u1ED2\u1ED0\u1ED6\u1ED4\u00D5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\u00D6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\u00D8\u01FE\u0186\u019F\uA74A\uA74C]/g},{base:"OI",letters:/[\u01A2]/g},{base:"OO",letters:/[\uA74E]/g},{base:"OU",letters:/[\u0222]/g},{base:"P",letters:/[\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754]/g},{base:"Q",letters:/[\u0051\u24C6\uFF31\uA756\uA758\u024A]/g},{base:"R",letters:/[\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782]/g},{base:"S",letters:/[\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784]/g},{base:"T",letters:/[\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786]/g},{base:"TZ",letters:/[\uA728]/g},{base:"U",letters:/[\u0055\u24CA\uFF35\u00D9\u00DA\u00DB\u0168\u1E78\u016A\u1E7A\u016C\u00DC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244]/g},{base:"V",letters:/[\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245]/g},{base:"VY",letters:/[\uA760]/g},{base:"W",letters:/[\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72]/g},{base:"X",letters:/[\u0058\u24CD\uFF38\u1E8A\u1E8C]/g},{base:"Y",letters:/[\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE]/g},{base:"Z",letters:/[\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762]/g},{base:"a",letters:/[\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250]/g},{base:"aa",letters:/[\uA733]/g},{base:"ae",letters:/[\u00E6\u01FD\u01E3]/g},{base:"ao",letters:/[\uA735]/g},{base:"au",letters:/[\uA737]/g},{base:"av",letters:/[\uA739\uA73B]/g},{base:"ay",letters:/[\uA73D]/g},{base:"b",letters:/[\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253]/g},{base:"c",letters:/[\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184]/g},{base:"d",letters:/[\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A]/g},{base:"dz",letters:/[\u01F3\u01C6]/g},{base:"e",letters:/[\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD]/g},{base:"f",letters:/[\u0066\u24D5\uFF46\u1E1F\u0192\uA77C]/g},{base:"g",letters:/[\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F]/g},{base:"h",letters:/[\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265]/g},{base:"hv",letters:/[\u0195]/g},{base:"i",letters:/[\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131]/g},{base:"j",letters:/[\u006A\u24D9\uFF4A\u0135\u01F0\u0249]/g},{base:"k",letters:/[\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3]/g},{base:"l",letters:/[\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747]/g},{base:"lj",letters:/[\u01C9]/g},{base:"m",letters:/[\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F]/g},{base:"n",letters:/[\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5]/g},{base:"nj",letters:/[\u01CC]/g},{base:"o",letters:/[\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275]/g},{base:"oi",letters:/[\u01A3]/g},{base:"ou",letters:/[\u0223]/g},{base:"oo",letters:/[\uA74F]/g},{base:"p",letters:/[\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755]/g},{base:"q",letters:/[\u0071\u24E0\uFF51\u024B\uA757\uA759]/g},{base:"r",letters:/[\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783]/g},{base:"s",letters:/[\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B]/g},{base:"t",letters:/[\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787]/g},{base:"tz",letters:/[\uA729]/g},{base:"u",letters:/[\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289]/g},{base:"v",letters:/[\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C]/g},{base:"vy",letters:/[\uA761]/g},{base:"w",letters:/[\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73]/g},{base:"x",letters:/[\u0078\u24E7\uFF58\u1E8B\u1E8D]/g},{base:"y",letters:/[\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF]/g},{base:"z",letters:/[\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763]/g}];function h(e){for(var t=0;t<d.length;t++)e=e.replace(d[t].letters,d[t].base);return e}function m(e,t,n,r){var o=this;return r.ignoreAccents&&(t=h(t)),r.ignoreCase&&(t=t.toLowerCase()),r.trimFilter&&(t=t.replace(/^\s+|\s+$/g,"")),n&&(n=n.map(function(e){return e[r.valueKey]})),e.filter(function(e){if(n&&n.indexOf(e[r.valueKey])>-1)return!1;if(r.filterOption)return r.filterOption.call(o,e,t);if(!t)return!0;var i=String(e[r.valueKey]),a=String(e[r.labelKey]);return r.ignoreAccents&&("label"!==r.matchProp&&(i=h(i)),"value"!==r.matchProp&&(a=h(a))),r.ignoreCase&&("label"!==r.matchProp&&(i=i.toLowerCase()),"value"!==r.matchProp&&(a=a.toLowerCase())),"start"===r.matchPos?"label"!==r.matchProp&&i.substr(0,t.length)===t||"value"!==r.matchProp&&a.substr(0,t.length)===t:"label"!==r.matchProp&&i.indexOf(t)>=0||"value"!==r.matchProp&&a.indexOf(t)>=0})}function v(e){var t=e.focusedOption,n=e.focusOption,r=e.inputValue,i=e.instancePrefix,a=(e.labelKey,e.onFocus),l=e.onOptionRef,u=e.onSelect,s=e.optionClassName,c=e.optionComponent,f=e.optionRenderer,d=e.options,h=e.removeValue,m=e.selectValue,v=e.valueArray,y=e.valueKey,g=c;return d.map(function(e,c){var d=v&&v.some(function(t){return t[y]==e[y]}),b=e===t,E=p()(s,{"Select-option":!0,"is-selected":d,"is-focused":b,"is-disabled":e.disabled});return o.a.createElement(g,{className:E,focusOption:n,inputValue:r,instancePrefix:i,isDisabled:e.disabled,isFocused:b,isSelected:d,key:"option-"+c+"-"+e[y],onFocus:a,onSelect:u,option:e,optionIndex:c,ref:function(e){l(e,b)},removeValue:h,selectValue:m},f(e,c,r))})}function y(){return o.a.createElement("span",{className:"Select-clear",dangerouslySetInnerHTML:{__html:"×"}})}var g="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},b=(function(){function e(e){this.value=e}function t(t){var n,r;function o(n,r){try{var a=t[n](r),l=a.value;l instanceof e?Promise.resolve(l.value).then(function(e){o("next",e)},function(e){o("throw",e)}):i(a.done?"return":"normal",a.value)}catch(e){i("throw",e)}}function i(e,t){switch(e){case"return":n.resolve({value:t,done:!0});break;case"throw":n.reject(t);break;default:n.resolve({value:t,done:!1})}(n=n.next)?o(n.key,n.arg):r=null}this._invoke=function(e,t){return new Promise(function(i,a){var l={key:e,arg:t,resolve:i,reject:a,next:null};r?r=r.next=l:(n=r=l,o(e,t))})},"function"!=typeof t.return&&(this.return=void 0)}"function"==typeof Symbol&&Symbol.asyncIterator&&(t.prototype[Symbol.asyncIterator]=function(){return this}),t.prototype.next=function(e){return this._invoke("next",e)},t.prototype.throw=function(e){return this._invoke("throw",e)},t.prototype.return=function(e){return this._invoke("return",e)}}(),function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}),E=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),x=function(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e},w=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},k=function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)},C=function(e,t){var n={};for(var r in e)t.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n},S=function(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t},T=function(e){function t(e){b(this,t);var n=S(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.handleMouseDown=n.handleMouseDown.bind(n),n.handleMouseEnter=n.handleMouseEnter.bind(n),n.handleMouseMove=n.handleMouseMove.bind(n),n.handleTouchStart=n.handleTouchStart.bind(n),n.handleTouchEnd=n.handleTouchEnd.bind(n),n.handleTouchMove=n.handleTouchMove.bind(n),n.onFocus=n.onFocus.bind(n),n}return k(t,e),E(t,[{key:"blockEvent",value:function(e){e.preventDefault(),e.stopPropagation(),"A"===e.target.tagName&&"href"in e.target&&(e.target.target?window.open(e.target.href,e.target.target):window.location.href=e.target.href)}},{key:"handleMouseDown",value:function(e){e.preventDefault(),e.stopPropagation(),this.props.onSelect(this.props.option,e)}},{key:"handleMouseEnter",value:function(e){this.onFocus(e)}},{key:"handleMouseMove",value:function(e){this.onFocus(e)}},{key:"handleTouchEnd",value:function(e){this.dragging||this.handleMouseDown(e)}},{key:"handleTouchMove",value:function(e){this.dragging=!0}},{key:"handleTouchStart",value:function(e){this.dragging=!1}},{key:"onFocus",value:function(e){this.props.isFocused||this.props.onFocus(this.props.option,e)}},{key:"render",value:function(){var e=this.props,t=e.option,n=e.instancePrefix,r=e.optionIndex,i=p()(this.props.className,t.className);return t.disabled?o.a.createElement("div",{className:i,onMouseDown:this.blockEvent,onClick:this.blockEvent},this.props.children):o.a.createElement("div",{className:i,style:t.style,role:"option","aria-label":t.label,onMouseDown:this.handleMouseDown,onMouseEnter:this.handleMouseEnter,onMouseMove:this.handleMouseMove,onTouchStart:this.handleTouchStart,onTouchMove:this.handleTouchMove,onTouchEnd:this.handleTouchEnd,id:n+"-option-"+r,title:t.title},this.props.children)}}]),t}(o.a.Component);T.propTypes={children:a.a.node,className:a.a.string,instancePrefix:a.a.string.isRequired,isDisabled:a.a.bool,isFocused:a.a.bool,isSelected:a.a.bool,onFocus:a.a.func,onSelect:a.a.func,onUnfocus:a.a.func,option:a.a.object.isRequired,optionIndex:a.a.number};var _=function(e){function t(e){b(this,t);var n=S(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return n.handleMouseDown=n.handleMouseDown.bind(n),n.onRemove=n.onRemove.bind(n),n.handleTouchEndRemove=n.handleTouchEndRemove.bind(n),n.handleTouchMove=n.handleTouchMove.bind(n),n.handleTouchStart=n.handleTouchStart.bind(n),n}return k(t,e),E(t,[{key:"handleMouseDown",value:function(e){if("mousedown"!==e.type||0===e.button)return this.props.onClick?(e.stopPropagation(),void this.props.onClick(this.props.value,e)):void(this.props.value.href&&e.stopPropagation())}},{key:"onRemove",value:function(e){e.preventDefault(),e.stopPropagation(),this.props.onRemove(this.props.value)}},{key:"handleTouchEndRemove",value:function(e){this.dragging||this.onRemove(e)}},{key:"handleTouchMove",value:function(e){this.dragging=!0}},{key:"handleTouchStart",value:function(e){this.dragging=!1}},{key:"renderRemoveIcon",value:function(){if(!this.props.disabled&&this.props.onRemove)return o.a.createElement("span",{className:"Select-value-icon","aria-hidden":"true",onMouseDown:this.onRemove,onTouchEnd:this.handleTouchEndRemove,onTouchStart:this.handleTouchStart,onTouchMove:this.handleTouchMove},"×")}},{key:"renderLabel",value:function(){return this.props.onClick||this.props.value.href?o.a.createElement("a",{className:"Select-value-label",href:this.props.value.href,target:this.props.value.target,onMouseDown:this.handleMouseDown,onTouchEnd:this.handleMouseDown},this.props.children):o.a.createElement("span",{className:"Select-value-label",role:"option","aria-selected":"true",id:this.props.id},this.props.children)}},{key:"render",value:function(){return o.a.createElement("div",{className:p()("Select-value",this.props.value.className),style:this.props.value.style,title:this.props.value.title},this.renderRemoveIcon(),this.renderLabel())}}]),t}(o.a.Component);_.propTypes={children:a.a.node,disabled:a.a.bool,id:a.a.string,onClick:a.a.func,onRemove:a.a.func,value:a.a.object.isRequired}; /*! Copyright (c) 2017 Jed Watson. Licensed under the MIT License (MIT), see http://jedwatson.github.io/react-select */ -var stringifyValue = function stringifyValue(value) { - return typeof value === 'string' ? value : value !== null && JSON.stringify(value) || ''; -}; - -var stringOrNode = __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([__WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.node]); -var stringOrNumber = __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([__WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number]); - -var instanceId = 1; - -var Select$1 = function (_React$Component) { - inherits(Select, _React$Component); - - function Select(props) { - classCallCheck(this, Select); - - var _this = possibleConstructorReturn(this, (Select.__proto__ || Object.getPrototypeOf(Select)).call(this, props)); - - ['clearValue', 'focusOption', 'handleInputBlur', 'handleInputChange', 'handleInputFocus', 'handleInputValueChange', 'handleKeyDown', 'handleMenuScroll', 'handleMouseDown', 'handleMouseDownOnArrow', 'handleMouseDownOnMenu', 'handleRequired', 'handleTouchOutside', 'handleTouchMove', 'handleTouchStart', 'handleTouchEnd', 'handleTouchEndClearValue', 'handleValueClick', 'getOptionLabel', 'onOptionRef', 'removeValue', 'selectValue'].forEach(function (fn) { - return _this[fn] = _this[fn].bind(_this); - }); - - _this.state = { - inputValue: '', - isFocused: false, - isOpen: false, - isPseudoFocused: false, - required: false - }; - return _this; - } - - createClass(Select, [{ - key: 'componentWillMount', - value: function componentWillMount() { - this._instancePrefix = 'react-select-' + (this.props.instanceId || ++instanceId) + '-'; - var valueArray = this.getValueArray(this.props.value); - - if (this.props.required) { - this.setState({ - required: this.handleRequired(valueArray[0], this.props.multi) - }); - } - } - }, { - key: 'componentDidMount', - value: function componentDidMount() { - if (typeof this.props.autofocus !== 'undefined' && typeof console !== 'undefined') { - console.warn('Warning: The autofocus prop has changed to autoFocus, support will be removed after react-select@1.0'); - } - if (this.props.autoFocus || this.props.autofocus) { - this.focus(); - } - } - }, { - key: 'componentWillReceiveProps', - value: function componentWillReceiveProps(nextProps) { - var valueArray = this.getValueArray(nextProps.value, nextProps); - - if (nextProps.required) { - this.setState({ - required: this.handleRequired(valueArray[0], nextProps.multi) - }); - } else if (this.props.required) { - // Used to be required but it's not any more - this.setState({ required: false }); - } - } - }, { - key: 'componentDidUpdate', - value: function componentDidUpdate(prevProps, prevState) { - // focus to the selected option - if (this.menu && this.focused && this.state.isOpen && !this.hasScrolledToOption) { - var focusedOptionNode = Object(__WEBPACK_IMPORTED_MODULE_2_react_dom__["findDOMNode"])(this.focused); - var menuNode = Object(__WEBPACK_IMPORTED_MODULE_2_react_dom__["findDOMNode"])(this.menu); - - var scrollTop = menuNode.scrollTop; - var scrollBottom = scrollTop + menuNode.offsetHeight; - var optionTop = focusedOptionNode.offsetTop; - var optionBottom = optionTop + focusedOptionNode.offsetHeight; - - if (scrollTop > optionTop || scrollBottom < optionBottom) { - menuNode.scrollTop = focusedOptionNode.offsetTop; - } - - // We still set hasScrolledToOption to true even if we didn't - // actually need to scroll, as we've still confirmed that the - // option is in view. - this.hasScrolledToOption = true; - } else if (!this.state.isOpen) { - this.hasScrolledToOption = false; - } - - if (this._scrollToFocusedOptionOnUpdate && this.focused && this.menu) { - this._scrollToFocusedOptionOnUpdate = false; - var focusedDOM = Object(__WEBPACK_IMPORTED_MODULE_2_react_dom__["findDOMNode"])(this.focused); - var menuDOM = Object(__WEBPACK_IMPORTED_MODULE_2_react_dom__["findDOMNode"])(this.menu); - var focusedRect = focusedDOM.getBoundingClientRect(); - var menuRect = menuDOM.getBoundingClientRect(); - if (focusedRect.bottom > menuRect.bottom) { - menuDOM.scrollTop = focusedDOM.offsetTop + focusedDOM.clientHeight - menuDOM.offsetHeight; - } else if (focusedRect.top < menuRect.top) { - menuDOM.scrollTop = focusedDOM.offsetTop; - } - } - if (this.props.scrollMenuIntoView && this.menuContainer) { - var menuContainerRect = this.menuContainer.getBoundingClientRect(); - if (window.innerHeight < menuContainerRect.bottom + this.props.menuBuffer) { - window.scrollBy(0, menuContainerRect.bottom + this.props.menuBuffer - window.innerHeight); - } - } - if (prevProps.disabled !== this.props.disabled) { - this.setState({ isFocused: false }); // eslint-disable-line react/no-did-update-set-state - this.closeMenu(); - } - if (prevState.isOpen !== this.state.isOpen) { - this.toggleTouchOutsideEvent(this.state.isOpen); - var handler = this.state.isOpen ? this.props.onOpen : this.props.onClose; - handler && handler(); - } - } - }, { - key: 'componentWillUnmount', - value: function componentWillUnmount() { - this.toggleTouchOutsideEvent(false); - } - }, { - key: 'toggleTouchOutsideEvent', - value: function toggleTouchOutsideEvent(enabled) { - if (enabled) { - if (!document.addEventListener && document.attachEvent) { - document.attachEvent('ontouchstart', this.handleTouchOutside); - } else { - document.addEventListener('touchstart', this.handleTouchOutside); - } - } else { - if (!document.removeEventListener && document.detachEvent) { - document.detachEvent('ontouchstart', this.handleTouchOutside); - } else { - document.removeEventListener('touchstart', this.handleTouchOutside); - } - } - } - }, { - key: 'handleTouchOutside', - value: function handleTouchOutside(event) { - // handle touch outside on ios to dismiss menu - if (this.wrapper && !this.wrapper.contains(event.target)) { - this.closeMenu(); - } - } - }, { - key: 'focus', - value: function focus() { - if (!this.input) return; - this.input.focus(); - } - }, { - key: 'blurInput', - value: function blurInput() { - if (!this.input) return; - this.input.blur(); - } - }, { - key: 'handleTouchMove', - value: function handleTouchMove(event) { - // Set a flag that the view is being dragged - this.dragging = true; - } - }, { - key: 'handleTouchStart', - value: function handleTouchStart(event) { - // Set a flag that the view is not being dragged - this.dragging = false; - } - }, { - key: 'handleTouchEnd', - value: function handleTouchEnd(event) { - // Check if the view is being dragged, In this case - // we don't want to fire the click event (because the user only wants to scroll) - if (this.dragging) return; - - // Fire the mouse events - this.handleMouseDown(event); - } - }, { - key: 'handleTouchEndClearValue', - value: function handleTouchEndClearValue(event) { - // Check if the view is being dragged, In this case - // we don't want to fire the click event (because the user only wants to scroll) - if (this.dragging) return; - - // Clear the value - this.clearValue(event); - } - }, { - key: 'handleMouseDown', - value: function handleMouseDown(event) { - // if the event was triggered by a mousedown and not the primary - // button, or if the component is disabled, ignore it. - if (this.props.disabled || event.type === 'mousedown' && event.button !== 0) { - return; - } - - if (event.target.tagName === 'INPUT') { - if (!this.state.isFocused) { - this._openAfterFocus = this.props.openOnClick; - this.focus(); - } else if (!this.state.isOpen) { - this.setState({ - isOpen: true, - isPseudoFocused: false - }); - } - return; - } - - // prevent default event handlers - event.preventDefault(); - - // for the non-searchable select, toggle the menu - if (!this.props.searchable) { - // TODO: This code means that if a select is searchable, onClick the options menu will not appear, only on subsequent click will it open. - this.focus(); - return this.setState({ - isOpen: !this.state.isOpen - }); - } - - if (this.state.isFocused) { - // On iOS, we can get into a state where we think the input is focused but it isn't really, - // since iOS ignores programmatic calls to input.focus() that weren't triggered by a click event. - // Call focus() again here to be safe. - this.focus(); - - var input = this.input; - if (typeof input.getInput === 'function') { - // Get the actual DOM input if the ref is an <AutosizeInput /> component - input = input.getInput(); - } - - // clears the value so that the cursor will be at the end of input when the component re-renders - input.value = ''; - - // if the input is focused, ensure the menu is open - this.setState({ - isOpen: true, - isPseudoFocused: false - }); - } else { - // otherwise, focus the input and open the menu - this._openAfterFocus = this.props.openOnClick; - this.focus(); - } - } - }, { - key: 'handleMouseDownOnArrow', - value: function handleMouseDownOnArrow(event) { - // if the event was triggered by a mousedown and not the primary - // button, or if the component is disabled, ignore it. - if (this.props.disabled || event.type === 'mousedown' && event.button !== 0) { - return; - } - // If the menu isn't open, let the event bubble to the main handleMouseDown - if (!this.state.isOpen) { - this.setState({ - isOpen: true - }); - } - // prevent default event handlers - event.stopPropagation(); - event.preventDefault(); - // close the menu - if (this.state.isOpen) { - this.closeMenu(); - } - } - }, { - key: 'handleMouseDownOnMenu', - value: function handleMouseDownOnMenu(event) { - // if the event was triggered by a mousedown and not the primary - // button, or if the component is disabled, ignore it. - if (this.props.disabled || event.type === 'mousedown' && event.button !== 0) { - return; - } - event.stopPropagation(); - event.preventDefault(); - - this._openAfterFocus = true; - this.focus(); - } - }, { - key: 'closeMenu', - value: function closeMenu() { - if (this.props.onCloseResetsInput) { - this.setState({ - isOpen: false, - isPseudoFocused: this.state.isFocused && !this.props.multi, - inputValue: this.handleInputValueChange('') - }); - } else { - this.setState({ - isOpen: false, - isPseudoFocused: this.state.isFocused && !this.props.multi - }); - } - this.hasScrolledToOption = false; - } - }, { - key: 'handleInputFocus', - value: function handleInputFocus(event) { - if (this.props.disabled) return; - var isOpen = this.state.isOpen || this._openAfterFocus || this.props.openOnFocus; - if (this.props.onFocus) { - this.props.onFocus(event); - } - this.setState({ - isFocused: true, - isOpen: isOpen - }); - this._openAfterFocus = false; - } - }, { - key: 'handleInputBlur', - value: function handleInputBlur(event) { - // The check for menu.contains(activeElement) is necessary to prevent IE11's scrollbar from closing the menu in certain contexts. - if (this.menu && (this.menu === document.activeElement || this.menu.contains(document.activeElement))) { - this.focus(); - return; - } - - if (this.props.onBlur) { - this.props.onBlur(event); - } - var onBlurredState = { - isFocused: false, - isOpen: false, - isPseudoFocused: false - }; - if (this.props.onBlurResetsInput) { - onBlurredState.inputValue = this.handleInputValueChange(''); - } - this.setState(onBlurredState); - } - }, { - key: 'handleInputChange', - value: function handleInputChange(event) { - var newInputValue = event.target.value; - - if (this.state.inputValue !== event.target.value) { - newInputValue = this.handleInputValueChange(newInputValue); - } - - this.setState({ - isOpen: true, - isPseudoFocused: false, - inputValue: newInputValue - }); - } - }, { - key: 'handleInputValueChange', - value: function handleInputValueChange(newValue) { - if (this.props.onInputChange) { - var nextState = this.props.onInputChange(newValue); - // Note: != used deliberately here to catch undefined and null - if (nextState != null && (typeof nextState === 'undefined' ? 'undefined' : _typeof(nextState)) !== 'object') { - newValue = '' + nextState; - } - } - return newValue; - } - }, { - key: 'handleKeyDown', - value: function handleKeyDown(event) { - if (this.props.disabled) return; - - if (typeof this.props.onInputKeyDown === 'function') { - this.props.onInputKeyDown(event); - if (event.defaultPrevented) { - return; - } - } - - switch (event.keyCode) { - case 8: - // backspace - if (!this.state.inputValue && this.props.backspaceRemoves) { - event.preventDefault(); - this.popValue(); - } - return; - case 9: - // tab - if (event.shiftKey || !this.state.isOpen || !this.props.tabSelectsValue) { - return; - } - event.preventDefault(); - this.selectFocusedOption(); - return; - case 13: - // enter - event.preventDefault(); - event.stopPropagation(); - if (this.state.isOpen) { - this.selectFocusedOption(); - } else { - this.focusNextOption(); - } - return; - break; - case 27: - // escape - if (this.state.isOpen) { - this.closeMenu(); - event.stopPropagation(); - } else if (this.props.clearable && this.props.escapeClearsValue) { - this.clearValue(event); - event.stopPropagation(); - } - break; - case 32: - // space - if (this.props.searchable) { - return; - } - event.preventDefault(); - if (!this.state.isOpen) { - this.focusNextOption(); - return; - } - event.stopPropagation(); - this.selectFocusedOption(); - break; - case 38: - // up - this.focusPreviousOption(); - break; - case 40: - // down - this.focusNextOption(); - break; - case 33: - // page up - this.focusPageUpOption(); - break; - case 34: - // page down - this.focusPageDownOption(); - break; - case 35: - // end key - if (event.shiftKey) { - return; - } - this.focusEndOption(); - break; - case 36: - // home key - if (event.shiftKey) { - return; - } - this.focusStartOption(); - break; - case 46: - // delete - if (!this.state.inputValue && this.props.deleteRemoves) { - event.preventDefault(); - this.popValue(); - } - return; - default: - return; - } - event.preventDefault(); - } - }, { - key: 'handleValueClick', - value: function handleValueClick(option, event) { - if (!this.props.onValueClick) return; - this.props.onValueClick(option, event); - } - }, { - key: 'handleMenuScroll', - value: function handleMenuScroll(event) { - if (!this.props.onMenuScrollToBottom) return; - var target = event.target; - - if (target.scrollHeight > target.offsetHeight && target.scrollHeight - target.offsetHeight - target.scrollTop <= 0) { - this.props.onMenuScrollToBottom(); - } - } - }, { - key: 'handleRequired', - value: function handleRequired(value, multi) { - if (!value) return true; - return multi ? value.length === 0 : Object.keys(value).length === 0; - } - }, { - key: 'getOptionLabel', - value: function getOptionLabel(op) { - return op[this.props.labelKey]; - } - - /** - * Turns a value into an array from the given options - * @param {String|Number|Array} value - the value of the select input - * @param {Object} nextProps - optionally specify the nextProps so the returned array uses the latest configuration - * @returns {Array} the value of the select represented in an array - */ - - }, { - key: 'getValueArray', - value: function getValueArray(value, nextProps) { - var _this2 = this; - - /** support optionally passing in the `nextProps` so `componentWillReceiveProps` updates will function as expected */ - var props = (typeof nextProps === 'undefined' ? 'undefined' : _typeof(nextProps)) === 'object' ? nextProps : this.props; - if (props.multi) { - if (typeof value === 'string') { - value = value.split(props.delimiter); - } - if (!Array.isArray(value)) { - if (value === null || value === undefined) return []; - value = [value]; - } - return value.map(function (value) { - return _this2.expandValue(value, props); - }).filter(function (i) { - return i; - }); - } - var expandedValue = this.expandValue(value, props); - return expandedValue ? [expandedValue] : []; - } - - /** - * Retrieve a value from the given options and valueKey - * @param {String|Number|Array} value - the selected value(s) - * @param {Object} props - the Select component's props (or nextProps) - */ - - }, { - key: 'expandValue', - value: function expandValue(value, props) { - var valueType = typeof value === 'undefined' ? 'undefined' : _typeof(value); - if (valueType !== 'string' && valueType !== 'number' && valueType !== 'boolean') return value; - var options = props.options, - valueKey = props.valueKey; - - if (!options) return; - for (var i = 0; i < options.length; i++) { - if (String(options[i][valueKey]) === String(value)) return options[i]; - } - } - }, { - key: 'setValue', - value: function setValue(value) { - var _this3 = this; - - if (this.props.autoBlur) { - this.blurInput(); - } - if (this.props.required) { - var required = this.handleRequired(value, this.props.multi); - this.setState({ required: required }); - } - if (this.props.onChange) { - if (this.props.simpleValue && value) { - value = this.props.multi ? value.map(function (i) { - return i[_this3.props.valueKey]; - }).join(this.props.delimiter) : value[this.props.valueKey]; - } - this.props.onChange(value); - } - } - }, { - key: 'selectValue', - value: function selectValue(value) { - var _this4 = this; - - // NOTE: we actually add/set the value in a callback to make sure the - // input value is empty to avoid styling issues in Chrome - if (this.props.closeOnSelect) { - this.hasScrolledToOption = false; - } - if (this.props.multi) { - var updatedValue = this.props.onSelectResetsInput ? '' : this.state.inputValue; - this.setState({ - focusedIndex: null, - inputValue: this.handleInputValueChange(updatedValue), - isOpen: !this.props.closeOnSelect - }, function () { - var valueArray = _this4.getValueArray(_this4.props.value); - if (valueArray.some(function (i) { - return i[_this4.props.valueKey] === value[_this4.props.valueKey]; - })) { - _this4.removeValue(value); - } else { - _this4.addValue(value); - } - }); - } else { - this.setState({ - inputValue: this.handleInputValueChange(''), - isOpen: !this.props.closeOnSelect, - isPseudoFocused: this.state.isFocused - }, function () { - _this4.setValue(value); - }); - } - } - }, { - key: 'addValue', - value: function addValue(value) { - var valueArray = this.getValueArray(this.props.value); - var visibleOptions = this._visibleOptions.filter(function (val) { - return !val.disabled; - }); - var lastValueIndex = visibleOptions.indexOf(value); - this.setValue(valueArray.concat(value)); - if (visibleOptions.length - 1 === lastValueIndex) { - // the last option was selected; focus the second-last one - this.focusOption(visibleOptions[lastValueIndex - 1]); - } else if (visibleOptions.length > lastValueIndex) { - // focus the option below the selected one - this.focusOption(visibleOptions[lastValueIndex + 1]); - } - } - }, { - key: 'popValue', - value: function popValue() { - var valueArray = this.getValueArray(this.props.value); - if (!valueArray.length) return; - if (valueArray[valueArray.length - 1].clearableValue === false) return; - this.setValue(this.props.multi ? valueArray.slice(0, valueArray.length - 1) : null); - } - }, { - key: 'removeValue', - value: function removeValue(value) { - var _this5 = this; - - var valueArray = this.getValueArray(this.props.value); - this.setValue(valueArray.filter(function (i) { - return i[_this5.props.valueKey] !== value[_this5.props.valueKey]; - })); - this.focus(); - } - }, { - key: 'clearValue', - value: function clearValue(event) { - // if the event was triggered by a mousedown and not the primary - // button, ignore it. - if (event && event.type === 'mousedown' && event.button !== 0) { - return; - } - event.preventDefault(); - this.setValue(this.getResetValue()); - this.setState({ - isOpen: false, - inputValue: this.handleInputValueChange('') - }, this.focus); - } - }, { - key: 'getResetValue', - value: function getResetValue() { - if (this.props.resetValue !== undefined) { - return this.props.resetValue; - } else if (this.props.multi) { - return []; - } else { - return null; - } - } - }, { - key: 'focusOption', - value: function focusOption(option) { - this.setState({ - focusedOption: option - }); - } - }, { - key: 'focusNextOption', - value: function focusNextOption() { - this.focusAdjacentOption('next'); - } - }, { - key: 'focusPreviousOption', - value: function focusPreviousOption() { - this.focusAdjacentOption('previous'); - } - }, { - key: 'focusPageUpOption', - value: function focusPageUpOption() { - this.focusAdjacentOption('page_up'); - } - }, { - key: 'focusPageDownOption', - value: function focusPageDownOption() { - this.focusAdjacentOption('page_down'); - } - }, { - key: 'focusStartOption', - value: function focusStartOption() { - this.focusAdjacentOption('start'); - } - }, { - key: 'focusEndOption', - value: function focusEndOption() { - this.focusAdjacentOption('end'); - } - }, { - key: 'focusAdjacentOption', - value: function focusAdjacentOption(dir) { - var options = this._visibleOptions.map(function (option, index) { - return { option: option, index: index }; - }).filter(function (option) { - return !option.option.disabled; - }); - this._scrollToFocusedOptionOnUpdate = true; - if (!this.state.isOpen) { - this.setState({ - isOpen: true, - inputValue: '', - focusedOption: this._focusedOption || (options.length ? options[dir === 'next' ? 0 : options.length - 1].option : null) - }); - return; - } - if (!options.length) return; - var focusedIndex = -1; - for (var i = 0; i < options.length; i++) { - if (this._focusedOption === options[i].option) { - focusedIndex = i; - break; - } - } - if (dir === 'next' && focusedIndex !== -1) { - focusedIndex = (focusedIndex + 1) % options.length; - } else if (dir === 'previous') { - if (focusedIndex > 0) { - focusedIndex = focusedIndex - 1; - } else { - focusedIndex = options.length - 1; - } - } else if (dir === 'start') { - focusedIndex = 0; - } else if (dir === 'end') { - focusedIndex = options.length - 1; - } else if (dir === 'page_up') { - var potentialIndex = focusedIndex - this.props.pageSize; - if (potentialIndex < 0) { - focusedIndex = 0; - } else { - focusedIndex = potentialIndex; - } - } else if (dir === 'page_down') { - var potentialIndex = focusedIndex + this.props.pageSize; - if (potentialIndex > options.length - 1) { - focusedIndex = options.length - 1; - } else { - focusedIndex = potentialIndex; - } - } - - if (focusedIndex === -1) { - focusedIndex = 0; - } - - this.setState({ - focusedIndex: options[focusedIndex].index, - focusedOption: options[focusedIndex].option - }); - } - }, { - key: 'getFocusedOption', - value: function getFocusedOption() { - return this._focusedOption; - } - }, { - key: 'selectFocusedOption', - value: function selectFocusedOption() { - if (this._focusedOption) { - return this.selectValue(this._focusedOption); - } - } - }, { - key: 'renderLoading', - value: function renderLoading() { - if (!this.props.isLoading) return; - return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement( - 'span', - { className: 'Select-loading-zone', 'aria-hidden': 'true' }, - __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement('span', { className: 'Select-loading' }) - ); - } - }, { - key: 'renderValue', - value: function renderValue(valueArray, isOpen) { - var _this6 = this; - - var renderLabel = this.props.valueRenderer || this.getOptionLabel; - var ValueComponent = this.props.valueComponent; - if (!valueArray.length) { - return !this.state.inputValue ? __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement( - 'div', - { className: 'Select-placeholder' }, - this.props.placeholder - ) : null; - } - var onClick = this.props.onValueClick ? this.handleValueClick : null; - if (this.props.multi) { - return valueArray.map(function (value, i) { - return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement( - ValueComponent, - { - id: _this6._instancePrefix + '-value-' + i, - instancePrefix: _this6._instancePrefix, - disabled: _this6.props.disabled || value.clearableValue === false, - key: 'value-' + i + '-' + value[_this6.props.valueKey], - onClick: onClick, - onRemove: _this6.removeValue, - value: value - }, - renderLabel(value, i), - __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement( - 'span', - { className: 'Select-aria-only' }, - '\xA0' - ) - ); - }); - } else if (!this.state.inputValue) { - if (isOpen) onClick = null; - return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement( - ValueComponent, - { - id: this._instancePrefix + '-value-item', - disabled: this.props.disabled, - instancePrefix: this._instancePrefix, - onClick: onClick, - value: valueArray[0] - }, - renderLabel(valueArray[0]) - ); - } - } - }, { - key: 'renderInput', - value: function renderInput(valueArray, focusedOptionIndex) { - var _classNames, - _this7 = this; - - var className = __WEBPACK_IMPORTED_MODULE_4_classnames___default()('Select-input', this.props.inputProps.className); - var isOpen = !!this.state.isOpen; - - var ariaOwns = __WEBPACK_IMPORTED_MODULE_4_classnames___default()((_classNames = {}, defineProperty(_classNames, this._instancePrefix + '-list', isOpen), defineProperty(_classNames, this._instancePrefix + '-backspace-remove-message', this.props.multi && !this.props.disabled && this.state.isFocused && !this.state.inputValue), _classNames)); - var inputProps = _extends({}, this.props.inputProps, { - role: 'combobox', - 'aria-expanded': '' + isOpen, - 'aria-owns': ariaOwns, - 'aria-haspopup': '' + isOpen, - 'aria-activedescendant': isOpen ? this._instancePrefix + '-option-' + focusedOptionIndex : this._instancePrefix + '-value', - 'aria-describedby': this.props['aria-describedby'], - 'aria-labelledby': this.props['aria-labelledby'], - 'aria-label': this.props['aria-label'], - className: className, - tabIndex: this.props.tabIndex, - onBlur: this.handleInputBlur, - onChange: this.handleInputChange, - onFocus: this.handleInputFocus, - ref: function ref(_ref) { - return _this7.input = _ref; - }, - required: this.state.required, - value: this.state.inputValue - }); - - if (this.props.inputRenderer) { - return this.props.inputRenderer(inputProps); - } - - if (this.props.disabled || !this.props.searchable) { - var _props$inputProps = this.props.inputProps, - inputClassName = _props$inputProps.inputClassName, - divProps = objectWithoutProperties(_props$inputProps, ['inputClassName']); - - - var _ariaOwns = __WEBPACK_IMPORTED_MODULE_4_classnames___default()(defineProperty({}, this._instancePrefix + '-list', isOpen)); - return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement('div', _extends({}, divProps, { - role: 'combobox', - 'aria-expanded': isOpen, - 'aria-owns': _ariaOwns, - 'aria-activedescendant': isOpen ? this._instancePrefix + '-option-' + focusedOptionIndex : this._instancePrefix + '-value', - 'aria-labelledby': this.props['aria-labelledby'], - 'aria-label': this.props['aria-label'], - className: className, - tabIndex: this.props.tabIndex || 0, - onBlur: this.handleInputBlur, - onFocus: this.handleInputFocus, - ref: function ref(_ref2) { - return _this7.input = _ref2; - }, - 'aria-disabled': '' + !!this.props.disabled, - style: { border: 0, width: 1, display: 'inline-block' } })); - } - - if (this.props.autosize) { - return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_3_react_input_autosize___default.a, _extends({ id: this.props.id }, inputProps, { minWidth: '5' })); - } - return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement( - 'div', - { className: className, key: 'input-wrap' }, - __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement('input', _extends({ id: this.props.id }, inputProps)) - ); - } - }, { - key: 'renderClear', - value: function renderClear() { - var valueArray = this.getValueArray(this.props.value); - if (!this.props.clearable || !valueArray.length || this.props.disabled || this.props.isLoading) return; - var clear = this.props.clearRenderer(); - - return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement( - 'span', - { className: 'Select-clear-zone', title: this.props.multi ? this.props.clearAllText : this.props.clearValueText, - 'aria-label': this.props.multi ? this.props.clearAllText : this.props.clearValueText, - onMouseDown: this.clearValue, - onTouchStart: this.handleTouchStart, - onTouchMove: this.handleTouchMove, - onTouchEnd: this.handleTouchEndClearValue - }, - clear - ); - } - }, { - key: 'renderArrow', - value: function renderArrow() { - if (!this.props.arrowRenderer) return; - - var onMouseDown = this.handleMouseDownOnArrow; - var isOpen = this.state.isOpen; - var arrow = this.props.arrowRenderer({ onMouseDown: onMouseDown, isOpen: isOpen }); - - if (!arrow) { - return null; - } - - return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement( - 'span', - { - className: 'Select-arrow-zone', - onMouseDown: onMouseDown - }, - arrow - ); - } - }, { - key: 'filterOptions', - value: function filterOptions$$1(excludeOptions) { - var filterValue = this.state.inputValue; - var options = this.props.options || []; - if (this.props.filterOptions) { - // Maintain backwards compatibility with boolean attribute - var filterOptions$$1 = typeof this.props.filterOptions === 'function' ? this.props.filterOptions : filterOptions; - - return filterOptions$$1(options, filterValue, excludeOptions, { - filterOption: this.props.filterOption, - ignoreAccents: this.props.ignoreAccents, - ignoreCase: this.props.ignoreCase, - labelKey: this.props.labelKey, - matchPos: this.props.matchPos, - matchProp: this.props.matchProp, - valueKey: this.props.valueKey, - trimFilter: this.props.trimFilter - }); - } else { - return options; - } - } - }, { - key: 'onOptionRef', - value: function onOptionRef(ref, isFocused) { - if (isFocused) { - this.focused = ref; - } - } - }, { - key: 'renderMenu', - value: function renderMenu(options, valueArray, focusedOption) { - if (options && options.length) { - return this.props.menuRenderer({ - focusedOption: focusedOption, - focusOption: this.focusOption, - inputValue: this.state.inputValue, - instancePrefix: this._instancePrefix, - labelKey: this.props.labelKey, - onFocus: this.focusOption, - onSelect: this.selectValue, - optionClassName: this.props.optionClassName, - optionComponent: this.props.optionComponent, - optionRenderer: this.props.optionRenderer || this.getOptionLabel, - options: options, - selectValue: this.selectValue, - removeValue: this.removeValue, - valueArray: valueArray, - valueKey: this.props.valueKey, - onOptionRef: this.onOptionRef - }); - } else if (this.props.noResultsText) { - return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement( - 'div', - { className: 'Select-noresults' }, - this.props.noResultsText - ); - } else { - return null; - } - } - }, { - key: 'renderHiddenField', - value: function renderHiddenField(valueArray) { - var _this8 = this; - - if (!this.props.name) return; - if (this.props.joinValues) { - var value = valueArray.map(function (i) { - return stringifyValue(i[_this8.props.valueKey]); - }).join(this.props.delimiter); - return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement('input', { - type: 'hidden', - ref: function ref(_ref3) { - return _this8.value = _ref3; - }, - name: this.props.name, - value: value, - disabled: this.props.disabled }); - } - return valueArray.map(function (item, index) { - return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement('input', { key: 'hidden.' + index, - type: 'hidden', - ref: 'value' + index, - name: _this8.props.name, - value: stringifyValue(item[_this8.props.valueKey]), - disabled: _this8.props.disabled }); - }); - } - }, { - key: 'getFocusableOptionIndex', - value: function getFocusableOptionIndex(selectedOption) { - var options = this._visibleOptions; - if (!options.length) return null; - - var valueKey = this.props.valueKey; - var focusedOption = this.state.focusedOption || selectedOption; - if (focusedOption && !focusedOption.disabled) { - var focusedOptionIndex = -1; - options.some(function (option, index) { - var isOptionEqual = option[valueKey] === focusedOption[valueKey]; - if (isOptionEqual) { - focusedOptionIndex = index; - } - return isOptionEqual; - }); - if (focusedOptionIndex !== -1) { - return focusedOptionIndex; - } - } - - for (var i = 0; i < options.length; i++) { - if (!options[i].disabled) return i; - } - return null; - } - }, { - key: 'renderOuter', - value: function renderOuter(options, valueArray, focusedOption) { - var _this9 = this; - - var menu = this.renderMenu(options, valueArray, focusedOption); - if (!menu) { - return null; - } - - return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement( - 'div', - { ref: function ref(_ref5) { - return _this9.menuContainer = _ref5; - }, className: 'Select-menu-outer', style: this.props.menuContainerStyle }, - __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement( - 'div', - { ref: function ref(_ref4) { - return _this9.menu = _ref4; - }, role: 'listbox', tabIndex: -1, className: 'Select-menu', id: this._instancePrefix + '-list', - style: this.props.menuStyle, - onScroll: this.handleMenuScroll, - onMouseDown: this.handleMouseDownOnMenu }, - menu - ) - ); - } - }, { - key: 'render', - value: function render() { - var _this10 = this; - - var valueArray = this.getValueArray(this.props.value); - var options = this._visibleOptions = this.filterOptions(this.props.multi && this.props.removeSelected ? valueArray : null); - var isOpen = this.state.isOpen; - if (this.props.multi && !options.length && valueArray.length && !this.state.inputValue) isOpen = false; - var focusedOptionIndex = this.getFocusableOptionIndex(valueArray[0]); - - var focusedOption = null; - if (focusedOptionIndex !== null) { - focusedOption = this._focusedOption = options[focusedOptionIndex]; - } else { - focusedOption = this._focusedOption = null; - } - var className = __WEBPACK_IMPORTED_MODULE_4_classnames___default()('Select', this.props.className, { - 'Select--multi': this.props.multi, - 'Select--single': !this.props.multi, - 'is-clearable': this.props.clearable, - 'is-disabled': this.props.disabled, - 'is-focused': this.state.isFocused, - 'is-loading': this.props.isLoading, - 'is-open': isOpen, - 'is-pseudo-focused': this.state.isPseudoFocused, - 'is-searchable': this.props.searchable, - 'has-value': valueArray.length, - 'Select--rtl': this.props.rtl - }); - - var removeMessage = null; - if (this.props.multi && !this.props.disabled && valueArray.length && !this.state.inputValue && this.state.isFocused && this.props.backspaceRemoves) { - removeMessage = __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement( - 'span', - { id: this._instancePrefix + '-backspace-remove-message', className: 'Select-aria-only', 'aria-live': 'assertive' }, - this.props.backspaceToRemoveMessage.replace('{label}', valueArray[valueArray.length - 1][this.props.labelKey]) - ); - } - - return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement( - 'div', - { ref: function ref(_ref7) { - return _this10.wrapper = _ref7; - }, - className: className, - style: this.props.wrapperStyle }, - this.renderHiddenField(valueArray), - __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement( - 'div', - { ref: function ref(_ref6) { - return _this10.control = _ref6; - }, - className: 'Select-control', - style: this.props.style, - onKeyDown: this.handleKeyDown, - onMouseDown: this.handleMouseDown, - onTouchEnd: this.handleTouchEnd, - onTouchStart: this.handleTouchStart, - onTouchMove: this.handleTouchMove - }, - __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement( - 'span', - { className: 'Select-multi-value-wrapper', id: this._instancePrefix + '-value' }, - this.renderValue(valueArray, isOpen), - this.renderInput(valueArray, focusedOptionIndex) - ), - removeMessage, - this.renderLoading(), - this.renderClear(), - this.renderArrow() - ), - isOpen ? this.renderOuter(options, valueArray, focusedOption) : null - ); - } - }]); - return Select; -}(__WEBPACK_IMPORTED_MODULE_0_react___default.a.Component); - - - -Select$1.propTypes = { - 'aria-describedby': __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, // html id(s) of element(s) that should be used to describe this input (for assistive tech) - 'aria-label': __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, // aria label (for assistive tech) - 'aria-labelledby': __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, // html id of an element that should be used as the label (for assistive tech) - arrowRenderer: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, // create the drop-down caret element - autoBlur: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, // automatically blur the component when an option is selected - autoFocus: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, // autofocus the component on mount - autofocus: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, // deprecated; use autoFocus instead - autosize: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, // whether to enable autosizing or not - backspaceRemoves: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, // whether backspace removes an item if there is no text input - backspaceToRemoveMessage: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, // message to use for screenreaders to press backspace to remove the current item - {label} is replaced with the item label - className: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, // className for the outer element - clearAllText: stringOrNode, // title for the "clear" control when multi: true - clearRenderer: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, // create clearable x element - clearValueText: stringOrNode, // title for the "clear" control - clearable: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, // should it be possible to reset value - closeOnSelect: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, // whether to close the menu when a value is selected - deleteRemoves: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, // whether delete removes an item if there is no text input - delimiter: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, // delimiter to use to join multiple values for the hidden field value - disabled: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, // whether the Select is disabled or not - escapeClearsValue: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, // whether escape clears the value when the menu is closed - filterOption: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, // method to filter a single option (option, filterString) - filterOptions: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.any, // boolean to enable default filtering or function to filter the options array ([options], filterString, [values]) - id: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, // html id to set on the input element for accessibility or tests - ignoreAccents: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, // whether to strip diacritics when filtering - ignoreCase: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, // whether to perform case-insensitive filtering - inputProps: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object, // custom attributes for the Input - inputRenderer: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, // returns a custom input component - instanceId: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, // set the components instanceId - isLoading: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, // whether the Select is loading externally or not (such as options being loaded) - joinValues: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, // joins multiple values into a single form field with the delimiter (legacy mode) - labelKey: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, // path of the label value in option objects - matchPos: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, // (any|start) match the start or entire string when filtering - matchProp: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, // (any|label|value) which option property to filter on - menuBuffer: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, // optional buffer (in px) between the bottom of the viewport and the bottom of the menu - menuContainerStyle: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object, // optional style to apply to the menu container - menuRenderer: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, // renders a custom menu with options - menuStyle: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object, // optional style to apply to the menu - multi: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, // multi-value input - name: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, // generates a hidden <input /> tag with this field name for html forms - noResultsText: stringOrNode, // placeholder displayed when there are no matching search results - onBlur: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, // onBlur handler: function (event) {} - onBlurResetsInput: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, // whether input is cleared on blur - onChange: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, // onChange handler: function (newValue) {} - onClose: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, // fires when the menu is closed - onCloseResetsInput: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, // whether input is cleared when menu is closed through the arrow - onFocus: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, // onFocus handler: function (event) {} - onInputChange: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, // onInputChange handler: function (inputValue) {} - onInputKeyDown: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, // input keyDown handler: function (event) {} - onMenuScrollToBottom: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, // fires when the menu is scrolled to the bottom; can be used to paginate options - onOpen: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, // fires when the menu is opened - onSelectResetsInput: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, // whether input is cleared on select (works only for multiselect) - onValueClick: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, // onClick handler for value labels: function (value, event) {} - openOnClick: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, // boolean to control opening the menu when the control is clicked - openOnFocus: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, // always open options menu on focus - optionClassName: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, // additional class(es) to apply to the <Option /> elements - optionComponent: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, // option component to render in dropdown - optionRenderer: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, // optionRenderer: function (option) {} - options: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.array, // array of options - pageSize: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, // number of entries to page when using page up/down keys - placeholder: stringOrNode, // field placeholder, displayed when there's no value - removeSelected: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, // whether the selected option is removed from the dropdown on multi selects - required: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, // applies HTML5 required attribute when needed - resetValue: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.any, // value to use when you clear the control - rtl: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, // set to true in order to use react-select in right-to-left direction - scrollMenuIntoView: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, // boolean to enable the viewport to shift so that the full menu fully visible when engaged - searchable: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, // whether to enable searching feature or not - simpleValue: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, // pass the value to onChange as a simple value (legacy pre 1.0 mode), defaults to false - style: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object, // optional style to apply to the control - tabIndex: stringOrNumber, // optional tab index of the control - tabSelectsValue: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, // whether to treat tabbing out while focused to be value selection - trimFilter: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, // whether to trim whitespace around filter value - value: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.any, // initial field value - valueComponent: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, // value component to render - valueKey: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, // path of the label value in option objects - valueRenderer: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, // valueRenderer: function (option) {} - wrapperStyle: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object // optional style to apply to the component wrapper -}; - -Select$1.defaultProps = { - arrowRenderer: arrowRenderer, - autosize: true, - backspaceRemoves: true, - backspaceToRemoveMessage: 'Press backspace to remove {label}', - clearable: true, - clearAllText: 'Clear all', - clearRenderer: clearRenderer, - clearValueText: 'Clear value', - closeOnSelect: true, - deleteRemoves: true, - delimiter: ',', - disabled: false, - escapeClearsValue: true, - filterOptions: filterOptions, - ignoreAccents: true, - ignoreCase: true, - inputProps: {}, - isLoading: false, - joinValues: false, - labelKey: 'label', - matchPos: 'any', - matchProp: 'any', - menuBuffer: 0, - menuRenderer: menuRenderer, - multi: false, - noResultsText: 'No results found', - onBlurResetsInput: true, - onSelectResetsInput: true, - onCloseResetsInput: true, - openOnClick: true, - optionComponent: Option, - pageSize: 5, - placeholder: 'Select...', - removeSelected: true, - required: false, - rtl: false, - scrollMenuIntoView: true, - searchable: true, - simpleValue: false, - tabSelectsValue: true, - trimFilter: true, - valueComponent: Value, - valueKey: 'value' -}; - -var propTypes = { - autoload: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool.isRequired, // automatically call the `loadOptions` prop on-mount; defaults to true - cache: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.any, // object to use to cache results; set to null/false to disable caching - children: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func.isRequired, // Child function responsible for creating the inner Select component; (props: Object): PropTypes.element - ignoreAccents: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, // strip diacritics when filtering; defaults to true - ignoreCase: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, // perform case-insensitive filtering; defaults to true - loadOptions: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func.isRequired, // callback to load options asynchronously; (inputValue: string, callback: Function): ?Promise - loadingPlaceholder: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([// replaces the placeholder while options are loading - __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.node]), - multi: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, // multi-value input - noResultsText: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([// field noResultsText, displayed when no options come back from the server - __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.node]), - onChange: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, // onChange handler: function (newValue) {} - onInputChange: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, // optional for keeping track of what is being typed - options: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.array.isRequired, // array of options - placeholder: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([// field placeholder, displayed when there's no value (shared with Select) - __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.node]), - searchPromptText: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([// label to prompt for search input - __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.node]), - value: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.any // initial field value -}; - -var defaultCache = {}; - -var defaultProps = { - autoload: true, - cache: defaultCache, - children: defaultChildren, - ignoreAccents: true, - ignoreCase: true, - loadingPlaceholder: 'Loading...', - options: [], - searchPromptText: 'Type to search' -}; - -var Async = function (_Component) { - inherits(Async, _Component); - - function Async(props, context) { - classCallCheck(this, Async); - - var _this = possibleConstructorReturn(this, (Async.__proto__ || Object.getPrototypeOf(Async)).call(this, props, context)); - - _this._cache = props.cache === defaultCache ? {} : props.cache; - - _this.state = { - inputValue: '', - isLoading: false, - options: props.options - }; - - _this.onInputChange = _this.onInputChange.bind(_this); - return _this; - } - - createClass(Async, [{ - key: 'componentDidMount', - value: function componentDidMount() { - var autoload = this.props.autoload; - - - if (autoload) { - this.loadOptions(''); - } - } - }, { - key: 'componentWillReceiveProps', - value: function componentWillReceiveProps(nextProps) { - if (nextProps.options !== this.props.options) { - this.setState({ - options: nextProps.options - }); - } - } - }, { - key: 'componentWillUnmount', - value: function componentWillUnmount() { - this._callback = null; - } - }, { - key: 'loadOptions', - value: function loadOptions(inputValue) { - var _this2 = this; - - var loadOptions = this.props.loadOptions; - - var cache = this._cache; - - if (cache && Object.prototype.hasOwnProperty.call(cache, inputValue)) { - this._callback = null; - - this.setState({ - isLoading: false, - options: cache[inputValue] - }); - - return; - } - - var callback = function callback(error, data) { - var options = data && data.options || []; - - if (cache) { - cache[inputValue] = options; - } - - if (callback === _this2._callback) { - _this2._callback = null; - - _this2.setState({ - isLoading: false, - options: options - }); - } - }; - - // Ignore all but the most recent request - this._callback = callback; - - var promise = loadOptions(inputValue, callback); - if (promise) { - promise.then(function (data) { - return callback(null, data); - }, function (error) { - return callback(error); - }); - } - - if (this._callback && !this.state.isLoading) { - this.setState({ - isLoading: true - }); - } - } - }, { - key: 'onInputChange', - value: function onInputChange(inputValue) { - var _props = this.props, - ignoreAccents = _props.ignoreAccents, - ignoreCase = _props.ignoreCase, - onInputChange = _props.onInputChange; - - var newInputValue = inputValue; - - if (onInputChange) { - var value = onInputChange(newInputValue); - // Note: != used deliberately here to catch undefined and null - if (value != null && (typeof value === 'undefined' ? 'undefined' : _typeof(value)) !== 'object') { - newInputValue = '' + value; - } - } - - var transformedInputValue = newInputValue; - - if (ignoreAccents) { - transformedInputValue = stripDiacritics(transformedInputValue); - } - - if (ignoreCase) { - transformedInputValue = transformedInputValue.toLowerCase(); - } - - this.setState({ inputValue: newInputValue }); - this.loadOptions(transformedInputValue); - - // Return new input value, but without applying toLowerCase() to avoid modifying the user's view case of the input while typing. - return newInputValue; - } - }, { - key: 'noResultsText', - value: function noResultsText() { - var _props2 = this.props, - loadingPlaceholder = _props2.loadingPlaceholder, - noResultsText = _props2.noResultsText, - searchPromptText = _props2.searchPromptText; - var _state = this.state, - inputValue = _state.inputValue, - isLoading = _state.isLoading; - - - if (isLoading) { - return loadingPlaceholder; - } - if (inputValue && noResultsText) { - return noResultsText; - } - return searchPromptText; - } - }, { - key: 'focus', - value: function focus() { - this.select.focus(); - } - }, { - key: 'render', - value: function render() { - var _this3 = this; - - var _props3 = this.props, - children = _props3.children, - loadingPlaceholder = _props3.loadingPlaceholder, - multi = _props3.multi, - onChange = _props3.onChange, - placeholder = _props3.placeholder; - var _state2 = this.state, - isLoading = _state2.isLoading, - options = _state2.options; - - - var props = { - noResultsText: this.noResultsText(), - placeholder: isLoading ? loadingPlaceholder : placeholder, - options: isLoading && loadingPlaceholder ? [] : options, - ref: function ref(_ref) { - return _this3.select = _ref; - } - }; - - return children(_extends({}, this.props, props, { - isLoading: isLoading, - onInputChange: this.onInputChange - })); - } - }]); - return Async; -}(__WEBPACK_IMPORTED_MODULE_0_react__["Component"]); - -Async.propTypes = propTypes; -Async.defaultProps = defaultProps; - -function defaultChildren(props) { - return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(Select$1, props); -} - -var CreatableSelect = function (_React$Component) { - inherits(CreatableSelect, _React$Component); - - function CreatableSelect(props, context) { - classCallCheck(this, CreatableSelect); - - var _this = possibleConstructorReturn(this, (CreatableSelect.__proto__ || Object.getPrototypeOf(CreatableSelect)).call(this, props, context)); - - _this.filterOptions = _this.filterOptions.bind(_this); - _this.menuRenderer = _this.menuRenderer.bind(_this); - _this.onInputKeyDown = _this.onInputKeyDown.bind(_this); - _this.onInputChange = _this.onInputChange.bind(_this); - _this.onOptionSelect = _this.onOptionSelect.bind(_this); - return _this; - } - - createClass(CreatableSelect, [{ - key: 'createNewOption', - value: function createNewOption() { - var _props = this.props, - isValidNewOption = _props.isValidNewOption, - newOptionCreator = _props.newOptionCreator, - onNewOptionClick = _props.onNewOptionClick, - _props$options = _props.options, - options = _props$options === undefined ? [] : _props$options; - - - if (isValidNewOption({ label: this.inputValue })) { - var option = newOptionCreator({ label: this.inputValue, labelKey: this.labelKey, valueKey: this.valueKey }); - var _isOptionUnique = this.isOptionUnique({ option: option }); - - // Don't add the same option twice. - if (_isOptionUnique) { - if (onNewOptionClick) { - onNewOptionClick(option); - } else { - options.unshift(option); - - this.select.selectValue(option); - } - } - } - } - }, { - key: 'filterOptions', - value: function filterOptions$$1() { - var _props2 = this.props, - filterOptions$$1 = _props2.filterOptions, - isValidNewOption = _props2.isValidNewOption, - promptTextCreator = _props2.promptTextCreator; - - // TRICKY Check currently selected options as well. - // Don't display a create-prompt for a value that's selected. - // This covers async edge-cases where a newly-created Option isn't yet in the async-loaded array. - - var excludeOptions = (arguments.length <= 2 ? undefined : arguments[2]) || []; - - var filteredOptions = filterOptions$$1.apply(undefined, arguments) || []; - - if (isValidNewOption({ label: this.inputValue })) { - var _newOptionCreator = this.props.newOptionCreator; - - - var option = _newOptionCreator({ - label: this.inputValue, - labelKey: this.labelKey, - valueKey: this.valueKey - }); - - // TRICKY Compare to all options (not just filtered options) in case option has already been selected). - // For multi-selects, this would remove it from the filtered list. - var _isOptionUnique2 = this.isOptionUnique({ - option: option, - options: excludeOptions.concat(filteredOptions) - }); - - if (_isOptionUnique2) { - var prompt = promptTextCreator(this.inputValue); - - this._createPlaceholderOption = _newOptionCreator({ - label: prompt, - labelKey: this.labelKey, - valueKey: this.valueKey - }); - - filteredOptions.unshift(this._createPlaceholderOption); - } - } - - return filteredOptions; - } - }, { - key: 'isOptionUnique', - value: function isOptionUnique(_ref) { - var option = _ref.option, - options = _ref.options; - var isOptionUnique = this.props.isOptionUnique; - - - options = options || this.props.options; - - return isOptionUnique({ - labelKey: this.labelKey, - option: option, - options: options, - valueKey: this.valueKey - }); - } - }, { - key: 'menuRenderer', - value: function menuRenderer$$1(params) { - var menuRenderer$$1 = this.props.menuRenderer; - - - return menuRenderer$$1(_extends({}, params, { - onSelect: this.onOptionSelect, - selectValue: this.onOptionSelect - })); - } - }, { - key: 'onInputChange', - value: function onInputChange(input) { - var onInputChange = this.props.onInputChange; - - // This value may be needed in between Select mounts (when this.select is null) - - this.inputValue = input; - - if (onInputChange) { - this.inputValue = onInputChange(input); - } - - return this.inputValue; - } - }, { - key: 'onInputKeyDown', - value: function onInputKeyDown(event) { - var _props3 = this.props, - shouldKeyDownEventCreateNewOption = _props3.shouldKeyDownEventCreateNewOption, - onInputKeyDown = _props3.onInputKeyDown; - - var focusedOption = this.select.getFocusedOption(); - - if (focusedOption && focusedOption === this._createPlaceholderOption && shouldKeyDownEventCreateNewOption({ keyCode: event.keyCode })) { - this.createNewOption(); - - // Prevent decorated Select from doing anything additional with this keyDown event - event.preventDefault(); - } else if (onInputKeyDown) { - onInputKeyDown(event); - } - } - }, { - key: 'onOptionSelect', - value: function onOptionSelect(option, event) { - if (option === this._createPlaceholderOption) { - this.createNewOption(); - } else { - this.select.selectValue(option); - } - } - }, { - key: 'focus', - value: function focus() { - this.select.focus(); - } - }, { - key: 'render', - value: function render() { - var _this2 = this; - - var _props4 = this.props, - newOptionCreator = _props4.newOptionCreator, - shouldKeyDownEventCreateNewOption = _props4.shouldKeyDownEventCreateNewOption, - refProp = _props4.ref, - restProps = objectWithoutProperties(_props4, ['newOptionCreator', 'shouldKeyDownEventCreateNewOption', 'ref']); - var children = this.props.children; - - // We can't use destructuring default values to set the children, - // because it won't apply work if `children` is null. A falsy check is - // more reliable in real world use-cases. - - if (!children) { - children = defaultChildren$2; - } - - var props = _extends({}, restProps, { - allowCreate: true, - filterOptions: this.filterOptions, - menuRenderer: this.menuRenderer, - onInputChange: this.onInputChange, - onInputKeyDown: this.onInputKeyDown, - ref: function ref(_ref2) { - _this2.select = _ref2; - - // These values may be needed in between Select mounts (when this.select is null) - if (_ref2) { - _this2.labelKey = _ref2.props.labelKey; - _this2.valueKey = _ref2.props.valueKey; - } - if (refProp) { - refProp(_ref2); - } - } - }); - - return children(props); - } - }]); - return CreatableSelect; -}(__WEBPACK_IMPORTED_MODULE_0_react___default.a.Component); - - - -function defaultChildren$2(props) { - return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(Select$1, props); -} - -function isOptionUnique(_ref3) { - var option = _ref3.option, - options = _ref3.options, - labelKey = _ref3.labelKey, - valueKey = _ref3.valueKey; - - return options.filter(function (existingOption) { - return existingOption[labelKey] === option[labelKey] || existingOption[valueKey] === option[valueKey]; - }).length === 0; -} - -function isValidNewOption(_ref4) { - var label = _ref4.label; - - return !!label; -} - -function newOptionCreator(_ref5) { - var label = _ref5.label, - labelKey = _ref5.labelKey, - valueKey = _ref5.valueKey; - - var option = {}; - option[valueKey] = label; - option[labelKey] = label; - option.className = 'Select-create-option-placeholder'; - return option; -} - -function promptTextCreator(label) { - return 'Create option "' + label + '"'; -} - -function shouldKeyDownEventCreateNewOption(_ref6) { - var keyCode = _ref6.keyCode; - - switch (keyCode) { - case 9: // TAB - case 13: // ENTER - case 188: - // COMMA - return true; - default: - return false; - } -} - -// Default prop methods -CreatableSelect.isOptionUnique = isOptionUnique; -CreatableSelect.isValidNewOption = isValidNewOption; -CreatableSelect.newOptionCreator = newOptionCreator; -CreatableSelect.promptTextCreator = promptTextCreator; -CreatableSelect.shouldKeyDownEventCreateNewOption = shouldKeyDownEventCreateNewOption; - -CreatableSelect.defaultProps = { - filterOptions: filterOptions, - isOptionUnique: isOptionUnique, - isValidNewOption: isValidNewOption, - menuRenderer: menuRenderer, - newOptionCreator: newOptionCreator, - promptTextCreator: promptTextCreator, - shouldKeyDownEventCreateNewOption: shouldKeyDownEventCreateNewOption -}; - -CreatableSelect.propTypes = { - // Child function responsible for creating the inner Select component - // This component can be used to compose HOCs (eg Creatable and Async) - // (props: Object): PropTypes.element - children: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, - - // See Select.propTypes.filterOptions - filterOptions: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.any, - - // Searches for any matching option within the set of options. - // This function prevents duplicate options from being created. - // ({ option: Object, options: Array, labelKey: string, valueKey: string }): boolean - isOptionUnique: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, - - // Determines if the current input text represents a valid option. - // ({ label: string }): boolean - isValidNewOption: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, - - // See Select.propTypes.menuRenderer - menuRenderer: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.any, - - // Factory to create new option. - // ({ label: string, labelKey: string, valueKey: string }): Object - newOptionCreator: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, - - // input change handler: function (inputValue) {} - onInputChange: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, - - // input keyDown handler: function (event) {} - onInputKeyDown: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, - - // new option click handler: function (option) {} - onNewOptionClick: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, - - // See Select.propTypes.options - options: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.array, - - // Creates prompt/placeholder option text. - // (filterText: string): string - promptTextCreator: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, - - ref: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, - - // Decides if a keyDown event (eg its `keyCode`) should result in the creation of a new option. - shouldKeyDownEventCreateNewOption: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func -}; - -var AsyncCreatableSelect = function (_React$Component) { - inherits(AsyncCreatableSelect, _React$Component); - - function AsyncCreatableSelect() { - classCallCheck(this, AsyncCreatableSelect); - return possibleConstructorReturn(this, (AsyncCreatableSelect.__proto__ || Object.getPrototypeOf(AsyncCreatableSelect)).apply(this, arguments)); - } - - createClass(AsyncCreatableSelect, [{ - key: 'focus', - value: function focus() { - this.select.focus(); - } - }, { - key: 'render', - value: function render() { - var _this2 = this; - - return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement( - Async, - this.props, - function (_ref) { - var ref = _ref.ref, - asyncProps = objectWithoutProperties(_ref, ['ref']); - - var asyncRef = ref; - return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement( - CreatableSelect, - asyncProps, - function (_ref2) { - var ref = _ref2.ref, - creatableProps = objectWithoutProperties(_ref2, ['ref']); - - var creatableRef = ref; - return _this2.props.children(_extends({}, creatableProps, { - ref: function ref(select) { - creatableRef(select); - asyncRef(select); - _this2.select = select; - } - })); - } - ); - } - ); - } - }]); - return AsyncCreatableSelect; -}(__WEBPACK_IMPORTED_MODULE_0_react___default.a.Component); - - - -function defaultChildren$1(props) { - return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(Select$1, props); -} - -AsyncCreatableSelect.propTypes = { - children: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func.isRequired // Child function responsible for creating the inner Select component; (props: Object): PropTypes.element -}; - -AsyncCreatableSelect.defaultProps = { - children: defaultChildren$1 -}; - -Select$1.Async = Async; -Select$1.AsyncCreatable = AsyncCreatableSelect; -Select$1.Creatable = CreatableSelect; -Select$1.Value = Value; -Select$1.Option = Option; - - -/* harmony default export */ __webpack_exports__["default"] = (Select$1); - - -/***/ }), -/* 195 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/** - * Copyright (c) 2013-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - - - -var emptyFunction = __webpack_require__(7); -var invariant = __webpack_require__(0); -var ReactPropTypesSecret = __webpack_require__(33); - -module.exports = function() { - function shim(props, propName, componentName, location, propFullName, secret) { - if (secret === ReactPropTypesSecret) { - // It is still safe when called from React. - return; - } - invariant( - false, - 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' + - 'Use PropTypes.checkPropTypes() to call them. ' + - 'Read more at http://fb.me/use-check-prop-types' - ); - }; - shim.isRequired = shim; - function getShim() { - return shim; - }; - // Important! - // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`. - var ReactPropTypes = { - array: shim, - bool: shim, - func: shim, - number: shim, - object: shim, - string: shim, - symbol: shim, - - any: shim, - arrayOf: getShim, - element: shim, - instanceOf: getShim, - node: shim, - objectOf: getShim, - oneOf: getShim, - oneOfType: getShim, - shape: getShim, - exact: getShim - }; - - ReactPropTypes.checkPropTypes = emptyFunction; - ReactPropTypes.PropTypes = ReactPropTypes; - - return ReactPropTypes; -}; - - -/***/ }), -/* 196 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; - -var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - -var _react = __webpack_require__(19); - -var _react2 = _interopRequireDefault(_react); - -var _propTypes = __webpack_require__(84); - -var _propTypes2 = _interopRequireDefault(_propTypes); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } - -var sizerStyle = { - position: 'absolute', - top: 0, - left: 0, - visibility: 'hidden', - height: 0, - overflow: 'scroll', - whiteSpace: 'pre' -}; - -var INPUT_PROPS_BLACKLIST = ['injectStyles', 'inputClassName', 'inputRef', 'inputStyle', 'minWidth', 'onAutosize', 'placeholderIsMinWidth']; - -var cleanInputProps = function cleanInputProps(inputProps) { - INPUT_PROPS_BLACKLIST.forEach(function (field) { - return delete inputProps[field]; - }); - return inputProps; -}; - -var copyStyles = function copyStyles(styles, node) { - node.style.fontSize = styles.fontSize; - node.style.fontFamily = styles.fontFamily; - node.style.fontWeight = styles.fontWeight; - node.style.fontStyle = styles.fontStyle; - node.style.letterSpacing = styles.letterSpacing; - node.style.textTransform = styles.textTransform; -}; - -var isIE = typeof window === 'undefined' ? false : /MSIE |Trident\/|Edge\//.test(window.navigator.userAgent); - -var generateId = function generateId() { - // we only need an auto-generated ID for stylesheet injection, which is only - // used for IE. so if the browser is not IE, this should return undefined. - return isIE ? '_' + Math.random().toString(36).substr(2, 12) : undefined; -}; - -var AutosizeInput = function (_Component) { - _inherits(AutosizeInput, _Component); - - function AutosizeInput(props) { - _classCallCheck(this, AutosizeInput); - - var _this = _possibleConstructorReturn(this, (AutosizeInput.__proto__ || Object.getPrototypeOf(AutosizeInput)).call(this, props)); - - _this.inputRef = function (el) { - _this.input = el; - if (typeof _this.props.inputRef === 'function') { - _this.props.inputRef(el); - } - }; - - _this.placeHolderSizerRef = function (el) { - _this.placeHolderSizer = el; - }; - - _this.sizerRef = function (el) { - _this.sizer = el; - }; - - _this.state = { - inputWidth: props.minWidth, - inputId: props.id || generateId() - }; - return _this; - } - - _createClass(AutosizeInput, [{ - key: 'componentDidMount', - value: function componentDidMount() { - this.mounted = true; - this.copyInputStyles(); - this.updateInputWidth(); - } - }, { - key: 'componentWillReceiveProps', - value: function componentWillReceiveProps(nextProps) { - var id = nextProps.id; - - if (id !== this.props.id) { - this.setState({ inputId: id || generateId() }); - } - } - }, { - key: 'componentDidUpdate', - value: function componentDidUpdate(prevProps, prevState) { - if (prevState.inputWidth !== this.state.inputWidth) { - if (typeof this.props.onAutosize === 'function') { - this.props.onAutosize(this.state.inputWidth); - } - } - this.updateInputWidth(); - } - }, { - key: 'componentWillUnmount', - value: function componentWillUnmount() { - this.mounted = false; - } - }, { - key: 'copyInputStyles', - value: function copyInputStyles() { - if (!this.mounted || !window.getComputedStyle) { - return; - } - var inputStyles = this.input && window.getComputedStyle(this.input); - if (!inputStyles) { - return; - } - copyStyles(inputStyles, this.sizer); - if (this.placeHolderSizer) { - copyStyles(inputStyles, this.placeHolderSizer); - } - } - }, { - key: 'updateInputWidth', - value: function updateInputWidth() { - if (!this.mounted || !this.sizer || typeof this.sizer.scrollWidth === 'undefined') { - return; - } - var newInputWidth = void 0; - if (this.props.placeholder && (!this.props.value || this.props.value && this.props.placeholderIsMinWidth)) { - newInputWidth = Math.max(this.sizer.scrollWidth, this.placeHolderSizer.scrollWidth) + 2; - } else { - newInputWidth = this.sizer.scrollWidth + 2; - } - // allow for stepper UI on number types - if (this.props.type === 'number') { - newInputWidth += 16; - } - if (newInputWidth < this.props.minWidth) { - newInputWidth = this.props.minWidth; - } - if (newInputWidth !== this.state.inputWidth) { - this.setState({ - inputWidth: newInputWidth - }); - } - } - }, { - key: 'getInput', - value: function getInput() { - return this.input; - } - }, { - key: 'focus', - value: function focus() { - this.input.focus(); - } - }, { - key: 'blur', - value: function blur() { - this.input.blur(); - } - }, { - key: 'select', - value: function select() { - this.input.select(); - } - }, { - key: 'renderStyles', - value: function renderStyles() { - // this method injects styles to hide IE's clear indicator, which messes - // with input size detection. the stylesheet is only injected when the - // browser is IE, and can also be disabled by the `injectStyles` prop. - var injectStyles = this.props.injectStyles; - - return isIE && injectStyles ? _react2.default.createElement('style', { dangerouslySetInnerHTML: { - __html: 'input#' + this.state.inputId + '::-ms-clear {display: none;}' - } }) : null; - } - }, { - key: 'render', - value: function render() { - var sizerValue = [this.props.defaultValue, this.props.value, ''].reduce(function (previousValue, currentValue) { - if (previousValue !== null && previousValue !== undefined) { - return previousValue; - } - return currentValue; - }); - - var wrapperStyle = _extends({}, this.props.style); - if (!wrapperStyle.display) wrapperStyle.display = 'inline-block'; - - var inputStyle = _extends({ - boxSizing: 'content-box', - width: this.state.inputWidth + 'px' - }, this.props.inputStyle); - - var inputProps = _objectWithoutProperties(this.props, []); - - cleanInputProps(inputProps); - inputProps.className = this.props.inputClassName; - inputProps.id = this.state.inputId; - inputProps.style = inputStyle; - - return _react2.default.createElement( - 'div', - { className: this.props.className, style: wrapperStyle }, - this.renderStyles(), - _react2.default.createElement('input', _extends({}, inputProps, { ref: this.inputRef })), - _react2.default.createElement( - 'div', - { ref: this.sizerRef, style: sizerStyle }, - sizerValue - ), - this.props.placeholder ? _react2.default.createElement( - 'div', - { ref: this.placeHolderSizerRef, style: sizerStyle }, - this.props.placeholder - ) : null - ); - } - }]); - - return AutosizeInput; -}(_react.Component); - -; - -AutosizeInput.propTypes = { - className: _propTypes2.default.string, // className for the outer element - defaultValue: _propTypes2.default.any, // default field value - id: _propTypes2.default.string, // id to use for the input, can be set for consistent snapshots - injectStyles: _propTypes2.default.bool, // inject the custom stylesheet to hide clear UI, defaults to true - inputClassName: _propTypes2.default.string, // className for the input element - inputRef: _propTypes2.default.func, // ref callback for the input element - inputStyle: _propTypes2.default.object, // css styles for the input element - minWidth: _propTypes2.default.oneOfType([// minimum width for input element - _propTypes2.default.number, _propTypes2.default.string]), - onAutosize: _propTypes2.default.func, // onAutosize handler: function(newWidth) {} - onChange: _propTypes2.default.func, // onChange handler: function(newValue) {} - placeholder: _propTypes2.default.string, // placeholder text - placeholderIsMinWidth: _propTypes2.default.bool, // don't collapse size to less than the placeholder - style: _propTypes2.default.object, // css styles for the outer element - value: _propTypes2.default.any // field value -}; -AutosizeInput.defaultProps = { - minWidth: 1, - injectStyles: true -}; - -exports.default = AutosizeInput; - -/***/ }), -/* 197 */ -/***/ (function(module, exports, __webpack_require__) { - -var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! - Copyright (c) 2016 Jed Watson. - Licensed under the MIT License (MIT), see - http://jedwatson.github.io/classnames -*/ -/* global define */ - -(function () { - 'use strict'; - - var hasOwn = {}.hasOwnProperty; - - function classNames () { - var classes = []; - - for (var i = 0; i < arguments.length; i++) { - var arg = arguments[i]; - if (!arg) continue; - - var argType = typeof arg; - - if (argType === 'string' || argType === 'number') { - classes.push(arg); - } else if (Array.isArray(arg)) { - classes.push(classNames.apply(null, arg)); - } else if (argType === 'object') { - for (var key in arg) { - if (hasOwn.call(arg, key) && arg[key]) { - classes.push(key); - } - } - } - } - - return classes.join(' '); - } - - if (typeof module !== 'undefined' && module.exports) { - module.exports = classNames; - } else if (true) { - // register as 'classnames', consistent with npm package name - !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function () { - return classNames; - }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), - __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); - } else { - window.classNames = classNames; - } -}()); - - -/***/ }), -/* 198 */ -/***/ (function(module, exports) { - -module.exports = require("electron"); - -/***/ }), -/* 199 */ -/***/ (function(module, exports) { - -module.exports = ["Upsorbing the Contents","Additive Parsing the Load","Commence Monosaturated Goodening","Kick Off the Multi-Core Widening","Bastening the Game Turkey","Abstracting the Rummage Disc","Undecerealenizing the Process","Postrefragmenting the Widget Layer","Satisfying the Constraints","Abnoramalzing Some of the Matrices","Optimizing the People","Proclaigerizing the Network"] - -/***/ }), -/* 200 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _react = __webpack_require__(19); - -var _react2 = _interopRequireDefault(_react); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -const Progress = ({ percent = 0 }) => _react2.default.createElement( - "div", - { className: "progress" }, - _react2.default.createElement( - "div", - { className: "progress-bar" }, - _react2.default.createElement("div", { className: "complete", style: { width: `${percent}%` } }) - ) -); - -exports.default = Progress; -module.exports = exports["default"]; - -/***/ }) -/******/ ]); \ No newline at end of file +var O=function(e){return"string"==typeof e?e:null!==e&&JSON.stringify(e)||""},P=a.a.oneOfType([a.a.string,a.a.node]),F=a.a.oneOfType([a.a.string,a.a.number]),D=1,A=function(e){function t(e){b(this,t);var n=S(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return["clearValue","focusOption","handleInputBlur","handleInputChange","handleInputFocus","handleInputValueChange","handleKeyDown","handleMenuScroll","handleMouseDown","handleMouseDownOnArrow","handleMouseDownOnMenu","handleRequired","handleTouchOutside","handleTouchMove","handleTouchStart","handleTouchEnd","handleTouchEndClearValue","handleValueClick","getOptionLabel","onOptionRef","removeValue","selectValue"].forEach(function(e){return n[e]=n[e].bind(n)}),n.state={inputValue:"",isFocused:!1,isOpen:!1,isPseudoFocused:!1,required:!1},n}return k(t,e),E(t,[{key:"componentWillMount",value:function(){this._instancePrefix="react-select-"+(this.props.instanceId||++D)+"-";var e=this.getValueArray(this.props.value);this.props.required&&this.setState({required:this.handleRequired(e[0],this.props.multi)})}},{key:"componentDidMount",value:function(){void 0!==this.props.autofocus&&"undefined"!=typeof console&&console.warn("Warning: The autofocus prop has changed to autoFocus, support will be removed after react-select@1.0"),(this.props.autoFocus||this.props.autofocus)&&this.focus()}},{key:"componentWillReceiveProps",value:function(e){var t=this.getValueArray(e.value,e);e.required?this.setState({required:this.handleRequired(t[0],e.multi)}):this.props.required&&this.setState({required:!1})}},{key:"componentDidUpdate",value:function(e,t){if(this.menu&&this.focused&&this.state.isOpen&&!this.hasScrolledToOption){var n=Object(l.findDOMNode)(this.focused),r=Object(l.findDOMNode)(this.menu),o=r.scrollTop,i=o+r.offsetHeight,a=n.offsetTop,u=a+n.offsetHeight;(o>a||i<u)&&(r.scrollTop=n.offsetTop),this.hasScrolledToOption=!0}else this.state.isOpen||(this.hasScrolledToOption=!1);if(this._scrollToFocusedOptionOnUpdate&&this.focused&&this.menu){this._scrollToFocusedOptionOnUpdate=!1;var s=Object(l.findDOMNode)(this.focused),c=Object(l.findDOMNode)(this.menu),p=s.getBoundingClientRect(),f=c.getBoundingClientRect();p.bottom>f.bottom?c.scrollTop=s.offsetTop+s.clientHeight-c.offsetHeight:p.top<f.top&&(c.scrollTop=s.offsetTop)}if(this.props.scrollMenuIntoView&&this.menuContainer){var d=this.menuContainer.getBoundingClientRect();window.innerHeight<d.bottom+this.props.menuBuffer&&window.scrollBy(0,d.bottom+this.props.menuBuffer-window.innerHeight)}if(e.disabled!==this.props.disabled&&(this.setState({isFocused:!1}),this.closeMenu()),t.isOpen!==this.state.isOpen){this.toggleTouchOutsideEvent(this.state.isOpen);var h=this.state.isOpen?this.props.onOpen:this.props.onClose;h&&h()}}},{key:"componentWillUnmount",value:function(){this.toggleTouchOutsideEvent(!1)}},{key:"toggleTouchOutsideEvent",value:function(e){e?!document.addEventListener&&document.attachEvent?document.attachEvent("ontouchstart",this.handleTouchOutside):document.addEventListener("touchstart",this.handleTouchOutside):!document.removeEventListener&&document.detachEvent?document.detachEvent("ontouchstart",this.handleTouchOutside):document.removeEventListener("touchstart",this.handleTouchOutside)}},{key:"handleTouchOutside",value:function(e){this.wrapper&&!this.wrapper.contains(e.target)&&this.closeMenu()}},{key:"focus",value:function(){this.input&&this.input.focus()}},{key:"blurInput",value:function(){this.input&&this.input.blur()}},{key:"handleTouchMove",value:function(e){this.dragging=!0}},{key:"handleTouchStart",value:function(e){this.dragging=!1}},{key:"handleTouchEnd",value:function(e){this.dragging||this.handleMouseDown(e)}},{key:"handleTouchEndClearValue",value:function(e){this.dragging||this.clearValue(e)}},{key:"handleMouseDown",value:function(e){if(!(this.props.disabled||"mousedown"===e.type&&0!==e.button))if("INPUT"!==e.target.tagName){if(e.preventDefault(),!this.props.searchable)return this.focus(),this.setState({isOpen:!this.state.isOpen});if(this.state.isFocused){this.focus();var t=this.input;"function"==typeof t.getInput&&(t=t.getInput()),t.value="",this.setState({isOpen:!0,isPseudoFocused:!1})}else this._openAfterFocus=this.props.openOnClick,this.focus()}else this.state.isFocused?this.state.isOpen||this.setState({isOpen:!0,isPseudoFocused:!1}):(this._openAfterFocus=this.props.openOnClick,this.focus())}},{key:"handleMouseDownOnArrow",value:function(e){this.props.disabled||"mousedown"===e.type&&0!==e.button||(this.state.isOpen||this.setState({isOpen:!0}),e.stopPropagation(),e.preventDefault(),this.state.isOpen&&this.closeMenu())}},{key:"handleMouseDownOnMenu",value:function(e){this.props.disabled||"mousedown"===e.type&&0!==e.button||(e.stopPropagation(),e.preventDefault(),this._openAfterFocus=!0,this.focus())}},{key:"closeMenu",value:function(){this.props.onCloseResetsInput?this.setState({isOpen:!1,isPseudoFocused:this.state.isFocused&&!this.props.multi,inputValue:this.handleInputValueChange("")}):this.setState({isOpen:!1,isPseudoFocused:this.state.isFocused&&!this.props.multi}),this.hasScrolledToOption=!1}},{key:"handleInputFocus",value:function(e){if(!this.props.disabled){var t=this.state.isOpen||this._openAfterFocus||this.props.openOnFocus;this.props.onFocus&&this.props.onFocus(e),this.setState({isFocused:!0,isOpen:t}),this._openAfterFocus=!1}}},{key:"handleInputBlur",value:function(e){if(!this.menu||this.menu!==document.activeElement&&!this.menu.contains(document.activeElement)){this.props.onBlur&&this.props.onBlur(e);var t={isFocused:!1,isOpen:!1,isPseudoFocused:!1};this.props.onBlurResetsInput&&(t.inputValue=this.handleInputValueChange("")),this.setState(t)}else this.focus()}},{key:"handleInputChange",value:function(e){var t=e.target.value;this.state.inputValue!==e.target.value&&(t=this.handleInputValueChange(t)),this.setState({isOpen:!0,isPseudoFocused:!1,inputValue:t})}},{key:"handleInputValueChange",value:function(e){if(this.props.onInputChange){var t=this.props.onInputChange(e);null!=t&&"object"!==(void 0===t?"undefined":g(t))&&(e=""+t)}return e}},{key:"handleKeyDown",value:function(e){if(!(this.props.disabled||"function"==typeof this.props.onInputKeyDown&&(this.props.onInputKeyDown(e),e.defaultPrevented))){switch(e.keyCode){case 8:return void(!this.state.inputValue&&this.props.backspaceRemoves&&(e.preventDefault(),this.popValue()));case 9:if(e.shiftKey||!this.state.isOpen||!this.props.tabSelectsValue)return;return e.preventDefault(),void this.selectFocusedOption();case 13:return e.preventDefault(),e.stopPropagation(),void(this.state.isOpen?this.selectFocusedOption():this.focusNextOption());case 27:this.state.isOpen?(this.closeMenu(),e.stopPropagation()):this.props.clearable&&this.props.escapeClearsValue&&(this.clearValue(e),e.stopPropagation());break;case 32:if(this.props.searchable)return;if(e.preventDefault(),!this.state.isOpen)return void this.focusNextOption();e.stopPropagation(),this.selectFocusedOption();break;case 38:this.focusPreviousOption();break;case 40:this.focusNextOption();break;case 33:this.focusPageUpOption();break;case 34:this.focusPageDownOption();break;case 35:if(e.shiftKey)return;this.focusEndOption();break;case 36:if(e.shiftKey)return;this.focusStartOption();break;case 46:return void(!this.state.inputValue&&this.props.deleteRemoves&&(e.preventDefault(),this.popValue()));default:return}e.preventDefault()}}},{key:"handleValueClick",value:function(e,t){this.props.onValueClick&&this.props.onValueClick(e,t)}},{key:"handleMenuScroll",value:function(e){if(this.props.onMenuScrollToBottom){var t=e.target;t.scrollHeight>t.offsetHeight&&t.scrollHeight-t.offsetHeight-t.scrollTop<=0&&this.props.onMenuScrollToBottom()}}},{key:"handleRequired",value:function(e,t){return!e||(t?0===e.length:0===Object.keys(e).length)}},{key:"getOptionLabel",value:function(e){return e[this.props.labelKey]}},{key:"getValueArray",value:function(e,t){var n=this,r="object"===(void 0===t?"undefined":g(t))?t:this.props;if(r.multi){if("string"==typeof e&&(e=e.split(r.delimiter)),!Array.isArray(e)){if(null==e)return[];e=[e]}return e.map(function(e){return n.expandValue(e,r)}).filter(function(e){return e})}var o=this.expandValue(e,r);return o?[o]:[]}},{key:"expandValue",value:function(e,t){var n=void 0===e?"undefined":g(e);if("string"!==n&&"number"!==n&&"boolean"!==n)return e;var r=t.options,o=t.valueKey;if(r)for(var i=0;i<r.length;i++)if(String(r[i][o])===String(e))return r[i]}},{key:"setValue",value:function(e){var t=this;if(this.props.autoBlur&&this.blurInput(),this.props.required){var n=this.handleRequired(e,this.props.multi);this.setState({required:n})}this.props.onChange&&(this.props.simpleValue&&e&&(e=this.props.multi?e.map(function(e){return e[t.props.valueKey]}).join(this.props.delimiter):e[this.props.valueKey]),this.props.onChange(e))}},{key:"selectValue",value:function(e){var t=this;if(this.props.closeOnSelect&&(this.hasScrolledToOption=!1),this.props.multi){var n=this.props.onSelectResetsInput?"":this.state.inputValue;this.setState({focusedIndex:null,inputValue:this.handleInputValueChange(n),isOpen:!this.props.closeOnSelect},function(){t.getValueArray(t.props.value).some(function(n){return n[t.props.valueKey]===e[t.props.valueKey]})?t.removeValue(e):t.addValue(e)})}else this.setState({inputValue:this.handleInputValueChange(""),isOpen:!this.props.closeOnSelect,isPseudoFocused:this.state.isFocused},function(){t.setValue(e)})}},{key:"addValue",value:function(e){var t=this.getValueArray(this.props.value),n=this._visibleOptions.filter(function(e){return!e.disabled}),r=n.indexOf(e);this.setValue(t.concat(e)),n.length-1===r?this.focusOption(n[r-1]):n.length>r&&this.focusOption(n[r+1])}},{key:"popValue",value:function(){var e=this.getValueArray(this.props.value);e.length&&!1!==e[e.length-1].clearableValue&&this.setValue(this.props.multi?e.slice(0,e.length-1):null)}},{key:"removeValue",value:function(e){var t=this,n=this.getValueArray(this.props.value);this.setValue(n.filter(function(n){return n[t.props.valueKey]!==e[t.props.valueKey]})),this.focus()}},{key:"clearValue",value:function(e){e&&"mousedown"===e.type&&0!==e.button||(e.preventDefault(),this.setValue(this.getResetValue()),this.setState({isOpen:!1,inputValue:this.handleInputValueChange("")},this.focus))}},{key:"getResetValue",value:function(){return void 0!==this.props.resetValue?this.props.resetValue:this.props.multi?[]:null}},{key:"focusOption",value:function(e){this.setState({focusedOption:e})}},{key:"focusNextOption",value:function(){this.focusAdjacentOption("next")}},{key:"focusPreviousOption",value:function(){this.focusAdjacentOption("previous")}},{key:"focusPageUpOption",value:function(){this.focusAdjacentOption("page_up")}},{key:"focusPageDownOption",value:function(){this.focusAdjacentOption("page_down")}},{key:"focusStartOption",value:function(){this.focusAdjacentOption("start")}},{key:"focusEndOption",value:function(){this.focusAdjacentOption("end")}},{key:"focusAdjacentOption",value:function(e){var t=this._visibleOptions.map(function(e,t){return{option:e,index:t}}).filter(function(e){return!e.option.disabled});if(this._scrollToFocusedOptionOnUpdate=!0,this.state.isOpen){if(t.length){for(var n=-1,r=0;r<t.length;r++)if(this._focusedOption===t[r].option){n=r;break}if("next"===e&&-1!==n)n=(n+1)%t.length;else if("previous"===e)n>0?n-=1:n=t.length-1;else if("start"===e)n=0;else if("end"===e)n=t.length-1;else if("page_up"===e){n=(o=n-this.props.pageSize)<0?0:o}else if("page_down"===e){var o;n=(o=n+this.props.pageSize)>t.length-1?t.length-1:o}-1===n&&(n=0),this.setState({focusedIndex:t[n].index,focusedOption:t[n].option})}}else this.setState({isOpen:!0,inputValue:"",focusedOption:this._focusedOption||(t.length?t["next"===e?0:t.length-1].option:null)})}},{key:"getFocusedOption",value:function(){return this._focusedOption}},{key:"selectFocusedOption",value:function(){if(this._focusedOption)return this.selectValue(this._focusedOption)}},{key:"renderLoading",value:function(){if(this.props.isLoading)return o.a.createElement("span",{className:"Select-loading-zone","aria-hidden":"true"},o.a.createElement("span",{className:"Select-loading"}))}},{key:"renderValue",value:function(e,t){var n=this,r=this.props.valueRenderer||this.getOptionLabel,i=this.props.valueComponent;if(!e.length)return this.state.inputValue?null:o.a.createElement("div",{className:"Select-placeholder"},this.props.placeholder);var a=this.props.onValueClick?this.handleValueClick:null;return this.props.multi?e.map(function(e,t){return o.a.createElement(i,{id:n._instancePrefix+"-value-"+t,instancePrefix:n._instancePrefix,disabled:n.props.disabled||!1===e.clearableValue,key:"value-"+t+"-"+e[n.props.valueKey],onClick:a,onRemove:n.removeValue,value:e},r(e,t),o.a.createElement("span",{className:"Select-aria-only"}," "))}):this.state.inputValue?void 0:(t&&(a=null),o.a.createElement(i,{id:this._instancePrefix+"-value-item",disabled:this.props.disabled,instancePrefix:this._instancePrefix,onClick:a,value:e[0]},r(e[0])))}},{key:"renderInput",value:function(e,t){var n,r=this,i=p()("Select-input",this.props.inputProps.className),a=!!this.state.isOpen,l=p()((x(n={},this._instancePrefix+"-list",a),x(n,this._instancePrefix+"-backspace-remove-message",this.props.multi&&!this.props.disabled&&this.state.isFocused&&!this.state.inputValue),n)),u=w({},this.props.inputProps,{role:"combobox","aria-expanded":""+a,"aria-owns":l,"aria-haspopup":""+a,"aria-activedescendant":a?this._instancePrefix+"-option-"+t:this._instancePrefix+"-value","aria-describedby":this.props["aria-describedby"],"aria-labelledby":this.props["aria-labelledby"],"aria-label":this.props["aria-label"],className:i,tabIndex:this.props.tabIndex,onBlur:this.handleInputBlur,onChange:this.handleInputChange,onFocus:this.handleInputFocus,ref:function(e){return r.input=e},required:this.state.required,value:this.state.inputValue});if(this.props.inputRenderer)return this.props.inputRenderer(u);if(this.props.disabled||!this.props.searchable){var c=this.props.inputProps,f=(c.inputClassName,C(c,["inputClassName"])),d=p()(x({},this._instancePrefix+"-list",a));return o.a.createElement("div",w({},f,{role:"combobox","aria-expanded":a,"aria-owns":d,"aria-activedescendant":a?this._instancePrefix+"-option-"+t:this._instancePrefix+"-value","aria-labelledby":this.props["aria-labelledby"],"aria-label":this.props["aria-label"],className:i,tabIndex:this.props.tabIndex||0,onBlur:this.handleInputBlur,onFocus:this.handleInputFocus,ref:function(e){return r.input=e},"aria-disabled":""+!!this.props.disabled,style:{border:0,width:1,display:"inline-block"}}))}return this.props.autosize?o.a.createElement(s.a,w({id:this.props.id},u,{minWidth:"5"})):o.a.createElement("div",{className:i,key:"input-wrap"},o.a.createElement("input",w({id:this.props.id},u)))}},{key:"renderClear",value:function(){var e=this.getValueArray(this.props.value);if(this.props.clearable&&e.length&&!this.props.disabled&&!this.props.isLoading){var t=this.props.clearRenderer();return o.a.createElement("span",{className:"Select-clear-zone",title:this.props.multi?this.props.clearAllText:this.props.clearValueText,"aria-label":this.props.multi?this.props.clearAllText:this.props.clearValueText,onMouseDown:this.clearValue,onTouchStart:this.handleTouchStart,onTouchMove:this.handleTouchMove,onTouchEnd:this.handleTouchEndClearValue},t)}}},{key:"renderArrow",value:function(){if(this.props.arrowRenderer){var e=this.handleMouseDownOnArrow,t=this.state.isOpen,n=this.props.arrowRenderer({onMouseDown:e,isOpen:t});return n?o.a.createElement("span",{className:"Select-arrow-zone",onMouseDown:e},n):null}}},{key:"filterOptions",value:function(e){var t=this.state.inputValue,n=this.props.options||[];if(this.props.filterOptions){var r="function"==typeof this.props.filterOptions?this.props.filterOptions:m;return r(n,t,e,{filterOption:this.props.filterOption,ignoreAccents:this.props.ignoreAccents,ignoreCase:this.props.ignoreCase,labelKey:this.props.labelKey,matchPos:this.props.matchPos,matchProp:this.props.matchProp,valueKey:this.props.valueKey,trimFilter:this.props.trimFilter})}return n}},{key:"onOptionRef",value:function(e,t){t&&(this.focused=e)}},{key:"renderMenu",value:function(e,t,n){return e&&e.length?this.props.menuRenderer({focusedOption:n,focusOption:this.focusOption,inputValue:this.state.inputValue,instancePrefix:this._instancePrefix,labelKey:this.props.labelKey,onFocus:this.focusOption,onSelect:this.selectValue,optionClassName:this.props.optionClassName,optionComponent:this.props.optionComponent,optionRenderer:this.props.optionRenderer||this.getOptionLabel,options:e,selectValue:this.selectValue,removeValue:this.removeValue,valueArray:t,valueKey:this.props.valueKey,onOptionRef:this.onOptionRef}):this.props.noResultsText?o.a.createElement("div",{className:"Select-noresults"},this.props.noResultsText):null}},{key:"renderHiddenField",value:function(e){var t=this;if(this.props.name){if(this.props.joinValues){var n=e.map(function(e){return O(e[t.props.valueKey])}).join(this.props.delimiter);return o.a.createElement("input",{type:"hidden",ref:function(e){return t.value=e},name:this.props.name,value:n,disabled:this.props.disabled})}return e.map(function(e,n){return o.a.createElement("input",{key:"hidden."+n,type:"hidden",ref:"value"+n,name:t.props.name,value:O(e[t.props.valueKey]),disabled:t.props.disabled})})}}},{key:"getFocusableOptionIndex",value:function(e){var t=this._visibleOptions;if(!t.length)return null;var n=this.props.valueKey,r=this.state.focusedOption||e;if(r&&!r.disabled){var o=-1;if(t.some(function(e,t){var i=e[n]===r[n];return i&&(o=t),i}),-1!==o)return o}for(var i=0;i<t.length;i++)if(!t[i].disabled)return i;return null}},{key:"renderOuter",value:function(e,t,n){var r=this,i=this.renderMenu(e,t,n);return i?o.a.createElement("div",{ref:function(e){return r.menuContainer=e},className:"Select-menu-outer",style:this.props.menuContainerStyle},o.a.createElement("div",{ref:function(e){return r.menu=e},role:"listbox",tabIndex:-1,className:"Select-menu",id:this._instancePrefix+"-list",style:this.props.menuStyle,onScroll:this.handleMenuScroll,onMouseDown:this.handleMouseDownOnMenu},i)):null}},{key:"render",value:function(){var e=this,t=this.getValueArray(this.props.value),n=this._visibleOptions=this.filterOptions(this.props.multi&&this.props.removeSelected?t:null),r=this.state.isOpen;this.props.multi&&!n.length&&t.length&&!this.state.inputValue&&(r=!1);var i=this.getFocusableOptionIndex(t[0]),a=null;a=this._focusedOption=null!==i?n[i]:null;var l=p()("Select",this.props.className,{"Select--multi":this.props.multi,"Select--single":!this.props.multi,"is-clearable":this.props.clearable,"is-disabled":this.props.disabled,"is-focused":this.state.isFocused,"is-loading":this.props.isLoading,"is-open":r,"is-pseudo-focused":this.state.isPseudoFocused,"is-searchable":this.props.searchable,"has-value":t.length,"Select--rtl":this.props.rtl}),u=null;return this.props.multi&&!this.props.disabled&&t.length&&!this.state.inputValue&&this.state.isFocused&&this.props.backspaceRemoves&&(u=o.a.createElement("span",{id:this._instancePrefix+"-backspace-remove-message",className:"Select-aria-only","aria-live":"assertive"},this.props.backspaceToRemoveMessage.replace("{label}",t[t.length-1][this.props.labelKey]))),o.a.createElement("div",{ref:function(t){return e.wrapper=t},className:l,style:this.props.wrapperStyle},this.renderHiddenField(t),o.a.createElement("div",{ref:function(t){return e.control=t},className:"Select-control",style:this.props.style,onKeyDown:this.handleKeyDown,onMouseDown:this.handleMouseDown,onTouchEnd:this.handleTouchEnd,onTouchStart:this.handleTouchStart,onTouchMove:this.handleTouchMove},o.a.createElement("span",{className:"Select-multi-value-wrapper",id:this._instancePrefix+"-value"},this.renderValue(t,r),this.renderInput(t,i)),u,this.renderLoading(),this.renderClear(),this.renderArrow()),r?this.renderOuter(n,t,a):null)}}]),t}(o.a.Component);A.propTypes={"aria-describedby":a.a.string,"aria-label":a.a.string,"aria-labelledby":a.a.string,arrowRenderer:a.a.func,autoBlur:a.a.bool,autoFocus:a.a.bool,autofocus:a.a.bool,autosize:a.a.bool,backspaceRemoves:a.a.bool,backspaceToRemoveMessage:a.a.string,className:a.a.string,clearAllText:P,clearRenderer:a.a.func,clearValueText:P,clearable:a.a.bool,closeOnSelect:a.a.bool,deleteRemoves:a.a.bool,delimiter:a.a.string,disabled:a.a.bool,escapeClearsValue:a.a.bool,filterOption:a.a.func,filterOptions:a.a.any,id:a.a.string,ignoreAccents:a.a.bool,ignoreCase:a.a.bool,inputProps:a.a.object,inputRenderer:a.a.func,instanceId:a.a.string,isLoading:a.a.bool,joinValues:a.a.bool,labelKey:a.a.string,matchPos:a.a.string,matchProp:a.a.string,menuBuffer:a.a.number,menuContainerStyle:a.a.object,menuRenderer:a.a.func,menuStyle:a.a.object,multi:a.a.bool,name:a.a.string,noResultsText:P,onBlur:a.a.func,onBlurResetsInput:a.a.bool,onChange:a.a.func,onClose:a.a.func,onCloseResetsInput:a.a.bool,onFocus:a.a.func,onInputChange:a.a.func,onInputKeyDown:a.a.func,onMenuScrollToBottom:a.a.func,onOpen:a.a.func,onSelectResetsInput:a.a.bool,onValueClick:a.a.func,openOnClick:a.a.bool,openOnFocus:a.a.bool,optionClassName:a.a.string,optionComponent:a.a.func,optionRenderer:a.a.func,options:a.a.array,pageSize:a.a.number,placeholder:P,removeSelected:a.a.bool,required:a.a.bool,resetValue:a.a.any,rtl:a.a.bool,scrollMenuIntoView:a.a.bool,searchable:a.a.bool,simpleValue:a.a.bool,style:a.a.object,tabIndex:F,tabSelectsValue:a.a.bool,trimFilter:a.a.bool,value:a.a.any,valueComponent:a.a.func,valueKey:a.a.string,valueRenderer:a.a.func,wrapperStyle:a.a.object},A.defaultProps={arrowRenderer:f,autosize:!0,backspaceRemoves:!0,backspaceToRemoveMessage:"Press backspace to remove {label}",clearable:!0,clearAllText:"Clear all",clearRenderer:y,clearValueText:"Clear value",closeOnSelect:!0,deleteRemoves:!0,delimiter:",",disabled:!1,escapeClearsValue:!0,filterOptions:m,ignoreAccents:!0,ignoreCase:!0,inputProps:{},isLoading:!1,joinValues:!1,labelKey:"label",matchPos:"any",matchProp:"any",menuBuffer:0,menuRenderer:v,multi:!1,noResultsText:"No results found",onBlurResetsInput:!0,onSelectResetsInput:!0,onCloseResetsInput:!0,openOnClick:!0,optionComponent:T,pageSize:5,placeholder:"Select...",removeSelected:!0,required:!1,rtl:!1,scrollMenuIntoView:!0,searchable:!0,simpleValue:!1,tabSelectsValue:!0,trimFilter:!0,valueComponent:_,valueKey:"value"};var N={autoload:a.a.bool.isRequired,cache:a.a.any,children:a.a.func.isRequired,ignoreAccents:a.a.bool,ignoreCase:a.a.bool,loadOptions:a.a.func.isRequired,loadingPlaceholder:a.a.oneOfType([a.a.string,a.a.node]),multi:a.a.bool,noResultsText:a.a.oneOfType([a.a.string,a.a.node]),onChange:a.a.func,onInputChange:a.a.func,options:a.a.array.isRequired,placeholder:a.a.oneOfType([a.a.string,a.a.node]),searchPromptText:a.a.oneOfType([a.a.string,a.a.node]),value:a.a.any},I={},R={autoload:!0,cache:I,children:function(e){return o.a.createElement(A,e)},ignoreAccents:!0,ignoreCase:!0,loadingPlaceholder:"Loading...",options:[],searchPromptText:"Type to search"},M=function(e){function t(e,n){b(this,t);var r=S(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,n));return r._cache=e.cache===I?{}:e.cache,r.state={inputValue:"",isLoading:!1,options:e.options},r.onInputChange=r.onInputChange.bind(r),r}return k(t,e),E(t,[{key:"componentDidMount",value:function(){this.props.autoload&&this.loadOptions("")}},{key:"componentWillReceiveProps",value:function(e){e.options!==this.props.options&&this.setState({options:e.options})}},{key:"componentWillUnmount",value:function(){this._callback=null}},{key:"loadOptions",value:function(e){var t=this,n=this.props.loadOptions,r=this._cache;if(r&&Object.prototype.hasOwnProperty.call(r,e))return this._callback=null,void this.setState({isLoading:!1,options:r[e]});var o=function n(o,i){var a=i&&i.options||[];r&&(r[e]=a),n===t._callback&&(t._callback=null,t.setState({isLoading:!1,options:a}))};this._callback=o;var i=n(e,o);i&&i.then(function(e){return o(0,e)},function(e){return o()}),this._callback&&!this.state.isLoading&&this.setState({isLoading:!0})}},{key:"onInputChange",value:function(e){var t=this.props,n=t.ignoreAccents,r=t.ignoreCase,o=t.onInputChange,i=e;if(o){var a=o(i);null!=a&&"object"!==(void 0===a?"undefined":g(a))&&(i=""+a)}var l=i;return n&&(l=h(l)),r&&(l=l.toLowerCase()),this.setState({inputValue:i}),this.loadOptions(l),i}},{key:"noResultsText",value:function(){var e=this.props,t=e.loadingPlaceholder,n=e.noResultsText,r=e.searchPromptText,o=this.state,i=o.inputValue;return o.isLoading?t:i&&n?n:r}},{key:"focus",value:function(){this.select.focus()}},{key:"render",value:function(){var e=this,t=this.props,n=t.children,r=t.loadingPlaceholder,o=(t.multi,t.onChange,t.placeholder),i=this.state,a=i.isLoading,l=i.options,u={noResultsText:this.noResultsText(),placeholder:a?r:o,options:a&&r?[]:l,ref:function(t){return e.select=t}};return n(w({},this.props,u,{isLoading:a,onInputChange:this.onInputChange}))}}]),t}(r.Component);M.propTypes=N,M.defaultProps=R;var z=function(e){function t(e,n){b(this,t);var r=S(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,n));return r.filterOptions=r.filterOptions.bind(r),r.menuRenderer=r.menuRenderer.bind(r),r.onInputKeyDown=r.onInputKeyDown.bind(r),r.onInputChange=r.onInputChange.bind(r),r.onOptionSelect=r.onOptionSelect.bind(r),r}return k(t,e),E(t,[{key:"createNewOption",value:function(){var e=this.props,t=e.isValidNewOption,n=e.newOptionCreator,r=e.onNewOptionClick,o=e.options,i=void 0===o?[]:o;if(t({label:this.inputValue})){var a=n({label:this.inputValue,labelKey:this.labelKey,valueKey:this.valueKey});this.isOptionUnique({option:a})&&(r?r(a):(i.unshift(a),this.select.selectValue(a)))}}},{key:"filterOptions",value:function(){var e=this.props,t=e.filterOptions,n=e.isValidNewOption,r=e.promptTextCreator,o=(arguments.length<=2?void 0:arguments[2])||[],i=t.apply(void 0,arguments)||[];if(n({label:this.inputValue})){var a=this.props.newOptionCreator,l=a({label:this.inputValue,labelKey:this.labelKey,valueKey:this.valueKey}),u=this.isOptionUnique({option:l,options:o.concat(i)});if(u){var s=r(this.inputValue);this._createPlaceholderOption=a({label:s,labelKey:this.labelKey,valueKey:this.valueKey}),i.unshift(this._createPlaceholderOption)}}return i}},{key:"isOptionUnique",value:function(e){var t=e.option,n=e.options,r=this.props.isOptionUnique;return n=n||this.props.options,r({labelKey:this.labelKey,option:t,options:n,valueKey:this.valueKey})}},{key:"menuRenderer",value:function(e){var t=this.props.menuRenderer;return t(w({},e,{onSelect:this.onOptionSelect,selectValue:this.onOptionSelect}))}},{key:"onInputChange",value:function(e){var t=this.props.onInputChange;return this.inputValue=e,t&&(this.inputValue=t(e)),this.inputValue}},{key:"onInputKeyDown",value:function(e){var t=this.props,n=t.shouldKeyDownEventCreateNewOption,r=t.onInputKeyDown,o=this.select.getFocusedOption();o&&o===this._createPlaceholderOption&&n({keyCode:e.keyCode})?(this.createNewOption(),e.preventDefault()):r&&r(e)}},{key:"onOptionSelect",value:function(e,t){e===this._createPlaceholderOption?this.createNewOption():this.select.selectValue(e)}},{key:"focus",value:function(){this.select.focus()}},{key:"render",value:function(){var e=this,t=this.props,n=(t.newOptionCreator,t.shouldKeyDownEventCreateNewOption,t.ref),r=C(t,["newOptionCreator","shouldKeyDownEventCreateNewOption","ref"]),o=this.props.children;return o||(o=V),o(w({},r,{allowCreate:!0,filterOptions:this.filterOptions,menuRenderer:this.menuRenderer,onInputChange:this.onInputChange,onInputKeyDown:this.onInputKeyDown,ref:function(t){e.select=t,t&&(e.labelKey=t.props.labelKey,e.valueKey=t.props.valueKey),n&&n(t)}}))}}]),t}(o.a.Component);function V(e){return o.a.createElement(A,e)}function U(e){var t=e.option,n=e.options,r=e.labelKey,o=e.valueKey;return 0===n.filter(function(e){return e[r]===t[r]||e[o]===t[o]}).length}function j(e){return!!e.label}function B(e){var t=e.label,n=e.labelKey,r={};return r[e.valueKey]=t,r[n]=t,r.className="Select-create-option-placeholder",r}function L(e){return'Create option "'+e+'"'}function W(e){switch(e.keyCode){case 9:case 13:case 188:return!0;default:return!1}}z.isOptionUnique=U,z.isValidNewOption=j,z.newOptionCreator=B,z.promptTextCreator=L,z.shouldKeyDownEventCreateNewOption=W,z.defaultProps={filterOptions:m,isOptionUnique:U,isValidNewOption:j,menuRenderer:v,newOptionCreator:B,promptTextCreator:L,shouldKeyDownEventCreateNewOption:W},z.propTypes={children:a.a.func,filterOptions:a.a.any,isOptionUnique:a.a.func,isValidNewOption:a.a.func,menuRenderer:a.a.any,newOptionCreator:a.a.func,onInputChange:a.a.func,onInputKeyDown:a.a.func,onNewOptionClick:a.a.func,options:a.a.array,promptTextCreator:a.a.func,ref:a.a.func,shouldKeyDownEventCreateNewOption:a.a.func};var K=function(e){function t(){return b(this,t),S(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return k(t,e),E(t,[{key:"focus",value:function(){this.select.focus()}},{key:"render",value:function(){var e=this;return o.a.createElement(M,this.props,function(t){var n=t.ref,r=C(t,["ref"]),i=n;return o.a.createElement(z,r,function(t){var n=t.ref,r=C(t,["ref"]),o=n;return e.props.children(w({},r,{ref:function(t){o(t),i(t),e.select=t}}))})})}}]),t}(o.a.Component);K.propTypes={children:a.a.func.isRequired},K.defaultProps={children:function(e){return o.a.createElement(A,e)}},A.Async=M,A.AsyncCreatable=K,A.Creatable=z,A.Value=_,A.Option=T,t.default=A},function(e,t,n){"use strict";var r=n(7),o=n(5),i=n(29);e.exports=function(){function e(e,t,n,r,a,l){l!==i&&o(!1,"Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types")}function t(){return e}e.isRequired=e;var n={array:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t};return n.checkPropTypes=r,n.PropTypes=n,n}},function(e,t,n){"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},function(e,t,n){e.exports=n(31)()},function(e,t,n){"use strict";var r=n(7),o=n(5),i=n(32);e.exports=function(){function e(e,t,n,r,a,l){l!==i&&o(!1,"Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types")}function t(){return e}e.isRequired=e;var n={array:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t};return n.checkPropTypes=r,n.PropTypes=n,n}},function(e,t,n){"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},function(e,t){e.exports=require("electron")},function(e){e.exports=JSON.parse('["Upsorbing the Contents","Additive Parsing the Load","Commence Monosaturated Goodening","Kick Off the Multi-Core Widening","Bastening the Game Turkey","Abstracting the Rummage Disc","Undecerealenizing the Process","Postrefragmenting the Widget Layer","Satisfying the Constraints","Abnoramalzing Some of the Matrices","Optimizing the People","Proclaigerizing the Network"]')},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r,o=n(1),i=(r=o)&&r.__esModule?r:{default:r};t.default=({percent:e=0})=>i.default.createElement("div",{className:"progress"},i.default.createElement("div",{className:"progress-bar"},i.default.createElement("div",{className:"complete",style:{width:`${e}%`}}))),e.exports=t.default}]); \ No newline at end of file diff --git a/appasar/stable/app_bootstrap/splashScreen.js b/appasar/stable/app_bootstrap/splashScreen.js index fc4b15a..4f9d55a 100644 --- a/appasar/stable/app_bootstrap/splashScreen.js +++ b/appasar/stable/app_bootstrap/splashScreen.js @@ -13,6 +13,12 @@ exports.pageReady = pageReady; var _electron = require('electron'); +var _events = require('events'); + +var _fs = require('fs'); + +var _fs2 = _interopRequireDefault(_fs); + var _path = require('path'); var _path2 = _interopRequireDefault(_path); @@ -21,23 +27,17 @@ var _url = require('url'); var _url2 = _interopRequireDefault(_url); -var _events = require('events'); - var _moduleUpdater = require('../common/moduleUpdater'); var moduleUpdater = _interopRequireWildcard(_moduleUpdater); -var _ipcMain = require('./ipcMain'); - -var _ipcMain2 = _interopRequireDefault(_ipcMain); - var _paths = require('../common/paths'); var paths = _interopRequireWildcard(_paths); -var _fs = require('fs'); +var _ipcMain = require('./ipcMain'); -var _fs2 = _interopRequireDefault(_fs); +var _ipcMain2 = _interopRequireDefault(_ipcMain); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } @@ -86,6 +86,7 @@ let updateAttempt; let splashState; let launchedMainWindow; let quoteCachePath; +let restartRequired = false; function initSplash(startMinimized = false) { modulesListeners = {}; @@ -98,56 +99,68 @@ function initSplash(startMinimized = false) { updateSplashState(CHECKING_FOR_UPDATES); }); - addModulesListener(UPDATE_CHECK_FINISHED, (succeeded, updateCount, manualRequired) => { + addModulesListener(UPDATE_CHECK_FINISHED, ({ succeeded, updateCount, manualRequired }) => { stopUpdateTimeout(); if (!succeeded) { scheduleUpdateCheck(); updateSplashState(UPDATE_FAILURE); } else if (updateCount === 0) { + moduleUpdater.setInBackground(); launchMainWindow(); updateSplashState(LAUNCHING); } }); - addModulesListener(DOWNLOADING_MODULE, (name, current, total) => { + addModulesListener(DOWNLOADING_MODULE, ({ name, current, total }) => { stopUpdateTimeout(); splashState = { current, total }; updateSplashState(DOWNLOADING_UPDATES); }); - addModulesListener(DOWNLOADING_MODULE_PROGRESS, (name, progress) => { + addModulesListener(DOWNLOADING_MODULE_PROGRESS, ({ name, progress }) => { splashState.progress = progress; updateSplashState(DOWNLOADING_UPDATES); }); - addModulesListener(DOWNLOADED_MODULE, (name, current, total, succeeded) => delete splashState.progress); + addModulesListener(DOWNLOADED_MODULE, ({ name, current, total, succeeded }) => { + delete splashState.progress; + if (name === 'host') { + restartRequired = true; + } + }); - addModulesListener(DOWNLOADING_MODULES_FINISHED, (succeeded, failed) => { + addModulesListener(DOWNLOADING_MODULES_FINISHED, ({ succeeded, failed }) => { if (failed > 0) { scheduleUpdateCheck(); updateSplashState(UPDATE_FAILURE); } else { - process.nextTick(() => moduleUpdater.quitAndInstallUpdates()); + process.nextTick(() => { + if (restartRequired) { + moduleUpdater.quitAndInstallUpdates(); + } else { + moduleUpdater.installPendingUpdates(); + } + }); } }); addModulesListener(NO_PENDING_UPDATES, () => moduleUpdater.checkForUpdates()); - addModulesListener(INSTALLING_MODULE, (name, current, total) => { + addModulesListener(INSTALLING_MODULE, ({ name, current, total }) => { splashState = { current, total }; updateSplashState(INSTALLING_UPDATES); }); - addModulesListener(INSTALLED_MODULE, (name, current, total, succeeded) => delete splashState.progress); + addModulesListener(INSTALLED_MODULE, ({ name, current, total, succeeded }) => delete splashState.progress); - addModulesListener(INSTALLING_MODULE_PROGRESS, (name, progress) => { + addModulesListener(INSTALLING_MODULE_PROGRESS, ({ name, progress }) => { splashState.progress = progress; updateSplashState(INSTALLING_UPDATES); }); - addModulesListener(INSTALLING_MODULES_FINISHED, (succeeded, failed) => moduleUpdater.checkForUpdates()); + addModulesListener(INSTALLING_MODULES_FINISHED, ({ succeeded, failed }) => moduleUpdater.checkForUpdates()); - addModulesListener(UPDATE_MANUALLY, newVersion => { + addModulesListener(UPDATE_MANUALLY, ({ newVersion }) => { splashState.newVersion = newVersion; updateSplashState(UPDATE_MANUALLY); }); @@ -159,7 +172,6 @@ function initSplash(startMinimized = false) { } function destroySplash() { - removeModulesListeners(); stopUpdateTimeout(); if (splashWindow) { @@ -243,7 +255,7 @@ function launchSplashWindow(startMinimized) { } _ipcMain2.default.on('SPLASH_SCREEN_READY', () => { - let cachedQuote = chooseCachedQuote(); + const cachedQuote = chooseCachedQuote(); if (cachedQuote) { webContentsSend(splashWindow, 'SPLASH_SCREEN_QUOTE', cachedQuote); } @@ -265,6 +277,7 @@ function launchSplashWindow(startMinimized) { } function launchMainWindow() { + removeModulesListeners(); if (!launchedMainWindow && splashWindow != null) { launchedMainWindow = true; events.emit(APP_SHOULD_LAUNCH); diff --git a/appasar/stable/app_bootstrap/startupMenu/darwin.js b/appasar/stable/app_bootstrap/startupMenu/darwin.js index 0f4ea5d..937f495 100644 --- a/appasar/stable/app_bootstrap/startupMenu/darwin.js +++ b/appasar/stable/app_bootstrap/startupMenu/darwin.js @@ -14,4 +14,4 @@ exports.default = [{ accelerator: 'Command+Q' }] }]; -module.exports = exports['default']; \ No newline at end of file +module.exports = exports.default; \ No newline at end of file diff --git a/appasar/stable/app_bootstrap/startupMenu/index.js b/appasar/stable/app_bootstrap/startupMenu/index.js index 28041e5..a2349fe 100644 --- a/appasar/stable/app_bootstrap/startupMenu/index.js +++ b/appasar/stable/app_bootstrap/startupMenu/index.js @@ -9,4 +9,4 @@ var _electron = require('electron'); const menu = require('./' + process.platform); exports.default = _electron.Menu.buildFromTemplate(menu); -module.exports = exports['default']; \ No newline at end of file +module.exports = exports.default; \ No newline at end of file diff --git a/appasar/stable/app_bootstrap/startupMenu/linux.js b/appasar/stable/app_bootstrap/startupMenu/linux.js index f5e4b1f..e433be9 100644 --- a/appasar/stable/app_bootstrap/startupMenu/linux.js +++ b/appasar/stable/app_bootstrap/startupMenu/linux.js @@ -14,4 +14,4 @@ exports.default = [{ accelerator: 'Control+Q' }] }]; -module.exports = exports['default']; \ No newline at end of file +module.exports = exports.default; \ No newline at end of file diff --git a/appasar/stable/app_bootstrap/startupMenu/win32.js b/appasar/stable/app_bootstrap/startupMenu/win32.js index 3f29a76..db49061 100644 --- a/appasar/stable/app_bootstrap/startupMenu/win32.js +++ b/appasar/stable/app_bootstrap/startupMenu/win32.js @@ -14,4 +14,4 @@ exports.default = [{ accelerator: 'Alt+F4' }] }]; -module.exports = exports['default']; \ No newline at end of file +module.exports = exports.default; \ No newline at end of file diff --git a/appasar/stable/common/Backoff.js b/appasar/stable/common/Backoff.js index 7874284..a77b2f8 100644 --- a/appasar/stable/common/Backoff.js +++ b/appasar/stable/common/Backoff.js @@ -90,4 +90,4 @@ class Backoff { } } exports.default = Backoff; -module.exports = exports['default']; \ No newline at end of file +module.exports = exports.default; \ No newline at end of file diff --git a/appasar/stable/common/FeatureFlags.js b/appasar/stable/common/FeatureFlags.js index 981dc96..880ea20 100644 --- a/appasar/stable/common/FeatureFlags.js +++ b/appasar/stable/common/FeatureFlags.js @@ -26,4 +26,4 @@ class FeatureFlags { } } exports.default = FeatureFlags; -module.exports = exports['default']; \ No newline at end of file +module.exports = exports.default; \ No newline at end of file diff --git a/appasar/stable/common/Settings.js b/appasar/stable/common/Settings.js index 06f4f9f..dd7ec34 100644 --- a/appasar/stable/common/Settings.js +++ b/appasar/stable/common/Settings.js @@ -68,4 +68,4 @@ class Settings { } } exports.default = Settings; -module.exports = exports['default']; \ No newline at end of file +module.exports = exports.default; \ No newline at end of file diff --git a/appasar/stable/common/moduleUpdater.js b/appasar/stable/common/moduleUpdater.js index 8763c4a..3fc0e6e 100644 --- a/appasar/stable/common/moduleUpdater.js +++ b/appasar/stable/common/moduleUpdater.js @@ -3,17 +3,152 @@ Object.defineProperty(exports, "__esModule", { value: true }); -exports.events = exports.NO_PENDING_UPDATES = exports.INSTALLING_MODULE_PROGRESS = exports.INSTALLING_MODULE = exports.INSTALLING_MODULES_FINISHED = exports.DOWNLOADED_MODULE = exports.UPDATE_MANUALLY = exports.DOWNLOADING_MODULES_FINISHED = exports.DOWNLOADING_MODULE_PROGRESS = exports.DOWNLOADING_MODULE = exports.UPDATE_CHECK_FINISHED = exports.INSTALLED_MODULE = exports.CHECKING_FOR_UPDATES = undefined; +exports.supportsEventObjects = exports.events = exports.NO_PENDING_UPDATES = exports.INSTALLING_MODULE_PROGRESS = exports.INSTALLING_MODULE = exports.INSTALLING_MODULES_FINISHED = exports.DOWNLOADED_MODULE = exports.UPDATE_MANUALLY = exports.DOWNLOADING_MODULES_FINISHED = exports.DOWNLOADING_MODULE_PROGRESS = exports.DOWNLOADING_MODULE = exports.UPDATE_CHECK_FINISHED = exports.INSTALLED_MODULE = exports.CHECKING_FOR_UPDATES = undefined; -var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; // Manages additional module installation and management. -// We add the module folder path to require() lookup paths here. +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; -// undocumented node API +let checkForModuleUpdates = (() => { + var _ref = _asyncToGenerator(function* () { + const query = _extends({}, remoteQuery, { _: Math.floor(Date.now() / 1000 / 60 / 5) }); + const url = `${remoteBaseURL}/versions.json`; + logger.log(`Checking for module updates at ${url}`); + let response; + try { + response = yield request.get({ url, qs: query, timeout: REQUEST_TIMEOUT }); + checkingForUpdates = false; + } catch (err) { + checkingForUpdates = false; + logger.log(`Failed fetching module versions: ${String(err)}`); + + events.append({ + type: UPDATE_CHECK_FINISHED, + succeeded: false, + updateCount: 0, + manualRequired: false + }); + + return; + } + + remoteModuleVersions = JSON.parse(response.body); + if (settings.get(USE_LOCAL_MODULE_VERSIONS)) { + try { + remoteModuleVersions = JSON.parse(_fs2.default.readFileSync(localModuleVersionsFilePath)); + console.log('Using local module versions: ', remoteModuleVersions); + } catch (err) { + console.warn('Failed to parse local module versions: ', err); + } + } + + const updatesToDownload = []; + for (const moduleName of Object.keys(installedModules)) { + const installedModule = installedModules[moduleName]; + const installed = installedModule.installedVersion; + if (installed === null) { + continue; + } + + const update = installedModule.updateVersion || 0; + const remote = remoteModuleVersions[getRemoteModuleName(moduleName)] || 0; + if (installed !== remote && update !== remote) { + logger.log(`Module update available: ${moduleName}@${remote} [installed: ${installed}]`); + updatesToDownload.push({ name: moduleName, version: remote }); + } + } + + events.append({ + type: UPDATE_CHECK_FINISHED, + succeeded: true, + updateCount: updatesToDownload.length, + manualRequired: false + }); + + if (updatesToDownload.length === 0) { + logger.log(`No module updates available.`); + } else { + updatesToDownload.forEach(function (e) { + return addModuleToDownloadQueue(e.name, e.version); + }); + } + }); + + return function checkForModuleUpdates() { + return _ref.apply(this, arguments); + }; +})(); + +let processDownloadQueue = (() => { + var _ref2 = _asyncToGenerator(function* () { + if (download.active) return; + if (download.queue.length === 0) return; + + download.active = true; + + const queuedModule = download.queue[download.next]; + download.next += 1; + + events.append({ + type: DOWNLOADING_MODULE, + name: queuedModule.name, + current: download.next, + total: download.queue.length, + foreground: !runningInBackground + }); + + let progress = 0; + let receivedBytes = 0; + + const url = `${remoteBaseURL}/${encodeURIComponent(getRemoteModuleName(queuedModule.name))}/${encodeURIComponent(queuedModule.version)}`; + logger.log(`Fetching ${queuedModule.name}@${queuedModule.version} from ${url}`); + const headers = {}; + if (queuedModule.authToken) { + headers['Authorization'] = queuedModule.authToken; + } + + const moduleZipPath = _path2.default.join(moduleDownloadPath, `${queuedModule.name}-${queuedModule.version}.zip`); + const stream = _fs2.default.createWriteStream(moduleZipPath); + stream.on('progress', function ({ receivedBytes: newReceivedBytes, totalBytes }) { + receivedBytes = newReceivedBytes; + const newProgress = Math.min(Math.floor(100 * (receivedBytes / totalBytes)), 100); + if (progress !== newProgress) { + progress = newProgress; + logger.log(`Streaming ${queuedModule.name}@${queuedModule.version} to ${moduleZipPath}: ${progress}%`); + events.append({ + type: DOWNLOADING_MODULE_PROGRESS, + name: queuedModule.name, + progress: progress + }); + } + }); + + logger.log(`Streaming ${queuedModule.name}@${queuedModule.version} to ${moduleZipPath}`); + + try { + const response = yield request.get({ + url, + qs: remoteQuery, + headers, + timeout: REQUEST_TIMEOUT, + stream + }); + + finishModuleDownload(queuedModule.name, queuedModule.version, moduleZipPath, receivedBytes, response.statusCode === 200); + } catch (err) { + logger.log(`Failed fetching module ${queuedModule.name}@${queuedModule.version}: ${String(err)}`); + finishModuleDownload(queuedModule.name, queuedModule.version, null, false); + } + }); + + return function processDownloadQueue() { + return _ref2.apply(this, arguments); + }; +})(); exports.initPathsOnly = initPathsOnly; exports.init = init; exports.checkForUpdates = checkForUpdates; +exports.setInBackground = setInBackground; exports.quitAndInstallUpdates = quitAndInstallUpdates; exports.isInstalled = isInstalled; exports.getInstalled = getInstalled; @@ -38,27 +173,71 @@ var _mkdirp = require('mkdirp'); var _mkdirp2 = _interopRequireDefault(_mkdirp); +var _process = require('process'); + var _yauzl = require('yauzl'); var _yauzl2 = _interopRequireDefault(_yauzl); -var _paths = require('./paths'); - -var paths = _interopRequireWildcard(_paths); - var _Backoff = require('./Backoff'); var _Backoff2 = _interopRequireDefault(_Backoff); +var _paths = require('./paths'); + +var paths = _interopRequireWildcard(_paths); + function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } // Manages additional module installation and management. +// We add the module folder path to require() lookup paths here. + +// undocumented node API + + const originalFs = require('original-fs'); +// events +const CHECKING_FOR_UPDATES = exports.CHECKING_FOR_UPDATES = 'checking-for-updates'; +const INSTALLED_MODULE = exports.INSTALLED_MODULE = 'installed-module'; +const UPDATE_CHECK_FINISHED = exports.UPDATE_CHECK_FINISHED = 'update-check-finished'; +const DOWNLOADING_MODULE = exports.DOWNLOADING_MODULE = 'downloading-module'; +const DOWNLOADING_MODULE_PROGRESS = exports.DOWNLOADING_MODULE_PROGRESS = 'downloading-module-progress'; +const DOWNLOADING_MODULES_FINISHED = exports.DOWNLOADING_MODULES_FINISHED = 'downloading-modules-finished'; +const UPDATE_MANUALLY = exports.UPDATE_MANUALLY = 'update-manually'; +const DOWNLOADED_MODULE = exports.DOWNLOADED_MODULE = 'downloaded-module'; +const INSTALLING_MODULES_FINISHED = exports.INSTALLING_MODULES_FINISHED = 'installing-modules-finished'; +const INSTALLING_MODULE = exports.INSTALLING_MODULE = 'installing-module'; +const INSTALLING_MODULE_PROGRESS = exports.INSTALLING_MODULE_PROGRESS = 'installing-module-progress'; +const NO_PENDING_UPDATES = exports.NO_PENDING_UPDATES = 'no-pending-updates'; + +// settings +const ALWAYS_ALLOW_UPDATES = 'ALWAYS_ALLOW_UPDATES'; +const SKIP_HOST_UPDATE = 'SKIP_HOST_UPDATE'; +const SKIP_MODULE_UPDATE = 'SKIP_MODULE_UPDATE'; +const ALWAYS_BOOTSTRAP_MODULES = 'ALWAYS_BOOTSTRAP_MODULES'; +const USE_LOCAL_MODULE_VERSIONS = 'USE_LOCAL_MODULE_VERSIONS'; + class Events extends _events.EventEmitter { - emit(...args) { - process.nextTick(() => super.emit.apply(this, args)); + constructor() { + super(); + this.history = []; + } + + append(evt) { + evt.now = String(_process.hrtime.bigint()); + + if (this._eventIsInteresting(evt)) { + this.history.push(evt); + } + + process.nextTick(() => this.emit(evt.type, evt)); + } + + _eventIsInteresting(evt) { + return evt.type !== DOWNLOADING_MODULE_PROGRESS && evt.type !== INSTALLING_MODULE_PROGRESS; } } @@ -88,31 +267,11 @@ class LogStream { } } -// events -const CHECKING_FOR_UPDATES = exports.CHECKING_FOR_UPDATES = 'checking-for-updates'; -const INSTALLED_MODULE = exports.INSTALLED_MODULE = 'installed-module'; -const UPDATE_CHECK_FINISHED = exports.UPDATE_CHECK_FINISHED = 'update-check-finished'; -const DOWNLOADING_MODULE = exports.DOWNLOADING_MODULE = 'downloading-module'; -const DOWNLOADING_MODULE_PROGRESS = exports.DOWNLOADING_MODULE_PROGRESS = 'downloading-module-progress'; -const DOWNLOADING_MODULES_FINISHED = exports.DOWNLOADING_MODULES_FINISHED = 'downloading-modules-finished'; -const UPDATE_MANUALLY = exports.UPDATE_MANUALLY = 'update-manually'; -const DOWNLOADED_MODULE = exports.DOWNLOADED_MODULE = 'downloaded-module'; -const INSTALLING_MODULES_FINISHED = exports.INSTALLING_MODULES_FINISHED = 'installing-modules-finished'; -const INSTALLING_MODULE = exports.INSTALLING_MODULE = 'installing-module'; -const INSTALLING_MODULE_PROGRESS = exports.INSTALLING_MODULE_PROGRESS = 'installing-module-progress'; -const NO_PENDING_UPDATES = exports.NO_PENDING_UPDATES = 'no-pending-updates'; - -// settings -const ALWAYS_ALLOW_UPDATES = 'ALWAYS_ALLOW_UPDATES'; -const SKIP_HOST_UPDATE = 'SKIP_HOST_UPDATE'; -const SKIP_MODULE_UPDATE = 'SKIP_MODULE_UPDATE'; -const ALWAYS_BOOTSTRAP_MODULES = 'ALWAYS_BOOTSTRAP_MODULES'; -const USE_LOCAL_MODULE_VERSIONS = 'USE_LOCAL_MODULE_VERSIONS'; - const request = require('../app_bootstrap/request'); const REQUEST_TIMEOUT = 15000; const backoff = new _Backoff2.default(1000, 20000); const events = exports.events = new Events(); +const supportsEventObjects = exports.supportsEventObjects = true; let logger; let locallyInstalledModules; @@ -136,6 +295,7 @@ let newInstallInProgress; let localModuleVersionsFilePath; let updatable; let bootstrapManifestFilePath; +let runningInBackground = false; function initPathsOnly(_buildInfo) { if (locallyInstalledModules || moduleInstallPath) { @@ -229,14 +389,16 @@ function init(_endpoint, _settings, _buildInfo) { hostUpdater = require('../app_bootstrap/hostUpdater'); // TODO: hostUpdater constants - hostUpdater.on('checking-for-update', () => events.emit(CHECKING_FOR_UPDATES)); + hostUpdater.on('checking-for-update', () => events.append({ + type: CHECKING_FOR_UPDATES + })); hostUpdater.on('update-available', () => hostOnUpdateAvailable()); hostUpdater.on('update-progress', progress => hostOnUpdateProgress(progress)); hostUpdater.on('update-not-available', () => hostOnUpdateNotAvailable()); hostUpdater.on('update-manually', newVersion => hostOnUpdateManually(newVersion)); hostUpdater.on('update-downloaded', () => hostOnUpdateDownloaded()); hostUpdater.on('error', err => hostOnError(err)); - let setFeedURL = hostUpdater.setFeedURL.bind(hostUpdater); + const setFeedURL = hostUpdater.setFeedURL.bind(hostUpdater); remoteBaseURL = `${endpoint}/modules/${buildInfo.releaseChannel}`; // eslint-disable-next-line camelcase @@ -286,13 +448,28 @@ function cleanDownloadedModules(installedModules) { function hostOnUpdateAvailable() { logger.log(`Host update is available.`); hostUpdateAvailable = true; - events.emit(UPDATE_CHECK_FINISHED, true, 1, false); - events.emit(DOWNLOADING_MODULE, 'host', 1, 1); + events.append({ + type: UPDATE_CHECK_FINISHED, + succeeded: true, + updateCount: 1, + manualRequired: false + }); + events.append({ + type: DOWNLOADING_MODULE, + name: 'host', + current: 1, + total: 1, + foreground: !runningInBackground + }); } function hostOnUpdateProgress(progress) { logger.log(`Host update progress: ${progress}%`); - events.emit(DOWNLOADING_MODULE_PROGRESS, 'host', progress); + events.append({ + type: DOWNLOADING_MODULE_PROGRESS, + name: 'host', + progress: progress + }); } function hostOnUpdateNotAvailable() { @@ -300,7 +477,12 @@ function hostOnUpdateNotAvailable() { if (!skipModuleUpdate) { checkForModuleUpdates(); } else { - events.emit(UPDATE_CHECK_FINISHED, true, 0, false); + events.append({ + type: UPDATE_CHECK_FINISHED, + succeeded: true, + updateCount: 0, + manualRequired: false + }); } } @@ -308,15 +490,33 @@ function hostOnUpdateManually(newVersion) { logger.log(`Host update is available. Manual update required!`); hostUpdateAvailable = true; checkingForUpdates = false; - events.emit(UPDATE_MANUALLY, newVersion); - events.emit(UPDATE_CHECK_FINISHED, true, 1, true); + events.append({ + type: UPDATE_MANUALLY, + newVersion: newVersion + }); + events.append({ + type: UPDATE_CHECK_FINISHED, + succeeded: true, + updateCount: 1, + manualRequired: true + }); } function hostOnUpdateDownloaded() { logger.log(`Host update downloaded.`); checkingForUpdates = false; - events.emit(DOWNLOADED_MODULE, 'host', 1, 1, true); - events.emit(DOWNLOADING_MODULES_FINISHED, 1, 0); + events.append({ + type: DOWNLOADED_MODULE, + name: 'host', + current: 1, + total: 1, + succeeded: true + }); + events.append({ + type: DOWNLOADING_MODULES_FINISHED, + succeeded: 1, + failed: 0 + }); } function hostOnError(err) { @@ -331,10 +531,25 @@ function hostOnError(err) { checkingForUpdates = false; if (!hostUpdateAvailable) { - events.emit(UPDATE_CHECK_FINISHED, false, 0, false); + events.append({ + type: UPDATE_CHECK_FINISHED, + succeeded: false, + updateCount: 0, + manualRequired: false + }); } else { - events.emit(DOWNLOADED_MODULE, 'host', 1, 1, false); - events.emit(DOWNLOADING_MODULES_FINISHED, 0, 1); + events.append({ + type: DOWNLOADED_MODULE, + name: 'host', + current: 1, + total: 1, + succeeded: false + }); + events.append({ + type: DOWNLOADING_MODULES_FINISHED, + succeeded: 0, + failed: 1 + }); } } @@ -344,7 +559,7 @@ function checkForUpdates() { checkingForUpdates = true; hostUpdateAvailable = false; if (skipHostUpdate) { - events.emit(CHECKING_FOR_UPDATES); + events.append({ type: CHECKING_FOR_UPDATES }); hostOnUpdateNotAvailable(); } else { logger.log('Checking for host updates.'); @@ -352,6 +567,14 @@ function checkForUpdates() { } } +// Indicates that the initial update process is complete and that future updates +// are background updates. This merely affects the content of the events sent to +// the app so that analytics can correctly attribute module download/installs +// depending on whether they were ui-blocking or not. +function setInBackground() { + runningInBackground = true; +} + function getRemoteModuleName(name) { if (process.platform === 'win32' && process.arch === 'x64') { return `${name}.x64`; @@ -360,142 +583,17 @@ function getRemoteModuleName(name) { return name; } -function checkForModuleUpdates() { - const query = _extends({}, remoteQuery, { _: Math.floor(Date.now() / 1000 / 60 / 5) }); - const url = `${remoteBaseURL}/versions.json`; - logger.log(`Checking for module updates at ${url}`); - - request.get({ - url, - agent: false, - encoding: null, - qs: query, - timeout: REQUEST_TIMEOUT, - strictSSL: false - }, (err, response, body) => { - checkingForUpdates = false; - - if (!err && response.statusCode !== 200) { - err = new Error(`Non-200 response code: ${response.statusCode}`); - } - - if (err) { - logger.log(`Failed fetching module versions: ${String(err)}`); - events.emit(UPDATE_CHECK_FINISHED, false, 0, false); - return; - } - - remoteModuleVersions = JSON.parse(body); - if (settings.get(USE_LOCAL_MODULE_VERSIONS)) { - try { - remoteModuleVersions = JSON.parse(_fs2.default.readFileSync(localModuleVersionsFilePath)); - console.log('Using local module versions: ', remoteModuleVersions); - } catch (err) { - console.warn('Failed to parse local module versions: ', err); - } - } - - const updatesToDownload = []; - for (const moduleName of Object.keys(installedModules)) { - const installedModule = installedModules[moduleName]; - const installed = installedModule.installedVersion; - if (installed === null) { - continue; - } - - const update = installedModule.updateVersion || 0; - const remote = remoteModuleVersions[getRemoteModuleName(moduleName)] || 0; - // TODO: strict equality? - if (installed != remote && update != remote) { - logger.log(`Module update available: ${moduleName}@${remote} [installed: ${installed}]`); - updatesToDownload.push({ name: moduleName, version: remote }); - } - } - - events.emit(UPDATE_CHECK_FINISHED, true, updatesToDownload.length, false); - if (updatesToDownload.length === 0) { - logger.log(`No module updates available.`); - } else { - updatesToDownload.forEach(e => addModuleToDownloadQueue(e.name, e.version)); - } - }); -} - function addModuleToDownloadQueue(name, version, authToken) { download.queue.push({ name, version, authToken }); process.nextTick(() => processDownloadQueue()); } -function processDownloadQueue() { - if (download.active) return; - if (download.queue.length === 0) return; - - download.active = true; - - const queuedModule = download.queue[download.next]; - download.next += 1; - - events.emit(DOWNLOADING_MODULE, queuedModule.name, download.next, download.queue.length); - - let totalBytes = 1; - let receivedBytes = 0; - let progress = 0; - let hasErrored = false; - - const url = `${remoteBaseURL}/${getRemoteModuleName(queuedModule.name)}/${queuedModule.version}`; - logger.log(`Fetching ${queuedModule.name}@${queuedModule.version} from ${url}`); - const headers = {}; - if (queuedModule.authToken) { - headers['Authorization'] = queuedModule.authToken; - } - request.get({ - url, - agent: false, - encoding: null, - followAllRedirects: true, - qs: remoteQuery, - timeout: REQUEST_TIMEOUT, - strictSSL: false, - headers - }).on('error', err => { - if (hasErrored) return; - hasErrored = true; - logger.log(`Failed fetching ${queuedModule.name}@${queuedModule.version}: ${String(err)}`); - finishModuleDownload(queuedModule.name, queuedModule.version, null, false); - }).on('response', response => { - totalBytes = response.headers['content-length'] || 1; - - const moduleZipPath = _path2.default.join(moduleDownloadPath, `${queuedModule.name}-${queuedModule.version}.zip`); - logger.log(`Streaming ${queuedModule.name}@${queuedModule.version} [${totalBytes} bytes] to ${moduleZipPath}`); - - const stream = _fs2.default.createWriteStream(moduleZipPath); - stream.on('finish', () => finishModuleDownload(queuedModule.name, queuedModule.version, moduleZipPath, response.statusCode === 200)); - - response.on('data', chunk => { - receivedBytes += chunk.length; - stream.write(chunk); - - const fraction = receivedBytes / totalBytes; - const newProgress = Math.min(Math.floor(100 * fraction), 100); - if (progress != newProgress) { - progress = newProgress; - events.emit(DOWNLOADING_MODULE_PROGRESS, queuedModule.name, progress); - } - }); - - // TODO: on response error - // TODO: on stream error - - response.on('end', () => stream.end()); - }); -} - function commitInstalledModules() { const data = JSON.stringify(installedModules, null, 2); _fs2.default.writeFileSync(installedModulesFilePath, data); } -function finishModuleDownload(name, version, zipfile, succeeded) { +function finishModuleDownload(name, version, zipfile, receivedBytes, succeeded) { if (!installedModules[name]) { installedModules[name] = {}; } @@ -508,12 +606,23 @@ function finishModuleDownload(name, version, zipfile, succeeded) { download.failures += 1; } - events.emit(DOWNLOADED_MODULE, name, download.next, download.queue.length, succeeded); + events.append({ + type: DOWNLOADED_MODULE, + name: name, + current: download.next, + total: download.queue.length, + succeeded: succeeded, + receivedBytes: receivedBytes + }); if (download.next >= download.queue.length) { const successes = download.queue.length - download.failures; logger.log(`Finished module downloads. [success: ${successes}] [failure: ${download.failures}]`); - events.emit(DOWNLOADING_MODULES_FINISHED, successes, download.failures); + events.append({ + type: DOWNLOADING_MODULES_FINISHED, + succeeded: successes, + failed: download.failures + }); download.queue = []; download.next = 0; download.failures = 0; @@ -550,9 +659,19 @@ function processUnzipQueue() { unzip.active = true; const queuedModule = unzip.queue[unzip.next]; + const installedModule = installedModules[queuedModule.name]; + const installedVersion = installedModule != null ? installedModule.installedVersion : null; unzip.next += 1; - events.emit(INSTALLING_MODULE, queuedModule.name, unzip.next, unzip.queue.length); + events.append({ + type: INSTALLING_MODULE, + name: queuedModule.name, + current: unzip.next, + total: unzip.queue.length, + foreground: !runningInBackground, + oldVersion: installedVersion, + newVersion: queuedModule.version + }); let hasErrored = false; const onError = (error, zipfile) => { @@ -583,7 +702,11 @@ function processUnzipQueue() { zipfile.on('entry', entry => { processedEntries += 1; const percent = Math.min(Math.floor(processedEntries / totalEntries * 100), 100); - events.emit(INSTALLING_MODULE_PROGRESS, queuedModule.name, percent); + events.append({ + type: INSTALLING_MODULE_PROGRESS, + name: queuedModule.name, + progress: percent + }); // skip directories if (/\/$/.test(entry.fileName)) { @@ -668,7 +791,13 @@ function finishModuleUnzip(unzippedModule, succeeded) { unzip.failures += 1; } - events.emit(INSTALLED_MODULE, unzippedModule.name, unzip.next, unzip.queue.length, succeeded); + events.append({ + type: INSTALLED_MODULE, + name: unzippedModule.name, + current: unzip.next, + total: unzip.queue.length, + succeeded: succeeded + }); if (unzip.next >= unzip.queue.length) { const successes = unzip.queue.length - unzip.failures; @@ -678,7 +807,11 @@ function finishModuleUnzip(unzippedModule, succeeded) { unzip.next = 0; unzip.failures = 0; unzip.active = false; - events.emit(INSTALLING_MODULES_FINISHED, successes, unzip.failures); + events.append({ + type: INSTALLING_MODULES_FINISHED, + succeeded: successes, + failed: unzip.failures + }); return; } @@ -722,7 +855,13 @@ function install(name, defer, options) { let { version, authToken } = options || {}; if (isInstalled(name, version)) { if (!defer) { - events.emit(INSTALLED_MODULE, name, 1, 1, true); + events.append({ + type: INSTALLED_MODULE, + name: name, + current: 1, + total: 1, + succeeded: true + }); } return; } @@ -780,6 +919,8 @@ function installPendingUpdates() { updatesToInstall.forEach(e => addModuleToUnzipQueue(e.moduleName, e.update, e.zipfile)); } else { logger.log('No updates to install'); - events.emit(NO_PENDING_UPDATES); + events.append({ + type: NO_PENDING_UPDATES + }); } } \ No newline at end of file diff --git a/electronasar/stable/browser/api/app.js b/electronasar/stable/browser/api/app.js deleted file mode 100644 index 4cef536..0000000 --- a/electronasar/stable/browser/api/app.js +++ /dev/null @@ -1,117 +0,0 @@ -'use strict' - -const bindings = process.atomBinding('app') -const path = require('path') -const { app, App } = bindings - -// Only one app object permitted. -module.exports = app - -const electron = require('electron') -const { deprecate, Menu } = electron -const { EventEmitter } = require('events') - -let dockMenu = null - -// App is an EventEmitter. -Object.setPrototypeOf(App.prototype, EventEmitter.prototype) -EventEmitter.call(app) - -Object.assign(app, { - setApplicationMenu (menu) { - return Menu.setApplicationMenu(menu) - }, - getApplicationMenu () { - return Menu.getApplicationMenu() - }, - commandLine: { - appendSwitch (...args) { - const castedArgs = args.map((arg) => { - return typeof arg !== 'string' ? `${arg}` : arg - }) - return bindings.appendSwitch(...castedArgs) - }, - appendArgument (...args) { - const castedArgs = args.map((arg) => { - return typeof arg !== 'string' ? `${arg}` : arg - }) - return bindings.appendArgument(...castedArgs) - } - } -}) - -const nativeFn = app.getAppMetrics -app.getAppMetrics = () => { - const metrics = nativeFn.call(app) - for (const metric of metrics) { - if ('memory' in metric) { - deprecate.removeProperty(metric, 'memory') - } - } - - return metrics -} - -app.isPackaged = (() => { - const execFile = path.basename(process.execPath).toLowerCase() - if (process.platform === 'win32') { - return execFile !== 'electron.exe' - } - return execFile !== 'electron' -})() - -if (process.platform === 'darwin') { - app.dock = { - bounce (type = 'informational') { - return bindings.dockBounce(type) - }, - cancelBounce: bindings.dockCancelBounce, - downloadFinished: bindings.dockDownloadFinished, - setBadge: bindings.dockSetBadgeText, - getBadge: bindings.dockGetBadgeText, - hide: bindings.dockHide, - show: bindings.dockShow, - isVisible: bindings.dockIsVisible, - setMenu (menu) { - dockMenu = menu - bindings.dockSetMenu(menu) - }, - getMenu () { - return dockMenu - }, - setIcon: bindings.dockSetIcon - } -} - -if (process.platform === 'linux') { - app.launcher = { - setBadgeCount: bindings.unityLauncherSetBadgeCount, - getBadgeCount: bindings.unityLauncherGetBadgeCount, - isCounterBadgeAvailable: bindings.unityLauncherAvailable, - isUnityRunning: bindings.unityLauncherAvailable - } -} - -app.allowNTLMCredentialsForAllDomains = function (allow) { - if (!process.noDeprecations) { - deprecate.warn('app.allowNTLMCredentialsForAllDomains', 'session.allowNTLMCredentialsForDomains') - } - const domains = allow ? '*' : '' - if (!this.isReady()) { - this.commandLine.appendSwitch('auth-server-whitelist', domains) - } else { - electron.session.defaultSession.allowNTLMCredentialsForDomains(domains) - } -} - -// Routes the events to webContents. -const events = ['login', 'certificate-error', 'select-client-certificate'] -for (const name of events) { - app.on(name, (event, webContents, ...args) => { - webContents.emit(name, event, ...args) - }) -} - -// Wrappers for native classes. -const { DownloadItem } = process.atomBinding('download_item') -Object.setPrototypeOf(DownloadItem.prototype, EventEmitter.prototype) diff --git a/electronasar/stable/browser/api/auto-updater.js b/electronasar/stable/browser/api/auto-updater.js deleted file mode 100644 index db3e8da..0000000 --- a/electronasar/stable/browser/api/auto-updater.js +++ /dev/null @@ -1,7 +0,0 @@ -'use strict' - -if (process.platform === 'win32') { - module.exports = require('@electron/internal/browser/api/auto-updater/auto-updater-win') -} else { - module.exports = require('@electron/internal/browser/api/auto-updater/auto-updater-native') -} diff --git a/electronasar/stable/browser/api/auto-updater/auto-updater-native.js b/electronasar/stable/browser/api/auto-updater/auto-updater-native.js deleted file mode 100644 index d15a3c2..0000000 --- a/electronasar/stable/browser/api/auto-updater/auto-updater-native.js +++ /dev/null @@ -1,10 +0,0 @@ -'use strict' - -const EventEmitter = require('events').EventEmitter -const { autoUpdater, AutoUpdater } = process.atomBinding('auto_updater') - -// AutoUpdater is an EventEmitter. -Object.setPrototypeOf(AutoUpdater.prototype, EventEmitter.prototype) -EventEmitter.call(autoUpdater) - -module.exports = autoUpdater diff --git a/electronasar/stable/browser/api/auto-updater/auto-updater-win.js b/electronasar/stable/browser/api/auto-updater/auto-updater-win.js deleted file mode 100644 index cb8e6a0..0000000 --- a/electronasar/stable/browser/api/auto-updater/auto-updater-win.js +++ /dev/null @@ -1,74 +0,0 @@ -'use strict' - -const { app } = require('electron') -const { EventEmitter } = require('events') -const squirrelUpdate = require('@electron/internal/browser/api/auto-updater/squirrel-update-win') - -class AutoUpdater extends EventEmitter { - quitAndInstall () { - if (!this.updateAvailable) { - return this.emitError('No update available, can\'t quit and install') - } - squirrelUpdate.processStart() - app.quit() - } - - getFeedURL () { - return this.updateURL - } - - setFeedURL (options) { - let updateURL - if (typeof options === 'object') { - if (typeof options.url === 'string') { - updateURL = options.url - } else { - throw new Error('Expected options object to contain a \'url\' string property in setFeedUrl call') - } - } else if (typeof options === 'string') { - updateURL = options - } else { - throw new Error('Expected an options object with a \'url\' property to be provided') - } - this.updateURL = updateURL - } - - checkForUpdates () { - if (!this.updateURL) { - return this.emitError('Update URL is not set') - } - if (!squirrelUpdate.supported()) { - return this.emitError('Can not find Squirrel') - } - this.emit('checking-for-update') - squirrelUpdate.checkForUpdate(this.updateURL, (error, update) => { - if (error != null) { - return this.emitError(error) - } - if (update == null) { - return this.emit('update-not-available') - } - this.updateAvailable = true - this.emit('update-available') - squirrelUpdate.update(this.updateURL, (error) => { - if (error != null) { - return this.emitError(error) - } - const { releaseNotes, version } = update - // Date is not available on Windows, so fake it. - const date = new Date() - this.emit('update-downloaded', {}, releaseNotes, version, date, this.updateURL, () => { - this.quitAndInstall() - }) - }) - }) - } - - // Private: Emit both error object and message, this is to keep compatibility - // with Old APIs. - emitError (message) { - this.emit('error', new Error(message), message) - } -} - -module.exports = new AutoUpdater() diff --git a/electronasar/stable/browser/api/auto-updater/squirrel-update-win.js b/electronasar/stable/browser/api/auto-updater/squirrel-update-win.js deleted file mode 100644 index 4954c67..0000000 --- a/electronasar/stable/browser/api/auto-updater/squirrel-update-win.js +++ /dev/null @@ -1,119 +0,0 @@ -'use strict' - -const fs = require('fs') -const path = require('path') -const spawn = require('child_process').spawn - -// i.e. my-app/app-0.1.13/ -const appFolder = path.dirname(process.execPath) - -// i.e. my-app/Update.exe -const updateExe = path.resolve(appFolder, '..', 'Update.exe') -const exeName = path.basename(process.execPath) -let spawnedArgs = [] -let spawnedProcess - -const isSameArgs = (args) => args.length === spawnedArgs.length && args.every((e, i) => e === spawnedArgs[i]) - -// Spawn a command and invoke the callback when it completes with an error -// and the output from standard out. -const spawnUpdate = function (args, detached, callback) { - let error, errorEmitted, stderr, stdout - - try { - // Ensure we don't spawn multiple squirrel processes - // Process spawned, same args: Attach events to alread running process - // Process spawned, different args: Return with error - // No process spawned: Spawn new process - if (spawnedProcess && !isSameArgs(args)) { - // Disabled for backwards compatibility: - // eslint-disable-next-line standard/no-callback-literal - return callback(`AutoUpdater process with arguments ${args} is already running`) - } else if (!spawnedProcess) { - spawnedProcess = spawn(updateExe, args, { - detached: detached, - windowsHide: true - }) - spawnedArgs = args || [] - } - } catch (error1) { - error = error1 - - // Shouldn't happen, but still guard it. - process.nextTick(function () { - return callback(error) - }) - return - } - stdout = '' - stderr = '' - - spawnedProcess.stdout.on('data', (data) => { stdout += data }) - spawnedProcess.stderr.on('data', (data) => { stderr += data }) - - errorEmitted = false - spawnedProcess.on('error', (error) => { - errorEmitted = true - callback(error) - }) - - return spawnedProcess.on('exit', function (code, signal) { - spawnedProcess = undefined - spawnedArgs = [] - - // We may have already emitted an error. - if (errorEmitted) { - return - } - - // Process terminated with error. - if (code !== 0) { - // Disabled for backwards compatibility: - // eslint-disable-next-line standard/no-callback-literal - return callback(`Command failed: ${signal != null ? signal : code}\n${stderr}`) - } - - // Success. - callback(null, stdout) - }) -} - -// Start an instance of the installed app. -exports.processStart = function () { - return spawnUpdate(['--processStartAndWait', exeName], true, function () {}) -} - -// Download the releases specified by the URL and write new results to stdout. -exports.checkForUpdate = function (updateURL, callback) { - return spawnUpdate(['--checkForUpdate', updateURL], false, function (error, stdout) { - let ref, ref1, update - if (error != null) { - return callback(error) - } - try { - // Last line of output is the JSON details about the releases - const json = stdout.trim().split('\n').pop() - update = (ref = JSON.parse(json)) != null ? (ref1 = ref.releasesToApply) != null ? typeof ref1.pop === 'function' ? ref1.pop() : void 0 : void 0 : void 0 - } catch (jsonError) { - // Disabled for backwards compatibility: - // eslint-disable-next-line standard/no-callback-literal - return callback(`Invalid result:\n${stdout}`) - } - return callback(null, update) - }) -} - -// Update the application to the latest remote version specified by URL. -exports.update = function (updateURL, callback) { - return spawnUpdate(['--update', updateURL], false, callback) -} - -// Is the Update.exe installed with the current application? -exports.supported = function () { - try { - fs.accessSync(updateExe, fs.R_OK) - return true - } catch (error) { - return false - } -} diff --git a/electronasar/stable/browser/api/browser-view.js b/electronasar/stable/browser/api/browser-view.js deleted file mode 100644 index 0779f5f..0000000 --- a/electronasar/stable/browser/api/browser-view.js +++ /dev/null @@ -1,16 +0,0 @@ -'use strict' - -const { EventEmitter } = require('events') -const { BrowserView } = process.atomBinding('browser_view') - -Object.setPrototypeOf(BrowserView.prototype, EventEmitter.prototype) - -BrowserView.fromWebContents = (webContents) => { - for (const view of BrowserView.getAllViews()) { - if (view.webContents.equal(webContents)) return view - } - - return null -} - -module.exports = BrowserView diff --git a/electronasar/stable/browser/api/browser-window.js b/electronasar/stable/browser/api/browser-window.js deleted file mode 100644 index 3694acd..0000000 --- a/electronasar/stable/browser/api/browser-window.js +++ /dev/null @@ -1,191 +0,0 @@ -'use strict' - -const electron = require('electron') -const { WebContentsView, TopLevelWindow } = electron -const { BrowserWindow } = process.atomBinding('window') - -Object.setPrototypeOf(BrowserWindow.prototype, TopLevelWindow.prototype) - -BrowserWindow.prototype._init = function () { - // Call parent class's _init. - TopLevelWindow.prototype._init.call(this) - - // Avoid recursive require. - const { app } = electron - - // Create WebContentsView. - this.setContentView(new WebContentsView(this.webContents)) - - const nativeSetBounds = this.setBounds - this.setBounds = (bounds, ...opts) => { - bounds = { - ...this.getBounds(), - ...bounds - } - nativeSetBounds.call(this, bounds, ...opts) - } - - // window.resizeTo(...) - // window.moveTo(...) - this.webContents.on('move', (event, size) => { - this.setBounds(size) - }) - - // Hide the auto-hide menu when webContents is focused. - this.webContents.on('activate', () => { - if (process.platform !== 'darwin' && this.isMenuBarAutoHide() && this.isMenuBarVisible()) { - this.setMenuBarVisibility(false) - } - }) - - // Change window title to page title. - this.webContents.on('page-title-updated', (event, title) => { - // Route the event to BrowserWindow. - this.emit('page-title-updated', event, title) - if (!this.isDestroyed() && !event.defaultPrevented) this.setTitle(title) - }) - - // Sometimes the webContents doesn't get focus when window is shown, so we - // have to force focusing on webContents in this case. The safest way is to - // focus it when we first start to load URL, if we do it earlier it won't - // have effect, if we do it later we might move focus in the page. - // - // Though this hack is only needed on macOS when the app is launched from - // Finder, we still do it on all platforms in case of other bugs we don't - // know. - this.webContents.once('load-url', function () { - this.focus() - }) - - // Redirect focus/blur event to app instance too. - this.on('blur', (event) => { - app.emit('browser-window-blur', event, this) - }) - this.on('focus', (event) => { - app.emit('browser-window-focus', event, this) - }) - - // Subscribe to visibilityState changes and pass to renderer process. - let isVisible = this.isVisible() && !this.isMinimized() - const visibilityChanged = () => { - const newState = this.isVisible() && !this.isMinimized() - if (isVisible !== newState) { - isVisible = newState - const visibilityState = isVisible ? 'visible' : 'hidden' - this.webContents.emit('-window-visibility-change', visibilityState) - } - } - - const visibilityEvents = ['show', 'hide', 'minimize', 'maximize', 'restore'] - for (const event of visibilityEvents) { - this.on(event, visibilityChanged) - } - - // Notify the creation of the window. - app.emit('browser-window-created', {}, this) - - Object.defineProperty(this, 'devToolsWebContents', { - enumerable: true, - configurable: false, - get () { - return this.webContents.devToolsWebContents - } - }) -} - -const isBrowserWindow = (win) => { - return win && win.constructor.name === 'BrowserWindow' -} - -BrowserWindow.fromId = (id) => { - const win = TopLevelWindow.fromId(id) - return isBrowserWindow(win) ? win : null -} - -BrowserWindow.getAllWindows = () => { - return TopLevelWindow.getAllWindows().filter(isBrowserWindow) -} - -BrowserWindow.getFocusedWindow = () => { - for (const window of BrowserWindow.getAllWindows()) { - if (window.isFocused() || window.isDevToolsFocused()) return window - } - return null -} - -BrowserWindow.fromWebContents = (webContents) => { - for (const window of BrowserWindow.getAllWindows()) { - if (window.webContents.equal(webContents)) return window - } -} - -BrowserWindow.fromBrowserView = (browserView) => { - for (const window of BrowserWindow.getAllWindows()) { - if (window.getBrowserView() === browserView) return window - } - - return null -} - -BrowserWindow.fromDevToolsWebContents = (webContents) => { - for (const window of BrowserWindow.getAllWindows()) { - const { devToolsWebContents } = window - if (devToolsWebContents != null && devToolsWebContents.equal(webContents)) { - return window - } - } -} - -// Helpers. -Object.assign(BrowserWindow.prototype, { - loadURL (...args) { - return this.webContents.loadURL(...args) - }, - getURL (...args) { - return this.webContents.getURL() - }, - loadFile (...args) { - return this.webContents.loadFile(...args) - }, - reload (...args) { - return this.webContents.reload(...args) - }, - send (...args) { - return this.webContents.send(...args) - }, - openDevTools (...args) { - return this.webContents.openDevTools(...args) - }, - closeDevTools () { - return this.webContents.closeDevTools() - }, - isDevToolsOpened () { - return this.webContents.isDevToolsOpened() - }, - isDevToolsFocused () { - return this.webContents.isDevToolsFocused() - }, - toggleDevTools () { - return this.webContents.toggleDevTools() - }, - inspectElement (...args) { - return this.webContents.inspectElement(...args) - }, - inspectServiceWorker () { - return this.webContents.inspectServiceWorker() - }, - showDefinitionForSelection () { - return this.webContents.showDefinitionForSelection() - }, - capturePage (...args) { - return this.webContents.capturePage(...args) - }, - setTouchBar (touchBar) { - electron.TouchBar._setOnWindow(touchBar, this) - }, - setBackgroundThrottling (allowed) { - this.webContents.setBackgroundThrottling(allowed) - } -}) - -module.exports = BrowserWindow diff --git a/electronasar/stable/browser/api/content-tracing.js b/electronasar/stable/browser/api/content-tracing.js deleted file mode 100644 index 81bd70f..0000000 --- a/electronasar/stable/browser/api/content-tracing.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict' - -module.exports = process.atomBinding('content_tracing') diff --git a/electronasar/stable/browser/api/crash-reporter.js b/electronasar/stable/browser/api/crash-reporter.js deleted file mode 100644 index a963be8..0000000 --- a/electronasar/stable/browser/api/crash-reporter.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict' - -const CrashReporter = require('@electron/internal/common/crash-reporter') -const ipcMain = require('@electron/internal/browser/ipc-main-internal') - -class CrashReporterMain extends CrashReporter { - sendSync (channel, ...args) { - const event = {} - ipcMain.emit(channel, event, ...args) - return event.returnValue - } -} - -module.exports = new CrashReporterMain() diff --git a/electronasar/stable/browser/api/dialog.js b/electronasar/stable/browser/api/dialog.js deleted file mode 100644 index 7659800..0000000 --- a/electronasar/stable/browser/api/dialog.js +++ /dev/null @@ -1,312 +0,0 @@ -'use strict' - -const { app, BrowserWindow } = require('electron') -const binding = process.atomBinding('dialog') -const v8Util = process.atomBinding('v8_util') - -const fileDialogProperties = { - openFile: 1 << 0, - openDirectory: 1 << 1, - multiSelections: 1 << 2, - createDirectory: 1 << 3, - showHiddenFiles: 1 << 4, - promptToCreate: 1 << 5, - noResolveAliases: 1 << 6, - treatPackageAsDirectory: 1 << 7 -} - -const messageBoxTypes = ['none', 'info', 'warning', 'error', 'question'] - -const messageBoxOptions = { - noLink: 1 << 0 -} - -const parseArgs = function (window, options, callback, ...args) { - if (window != null && window.constructor !== BrowserWindow) { - // Shift. - [callback, options, window] = [options, window, null] - } - - if ((callback == null) && typeof options === 'function') { - // Shift. - [callback, options] = [options, null] - } - - // Fallback to using very last argument as the callback function - const lastArgument = args[args.length - 1] - if ((callback == null) && typeof lastArgument === 'function') { - callback = lastArgument - } - - return [window, options, callback] -} - -const normalizeAccessKey = (text) => { - if (typeof text !== 'string') return text - - // macOS does not have access keys so remove single ampersands - // and replace double ampersands with a single ampersand - if (process.platform === 'darwin') { - return text.replace(/&(&?)/g, '$1') - } - - // Linux uses a single underscore as an access key prefix so escape - // existing single underscores with a second underscore, replace double - // ampersands with a single ampersand, and replace a single ampersand with - // a single underscore - if (process.platform === 'linux') { - return text.replace(/_/g, '__').replace(/&(.?)/g, (match, after) => { - if (after === '&') return after - return `_${after}` - }) - } - - return text -} - -const checkAppInitialized = function () { - if (!app.isReady()) { - throw new Error('dialog module can only be used after app is ready') - } -} - -module.exports = { - showOpenDialog: function (...args) { - checkAppInitialized() - - let [window, options, callback] = parseArgs(...args) - - if (options == null) { - options = { - title: 'Open', - properties: ['openFile'] - } - } - - let { buttonLabel, defaultPath, filters, properties, title, message, securityScopedBookmarks = false } = options - - if (properties == null) { - properties = ['openFile'] - } else if (!Array.isArray(properties)) { - throw new TypeError('Properties must be an array') - } - - let dialogProperties = 0 - for (const prop in fileDialogProperties) { - if (properties.includes(prop)) { - dialogProperties |= fileDialogProperties[prop] - } - } - - if (title == null) { - title = '' - } else if (typeof title !== 'string') { - throw new TypeError('Title must be a string') - } - - if (buttonLabel == null) { - buttonLabel = '' - } else if (typeof buttonLabel !== 'string') { - throw new TypeError('Button label must be a string') - } - - if (defaultPath == null) { - defaultPath = '' - } else if (typeof defaultPath !== 'string') { - throw new TypeError('Default path must be a string') - } - - if (filters == null) { - filters = [] - } - - if (message == null) { - message = '' - } else if (typeof message !== 'string') { - throw new TypeError('Message must be a string') - } - - const wrappedCallback = typeof callback === 'function' ? function (success, result, bookmarkData) { - return success ? callback(result, bookmarkData) : callback() - } : null - const settings = { title, buttonLabel, defaultPath, filters, message, securityScopedBookmarks, window } - settings.properties = dialogProperties - return binding.showOpenDialog(settings, wrappedCallback) - }, - - showSaveDialog: function (...args) { - checkAppInitialized() - - let [window, options, callback] = parseArgs(...args) - - if (options == null) { - options = { - title: 'Save' - } - } - - let { buttonLabel, defaultPath, filters, title, message, securityScopedBookmarks = false, nameFieldLabel, showsTagField } = options - - if (title == null) { - title = '' - } else if (typeof title !== 'string') { - throw new TypeError('Title must be a string') - } - - if (buttonLabel == null) { - buttonLabel = '' - } else if (typeof buttonLabel !== 'string') { - throw new TypeError('Button label must be a string') - } - - if (defaultPath == null) { - defaultPath = '' - } else if (typeof defaultPath !== 'string') { - throw new TypeError('Default path must be a string') - } - - if (filters == null) { - filters = [] - } - - if (message == null) { - message = '' - } else if (typeof message !== 'string') { - throw new TypeError('Message must be a string') - } - - if (nameFieldLabel == null) { - nameFieldLabel = '' - } else if (typeof nameFieldLabel !== 'string') { - throw new TypeError('Name field label must be a string') - } - - if (showsTagField == null) { - showsTagField = true - } - - const wrappedCallback = typeof callback === 'function' ? function (success, result, bookmarkData) { - return success ? callback(result, bookmarkData) : callback() - } : null - const settings = { title, buttonLabel, defaultPath, filters, message, securityScopedBookmarks, nameFieldLabel, showsTagField, window } - return binding.showSaveDialog(settings, wrappedCallback) - }, - - showMessageBox: function (...args) { - checkAppInitialized() - - let [window, options, callback] = parseArgs(...args) - - if (options == null) { - options = { - type: 'none' - } - } - - let { - buttons, cancelId, checkboxLabel, checkboxChecked, defaultId, detail, - icon, message, title, type - } = options - - if (type == null) { - type = 'none' - } - - const messageBoxType = messageBoxTypes.indexOf(type) - if (messageBoxType === -1) { - throw new TypeError('Invalid message box type') - } - - if (buttons == null) { - buttons = [] - } else if (!Array.isArray(buttons)) { - throw new TypeError('Buttons must be an array') - } - - if (options.normalizeAccessKeys) { - buttons = buttons.map(normalizeAccessKey) - } - - if (title == null) { - title = '' - } else if (typeof title !== 'string') { - throw new TypeError('Title must be a string') - } - - if (message == null) { - message = '' - } else if (typeof message !== 'string') { - throw new TypeError('Message must be a string') - } - - if (detail == null) { - detail = '' - } else if (typeof detail !== 'string') { - throw new TypeError('Detail must be a string') - } - - checkboxChecked = !!checkboxChecked - - if (checkboxLabel == null) { - checkboxLabel = '' - } else if (typeof checkboxLabel !== 'string') { - throw new TypeError('checkboxLabel must be a string') - } - - if (icon == null) { - icon = null - } - - if (defaultId == null) { - defaultId = -1 - } - - // Choose a default button to get selected when dialog is cancelled. - if (cancelId == null) { - // If the defaultId is set to 0, ensure the cancel button is a different index (1) - cancelId = (defaultId === 0 && buttons.length > 1) ? 1 : 0 - for (let i = 0; i < buttons.length; i++) { - const text = buttons[i].toLowerCase() - if (text === 'cancel' || text === 'no') { - cancelId = i - break - } - } - } - - const flags = options.noLink ? messageBoxOptions.noLink : 0 - return binding.showMessageBox(messageBoxType, buttons, defaultId, cancelId, - flags, title, message, detail, checkboxLabel, - checkboxChecked, icon, window, callback) - }, - - showErrorBox: function (...args) { - return binding.showErrorBox(...args) - }, - - showCertificateTrustDialog: function (...args) { - const [window, options, callback] = parseArgs(...args) - - if (options == null || typeof options !== 'object') { - throw new TypeError('options must be an object') - } - - let { certificate, message } = options - if (certificate == null || typeof certificate !== 'object') { - throw new TypeError('certificate must be an object') - } - - if (message == null) { - message = '' - } else if (typeof message !== 'string') { - throw new TypeError('message must be a string') - } - - return binding.showCertificateTrustDialog(window, certificate, message, callback) - } -} - -// Mark standard asynchronous functions. -v8Util.setHiddenValue(module.exports.showMessageBox, 'asynchronous', true) -v8Util.setHiddenValue(module.exports.showOpenDialog, 'asynchronous', true) -v8Util.setHiddenValue(module.exports.showSaveDialog, 'asynchronous', true) diff --git a/electronasar/stable/browser/api/exports/electron.js b/electronasar/stable/browser/api/exports/electron.js deleted file mode 100644 index 0cf6c26..0000000 --- a/electronasar/stable/browser/api/exports/electron.js +++ /dev/null @@ -1,15 +0,0 @@ -'use strict' - -const common = require('@electron/internal/common/api/exports/electron') -// since browser module list is also used in renderer, keep it separate. -const moduleList = require('@electron/internal/browser/api/module-list') - -// Import common modules. -common.defineProperties(exports) - -for (const module of moduleList) { - Object.defineProperty(exports, module.name, { - enumerable: !module.private, - get: common.memoizedGetter(() => require(`@electron/internal/browser/api/${module.file}.js`)) - }) -} diff --git a/electronasar/stable/browser/api/global-shortcut.js b/electronasar/stable/browser/api/global-shortcut.js deleted file mode 100644 index ec9878e..0000000 --- a/electronasar/stable/browser/api/global-shortcut.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict' - -module.exports = process.atomBinding('global_shortcut').globalShortcut diff --git a/electronasar/stable/browser/api/in-app-purchase.js b/electronasar/stable/browser/api/in-app-purchase.js deleted file mode 100644 index 95f4589..0000000 --- a/electronasar/stable/browser/api/in-app-purchase.js +++ /dev/null @@ -1,20 +0,0 @@ -'use strict' - -if (process.platform === 'darwin') { - const { EventEmitter } = require('events') - const { inAppPurchase, InAppPurchase } = process.atomBinding('in_app_purchase') - - // inAppPurchase is an EventEmitter. - Object.setPrototypeOf(InAppPurchase.prototype, EventEmitter.prototype) - EventEmitter.call(inAppPurchase) - - module.exports = inAppPurchase -} else { - module.exports = { - purchaseProduct: (productID, quantity, callback) => { - throw new Error('The inAppPurchase module can only be used on macOS') - }, - canMakePayments: () => false, - getReceiptURL: () => '' - } -} diff --git a/electronasar/stable/browser/api/ipc-main.js b/electronasar/stable/browser/api/ipc-main.js deleted file mode 100644 index 9ab9569..0000000 --- a/electronasar/stable/browser/api/ipc-main.js +++ /dev/null @@ -1,10 +0,0 @@ -'use strict' - -const { EventEmitter } = require('events') - -const emitter = new EventEmitter() - -// Do not throw exception when channel name is "error". -emitter.on('error', () => {}) - -module.exports = emitter diff --git a/electronasar/stable/browser/api/menu-item-roles.js b/electronasar/stable/browser/api/menu-item-roles.js deleted file mode 100644 index 826ad83..0000000 --- a/electronasar/stable/browser/api/menu-item-roles.js +++ /dev/null @@ -1,297 +0,0 @@ -'use strict' - -const { app } = require('electron') - -const roles = { - about: { - get label () { - return process.platform === 'linux' ? 'About' : `About ${app.getName()}` - } - }, - close: { - label: process.platform === 'darwin' ? 'Close Window' : 'Close', - accelerator: 'CommandOrControl+W', - windowMethod: 'close' - }, - copy: { - label: 'Copy', - accelerator: 'CommandOrControl+C', - webContentsMethod: 'copy', - registerAccelerator: false - }, - cut: { - label: 'Cut', - accelerator: 'CommandOrControl+X', - webContentsMethod: 'cut', - registerAccelerator: false - }, - delete: { - label: 'Delete', - webContentsMethod: 'delete' - }, - forcereload: { - label: 'Force Reload', - accelerator: 'Shift+CmdOrCtrl+R', - nonNativeMacOSRole: true, - windowMethod: (window) => { - window.webContents.reloadIgnoringCache() - } - }, - front: { - label: 'Bring All to Front' - }, - help: { - label: 'Help' - }, - hide: { - get label () { - return `Hide ${app.getName()}` - }, - accelerator: 'Command+H' - }, - hideothers: { - label: 'Hide Others', - accelerator: 'Command+Alt+H' - }, - minimize: { - label: 'Minimize', - accelerator: 'CommandOrControl+M', - windowMethod: 'minimize' - }, - paste: { - label: 'Paste', - accelerator: 'CommandOrControl+V', - webContentsMethod: 'paste', - registerAccelerator: false - }, - pasteandmatchstyle: { - label: 'Paste and Match Style', - accelerator: 'Shift+CommandOrControl+V', - webContentsMethod: 'pasteAndMatchStyle', - registerAccelerator: false - }, - quit: { - get label () { - switch (process.platform) { - case 'darwin': return `Quit ${app.getName()}` - case 'win32': return 'Exit' - default: return 'Quit' - } - }, - accelerator: process.platform === 'win32' ? null : 'CommandOrControl+Q', - appMethod: 'quit' - }, - redo: { - label: 'Redo', - accelerator: process.platform === 'win32' ? 'Control+Y' : 'Shift+CommandOrControl+Z', - webContentsMethod: 'redo' - }, - reload: { - label: 'Reload', - accelerator: 'CmdOrCtrl+R', - nonNativeMacOSRole: true, - windowMethod: 'reload' - }, - resetzoom: { - label: 'Actual Size', - accelerator: 'CommandOrControl+0', - nonNativeMacOSRole: true, - webContentsMethod: (webContents) => { - webContents.setZoomLevel(0) - } - }, - selectall: { - label: 'Select All', - accelerator: 'CommandOrControl+A', - webContentsMethod: 'selectAll' - }, - services: { - label: 'Services' - }, - recentdocuments: { - label: 'Open Recent' - }, - clearrecentdocuments: { - label: 'Clear Menu' - }, - startspeaking: { - label: 'Start Speaking' - }, - stopspeaking: { - label: 'Stop Speaking' - }, - toggledevtools: { - label: 'Toggle Developer Tools', - accelerator: process.platform === 'darwin' ? 'Alt+Command+I' : 'Ctrl+Shift+I', - nonNativeMacOSRole: true, - windowMethod: 'toggleDevTools' - }, - togglefullscreen: { - label: 'Toggle Full Screen', - accelerator: process.platform === 'darwin' ? 'Control+Command+F' : 'F11', - windowMethod: (window) => { - window.setFullScreen(!window.isFullScreen()) - } - }, - undo: { - label: 'Undo', - accelerator: 'CommandOrControl+Z', - webContentsMethod: 'undo' - }, - unhide: { - label: 'Show All' - }, - window: { - label: 'Window' - }, - zoom: { - label: 'Zoom' - }, - zoomin: { - label: 'Zoom In', - accelerator: 'CommandOrControl+Plus', - nonNativeMacOSRole: true, - webContentsMethod: (webContents) => { - webContents.getZoomLevel((zoomLevel) => { - webContents.setZoomLevel(zoomLevel + 0.5) - }) - } - }, - zoomout: { - label: 'Zoom Out', - accelerator: 'CommandOrControl+-', - nonNativeMacOSRole: true, - webContentsMethod: (webContents) => { - webContents.getZoomLevel((zoomLevel) => { - webContents.setZoomLevel(zoomLevel - 0.5) - }) - } - }, - // Edit submenu (should fit both Mac & Windows) - editmenu: { - label: 'Edit', - submenu: [ - { - role: 'undo' - }, - { - role: 'redo' - }, - { - type: 'separator' - }, - { - role: 'cut' - }, - { - role: 'copy' - }, - { - role: 'paste' - }, - - process.platform === 'darwin' ? { - role: 'pasteAndMatchStyle' - } : null, - - { - role: 'delete' - }, - - process.platform === 'win32' ? { - type: 'separator' - } : null, - - { - role: 'selectAll' - } - ] - }, - - // Window submenu should be used for Mac only - windowmenu: { - label: 'Window', - submenu: [ - { - role: 'minimize' - }, - { - role: 'close' - }, - - process.platform === 'darwin' ? { - type: 'separator' - } : null, - - process.platform === 'darwin' ? { - role: 'front' - } : null - - ] - } -} - -const canExecuteRole = (role) => { - if (!roles.hasOwnProperty(role)) return false - if (process.platform !== 'darwin') return true - - // macOS handles all roles natively except for a few - return roles[role].nonNativeMacOSRole -} - -exports.getDefaultLabel = (role) => { - return roles.hasOwnProperty(role) ? roles[role].label : '' -} - -exports.getDefaultAccelerator = (role) => { - if (roles.hasOwnProperty(role)) return roles[role].accelerator -} - -exports.shouldRegisterAccelerator = (role) => { - const hasRoleRegister = roles.hasOwnProperty(role) && roles[role].registerAccelerator !== undefined - return hasRoleRegister ? roles[role].registerAccelerator : true -} - -exports.getDefaultSubmenu = (role) => { - if (!roles.hasOwnProperty(role)) return - - let { submenu } = roles[role] - - // remove null items from within the submenu - if (Array.isArray(submenu)) { - submenu = submenu.filter((item) => item != null) - } - - return submenu -} - -exports.execute = (role, focusedWindow, focusedWebContents) => { - if (!canExecuteRole(role)) return false - - const { appMethod, webContentsMethod, windowMethod } = roles[role] - - if (appMethod) { - app[appMethod]() - return true - } - - if (windowMethod && focusedWindow != null) { - if (typeof windowMethod === 'function') { - windowMethod(focusedWindow) - } else { - focusedWindow[windowMethod]() - } - return true - } - - if (webContentsMethod && focusedWebContents != null) { - if (typeof webContentsMethod === 'function') { - webContentsMethod(focusedWebContents) - } else { - focusedWebContents[webContentsMethod]() - } - return true - } - - return false -} diff --git a/electronasar/stable/browser/api/menu-item.js b/electronasar/stable/browser/api/menu-item.js deleted file mode 100644 index 33388cb..0000000 --- a/electronasar/stable/browser/api/menu-item.js +++ /dev/null @@ -1,85 +0,0 @@ -'use strict' - -const roles = require('@electron/internal/browser/api/menu-item-roles') - -let nextCommandId = 0 - -const MenuItem = function (options) { - const { Menu } = require('electron') - - // Preserve extra fields specified by user - for (const key in options) { - if (!(key in this)) this[key] = options[key] - } - if (typeof this.role === 'string' || this.role instanceof String) { - this.role = this.role.toLowerCase() - } - this.submenu = this.submenu || roles.getDefaultSubmenu(this.role) - if (this.submenu != null && this.submenu.constructor !== Menu) { - this.submenu = Menu.buildFromTemplate(this.submenu) - } - if (this.type == null && this.submenu != null) { - this.type = 'submenu' - } - if (this.type === 'submenu' && (this.submenu == null || this.submenu.constructor !== Menu)) { - throw new Error('Invalid submenu') - } - - this.overrideReadOnlyProperty('type', 'normal') - this.overrideReadOnlyProperty('role') - this.overrideReadOnlyProperty('accelerator') - this.overrideReadOnlyProperty('icon') - this.overrideReadOnlyProperty('submenu') - - this.overrideProperty('label', roles.getDefaultLabel(this.role)) - this.overrideProperty('sublabel', '') - this.overrideProperty('enabled', true) - this.overrideProperty('visible', true) - this.overrideProperty('checked', false) - this.overrideProperty('registerAccelerator', roles.shouldRegisterAccelerator(this.role)) - - if (!MenuItem.types.includes(this.type)) { - throw new Error(`Unknown menu item type: ${this.type}`) - } - - this.overrideReadOnlyProperty('commandId', ++nextCommandId) - - const click = options.click - this.click = (event, focusedWindow, focusedWebContents) => { - // Manually flip the checked flags when clicked. - if (this.type === 'checkbox' || this.type === 'radio') { - this.checked = !this.checked - } - - if (!roles.execute(this.role, focusedWindow, focusedWebContents)) { - if (typeof click === 'function') { - click(this, focusedWindow, event) - } else if (typeof this.selector === 'string' && process.platform === 'darwin') { - Menu.sendActionToFirstResponder(this.selector) - } - } - } -} - -MenuItem.types = ['normal', 'separator', 'submenu', 'checkbox', 'radio'] - -MenuItem.prototype.getDefaultRoleAccelerator = function () { - return roles.getDefaultAccelerator(this.role) -} - -MenuItem.prototype.overrideProperty = function (name, defaultValue = null) { - if (this[name] == null) { - this[name] = defaultValue - } -} - -MenuItem.prototype.overrideReadOnlyProperty = function (name, defaultValue) { - this.overrideProperty(name, defaultValue) - Object.defineProperty(this, name, { - enumerable: true, - writable: false, - value: this[name] - }) -} - -module.exports = MenuItem diff --git a/electronasar/stable/browser/api/menu-utils.js b/electronasar/stable/browser/api/menu-utils.js deleted file mode 100644 index 42636bf..0000000 --- a/electronasar/stable/browser/api/menu-utils.js +++ /dev/null @@ -1,176 +0,0 @@ -'use strict' - -function splitArray (arr, predicate) { - const result = arr.reduce((multi, item) => { - const current = multi[multi.length - 1] - if (predicate(item)) { - if (current.length > 0) multi.push([]) - } else { - current.push(item) - } - return multi - }, [[]]) - - if (result[result.length - 1].length === 0) { - return result.slice(0, result.length - 1) - } - return result -} - -function joinArrays (arrays, joinIDs) { - return arrays.reduce((joined, arr, i) => { - if (i > 0 && arr.length) { - if (joinIDs.length > 0) { - joined.push(joinIDs[0]) - joinIDs.splice(0, 1) - } else { - joined.push({ type: 'separator' }) - } - } - return joined.concat(arr) - }, []) -} - -function pushOntoMultiMap (map, key, value) { - if (!map.has(key)) { - map.set(key, []) - } - map.get(key).push(value) -} - -function indexOfGroupContainingID (groups, id, ignoreGroup) { - return groups.findIndex( - candidateGroup => - candidateGroup !== ignoreGroup && - candidateGroup.some( - candidateItem => candidateItem.id === id - ) - ) -} - -// Sort nodes topologically using a depth-first approach. Encountered cycles -// are broken. -function sortTopologically (originalOrder, edgesById) { - const sorted = [] - const marked = new Set() - - const visit = (mark) => { - if (marked.has(mark)) return - marked.add(mark) - const edges = edgesById.get(mark) - if (edges != null) { - edges.forEach(visit) - } - sorted.push(mark) - } - - originalOrder.forEach(visit) - return sorted -} - -function attemptToMergeAGroup (groups) { - for (let i = 0; i < groups.length; i++) { - const group = groups[i] - for (const item of group) { - const toIDs = [...(item.before || []), ...(item.after || [])] - for (const id of toIDs) { - const index = indexOfGroupContainingID(groups, id, group) - if (index === -1) continue - const mergeTarget = groups[index] - - mergeTarget.push(...group) - groups.splice(i, 1) - return true - } - } - } - return false -} - -function mergeGroups (groups) { - let merged = true - while (merged) { - merged = attemptToMergeAGroup(groups) - } - return groups -} - -function sortItemsInGroup (group) { - const originalOrder = group.map((node, i) => i) - const edges = new Map() - const idToIndex = new Map(group.map((item, i) => [item.id, i])) - - group.forEach((item, i) => { - if (item.before) { - item.before.forEach(toID => { - const to = idToIndex.get(toID) - if (to != null) { - pushOntoMultiMap(edges, to, i) - } - }) - } - if (item.after) { - item.after.forEach(toID => { - const to = idToIndex.get(toID) - if (to != null) { - pushOntoMultiMap(edges, i, to) - } - }) - } - }) - - const sortedNodes = sortTopologically(originalOrder, edges) - return sortedNodes.map(i => group[i]) -} - -function findEdgesInGroup (groups, i, edges) { - const group = groups[i] - for (const item of group) { - if (item.beforeGroupContaining) { - for (const id of item.beforeGroupContaining) { - const to = indexOfGroupContainingID(groups, id, group) - if (to !== -1) { - pushOntoMultiMap(edges, to, i) - return - } - } - } - if (item.afterGroupContaining) { - for (const id of item.afterGroupContaining) { - const to = indexOfGroupContainingID(groups, id, group) - if (to !== -1) { - pushOntoMultiMap(edges, i, to) - return - } - } - } - } -} - -function sortGroups (groups) { - const originalOrder = groups.map((item, i) => i) - const edges = new Map() - - for (let i = 0; i < groups.length; i++) { - findEdgesInGroup(groups, i, edges) - } - - const sortedGroupIndexes = sortTopologically(originalOrder, edges) - return sortedGroupIndexes.map(i => groups[i]) -} - -function sortMenuItems (menuItems) { - const isSeparator = (item) => item.type === 'separator' - const separators = menuItems.filter(i => i.type === 'separator') - - // Split the items into their implicit groups based upon separators. - const groups = splitArray(menuItems, isSeparator) - const mergedGroups = mergeGroups(groups) - const mergedGroupsWithSortedItems = mergedGroups.map(sortItemsInGroup) - const sortedGroups = sortGroups(mergedGroupsWithSortedItems) - - const joined = joinArrays(sortedGroups, separators) - return joined -} - -module.exports = { sortMenuItems } diff --git a/electronasar/stable/browser/api/menu.js b/electronasar/stable/browser/api/menu.js deleted file mode 100644 index 14fcaba..0000000 --- a/electronasar/stable/browser/api/menu.js +++ /dev/null @@ -1,258 +0,0 @@ -'use strict' - -const { TopLevelWindow, MenuItem, webContents } = require('electron') -const { sortMenuItems } = require('@electron/internal/browser/api/menu-utils') -const EventEmitter = require('events').EventEmitter -const v8Util = process.atomBinding('v8_util') -const bindings = process.atomBinding('menu') - -const { Menu } = bindings -let applicationMenu = null -let groupIdIndex = 0 - -Object.setPrototypeOf(Menu.prototype, EventEmitter.prototype) - -// Menu Delegate. -// This object should hold no reference to |Menu| to avoid cyclic reference. -const delegate = { - isCommandIdChecked: (menu, id) => menu.commandsMap[id] ? menu.commandsMap[id].checked : undefined, - isCommandIdEnabled: (menu, id) => menu.commandsMap[id] ? menu.commandsMap[id].enabled : undefined, - isCommandIdVisible: (menu, id) => menu.commandsMap[id] ? menu.commandsMap[id].visible : undefined, - getAcceleratorForCommandId: (menu, id, useDefaultAccelerator) => { - const command = menu.commandsMap[id] - if (!command) return - if (command.accelerator != null) return command.accelerator - if (useDefaultAccelerator) return command.getDefaultRoleAccelerator() - }, - shouldRegisterAcceleratorForCommandId: (menu, id) => menu.commandsMap[id] ? menu.commandsMap[id].registerAccelerator : undefined, - executeCommand: (menu, event, id) => { - const command = menu.commandsMap[id] - if (!command) return - command.click(event, TopLevelWindow.getFocusedWindow(), webContents.getFocusedWebContents()) - }, - menuWillShow: (menu) => { - // Ensure radio groups have at least one menu item seleted - for (const id in menu.groupsMap) { - const found = menu.groupsMap[id].find(item => item.checked) || null - if (!found) v8Util.setHiddenValue(menu.groupsMap[id][0], 'checked', true) - } - } -} - -/* Instance Methods */ - -Menu.prototype._init = function () { - this.commandsMap = {} - this.groupsMap = {} - this.items = [] - this.delegate = delegate -} - -Menu.prototype.popup = function (options = {}) { - if (options == null || typeof options !== 'object') { - throw new TypeError('Options must be an object') - } - let { window, x, y, positioningItem, callback } = options - - // no callback passed - if (!callback || typeof callback !== 'function') callback = () => {} - - // set defaults - if (typeof x !== 'number') x = -1 - if (typeof y !== 'number') y = -1 - if (typeof positioningItem !== 'number') positioningItem = -1 - - // find which window to use - const wins = TopLevelWindow.getAllWindows() - if (!wins || wins.indexOf(window) === -1) { - window = TopLevelWindow.getFocusedWindow() - if (!window && wins && wins.length > 0) { - window = wins[0] - } - if (!window) { - throw new Error(`Cannot open Menu without a TopLevelWindow present`) - } - } - - this.popupAt(window, x, y, positioningItem, callback) - return { browserWindow: window, x, y, position: positioningItem } -} - -Menu.prototype.closePopup = function (window) { - if (window instanceof TopLevelWindow) { - this.closePopupAt(window.id) - } else { - // Passing -1 (invalid) would make closePopupAt close the all menu runners - // belong to this menu. - this.closePopupAt(-1) - } -} - -Menu.prototype.getMenuItemById = function (id) { - const items = this.items - - let found = items.find(item => item.id === id) || null - for (let i = 0; !found && i < items.length; i++) { - if (items[i].submenu) { - found = items[i].submenu.getMenuItemById(id) - } - } - return found -} - -Menu.prototype.append = function (item) { - return this.insert(this.getItemCount(), item) -} - -Menu.prototype.insert = function (pos, item) { - if ((item ? item.constructor : void 0) !== MenuItem) { - throw new TypeError('Invalid item') - } - - // insert item depending on its type - insertItemByType.call(this, item, pos) - - // set item properties - if (item.sublabel) this.setSublabel(pos, item.sublabel) - if (item.icon) this.setIcon(pos, item.icon) - if (item.role) this.setRole(pos, item.role) - - // Make menu accessable to items. - item.overrideReadOnlyProperty('menu', this) - - // Remember the items. - this.items.splice(pos, 0, item) - this.commandsMap[item.commandId] = item -} - -Menu.prototype._callMenuWillShow = function () { - if (this.delegate) this.delegate.menuWillShow(this) - this.items.forEach(item => { - if (item.submenu) item.submenu._callMenuWillShow() - }) -} - -/* Static Methods */ - -Menu.getApplicationMenu = () => applicationMenu - -Menu.sendActionToFirstResponder = bindings.sendActionToFirstResponder - -// set application menu with a preexisting menu -Menu.setApplicationMenu = function (menu) { - if (menu && menu.constructor !== Menu) { - throw new TypeError('Invalid menu') - } - - applicationMenu = menu - if (process.platform === 'darwin') { - if (!menu) return - menu._callMenuWillShow() - bindings.setApplicationMenu(menu) - } else { - const windows = TopLevelWindow.getAllWindows() - return windows.map(w => w.setMenu(menu)) - } -} - -Menu.buildFromTemplate = function (template) { - if (!Array.isArray(template)) { - throw new TypeError('Invalid template for Menu: Menu template must be an array') - } - const menu = new Menu() - if (!areValidTemplateItems(template)) { - throw new TypeError('Invalid template for MenuItem: must have at least one of label, role or type') - } - const filtered = removeExtraSeparators(template) - const sorted = sortTemplate(filtered) - - sorted.forEach((item) => menu.append(new MenuItem(item))) - - return menu -} - -/* Helper Functions */ - -// validate the template against having the wrong attribute -function areValidTemplateItems (template) { - return template.every(item => - item != null && typeof item === 'object' && (item.hasOwnProperty('label') || item.hasOwnProperty('role') || item.type === 'separator')) -} - -function sortTemplate (template) { - const sorted = sortMenuItems(template) - for (const id in sorted) { - const item = sorted[id] - if (Array.isArray(item.submenu)) { - item.submenu = sortTemplate(item.submenu) - } - } - return sorted -} - -// Search between separators to find a radio menu item and return its group id -function generateGroupId (items, pos) { - if (pos > 0) { - for (let idx = pos - 1; idx >= 0; idx--) { - if (items[idx].type === 'radio') return items[idx].groupId - if (items[idx].type === 'separator') break - } - } else if (pos < items.length) { - for (let idx = pos; idx <= items.length - 1; idx++) { - if (items[idx].type === 'radio') return items[idx].groupId - if (items[idx].type === 'separator') break - } - } - groupIdIndex += 1 - return groupIdIndex -} - -function removeExtraSeparators (items) { - // fold adjacent separators together - let ret = items.filter((e, idx, arr) => { - if (e.visible === false) return true - return e.type !== 'separator' || idx === 0 || arr[idx - 1].type !== 'separator' - }) - - // remove edge separators - ret = ret.filter((e, idx, arr) => { - if (e.visible === false) return true - return e.type !== 'separator' || (idx !== 0 && idx !== arr.length - 1) - }) - - return ret -} - -function insertItemByType (item, pos) { - const types = { - normal: () => this.insertItem(pos, item.commandId, item.label), - checkbox: () => this.insertCheckItem(pos, item.commandId, item.label), - separator: () => this.insertSeparator(pos), - submenu: () => this.insertSubMenu(pos, item.commandId, item.label, item.submenu), - radio: () => { - // Grouping radio menu items - item.overrideReadOnlyProperty('groupId', generateGroupId(this.items, pos)) - if (this.groupsMap[item.groupId] == null) { - this.groupsMap[item.groupId] = [] - } - this.groupsMap[item.groupId].push(item) - - // Setting a radio menu item should flip other items in the group. - v8Util.setHiddenValue(item, 'checked', item.checked) - Object.defineProperty(item, 'checked', { - enumerable: true, - get: () => v8Util.getHiddenValue(item, 'checked'), - set: () => { - this.groupsMap[item.groupId].forEach(other => { - if (other !== item) v8Util.setHiddenValue(other, 'checked', false) - }) - v8Util.setHiddenValue(item, 'checked', true) - } - }) - this.insertRadioItem(pos, item.commandId, item.label, item.groupId) - } - } - types[item.type]() -} - -module.exports = Menu diff --git a/electronasar/stable/browser/api/module-list.js b/electronasar/stable/browser/api/module-list.js deleted file mode 100644 index 8ec7bda..0000000 --- a/electronasar/stable/browser/api/module-list.js +++ /dev/null @@ -1,46 +0,0 @@ -'use strict' - -const features = process.atomBinding('features') - -// Browser side modules, please sort alphabetically. -module.exports = [ - { name: 'app', file: 'app' }, - { name: 'autoUpdater', file: 'auto-updater' }, - { name: 'BrowserView', file: 'browser-view' }, - { name: 'BrowserWindow', file: 'browser-window' }, - { name: 'contentTracing', file: 'content-tracing' }, - { name: 'crashReporter', file: 'crash-reporter' }, - { name: 'dialog', file: 'dialog' }, - { name: 'globalShortcut', file: 'global-shortcut' }, - { name: 'ipcMain', file: 'ipc-main' }, - { name: 'inAppPurchase', file: 'in-app-purchase' }, - { name: 'Menu', file: 'menu' }, - { name: 'MenuItem', file: 'menu-item' }, - { name: 'net', file: 'net' }, - { name: 'netLog', file: 'net-log' }, - { name: 'Notification', file: 'notification' }, - { name: 'powerMonitor', file: 'power-monitor' }, - { name: 'powerSaveBlocker', file: 'power-save-blocker' }, - { name: 'protocol', file: 'protocol' }, - { name: 'screen', file: 'screen' }, - { name: 'session', file: 'session' }, - { name: 'systemPreferences', file: 'system-preferences' }, - { name: 'TopLevelWindow', file: 'top-level-window' }, - { name: 'TouchBar', file: 'touch-bar' }, - { name: 'Tray', file: 'tray' }, - { name: 'View', file: 'view' }, - { name: 'webContents', file: 'web-contents' }, - { name: 'WebContentsView', file: 'web-contents-view' }, - // The internal modules, invisible unless you know their names. - { name: 'NavigationController', file: 'navigation-controller', private: true } -] - -if (features.isViewApiEnabled()) { - module.exports.push( - { name: 'BoxLayout', file: 'views/box-layout' }, - { name: 'Button', file: 'views/button' }, - { name: 'LabelButton', file: 'views/label-button' }, - { name: 'LayoutManager', file: 'views/layout-manager' }, - { name: 'TextField', file: 'views/text-field' } - ) -} diff --git a/electronasar/stable/browser/api/navigation-controller.js b/electronasar/stable/browser/api/navigation-controller.js deleted file mode 100644 index a997714..0000000 --- a/electronasar/stable/browser/api/navigation-controller.js +++ /dev/null @@ -1,179 +0,0 @@ -'use strict' - -const ipcMain = require('@electron/internal/browser/ipc-main-internal') - -// The history operation in renderer is redirected to browser. -ipcMain.on('ELECTRON_NAVIGATION_CONTROLLER_GO_BACK', function (event) { - event.sender.goBack() -}) - -ipcMain.on('ELECTRON_NAVIGATION_CONTROLLER_GO_FORWARD', function (event) { - event.sender.goForward() -}) - -ipcMain.on('ELECTRON_NAVIGATION_CONTROLLER_GO_TO_OFFSET', function (event, offset) { - event.sender.goToOffset(offset) -}) - -ipcMain.on('ELECTRON_NAVIGATION_CONTROLLER_LENGTH', function (event) { - event.returnValue = event.sender.length() -}) - -// JavaScript implementation of Chromium's NavigationController. -// Instead of relying on Chromium for history control, we compeletely do history -// control on user land, and only rely on WebContents.loadURL for navigation. -// This helps us avoid Chromium's various optimizations so we can ensure renderer -// process is restarted everytime. -const NavigationController = (function () { - function NavigationController (webContents) { - this.webContents = webContents - this.clearHistory() - - // webContents may have already navigated to a page. - if (this.webContents._getURL()) { - this.currentIndex++ - this.history.push(this.webContents._getURL()) - } - this.webContents.on('navigation-entry-commited', (event, url, inPage, replaceEntry) => { - if (this.inPageIndex > -1 && !inPage) { - // Navigated to a new page, clear in-page mark. - this.inPageIndex = -1 - } else if (this.inPageIndex === -1 && inPage && !replaceEntry) { - // Started in-page navigations. - this.inPageIndex = this.currentIndex - } - if (this.pendingIndex >= 0) { - // Go to index. - this.currentIndex = this.pendingIndex - this.pendingIndex = -1 - this.history[this.currentIndex] = url - } else if (replaceEntry) { - // Non-user initialized navigation. - this.history[this.currentIndex] = url - } else { - // Normal navigation. Clear history. - this.history = this.history.slice(0, this.currentIndex + 1) - this.currentIndex++ - this.history.push(url) - } - }) - } - - NavigationController.prototype.loadURL = function (url, options) { - if (options == null) { - options = {} - } - this.pendingIndex = -1 - this.webContents._loadURL(url, options) - return this.webContents.emit('load-url', url, options) - } - - NavigationController.prototype.getURL = function () { - if (this.currentIndex === -1) { - return '' - } else { - return this.history[this.currentIndex] - } - } - - NavigationController.prototype.stop = function () { - this.pendingIndex = -1 - return this.webContents._stop() - } - - NavigationController.prototype.reload = function () { - this.pendingIndex = this.currentIndex - return this.webContents._loadURL(this.getURL(), {}) - } - - NavigationController.prototype.reloadIgnoringCache = function () { - this.pendingIndex = this.currentIndex - return this.webContents._loadURL(this.getURL(), { - extraHeaders: 'pragma: no-cache\n' - }) - } - - NavigationController.prototype.canGoBack = function () { - return this.getActiveIndex() > 0 - } - - NavigationController.prototype.canGoForward = function () { - return this.getActiveIndex() < this.history.length - 1 - } - - NavigationController.prototype.canGoToIndex = function (index) { - return index >= 0 && index < this.history.length - } - - NavigationController.prototype.canGoToOffset = function (offset) { - return this.canGoToIndex(this.currentIndex + offset) - } - - NavigationController.prototype.clearHistory = function () { - this.history = [] - this.currentIndex = -1 - this.pendingIndex = -1 - this.inPageIndex = -1 - } - - NavigationController.prototype.goBack = function () { - if (!this.canGoBack()) { - return - } - this.pendingIndex = this.getActiveIndex() - 1 - if (this.inPageIndex > -1 && this.pendingIndex >= this.inPageIndex) { - return this.webContents._goBack() - } else { - return this.webContents._loadURL(this.history[this.pendingIndex], {}) - } - } - - NavigationController.prototype.goForward = function () { - if (!this.canGoForward()) { - return - } - this.pendingIndex = this.getActiveIndex() + 1 - if (this.inPageIndex > -1 && this.pendingIndex >= this.inPageIndex) { - return this.webContents._goForward() - } else { - return this.webContents._loadURL(this.history[this.pendingIndex], {}) - } - } - - NavigationController.prototype.goToIndex = function (index) { - if (!this.canGoToIndex(index)) { - return - } - this.pendingIndex = index - return this.webContents._loadURL(this.history[this.pendingIndex], {}) - } - - NavigationController.prototype.goToOffset = function (offset) { - if (!this.canGoToOffset(offset)) { - return - } - const pendingIndex = this.currentIndex + offset - if (this.inPageIndex > -1 && pendingIndex >= this.inPageIndex) { - this.pendingIndex = pendingIndex - return this.webContents._goToOffset(offset) - } else { - return this.goToIndex(pendingIndex) - } - } - - NavigationController.prototype.getActiveIndex = function () { - if (this.pendingIndex === -1) { - return this.currentIndex - } else { - return this.pendingIndex - } - } - - NavigationController.prototype.length = function () { - return this.history.length - } - - return NavigationController -})() - -module.exports = NavigationController diff --git a/electronasar/stable/browser/api/net-log.js b/electronasar/stable/browser/api/net-log.js deleted file mode 100644 index 1649c63..0000000 --- a/electronasar/stable/browser/api/net-log.js +++ /dev/null @@ -1,28 +0,0 @@ -'use strict' - -// TODO(deepak1556): Deprecate and remove standalone netLog module, -// it is now a property of sessio module. -const { app, session } = require('electron') - -// Fallback to default session. -Object.setPrototypeOf(module.exports, new Proxy({}, { - get (target, property) { - if (!app.isReady()) return - - const netLog = session.defaultSession.netLog - if (!Object.getPrototypeOf(netLog).hasOwnProperty(property)) return - - // Returning a native function directly would throw error. - return (...args) => netLog[property](...args) - }, - - ownKeys () { - if (!app.isReady()) return [] - - return Object.getOwnPropertyNames(Object.getPrototypeOf(session.defaultSession.netLog)) - }, - - getOwnPropertyDescriptor (target) { - return { configurable: true, enumerable: true } - } -})) diff --git a/electronasar/stable/browser/api/net.js b/electronasar/stable/browser/api/net.js deleted file mode 100644 index 0d8cb71..0000000 --- a/electronasar/stable/browser/api/net.js +++ /dev/null @@ -1,372 +0,0 @@ -'use strict' - -const url = require('url') -const { EventEmitter } = require('events') -const { Readable } = require('stream') -const { app } = require('electron') -const { Session } = process.atomBinding('session') -const { net, Net } = process.atomBinding('net') -const { URLRequest } = net - -// Net is an EventEmitter. -Object.setPrototypeOf(Net.prototype, EventEmitter.prototype) -EventEmitter.call(net) - -Object.setPrototypeOf(URLRequest.prototype, EventEmitter.prototype) - -const kSupportedProtocols = new Set(['http:', 'https:']) - -class IncomingMessage extends Readable { - constructor (urlRequest) { - super() - this.urlRequest = urlRequest - this.shouldPush = false - this.data = [] - this.urlRequest.on('data', (event, chunk) => { - this._storeInternalData(chunk) - this._pushInternalData() - }) - this.urlRequest.on('end', () => { - this._storeInternalData(null) - this._pushInternalData() - }) - } - - get statusCode () { - return this.urlRequest.statusCode - } - - get statusMessage () { - return this.urlRequest.statusMessage - } - - get headers () { - return this.urlRequest.rawResponseHeaders - } - - get httpVersion () { - return `${this.httpVersionMajor}.${this.httpVersionMinor}` - } - - get httpVersionMajor () { - return this.urlRequest.httpVersionMajor - } - - get httpVersionMinor () { - return this.urlRequest.httpVersionMinor - } - - get rawTrailers () { - throw new Error('HTTP trailers are not supported.') - } - - get trailers () { - throw new Error('HTTP trailers are not supported.') - } - - _storeInternalData (chunk) { - this.data.push(chunk) - } - - _pushInternalData () { - while (this.shouldPush && this.data.length > 0) { - const chunk = this.data.shift() - this.shouldPush = this.push(chunk) - } - } - - _read () { - this.shouldPush = true - this._pushInternalData() - } -} - -URLRequest.prototype._emitRequestEvent = function (isAsync, ...rest) { - if (isAsync) { - process.nextTick(() => { - this.clientRequest.emit(...rest) - }) - } else { - this.clientRequest.emit(...rest) - } -} - -URLRequest.prototype._emitResponseEvent = function (isAsync, ...rest) { - if (isAsync) { - process.nextTick(() => { - this._response.emit(...rest) - }) - } else { - this._response.emit(...rest) - } -} - -class ClientRequest extends EventEmitter { - constructor (options, callback) { - super() - - if (!app.isReady()) { - throw new Error('net module can only be used after app is ready') - } - - if (typeof options === 'string') { - options = url.parse(options) - } else { - options = Object.assign({}, options) - } - - const method = (options.method || 'GET').toUpperCase() - let urlStr = options.url - - if (!urlStr) { - const urlObj = {} - const protocol = options.protocol || 'http:' - if (!kSupportedProtocols.has(protocol)) { - throw new Error('Protocol "' + protocol + '" not supported. ') - } - urlObj.protocol = protocol - - if (options.host) { - urlObj.host = options.host - } else { - if (options.hostname) { - urlObj.hostname = options.hostname - } else { - urlObj.hostname = 'localhost' - } - - if (options.port) { - urlObj.port = options.port - } - } - - if (options.path && / /.test(options.path)) { - // The actual regex is more like /[^A-Za-z0-9\-._~!$&'()*+,;=/:@]/ - // with an additional rule for ignoring percentage-escaped characters - // but that's a) hard to capture in a regular expression that performs - // well, and b) possibly too restrictive for real-world usage. That's - // why it only scans for spaces because those are guaranteed to create - // an invalid request. - throw new TypeError('Request path contains unescaped characters.') - } - const pathObj = url.parse(options.path || '/') - urlObj.pathname = pathObj.pathname - urlObj.search = pathObj.search - urlObj.hash = pathObj.hash - urlStr = url.format(urlObj) - } - - const redirectPolicy = options.redirect || 'follow' - if (!['follow', 'error', 'manual'].includes(redirectPolicy)) { - throw new Error('redirect mode should be one of follow, error or manual') - } - - const urlRequestOptions = { - method: method, - url: urlStr, - redirect: redirectPolicy - } - if (options.session) { - if (options.session instanceof Session) { - urlRequestOptions.session = options.session - } else { - throw new TypeError('`session` should be an instance of the Session class.') - } - } else if (options.partition) { - if (typeof options.partition === 'string') { - urlRequestOptions.partition = options.partition - } else { - throw new TypeError('`partition` should be an a string.') - } - } - - const urlRequest = new URLRequest(urlRequestOptions) - - // Set back and forward links. - this.urlRequest = urlRequest - urlRequest.clientRequest = this - - // This is a copy of the extra headers structure held by the native - // net::URLRequest. The main reason is to keep the getHeader API synchronous - // after the request starts. - this.extraHeaders = {} - - if (options.headers) { - for (const key in options.headers) { - this.setHeader(key, options.headers[key]) - } - } - - // Set when the request uses chunked encoding. Can be switched - // to true only once and never set back to false. - this.chunkedEncodingEnabled = false - - urlRequest.on('response', () => { - const response = new IncomingMessage(urlRequest) - urlRequest._response = response - this.emit('response', response) - }) - - urlRequest.on('login', (event, authInfo, callback) => { - this.emit('login', authInfo, (username, password) => { - // If null or undefined username/password, force to empty string. - if (username === null || username === undefined) { - username = '' - } - if (typeof username !== 'string') { - throw new Error('username must be a string') - } - if (password === null || password === undefined) { - password = '' - } - if (typeof password !== 'string') { - throw new Error('password must be a string') - } - callback(username, password) - }) - }) - - if (callback) { - this.once('response', callback) - } - } - - get chunkedEncoding () { - return this.chunkedEncodingEnabled - } - - set chunkedEncoding (value) { - if (!this.urlRequest.notStarted) { - throw new Error('Can\'t set the transfer encoding, headers have been sent.') - } - this.chunkedEncodingEnabled = value - } - - setHeader (name, value) { - if (typeof name !== 'string') { - throw new TypeError('`name` should be a string in setHeader(name, value).') - } - if (value == null) { - throw new Error('`value` required in setHeader("' + name + '", value).') - } - if (!this.urlRequest.notStarted) { - throw new Error('Can\'t set headers after they are sent.') - } - - const key = name.toLowerCase() - this.extraHeaders[key] = value - this.urlRequest.setExtraHeader(name, value.toString()) - } - - getHeader (name) { - if (name == null) { - throw new Error('`name` is required for getHeader(name).') - } - - if (!this.extraHeaders) { - return - } - - const key = name.toLowerCase() - return this.extraHeaders[key] - } - - removeHeader (name) { - if (name == null) { - throw new Error('`name` is required for removeHeader(name).') - } - - if (!this.urlRequest.notStarted) { - throw new Error('Can\'t remove headers after they are sent.') - } - - const key = name.toLowerCase() - delete this.extraHeaders[key] - this.urlRequest.removeExtraHeader(name) - } - - _write (chunk, encoding, callback, isLast) { - const chunkIsString = typeof chunk === 'string' - const chunkIsBuffer = chunk instanceof Buffer - if (!chunkIsString && !chunkIsBuffer) { - throw new TypeError('First argument must be a string or Buffer.') - } - - if (chunkIsString) { - // We convert all strings into binary buffers. - chunk = Buffer.from(chunk, encoding) - } - - // Since writing to the network is asynchronous, we conservatively - // assume that request headers are written after delivering the first - // buffer to the network IO thread. - if (this.urlRequest.notStarted) { - this.urlRequest.setChunkedUpload(this.chunkedEncoding) - } - - // Headers are assumed to be sent on first call to _writeBuffer, - // i.e. after the first call to write or end. - const result = this.urlRequest.write(chunk, isLast) - - // The write callback is fired asynchronously to mimic Node.js. - if (callback) { - process.nextTick(callback) - } - - return result - } - - write (data, encoding, callback) { - if (this.urlRequest.finished) { - const error = new Error('Write after end.') - process.nextTick(writeAfterEndNT, this, error, callback) - return true - } - - return this._write(data, encoding, callback, false) - } - - end (data, encoding, callback) { - if (this.urlRequest.finished) { - return false - } - - if (typeof data === 'function') { - callback = data - encoding = null - data = null - } else if (typeof encoding === 'function') { - callback = encoding - encoding = null - } - - data = data || '' - - return this._write(data, encoding, callback, true) - } - - followRedirect () { - this.urlRequest.followRedirect() - } - - abort () { - this.urlRequest.cancel() - } - - getUploadProgress () { - return this.urlRequest.getUploadProgress() - } -} - -function writeAfterEndNT (self, error, callback) { - self.emit('error', error) - if (callback) callback(error) -} - -Net.prototype.request = function (options, callback) { - return new ClientRequest(options, callback) -} - -net.ClientRequest = ClientRequest - -module.exports = net diff --git a/electronasar/stable/browser/api/notification.js b/electronasar/stable/browser/api/notification.js deleted file mode 100644 index cc2374c..0000000 --- a/electronasar/stable/browser/api/notification.js +++ /dev/null @@ -1,10 +0,0 @@ -'use strict' - -const { EventEmitter } = require('events') -const { Notification, isSupported } = process.atomBinding('notification') - -Object.setPrototypeOf(Notification.prototype, EventEmitter.prototype) - -Notification.isSupported = isSupported - -module.exports = Notification diff --git a/electronasar/stable/browser/api/power-monitor.js b/electronasar/stable/browser/api/power-monitor.js deleted file mode 100644 index 5e3371d..0000000 --- a/electronasar/stable/browser/api/power-monitor.js +++ /dev/null @@ -1,25 +0,0 @@ -'use strict' - -const { EventEmitter } = require('events') -const { powerMonitor, PowerMonitor } = process.atomBinding('power_monitor') - -// PowerMonitor is an EventEmitter. -Object.setPrototypeOf(PowerMonitor.prototype, EventEmitter.prototype) -EventEmitter.call(powerMonitor) - -// On Linux we need to call blockShutdown() to subscribe to shutdown event. -if (process.platform === 'linux') { - powerMonitor.on('newListener', (event) => { - if (event === 'shutdown' && powerMonitor.listenerCount('shutdown') === 0) { - powerMonitor.blockShutdown() - } - }) - - powerMonitor.on('removeListener', (event) => { - if (event === 'shutdown' && powerMonitor.listenerCount('shutdown') === 0) { - powerMonitor.unblockShutdown() - } - }) -} - -module.exports = powerMonitor diff --git a/electronasar/stable/browser/api/power-save-blocker.js b/electronasar/stable/browser/api/power-save-blocker.js deleted file mode 100644 index 964ead8..0000000 --- a/electronasar/stable/browser/api/power-save-blocker.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict' - -module.exports = process.atomBinding('power_save_blocker').powerSaveBlocker diff --git a/electronasar/stable/browser/api/protocol.js b/electronasar/stable/browser/api/protocol.js deleted file mode 100644 index 0f1b0e6..0000000 --- a/electronasar/stable/browser/api/protocol.js +++ /dev/null @@ -1,29 +0,0 @@ -'use strict' - -const { app, session } = require('electron') - -// Global protocol APIs. -module.exports = process.atomBinding('protocol') - -// Fallback protocol APIs of default session. -Object.setPrototypeOf(module.exports, new Proxy({}, { - get (target, property) { - if (!app.isReady()) return - - const protocol = session.defaultSession.protocol - if (!Object.getPrototypeOf(protocol).hasOwnProperty(property)) return - - // Returning a native function directly would throw error. - return (...args) => protocol[property](...args) - }, - - ownKeys () { - if (!app.isReady()) return [] - - return Object.getOwnPropertyNames(Object.getPrototypeOf(session.defaultSession.protocol)) - }, - - getOwnPropertyDescriptor (target) { - return { configurable: true, enumerable: true } - } -})) diff --git a/electronasar/stable/browser/api/screen.js b/electronasar/stable/browser/api/screen.js deleted file mode 100644 index a91df7d..0000000 --- a/electronasar/stable/browser/api/screen.js +++ /dev/null @@ -1,10 +0,0 @@ -'use strict' - -const { EventEmitter } = require('events') -const { screen, Screen } = process.atomBinding('screen') - -// Screen is an EventEmitter. -Object.setPrototypeOf(Screen.prototype, EventEmitter.prototype) -EventEmitter.call(screen) - -module.exports = screen diff --git a/electronasar/stable/browser/api/session.js b/electronasar/stable/browser/api/session.js deleted file mode 100644 index 08c10ee..0000000 --- a/electronasar/stable/browser/api/session.js +++ /dev/null @@ -1,24 +0,0 @@ -'use strict' - -const { EventEmitter } = require('events') -const { app } = require('electron') -const { fromPartition, Session, Cookies } = process.atomBinding('session') - -// Public API. -Object.defineProperties(exports, { - defaultSession: { - enumerable: true, - get () { return fromPartition('') } - }, - fromPartition: { - enumerable: true, - value: fromPartition - } -}) - -Object.setPrototypeOf(Session.prototype, EventEmitter.prototype) -Object.setPrototypeOf(Cookies.prototype, EventEmitter.prototype) - -Session.prototype._init = function () { - app.emit('session-created', this) -} diff --git a/electronasar/stable/browser/api/system-preferences.js b/electronasar/stable/browser/api/system-preferences.js deleted file mode 100644 index bb663e8..0000000 --- a/electronasar/stable/browser/api/system-preferences.js +++ /dev/null @@ -1,10 +0,0 @@ -'use strict' - -const { EventEmitter } = require('events') -const { systemPreferences, SystemPreferences } = process.atomBinding('system_preferences') - -// SystemPreferences is an EventEmitter. -Object.setPrototypeOf(SystemPreferences.prototype, EventEmitter.prototype) -EventEmitter.call(systemPreferences) - -module.exports = systemPreferences diff --git a/electronasar/stable/browser/api/top-level-window.js b/electronasar/stable/browser/api/top-level-window.js deleted file mode 100644 index c7770ad..0000000 --- a/electronasar/stable/browser/api/top-level-window.js +++ /dev/null @@ -1,24 +0,0 @@ -'use strict' - -const electron = require('electron') -const { EventEmitter } = require('events') -const { TopLevelWindow } = process.atomBinding('top_level_window') - -Object.setPrototypeOf(TopLevelWindow.prototype, EventEmitter.prototype) - -TopLevelWindow.prototype._init = function () { - // Avoid recursive require. - const { app } = electron - - // Simulate the application menu on platforms other than macOS. - if (process.platform !== 'darwin') { - const menu = app.getApplicationMenu() - if (menu) this.setMenu(menu) - } -} - -TopLevelWindow.getFocusedWindow = () => { - return TopLevelWindow.getAllWindows().find((win) => win.isFocused()) -} - -module.exports = TopLevelWindow diff --git a/electronasar/stable/browser/api/touch-bar.js b/electronasar/stable/browser/api/touch-bar.js deleted file mode 100644 index ddacc73..0000000 --- a/electronasar/stable/browser/api/touch-bar.js +++ /dev/null @@ -1,343 +0,0 @@ -'use strict' - -const { EventEmitter } = require('events') - -let nextItemID = 1 - -class TouchBar extends EventEmitter { - // Bind a touch bar to a window - static _setOnWindow (touchBar, window) { - if (window._touchBar != null) { - window._touchBar._removeFromWindow(window) - } - - if (touchBar == null) { - window._setTouchBarItems([]) - return - } - - if (Array.isArray(touchBar)) { - touchBar = new TouchBar(touchBar) - } - touchBar._addToWindow(window) - } - - constructor (options) { - super() - - if (options == null) { - throw new Error('Must specify options object as first argument') - } - - let { items, escapeItem } = options - - // FIXME Support array as first argument, remove in 2.0 - if (Array.isArray(options)) { - items = options - escapeItem = null - } - - if (!Array.isArray(items)) { - items = [] - } - - this.changeListener = (item) => { - this.emit('change', item.id, item.type) - } - - this.windowListeners = {} - this.items = {} - this.ordereredItems = [] - this.escapeItem = escapeItem - - const registerItem = (item) => { - this.items[item.id] = item - item.on('change', this.changeListener) - if (item.child instanceof TouchBar) { - item.child.ordereredItems.forEach(registerItem) - } - } - items.forEach((item) => { - if (!(item instanceof TouchBarItem)) { - throw new Error('Each item must be an instance of TouchBarItem') - } - this.ordereredItems.push(item) - registerItem(item) - }) - } - - set escapeItem (item) { - if (item != null && !(item instanceof TouchBarItem)) { - throw new Error('Escape item must be an instance of TouchBarItem') - } - if (this.escapeItem != null) { - this.escapeItem.removeListener('change', this.changeListener) - } - this._escapeItem = item - if (this.escapeItem != null) { - this.escapeItem.on('change', this.changeListener) - } - this.emit('escape-item-change', item) - } - - get escapeItem () { - return this._escapeItem - } - - _addToWindow (window) { - const { id } = window - - // Already added to window - if (this.windowListeners.hasOwnProperty(id)) return - - window._touchBar = this - - const changeListener = (itemID) => { - window._refreshTouchBarItem(itemID) - } - this.on('change', changeListener) - - const escapeItemListener = (item) => { - window._setEscapeTouchBarItem(item != null ? item : {}) - } - this.on('escape-item-change', escapeItemListener) - - const interactionListener = (event, itemID, details) => { - let item = this.items[itemID] - if (item == null && this.escapeItem != null && this.escapeItem.id === itemID) { - item = this.escapeItem - } - if (item != null && item.onInteraction != null) { - item.onInteraction(details) - } - } - window.on('-touch-bar-interaction', interactionListener) - - const removeListeners = () => { - this.removeListener('change', changeListener) - this.removeListener('escape-item-change', escapeItemListener) - window.removeListener('-touch-bar-interaction', interactionListener) - window.removeListener('closed', removeListeners) - window._touchBar = null - delete this.windowListeners[id] - const unregisterItems = (items) => { - for (const item of items) { - item.removeListener('change', this.changeListener) - if (item.child instanceof TouchBar) { - unregisterItems(item.child.ordereredItems) - } - } - } - unregisterItems(this.ordereredItems) - if (this.escapeItem) { - this.escapeItem.removeListener('change', this.changeListener) - } - } - window.once('closed', removeListeners) - this.windowListeners[id] = removeListeners - - window._setTouchBarItems(this.ordereredItems) - escapeItemListener(this.escapeItem) - } - - _removeFromWindow (window) { - const removeListeners = this.windowListeners[window.id] - if (removeListeners != null) removeListeners() - } -} - -class TouchBarItem extends EventEmitter { - constructor () { - super() - this._addImmutableProperty('id', `${nextItemID++}`) - this._parents = [] - } - - _addImmutableProperty (name, value) { - Object.defineProperty(this, name, { - get: function () { - return value - }, - set: function () { - throw new Error(`Cannot override property ${name}`) - }, - enumerable: true, - configurable: false - }) - } - - _addLiveProperty (name, initialValue) { - const privateName = `_${name}` - this[privateName] = initialValue - Object.defineProperty(this, name, { - get: function () { - return this[privateName] - }, - set: function (value) { - this[privateName] = value - this.emit('change', this) - }, - enumerable: true - }) - } - - _addParent (item) { - const existing = this._parents.some(test => test.id === item.id) - if (!existing) { - this._parents.push({ - id: item.id, - type: item.type - }) - } - } -} - -TouchBar.TouchBarButton = class TouchBarButton extends TouchBarItem { - constructor (config) { - super() - if (config == null) config = {} - this._addImmutableProperty('type', 'button') - const { click, icon, iconPosition, label, backgroundColor } = config - this._addLiveProperty('label', label) - this._addLiveProperty('backgroundColor', backgroundColor) - this._addLiveProperty('icon', icon) - this._addLiveProperty('iconPosition', iconPosition) - if (typeof click === 'function') { - this._addImmutableProperty('onInteraction', () => { - config.click() - }) - } - } -} - -TouchBar.TouchBarColorPicker = class TouchBarColorPicker extends TouchBarItem { - constructor (config) { - super() - if (config == null) config = {} - this._addImmutableProperty('type', 'colorpicker') - const { availableColors, change, selectedColor } = config - this._addLiveProperty('availableColors', availableColors) - this._addLiveProperty('selectedColor', selectedColor) - - if (typeof change === 'function') { - this._addImmutableProperty('onInteraction', (details) => { - this._selectedColor = details.color - change(details.color) - }) - } - } -} - -TouchBar.TouchBarGroup = class TouchBarGroup extends TouchBarItem { - constructor (config) { - super() - if (config == null) config = {} - this._addImmutableProperty('type', 'group') - const defaultChild = (config.items instanceof TouchBar) ? config.items : new TouchBar(config.items) - this._addLiveProperty('child', defaultChild) - this.child.ordereredItems.forEach((item) => item._addParent(this)) - } -} - -TouchBar.TouchBarLabel = class TouchBarLabel extends TouchBarItem { - constructor (config) { - super() - if (config == null) config = {} - this._addImmutableProperty('type', 'label') - this._addLiveProperty('label', config.label) - this._addLiveProperty('textColor', config.textColor) - } -} - -TouchBar.TouchBarPopover = class TouchBarPopover extends TouchBarItem { - constructor (config) { - super() - if (config == null) config = {} - this._addImmutableProperty('type', 'popover') - this._addLiveProperty('label', config.label) - this._addLiveProperty('icon', config.icon) - this._addLiveProperty('showCloseButton', config.showCloseButton) - const defaultChild = (config.items instanceof TouchBar) ? config.items : new TouchBar(config.items) - this._addLiveProperty('child', defaultChild) - this.child.ordereredItems.forEach((item) => item._addParent(this)) - } -} - -TouchBar.TouchBarSlider = class TouchBarSlider extends TouchBarItem { - constructor (config) { - super() - if (config == null) config = {} - this._addImmutableProperty('type', 'slider') - const { change, label, minValue, maxValue, value } = config - this._addLiveProperty('label', label) - this._addLiveProperty('minValue', minValue) - this._addLiveProperty('maxValue', maxValue) - this._addLiveProperty('value', value) - - if (typeof change === 'function') { - this._addImmutableProperty('onInteraction', (details) => { - this._value = details.value - change(details.value) - }) - } - } -} - -TouchBar.TouchBarSpacer = class TouchBarSpacer extends TouchBarItem { - constructor (config) { - super() - if (config == null) config = {} - this._addImmutableProperty('type', 'spacer') - this._addImmutableProperty('size', config.size) - } -} - -TouchBar.TouchBarSegmentedControl = class TouchBarSegmentedControl extends TouchBarItem { - constructor (config) { - super() - if (config == null) config = {} - const { segmentStyle, segments, selectedIndex, change, mode } = config - this._addImmutableProperty('type', 'segmented_control') - this._addLiveProperty('segmentStyle', segmentStyle) - this._addLiveProperty('segments', segments || []) - this._addLiveProperty('selectedIndex', selectedIndex) - this._addLiveProperty('mode', mode) - - if (typeof change === 'function') { - this._addImmutableProperty('onInteraction', (details) => { - this._selectedIndex = details.selectedIndex - change(details.selectedIndex, details.isSelected) - }) - } - } -} - -TouchBar.TouchBarScrubber = class TouchBarScrubber extends TouchBarItem { - constructor (config) { - super() - if (config == null) config = {} - const { items, selectedStyle, overlayStyle, showArrowButtons, continuous, mode } = config - let { select, highlight } = config - this._addImmutableProperty('type', 'scrubber') - this._addLiveProperty('items', items) - this._addLiveProperty('selectedStyle', selectedStyle || null) - this._addLiveProperty('overlayStyle', overlayStyle || null) - this._addLiveProperty('showArrowButtons', showArrowButtons || false) - this._addLiveProperty('mode', mode || 'free') - this._addLiveProperty('continuous', typeof continuous === 'undefined' ? true : continuous) - - if (typeof select === 'function' || typeof highlight === 'function') { - if (select == null) select = () => {} - if (highlight == null) highlight = () => {} - this._addImmutableProperty('onInteraction', (details) => { - if (details.type === 'select' && typeof select === 'function') { - select(details.selectedIndex) - } else if (details.type === 'highlight' && typeof highlight === 'function') { - highlight(details.highlightedIndex) - } - }) - } - } -} - -module.exports = TouchBar diff --git a/electronasar/stable/browser/api/tray.js b/electronasar/stable/browser/api/tray.js deleted file mode 100644 index 1c6c108..0000000 --- a/electronasar/stable/browser/api/tray.js +++ /dev/null @@ -1,8 +0,0 @@ -'use strict' - -const { EventEmitter } = require('events') -const { Tray } = process.atomBinding('tray') - -Object.setPrototypeOf(Tray.prototype, EventEmitter.prototype) - -module.exports = Tray diff --git a/electronasar/stable/browser/api/view.js b/electronasar/stable/browser/api/view.js deleted file mode 100644 index cf39f8b..0000000 --- a/electronasar/stable/browser/api/view.js +++ /dev/null @@ -1,11 +0,0 @@ -'use strict' - -const { EventEmitter } = require('events') -const { View } = process.atomBinding('view') - -Object.setPrototypeOf(View.prototype, EventEmitter.prototype) - -View.prototype._init = function () { -} - -module.exports = View diff --git a/electronasar/stable/browser/api/web-contents-view.js b/electronasar/stable/browser/api/web-contents-view.js deleted file mode 100644 index 89f36e8..0000000 --- a/electronasar/stable/browser/api/web-contents-view.js +++ /dev/null @@ -1,15 +0,0 @@ -'use strict' - -const electron = require('electron') - -const { View } = electron -const { WebContentsView } = process.atomBinding('web_contents_view') - -Object.setPrototypeOf(WebContentsView.prototype, View.prototype) - -WebContentsView.prototype._init = function () { - // Call parent class's _init. - View.prototype._init.call(this) -} - -module.exports = WebContentsView diff --git a/electronasar/stable/browser/api/web-contents.js b/electronasar/stable/browser/api/web-contents.js deleted file mode 100644 index b3a244e..0000000 --- a/electronasar/stable/browser/api/web-contents.js +++ /dev/null @@ -1,507 +0,0 @@ -'use strict' - -const features = process.atomBinding('features') -const { EventEmitter } = require('events') -const electron = require('electron') -const path = require('path') -const url = require('url') -const v8Util = process.atomBinding('v8_util') -const { app, ipcMain, session, NavigationController, deprecate } = electron - -const ipcMainInternal = require('@electron/internal/browser/ipc-main-internal') -const errorUtils = require('@electron/internal/common/error-utils') - -// session is not used here, the purpose is to make sure session is initalized -// before the webContents module. -// eslint-disable-next-line -session - -let nextId = 0 -const getNextId = function () { - return ++nextId -} - -// Stock page sizes -const PDFPageSizes = { - A5: { - custom_display_name: 'A5', - height_microns: 210000, - name: 'ISO_A5', - width_microns: 148000 - }, - A4: { - custom_display_name: 'A4', - height_microns: 297000, - name: 'ISO_A4', - is_default: 'true', - width_microns: 210000 - }, - A3: { - custom_display_name: 'A3', - height_microns: 420000, - name: 'ISO_A3', - width_microns: 297000 - }, - Legal: { - custom_display_name: 'Legal', - height_microns: 355600, - name: 'NA_LEGAL', - width_microns: 215900 - }, - Letter: { - custom_display_name: 'Letter', - height_microns: 279400, - name: 'NA_LETTER', - width_microns: 215900 - }, - Tabloid: { - height_microns: 431800, - name: 'NA_LEDGER', - width_microns: 279400, - custom_display_name: 'Tabloid' - } -} - -// Default printing setting -const defaultPrintingSetting = { - pageRage: [], - mediaSize: {}, - landscape: false, - color: 2, - headerFooterEnabled: false, - marginsType: 0, - isFirstRequest: false, - requestID: getNextId(), - previewUIID: 0, - previewModifiable: true, - printToPDF: true, - printWithCloudPrint: false, - printWithPrivet: false, - printWithExtension: false, - deviceName: 'Save as PDF', - generateDraftData: true, - fitToPageEnabled: false, - scaleFactor: 1, - dpiHorizontal: 72, - dpiVertical: 72, - rasterizePDF: false, - duplex: 0, - copies: 1, - collate: true, - shouldPrintBackgrounds: false, - shouldPrintSelectionOnly: false -} - -// JavaScript implementations of WebContents. -const binding = process.atomBinding('web_contents') -const { WebContents } = binding - -Object.setPrototypeOf(NavigationController.prototype, EventEmitter.prototype) -Object.setPrototypeOf(WebContents.prototype, NavigationController.prototype) - -// WebContents::send(channel, args..) -// WebContents::sendToAll(channel, args..) -WebContents.prototype.send = function (channel, ...args) { - if (typeof channel !== 'string') { - throw new Error('Missing required channel argument') - } - - const internal = false - const sendToAll = false - - return this._send(internal, sendToAll, channel, args) -} -WebContents.prototype.sendToAll = function (channel, ...args) { - if (typeof channel !== 'string') { - throw new Error('Missing required channel argument') - } - - const internal = false - const sendToAll = true - - return this._send(internal, sendToAll, channel, args) -} - -WebContents.prototype._sendInternal = function (channel, ...args) { - if (typeof channel !== 'string') { - throw new Error('Missing required channel argument') - } - - const internal = true - const sendToAll = false - - return this._send(internal, sendToAll, channel, args) -} -WebContents.prototype._sendInternalToAll = function (channel, ...args) { - if (typeof channel !== 'string') { - throw new Error('Missing required channel argument') - } - - const internal = true - const sendToAll = true - - return this._send(internal, sendToAll, channel, args) -} - -// Following methods are mapped to webFrame. -const webFrameMethods = [ - 'insertCSS', - 'insertText', - 'setLayoutZoomLevelLimits', - 'setVisualZoomLevelLimits' -] - -const asyncWebFrameMethods = function (requestId, method, callback, ...args) { - return new Promise((resolve, reject) => { - ipcMainInternal.once(`ELECTRON_INTERNAL_BROWSER_ASYNC_WEB_FRAME_RESPONSE_${requestId}`, function (event, error, result) { - if (error == null) { - if (typeof callback === 'function') callback(result) - resolve(result) - } else { - reject(errorUtils.deserialize(error)) - } - }) - this._sendInternal('ELECTRON_INTERNAL_RENDERER_ASYNC_WEB_FRAME_METHOD', requestId, method, args) - }) -} - -for (const method of webFrameMethods) { - WebContents.prototype[method] = function (...args) { - this._sendInternal('ELECTRON_INTERNAL_RENDERER_WEB_FRAME_METHOD', method, args) - } -} - -// Make sure WebContents::executeJavaScript would run the code only when the -// WebContents has been loaded. -WebContents.prototype.executeJavaScript = function (code, hasUserGesture, callback) { - const requestId = getNextId() - - if (typeof hasUserGesture === 'function') { - // Shift. - callback = hasUserGesture - hasUserGesture = null - } - - if (hasUserGesture == null) { - hasUserGesture = false - } - - if (this.getURL() && !this.isLoadingMainFrame()) { - return asyncWebFrameMethods.call(this, requestId, 'executeJavaScript', callback, code, hasUserGesture) - } else { - return new Promise((resolve, reject) => { - this.once('did-stop-loading', () => { - asyncWebFrameMethods.call(this, requestId, 'executeJavaScript', callback, code, hasUserGesture).then(resolve).catch(reject) - }) - }) - } -} - -WebContents.prototype.takeHeapSnapshot = function (filePath) { - return new Promise((resolve, reject) => { - const channel = `ELECTRON_TAKE_HEAP_SNAPSHOT_RESULT_${getNextId()}` - ipcMainInternal.once(channel, (event, success) => { - if (success) { - resolve() - } else { - reject(new Error('takeHeapSnapshot failed')) - } - }) - if (!this._takeHeapSnapshot(filePath, channel)) { - ipcMainInternal.emit(channel, false) - } - }) -} - -// Translate the options of printToPDF. -WebContents.prototype.printToPDF = function (options, callback) { - const printingSetting = Object.assign({}, defaultPrintingSetting) - if (options.landscape) { - printingSetting.landscape = options.landscape - } - if (options.marginsType) { - printingSetting.marginsType = options.marginsType - } - if (options.printSelectionOnly) { - printingSetting.shouldPrintSelectionOnly = options.printSelectionOnly - } - if (options.printBackground) { - printingSetting.shouldPrintBackgrounds = options.printBackground - } - - if (options.pageSize) { - const pageSize = options.pageSize - if (typeof pageSize === 'object') { - if (!pageSize.height || !pageSize.width) { - return callback(new Error('Must define height and width for pageSize')) - } - // Dimensions in Microns - // 1 meter = 10^6 microns - printingSetting.mediaSize = { - name: 'CUSTOM', - custom_display_name: 'Custom', - height_microns: Math.ceil(pageSize.height), - width_microns: Math.ceil(pageSize.width) - } - } else if (PDFPageSizes[pageSize]) { - printingSetting.mediaSize = PDFPageSizes[pageSize] - } else { - return callback(new Error(`Does not support pageSize with ${pageSize}`)) - } - } else { - printingSetting.mediaSize = PDFPageSizes['A4'] - } - - // Chromium expects this in a 0-100 range number, not as float - printingSetting.scaleFactor *= 100 - if (features.isPrintingEnabled()) { - this._printToPDF(printingSetting, callback) - } else { - console.error('Error: Printing feature is disabled.') - } -} - -WebContents.prototype.print = function (...args) { - if (features.isPrintingEnabled()) { - this._print(...args) - } else { - console.error('Error: Printing feature is disabled.') - } -} - -WebContents.prototype.getPrinters = function () { - if (features.isPrintingEnabled()) { - return this._getPrinters() - } else { - console.error('Error: Printing feature is disabled.') - } -} - -WebContents.prototype.getZoomLevel = function (callback) { - if (typeof callback !== 'function') { - throw new Error('Must pass function as an argument') - } - process.nextTick(() => { - const zoomLevel = this._getZoomLevel() - callback(zoomLevel) - }) -} - -WebContents.prototype.loadFile = function (filePath, options = {}) { - if (typeof filePath !== 'string') { - throw new Error('Must pass filePath as a string') - } - const { query, search, hash } = options - - return this.loadURL(url.format({ - protocol: 'file', - slashes: true, - pathname: path.resolve(app.getAppPath(), filePath), - query, - search, - hash - })) -} - -WebContents.prototype.getZoomFactor = function (callback) { - if (typeof callback !== 'function') { - throw new Error('Must pass function as an argument') - } - process.nextTick(() => { - const zoomFactor = this._getZoomFactor() - callback(zoomFactor) - }) -} - -WebContents.prototype.findInPage = function (text, options = {}) { - // TODO (nitsakh): Remove in 5.0 - if (options.wordStart != null || options.medialCapitalAtWordStart != null) { - deprecate.log('wordStart and medialCapitalAtWordStart options are deprecated') - } - return this._findInPage(text, options) -} - -const safeProtocols = new Set([ - 'chrome-devtools:', - 'chrome-extension:' -]) - -const isWebContentsTrusted = function (contents) { - const pageURL = contents._getURL() - const { protocol } = url.parse(pageURL) - return safeProtocols.has(protocol) -} - -// Add JavaScript wrappers for WebContents class. -WebContents.prototype._init = function () { - // The navigation controller. - NavigationController.call(this, this) - - // Every remote callback from renderer process would add a listenter to the - // render-view-deleted event, so ignore the listenters warning. - this.setMaxListeners(0) - - // Dispatch IPC messages to the ipc module. - this.on('ipc-message', function (event, [channel, ...args]) { - ipcMain.emit(channel, event, ...args) - }) - this.on('ipc-message-sync', function (event, [channel, ...args]) { - Object.defineProperty(event, 'returnValue', { - set: function (value) { - return event.sendReply([value]) - }, - get: function () {} - }) - ipcMain.emit(channel, event, ...args) - }) - - this.on('ipc-internal-message', function (event, [channel, ...args]) { - ipcMainInternal.emit(channel, event, ...args) - }) - this.on('ipc-internal-message-sync', function (event, [channel, ...args]) { - Object.defineProperty(event, 'returnValue', { - set: function (value) { - return event.sendReply([value]) - }, - get: function () {} - }) - ipcMainInternal.emit(channel, event, ...args) - }) - - // Handle context menu action request from pepper plugin. - this.on('pepper-context-menu', function (event, params, callback) { - // Access Menu via electron.Menu to prevent circular require. - const menu = electron.Menu.buildFromTemplate(params.menu) - menu.popup({ - window: event.sender.getOwnerBrowserWindow(), - x: params.x, - y: params.y, - callback - }) - }) - - const forwardedEvents = [ - 'remote-require', - 'remote-get-global', - 'remote-get-builtin', - 'remote-get-current-window', - 'remote-get-current-web-contents', - 'remote-get-guest-web-contents' - ] - - for (const eventName of forwardedEvents) { - this.on(eventName, (event, ...args) => { - if (!isWebContentsTrusted(event.sender)) { - app.emit(eventName, event, this, ...args) - } - }) - } - - deprecate.event(this, 'did-get-response-details', '-did-get-response-details') - deprecate.event(this, 'did-get-redirect-request', '-did-get-redirect-request') - - // The devtools requests the webContents to reload. - this.on('devtools-reload-page', function () { - this.reload() - }) - - // Handle window.open for BrowserWindow and BrowserView. - if (['browserView', 'window'].includes(this.getType())) { - // Make new windows requested by links behave like "window.open" - this.webContents.on('-new-window', (event, url, frameName, disposition, - additionalFeatures, postData, - referrer) => { - const options = { - show: true, - width: 800, - height: 600 - } - ipcMainInternal.emit('ELECTRON_GUEST_WINDOW_MANAGER_INTERNAL_WINDOW_OPEN', - event, url, referrer, frameName, disposition, - options, additionalFeatures, postData) - }) - - this.webContents.on('-web-contents-created', (event, webContents, url, - frameName) => { - v8Util.setHiddenValue(webContents, 'url-framename', { url, frameName }) - }) - - // Create a new browser window for the native implementation of - // "window.open", used in sandbox and nativeWindowOpen mode - this.webContents.on('-add-new-contents', (event, webContents, disposition, - userGesture, left, top, width, - height) => { - const urlFrameName = v8Util.getHiddenValue(webContents, 'url-framename') - if ((disposition !== 'foreground-tab' && disposition !== 'new-window' && - disposition !== 'background-tab') || !urlFrameName) { - event.preventDefault() - return - } - - if (webContents.getLastWebPreferences().nodeIntegration === true) { - const message = - 'Enabling Node.js integration in child windows opened with the ' + - '"nativeWindowOpen" option will cause memory leaks, please turn off ' + - 'the "nodeIntegration" option.\\n' + - 'From 5.x child windows opened with the "nativeWindowOpen" option ' + - 'will always have Node.js integration disabled.\\n' + - 'See https://github.com/electron/electron/pull/15076 for more.' - // console is only available after DOM is created. - const printWarning = () => this.webContents.executeJavaScript(`console.warn('${message}')`) - if (this.webContents.isDomReady()) { - printWarning() - } else { - this.webContents.once('dom-ready', printWarning) - } - } - - const { url, frameName } = urlFrameName - v8Util.deleteHiddenValue(webContents, 'url-framename') - const options = { - show: true, - x: left, - y: top, - width: width || 800, - height: height || 600, - webContents - } - const referrer = { url: '', policy: 'default' } - ipcMainInternal.emit('ELECTRON_GUEST_WINDOW_MANAGER_INTERNAL_WINDOW_OPEN', - event, url, referrer, frameName, disposition, options) - }) - } - - app.emit('web-contents-created', {}, this) -} - -// JavaScript wrapper of Debugger. -const { Debugger } = process.atomBinding('debugger') - -Object.setPrototypeOf(Debugger.prototype, EventEmitter.prototype) - -// Public APIs. -module.exports = { - create (options = {}) { - return binding.create(options) - }, - - fromId (id) { - return binding.fromId(id) - }, - - getFocusedWebContents () { - let focused = null - for (const contents of binding.getAllWebContents()) { - if (!contents.isFocused()) continue - if (focused == null) focused = contents - // Return webview web contents which may be embedded inside another - // web contents that is also reporting as focused - if (contents.getType() === 'webview') return contents - } - return focused - }, - - getAllWebContents () { - return binding.getAllWebContents() - } -} diff --git a/electronasar/stable/browser/chrome-extension.js b/electronasar/stable/browser/chrome-extension.js deleted file mode 100644 index 3f4561f..0000000 --- a/electronasar/stable/browser/chrome-extension.js +++ /dev/null @@ -1,446 +0,0 @@ -'use strict' - -const { app, webContents, BrowserWindow } = require('electron') -const { getAllWebContents } = process.atomBinding('web_contents') -const renderProcessPreferences = process.atomBinding('render_process_preferences').forAllWebContents() -const ipcMain = require('@electron/internal/browser/ipc-main-internal') - -const { Buffer } = require('buffer') -const fs = require('fs') -const path = require('path') -const url = require('url') - -// Mapping between extensionId(hostname) and manifest. -const manifestMap = {} // extensionId => manifest -const manifestNameMap = {} // name => manifest -const devToolsExtensionNames = new Set() - -const generateExtensionIdFromName = function (name) { - return name.replace(/[\W_]+/g, '-').toLowerCase() -} - -const isWindowOrWebView = function (webContents) { - const type = webContents.getType() - return type === 'window' || type === 'webview' -} - -// Create or get manifest object from |srcDirectory|. -const getManifestFromPath = function (srcDirectory) { - let manifest - let manifestContent - - try { - manifestContent = fs.readFileSync(path.join(srcDirectory, 'manifest.json')) - } catch (readError) { - console.warn(`Reading ${path.join(srcDirectory, 'manifest.json')} failed.`) - console.warn(readError.stack || readError) - throw readError - } - - try { - manifest = JSON.parse(manifestContent) - } catch (parseError) { - console.warn(`Parsing ${path.join(srcDirectory, 'manifest.json')} failed.`) - console.warn(parseError.stack || parseError) - throw parseError - } - - if (!manifestNameMap[manifest.name]) { - const extensionId = generateExtensionIdFromName(manifest.name) - manifestMap[extensionId] = manifestNameMap[manifest.name] = manifest - Object.assign(manifest, { - srcDirectory: srcDirectory, - extensionId: extensionId, - // We can not use 'file://' directly because all resources in the extension - // will be treated as relative to the root in Chrome. - startPage: url.format({ - protocol: 'chrome-extension', - slashes: true, - hostname: extensionId, - pathname: manifest.devtools_page - }) - }) - return manifest - } else if (manifest && manifest.name) { - console.warn(`Attempted to load extension "${manifest.name}" that has already been loaded.`) - return manifest - } -} - -// Manage the background pages. -const backgroundPages = {} - -const startBackgroundPages = function (manifest) { - if (backgroundPages[manifest.extensionId] || !manifest.background) return - - let html - let name - if (manifest.background.page) { - name = manifest.background.page - html = fs.readFileSync(path.join(manifest.srcDirectory, manifest.background.page)) - } else { - name = '_generated_background_page.html' - const scripts = manifest.background.scripts.map((name) => { - return `<script src="${name}"></script>` - }).join('') - html = Buffer.from(`<html><body>${scripts}</body></html>`) - } - - const contents = webContents.create({ - partition: 'persist:__chrome_extension', - isBackgroundPage: true, - commandLineSwitches: ['--background-page'] - }) - backgroundPages[manifest.extensionId] = { html: html, webContents: contents, name: name } - contents.loadURL(url.format({ - protocol: 'chrome-extension', - slashes: true, - hostname: manifest.extensionId, - pathname: name - })) -} - -const removeBackgroundPages = function (manifest) { - if (!backgroundPages[manifest.extensionId]) return - - backgroundPages[manifest.extensionId].webContents.destroy() - delete backgroundPages[manifest.extensionId] -} - -const sendToBackgroundPages = function (...args) { - for (const page of Object.values(backgroundPages)) { - page.webContents._sendInternalToAll(...args) - } -} - -// Dispatch web contents events to Chrome APIs -const hookWebContentsEvents = function (webContents) { - const tabId = webContents.id - - sendToBackgroundPages('CHROME_TABS_ONCREATED') - - webContents.on('will-navigate', (event, url) => { - sendToBackgroundPages('CHROME_WEBNAVIGATION_ONBEFORENAVIGATE', { - frameId: 0, - parentFrameId: -1, - processId: webContents.getProcessId(), - tabId: tabId, - timeStamp: Date.now(), - url: url - }) - }) - - webContents.on('did-navigate', (event, url) => { - sendToBackgroundPages('CHROME_WEBNAVIGATION_ONCOMPLETED', { - frameId: 0, - parentFrameId: -1, - processId: webContents.getProcessId(), - tabId: tabId, - timeStamp: Date.now(), - url: url - }) - }) - - webContents.once('destroyed', () => { - sendToBackgroundPages('CHROME_TABS_ONREMOVED', tabId) - }) -} - -// Handle the chrome.* API messages. -let nextId = 0 - -ipcMain.on('CHROME_RUNTIME_CONNECT', function (event, extensionId, connectInfo) { - const page = backgroundPages[extensionId] - if (!page) { - console.error(`Connect to unknown extension ${extensionId}`) - return - } - - const portId = ++nextId - event.returnValue = { tabId: page.webContents.id, portId: portId } - - event.sender.once('render-view-deleted', () => { - if (page.webContents.isDestroyed()) return - page.webContents._sendInternalToAll(`CHROME_PORT_DISCONNECT_${portId}`) - }) - page.webContents._sendInternalToAll(`CHROME_RUNTIME_ONCONNECT_${extensionId}`, event.sender.id, portId, connectInfo) -}) - -ipcMain.on('CHROME_I18N_MANIFEST', function (event, extensionId) { - event.returnValue = manifestMap[extensionId] -}) - -let resultID = 1 -ipcMain.on('CHROME_RUNTIME_SENDMESSAGE', function (event, extensionId, message, originResultID) { - const page = backgroundPages[extensionId] - if (!page) { - console.error(`Connect to unknown extension ${extensionId}`) - return - } - - page.webContents._sendInternalToAll(`CHROME_RUNTIME_ONMESSAGE_${extensionId}`, event.sender.id, message, resultID) - ipcMain.once(`CHROME_RUNTIME_ONMESSAGE_RESULT_${resultID}`, (event, result) => { - event.sender._sendInternal(`CHROME_RUNTIME_SENDMESSAGE_RESULT_${originResultID}`, result) - }) - resultID++ -}) - -ipcMain.on('CHROME_TABS_SEND_MESSAGE', function (event, tabId, extensionId, isBackgroundPage, message, originResultID) { - const contents = webContents.fromId(tabId) - if (!contents) { - console.error(`Sending message to unknown tab ${tabId}`) - return - } - - const senderTabId = isBackgroundPage ? null : event.sender.id - - contents._sendInternalToAll(`CHROME_RUNTIME_ONMESSAGE_${extensionId}`, senderTabId, message, resultID) - ipcMain.once(`CHROME_RUNTIME_ONMESSAGE_RESULT_${resultID}`, (event, result) => { - event.sender._sendInternal(`CHROME_TABS_SEND_MESSAGE_RESULT_${originResultID}`, result) - }) - resultID++ -}) - -const isChromeExtension = function (pageURL) { - const { protocol } = url.parse(pageURL) - return protocol === 'chrome-extension:' -} - -ipcMain.on('CHROME_TABS_EXECUTESCRIPT', function (event, requestId, tabId, extensionId, details) { - const pageURL = event.sender._getURL() - if (!isChromeExtension(pageURL)) { - console.error(`Blocked ${pageURL} from calling chrome.tabs.executeScript()`) - return - } - - const contents = webContents.fromId(tabId) - if (!contents) { - console.error(`Sending message to unknown tab ${tabId}`) - return - } - - let code, url - if (details.file) { - const manifest = manifestMap[extensionId] - code = String(fs.readFileSync(path.join(manifest.srcDirectory, details.file))) - url = `chrome-extension://${extensionId}${details.file}` - } else { - code = details.code - url = `chrome-extension://${extensionId}/${String(Math.random()).substr(2, 8)}.js` - } - - contents._sendInternal('CHROME_TABS_EXECUTESCRIPT', event.sender.id, requestId, extensionId, url, code) -}) - -// Transfer the content scripts to renderer. -const contentScripts = {} - -const injectContentScripts = function (manifest) { - if (contentScripts[manifest.name] || !manifest.content_scripts) return - - const readArrayOfFiles = function (relativePath) { - return { - url: `chrome-extension://${manifest.extensionId}/${relativePath}`, - code: String(fs.readFileSync(path.join(manifest.srcDirectory, relativePath))) - } - } - - const contentScriptToEntry = function (script) { - return { - matches: script.matches, - js: script.js ? script.js.map(readArrayOfFiles) : [], - css: script.css ? script.css.map(readArrayOfFiles) : [], - runAt: script.run_at || 'document_idle' - } - } - - try { - const entry = { - extensionId: manifest.extensionId, - contentScripts: manifest.content_scripts.map(contentScriptToEntry) - } - contentScripts[manifest.name] = renderProcessPreferences.addEntry(entry) - } catch (e) { - console.error('Failed to read content scripts', e) - } -} - -const removeContentScripts = function (manifest) { - if (!contentScripts[manifest.name]) return - - renderProcessPreferences.removeEntry(contentScripts[manifest.name]) - delete contentScripts[manifest.name] -} - -// Transfer the |manifest| to a format that can be recognized by the -// |DevToolsAPI.addExtensions|. -const manifestToExtensionInfo = function (manifest) { - return { - startPage: manifest.startPage, - srcDirectory: manifest.srcDirectory, - name: manifest.name, - exposeExperimentalAPIs: true - } -} - -// Load the extensions for the window. -const loadExtension = function (manifest) { - startBackgroundPages(manifest) - injectContentScripts(manifest) -} - -const loadDevToolsExtensions = function (win, manifests) { - if (!win.devToolsWebContents) return - - manifests.forEach(loadExtension) - - const extensionInfoArray = manifests.map(manifestToExtensionInfo) - extensionInfoArray.forEach((extension) => { - win.devToolsWebContents._grantOriginAccess(extension.startPage) - }) - win.devToolsWebContents.executeJavaScript(`DevToolsAPI.addExtensions(${JSON.stringify(extensionInfoArray)})`) -} - -app.on('web-contents-created', function (event, webContents) { - if (!isWindowOrWebView(webContents)) return - - hookWebContentsEvents(webContents) - webContents.on('devtools-opened', function () { - loadDevToolsExtensions(webContents, Object.values(manifestMap)) - }) -}) - -// The chrome-extension: can map a extension URL request to real file path. -const chromeExtensionHandler = function (request, callback) { - const parsed = url.parse(request.url) - if (!parsed.hostname || !parsed.path) return callback() - - const manifest = manifestMap[parsed.hostname] - if (!manifest) return callback() - - const page = backgroundPages[parsed.hostname] - if (page && parsed.path === `/${page.name}`) { - // Disabled due to false positive in StandardJS - // eslint-disable-next-line standard/no-callback-literal - return callback({ - mimeType: 'text/html', - data: page.html - }) - } - - fs.readFile(path.join(manifest.srcDirectory, parsed.path), function (err, content) { - if (err) { - // Disabled due to false positive in StandardJS - // eslint-disable-next-line standard/no-callback-literal - return callback(-6) // FILE_NOT_FOUND - } else { - return callback(content) - } - }) -} - -app.on('session-created', function (ses) { - ses.protocol.registerBufferProtocol('chrome-extension', chromeExtensionHandler, function (error) { - if (error) { - console.error(`Unable to register chrome-extension protocol: ${error}`) - } - }) -}) - -// The persistent path of "DevTools Extensions" preference file. -let loadedDevToolsExtensionsPath = null - -app.on('will-quit', function () { - try { - const loadedDevToolsExtensions = Array.from(devToolsExtensionNames) - .map(name => manifestNameMap[name].srcDirectory) - if (loadedDevToolsExtensions.length > 0) { - try { - fs.mkdirSync(path.dirname(loadedDevToolsExtensionsPath)) - } catch (error) { - // Ignore error - } - fs.writeFileSync(loadedDevToolsExtensionsPath, JSON.stringify(loadedDevToolsExtensions)) - } else { - fs.unlinkSync(loadedDevToolsExtensionsPath) - } - } catch (error) { - // Ignore error - } -}) - -// We can not use protocol or BrowserWindow until app is ready. -app.once('ready', function () { - // The public API to add/remove extensions. - BrowserWindow.addExtension = function (srcDirectory) { - const manifest = getManifestFromPath(srcDirectory) - if (manifest) { - loadExtension(manifest) - for (const webContents of getAllWebContents()) { - if (isWindowOrWebView(webContents)) { - loadDevToolsExtensions(webContents, [manifest]) - } - } - return manifest.name - } - } - - BrowserWindow.removeExtension = function (name) { - const manifest = manifestNameMap[name] - if (!manifest) return - - removeBackgroundPages(manifest) - removeContentScripts(manifest) - delete manifestMap[manifest.extensionId] - delete manifestNameMap[name] - } - - BrowserWindow.getExtensions = function () { - const extensions = {} - Object.keys(manifestNameMap).forEach(function (name) { - const manifest = manifestNameMap[name] - extensions[name] = { name: manifest.name, version: manifest.version } - }) - return extensions - } - - BrowserWindow.addDevToolsExtension = function (srcDirectory) { - const manifestName = BrowserWindow.addExtension(srcDirectory) - if (manifestName) { - devToolsExtensionNames.add(manifestName) - } - return manifestName - } - - BrowserWindow.removeDevToolsExtension = function (name) { - BrowserWindow.removeExtension(name) - devToolsExtensionNames.delete(name) - } - - BrowserWindow.getDevToolsExtensions = function () { - const extensions = BrowserWindow.getExtensions() - const devExtensions = {} - Array.from(devToolsExtensionNames).forEach(function (name) { - if (!extensions[name]) return - devExtensions[name] = extensions[name] - }) - return devExtensions - } - - // Load persisted extensions. - loadedDevToolsExtensionsPath = path.join(app.getPath('userData'), 'DevTools Extensions') - try { - const loadedDevToolsExtensions = JSON.parse(fs.readFileSync(loadedDevToolsExtensionsPath)) - if (Array.isArray(loadedDevToolsExtensions)) { - for (const srcDirectory of loadedDevToolsExtensions) { - // Start background pages and set content scripts. - BrowserWindow.addDevToolsExtension(srcDirectory) - } - } - } catch (error) { - if (process.env.ELECTRON_ENABLE_LOGGING && error.code !== 'ENOENT') { - console.error('Failed to load browser extensions from directory:', loadedDevToolsExtensionsPath) - console.error(error) - } - } -}) diff --git a/electronasar/stable/browser/desktop-capturer.js b/electronasar/stable/browser/desktop-capturer.js deleted file mode 100644 index 62e68bb..0000000 --- a/electronasar/stable/browser/desktop-capturer.js +++ /dev/null @@ -1,73 +0,0 @@ -'use strict' - -const ipcMain = require('@electron/internal/browser/ipc-main-internal') -const { desktopCapturer } = process.atomBinding('desktop_capturer') - -const deepEqual = (a, b) => JSON.stringify(a) === JSON.stringify(b) - -// A queue for holding all requests from renderer process. -let requestsQueue = [] - -const electronSources = 'ELECTRON_BROWSER_DESKTOP_CAPTURER_GET_SOURCES' -const capturerResult = (id) => `ELECTRON_RENDERER_DESKTOP_CAPTURER_RESULT_${id}` - -ipcMain.on(electronSources, (event, captureWindow, captureScreen, thumbnailSize, id) => { - const request = { - id, - options: { - captureWindow, - captureScreen, - thumbnailSize - }, - webContents: event.sender - } - requestsQueue.push(request) - if (requestsQueue.length === 1) { - desktopCapturer.startHandling(captureWindow, captureScreen, thumbnailSize) - } - - // If the WebContents is destroyed before receiving result, just remove the - // reference from requestsQueue to make the module not send the result to it. - event.sender.once('destroyed', () => { - request.webContents = null - }) -}) - -desktopCapturer.emit = (event, name, sources) => { - // Receiving sources result from main process, now send them back to renderer. - const handledRequest = requestsQueue.shift() - const handledWebContents = handledRequest.webContents - const unhandledRequestsQueue = [] - - const result = sources.map(source => { - return { - id: source.id, - name: source.name, - thumbnail: source.thumbnail.toDataURL(), - display_id: source.display_id - } - }) - - if (handledWebContents) { - handledWebContents._sendInternal(capturerResult(handledRequest.id), result) - } - - // Check the queue to see whether there is another identical request & handle - requestsQueue.forEach(request => { - const webContents = request.webContents - if (deepEqual(handledRequest.options, request.options)) { - if (webContents) { - webContents._sendInternal(capturerResult(request.id), result) - } - } else { - unhandledRequestsQueue.push(request) - } - }) - requestsQueue = unhandledRequestsQueue - - // If the requestsQueue is not empty, start a new request handling. - if (requestsQueue.length > 0) { - const { captureWindow, captureScreen, thumbnailSize } = requestsQueue[0].options - return desktopCapturer.startHandling(captureWindow, captureScreen, thumbnailSize) - } -} diff --git a/electronasar/stable/browser/guest-view-manager.js b/electronasar/stable/browser/guest-view-manager.js deleted file mode 100644 index b329947..0000000 --- a/electronasar/stable/browser/guest-view-manager.js +++ /dev/null @@ -1,451 +0,0 @@ -'use strict' - -const { webContents } = require('electron') -const ipcMain = require('@electron/internal/browser/ipc-main-internal') -const parseFeaturesString = require('@electron/internal/common/parse-features-string') -const errorUtils = require('@electron/internal/common/error-utils') -const { - syncMethods, - asyncCallbackMethods, - asyncPromiseMethods -} = require('@electron/internal/common/web-view-methods') - -// Doesn't exist in early initialization. -let webViewManager = null - -const supportedWebViewEvents = [ - 'load-commit', - 'did-attach', - 'did-finish-load', - 'did-fail-load', - 'did-frame-finish-load', - 'did-start-loading', - 'did-stop-loading', - 'dom-ready', - 'console-message', - 'context-menu', - 'devtools-opened', - 'devtools-closed', - 'devtools-focused', - 'new-window', - 'will-navigate', - 'did-start-navigation', - 'did-navigate', - 'did-frame-navigate', - 'did-navigate-in-page', - 'focus-change', - 'close', - 'crashed', - 'gpu-crashed', - 'plugin-crashed', - 'destroyed', - 'page-title-updated', - 'page-favicon-updated', - 'enter-html-full-screen', - 'leave-html-full-screen', - 'media-started-playing', - 'media-paused', - 'found-in-page', - 'did-change-theme-color', - 'update-target-url' -] - -let nextGuestInstanceId = 0 -const guestInstances = {} -const embedderElementsMap = {} - -// Generate guestInstanceId. -const getNextGuestInstanceId = function () { - return ++nextGuestInstanceId -} - -// Create a new guest instance. -const createGuest = function (embedder, params) { - if (webViewManager == null) { - webViewManager = process.atomBinding('web_view_manager') - } - - const guestInstanceId = getNextGuestInstanceId(embedder) - const guest = webContents.create({ - isGuest: true, - partition: params.partition, - embedder: embedder - }) - guestInstances[guestInstanceId] = { - guest: guest, - embedder: embedder - } - - // Clear the guest from map when it is destroyed. - // - // The guest WebContents is usually destroyed in 2 cases: - // 1. The embedder frame is closed (reloaded or destroyed), and it - // automatically closes the guest frame. - // 2. The guest frame is detached dynamically via JS, and it is manually - // destroyed when the renderer sends the GUEST_VIEW_MANAGER_DESTROY_GUEST - // message. - // The second case relies on the libcc patch: - // https://github.com/electron/libchromiumcontent/pull/676 - // The patch was introduced to work around a bug in Chromium: - // https://github.com/electron/electron/issues/14211 - // We should revisit the bug to see if we can remove our libcc patch, the - // patch was introduced in Chrome 66. - guest.once('destroyed', () => { - if (guestInstanceId in guestInstances) { - detachGuest(embedder, guestInstanceId) - } - }) - - // Init guest web view after attached. - guest.once('did-attach', function (event) { - params = this.attachParams - delete this.attachParams - - const previouslyAttached = this.viewInstanceId != null - this.viewInstanceId = params.instanceId - - // Only load URL and set size on first attach - if (previouslyAttached) { - return - } - - if (params.src) { - const opts = {} - if (params.httpreferrer) { - opts.httpReferrer = params.httpreferrer - } - if (params.useragent) { - opts.userAgent = params.useragent - } - this.loadURL(params.src, opts) - } - guest.allowPopups = params.allowpopups - embedder.emit('did-attach-webview', event, guest) - }) - - const sendToEmbedder = (channel, ...args) => { - if (!embedder.isDestroyed()) { - embedder._sendInternal(`${channel}-${guest.viewInstanceId}`, ...args) - } - } - - // Dispatch events to embedder. - const fn = function (event) { - guest.on(event, function (_, ...args) { - sendToEmbedder('ELECTRON_GUEST_VIEW_INTERNAL_DISPATCH_EVENT', event, ...args) - }) - } - for (const event of supportedWebViewEvents) { - fn(event) - } - - // Dispatch guest's IPC messages to embedder. - guest.on('ipc-message-host', function (_, [channel, ...args]) { - sendToEmbedder('ELECTRON_GUEST_VIEW_INTERNAL_IPC_MESSAGE', channel, ...args) - }) - - // Notify guest of embedder window visibility when it is ready - // FIXME Remove once https://github.com/electron/electron/issues/6828 is fixed - guest.on('dom-ready', function () { - const guestInstance = guestInstances[guestInstanceId] - if (guestInstance != null && guestInstance.visibilityState != null) { - guest._sendInternal('ELECTRON_GUEST_INSTANCE_VISIBILITY_CHANGE', guestInstance.visibilityState) - } - }) - - // Forward internal web contents event to embedder to handle - // native window.open setup - guest.on('-add-new-contents', (...args) => { - if (guest.getLastWebPreferences().nativeWindowOpen === true) { - const embedder = getEmbedder(guestInstanceId) - if (embedder != null) { - embedder.emit('-add-new-contents', ...args) - } - } - }) - guest.on('-web-contents-created', (...args) => { - if (guest.getLastWebPreferences().nativeWindowOpen === true) { - const embedder = getEmbedder(guestInstanceId) - if (embedder != null) { - embedder.emit('-web-contents-created', ...args) - } - } - }) - - return guestInstanceId -} - -// Attach the guest to an element of embedder. -const attachGuest = function (event, embedderFrameId, elementInstanceId, guestInstanceId, params) { - const embedder = event.sender - // Destroy the old guest when attaching. - const key = `${embedder.id}-${elementInstanceId}` - const oldGuestInstanceId = embedderElementsMap[key] - if (oldGuestInstanceId != null) { - // Reattachment to the same guest is just a no-op. - if (oldGuestInstanceId === guestInstanceId) { - return - } - - const oldGuestInstance = guestInstances[oldGuestInstanceId] - if (oldGuestInstance) { - oldGuestInstance.guest.destroy() - } - } - - const guestInstance = guestInstances[guestInstanceId] - // If this isn't a valid guest instance then do nothing. - if (!guestInstance) { - throw new Error(`Invalid guestInstanceId: ${guestInstanceId}`) - } - const { guest } = guestInstance - if (guest.hostWebContents !== event.sender) { - throw new Error(`Access denied to guestInstanceId: ${guestInstanceId}`) - } - - // If this guest is already attached to an element then remove it - if (guestInstance.elementInstanceId) { - const oldKey = `${guestInstance.embedder.id}-${guestInstance.elementInstanceId}` - delete embedderElementsMap[oldKey] - - // Remove guest from embedder if moving across web views - if (guest.viewInstanceId !== params.instanceId) { - webViewManager.removeGuest(guestInstance.embedder, guestInstanceId) - guestInstance.embedder._sendInternal(`ELECTRON_GUEST_VIEW_INTERNAL_DESTROY_GUEST-${guest.viewInstanceId}`) - } - } - - const webPreferences = { - guestInstanceId: guestInstanceId, - nodeIntegration: params.nodeintegration != null ? params.nodeintegration : false, - enableRemoteModule: params.enableremotemodule, - plugins: params.plugins, - zoomFactor: embedder._getZoomFactor(), - webSecurity: !params.disablewebsecurity, - enableBlinkFeatures: params.blinkfeatures, - disableBlinkFeatures: params.disableblinkfeatures - } - - // parse the 'webpreferences' attribute string, if set - // this uses the same parsing rules as window.open uses for its features - if (typeof params.webpreferences === 'string') { - parseFeaturesString(params.webpreferences, function (key, value) { - if (value === undefined) { - // no value was specified, default it to true - value = true - } - webPreferences[key] = value - }) - } - - if (params.preload) { - webPreferences.preloadURL = params.preload - } - - // Return null from native window.open if allowpopups is unset - if (webPreferences.nativeWindowOpen === true && !params.allowpopups) { - webPreferences.disablePopups = true - } - - // Security options that guest will always inherit from embedder - const inheritedWebPreferences = new Map([ - ['contextIsolation', true], - ['javascript', false], - ['nativeWindowOpen', true], - ['nodeIntegration', false], - ['enableRemoteModule', false], - ['sandbox', true] - ]) - - // Inherit certain option values from embedder - const lastWebPreferences = embedder.getLastWebPreferences() - for (const [name, value] of inheritedWebPreferences) { - if (lastWebPreferences[name] === value) { - webPreferences[name] = value - } - } - - embedder.emit('will-attach-webview', event, webPreferences, params) - if (event.defaultPrevented) { - if (guest.viewInstanceId == null) guest.viewInstanceId = params.instanceId - guest.destroy() - return - } - - guest.attachParams = params - embedderElementsMap[key] = guestInstanceId - - guest.setEmbedder(embedder) - guestInstance.embedder = embedder - guestInstance.elementInstanceId = elementInstanceId - - watchEmbedder(embedder) - - webViewManager.addGuest(guestInstanceId, elementInstanceId, embedder, guest, webPreferences) - guest.attachToIframe(embedder, embedderFrameId) -} - -// Remove an guest-embedder relationship. -const detachGuest = function (embedder, guestInstanceId) { - const guestInstance = guestInstances[guestInstanceId] - if (embedder !== guestInstance.embedder) { - return - } - - webViewManager.removeGuest(embedder, guestInstanceId) - delete guestInstances[guestInstanceId] - - const key = `${embedder.id}-${guestInstance.elementInstanceId}` - delete embedderElementsMap[key] -} - -// Once an embedder has had a guest attached we watch it for destruction to -// destroy any remaining guests. -const watchedEmbedders = new Set() -const watchEmbedder = function (embedder) { - if (watchedEmbedders.has(embedder)) { - return - } - watchedEmbedders.add(embedder) - - // Forward embedder window visiblity change events to guest - const onVisibilityChange = function (visibilityState) { - for (const guestInstanceId in guestInstances) { - const guestInstance = guestInstances[guestInstanceId] - guestInstance.visibilityState = visibilityState - if (guestInstance.embedder === embedder) { - guestInstance.guest._sendInternal('ELECTRON_GUEST_INSTANCE_VISIBILITY_CHANGE', visibilityState) - } - } - } - embedder.on('-window-visibility-change', onVisibilityChange) - - embedder.once('will-destroy', () => { - // Usually the guestInstances is cleared when guest is destroyed, but it - // may happen that the embedder gets manually destroyed earlier than guest, - // and the embedder will be invalid in the usual code path. - for (const guestInstanceId in guestInstances) { - const guestInstance = guestInstances[guestInstanceId] - if (guestInstance.embedder === embedder) { - detachGuest(embedder, parseInt(guestInstanceId)) - } - } - // Clear the listeners. - embedder.removeListener('-window-visibility-change', onVisibilityChange) - watchedEmbedders.delete(embedder) - }) -} - -const isWebViewTagEnabledCache = new WeakMap() - -const isWebViewTagEnabled = function (contents) { - if (!isWebViewTagEnabledCache.has(contents)) { - const value = contents.getLastWebPreferences().webviewTag - isWebViewTagEnabledCache.set(contents, value) - } - - return isWebViewTagEnabledCache.get(contents) -} - -const handleMessage = function (channel, handler) { - ipcMain.on(channel, (event, ...args) => { - if (isWebViewTagEnabled(event.sender)) { - handler(event, ...args) - } else { - event.returnValue = null - } - }) -} - -handleMessage('ELECTRON_GUEST_VIEW_MANAGER_CREATE_GUEST', function (event, params, requestId) { - event.sender._sendInternal(`ELECTRON_RESPONSE_${requestId}`, createGuest(event.sender, params)) -}) - -handleMessage('ELECTRON_GUEST_VIEW_MANAGER_CREATE_GUEST_SYNC', function (event, params) { - event.returnValue = createGuest(event.sender, params) -}) - -handleMessage('ELECTRON_GUEST_VIEW_MANAGER_DESTROY_GUEST', function (event, guestInstanceId) { - try { - const guest = getGuestForWebContents(guestInstanceId, event.sender) - guest.destroy() - } catch (error) { - console.error(`Guest destroy failed: ${error}`) - } -}) - -handleMessage('ELECTRON_GUEST_VIEW_MANAGER_ATTACH_GUEST', function (event, embedderFrameId, elementInstanceId, guestInstanceId, params) { - try { - attachGuest(event, embedderFrameId, elementInstanceId, guestInstanceId, params) - } catch (error) { - console.error(`Guest attach failed: ${error}`) - } -}) - -// this message is sent by the actual <webview> -ipcMain.on('ELECTRON_GUEST_VIEW_MANAGER_FOCUS_CHANGE', function (event, focus, guestInstanceId) { - const guest = getGuest(guestInstanceId) - if (guest === event.sender) { - event.sender.emit('focus-change', {}, focus, guestInstanceId) - } else { - console.error(`focus-change for guestInstanceId: ${guestInstanceId}`) - } -}) - -handleMessage('ELECTRON_GUEST_VIEW_MANAGER_ASYNC_CALL', function (event, requestId, guestInstanceId, method, args, hasCallback) { - new Promise(resolve => { - const guest = getGuestForWebContents(guestInstanceId, event.sender) - if (!asyncCallbackMethods.has(method) && !asyncPromiseMethods.has(method)) { - throw new Error(`Invalid method: ${method}`) - } - if (hasCallback) { - guest[method](...args, resolve) - } else { - resolve(guest[method](...args)) - } - }).then(result => { - return [null, result] - }, error => { - return [errorUtils.serialize(error)] - }).then(responseArgs => { - event.sender._sendInternal(`ELECTRON_GUEST_VIEW_MANAGER_ASYNC_CALL_RESPONSE_${requestId}`, ...responseArgs) - }) -}) - -handleMessage('ELECTRON_GUEST_VIEW_MANAGER_SYNC_CALL', function (event, guestInstanceId, method, args) { - try { - const guest = getGuestForWebContents(guestInstanceId, event.sender) - if (!syncMethods.has(method)) { - throw new Error(`Invalid method: ${method}`) - } - event.returnValue = [null, guest[method](...args)] - } catch (error) { - event.returnValue = [errorUtils.serialize(error)] - } -}) - -// Returns WebContents from its guest id hosted in given webContents. -const getGuestForWebContents = function (guestInstanceId, contents) { - const guest = getGuest(guestInstanceId) - if (!guest) { - throw new Error(`Invalid guestInstanceId: ${guestInstanceId}`) - } - if (guest.hostWebContents !== contents) { - throw new Error(`Access denied to guestInstanceId: ${guestInstanceId}`) - } - return guest -} - -// Returns WebContents from its guest id. -const getGuest = function (guestInstanceId) { - const guestInstance = guestInstances[guestInstanceId] - if (guestInstance != null) return guestInstance.guest -} - -// Returns the embedder of the guest. -const getEmbedder = function (guestInstanceId) { - const guestInstance = guestInstances[guestInstanceId] - if (guestInstance != null) return guestInstance.embedder -} - -exports.getGuestForWebContents = getGuestForWebContents diff --git a/electronasar/stable/browser/guest-window-manager.js b/electronasar/stable/browser/guest-window-manager.js deleted file mode 100644 index 6a71e94..0000000 --- a/electronasar/stable/browser/guest-window-manager.js +++ /dev/null @@ -1,368 +0,0 @@ -'use strict' - -const { BrowserWindow, webContents } = require('electron') -const { isSameOrigin } = process.atomBinding('v8_util') -const ipcMain = require('@electron/internal/browser/ipc-main-internal') -const parseFeaturesString = require('@electron/internal/common/parse-features-string') - -const hasProp = {}.hasOwnProperty -const frameToGuest = new Map() - -// Security options that child windows will always inherit from parent windows -const inheritedWebPreferences = new Map([ - ['contextIsolation', true], - ['javascript', false], - ['nativeWindowOpen', true], - ['nodeIntegration', false], - ['enableRemoteModule', false], - ['sandbox', true], - ['webviewTag', false] -]) - -// Copy attribute of |parent| to |child| if it is not defined in |child|. -const mergeOptions = function (child, parent, visited) { - // Check for circular reference. - if (visited == null) visited = new Set() - if (visited.has(parent)) return - - visited.add(parent) - for (const key in parent) { - if (key === 'isBrowserView') continue - if (!hasProp.call(parent, key)) continue - if (key in child && key !== 'webPreferences') continue - - const value = parent[key] - if (typeof value === 'object') { - child[key] = mergeOptions(child[key] || {}, value, visited) - } else { - child[key] = value - } - } - visited.delete(parent) - - return child -} - -// Merge |options| with the |embedder|'s window's options. -const mergeBrowserWindowOptions = function (embedder, options) { - if (options.webPreferences == null) { - options.webPreferences = {} - } - if (embedder.browserWindowOptions != null) { - let parentOptions = embedder.browserWindowOptions - - // if parent's visibility is available, that overrides 'show' flag (#12125) - const win = BrowserWindow.fromWebContents(embedder.webContents) - if (win != null) { - parentOptions = { ...embedder.browserWindowOptions, show: win.isVisible() } - } - - // Inherit the original options if it is a BrowserWindow. - mergeOptions(options, parentOptions) - } else { - // Or only inherit webPreferences if it is a webview. - mergeOptions(options.webPreferences, embedder.getLastWebPreferences()) - } - - // Inherit certain option values from parent window - const webPreferences = embedder.getLastWebPreferences() - for (const [name, value] of inheritedWebPreferences) { - if (webPreferences[name] === value) { - options.webPreferences[name] = value - } - } - - // Sets correct openerId here to give correct options to 'new-window' event handler - options.webPreferences.openerId = embedder.id - - return options -} - -// Setup a new guest with |embedder| -const setupGuest = function (embedder, frameName, guest, options) { - // When |embedder| is destroyed we should also destroy attached guest, and if - // guest is closed by user then we should prevent |embedder| from double - // closing guest. - const guestId = guest.webContents.id - const closedByEmbedder = function () { - guest.removeListener('closed', closedByUser) - guest.destroy() - } - const closedByUser = function () { - embedder._sendInternal('ELECTRON_GUEST_WINDOW_MANAGER_WINDOW_CLOSED_' + guestId) - embedder.removeListener('render-view-deleted', closedByEmbedder) - } - embedder.once('render-view-deleted', closedByEmbedder) - guest.once('closed', closedByUser) - if (frameName) { - frameToGuest.set(frameName, guest) - guest.frameName = frameName - guest.once('closed', function () { - frameToGuest.delete(frameName) - }) - } - return guestId -} - -// Create a new guest created by |embedder| with |options|. -const createGuest = function (embedder, url, referrer, frameName, options, postData) { - let guest = frameToGuest.get(frameName) - if (frameName && (guest != null)) { - guest.loadURL(url) - return guest.webContents.id - } - - // Remember the embedder window's id. - if (options.webPreferences == null) { - options.webPreferences = {} - } - - guest = new BrowserWindow(options) - if (!options.webContents || url !== 'about:blank') { - // We should not call `loadURL` if the window was constructed from an - // existing webContents(window.open in a sandboxed renderer) and if the url - // is not 'about:blank'. - // - // Navigating to the url when creating the window from an existing - // webContents would not be necessary(it will navigate there anyway), but - // apparently there's a bug that allows the child window to be scripted by - // the opener, even when the child window is from another origin. - // - // That's why the second condition(url !== "about:blank") is required: to - // force `OverrideSiteInstanceForNavigation` to be called and consequently - // spawn a new renderer if the new window is targeting a different origin. - // - // If the URL is "about:blank", then it is very likely that the opener just - // wants to synchronously script the popup, for example: - // - // let popup = window.open() - // popup.document.body.write('<h1>hello</h1>') - // - // The above code would not work if a navigation to "about:blank" is done - // here, since the window would be cleared of all changes in the next tick. - const loadOptions = { - httpReferrer: referrer - } - if (postData != null) { - loadOptions.postData = postData - loadOptions.extraHeaders = 'content-type: application/x-www-form-urlencoded' - if (postData.length > 0) { - const postDataFront = postData[0].bytes.toString() - const boundary = /^--.*[^-\r\n]/.exec(postDataFront) - if (boundary != null) { - loadOptions.extraHeaders = `content-type: multipart/form-data; boundary=${boundary[0].substr(2)}` - } - } - } - guest.loadURL(url, loadOptions) - } - - return setupGuest(embedder, frameName, guest, options) -} - -const getGuestWindow = function (guestContents) { - let guestWindow = BrowserWindow.fromWebContents(guestContents) - if (guestWindow == null) { - const hostContents = guestContents.hostWebContents - if (hostContents != null) { - guestWindow = BrowserWindow.fromWebContents(hostContents) - } - } - return guestWindow -} - -// Checks whether |sender| can access the |target|: -// 1. Check whether |sender| is the parent of |target|. -// 2. Check whether |sender| has node integration, if so it is allowed to -// do anything it wants. -// 3. Check whether the origins match. -// -// However it allows a child window without node integration but with same -// origin to do anything it wants, when its opener window has node integration. -// The W3C does not have anything on this, but from my understanding of the -// security model of |window.opener|, this should be fine. -const canAccessWindow = function (sender, target) { - return (target.getLastWebPreferences().openerId === sender.id) || - (sender.getLastWebPreferences().nodeIntegration === true) || - isSameOrigin(sender.getURL(), target.getURL()) -} - -// Routed window.open messages with raw options -ipcMain.on('ELECTRON_GUEST_WINDOW_MANAGER_WINDOW_OPEN', (event, url, frameName, features) => { - if (url == null || url === '') url = 'about:blank' - if (frameName == null) frameName = '' - if (features == null) features = '' - - const options = {} - - const ints = ['x', 'y', 'width', 'height', 'minWidth', 'maxWidth', 'minHeight', 'maxHeight', 'zoomFactor'] - const webPreferences = ['zoomFactor', 'nodeIntegration', 'enableRemoteModule', 'preload', 'javascript', 'contextIsolation', 'webviewTag'] - const disposition = 'new-window' - - // Used to store additional features - const additionalFeatures = [] - - // Parse the features - parseFeaturesString(features, function (key, value) { - if (value === undefined) { - additionalFeatures.push(key) - } else { - // Don't allow webPreferences to be set since it must be an object - // that cannot be directly overridden - if (key === 'webPreferences') return - - if (webPreferences.includes(key)) { - if (options.webPreferences == null) { - options.webPreferences = {} - } - options.webPreferences[key] = value - } else { - options[key] = value - } - } - }) - if (options.left) { - if (options.x == null) { - options.x = options.left - } - } - if (options.top) { - if (options.y == null) { - options.y = options.top - } - } - if (options.title == null) { - options.title = frameName - } - if (options.width == null) { - options.width = 800 - } - if (options.height == null) { - options.height = 600 - } - - for (const name of ints) { - if (options[name] != null) { - options[name] = parseInt(options[name], 10) - } - } - - const referrer = { url: '', policy: 'default' } - ipcMain.emit('ELECTRON_GUEST_WINDOW_MANAGER_INTERNAL_WINDOW_OPEN', event, - url, referrer, frameName, disposition, options, additionalFeatures) -}) - -// Routed window.open messages with fully parsed options -ipcMain.on('ELECTRON_GUEST_WINDOW_MANAGER_INTERNAL_WINDOW_OPEN', function (event, url, referrer, - frameName, disposition, options, - additionalFeatures, postData) { - options = mergeBrowserWindowOptions(event.sender, options) - event.sender.emit('new-window', event, url, frameName, disposition, options, additionalFeatures, referrer) - const { newGuest } = event - if ((event.sender.isGuest() && !event.sender.allowPopups) || event.defaultPrevented) { - if (newGuest != null) { - if (options.webContents === newGuest.webContents) { - // the webContents is not changed, so set defaultPrevented to false to - // stop the callers of this event from destroying the webContents. - event.defaultPrevented = false - } - event.returnValue = setupGuest(event.sender, frameName, newGuest, options) - } else { - event.returnValue = null - } - } else { - event.returnValue = createGuest(event.sender, url, referrer, frameName, options, postData) - } -}) - -ipcMain.on('ELECTRON_GUEST_WINDOW_MANAGER_WINDOW_CLOSE', function (event, guestId) { - const guestContents = webContents.fromId(guestId) - if (guestContents == null) return - - if (!canAccessWindow(event.sender, guestContents)) { - console.error(`Blocked ${event.sender.getURL()} from closing its opener.`) - return - } - - const guestWindow = getGuestWindow(guestContents) - if (guestWindow != null) guestWindow.destroy() -}) - -const windowMethods = new Set([ - 'focus', - 'blur' -]) - -ipcMain.on('ELECTRON_GUEST_WINDOW_MANAGER_WINDOW_METHOD', function (event, guestId, method, ...args) { - const guestContents = webContents.fromId(guestId) - if (guestContents == null) { - event.returnValue = null - return - } - - if (!canAccessWindow(event.sender, guestContents) || !windowMethods.has(method)) { - console.error(`Blocked ${event.sender.getURL()} from calling ${method} on its opener.`) - event.returnValue = null - return - } - - const guestWindow = getGuestWindow(guestContents) - if (guestWindow != null) { - event.returnValue = guestWindow[method](...args) - } else { - event.returnValue = null - } -}) - -ipcMain.on('ELECTRON_GUEST_WINDOW_MANAGER_WINDOW_POSTMESSAGE', function (event, guestId, message, targetOrigin, sourceOrigin) { - if (targetOrigin == null) { - targetOrigin = '*' - } - - const guestContents = webContents.fromId(guestId) - if (guestContents == null) return - - // The W3C does not seem to have word on how postMessage should work when the - // origins do not match, so we do not do |canAccessWindow| check here since - // postMessage across origins is useful and not harmful. - if (targetOrigin === '*' || isSameOrigin(guestContents.getURL(), targetOrigin)) { - const sourceId = event.sender.id - guestContents._sendInternal('ELECTRON_GUEST_WINDOW_POSTMESSAGE', sourceId, message, sourceOrigin) - } -}) - -const webContentsMethods = new Set([ - 'print', - 'executeJavaScript' -]) - -ipcMain.on('ELECTRON_GUEST_WINDOW_MANAGER_WEB_CONTENTS_METHOD', function (event, guestId, method, ...args) { - const guestContents = webContents.fromId(guestId) - if (guestContents == null) return - - if (canAccessWindow(event.sender, guestContents) && webContentsMethods.has(method)) { - guestContents[method](...args) - } else { - console.error(`Blocked ${event.sender.getURL()} from calling ${method} on its opener.`) - } -}) - -const webContentsSyncMethods = new Set([ - 'getURL', - 'loadURL' -]) - -ipcMain.on('ELECTRON_GUEST_WINDOW_MANAGER_WEB_CONTENTS_METHOD_SYNC', function (event, guestId, method, ...args) { - const guestContents = webContents.fromId(guestId) - if (guestContents == null) { - event.returnValue = null - return - } - - if (canAccessWindow(event.sender, guestContents) && webContentsSyncMethods.has(method)) { - event.returnValue = guestContents[method](...args) - } else { - console.error(`Blocked ${event.sender.getURL()} from calling ${method} on its opener.`) - event.returnValue = null - } -}) diff --git a/electronasar/stable/browser/init.js b/electronasar/stable/browser/init.js deleted file mode 100644 index fc526e1..0000000 --- a/electronasar/stable/browser/init.js +++ /dev/null @@ -1,188 +0,0 @@ -'use strict' - -const { Buffer } = require('buffer') -const fs = require('fs') -const path = require('path') -const util = require('util') -const Module = require('module') -const v8 = require('v8') - -// We modified the original process.argv to let node.js load the init.js, -// we need to restore it here. -process.argv.splice(1, 1) - -// Clear search paths. -require('../common/reset-search-paths') - -// Import common settings. -require('@electron/internal/common/init') - -const globalPaths = Module.globalPaths - -// Expose public APIs. -globalPaths.push(path.join(__dirname, 'api', 'exports')) - -if (process.platform === 'win32') { - // Redirect node's console to use our own implementations, since node can not - // handle console output when running as GUI program. - const consoleLog = function (...args) { - return process.log(util.format(...args) + '\n') - } - const streamWrite = function (chunk, encoding, callback) { - if (Buffer.isBuffer(chunk)) { - chunk = chunk.toString(encoding) - } - process.log(chunk) - if (callback) { - callback() - } - return true - } - console.log = console.error = console.warn = consoleLog - process.stdout.write = process.stderr.write = streamWrite -} - -// Don't quit on fatal error. -process.on('uncaughtException', function (error) { - // Do nothing if the user has a custom uncaught exception handler. - if (process.listeners('uncaughtException').length > 1) { - return - } - - // Show error in GUI. - const dialog = require('electron').dialog - const stack = error.stack ? error.stack : `${error.name}: ${error.message}` - const message = 'Uncaught Exception:\n' + stack - dialog.showErrorBox('A JavaScript error occurred in the main process', message) -}) - -// Emit 'exit' event on quit. -const { app } = require('electron') - -app.on('quit', function (event, exitCode) { - process.emit('exit', exitCode) -}) - -if (process.platform === 'win32') { - // If we are a Squirrel.Windows-installed app, set app user model ID - // so that users don't have to do this. - // - // Squirrel packages are always of the form: - // - // PACKAGE-NAME - // - Update.exe - // - app-VERSION - // - OUREXE.exe - // - // Squirrel itself will always set the shortcut's App User Model ID to the - // form `com.squirrel.PACKAGE-NAME.OUREXE`. We need to call - // app.setAppUserModelId with a matching identifier so that renderer processes - // will inherit this value. - const updateDotExe = path.join(path.dirname(process.execPath), '..', 'update.exe') - - if (fs.existsSync(updateDotExe)) { - const packageDir = path.dirname(path.resolve(updateDotExe)) - const packageName = path.basename(packageDir).replace(/\s/g, '') - const exeName = path.basename(process.execPath).replace(/\.exe$/i, '').replace(/\s/g, '') - - app.setAppUserModelId(`com.squirrel.${packageName}.${exeName}`) - } -} - -// Map process.exit to app.exit, which quits gracefully. -process.exit = app.exit - -// Load the RPC server. -require('@electron/internal/browser/rpc-server') - -// Load the guest view manager. -require('@electron/internal/browser/guest-view-manager') -require('@electron/internal/browser/guest-window-manager') - -// Now we try to load app's package.json. -let packagePath = null -let packageJson = null -const searchPaths = ['app', 'app.asar', 'default_app.asar'] -for (packagePath of searchPaths) { - try { - packagePath = path.join(process.resourcesPath, packagePath) - packageJson = require(path.join(packagePath, 'package.json')) - break - } catch (error) { - continue - } -} - -if (packageJson == null) { - process.nextTick(function () { - return process.exit(1) - }) - throw new Error('Unable to find a valid app') -} - -// Set application's version. -if (packageJson.version != null) { - app.setVersion(packageJson.version) -} - -// Set application's name. -if (packageJson.productName != null) { - app.setName(`${packageJson.productName}`.trim()) -} else if (packageJson.name != null) { - app.setName(`${packageJson.name}`.trim()) -} - -// Set application's desktop name. -if (packageJson.desktopName != null) { - app.setDesktopName(packageJson.desktopName) -} else { - app.setDesktopName((app.getName()) + '.desktop') -} - -// Set v8 flags -if (packageJson.v8Flags != null) { - v8.setFlagsFromString(packageJson.v8Flags) -} - -// Set the user path according to application's name. -app.setPath('userData', path.join(app.getPath('appData'), app.getName())) -app.setPath('userCache', path.join(app.getPath('cache'), app.getName())) -app.setAppPath(packagePath) - -// Load the chrome extension support. -require('@electron/internal/browser/chrome-extension') - -const features = process.atomBinding('features') -if (features.isDesktopCapturerEnabled()) { - // Load internal desktop-capturer module. - require('@electron/internal/browser/desktop-capturer') -} - -// Load protocol module to ensure it is populated on app ready -require('@electron/internal/browser/api/protocol') - -// Set main startup script of the app. -const mainStartupScript = packageJson.main || 'index.js' - -const KNOWN_XDG_DESKTOP_VALUES = ['Pantheon', 'Unity:Unity7', 'pop:GNOME'] - -function currentPlatformSupportsAppIndicator () { - if (process.platform !== 'linux') return false - const currentDesktop = process.env.XDG_CURRENT_DESKTOP - - if (!currentDesktop) return false - if (KNOWN_XDG_DESKTOP_VALUES.includes(currentDesktop)) return true - // ubuntu based or derived session (default ubuntu one, communitheme…) supports - // indicator too. - if (/ubuntu/ig.test(currentDesktop)) return true - - return false -} - -// Workaround for electron/electron#5050 and electron/electron#9046 -if (currentPlatformSupportsAppIndicator()) { - process.env.XDG_CURRENT_DESKTOP = 'Unity' -} - -// Finally load app's main.js and transfer control to C++. -Module._load(path.join(packagePath, mainStartupScript), Module, true) diff --git a/electronasar/stable/browser/ipc-main-internal.js b/electronasar/stable/browser/ipc-main-internal.js deleted file mode 100644 index 9ab9569..0000000 --- a/electronasar/stable/browser/ipc-main-internal.js +++ /dev/null @@ -1,10 +0,0 @@ -'use strict' - -const { EventEmitter } = require('events') - -const emitter = new EventEmitter() - -// Do not throw exception when channel name is "error". -emitter.on('error', () => {}) - -module.exports = emitter diff --git a/electronasar/stable/browser/objects-registry.js b/electronasar/stable/browser/objects-registry.js deleted file mode 100644 index c3bbfae..0000000 --- a/electronasar/stable/browser/objects-registry.js +++ /dev/null @@ -1,116 +0,0 @@ -'use strict' - -const v8Util = process.atomBinding('v8_util') - -const getOwnerKey = (webContents, contextId) => { - return `${webContents.id}-${contextId}` -} - -class ObjectsRegistry { - constructor () { - this.nextId = 0 - - // Stores all objects by ref-counting. - // (id) => {object, count} - this.storage = {} - - // Stores the IDs of objects referenced by WebContents. - // (ownerKey) => [id] - this.owners = {} - } - - // Register a new object and return its assigned ID. If the object is already - // registered then the already assigned ID would be returned. - add (webContents, contextId, obj) { - // Get or assign an ID to the object. - const id = this.saveToStorage(obj) - - // Add object to the set of referenced objects. - const ownerKey = getOwnerKey(webContents, contextId) - let owner = this.owners[ownerKey] - if (!owner) { - owner = this.owners[ownerKey] = new Set() - this.registerDeleteListener(webContents, contextId) - } - if (!owner.has(id)) { - owner.add(id) - // Increase reference count if not referenced before. - this.storage[id].count++ - } - return id - } - - // Get an object according to its ID. - get (id) { - const pointer = this.storage[id] - if (pointer != null) return pointer.object - } - - // Dereference an object according to its ID. - // Note that an object may be double-freed (cleared when page is reloaded, and - // then garbage collected in old page). - remove (webContents, contextId, id) { - const ownerKey = getOwnerKey(webContents, contextId) - const owner = this.owners[ownerKey] - if (owner) { - // Remove the reference in owner. - owner.delete(id) - // Dereference from the storage. - this.dereference(id) - } - } - - // Clear all references to objects refrenced by the WebContents. - clear (webContents, contextId) { - const ownerKey = getOwnerKey(webContents, contextId) - const owner = this.owners[ownerKey] - if (!owner) return - - for (const id of owner) this.dereference(id) - - delete this.owners[ownerKey] - } - - // Private: Saves the object into storage and assigns an ID for it. - saveToStorage (object) { - let id = v8Util.getHiddenValue(object, 'atomId') - if (!id) { - id = ++this.nextId - this.storage[id] = { - count: 0, - object: object - } - v8Util.setHiddenValue(object, 'atomId', id) - } - return id - } - - // Private: Dereference the object from store. - dereference (id) { - const pointer = this.storage[id] - if (pointer == null) { - return - } - pointer.count -= 1 - if (pointer.count === 0) { - v8Util.deleteHiddenValue(pointer.object, 'atomId') - delete this.storage[id] - } - } - - // Private: Clear the storage when renderer process is destroyed. - registerDeleteListener (webContents, contextId) { - // contextId => ${processHostId}-${contextCount} - const processHostId = contextId.split('-')[0] - const listener = (event, deletedProcessHostId) => { - if (deletedProcessHostId && - deletedProcessHostId.toString() === processHostId) { - webContents.removeListener('render-view-deleted', listener) - this.clear(webContents, contextId) - } - } - webContents.on('render-view-deleted', listener) - } -} - -module.exports = new ObjectsRegistry() diff --git a/electronasar/stable/browser/rpc-server.js b/electronasar/stable/browser/rpc-server.js deleted file mode 100644 index 0e31d22..0000000 --- a/electronasar/stable/browser/rpc-server.js +++ /dev/null @@ -1,558 +0,0 @@ -'use strict' - -const { spawn } = require('child_process') -const electron = require('electron') -const { EventEmitter } = require('events') -const fs = require('fs') -const os = require('os') -const path = require('path') -const v8Util = process.atomBinding('v8_util') -const eventBinding = process.atomBinding('event') - -const { isPromise } = electron - -const ipcMain = require('@electron/internal/browser/ipc-main-internal') -const objectsRegistry = require('@electron/internal/browser/objects-registry') -const guestViewManager = require('@electron/internal/browser/guest-view-manager') -const bufferUtils = require('@electron/internal/common/buffer-utils') -const errorUtils = require('@electron/internal/common/error-utils') - -const hasProp = {}.hasOwnProperty - -// The internal properties of Function. -const FUNCTION_PROPERTIES = [ - 'length', 'name', 'arguments', 'caller', 'prototype' -] - -// The remote functions in renderer processes. -// id => Function -const rendererFunctions = v8Util.createDoubleIDWeakMap() - -// Return the description of object's members: -const getObjectMembers = function (object) { - let names = Object.getOwnPropertyNames(object) - // For Function, we should not override following properties even though they - // are "own" properties. - if (typeof object === 'function') { - names = names.filter((name) => { - return !FUNCTION_PROPERTIES.includes(name) - }) - } - // Map properties to descriptors. - return names.map((name) => { - const descriptor = Object.getOwnPropertyDescriptor(object, name) - const member = { name, enumerable: descriptor.enumerable, writable: false } - if (descriptor.get === undefined && typeof object[name] === 'function') { - member.type = 'method' - } else { - if (descriptor.set || descriptor.writable) member.writable = true - member.type = 'get' - } - return member - }) -} - -// Return the description of object's prototype. -const getObjectPrototype = function (object) { - const proto = Object.getPrototypeOf(object) - if (proto === null || proto === Object.prototype) return null - return { - members: getObjectMembers(proto), - proto: getObjectPrototype(proto) - } -} - -// Convert a real value into meta data. -const valueToMeta = function (sender, contextId, value, optimizeSimpleObject = false) { - // Determine the type of value. - const meta = { type: typeof value } - if (meta.type === 'object') { - // Recognize certain types of objects. - if (value === null) { - meta.type = 'value' - } else if (bufferUtils.isBuffer(value)) { - meta.type = 'buffer' - } else if (Array.isArray(value)) { - meta.type = 'array' - } else if (value instanceof Error) { - meta.type = 'error' - } else if (value instanceof Date) { - meta.type = 'date' - } else if (isPromise(value)) { - meta.type = 'promise' - } else if (hasProp.call(value, 'callee') && value.length != null) { - // Treat the arguments object as array. - meta.type = 'array' - } else if (optimizeSimpleObject && v8Util.getHiddenValue(value, 'simple')) { - // Treat simple objects as value. - meta.type = 'value' - } - } - - // Fill the meta object according to value's type. - if (meta.type === 'array') { - meta.members = value.map((el) => valueToMeta(sender, contextId, el, optimizeSimpleObject)) - } else if (meta.type === 'object' || meta.type === 'function') { - meta.name = value.constructor ? value.constructor.name : '' - - // Reference the original value if it's an object, because when it's - // passed to renderer we would assume the renderer keeps a reference of - // it. - meta.id = objectsRegistry.add(sender, contextId, value) - meta.members = getObjectMembers(value) - meta.proto = getObjectPrototype(value) - } else if (meta.type === 'buffer') { - meta.value = bufferUtils.bufferToMeta(value) - } else if (meta.type === 'promise') { - // Add default handler to prevent unhandled rejections in main process - // Instead they should appear in the renderer process - value.then(function () {}, function () {}) - - meta.then = valueToMeta(sender, contextId, function (onFulfilled, onRejected) { - value.then(onFulfilled, onRejected) - }) - } else if (meta.type === 'error') { - meta.members = plainObjectToMeta(value) - - // Error.name is not part of own properties. - meta.members.push({ - name: 'name', - value: value.name - }) - } else if (meta.type === 'date') { - meta.value = value.getTime() - } else { - meta.type = 'value' - meta.value = value - } - return meta -} - -// Convert object to meta by value. -const plainObjectToMeta = function (obj) { - return Object.getOwnPropertyNames(obj).map(function (name) { - return { - name: name, - value: obj[name] - } - }) -} - -// Convert Error into meta data. -const exceptionToMeta = function (sender, contextId, error) { - return { - type: 'exception', - value: errorUtils.serialize(error) - } -} - -const throwRPCError = function (message) { - const error = new Error(message) - error.code = 'EBADRPC' - error.errno = -72 - throw error -} - -const removeRemoteListenersAndLogWarning = (sender, callIntoRenderer) => { - const location = v8Util.getHiddenValue(callIntoRenderer, 'location') - let message = `Attempting to call a function in a renderer window that has been closed or released.` + - `\nFunction provided here: ${location}` - - if (sender instanceof EventEmitter) { - const remoteEvents = sender.eventNames().filter((eventName) => { - return sender.listeners(eventName).includes(callIntoRenderer) - }) - - if (remoteEvents.length > 0) { - message += `\nRemote event names: ${remoteEvents.join(', ')}` - remoteEvents.forEach((eventName) => { - sender.removeListener(eventName, callIntoRenderer) - }) - } - } - - console.warn(message) -} - -// Convert array of meta data from renderer into array of real values. -const unwrapArgs = function (sender, contextId, args) { - const metaToValue = function (meta) { - switch (meta.type) { - case 'value': - return meta.value - case 'remote-object': - return objectsRegistry.get(meta.id) - case 'array': - return unwrapArgs(sender, contextId, meta.value) - case 'buffer': - return bufferUtils.metaToBuffer(meta.value) - case 'date': - return new Date(meta.value) - case 'promise': - return Promise.resolve({ - then: metaToValue(meta.then) - }) - case 'object': { - const ret = {} - Object.defineProperty(ret.constructor, 'name', { value: meta.name }) - - for (const { name, value } of meta.members) { - ret[name] = metaToValue(value) - } - return ret - } - case 'function-with-return-value': - const returnValue = metaToValue(meta.value) - return function () { - return returnValue - } - case 'function': { - // Merge contextId and meta.id, since meta.id can be the same in - // different webContents. - const objectId = [contextId, meta.id] - - // Cache the callbacks in renderer. - if (rendererFunctions.has(objectId)) { - return rendererFunctions.get(objectId) - } - - const callIntoRenderer = function (...args) { - if (!sender.isDestroyed()) { - sender._sendInternal('ELECTRON_RENDERER_CALLBACK', contextId, meta.id, valueToMeta(sender, contextId, args)) - } else { - removeRemoteListenersAndLogWarning(this, callIntoRenderer) - } - } - v8Util.setHiddenValue(callIntoRenderer, 'location', meta.location) - Object.defineProperty(callIntoRenderer, 'length', { value: meta.length }) - - v8Util.setRemoteCallbackFreer(callIntoRenderer, contextId, meta.id, sender) - rendererFunctions.set(objectId, callIntoRenderer) - return callIntoRenderer - } - default: - throw new TypeError(`Unknown type: ${meta.type}`) - } - } - return args.map(metaToValue) -} - -// Call a function and send reply asynchronously if it's a an asynchronous -// style function and the caller didn't pass a callback. -const callFunction = function (event, contextId, func, caller, args) { - const funcMarkedAsync = v8Util.getHiddenValue(func, 'asynchronous') - const funcPassedCallback = typeof args[args.length - 1] === 'function' - try { - if (funcMarkedAsync && !funcPassedCallback) { - args.push(function (ret) { - event.returnValue = valueToMeta(event.sender, contextId, ret, true) - }) - func.apply(caller, args) - } else { - const ret = func.apply(caller, args) - return valueToMeta(event.sender, contextId, ret, true) - } - } catch (error) { - // Catch functions thrown further down in function invocation and wrap - // them with the function name so it's easier to trace things like - // `Error processing argument -1.` - const funcName = func.name || 'anonymous' - const err = new Error(`Could not call remote function '${funcName}'. Check that the function signature is correct. Underlying error: ${error.message}`) - err.cause = error - throw err - } -} - -const handleRemoteCommand = function (channel, handler) { - ipcMain.on(channel, (event, contextId, ...args) => { - let returnValue - if (!event.sender._isRemoteModuleEnabled()) { - event.returnValue = null - return - } - - try { - returnValue = handler(event, contextId, ...args) - } catch (error) { - returnValue = exceptionToMeta(event.sender, contextId, error) - } - - if (returnValue !== undefined) { - event.returnValue = returnValue - } - }) -} - -handleRemoteCommand('ELECTRON_BROWSER_WRONG_CONTEXT_ERROR', function (event, contextId, passedContextId, id) { - const objectId = [passedContextId, id] - if (!rendererFunctions.has(objectId)) { - // Do nothing if the error has already been reported before. - return - } - removeRemoteListenersAndLogWarning(event.sender, rendererFunctions.get(objectId)) -}) - -handleRemoteCommand('ELECTRON_BROWSER_REQUIRE', function (event, contextId, moduleName) { - const customEvent = eventBinding.createWithSender(event.sender) - event.sender.emit('remote-require', customEvent, moduleName) - - if (customEvent.returnValue === undefined) { - if (customEvent.defaultPrevented) { - throw new Error(`Blocked remote.require('${moduleName}')`) - } else { - customEvent.returnValue = process.mainModule.require(moduleName) - } - } - - return valueToMeta(event.sender, contextId, customEvent.returnValue) -}) - -handleRemoteCommand('ELECTRON_BROWSER_GET_BUILTIN', function (event, contextId, moduleName) { - const customEvent = eventBinding.createWithSender(event.sender) - event.sender.emit('remote-get-builtin', customEvent, moduleName) - - if (customEvent.returnValue === undefined) { - if (customEvent.defaultPrevented) { - throw new Error(`Blocked remote.getBuiltin('${moduleName}')`) - } else { - customEvent.returnValue = electron[moduleName] - } - } - - return valueToMeta(event.sender, contextId, customEvent.returnValue) -}) - -handleRemoteCommand('ELECTRON_BROWSER_GLOBAL', function (event, contextId, globalName) { - const customEvent = eventBinding.createWithSender(event.sender) - event.sender.emit('remote-get-global', customEvent, globalName) - - if (customEvent.returnValue === undefined) { - if (customEvent.defaultPrevented) { - throw new Error(`Blocked remote.getGlobal('${globalName}')`) - } else { - customEvent.returnValue = global[globalName] - } - } - - return valueToMeta(event.sender, contextId, customEvent.returnValue) -}) - -handleRemoteCommand('ELECTRON_BROWSER_CURRENT_WINDOW', function (event, contextId) { - const customEvent = eventBinding.createWithSender(event.sender) - event.sender.emit('remote-get-current-window', customEvent) - - if (customEvent.returnValue === undefined) { - if (customEvent.defaultPrevented) { - throw new Error('Blocked remote.getCurrentWindow()') - } else { - customEvent.returnValue = event.sender.getOwnerBrowserWindow() - } - } - - return valueToMeta(event.sender, contextId, customEvent.returnValue) -}) - -handleRemoteCommand('ELECTRON_BROWSER_CURRENT_WEB_CONTENTS', function (event, contextId) { - const customEvent = eventBinding.createWithSender(event.sender) - event.sender.emit('remote-get-current-web-contents', customEvent) - - if (customEvent.returnValue === undefined) { - if (customEvent.defaultPrevented) { - throw new Error('Blocked remote.getCurrentWebContents()') - } else { - customEvent.returnValue = event.sender - } - } - - return valueToMeta(event.sender, contextId, customEvent.returnValue) -}) - -handleRemoteCommand('ELECTRON_BROWSER_CONSTRUCTOR', function (event, contextId, id, args) { - args = unwrapArgs(event.sender, contextId, args) - const constructor = objectsRegistry.get(id) - - if (constructor == null) { - throwRPCError(`Cannot call constructor on missing remote object ${id}`) - } - - return valueToMeta(event.sender, contextId, new constructor(...args)) -}) - -handleRemoteCommand('ELECTRON_BROWSER_FUNCTION_CALL', function (event, contextId, id, args) { - args = unwrapArgs(event.sender, contextId, args) - const func = objectsRegistry.get(id) - - if (func == null) { - throwRPCError(`Cannot call function on missing remote object ${id}`) - } - - return callFunction(event, contextId, func, global, args) -}) - -handleRemoteCommand('ELECTRON_BROWSER_MEMBER_CONSTRUCTOR', function (event, contextId, id, method, args) { - args = unwrapArgs(event.sender, contextId, args) - const object = objectsRegistry.get(id) - - if (object == null) { - throwRPCError(`Cannot call constructor '${method}' on missing remote object ${id}`) - } - - return valueToMeta(event.sender, contextId, new object[method](...args)) -}) - -handleRemoteCommand('ELECTRON_BROWSER_MEMBER_CALL', function (event, contextId, id, method, args) { - args = unwrapArgs(event.sender, contextId, args) - const obj = objectsRegistry.get(id) - - if (obj == null) { - throwRPCError(`Cannot call function '${method}' on missing remote object ${id}`) - } - - return callFunction(event, contextId, obj[method], obj, args) -}) - -handleRemoteCommand('ELECTRON_BROWSER_MEMBER_SET', function (event, contextId, id, name, args) { - args = unwrapArgs(event.sender, contextId, args) - const obj = objectsRegistry.get(id) - - if (obj == null) { - throwRPCError(`Cannot set property '${name}' on missing remote object ${id}`) - } - - obj[name] = args[0] - return null -}) - -handleRemoteCommand('ELECTRON_BROWSER_MEMBER_GET', function (event, contextId, id, name) { - const obj = objectsRegistry.get(id) - - if (obj == null) { - throwRPCError(`Cannot get property '${name}' on missing remote object ${id}`) - } - - return valueToMeta(event.sender, contextId, obj[name]) -}) - -handleRemoteCommand('ELECTRON_BROWSER_DEREFERENCE', function (event, contextId, id) { - objectsRegistry.remove(event.sender, contextId, id) -}) - -handleRemoteCommand('ELECTRON_BROWSER_CONTEXT_RELEASE', (event, contextId) => { - objectsRegistry.clear(event.sender, contextId) - return null -}) - -handleRemoteCommand('ELECTRON_BROWSER_GUEST_WEB_CONTENTS', function (event, contextId, guestInstanceId) { - const guest = guestViewManager.getGuestForWebContents(guestInstanceId, event.sender) - - const customEvent = eventBinding.createWithSender(event.sender) - event.sender.emit('remote-get-guest-web-contents', customEvent, guest) - - if (customEvent.returnValue === undefined) { - if (customEvent.defaultPrevented) { - throw new Error(`Blocked remote.getGuestForWebContents()`) - } else { - customEvent.returnValue = guest - } - } - - return valueToMeta(event.sender, contextId, customEvent.returnValue) -}) - -// Implements window.close() -ipcMain.on('ELECTRON_BROWSER_WINDOW_CLOSE', function (event) { - const window = event.sender.getOwnerBrowserWindow() - if (window) { - window.close() - } - event.returnValue = null -}) - -const getTempDirectory = function () { - try { - return electron.app.getPath('temp') - } catch (error) { - return os.tmpdir() - } -} - -const crashReporterInit = function (options) { - const productName = options.productName || electron.app.getName() - const crashesDirectory = path.join(getTempDirectory(), `${productName} Crashes`) - let crashServicePid - - if (process.platform === 'win32') { - const env = { - ELECTRON_INTERNAL_CRASH_SERVICE: 1 - } - const args = [ - '--reporter-url=' + options.submitURL, - '--application-name=' + productName, - '--crashes-directory=' + crashesDirectory, - '--v=1' - ] - - const crashServiceProcess = spawn(process.helperExecPath, args, { - env, - detached: true - }) - - crashServicePid = crashServiceProcess.pid - } - - return { - productName, - crashesDirectory, - crashServicePid, - appVersion: electron.app.getVersion() - } -} - -const setReturnValue = function (event, getValue) { - try { - event.returnValue = [null, getValue()] - } catch (error) { - event.returnValue = [errorUtils.serialize(error)] - } -} - -ipcMain.on('ELECTRON_CRASH_REPORTER_INIT', function (event, options) { - setReturnValue(event, () => crashReporterInit(options)) -}) - -ipcMain.on('ELECTRON_BROWSER_GET_LAST_WEB_PREFERENCES', function (event) { - setReturnValue(event, () => event.sender.getLastWebPreferences()) -}) - -ipcMain.on('ELECTRON_BROWSER_CLIPBOARD_READ_FIND_TEXT', function (event) { - setReturnValue(event, () => electron.clipboard.readFindText()) -}) - -ipcMain.on('ELECTRON_BROWSER_CLIPBOARD_WRITE_FIND_TEXT', function (event, text) { - setReturnValue(event, () => electron.clipboard.writeFindText(text)) -}) - -ipcMain.on('ELECTRON_BROWSER_SANDBOX_LOAD', function (event) { - const preloadPath = event.sender._getPreloadPath() - let preloadSrc = null - let preloadError = null - if (preloadPath) { - try { - preloadSrc = fs.readFileSync(preloadPath).toString() - } catch (err) { - preloadError = { stack: err ? err.stack : (new Error(`Failed to load "${preloadPath}"`)).stack } - } - } - event.returnValue = { - preloadSrc, - preloadError, - isRemoteModuleEnabled: event.sender._isRemoteModuleEnabled(), - process: { - arch: process.arch, - platform: process.platform, - env: process.env, - version: process.version, - versions: process.versions - } - } -}) diff --git a/electronasar/stable/common/api/clipboard.js b/electronasar/stable/common/api/clipboard.js deleted file mode 100644 index e0c9921..0000000 --- a/electronasar/stable/common/api/clipboard.js +++ /dev/null @@ -1,31 +0,0 @@ -'use strict' - -if (process.platform === 'linux' && process.type === 'renderer') { - // On Linux we could not access clipboard in renderer process. - const { getRemoteForUsage } = require('@electron/internal/renderer/remote') - module.exports = getRemoteForUsage('clipboard').clipboard -} else { - const clipboard = process.atomBinding('clipboard') - - // Read/write to find pasteboard over IPC since only main process is notified - // of changes - if (process.platform === 'darwin' && process.type === 'renderer') { - const ipcRenderer = require('@electron/internal/renderer/ipc-renderer-internal') - const errorUtils = require('@electron/internal/common/error-utils') - - const invoke = function (command, ...args) { - const [ error, result ] = ipcRenderer.sendSync(command, ...args) - - if (error) { - throw errorUtils.deserialize(error) - } else { - return result - } - } - - clipboard.readFindText = (...args) => invoke('ELECTRON_BROWSER_CLIPBOARD_READ_FIND_TEXT', ...args) - clipboard.writeFindText = (...args) => invoke('ELECTRON_BROWSER_CLIPBOARD_WRITE_FIND_TEXT', ...args) - } - - module.exports = clipboard -} diff --git a/electronasar/stable/common/api/deprecate.js b/electronasar/stable/common/api/deprecate.js deleted file mode 100644 index f72939b..0000000 --- a/electronasar/stable/common/api/deprecate.js +++ /dev/null @@ -1,95 +0,0 @@ -'use strict' - -let deprecationHandler = null - -function warnOnce (oldName, newName) { - let warned = false - const msg = newName - ? `'${oldName}' is deprecated and will be removed. Please use '${newName}' instead.` - : `'${oldName}' is deprecated and will be removed.` - return () => { - if (!warned && !process.noDeprecation) { - warned = true - deprecate.log(msg) - } - } -} - -const deprecate = { - setHandler: (handler) => { deprecationHandler = handler }, - getHandler: () => deprecationHandler, - warn: (oldName, newName) => { - return deprecate.log(`'${oldName}' is deprecated. Use '${newName}' instead.`) - }, - log: (message) => { - if (typeof deprecationHandler === 'function') { - deprecationHandler(message) - } else if (process.throwDeprecation) { - throw new Error(message) - } else if (process.traceDeprecation) { - return console.trace(message) - } else { - return console.warn(`(electron) ${message}`) - } - }, - - event: (emitter, oldName, newName) => { - const warn = newName.startsWith('-') /* internal event */ - ? warnOnce(`${oldName} event`) - : warnOnce(`${oldName} event`, `${newName} event`) - return emitter.on(newName, function (...args) { - if (this.listenerCount(oldName) !== 0) { - warn() - this.emit(oldName, ...args) - } - }) - }, - - removeProperty: (o, removedName) => { - // if the property's already been removed, warn about it - if (!(removedName in o)) { - deprecate.log(`Unable to remove property '${removedName}' from an object that lacks it.`) - } - - // wrap the deprecated property in an accessor to warn - const warn = warnOnce(removedName) - let val = o[removedName] - return Object.defineProperty(o, removedName, { - configurable: true, - get: () => { - warn() - return val - }, - set: newVal => { - warn() - val = newVal - } - }) - }, - - renameProperty: (o, oldName, newName) => { - const warn = warnOnce(oldName, newName) - - // if the new property isn't there yet, - // inject it and warn about it - if ((oldName in o) && !(newName in o)) { - warn() - o[newName] = o[oldName] - } - - // wrap the deprecated property in an accessor to warn - // and redirect to the new property - return Object.defineProperty(o, oldName, { - get: () => { - warn() - return o[newName] - }, - set: value => { - warn() - o[newName] = value - } - }) - } -} - -module.exports = deprecate diff --git a/electronasar/stable/common/api/deprecations.js b/electronasar/stable/common/api/deprecations.js deleted file mode 100644 index f4c4d74..0000000 --- a/electronasar/stable/common/api/deprecations.js +++ /dev/null @@ -1,11 +0,0 @@ -'use strict' - -const deprecate = require('electron').deprecate - -exports.setHandler = function (deprecationHandler) { - deprecate.setHandler(deprecationHandler) -} - -exports.getHandler = function () { - return deprecate.getHandler() -} diff --git a/electronasar/stable/common/api/exports/electron.js b/electronasar/stable/common/api/exports/electron.js deleted file mode 100644 index 49c6702..0000000 --- a/electronasar/stable/common/api/exports/electron.js +++ /dev/null @@ -1,31 +0,0 @@ -'use strict' - -const moduleList = require('@electron/internal/common/api/module-list') - -exports.memoizedGetter = (getter) => { - /* - * It's ok to leak this value as it would be leaked by the global - * node module cache anyway at `Module._cache`. This memoization - * is dramatically faster than relying on nodes module cache however - */ - let memoizedValue = null - - return () => { - if (memoizedValue === null) { - memoizedValue = getter() - } - return memoizedValue - } -} - -// Attaches properties to |targetExports|. -exports.defineProperties = function (targetExports) { - const descriptors = {} - for (const module of moduleList) { - descriptors[module.name] = { - enumerable: !module.private, - get: exports.memoizedGetter(() => require(`@electron/internal/common/api/${module.file}`)) - } - } - return Object.defineProperties(targetExports, descriptors) -} diff --git a/electronasar/stable/common/api/is-promise.js b/electronasar/stable/common/api/is-promise.js deleted file mode 100644 index d6115a1..0000000 --- a/electronasar/stable/common/api/is-promise.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict' - -module.exports = function isPromise (val) { - return ( - val && - val.then && - val.then instanceof Function && - val.constructor && - val.constructor.reject && - val.constructor.reject instanceof Function && - val.constructor.resolve && - val.constructor.resolve instanceof Function - ) -} diff --git a/electronasar/stable/common/api/module-list.js b/electronasar/stable/common/api/module-list.js deleted file mode 100644 index 3741f17..0000000 --- a/electronasar/stable/common/api/module-list.js +++ /dev/null @@ -1,12 +0,0 @@ -'use strict' - -// Common modules, please sort alphabetically -module.exports = [ - { name: 'clipboard', file: 'clipboard' }, - { name: 'nativeImage', file: 'native-image' }, - { name: 'shell', file: 'shell' }, - // The internal modules, invisible unless you know their names. - { name: 'deprecate', file: 'deprecate', private: true }, - { name: 'deprecations', file: 'deprecations', private: true }, - { name: 'isPromise', file: 'is-promise', private: true } -] diff --git a/electronasar/stable/common/api/native-image.js b/electronasar/stable/common/api/native-image.js deleted file mode 100644 index f703f94..0000000 --- a/electronasar/stable/common/api/native-image.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict' - -module.exports = process.atomBinding('native_image') diff --git a/electronasar/stable/common/api/shell.js b/electronasar/stable/common/api/shell.js deleted file mode 100644 index 6907d90..0000000 --- a/electronasar/stable/common/api/shell.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict' - -module.exports = process.atomBinding('shell') diff --git a/electronasar/stable/common/atom-binding-setup.js b/electronasar/stable/common/atom-binding-setup.js deleted file mode 100644 index 36954f5..0000000 --- a/electronasar/stable/common/atom-binding-setup.js +++ /dev/null @@ -1,15 +0,0 @@ -'use strict' - -module.exports = function atomBindingSetup (binding, processType) { - return function atomBinding (name) { - try { - return binding(`atom_${processType}_${name}`) - } catch (error) { - if (/No such module/.test(error.message)) { - return binding(`atom_common_${name}`) - } else { - throw error - } - } - } -} diff --git a/electronasar/stable/common/buffer-utils.js b/electronasar/stable/common/buffer-utils.js deleted file mode 100644 index 8bfdf66..0000000 --- a/electronasar/stable/common/buffer-utils.js +++ /dev/null @@ -1,66 +0,0 @@ -'use strict' - -// Note: Don't use destructuring assignment for `Buffer`, or we'll hit a -// browserify bug that makes the statement invalid, throwing an error in -// sandboxed renderer. -const Buffer = require('buffer').Buffer - -const typedArrays = { - Buffer, - ArrayBuffer, - Int8Array, - Uint8Array, - Uint8ClampedArray, - Int16Array, - Uint16Array, - Int32Array, - Uint32Array, - Float32Array, - Float64Array -} - -function getType (value) { - for (const type of Object.keys(typedArrays)) { - if (value instanceof typedArrays[type]) { - return type - } - } - return null -} - -function getBuffer (value) { - if (value instanceof Buffer) { - return value - } else if (value instanceof ArrayBuffer) { - return Buffer.from(value) - } else { - return Buffer.from(value.buffer, value.byteOffset, value.byteLength) - } -} - -exports.isBuffer = function (value) { - return ArrayBuffer.isView(value) || value instanceof ArrayBuffer -} - -exports.bufferToMeta = function (value) { - return { - type: getType(value), - data: getBuffer(value), - length: value.length - } -} - -exports.metaToBuffer = function (value) { - const constructor = typedArrays[value.type] - const data = getBuffer(value.data) - - if (constructor === Buffer) { - return data - } else if (constructor === ArrayBuffer) { - return data.buffer - } else if (constructor) { - return new constructor(data.buffer, data.byteOffset, value.length) - } else { - return data - } -} diff --git a/electronasar/stable/common/crash-reporter.js b/electronasar/stable/common/crash-reporter.js deleted file mode 100644 index eed2c24..0000000 --- a/electronasar/stable/common/crash-reporter.js +++ /dev/null @@ -1,123 +0,0 @@ -'use strict' - -const binding = process.atomBinding('crash_reporter') - -const errorUtils = require('@electron/internal/common/error-utils') - -class CrashReporter { - contructor () { - this.productName = null - this.crashesDirectory = null - } - - sendSync (channel, ...args) { - throw new Error('Not implemented') - } - - invoke (command, ...args) { - const [ error, result ] = this.sendSync(command, ...args) - - if (error) { - throw errorUtils.deserialize(error) - } - - return result - } - - start (options) { - if (options == null) options = {} - - let { - productName, - companyName, - extra, - ignoreSystemCrashHandler, - submitURL, - uploadToServer - } = options - - if (uploadToServer == null) { - uploadToServer = true - } - - if (ignoreSystemCrashHandler == null) { - ignoreSystemCrashHandler = false - } - - if (companyName == null) { - throw new Error('companyName is a required option to crashReporter.start') - } - if (submitURL == null) { - throw new Error('submitURL is a required option to crashReporter.start') - } - - const ret = this.invoke('ELECTRON_CRASH_REPORTER_INIT', { - submitURL, - productName - }) - - this.productName = ret.productName - this.crashesDirectory = ret.crashesDirectory - this.crashServicePid = ret.crashServicePid - - if (extra == null) extra = {} - if (extra._productName == null) extra._productName = ret.productName - if (extra._companyName == null) extra._companyName = companyName - if (extra._version == null) extra._version = ret.appVersion - - binding.start(ret.productName, companyName, submitURL, ret.crashesDirectory, uploadToServer, ignoreSystemCrashHandler, extra) - } - - getLastCrashReport () { - const reports = this.getUploadedReports() - .sort((a, b) => { - const ats = (a && a.date) ? new Date(a.date).getTime() : 0 - const bts = (b && b.date) ? new Date(b.date).getTime() : 0 - return bts - ats - }) - - return (reports.length > 0) ? reports[0] : null - } - - getUploadedReports () { - return binding.getUploadedReports(this.getCrashesDirectory()) - } - - getCrashesDirectory () { - return this.crashesDirectory - } - - getProductName () { - return this.productName - } - - getUploadToServer () { - if (process.type === 'browser') { - return binding.getUploadToServer() - } else { - throw new Error('getUploadToServer can only be called from the main process') - } - } - - setUploadToServer (uploadToServer) { - if (process.type === 'browser') { - return binding.setUploadToServer(uploadToServer) - } else { - throw new Error('setUploadToServer can only be called from the main process') - } - } - - addExtraParameter (key, value) { - binding.addExtraParameter(key, value) - } - - removeExtraParameter (key) { - binding.removeExtraParameter(key) - } - - getParameters (key, value) { - return binding.getParameters() - } -} - -module.exports = CrashReporter diff --git a/electronasar/stable/common/error-utils.js b/electronasar/stable/common/error-utils.js deleted file mode 100644 index 26dd018..0000000 --- a/electronasar/stable/common/error-utils.js +++ /dev/null @@ -1,39 +0,0 @@ -'use strict' - -const constructors = new Map([ - [Error.name, Error], - [EvalError.name, EvalError], - [RangeError.name, RangeError], - [ReferenceError.name, ReferenceError], - [SyntaxError.name, SyntaxError], - [TypeError.name, TypeError], - [URIError.name, URIError] -]) - -exports.deserialize = function (error) { - if (error && error.__ELECTRON_SERIALIZED_ERROR__ && constructors.has(error.name)) { - const constructor = constructors.get(error.name) - const deserializedError = new constructor(error.message) - deserializedError.stack = error.stack - deserializedError.from = error.from - deserializedError.cause = exports.deserialize(error.cause) - return deserializedError - } - return error -} - -exports.serialize = function (error) { - if (error instanceof Error) { - // Errors get lost, because: JSON.stringify(new Error('Message')) === {} - // Take the serializable properties and construct a generic object - return { - message: error.message, - stack: error.stack, - name: error.name, - from: process.type, - cause: exports.serialize(error.cause), - __ELECTRON_SERIALIZED_ERROR__: true - } - } - return error -} diff --git a/electronasar/stable/common/init.js b/electronasar/stable/common/init.js deleted file mode 100644 index a69d962..0000000 --- a/electronasar/stable/common/init.js +++ /dev/null @@ -1,53 +0,0 @@ -'use strict' - -const timers = require('timers') -const util = require('util') - -process.atomBinding = require('@electron/internal/common/atom-binding-setup')(process.binding, process.type) - -// setImmediate and process.nextTick makes use of uv_check and uv_prepare to -// run the callbacks, however since we only run uv loop on requests, the -// callbacks wouldn't be called until something else activated the uv loop, -// which would delay the callbacks for arbitrary long time. So we should -// initiatively activate the uv loop once setImmediate and process.nextTick is -// called. -const wrapWithActivateUvLoop = function (func) { - return wrap(func, function (func) { - return function () { - process.activateUvLoop() - return func.apply(this, arguments) - } - }) -} - -function wrap (func, wrapper) { - const wrapped = wrapper(func) - if (func[util.promisify.custom]) { - wrapped[util.promisify.custom] = wrapper(func[util.promisify.custom]) - } - return wrapped -} - -process.nextTick = wrapWithActivateUvLoop(process.nextTick) - -global.setImmediate = wrapWithActivateUvLoop(timers.setImmediate) -global.clearImmediate = timers.clearImmediate - -if (process.type === 'browser') { - // setTimeout needs to update the polling timeout of the event loop, when - // called under Chromium's event loop the node's event loop won't get a chance - // to update the timeout, so we have to force the node's event loop to - // recalculate the timeout in browser process. - global.setTimeout = wrapWithActivateUvLoop(timers.setTimeout) - global.setInterval = wrapWithActivateUvLoop(timers.setInterval) -} - -if (process.platform === 'win32') { - // Always returns EOF for stdin stream. - const { Readable } = require('stream') - const stdin = new Readable() - stdin.push(null) - process.__defineGetter__('stdin', function () { - return stdin - }) -} diff --git a/electronasar/stable/common/parse-features-string.js b/electronasar/stable/common/parse-features-string.js deleted file mode 100644 index 955ab8f..0000000 --- a/electronasar/stable/common/parse-features-string.js +++ /dev/null @@ -1,21 +0,0 @@ -'use strict' - -// parses a feature string that has the format used in window.open() -// - `features` input string -// - `emit` function(key, value) - called for each parsed KV -module.exports = function parseFeaturesString (features, emit) { - features = `${features}` - // split the string by ',' - features.split(/,\s*/).forEach((feature) => { - // expected form is either a key by itself or a key/value pair in the form of - // 'key=value' - let [key, value] = feature.split(/\s*=/) - if (!key) return - - // interpret the value as a boolean, if possible - value = (value === 'yes' || value === '1') ? true : (value === 'no' || value === '0') ? false : value - - // emit the parsed pair - emit(key, value) - }) -} diff --git a/electronasar/stable/common/reset-search-paths.js b/electronasar/stable/common/reset-search-paths.js deleted file mode 100644 index 5890592..0000000 --- a/electronasar/stable/common/reset-search-paths.js +++ /dev/null @@ -1,45 +0,0 @@ -'use strict' - -const path = require('path') -const Module = require('module') - -// Clear Node's global search paths. -Module.globalPaths.length = 0 - -// Clear current and parent(init.js)'s search paths. -module.paths = [] -module.parent.paths = [] - -// Prevent Node from adding paths outside this app to search paths. -const resourcesPathWithTrailingSlash = process.resourcesPath + path.sep -const originalNodeModulePaths = Module._nodeModulePaths -Module._nodeModulePaths = function (from) { - const paths = originalNodeModulePaths(from) - const fromPath = path.resolve(from) + path.sep - // If "from" is outside the app then we do nothing. - if (fromPath.startsWith(resourcesPathWithTrailingSlash)) { - return paths.filter(function (candidate) { - return candidate.startsWith(resourcesPathWithTrailingSlash) - }) - } else { - return paths - } -} - -const BASE_INTERNAL_PATH = path.resolve(__dirname, '..') -const INTERNAL_MODULE_PREFIX = '@electron/internal/' - -// Patch Module._resolveFilename to always require the Electron API when -// require('electron') is done. -const electronPath = path.join(__dirname, '..', process.type, 'api', 'exports', 'electron.js') -const originalResolveFilename = Module._resolveFilename -Module._resolveFilename = function (request, parent, isMain) { - if (request === 'electron') { - return electronPath - } else if (request.startsWith(INTERNAL_MODULE_PREFIX) && request.length > INTERNAL_MODULE_PREFIX.length) { - const slicedRequest = request.slice(INTERNAL_MODULE_PREFIX.length) - return path.resolve(BASE_INTERNAL_PATH, `${slicedRequest}${slicedRequest.endsWith('.js') ? '' : '.js'}`) - } else { - return originalResolveFilename(request, parent, isMain) - } -} diff --git a/electronasar/stable/common/web-view-methods.js b/electronasar/stable/common/web-view-methods.js deleted file mode 100644 index 0fdaebb..0000000 --- a/electronasar/stable/common/web-view-methods.js +++ /dev/null @@ -1,70 +0,0 @@ -'use strict' - -// Public-facing API methods. -exports.syncMethods = new Set([ - 'getURL', - 'loadURL', - 'getTitle', - 'isLoading', - 'isLoadingMainFrame', - 'isWaitingForResponse', - 'stop', - 'reload', - 'reloadIgnoringCache', - 'canGoBack', - 'canGoForward', - 'canGoToOffset', - 'clearHistory', - 'goBack', - 'goForward', - 'goToIndex', - 'goToOffset', - 'isCrashed', - 'setUserAgent', - 'getUserAgent', - 'openDevTools', - 'closeDevTools', - 'isDevToolsOpened', - 'isDevToolsFocused', - 'inspectElement', - 'setAudioMuted', - 'isAudioMuted', - 'isCurrentlyAudible', - 'undo', - 'redo', - 'cut', - 'copy', - 'paste', - 'pasteAndMatchStyle', - 'delete', - 'selectAll', - 'unselect', - 'replace', - 'replaceMisspelling', - 'findInPage', - 'stopFindInPage', - 'downloadURL', - 'inspectServiceWorker', - 'showDefinitionForSelection', - 'setZoomFactor', - 'setZoomLevel', - 'sendImeEvent' -]) - -exports.asyncCallbackMethods = new Set([ - 'insertCSS', - 'insertText', - 'send', - 'sendInputEvent', - 'setLayoutZoomLevelLimits', - 'setVisualZoomLevelLimits', - 'getZoomFactor', - 'getZoomLevel', - 'print', - 'printToPDF' -]) - -exports.asyncPromiseMethods = new Set([ - 'capturePage', - 'executeJavaScript' -]) diff --git a/electronasar/stable/renderer/api/crash-reporter.js b/electronasar/stable/renderer/api/crash-reporter.js deleted file mode 100644 index 5bbd90e..0000000 --- a/electronasar/stable/renderer/api/crash-reporter.js +++ /dev/null @@ -1,12 +0,0 @@ -'use strict' - -const CrashReporter = require('@electron/internal/common/crash-reporter') -const ipcRenderer = require('@electron/internal/renderer/ipc-renderer-internal') - -class CrashReporterRenderer extends CrashReporter { - sendSync (channel, ...args) { - return ipcRenderer.sendSync(channel, ...args) - } -} - -module.exports = new CrashReporterRenderer() diff --git a/electronasar/stable/renderer/api/desktop-capturer.js b/electronasar/stable/renderer/api/desktop-capturer.js deleted file mode 100644 index e4ece82..0000000 --- a/electronasar/stable/renderer/api/desktop-capturer.js +++ /dev/null @@ -1,48 +0,0 @@ -'use strict' - -const { nativeImage } = require('electron') -const ipcRenderer = require('@electron/internal/renderer/ipc-renderer-internal') - -const includes = [].includes -let currentId = 0 - -const incrementId = () => { - currentId += 1 - return currentId -} - -// |options.types| can't be empty and must be an array -function isValid (options) { - const types = options ? options.types : undefined - return Array.isArray(types) -} - -exports.getSources = function (options, callback) { - if (!isValid(options)) return callback(new Error('Invalid options')) - const captureWindow = includes.call(options.types, 'window') - const captureScreen = includes.call(options.types, 'screen') - - if (options.thumbnailSize == null) { - options.thumbnailSize = { - width: 150, - height: 150 - } - } - - const id = incrementId() - ipcRenderer.send('ELECTRON_BROWSER_DESKTOP_CAPTURER_GET_SOURCES', captureWindow, captureScreen, options.thumbnailSize, id) - return ipcRenderer.once(`ELECTRON_RENDERER_DESKTOP_CAPTURER_RESULT_${id}`, (event, sources) => { - callback(null, (() => { - const results = [] - sources.forEach(source => { - results.push({ - id: source.id, - name: source.name, - thumbnail: nativeImage.createFromDataURL(source.thumbnail), - display_id: source.display_id - }) - }) - return results - })()) - }) -} diff --git a/electronasar/stable/renderer/api/exports/electron.js b/electronasar/stable/renderer/api/exports/electron.js deleted file mode 100644 index 63aa8d4..0000000 --- a/electronasar/stable/renderer/api/exports/electron.js +++ /dev/null @@ -1,23 +0,0 @@ -'use strict' - -const common = require('@electron/internal/common/api/exports/electron') -const moduleList = require('@electron/internal/renderer/api/module-list') - -// Import common modules. -common.defineProperties(exports) - -for (const { - name, - file, - enabled = true, - private: isPrivate = false -} of moduleList) { - if (!enabled) { - continue - } - - Object.defineProperty(exports, name, { - enumerable: !isPrivate, - get: common.memoizedGetter(() => require(`@electron/internal/renderer/api/${file}`)) - }) -} diff --git a/electronasar/stable/renderer/api/ipc-renderer.js b/electronasar/stable/renderer/api/ipc-renderer.js deleted file mode 100644 index 7705f9f..0000000 --- a/electronasar/stable/renderer/api/ipc-renderer.js +++ /dev/null @@ -1,30 +0,0 @@ -'use strict' - -const binding = process.atomBinding('ipc') -const v8Util = process.atomBinding('v8_util') - -// Created by init.js. -const ipcRenderer = v8Util.getHiddenValue(global, 'ipc') -const internal = false - -ipcRenderer.send = function (...args) { - return binding.send('ipc-message', args) -} - -ipcRenderer.sendSync = function (...args) { - return binding.sendSync('ipc-message-sync', args)[0] -} - -ipcRenderer.sendToHost = function (...args) { - return binding.send('ipc-message-host', args) -} - -ipcRenderer.sendTo = function (webContentsId, channel, ...args) { - return binding.sendTo(internal, false, webContentsId, channel, args) -} - -ipcRenderer.sendToAll = function (webContentsId, channel, ...args) { - return binding.sendTo(internal, true, webContentsId, channel, args) -} - -module.exports = ipcRenderer diff --git a/electronasar/stable/renderer/api/module-list.js b/electronasar/stable/renderer/api/module-list.js deleted file mode 100644 index b9bba8a..0000000 --- a/electronasar/stable/renderer/api/module-list.js +++ /dev/null @@ -1,21 +0,0 @@ -'use strict' - -const features = process.atomBinding('features') -const v8Util = process.atomBinding('v8_util') - -const enableRemoteModule = v8Util.getHiddenValue(global, 'enableRemoteModule') - -// Renderer side modules, please sort alphabetically. -// A module is `enabled` if there is no explicit condition defined. -module.exports = [ - { name: 'crashReporter', file: 'crash-reporter', enabled: true }, - { - name: 'desktopCapturer', - file: 'desktop-capturer', - enabled: features.isDesktopCapturerEnabled() - }, - { name: 'ipcRenderer', file: 'ipc-renderer' }, - { name: 'remote', file: 'remote', enabled: enableRemoteModule }, - { name: 'screen', file: 'screen' }, - { name: 'webFrame', file: 'web-frame' } -] diff --git a/electronasar/stable/renderer/api/remote.js b/electronasar/stable/renderer/api/remote.js deleted file mode 100644 index 036ebd8..0000000 --- a/electronasar/stable/renderer/api/remote.js +++ /dev/null @@ -1,355 +0,0 @@ -'use strict' - -const v8Util = process.atomBinding('v8_util') -const { isPromise } = require('electron') -const resolvePromise = Promise.resolve.bind(Promise) - -const CallbacksRegistry = require('@electron/internal/renderer/callbacks-registry') -const bufferUtils = require('@electron/internal/common/buffer-utils') -const errorUtils = require('@electron/internal/common/error-utils') -const ipcRenderer = require('@electron/internal/renderer/ipc-renderer-internal') - -const callbacksRegistry = new CallbacksRegistry() -const remoteObjectCache = v8Util.createIDWeakMap() - -// An unique ID that can represent current context. -const contextId = v8Util.getHiddenValue(global, 'contextId') - -// Notify the main process when current context is going to be released. -// Note that when the renderer process is destroyed, the message may not be -// sent, we also listen to the "render-view-deleted" event in the main process -// to guard that situation. -process.on('exit', () => { - const command = 'ELECTRON_BROWSER_CONTEXT_RELEASE' - ipcRenderer.sendSync(command, contextId) -}) - -// Convert the arguments object into an array of meta data. -function wrapArgs (args, visited = new Set()) { - const valueToMeta = (value) => { - // Check for circular reference. - if (visited.has(value)) { - return { - type: 'value', - value: null - } - } - - if (Array.isArray(value)) { - visited.add(value) - const meta = { - type: 'array', - value: wrapArgs(value, visited) - } - visited.delete(value) - return meta - } else if (bufferUtils.isBuffer(value)) { - return { - type: 'buffer', - value: bufferUtils.bufferToMeta(value) - } - } else if (value instanceof Date) { - return { - type: 'date', - value: value.getTime() - } - } else if ((value != null) && typeof value === 'object') { - if (isPromise(value)) { - return { - type: 'promise', - then: valueToMeta(function (onFulfilled, onRejected) { - value.then(onFulfilled, onRejected) - }) - } - } else if (v8Util.getHiddenValue(value, 'atomId')) { - return { - type: 'remote-object', - id: v8Util.getHiddenValue(value, 'atomId') - } - } - - const meta = { - type: 'object', - name: value.constructor ? value.constructor.name : '', - members: [] - } - visited.add(value) - for (const prop in value) { - meta.members.push({ - name: prop, - value: valueToMeta(value[prop]) - }) - } - visited.delete(value) - return meta - } else if (typeof value === 'function' && v8Util.getHiddenValue(value, 'returnValue')) { - return { - type: 'function-with-return-value', - value: valueToMeta(value()) - } - } else if (typeof value === 'function') { - return { - type: 'function', - id: callbacksRegistry.add(value), - location: v8Util.getHiddenValue(value, 'location'), - length: value.length - } - } else { - return { - type: 'value', - value: value - } - } - } - return args.map(valueToMeta) -} - -// Populate object's members from descriptors. -// The |ref| will be kept referenced by |members|. -// This matches |getObjectMemebers| in rpc-server. -function setObjectMembers (ref, object, metaId, members) { - if (!Array.isArray(members)) return - - for (const member of members) { - if (object.hasOwnProperty(member.name)) continue - - const descriptor = { enumerable: member.enumerable } - if (member.type === 'method') { - const remoteMemberFunction = function (...args) { - let command - if (this && this.constructor === remoteMemberFunction) { - command = 'ELECTRON_BROWSER_MEMBER_CONSTRUCTOR' - } else { - command = 'ELECTRON_BROWSER_MEMBER_CALL' - } - const ret = ipcRenderer.sendSync(command, contextId, metaId, member.name, wrapArgs(args)) - return metaToValue(ret) - } - - let descriptorFunction = proxyFunctionProperties(remoteMemberFunction, metaId, member.name) - - descriptor.get = () => { - descriptorFunction.ref = ref // The member should reference its object. - return descriptorFunction - } - // Enable monkey-patch the method - descriptor.set = (value) => { - descriptorFunction = value - return value - } - descriptor.configurable = true - } else if (member.type === 'get') { - descriptor.get = () => { - const command = 'ELECTRON_BROWSER_MEMBER_GET' - const meta = ipcRenderer.sendSync(command, contextId, metaId, member.name) - return metaToValue(meta) - } - - if (member.writable) { - descriptor.set = (value) => { - const args = wrapArgs([value]) - const command = 'ELECTRON_BROWSER_MEMBER_SET' - const meta = ipcRenderer.sendSync(command, contextId, metaId, member.name, args) - if (meta != null) metaToValue(meta) - return value - } - } - } - - Object.defineProperty(object, member.name, descriptor) - } -} - -// Populate object's prototype from descriptor. -// This matches |getObjectPrototype| in rpc-server. -function setObjectPrototype (ref, object, metaId, descriptor) { - if (descriptor === null) return - const proto = {} - setObjectMembers(ref, proto, metaId, descriptor.members) - setObjectPrototype(ref, proto, metaId, descriptor.proto) - Object.setPrototypeOf(object, proto) -} - -// Wrap function in Proxy for accessing remote properties -function proxyFunctionProperties (remoteMemberFunction, metaId, name) { - let loaded = false - - // Lazily load function properties - const loadRemoteProperties = () => { - if (loaded) return - loaded = true - const command = 'ELECTRON_BROWSER_MEMBER_GET' - const meta = ipcRenderer.sendSync(command, contextId, metaId, name) - setObjectMembers(remoteMemberFunction, remoteMemberFunction, meta.id, meta.members) - } - - return new Proxy(remoteMemberFunction, { - set: (target, property, value, receiver) => { - if (property !== 'ref') loadRemoteProperties() - target[property] = value - return true - }, - get: (target, property, receiver) => { - if (!target.hasOwnProperty(property)) loadRemoteProperties() - const value = target[property] - if (property === 'toString' && typeof value === 'function') { - return value.bind(target) - } - return value - }, - ownKeys: (target) => { - loadRemoteProperties() - return Object.getOwnPropertyNames(target) - }, - getOwnPropertyDescriptor: (target, property) => { - const descriptor = Object.getOwnPropertyDescriptor(target, property) - if (descriptor) return descriptor - loadRemoteProperties() - return Object.getOwnPropertyDescriptor(target, property) - } - }) -} - -// Convert meta data from browser into real value. -function metaToValue (meta) { - const types = { - value: () => meta.value, - array: () => meta.members.map((member) => metaToValue(member)), - buffer: () => bufferUtils.metaToBuffer(meta.value), - promise: () => resolvePromise({ then: metaToValue(meta.then) }), - error: () => metaToPlainObject(meta), - date: () => new Date(meta.value), - exception: () => { throw errorUtils.deserialize(meta.value) } - } - - if (meta.type in types) { - return types[meta.type]() - } else { - let ret - if (remoteObjectCache.has(meta.id)) { - return remoteObjectCache.get(meta.id) - } - - // A shadow class to represent the remote function object. - if (meta.type === 'function') { - const remoteFunction = function (...args) { - let command - if (this && this.constructor === remoteFunction) { - command = 'ELECTRON_BROWSER_CONSTRUCTOR' - } else { - command = 'ELECTRON_BROWSER_FUNCTION_CALL' - } - const obj = ipcRenderer.sendSync(command, contextId, meta.id, wrapArgs(args)) - return metaToValue(obj) - } - ret = remoteFunction - } else { - ret = {} - } - - setObjectMembers(ret, ret, meta.id, meta.members) - setObjectPrototype(ret, ret, meta.id, meta.proto) - Object.defineProperty(ret.constructor, 'name', { value: meta.name }) - - // Track delegate obj's lifetime & tell browser to clean up when object is GCed. - v8Util.setRemoteObjectFreer(ret, contextId, meta.id) - v8Util.setHiddenValue(ret, 'atomId', meta.id) - remoteObjectCache.set(meta.id, ret) - return ret - } -} - -// Construct a plain object from the meta. -function metaToPlainObject (meta) { - const obj = (() => meta.type === 'error' ? new Error() : {})() - for (let i = 0; i < meta.members.length; i++) { - const { name, value } = meta.members[i] - obj[name] = value - } - return obj -} - -function handleMessage (channel, handler) { - ipcRenderer.on(channel, (event, passedContextId, id, ...args) => { - if (passedContextId === contextId) { - handler(id, ...args) - } else { - // Message sent to an un-exist context, notify the error to main process. - ipcRenderer.send('ELECTRON_BROWSER_WRONG_CONTEXT_ERROR', contextId, passedContextId, id) - } - }) -} - -// Browser calls a callback in renderer. -handleMessage('ELECTRON_RENDERER_CALLBACK', (id, args) => { - callbacksRegistry.apply(id, metaToValue(args)) -}) - -// A callback in browser is released. -handleMessage('ELECTRON_RENDERER_RELEASE_CALLBACK', (id) => { - callbacksRegistry.remove(id) -}) - -exports.require = (module) => { - const command = 'ELECTRON_BROWSER_REQUIRE' - const meta = ipcRenderer.sendSync(command, contextId, module) - return metaToValue(meta) -} - -// Alias to remote.require('electron').xxx. -exports.getBuiltin = (module) => { - const command = 'ELECTRON_BROWSER_GET_BUILTIN' - const meta = ipcRenderer.sendSync(command, contextId, module) - return metaToValue(meta) -} - -exports.getCurrentWindow = () => { - const command = 'ELECTRON_BROWSER_CURRENT_WINDOW' - const meta = ipcRenderer.sendSync(command, contextId) - return metaToValue(meta) -} - -// Get current WebContents object. -exports.getCurrentWebContents = () => { - return metaToValue(ipcRenderer.sendSync('ELECTRON_BROWSER_CURRENT_WEB_CONTENTS', contextId)) -} - -// Get a global object in browser. -exports.getGlobal = (name) => { - const command = 'ELECTRON_BROWSER_GLOBAL' - const meta = ipcRenderer.sendSync(command, contextId, name) - return metaToValue(meta) -} - -// Get the process object in browser. -exports.__defineGetter__('process', () => exports.getGlobal('process')) - -// Create a function that will return the specified value when called in browser. -exports.createFunctionWithReturnValue = (returnValue) => { - const func = () => returnValue - v8Util.setHiddenValue(func, 'returnValue', true) - return func -} - -// Get the guest WebContents from guestInstanceId. -exports.getGuestWebContents = (guestInstanceId) => { - const command = 'ELECTRON_BROWSER_GUEST_WEB_CONTENTS' - const meta = ipcRenderer.sendSync(command, contextId, guestInstanceId) - return metaToValue(meta) -} - -const addBuiltinProperty = (name) => { - Object.defineProperty(exports, name, { - get: () => exports.getBuiltin(name) - }) -} - -const browserModules = - require('@electron/internal/common/api/module-list').concat( - require('@electron/internal/browser/api/module-list')) - -// And add a helper receiver for each one. -browserModules - .filter((m) => !m.private) - .map((m) => m.name) - .forEach(addBuiltinProperty) diff --git a/electronasar/stable/renderer/api/screen.js b/electronasar/stable/renderer/api/screen.js deleted file mode 100644 index 6cae10d..0000000 --- a/electronasar/stable/renderer/api/screen.js +++ /dev/null @@ -1,4 +0,0 @@ -'use strict' - -const { getRemoteForUsage } = require('@electron/internal/renderer/remote') -module.exports = getRemoteForUsage('screen').screen diff --git a/electronasar/stable/renderer/api/web-frame.js b/electronasar/stable/renderer/api/web-frame.js deleted file mode 100644 index 534a98a..0000000 --- a/electronasar/stable/renderer/api/web-frame.js +++ /dev/null @@ -1,67 +0,0 @@ -'use strict' - -const { EventEmitter } = require('events') -const binding = process.atomBinding('web_frame') - -class WebFrame extends EventEmitter { - constructor (context) { - super() - - this.context = context - // Lots of webview would subscribe to webFrame's events. - this.setMaxListeners(0) - } - - findFrameByRoutingId (...args) { - return getWebFrame(binding._findFrameByRoutingId(this.context, ...args)) - } - - getFrameForSelector (...args) { - return getWebFrame(binding._getFrameForSelector(this.context, ...args)) - } - - findFrameByName (...args) { - return getWebFrame(binding._findFrameByName(this.context, ...args)) - } - - get opener () { - return getWebFrame(binding._getOpener(this.context)) - } - - get parent () { - return getWebFrame(binding._getParent(this.context)) - } - - get top () { - return getWebFrame(binding._getTop(this.context)) - } - - get firstChild () { - return getWebFrame(binding._getFirstChild(this.context)) - } - - get nextSibling () { - return getWebFrame(binding._getNextSibling(this.context)) - } - - get routingId () { - return binding._getRoutingId(this.context) - } -} - -// Populate the methods. -for (const name in binding) { - if (!name.startsWith('_')) { // some methods are manully populated above - WebFrame.prototype[name] = function (...args) { - return binding[name](this.context, ...args) - } - } -} - -// Helper to return WebFrame or null depending on context. -// TODO(zcbenz): Consider returning same WebFrame for the same context. -function getWebFrame (context) { - return context ? new WebFrame(context) : null -} - -module.exports = new WebFrame(window) diff --git a/electronasar/stable/renderer/callbacks-registry.js b/electronasar/stable/renderer/callbacks-registry.js deleted file mode 100644 index 6a1c63b..0000000 --- a/electronasar/stable/renderer/callbacks-registry.js +++ /dev/null @@ -1,59 +0,0 @@ -'use strict' - -const v8Util = process.atomBinding('v8_util') - -class CallbacksRegistry { - constructor () { - this.nextId = 0 - this.callbacks = {} - } - - add (callback) { - // The callback is already added. - let id = v8Util.getHiddenValue(callback, 'callbackId') - if (id != null) return id - - id = this.nextId += 1 - - // Capture the location of the function and put it in the ID string, - // so that release errors can be tracked down easily. - const regexp = /at (.*)/gi - const stackString = (new Error()).stack - - let filenameAndLine - let match - - while ((match = regexp.exec(stackString)) !== null) { - const location = match[1] - if (location.includes('(native)')) continue - if (location.includes('(<anonymous>)')) continue - if (location.includes('electron.asar')) continue - - const ref = /([^/^)]*)\)?$/gi.exec(location) - filenameAndLine = ref[1] - break - } - this.callbacks[id] = callback - v8Util.setHiddenValue(callback, 'callbackId', id) - v8Util.setHiddenValue(callback, 'location', filenameAndLine) - return id - } - - get (id) { - return this.callbacks[id] || function () {} - } - - apply (id, ...args) { - return this.get(id).apply(global, ...args) - } - - remove (id) { - const callback = this.callbacks[id] - if (callback) { - v8Util.deleteHiddenValue(callback, 'callbackId') - delete this.callbacks[id] - } - } -} - -module.exports = CallbacksRegistry diff --git a/electronasar/stable/renderer/chrome-api.js b/electronasar/stable/renderer/chrome-api.js deleted file mode 100644 index 361c735..0000000 --- a/electronasar/stable/renderer/chrome-api.js +++ /dev/null @@ -1,190 +0,0 @@ -'use strict' - -const ipcRenderer = require('@electron/internal/renderer/ipc-renderer-internal') -const Event = require('@electron/internal/renderer/extensions/event') -const url = require('url') - -class Tab { - constructor (tabId) { - this.id = tabId - } -} - -class MessageSender { - constructor (tabId, extensionId) { - this.tab = tabId ? new Tab(tabId) : null - this.id = extensionId - this.url = `chrome-extension://${extensionId}` - } -} - -class Port { - constructor (tabId, portId, extensionId, name) { - this.tabId = tabId - this.portId = portId - this.disconnected = false - - this.name = name - this.onDisconnect = new Event() - this.onMessage = new Event() - this.sender = new MessageSender(tabId, extensionId) - - ipcRenderer.once(`CHROME_PORT_DISCONNECT_${portId}`, () => { - this._onDisconnect() - }) - ipcRenderer.on(`CHROME_PORT_POSTMESSAGE_${portId}`, (event, message) => { - const sendResponse = function () { console.error('sendResponse is not implemented') } - this.onMessage.emit(message, this.sender, sendResponse) - }) - } - - disconnect () { - if (this.disconnected) return - - ipcRenderer.sendToAll(this.tabId, `CHROME_PORT_DISCONNECT_${this.portId}`) - this._onDisconnect() - } - - postMessage (message) { - ipcRenderer.sendToAll(this.tabId, `CHROME_PORT_POSTMESSAGE_${this.portId}`, message) - } - - _onDisconnect () { - this.disconnected = true - ipcRenderer.removeAllListeners(`CHROME_PORT_POSTMESSAGE_${this.portId}`) - this.onDisconnect.emit() - } -} - -// Inject chrome API to the |context| -exports.injectTo = function (extensionId, isBackgroundPage, context) { - const chrome = context.chrome = context.chrome || {} - let originResultID = 1 - - ipcRenderer.on(`CHROME_RUNTIME_ONCONNECT_${extensionId}`, (event, tabId, portId, connectInfo) => { - chrome.runtime.onConnect.emit(new Port(tabId, portId, extensionId, connectInfo.name)) - }) - - ipcRenderer.on(`CHROME_RUNTIME_ONMESSAGE_${extensionId}`, (event, tabId, message, resultID) => { - chrome.runtime.onMessage.emit(message, new MessageSender(tabId, extensionId), (messageResult) => { - ipcRenderer.send(`CHROME_RUNTIME_ONMESSAGE_RESULT_${resultID}`, messageResult) - }) - }) - - ipcRenderer.on('CHROME_TABS_ONCREATED', (event, tabId) => { - chrome.tabs.onCreated.emit(new Tab(tabId)) - }) - - ipcRenderer.on('CHROME_TABS_ONREMOVED', (event, tabId) => { - chrome.tabs.onRemoved.emit(tabId) - }) - - chrome.runtime = { - id: extensionId, - - getURL: function (path) { - return url.format({ - protocol: 'chrome-extension', - slashes: true, - hostname: extensionId, - pathname: path - }) - }, - - connect (...args) { - if (isBackgroundPage) { - console.error('chrome.runtime.connect is not supported in background page') - return - } - - // Parse the optional args. - let targetExtensionId = extensionId - let connectInfo = { name: '' } - if (args.length === 1) { - connectInfo = args[0] - } else if (args.length === 2) { - [targetExtensionId, connectInfo] = args - } - - const { tabId, portId } = ipcRenderer.sendSync('CHROME_RUNTIME_CONNECT', targetExtensionId, connectInfo) - return new Port(tabId, portId, extensionId, connectInfo.name) - }, - - sendMessage (...args) { - if (isBackgroundPage) { - console.error('chrome.runtime.sendMessage is not supported in background page') - return - } - - // Parse the optional args. - let targetExtensionId = extensionId - let message - if (args.length === 1) { - message = args[0] - } else if (args.length === 2) { - // A case of not provide extension-id: (message, responseCallback) - if (typeof args[1] === 'function') { - ipcRenderer.on(`CHROME_RUNTIME_SENDMESSAGE_RESULT_${originResultID}`, (event, result) => args[1](result)) - message = args[0] - } else { - [targetExtensionId, message] = args - } - } else { - console.error('options is not supported') - ipcRenderer.on(`CHROME_RUNTIME_SENDMESSAGE_RESULT_${originResultID}`, (event, result) => args[2](result)) - } - - ipcRenderer.send('CHROME_RUNTIME_SENDMESSAGE', targetExtensionId, message, originResultID) - originResultID++ - }, - - onConnect: new Event(), - onMessage: new Event(), - onInstalled: new Event() - } - - chrome.tabs = { - executeScript (tabId, details, resultCallback) { - if (resultCallback) { - ipcRenderer.once(`CHROME_TABS_EXECUTESCRIPT_RESULT_${originResultID}`, (event, result) => resultCallback([result])) - } - ipcRenderer.send('CHROME_TABS_EXECUTESCRIPT', originResultID, tabId, extensionId, details) - originResultID++ - }, - - sendMessage (tabId, message, options, responseCallback) { - if (responseCallback) { - ipcRenderer.on(`CHROME_TABS_SEND_MESSAGE_RESULT_${originResultID}`, (event, result) => responseCallback(result)) - } - ipcRenderer.send('CHROME_TABS_SEND_MESSAGE', tabId, extensionId, isBackgroundPage, message, originResultID) - originResultID++ - }, - - onUpdated: new Event(), - onCreated: new Event(), - onRemoved: new Event() - } - - chrome.extension = { - getURL: chrome.runtime.getURL, - connect: chrome.runtime.connect, - onConnect: chrome.runtime.onConnect, - sendMessage: chrome.runtime.sendMessage, - onMessage: chrome.runtime.onMessage - } - - chrome.storage = require('@electron/internal/renderer/extensions/storage').setup(extensionId) - - chrome.pageAction = { - show () {}, - hide () {}, - setTitle () {}, - getTitle () {}, - setIcon () {}, - setPopup () {}, - getPopup () {} - } - - chrome.i18n = require('@electron/internal/renderer/extensions/i18n').setup(extensionId) - chrome.webNavigation = require('@electron/internal/renderer/extensions/web-navigation').setup() -} diff --git a/electronasar/stable/renderer/content-scripts-injector.js b/electronasar/stable/renderer/content-scripts-injector.js deleted file mode 100644 index 5091d84..0000000 --- a/electronasar/stable/renderer/content-scripts-injector.js +++ /dev/null @@ -1,101 +0,0 @@ -'use strict' - -const ipcRenderer = require('@electron/internal/renderer/ipc-renderer-internal') -const { runInThisContext } = require('vm') - -// Check whether pattern matches. -// https://developer.chrome.com/extensions/match_patterns -const matchesPattern = function (pattern) { - if (pattern === '<all_urls>') return true - const regexp = new RegExp(`^${pattern.replace(/\*/g, '.*')}$`) - const url = `${location.protocol}//${location.host}${location.pathname}` - return url.match(regexp) -} - -// Run the code with chrome API integrated. -const runContentScript = function (extensionId, url, code) { - const context = {} - require('@electron/internal/renderer/chrome-api').injectTo(extensionId, false, context) - const wrapper = `((chrome) => {\n ${code}\n })` - const compiledWrapper = runInThisContext(wrapper, { - filename: url, - lineOffset: 1, - displayErrors: true - }) - return compiledWrapper.call(this, context.chrome) -} - -const runAllContentScript = function (scripts, extensionId) { - for (const { url, code } of scripts) { - runContentScript.call(window, extensionId, url, code) - } -} - -const runStylesheet = function (url, code) { - const wrapper = `((code) => { - function init() { - const styleElement = document.createElement('style'); - styleElement.textContent = code; - document.head.append(styleElement); - } - document.addEventListener('DOMContentLoaded', init); - })` - const compiledWrapper = runInThisContext(wrapper, { - filename: url, - lineOffset: 1, - displayErrors: true - }) - return compiledWrapper.call(this, code) -} - -const runAllStylesheet = function (css) { - for (const { url, code } of css) { - runStylesheet.call(window, url, code) - } -} - -// Run injected scripts. -// https://developer.chrome.com/extensions/content_scripts -const injectContentScript = function (extensionId, script) { - if (!script.matches.some(matchesPattern)) return - - if (script.js) { - const fire = runAllContentScript.bind(window, script.js, extensionId) - if (script.runAt === 'document_start') { - process.once('document-start', fire) - } else if (script.runAt === 'document_end') { - process.once('document-end', fire) - } else { - document.addEventListener('DOMContentLoaded', fire) - } - } - - if (script.css) { - const fire = runAllStylesheet.bind(window, script.css) - if (script.runAt === 'document_start') { - process.once('document-start', fire) - } else if (script.runAt === 'document_end') { - process.once('document-end', fire) - } else { - document.addEventListener('DOMContentLoaded', fire) - } - } -} - -// Handle the request of chrome.tabs.executeJavaScript. -ipcRenderer.on('CHROME_TABS_EXECUTESCRIPT', function (event, senderWebContentsId, requestId, extensionId, url, code) { - const result = runContentScript.call(window, extensionId, url, code) - ipcRenderer.sendToAll(senderWebContentsId, `CHROME_TABS_EXECUTESCRIPT_RESULT_${requestId}`, result) -}) - -// Read the renderer process preferences. -const preferences = process.getRenderProcessPreferences() -if (preferences) { - for (const pref of preferences) { - if (pref.contentScripts) { - for (const script of pref.contentScripts) { - injectContentScript(pref.extensionId, script) - } - } - } -} diff --git a/electronasar/stable/renderer/extensions/event.js b/electronasar/stable/renderer/extensions/event.js deleted file mode 100644 index 93f5ad2..0000000 --- a/electronasar/stable/renderer/extensions/event.js +++ /dev/null @@ -1,26 +0,0 @@ -'use strict' - -class Event { - constructor () { - this.listeners = [] - } - - addListener (callback) { - this.listeners.push(callback) - } - - removeListener (callback) { - const index = this.listeners.indexOf(callback) - if (index !== -1) { - this.listeners.splice(index, 1) - } - } - - emit (...args) { - for (const listener of this.listeners) { - listener(...args) - } - } -} - -module.exports = Event diff --git a/electronasar/stable/renderer/extensions/i18n.js b/electronasar/stable/renderer/extensions/i18n.js deleted file mode 100644 index 661b264..0000000 --- a/electronasar/stable/renderer/extensions/i18n.js +++ /dev/null @@ -1,88 +0,0 @@ -'use strict' - -// Implementation of chrome.i18n.getMessage -// https://developer.chrome.com/extensions/i18n#method-getMessage -// -// Does not implement predefined messages: -// https://developer.chrome.com/extensions/i18n#overview-predefined - -const ipcRenderer = require('@electron/internal/renderer/ipc-renderer-internal') -const fs = require('fs') -const path = require('path') - -let metadata - -const getExtensionMetadata = (extensionId) => { - if (!metadata) { - metadata = ipcRenderer.sendSync('CHROME_I18N_MANIFEST', extensionId) - } - return metadata -} - -const getMessagesPath = (extensionId, language) => { - const metadata = getExtensionMetadata(extensionId) - const localesDirectory = path.join(metadata.srcDirectory, '_locales') - try { - const filename = path.join(localesDirectory, language, 'messages.json') - fs.accessSync(filename, fs.constants.R_OK) - return filename - } catch (err) { - const defaultLocale = metadata.default_locale || 'en' - return path.join(localesDirectory, defaultLocale, 'messages.json') - } -} - -const getMessages = (extensionId, language) => { - try { - const messagesPath = getMessagesPath(extensionId, language) - return JSON.parse(fs.readFileSync(messagesPath)) || {} - } catch (error) { - return {} - } -} - -const getLanguage = () => { - return navigator.language.replace(/-.*$/, '').toLowerCase() -} - -const replaceNumberedSubstitutions = (message, substitutions) => { - return message.replace(/\$(\d+)/, (_, number) => { - const index = parseInt(number, 10) - 1 - return substitutions[index] || '' - }) -} - -const replacePlaceholders = (message, placeholders, substitutions) => { - if (typeof substitutions === 'string') { - substitutions = [substitutions] - } - if (!Array.isArray(substitutions)) { - substitutions = [] - } - - if (placeholders) { - Object.keys(placeholders).forEach((name) => { - let { content } = placeholders[name] - content = replaceNumberedSubstitutions(content, substitutions) - message = message.replace(new RegExp(`\\$${name}\\$`, 'gi'), content) - }) - } - - return replaceNumberedSubstitutions(message, substitutions) -} - -const getMessage = (extensionId, messageName, substitutions) => { - const messages = getMessages(extensionId, getLanguage()) - if (messages.hasOwnProperty(messageName)) { - const { message, placeholders } = messages[messageName] - return replacePlaceholders(message, placeholders, substitutions) - } -} - -exports.setup = (extensionId) => { - return { - getMessage (messageName, substitutions) { - return getMessage(extensionId, messageName, substitutions) - } - } -} diff --git a/electronasar/stable/renderer/extensions/storage.js b/electronasar/stable/renderer/extensions/storage.js deleted file mode 100644 index 8afaac7..0000000 --- a/electronasar/stable/renderer/extensions/storage.js +++ /dev/null @@ -1,138 +0,0 @@ -'use strict' - -const fs = require('fs') -const path = require('path') -const { remote } = require('electron') -const { app } = remote - -const getChromeStoragePath = (storageType, extensionId) => { - return path.join( - app.getPath('userData'), `/Chrome Storage/${extensionId}-${storageType}.json`) -} - -const mkdirp = (dir, callback) => { - fs.mkdir(dir, (error) => { - if (error && error.code === 'ENOENT') { - mkdirp(path.dirname(dir), (error) => { - if (!error) { - mkdirp(dir, callback) - } - }) - } else if (error && error.code === 'EEXIST') { - callback(null) - } else { - callback(error) - } - }) -} - -const readChromeStorageFile = (storageType, extensionId, cb) => { - const filePath = getChromeStoragePath(storageType, extensionId) - fs.readFile(filePath, 'utf8', (err, data) => { - if (err && err.code === 'ENOENT') { - return cb(null, null) - } - cb(err, data) - }) -} - -const writeChromeStorageFile = (storageType, extensionId, data, cb) => { - const filePath = getChromeStoragePath(storageType, extensionId) - - mkdirp(path.dirname(filePath), err => { - if (err) { /* we just ignore the errors of mkdir or mkdirp */ } - fs.writeFile(filePath, data, cb) - }) -} - -const getStorage = (storageType, extensionId, cb) => { - readChromeStorageFile(storageType, extensionId, (err, data) => { - if (err) throw err - if (!cb) throw new TypeError('No callback provided') - - if (data !== null) { - cb(JSON.parse(data)) - } else { - // Disabled due to false positive in StandardJS - // eslint-disable-next-line standard/no-callback-literal - cb({}) - } - }) -} - -const setStorage = (storageType, extensionId, storage, cb) => { - const json = JSON.stringify(storage) - writeChromeStorageFile(storageType, extensionId, json, err => { - if (err) throw err - if (cb) cb() - }) -} - -const getStorageManager = (storageType, extensionId) => { - return { - get (keys, callback) { - getStorage(storageType, extensionId, storage => { - if (keys == null) return callback(storage) - - let defaults = {} - switch (typeof keys) { - case 'string': - keys = [keys] - break - case 'object': - if (!Array.isArray(keys)) { - defaults = keys - keys = Object.keys(keys) - } - break - } - - // Disabled due to false positive in StandardJS - // eslint-disable-next-line standard/no-callback-literal - if (keys.length === 0) return callback({}) - - const items = {} - keys.forEach(function (key) { - let value = storage[key] - if (value == null) value = defaults[key] - items[key] = value - }) - callback(items) - }) - }, - - set (items, callback) { - getStorage(storageType, extensionId, storage => { - Object.keys(items).forEach(function (name) { - storage[name] = items[name] - }) - - setStorage(storageType, extensionId, storage, callback) - }) - }, - - remove (keys, callback) { - getStorage(storageType, extensionId, storage => { - if (!Array.isArray(keys)) { - keys = [keys] - } - keys.forEach(function (key) { - delete storage[key] - }) - - setStorage(storageType, extensionId, storage, callback) - }) - }, - - clear (callback) { - setStorage(storageType, extensionId, {}, callback) - } - } -} - -module.exports = { - setup: extensionId => ({ - sync: getStorageManager('sync', extensionId), - local: getStorageManager('local', extensionId) - }) -} diff --git a/electronasar/stable/renderer/extensions/web-navigation.js b/electronasar/stable/renderer/extensions/web-navigation.js deleted file mode 100644 index 9c3f3f0..0000000 --- a/electronasar/stable/renderer/extensions/web-navigation.js +++ /dev/null @@ -1,23 +0,0 @@ -'use strict' - -const Event = require('@electron/internal/renderer/extensions/event') -const ipcRenderer = require('@electron/internal/renderer/ipc-renderer-internal') - -class WebNavigation { - constructor () { - this.onBeforeNavigate = new Event() - this.onCompleted = new Event() - - ipcRenderer.on('CHROME_WEBNAVIGATION_ONBEFORENAVIGATE', (event, details) => { - this.onBeforeNavigate.emit(details) - }) - - ipcRenderer.on('CHROME_WEBNAVIGATION_ONCOMPLETED', (event, details) => { - this.onCompleted.emit(details) - }) - } -} - -exports.setup = () => { - return new WebNavigation() -} diff --git a/electronasar/stable/renderer/init.js b/electronasar/stable/renderer/init.js deleted file mode 100644 index cf1af5b..0000000 --- a/electronasar/stable/renderer/init.js +++ /dev/null @@ -1,176 +0,0 @@ -'use strict' - -const { EventEmitter } = require('events') -const path = require('path') -const Module = require('module') - -// We modified the original process.argv to let node.js load the -// init.js, we need to restore it here. -process.argv.splice(1, 1) - -// Clear search paths. -require('../common/reset-search-paths') - -// Import common settings. -require('@electron/internal/common/init') - -const globalPaths = Module.globalPaths - -// Expose public APIs. -globalPaths.push(path.join(__dirname, 'api', 'exports')) - -// The global variable will be used by ipc for event dispatching -const v8Util = process.atomBinding('v8_util') - -v8Util.setHiddenValue(global, 'ipc', new EventEmitter()) -v8Util.setHiddenValue(global, 'ipc-internal', new EventEmitter()) - -// Use electron module after everything is ready. -const ipcRenderer = require('@electron/internal/renderer/ipc-renderer-internal') - -require('@electron/internal/renderer/web-frame-init')() - -// Process command line arguments. -let nodeIntegration = false -let webviewTag = false -let preloadScript = null -let preloadScripts = [] -let isBackgroundPage = false -let appPath = null -for (const arg of process.argv) { - if (arg.indexOf('--guest-instance-id=') === 0) { - // This is a guest web view. - process.guestInstanceId = parseInt(arg.substr(arg.indexOf('=') + 1)) - } else if (arg.indexOf('--opener-id=') === 0) { - // This is a guest BrowserWindow. - process.openerId = parseInt(arg.substr(arg.indexOf('=') + 1)) - } else if (arg.indexOf('--node-integration=') === 0) { - nodeIntegration = arg.substr(arg.indexOf('=') + 1) === 'true' - } else if (arg.indexOf('--preload=') === 0) { - preloadScript = arg.substr(arg.indexOf('=') + 1) - } else if (arg === '--background-page') { - isBackgroundPage = true - } else if (arg.indexOf('--app-path=') === 0) { - appPath = arg.substr(arg.indexOf('=') + 1) - } else if (arg.indexOf('--webview-tag=') === 0) { - webviewTag = arg.substr(arg.indexOf('=') + 1) === 'true' - } else if (arg.indexOf('--preload-scripts') === 0) { - preloadScripts = arg.substr(arg.indexOf('=') + 1).split(path.delimiter) - } -} - -// The webContents preload script is loaded after the session preload scripts. -if (preloadScript) { - preloadScripts.push(preloadScript) -} - -if (window.location.protocol === 'chrome-devtools:') { - // Override some inspector APIs. - require('@electron/internal/renderer/inspector') - nodeIntegration = false -} else if (window.location.protocol === 'chrome-extension:') { - // Add implementations of chrome API. - require('@electron/internal/renderer/chrome-api').injectTo(window.location.hostname, isBackgroundPage, window) - nodeIntegration = false -} else if (window.location.protocol === 'chrome:') { - // Disable node integration for chrome UI scheme. - nodeIntegration = false -} else { - // Override default web functions. - require('@electron/internal/renderer/override') - - // Inject content scripts. - require('@electron/internal/renderer/content-scripts-injector') - - // Load webview tag implementation. - if (webviewTag && process.guestInstanceId == null) { - const { setupWebView } = require('@electron/internal/renderer/web-view/web-view') - if (process.argv.includes('--context-isolation')) { - v8Util.setHiddenValue(window, 'setup-webview', setupWebView) - } else { - setupWebView(window) - } - } -} - -if (nodeIntegration) { - // Export node bindings to global. - global.require = require - global.module = module - - // Set the __filename to the path of html file if it is file: protocol. - if (window.location.protocol === 'file:') { - const location = window.location - let pathname = location.pathname - - if (process.platform === 'win32') { - if (pathname[0] === '/') pathname = pathname.substr(1) - - const isWindowsNetworkSharePath = location.hostname.length > 0 && globalPaths[0].startsWith('\\') - if (isWindowsNetworkSharePath) { - pathname = `//${location.host}/${pathname}` - } - } - - global.__filename = path.normalize(decodeURIComponent(pathname)) - global.__dirname = path.dirname(global.__filename) - - // Set module's filename so relative require can work as expected. - module.filename = global.__filename - - // Also search for module under the html file. - module.paths = module.paths.concat(Module._nodeModulePaths(global.__dirname)) - } else { - global.__filename = __filename - global.__dirname = __dirname - - if (appPath) { - // Search for module under the app directory - module.paths = module.paths.concat(Module._nodeModulePaths(appPath)) - } - } - - // Redirect window.onerror to uncaughtException. - window.onerror = function (message, filename, lineno, colno, error) { - if (global.process.listeners('uncaughtException').length > 0) { - global.process.emit('uncaughtException', error) - return true - } else { - return false - } - } -} else { - // Delete Node's symbols after the Environment has been loaded. - process.once('loaded', function () { - delete global.process - delete global.Buffer - delete global.setImmediate - delete global.clearImmediate - delete global.global - }) -} - -// Load the preload scripts. -for (const preloadScript of preloadScripts) { - try { - require(preloadScript) - } catch (error) { - console.error('Unable to load preload script: ' + preloadScript) - console.error(error.stack || error.message) - } -} - -// Warn about security issues -require('@electron/internal/renderer/security-warnings')(nodeIntegration) - -// Report focus/blur events of webview to browser. -// Note that while Chromium content APIs have observer for focus/blur, they -// unfortunately do not work for webview. -if (process.guestInstanceId) { - window.addEventListener('focus', () => { - ipcRenderer.send('ELECTRON_GUEST_VIEW_MANAGER_FOCUS_CHANGE', true, process.guestInstanceId) - }) - window.addEventListener('blur', () => { - ipcRenderer.send('ELECTRON_GUEST_VIEW_MANAGER_FOCUS_CHANGE', false, process.guestInstanceId) - }) -} diff --git a/electronasar/stable/renderer/inspector.js b/electronasar/stable/renderer/inspector.js deleted file mode 100644 index b358fa6..0000000 --- a/electronasar/stable/renderer/inspector.js +++ /dev/null @@ -1,138 +0,0 @@ -'use strict' - -window.onload = function () { - // Use menu API to show context menu. - window.InspectorFrontendHost.showContextMenuAtPoint = createMenu - - // correct for Chromium returning undefined for filesystem - window.Persistence.FileSystemWorkspaceBinding.completeURL = completeURL - - // Use dialog API to override file chooser dialog. - window.UI.createFileSelectorElement = createFileSelectorElement -} - -// Extra / is needed as a result of MacOS requiring absolute paths -function completeURL (project, path) { - project = 'file:///' - return `${project}${path}` -} - -window.confirm = function (message, title) { - const { dialog } = require('electron').remote - if (title == null) { - title = '' - } - return !dialog.showMessageBox({ - message: message, - title: title, - buttons: ['OK', 'Cancel'], - cancelId: 1 - }) -} - -const convertToMenuTemplate = function (items) { - return items.map(function (item) { - const transformed = item.type === 'subMenu' ? { - type: 'submenu', - label: item.label, - enabled: item.enabled, - submenu: convertToMenuTemplate(item.subItems) - } : item.type === 'separator' ? { - type: 'separator' - } : item.type === 'checkbox' ? { - type: 'checkbox', - label: item.label, - enabled: item.enabled, - checked: item.checked - } : { - type: 'normal', - label: item.label, - enabled: item.enabled - } - - if (item.id != null) { - transformed.click = function () { - window.DevToolsAPI.contextMenuItemSelected(item.id) - return window.DevToolsAPI.contextMenuCleared() - } - } - - return transformed - }) -} - -const createMenu = function (x, y, items) { - const { remote } = require('electron') - const { Menu } = remote - - let template = convertToMenuTemplate(items) - if (useEditMenuItems(x, y, template)) { - template = getEditMenuItems() - } - const menu = Menu.buildFromTemplate(template) - - // The menu is expected to show asynchronously. - setTimeout(function () { - menu.popup({ window: remote.getCurrentWindow() }) - }) -} - -const useEditMenuItems = function (x, y, items) { - return items.length === 0 && document.elementsFromPoint(x, y).some(function (element) { - return element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA' || element.isContentEditable - }) -} - -const getEditMenuItems = function () { - return [ - { - role: 'undo' - }, - { - role: 'redo' - }, - { - type: 'separator' - }, - { - role: 'cut' - }, - { - role: 'copy' - }, - { - role: 'paste' - }, - { - role: 'pasteAndMatchStyle' - }, - { - role: 'delete' - }, - { - role: 'selectAll' - } - ] -} - -const showFileChooserDialog = function (callback) { - const { dialog } = require('electron').remote - const files = dialog.showOpenDialog({}) - if (files != null) { - callback(pathToHtml5FileObject(files[0])) - } -} - -const pathToHtml5FileObject = function (path) { - const fs = require('fs') - const blob = new Blob([fs.readFileSync(path)]) - blob.name = path - return blob -} - -const createFileSelectorElement = function (callback) { - const fileSelectorElement = document.createElement('span') - fileSelectorElement.style.display = 'none' - fileSelectorElement.click = showFileChooserDialog.bind(this, callback) - return fileSelectorElement -} diff --git a/electronasar/stable/renderer/ipc-renderer-internal.js b/electronasar/stable/renderer/ipc-renderer-internal.js deleted file mode 100644 index a8dda32..0000000 --- a/electronasar/stable/renderer/ipc-renderer-internal.js +++ /dev/null @@ -1,26 +0,0 @@ -'use strict' - -const binding = process.atomBinding('ipc') -const v8Util = process.atomBinding('v8_util') - -// Created by init.js. -const ipcRenderer = v8Util.getHiddenValue(global, 'ipc-internal') -const internal = true - -ipcRenderer.send = function (...args) { - return binding.send('ipc-internal-message', args) -} - -ipcRenderer.sendSync = function (...args) { - return binding.sendSync('ipc-internal-message-sync', args)[0] -} - -ipcRenderer.sendTo = function (webContentsId, channel, ...args) { - return binding.sendTo(internal, false, webContentsId, channel, args) -} - -ipcRenderer.sendToAll = function (webContentsId, channel, ...args) { - return binding.sendTo(internal, true, webContentsId, channel, args) -} - -module.exports = ipcRenderer diff --git a/electronasar/stable/renderer/override.js b/electronasar/stable/renderer/override.js deleted file mode 100644 index 72a4a5a..0000000 --- a/electronasar/stable/renderer/override.js +++ /dev/null @@ -1,18 +0,0 @@ -'use strict' - -const ipcRenderer = require('@electron/internal/renderer/ipc-renderer-internal') - -const v8Util = process.atomBinding('v8_util') - -const { guestInstanceId, openerId } = process -const hiddenPage = process.argv.includes('--hidden-page') -const usesNativeWindowOpen = process.argv.includes('--native-window-open') -const contextIsolation = process.argv.includes('--context-isolation') - -// Pass the arguments to isolatedWorld. -if (contextIsolation) { - const isolatedWorldArgs = { ipcRenderer, guestInstanceId, hiddenPage, openerId, usesNativeWindowOpen } - v8Util.setHiddenValue(global, 'isolated-world-args', isolatedWorldArgs) -} - -require('@electron/internal/renderer/window-setup')(ipcRenderer, guestInstanceId, openerId, hiddenPage, usesNativeWindowOpen) diff --git a/electronasar/stable/renderer/remote.js b/electronasar/stable/renderer/remote.js deleted file mode 100644 index b807723..0000000 --- a/electronasar/stable/renderer/remote.js +++ /dev/null @@ -1,10 +0,0 @@ -'use strict' - -const { remote } = require('electron') - -exports.getRemoteForUsage = function (usage) { - if (!remote) { - throw new Error(`${usage} requires remote, which is not enabled`) - } - return remote -} diff --git a/electronasar/stable/renderer/security-warnings.js b/electronasar/stable/renderer/security-warnings.js deleted file mode 100644 index 619f8bb..0000000 --- a/electronasar/stable/renderer/security-warnings.js +++ /dev/null @@ -1,339 +0,0 @@ -'use strict' - -let shouldLog = null - -/** - * This method checks if a security message should be logged. - * It does so by determining whether we're running as Electron, - * which indicates that a developer is currently looking at the - * app. - * - * @returns {boolean} - Should we log? - */ -const shouldLogSecurityWarnings = function () { - if (shouldLog !== null) { - return shouldLog - } - - const { platform, execPath, env } = process - - switch (platform) { - case 'darwin': - shouldLog = execPath.endsWith('MacOS/Electron') || - execPath.includes('Electron.app/Contents/Frameworks/') - break - case 'freebsd': - case 'linux': - shouldLog = execPath.endsWith('/electron') - break - case 'win32': - shouldLog = execPath.endsWith('\\electron.exe') - break - default: - shouldLog = false - } - - if ((env && env.ELECTRON_DISABLE_SECURITY_WARNINGS) || - (window && window.ELECTRON_DISABLE_SECURITY_WARNINGS)) { - shouldLog = false - } - - if ((env && env.ELECTRON_ENABLE_SECURITY_WARNINGS) || - (window && window.ELECTRON_ENABLE_SECURITY_WARNINGS)) { - shouldLog = true - } - - return shouldLog -} - -/** - * Checks if the current window is remote. - * - * @returns {boolean} - Is this a remote protocol? - */ -const getIsRemoteProtocol = function () { - if (window && window.location && window.location.protocol) { - return /^(http|ftp)s?/gi.test(window.location.protocol) - } -} - -/** - * Tries to determine whether a CSP without `unsafe-eval` is set. - * - * @returns {boolean} Is a CSP with `unsafe-eval` set? - */ -const isUnsafeEvalEnabled = function () { - const { webFrame } = require('electron') - - return new Promise((resolve) => { - webFrame.executeJavaScript(`(${(() => { - try { - new Function('') // eslint-disable-line no-new,no-new-func - } catch (err) { - return false - } - return true - }).toString()})()`, resolve) - }) -} - -const moreInformation = `\nFor more information and help, consult -https://electronjs.org/docs/tutorial/security.\n This warning will not show up -once the app is packaged.` - -/** - * #1 Only load secure content - * - * Checks the loaded resources on the current page and logs a - * message about all resources loaded over HTTP or FTP. - */ -const warnAboutInsecureResources = function () { - if (!window || !window.performance || !window.performance.getEntriesByType) { - return - } - - const resources = window.performance - .getEntriesByType('resource') - .filter(({ name }) => /^(http|ftp):/gi.test(name || '')) - .map(({ name }) => `- ${name}`) - .join('\n') - - if (!resources || resources.length === 0) { - return - } - - const warning = `This renderer process loads resources using insecure - protocols.This exposes users of this app to unnecessary security risks. - Consider loading the following resources over HTTPS or FTPS. \n ${resources} - \n ${moreInformation}` - - console.warn('%cElectron Security Warning (Insecure Resources)', - 'font-weight: bold;', warning) -} - -/** - * #2 on the checklist: Disable the Node.js integration in all renderers that - * display remote content - * - * Logs a warning message about Node integration. - */ -const warnAboutNodeWithRemoteContent = function (nodeIntegration) { - if (!nodeIntegration) return - - if (getIsRemoteProtocol()) { - const warning = `This renderer process has Node.js integration enabled - and attempted to load remote content from '${window.location}'. This - exposes users of this app to severe security risks.\n ${moreInformation}` - - console.warn('%cElectron Security Warning (Node.js Integration with Remote Content)', - 'font-weight: bold;', warning) - } -} - -// Currently missing since it has ramifications and is still experimental: -// #3 Enable context isolation in all renderers that display remote content -// -// Currently missing since we can't easily programmatically check for those cases: -// #4 Use ses.setPermissionRequestHandler() in all sessions that load remote content - -/** - * #5 on the checklist: Do not disable websecurity - * - * Logs a warning message about disabled webSecurity. - */ -const warnAboutDisabledWebSecurity = function (webPreferences) { - if (!webPreferences || webPreferences.webSecurity !== false) return - - const warning = `This renderer process has "webSecurity" disabled. This - exposes users of this app to severe security risks.\n ${moreInformation}` - - console.warn('%cElectron Security Warning (Disabled webSecurity)', - 'font-weight: bold;', warning) -} - -/** - * #6 on the checklist: Define a Content-Security-Policy and use restrictive - * rules (i.e. script-src 'self') - * - * #7 on the checklist: Disable eval - * - * Logs a warning message about unset or insecure CSP - */ -const warnAboutInsecureCSP = function () { - isUnsafeEvalEnabled().then((enabled) => { - if (!enabled) return - - const warning = `This renderer process has either no Content Security - Policy set or a policy with "unsafe-eval" enabled. This exposes users of - this app to unnecessary security risks.\n ${moreInformation}` - - console.warn('%cElectron Security Warning (Insecure Content-Security-Policy)', - 'font-weight: bold;', warning) - }) -} - -/** - * #8 on the checklist: Do not set allowRunningInsecureContent to true - * - * Logs a warning message about disabled webSecurity. - */ -const warnAboutInsecureContentAllowed = function (webPreferences) { - if (!webPreferences || !webPreferences.allowRunningInsecureContent) return - - const warning = `This renderer process has "allowRunningInsecureContent" - enabled. This exposes users of this app to severe security risks.\n - ${moreInformation}` - - console.warn('%cElectron Security Warning (allowRunningInsecureContent)', - 'font-weight: bold;', warning) -} - -/** - * #9 on the checklist: Do not enable experimental features - * - * Logs a warning message about experimental features. - */ -const warnAboutExperimentalFeatures = function (webPreferences) { - if (!webPreferences || (!webPreferences.experimentalFeatures)) { - return - } - - const warning = `This renderer process has "experimentalFeatures" enabled. - This exposes users of this app to some security risk. If you do not need - this feature, you should disable it.\n ${moreInformation}` - - console.warn('%cElectron Security Warning (experimentalFeatures)', - 'font-weight: bold;', warning) -} - -/** - * #10 on the checklist: Do not use enableBlinkFeatures - * - * Logs a warning message about enableBlinkFeatures - */ -const warnAboutEnableBlinkFeatures = function (webPreferences) { - if (webPreferences === null || - !webPreferences.hasOwnProperty('enableBlinkFeatures') || - webPreferences.enableBlinkFeatures.length === 0) { - return - } - - const warning = `This renderer process has additional "enableBlinkFeatures" - enabled. This exposes users of this app to some security risk. If you do not - need this feature, you should disable it.\n ${moreInformation}` - - console.warn('%cElectron Security Warning (enableBlinkFeatures)', - 'font-weight: bold;', warning) -} - -/** - * #11 on the checklist: Do Not Use allowpopups - * - * Logs a warning message about allowed popups - */ -const warnAboutAllowedPopups = function () { - if (document && document.querySelectorAll) { - const domElements = document.querySelectorAll('[allowpopups]') - - if (!domElements || domElements.length === 0) { - return - } - - const warning = `A <webview> has "allowpopups" set to true. This exposes - users of this app to some security risk, since popups are just - BrowserWindows. If you do not need this feature, you should disable it.\n - ${moreInformation}` - - console.warn('%cElectron Security Warning (allowpopups)', - 'font-weight: bold;', warning) - } -} - -const warnAboutNodeIntegrationDefault = function (webPreferences) { - if (webPreferences && webPreferences.nodeIntegration && !webPreferences.nodeIntegrationWasExplicitlyEnabled) { - const warning = `This window has node integration enabled by default. In ` + - `Electron 5.0.0, node integration will be disabled by default. To prepare ` + - `for this change, set {nodeIntegration: true} in the webPreferences for ` + - `this window, or ensure that this window does not rely on node integration ` + - `and set {nodeIntegration: false}.` - console.warn('%cElectron Deprecation Warning (nodeIntegration default change)', 'font-weight: bold;', warning) - } -} - -const warnAboutContextIsolationDefault = function (webPreferences) { - if (webPreferences && webPreferences.preload && !webPreferences.contextIsolation && !webPreferences.contextIsolationWasExplicitlyDisabled) { - const url = 'https://electronjs.org/docs/tutorial/security#3-enable-context-isolation-for-remote-content' - const warning = `This window has context isolation disabled by default. In ` + - `Electron 5.0.0, context isolation will be enabled by default. To prepare ` + - `for this change, set {contextIsolation: false} in the webPreferences for ` + - `this window, or ensure that this window does not rely on context ` + - `isolation being disabled, and set {contextIsolation: true}.\n\n` + - `For more information, see ${url}` - console.warn('%cElectron Deprecation Warning (contextIsolation default change)', 'font-weight: bold;', warning) - } -} - -const warnAboutDeprecatedWebviewTagDefault = function (webPreferences) { - if (!webPreferences) { - return - } - if (webPreferences.webviewTagWasExplicitlyEnabled) { - return - } - if (!document || !document.getElementsByTagName) { - return - } - const webviews = document.getElementsByTagName('webview') - if (webviews && webviews.length > 0) { - const url = 'https://github.com/electron/electron/blob/master/docs/api/breaking-changes.md#new-browserwindow-webpreferences-' - const warning = `This window has the <webview> tag enabled by default. In ` + - `Electron 5.0.0, <webview> tags will be disabled by default. To prepare ` + - `for this change, set {webviewTag: true} in the webPreferences for ` + - `this window.\n\n` + - `For more information, see ${url}` - - console.warn('%cElectron Deprecation Warning (webviewTag default change)', - 'font-weight: bold;', warning) - } -} - -// Currently missing since we can't easily programmatically check for it: -// #12WebViews: Verify the options and params of all `<webview>` tags - -const logSecurityWarnings = function (webPreferences, nodeIntegration) { - warnAboutNodeWithRemoteContent(nodeIntegration) - warnAboutDisabledWebSecurity(webPreferences) - warnAboutInsecureResources() - warnAboutInsecureContentAllowed(webPreferences) - warnAboutExperimentalFeatures(webPreferences) - warnAboutEnableBlinkFeatures(webPreferences) - warnAboutInsecureCSP() - warnAboutAllowedPopups() - warnAboutNodeIntegrationDefault(webPreferences) - warnAboutContextIsolationDefault(webPreferences) - warnAboutDeprecatedWebviewTagDefault(webPreferences) -} - -const getWebPreferences = function () { - const ipcRenderer = require('@electron/internal/renderer/ipc-renderer-internal') - const errorUtils = require('@electron/internal/common/error-utils') - - const [ error, result ] = ipcRenderer.sendSync('ELECTRON_BROWSER_GET_LAST_WEB_PREFERENCES') - - if (error) { - console.warn(`getLastWebPreferences() failed: ${errorUtils.deserialize(error)}`) - return null - } else { - return result - } -} - -module.exports = function (nodeIntegration) { - const loadHandler = function () { - if (shouldLogSecurityWarnings()) { - const webPreferences = getWebPreferences() - logSecurityWarnings(webPreferences, nodeIntegration) - } - } - window.addEventListener('load', loadHandler, { once: true }) -} diff --git a/electronasar/stable/renderer/web-frame-init.js b/electronasar/stable/renderer/web-frame-init.js deleted file mode 100644 index f7861db..0000000 --- a/electronasar/stable/renderer/web-frame-init.js +++ /dev/null @@ -1,24 +0,0 @@ -'use strict' - -const { webFrame } = require('electron') -const ipcRenderer = require('@electron/internal/renderer/ipc-renderer-internal') -const errorUtils = require('@electron/internal/common/error-utils') - -module.exports = () => { - // Call webFrame method - ipcRenderer.on('ELECTRON_INTERNAL_RENDERER_WEB_FRAME_METHOD', (event, method, args) => { - webFrame[method](...args) - }) - - ipcRenderer.on('ELECTRON_INTERNAL_RENDERER_ASYNC_WEB_FRAME_METHOD', (event, requestId, method, args) => { - new Promise(resolve => - webFrame[method](...args, resolve) - ).then(result => { - return [null, result] - }, error => { - return [errorUtils.serialize(error)] - }).then(responseArgs => { - event.sender.send(`ELECTRON_INTERNAL_BROWSER_ASYNC_WEB_FRAME_RESPONSE_${requestId}`, ...responseArgs) - }) - }) -} diff --git a/electronasar/stable/renderer/web-view/guest-view-internal.js b/electronasar/stable/renderer/web-view/guest-view-internal.js deleted file mode 100644 index 3d544aa..0000000 --- a/electronasar/stable/renderer/web-view/guest-view-internal.js +++ /dev/null @@ -1,108 +0,0 @@ -'use strict' - -const { webFrame } = require('electron') -const ipcRenderer = require('@electron/internal/renderer/ipc-renderer-internal') - -let requestId = 0 - -const WEB_VIEW_EVENTS = { - 'load-commit': ['url', 'isMainFrame'], - 'did-attach': [], - 'did-finish-load': [], - 'did-fail-load': ['errorCode', 'errorDescription', 'validatedURL', 'isMainFrame', 'frameProcessId', 'frameRoutingId'], - 'did-frame-finish-load': ['isMainFrame', 'frameProcessId', 'frameRoutingId'], - 'did-start-loading': [], - 'did-stop-loading': [], - 'dom-ready': [], - 'console-message': ['level', 'message', 'line', 'sourceId'], - 'context-menu': ['params'], - 'devtools-opened': [], - 'devtools-closed': [], - 'devtools-focused': [], - 'new-window': ['url', 'frameName', 'disposition', 'options'], - 'will-navigate': ['url'], - 'did-start-navigation': ['url', 'isInPlace', 'isMainFrame', 'frameProcessId', 'frameRoutingId'], - 'did-navigate': ['url', 'httpResponseCode', 'httpStatusText'], - 'did-frame-navigate': ['url', 'httpResponseCode', 'httpStatusText', 'isMainFrame', 'frameProcessId', 'frameRoutingId'], - 'did-navigate-in-page': ['url', 'isMainFrame', 'frameProcessId', 'frameRoutingId'], - 'focus-change': ['focus', 'guestInstanceId'], - 'close': [], - 'crashed': [], - 'gpu-crashed': [], - 'plugin-crashed': ['name', 'version'], - 'destroyed': [], - 'page-title-updated': ['title', 'explicitSet'], - 'page-favicon-updated': ['favicons'], - 'enter-html-full-screen': [], - 'leave-html-full-screen': [], - 'media-started-playing': [], - 'media-paused': [], - 'found-in-page': ['result'], - 'did-change-theme-color': ['themeColor'], - 'update-target-url': ['url'] -} - -const DEPRECATED_EVENTS = { - 'page-title-updated': 'page-title-set' -} - -const dispatchEvent = function (webView, eventName, eventKey, ...args) { - if (DEPRECATED_EVENTS[eventName] != null) { - dispatchEvent(webView, DEPRECATED_EVENTS[eventName], eventKey, ...args) - } - const domEvent = new Event(eventName) - WEB_VIEW_EVENTS[eventKey].forEach((prop, index) => { - domEvent[prop] = args[index] - }) - webView.dispatchEvent(domEvent) - if (eventName === 'load-commit') { - webView.onLoadCommit(domEvent) - } else if (eventName === 'focus-change') { - webView.onFocusChange(domEvent) - } -} - -module.exports = { - registerEvents: function (webView, viewInstanceId) { - ipcRenderer.on(`ELECTRON_GUEST_VIEW_INTERNAL_DESTROY_GUEST-${viewInstanceId}`, function () { - webView.guestInstanceId = undefined - webView.reset() - const domEvent = new Event('destroyed') - webView.dispatchEvent(domEvent) - }) - - ipcRenderer.on(`ELECTRON_GUEST_VIEW_INTERNAL_DISPATCH_EVENT-${viewInstanceId}`, function (event, eventName, ...args) { - dispatchEvent(webView, eventName, eventName, ...args) - }) - - ipcRenderer.on(`ELECTRON_GUEST_VIEW_INTERNAL_IPC_MESSAGE-${viewInstanceId}`, function (event, channel, ...args) { - const domEvent = new Event('ipc-message') - domEvent.channel = channel - domEvent.args = args - webView.dispatchEvent(domEvent) - }) - }, - deregisterEvents: function (viewInstanceId) { - ipcRenderer.removeAllListeners(`ELECTRON_GUEST_VIEW_INTERNAL_DESTROY_GUEST-${viewInstanceId}`) - ipcRenderer.removeAllListeners(`ELECTRON_GUEST_VIEW_INTERNAL_DISPATCH_EVENT-${viewInstanceId}`) - ipcRenderer.removeAllListeners(`ELECTRON_GUEST_VIEW_INTERNAL_IPC_MESSAGE-${viewInstanceId}`) - }, - createGuest: function (params, callback) { - requestId++ - ipcRenderer.send('ELECTRON_GUEST_VIEW_MANAGER_CREATE_GUEST', params, requestId) - ipcRenderer.once(`ELECTRON_RESPONSE_${requestId}`, callback) - }, - createGuestSync: function (params) { - return ipcRenderer.sendSync('ELECTRON_GUEST_VIEW_MANAGER_CREATE_GUEST_SYNC', params) - }, - destroyGuest: function (guestInstanceId) { - ipcRenderer.send('ELECTRON_GUEST_VIEW_MANAGER_DESTROY_GUEST', guestInstanceId) - }, - attachGuest: function (elementInstanceId, guestInstanceId, params, contentWindow) { - const embedderFrameId = webFrame.getWebFrameId(contentWindow) - if (embedderFrameId < 0) { // this error should not happen. - throw new Error('Invalid embedder frame') - } - ipcRenderer.send('ELECTRON_GUEST_VIEW_MANAGER_ATTACH_GUEST', embedderFrameId, elementInstanceId, guestInstanceId, params) - } -} diff --git a/electronasar/stable/renderer/web-view/web-view-attributes.js b/electronasar/stable/renderer/web-view/web-view-attributes.js deleted file mode 100644 index 39d986e..0000000 --- a/electronasar/stable/renderer/web-view/web-view-attributes.js +++ /dev/null @@ -1,281 +0,0 @@ -'use strict' - -const ipcRenderer = require('@electron/internal/renderer/ipc-renderer-internal') -const { WebViewImpl } = require('@electron/internal/renderer/web-view/web-view') -const webViewConstants = require('@electron/internal/renderer/web-view/web-view-constants') -const errorUtils = require('@electron/internal/common/error-utils') - -// Helper function to resolve url set in attribute. -const a = document.createElement('a') - -const resolveURL = function (url) { - if (url === '') return '' - a.href = url - return a.href -} - -// Attribute objects. -// Default implementation of a WebView attribute. -class WebViewAttribute { - constructor (name, webViewImpl) { - this.name = name - this.value = webViewImpl.webviewNode[name] || '' - this.webViewImpl = webViewImpl - this.ignoreMutation = false - this.defineProperty() - } - - // Retrieves and returns the attribute's value. - getValue () { - return this.webViewImpl.webviewNode.getAttribute(this.name) || this.value - } - - // Sets the attribute's value. - setValue (value) { - this.webViewImpl.webviewNode.setAttribute(this.name, value || '') - } - - // Changes the attribute's value without triggering its mutation handler. - setValueIgnoreMutation (value) { - this.ignoreMutation = true - this.setValue(value) - this.ignoreMutation = false - } - - // Defines this attribute as a property on the webview node. - defineProperty () { - return Object.defineProperty(this.webViewImpl.webviewNode, this.name, { - get: () => { - return this.getValue() - }, - set: (value) => { - return this.setValue(value) - }, - enumerable: true - }) - } - - // Called when the attribute's value changes. - handleMutation () {} -} - -// An attribute that is treated as a Boolean. -class BooleanAttribute extends WebViewAttribute { - getValue () { - return this.webViewImpl.webviewNode.hasAttribute(this.name) - } - - setValue (value) { - if (value) { - this.webViewImpl.webviewNode.setAttribute(this.name, '') - } else { - this.webViewImpl.webviewNode.removeAttribute(this.name) - } - } -} - -// Attribute representing the state of the storage partition. -class PartitionAttribute extends WebViewAttribute { - constructor (webViewImpl) { - super(webViewConstants.ATTRIBUTE_PARTITION, webViewImpl) - this.validPartitionId = true - } - - handleMutation (oldValue, newValue) { - newValue = newValue || '' - - // The partition cannot change if the webview has already navigated. - if (!this.webViewImpl.beforeFirstNavigation) { - console.error(webViewConstants.ERROR_MSG_ALREADY_NAVIGATED) - this.setValueIgnoreMutation(oldValue) - return - } - if (newValue === 'persist:') { - this.validPartitionId = false - console.error(webViewConstants.ERROR_MSG_INVALID_PARTITION_ATTRIBUTE) - } - } -} - -// Attribute that handles the location and navigation of the webview. -class SrcAttribute extends WebViewAttribute { - constructor (webViewImpl) { - super(webViewConstants.ATTRIBUTE_SRC, webViewImpl) - this.setupMutationObserver() - } - - getValue () { - if (this.webViewImpl.webviewNode.hasAttribute(this.name)) { - return resolveURL(this.webViewImpl.webviewNode.getAttribute(this.name)) - } else { - return this.value - } - } - - setValueIgnoreMutation (value) { - super.setValueIgnoreMutation(value) - - // takeRecords() is needed to clear queued up src mutations. Without it, it - // is possible for this change to get picked up asyncronously by src's - // mutation observer |observer|, and then get handled even though we do not - // want to handle this mutation. - this.observer.takeRecords() - } - - handleMutation (oldValue, newValue) { - // Once we have navigated, we don't allow clearing the src attribute. - // Once <webview> enters a navigated state, it cannot return to a - // placeholder state. - if (!newValue && oldValue) { - // src attribute changes normally initiate a navigation. We suppress - // the next src attribute handler call to avoid reloading the page - // on every guest-initiated navigation. - this.setValueIgnoreMutation(oldValue) - return - } - this.parse() - } - - // The purpose of this mutation observer is to catch assignment to the src - // attribute without any changes to its value. This is useful in the case - // where the webview guest has crashed and navigating to the same address - // spawns off a new process. - setupMutationObserver () { - this.observer = new MutationObserver((mutations) => { - for (const mutation of mutations) { - const { oldValue } = mutation - const newValue = this.getValue() - if (oldValue !== newValue) { - return - } - this.handleMutation(oldValue, newValue) - } - }) - const params = { - attributes: true, - attributeOldValue: true, - attributeFilter: [this.name] - } - this.observer.observe(this.webViewImpl.webviewNode, params) - } - - parse () { - if (!this.webViewImpl.elementAttached || !this.webViewImpl.attributes[webViewConstants.ATTRIBUTE_PARTITION].validPartitionId || !this.getValue()) { - return - } - if (this.webViewImpl.guestInstanceId == null) { - if (this.webViewImpl.beforeFirstNavigation) { - this.webViewImpl.beforeFirstNavigation = false - this.webViewImpl.createGuest() - } - return - } - - // Navigate to |this.src|. - const opts = {} - const httpreferrer = this.webViewImpl.attributes[webViewConstants.ATTRIBUTE_HTTPREFERRER].getValue() - if (httpreferrer) { - opts.httpReferrer = httpreferrer - } - const useragent = this.webViewImpl.attributes[webViewConstants.ATTRIBUTE_USERAGENT].getValue() - if (useragent) { - opts.userAgent = useragent - } - - const guestInstanceId = this.webViewImpl.guestInstanceId - const method = 'loadURL' - const args = [this.getValue(), opts] - - const [error] = ipcRenderer.sendSync('ELECTRON_GUEST_VIEW_MANAGER_SYNC_CALL', guestInstanceId, method, args) - if (error) { - throw errorUtils.deserialize(error) - } - } -} - -// Attribute specifies HTTP referrer. -class HttpReferrerAttribute extends WebViewAttribute { - constructor (webViewImpl) { - super(webViewConstants.ATTRIBUTE_HTTPREFERRER, webViewImpl) - } -} - -// Attribute specifies user agent -class UserAgentAttribute extends WebViewAttribute { - constructor (webViewImpl) { - super(webViewConstants.ATTRIBUTE_USERAGENT, webViewImpl) - } -} - -// Attribute that set preload script. -class PreloadAttribute extends WebViewAttribute { - constructor (webViewImpl) { - super(webViewConstants.ATTRIBUTE_PRELOAD, webViewImpl) - } - - getValue () { - if (!this.webViewImpl.webviewNode.hasAttribute(this.name)) { - return this.value - } - let preload = resolveURL(this.webViewImpl.webviewNode.getAttribute(this.name)) - const protocol = preload.substr(0, 5) - if (protocol !== 'file:') { - console.error(webViewConstants.ERROR_MSG_INVALID_PRELOAD_ATTRIBUTE) - preload = '' - } - return preload - } -} - -// Attribute that specifies the blink features to be enabled. -class BlinkFeaturesAttribute extends WebViewAttribute { - constructor (webViewImpl) { - super(webViewConstants.ATTRIBUTE_BLINKFEATURES, webViewImpl) - } -} - -// Attribute that specifies the blink features to be disabled. -class DisableBlinkFeaturesAttribute extends WebViewAttribute { - constructor (webViewImpl) { - super(webViewConstants.ATTRIBUTE_DISABLEBLINKFEATURES, webViewImpl) - } -} - -// Attribute that specifies the web preferences to be enabled. -class WebPreferencesAttribute extends WebViewAttribute { - constructor (webViewImpl) { - super(webViewConstants.ATTRIBUTE_WEBPREFERENCES, webViewImpl) - } -} - -class EnableRemoteModuleAttribute extends WebViewAttribute { - constructor (webViewImpl) { - super(webViewConstants.ATTRIBUTE_ENABLEREMOTEMODULE, webViewImpl) - } - - getValue () { - return this.webViewImpl.webviewNode.getAttribute(this.name) !== 'false' - } - - setValue (value) { - this.webViewImpl.webviewNode.setAttribute(this.name, value ? 'true' : 'false') - } -} - -// Sets up all of the webview attributes. -WebViewImpl.prototype.setupWebViewAttributes = function () { - this.attributes = {} - this.attributes[webViewConstants.ATTRIBUTE_PARTITION] = new PartitionAttribute(this) - this.attributes[webViewConstants.ATTRIBUTE_SRC] = new SrcAttribute(this) - this.attributes[webViewConstants.ATTRIBUTE_HTTPREFERRER] = new HttpReferrerAttribute(this) - this.attributes[webViewConstants.ATTRIBUTE_USERAGENT] = new UserAgentAttribute(this) - this.attributes[webViewConstants.ATTRIBUTE_NODEINTEGRATION] = new BooleanAttribute(webViewConstants.ATTRIBUTE_NODEINTEGRATION, this) - this.attributes[webViewConstants.ATTRIBUTE_PLUGINS] = new BooleanAttribute(webViewConstants.ATTRIBUTE_PLUGINS, this) - this.attributes[webViewConstants.ATTRIBUTE_DISABLEWEBSECURITY] = new BooleanAttribute(webViewConstants.ATTRIBUTE_DISABLEWEBSECURITY, this) - this.attributes[webViewConstants.ATTRIBUTE_ALLOWPOPUPS] = new BooleanAttribute(webViewConstants.ATTRIBUTE_ALLOWPOPUPS, this) - this.attributes[webViewConstants.ATTRIBUTE_ENABLEREMOTEMODULE] = new EnableRemoteModuleAttribute(this) - this.attributes[webViewConstants.ATTRIBUTE_PRELOAD] = new PreloadAttribute(this) - this.attributes[webViewConstants.ATTRIBUTE_BLINKFEATURES] = new BlinkFeaturesAttribute(this) - this.attributes[webViewConstants.ATTRIBUTE_DISABLEBLINKFEATURES] = new DisableBlinkFeaturesAttribute(this) - this.attributes[webViewConstants.ATTRIBUTE_WEBPREFERENCES] = new WebPreferencesAttribute(this) -} diff --git a/electronasar/stable/renderer/web-view/web-view-constants.js b/electronasar/stable/renderer/web-view/web-view-constants.js deleted file mode 100644 index 459aafa..0000000 --- a/electronasar/stable/renderer/web-view/web-view-constants.js +++ /dev/null @@ -1,28 +0,0 @@ -'use strict' - -module.exports = { - // Attributes. - ATTRIBUTE_NAME: 'name', - ATTRIBUTE_PARTITION: 'partition', - ATTRIBUTE_SRC: 'src', - ATTRIBUTE_HTTPREFERRER: 'httpreferrer', - ATTRIBUTE_NODEINTEGRATION: 'nodeintegration', - ATTRIBUTE_ENABLEREMOTEMODULE: 'enableremotemodule', - ATTRIBUTE_PLUGINS: 'plugins', - ATTRIBUTE_DISABLEWEBSECURITY: 'disablewebsecurity', - ATTRIBUTE_ALLOWPOPUPS: 'allowpopups', - ATTRIBUTE_PRELOAD: 'preload', - ATTRIBUTE_USERAGENT: 'useragent', - ATTRIBUTE_BLINKFEATURES: 'blinkfeatures', - ATTRIBUTE_DISABLEBLINKFEATURES: 'disableblinkfeatures', - ATTRIBUTE_WEBPREFERENCES: 'webpreferences', - - // Internal attribute. - ATTRIBUTE_INTERNALINSTANCEID: 'internalinstanceid', - - // Error messages. - ERROR_MSG_ALREADY_NAVIGATED: 'The object has already navigated, so its partition cannot be changed.', - ERROR_MSG_CANNOT_INJECT_SCRIPT: '<webview>: ' + 'Script cannot be injected into content until the page has loaded.', - ERROR_MSG_INVALID_PARTITION_ATTRIBUTE: 'Invalid partition attribute.', - ERROR_MSG_INVALID_PRELOAD_ATTRIBUTE: 'Only "file:" protocol is supported in "preload" attribute.' -} diff --git a/electronasar/stable/renderer/web-view/web-view.js b/electronasar/stable/renderer/web-view/web-view.js deleted file mode 100644 index 560c728..0000000 --- a/electronasar/stable/renderer/web-view/web-view.js +++ /dev/null @@ -1,346 +0,0 @@ -'use strict' - -const { webFrame } = require('electron') - -const v8Util = process.atomBinding('v8_util') -const ipcRenderer = require('@electron/internal/renderer/ipc-renderer-internal') -const guestViewInternal = require('@electron/internal/renderer/web-view/guest-view-internal') -const webViewConstants = require('@electron/internal/renderer/web-view/web-view-constants') -const errorUtils = require('@electron/internal/common/error-utils') -const { - syncMethods, - asyncCallbackMethods, - asyncPromiseMethods -} = require('@electron/internal/common/web-view-methods') - -// ID generator. -let nextId = 0 - -const getNextId = function () { - return ++nextId -} - -// Represents the internal state of the WebView node. -class WebViewImpl { - constructor (webviewNode) { - this.webviewNode = webviewNode - v8Util.setHiddenValue(this.webviewNode, 'internal', this) - this.elementAttached = false - this.beforeFirstNavigation = true - this.hasFocus = false - - // on* Event handlers. - this.on = {} - - // Create internal iframe element. - this.internalElement = this.createInternalElement() - const shadowRoot = this.webviewNode.attachShadow({ mode: 'open' }) - shadowRoot.innerHTML = '<!DOCTYPE html><style type="text/css">:host { display: flex; }</style>' - this.setupWebViewAttributes() - this.viewInstanceId = getNextId() - shadowRoot.appendChild(this.internalElement) - - // Provide access to contentWindow. - Object.defineProperty(this.webviewNode, 'contentWindow', { - get: () => { - return this.internalElement.contentWindow - }, - enumerable: true - }) - } - - createInternalElement () { - const iframeElement = document.createElement('iframe') - iframeElement.style.flex = '1 1 auto' - iframeElement.style.width = '100%' - iframeElement.style.border = '0' - v8Util.setHiddenValue(iframeElement, 'internal', this) - return iframeElement - } - - // Resets some state upon reattaching <webview> element to the DOM. - reset () { - // If guestInstanceId is defined then the <webview> has navigated and has - // already picked up a partition ID. Thus, we need to reset the initialization - // state. However, it may be the case that beforeFirstNavigation is false BUT - // guestInstanceId has yet to be initialized. This means that we have not - // heard back from createGuest yet. We will not reset the flag in this case so - // that we don't end up allocating a second guest. - if (this.guestInstanceId) { - guestViewInternal.destroyGuest(this.guestInstanceId) - this.guestInstanceId = void 0 - } - - this.beforeFirstNavigation = true - this.attributes[webViewConstants.ATTRIBUTE_PARTITION].validPartitionId = true - - // Since attachment swaps a local frame for a remote frame, we need our - // internal iframe element to be local again before we can reattach. - const newFrame = this.createInternalElement() - const oldFrame = this.internalElement - this.internalElement = newFrame - oldFrame.parentNode.replaceChild(newFrame, oldFrame) - } - - // Sets the <webview>.request property. - setRequestPropertyOnWebViewNode (request) { - Object.defineProperty(this.webviewNode, 'request', { - value: request, - enumerable: true - }) - } - - // This observer monitors mutations to attributes of the <webview> and - // updates the BrowserPlugin properties accordingly. In turn, updating - // a BrowserPlugin property will update the corresponding BrowserPlugin - // attribute, if necessary. See BrowserPlugin::UpdateDOMAttribute for more - // details. - handleWebviewAttributeMutation (attributeName, oldValue, newValue) { - if (!this.attributes[attributeName] || this.attributes[attributeName].ignoreMutation) { - return - } - - // Let the changed attribute handle its own mutation - this.attributes[attributeName].handleMutation(oldValue, newValue) - } - - onElementResize () { - const resizeEvent = new Event('resize') - resizeEvent.newWidth = this.webviewNode.clientWidth - resizeEvent.newHeight = this.webviewNode.clientHeight - this.dispatchEvent(resizeEvent) - } - - createGuest () { - return guestViewInternal.createGuest(this.buildParams(), (event, guestInstanceId) => { - this.attachGuestInstance(guestInstanceId) - }) - } - - createGuestSync () { - this.beforeFirstNavigation = false - this.attachGuestInstance(guestViewInternal.createGuestSync(this.buildParams())) - } - - dispatchEvent (webViewEvent) { - this.webviewNode.dispatchEvent(webViewEvent) - } - - // Adds an 'on<event>' property on the webview, which can be used to set/unset - // an event handler. - setupEventProperty (eventName) { - const propertyName = `on${eventName.toLowerCase()}` - return Object.defineProperty(this.webviewNode, propertyName, { - get: () => { - return this.on[propertyName] - }, - set: (value) => { - if (this.on[propertyName]) { - this.webviewNode.removeEventListener(eventName, this.on[propertyName]) - } - this.on[propertyName] = value - if (value) { - return this.webviewNode.addEventListener(eventName, value) - } - }, - enumerable: true - }) - } - - // Updates state upon loadcommit. - onLoadCommit (webViewEvent) { - const oldValue = this.webviewNode.getAttribute(webViewConstants.ATTRIBUTE_SRC) - const newValue = webViewEvent.url - if (webViewEvent.isMainFrame && (oldValue !== newValue)) { - // Touching the src attribute triggers a navigation. To avoid - // triggering a page reload on every guest-initiated navigation, - // we do not handle this mutation. - this.attributes[webViewConstants.ATTRIBUTE_SRC].setValueIgnoreMutation(newValue) - } - } - - // Emits focus/blur events. - onFocusChange () { - const hasFocus = document.activeElement === this.webviewNode - if (hasFocus !== this.hasFocus) { - this.hasFocus = hasFocus - this.dispatchEvent(new Event(hasFocus ? 'focus' : 'blur')) - } - } - - onAttach (storagePartitionId) { - return this.attributes[webViewConstants.ATTRIBUTE_PARTITION].setValue(storagePartitionId) - } - - buildParams () { - const params = { - instanceId: this.viewInstanceId, - userAgentOverride: this.userAgentOverride - } - for (const attributeName in this.attributes) { - if (this.attributes.hasOwnProperty(attributeName)) { - params[attributeName] = this.attributes[attributeName].getValue() - } - } - return params - } - - attachGuestInstance (guestInstanceId) { - if (!this.elementAttached) { - // The element could be detached before we got response from browser. - return - } - this.internalInstanceId = getNextId() - this.guestInstanceId = guestInstanceId - guestViewInternal.attachGuest(this.internalInstanceId, this.guestInstanceId, this.buildParams(), this.internalElement.contentWindow) - // ResizeObserver is a browser global not recognized by "standard". - /* globals ResizeObserver */ - // TODO(zcbenz): Should we deprecate the "resize" event? Wait, it is not - // even documented. - this.resizeObserver = new ResizeObserver(this.onElementResize.bind(this)).observe(this.internalElement) - } -} - -// Registers <webview> custom element. -const registerWebViewElement = (window) => { - const proto = Object.create(window.HTMLObjectElement.prototype) - proto.createdCallback = function () { - return new WebViewImpl(this) - } - proto.attributeChangedCallback = function (name, oldValue, newValue) { - const internal = v8Util.getHiddenValue(this, 'internal') - if (internal) { - internal.handleWebviewAttributeMutation(name, oldValue, newValue) - } - } - proto.detachedCallback = function () { - const internal = v8Util.getHiddenValue(this, 'internal') - if (!internal) { - return - } - guestViewInternal.deregisterEvents(internal.viewInstanceId) - internal.elementAttached = false - this.internalInstanceId = 0 - internal.reset() - } - proto.attachedCallback = function () { - const internal = v8Util.getHiddenValue(this, 'internal') - if (!internal) { - return - } - if (!internal.elementAttached) { - guestViewInternal.registerEvents(internal, internal.viewInstanceId) - internal.elementAttached = true - internal.attributes[webViewConstants.ATTRIBUTE_SRC].parse() - } - } - - const getGuestInstanceId = function (self) { - const internal = v8Util.getHiddenValue(self, 'internal') - if (!internal.guestInstanceId) { - throw new Error('The WebView must be attached to the DOM and the dom-ready event emitted before this method can be called.') - } - return internal.guestInstanceId - } - - // Forward proto.foo* method calls to WebViewImpl.foo*. - const createBlockHandler = function (method) { - return function (...args) { - const [error, result] = ipcRenderer.sendSync('ELECTRON_GUEST_VIEW_MANAGER_SYNC_CALL', getGuestInstanceId(this), method, args) - if (error) { - throw errorUtils.deserialize(error) - } else { - return result - } - } - } - for (const method of syncMethods) { - proto[method] = createBlockHandler(method) - } - - const createNonBlockHandler = function (method) { - return function (...args) { - const callback = (typeof args[args.length - 1] === 'function') ? args.pop() : null - const requestId = getNextId() - ipcRenderer.once(`ELECTRON_GUEST_VIEW_MANAGER_ASYNC_CALL_RESPONSE_${requestId}`, function (event, error, result) { - if (error == null) { - if (callback) callback(result) - } else { - throw errorUtils.deserialize(error) - } - }) - ipcRenderer.send('ELECTRON_GUEST_VIEW_MANAGER_ASYNC_CALL', requestId, getGuestInstanceId(this), method, args, callback != null) - } - } - - for (const method of asyncCallbackMethods) { - proto[method] = createNonBlockHandler(method) - } - - const createPromiseHandler = function (method) { - return function (...args) { - return new Promise((resolve, reject) => { - const callback = (typeof args[args.length - 1] === 'function') ? args.pop() : null - const requestId = getNextId() - - ipcRenderer.once(`ELECTRON_GUEST_VIEW_MANAGER_ASYNC_CALL_RESPONSE_${requestId}`, function (event, error, result) { - if (error == null) { - if (callback) { - callback(result) - } - resolve(result) - } else { - reject(errorUtils.deserialize(error)) - } - }) - ipcRenderer.send('ELECTRON_GUEST_VIEW_MANAGER_ASYNC_CALL', requestId, getGuestInstanceId(this), method, args, callback != null) - }) - } - } - - for (const method of asyncPromiseMethods) { - proto[method] = createPromiseHandler(method) - } - - // WebContents associated with this webview. - proto.getWebContents = function () { - const { getRemoteForUsage } = require('@electron/internal/renderer/remote') - const remote = getRemoteForUsage('getWebContents()') - const internal = v8Util.getHiddenValue(this, 'internal') - if (!internal.guestInstanceId) { - internal.createGuestSync() - } - return remote.getGuestWebContents(internal.guestInstanceId) - } - - // Focusing the webview should move page focus to the underlying iframe. - proto.focus = function () { - this.contentWindow.focus() - } - - window.WebView = webFrame.registerEmbedderCustomElement(window, 'webview', { - prototype: proto - }) - - // Delete the callbacks so developers cannot call them and produce unexpected - // behavior. - delete proto.createdCallback - delete proto.attachedCallback - delete proto.detachedCallback - delete proto.attributeChangedCallback -} - -const setupWebView = (window) => { - require('@electron/internal/renderer/web-view/web-view-attributes') - - const useCapture = true - window.addEventListener('readystatechange', function listener (event) { - if (document.readyState === 'loading') { - return - } - registerWebViewElement(window) - window.removeEventListener(event.type, listener, useCapture) - }, useCapture) -} - -module.exports = { setupWebView, WebViewImpl } diff --git a/electronasar/stable/renderer/window-setup.js b/electronasar/stable/renderer/window-setup.js deleted file mode 100644 index 703b82f..0000000 --- a/electronasar/stable/renderer/window-setup.js +++ /dev/null @@ -1,192 +0,0 @@ -'use strict' - -// This file should have no requires since it is used by the isolated context -// preload bundle. Instead arguments should be passed in for everything it -// needs. - -// This file implements the following APIs: -// - window.alert() -// - window.confirm() -// - window.history.back() -// - window.history.forward() -// - window.history.go() -// - window.history.length -// - window.open() -// - window.opener.blur() -// - window.opener.close() -// - window.opener.eval() -// - window.opener.focus() -// - window.opener.location -// - window.opener.print() -// - window.opener.postMessage() -// - window.prompt() -// - document.hidden -// - document.visibilityState - -const { defineProperty } = Object - -// Helper function to resolve relative url. -const a = window.top.document.createElement('a') -const resolveURL = function (url) { - a.href = url - return a.href -} - -// Use this method to ensure values expected as strings in the main process -// are convertible to strings in the renderer process. This ensures exceptions -// converting values to strings are thrown in this process. -const toString = (value) => { - return value != null ? `${value}` : value -} - -const windowProxies = {} - -const getOrCreateProxy = (ipcRenderer, guestId) => { - let proxy = windowProxies[guestId] - if (proxy == null) { - proxy = new BrowserWindowProxy(ipcRenderer, guestId) - windowProxies[guestId] = proxy - } - return proxy -} - -const removeProxy = (guestId) => { - delete windowProxies[guestId] -} - -function BrowserWindowProxy (ipcRenderer, guestId) { - this.closed = false - - defineProperty(this, 'location', { - get: function () { - return ipcRenderer.sendSync('ELECTRON_GUEST_WINDOW_MANAGER_WEB_CONTENTS_METHOD_SYNC', guestId, 'getURL') - }, - set: function (url) { - url = resolveURL(url) - return ipcRenderer.sendSync('ELECTRON_GUEST_WINDOW_MANAGER_WEB_CONTENTS_METHOD_SYNC', guestId, 'loadURL', url) - } - }) - - ipcRenderer.once(`ELECTRON_GUEST_WINDOW_MANAGER_WINDOW_CLOSED_${guestId}`, () => { - removeProxy(guestId) - this.closed = true - }) - - this.close = () => { - ipcRenderer.send('ELECTRON_GUEST_WINDOW_MANAGER_WINDOW_CLOSE', guestId) - } - - this.focus = () => { - ipcRenderer.send('ELECTRON_GUEST_WINDOW_MANAGER_WINDOW_METHOD', guestId, 'focus') - } - - this.blur = () => { - ipcRenderer.send('ELECTRON_GUEST_WINDOW_MANAGER_WINDOW_METHOD', guestId, 'blur') - } - - this.print = () => { - ipcRenderer.send('ELECTRON_GUEST_WINDOW_MANAGER_WEB_CONTENTS_METHOD', guestId, 'print') - } - - this.postMessage = (message, targetOrigin) => { - ipcRenderer.send('ELECTRON_GUEST_WINDOW_MANAGER_WINDOW_POSTMESSAGE', guestId, message, toString(targetOrigin), window.location.origin) - } - - this.eval = (...args) => { - ipcRenderer.send('ELECTRON_GUEST_WINDOW_MANAGER_WEB_CONTENTS_METHOD', guestId, 'executeJavaScript', ...args) - } -} - -module.exports = (ipcRenderer, guestInstanceId, openerId, hiddenPage, usesNativeWindowOpen) => { - if (guestInstanceId == null) { - // Override default window.close. - window.close = function () { - ipcRenderer.sendSync('ELECTRON_BROWSER_WINDOW_CLOSE') - } - } - - if (!usesNativeWindowOpen) { - // Make the browser window or guest view emit "new-window" event. - window.open = function (url, frameName, features) { - if (url != null && url !== '') { - url = resolveURL(url) - } - const guestId = ipcRenderer.sendSync('ELECTRON_GUEST_WINDOW_MANAGER_WINDOW_OPEN', url, toString(frameName), toString(features)) - if (guestId != null) { - return getOrCreateProxy(ipcRenderer, guestId) - } else { - return null - } - } - - if (openerId != null) { - window.opener = getOrCreateProxy(ipcRenderer, openerId) - } - } - - // But we do not support prompt(). - window.prompt = function () { - throw new Error('prompt() is and will not be supported.') - } - - ipcRenderer.on('ELECTRON_GUEST_WINDOW_POSTMESSAGE', function (event, sourceId, message, sourceOrigin) { - // Manually dispatch event instead of using postMessage because we also need to - // set event.source. - event = document.createEvent('Event') - event.initEvent('message', false, false) - event.data = message - event.origin = sourceOrigin - event.source = getOrCreateProxy(ipcRenderer, sourceId) - window.dispatchEvent(event) - }) - - window.history.back = function () { - ipcRenderer.send('ELECTRON_NAVIGATION_CONTROLLER_GO_BACK') - } - - window.history.forward = function () { - ipcRenderer.send('ELECTRON_NAVIGATION_CONTROLLER_GO_FORWARD') - } - - window.history.go = function (offset) { - ipcRenderer.send('ELECTRON_NAVIGATION_CONTROLLER_GO_TO_OFFSET', +offset) - } - - defineProperty(window.history, 'length', { - get: function () { - return ipcRenderer.sendSync('ELECTRON_NAVIGATION_CONTROLLER_LENGTH') - } - }) - - if (guestInstanceId != null) { - // Webview `document.visibilityState` tracks window visibility (and ignores - // the actual <webview> element visibility) for backwards compatibility. - // See discussion in #9178. - // - // Note that this results in duplicate visibilitychange events (since - // Chromium also fires them) and potentially incorrect visibility change. - // We should reconsider this decision for Electron 2.0. - let cachedVisibilityState = hiddenPage ? 'hidden' : 'visible' - - // Subscribe to visibilityState changes. - ipcRenderer.on('ELECTRON_GUEST_INSTANCE_VISIBILITY_CHANGE', function (event, visibilityState) { - if (cachedVisibilityState !== visibilityState) { - cachedVisibilityState = visibilityState - document.dispatchEvent(new Event('visibilitychange')) - } - }) - - // Make document.hidden and document.visibilityState return the correct value. - defineProperty(document, 'hidden', { - get: function () { - return cachedVisibilityState !== 'visible' - } - }) - - defineProperty(document, 'visibilityState', { - get: function () { - return cachedVisibilityState - } - }) - } -} diff --git a/electronasar/stable/worker/init.js b/electronasar/stable/worker/init.js deleted file mode 100644 index e4f8250..0000000 --- a/electronasar/stable/worker/init.js +++ /dev/null @@ -1,37 +0,0 @@ -'use strict' - -const path = require('path') -const Module = require('module') - -// We modified the original process.argv to let node.js load the -// init.js, we need to restore it here. -process.argv.splice(1, 1) - -// Clear search paths. -require('../common/reset-search-paths') - -// Import common settings. -require('@electron/internal/common/init') - -// Expose public APIs. -Module.globalPaths.push(path.join(__dirname, 'api', 'exports')) - -// Export node bindings to global. -global.require = require -global.module = module - -// Set the __filename to the path of html file if it is file: protocol. -if (self.location.protocol === 'file:') { - const pathname = process.platform === 'win32' && self.location.pathname[0] === '/' ? self.location.pathname.substr(1) : self.location.pathname - global.__filename = path.normalize(decodeURIComponent(pathname)) - global.__dirname = path.dirname(global.__filename) - - // Set module's filename so relative require can work as expected. - module.filename = global.__filename - - // Also search for module under the html file. - module.paths = module.paths.concat(Module._nodeModulePaths(global.__dirname)) -} else { - global.__filename = __filename - global.__dirname = __dirname -}