diff --git a/.eslintrc b/.eslintrc
index 436ef78..772324c 100644
--- a/.eslintrc
+++ b/.eslintrc
@@ -27,13 +27,40 @@
"prefer-arrow-callback": "error",
"prefer-object-spread": "error"
},
-
- "overrides": [{
- "files": ["*.ts"],
- "parser": "@typescript-eslint/parser",
- "plugins": ["@typescript-eslint"],
- "rules": {
- "semi": ["error", "never"]
+ "overrides": [
+ {
+ "extends": [
+ "eslint:recommended",
+ "plugin:@typescript-eslint/eslint-recommended",
+ "plugin:@typescript-eslint/recommended"
+ ],
+ "files": ["./src/**/*.ts"],
+ "parser": "@typescript-eslint/parser",
+ "parserOptions": {
+ "project": "./tsconfig.json"
+ },
+ "plugins": ["@typescript-eslint"],
+ "rules": {
+ "semi": ["error", "never"],
+ "space-before-function-paren": ["error", "never"],
+ "eol-last": "error",
+ "@typescript-eslint/ban-types": "warn"
+ }
+ },
+ {
+ "extends": ["plugin:jest/style"],
+ "files": ["./src/**/*.spec.*"],
+ "env": {
+ "jest": true
+ },
+ "plugins": ["jest"],
+ "rules": {
+ "jest/prefer-to-have-length": "off",
+ "jest/no-disabled-tests": "error",
+ "jest/no-focused-tests": "error",
+ "jest/no-identical-title": "error",
+ "@typescript-eslint/no-var-requires": "off"
+ }
}
- }]
+ ]
}
diff --git a/.flowconfig b/.flowconfig
index 2beac50..0a1963c 100644
--- a/.flowconfig
+++ b/.flowconfig
@@ -11,5 +11,6 @@
[lints]
[options]
+module.file_ext=.ts
[strict]
diff --git a/.gitignore b/.gitignore
index 833d261..87a28af 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,4 +5,4 @@
node_modules/
coverage/
-demo/
+/demo/
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1ef92b2..3ffc385 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,14 @@
+### Version 5.1.2 (11th June 2021)
+#### Added
+- Added Typescript support.
+- Added URL strategy with retries when request are being blocked by firewall.
+- Added custom storage namespace.
+
+#### Fixed
+- Fixed issue with using IndexedDb in cross-origin iframe in Safari.
+
+---
+
### Version 5.1.1 (14th December 2020)
#### Added
- Added `warning` log level to make non-critical issues look less frightening.
diff --git a/README.md b/README.md
index e3faa86..24df2a7 100644
--- a/README.md
+++ b/README.md
@@ -8,7 +8,7 @@ Read this in other languages: [English][en-readme], [中文][zh-readme], [日本
* [Example apps](#example-app)
* [Installation](#installation)
-* [Initialization](#initialization)
+* [Initialization](#initialization)
* [Event tracking](#event-tracking)
* [Global callback parameters](#global-callback-parameters)
* [Global partner parameters](#global-partner-parameters)
@@ -37,7 +37,7 @@ To lazy load the Adjust Web SDK through CDN paste th
The Adjust Web SDK should be loaded only once per page and it should be initiated once per page load.
-When loading the sdk through CDN we suggest using minified version. You can target specific version like `https://cdn.adjust.com/adjust-5.1.1.min.js`, or you can target latest version `https://cdn.adjust.com/adjust-latest.min.js` if you want automatic updates without need to change the target file. The sdk files are cached so they are served as fast as possible, and the cache is refreshed every half an hour. If you want updates immediately make sure to target specific version.
+When loading the sdk through CDN we suggest using minified version. You can target specific version like `https://cdn.adjust.com/adjust-5.1.2.min.js`, or you can target latest version `https://cdn.adjust.com/adjust-latest.min.js` if you want automatic updates without need to change the target file. The sdk files are cached so they are served as fast as possible, and the cache is refreshed every half an hour. If you want updates immediately make sure to target specific version.
It's also possible to install our sdk through NPM:
@@ -111,6 +111,12 @@ Here are more details about each log level:
It's possible to define html container where you want to see your logs. This is useful when testing on mobile devices and when you want to see logs directly on the screen (recommended only for testing)
+**namespace** `string`
+
+A custom namespace for SDK data storage. If there are multiple applications on the same domain to allow SDK distinguish storages and don't mix the data up each application should use it's own namespace.
+
+Please note it's possible to set custom namespace for existing storage with default name, all data will be preserved and moved to the custom namespace. Once custom namespace is set it's not possible to rename it without data loss.
+
## Event tracking
diff --git a/VERSION b/VERSION
index ac14c3d..61fcc87 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-5.1.1
+5.1.2
diff --git a/dist/adjust-latest.d.ts b/dist/adjust-latest.d.ts
new file mode 100644
index 0000000..b90a01a
--- /dev/null
+++ b/dist/adjust-latest.d.ts
@@ -0,0 +1,310 @@
+// Type definitions for Adjust Web SDK
+
+interface GlobalParams {
+ key: string;
+ value: string;
+}
+
+interface EventParams {
+
+ /** Required, make sure to provide valid event token. */
+ eventToken: string;
+
+ /** Optional. In case you want to attach revenue to an event (for example you would like to track some purchase that
+ * happened inside your web app) then you need to provide positive value for this param.
+ *
+ * **Important**: it's mandatory to provide `currency` if you use this one. */
+ revenue?: number;
+
+ /** Optional. Should be a valid currency code like `EUR`, `USD` and so on.
+ *
+ * @example
+ * Adjust.trackEvent({
+ * // ... other params go here, including mandatory ones
+ * revenue: 110,
+ * currency: 'EUR'
+ * })
+ * */
+ currency?: string;
+
+ /** Optional. It's an event deduplication id in order to avoid tracking duplicated events. Deduplication list limit
+ * is set with {@link InitOptions.eventDeduplicationListLimit} parameter passed to `Adjust.initSdk` method*/
+ deduplicationId?: string;
+
+ /** Optional. You can register a callback URL for your events in your dashboard. We will send a GET request to that
+ * URL whenever the event is tracked. You can add callback parameters to that event by adding `callbackParams`
+ * parameter to the map object passed to `trackEvent` method. We will then append these parameters to your callback URL.
+ *
+ * @example For example, suppose you have registered the URL `https://www.mydomain.com/callback` then track an event like this:
+ * Adjust.trackEvent({
+ * // ... other params go here, including mandatory ones
+ * callbackParams: [
+ * {key: 'key', value: 'value'},
+ * {key: 'foo', value: 'bar'}
+ * ]
+ * })
+ *
+ * In that case we would track the event and send a request to `https://www.mydomain.com/callback?key=value&foo=bar`.
+ *
+ * Please note that we do not store any of your custom parameters, but only append them to your callbacks, thus
+ * without a callback they will not be saved nor sent to you. */
+ callbackParams?: Array;
+
+ /** Optional. You can also add parameters to be transmitted to network partners, which have been activated in your
+ * Adjust dashboard. This works similarly to the callback parameters.
+ *
+ * @example
+ * Adjust.trackEvent({
+ * // ... other params go here, including mandatory ones
+ * partnerParams: [
+ * {key: 'key', value: 'value'},
+ * {key: 'foo', value: 'bar'}
+ * ]
+ * })
+ * */
+ partnerParams?: Array;
+}
+
+interface InitOptions {
+
+ /** Required to initialise SDK instance, please make sure to provide valid app token. */
+ appToken: string;
+
+ /** Required to initialise SDK instance, available options are `production` or `sandbox`. Use `sandbox` in case you
+ * are testing the SDK locally with your web app. */
+ environment: 'production' | 'sandbox';
+
+ /** Optional. By default, users who are not attributed to any campaigns will be attributed to the Organic tracker of
+ * the app. If you want to overwrite this behaviour and attributed this type of traffic under a different tracker,
+ * you can use this method to set a different default tracker. */
+ defaultTracker?: string;
+
+ /** Optional. */
+ externalDeviceId?: string;
+
+ /** Optional. By default all requests go to Adjust's endpoints. You are able to redirect all requests to your custom
+ * endpoint. */
+ customUrl?: string;
+
+ /** Optional. By default this param is set to `10`. It is possible to override this limit but make sure that it is a
+ * positive number and not too big. This will cache last `n` deduplication ids (defined by this param) and use them
+ * to deduplicate events with repeating ids. */
+ eventDeduplicationListLimit?: number;
+
+ /** Optional. */
+ urlStrategy?: 'india' | 'china';
+
+ /**
+ * Optional. A custom namespace for SDK data storage. If not set then default one is used.
+ * It's useful when there are multiple applications on the same domain to allow SDK distinguish storages and don't
+ * mix the data up.
+ *
+ * Please note it's possible to set custom namespace for existing default-named storage, all data will be preserved
+ * and moved to the custom namespace. Once custom namespace is set it's not possible to rename it or undo without
+ * data loss.
+ */
+ namespace?: string;
+
+ /** Optional. This is a callback function for the attribution change. Two arguments are provided to the callback,
+ * first one is an internal event name (can be ignored), and the other one is the Object which holds information
+ * about the changed attribution.
+ *
+ * @example
+ * Adjust.initSdk({
+ * // ... other params go here, including mandatory ones
+ * attributionCallback: function (e, attribution) {
+ * // e: internal event name, can be ignored
+ * // attribution: details about the changed attribution
+ * }
+ * }); */
+ attributionCallback?: (e: string, attribution: Object) => any;
+
+ /** Optional. Logging level used by SDK instance. By default this param is set to `error`. We highly recommend that
+ * you use `verbose` when testing in order to see precise logs and to make sure integration is done properly.
+ * Here are more details about each log level:
+ * - `verbose` - will print detailed messages in case of certain actions
+ * - `info` - will print only basic info messages, warnings and errors
+ * - `warning` - will print only warning and error messages
+ * - `error` - will print only error message
+ * - `none` - won't print anything
+ */
+ logLevel?: 'none' | 'error' | 'warning' | 'info' | 'verbose';
+
+ /**
+ * Optional. Query selector to define html container if you want to see your logs directly on the screen. This could
+ * be useful when testing on mobile devices.
+ *
+ * @example
+ * Adjust.initSdk({
+ * // ... other params go here, including mandatory ones
+ * logOutput: '#output'
+ * }); */
+ logOutput?: string;
+}
+
+/**
+ * Initiate the instance with options object, should be called as soon as possible
+ *
+ * @param {InitOptions} options Options to initiate the SDK instance.
+ *
+ * @example
+ * Adjust.initSdk({
+ * appToken: 'YOUR_APP_TOKEN',
+ * environment: 'production',
+ * logLevel: 'info'
+ * });
+ */
+function initSdk({ logLevel, logOutput, ...options }: InitOptions): void
+
+/**
+ * Track event with already initiated Adjust SDK instance
+ *
+ * @param {EventParams} params Parameters of event to be tracked.
+ *
+ * @example
+ * Adjust.trackEvent({
+ * eventToken: 'YOUR_EVENT_TOKEN',
+ * revenue: 111,
+ * currency: 'EUR',
+ * callbackParams: [
+ * {key: 'some-key-1', value: 'some-value-1'},
+ * {key: 'some-key-2', value: 'some-value-2'},
+ * {key: 'key1', value: 'new-value1'}
+ * ],
+ * partnerParams: [
+ * {key: 'key-1', value: 'new-value-1'},
+ * {key: 'some-partner-key-1', value: 'some-partner-value-1'},
+ * {key: 'key-2', value: 'new-value-2'},
+ * {key: 'some-partner-key-2', value: 'some-partner-value-2'},
+ * {key: 'some-partner-key-1', value: 'some-partner-value-3'}
+ * ]
+ * });
+ */
+function trackEvent(params: EventParams): void
+
+/**
+ * Add global callback parameters
+ *
+ * Global callback parameters will be appended automatically to each session and event request. Note that callback
+ * params passed directly to `trackEvent` method will override existing global callback params.
+ *
+ * @example
+ * Adjust.addGlobalCallbackParameters([
+ * {key: 'key1', value: 'value1'},
+ * {key: 'key2', value: 'value2'}
+ * ]);
+ *
+ * @param {Array} params
+ */
+function addGlobalCallbackParameters(params: Array): void
+
+/**
+ * Add global partner parameters
+ *
+ * Global partner parameters will be appended automatically to each session and event request. Note that partner
+ * params passed directly to `trackEvent` method will override existing global partner params.
+ *
+ * @example
+ * Adjust.addGlobalPartnerParameters([
+ * {key: 'key1', value: 'value1'},
+ * {key: 'key2', value: 'value2'}
+ * ]);
+ *
+ * @param {Array} params
+ */
+function addGlobalPartnerParameters(params: Array): void
+
+/**
+ * Remove global callback parameter by key
+ *
+ * To remove particular callback parameter use this method by providing the key of a global callback param which needs
+ * to be removed.
+ *
+ * @example
+ * Adjust.removeGlobalCallbackParameter('key1');
+ *
+ * @param {string} key
+ */
+function removeGlobalCallbackParameter(key: string): void
+
+/**
+ * Remove global partner parameter by key
+ *
+ * To remove particular partner parameter use this method by providing the key of a global partner param which needs
+ * to be removed.
+ *
+ * @example
+ * Adjust.removeGlobalPartnerParameter('key1');
+ *
+ * @param {string} key
+ */
+function removeGlobalPartnerParameter(key: string): void
+
+/**
+ * Remove all global callback parameters
+ */
+function clearGlobalCallbackParameters(): void
+
+/**
+ * Remove all global partner parameters
+ */
+function clearGlobalPartnerParameters(): void
+
+/**
+ * Switch offline mode
+ */
+function switchToOfflineMode(): void
+
+/**
+ * Switch online mode
+ */
+function switchBackToOnlineMode(): void
+
+/**
+ * Stop SDK
+ *
+ * To completely stop the SDK from running in certain situations. This means that SDK will stop tracking sessions and
+ * events and in general will stop working entirely. But it's possible to restart it after some time with
+ * `Adjust.restart()` method.
+ */
+function stop(): void
+
+/**
+ * Restart sdk if not GDPR forgotten
+ */
+function restart(): void
+
+/**
+ * Disable sdk and send GDPR-Forget-Me request
+ *
+ * This method will stop Adjust SDK from running and will notify adjust backend that user wants to be GDPR forgotten.
+ * Once this method is run it's not possible to restart Adjust SDK anymore.
+ */
+function gdprForgetMe(): void
+
+/**
+ * Disable third party sharing
+ *
+ * Marketing Opt-out, which is disabling third-party sharing ability. This method will notify our backed in the same
+ * manner as it does for GDPR Forget me.
+ */
+function disableThirdPartySharing(): void
+
+const Adjust = {
+ initSdk,
+ trackEvent,
+ addGlobalCallbackParameters,
+ addGlobalPartnerParameters,
+ removeGlobalCallbackParameter,
+ removeGlobalPartnerParameter,
+ clearGlobalCallbackParameters,
+ clearGlobalPartnerParameters,
+ switchToOfflineMode,
+ switchBackToOnlineMode,
+ stop,
+ restart,
+ gdprForgetMe,
+ disableThirdPartySharing
+}
+
+export default Adjust
diff --git a/dist/adjust-latest.js b/dist/adjust-latest.js
index 2e3c48e..b2f959d 100644
--- a/dist/adjust-latest.js
+++ b/dist/adjust-latest.js
@@ -91,7 +91,7 @@ return /******/ (function(modules) { // webpackBootstrap
/******/
/******/
/******/ // Load entry module and return exports
-/******/ return __webpack_require__(__webpack_require__.s = 18);
+/******/ return __webpack_require__(__webpack_require__.s = 20);
/******/ })
/************************************************************************/
/******/ ([
@@ -140,13 +140,13 @@ module.exports = _objectSpread2;
/* 1 */
/***/ (function(module, exports, __webpack_require__) {
-var arrayWithHoles = __webpack_require__(12);
+var arrayWithHoles = __webpack_require__(14);
-var iterableToArrayLimit = __webpack_require__(13);
+var iterableToArrayLimit = __webpack_require__(15);
-var unsupportedIterableToArray = __webpack_require__(5);
+var unsupportedIterableToArray = __webpack_require__(7);
-var nonIterableRest = __webpack_require__(14);
+var nonIterableRest = __webpack_require__(16);
function _slicedToArray(arr, i) {
return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();
@@ -1353,19 +1353,41 @@ return Promise$1;
//# sourceMappingURL=es6-promise.map
-/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(10), __webpack_require__(11)))
+/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(12), __webpack_require__(13)))
/***/ }),
/* 4 */
+/***/ (function(module, exports) {
+
+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);
+ }
+}
+
+function _createClass(Constructor, protoProps, staticProps) {
+ if (protoProps) _defineProperties(Constructor.prototype, protoProps);
+ if (staticProps) _defineProperties(Constructor, staticProps);
+ return Constructor;
+}
+
+module.exports = _createClass;
+
+/***/ }),
+/* 5 */
/***/ (function(module, exports, __webpack_require__) {
-var arrayWithoutHoles = __webpack_require__(15);
+var arrayWithoutHoles = __webpack_require__(17);
-var iterableToArray = __webpack_require__(16);
+var iterableToArray = __webpack_require__(18);
-var unsupportedIterableToArray = __webpack_require__(5);
+var unsupportedIterableToArray = __webpack_require__(7);
-var nonIterableSpread = __webpack_require__(17);
+var nonIterableSpread = __webpack_require__(19);
function _toConsumableArray(arr) {
return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();
@@ -1374,10 +1396,22 @@ function _toConsumableArray(arr) {
module.exports = _toConsumableArray;
/***/ }),
-/* 5 */
+/* 6 */
+/***/ (function(module, exports) {
+
+function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+}
+
+module.exports = _classCallCheck;
+
+/***/ }),
+/* 7 */
/***/ (function(module, exports, __webpack_require__) {
-var arrayLikeToArray = __webpack_require__(6);
+var arrayLikeToArray = __webpack_require__(8);
function _unsupportedIterableToArray(o, minLen) {
if (!o) return;
@@ -1391,7 +1425,7 @@ function _unsupportedIterableToArray(o, minLen) {
module.exports = _unsupportedIterableToArray;
/***/ }),
-/* 6 */
+/* 8 */
/***/ (function(module, exports) {
function _arrayLikeToArray(arr, len) {
@@ -1407,10 +1441,10 @@ function _arrayLikeToArray(arr, len) {
module.exports = _arrayLikeToArray;
/***/ }),
-/* 7 */
+/* 9 */
/***/ (function(module, exports, __webpack_require__) {
-var objectWithoutPropertiesLoose = __webpack_require__(9);
+var objectWithoutPropertiesLoose = __webpack_require__(11);
function _objectWithoutProperties(source, excluded) {
if (source == null) return {};
@@ -1434,7 +1468,7 @@ function _objectWithoutProperties(source, excluded) {
module.exports = _objectWithoutProperties;
/***/ }),
-/* 8 */
+/* 10 */
/***/ (function(module, exports) {
function _typeof(obj) {
@@ -1456,7 +1490,7 @@ function _typeof(obj) {
module.exports = _typeof;
/***/ }),
-/* 9 */
+/* 11 */
/***/ (function(module, exports) {
function _objectWithoutPropertiesLoose(source, excluded) {
@@ -1477,7 +1511,7 @@ function _objectWithoutPropertiesLoose(source, excluded) {
module.exports = _objectWithoutPropertiesLoose;
/***/ }),
-/* 10 */
+/* 12 */
/***/ (function(module, exports) {
// shim for using process in browser
@@ -1667,7 +1701,7 @@ process.umask = function() { return 0; };
/***/ }),
-/* 11 */
+/* 13 */
/***/ (function(module, exports) {
var g;
@@ -1693,7 +1727,7 @@ module.exports = g;
/***/ }),
-/* 12 */
+/* 14 */
/***/ (function(module, exports) {
function _arrayWithHoles(arr) {
@@ -1703,7 +1737,7 @@ function _arrayWithHoles(arr) {
module.exports = _arrayWithHoles;
/***/ }),
-/* 13 */
+/* 15 */
/***/ (function(module, exports) {
function _iterableToArrayLimit(arr, i) {
@@ -1736,7 +1770,7 @@ function _iterableToArrayLimit(arr, i) {
module.exports = _iterableToArrayLimit;
/***/ }),
-/* 14 */
+/* 16 */
/***/ (function(module, exports) {
function _nonIterableRest() {
@@ -1746,10 +1780,10 @@ function _nonIterableRest() {
module.exports = _nonIterableRest;
/***/ }),
-/* 15 */
+/* 17 */
/***/ (function(module, exports, __webpack_require__) {
-var arrayLikeToArray = __webpack_require__(6);
+var arrayLikeToArray = __webpack_require__(8);
function _arrayWithoutHoles(arr) {
if (Array.isArray(arr)) return arrayLikeToArray(arr);
@@ -1758,7 +1792,7 @@ function _arrayWithoutHoles(arr) {
module.exports = _arrayWithoutHoles;
/***/ }),
-/* 16 */
+/* 18 */
/***/ (function(module, exports) {
function _iterableToArray(iter) {
@@ -1768,7 +1802,7 @@ function _iterableToArray(iter) {
module.exports = _iterableToArray;
/***/ }),
-/* 17 */
+/* 19 */
/***/ (function(module, exports) {
function _nonIterableSpread() {
@@ -1778,56 +1812,19 @@ function _nonIterableSpread() {
module.exports = _nonIterableSpread;
/***/ }),
-/* 18 */
+/* 20 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
// ESM COMPAT FLAG
__webpack_require__.r(__webpack_exports__);
-// NAMESPACE OBJECT: ./src/sdk/storage/indexeddb.ts
-var indexeddb_namespaceObject = {};
-__webpack_require__.r(indexeddb_namespaceObject);
-__webpack_require__.d(indexeddb_namespaceObject, "isSupported", function() { return isSupported; });
-__webpack_require__.d(indexeddb_namespaceObject, "getAll", function() { return getAll; });
-__webpack_require__.d(indexeddb_namespaceObject, "getFirst", function() { return getFirst; });
-__webpack_require__.d(indexeddb_namespaceObject, "getItem", function() { return getItem; });
-__webpack_require__.d(indexeddb_namespaceObject, "filterBy", function() { return filterBy; });
-__webpack_require__.d(indexeddb_namespaceObject, "addItem", function() { return addItem; });
-__webpack_require__.d(indexeddb_namespaceObject, "addBulk", function() { return addBulk; });
-__webpack_require__.d(indexeddb_namespaceObject, "updateItem", function() { return updateItem; });
-__webpack_require__.d(indexeddb_namespaceObject, "deleteItem", function() { return deleteItem; });
-__webpack_require__.d(indexeddb_namespaceObject, "deleteBulk", function() { return deleteBulk; });
-__webpack_require__.d(indexeddb_namespaceObject, "trimItems", function() { return trimItems; });
-__webpack_require__.d(indexeddb_namespaceObject, "count", function() { return indexeddb_count; });
-__webpack_require__.d(indexeddb_namespaceObject, "clear", function() { return indexeddb_clear; });
-__webpack_require__.d(indexeddb_namespaceObject, "destroy", function() { return indexeddb_destroy; });
-__webpack_require__.d(indexeddb_namespaceObject, "__delete", function() { return __delete; });
-
-// NAMESPACE OBJECT: ./src/sdk/storage/localstorage.js
-var localstorage_namespaceObject = {};
-__webpack_require__.r(localstorage_namespaceObject);
-__webpack_require__.d(localstorage_namespaceObject, "isSupported", function() { return localstorage_isSupported; });
-__webpack_require__.d(localstorage_namespaceObject, "getAll", function() { return localstorage_getAll; });
-__webpack_require__.d(localstorage_namespaceObject, "getFirst", function() { return localstorage_getFirst; });
-__webpack_require__.d(localstorage_namespaceObject, "getItem", function() { return localstorage_getItem; });
-__webpack_require__.d(localstorage_namespaceObject, "filterBy", function() { return localstorage_filterBy; });
-__webpack_require__.d(localstorage_namespaceObject, "addItem", function() { return localstorage_addItem; });
-__webpack_require__.d(localstorage_namespaceObject, "addBulk", function() { return localstorage_addBulk; });
-__webpack_require__.d(localstorage_namespaceObject, "updateItem", function() { return localstorage_updateItem; });
-__webpack_require__.d(localstorage_namespaceObject, "deleteItem", function() { return localstorage_deleteItem; });
-__webpack_require__.d(localstorage_namespaceObject, "deleteBulk", function() { return localstorage_deleteBulk; });
-__webpack_require__.d(localstorage_namespaceObject, "trimItems", function() { return localstorage_trimItems; });
-__webpack_require__.d(localstorage_namespaceObject, "count", function() { return localstorage_count; });
-__webpack_require__.d(localstorage_namespaceObject, "clear", function() { return localstorage_clear; });
-__webpack_require__.d(localstorage_namespaceObject, "destroy", function() { return localstorage_destroy; });
-
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/objectSpread2.js
var objectSpread2 = __webpack_require__(0);
var objectSpread2_default = /*#__PURE__*/__webpack_require__.n(objectSpread2);
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/objectWithoutProperties.js
-var objectWithoutProperties = __webpack_require__(7);
+var objectWithoutProperties = __webpack_require__(9);
var objectWithoutProperties_default = /*#__PURE__*/__webpack_require__.n(objectWithoutProperties);
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/slicedToArray.js
@@ -1835,25 +1832,9 @@ var slicedToArray = __webpack_require__(1);
var slicedToArray_default = /*#__PURE__*/__webpack_require__.n(slicedToArray);
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/toConsumableArray.js
-var toConsumableArray = __webpack_require__(4);
+var toConsumableArray = __webpack_require__(5);
var toConsumableArray_default = /*#__PURE__*/__webpack_require__.n(toConsumableArray);
-// CONCATENATED MODULE: ./src/sdk/globals.js
-/*:: declare var __ADJUST__NAMESPACE: string*/
-
-/*:: declare var __ADJUST__SDK_VERSION: string*/
-
-/*:: declare var process: {|
- env: {|
- NODE_ENV: 'development' | 'production' | 'test'
- |}
-|}*/
-var Globals = {
- namespace: "adjust-sdk" || false,
- version: "5.1.1" || false,
- env: "production"
-};
-/* harmony default export */ var globals = (Globals);
// CONCATENATED MODULE: ./src/sdk/constants.js
var SECOND = 1000;
var MINUTE = SECOND * 60;
@@ -1870,12 +1851,17 @@ var HTTP_ERRORS = {
'SKIP': 'Skipping slower attempt',
'MISSING_URL': 'Url is not provided'
};
+var STORAGE_TYPES = {
+ NO_STORAGE: 'noStorage',
+ INDEXED_DB: 'indexedDB',
+ LOCAL_STORAGE: 'localStorage'
+};
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/defineProperty.js
var defineProperty = __webpack_require__(2);
var defineProperty_default = /*#__PURE__*/__webpack_require__.n(defineProperty);
// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/typeof.js
-var helpers_typeof = __webpack_require__(8);
+var helpers_typeof = __webpack_require__(10);
var typeof_default = /*#__PURE__*/__webpack_require__.n(helpers_typeof);
// CONCATENATED MODULE: ./src/sdk/utilities.js
@@ -2102,6 +2088,22 @@ function isEmptyEntry(value) {
}
+// CONCATENATED MODULE: ./src/sdk/globals.js
+/*:: declare var __ADJUST__NAMESPACE: string*/
+
+/*:: declare var __ADJUST__SDK_VERSION: string*/
+
+/*:: declare var process: {|
+ env: {|
+ NODE_ENV: 'development' | 'production' | 'test'
+ |}
+|}*/
+var Globals = {
+ namespace: "adjust-sdk" || false,
+ version: "5.1.2" || false,
+ env: "production"
+};
+/* harmony default export */ var globals = (Globals);
// CONCATENATED MODULE: ./src/sdk/logger.js
@@ -2222,9 +2224,7 @@ function setLogLevel(logLevel
*/
-function _log
-/*:: */
-(methodName
+function _log(methodName
/*: MethodNameT*/
, logLevel
/*: LogLevelT*/
@@ -2261,7 +2261,7 @@ function _log
*
* @param {string} name
* @param {string} logLevel
- * @returns {Array} args
+ * @returns {Function: (Array) => void}
* @private
*/
@@ -2297,7 +2297,6 @@ var Logger = {
-
/**
* Base parameters set by client
* - app token
@@ -2354,7 +2353,7 @@ var _allowedParams
var _allowedConfig
/*: CustomConfigListT*/
-= ['customUrl', 'eventDeduplicationListLimit'];
+= ['urlStrategy', 'customUrl', 'eventDeduplicationListLimit', 'namespace'];
/**
* Global configuration object used across the sdk
*
@@ -2363,22 +2362,14 @@ var _allowedConfig
* version: string,
* sessionWindow: number,
* sessionTimerWindow: number,
- * requestValidityWindow: number,
- * baseUrl: {app: string, gdpr: string}
+ * requestValidityWindow: number
* }}
*/
var _baseConfig = {
sessionWindow: 30 * MINUTE,
sessionTimerWindow: 60 * SECOND,
- requestValidityWindow: 28 * DAY,
- baseUrl: globals.env === 'test' ? {
- app: 'app',
- gdpr: 'gdpr'
- } : {
- app: 'https://app.adjust.com',
- gdpr: 'https://gdpr.adjust.com'
- }
+ requestValidityWindow: 28 * DAY
};
/**
* Check of configuration has been initialized
@@ -2498,14 +2489,24 @@ var Config = objectSpread2_default()(objectSpread2_default()({}, _baseConfig), {
});
/* harmony default export */ var config = (Config);
-// CONCATENATED MODULE: ./src/sdk/storage/scheme.js
+// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/classCallCheck.js
+var classCallCheck = __webpack_require__(6);
+var classCallCheck_default = /*#__PURE__*/__webpack_require__.n(classCallCheck);
+
+// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/createClass.js
+var createClass = __webpack_require__(4);
+var createClass_default = /*#__PURE__*/__webpack_require__.n(createClass);
+
+// CONCATENATED MODULE: ./src/sdk/storage/scheme.ts
var _values2;
var _queueName = 'q';
-var _queueScheme = {
+var _queueScheme
+/*: StoreScheme*/
+= {
keyPath: 'timestamp',
autoIncrement: false,
fields: {
@@ -2548,7 +2549,9 @@ var _queueScheme = {
}
};
var _activityStateName = 'as';
-var _activityStateScheme = {
+var _activityStateScheme
+/*: StoreScheme*/
+= {
keyPath: 'uuid',
autoIncrement: false,
fields: {
@@ -2594,7 +2597,9 @@ var _activityStateScheme = {
}
};
var _globalParamsName = 'gp';
-var _globalParamsScheme = {
+var _globalParamsScheme
+/*: StoreScheme*/
+= {
keyPath: 'keyType',
autoIncrement: false,
index: 'type',
@@ -2615,7 +2620,9 @@ var _globalParamsScheme = {
}
};
var _eventDeduplicationName = 'ed';
-var _eventDeduplicationScheme = {
+var _eventDeduplicationScheme
+/*: StoreScheme*/
+= {
keyPath: 'internalId',
autoIncrement: true,
fields: {
@@ -2624,7 +2631,9 @@ var _eventDeduplicationScheme = {
}
};
var _preferencesName = 'p';
-var _preferencesScheme = {
+var _preferencesScheme
+/*: StoreScheme*/
+= {
fields: {
thirdPartySharingDisabled: {
key: 'td',
@@ -2660,7 +2669,9 @@ var _preferencesScheme = {
}
}
};
-/* harmony default export */ var storage_scheme = ({
+var scheme_scheme
+/*: Scheme*/
+= {
queue: {
name: _queueName,
scheme: _queueScheme
@@ -2682,8 +2693,9 @@ var _preferencesScheme = {
scheme: _preferencesScheme,
permanent: true
}
-});
-// CONCATENATED MODULE: ./src/sdk/storage/scheme-map.js
+};
+/* harmony default export */ var storage_scheme = (scheme_scheme);
+// CONCATENATED MODULE: ./src/sdk/storage/scheme-map.ts
@@ -2887,7 +2899,9 @@ function _getShortKey(storeName, key) {
*/
-function _getStoreNames() {
+function _getStoreNames()
+/*: {[shortName: string]: {name: string; permanent: boolean}}*/
+{
return entries(storage_scheme).map(function (_ref17) {
var _ref18 = slicedToArray_default()(_ref17, 2),
storeName = _ref18[0],
@@ -3481,38 +3495,37 @@ var ActivityState = {
destroy: activity_state_destroy
};
/* harmony default export */ var activity_state = (ActivityState);
-// CONCATENATED MODULE: ./src/sdk/storage/converter.js
+// CONCATENATED MODULE: ./src/sdk/storage/converter.ts
+
+
+var Direction;
+(function (Direction) {
+ Direction["right"] = "right";
+ Direction["left"] = "left";
+})(Direction || (Direction = {}));
/**
* Get value from the map if available
*
- * @param {Object} map
- * @param {*} value
- * @returns {*}
* @private
*/
-
function _getValue(map, value) {
return map ? map[value] !== undefined ? map[value] : value : value;
}
/**
* Convert key and value by defined scheme
*
- * @param {string} storeName
- * @param {Object} scheme
- * @param {string} dir
- * @param {string} key
- * @param {*} value
- * @returns {[string, *]}
* @private
*/
-function _convert(_ref) {
+function _convert(_ref)
+/*: [string, any]*/
+{
var storeName = _ref.storeName,
scheme = _ref.scheme,
dir = _ref.dir,
@@ -3538,12 +3551,6 @@ function _convert(_ref) {
}
/**
* Convert record by defined direction and scheme
- *
- * @param {string} storeName
- * @param {string} dir
- * @param {Object} record
- * @param {Object=} scheme
- * @returns {Object|undefined}
*/
@@ -3559,7 +3566,7 @@ function convertRecord(_ref2) {
scheme = scheme || scheme_map[dir][convertStoreName({
storeName: storeName,
- dir: 'right'
+ dir: Direction.right
})].fields;
return entries(record).map(function (_ref3) {
var _ref4 = slicedToArray_default()(_ref3, 2),
@@ -3583,15 +3590,12 @@ function convertRecord(_ref2) {
}
/**
* Convert records by defined direction
- *
- * @param {string} storeName
- * @param {string} dir
- * @param {Array} records
- * @returns {Object[]}
*/
-function convertRecords(_ref7) {
+function convertRecords(_ref7)
+/*: Array<{ [key: string]: any }>*/
+{
var storeName = _ref7.storeName,
dir = _ref7.dir,
_ref7$records = _ref7.records,
@@ -3606,11 +3610,6 @@ function convertRecords(_ref7) {
}
/**
* Convert values by defined direction
- *
- * @param {string} storeName
- * @param {string} dir
- * @param {*|*[]} target
- * @returns {*|*[]}
*/
@@ -3620,7 +3619,7 @@ function convertValues(_ref8) {
target = _ref8.target;
var scheme = scheme_map[dir][convertStoreName({
storeName: storeName,
- dir: 'right'
+ dir: Direction.right
})];
var keyPathScheme = scheme.fields[scheme.keyPath];
var values = target instanceof Array ? target.slice() : [target];
@@ -3632,131 +3631,191 @@ function convertValues(_ref8) {
}
/**
* Encode value by defined scheme
- *
- * @param {*} target
- * @returns {*}
*/
-function encodeValue(target) {
+function encodeValue(target
+/*: any*/
+) {
return scheme_map.values[target] || target;
}
/**
* Convert store name by defined direction
- *
- * @param {string} storeName
- * @param {string} dir
- * @returns {string}
*/
-function convertStoreName(_ref9) {
+function convertStoreName(_ref9)
+/*: string*/
+{
var storeName = _ref9.storeName,
dir = _ref9.dir;
return (scheme_map.storeNames[dir][storeName] || {}).name || storeName;
}
/**
* Decode error message by replacing short store name with long readable one
- *
- * @param {string} storeName
- * @param {Object} error
- * @returns {{name: string, message: string}}
*/
-function decodeErrorMessage(_ref10) {
+function decodeErrorMessage(_ref10)
+/*: Error*/
+{
var storeName = _ref10.storeName,
error = _ref10.error;
return {
name: error.name,
message: error.message.replace("\"".concat(storeName, "\""), convertStoreName({
storeName: storeName,
- dir: 'right'
+ dir: Direction.right
}))
};
}
-// CONCATENATED MODULE: ./src/sdk/storage/quick-storage.js
+// CONCATENATED MODULE: ./src/sdk/storage/quick-storage.ts
-var _storageName = globals.namespace;
-var _storeNames = scheme_map.storeNames.left;
-/**
- * Get the value for specified key
- *
- * @param {string} key
- * @returns {*}
- * @private
- */
-function _get(key) {
- var value = JSON.parse(localStorage.getItem("".concat(_storageName, ".").concat(key)));
- return (value instanceof Array ? value : convertRecord({
- storeName: _storeNames.preferences.name,
- dir: 'right',
- record: value
- })) || null;
-}
-/**
- * Set the value for specified key
- *
- * @param {string} key
- * @param {*} value
- * @private
- */
-function _set(key, value) {
- if (!value) {
- localStorage.removeItem("".concat(_storageName, ".").concat(key));
- } else {
- localStorage.setItem("".concat(_storageName, ".").concat(key), JSON.stringify(value instanceof Array ? value : convertRecord({
- storeName: _storeNames.preferences.name,
- dir: 'left',
- record: value
- })));
- }
-}
-/**
- * Clear all data related to the sdk
- */
+var quick_storage_QuickStorage = /*#__PURE__*/function () {
+ createClass_default()(QuickStorage, [{
+ key: "read",
+ /**
+ * Get the value for specified key
+ */
+ value: function read(key
+ /*: string*/
+ ) {
+ var raw = localStorage.getItem("".concat(this.storageName, ".").concat(key));
+ var value = JSON.parse(raw || 'null');
+ return (value instanceof Array ? value : convertRecord({
+ storeName: this.storeNames.preferences.name,
+ dir: Direction.right,
+ record: value
+ })) || null;
+ }
+ /**
+ * Set the value for specified key
+ */
-function quick_storage_clear() {
- entries(_storeNames).forEach(function (_ref) {
- var _ref2 = slicedToArray_default()(_ref, 2),
- store = _ref2[1];
+ }, {
+ key: "write",
+ value: function write(key
+ /*: string*/
+ , value
+ /*: any*/
+ ) {
+ if (!value) {
+ localStorage.removeItem("".concat(this.storageName, ".").concat(key));
+ } else {
+ localStorage.setItem("".concat(this.storageName, ".").concat(key), JSON.stringify(value instanceof Array ? value : convertRecord({
+ storeName: this.storeNames.preferences.name,
+ dir: Direction.left,
+ record: value
+ })));
+ }
+ }
+ /**
+ * Clear all data related to the sdk
+ */
- if (!store.permanent) {
- localStorage.removeItem("".concat(_storageName, ".").concat(store.name));
+ }, {
+ key: "clear",
+ value: function clear() {
+ this.deleteData();
}
- });
-}
+ /**
+ * Clear all data related to the sdk
+ *
+ * @param wipe if true then also remove permanent data such as user's preferences
+ */
-var QuickStorage = {
- storeNames: _storeNames,
- stores: {},
- clear: quick_storage_clear
-};
-entries(_storeNames).forEach(function (_ref3) {
- var _ref4 = slicedToArray_default()(_ref3, 2),
- store = _ref4[1];
+ }, {
+ key: "deleteData",
+ value: function deleteData() {
+ var _this = this;
+
+ var wipe = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+ utilities_values(this.storeNames).forEach(function (store) {
+ if (wipe || !store.permanent) {
+ localStorage.removeItem("".concat(_this.storageName, ".").concat(store.name));
+ }
+ });
+ }
+ }]);
+
+ function QuickStorage() {
+ var _this2 = this;
+
+ classCallCheck_default()(this, QuickStorage);
+
+ defineProperty_default()(this, "defaultName", globals.namespace);
+
+ defineProperty_default()(this, "storageName", this.defaultName);
+
+ defineProperty_default()(this, "storeNames", scheme_map.storeNames.left);
+
+ defineProperty_default()(this, "storesMap", void 0);
- Object.defineProperty(QuickStorage.stores, store.name, {
+ this.storesMap = {};
+ var read = this.read.bind(this);
+ var write = this.write.bind(this);
+ utilities_values(this.storeNames).forEach(function (store) {
+ Object.defineProperty(_this2.storesMap, store.name, {
+ get: function get() {
+ return read(store.name);
+ },
+ set: function set(value) {
+ write(store.name, value);
+ }
+ });
+ });
+ Object.freeze(this.storesMap);
+ }
+ /**
+ * Sets custom name to use in data keys and updates existing keys in localStorage
+ */
+
+
+ createClass_default()(QuickStorage, [{
+ key: "setCustomName",
+ value: function setCustomName(customName
+ /*: string*/
+ ) {
+ var _this3 = this;
+
+ if (!customName || !customName.length) {
+ return;
+ }
+
+ var newName = "".concat(globals.namespace, "-").concat(customName); // Clone data
+
+ utilities_values(this.storeNames).forEach(function (store) {
+ var key = store.name;
+ var rawData = localStorage.getItem("".concat(_this3.storageName, ".").concat(key)); // Get data from the store, no need to encode it
+
+ if (rawData) {
+ localStorage.setItem("".concat(newName, ".").concat(key), rawData); // Put data into a new store
+ }
+ });
+ this.deleteData(true);
+ this.storageName = newName;
+ }
+ }, {
+ key: "stores",
get: function get() {
- return _get(store.name);
- },
- set: function set(value) {
- _set(store.name, value);
+ return this.storesMap;
}
- });
-});
-Object.freeze(QuickStorage.stores);
-/* harmony default export */ var quick_storage = (QuickStorage);
+ }]);
+
+ return QuickStorage;
+}();
+
+/* harmony default export */ var quick_storage = (new quick_storage_QuickStorage());
// CONCATENATED MODULE: ./src/sdk/pub-sub.js
@@ -3911,6 +3970,7 @@ function pub_sub_destroy()
+
/*:: type SdkDisabledT = {|
reason: REASON_GENERAL | REASON_GDPR,
pending: boolean
@@ -3934,7 +3994,7 @@ function pub_sub_destroy()
*/
var _storeName
/*: string*/
-= quick_storage.storeNames.preferences.name;
+= storage_scheme.preferences.name;
/**
* Local reference to be used for recovering preserved state
*
@@ -4086,1315 +4146,1760 @@ function recover()
-var _Promise = typeof Promise === 'undefined' ? __webpack_require__(3).Promise : Promise;
-
-
-
-
+var _Promise = typeof Promise === 'undefined' ? __webpack_require__(3).Promise : Promise;
-var _dbName = globals.namespace;
-var _dbVersion = 1;
-var _db
-/*: IDBDatabase | null*/
-;
-/**
- * Check if IndexedDB is supported in the current browser (exclude iOS forcefully)
- *
- * @returns {boolean}
- */
-function isSupported()
-/*: boolean*/
-{
- var indexedDB = _getIDB();
- var iOS = !!navigator.platform && /iPad|iPhone|iPod/.test(navigator.platform);
- var supported = !!indexedDB && !iOS;
- if (!supported) {
- logger.warn('IndexedDB is not supported in this browser');
- }
- return supported;
-}
-/**
- * Get indexedDB instance
- *
- * @returns {IDBFactory}
- * @private
- */
+var Action;
+(function (Action) {
+ Action["add"] = "add";
+ Action["put"] = "put";
+ Action["get"] = "get";
+ Action["list"] = "list";
+ Action["clear"] = "clear";
+ Action["delete"] = "delete";
+})(Action || (Action = {}));
-function _getIDB()
-/*: IDBFactory*/
-{
- return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
-}
-/**
- * Handle database upgrade/initialization
- * - store activity state from memory if database unexpectedly got lost in the middle of the window session
- * - migrate data from localStorage if available on browser upgrade
- *
- * @param {Object} e
- * @param {Function} reject
- * @private
- */
+var indexeddb_IndexedDBWrapper = /*#__PURE__*/function () {
+ createClass_default()(IndexedDBWrapper, null, [{
+ key: "tryOpen",
+ /**
+ * Cached promise of IndexedDB validation
+ */
-function _handleUpgradeNeeded(e
-/*: IDBVersionChangeEvent*/
-, reject
-/*: Function*/
-) {
- var db = e.target.result;
- e.target.transaction.onerror = reject;
- e.target.transaction.onabort = reject;
- var storeNames = scheme_map.storeNames.left;
- var activityState = activity_state.current || {};
- var inMemoryAvailable = activityState && !isEmpty(activityState);
- entries(storeNames).filter(function (_ref) {
- var _ref2 = slicedToArray_default()(_ref, 2),
- store = _ref2[1];
+ /**
+ * Tries to open a temporary database
+ */
+ value: function tryOpen(db
+ /*: IDBFactory*/
+ )
+ /*: Promise*/
+ {
+ return new _Promise(function (resolve) {
+ try {
+ var request = db.open(IndexedDBWrapper.dbValidationName);
+
+ request.onsuccess = function () {
+ request.result.close();
+ db.deleteDatabase(IndexedDBWrapper.dbValidationName);
+ resolve(true);
+ };
+
+ request.onerror = function () {
+ return resolve(false);
+ };
+ } catch (error) {
+ resolve(false);
+ }
+ });
+ }
+ /**
+ * Check if IndexedDB is supported in the current browser (exclude iOS forcefully)
+ */
- return !store.permanent;
- }).forEach(function (_ref3) {
- var _ref4 = slicedToArray_default()(_ref3, 2),
- longStoreName = _ref4[0],
- store = _ref4[1];
+ }, {
+ key: "isSupported",
+ value: function isSupported()
+ /*: Promise*/
+ {
+ if (IndexedDBWrapper.isSupportedPromise) {
+ return IndexedDBWrapper.isSupportedPromise;
+ } else {
+ IndexedDBWrapper.isSupportedPromise = new _Promise(function (resolve) {
+ var indexedDB = IndexedDBWrapper.getIndexedDB();
+ var iOS = !!navigator.platform && /iPad|iPhone|iPod/.test(navigator.platform);
- var options = scheme_map.right[longStoreName];
- var objectStore = db.createObjectStore(store.name, {
- keyPath: options.keyPath,
- autoIncrement: options.autoIncrement || false
- });
+ if (!indexedDB || iOS) {
+ logger.warn('IndexedDB is not supported in this browser');
+ resolve(false);
+ } else {
+ var dbOpenablePromise = IndexedDBWrapper.tryOpen(indexedDB).then(function (dbOpenable) {
+ if (!dbOpenable) {
+ logger.warn('IndexedDB is not supported in this browser');
+ }
+
+ return dbOpenable;
+ });
+ resolve(dbOpenablePromise);
+ }
+ });
+ }
- if (options.index) {
- objectStore.createIndex("".concat(options.index, "Index"), options.index);
+ return IndexedDBWrapper.isSupportedPromise;
}
+ /**
+ * Get indexedDB instance
+ */
- if (store.name === storeNames.activityState.name && inMemoryAvailable) {
- objectStore.add(convertRecord({
- storeName: longStoreName,
- record: activityState,
- dir: 'left'
- }));
- logger.info('Activity state has been recovered');
- } else if (quick_storage.stores[store.name]) {
- quick_storage.stores[store.name].forEach(function (record) {
- return objectStore.add(record);
- });
- logger.info("Migration from localStorage done for ".concat(longStoreName, " store"));
+ }, {
+ key: "getIndexedDB",
+ value: function getIndexedDB()
+ /*: Maybe*/
+ {
+ return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
}
- });
- recover();
- quick_storage.clear();
-}
-/**
- * Handle successful database opening
- *
- * @param {Object} e
- * @param {Function} resolve
- * @private
- */
+ }]);
+ function IndexedDBWrapper() {
+ classCallCheck_default()(this, IndexedDBWrapper);
-function _handleOpenSuccess(e, resolve) {
- _db = e.target.result;
- resolve({
- success: true
- });
- _db.onclose = indexeddb_destroy;
-}
-/**
- * Open the database connection and create store if not existent
- *
- * @returns {Promise}
- * @private
- */
+ defineProperty_default()(this, "dbDefaultName", globals.namespace);
+
+ defineProperty_default()(this, "dbName", this.dbDefaultName);
+ defineProperty_default()(this, "dbVersion", 1);
-function _open() {
- var indexedDB = _getIDB();
+ defineProperty_default()(this, "idbFactory", void 0);
- if (!isSupported()) {
- return _Promise.reject({
+ defineProperty_default()(this, "indexedDbConnection", null);
+
+ defineProperty_default()(this, "notSupportedError", {
name: 'IDBNotSupported',
message: 'IndexedDB is not supported'
});
- }
- return new _Promise(function (resolve, reject) {
- if (_db) {
- resolve({
- success: true
- });
- return;
- }
+ defineProperty_default()(this, "databaseOpenError", {
+ name: 'CannotOpenDatabaseError',
+ message: 'Cannot open a database'
+ });
- var request = indexedDB.open(_dbName, _dbVersion);
+ defineProperty_default()(this, "noConnectionError", {
+ name: 'NoDatabaseConnection',
+ message: 'Cannot open a transaction'
+ });
- request.onupgradeneeded = function (e) {
- return _handleUpgradeNeeded(e, reject);
- };
+ var idb = IndexedDBWrapper.getIndexedDB();
- request.onsuccess = function (e) {
- return _handleOpenSuccess(e, resolve);
- };
+ if (!idb) {
+ throw this.notSupportedError;
+ }
- request.onerror = reject;
- });
-}
-/**
- * Get transaction and the store
- *
- * @param {string} storeName
- * @param {string} mode
- * @param {Function} reject
- * @returns {{transaction, store: IDBObjectStore, index: IDBIndex}}
- * @private
- */
-
-
-function _getTranStore(_ref5, reject
-/*: Function*/
-)
-/*: {transaction: IDBTransaction, store: IDBObjectStore, index: IDBIndex, options: any}*/
-{
- var storeName = _ref5.storeName,
- mode = _ref5.mode;
-
- var transaction = _db.transaction([storeName], mode);
-
- var store = transaction.objectStore(storeName);
- var options = scheme_map.right[convertStoreName({
- storeName: storeName,
- dir: 'right'
- })];
- var index;
-
- if (options.index) {
- index = store.index("".concat(options.index, "Index"));
+ this.idbFactory = idb;
}
-
- transaction.onerror = reject;
- transaction.onabort = reject;
- return {
- transaction: transaction,
- store: store,
- index: index,
- options: options
- };
-}
-/**
- * Override the error by extracting only name and message of the error
- *
- * @param {Function} reject
- * @param {Object} error
- * @returns {Object}
- * @private
- */
-
-
-function _overrideError(reject, error) {
- var _error$target$error = error.target.error,
- name = _error$target$error.name,
- message = _error$target$error.message;
- return reject({
- name: name,
- message: message
- });
-}
-/**
- * Get list of composite keys if available
- * @param options
- * @returns {Array|null}
- * @private
- */
+ /**
+ * Sets custom name if provided and migrates database
+ */
-function _getCompositeKeys(options) {
- return options.fields[options.keyPath].composite || null;
-}
-/**
- * Prepare the target to be queried depending on the composite key if defined
- *
- * @param {Object} options
- * @param {*} target
- * @param {string} action
- * @returns {*}
- * @private
- */
+ createClass_default()(IndexedDBWrapper, [{
+ key: "setCustomName",
+ value: function setCustomName(customName
+ /*: string*/
+ )
+ /*: Promise*/
+ {
+ if (customName && customName.length > 0) {
+ this.dbName = "".concat(globals.namespace, "-").concat(customName);
+ return this.migrateDb(this.dbDefaultName, this.dbName);
+ }
+ return _Promise.resolve();
+ }
+ /**
+ * Opens database with defined name and resolves with database connection if successed
+ * @param name name of database to open
+ * @param version optional version of database schema
+ * @param upgradeCallback optional `IDBOpenRequest.onupgradeneeded` event handler
+ */
-function _prepareTarget(options, target, action) {
- var addOrPut = ['add', 'put'].indexOf(action) !== -1;
+ }, {
+ key: "openDatabase",
+ value: function openDatabase(name
+ /*: string*/
+ , version
+ /*: number*/
+ , upgradeCallback
+ /*: (event: IDBVersionChangeEvent, reject: () => void) => void*/
+ )
+ /*: Promise*/
+ {
+ var _this = this;
+
+ return IndexedDBWrapper.isSupported().then(function (supported) {
+ if (!supported) {
+ return _Promise.reject(_this.notSupportedError);
+ } else {
+ return new _Promise(function (resolve, reject) {
+ var request = _this.idbFactory.open(name, version);
- var composite = _getCompositeKeys(options);
+ if (upgradeCallback) {
+ request.onupgradeneeded = function (event) {
+ return upgradeCallback(event, reject);
+ };
+ }
- return composite ? addOrPut ? objectSpread2_default()(defineProperty_default()({}, options.keyPath, composite.map(function (key) {
- return target[key];
- }).join('')), target) : target ? target.join('') : null : target;
-}
-/**
- * Prepare the result to be return depending on the composite key definition
- *
- * @param {Object} options
- * @param {Object} target
- * @returns {Array|null}
- * @private
- */
+ request.onsuccess = function (event
+ /*: IDBOpenDBEvent*/
+ ) {
+ var connection = event.target.result;
+ if (connection) {
+ resolve(connection);
+ } else {
+ reject(_this.databaseOpenError);
+ }
+ };
-function _prepareResult(options, target) {
- var composite = _getCompositeKeys(options);
+ request.onerror = reject;
+ });
+ }
+ });
+ }
+ /**
+ * Checks if database with passed name exists
+ */
- return composite && isObject(target) ? composite.map(function (key) {
- return target[key];
- }) : null;
-}
-/**
- * Initiate the database request
- *
- * @param {string} storeName
- * @param {*=} target
- * @param {string} action
- * @param {string} [mode=readonly]
- * @returns {Promise}
- * @private
- */
+ }, {
+ key: "databaseExists",
+ value: function databaseExists(name
+ /*: string*/
+ )
+ /*: Promise*/
+ {
+ var _this2 = this;
+
+ return new _Promise(function (resolve
+ /*: (result: boolean) => void*/
+ ) {
+ var existed = true;
+
+ _this2.openDatabase(name, undefined, function () {
+ existed = false;
+ }).then(function (connection) {
+ connection.close();
+
+ if (existed) {
+ return;
+ } // We didn't have this database before the check, so remove it
+
+
+ return _this2.deleteDatabaseByName(name);
+ }).then(function () {
+ return resolve(existed);
+ });
+ });
+ }
+ }, {
+ key: "cloneData",
+ value: function cloneData(defaultDbConnection
+ /*: IDBDatabase*/
+ , customDbConnection
+ /*: IDBDatabase*/
+ )
+ /*: Promise*/
+ {
+ var _this3 = this;
+
+ // Function to clone a single store
+ var cloneStore = function cloneStore(storeName
+ /*: string*/
+ ) {
+ var connection = _this3.indexedDbConnection;
+ _this3.indexedDbConnection = defaultDbConnection;
+ return _this3.getAll(storeName) // Get all records from default-named database
+ .then(function (records
+ /*: Array*/
+ ) {
+ _this3.indexedDbConnection = customDbConnection;
+
+ if (records.length < 1) {
+ // There is no records in the store
+ return;
+ }
+ return _this3.addBulk(storeName, records, true); // Put all records into custom-named database
+ }).then(function () {
+ _this3.indexedDbConnection = connection; // Restore initial state
+ });
+ }; // Get names of stores
-function _initRequest(_ref6) {
- var storeName = _ref6.storeName,
- _ref6$target = _ref6.target,
- target = _ref6$target === void 0 ? null : _ref6$target,
- action = _ref6.action,
- _ref6$mode = _ref6.mode,
- mode = _ref6$mode === void 0 ? 'readonly' : _ref6$mode;
- return _open().then(function () {
- return new _Promise(function (resolve, reject) {
- var _getTranStore2 = _getTranStore({
- storeName: storeName,
- mode: mode
- }, reject),
- store = _getTranStore2.store,
- options = _getTranStore2.options;
- var request = store[action](_prepareTarget(options, target, action));
+ var storeNames
+ /*: string[]*/
+ = utilities_values(scheme_map.storeNames.left).filter(function (store) {
+ return !store.permanent;
+ }).map(function (store) {
+ return store.name;
+ });
+ var cloneStorePromises = storeNames.map(function (name) {
+ return function () {
+ return cloneStore(name);
+ };
+ }); // Run clone operations one by one
- var result = _prepareResult(options, target);
+ return cloneStorePromises.reduce(function (previousTask, currentTask) {
+ return previousTask.then(currentTask);
+ }, _Promise.resolve());
+ }
+ /**
+ * Migrates created database with default name to custom
+ * The IndexedDb API doesn't provide method to rename existing database so we have to create a new database, clone
+ * data and remove the old one.
+ */
- request.onsuccess = function () {
- if (action === 'get' && !request.result) {
- reject({
- name: 'NotRecordFoundError',
- message: "Requested record not found in \"".concat(storeName, "\" store")
+ }, {
+ key: "migrateDb",
+ value: function migrateDb(defaultName
+ /*: string*/
+ , customName
+ /*: string*/
+ )
+ /*: Promise*/
+ {
+ var _this4 = this;
+
+ return this.databaseExists(defaultName).then(function (defaultExists) {
+ if (defaultExists) {
+ // Migration hadn't finished yet
+ return _Promise.all([_this4.openDatabase(defaultName, _this4.dbVersion, _this4.handleUpgradeNeeded), // Open the default database, migrate version if needed
+ _this4.openDatabase(customName, _this4.dbVersion, _this4.handleUpgradeNeeded) // Open or create a new database, migrate version if needed
+ ]).then(function (_ref) {
+ var _ref2 = slicedToArray_default()(_ref, 2),
+ defaultDbConnection = _ref2[0],
+ customDbConnection = _ref2[1];
+
+ return _this4.cloneData(defaultDbConnection, customDbConnection).then(function () {
+ _this4.indexedDbConnection = customDbConnection;
+ defaultDbConnection.close();
+ return _this4.deleteDatabaseByName(defaultName);
+ });
+ }).then(function () {
+ return logger.info('Database migration finished');
});
} else {
- resolve(result || request.result || target);
+ // There is no default-named database, let's just create or open a custom-named one
+ return _this4.openDatabase(customName, _this4.dbVersion, _this4.handleUpgradeNeeded).then(function (customDbConnection) {
+ _this4.indexedDbConnection = customDbConnection;
+ });
}
- };
-
- request.onerror = function (error) {
- return _overrideError(reject, error);
- };
- });
- });
-}
-/**
- * Initiate bulk database request by reusing the same transaction to perform the operation
- *
- * @param {string} storeName
- * @param {Array} target
- * @param {string} action
- * @param {string} mode
- * @returns {Promise}
- * @private
- */
-
+ });
+ }
+ /**
+ * Handle database upgrade/initialization
+ * - store activity state from memory if database unexpectedly got lost in the middle of the window session
+ * - migrate data from localStorage if available on browser upgrade
+ */
-function _initBulkRequest(_ref7) {
- var storeName = _ref7.storeName,
- target = _ref7.target,
- action = _ref7.action,
- mode = _ref7.mode;
- return _open().then(function () {
- return new _Promise(function (resolve, reject) {
- if (!target || target && !target.length) {
- return reject({
- name: 'NoTargetDefined',
- message: "No array provided to perform ".concat(action, " bulk operation into \"").concat(storeName, "\" store")
+ }, {
+ key: "handleUpgradeNeeded",
+ value: function handleUpgradeNeeded(e
+ /*: IDBVersionChangeEvent*/
+ , reject
+ /*: (reason: any) => void*/
+ ) {
+ var db = e.target.result;
+ e.target.transaction.onerror = reject;
+ e.target.transaction.onabort = reject;
+ var storeNames = scheme_map.storeNames.left;
+ var activityState = activity_state.current || {};
+ var inMemoryAvailable = activityState && !isEmpty(activityState);
+ entries(storeNames).filter(function (_ref3) {
+ var _ref4 = slicedToArray_default()(_ref3, 2),
+ store = _ref4[1];
+
+ return !store.permanent;
+ }).forEach(function (_ref5) {
+ var _ref6 = slicedToArray_default()(_ref5, 2),
+ longStoreName = _ref6[0],
+ store = _ref6[1];
+
+ var options = scheme_map.right[longStoreName];
+ var objectStore = db.createObjectStore(store.name, {
+ keyPath: options.keyPath,
+ autoIncrement: options.autoIncrement || false
});
- }
- var _getTranStore3 = _getTranStore({
- storeName: storeName,
- mode: mode
- }, reject),
- transaction = _getTranStore3.transaction,
- store = _getTranStore3.store,
- options = _getTranStore3.options;
+ if (options.index) {
+ objectStore.createIndex("".concat(options.index, "Index"), options.index);
+ }
- var result = [];
- var current = target[0];
+ if (store.name === storeNames.activityState.name && inMemoryAvailable) {
+ objectStore.add(convertRecord({
+ storeName: longStoreName,
+ record: activityState,
+ dir: Direction.left
+ }));
+ logger.info('Activity state has been recovered');
+ } else if (quick_storage.stores[store.name]) {
+ quick_storage.stores[store.name].forEach(function (record) {
+ return objectStore.add(record);
+ });
+ logger.info("Migration from localStorage done for ".concat(longStoreName, " store"));
+ }
+ });
+ recover();
+ quick_storage.clear();
+ }
+ /**
+ * Open the database connection and create store if not existent
+ */
- transaction.oncomplete = function () {
- return resolve(result);
- };
+ }, {
+ key: "open",
+ value: function open()
+ /*: Promise<{ success: boolean }>*/
+ {
+ var _this5 = this;
+
+ if (this.indexedDbConnection) {
+ return _Promise.resolve({
+ success: true
+ });
+ }
- request(store[action](_prepareTarget(options, current, action)));
+ return this.openDatabase(this.dbName, this.dbVersion, this.handleUpgradeNeeded).then(function (connection) {
+ _this5.indexedDbConnection = connection;
- function request(req) {
- req.onerror = function (error) {
- return _overrideError(reject, error);
+ _this5.indexedDbConnection.onclose = function () {
+ return _this5.destroy;
};
- req.onsuccess = function () {
- result.push(_prepareResult(options, current) || req.result);
- current = target[result.length];
-
- if (result.length < target.length) {
- request(store[action](_prepareTarget(options, current, action)));
- }
+ return {
+ success: true
};
- }
- });
- });
-}
-/**
- * Open cursor for bulk operations or listing
- *
- * @param {string} storeName
- * @param {string} action
- * @param {IDBKeyRange=} range
- * @param {boolean=} firstOnly
- * @param {string} [mode=readonly]
- * @returns {Promise}
- * @private
- */
-
+ });
+ }
+ /**
+ * Get transaction and the store
+ */
-function _openCursor(_ref8) {
- var storeName = _ref8.storeName,
- _ref8$action = _ref8.action,
- action = _ref8$action === void 0 ? 'list' : _ref8$action,
- _ref8$range = _ref8.range,
- range = _ref8$range === void 0 ? null : _ref8$range,
- firstOnly = _ref8.firstOnly,
- _ref8$mode = _ref8.mode,
- mode = _ref8$mode === void 0 ? 'readonly' : _ref8$mode;
- return _open().then(function () {
- return new _Promise(function (resolve, reject) {
- var _getTranStore4 = _getTranStore({
+ }, {
+ key: "getTransactionStore",
+ value: function getTransactionStore(_ref7, reject
+ /*: (reason: any) => void*/
+ , db
+ /*: IDBDatabase*/
+ )
+ /*: Transaction*/
+ {
+ var storeName = _ref7.storeName,
+ mode = _ref7.mode;
+ var transaction
+ /*: IDBTransaction*/
+ = db.transaction([storeName], mode);
+ var store = transaction.objectStore(storeName);
+ var options = scheme_map.right[convertStoreName({
storeName: storeName,
- mode: mode
- }, reject),
- transaction = _getTranStore4.transaction,
- store = _getTranStore4.store,
- index = _getTranStore4.index,
- options = _getTranStore4.options;
-
- var cursorRequest = (index || store).openCursor(range);
- var items = [];
-
- transaction.oncomplete = function () {
- return resolve(firstOnly ? items[0] : items);
- };
-
- cursorRequest.onsuccess = function (e) {
- var cursor = e.target.result;
-
- if (cursor) {
- if (action === 'delete') {
- cursor.delete();
- items.push(_prepareResult(options, cursor.value) || cursor.value[options.keyPath]);
- } else {
- items.push(cursor.value);
- }
+ dir: Direction.right
+ })];
+ var index;
- if (!firstOnly) {
- cursor.continue();
- }
- }
- };
+ if (options.index) {
+ index = store.index("".concat(options.index, "Index"));
+ }
- cursorRequest.onerror = function (error) {
- return _overrideError(reject, error);
+ transaction.onerror = reject;
+ transaction.onabort = reject;
+ return {
+ transaction: transaction,
+ store: store,
+ index: index,
+ options: options
};
- });
- });
-}
-/**
- * Get all records from particular store
- *
- * @param {string} storeName
- * @param {boolean=} firstOnly
- * @returns {Promise}
- */
-
-
-function getAll(storeName, firstOnly) {
- return _openCursor({
- storeName: storeName,
- firstOnly: firstOnly
- });
-}
-/**
- * Get the first row from the store
- *
- * @param {string} storeName
- * @returns {Promise}
- */
-
-
-function getFirst(storeName) {
- return getAll(storeName, true);
-}
-/**
- * Get item from a particular store
- *
- * @param {string} storeName
- * @param {*} target
- * @returns {Promise}
- */
-
-
-function getItem(storeName, target) {
- return _initRequest({
- storeName: storeName,
- target: target,
- action: 'get'
- });
-}
-/**
- * Return filtered result by value on available index
- *
- * @param {string} storeName
- * @param {string} by
- * @returns {Promise}
- */
-
-
-function filterBy(storeName, by) {
- var range = IDBKeyRange.only(by);
- return _openCursor({
- storeName: storeName,
- range: range
- });
-}
-/**
- * Add item to a particular store
- *
- * @param {string} storeName
- * @param {Object} target
- * @returns {Promise}
- */
-
-
-function addItem(storeName, target) {
- return _initRequest({
- storeName: storeName,
- target: target,
- action: 'add',
- mode: 'readwrite'
- });
-}
-/**
- * Add multiple items into particular store
- *
- * @param {string} storeName
- * @param {Array} target
- * @param {boolean=} overwrite
- * @returns {Promise}
- */
-
-
-function addBulk(storeName, target, overwrite) {
- return _initBulkRequest({
- storeName: storeName,
- target: target,
- action: overwrite ? 'put' : 'add',
- mode: 'readwrite'
- });
-}
-/**
- * Update item in a particular store
- *
- * @param {string} storeName
- * @param {Object} target
- * @returns {Promise}
- */
-
-
-function updateItem(storeName, target) {
- return _initRequest({
- storeName: storeName,
- target: target,
- action: 'put',
- mode: 'readwrite'
- });
-}
-/**
- * Delete item from a particular store
- *
- * @param {string} storeName
- * @param {*} target
- * @returns {Promise}
- */
-
-
-function deleteItem(storeName, target) {
- return _initRequest({
- storeName: storeName,
- target: target,
- action: 'delete',
- mode: 'readwrite'
- });
-}
-/**
- * Delete items until certain bound (primary key as a bound scope)
- *
- * @param {string} storeName
- * @param {*} value
- * @param {string=} condition
- * @returns {Promise}
- */
-
-
-function deleteBulk(storeName, value, condition) {
- var range = condition ? IDBKeyRange[condition](value) : IDBKeyRange.only(value);
- return _openCursor({
- storeName: storeName,
- action: 'delete',
- range: range,
- mode: 'readwrite'
- });
-}
-/**
- * Trim the store from the left by specified length
- *
- * @param {string} storeName
- * @param {number} length
- * @returns {Promise}
- */
-
-
-function trimItems(storeName, length) {
- var options = scheme_map.right[convertStoreName({
- storeName: storeName,
- dir: 'right'
- })];
- return getAll(storeName).then(function (records) {
- return records.length ? records[length - 1] : null;
- }).then(function (record) {
- return record ? deleteBulk(storeName, record[options.keyPath], 'upperBound') : [];
- });
-}
-/**
- * Count the number of records in the store
- *
- * @param {string} storeName
- * @returns {Promise}
- */
+ }
+ /**
+ * Override the error by extracting only name and message of the error
+ */
+ }, {
+ key: "overrideError",
+ value: function overrideError(reject, error)
+ /*: Promise*/
+ {
+ var _error$target$error = error.target.error,
+ name = _error$target$error.name,
+ message = _error$target$error.message;
+ return reject({
+ name: name,
+ message: message
+ });
+ }
+ /**
+ * Get list of composite keys if available
+ */
-function indexeddb_count(storeName) {
- return _open().then(function () {
- return new _Promise(function (resolve, reject) {
- var _getTranStore5 = _getTranStore({
- storeName: storeName,
- mode: 'readonly'
- }, reject),
- store = _getTranStore5.store;
+ }, {
+ key: "getCompositeKeys",
+ value: function getCompositeKeys(options)
+ /*: Nullable>*/
+ {
+ return options.fields[options.keyPath].composite || null;
+ }
+ /**
+ * Prepare the target to be queried depending on the composite key if defined
+ */
- var request = store.count();
+ }, {
+ key: "prepareTarget",
+ value: function prepareTarget(options, target, action
+ /*: Action*/
+ ) {
+ var addOrPut = [Action.add, Action.put].indexOf(action) !== -1;
+ var composite = this.getCompositeKeys(options);
+ return composite ? addOrPut ? objectSpread2_default()(defineProperty_default()({}, options.keyPath, composite.map(function (key) {
+ return target[key];
+ }).join('')), target) : target ? target.join('') : null : target;
+ }
+ /**
+ * Prepare the result to be return depending on the composite key definition
+ */
- request.onsuccess = function () {
- return resolve(request.result);
- };
+ }, {
+ key: "prepareResult",
+ value: function prepareResult(options, target) {
+ var composite = this.getCompositeKeys(options);
+ return composite && isObject(target) ? composite.map(function (key) {
+ return target[key];
+ }) : null;
+ }
+ /**
+ * Initiate the database request
+ */
- request.onerror = function (error) {
- return _overrideError(reject, error);
- };
- });
- });
-}
-/**
- * Clear all records from a particular store
- *
- * @param {string} storeName
- * @returns {Promise}
- */
+ }, {
+ key: "initRequest",
+ value: function initRequest(_ref8)
+ /*: Promise*/
+ {
+ var _this6 = this;
+
+ var storeName = _ref8.storeName,
+ _ref8$target = _ref8.target,
+ target = _ref8$target === void 0 ? null : _ref8$target,
+ action = _ref8.action,
+ _ref8$mode = _ref8.mode,
+ mode = _ref8$mode === void 0 ? 'readonly' : _ref8$mode;
+ return this.open().then(function () {
+ return new _Promise(function (resolve, reject) {
+ if (!_this6.indexedDbConnection) {
+ reject(_this6.noConnectionError);
+ } else {
+ var _this6$getTransaction = _this6.getTransactionStore({
+ storeName: storeName,
+ mode: mode
+ }, reject, _this6.indexedDbConnection),
+ store = _this6$getTransaction.store,
+ options = _this6$getTransaction.options;
+
+ var request = store[action](_this6.prepareTarget(options, target, action));
+
+ var _result = _this6.prepareResult(options, target);
+
+ request.onsuccess = function () {
+ if (action === Action.get && !request.result) {
+ reject({
+ name: 'NotRecordFoundError',
+ message: "Requested record not found in \"".concat(storeName, "\" store")
+ });
+ } else {
+ resolve(_result || request.result || target);
+ }
+ };
+
+ request.onerror = function (error) {
+ return _this6.overrideError(reject, error);
+ };
+ }
+ });
+ });
+ }
+ /**
+ * Initiate bulk database request by reusing the same transaction to perform the operation
+ */
+ }, {
+ key: "initBulkRequest",
+ value: function initBulkRequest(_ref9)
+ /*: Promise*/
+ {
+ var _this7 = this;
+
+ var storeName = _ref9.storeName,
+ target = _ref9.target,
+ action = _ref9.action,
+ _ref9$mode = _ref9.mode,
+ mode = _ref9$mode === void 0 ? 'readwrite' : _ref9$mode;
-function indexeddb_clear(storeName) {
- return _initRequest({
- storeName: storeName,
- action: 'clear',
- mode: 'readwrite'
- });
-}
-/**
- * Close db connection and delete the db
- * WARNING: should be used only by adjust's demo app!
- *
- * @returns {Promise}
- * @private
- */
+ if (!target || target && !target.length) {
+ return _Promise.reject({
+ name: 'NoTargetDefined',
+ message: "No array provided to perform ".concat(action, " bulk operation into \"").concat(storeName, "\" store")
+ });
+ }
+ return this.open().then(function () {
+ return new _Promise(function (resolve, reject) {
+ if (!_this7.indexedDbConnection) {
+ reject(_this7.noConnectionError);
+ } else {
+ var _this7$getTransaction = _this7.getTransactionStore({
+ storeName: storeName,
+ mode: mode
+ }, reject, _this7.indexedDbConnection),
+ transaction = _this7$getTransaction.transaction,
+ store = _this7$getTransaction.store,
+ options = _this7$getTransaction.options;
-function __delete() {
- var indexedDB = _getIDB();
+ var _result2 = new Array();
- indexeddb_destroy();
- return new _Promise(function (resolve, reject) {
- var request = indexedDB.deleteDatabase(_dbName);
+ var current = target[0];
- request.onerror = function (error) {
- return _overrideError(reject, error);
- };
+ transaction.oncomplete = function () {
+ return resolve(_result2);
+ };
- request.onsuccess = function (e) {
- resolve(e.result);
- };
+ var request = function request(req) {
+ req.onerror = function (error) {
+ return _this7.overrideError(reject, error);
+ };
- request.onerror = function (e) {
- return reject(e.target);
- };
+ req.onsuccess = function () {
+ _result2.push(_this7.prepareResult(options, current) || req.result);
- request.onblocked = function (e) {
- return reject(e.target);
- };
- });
-}
-/**
- * Close the database and destroy the reference to it
- */
+ current = target[_result2.length];
+ if (_result2.length < target.length) {
+ request(store[action](_this7.prepareTarget(options, current, action)));
+ }
+ };
+ };
-function indexeddb_destroy() {
- if (_db) {
- _db.close();
- }
+ request(store[action](_this7.prepareTarget(options, current, action)));
+ }
+ });
+ });
+ }
+ /**
+ * Open cursor for bulk operations or listing
+ */
- _db = null;
-}
+ }, {
+ key: "openCursor",
+ value: function openCursor(_ref10)
+ /*: Promise>*/
+ {
+ var _this8 = this;
+
+ var storeName = _ref10.storeName,
+ action = _ref10.action,
+ _ref10$range = _ref10.range,
+ range = _ref10$range === void 0 ? null : _ref10$range,
+ _ref10$firstOnly = _ref10.firstOnly,
+ firstOnly = _ref10$firstOnly === void 0 ? false : _ref10$firstOnly,
+ _ref10$mode = _ref10.mode,
+ mode = _ref10$mode === void 0 ? 'readonly' : _ref10$mode;
+ return this.open().then(function () {
+ return new _Promise(function (resolve, reject) {
+ if (!_this8.indexedDbConnection) {
+ reject(_this8.noConnectionError);
+ } else {
+ var _this8$getTransaction = _this8.getTransactionStore({
+ storeName: storeName,
+ mode: mode
+ }, reject, _this8.indexedDbConnection),
+ transaction = _this8$getTransaction.transaction,
+ store = _this8$getTransaction.store,
+ index = _this8$getTransaction.index,
+ options = _this8$getTransaction.options;
+
+ var cursorRequest
+ /*: OpenIDBCursorRequest*/
+ = (index || store).openCursor(range);
+ var items = new Array();
+
+ transaction.oncomplete = function () {
+ return resolve(firstOnly ? items[0] : items);
+ };
+
+ cursorRequest.onsuccess = function (e) {
+ var cursor = e.target.result;
+
+ if (cursor) {
+ if (action === Action.delete) {
+ cursor.delete();
+ items.push(_this8.prepareResult(options, cursor.value) || cursor.value[options.keyPath]);
+ } else {
+ items.push(cursor.value);
+ }
+
+ if (!firstOnly) {
+ cursor.continue();
+ }
+ }
+ };
+
+ cursorRequest.onerror = function (error) {
+ return _this8.overrideError(reject, error);
+ };
+ }
+ });
+ });
+ }
+ }, {
+ key: "deleteDatabaseByName",
+ value: function deleteDatabaseByName(dbName
+ /*: string*/
+ )
+ /*: Promise*/
+ {
+ var _this9 = this;
+
+ return new _Promise(function (resolve, reject) {
+ var request = _this9.idbFactory.deleteDatabase(dbName);
+
+ request.onerror = function (error) {
+ return _this9.overrideError(reject, error);
+ };
+ request.onsuccess = resolve;
-// CONCATENATED MODULE: ./src/sdk/storage/localstorage.js
+ request.onblocked = function (e) {
+ return reject(e.target);
+ };
+ });
+ }
+ /**
+ * Get all records from particular store
+ */
+ }, {
+ key: "getAll",
+ value: function getAll(storeName
+ /*: string*/
+ )
+ /*: Promise>*/
+ {
+ var firstOnly = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+ return this.openCursor({
+ storeName: storeName,
+ action: Action.list,
+ firstOnly: firstOnly
+ });
+ }
+ /**
+ * Get the first row from the store
+ */
+ }, {
+ key: "getFirst",
+ value: function getFirst(storeName
+ /*: string*/
+ )
+ /*: Promise*/
+ {
+ return this.getAll(storeName, true);
+ }
+ /**
+ * Get item from a particular store
+ */
+ }, {
+ key: "getItem",
+ value: function getItem(storeName
+ /*: string*/
+ , target
+ /*: any*/
+ )
+ /*: Promise*/
+ {
+ return this.initRequest({
+ storeName: storeName,
+ target: target,
+ action: Action.get
+ });
+ }
+ /**
+ * Return filtered result by value on available index
+ */
+ }, {
+ key: "filterBy",
+ value: function filterBy(storeName
+ /*: string*/
+ , by
+ /*: string*/
+ )
+ /*: Promise*/
+ {
+ var range = IDBKeyRange.only(by);
+ return this.openCursor({
+ storeName: storeName,
+ action: Action.list,
+ range: range
+ });
+ }
+ /**
+ * Add item to a particular store
+ */
-var localstorage_Promise = typeof Promise === 'undefined' ? __webpack_require__(3).Promise : Promise;
+ }, {
+ key: "addItem",
+ value: function addItem(storeName
+ /*: string*/
+ , target)
+ /*: Promise*/
+ {
+ return this.initRequest({
+ storeName: storeName,
+ target: target,
+ action: Action.add,
+ mode: 'readwrite'
+ });
+ }
+ /**
+ * Add multiple items into particular store
+ */
+ }, {
+ key: "addBulk",
+ value: function addBulk(storeName
+ /*: string*/
+ , target, overwrite
+ /*: boolean*/
+ )
+ /*: Promise*/
+ {
+ return this.initBulkRequest({
+ storeName: storeName,
+ target: target,
+ action: overwrite ? Action.put : Action.add,
+ mode: 'readwrite'
+ });
+ }
+ /**
+ * Update item in a particular store
+ */
+ }, {
+ key: "updateItem",
+ value: function updateItem(storeName
+ /*: string*/
+ , target)
+ /*: Promise*/
+ {
+ return this.initRequest({
+ storeName: storeName,
+ target: target,
+ action: Action.put,
+ mode: 'readwrite'
+ });
+ }
+ /**
+ * Delete item from a particular store
+ */
+ }, {
+ key: "deleteItem",
+ value: function deleteItem(storeName
+ /*: string*/
+ , target)
+ /*: Promise*/
+ {
+ return this.initRequest({
+ storeName: storeName,
+ target: target,
+ action: Action.delete,
+ mode: 'readwrite'
+ });
+ }
+ /**
+ * Delete items until certain bound (primary key as a bound scope)
+ */
+ }, {
+ key: "deleteBulk",
+ value: function deleteBulk(storeName
+ /*: string*/
+ , value
+ /*: any*/
+ , condition
+ /*: 'lowerBound' | 'upperBound'*/
+ )
+ /*: Promise*/
+ {
+ var range = condition ? IDBKeyRange[condition](value) : IDBKeyRange.only(value);
+ return this.openCursor({
+ storeName: storeName,
+ action: Action.delete,
+ range: range,
+ mode: 'readwrite'
+ });
+ }
+ /**
+ * Trim the store from the left by specified length
+ */
+ }, {
+ key: "trimItems",
+ value: function trimItems(storeName
+ /*: string*/
+ , length
+ /*: number*/
+ )
+ /*: Promise*/
+ {
+ var _this10 = this;
+ var options = scheme_map.right[convertStoreName({
+ storeName: storeName,
+ dir: Direction.right
+ })];
+ return this.getAll(storeName).then(function (records) {
+ return records.length ? records[length - 1] : null;
+ }).then(function (record) {
+ return record ? _this10.deleteBulk(storeName, record[options.keyPath], 'upperBound') : [];
+ });
+ }
+ /**
+ * Count the number of records in the store
+ */
+ }, {
+ key: "count",
+ value: function count(storeName
+ /*: string*/
+ )
+ /*: Promise*/
+ {
+ var _this11 = this;
+
+ return this.open().then(function () {
+ return new _Promise(function (resolve, reject) {
+ if (!_this11.indexedDbConnection) {
+ reject(_this11.noConnectionError);
+ } else {
+ var _this11$getTransactio = _this11.getTransactionStore({
+ storeName: storeName,
+ mode: 'readonly'
+ }, reject, _this11.indexedDbConnection),
+ store = _this11$getTransactio.store;
-/**
- * Check if LocalStorage is supported in the current browser
- *
- * @returns {boolean}
- */
+ var request = store.count();
-function localstorage_isSupported() {
- var uid = new Date().toString();
- var storage;
- var result;
+ request.onsuccess = function () {
+ return resolve(request.result);
+ };
- try {
- (storage = window.localStorage).setItem(uid, uid);
- result = storage.getItem(uid) === uid;
- storage.removeItem(uid);
- return !!(result && storage);
- } catch (exception) {
- logger.warn('LocalStorage is not supported in this browser');
- return false;
- }
-}
-/**
- * Prepare schema details if not existent
- *
- * @private
- */
+ request.onerror = function (error) {
+ return _this11.overrideError(reject, error);
+ };
+ }
+ });
+ });
+ }
+ /**
+ * Clear all records from a particular store
+ */
+ }, {
+ key: "clear",
+ value: function clear(storeName
+ /*: string*/
+ )
+ /*: Promise*/
+ {
+ return this.initRequest({
+ storeName: storeName,
+ action: Action.clear,
+ mode: 'readwrite'
+ });
+ }
+ /**
+ * Close the database and destroy the reference to it
+ */
-function localstorage_open() {
- if (!localstorage_isSupported()) {
- return {
- status: 'error',
- error: {
- name: 'LSNotSupported',
- message: 'LocalStorage is not supported'
+ }, {
+ key: "destroy",
+ value: function destroy() {
+ if (this.indexedDbConnection) {
+ this.indexedDbConnection.close();
}
- };
- }
- var storeNames = scheme_map.storeNames.left;
- var activityState = activity_state.current || {};
- var inMemoryAvailable = activityState && !isEmpty(activityState);
- entries(storeNames).filter(function (_ref) {
- var _ref2 = slicedToArray_default()(_ref, 2),
- store = _ref2[1];
-
- return !store.permanent;
- }).forEach(function (_ref3) {
- var _ref4 = slicedToArray_default()(_ref3, 2),
- longStoreName = _ref4[0],
- store = _ref4[1];
-
- var asStoreName = storeNames.activityState.name;
+ this.indexedDbConnection = null;
+ }
+ /**
+ * Close db connection and delete the db
+ * WARNING: should be used only by adjust's demo app!
+ */
- if (store.name === asStoreName && !quick_storage.stores[asStoreName]) {
- quick_storage.stores[asStoreName] = inMemoryAvailable ? [convertRecord({
- storeName: longStoreName,
- record: activityState,
- dir: 'left'
- })] : [];
- } else if (!quick_storage.stores[store.name]) {
- quick_storage.stores[store.name] = [];
+ }, {
+ key: "deleteDatabase",
+ value: function deleteDatabase()
+ /*: Promise*/
+ {
+ this.destroy();
+ return this.deleteDatabaseByName(this.dbName);
}
- });
- recover();
- return {
- status: 'success'
- };
-}
-/**
- * Get list of composite keys if available
- * @param options
- * @returns {Array|null}
- * @private
- */
+ }]);
+ return IndexedDBWrapper;
+}();
-function localstorage_getCompositeKeys(options) {
- return options.fields[options.keyPath].composite || null;
-}
-/**
- * Get composite keys when defined or fallback to primary key for particular store
- *
- * @param {string} storeName
- * @returns {Array}
- * @private
- */
+defineProperty_default()(indexeddb_IndexedDBWrapper, "dbValidationName", 'validate-db-openable');
+defineProperty_default()(indexeddb_IndexedDBWrapper, "isSupportedPromise", null);
-function _getKeys(storeName) {
- var options = scheme_map.right[convertStoreName({
- storeName: storeName,
- dir: 'right'
- })];
- return localstorage_getCompositeKeys(options, true) || [options.keyPath];
-}
-/**
- * Initiate quasi-database request
- *
- * @param {string} storeName
- * @param {*=} id
- * @param {Object=} item
- * @param {Function} action
- * @returns {Promise}
- * @private
- */
+// CONCATENATED MODULE: ./src/sdk/storage/localstorage.ts
-function localstorage_initRequest(_ref5, action) {
- var storeName = _ref5.storeName,
- id = _ref5.id,
- item = _ref5.item;
- var open = localstorage_open();
- var options = scheme_map.right[convertStoreName({
- storeName: storeName,
- dir: 'right'
- })];
- if (open.status === 'error') {
- return localstorage_Promise.reject(open.error);
- }
- return new localstorage_Promise(function (resolve, reject) {
- var items = quick_storage.stores[storeName];
- var keys = _getKeys(storeName);
- var ids = id instanceof Array ? id.slice() : [id];
- var lastId = (items[items.length - 1] || {})[options.keyPath] || 0;
- var target = id ? keys.map(function (key, index) {
- return [key, ids[index]];
- }).reduce(reducer, {}) : objectSpread2_default()({}, item);
- var index = target ? findIndex(items, keys, target) : null;
- return action(resolve, reject, {
- keys: keys,
- items: items,
- index: index,
- options: options,
- lastId: lastId
- });
- });
-}
-/**
- * Sort the array by provided key (key can be a composite one)
- * - by default sorts in ascending order by primary keys
- * - force order by provided value
- *
- * @param {Array} items
- * @param {Array} keys
- * @param {string=} exact
- * @returns {Array}
- * @private
- */
+var localstorage_Promise = typeof Promise === 'undefined' ? __webpack_require__(3).Promise : Promise;
-function _sort(items, keys, exact) {
- var clone = toConsumableArray_default()(items);
- var reversed = keys.slice().reverse();
- function compare(a, b, key) {
- var expr1 = exact ? exact === a[key] : a[key] < b[key];
- var expr2 = exact ? exact > a[key] : a[key] > b[key];
- return expr1 ? -1 : expr2 ? 1 : 0;
- }
- return clone.sort(function (a, b) {
- return reversed.reduce(function (acc, key) {
- return acc || compare(a, b, key);
- }, 0);
- });
-}
-/**
- * Prepare the target to be queried depending on the composite key if defined
- *
- * @param {Object} options
- * @param {*} target
- * @param {number} next
- * @returns {*}
- * @private
- */
-function localstorage_prepareTarget(options, target, next) {
- var composite = localstorage_getCompositeKeys(options);
- return composite ? objectSpread2_default()(defineProperty_default()({}, options.keyPath, composite.map(function (key) {
- return target[key];
- }).join('')), target) : options.autoIncrement && next ? objectSpread2_default()(defineProperty_default()({}, options.keyPath, next), target) : objectSpread2_default()({}, target);
-}
-/**
- * Prepare the result to be return depending on the composite key definition
- *
- * @param {Object} options
- * @param {Object} target
- * @returns {*}
- * @private
- */
+var localstorage_LocalStorageWrapper = /*#__PURE__*/function () {
+ function LocalStorageWrapper() {
+ classCallCheck_default()(this, LocalStorageWrapper);
+ }
-function localstorage_prepareResult(options, target) {
- var composite = localstorage_getCompositeKeys(options);
+ createClass_default()(LocalStorageWrapper, [{
+ key: "open",
- return composite && isObject(target) ? composite.map(function (key) {
- return target[key];
- }) : target[options.keyPath] || target;
-}
-/**
- * Get all records from particular store
- *
- * @param {string} storeName
- * @param {boolean=} firstOnly
- * @returns {Promise}
- */
+ /**
+ * Prepare schema details if not existent
+ */
+ value: function open()
+ /*: Promise*/
+ {
+ return LocalStorageWrapper.isSupported().then(function (supported) {
+ if (!supported) {
+ return {
+ status: 'error',
+ error: {
+ name: 'LSNotSupported',
+ message: 'LocalStorage is not supported'
+ }
+ };
+ }
+
+ var storeNames = scheme_map.storeNames.left;
+ var activityState = activity_state.current || {};
+ var inMemoryAvailable = activityState && !isEmpty(activityState);
+ entries(storeNames).filter(function (_ref) {
+ var _ref2 = slicedToArray_default()(_ref, 2),
+ store = _ref2[1];
+
+ return !store.permanent;
+ }).forEach(function (_ref3) {
+ var _ref4 = slicedToArray_default()(_ref3, 2),
+ longStoreName = _ref4[0],
+ store = _ref4[1];
+
+ var asStoreName = storeNames.activityState.name;
+
+ if (store.name === asStoreName && !quick_storage.stores[asStoreName]) {
+ quick_storage.stores[asStoreName] = inMemoryAvailable ? [convertRecord({
+ storeName: longStoreName,
+ record: activityState,
+ dir: Direction.left
+ })] : [];
+ } else if (!quick_storage.stores[store.name]) {
+ quick_storage.stores[store.name] = [];
+ }
+ });
+ recover();
+ return {
+ status: 'success'
+ };
+ });
+ }
+ /**
+ * Get list of composite keys if available
+ * @param options
+ * @returns {Array|null}
+ * @private
+ */
+ }, {
+ key: "getCompositeKeys",
+ value: function getCompositeKeys(options) {
+ return options.fields[options.keyPath].composite || null;
+ }
+ /**
+ * Get composite keys when defined or fallback to primary key for particular store
+ *
+ * @param {string} storeName
+ * @returns {Array}
+ * @private
+ */
-function localstorage_getAll(storeName, firstOnly) {
- var open = localstorage_open();
+ }, {
+ key: "getKeys",
+ value: function getKeys(storeName) {
+ var options = scheme_map.right[convertStoreName({
+ storeName: storeName,
+ dir: Direction.right
+ })];
+ return this.getCompositeKeys(options) || [options.keyPath];
+ }
+ /**
+ * Initiate quasi-database request
+ *
+ * @param {string} storeName
+ * @param {*=} id
+ * @param {Object=} item
+ * @param {Function} action
+ * @returns {Promise}
+ * @private
+ */
- if (open.status === 'error') {
- return localstorage_Promise.reject(open.error);
- }
+ }, {
+ key: "initRequest",
+ value: function initRequest(_ref5, action
+ /*: Action*/
+ ) {
+ var _this = this;
- return new localstorage_Promise(function (resolve, reject) {
- var value = quick_storage.stores[storeName];
+ var storeName = _ref5.storeName,
+ id = _ref5.id,
+ item = _ref5.item;
+ var options = scheme_map.right[convertStoreName({
+ storeName: storeName,
+ dir: Direction.right
+ })];
+ return this.open().then(function (open) {
+ if (open.status === 'error') {
+ return localstorage_Promise.reject(open.error);
+ }
- if (value instanceof Array) {
- resolve(firstOnly ? value[0] : _sort(value, _getKeys(storeName)));
- } else {
- reject({
- name: 'NotFoundError',
- message: "No objectStore named ".concat(storeName, " in this database")
+ return new localstorage_Promise(function (resolve, reject) {
+ var items = quick_storage.stores[storeName];
+
+ var keys = _this.getKeys(storeName);
+
+ var ids = id instanceof Array ? id.slice() : [id];
+ var lastId = (items[items.length - 1] || {})[options.keyPath] || 0;
+ var target = id ? keys.map(function (key, index) {
+ return [key, ids[index]];
+ }).reduce(reducer, {}) : objectSpread2_default()({}, item);
+ var index = target ? findIndex(items, keys, target) : null;
+ return action(resolve, reject, {
+ keys: keys,
+ items: items,
+ index: index,
+ options: options,
+ lastId: lastId
+ });
+ });
});
}
- });
-}
-/**
- * Get the first row from the store
- *
- * @param {string} storeName
- * @returns {Promise}
- */
+ /**
+ * Sort the array by provided key (key can be a composite one)
+ * - by default sorts in ascending order by primary keys
+ * - force order by provided value
+ *
+ * @param {Array} items
+ * @param {Array} keys
+ * @param {string=} exact
+ * @returns {Array}
+ * @private
+ */
+ }, {
+ key: "sort",
+ value: function sort(items, keys, exact
+ /*: string*/
+ ) {
+ var clone = toConsumableArray_default()(items);
-function localstorage_getFirst(storeName) {
- return localstorage_getAll(storeName, true);
-}
-/**
- * Get item from a particular store
- *
- * @param {string} storeName
- * @param {*} id
- * @returns {Promise}
- */
+ var reversed = keys.slice().reverse();
+ function compare(a, b, key) {
+ var expr1 = exact ? exact === a[key] : a[key] < b[key];
+ var expr2 = exact ? exact > a[key] : a[key] > b[key];
+ return expr1 ? -1 : expr2 ? 1 : 0;
+ }
-function localstorage_getItem(storeName, id) {
- return localstorage_initRequest({
- storeName: storeName,
- id: id
- }, function (resolve, reject, _ref6) {
- var items = _ref6.items,
- index = _ref6.index,
- options = _ref6.options;
-
- if (index === -1) {
- reject({
- name: 'NotRecordFoundError',
- message: "Requested record not found in \"".concat(storeName, "\" store")
+ return clone.sort(function (a, b) {
+ return reversed.reduce(function (acc, key) {
+ return acc || compare(a, b, key);
+ }, 0);
});
- } else {
- resolve(localstorage_prepareTarget(options, items[index]));
}
- });
-}
-/**
- * Return filtered result by value on available index
- *
- * @param {string} storeName
- * @param {string} by
- * @returns {Promise}
- */
+ /**
+ * Prepare the target to be queried depending on the composite key if defined
+ *
+ * @param {Object} options
+ * @param {*} target
+ * @param {number} next
+ * @returns {*}
+ * @private
+ */
+ }, {
+ key: "prepareTarget",
+ value: function prepareTarget(options, target
+ /*: any*/
+ , next
+ /*: number*/
+ ) {
+ var composite = this.getCompositeKeys(options);
+ return composite ? objectSpread2_default()(defineProperty_default()({}, options.keyPath, composite.map(function (key) {
+ return target[key];
+ }).join('')), target) : options.autoIncrement && next ? objectSpread2_default()(defineProperty_default()({}, options.keyPath, next), target) : objectSpread2_default()({}, target);
+ }
+ /**
+ * Prepare the result to be return depending on the composite key definition
+ *
+ * @param {Object} options
+ * @param {Object} target
+ * @returns {*}
+ * @private
+ */
-function localstorage_filterBy(storeName, by) {
- return localstorage_getAll(storeName).then(function (result) {
- return result.filter(function (item) {
- return item[scheme_map.right[convertStoreName({
- storeName: storeName,
- dir: 'right'
- })].index] === by;
- });
- });
-}
-/**
- * Add item to a particular store
- *
- * @param {string} storeName
- * @param {Object} item
- * @returns {Promise}
- */
+ }, {
+ key: "prepareResult",
+ value: function prepareResult(options, target) {
+ var composite = this.getCompositeKeys(options);
+ return composite && isObject(target) ? composite.map(function (key) {
+ return target[key];
+ }) : target[options.keyPath] || target;
+ }
+ /**
+ * Get all records from particular store
+ *
+ * @param {string} storeName
+ * @param {boolean=} firstOnly
+ * @returns {Promise}
+ */
+
+ }, {
+ key: "getAll",
+ value: function getAll(storeName
+ /*: string*/
+ , firstOnly
+ /*: boolean*/
+ )
+ /*: Promise>*/
+ {
+ var _this2 = this;
+
+ return this.open().then(function (open) {
+ if (open.status === 'error') {
+ return localstorage_Promise.reject(open.error);
+ }
+ return new localstorage_Promise(function (resolve, reject) {
+ var value = quick_storage.stores[storeName];
-function localstorage_addItem(storeName, item) {
- return localstorage_initRequest({
- storeName: storeName,
- item: item
- }, function (resolve, reject, _ref7) {
- var items = _ref7.items,
- index = _ref7.index,
- options = _ref7.options,
- lastId = _ref7.lastId;
-
- if (index !== -1) {
- reject({
- name: 'ConstraintError',
- message: "Constraint was not satisfied, trying to add existing item into \"".concat(storeName, "\" store")
+ if (value instanceof Array) {
+ resolve(firstOnly ? value[0] : _this2.sort(value, _this2.getKeys(storeName)));
+ } else {
+ reject({
+ name: 'NotFoundError',
+ message: "No objectStore named ".concat(storeName, " in this database")
+ });
+ }
+ });
});
- } else {
- items.push(localstorage_prepareTarget(options, item, lastId + 1));
- quick_storage.stores[storeName] = items;
- resolve(localstorage_prepareResult(options, item));
}
- });
-}
-/**
- * Add multiple items into particular store
- *
- * @param {string} storeName
- * @param {Object} target
- * @param {boolean=} overwrite
- * @returns {Promise}
- */
+ /**
+ * Get the first row from the store
+ *
+ * @param {string} storeName
+ * @returns {Promise}
+ */
+ }, {
+ key: "getFirst",
+ value: function getFirst(storeName
+ /*: string*/
+ )
+ /*: Promise*/
+ {
+ return this.getAll(storeName, true);
+ }
+ /**
+ * Get item from a particular store
+ *
+ * @param {string} storeName
+ * @param {*} id
+ * @returns {Promise}
+ */
-function localstorage_addBulk(storeName, target, overwrite) {
- return localstorage_initRequest({
- storeName: storeName
- }, function (resolve, reject, _ref8) {
- var keys = _ref8.keys,
- items = _ref8.items,
- options = _ref8.options,
- lastId = _ref8.lastId;
+ }, {
+ key: "getItem",
+ value: function getItem(storeName
+ /*: string*/
+ , id)
+ /*: Promise*/
+ {
+ var _this3 = this;
+
+ return this.initRequest({
+ storeName: storeName,
+ id: id
+ }, function (resolve, reject, _ref6) {
+ var items = _ref6.items,
+ index = _ref6.index,
+ options = _ref6.options;
- if (!target || target && !target.length) {
- return reject({
- name: 'NoTargetDefined',
- message: "No array provided to perform add bulk operation into \"".concat(storeName, "\" store")
+ if (index === -1) {
+ reject({
+ name: 'NotRecordFoundError',
+ message: "Requested record not found in \"".concat(storeName, "\" store")
+ });
+ } else {
+ resolve(_this3.prepareTarget(options, items[index]));
+ }
});
}
+ /**
+ * Return filtered result by value on available index
+ *
+ * @param {string} storeName
+ * @param {string} by
+ * @returns {Promise}
+ */
- var id = lastId;
- var newItems = target.map(function (item) {
- return localstorage_prepareTarget(options, item, ++id);
- });
- var overlapping = newItems.filter(function (item) {
- return findIndex(items, keys, item) !== -1;
- }).map(function (item) {
- return item[options.keyPath];
- });
- var currentItems = overwrite ? items.filter(function (item) {
- return overlapping.indexOf(item[options.keyPath]) === -1;
- }) : toConsumableArray_default()(items);
-
- if (overlapping.length && !overwrite) {
- reject({
- name: 'ConstraintError',
- message: "Constraint was not satisfied, trying to add existing items into \"".concat(storeName, "\" store")
+ }, {
+ key: "filterBy",
+ value: function filterBy(storeName
+ /*: string*/
+ , by
+ /*: string*/
+ )
+ /*: Promise*/
+ {
+ return this.getAll(storeName).then(function (result) {
+ return result.filter(function (item) {
+ return item[scheme_map.right[convertStoreName({
+ storeName: storeName,
+ dir: Direction.right
+ })].index] === by;
+ });
});
- } else {
- quick_storage.stores[storeName] = _sort([].concat(toConsumableArray_default()(currentItems), toConsumableArray_default()(newItems)), keys);
- resolve(target.map(function (item) {
- return localstorage_prepareResult(options, item);
- }));
}
- });
-}
-/**
- * Update item in a particular store
- *
- * @param {string} storeName
- * @param {Object} item
- * @returns {Promise}
- */
+ /**
+ * Add item to a particular store
+ *
+ * @param {string} storeName
+ * @param {Object} item
+ * @returns {Promise}
+ */
-
-function localstorage_updateItem(storeName, item) {
- return localstorage_initRequest({
- storeName: storeName,
- item: item
- }, function (resolve, _, _ref9) {
- var items = _ref9.items,
- index = _ref9.index,
- options = _ref9.options,
- lastId = _ref9.lastId;
- var nextId = index === -1 ? lastId + 1 : null;
-
- var target = localstorage_prepareTarget(options, item, nextId);
-
- if (index === -1) {
- items.push(target);
- } else {
- items.splice(index, 1, target);
+ }, {
+ key: "addItem",
+ value: function addItem(storeName
+ /*: string*/
+ , item)
+ /*: Promise*/
+ {
+ var _this4 = this;
+
+ return this.initRequest({
+ storeName: storeName,
+ item: item
+ }, function (resolve, reject, _ref7) {
+ var items = _ref7.items,
+ index = _ref7.index,
+ options = _ref7.options,
+ lastId = _ref7.lastId;
+
+ if (index !== -1) {
+ reject({
+ name: 'ConstraintError',
+ message: "Constraint was not satisfied, trying to add existing item into \"".concat(storeName, "\" store")
+ });
+ } else {
+ items.push(_this4.prepareTarget(options, item, lastId + 1));
+ quick_storage.stores[storeName] = items;
+ resolve(_this4.prepareResult(options, item));
+ }
+ });
}
+ /**
+ * Add multiple items into particular store
+ *
+ * @param {string} storeName
+ * @param {Object} target
+ * @param {boolean=} overwrite
+ * @returns {Promise}
+ */
- quick_storage.stores[storeName] = items;
- resolve(localstorage_prepareResult(options, item));
- });
-}
-/**
- * Delete item from a particular store
- *
- * @param {string} storeName
- * @param {*} id
- * @returns {Promise}
- */
-
+ }, {
+ key: "addBulk",
+ value: function addBulk(storeName
+ /*: string*/
+ , target, overwrite
+ /*: boolean*/
+ )
+ /*: Promise*/
+ {
+ var _this5 = this;
+
+ return this.initRequest({
+ storeName: storeName
+ }, function (resolve, reject, _ref8) {
+ var keys = _ref8.keys,
+ items = _ref8.items,
+ options = _ref8.options,
+ lastId = _ref8.lastId;
+
+ if (!target || target && !target.length) {
+ return reject({
+ name: 'NoTargetDefined',
+ message: "No array provided to perform add bulk operation into \"".concat(storeName, "\" store")
+ });
+ }
-function localstorage_deleteItem(storeName, id) {
- return localstorage_initRequest({
- storeName: storeName,
- id: id
- }, function (resolve, _, _ref10) {
- var items = _ref10.items,
- index = _ref10.index;
+ var id = lastId;
+ var newItems = target.map(function (item) {
+ return _this5.prepareTarget(options, item, ++id);
+ });
+ var overlapping = newItems.filter(function (item) {
+ return findIndex(items, keys, item) !== -1;
+ }).map(function (item) {
+ return item[options.keyPath];
+ });
+ var currentItems = overwrite ? items.filter(function (item) {
+ return overlapping.indexOf(item[options.keyPath]) === -1;
+ }) : toConsumableArray_default()(items);
- if (index !== -1) {
- items.splice(index, 1);
- quick_storage.stores[storeName] = items;
+ if (overlapping.length && !overwrite) {
+ reject({
+ name: 'ConstraintError',
+ message: "Constraint was not satisfied, trying to add existing items into \"".concat(storeName, "\" store")
+ });
+ } else {
+ quick_storage.stores[storeName] = _this5.sort([].concat(toConsumableArray_default()(currentItems), toConsumableArray_default()(newItems)), keys);
+ resolve(target.map(function (item) {
+ return _this5.prepareResult(options, item);
+ }));
+ }
+ });
}
+ /**
+ * Update item in a particular store
+ *
+ * @param {string} storeName
+ * @param {Object} item
+ * @returns {Promise}
+ */
- resolve(id);
- });
-}
-/**
- * Find index of the item with the closest value to the bound
- *
- * @param {Array} array
- * @param {string} key
- * @param {number|string} value
- * @returns {number}
- * @private
- */
-
+ }, {
+ key: "updateItem",
+ value: function updateItem(storeName
+ /*: string*/
+ , item)
+ /*: Promise*/
+ {
+ var _this6 = this;
+
+ return this.initRequest({
+ storeName: storeName,
+ item: item
+ }, function (resolve, _, _ref9) {
+ var items = _ref9.items,
+ index = _ref9.index,
+ options = _ref9.options,
+ lastId = _ref9.lastId;
+ var nextId = index === -1 ? lastId + 1 : null;
+
+ var target = _this6.prepareTarget(options, item, nextId);
+
+ if (index === -1) {
+ items.push(target);
+ } else {
+ items.splice(index, 1, target);
+ }
-function _findMax(array, key, value) {
- if (!array.length) {
- return -1;
- }
+ quick_storage.stores[storeName] = items;
+ resolve(_this6.prepareResult(options, item));
+ });
+ }
+ /**
+ * Delete item from a particular store
+ *
+ * @param {string} storeName
+ * @param {*} id
+ * @returns {Promise}
+ */
- var max = {
- index: -1,
- value: isNaN(value) ? '' : 0
- };
+ }, {
+ key: "deleteItem",
+ value: function deleteItem(storeName
+ /*: string*/
+ , id)
+ /*: Promise*/
+ {
+ return this.initRequest({
+ storeName: storeName,
+ id: id
+ }, function (resolve, _, _ref10) {
+ var items = _ref10.items,
+ index = _ref10.index;
+
+ if (index !== -1) {
+ items.splice(index, 1);
+ quick_storage.stores[storeName] = items;
+ }
- for (var i = 0; i < array.length; i += 1) {
- if (array[i][key] <= value) {
- if (array[i][key] >= max.value) {
- max = {
- value: array[i][key],
- index: i
- };
- }
- } else {
- return max.index;
+ resolve(id);
+ });
}
- }
-
- return max.index;
-}
-/**
- * Delete items until certain bound (primary key as a bound scope)
- *
- * @param {string} storeName
- * @param {*} value
- * @param {string=} condition
- * @returns {Promise}
- */
+ /**
+ * Find index of the item with the closest value to the bound
+ *
+ * @param {Array} array
+ * @param {string} key
+ * @param {number|string} value
+ * @returns {number}
+ * @private
+ */
+ }, {
+ key: "findMax",
+ value: function findMax(array, key, value) {
+ if (!array.length) {
+ return -1;
+ }
-function localstorage_deleteBulk(storeName, value, condition) {
- return localstorage_getAll(storeName).then(function (items) {
- var keys = _getKeys(storeName);
+ var max = {
+ index: -1,
+ value: isNaN(value) ? '' : 0
+ };
- var key = scheme_map.right[convertStoreName({
- storeName: storeName,
- dir: 'right'
- })].index || keys[0];
- var exact = condition ? null : value;
+ for (var i = 0; i < array.length; i += 1) {
+ if (array[i][key] <= value) {
+ if (array[i][key] >= max.value) {
+ max = {
+ value: array[i][key],
+ index: i
+ };
+ }
+ } else {
+ return max.index;
+ }
+ }
- var sorted = _sort(items, keys, exact);
+ return max.index;
+ }
+ /**
+ * Delete items until certain bound (primary key as a bound scope)
+ *
+ * @param {string} storeName
+ * @param {*} value
+ * @param {string=} condition
+ * @returns {Promise}
+ */
- var index = _findMax(sorted, key, value);
+ }, {
+ key: "deleteBulk",
+ value: function deleteBulk(storeName
+ /*: string*/
+ , value
+ /*: any*/
+ , condition
+ /*: 'lowerBound' | 'upperBound'*/
+ )
+ /*: Promise*/
+ {
+ var _this7 = this;
+
+ return this.getAll(storeName).then(function (items) {
+ var keys = _this7.getKeys(storeName);
+
+ var key = scheme_map.right[convertStoreName({
+ storeName: storeName,
+ dir: Direction.right
+ })].index || keys[0];
+ var exact = condition ? null : value;
+
+ var sorted = _this7.sort(items, keys, exact);
+
+ var index = _this7.findMax(sorted, key, value);
+
+ if (index === -1) {
+ return [];
+ }
- if (index === -1) {
- return [];
+ var start = condition === 'lowerBound' ? index : 0;
+ var end = !condition || condition === 'upperBound' ? index + 1 : sorted.length;
+ var deleted = sorted.splice(start, end).map(function (item) {
+ return keys.length === 1 ? item[key] : keys.map(function (k) {
+ return item[k];
+ });
+ });
+ quick_storage.stores[storeName] = sorted;
+ return deleted;
+ });
}
+ /**
+ * Trim the store from the left by specified length
+ *
+ * @param {string} storeName
+ * @param {number} length
+ * @returns {Promise}
+ */
- var start = condition === 'lowerBound' ? index : 0;
- var end = !condition || condition === 'upperBound' ? index + 1 : sorted.length;
- var deleted = sorted.splice(start, end).map(function (item) {
- return keys.length === 1 ? item[key] : keys.map(function (k) {
- return item[k];
- });
- });
- quick_storage.stores[storeName] = sorted;
- return deleted;
- });
-}
-/**
- * Trim the store from the left by specified length
- *
- * @param {string} storeName
- * @param {number} length
- * @returns {Promise}
- */
+ }, {
+ key: "trimItems",
+ value: function trimItems(storeName
+ /*: string*/
+ , length
+ /*: number*/
+ )
+ /*: Promise*/
+ {
+ var _this8 = this;
+ var options = scheme_map.right[convertStoreName({
+ storeName: storeName,
+ dir: Direction.right
+ })];
+ return this.getAll(storeName).then(function (records) {
+ return records.length ? records[length - 1] : null;
+ }).then(function (record) {
+ return record ? _this8.deleteBulk(storeName, record[options.keyPath], 'upperBound') : [];
+ });
+ }
+ /**
+ * Count the number of records in the store
+ *
+ * @param {string} storeName
+ * @returns {Promise}
+ */
-function localstorage_trimItems(storeName, length) {
- var open = localstorage_open();
+ }, {
+ key: "count",
+ value: function count(storeName
+ /*: string*/
+ )
+ /*: Promise*/
+ {
+ return this.open().then(function (open) {
+ if (open.status === 'error') {
+ return localstorage_Promise.reject(open.error);
+ }
- var options = scheme_map.right[convertStoreName({
- storeName: storeName,
- dir: 'right'
- })];
+ return localstorage_Promise.resolve(quick_storage.stores[storeName].length);
+ });
+ }
+ /**
+ * Clear all records from a particular store
+ *
+ * @param {string} storeName
+ * @returns {Promise}
+ */
- if (open.status === 'error') {
- return localstorage_Promise.reject(open.error);
- }
+ }, {
+ key: "clear",
+ value: function clear(storeName
+ /*: string*/
+ )
+ /*: Promise*/
+ {
+ return this.open().then(function (open) {
+ if (open.status === 'error') {
+ return localstorage_Promise.reject(open.error);
+ }
- return localstorage_getAll(storeName).then(function (records) {
- return records.length ? records[length - 1] : null;
- }).then(function (record) {
- return record ? localstorage_deleteBulk(storeName, record[options.keyPath], 'upperBound') : [];
- });
-}
-/**
- * Count the number of records in the store
- *
- * @param {string} storeName
- * @returns {Promise}
- */
+ return new localstorage_Promise(function (resolve) {
+ quick_storage.stores[storeName] = [];
+ resolve({});
+ });
+ });
+ }
+ /**
+ * Does nothing, it simply matches the common storage interface
+ */
+ }, {
+ key: "destroy",
+ value: function destroy() {} // eslint-disable-line
-function localstorage_count(storeName) {
- var open = localstorage_open();
+ /**
+ * Does nothing, it simply matches the common storage interface
+ */
- if (open.status === 'error') {
- return localstorage_Promise.reject(open.error);
- }
+ }, {
+ key: "deleteDatabase",
+ value: function deleteDatabase() {} // eslint-disable-line
+
+ }], [{
+ key: "isSupported",
+
+ /**
+ * Cached promise of LocalStorage validation
+ */
+
+ /**
+ * Check if LocalStorage is supported in the current browser
+ */
+ value: function isSupported()
+ /*: Promise*/
+ {
+ if (LocalStorageWrapper.isSupportedPromise) {
+ return LocalStorageWrapper.isSupportedPromise;
+ } else {
+ var uid = new Date().toString();
+ var storage = window.localStorage;
+ LocalStorageWrapper.isSupportedPromise = new localstorage_Promise(function (resolve
+ /*: (value: boolean) => void*/
+ ) {
+ storage.setItem(uid, uid);
+ var result = storage.getItem(uid) === uid;
+ storage.removeItem(uid);
+ var support = !!(result && storage);
+ resolve(support);
+ }).catch(function () {
+ logger.warn('LocalStorage is not supported in this browser');
+ return localstorage_Promise.resolve(false);
+ });
+ }
- return localstorage_Promise.resolve(quick_storage.stores[storeName].length);
-}
-/**
- * Clear all records from a particular store
- *
- * @param {string} storeName
- * @returns {Promise}
- */
+ return LocalStorageWrapper.isSupportedPromise;
+ }
+ }]);
+ return LocalStorageWrapper;
+}();
-function localstorage_clear(storeName) {
- var open = localstorage_open();
+defineProperty_default()(localstorage_LocalStorageWrapper, "isSupportedPromise", null);
- if (open.status === 'error') {
- return localstorage_Promise.reject(open.error);
- }
- return new localstorage_Promise(function (resolve) {
- quick_storage.stores[storeName] = [];
- resolve({});
- });
-}
-/**
- * Does nothing, it simply matches the common storage interface
- */
+// CONCATENATED MODULE: ./src/sdk/storage/storage.ts
-function localstorage_destroy() {}
+var storage_Promise = typeof Promise === 'undefined' ? __webpack_require__(3).Promise : Promise;
-// CONCATENATED MODULE: ./src/sdk/storage/storage.js
-var storage_Promise = typeof Promise === 'undefined' ? __webpack_require__(3).Promise : Promise;
+var storage_StorageType;
+(function (StorageType) {
+ StorageType[StorageType["noStorage"] = STORAGE_TYPES.NO_STORAGE] = "noStorage";
+ StorageType[StorageType["indexedDB"] = STORAGE_TYPES.INDEXED_DB] = "indexedDB";
+ StorageType[StorageType["localStorage"] = STORAGE_TYPES.LOCAL_STORAGE] = "localStorage";
+})(storage_StorageType || (storage_StorageType = {}));
/**
* Methods to extend
@@ -5402,7 +5907,6 @@ var storage_Promise = typeof Promise === 'undefined' ? __webpack_require__(3).Pr
* @type {Object}
* @private
*/
-
var _methods = {
getAll: _getAll,
getFirst: _getFirst,
@@ -5415,7 +5919,9 @@ var _methods = {
deleteBulk: _deleteBulk,
trimItems: _trimItems,
count: _count,
- clear: _clear
+ clear: _clear,
+ destroy: _destroy,
+ deleteDatabase: _deleteDatabase
};
/**
* Extends storage's getAll method by decoding returned records
@@ -5430,7 +5936,7 @@ function _getAll(storage, storeName) {
return storage.getAll(storeName).then(function (records) {
return convertRecords({
storeName: storeName,
- dir: 'right',
+ dir: Direction.right,
records: records
});
});
@@ -5449,7 +5955,7 @@ function _getFirst(storage, storeName) {
return storage.getFirst(storeName).then(function (record) {
return convertRecord({
storeName: storeName,
- dir: 'right',
+ dir: Direction.right,
record: record
});
});
@@ -5468,12 +5974,12 @@ function _getFirst(storage, storeName) {
function _getItem(storage, storeName, target) {
return storage.getItem(storeName, convertValues({
storeName: storeName,
- dir: 'left',
+ dir: Direction.left,
target: target
})).then(function (record) {
return convertRecord({
storeName: storeName,
- dir: 'right',
+ dir: Direction.right,
record: record
});
}).catch(function (error) {
@@ -5498,7 +6004,7 @@ function _filterBy(storage, storeName, target) {
return storage.filterBy(storeName, encodeValue(target)).then(function (records) {
return convertRecords({
storeName: storeName,
- dir: 'right',
+ dir: Direction.right,
records: records
});
});
@@ -5517,12 +6023,12 @@ function _filterBy(storage, storeName, target) {
function _addItem(storage, storeName, record) {
return storage.addItem(storeName, convertRecord({
storeName: storeName,
- dir: 'left',
+ dir: Direction.left,
record: record
})).then(function (target) {
return convertValues({
storeName: storeName,
- dir: 'right',
+ dir: Direction.right,
target: target
});
}).catch(function (error) {
@@ -5547,13 +6053,13 @@ function _addItem(storage, storeName, record) {
function _addBulk(storage, storeName, records, overwrite) {
return storage.addBulk(storeName, convertRecords({
storeName: storeName,
- dir: 'left',
+ dir: Direction.left,
records: records
}), overwrite).then(function (values) {
return values.map(function (target) {
return convertValues({
storeName: storeName,
- dir: 'right',
+ dir: Direction.right,
target: target
});
});
@@ -5578,12 +6084,12 @@ function _addBulk(storage, storeName, records, overwrite) {
function _updateItem(storage, storeName, record) {
return storage.updateItem(storeName, convertRecord({
storeName: storeName,
- dir: 'left',
+ dir: Direction.left,
record: record
})).then(function (target) {
return convertValues({
storeName: storeName,
- dir: 'right',
+ dir: Direction.right,
target: target
});
});
@@ -5602,12 +6108,12 @@ function _updateItem(storage, storeName, record) {
function _deleteItem(storage, storeName, target) {
return storage.deleteItem(storeName, convertValues({
storeName: storeName,
- dir: 'left',
+ dir: Direction.left,
target: target
})).then(function (target) {
return convertValues({
storeName: storeName,
- dir: 'right',
+ dir: Direction.right,
target: target
});
});
@@ -5629,7 +6135,7 @@ function _deleteBulk(storage, storeName, target, condition) {
return records.map(function (record) {
return convertValues({
storeName: storeName,
- dir: 'right',
+ dir: Direction.right,
target: record
});
});
@@ -5675,6 +6181,28 @@ function _count(storage, storeName) {
function _clear(storage, storeName) {
return storage.clear(storeName);
}
+/**
+ * Calls storage's destroy method
+ *
+ * @param {Object} storage
+ * @private
+ */
+
+
+function _destroy(storage) {
+ return storage.destroy();
+}
+/**
+ * Calls storage's deleteDatabase method
+ *
+ * @param {Object} storage
+ * @private
+ */
+
+
+function _deleteDatabase(storage) {
+ return storage.deleteDatabase();
+}
/**
* Augment whitelisted methods with encoding/decoding functionality
*
@@ -5684,7 +6212,7 @@ function _clear(storage, storeName) {
*/
-function _augment(storage) {
+function _augment() {
return entries(_methods).map(function (_ref) {
var _ref2 = slicedToArray_default()(_ref, 2),
methodName = _ref2[0],
@@ -5695,61 +6223,100 @@ function _augment(storage) {
args[_key - 1] = arguments[_key];
}
- return method.call.apply(method, [null, storage, convertStoreName({
- storeName: storeName,
- dir: 'left'
- })].concat(args));
+ return storage_init().then(function (_ref3) {
+ var storage = _ref3.storage;
+
+ if (storage) {
+ return method.call.apply(method, [null, storage, convertStoreName({
+ storeName: storeName,
+ dir: Direction.left
+ })].concat(args));
+ }
+ });
}];
}).reduce(reducer, {});
}
+/**
+ * Type of available storage
+ */
+
+
+var storage_type
+/*: StorageType*/
+;
+/**
+ * Returns type of used storage which is one of possible values INDEXED_DB, LOCAL_STORAGE or NO_STORAGE if there is no
+ * storage available
+ */
+
+function getType()
+/*: StorageType*/
+{
+ return storage_type;
+}
+/**
+ * Cached promise of Storage initialization
+ */
+
+
+var _initializationPromise
+/*: Nullable>*/
+= null;
/**
* Check which storage is available and pick it up
* Prefer indexedDB over localStorage
- *
- * @returns {{
- * isSupported,
- * getAll,
- * getFirst,
- * getItem,
- * filterBy,
- * addItem,
- * addBulk,
- * updateItem,
- * deleteItem,
- * deleteBulk,
- * trimItems,
- * count,
- * clear,
- * destroy
- * }|null}
- */
-
-
-function storage_init() {
- var storage;
- var type;
-
- if (isSupported()) {
- storage = indexeddb_namespaceObject;
- type = 'indexedDB';
- } else if (localstorage_isSupported()) {
- storage = localstorage_namespaceObject;
- type = 'localStorage';
- }
-
- if (type) {
- return objectSpread2_default()({
- type: type,
- isSupported: storage.isSupported,
- destroy: storage.destroy
- }, _augment(storage));
- }
-
- logger.error('There is no storage available, app will run with minimum set of features');
- return null;
+ */
+
+function storage_init(dbName
+/*: string*/
+)
+/*: Promise*/
+{
+ var storage
+ /*: Nullable*/
+ = null;
+
+ if (_initializationPromise !== null) {
+ return _initializationPromise;
+ } else {
+ _initializationPromise = storage_Promise.all([indexeddb_IndexedDBWrapper.isSupported(), localstorage_LocalStorageWrapper.isSupported()]).then(function (_ref4) {
+ var _ref5 = slicedToArray_default()(_ref4, 2),
+ idbSupported = _ref5[0],
+ lsSupported = _ref5[1];
+
+ quick_storage.setCustomName(dbName);
+
+ if (idbSupported) {
+ storage_type = storage_StorageType.indexedDB;
+ var idb = new indexeddb_IndexedDBWrapper();
+ return idb.setCustomName(dbName).then(function () {
+ return storage = idb;
+ });
+ } else if (lsSupported) {
+ storage_type = storage_StorageType.localStorage;
+ storage = new localstorage_LocalStorageWrapper();
+ return storage_Promise.resolve(storage);
+ } else {
+ logger.error('There is no storage available, app will run with minimum set of features');
+ storage_type = storage_StorageType.noStorage;
+ storage = null;
+ return storage_Promise.resolve(storage);
+ }
+ }).then(function () {
+ return {
+ type: storage_type,
+ storage: storage
+ };
+ });
+ }
+
+ return _initializationPromise;
}
-/* harmony default export */ var storage_storage = (storage_init());
+/* harmony default export */ var storage_storage = (objectSpread2_default()({
+ init: storage_init,
+ getType: getType
+}, _augment()));
// CONCATENATED MODULE: ./src/sdk/default-params.js
@@ -5919,6 +6486,113 @@ function default_params_defaultParams()
return objectSpread2_default()(objectSpread2_default()(objectSpread2_default()(objectSpread2_default()(objectSpread2_default()(objectSpread2_default()(objectSpread2_default()(objectSpread2_default()({}, _getCreatedAt()), _getSentAt()), _getWebUuid()), _getTrackEnabled()), _getPlatform()), _getLanguage()), _getMachineType()), queueSize);
});
}
+// CONCATENATED MODULE: ./src/sdk/url-strategy.ts
+
+
+var _endpointMap, _endpointNiceNames;
+
+var url_strategy_Promise = typeof Promise === 'undefined' ? __webpack_require__(3).Promise : Promise;
+
+
+
+var UrlStrategy;
+
+(function (UrlStrategy) {
+ UrlStrategy["Default"] = "default";
+ UrlStrategy["India"] = "india";
+ UrlStrategy["China"] = "china";
+})(UrlStrategy || (UrlStrategy = {}));
+
+/**
+ * Returns a map of base URLs or a list of endpoint names depending on SDK configuration
+ */
+function getEndpointPreference()
+/*: BaseUrlsMap | EndpointName[]*/
+{
+ var _Config$getCustomConf = config.getCustomConfig(),
+ customUrl = _Config$getCustomConf.customUrl,
+ urlStrategy = _Config$getCustomConf.urlStrategy;
+
+ if (customUrl) {
+ // If custom URL is set then send all requests there
+ return {
+ app: customUrl,
+ gdpr: customUrl
+ };
+ }
+
+ if (urlStrategy === UrlStrategy.India) {
+ return [UrlStrategy.India, UrlStrategy.Default];
+ }
+
+ if (urlStrategy === UrlStrategy.China) {
+ return [UrlStrategy.China, UrlStrategy.Default];
+ }
+
+ return [UrlStrategy.Default, UrlStrategy.India, UrlStrategy.China];
+}
+
+var endpointMap
+/*: Record*/
+= (_endpointMap = {}, defineProperty_default()(_endpointMap, UrlStrategy.Default, {
+ app: 'https://app.adjust.com',
+ gdpr: 'https://gdpr.adjust.com'
+}), defineProperty_default()(_endpointMap, UrlStrategy.India, {
+ app: 'https://app.adjust.net.in',
+ gdpr: 'https://gdpr.adjust.net.in'
+}), defineProperty_default()(_endpointMap, UrlStrategy.China, {
+ app: 'https://app.adjust.world',
+ gdpr: 'https://gdpr.adjust.world'
+}), _endpointMap);
+var endpointNiceNames
+/*: Record*/
+= (_endpointNiceNames = {}, defineProperty_default()(_endpointNiceNames, UrlStrategy.Default, 'default'), defineProperty_default()(_endpointNiceNames, UrlStrategy.India, 'Indian'), defineProperty_default()(_endpointNiceNames, UrlStrategy.China, 'Chinese'), _endpointNiceNames);
+/**
+ * Gets the list of preferred endpoints and wraps `sendRequest` function with iterative retries until available
+ * endpoint found or another error occurred.
+ */
+
+function urlStrategyRetries(sendRequest
+/*: (urls: BaseUrlsMap) => Promise*/
+)
+/*: Promise*/
+{
+ var endpoints
+ /*: Record*/
+ = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : endpointMap;
+ var preferredUrls = getEndpointPreference();
+
+ if (!Array.isArray(preferredUrls)) {
+ // There is only one endpoint
+ return sendRequest(preferredUrls);
+ } else {
+ var attempt = 0;
+
+ var trySendRequest
+ /*: () => Promise*/
+ = function trySendRequest() {
+ var endpointKey = preferredUrls[attempt++];
+ var urlsMap = endpoints[endpointKey];
+ return sendRequest(urlsMap).catch(function (reason) {
+ if (reason.code === 'NO_CONNECTION') {
+ logger.log("Failed to connect ".concat(endpointNiceNames[endpointKey], " endpoint"));
+
+ if (attempt < preferredUrls.length) {
+ logger.log("Trying ".concat(endpointNiceNames[preferredUrls[attempt]], " one"));
+ return trySendRequest(); // Trying next endpoint
+ }
+ } // Another error occurred or we ran out of attempts, re-throw
+
+
+ throw reason;
+ });
+ };
+
+ return trySendRequest();
+ }
+}
+
+
// CONCATENATED MODULE: ./src/sdk/http.js
@@ -5934,6 +6608,7 @@ var http_Promise = typeof Promise === 'undefined' ? __webpack_require__(3).Promi
+
/*:: type ParamsWithAttemptsT = $PropertyType*/
/**
@@ -6150,6 +6825,8 @@ function _handleReadyStateChange(reject, resolve, _ref11) {
function _prepareUrlAndParams(_ref12, defaultParams
/*: DefaultParamsT*/
+, baseUrlsMap
+/*: BaseUrlsMap*/
)
/*: {fullUrl: string, encodedParams: string}*/
{
@@ -6160,8 +6837,7 @@ function _prepareUrlAndParams(_ref12, defaultParams
var encodedParams = _encodeParams(params, defaultParams);
var base = url === '/gdpr_forget_device' ? 'gdpr' : 'app';
- var customConfig = config.getCustomConfig();
- var baseUrl = customConfig.customUrl || config.baseUrl[base];
+ var baseUrl = baseUrlsMap[base];
return {
fullUrl: baseUrl + url + (method === 'GET' ? "?".concat(encodedParams) : ''),
encodedParams: encodedParams
@@ -6208,6 +6884,8 @@ function _prepareHeaders(xhr
function _buildXhr(_ref15, defaultParams
/*: DefaultParamsT*/
+, baseUrlsMap
+/*: BaseUrlsMap*/
)
/*: Promise*/
{
@@ -6221,7 +6899,7 @@ function _buildXhr(_ref15, defaultParams
url: url,
method: method,
params: params
- }, defaultParams),
+ }, defaultParams, baseUrlsMap),
fullUrl = _prepareUrlAndParams2.fullUrl,
encodedParams = _prepareUrlAndParams2.encodedParams;
@@ -6245,6 +6923,16 @@ function _buildXhr(_ref15, defaultParams
xhr.send(method === 'GET' ? undefined : encodedParams);
});
}
+
+function _sendRequestWithUrlStrategyRetries(options
+/*: HttpRequestParamsT*/
+, defaultParams
+/*: DefaultParamsT*/
+) {
+ return urlStrategyRetries(function (baseUrlsMap) {
+ return _buildXhr(options, defaultParams, baseUrlsMap);
+ });
+}
/**
* Intercept response from backend
*
@@ -6329,7 +7017,7 @@ function http(options
/*: Promise*/
{
return default_params_defaultParams().then(function (defaultParams) {
- return _buildXhr(options, defaultParams);
+ return _sendRequestWithUrlStrategyRetries(options, defaultParams);
}).then(function (result) {
return _interceptResponse(result, options.url);
});
@@ -9233,6 +9921,7 @@ var main_Promise = typeof Promise === 'undefined' ? __webpack_require__(3).Promi
+
/*:: type InitConfigT = $ReadOnly<{|...InitOptionsT, ...LogOptionsT|}>*/
/**
@@ -9244,6 +9933,16 @@ var main_Promise = typeof Promise === 'undefined' ? __webpack_require__(3).Promi
var main_options
/*: ?InitOptionsT*/
= null;
+/**
+ * Flag to mark id sdk is in starting process
+ *
+ * @type {boolean}
+ * @private
+ */
+
+var _isInitialising
+/*: boolean*/
+= false;
/**
* Flag to mark if sdk is started
*
@@ -9282,14 +9981,7 @@ function initSdk()
logger.setLogLevel(logLevel, logOutput);
- if (!storage_storage) {
- logger.error('Adjust SDK can not start, there is no storage available');
- return;
- }
-
- logger.info("Available storage is ".concat(storage_storage.type));
-
- if (config.isInitialised()) {
+ if (_isInitialised()) {
logger.error('You already initiated your instance');
return;
}
@@ -9298,9 +9990,18 @@ function initSdk()
return;
}
- main_options = objectSpread2_default()({}, options);
+ _isInitialising = true;
+ storage_storage.init(options.namespace).then(function (availableStorage) {
+ if (availableStorage.type === STORAGE_TYPES.NO_STORAGE) {
+ logger.error('Adjust SDK can not start, there is no storage available');
+ return;
+ }
- _start(options);
+ logger.info("Available storage is ".concat(availableStorage.type));
+ main_options = objectSpread2_default()({}, options);
+
+ _start(options);
+ });
}
/**
* Track event with already initiated instance
@@ -9528,7 +10229,19 @@ function _handleGdprForgetMe()
gdpr_forget_device_finish();
- main_Promise.all([identity_clear(), global_params_clear(), queue_clear()]).then(_destroy);
+ main_Promise.all([identity_clear(), global_params_clear(), queue_clear()]).then(main_destroy);
+}
+/**
+ * Check if sdk initialisation was started
+ *
+ * @private
+ */
+
+
+function _isInitialised()
+/*: boolean*/
+{
+ return _isInitialising || config.isInitialised();
}
/**
* Pause sdk by canceling:
@@ -9543,6 +10256,7 @@ function _handleGdprForgetMe()
function _pause()
/*: void*/
{
+ _isInitialising = false;
_isStarted = false;
scheduler_destroy();
queue_destroy();
@@ -9577,9 +10291,11 @@ function _shutdown(async)
*/
-function _destroy()
+function main_destroy()
/*: void*/
{
+ _isInstalled = false;
+
_shutdown();
gdpr_forget_device_destroy();
@@ -9643,6 +10359,7 @@ function main_continue(activityState
cleanUp: true
});
return watch().then(function () {
+ _isInitialising = false;
_isStarted = true;
if (isInstalled) {
@@ -9756,7 +10473,7 @@ function _preCheck(description
schedule = _ref2.schedule,
stopBeforeInit = _ref2.stopBeforeInit;
- if (!storage_storage) {
+ if (storage_storage.getType() === STORAGE_TYPES.NO_STORAGE) {
logger.log("Adjust SDK can not ".concat(description, ", no storage available"));
return;
}
@@ -9766,13 +10483,13 @@ function _preCheck(description
return;
}
- if (schedule && stopBeforeInit && !config.isInitialised()) {
+ if (schedule && stopBeforeInit && !_isInitialised()) {
logger.error("Adjust SDK can not ".concat(description, ", sdk instance is not initialized"));
return;
}
if (typeof callback === 'function') {
- if (schedule && !(_isInstalled && _isStarted) && (stopBeforeInit || config.isInitialised())) {
+ if (schedule && !(_isInstalled && _isStarted) && (stopBeforeInit || _isInitialised())) {
delay(callback, description);
logger.log("Running ".concat(description, " is delayed until Adjust SDK is up"));
} else {
@@ -9781,6 +10498,10 @@ function _preCheck(description
}
}
+function _clearDatabase() {
+ return storage_storage.deleteDatabase();
+}
+
var Adjust = {
initSdk: initSdk,
trackEvent: trackEvent,
@@ -9797,7 +10518,8 @@ var Adjust = {
gdprForgetMe: gdprForgetMe,
disableThirdPartySharing: disableThirdPartySharing,
__testonly__: {
- destroy: _destroy
+ destroy: main_destroy,
+ clearDatabase: _clearDatabase
}
};
/* harmony default export */ var main = __webpack_exports__["default"] = (Adjust);
diff --git a/dist/adjust-latest.min.js b/dist/adjust-latest.min.js
index dba74e7..9b6b205 100644
--- a/dist/adjust-latest.min.js
+++ b/dist/adjust-latest.min.js
@@ -1,8 +1,8 @@
-!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.Adjust=t():e.Adjust=t()}(window,(function(){return 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}return 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=18)}([function(e,t,n){var r=n(2);function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}e.exports=function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}},function(e,t){function n(t){return"function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?e.exports=n=function(e){return typeof e}:e.exports=n=function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n(t)}e.exports=n},function(e,t){e.exports=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r=0||(o[n]=e[n]);return o}},function(e,t){var n,r,o=e.exports={};function i(){throw new Error("setTimeout has not been defined")}function a(){throw new Error("clearTimeout has not been defined")}function u(e){if(n===setTimeout)return setTimeout(e,0);if((n===i||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}!function(){try{n="function"==typeof setTimeout?setTimeout:i}catch(e){n=i}try{r="function"==typeof clearTimeout?clearTimeout:a}catch(e){r=a}}();var s,c=[],l=!1,d=-1;function f(){l&&s&&(l=!1,s.length?c=s.concat(c):d=-1,c.length&&m())}function m(){if(!l){var e=u(f);l=!0;for(var t=c.length;t;){for(s=c,c=[];++d1)for(var n=1;n0&&void 0!==arguments[0]?arguments[0]:[];return e.reduce((function(e,t){return u()(u()({},e),{},g()({},t.key,t.value))}),{})}function _(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return e.filter((function(e){return-1!==t.indexOf(e)}))}function x(e,t){return new RegExp("\\/".concat(t,"(\\/.*|\\?.*){0,1}$")).test(e)}function j(e,t){var n=d()(t,2),r=n[0],o=n[1];return u()(u()({},e),{},g()({},r,o))}function O(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1?arguments[1]:void 0,n={entries:function(t){return[t,e[t]]},values:function(t){return e[t]}};return Object[t]?Object[t](e):Object.keys(e).map(n[t])}function I(e){return O(e,"entries")}function A(e){return k(e)?!w(e):!!e||0===e}var T=(i={},g()(i,"none",-1),g()(i,"error",0),g()(i,"warning",1),g()(i,"info",2),g()(i,"verbose",3),i),E={log:" ",info:" ",warn:" ",error:""},D={development:"verbose",production:"error",test:"verbose"},R=L(),C="";function L(){return D[p.env]||"error"}function M(e,t){var n;if(!(T[R]2?u-2:0),c=2;c1&&void 0!==arguments[1]?arguments[1]:1,n=e+"",r=1;r<=t;r+=1)e0?"-":"+")+ae(Math.floor(Math.abs(t)/60))+ae(Math.abs(t)%60)}(t);return"".concat(n,"T").concat(r,"Z").concat(o)}function se(e,t){return isNaN(e)||isNaN(t)?0:Math.abs(t-e)}var ce={},le=!1,de=!1;function fe(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};ce=le?u()({},e):{}}function me(){le&&(ce.lastInterval=function(){var e=ce.lastActive;if(e)return Math.round(se(e,Date.now())/1e3);return-1}(),ce.lastActive=Date.now())}function pe(e){ce=u()(u()({},ce),e)}function ve(){de=!0}function he(){var e=ce.lastActive;return Math.round(se(e,Date.now())/1e3)}function ge(){return(ce.timeSpent||0)+(de?he():0)}function ye(){var e=se(ce.lastActive,Date.now())=0?ce.lastInterval:0,n={timeSpent:ce.timeSpent||0,sessionLength:ce.sessionLength||0,sessionCount:ce.sessionCount||1,lastInterval:t||0};return e&&x(e,"event")&&(n.eventCount=ce.eventCount),n},updateParams:function(e,t){if(le){var n={};n.timeSpent=ge(),n.sessionLength=ye(),x(e,"session")&&(n.sessionCount=(ce.sessionCount||0)+1),x(e,"event")&&(n.eventCount=(ce.eventCount||0)+1),pe(n),t||me()}},updateInstalled:function(){le&&(ce.installed||pe({installed:!0}))},updateSessionOffset:be,updateSessionLength:function(){le&&(pe({sessionLength:ye()}),me())},resetSessionOffset:function(){le&&pe({timeSpent:0,sessionLength:0})},updateLastActive:me,destroy:function(){ce={},le=!1,de=!1}};function ke(e,t){return e&&void 0!==e[t]?e[t]:t}function Se(e){var t=e.storeName,n=e.dir,r=e.record,o=e.scheme;if(r)return o=o||ie[n][xe({storeName:t,dir:"right"})].fields,I(r).map((function(e){var r=d()(e,2),i=r[0],a=r[1];return function(e){var t=e.storeName,n=e.scheme,r=e.dir,o=e.key,i=e.value;if(!n)return[o,i];var a=n.key||n;return k(i)?[a,Se({storeName:t,dir:r,record:i,scheme:n.keys})]:[a,ke(n.values,i)]}({storeName:t,scheme:o[i],dir:n,key:i,value:a})})).reduce((function(e,t){var n=d()(t,2),r=n[0],o=n[1];return u()(u()({},e),{},g()({},r,o))}),{})}function Pe(e){var t=e.storeName,n=e.dir,r=e.records;return(void 0===r?[]:r).map((function(e){return Se({storeName:t,dir:n,record:e})}))}function Ne(e){var t=e.storeName,n=e.dir,r=e.target,o=ie[n][xe({storeName:t,dir:"right"})],i=o.fields[o.keyPath],a=r instanceof Array?r.slice():[r],u=(i.composite||[o.keyPath]).map((function(e,t){return ke(o.fields[e].values,a[t])}));return 1===u.length?u[0]:u}function _e(e){return ie.values[e]||e}function xe(e){var t=e.storeName,n=e.dir;return(ie.storeNames[n][t]||{}).name||t}function je(e){var t=e.storeName,n=e.error;return{name:n.name,message:n.message.replace('"'.concat(t,'"'),xe({storeName:t,dir:"right"}))}}var Oe=p.namespace,Ie=ie.storeNames.left;var Ae={storeNames:Ie,stores:{},clear:function(){I(Ie).forEach((function(e){var t=d()(e,2)[1];t.permanent||localStorage.removeItem("".concat(Oe,".").concat(t.name))}))}};I(Ie).forEach((function(e){var t=d()(e,2)[1];Object.defineProperty(Ae.stores,t.name,{get:function(){return e=t.name,((n=JSON.parse(localStorage.getItem("".concat(Oe,".").concat(e))))instanceof Array?n:Se({storeName:Ie.preferences.name,dir:"right",record:n}))||null;var e,n},set:function(e){!function(e,t){t?localStorage.setItem("".concat(Oe,".").concat(e),JSON.stringify(t instanceof Array?t:Se({storeName:Ie.preferences.name,dir:"left",record:t}))):localStorage.removeItem("".concat(Oe,".").concat(e))}(t.name,e)}})})),Object.freeze(Ae.stores);var Te=Ae,Ee={},De=[];function Re(e,t){var n="id"+Math.random().toString(36).substr(2,16),r={id:n,cb:t};return Ee[e]||(Ee[e]=[]),Ee[e].push(r),n}function Ce(e,t){Ee[e]&&Ee[e].forEach((function(n){"function"==typeof n.cb&&De.push(setTimeout((function(){return n.cb(e,t)})))}))}var Le=Te.storeNames.preferences.name,Me=Be();function Be(){return Me||qe(),Me?u()({},Me):null}function qe(){Me=Te.stores[Le]}function Ke(){var e=Be();return e?e.sdkDisabled:null}function Fe(e){var t=e?u()({},e):null;Te.stores[Le]=u()(u()({},Be()),{},{sdkDisabled:t}),qe()}function Ue(){var e=Be();return e?e.thirdPartySharingDisabled:null}function Ge(){var e=Te.stores[Le]||{},t=(Me||{}).sdkDisabled||null;e.sdkDisabled&&!t&&Ce("sdk:shutdown"),qe()}function We(){Te.stores[Le]||(Te.stores[Le]=u()({},Me))}var He,Ye="undefined"==typeof Promise?n(3).Promise:Promise,Je=p.namespace;function Ve(){var e=ze(),t=!!navigator.platform&&/iPad|iPhone|iPod/.test(navigator.platform),n=!!e&&!t;return n||q.warn("IndexedDB is not supported in this browser"),n}function ze(){return window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB}function Qe(){var e=ze();return Ve()?new Ye((function(t,n){if(He)t({success:!0});else{var r=e.open(Je,1);r.onupgradeneeded=function(e){return function(e,t){var n=e.target.result;e.target.transaction.onerror=t,e.target.transaction.onabort=t;var r=ie.storeNames.left,o=we.current||{},i=o&&!w(o);I(r).filter((function(e){return!d()(e,2)[1].permanent})).forEach((function(e){var t=d()(e,2),a=t[0],u=t[1],s=ie.right[a],c=n.createObjectStore(u.name,{keyPath:s.keyPath,autoIncrement:s.autoIncrement||!1});s.index&&c.createIndex("".concat(s.index,"Index"),s.index),u.name===r.activityState.name&&i?(c.add(Se({storeName:a,record:o,dir:"left"})),q.info("Activity state has been recovered")):Te.stores[u.name]&&(Te.stores[u.name].forEach((function(e){return c.add(e)})),q.info("Migration from localStorage done for ".concat(a," store")))})),We(),Te.clear()}(e,n)},r.onsuccess=function(e){return function(e,t){He=e.target.result,t({success:!0}),He.onclose=gt}(e,t)},r.onerror=n}})):Ye.reject({name:"IDBNotSupported",message:"IndexedDB is not supported"})}function Xe(e,t){var n,r=e.storeName,o=e.mode,i=He.transaction([r],o),a=i.objectStore(r),u=ie.right[xe({storeName:r,dir:"right"})];return u.index&&(n=a.index("".concat(u.index,"Index"))),i.onerror=t,i.onabort=t,{transaction:i,store:a,index:n,options:u}}function Ze(e,t){var n=t.target.error;return e({name:n.name,message:n.message})}function $e(e){return e.fields[e.keyPath].composite||null}function et(e,t,n){var r=-1!==["add","put"].indexOf(n),o=$e(e);return o?r?u()(g()({},e.keyPath,o.map((function(e){return t[e]})).join("")),t):t?t.join(""):null:t}function tt(e,t){var n=$e(e);return n&&k(t)?n.map((function(e){return t[e]})):null}function nt(e){var t=e.storeName,n=e.target,r=void 0===n?null:n,o=e.action,i=e.mode,a=void 0===i?"readonly":i;return Qe().then((function(){return new Ye((function(e,n){var i=Xe({storeName:t,mode:a},n),u=i.store,s=i.options,c=u[o](et(s,r,o)),l=tt(s,r);c.onsuccess=function(){"get"!==o||c.result?e(l||c.result||r):n({name:"NotRecordFoundError",message:'Requested record not found in "'.concat(t,'" store')})},c.onerror=function(e){return Ze(n,e)}}))}))}function rt(e){var t=e.storeName,n=e.action,r=void 0===n?"list":n,o=e.range,i=void 0===o?null:o,a=e.firstOnly,u=e.mode,s=void 0===u?"readonly":u;return Qe().then((function(){return new Ye((function(e,n){var o=Xe({storeName:t,mode:s},n),u=o.transaction,c=o.store,l=o.index,d=o.options,f=(l||c).openCursor(i),m=[];u.oncomplete=function(){return e(a?m[0]:m)},f.onsuccess=function(e){var t=e.target.result;t&&("delete"===r?(t.delete(),m.push(tt(d,t.value)||t.value[d.keyPath])):m.push(t.value),a||t.continue())},f.onerror=function(e){return Ze(n,e)}}))}))}function ot(e,t){return rt({storeName:e,firstOnly:t})}function it(e){return ot(e,!0)}function at(e,t){return nt({storeName:e,target:t,action:"get"})}function ut(e,t){return rt({storeName:e,range:IDBKeyRange.only(t)})}function st(e,t){return nt({storeName:e,target:t,action:"add",mode:"readwrite"})}function ct(e,t,n){return function(e){var t=e.storeName,n=e.target,r=e.action,o=e.mode;return Qe().then((function(){return new Ye((function(e,i){if(!n||n&&!n.length)return i({name:"NoTargetDefined",message:"No array provided to perform ".concat(r,' bulk operation into "').concat(t,'" store')});var a=Xe({storeName:t,mode:o},i),u=a.transaction,s=a.store,c=a.options,l=[],d=n[0];u.oncomplete=function(){return e(l)},function e(t){t.onerror=function(e){return Ze(i,e)},t.onsuccess=function(){l.push(tt(c,d)||t.result),d=n[l.length],l.lengthe[r]:e[r]>t[r];return o?-1:i?1:0}(e,t,o)}),0)}))}function _t(e,t,n){var r=kt(e);return r?u()(g()({},e.keyPath,r.map((function(e){return t[e]})).join("")),t):e.autoIncrement&&n?u()(g()({},e.keyPath,n),t):u()({},t)}function xt(e,t){var n=kt(e);return n&&k(t)?n.map((function(e){return t[e]})):t[e.keyPath]||t}function jt(e,t){var n=wt();return"error"===n.status?yt.reject(n.error):new yt((function(n,r){var o=Te.stores[e];o instanceof Array?n(t?o[0]:Nt(o,St(e))):r({name:"NotFoundError",message:"No objectStore named ".concat(e," in this database")})}))}function Ot(e){return jt(e,!0)}function It(e,t){return Pt({storeName:e,id:t},(function(t,n,r){var o=r.items,i=r.index,a=r.options;-1===i?n({name:"NotRecordFoundError",message:'Requested record not found in "'.concat(e,'" store')}):t(_t(a,o[i]))}))}function At(e,t){return jt(e).then((function(n){return n.filter((function(n){return n[ie.right[xe({storeName:e,dir:"right"})].index]===t}))}))}function Tt(e,t){return Pt({storeName:e,item:t},(function(n,r,o){var i=o.items,a=o.index,u=o.options,s=o.lastId;-1!==a?r({name:"ConstraintError",message:'Constraint was not satisfied, trying to add existing item into "'.concat(e,'" store')}):(i.push(_t(u,t,s+1)),Te.stores[e]=i,n(xt(u,t)))}))}function Et(e,t,n){return Pt({storeName:e},(function(r,o,i){var a=i.keys,u=i.items,s=i.options,c=i.lastId;if(!t||t&&!t.length)return o({name:"NoTargetDefined",message:'No array provided to perform add bulk operation into "'.concat(e,'" store')});var l=c,d=t.map((function(e){return _t(s,e,++l)})),f=d.filter((function(e){return-1!==P(u,a,e)})).map((function(e){return e[s.keyPath]})),p=n?u.filter((function(e){return-1===f.indexOf(e[s.keyPath])})):m()(u);f.length&&!n?o({name:"ConstraintError",message:'Constraint was not satisfied, trying to add existing items into "'.concat(e,'" store')}):(Te.stores[e]=Nt([].concat(m()(p),m()(d)),a),r(t.map((function(e){return xt(s,e)}))))}))}function Dt(e,t){return Pt({storeName:e,item:t},(function(n,r,o){var i=o.items,a=o.index,u=o.options,s=o.lastId,c=_t(u,t,-1===a?s+1:null);-1===a?i.push(c):i.splice(a,1,c),Te.stores[e]=i,n(xt(u,t))}))}function Rt(e,t){return Pt({storeName:e,id:t},(function(n,r,o){var i=o.items,a=o.index;-1!==a&&(i.splice(a,1),Te.stores[e]=i),n(t)}))}function Ct(e,t,n){return jt(e).then((function(r){var o=St(e),i=ie.right[xe({storeName:e,dir:"right"})].index||o[0],a=Nt(r,o,n?null:t),u=function(e,t,n){if(!e.length)return-1;for(var r={index:-1,value:isNaN(n)?"":0},o=0;o=r.value&&(r={value:e[o][t],index:o})}return r.index}(a,i,t);if(-1===u)return[];var s="lowerBound"===n?u:0,c=n&&"upperBound"!==n?a.length:u+1,l=a.splice(s,c).map((function(e){return 1===o.length?e[i]:o.map((function(t){return e[t]}))}));return Te.stores[e]=a,l}))}function Lt(e,t){var n=wt(),r=ie.right[xe({storeName:e,dir:"right"})];return"error"===n.status?yt.reject(n.error):jt(e).then((function(e){return e.length?e[t-1]:null})).then((function(t){return t?Ct(e,t[r.keyPath],"upperBound"):[]}))}function Mt(e){var t=wt();return"error"===t.status?yt.reject(t.error):yt.resolve(Te.stores[e].length)}function Bt(e){var t=wt();return"error"===t.status?yt.reject(t.error):new yt((function(t){Te.stores[e]=[],t({})}))}function qt(){}var Kt="undefined"==typeof Promise?n(3).Promise:Promise,Ft={getAll:function(e,t){return e.getAll(t).then((function(e){return Pe({storeName:t,dir:"right",records:e})}))},getFirst:function(e,t){return e.getFirst(t).then((function(e){return Se({storeName:t,dir:"right",record:e})}))},getItem:function(e,t,n){return e.getItem(t,Ne({storeName:t,dir:"left",target:n})).then((function(e){return Se({storeName:t,dir:"right",record:e})})).catch((function(e){return Kt.reject(je({storeName:t,error:e}))}))},filterBy:function(e,t,n){return e.filterBy(t,_e(n)).then((function(e){return Pe({storeName:t,dir:"right",records:e})}))},addItem:function(e,t,n){return e.addItem(t,Se({storeName:t,dir:"left",record:n})).then((function(e){return Ne({storeName:t,dir:"right",target:e})})).catch((function(e){return Kt.reject(je({storeName:t,error:e}))}))},addBulk:function(e,t,n,r){return e.addBulk(t,Pe({storeName:t,dir:"left",records:n}),r).then((function(e){return e.map((function(e){return Ne({storeName:t,dir:"right",target:e})}))})).catch((function(e){return Kt.reject(je({storeName:t,error:e}))}))},updateItem:function(e,t,n){return e.updateItem(t,Se({storeName:t,dir:"left",record:n})).then((function(e){return Ne({storeName:t,dir:"right",target:e})}))},deleteItem:function(e,t,n){return e.deleteItem(t,Ne({storeName:t,dir:"left",target:n})).then((function(e){return Ne({storeName:t,dir:"right",target:e})}))},deleteBulk:function(e,t,n,r){return e.deleteBulk(t,_e(n),r).then((function(e){return e.map((function(e){return Ne({storeName:t,dir:"right",target:e})}))}))},trimItems:function(e,t,n){return e.trimItems(t,n)},count:function(e,t){return e.count(t)},clear:function(e,t){return e.clear(t)}};var Ut,Gt,Wt=(Ve()?(Ut=r,Gt="indexedDB"):bt()&&(Ut=o,Gt="localStorage"),Gt?u()({type:Gt,isSupported:Ut.isSupported,destroy:Ut.destroy},function(e){return I(Ft).map((function(t){var n=d()(t,2),r=n[0],o=n[1];return[r,function(t){for(var n=arguments.length,r=new Array(n>1?n-1:0),i=1;i2&&void 0!==arguments[2]&&arguments[2];return{status:"error",action:n?"CONTINUE":"RETRY",response:S(e.responseText)?JSON.parse(e.responseText):e.responseText,message:v[t],code:t}}function Vt(e,t){var n=e.slice(0,e.length-t.length-1).split("").reduce((function(e){return e.concat(" ")}),"");return"".concat(t).concat(n,":")}function zt(e,t){var n=function(e){return e.replace(/([A-Z])/g,(function(e){return"_".concat(e.toLowerCase())}))},r=I(u()(u()(u()({},V.getBaseParams()),t),e)).map((function(e){var t=d()(e,2),r=t[0],o=t[1];return[n(r),o]}));return q.log("REQUEST PARAMETERS:"),r.filter((function(e){return A(d()(e,2)[1])})).map((function(e){var t=d()(e,2),n=t[0],r=t[1];return q.log(Vt("REQUEST PARAMETERS:",n),r),function(e){var t=d()(e,2),n=t[0],r=t[1],o=encodeURIComponent(n),i=r;return"string"==typeof r&&(i=encodeURIComponent(r)),k(r)&&(i=encodeURIComponent(JSON.stringify(r)||"")),[o,i].join("=")}([n,r])})).join("&")}function Qt(e,t,n){var r=n.xhr,o=n.url;if(4===r.readyState){var i=r.status>=200&&r.status<300,a=S(r.responseText);if(0!==r.status)return a?t(i?function(e,t){var n=JSON.parse(e.responseText),r={status:"success",adid:n.adid,timestamp:n.timestamp,ask_in:n.ask_in,retry_in:n.retry_in,continue_in:n.continue_in,tracking_state:n.tracking_state,attribution:void 0,message:void 0};return x(t,"attribution")&&(r.attribution=n.attribution,r.message=n.message),I(r).filter((function(e){return!!d()(e,2)[1]})).reduce(j,{})}(r,o):Jt(r,"SERVER_CANNOT_PROCESS",!0)):e(Jt(r,i?"SERVER_MALFORMED_RESPONSE":"SERVER_INTERNAL_ERROR"));e(Jt(r,"NO_CONNECTION"))}}function Xt(e,t){var n=e.url,r=e.method,o=void 0===r?"GET":r,i=e.params,a=function(e,t){var n=e.url,r=e.method,o=zt(e.params,t),i="/gdpr_forget_device"===n?"gdpr":"app";return{fullUrl:(V.getCustomConfig().customUrl||V.baseUrl[i])+n+("GET"===r?"?".concat(o):""),encodedParams:o}}({url:n,method:o,params:void 0===i?{}:i},t),u=a.fullUrl,s=a.encodedParams;return new Yt((function(e,t){var r=new XMLHttpRequest;r.open(o,u,!0),function(e,t){var n=[["Client-SDK","js".concat(p.version)],["Content-Type","POST"===t?"application/x-www-form-urlencoded":"application/json"]];q.log("REQUEST HEADERS:"),n.forEach((function(t){var n=d()(t,2),r=n[0],o=n[1];e.setRequestHeader(r,o),q.log(Vt("REQUEST HEADERS:",r),o)}))}(r,o),r.onreadystatechange=function(){return Qt(t,e,{xhr:r,url:n})},r.onerror=function(){return t(Jt(r,"TRANSACTION_ERROR"))},r.send("GET"===o?void 0:s)}))}function Zt(e,t){return"success"===e.status?function(e,t){var n=x(t,"gdpr_forget_device"),r=x(t,"attribution"),o=x(t,"session"),i=x(t,"disable_third_party_sharing"),a="opted_out"===e.tracking_state;if(!n&&a)return Ce("sdk:gdpr-forget-me"),e;r||n||a||!e.ask_in||Ce("attribution:check",e);o&&Ce("session:finished",e);if(i)return Ce("sdk:third-party-sharing-opt-out"),e;return e}(e,t):e}function $t(e){return Ht().then((function(t){return Xt(e,t)})).then((function(t){return Zt(t,e.url)}))}var en={long:{delay:12e4,maxDelay:864e5,minRange:.5,maxRange:1},short:{delay:200,maxDelay:36e5,minRange:.5,maxRange:1},test:{delay:100,maxDelay:300}};function tn(e,t){var n,r,o=en[t=t||"long"],i=o.delay*Math.pow(2,e-1);return i=Math.min(i,o.maxDelay),o.minRange&&o.maxRange&&(i*=(n=o.minRange,r=o.maxRange,Math.random()*(r-n)+n)),Math.round(i)}var nn=navigator.onLine;function rn(){nn=!0}function on(){nn=!1}function an(e,t,n){e.addEventListener&&e.addEventListener(t,n,!1)}function un(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}function sn(){return nn}var cn="undefined"==typeof Promise?n(3).Promise:Promise,ln=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.url,n=e.method,r=void 0===n?"GET":n,o=e.params,i=void 0===o?{}:o,a=e.continueCb,s=e.strategy,c=e.wait,l={url:t,method:r,params:i,continueCb:a},f=t,m=r,p=u()({},i),h=a,g=s,y=null,b={request:0,connection:0},k=P(c),S=null;function P(e){return(e=e||150)>2147483647?2147483647:e}function N(e){var t=e.url,n=e.method,r=e.params,o=e.continueCb;t&&(f=t),n&&(m=n),w(r)||(p=u()({},r)),p=u()({createdAt:ue()},p),"function"==typeof o&&(h=o)}function _(e){if(!S)return!1;if(y){var t=k-(Date.now()-S);if(e&&t0&&void 0!==arguments[0]?arguments[0]:{},t=e.url,n=e.method,r=e.params,o=void 0===r?{}:r,i=e.continueCb,a=e.wait;return N({url:t,method:n,params:o,continueCb:i}),x({wait:a})}function B(){return!!y}function K(){y&&clearTimeout(y),y=null}function F(){var e=!!S;K(),S=null,e&&(k=150,b.request=0,b.connection=0,q.log("Previous ".concat(f||"unknown"," request attempt canceled")),E())}return{send:M,isRunning:B,clear:F}},dn=function(e){return"gdpr"===e?"GDPR disable":"disable"},fn=function(e){return{start:{inProgress:"Adjust SDK ".concat(dn(e)," process has already started"),done:"Adjust SDK ".concat(dn(e)," process is now started")},finish:{inProgress:"Adjust SDK ".concat(dn(e)," process has already finished"),done:"Adjust SDK ".concat(dn(e)," process is now finished")}}};function mn(e,t){var n=e.reason,r=e.pending,o=Ke()||{},i="start"===t&&o.pending?"start":"finish",a="start"===t&&o.reason,u="finish"===t&&o.reason&&!o.pending;return a||u?(q.log(fn(o.reason)[i].inProgress),!1):(q.log(fn(n)[i].done),Fe({reason:n||"general",pending:r}),!0)}function pn(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return mn({reason:e,pending:t||!1},"start")}function vn(){var e=Ke()||{};return"general"===e.reason||"gdpr"===e.reason&&!e.pending?"off":"gdpr"===e.reason&&e.pending?"paused":"on"}var hn="undefined"==typeof Promise?n(3).Promise:Promise,gn=!1;function yn(e){return e?"unknown"===e.uuid?(pn({reason:"gdpr"}),we.destroy(),{exists:!0,stored:null}):(we.init(e),{exists:!0,stored:e}):{exists:!1}}function bn(){return"off"!==vn()&&we.isStarted()}function wn(){if(!bn())return hn.resolve(null);var e=u()(u()({},we.current),{},{lastActive:Date.now()});return Wt.updateItem("activityState",e).then((function(){return we.current=e}))}var kn="undefined"==typeof Promise?n(3).Promise:Promise,Sn=ln({strategy:"long",continueCb:function(e,t){var n=e&&e.continue_in||null;return Nn.pause=n?{timestamp:Date.now(),wait:n}:null,Wt.getFirst("queue").then((function(e){return e?Wt.deleteItem("queue",e.timestamp):null})).then((function(){return t(),Nn.running=!1,An({wait:n})}))}}),Pn=!1,Nn={running:!1,timestamp:null,pause:null};function _n(){var e=Date.now();return Nn.timestamp&&e<=Nn.timestamp&&(e=Nn.timestamp+1),Nn.timestamp=e,e}function xn(e){return x(e,"session")&&we.resetSessionOffset(),we.updateLastActive(),wn()}function jn(e){var t=e.url,n=e.method,r=e.params,o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=o.auto,a=o.timestamp;we.updateParams(t,i);var s=I(r||{}).filter((function(e){return A(d()(e,2)[1])})).reduce(j,{}),c={timestamp:_n(),url:t,method:n,params:u()(u()({},we.getParams(t)),s)};return a&&(c.createdAt=a),Wt.addItem("queue",c).then((function(){return xn(t)})).then((function(){return Nn.running?{}:An()}))}function On(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.timestamp,n=e.createdAt,r=e.url,o=e.method,i=e.params,a=arguments.length>1?arguments[1]:void 0,s=we.current||{},c="/session"===r&&!s.installed,l=!r&&!o&&!i;return Pn&&!c||l?(Nn.running=!1,kn.resolve({})):Sn.send({url:r,method:o,params:u()(u()({},i),{},{createdAt:ue(n||t)}),wait:a||In()})}function In(){var e=Nn.pause||{},t=e.timestamp,n=e.wait,r=Date.now()-(t||0);return r0&&void 0!==arguments[0]?arguments[0]:{},t=e.cleanUp,n=e.wait;if(Nn.running)return kn.resolve({});Nn.running=!0;var r=kn.resolve({});return t&&(r=r.then(En)),r.then((function(){return Wt.getFirst("queue")})).then((function(e){return On(e,n)}))}function Tn(e){if(void 0!==e)if(e!==Pn){var t=Pn;Pn=e,!e&&t&&An(),q.info("The app is now in ".concat(e?"offline":"online"," mode"))}else q.error("The app is already in ".concat(e?"offline":"online"," mode"));else q.error("State not provided, true or false has to be defined")}function En(){var e=Date.now()-V.requestValidityWindow;return Wt.deleteBulk("queue",e,"upperBound")}var Dn="undefined"==typeof Promise?n(3).Promise:Promise,Rn="No type provided",Cn="Global parameter type not provided, `callback` or `partner` types are available";function Ln(e){return(e||[]).map((function(e){return{key:e.key,value:e.value}}))}function Mn(){return Dn.all([Wt.filterBy("globalParams","callback"),Wt.filterBy("globalParams","partner")]).then((function(e){var t=d()(e,2),n=t[0],r=t[1];return{callbackParams:Ln(n),partnerParams:Ln(r)}}))}function Bn(e,t){if(void 0===t)return q.error(Cn),Dn.reject({message:Rn});var n=N(e),r=Object.keys(n).map((function(e){return{key:e,value:n[e],type:t}}));return Dn.all([Wt.filterBy("globalParams",t),Wt.addBulk("globalParams",r,!0)]).then((function(e){var n=d()(e,2),o=n[0],i=n[1],a=_(o.map((function(e){return e.key})),i.map((function(e){return e[0]})));return q.log("Following ".concat(t," parameters have been saved: ").concat(r.map((function(e){return"".concat(e.key,":").concat(e.value)})).join(", "))),a.length&&q.log("Keys: ".concat(a.join(", ")," already existed so their values have been updated")),i}))}function qn(e,t){return void 0===t?(q.error(Cn),Dn.reject({message:Rn})):Wt.deleteItem("globalParams",[e,t]).then((function(n){return q.log("".concat(e," ").concat(t," parameter has been deleted")),n}))}function Kn(e){return void 0===e?(q.error(Cn),Dn.reject({message:Rn})):Wt.deleteBulk("globalParams",e).then((function(t){return q.log("All ".concat(e," parameters have been deleted")),t}))}var Fn,Un,Gn,Wn="undefined"==typeof Promise?n(3).Promise:Promise,Hn=!1,Yn=document;function Jn(){return Gn=function(){var e=document;if(void 0!==e.hidden)return{hidden:"hidden",visibilityChange:"visibilitychange"};for(var t=I({mozHidden:"mozvisibilitychange",msHidden:"msvisibilitychange",oHidden:"ovisibilitychange",webkitHidden:"webkitvisibilitychange"}),n=0;n0;return!n||n&&1e3*t>=V.sessionWindow?Mn().then((function(e){var t,n,r;jn({url:"/session",method:"POST",params:(t=e,n=t.callbackParams,r=t.partnerParams,{callbackParams:n.length?N(n):null,partnerParams:r.length?N(r):null})},{auto:!0})})):(Ce("attribution:check"),wn())}var er="undefined"==typeof Promise?n(3).Promise:Promise,tr=ln({url:"/attribution",strategy:"short",continueCb:function(e,t,n){if(!e||e&&"error"===e.status)return t(),er.resolve({state:"unknown"});if(!e.ask_in)return t(),function(e){if(w(e)||!function(e){var t=e.adid,n=void 0===t?"":t,r=e.attribution,o=void 0===r?{}:r;return!!n&&!!_(nr,Object.keys(o)).length}(e)||function(e){var t=e.adid,n=e.attribution,r=we.current.attribution||{};return!(n&&nr.some((function(e){return r[e]!==n[e]})))&&t===r.adid}(e))return er.resolve({state:"same"});var t=I(e.attribution).filter((function(e){var t=d()(e,1)[0];return-1!==nr.indexOf(t)})).reduce(j,{adid:e.adid});return we.current=u()(u()({},we.current),{},{attribution:t}),wn().then((function(){return Ce("attribution:change",t),q.info("Attribution has been updated"),{state:"changed"}}))}(e);return n(e.ask_in)}}),nr=["tracker_token","tracker_name","network","campaign","adgroup","creative","click_label","state"];var rr=ln({url:"/gdpr_forget_device",method:"POST",strategy:"short"}),or={running:"Adjust SDK is running pending GDPR Forget Me request",pending:"Adjust SDK will run GDPR Forget Me request after initialisation",paused:"Adjust SDK is already prepared to send GDPR Forget Me request",off:"Adjust SDK is already disabled"};function ir(e){var t=vn();return e||"on"===t?V.isInitialised()?(rr.send({params:u()({},we.getParams())}).then((function(){Ce("sdk:gdpr-forget-me")})),!0):(q.log(or.pending),!0):(q.log(or[t]),!1)}function ar(){return mn({reason:"gdpr",pending:!1},"finish")}var ur={running:"Adjust SDK is running pending third-party sharing opt-out request",delayed:"Adjust SDK will run third-party sharing opt-out request after initialisation",pending:"Adjust SDK already queued third-party sharing opt-out request",off:"Third-party sharing opt-out is already done",start:{inProgress:"Third-party sharing opt-out has already started",done:"Third-party sharing opt-out is now started"},finish:{inProgress:"Third-party sharing opt-out has already finished",done:"Third-party sharing opt-out is now finished"}};function sr(){var e=Ue()||{};return e.reason?e.pending?"pending":"off":"on"}function cr(e){var t=sr();return e||"on"===t?V.isInitialised()?(jn({url:"/disable_third_party_sharing",method:"POST"}),!0):(q.log(ur.delayed),!0):(q.log(ur[t]),!1)}function lr(e,t){var n,r,o=Ue()||{},i="start"===t&&e?"start":"finish",a="start"===t&&o.reason,s="finish"===t&&o.reason&&!o.pending;return a||s?(q.log(ur[i].inProgress),!1):(q.log(ur[i].done),r=(n={reason:"general",pending:e})?u()({},n):null,Te.stores[Le]=u()(u()({},Be()),{},{thirdPartySharingDisabled:r}),qe(),!0)}function dr(){return lr(!1,"finish")}function fr(){"pending"===sr()&&(q.log(ur.running),cr(!0))}var mr=[];function pr(e,t){mr.push({method:e,description:t,timestamp:Date.now()})}var vr="undefined"==typeof Promise?n(3).Promise:Promise;function hr(e,t){var n,r,o=t.callbackParams,i=t.partnerParams,a={},s=u()({eventToken:e.eventToken},(n=e.revenue,r=e.currency,isNaN(n)||(n=parseFloat(n))<0||!r?{}:{revenue:n.toFixed(5),currency:r})),c=u()(u()({},N(o)),N(e.callbackParams)),l=u()(u()({},N(i)),N(e.partnerParams));return w(c)||(a.callbackParams=c),w(l)||(a.partnerParams=l),u()(u()({},s),a)}function gr(e){return e?Wt.getAll("eventDeduplication").then((function(e){return e.map((function(e){return e.id}))})).then((function(t){return-1===t.indexOf(e)?function(e){var t=V.getCustomConfig().eventDeduplicationListLimit,n=t>0?t:10;return Wt.count("eventDeduplication").then((function(e){var t=vr.resolve();if(e>=n){var r=e-n+1;q.log("Event deduplication list limit has been reached. Oldest ids are about to be removed (".concat(r," of them)")),t=Wt.trimItems("eventDeduplication",r)}return t})).then((function(){return q.info("New event deduplication id is added to the list: ".concat(e)),Wt.addItem("eventDeduplication",{id:e})}))}(e):vr.reject({message:"Event won't be tracked, since it was previously tracked with the same deduplication id ".concat(e)})})):vr.resolve()}function yr(e){return{clickTime:ue(),source:"web_referrer",referrer:decodeURIComponent(e)}}function br(){var e=window.location.search.substring(1).split("&").map((function(e){return e.split("=")})).reduce(j,{}).adjust_referrer;e&&jn({url:"/sdk_click",method:"POST",params:yr(e)})}var wr="undefined"==typeof Promise?n(3).Promise:Promise,kr=null,Sr=!1,Pr=!1;function Nr(){cr()&&lr(!0,"start")}function _r(){var e;"paused"===vn()&&(ar(),wr.all([(e={uuid:"unknown"},we.current=e,Wt.clear("activityState").then((function(){return Wt.addItem("activityState",e)}))),Wt.clear("globalParams"),Wt.clear("queue")]).then(Or))}function xr(){Sr=!1,mr=[],Sn.clear(),Nn.running=!1,Nn.timestamp=null,Nn.pause=null,Hn=!1,we.toBackground(),Zn(),Gn&&(clearTimeout(Un),un(Yn,Gn.visibilityChange,Qn)),tr.clear()}function jr(e){e&&q.log("Adjust SDK has been shutdown due to asynchronous disable"),xr(),De.forEach(clearTimeout),De=[],Ee={},we.destroy(),un(window,"online",rn),un(window,"offline",on),Wt.destroy(),V.destroy()}function Or(){jr(),rr.clear(),kr=null,q.log("Adjust SDK instance has been destroyed")}function Ir(e){q.log("Adjust SDK is starting with web_uuid set to ".concat(e.uuid));var t=we.current.installed;"paused"===vn()&&(q.log(or.running),ir(!0)),t||fr();var n=vn(),r=function(e){return"Adjust SDK start has been interrupted ".concat(e)};return"off"===n?(jr(),wr.reject({interrupted:!0,message:r("due to complete async disable")})):"paused"===n?(xr(),wr.reject({interrupted:!0,message:r("due to partial async disable")})):Sr?wr.reject({interrupted:!0,message:r("due to multiple synchronous start attempt")}):(An({cleanUp:!0}),Jn().then((function(){Sr=!0,t&&(Ar(),fr())})))}function Ar(){var e;Pr=!0,mr.forEach((function(e){"function"==typeof e.method&&(q.log("Delayed ".concat(e.description," task is running now")),e.method(e.timestamp))})),mr=[],(e="sdk:installed")&&I(Ee).some((function(t){var n=d()(t,2)[1];return n.some((function(t,r){if(t.id===e)return n.splice(r,1),!0}))}))}function Tr(e){if(e.interrupted)q.log(e.message);else if(jr(),q.error("Adjust SDK start has been canceled due to an error",e),e.stack)throw e}function Er(e){"off"!==vn()?(V.set(e),an(window,"online",rn),an(window,"offline",on),Re("sdk:installed",Ar),Re("sdk:shutdown",(function(){return jr(!0)})),Re("sdk:gdpr-forget-me",_r),Re("sdk:third-party-sharing-opt-out",dr),Re("attribution:check",(function(e,t){return n=t,r=we.current,(o=(n||{}).ask_in)||!r.attribution&&r.installed?(tr.send({params:u()({initiatedBy:n?"backend":"sdk"},we.getParams()),wait:o}),we.updateSessionOffset(),wn()):er.resolve(r);var n,r,o})),"function"==typeof e.attributionCallback&&Re("attribution:change",e.attributionCallback),(gn?hn.reject({interrupted:!0,message:"Adjust SDK start already in progress"}):(gn=!0,Wt.getFirst("activityState").then(yn).then((function(e){if(e.exists)return gn=!1,e.stored;var t,n=w(we.current)?{uuid:(t=Date.now(),"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,(function(e){var n=(t+16*Math.random())%16|0;return t=Math.floor(t/16),("x"===e?n:11&n).toString(16)})))}:we.current;return Wt.addItem("activityState",n).then((function(){return we.init(n),Ge(),gn=!1,n}))})))).then(Ir).then(br).catch(Tr)):q.log("Adjust SDK is disabled, can not start the sdk")}function Dr(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.schedule,o=n.stopBeforeInit;Wt?"on"===vn()?r&&o&&!V.isInitialised()?q.error("Adjust SDK can not ".concat(e,", sdk instance is not initialized")):"function"==typeof t&&(!r||Pr&&Sr||!o&&!V.isInitialised()?t():(pr(t,e),q.log("Running ".concat(e," is delayed until Adjust SDK is up")))):q.log("Adjust SDK is disabled, can not ".concat(e)):q.log("Adjust SDK can not ".concat(e,", no storage available"))}var Rr={initSdk:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.logLevel,n=e.logOutput,r=c()(e,["logLevel","logOutput"]);q.setLogLevel(t,n),Wt?(q.info("Available storage is ".concat(Wt.type)),V.isInitialised()?q.error("You already initiated your instance"):V.hasMissing(r)||(kr=u()({},r),Er(r))):q.error("Adjust SDK can not start, there is no storage available")},trackEvent:function(e){Dr("track event",(function(t){return function(e,t){if(e&&(!e||!w(e)&&e.eventToken))return gr(e.deduplicationId).then(Mn).then((function(n){jn({url:"/event",method:"POST",params:hr(e,n)},{timestamp:t})})).catch((function(e){e&&e.message&&q.error(e.message)}));q.error("You must provide event token in order to track event")}(e,t)}),{schedule:!0,stopBeforeInit:!0})},addGlobalCallbackParameters:function(e){Dr("add global callback parameters",(function(){return Bn(e,"callback")}))},addGlobalPartnerParameters:function(e){Dr("add global partner parameters",(function(){return Bn(e,"partner")}))},removeGlobalCallbackParameter:function(e){Dr("remove global callback parameter",(function(){return qn(e,"callback")}))},removeGlobalPartnerParameter:function(e){Dr("remove global partner parameter",(function(){return qn(e,"partner")}))},clearGlobalCallbackParameters:function(){Dr("remove all global callback parameters",(function(){return Kn("callback")}))},clearGlobalPartnerParameters:function(){Dr("remove all global partner parameters",(function(){return Kn("partner")}))},switchToOfflineMode:function(){Dr("set offline mode",(function(){return Tn(!0)}))},switchBackToOnlineMode:function(){Dr("set online mode",(function(){return Tn(!1)}))},stop:function(){pn()&&V.isInitialised()&&jr()},restart:function(){var e;("gdpr"===(e=Ke()||{}).reason?(q.log("Adjust SDK is disabled due to GDPR-Forget-Me request and it can not be re-enabled"),!1):e.reason?(q.log("Adjust SDK has been enabled"),Fe(null),!0):(q.log("Adjust SDK is already enabled"),!1))&&kr&&Er(kr)},gdprForgetMe:function(){var e=ir();e&&(e=pn("gdpr",!0))&&V.isInitialised()&&xr()},disableThirdPartySharing:function(){Dr("disable third-party sharing",Nr,{schedule:!0,stopBeforeInit:!1})},__testonly__:{destroy:Or}};t.default=Rr}]).default}));
\ No newline at end of file
+ */var r;r=function(){"use strict";function e(e){return"function"==typeof e}var r=Array.isArray?Array.isArray:function(e){return"[object Array]"===Object.prototype.toString.call(e)},o=0,i=void 0,a=void 0,u=function(e,t){m[o]=e,m[o+1]=t,2===(o+=2)&&(a?a(h):k())},s="undefined"!=typeof window?window:void 0,c=s||{},l=c.MutationObserver||c.WebKitMutationObserver,d="undefined"==typeof self&&void 0!==t&&"[object process]"==={}.toString.call(t),f="undefined"!=typeof Uint8ClampedArray&&"undefined"!=typeof importScripts&&"undefined"!=typeof MessageChannel;function p(){var e=setTimeout;return function(){return e(h,1)}}var m=new Array(1e3);function h(){for(var e=0;ee.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}},function(e,t){function n(t){return"function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?e.exports=n=function(e){return typeof e}:e.exports=n=function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n(t)}e.exports=n},function(e,t){e.exports=function(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r=0||(o[n]=e[n]);return o}},function(e,t){var n,r,o=e.exports={};function i(){throw new Error("setTimeout has not been defined")}function a(){throw new Error("clearTimeout has not been defined")}function u(e){if(n===setTimeout)return setTimeout(e,0);if((n===i||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}!function(){try{n="function"==typeof setTimeout?setTimeout:i}catch(e){n=i}try{r="function"==typeof clearTimeout?clearTimeout:a}catch(e){r=a}}();var s,c=[],l=!1,d=-1;function f(){l&&s&&(l=!1,s.length?c=s.concat(c):d=-1,c.length&&p())}function p(){if(!l){var e=u(f);l=!0;for(var t=c.length;t;){for(s=c,c=[];++d1)for(var n=1;n0&&void 0!==arguments[0]?arguments[0]:[];return e.reduce((function(e,t){return o()(o()({},e),{},v()({},t.key,t.value))}),{})}function P(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];return e.filter((function(e){return-1!==t.indexOf(e)}))}function x(e,t){return new RegExp("\\/".concat(t,"(\\/.*|\\?.*){0,1}$")).test(e)}function D(e,t){var n=s()(t,2),r=n[0],i=n[1];return o()(o()({},e),{},v()({},r,i))}function _(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1?arguments[1]:void 0,n={entries:function(t){return[t,e[t]]},values:function(t){return e[t]}};return Object[t]?Object[t](e):Object.keys(e).map(n[t])}function I(e){return _(e,"entries")}function T(e){return _(e,"values")}function O(e){return k(e)?!b(e):!!e||0===e}var C,j={namespace:"adjust-sdk",version:"5.1.2",env:"production"},A=(C={},v()(C,"none",-1),v()(C,"error",0),v()(C,"warning",1),v()(C,"info",2),v()(C,"verbose",3),C),E={log:" ",info:" ",warn:" ",error:""},R={development:"verbose",production:"error",test:"verbose"},B=q(),M="";function q(){return R[j.env]||"error"}function L(e,t){var n;if(!(A[B]2?u-2:0),c=2;c1&&void 0!==arguments[1]?arguments[1]:1,n=e+"",r=1;r<=t;r+=1)e0?"-":"+")+fe(Math.floor(Math.abs(t)/60))+fe(Math.abs(t)%60)}(t);return"".concat(n,"T").concat(r,"Z").concat(o)}function me(e,t){return isNaN(e)||isNaN(t)?0:Math.abs(t-e)}var he={},ve=!1,ge=!1;function ye(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};he=ve?o()({},e):{}}function be(){ve&&(he.lastInterval=function(){var e=he.lastActive;if(e)return Math.round(me(e,Date.now())/1e3);return-1}(),he.lastActive=Date.now())}function ke(e){he=o()(o()({},he),e)}function we(){ge=!0}function Se(){var e=he.lastActive;return Math.round(me(e,Date.now())/1e3)}function Ne(){return(he.timeSpent||0)+(ge?Se():0)}function Pe(){var e=me(he.lastActive,Date.now())=0?he.lastInterval:0,n={timeSpent:he.timeSpent||0,sessionLength:he.sessionLength||0,sessionCount:he.sessionCount||1,lastInterval:t||0};return e&&x(e,"event")&&(n.eventCount=he.eventCount),n},updateParams:function(e,t){if(ve){var n={};n.timeSpent=Ne(),n.sessionLength=Pe(),x(e,"session")&&(n.sessionCount=(he.sessionCount||0)+1),x(e,"event")&&(n.eventCount=(he.eventCount||0)+1),ke(n),t||be()}},updateInstalled:function(){ve&&(he.installed||ke({installed:!0}))},updateSessionOffset:xe,updateSessionLength:function(){ve&&(ke({sessionLength:Pe()}),be())},resetSessionOffset:function(){ve&&ke({timeSpent:0,sessionLength:0})},updateLastActive:be,destroy:function(){he={},ve=!1,ge=!1}};function Ie(e,t){return e&&void 0!==e[t]?e[t]:t}function Te(e){var t=e.storeName,n=e.dir,r=e.record,i=e.scheme;if(r)return i=i||de[n][Ae({storeName:t,dir:De.right})].fields,I(r).map((function(e){var r=s()(e,2),o=r[0],a=r[1];return function(e){var t=e.storeName,n=e.scheme,r=e.dir,o=e.key,i=e.value;if(!n)return[o,i];var a=n.key||n;return k(i)?[a,Te({storeName:t,dir:r,record:i,scheme:n.keys})]:[a,Ie(n.values,i)]}({storeName:t,scheme:i[o],dir:n,key:o,value:a})})).reduce((function(e,t){var n=s()(t,2),r=n[0],i=n[1];return o()(o()({},e),{},v()({},r,i))}),{})}function Oe(e){var t=e.storeName,n=e.dir,r=e.records;return(void 0===r?[]:r).map((function(e){return Te({storeName:t,dir:n,record:e})}))}function Ce(e){var t=e.storeName,n=e.dir,r=e.target,o=de[n][Ae({storeName:t,dir:De.right})],i=o.fields[o.keyPath],a=r instanceof Array?r.slice():[r],u=(i.composite||[o.keyPath]).map((function(e,t){return Ie(o.fields[e].values,a[t])}));return 1===u.length?u[0]:u}function je(e){return de.values[e]||e}function Ae(e){var t=e.storeName,n=e.dir;return(de.storeNames[n][t]||{}).name||t}function Ee(e){var t=e.storeName,n=e.error;return{name:n.name,message:n.message.replace('"'.concat(t,'"'),Ae({storeName:t,dir:De.right}))}}!function(e){e.right="right",e.left="left"}(De||(De={}));var Re=new(function(){function e(){var t=this;Z()(this,e),v()(this,"defaultName",j.namespace),v()(this,"storageName",this.defaultName),v()(this,"storeNames",de.storeNames.left),v()(this,"storesMap",void 0),this.storesMap={};var n=this.read.bind(this),r=this.write.bind(this);T(this.storeNames).forEach((function(e){Object.defineProperty(t.storesMap,e.name,{get:function(){return n(e.name)},set:function(t){r(e.name,t)}})})),Object.freeze(this.storesMap)}return ee()(e,[{key:"read",value:function(e){var t=localStorage.getItem("".concat(this.storageName,".").concat(e)),n=JSON.parse(t||"null");return(n instanceof Array?n:Te({storeName:this.storeNames.preferences.name,dir:De.right,record:n}))||null}},{key:"write",value:function(e,t){t?localStorage.setItem("".concat(this.storageName,".").concat(e),JSON.stringify(t instanceof Array?t:Te({storeName:this.storeNames.preferences.name,dir:De.left,record:t}))):localStorage.removeItem("".concat(this.storageName,".").concat(e))}},{key:"clear",value:function(){this.deleteData()}},{key:"deleteData",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];T(this.storeNames).forEach((function(n){!t&&n.permanent||localStorage.removeItem("".concat(e.storageName,".").concat(n.name))}))}}]),ee()(e,[{key:"setCustomName",value:function(e){var t=this;if(e&&e.length){var n="".concat(j.namespace,"-").concat(e);T(this.storeNames).forEach((function(e){var r=e.name,o=localStorage.getItem("".concat(t.storageName,".").concat(r));o&&localStorage.setItem("".concat(n,".").concat(r),o)})),this.deleteData(!0),this.storageName=n}}},{key:"stores",get:function(){return this.storesMap}}]),e}()),Be={},Me=[];function qe(e,t){var n="id"+Math.random().toString(36).substr(2,16),r={id:n,cb:t};return Be[e]||(Be[e]=[]),Be[e].push(r),n}function Le(e,t){Be[e]&&Be[e].forEach((function(n){"function"==typeof n.cb&&Me.push(setTimeout((function(){return n.cb(e,t)})))}))}var Ke=te.preferences.name,Fe=Ue();function Ue(){return Fe||Ge(),Fe?o()({},Fe):null}function Ge(){Fe=Re.stores[Ke]}function Ve(){var e=Ue();return e?e.sdkDisabled:null}function We(e){var t=e?o()({},e):null;Re.stores[Ke]=o()(o()({},Ue()),{},{sdkDisabled:t}),Ge()}function He(){var e=Ue();return e?e.thirdPartySharingDisabled:null}function Ye(){var e=Re.stores[Ke]||{},t=(Fe||{}).sdkDisabled||null;e.sdkDisabled&&!t&&Le("sdk:shutdown"),Ge()}function Je(){Re.stores[Ke]||(Re.stores[Ke]=o()({},Fe))}var ze,Qe="undefined"==typeof Promise?n(3).Promise:Promise;!function(e){e.add="add",e.put="put",e.get="get",e.list="list",e.clear="clear",e.delete="delete"}(ze||(ze={}));var Xe=function(){function e(){Z()(this,e),v()(this,"dbDefaultName",j.namespace),v()(this,"dbName",this.dbDefaultName),v()(this,"dbVersion",1),v()(this,"idbFactory",void 0),v()(this,"indexedDbConnection",null),v()(this,"notSupportedError",{name:"IDBNotSupported",message:"IndexedDB is not supported"}),v()(this,"databaseOpenError",{name:"CannotOpenDatabaseError",message:"Cannot open a database"}),v()(this,"noConnectionError",{name:"NoDatabaseConnection",message:"Cannot open a transaction"});var t=e.getIndexedDB();if(!t)throw this.notSupportedError;this.idbFactory=t}return ee()(e,null,[{key:"tryOpen",value:function(t){return new Qe((function(n){try{var r=t.open(e.dbValidationName);r.onsuccess=function(){r.result.close(),t.deleteDatabase(e.dbValidationName),n(!0)},r.onerror=function(){return n(!1)}}catch(e){n(!1)}}))}},{key:"isSupported",value:function(){return e.isSupportedPromise||(e.isSupportedPromise=new Qe((function(t){var n=e.getIndexedDB(),r=!!navigator.platform&&/iPad|iPhone|iPod/.test(navigator.platform);!n||r?(F.warn("IndexedDB is not supported in this browser"),t(!1)):t(e.tryOpen(n).then((function(e){return e||F.warn("IndexedDB is not supported in this browser"),e})))}))),e.isSupportedPromise}},{key:"getIndexedDB",value:function(){return window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB}}]),ee()(e,[{key:"setCustomName",value:function(e){return e&&e.length>0?(this.dbName="".concat(j.namespace,"-").concat(e),this.migrateDb(this.dbDefaultName,this.dbName)):Qe.resolve()}},{key:"openDatabase",value:function(t,n,r){var o=this;return e.isSupported().then((function(e){return e?new Qe((function(e,i){var a=o.idbFactory.open(t,n);r&&(a.onupgradeneeded=function(e){return r(e,i)}),a.onsuccess=function(t){var n=t.target.result;n?e(n):i(o.databaseOpenError)},a.onerror=i})):Qe.reject(o.notSupportedError)}))}},{key:"databaseExists",value:function(e){var t=this;return new Qe((function(n){var r=!0;t.openDatabase(e,void 0,(function(){r=!1})).then((function(n){if(n.close(),!r)return t.deleteDatabaseByName(e)})).then((function(){return n(r)}))}))}},{key:"cloneData",value:function(e,t){var n=this;return T(de.storeNames.left).filter((function(e){return!e.permanent})).map((function(e){return e.name})).map((function(r){return function(){return o=r,i=n.indexedDbConnection,n.indexedDbConnection=e,n.getAll(o).then((function(e){if(n.indexedDbConnection=t,!(e.length<1))return n.addBulk(o,e,!0)})).then((function(){n.indexedDbConnection=i}));var o,i}})).reduce((function(e,t){return e.then(t)}),Qe.resolve())}},{key:"migrateDb",value:function(e,t){var n=this;return this.databaseExists(e).then((function(r){return r?Qe.all([n.openDatabase(e,n.dbVersion,n.handleUpgradeNeeded),n.openDatabase(t,n.dbVersion,n.handleUpgradeNeeded)]).then((function(t){var r=s()(t,2),o=r[0],i=r[1];return n.cloneData(o,i).then((function(){return n.indexedDbConnection=i,o.close(),n.deleteDatabaseByName(e)}))})).then((function(){return F.info("Database migration finished")})):n.openDatabase(t,n.dbVersion,n.handleUpgradeNeeded).then((function(e){n.indexedDbConnection=e}))}))}},{key:"handleUpgradeNeeded",value:function(e,t){var n=e.target.result;e.target.transaction.onerror=t,e.target.transaction.onabort=t;var r=de.storeNames.left,o=_e.current||{},i=o&&!b(o);I(r).filter((function(e){return!s()(e,2)[1].permanent})).forEach((function(e){var t=s()(e,2),a=t[0],u=t[1],c=de.right[a],l=n.createObjectStore(u.name,{keyPath:c.keyPath,autoIncrement:c.autoIncrement||!1});c.index&&l.createIndex("".concat(c.index,"Index"),c.index),u.name===r.activityState.name&&i?(l.add(Te({storeName:a,record:o,dir:De.left})),F.info("Activity state has been recovered")):Re.stores[u.name]&&(Re.stores[u.name].forEach((function(e){return l.add(e)})),F.info("Migration from localStorage done for ".concat(a," store")))})),Je(),Re.clear()}},{key:"open",value:function(){var e=this;return this.indexedDbConnection?Qe.resolve({success:!0}):this.openDatabase(this.dbName,this.dbVersion,this.handleUpgradeNeeded).then((function(t){return e.indexedDbConnection=t,e.indexedDbConnection.onclose=function(){return e.destroy},{success:!0}}))}},{key:"getTransactionStore",value:function(e,t,n){var r,o=e.storeName,i=e.mode,a=n.transaction([o],i),u=a.objectStore(o),s=de.right[Ae({storeName:o,dir:De.right})];return s.index&&(r=u.index("".concat(s.index,"Index"))),a.onerror=t,a.onabort=t,{transaction:a,store:u,index:r,options:s}}},{key:"overrideError",value:function(e,t){var n=t.target.error;return e({name:n.name,message:n.message})}},{key:"getCompositeKeys",value:function(e){return e.fields[e.keyPath].composite||null}},{key:"prepareTarget",value:function(e,t,n){var r=-1!==[ze.add,ze.put].indexOf(n),i=this.getCompositeKeys(e);return i?r?o()(v()({},e.keyPath,i.map((function(e){return t[e]})).join("")),t):t?t.join(""):null:t}},{key:"prepareResult",value:function(e,t){var n=this.getCompositeKeys(e);return n&&k(t)?n.map((function(e){return t[e]})):null}},{key:"initRequest",value:function(e){var t=this,n=e.storeName,r=e.target,o=void 0===r?null:r,i=e.action,a=e.mode,u=void 0===a?"readonly":a;return this.open().then((function(){return new Qe((function(e,r){if(t.indexedDbConnection){var a=t.getTransactionStore({storeName:n,mode:u},r,t.indexedDbConnection),s=a.store,c=a.options,l=s[i](t.prepareTarget(c,o,i)),d=t.prepareResult(c,o);l.onsuccess=function(){i!==ze.get||l.result?e(d||l.result||o):r({name:"NotRecordFoundError",message:'Requested record not found in "'.concat(n,'" store')})},l.onerror=function(e){return t.overrideError(r,e)}}else r(t.noConnectionError)}))}))}},{key:"initBulkRequest",value:function(e){var t=this,n=e.storeName,r=e.target,o=e.action,i=e.mode,a=void 0===i?"readwrite":i;return!r||r&&!r.length?Qe.reject({name:"NoTargetDefined",message:"No array provided to perform ".concat(o,' bulk operation into "').concat(n,'" store')}):this.open().then((function(){return new Qe((function(e,i){if(t.indexedDbConnection){var u=t.getTransactionStore({storeName:n,mode:a},i,t.indexedDbConnection),s=u.transaction,c=u.store,l=u.options,d=new Array,f=r[0];s.oncomplete=function(){return e(d)};!function e(n){n.onerror=function(e){return t.overrideError(i,e)},n.onsuccess=function(){d.push(t.prepareResult(l,f)||n.result),f=r[d.length],d.length1&&void 0!==arguments[1]&&arguments[1];return this.openCursor({storeName:e,action:ze.list,firstOnly:t})}},{key:"getFirst",value:function(e){return this.getAll(e,!0)}},{key:"getItem",value:function(e,t){return this.initRequest({storeName:e,target:t,action:ze.get})}},{key:"filterBy",value:function(e,t){var n=IDBKeyRange.only(t);return this.openCursor({storeName:e,action:ze.list,range:n})}},{key:"addItem",value:function(e,t){return this.initRequest({storeName:e,target:t,action:ze.add,mode:"readwrite"})}},{key:"addBulk",value:function(e,t,n){return this.initBulkRequest({storeName:e,target:t,action:n?ze.put:ze.add,mode:"readwrite"})}},{key:"updateItem",value:function(e,t){return this.initRequest({storeName:e,target:t,action:ze.put,mode:"readwrite"})}},{key:"deleteItem",value:function(e,t){return this.initRequest({storeName:e,target:t,action:ze.delete,mode:"readwrite"})}},{key:"deleteBulk",value:function(e,t,n){var r=n?IDBKeyRange[n](t):IDBKeyRange.only(t);return this.openCursor({storeName:e,action:ze.delete,range:r,mode:"readwrite"})}},{key:"trimItems",value:function(e,t){var n=this,r=de.right[Ae({storeName:e,dir:De.right})];return this.getAll(e).then((function(e){return e.length?e[t-1]:null})).then((function(t){return t?n.deleteBulk(e,t[r.keyPath],"upperBound"):[]}))}},{key:"count",value:function(e){var t=this;return this.open().then((function(){return new Qe((function(n,r){if(t.indexedDbConnection){var o=t.getTransactionStore({storeName:e,mode:"readonly"},r,t.indexedDbConnection).store.count();o.onsuccess=function(){return n(o.result)},o.onerror=function(e){return t.overrideError(r,e)}}else r(t.noConnectionError)}))}))}},{key:"clear",value:function(e){return this.initRequest({storeName:e,action:ze.clear,mode:"readwrite"})}},{key:"destroy",value:function(){this.indexedDbConnection&&this.indexedDbConnection.close(),this.indexedDbConnection=null}},{key:"deleteDatabase",value:function(){return this.destroy(),this.deleteDatabaseByName(this.dbName)}}]),e}();v()(Xe,"dbValidationName","validate-db-openable"),v()(Xe,"isSupportedPromise",null);var Ze="undefined"==typeof Promise?n(3).Promise:Promise,$e=function(){function e(){Z()(this,e)}return ee()(e,[{key:"open",value:function(){return e.isSupported().then((function(e){if(!e)return{status:"error",error:{name:"LSNotSupported",message:"LocalStorage is not supported"}};var t=de.storeNames.left,n=_e.current||{},r=n&&!b(n);return I(t).filter((function(e){return!s()(e,2)[1].permanent})).forEach((function(e){var o=s()(e,2),i=o[0],a=o[1],u=t.activityState.name;a.name!==u||Re.stores[u]?Re.stores[a.name]||(Re.stores[a.name]=[]):Re.stores[u]=r?[Te({storeName:i,record:n,dir:De.left})]:[]})),Je(),{status:"success"}}))}},{key:"getCompositeKeys",value:function(e){return e.fields[e.keyPath].composite||null}},{key:"getKeys",value:function(e){var t=de.right[Ae({storeName:e,dir:De.right})];return this.getCompositeKeys(t)||[t.keyPath]}},{key:"initRequest",value:function(e,t){var n=this,r=e.storeName,i=e.id,a=e.item,u=de.right[Ae({storeName:r,dir:De.right})];return this.open().then((function(e){return"error"===e.status?Ze.reject(e.error):new Ze((function(e,s){var c=Re.stores[r],l=n.getKeys(r),d=i instanceof Array?i.slice():[i],f=(c[c.length-1]||{})[u.keyPath]||0,p=i?l.map((function(e,t){return[e,d[t]]})).reduce(D,{}):o()({},a),m=p?S(c,l,p):null;return t(e,s,{keys:l,items:c,index:m,options:u,lastId:f})}))}))}},{key:"sort",value:function(e,t,n){var r=l()(e),o=t.slice().reverse();return r.sort((function(e,t){return o.reduce((function(r,o){return r||function(e,t,r){var o=n?n===e[r]:e[r]e[r]:e[r]>t[r];return o?-1:i?1:0}(e,t,o)}),0)}))}},{key:"prepareTarget",value:function(e,t,n){var r=this.getCompositeKeys(e);return r?o()(v()({},e.keyPath,r.map((function(e){return t[e]})).join("")),t):e.autoIncrement&&n?o()(v()({},e.keyPath,n),t):o()({},t)}},{key:"prepareResult",value:function(e,t){var n=this.getCompositeKeys(e);return n&&k(t)?n.map((function(e){return t[e]})):t[e.keyPath]||t}},{key:"getAll",value:function(e,t){var n=this;return this.open().then((function(r){return"error"===r.status?Ze.reject(r.error):new Ze((function(r,o){var i=Re.stores[e];i instanceof Array?r(t?i[0]:n.sort(i,n.getKeys(e))):o({name:"NotFoundError",message:"No objectStore named ".concat(e," in this database")})}))}))}},{key:"getFirst",value:function(e){return this.getAll(e,!0)}},{key:"getItem",value:function(e,t){var n=this;return this.initRequest({storeName:e,id:t},(function(t,r,o){var i=o.items,a=o.index,u=o.options;-1===a?r({name:"NotRecordFoundError",message:'Requested record not found in "'.concat(e,'" store')}):t(n.prepareTarget(u,i[a]))}))}},{key:"filterBy",value:function(e,t){return this.getAll(e).then((function(n){return n.filter((function(n){return n[de.right[Ae({storeName:e,dir:De.right})].index]===t}))}))}},{key:"addItem",value:function(e,t){var n=this;return this.initRequest({storeName:e,item:t},(function(r,o,i){var a=i.items,u=i.index,s=i.options,c=i.lastId;-1!==u?o({name:"ConstraintError",message:'Constraint was not satisfied, trying to add existing item into "'.concat(e,'" store')}):(a.push(n.prepareTarget(s,t,c+1)),Re.stores[e]=a,r(n.prepareResult(s,t)))}))}},{key:"addBulk",value:function(e,t,n){var r=this;return this.initRequest({storeName:e},(function(o,i,a){var u=a.keys,s=a.items,c=a.options,d=a.lastId;if(!t||t&&!t.length)return i({name:"NoTargetDefined",message:'No array provided to perform add bulk operation into "'.concat(e,'" store')});var f=d,p=t.map((function(e){return r.prepareTarget(c,e,++f)})),m=p.filter((function(e){return-1!==S(s,u,e)})).map((function(e){return e[c.keyPath]})),h=n?s.filter((function(e){return-1===m.indexOf(e[c.keyPath])})):l()(s);m.length&&!n?i({name:"ConstraintError",message:'Constraint was not satisfied, trying to add existing items into "'.concat(e,'" store')}):(Re.stores[e]=r.sort([].concat(l()(h),l()(p)),u),o(t.map((function(e){return r.prepareResult(c,e)}))))}))}},{key:"updateItem",value:function(e,t){var n=this;return this.initRequest({storeName:e,item:t},(function(r,o,i){var a=i.items,u=i.index,s=i.options,c=i.lastId,l=-1===u?c+1:null,d=n.prepareTarget(s,t,l);-1===u?a.push(d):a.splice(u,1,d),Re.stores[e]=a,r(n.prepareResult(s,t))}))}},{key:"deleteItem",value:function(e,t){return this.initRequest({storeName:e,id:t},(function(n,r,o){var i=o.items,a=o.index;-1!==a&&(i.splice(a,1),Re.stores[e]=i),n(t)}))}},{key:"findMax",value:function(e,t,n){if(!e.length)return-1;for(var r={index:-1,value:isNaN(n)?"":0},o=0;o=r.value&&(r={value:e[o][t],index:o})}return r.index}},{key:"deleteBulk",value:function(e,t,n){var r=this;return this.getAll(e).then((function(o){var i=r.getKeys(e),a=de.right[Ae({storeName:e,dir:De.right})].index||i[0],u=n?null:t,s=r.sort(o,i,u),c=r.findMax(s,a,t);if(-1===c)return[];var l="lowerBound"===n?c:0,d=n&&"upperBound"!==n?s.length:c+1,f=s.splice(l,d).map((function(e){return 1===i.length?e[a]:i.map((function(t){return e[t]}))}));return Re.stores[e]=s,f}))}},{key:"trimItems",value:function(e,t){var n=this,r=de.right[Ae({storeName:e,dir:De.right})];return this.getAll(e).then((function(e){return e.length?e[t-1]:null})).then((function(t){return t?n.deleteBulk(e,t[r.keyPath],"upperBound"):[]}))}},{key:"count",value:function(e){return this.open().then((function(t){return"error"===t.status?Ze.reject(t.error):Ze.resolve(Re.stores[e].length)}))}},{key:"clear",value:function(e){return this.open().then((function(t){return"error"===t.status?Ze.reject(t.error):new Ze((function(t){Re.stores[e]=[],t({})}))}))}},{key:"destroy",value:function(){}},{key:"deleteDatabase",value:function(){}}],[{key:"isSupported",value:function(){if(e.isSupportedPromise)return e.isSupportedPromise;var t=(new Date).toString(),n=window.localStorage;return e.isSupportedPromise=new Ze((function(e){n.setItem(t,t);var r=n.getItem(t)===t;n.removeItem(t),e(!(!r||!n))})).catch((function(){return F.warn("LocalStorage is not supported in this browser"),Ze.resolve(!1)})),e.isSupportedPromise}}]),e}();v()($e,"isSupportedPromise",null);var et,tt,nt="undefined"==typeof Promise?n(3).Promise:Promise;(tt=et||(et={}))[tt.noStorage=f]="noStorage",tt[tt.indexedDB=p]="indexedDB",tt[tt.localStorage=m]="localStorage";var rt,ot={getAll:function(e,t){return e.getAll(t).then((function(e){return Oe({storeName:t,dir:De.right,records:e})}))},getFirst:function(e,t){return e.getFirst(t).then((function(e){return Te({storeName:t,dir:De.right,record:e})}))},getItem:function(e,t,n){return e.getItem(t,Ce({storeName:t,dir:De.left,target:n})).then((function(e){return Te({storeName:t,dir:De.right,record:e})})).catch((function(e){return nt.reject(Ee({storeName:t,error:e}))}))},filterBy:function(e,t,n){return e.filterBy(t,je(n)).then((function(e){return Oe({storeName:t,dir:De.right,records:e})}))},addItem:function(e,t,n){return e.addItem(t,Te({storeName:t,dir:De.left,record:n})).then((function(e){return Ce({storeName:t,dir:De.right,target:e})})).catch((function(e){return nt.reject(Ee({storeName:t,error:e}))}))},addBulk:function(e,t,n,r){return e.addBulk(t,Oe({storeName:t,dir:De.left,records:n}),r).then((function(e){return e.map((function(e){return Ce({storeName:t,dir:De.right,target:e})}))})).catch((function(e){return nt.reject(Ee({storeName:t,error:e}))}))},updateItem:function(e,t,n){return e.updateItem(t,Te({storeName:t,dir:De.left,record:n})).then((function(e){return Ce({storeName:t,dir:De.right,target:e})}))},deleteItem:function(e,t,n){return e.deleteItem(t,Ce({storeName:t,dir:De.left,target:n})).then((function(e){return Ce({storeName:t,dir:De.right,target:e})}))},deleteBulk:function(e,t,n,r){return e.deleteBulk(t,je(n),r).then((function(e){return e.map((function(e){return Ce({storeName:t,dir:De.right,target:e})}))}))},trimItems:function(e,t,n){return e.trimItems(t,n)},count:function(e,t){return e.count(t)},clear:function(e,t){return e.clear(t)},destroy:function(e){return e.destroy()},deleteDatabase:function(e){return e.deleteDatabase()}};var it=null;function at(e){var t=null;return null!==it?it:it=nt.all([Xe.isSupported(),$e.isSupported()]).then((function(n){var r=s()(n,2),o=r[0],i=r[1];if(Re.setCustomName(e),o){rt=et.indexedDB;var a=new Xe;return a.setCustomName(e).then((function(){return t=a}))}return i?(rt=et.localStorage,t=new $e,nt.resolve(t)):(F.error("There is no storage available, app will run with minimum set of features"),rt=et.noStorage,t=null,nt.resolve(t))})).then((function(){return{type:rt,storage:t}}))}var ut,st,ct=o()({init:at,getType:function(){return rt}},I(ot).map((function(e){var t=s()(e,2),n=t[0],r=t[1];return[n,function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),o=1;o2&&void 0!==arguments[2]&&arguments[2];return{status:"error",action:n?"CONTINUE":"RETRY",response:w(e.responseText)?JSON.parse(e.responseText):e.responseText,message:d[t],code:t}}function gt(e,t){var n=e.slice(0,e.length-t.length-1).split("").reduce((function(e){return e.concat(" ")}),"");return"".concat(t).concat(n,":")}function yt(e,t){var n=function(e){return e.replace(/([A-Z])/g,(function(e){return"_".concat(e.toLowerCase())}))},r=I(o()(o()(o()({},Q.getBaseParams()),t),e)).map((function(e){var t=s()(e,2),r=t[0],o=t[1];return[n(r),o]}));return F.log("REQUEST PARAMETERS:"),r.filter((function(e){return O(s()(e,2)[1])})).map((function(e){var t=s()(e,2),n=t[0],r=t[1];return F.log(gt("REQUEST PARAMETERS:",n),r),function(e){var t=s()(e,2),n=t[0],r=t[1],o=encodeURIComponent(n),i=r;return"string"==typeof r&&(i=encodeURIComponent(r)),k(r)&&(i=encodeURIComponent(JSON.stringify(r)||"")),[o,i].join("=")}([n,r])})).join("&")}function bt(e,t,n){var r=n.xhr,o=n.url;if(4===r.readyState){var i=r.status>=200&&r.status<300,a=w(r.responseText);if(0!==r.status)return a?t(i?function(e,t){var n=JSON.parse(e.responseText),r={status:"success",adid:n.adid,timestamp:n.timestamp,ask_in:n.ask_in,retry_in:n.retry_in,continue_in:n.continue_in,tracking_state:n.tracking_state,attribution:void 0,message:void 0};return x(t,"attribution")&&(r.attribution=n.attribution,r.message=n.message),I(r).filter((function(e){return!!s()(e,2)[1]})).reduce(D,{})}(r,o):vt(r,"SERVER_CANNOT_PROCESS",!0)):e(vt(r,i?"SERVER_MALFORMED_RESPONSE":"SERVER_INTERNAL_ERROR"));e(vt(r,"NO_CONNECTION"))}}function kt(e,t,n){var r=e.url,o=e.method,i=void 0===o?"GET":o,a=e.params,u=function(e,t,n){var r=e.url,o=e.method,i=yt(e.params,t);return{fullUrl:n["/gdpr_forget_device"===r?"gdpr":"app"]+r+("GET"===o?"?".concat(i):""),encodedParams:i}}({url:r,method:i,params:void 0===a?{}:a},t,n),c=u.fullUrl,l=u.encodedParams;return new ht((function(e,t){var n=new XMLHttpRequest;n.open(i,c,!0),function(e,t){var n=[["Client-SDK","js".concat(j.version)],["Content-Type","POST"===t?"application/x-www-form-urlencoded":"application/json"]];F.log("REQUEST HEADERS:"),n.forEach((function(t){var n=s()(t,2),r=n[0],o=n[1];e.setRequestHeader(r,o),F.log(gt("REQUEST HEADERS:",r),o)}))}(n,i),n.onreadystatechange=function(){return bt(t,e,{xhr:n,url:r})},n.onerror=function(){return t(vt(n,"TRANSACTION_ERROR"))},n.send("GET"===i?void 0:l)}))}function wt(e,t){return function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:pt,n=ft();if(Array.isArray(n)){var r=0,o=function o(){var i=n[r++],a=t[i];return e(a).catch((function(e){if("NO_CONNECTION"===e.code&&(F.log("Failed to connect ".concat(mt[i]," endpoint")),r0&&void 0!==arguments[0]?arguments[0]:{},t=e.url,n=e.method,r=void 0===n?"GET":n,i=e.params,a=void 0===i?{}:i,u=e.continueCb,c=e.strategy,l=e.wait,f={url:t,method:r,params:a,continueCb:u},p=t,m=r,h=o()({},a),v=u,g=c,y=null,k={request:0,connection:0},w=N(l),S=null;function N(e){return(e=e||150)>2147483647?2147483647:e}function P(e){var t=e.url,n=e.method,r=e.params,i=e.continueCb;t&&(p=t),n&&(m=n),b(r)||(h=o()({},r)),h=o()({createdAt:pe()},h),"function"==typeof i&&(v=i)}function x(e){if(!S)return!1;if(y){var t=w-(Date.now()-S);if(e&&t0&&void 0!==arguments[0]?arguments[0]:{},t=e.url,n=e.method,r=e.params,o=void 0===r?{}:r,i=e.continueCb,a=e.wait;return P({url:t,method:n,params:o,continueCb:i}),_({wait:a})}function q(){return!!y}function L(){y&&clearTimeout(y),y=null}function K(){var e=!!S;L(),S=null,e&&(w=150,k.request=0,k.connection=0,F.log("Previous ".concat(p||"unknown"," request attempt canceled")),j())}return{send:M,isRunning:q,clear:K}},Et=function(e){return"gdpr"===e?"GDPR disable":"disable"},Rt=function(e){return{start:{inProgress:"Adjust SDK ".concat(Et(e)," process has already started"),done:"Adjust SDK ".concat(Et(e)," process is now started")},finish:{inProgress:"Adjust SDK ".concat(Et(e)," process has already finished"),done:"Adjust SDK ".concat(Et(e)," process is now finished")}}};function Bt(e,t){var n=e.reason,r=e.pending,o=Ve()||{},i="start"===t&&o.pending?"start":"finish",a="start"===t&&o.reason,u="finish"===t&&o.reason&&!o.pending;return a||u?(F.log(Rt(o.reason)[i].inProgress),!1):(F.log(Rt(n)[i].done),We({reason:n||"general",pending:r}),!0)}function Mt(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return Bt({reason:e,pending:t||!1},"start")}function qt(){var e=Ve()||{};return"general"===e.reason||"gdpr"===e.reason&&!e.pending?"off":"gdpr"===e.reason&&e.pending?"paused":"on"}var Lt="undefined"==typeof Promise?n(3).Promise:Promise,Kt=!1;function Ft(e){return e?"unknown"===e.uuid?(Mt({reason:"gdpr"}),_e.destroy(),{exists:!0,stored:null}):(_e.init(e),{exists:!0,stored:e}):{exists:!1}}function Ut(){return"off"!==qt()&&_e.isStarted()}function Gt(){if(!Ut())return Lt.resolve(null);var e=o()(o()({},_e.current),{},{lastActive:Date.now()});return ct.updateItem("activityState",e).then((function(){return _e.current=e}))}var Vt="undefined"==typeof Promise?n(3).Promise:Promise,Wt=At({strategy:"long",continueCb:function(e,t){var n=e&&e.continue_in||null;return Yt.pause=n?{timestamp:Date.now(),wait:n}:null,ct.getFirst("queue").then((function(e){return e?ct.deleteItem("queue",e.timestamp):null})).then((function(){return t(),Yt.running=!1,$t({wait:n})}))}}),Ht=!1,Yt={running:!1,timestamp:null,pause:null};function Jt(){var e=Date.now();return Yt.timestamp&&e<=Yt.timestamp&&(e=Yt.timestamp+1),Yt.timestamp=e,e}function zt(e){return x(e,"session")&&_e.resetSessionOffset(),_e.updateLastActive(),Gt()}function Qt(e){var t=e.url,n=e.method,r=e.params,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},a=i.auto,u=i.timestamp;_e.updateParams(t,a);var c=I(r||{}).filter((function(e){return O(s()(e,2)[1])})).reduce(D,{}),l={timestamp:Jt(),url:t,method:n,params:o()(o()({},_e.getParams(t)),c)};return u&&(l.createdAt=u),ct.addItem("queue",l).then((function(){return zt(t)})).then((function(){return Yt.running?{}:$t()}))}function Xt(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.timestamp,n=e.createdAt,r=e.url,i=e.method,a=e.params,u=arguments.length>1?arguments[1]:void 0,s=_e.current||{},c="/session"===r&&!s.installed,l=!r&&!i&&!a;return Ht&&!c||l?(Yt.running=!1,Vt.resolve({})):Wt.send({url:r,method:i,params:o()(o()({},a),{},{createdAt:pe(n||t)}),wait:u||Zt()})}function Zt(){var e=Yt.pause||{},t=e.timestamp,n=e.wait,r=Date.now()-(t||0);return r0&&void 0!==arguments[0]?arguments[0]:{},t=e.cleanUp,n=e.wait;if(Yt.running)return Vt.resolve({});Yt.running=!0;var r=Vt.resolve({});return t&&(r=r.then(tn)),r.then((function(){return ct.getFirst("queue")})).then((function(e){return Xt(e,n)}))}function en(e){if(void 0!==e)if(e!==Ht){var t=Ht;Ht=e,!e&&t&&$t(),F.info("The app is now in ".concat(e?"offline":"online"," mode"))}else F.error("The app is already in ".concat(e?"offline":"online"," mode"));else F.error("State not provided, true or false has to be defined")}function tn(){var e=Date.now()-Q.requestValidityWindow;return ct.deleteBulk("queue",e,"upperBound")}var nn="undefined"==typeof Promise?n(3).Promise:Promise,rn="No type provided",on="Global parameter type not provided, `callback` or `partner` types are available";function an(e){return(e||[]).map((function(e){return{key:e.key,value:e.value}}))}function un(){return nn.all([ct.filterBy("globalParams","callback"),ct.filterBy("globalParams","partner")]).then((function(e){var t=s()(e,2),n=t[0],r=t[1];return{callbackParams:an(n),partnerParams:an(r)}}))}function sn(e,t){if(void 0===t)return F.error(on),nn.reject({message:rn});var n=N(e),r=Object.keys(n).map((function(e){return{key:e,value:n[e],type:t}}));return nn.all([ct.filterBy("globalParams",t),ct.addBulk("globalParams",r,!0)]).then((function(e){var n=s()(e,2),o=n[0],i=n[1],a=P(o.map((function(e){return e.key})),i.map((function(e){return e[0]})));return F.log("Following ".concat(t," parameters have been saved: ").concat(r.map((function(e){return"".concat(e.key,":").concat(e.value)})).join(", "))),a.length&&F.log("Keys: ".concat(a.join(", ")," already existed so their values have been updated")),i}))}function cn(e,t){return void 0===t?(F.error(on),nn.reject({message:rn})):ct.deleteItem("globalParams",[e,t]).then((function(n){return F.log("".concat(e," ").concat(t," parameter has been deleted")),n}))}function ln(e){return void 0===e?(F.error(on),nn.reject({message:rn})):ct.deleteBulk("globalParams",e).then((function(t){return F.log("All ".concat(e," parameters have been deleted")),t}))}var dn,fn,pn,mn="undefined"==typeof Promise?n(3).Promise:Promise,hn=!1,vn=document;function gn(){return pn=function(){var e=document;if(void 0!==e.hidden)return{hidden:"hidden",visibilityChange:"visibilitychange"};for(var t=I({mozHidden:"mozvisibilitychange",msHidden:"msvisibilitychange",oHidden:"ovisibilitychange",webkitHidden:"webkitvisibilitychange"}),n=0;n0;return!n||n&&1e3*t>=Q.sessionWindow?un().then((function(e){var t,n,r;Qt({url:"/session",method:"POST",params:(t=e,n=t.callbackParams,r=t.partnerParams,{callbackParams:n.length?N(n):null,partnerParams:r.length?N(r):null})},{auto:!0})})):(Le("attribution:check"),Gt())}var Pn="undefined"==typeof Promise?n(3).Promise:Promise,xn=At({url:"/attribution",strategy:"short",continueCb:function(e,t,n){if(!e||e&&"error"===e.status)return t(),Pn.resolve({state:"unknown"});if(!e.ask_in)return t(),function(e){if(b(e)||!function(e){var t=e.adid,n=void 0===t?"":t,r=e.attribution,o=void 0===r?{}:r;return!!n&&!!P(Dn,Object.keys(o)).length}(e)||function(e){var t=e.adid,n=e.attribution,r=_e.current.attribution||{};return!(n&&Dn.some((function(e){return r[e]!==n[e]})))&&t===r.adid}(e))return Pn.resolve({state:"same"});var t=I(e.attribution).filter((function(e){var t=s()(e,1)[0];return-1!==Dn.indexOf(t)})).reduce(D,{adid:e.adid});return _e.current=o()(o()({},_e.current),{},{attribution:t}),Gt().then((function(){return Le("attribution:change",t),F.info("Attribution has been updated"),{state:"changed"}}))}(e);return n(e.ask_in)}}),Dn=["tracker_token","tracker_name","network","campaign","adgroup","creative","click_label","state"];var _n=At({url:"/gdpr_forget_device",method:"POST",strategy:"short"}),In={running:"Adjust SDK is running pending GDPR Forget Me request",pending:"Adjust SDK will run GDPR Forget Me request after initialisation",paused:"Adjust SDK is already prepared to send GDPR Forget Me request",off:"Adjust SDK is already disabled"};function Tn(e){var t=qt();return e||"on"===t?Q.isInitialised()?(_n.send({params:o()({},_e.getParams())}).then((function(){Le("sdk:gdpr-forget-me")})),!0):(F.log(In.pending),!0):(F.log(In[t]),!1)}function On(){return Bt({reason:"gdpr",pending:!1},"finish")}var Cn={running:"Adjust SDK is running pending third-party sharing opt-out request",delayed:"Adjust SDK will run third-party sharing opt-out request after initialisation",pending:"Adjust SDK already queued third-party sharing opt-out request",off:"Third-party sharing opt-out is already done",start:{inProgress:"Third-party sharing opt-out has already started",done:"Third-party sharing opt-out is now started"},finish:{inProgress:"Third-party sharing opt-out has already finished",done:"Third-party sharing opt-out is now finished"}};function jn(){var e=He()||{};return e.reason?e.pending?"pending":"off":"on"}function An(e){var t=jn();return e||"on"===t?Q.isInitialised()?(Qt({url:"/disable_third_party_sharing",method:"POST"}),!0):(F.log(Cn.delayed),!0):(F.log(Cn[t]),!1)}function En(e,t){var n,r,i=He()||{},a="start"===t&&e?"start":"finish",u="start"===t&&i.reason,s="finish"===t&&i.reason&&!i.pending;return u||s?(F.log(Cn[a].inProgress),!1):(F.log(Cn[a].done),r=(n={reason:"general",pending:e})?o()({},n):null,Re.stores[Ke]=o()(o()({},Ue()),{},{thirdPartySharingDisabled:r}),Ge(),!0)}function Rn(){return En(!1,"finish")}function Bn(){"pending"===jn()&&(F.log(Cn.running),An(!0))}var Mn=[];function qn(e,t){Mn.push({method:e,description:t,timestamp:Date.now()})}var Ln="undefined"==typeof Promise?n(3).Promise:Promise;function Kn(e,t){var n,r,i=t.callbackParams,a=t.partnerParams,u={},s=o()({eventToken:e.eventToken},(n=e.revenue,r=e.currency,isNaN(n)||(n=parseFloat(n))<0||!r?{}:{revenue:n.toFixed(5),currency:r})),c=o()(o()({},N(i)),N(e.callbackParams)),l=o()(o()({},N(a)),N(e.partnerParams));return b(c)||(u.callbackParams=c),b(l)||(u.partnerParams=l),o()(o()({},s),u)}function Fn(e){return e?ct.getAll("eventDeduplication").then((function(e){return e.map((function(e){return e.id}))})).then((function(t){return-1===t.indexOf(e)?function(e){var t=Q.getCustomConfig().eventDeduplicationListLimit,n=t>0?t:10;return ct.count("eventDeduplication").then((function(e){var t=Ln.resolve();if(e>=n){var r=e-n+1;F.log("Event deduplication list limit has been reached. Oldest ids are about to be removed (".concat(r," of them)")),t=ct.trimItems("eventDeduplication",r)}return t})).then((function(){return F.info("New event deduplication id is added to the list: ".concat(e)),ct.addItem("eventDeduplication",{id:e})}))}(e):Ln.reject({message:"Event won't be tracked, since it was previously tracked with the same deduplication id ".concat(e)})})):Ln.resolve()}function Un(e){return{clickTime:pe(),source:"web_referrer",referrer:decodeURIComponent(e)}}function Gn(){var e=window.location.search.substring(1).split("&").map((function(e){return e.split("=")})).reduce(D,{}).adjust_referrer;e&&Qt({url:"/sdk_click",method:"POST",params:Un(e)})}var Vn="undefined"==typeof Promise?n(3).Promise:Promise,Wn=null,Hn=!1,Yn=!1,Jn=!1;function zn(){An()&&En(!0,"start")}function Qn(){var e;"paused"===qt()&&(On(),Vn.all([(e={uuid:"unknown"},_e.current=e,ct.clear("activityState").then((function(){return ct.addItem("activityState",e)}))),ct.clear("globalParams"),ct.clear("queue")]).then(er))}function Xn(){return Hn||Q.isInitialised()}function Zn(){Hn=!1,Yn=!1,Mn=[],Wt.clear(),Yt.running=!1,Yt.timestamp=null,Yt.pause=null,hn=!1,_e.toBackground(),Sn(),pn&&(clearTimeout(fn),Ot(vn,pn.visibilityChange,kn)),xn.clear()}function $n(e){e&&F.log("Adjust SDK has been shutdown due to asynchronous disable"),Zn(),Me.forEach(clearTimeout),Me=[],Be={},_e.destroy(),Ot(window,"online",_t),Ot(window,"offline",It),ct.destroy(),Q.destroy()}function er(){Jn=!1,$n(),_n.clear(),Wn=null,F.log("Adjust SDK instance has been destroyed")}function tr(e){F.log("Adjust SDK is starting with web_uuid set to ".concat(e.uuid));var t=_e.current.installed;"paused"===qt()&&(F.log(In.running),Tn(!0)),t||Bn();var n=qt(),r=function(e){return"Adjust SDK start has been interrupted ".concat(e)};return"off"===n?($n(),Vn.reject({interrupted:!0,message:r("due to complete async disable")})):"paused"===n?(Zn(),Vn.reject({interrupted:!0,message:r("due to partial async disable")})):Yn?Vn.reject({interrupted:!0,message:r("due to multiple synchronous start attempt")}):($t({cleanUp:!0}),gn().then((function(){Hn=!1,Yn=!0,t&&(nr(),Bn())})))}function nr(){var e;Jn=!0,Mn.forEach((function(e){"function"==typeof e.method&&(F.log("Delayed ".concat(e.description," task is running now")),e.method(e.timestamp))})),Mn=[],(e="sdk:installed")&&I(Be).some((function(t){var n=s()(t,2)[1];return n.some((function(t,r){if(t.id===e)return n.splice(r,1),!0}))}))}function rr(e){if(e.interrupted)F.log(e.message);else if($n(),F.error("Adjust SDK start has been canceled due to an error",e),e.stack)throw e}function or(e){"off"!==qt()?(Q.set(e),Tt(window,"online",_t),Tt(window,"offline",It),qe("sdk:installed",nr),qe("sdk:shutdown",(function(){return $n(!0)})),qe("sdk:gdpr-forget-me",Qn),qe("sdk:third-party-sharing-opt-out",Rn),qe("attribution:check",(function(e,t){return n=t,r=_e.current,(i=(n||{}).ask_in)||!r.attribution&&r.installed?(xn.send({params:o()({initiatedBy:n?"backend":"sdk"},_e.getParams()),wait:i}),_e.updateSessionOffset(),Gt()):Pn.resolve(r);var n,r,i})),"function"==typeof e.attributionCallback&&qe("attribution:change",e.attributionCallback),(Kt?Lt.reject({interrupted:!0,message:"Adjust SDK start already in progress"}):(Kt=!0,ct.getFirst("activityState").then(Ft).then((function(e){if(e.exists)return Kt=!1,e.stored;var t,n=b(_e.current)?{uuid:(t=Date.now(),"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,(function(e){var n=(t+16*Math.random())%16|0;return t=Math.floor(t/16),("x"===e?n:11&n).toString(16)})))}:_e.current;return ct.addItem("activityState",n).then((function(){return _e.init(n),Ye(),Kt=!1,n}))})))).then(tr).then(Gn).catch(rr)):F.log("Adjust SDK is disabled, can not start the sdk")}function ir(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.schedule,o=n.stopBeforeInit;ct.getType()!==f?"on"===qt()?r&&o&&!Xn()?F.error("Adjust SDK can not ".concat(e,", sdk instance is not initialized")):"function"==typeof t&&(!r||Jn&&Yn||!o&&!Xn()?t():(qn(t,e),F.log("Running ".concat(e," is delayed until Adjust SDK is up")))):F.log("Adjust SDK is disabled, can not ".concat(e)):F.log("Adjust SDK can not ".concat(e,", no storage available"))}var ar={initSdk:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.logLevel,n=e.logOutput,r=a()(e,["logLevel","logOutput"]);F.setLogLevel(t,n),Xn()?F.error("You already initiated your instance"):Q.hasMissing(r)||(Hn=!0,ct.init(r.namespace).then((function(e){e.type!==f?(F.info("Available storage is ".concat(e.type)),Wn=o()({},r),or(r)):F.error("Adjust SDK can not start, there is no storage available")})))},trackEvent:function(e){ir("track event",(function(t){return function(e,t){if(e&&(!e||!b(e)&&e.eventToken))return Fn(e.deduplicationId).then(un).then((function(n){Qt({url:"/event",method:"POST",params:Kn(e,n)},{timestamp:t})})).catch((function(e){e&&e.message&&F.error(e.message)}));F.error("You must provide event token in order to track event")}(e,t)}),{schedule:!0,stopBeforeInit:!0})},addGlobalCallbackParameters:function(e){ir("add global callback parameters",(function(){return sn(e,"callback")}))},addGlobalPartnerParameters:function(e){ir("add global partner parameters",(function(){return sn(e,"partner")}))},removeGlobalCallbackParameter:function(e){ir("remove global callback parameter",(function(){return cn(e,"callback")}))},removeGlobalPartnerParameter:function(e){ir("remove global partner parameter",(function(){return cn(e,"partner")}))},clearGlobalCallbackParameters:function(){ir("remove all global callback parameters",(function(){return ln("callback")}))},clearGlobalPartnerParameters:function(){ir("remove all global partner parameters",(function(){return ln("partner")}))},switchToOfflineMode:function(){ir("set offline mode",(function(){return en(!0)}))},switchBackToOnlineMode:function(){ir("set online mode",(function(){return en(!1)}))},stop:function(){Mt()&&Q.isInitialised()&&$n()},restart:function(){var e;("gdpr"===(e=Ve()||{}).reason?(F.log("Adjust SDK is disabled due to GDPR-Forget-Me request and it can not be re-enabled"),!1):e.reason?(F.log("Adjust SDK has been enabled"),We(null),!0):(F.log("Adjust SDK is already enabled"),!1))&&Wn&&or(Wn)},gdprForgetMe:function(){var e=Tn();e&&(e=Mt("gdpr",!0))&&Q.isInitialised()&&Zn()},disableThirdPartySharing:function(){ir("disable third-party sharing",zn,{schedule:!0,stopBeforeInit:!1})},__testonly__:{destroy:er,clearDatabase:function(){return ct.deleteDatabase()}}};t.default=ar}]).default}));
\ No newline at end of file
diff --git a/docs/chinese/README.md b/docs/chinese/README.md
index 3fe6ab7..0856f09 100644
--- a/docs/chinese/README.md
+++ b/docs/chinese/README.md
@@ -38,7 +38,7 @@ Read this in other languages: [English][en-readme], [中文][zh-readme], [日本
Adjust Web SDK 在每个页面应当仅加载一次,每次页面加载应当初始化一次。
-在通过 CDN 加载 SDK 时,我们建议您使用精简版本。您可以定向特定版本,如 `https://cdn.adjust.com/adjust-5.1.1.min.js`;如果您需要自动更新,不想变更目标文件,也可以定向最新版本:`https://cdn.adjust.com/adjust-latest.min.js` 。SDK 文件均有缓存,因此能以最快速度获取,缓存每半小时刷新一次。如果您想立即获得更新,请务必定向特定版本。
+在通过 CDN 加载 SDK 时,我们建议您使用精简版本。您可以定向特定版本,如 `https://cdn.adjust.com/adjust-5.1.2.min.js`;如果您需要自动更新,不想变更目标文件,也可以定向最新版本:`https://cdn.adjust.com/adjust-latest.min.js` 。SDK 文件均有缓存,因此能以最快速度获取,缓存每半小时刷新一次。如果您想立即获得更新,请务必定向特定版本。
您也可以通过 NPM 安装我们的 SDK:
diff --git a/docs/japanese/README.md b/docs/japanese/README.md
index a7db93b..b8c553b 100644
--- a/docs/japanese/README.md
+++ b/docs/japanese/README.md
@@ -38,7 +38,7 @@ CDNでAdjustSDKを遅延ロードするためには、以下のコードを`=6.9.0"
+ }
+ },
+ "node_modules/@babel/core/node_modules/debug": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
+ "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/@babel/core/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.11.6",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz",
+ "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.11.5",
+ "jsesc": "^2.5.1",
+ "source-map": "^0.5.0"
+ }
+ },
+ "node_modules/@babel/helper-annotate-as-pure": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz",
+ "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz",
+ "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-explode-assignable-expression": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz",
+ "integrity": "sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.10.4",
+ "browserslist": "^4.12.0",
+ "invariant": "^2.2.4",
+ "levenary": "^1.1.1",
+ "semver": "^5.5.0"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin": {
+ "version": "7.10.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz",
+ "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-function-name": "^7.10.4",
+ "@babel/helper-member-expression-to-functions": "^7.10.5",
+ "@babel/helper-optimise-call-expression": "^7.10.4",
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-replace-supers": "^7.10.4",
+ "@babel/helper-split-export-declaration": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-create-regexp-features-plugin": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz",
+ "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.10.4",
+ "@babel/helper-regex": "^7.10.4",
+ "regexpu-core": "^4.7.0"
+ }
+ },
+ "node_modules/@babel/helper-define-map": {
+ "version": "7.10.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz",
+ "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-function-name": "^7.10.4",
+ "@babel/types": "^7.10.5",
+ "lodash": "^4.17.19"
+ }
+ },
+ "node_modules/@babel/helper-explode-assignable-expression": {
+ "version": "7.11.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.11.4.tgz",
+ "integrity": "sha512-ux9hm3zR4WV1Y3xXxXkdG/0gxF9nvI0YVmKVhvK9AfMoaQkemL3sJpXw+Xbz65azo8qJiEz2XVDUpK3KYhH3ZQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-function-name": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz",
+ "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-get-function-arity": "^7.10.4",
+ "@babel/template": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-get-function-arity": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz",
+ "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-hoist-variables": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz",
+ "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-member-expression-to-functions": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz",
+ "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.11.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz",
+ "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz",
+ "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.10.4",
+ "@babel/helper-replace-supers": "^7.10.4",
+ "@babel/helper-simple-access": "^7.10.4",
+ "@babel/helper-split-export-declaration": "^7.11.0",
+ "@babel/template": "^7.10.4",
+ "@babel/types": "^7.11.0",
+ "lodash": "^4.17.19"
+ }
+ },
+ "node_modules/@babel/helper-optimise-call-expression": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz",
+ "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+ "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+ "dev": true
+ },
+ "node_modules/@babel/helper-regex": {
+ "version": "7.10.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz",
+ "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==",
+ "dev": true,
+ "dependencies": {
+ "lodash": "^4.17.19"
+ }
+ },
+ "node_modules/@babel/helper-remap-async-to-generator": {
+ "version": "7.11.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.11.4.tgz",
+ "integrity": "sha512-tR5vJ/vBa9wFy3m5LLv2faapJLnDFxNWff2SAYkSE4rLUdbp7CdObYFgI7wK4T/Mj4UzpjPwzR8Pzmr5m7MHGA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.10.4",
+ "@babel/helper-wrap-function": "^7.10.4",
+ "@babel/template": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-replace-supers": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz",
+ "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-member-expression-to-functions": "^7.10.4",
+ "@babel/helper-optimise-call-expression": "^7.10.4",
+ "@babel/traverse": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-simple-access": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz",
+ "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/template": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz",
+ "integrity": "sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.11.0"
+ }
+ },
+ "node_modules/@babel/helper-split-export-declaration": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz",
+ "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.11.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
+ "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
+ "dev": true
+ },
+ "node_modules/@babel/helper-wrap-function": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz",
+ "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-function-name": "^7.10.4",
+ "@babel/template": "^7.10.4",
+ "@babel/traverse": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz",
+ "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/template": "^7.10.4",
+ "@babel/traverse": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/highlight": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+ "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.11.5",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz",
+ "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q==",
+ "dev": true,
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-async-generator-functions": {
+ "version": "7.10.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz",
+ "integrity": "sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-remap-async-to-generator": "^7.10.4",
+ "@babel/plugin-syntax-async-generators": "^7.8.0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-class-properties": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz",
+ "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.10.4",
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-dynamic-import": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz",
+ "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-syntax-dynamic-import": "^7.8.0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-export-namespace-from": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.10.4.tgz",
+ "integrity": "sha512-aNdf0LY6/3WXkhh0Fdb6Zk9j1NMD8ovj3F6r0+3j837Pn1S1PdNtcwJ5EG9WkVPNHPxyJDaxMaAOVq4eki0qbg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-json-strings": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz",
+ "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-syntax-json-strings": "^7.8.0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-logical-assignment-operators": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.11.0.tgz",
+ "integrity": "sha512-/f8p4z+Auz0Uaf+i8Ekf1iM7wUNLcViFUGiPxKeXvxTSl63B875YPiVdUDdem7hREcI0E0kSpEhS8tF5RphK7Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz",
+ "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-numeric-separator": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz",
+ "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-object-rest-spread": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz",
+ "integrity": "sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.0",
+ "@babel/plugin-transform-parameters": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-optional-catch-binding": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz",
+ "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-optional-chaining": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz",
+ "integrity": "sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-private-methods": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz",
+ "integrity": "sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.10.4",
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-unicode-property-regex": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz",
+ "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.10.4",
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-async-generators": {
+ "version": "7.8.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
+ "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-class-properties": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz",
+ "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-dynamic-import": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
+ "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-export-namespace-from": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
+ "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.3"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-flow": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.10.4.tgz",
+ "integrity": "sha512-yxQsX1dJixF4qEEdzVbst3SZQ58Nrooz8NV9Z9GL4byTE25BvJgl5lf0RECUf0fh28rZBb/RYTWn/eeKwCMrZQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-json-strings": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
+ "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
+ "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+ "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-numeric-separator": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
+ "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-object-rest-spread": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
+ "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-optional-catch-binding": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
+ "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-optional-chaining": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
+ "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-top-level-await": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz",
+ "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-typescript": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.10.4.tgz",
+ "integrity": "sha512-oSAEz1YkBCAKr5Yiq8/BNtvSAPwkp/IyUnwZogd8p+F0RuYQQrLeRUzIQhueQTTBy/F+a40uS7OFKxnkRvmvFQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/plugin-transform-arrow-functions": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz",
+ "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/plugin-transform-async-to-generator": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz",
+ "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.10.4",
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-remap-async-to-generator": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoped-functions": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz",
+ "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoping": {
+ "version": "7.11.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz",
+ "integrity": "sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/plugin-transform-classes": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz",
+ "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.10.4",
+ "@babel/helper-define-map": "^7.10.4",
+ "@babel/helper-function-name": "^7.10.4",
+ "@babel/helper-optimise-call-expression": "^7.10.4",
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-replace-supers": "^7.10.4",
+ "@babel/helper-split-export-declaration": "^7.10.4",
+ "globals": "^11.1.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-computed-properties": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz",
+ "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/plugin-transform-destructuring": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz",
+ "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/plugin-transform-dotall-regex": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz",
+ "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.10.4",
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/plugin-transform-duplicate-keys": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz",
+ "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/plugin-transform-exponentiation-operator": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz",
+ "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4",
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/plugin-transform-flow-comments": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-comments/-/plugin-transform-flow-comments-7.10.4.tgz",
+ "integrity": "sha512-wiwS5fCzeWP71WLIzAoFAPTk0GLnhpUfGV4ygwX+Zib6nYiaLhUOWsjLt6+hCwCoH/bwZSg7Qzlc2AuzXg/mbg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/generator": "^7.10.4",
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-syntax-flow": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/plugin-transform-flow-strip-types": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.10.4.tgz",
+ "integrity": "sha512-XTadyuqNst88UWBTdLjM+wEY7BFnY2sYtPyAidfC7M/QaZnSuIZpMvLxqGT7phAcnGyWh/XQFLKcGf04CnvxSQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-syntax-flow": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/plugin-transform-for-of": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz",
+ "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/plugin-transform-function-name": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz",
+ "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-function-name": "^7.10.4",
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/plugin-transform-literals": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz",
+ "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/plugin-transform-member-expression-literals": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz",
+ "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-amd": {
+ "version": "7.10.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz",
+ "integrity": "sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.10.5",
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "babel-plugin-dynamic-import-node": "^2.3.3"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-commonjs": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz",
+ "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.10.4",
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-simple-access": "^7.10.4",
+ "babel-plugin-dynamic-import-node": "^2.3.3"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-systemjs": {
+ "version": "7.10.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz",
+ "integrity": "sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-hoist-variables": "^7.10.4",
+ "@babel/helper-module-transforms": "^7.10.5",
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "babel-plugin-dynamic-import-node": "^2.3.3"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-umd": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz",
+ "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.10.4",
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz",
+ "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/plugin-transform-new-target": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz",
+ "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/plugin-transform-object-super": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz",
+ "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-replace-supers": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/plugin-transform-parameters": {
+ "version": "7.10.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz",
+ "integrity": "sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-get-function-arity": "^7.10.4",
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/plugin-transform-property-literals": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz",
+ "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/plugin-transform-regenerator": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz",
+ "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==",
+ "dev": true,
+ "dependencies": {
+ "regenerator-transform": "^0.14.2"
+ }
+ },
+ "node_modules/@babel/plugin-transform-reserved-words": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz",
+ "integrity": "sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/plugin-transform-runtime": {
+ "version": "7.11.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.11.5.tgz",
+ "integrity": "sha512-9aIoee+EhjySZ6vY5hnLjigHzunBlscx9ANKutkeWTJTx6m5Rbq6Ic01tLvO54lSusR+BxV7u4UDdCmXv5aagg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.10.4",
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "resolve": "^1.8.1",
+ "semver": "^5.5.1"
+ }
+ },
+ "node_modules/@babel/plugin-transform-shorthand-properties": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz",
+ "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/plugin-transform-spread": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz",
+ "integrity": "sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-sticky-regex": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz",
+ "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/helper-regex": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/plugin-transform-template-literals": {
+ "version": "7.10.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz",
+ "integrity": "sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.10.4",
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/plugin-transform-typeof-symbol": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz",
+ "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/plugin-transform-typescript": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.11.0.tgz",
+ "integrity": "sha512-edJsNzTtvb3MaXQwj8403B7mZoGu9ElDJQZOKjGUnvilquxBA3IQoEIOvkX/1O8xfAsnHS/oQhe2w/IXrr+w0w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.10.5",
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-syntax-typescript": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-escapes": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz",
+ "integrity": "sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-regex": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz",
+ "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.10.4",
+ "@babel/helper-plugin-utils": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/preset-env": {
+ "version": "7.11.5",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.11.5.tgz",
+ "integrity": "sha512-kXqmW1jVcnB2cdueV+fyBM8estd5mlNfaQi6lwLgRwCby4edpavgbFhiBNjmWA3JpB/yZGSISa7Srf+TwxDQoA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.11.0",
+ "@babel/helper-compilation-targets": "^7.10.4",
+ "@babel/helper-module-imports": "^7.10.4",
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-proposal-async-generator-functions": "^7.10.4",
+ "@babel/plugin-proposal-class-properties": "^7.10.4",
+ "@babel/plugin-proposal-dynamic-import": "^7.10.4",
+ "@babel/plugin-proposal-export-namespace-from": "^7.10.4",
+ "@babel/plugin-proposal-json-strings": "^7.10.4",
+ "@babel/plugin-proposal-logical-assignment-operators": "^7.11.0",
+ "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4",
+ "@babel/plugin-proposal-numeric-separator": "^7.10.4",
+ "@babel/plugin-proposal-object-rest-spread": "^7.11.0",
+ "@babel/plugin-proposal-optional-catch-binding": "^7.10.4",
+ "@babel/plugin-proposal-optional-chaining": "^7.11.0",
+ "@babel/plugin-proposal-private-methods": "^7.10.4",
+ "@babel/plugin-proposal-unicode-property-regex": "^7.10.4",
+ "@babel/plugin-syntax-async-generators": "^7.8.0",
+ "@babel/plugin-syntax-class-properties": "^7.10.4",
+ "@babel/plugin-syntax-dynamic-import": "^7.8.0",
+ "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
+ "@babel/plugin-syntax-json-strings": "^7.8.0",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.0",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.0",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.0",
+ "@babel/plugin-syntax-top-level-await": "^7.10.4",
+ "@babel/plugin-transform-arrow-functions": "^7.10.4",
+ "@babel/plugin-transform-async-to-generator": "^7.10.4",
+ "@babel/plugin-transform-block-scoped-functions": "^7.10.4",
+ "@babel/plugin-transform-block-scoping": "^7.10.4",
+ "@babel/plugin-transform-classes": "^7.10.4",
+ "@babel/plugin-transform-computed-properties": "^7.10.4",
+ "@babel/plugin-transform-destructuring": "^7.10.4",
+ "@babel/plugin-transform-dotall-regex": "^7.10.4",
+ "@babel/plugin-transform-duplicate-keys": "^7.10.4",
+ "@babel/plugin-transform-exponentiation-operator": "^7.10.4",
+ "@babel/plugin-transform-for-of": "^7.10.4",
+ "@babel/plugin-transform-function-name": "^7.10.4",
+ "@babel/plugin-transform-literals": "^7.10.4",
+ "@babel/plugin-transform-member-expression-literals": "^7.10.4",
+ "@babel/plugin-transform-modules-amd": "^7.10.4",
+ "@babel/plugin-transform-modules-commonjs": "^7.10.4",
+ "@babel/plugin-transform-modules-systemjs": "^7.10.4",
+ "@babel/plugin-transform-modules-umd": "^7.10.4",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4",
+ "@babel/plugin-transform-new-target": "^7.10.4",
+ "@babel/plugin-transform-object-super": "^7.10.4",
+ "@babel/plugin-transform-parameters": "^7.10.4",
+ "@babel/plugin-transform-property-literals": "^7.10.4",
+ "@babel/plugin-transform-regenerator": "^7.10.4",
+ "@babel/plugin-transform-reserved-words": "^7.10.4",
+ "@babel/plugin-transform-shorthand-properties": "^7.10.4",
+ "@babel/plugin-transform-spread": "^7.11.0",
+ "@babel/plugin-transform-sticky-regex": "^7.10.4",
+ "@babel/plugin-transform-template-literals": "^7.10.4",
+ "@babel/plugin-transform-typeof-symbol": "^7.10.4",
+ "@babel/plugin-transform-unicode-escapes": "^7.10.4",
+ "@babel/plugin-transform-unicode-regex": "^7.10.4",
+ "@babel/preset-modules": "^0.1.3",
+ "@babel/types": "^7.11.5",
+ "browserslist": "^4.12.0",
+ "core-js-compat": "^3.6.2",
+ "invariant": "^2.2.2",
+ "levenary": "^1.1.1",
+ "semver": "^5.5.0"
+ }
+ },
+ "node_modules/@babel/preset-flow": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.10.4.tgz",
+ "integrity": "sha512-XI6l1CptQCOBv+ZKYwynyswhtOKwpZZp5n0LG1QKCo8erRhqjoQV6nvx61Eg30JHpysWQSBwA2AWRU3pBbSY5g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-transform-flow-strip-types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/preset-modules": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz",
+ "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
+ "@babel/plugin-transform-dotall-regex": "^7.4.4",
+ "@babel/types": "^7.4.4",
+ "esutils": "^2.0.2"
+ }
+ },
+ "node_modules/@babel/preset-typescript": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.10.4.tgz",
+ "integrity": "sha512-SdYnvGPv+bLlwkF2VkJnaX/ni1sMNetcGI1+nThF1gyv6Ph8Qucc4ZZAjM5yZcE/AKRXIOTZz7eSRDWOEjPyRQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4",
+ "@babel/plugin-transform-typescript": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.11.2",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz",
+ "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==",
+ "dependencies": {
+ "regenerator-runtime": "^0.13.4"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+ "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/parser": "^7.10.4",
+ "@babel/types": "^7.10.4"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.11.5",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz",
+ "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/generator": "^7.11.5",
+ "@babel/helper-function-name": "^7.10.4",
+ "@babel/helper-split-export-declaration": "^7.11.0",
+ "@babel/parser": "^7.11.5",
+ "@babel/types": "^7.11.5",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0",
+ "lodash": "^4.17.19"
+ }
+ },
+ "node_modules/@babel/traverse/node_modules/debug": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
+ "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/@babel/traverse/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/@babel/types": {
+ "version": "7.11.5",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz",
+ "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.10.4",
+ "lodash": "^4.17.19",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "node_modules/@cnakazawa/watch": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz",
+ "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==",
+ "dev": true,
+ "dependencies": {
+ "exec-sh": "^0.3.2",
+ "minimist": "^1.2.0"
+ },
+ "bin": {
+ "watch": "cli.js"
+ },
+ "engines": {
+ "node": ">=0.1.95"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.2.tgz",
+ "integrity": "sha512-EfB5OHNYp1F4px/LI/FEnGylop7nOqkQ1LRzCM0KccA2U8tvV8w01KBv37LbO7nW4H+YhKyo2LcJhRwjjV17QQ==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.1.1",
+ "espree": "^7.3.0",
+ "globals": "^12.1.0",
+ "ignore": "^4.0.6",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^3.13.1",
+ "lodash": "^4.17.19",
+ "minimatch": "^3.0.4",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/debug": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
+ "version": "12.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
+ "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.8.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/ignore": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/@jest/console": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz",
+ "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==",
+ "dev": true,
+ "dependencies": {
+ "@jest/source-map": "^24.9.0",
+ "chalk": "^2.0.1",
+ "slash": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/@jest/core": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.9.0.tgz",
+ "integrity": "sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==",
+ "dev": true,
+ "dependencies": {
+ "@jest/console": "^24.7.1",
+ "@jest/reporters": "^24.9.0",
+ "@jest/test-result": "^24.9.0",
+ "@jest/transform": "^24.9.0",
+ "@jest/types": "^24.9.0",
+ "ansi-escapes": "^3.0.0",
+ "chalk": "^2.0.1",
+ "exit": "^0.1.2",
+ "graceful-fs": "^4.1.15",
+ "jest-changed-files": "^24.9.0",
+ "jest-config": "^24.9.0",
+ "jest-haste-map": "^24.9.0",
+ "jest-message-util": "^24.9.0",
+ "jest-regex-util": "^24.3.0",
+ "jest-resolve": "^24.9.0",
+ "jest-resolve-dependencies": "^24.9.0",
+ "jest-runner": "^24.9.0",
+ "jest-runtime": "^24.9.0",
+ "jest-snapshot": "^24.9.0",
+ "jest-util": "^24.9.0",
+ "jest-validate": "^24.9.0",
+ "jest-watcher": "^24.9.0",
+ "micromatch": "^3.1.10",
+ "p-each-series": "^1.0.0",
+ "realpath-native": "^1.1.0",
+ "rimraf": "^2.5.4",
+ "slash": "^2.0.0",
+ "strip-ansi": "^5.0.0"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/@jest/core/node_modules/ansi-escapes": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
+ "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@jest/core/node_modules/ansi-regex": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@jest/core/node_modules/strip-ansi": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@jest/environment": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz",
+ "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==",
+ "dev": true,
+ "dependencies": {
+ "@jest/fake-timers": "^24.9.0",
+ "@jest/transform": "^24.9.0",
+ "@jest/types": "^24.9.0",
+ "jest-mock": "^24.9.0"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/@jest/fake-timers": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz",
+ "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==",
+ "dev": true,
+ "dependencies": {
+ "@jest/types": "^24.9.0",
+ "jest-message-util": "^24.9.0",
+ "jest-mock": "^24.9.0"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/@jest/reporters": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.9.0.tgz",
+ "integrity": "sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==",
+ "dev": true,
+ "dependencies": {
+ "@jest/environment": "^24.9.0",
+ "@jest/test-result": "^24.9.0",
+ "@jest/transform": "^24.9.0",
+ "@jest/types": "^24.9.0",
+ "chalk": "^2.0.1",
+ "exit": "^0.1.2",
+ "glob": "^7.1.2",
+ "istanbul-lib-coverage": "^2.0.2",
+ "istanbul-lib-instrument": "^3.0.1",
+ "istanbul-lib-report": "^2.0.4",
+ "istanbul-lib-source-maps": "^3.0.1",
+ "istanbul-reports": "^2.2.6",
+ "jest-haste-map": "^24.9.0",
+ "jest-resolve": "^24.9.0",
+ "jest-runtime": "^24.9.0",
+ "jest-util": "^24.9.0",
+ "jest-worker": "^24.6.0",
+ "node-notifier": "^5.4.2",
+ "slash": "^2.0.0",
+ "source-map": "^0.6.0",
+ "string-length": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/@jest/reporters/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@jest/source-map": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz",
+ "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==",
+ "dev": true,
+ "dependencies": {
+ "callsites": "^3.0.0",
+ "graceful-fs": "^4.1.15",
+ "source-map": "^0.6.0"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/@jest/source-map/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@jest/test-result": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz",
+ "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==",
+ "dev": true,
+ "dependencies": {
+ "@jest/console": "^24.9.0",
+ "@jest/types": "^24.9.0",
+ "@types/istanbul-lib-coverage": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/@jest/test-sequencer": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz",
+ "integrity": "sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==",
+ "dev": true,
+ "dependencies": {
+ "@jest/test-result": "^24.9.0",
+ "jest-haste-map": "^24.9.0",
+ "jest-runner": "^24.9.0",
+ "jest-runtime": "^24.9.0"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/@jest/transform": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz",
+ "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.1.0",
+ "@jest/types": "^24.9.0",
+ "babel-plugin-istanbul": "^5.1.0",
+ "chalk": "^2.0.1",
+ "convert-source-map": "^1.4.0",
+ "fast-json-stable-stringify": "^2.0.0",
+ "graceful-fs": "^4.1.15",
+ "jest-haste-map": "^24.9.0",
+ "jest-regex-util": "^24.9.0",
+ "jest-util": "^24.9.0",
+ "micromatch": "^3.1.10",
+ "pirates": "^4.0.1",
+ "realpath-native": "^1.1.0",
+ "slash": "^2.0.0",
+ "source-map": "^0.6.1",
+ "write-file-atomic": "2.4.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/@jest/transform/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@jest/types": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz",
+ "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==",
+ "dev": true,
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^1.1.1",
+ "@types/yargs": "^13.0.0"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz",
+ "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.4",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz",
+ "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz",
+ "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.4",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@types/babel__core": {
+ "version": "7.1.10",
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.10.tgz",
+ "integrity": "sha512-x8OM8XzITIMyiwl5Vmo2B1cR1S1Ipkyv4mdlbJjMa1lmuKvKY9FrBbEANIaMlnWn5Rf7uO+rC/VgYabNkE17Hw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/parser": "^7.1.0",
+ "@babel/types": "^7.0.0",
+ "@types/babel__generator": "*",
+ "@types/babel__template": "*",
+ "@types/babel__traverse": "*"
+ }
+ },
+ "node_modules/@types/babel__generator": {
+ "version": "7.6.2",
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.2.tgz",
+ "integrity": "sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__template": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.3.tgz",
+ "integrity": "sha512-uCoznIPDmnickEi6D0v11SBpW0OuVqHJCa7syXqQHy5uktSCreIlt0iglsCnmvz8yCb38hGcWeseA8cWJSwv5Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/parser": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__traverse": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.15.tgz",
+ "integrity": "sha512-Pzh9O3sTK8V6I1olsXpCfj2k/ygO2q1X0vhhnDrEQyYLHZesWz+zMZMVcwXLCYf0U36EtmyYaFGPfXlTtDHe3A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.3.0"
+ }
+ },
+ "node_modules/@types/glob": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz",
+ "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==",
+ "dev": true,
+ "dependencies": {
+ "@types/minimatch": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/istanbul-lib-coverage": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz",
+ "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==",
+ "dev": true
+ },
+ "node_modules/@types/istanbul-lib-report": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
+ "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==",
+ "dev": true,
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "*"
+ }
+ },
+ "node_modules/@types/istanbul-reports": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz",
+ "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==",
+ "dev": true,
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "*",
+ "@types/istanbul-lib-report": "*"
+ }
+ },
+ "node_modules/@types/jest": {
+ "version": "26.0.23",
+ "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.23.tgz",
+ "integrity": "sha512-ZHLmWMJ9jJ9PTiT58juykZpL7KjwJywFN3Rr2pTSkyQfydf/rk22yS7W8p5DaVUMQ2BQC7oYiU3FjbTM/mYrOA==",
+ "dev": true,
+ "dependencies": {
+ "jest-diff": "^26.0.0",
+ "pretty-format": "^26.0.0"
+ }
+ },
+ "node_modules/@types/jest/node_modules/@jest/types": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
+ "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^15.0.0",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 10.14.2"
+ }
+ },
+ "node_modules/@types/jest/node_modules/@types/istanbul-reports": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+ "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+ "dev": true,
+ "dependencies": {
+ "@types/istanbul-lib-report": "*"
+ }
+ },
+ "node_modules/@types/jest/node_modules/@types/yargs": {
+ "version": "15.0.13",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.13.tgz",
+ "integrity": "sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/@types/jest/node_modules/ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@types/jest/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/@types/jest/node_modules/chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/@types/jest/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/@types/jest/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/@types/jest/node_modules/diff-sequences": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz",
+ "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10.14.2"
+ }
+ },
+ "node_modules/@types/jest/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@types/jest/node_modules/jest-diff": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz",
+ "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "diff-sequences": "^26.6.2",
+ "jest-get-type": "^26.3.0",
+ "pretty-format": "^26.6.2"
+ },
+ "engines": {
+ "node": ">= 10.14.2"
+ }
+ },
+ "node_modules/@types/jest/node_modules/jest-get-type": {
+ "version": "26.3.0",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz",
+ "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10.14.2"
+ }
+ },
+ "node_modules/@types/jest/node_modules/pretty-format": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz",
+ "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==",
+ "dev": true,
+ "dependencies": {
+ "@jest/types": "^26.6.2",
+ "ansi-regex": "^5.0.0",
+ "ansi-styles": "^4.0.0",
+ "react-is": "^17.0.1"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@types/jest/node_modules/react-is": {
+ "version": "17.0.2",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
+ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
+ "dev": true
+ },
+ "node_modules/@types/jest/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz",
+ "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==",
+ "dev": true
+ },
+ "node_modules/@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "node_modules/@types/node": {
+ "version": "14.11.2",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.11.2.tgz",
+ "integrity": "sha512-jiE3QIxJ8JLNcb1Ps6rDbysDhN4xa8DJJvuC9prr6w+1tIh+QAbYyNF3tyiZNLDBIuBCf4KEcV2UvQm/V60xfA==",
+ "dev": true
+ },
+ "node_modules/@types/parse-json": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
+ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
+ "dev": true
+ },
+ "node_modules/@types/q": {
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz",
+ "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==",
+ "dev": true
+ },
+ "node_modules/@types/stack-utils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz",
+ "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==",
+ "dev": true
+ },
+ "node_modules/@types/yargs": {
+ "version": "13.0.11",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.11.tgz",
+ "integrity": "sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/@types/yargs-parser": {
+ "version": "15.0.0",
+ "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz",
+ "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==",
+ "dev": true
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "4.11.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.11.1.tgz",
+ "integrity": "sha512-fABclAX2QIEDmTMk6Yd7Muv1CzFLwWM4505nETzRHpP3br6jfahD9UUJkhnJ/g2m7lwfz8IlswcwGGPGiq9exw==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/experimental-utils": "4.11.1",
+ "@typescript-eslint/scope-manager": "4.11.1",
+ "debug": "^4.1.1",
+ "functional-red-black-tree": "^1.0.1",
+ "regexpp": "^3.0.0",
+ "semver": "^7.3.2",
+ "tsutils": "^3.17.1"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/debug": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": {
+ "version": "7.3.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
+ "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
+ "node_modules/@typescript-eslint/experimental-utils": {
+ "version": "4.11.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.11.1.tgz",
+ "integrity": "sha512-mAlWowT4A6h0TC9F+J5pdbEhjNiEMO+kqPKQ4sc3fVieKL71dEqfkKgtcFVSX3cjSBwYwhImaQ/mXQF0oaI38g==",
+ "dev": true,
+ "dependencies": {
+ "@types/json-schema": "^7.0.3",
+ "@typescript-eslint/scope-manager": "4.11.1",
+ "@typescript-eslint/types": "4.11.1",
+ "@typescript-eslint/typescript-estree": "4.11.1",
+ "eslint-scope": "^5.0.0",
+ "eslint-utils": "^2.0.0"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "4.11.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.11.1.tgz",
+ "integrity": "sha512-BJ3jwPQu1jeynJ5BrjLuGfK/UJu6uwHxJ/di7sanqmUmxzmyIcd3vz58PMR7wpi8k3iWq2Q11KMYgZbUpRoIPw==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "4.11.1",
+ "@typescript-eslint/types": "4.11.1",
+ "@typescript-eslint/typescript-estree": "4.11.1",
+ "debug": "^4.1.1"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/parser/node_modules/debug": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/@typescript-eslint/parser/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "4.11.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.11.1.tgz",
+ "integrity": "sha512-Al2P394dx+kXCl61fhrrZ1FTI7qsRDIUiVSuN6rTwss6lUn8uVO2+nnF4AvO0ug8vMsy3ShkbxLu/uWZdTtJMQ==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "4.11.1",
+ "@typescript-eslint/visitor-keys": "4.11.1"
+ },
+ "engines": {
+ "node": "^8.10.0 || ^10.13.0 || >=11.10.1"
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "4.11.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.11.1.tgz",
+ "integrity": "sha512-5kvd38wZpqGY4yP/6W3qhYX6Hz0NwUbijVsX2rxczpY6OXaMxh0+5E5uLJKVFwaBM7PJe1wnMym85NfKYIh6CA==",
+ "dev": true,
+ "engines": {
+ "node": "^8.10.0 || ^10.13.0 || >=11.10.1"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "4.11.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.11.1.tgz",
+ "integrity": "sha512-tC7MKZIMRTYxQhrVAFoJq/DlRwv1bnqA4/S2r3+HuHibqvbrPcyf858lNzU7bFmy4mLeIHFYr34ar/1KumwyRw==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "4.11.1",
+ "@typescript-eslint/visitor-keys": "4.11.1",
+ "debug": "^4.1.1",
+ "globby": "^11.0.1",
+ "is-glob": "^4.0.1",
+ "lodash": "^4.17.15",
+ "semver": "^7.3.2",
+ "tsutils": "^3.17.1"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
+ "version": "7.3.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
+ "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "4.11.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.11.1.tgz",
+ "integrity": "sha512-IrlBhD9bm4bdYcS8xpWarazkKXlE7iYb1HzRuyBP114mIaj5DJPo11Us1HgH60dTt41TCZXMaTCAW+OILIYPOg==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "4.11.1",
+ "eslint-visitor-keys": "^2.0.0"
+ },
+ "engines": {
+ "node": "^8.10.0 || ^10.13.0 || >=11.10.1"
+ }
+ },
+ "node_modules/@webassemblyjs/ast": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz",
+ "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/helper-module-context": "1.9.0",
+ "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+ "@webassemblyjs/wast-parser": "1.9.0"
+ }
+ },
+ "node_modules/@webassemblyjs/floating-point-hex-parser": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz",
+ "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==",
+ "dev": true
+ },
+ "node_modules/@webassemblyjs/helper-api-error": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz",
+ "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==",
+ "dev": true
+ },
+ "node_modules/@webassemblyjs/helper-buffer": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz",
+ "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==",
+ "dev": true
+ },
+ "node_modules/@webassemblyjs/helper-code-frame": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz",
+ "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/wast-printer": "1.9.0"
+ }
+ },
+ "node_modules/@webassemblyjs/helper-fsm": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz",
+ "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==",
+ "dev": true
+ },
+ "node_modules/@webassemblyjs/helper-module-context": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz",
+ "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.9.0"
+ }
+ },
+ "node_modules/@webassemblyjs/helper-wasm-bytecode": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz",
+ "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==",
+ "dev": true
+ },
+ "node_modules/@webassemblyjs/helper-wasm-section": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz",
+ "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/helper-buffer": "1.9.0",
+ "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+ "@webassemblyjs/wasm-gen": "1.9.0"
+ }
+ },
+ "node_modules/@webassemblyjs/ieee754": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz",
+ "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==",
+ "dev": true,
+ "dependencies": {
+ "@xtuc/ieee754": "^1.2.0"
+ }
+ },
+ "node_modules/@webassemblyjs/leb128": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz",
+ "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==",
+ "dev": true,
+ "dependencies": {
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/utf8": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz",
+ "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==",
+ "dev": true
+ },
+ "node_modules/@webassemblyjs/wasm-edit": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz",
+ "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/helper-buffer": "1.9.0",
+ "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+ "@webassemblyjs/helper-wasm-section": "1.9.0",
+ "@webassemblyjs/wasm-gen": "1.9.0",
+ "@webassemblyjs/wasm-opt": "1.9.0",
+ "@webassemblyjs/wasm-parser": "1.9.0",
+ "@webassemblyjs/wast-printer": "1.9.0"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-gen": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz",
+ "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+ "@webassemblyjs/ieee754": "1.9.0",
+ "@webassemblyjs/leb128": "1.9.0",
+ "@webassemblyjs/utf8": "1.9.0"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-opt": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz",
+ "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/helper-buffer": "1.9.0",
+ "@webassemblyjs/wasm-gen": "1.9.0",
+ "@webassemblyjs/wasm-parser": "1.9.0"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-parser": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz",
+ "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/helper-api-error": "1.9.0",
+ "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+ "@webassemblyjs/ieee754": "1.9.0",
+ "@webassemblyjs/leb128": "1.9.0",
+ "@webassemblyjs/utf8": "1.9.0"
+ }
+ },
+ "node_modules/@webassemblyjs/wast-parser": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz",
+ "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/floating-point-hex-parser": "1.9.0",
+ "@webassemblyjs/helper-api-error": "1.9.0",
+ "@webassemblyjs/helper-code-frame": "1.9.0",
+ "@webassemblyjs/helper-fsm": "1.9.0",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/wast-printer": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz",
+ "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/wast-parser": "1.9.0",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@xtuc/ieee754": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+ "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
+ "dev": true
+ },
+ "node_modules/@xtuc/long": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
+ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
+ "dev": true
+ },
+ "node_modules/abab": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz",
+ "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==",
+ "dev": true
+ },
+ "node_modules/abbrev": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
+ "dev": true
+ },
+ "node_modules/accepts": {
+ "version": "1.3.7",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
+ "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
+ "dev": true,
+ "dependencies": {
+ "mime-types": "~2.1.24",
+ "negotiator": "0.6.2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-globals": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz",
+ "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^6.0.1",
+ "acorn-walk": "^6.0.1"
+ }
+ },
+ "node_modules/acorn-globals/node_modules/acorn": {
+ "version": "6.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz",
+ "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
+ "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==",
+ "dev": true
+ },
+ "node_modules/acorn-walk": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz",
+ "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.5",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz",
+ "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "node_modules/ajv-errors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz",
+ "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==",
+ "dev": true
+ },
+ "node_modules/ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+ "dev": true
+ },
+ "node_modules/alphanum-sort": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz",
+ "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=",
+ "dev": true
+ },
+ "node_modules/amdefine": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
+ "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.2"
+ }
+ },
+ "node_modules/ansi-colors": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz",
+ "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ansi-html": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz",
+ "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=",
+ "dev": true,
+ "engines": [
+ "node >= 0.8.0"
+ ],
+ "bin": {
+ "ansi-html": "bin/ansi-html"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
+ "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+ "dev": true,
+ "dependencies": {
+ "micromatch": "^3.1.4",
+ "normalize-path": "^2.1.1"
+ }
+ },
+ "node_modules/anymatch/node_modules/normalize-path": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+ "dev": true,
+ "dependencies": {
+ "remove-trailing-separator": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/aproba": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
+ "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
+ "dev": true
+ },
+ "node_modules/are-we-there-yet": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
+ "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
+ "dev": true,
+ "dependencies": {
+ "delegates": "^1.0.0",
+ "readable-stream": "^2.0.6"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/array-equal": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz",
+ "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=",
+ "dev": true
+ },
+ "node_modules/array-find-index": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
+ "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/array-flatten": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz",
+ "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==",
+ "dev": true
+ },
+ "node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/array-uniq": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
+ "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/asn1": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
+ "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
+ "dev": true,
+ "dependencies": {
+ "safer-buffer": "~2.1.0"
+ }
+ },
+ "node_modules/asn1.js": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz",
+ "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==",
+ "dev": true,
+ "dependencies": {
+ "bn.js": "^4.0.0",
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0",
+ "safer-buffer": "^2.1.0"
+ }
+ },
+ "node_modules/asn1.js/node_modules/bn.js": {
+ "version": "4.11.9",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
+ "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+ "dev": true
+ },
+ "node_modules/assert": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz",
+ "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==",
+ "dev": true,
+ "dependencies": {
+ "object-assign": "^4.1.1",
+ "util": "0.10.3"
+ }
+ },
+ "node_modules/assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/assert/node_modules/inherits": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
+ "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
+ "dev": true
+ },
+ "node_modules/assert/node_modules/util": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
+ "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
+ "dev": true,
+ "dependencies": {
+ "inherits": "2.0.1"
+ }
+ },
+ "node_modules/assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ast-types": {
+ "version": "0.9.6",
+ "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz",
+ "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/astral-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
+ "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/async": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
+ "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
+ "dev": true,
+ "dependencies": {
+ "lodash": "^4.17.14"
+ }
+ },
+ "node_modules/async-each": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz",
+ "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==",
+ "dev": true
+ },
+ "node_modules/async-foreach": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz",
+ "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/async-limiter": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
+ "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==",
+ "dev": true
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
+ "dev": true
+ },
+ "node_modules/at-least-node": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
+ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/atob": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
+ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
+ "dev": true,
+ "bin": {
+ "atob": "bin/atob.js"
+ },
+ "engines": {
+ "node": ">= 4.5.0"
+ }
+ },
+ "node_modules/aws-sign2": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/aws4": {
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz",
+ "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==",
+ "dev": true
+ },
+ "node_modules/babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^1.1.3",
+ "esutils": "^2.0.2",
+ "js-tokens": "^3.0.2"
+ }
+ },
+ "node_modules/babel-code-frame/node_modules/ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/babel-code-frame/node_modules/chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^2.2.1",
+ "escape-string-regexp": "^1.0.2",
+ "has-ansi": "^2.0.0",
+ "strip-ansi": "^3.0.0",
+ "supports-color": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/babel-code-frame/node_modules/js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "node_modules/babel-code-frame/node_modules/supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/babel-eslint": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz",
+ "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.0.0",
+ "@babel/parser": "^7.7.0",
+ "@babel/traverse": "^7.7.0",
+ "@babel/types": "^7.7.0",
+ "eslint-visitor-keys": "^1.0.0",
+ "resolve": "^1.12.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/babel-eslint/node_modules/eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/babel-jest": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz",
+ "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==",
+ "dev": true,
+ "dependencies": {
+ "@jest/transform": "^24.9.0",
+ "@jest/types": "^24.9.0",
+ "@types/babel__core": "^7.1.0",
+ "babel-plugin-istanbul": "^5.1.0",
+ "babel-preset-jest": "^24.9.0",
+ "chalk": "^2.4.2",
+ "slash": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/babel-loader": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz",
+ "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==",
+ "dev": true,
+ "dependencies": {
+ "find-cache-dir": "^2.1.0",
+ "loader-utils": "^1.4.0",
+ "mkdirp": "^0.5.3",
+ "pify": "^4.0.1",
+ "schema-utils": "^2.6.5"
+ },
+ "engines": {
+ "node": ">= 6.9"
+ }
+ },
+ "node_modules/babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/babel-plugin-dynamic-import-node": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz",
+ "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==",
+ "dev": true,
+ "dependencies": {
+ "object.assign": "^4.1.0"
+ }
+ },
+ "node_modules/babel-plugin-es6-promise": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-es6-promise/-/babel-plugin-es6-promise-1.1.1.tgz",
+ "integrity": "sha1-AgLwkpcF8v3N2o/9EiIkbCy51q4=",
+ "dev": true,
+ "dependencies": {
+ "babel-template": "^6.7.0",
+ "babel-types": "^6.7.2"
+ }
+ },
+ "node_modules/babel-plugin-istanbul": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz",
+ "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "find-up": "^3.0.0",
+ "istanbul-lib-instrument": "^3.3.0",
+ "test-exclude": "^5.2.3"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/babel-plugin-jest-hoist": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz",
+ "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==",
+ "dev": true,
+ "dependencies": {
+ "@types/babel__traverse": "^7.0.6"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-modules-commonjs": {
+ "version": "6.26.2",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz",
+ "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==",
+ "dev": true,
+ "dependencies": {
+ "babel-plugin-transform-strict-mode": "^6.24.1",
+ "babel-runtime": "^6.26.0",
+ "babel-template": "^6.26.0",
+ "babel-types": "^6.26.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-strict-mode": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz",
+ "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-preset-jest": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz",
+ "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/plugin-syntax-object-rest-spread": "^7.0.0",
+ "babel-plugin-jest-hoist": "^24.9.0"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "dependencies": {
+ "core-js": "^2.4.0",
+ "regenerator-runtime": "^0.11.0"
+ }
+ },
+ "node_modules/babel-runtime/node_modules/regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "node_modules/babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.26.0",
+ "babel-traverse": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "babylon": "^6.18.0",
+ "lodash": "^4.17.4"
+ }
+ },
+ "node_modules/babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "dependencies": {
+ "babel-code-frame": "^6.26.0",
+ "babel-messages": "^6.23.0",
+ "babel-runtime": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "babylon": "^6.18.0",
+ "debug": "^2.6.8",
+ "globals": "^9.18.0",
+ "invariant": "^2.2.2",
+ "lodash": "^4.17.4"
+ }
+ },
+ "node_modules/babel-traverse/node_modules/globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.26.0",
+ "esutils": "^2.0.2",
+ "lodash": "^4.17.4",
+ "to-fast-properties": "^1.0.3"
+ }
+ },
+ "node_modules/babel-types/node_modules/to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true,
+ "bin": {
+ "babylon": "bin/babylon.js"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "node_modules/base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "dev": true,
+ "dependencies": {
+ "cache-base": "^1.0.1",
+ "class-utils": "^0.3.5",
+ "component-emitter": "^1.2.1",
+ "define-property": "^1.0.0",
+ "isobject": "^3.0.1",
+ "mixin-deep": "^1.2.0",
+ "pascalcase": "^0.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/base/node_modules/define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "dependencies": {
+ "is-descriptor": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/base/node_modules/is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "dependencies": {
+ "kind-of": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/base/node_modules/is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "dependencies": {
+ "kind-of": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/base/node_modules/is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "dependencies": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/base64-arraybuffer-es6": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/base64-arraybuffer-es6/-/base64-arraybuffer-es6-0.6.0.tgz",
+ "integrity": "sha512-57nLqKj4ShsDwFJWJsM4sZx6u60WbCge35rWRSevUwqxDtRwwxiKAO800zD2upPv4CfdWjQp//wSLar35nDKvA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/base64-js": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
+ "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==",
+ "dev": true
+ },
+ "node_modules/batch": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
+ "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=",
+ "dev": true
+ },
+ "node_modules/bcrypt-pbkdf": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+ "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
+ "dev": true,
+ "dependencies": {
+ "tweetnacl": "^0.14.3"
+ }
+ },
+ "node_modules/big.js": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
+ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/binary-extensions": {
+ "version": "1.13.1",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
+ "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/bindings": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
+ "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "file-uri-to-path": "1.0.0"
+ }
+ },
+ "node_modules/block-stream": {
+ "version": "0.0.9",
+ "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
+ "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=",
+ "dev": true,
+ "dependencies": {
+ "inherits": "~2.0.0"
+ },
+ "engines": {
+ "node": "0.4 || >=0.5.8"
+ }
+ },
+ "node_modules/bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+ "dev": true
+ },
+ "node_modules/bn.js": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz",
+ "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==",
+ "dev": true
+ },
+ "node_modules/body-parser": {
+ "version": "1.19.0",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
+ "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
+ "dev": true,
+ "dependencies": {
+ "bytes": "3.1.0",
+ "content-type": "~1.0.4",
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "http-errors": "1.7.2",
+ "iconv-lite": "0.4.24",
+ "on-finished": "~2.3.0",
+ "qs": "6.7.0",
+ "raw-body": "2.4.0",
+ "type-is": "~1.6.17"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/body-parser/node_modules/bytes": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
+ "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/body-parser/node_modules/qs": {
+ "version": "6.7.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
+ "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/bonjour": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz",
+ "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=",
+ "dev": true,
+ "dependencies": {
+ "array-flatten": "^2.1.0",
+ "deep-equal": "^1.0.1",
+ "dns-equal": "^1.0.0",
+ "dns-txt": "^2.0.2",
+ "multicast-dns": "^6.0.1",
+ "multicast-dns-service-types": "^1.1.0"
+ }
+ },
+ "node_modules/boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
+ "dev": true
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "dependencies": {
+ "arr-flatten": "^1.1.0",
+ "array-unique": "^0.3.2",
+ "extend-shallow": "^2.0.1",
+ "fill-range": "^4.0.0",
+ "isobject": "^3.0.1",
+ "repeat-element": "^1.1.2",
+ "snapdragon": "^0.8.1",
+ "snapdragon-node": "^2.0.1",
+ "split-string": "^3.0.2",
+ "to-regex": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/braces/node_modules/extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "dependencies": {
+ "is-extendable": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/brorand": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+ "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
+ "dev": true
+ },
+ "node_modules/browser-process-hrtime": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz",
+ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==",
+ "dev": true
+ },
+ "node_modules/browser-resolve": {
+ "version": "1.11.3",
+ "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz",
+ "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==",
+ "dev": true,
+ "dependencies": {
+ "resolve": "1.1.7"
+ }
+ },
+ "node_modules/browser-resolve/node_modules/resolve": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
+ "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=",
+ "dev": true
+ },
+ "node_modules/browserify-aes": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
+ "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
+ "dev": true,
+ "dependencies": {
+ "buffer-xor": "^1.0.3",
+ "cipher-base": "^1.0.0",
+ "create-hash": "^1.1.0",
+ "evp_bytestokey": "^1.0.3",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/browserify-cipher": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
+ "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
+ "dev": true,
+ "dependencies": {
+ "browserify-aes": "^1.0.4",
+ "browserify-des": "^1.0.0",
+ "evp_bytestokey": "^1.0.0"
+ }
+ },
+ "node_modules/browserify-des": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
+ "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
+ "dev": true,
+ "dependencies": {
+ "cipher-base": "^1.0.1",
+ "des.js": "^1.0.0",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "node_modules/browserify-rsa": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
+ "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
+ "dev": true,
+ "dependencies": {
+ "bn.js": "^4.1.0",
+ "randombytes": "^2.0.1"
+ }
+ },
+ "node_modules/browserify-rsa/node_modules/bn.js": {
+ "version": "4.11.9",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
+ "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+ "dev": true
+ },
+ "node_modules/browserify-sign": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz",
+ "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==",
+ "dev": true,
+ "dependencies": {
+ "bn.js": "^5.1.1",
+ "browserify-rsa": "^4.0.1",
+ "create-hash": "^1.2.0",
+ "create-hmac": "^1.1.7",
+ "elliptic": "^6.5.3",
+ "inherits": "^2.0.4",
+ "parse-asn1": "^5.1.5",
+ "readable-stream": "^3.6.0",
+ "safe-buffer": "^5.2.0"
+ }
+ },
+ "node_modules/browserify-sign/node_modules/readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/browserify-sign/node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true
+ },
+ "node_modules/browserify-zlib": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
+ "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
+ "dev": true,
+ "dependencies": {
+ "pako": "~1.0.5"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.14.5",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.5.tgz",
+ "integrity": "sha512-Z+vsCZIvCBvqLoYkBFTwEYH3v5MCQbsAjp50ERycpOjnPmolg1Gjy4+KaWWpm8QOJt9GHkhdqAl14NpCX73CWA==",
+ "dev": true,
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001135",
+ "electron-to-chromium": "^1.3.571",
+ "escalade": "^3.1.0",
+ "node-releases": "^1.1.61"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/bser": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
+ "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
+ "dev": true,
+ "dependencies": {
+ "node-int64": "^0.4.0"
+ }
+ },
+ "node_modules/buffer": {
+ "version": "4.9.2",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz",
+ "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==",
+ "dev": true,
+ "dependencies": {
+ "base64-js": "^1.0.2",
+ "ieee754": "^1.1.4",
+ "isarray": "^1.0.0"
+ }
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
+ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
+ "dev": true
+ },
+ "node_modules/buffer-indexof": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz",
+ "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==",
+ "dev": true
+ },
+ "node_modules/buffer-xor": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
+ "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
+ "dev": true
+ },
+ "node_modules/builtin-status-codes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
+ "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
+ "dev": true
+ },
+ "node_modules/bytes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
+ "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/cacache": {
+ "version": "12.0.4",
+ "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz",
+ "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==",
+ "dev": true,
+ "dependencies": {
+ "bluebird": "^3.5.5",
+ "chownr": "^1.1.1",
+ "figgy-pudding": "^3.5.1",
+ "glob": "^7.1.4",
+ "graceful-fs": "^4.1.15",
+ "infer-owner": "^1.0.3",
+ "lru-cache": "^5.1.1",
+ "mississippi": "^3.0.0",
+ "mkdirp": "^0.5.1",
+ "move-concurrently": "^1.0.1",
+ "promise-inflight": "^1.0.1",
+ "rimraf": "^2.6.3",
+ "ssri": "^6.0.1",
+ "unique-filename": "^1.1.1",
+ "y18n": "^4.0.0"
+ }
+ },
+ "node_modules/cacache/node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/cacache/node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true
+ },
+ "node_modules/cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "dev": true,
+ "dependencies": {
+ "collection-visit": "^1.0.0",
+ "component-emitter": "^1.2.1",
+ "get-value": "^2.0.6",
+ "has-value": "^1.0.0",
+ "isobject": "^3.0.1",
+ "set-value": "^2.0.0",
+ "to-object-path": "^0.3.0",
+ "union-value": "^1.0.0",
+ "unset-value": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/caller-callsite": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz",
+ "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=",
+ "dev": true,
+ "dependencies": {
+ "callsites": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/caller-callsite/node_modules/callsites": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz",
+ "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/caller-path": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz",
+ "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=",
+ "dev": true,
+ "dependencies": {
+ "caller-callsite": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camel-case": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz",
+ "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=",
+ "dev": true,
+ "dependencies": {
+ "no-case": "^2.2.0",
+ "upper-case": "^1.1.1"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
+ "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
+ "dev": true,
+ "dependencies": {
+ "camelcase": "^2.0.0",
+ "map-obj": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/camelcase-keys/node_modules/camelcase": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
+ "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/caniuse-api": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
+ "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.0.0",
+ "caniuse-lite": "^1.0.0",
+ "lodash.memoize": "^4.1.2",
+ "lodash.uniq": "^4.5.0"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001140",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001140.tgz",
+ "integrity": "sha512-xFtvBtfGrpjTOxTpjP5F2LmN04/ZGfYV8EQzUIC/RmKpdrmzJrjqlJ4ho7sGuAMPko2/Jl08h7x9uObCfBFaAA==",
+ "dev": true
+ },
+ "node_modules/capture-exit": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz",
+ "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==",
+ "dev": true,
+ "dependencies": {
+ "rsvp": "^4.8.4"
+ },
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
+ "dev": true
+ },
+ "node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "2.1.8",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
+ "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
+ "dev": true,
+ "dependencies": {
+ "anymatch": "^2.0.0",
+ "async-each": "^1.0.1",
+ "braces": "^2.3.2",
+ "glob-parent": "^3.1.0",
+ "inherits": "^2.0.3",
+ "is-binary-path": "^1.0.0",
+ "is-glob": "^4.0.0",
+ "normalize-path": "^3.0.0",
+ "path-is-absolute": "^1.0.0",
+ "readdirp": "^2.2.1",
+ "upath": "^1.1.1"
+ },
+ "optionalDependencies": {
+ "fsevents": "^1.2.7"
+ }
+ },
+ "node_modules/chownr": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
+ "dev": true
+ },
+ "node_modules/chrome-trace-event": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz",
+ "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/ci-info": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
+ "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
+ "dev": true
+ },
+ "node_modules/cipher-base": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
+ "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/class-utils": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "dev": true,
+ "dependencies": {
+ "arr-union": "^3.1.0",
+ "define-property": "^0.2.5",
+ "isobject": "^3.0.0",
+ "static-extend": "^0.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/class-utils/node_modules/define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "dependencies": {
+ "is-descriptor": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/clean-css": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz",
+ "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==",
+ "dev": true,
+ "dependencies": {
+ "source-map": "~0.6.0"
+ },
+ "engines": {
+ "node": ">= 4.0"
+ }
+ },
+ "node_modules/clean-css/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
+ "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^3.1.0",
+ "strip-ansi": "^5.2.0",
+ "wrap-ansi": "^5.1.0"
+ }
+ },
+ "node_modules/cliui/node_modules/ansi-regex": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/cliui/node_modules/emoji-regex": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+ "dev": true
+ },
+ "node_modules/cliui/node_modules/is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/cliui/node_modules/string-width": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+ "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^7.0.1",
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/cliui/node_modules/strip-ansi": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/clone-deep": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
+ "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
+ "dev": true,
+ "dependencies": {
+ "is-plain-object": "^2.0.4",
+ "kind-of": "^6.0.2",
+ "shallow-clone": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
+ "dev": true,
+ "engines": {
+ "iojs": ">= 1.0.0",
+ "node": ">= 0.12.0"
+ }
+ },
+ "node_modules/coa": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz",
+ "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==",
+ "dev": true,
+ "dependencies": {
+ "@types/q": "^1.5.1",
+ "chalk": "^2.4.1",
+ "q": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 4.0"
+ }
+ },
+ "node_modules/code-point-at": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "dev": true,
+ "dependencies": {
+ "map-visit": "^1.0.0",
+ "object-visit": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/color": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz",
+ "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^1.9.1",
+ "color-string": "^1.5.2"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "node_modules/color-string": {
+ "version": "1.5.3",
+ "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz",
+ "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "^1.0.0",
+ "simple-swizzle": "^0.2.2"
+ }
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dev": true,
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/commander": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/commondir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
+ "dev": true
+ },
+ "node_modules/component-emitter": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
+ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
+ "dev": true
+ },
+ "node_modules/compressible": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
+ "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
+ "dev": true,
+ "dependencies": {
+ "mime-db": ">= 1.43.0 < 2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/compression": {
+ "version": "1.7.4",
+ "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
+ "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
+ "dev": true,
+ "dependencies": {
+ "accepts": "~1.3.5",
+ "bytes": "3.0.0",
+ "compressible": "~2.0.16",
+ "debug": "2.6.9",
+ "on-headers": "~1.0.2",
+ "safe-buffer": "5.1.2",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "node_modules/concat-stream": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+ "dev": true,
+ "engines": [
+ "node >= 0.8"
+ ],
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.2.2",
+ "typedarray": "^0.0.6"
+ }
+ },
+ "node_modules/connect-history-api-fallback": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz",
+ "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/console-browserify": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz",
+ "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==",
+ "dev": true
+ },
+ "node_modules/console-control-strings": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
+ "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
+ "dev": true
+ },
+ "node_modules/constants-browserify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
+ "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
+ "dev": true
+ },
+ "node_modules/content-disposition": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
+ "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "5.1.2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/content-type": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
+ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/convert-source-map": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
+ "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "~5.1.1"
+ }
+ },
+ "node_modules/cookie": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
+ "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
+ "dev": true
+ },
+ "node_modules/copy-concurrently": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
+ "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==",
+ "dev": true,
+ "dependencies": {
+ "aproba": "^1.1.1",
+ "fs-write-stream-atomic": "^1.0.8",
+ "iferr": "^0.1.5",
+ "mkdirp": "^0.5.1",
+ "rimraf": "^2.5.4",
+ "run-queue": "^1.0.0"
+ }
+ },
+ "node_modules/copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/core-js": {
+ "version": "2.6.11",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz",
+ "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==",
+ "dev": true
+ },
+ "node_modules/core-js-bundle": {
+ "version": "3.6.5",
+ "resolved": "https://registry.npmjs.org/core-js-bundle/-/core-js-bundle-3.6.5.tgz",
+ "integrity": "sha512-awf49McIBT3sDXceSex69w/i7PMXQwxI4ZqknCtaYbW4Q0u0HUZiaQLlPD6pU2nFBofIowgWIS1ANgHjqnQu4Q==",
+ "dev": true
+ },
+ "node_modules/core-js-compat": {
+ "version": "3.6.5",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz",
+ "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.8.5",
+ "semver": "7.0.0"
+ }
+ },
+ "node_modules/core-js-compat/node_modules/semver": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
+ "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+ "dev": true
+ },
+ "node_modules/cosmiconfig": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
+ "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==",
+ "dev": true,
+ "dependencies": {
+ "import-fresh": "^2.0.0",
+ "is-directory": "^0.3.1",
+ "js-yaml": "^3.13.1",
+ "parse-json": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/cosmiconfig/node_modules/import-fresh": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz",
+ "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=",
+ "dev": true,
+ "dependencies": {
+ "caller-path": "^2.0.0",
+ "resolve-from": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/cosmiconfig/node_modules/resolve-from": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
+ "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/create-ecdh": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz",
+ "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==",
+ "dev": true,
+ "dependencies": {
+ "bn.js": "^4.1.0",
+ "elliptic": "^6.5.3"
+ }
+ },
+ "node_modules/create-ecdh/node_modules/bn.js": {
+ "version": "4.11.9",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
+ "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+ "dev": true
+ },
+ "node_modules/create-hash": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
+ "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
+ "dev": true,
+ "dependencies": {
+ "cipher-base": "^1.0.1",
+ "inherits": "^2.0.1",
+ "md5.js": "^1.3.4",
+ "ripemd160": "^2.0.1",
+ "sha.js": "^2.4.0"
+ }
+ },
+ "node_modules/create-hmac": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
+ "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
+ "dev": true,
+ "dependencies": {
+ "cipher-base": "^1.0.3",
+ "create-hash": "^1.1.0",
+ "inherits": "^2.0.1",
+ "ripemd160": "^2.0.0",
+ "safe-buffer": "^5.0.1",
+ "sha.js": "^2.4.8"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+ "dev": true,
+ "dependencies": {
+ "nice-try": "^1.0.4",
+ "path-key": "^2.0.1",
+ "semver": "^5.5.0",
+ "shebang-command": "^1.2.0",
+ "which": "^1.2.9"
+ },
+ "engines": {
+ "node": ">=4.8"
+ }
+ },
+ "node_modules/crypto-browserify": {
+ "version": "3.12.0",
+ "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
+ "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
+ "dev": true,
+ "dependencies": {
+ "browserify-cipher": "^1.0.0",
+ "browserify-sign": "^4.0.0",
+ "create-ecdh": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "create-hmac": "^1.1.0",
+ "diffie-hellman": "^5.0.0",
+ "inherits": "^2.0.1",
+ "pbkdf2": "^3.0.3",
+ "public-encrypt": "^4.0.0",
+ "randombytes": "^2.0.0",
+ "randomfill": "^1.0.3"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/css-color-names": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz",
+ "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/css-declaration-sorter": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz",
+ "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==",
+ "dev": true,
+ "dependencies": {
+ "postcss": "^7.0.1",
+ "timsort": "^0.3.0"
+ },
+ "engines": {
+ "node": ">4"
+ }
+ },
+ "node_modules/css-declaration-sorter/node_modules/postcss": {
+ "version": "7.0.35",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+ "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.4.2",
+ "source-map": "^0.6.1",
+ "supports-color": "^6.1.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/css-declaration-sorter/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/css-declaration-sorter/node_modules/supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/css-loader": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-1.0.1.tgz",
+ "integrity": "sha512-+ZHAZm/yqvJ2kDtPne3uX0C+Vr3Zn5jFn2N4HywtS5ujwvsVkyg0VArEXpl3BgczDA8anieki1FIzhchX4yrDw==",
+ "dev": true,
+ "dependencies": {
+ "babel-code-frame": "^6.26.0",
+ "css-selector-tokenizer": "^0.7.0",
+ "icss-utils": "^2.1.0",
+ "loader-utils": "^1.0.2",
+ "lodash": "^4.17.11",
+ "postcss": "^6.0.23",
+ "postcss-modules-extract-imports": "^1.2.0",
+ "postcss-modules-local-by-default": "^1.2.0",
+ "postcss-modules-scope": "^1.1.0",
+ "postcss-modules-values": "^1.3.0",
+ "postcss-value-parser": "^3.3.0",
+ "source-list-map": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 6.9.0 <7.0.0 || >= 8.9.0"
+ }
+ },
+ "node_modules/css-select": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz",
+ "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=",
+ "dev": true,
+ "dependencies": {
+ "boolbase": "~1.0.0",
+ "css-what": "2.1",
+ "domutils": "1.5.1",
+ "nth-check": "~1.0.1"
+ }
+ },
+ "node_modules/css-select-base-adapter": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz",
+ "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==",
+ "dev": true
+ },
+ "node_modules/css-selector-tokenizer": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz",
+ "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==",
+ "dev": true,
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "fastparse": "^1.1.2"
+ }
+ },
+ "node_modules/css-tree": {
+ "version": "1.0.0-alpha.37",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz",
+ "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==",
+ "dev": true,
+ "dependencies": {
+ "mdn-data": "2.0.4",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/css-tree/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/css-what": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz",
+ "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "dev": true,
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/cssnano": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz",
+ "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==",
+ "dev": true,
+ "dependencies": {
+ "cosmiconfig": "^5.0.0",
+ "cssnano-preset-default": "^4.0.8",
+ "is-resolvable": "^1.0.0",
+ "postcss": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/cssnano-preset-default": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz",
+ "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==",
+ "dev": true,
+ "dependencies": {
+ "css-declaration-sorter": "^4.0.1",
+ "cssnano-util-raw-cache": "^4.0.1",
+ "postcss": "^7.0.0",
+ "postcss-calc": "^7.0.1",
+ "postcss-colormin": "^4.0.3",
+ "postcss-convert-values": "^4.0.1",
+ "postcss-discard-comments": "^4.0.2",
+ "postcss-discard-duplicates": "^4.0.2",
+ "postcss-discard-empty": "^4.0.1",
+ "postcss-discard-overridden": "^4.0.1",
+ "postcss-merge-longhand": "^4.0.11",
+ "postcss-merge-rules": "^4.0.3",
+ "postcss-minify-font-values": "^4.0.2",
+ "postcss-minify-gradients": "^4.0.2",
+ "postcss-minify-params": "^4.0.2",
+ "postcss-minify-selectors": "^4.0.2",
+ "postcss-normalize-charset": "^4.0.1",
+ "postcss-normalize-display-values": "^4.0.2",
+ "postcss-normalize-positions": "^4.0.2",
+ "postcss-normalize-repeat-style": "^4.0.2",
+ "postcss-normalize-string": "^4.0.2",
+ "postcss-normalize-timing-functions": "^4.0.2",
+ "postcss-normalize-unicode": "^4.0.1",
+ "postcss-normalize-url": "^4.0.1",
+ "postcss-normalize-whitespace": "^4.0.2",
+ "postcss-ordered-values": "^4.1.2",
+ "postcss-reduce-initial": "^4.0.3",
+ "postcss-reduce-transforms": "^4.0.2",
+ "postcss-svgo": "^4.0.3",
+ "postcss-unique-selectors": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/cssnano-preset-default/node_modules/postcss": {
+ "version": "7.0.35",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+ "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.4.2",
+ "source-map": "^0.6.1",
+ "supports-color": "^6.1.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/cssnano-preset-default/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/cssnano-preset-default/node_modules/supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/cssnano-util-get-arguments": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz",
+ "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/cssnano-util-get-match": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz",
+ "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/cssnano-util-raw-cache": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz",
+ "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==",
+ "dev": true,
+ "dependencies": {
+ "postcss": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/cssnano-util-raw-cache/node_modules/postcss": {
+ "version": "7.0.35",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+ "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.4.2",
+ "source-map": "^0.6.1",
+ "supports-color": "^6.1.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/cssnano-util-raw-cache/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/cssnano-util-raw-cache/node_modules/supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/cssnano-util-same-parent": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz",
+ "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/cssnano/node_modules/postcss": {
+ "version": "7.0.35",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+ "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.4.2",
+ "source-map": "^0.6.1",
+ "supports-color": "^6.1.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/cssnano/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/cssnano/node_modules/supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/csso": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz",
+ "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==",
+ "dev": true,
+ "dependencies": {
+ "css-tree": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/csso/node_modules/css-tree": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
+ "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
+ "dev": true,
+ "dependencies": {
+ "mdn-data": "2.0.14",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/csso/node_modules/mdn-data": {
+ "version": "2.0.14",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
+ "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
+ "dev": true
+ },
+ "node_modules/csso/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/cssom": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
+ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
+ "dev": true
+ },
+ "node_modules/cssstyle": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz",
+ "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==",
+ "dev": true,
+ "dependencies": {
+ "cssom": "0.3.x"
+ }
+ },
+ "node_modules/currently-unhandled": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
+ "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
+ "dev": true,
+ "dependencies": {
+ "array-find-index": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/cyclist": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz",
+ "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=",
+ "dev": true
+ },
+ "node_modules/dashdash": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+ "dev": true,
+ "dependencies": {
+ "assert-plus": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/data-urls": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz",
+ "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==",
+ "dev": true,
+ "dependencies": {
+ "abab": "^2.0.0",
+ "whatwg-mimetype": "^2.2.0",
+ "whatwg-url": "^7.0.0"
+ }
+ },
+ "node_modules/data-urls/node_modules/tr46": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+ "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
+ "dev": true,
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/data-urls/node_modules/whatwg-url": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz",
+ "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==",
+ "dev": true,
+ "dependencies": {
+ "lodash.sortby": "^4.7.0",
+ "tr46": "^1.0.1",
+ "webidl-conversions": "^4.0.2"
+ }
+ },
+ "node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/decode-uri-component": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/deep-equal": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz",
+ "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==",
+ "dev": true,
+ "dependencies": {
+ "is-arguments": "^1.0.4",
+ "is-date-object": "^1.0.1",
+ "is-regex": "^1.0.4",
+ "object-is": "^1.0.1",
+ "object-keys": "^1.1.1",
+ "regexp.prototype.flags": "^1.2.0"
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "node_modules/deepmerge": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
+ "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/default-gateway": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz",
+ "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==",
+ "dev": true,
+ "dependencies": {
+ "execa": "^1.0.0",
+ "ip-regex": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/define-properties": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+ "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+ "dev": true,
+ "dependencies": {
+ "object-keys": "^1.0.12"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "dev": true,
+ "dependencies": {
+ "is-descriptor": "^1.0.2",
+ "isobject": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/define-property/node_modules/is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "dependencies": {
+ "kind-of": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/define-property/node_modules/is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "dependencies": {
+ "kind-of": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/define-property/node_modules/is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "dependencies": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/del": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz",
+ "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/glob": "^7.1.1",
+ "globby": "^6.1.0",
+ "is-path-cwd": "^2.0.0",
+ "is-path-in-cwd": "^2.0.0",
+ "p-map": "^2.0.0",
+ "pify": "^4.0.1",
+ "rimraf": "^2.6.3"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/del/node_modules/array-union": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+ "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+ "dev": true,
+ "dependencies": {
+ "array-uniq": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/del/node_modules/globby": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
+ "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
+ "dev": true,
+ "dependencies": {
+ "array-union": "^1.0.1",
+ "glob": "^7.0.3",
+ "object-assign": "^4.0.1",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/del/node_modules/globby/node_modules/pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/delegates": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+ "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
+ "dev": true
+ },
+ "node_modules/depd": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+ "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/des.js": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz",
+ "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0"
+ }
+ },
+ "node_modules/destroy": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
+ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
+ "dev": true
+ },
+ "node_modules/detect-file": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
+ "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/detect-newline": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz",
+ "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/detect-node": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz",
+ "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==",
+ "dev": true
+ },
+ "node_modules/diff-sequences": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.9.0.tgz",
+ "integrity": "sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/diffie-hellman": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
+ "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
+ "dev": true,
+ "dependencies": {
+ "bn.js": "^4.1.0",
+ "miller-rabin": "^4.0.0",
+ "randombytes": "^2.0.0"
+ }
+ },
+ "node_modules/diffie-hellman/node_modules/bn.js": {
+ "version": "4.11.9",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
+ "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+ "dev": true
+ },
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/dns-equal": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz",
+ "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=",
+ "dev": true
+ },
+ "node_modules/dns-packet": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz",
+ "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==",
+ "dev": true,
+ "dependencies": {
+ "ip": "^1.1.0",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/dns-txt": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz",
+ "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=",
+ "dev": true,
+ "dependencies": {
+ "buffer-indexof": "^1.0.0"
+ }
+ },
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/dom-converter": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz",
+ "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==",
+ "dev": true,
+ "dependencies": {
+ "utila": "~0.4"
+ }
+ },
+ "node_modules/dom-serializer": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
+ "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
+ "dev": true,
+ "dependencies": {
+ "domelementtype": "^2.0.1",
+ "entities": "^2.0.0"
+ }
+ },
+ "node_modules/dom-serializer/node_modules/domelementtype": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.2.tgz",
+ "integrity": "sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA==",
+ "dev": true
+ },
+ "node_modules/domain-browser": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
+ "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4",
+ "npm": ">=1.2"
+ }
+ },
+ "node_modules/domelementtype": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
+ "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
+ "dev": true
+ },
+ "node_modules/domexception": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz",
+ "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==",
+ "dev": true,
+ "dependencies": {
+ "webidl-conversions": "^4.0.2"
+ }
+ },
+ "node_modules/domhandler": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz",
+ "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
+ "dev": true,
+ "dependencies": {
+ "domelementtype": "1"
+ }
+ },
+ "node_modules/domutils": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
+ "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
+ "dev": true,
+ "dependencies": {
+ "dom-serializer": "0",
+ "domelementtype": "1"
+ }
+ },
+ "node_modules/dot-prop": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
+ "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
+ "dev": true,
+ "dependencies": {
+ "is-obj": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/duplexify": {
+ "version": "3.7.1",
+ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz",
+ "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==",
+ "dev": true,
+ "dependencies": {
+ "end-of-stream": "^1.0.0",
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.0.0",
+ "stream-shift": "^1.0.0"
+ }
+ },
+ "node_modules/ecc-jsbn": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+ "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
+ "dev": true,
+ "dependencies": {
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.1.0"
+ }
+ },
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
+ "dev": true
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.3.576",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.576.tgz",
+ "integrity": "sha512-uSEI0XZ//5ic+0NdOqlxp0liCD44ck20OAGyLMSymIWTEAtHKVJi6JM18acOnRgUgX7Q65QqnI+sNncNvIy8ew==",
+ "dev": true
+ },
+ "node_modules/elliptic": {
+ "version": "6.5.4",
+ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
+ "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
+ "dev": true,
+ "dependencies": {
+ "bn.js": "^4.11.9",
+ "brorand": "^1.1.0",
+ "hash.js": "^1.0.0",
+ "hmac-drbg": "^1.0.1",
+ "inherits": "^2.0.4",
+ "minimalistic-assert": "^1.0.1",
+ "minimalistic-crypto-utils": "^1.0.1"
+ }
+ },
+ "node_modules/elliptic/node_modules/bn.js": {
+ "version": "4.11.9",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
+ "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+ "dev": true
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "node_modules/emojis-list": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/end-of-stream": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+ "dev": true,
+ "dependencies": {
+ "once": "^1.4.0"
+ }
+ },
+ "node_modules/enhanced-resolve": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz",
+ "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "memory-fs": "^0.5.0",
+ "tapable": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/enhanced-resolve/node_modules/memory-fs": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz",
+ "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==",
+ "dev": true,
+ "dependencies": {
+ "errno": "^0.1.3",
+ "readable-stream": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=4.3.0 <5.0.0 || >=5.10"
+ }
+ },
+ "node_modules/enquirer": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
+ "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
+ "dev": true,
+ "dependencies": {
+ "ansi-colors": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/enquirer/node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
+ "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/entities": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz",
+ "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==",
+ "dev": true
+ },
+ "node_modules/errno": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
+ "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
+ "dev": true,
+ "dependencies": {
+ "prr": "~1.0.1"
+ },
+ "bin": {
+ "errno": "cli.js"
+ }
+ },
+ "node_modules/error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "dev": true,
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "node_modules/es-abstract": {
+ "version": "1.18.0",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz",
+ "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.2",
+ "is-callable": "^1.2.3",
+ "is-negative-zero": "^2.0.1",
+ "is-regex": "^1.1.2",
+ "is-string": "^1.0.5",
+ "object-inspect": "^1.9.0",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.2",
+ "string.prototype.trimend": "^1.0.4",
+ "string.prototype.trimstart": "^1.0.4",
+ "unbox-primitive": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dev": true,
+ "dependencies": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es6-promise": {
+ "version": "4.2.8",
+ "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz",
+ "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==",
+ "dev": true
+ },
+ "node_modules/es6-templates": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/es6-templates/-/es6-templates-0.2.3.tgz",
+ "integrity": "sha1-XLmsn7He1usSOTQrgdeSu7QHjuQ=",
+ "dev": true,
+ "dependencies": {
+ "recast": "~0.11.12",
+ "through": "~2.3.6"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.0.tgz",
+ "integrity": "sha512-mAk+hPSO8fLDkhV7V0dXazH5pDc6MrjBTPyD3VeKzxnVFjH1MIxbCdqGZB9O8+EwWakZs3ZCbDS4IpRt79V1ig==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
+ "dev": true
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/escodegen": {
+ "version": "1.14.3",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
+ "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
+ "dev": true,
+ "dependencies": {
+ "esprima": "^4.0.1",
+ "estraverse": "^4.2.0",
+ "esutils": "^2.0.2",
+ "optionator": "^0.8.1"
+ },
+ "bin": {
+ "escodegen": "bin/escodegen.js",
+ "esgenerate": "bin/esgenerate.js"
+ },
+ "engines": {
+ "node": ">=4.0"
+ },
+ "optionalDependencies": {
+ "source-map": "~0.6.1"
+ }
+ },
+ "node_modules/escodegen/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.16.0.tgz",
+ "integrity": "sha512-iVWPS785RuDA4dWuhhgXTNrGxHHK3a8HLSMBgbbU59ruJDubUraXN8N5rn7kb8tG6sjg74eE0RA3YWT51eusEw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.0.0",
+ "@eslint/eslintrc": "^0.2.2",
+ "ajv": "^6.10.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.0.1",
+ "doctrine": "^3.0.0",
+ "enquirer": "^2.3.5",
+ "eslint-scope": "^5.1.1",
+ "eslint-utils": "^2.1.0",
+ "eslint-visitor-keys": "^2.0.0",
+ "espree": "^7.3.1",
+ "esquery": "^1.2.0",
+ "esutils": "^2.0.2",
+ "file-entry-cache": "^6.0.0",
+ "functional-red-black-tree": "^1.0.1",
+ "glob-parent": "^5.0.0",
+ "globals": "^12.1.0",
+ "ignore": "^4.0.6",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "js-yaml": "^3.13.1",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash": "^4.17.19",
+ "minimatch": "^3.0.4",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.1",
+ "progress": "^2.0.0",
+ "regexpp": "^3.1.0",
+ "semver": "^7.2.1",
+ "strip-ansi": "^6.0.0",
+ "strip-json-comments": "^3.1.0",
+ "table": "^6.0.4",
+ "text-table": "^0.2.0",
+ "v8-compile-cache": "^2.0.3"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/eslint-loader": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-4.0.2.tgz",
+ "integrity": "sha512-EDpXor6lsjtTzZpLUn7KmXs02+nIjGcgees9BYjNkWra3jVq5vVa8IoCKgzT2M7dNNeoMBtaSG83Bd40N3poLw==",
+ "dev": true,
+ "dependencies": {
+ "find-cache-dir": "^3.3.1",
+ "fs-extra": "^8.1.0",
+ "loader-utils": "^2.0.0",
+ "object-hash": "^2.0.3",
+ "schema-utils": "^2.6.5"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ }
+ },
+ "node_modules/eslint-loader/node_modules/find-cache-dir": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz",
+ "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==",
+ "dev": true,
+ "dependencies": {
+ "commondir": "^1.0.1",
+ "make-dir": "^3.0.2",
+ "pkg-dir": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint-loader/node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint-loader/node_modules/loader-utils": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
+ "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
+ "dev": true,
+ "dependencies": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=8.9.0"
+ }
+ },
+ "node_modules/eslint-loader/node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint-loader/node_modules/make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "dev": true,
+ "dependencies": {
+ "semver": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint-loader/node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint-loader/node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint-loader/node_modules/pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "dev": true,
+ "dependencies": {
+ "find-up": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint-loader/node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/eslint-plugin-flowtype": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-5.2.0.tgz",
+ "integrity": "sha512-z7ULdTxuhlRJcEe1MVljePXricuPOrsWfScRXFhNzVD5dmTHWjIF57AxD0e7AbEoLSbjSsaA5S+hCg43WvpXJQ==",
+ "dev": true,
+ "dependencies": {
+ "lodash": "^4.17.15",
+ "string-natural-compare": "^3.0.1"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-jest": {
+ "version": "24.3.6",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.3.6.tgz",
+ "integrity": "sha512-WOVH4TIaBLIeCX576rLcOgjNXqP+jNlCiEmRgFTfQtJ52DpwnIQKAVGlGPAN7CZ33bW6eNfHD6s8ZbEUTQubJg==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/experimental-utils": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/eslint-plugin": ">= 4",
+ "eslint": ">=5"
+ },
+ "peerDependenciesMeta": {
+ "@typescript-eslint/eslint-plugin": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/eslint-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
+ "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz",
+ "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint/node_modules/ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint/node_modules/chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/eslint/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/eslint/node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/eslint/node_modules/debug": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/eslint/node_modules/glob-parent": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
+ "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/eslint/node_modules/globals": {
+ "version": "12.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
+ "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.8.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint/node_modules/ignore": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/eslint/node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/eslint/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/eslint/node_modules/optionator": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+ "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+ "dev": true,
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.3"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/eslint/node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint/node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/eslint/node_modules/semver": {
+ "version": "7.3.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
+ "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint/node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint/node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint/node_modules/strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint/node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/eslint/node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/eslint/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
+ "node_modules/espree": {
+ "version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
+ "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^7.4.0",
+ "acorn-jsx": "^5.3.1",
+ "eslint-visitor-keys": "^1.3.0"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/espree/node_modules/eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true,
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz",
+ "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esquery/node_modules/estraverse": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+ "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esrecurse/node_modules/estraverse": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+ "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/eventemitter3": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
+ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
+ "dev": true
+ },
+ "node_modules/events": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz",
+ "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.x"
+ }
+ },
+ "node_modules/eventsource": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz",
+ "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==",
+ "dev": true,
+ "dependencies": {
+ "original": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/evp_bytestokey": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
+ "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
+ "dev": true,
+ "dependencies": {
+ "md5.js": "^1.3.4",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "node_modules/exec-sh": {
+ "version": "0.3.4",
+ "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz",
+ "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==",
+ "dev": true
+ },
+ "node_modules/execa": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
+ "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^6.0.0",
+ "get-stream": "^4.0.0",
+ "is-stream": "^1.1.0",
+ "npm-run-path": "^2.0.0",
+ "p-finally": "^1.0.0",
+ "signal-exit": "^3.0.0",
+ "strip-eof": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/exit": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
+ "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "dependencies": {
+ "debug": "^2.3.3",
+ "define-property": "^0.2.5",
+ "extend-shallow": "^2.0.1",
+ "posix-character-classes": "^0.1.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/expand-brackets/node_modules/define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "dependencies": {
+ "is-descriptor": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/expand-brackets/node_modules/extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "dependencies": {
+ "is-extendable": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/expand-tilde": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
+ "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
+ "dev": true,
+ "dependencies": {
+ "homedir-polyfill": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/expect": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/expect/-/expect-24.9.0.tgz",
+ "integrity": "sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==",
+ "dev": true,
+ "dependencies": {
+ "@jest/types": "^24.9.0",
+ "ansi-styles": "^3.2.0",
+ "jest-get-type": "^24.9.0",
+ "jest-matcher-utils": "^24.9.0",
+ "jest-message-util": "^24.9.0",
+ "jest-regex-util": "^24.9.0"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/express": {
+ "version": "4.17.1",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
+ "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
+ "dev": true,
+ "dependencies": {
+ "accepts": "~1.3.7",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.19.0",
+ "content-disposition": "0.5.3",
+ "content-type": "~1.0.4",
+ "cookie": "0.4.0",
+ "cookie-signature": "1.0.6",
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "finalhandler": "~1.1.2",
+ "fresh": "0.5.2",
+ "merge-descriptors": "1.0.1",
+ "methods": "~1.1.2",
+ "on-finished": "~2.3.0",
+ "parseurl": "~1.3.3",
+ "path-to-regexp": "0.1.7",
+ "proxy-addr": "~2.0.5",
+ "qs": "6.7.0",
+ "range-parser": "~1.2.1",
+ "safe-buffer": "5.1.2",
+ "send": "0.17.1",
+ "serve-static": "1.14.1",
+ "setprototypeof": "1.1.1",
+ "statuses": "~1.5.0",
+ "type-is": "~1.6.18",
+ "utils-merge": "1.0.1",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ }
+ },
+ "node_modules/express/node_modules/array-flatten": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+ "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
+ "dev": true
+ },
+ "node_modules/express/node_modules/qs": {
+ "version": "6.7.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
+ "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "dev": true
+ },
+ "node_modules/extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "dependencies": {
+ "assign-symbols": "^1.0.0",
+ "is-extendable": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/extend-shallow/node_modules/is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "dependencies": {
+ "is-plain-object": "^2.0.4"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "dependencies": {
+ "array-unique": "^0.3.2",
+ "define-property": "^1.0.0",
+ "expand-brackets": "^2.1.4",
+ "extend-shallow": "^2.0.1",
+ "fragment-cache": "^0.2.1",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/extglob/node_modules/define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "dependencies": {
+ "is-descriptor": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/extglob/node_modules/extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "dependencies": {
+ "is-extendable": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/extglob/node_modules/is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "dependencies": {
+ "kind-of": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/extglob/node_modules/is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "dependencies": {
+ "kind-of": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/extglob/node_modules/is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "dependencies": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/extsprintf": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
+ "dev": true,
+ "engines": [
+ "node >=0.6.0"
+ ]
+ },
+ "node_modules/fake-indexeddb": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/fake-indexeddb/-/fake-indexeddb-2.1.1.tgz",
+ "integrity": "sha512-di5PzbH6/gleD4qcpxT1IDtNNMTKuEs+C2KeJDP1e4mwP2L0UY+vPcTkCdIGq8IcaUUph6IkCrUZJvtpFUdhfg==",
+ "dev": true,
+ "dependencies": {
+ "core-js": "^2.4.1",
+ "realistic-structured-clone": "^2.0.1",
+ "setimmediate": "^1.0.5"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "node_modules/fast-glob": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz",
+ "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.0",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.2",
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fast-glob/node_modules/braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fast-glob/node_modules/fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
+ "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fast-glob/node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/fast-glob/node_modules/micromatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+ "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+ "dev": true,
+ "dependencies": {
+ "braces": "^3.0.1",
+ "picomatch": "^2.0.5"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fast-glob/node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "node_modules/fastparse": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz",
+ "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==",
+ "dev": true
+ },
+ "node_modules/fastq": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.10.0.tgz",
+ "integrity": "sha512-NL2Qc5L3iQEsyYzweq7qfgy5OtXCmGzGvhElGEd/SoFWEMOEczNh5s5ocaF01HDetxz+p8ecjNPA6cZxxIHmzA==",
+ "dev": true,
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/faye-websocket": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz",
+ "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=",
+ "dev": true,
+ "dependencies": {
+ "websocket-driver": ">=0.5.1"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/fb-watchman": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz",
+ "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==",
+ "dev": true,
+ "dependencies": {
+ "bser": "2.1.1"
+ }
+ },
+ "node_modules/figgy-pudding": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz",
+ "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==",
+ "dev": true
+ },
+ "node_modules/file-entry-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz",
+ "integrity": "sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==",
+ "dev": true,
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/file-loader": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-2.0.0.tgz",
+ "integrity": "sha512-YCsBfd1ZGCyonOKLxPiKPdu+8ld9HAaMEvJewzz+b2eTF7uL5Zm/HdBF6FjCrpCMRq25Mi0U1gl4pwn2TlH7hQ==",
+ "dev": true,
+ "dependencies": {
+ "loader-utils": "^1.0.2",
+ "schema-utils": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 6.9.0 < 7.0.0 || >= 8.9.0"
+ }
+ },
+ "node_modules/file-loader/node_modules/schema-utils": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
+ "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.1.0",
+ "ajv-errors": "^1.0.0",
+ "ajv-keywords": "^3.1.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/file-uri-to-path": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
+ "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
+ "dev": true,
+ "optional": true
+ },
+ "node_modules/fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "dependencies": {
+ "extend-shallow": "^2.0.1",
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1",
+ "to-regex-range": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fill-range/node_modules/extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "dependencies": {
+ "is-extendable": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/finalhandler": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
+ "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
+ "dev": true,
+ "dependencies": {
+ "debug": "2.6.9",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "on-finished": "~2.3.0",
+ "parseurl": "~1.3.3",
+ "statuses": "~1.5.0",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/find-cache-dir": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
+ "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
+ "dev": true,
+ "dependencies": {
+ "commondir": "^1.0.1",
+ "make-dir": "^2.0.0",
+ "pkg-dir": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/findup-sync": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz",
+ "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==",
+ "dev": true,
+ "dependencies": {
+ "detect-file": "^1.0.0",
+ "is-glob": "^4.0.0",
+ "micromatch": "^3.0.4",
+ "resolve-dir": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+ "dev": true,
+ "dependencies": {
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/flat-cache/node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.0.tgz",
+ "integrity": "sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA==",
+ "dev": true
+ },
+ "node_modules/flow-bin": {
+ "version": "0.106.3",
+ "resolved": "https://registry.npmjs.org/flow-bin/-/flow-bin-0.106.3.tgz",
+ "integrity": "sha512-QDwmhsMmiASmwgr6r2WTz9RPsN0pb84PY0whz0JqFaBX7/Fx2wj2MOtjbR2yv+qWZnozP9U40Jd9LLt8rC3WSQ==",
+ "dev": true,
+ "bin": {
+ "flow": "cli.js"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/flow-webpack-plugin": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/flow-webpack-plugin/-/flow-webpack-plugin-1.2.0.tgz",
+ "integrity": "sha512-eBlH8qC2S1x9e/A2medm+MJesJAE2xdx+LwpKbImB6yUVi+lmyRUH67IWbBtY/S+PEoGR/kg+PWRCg9Bv17n8g==",
+ "dev": true
+ },
+ "node_modules/flush-write-stream": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz",
+ "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.3.6"
+ }
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.13.0",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz",
+ "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/forever-agent": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin": {
+ "version": "6.0.8",
+ "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.0.8.tgz",
+ "integrity": "sha512-2K6Ozamm6TSL5heFIwPhX5+VsOBiiKf9PzaPFS7kwzrILKX+jlN3DBQc5v/6YYZ2oKJyImg3bY0/uZc7cDbDYQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.8.3",
+ "@types/json-schema": "^7.0.5",
+ "chalk": "^4.1.0",
+ "chokidar": "^3.4.2",
+ "cosmiconfig": "^6.0.0",
+ "deepmerge": "^4.2.2",
+ "fs-extra": "^9.0.0",
+ "memfs": "^3.1.2",
+ "minimatch": "^3.0.4",
+ "schema-utils": "2.7.0",
+ "semver": "^7.3.2",
+ "tapable": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=10",
+ "yarn": ">=1.0.0"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/anymatch": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
+ "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
+ "dev": true,
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/binary-extensions": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz",
+ "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/chokidar": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz",
+ "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==",
+ "dev": true,
+ "dependencies": {
+ "anymatch": "~3.1.1",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.0",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.5.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.1.2"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz",
+ "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==",
+ "dev": true,
+ "dependencies": {
+ "@types/parse-json": "^4.0.0",
+ "import-fresh": "^3.1.0",
+ "parse-json": "^5.0.0",
+ "path-type": "^4.0.0",
+ "yaml": "^1.7.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz",
+ "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==",
+ "dev": true,
+ "dependencies": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/fsevents": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
+ "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/glob-parent": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
+ "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.1.6",
+ "universalify": "^2.0.0"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/jsonfile/node_modules/universalify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/parse-json": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz",
+ "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/readdirp": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz",
+ "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==",
+ "dev": true,
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz",
+ "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==",
+ "dev": true,
+ "dependencies": {
+ "@types/json-schema": "^7.0.4",
+ "ajv": "^6.12.2",
+ "ajv-keywords": "^3.4.1"
+ },
+ "engines": {
+ "node": ">= 8.9.0"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/semver": {
+ "version": "7.3.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
+ "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/universalify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz",
+ "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/fork-ts-checker-webpack-plugin/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
+ "node_modules/form-data": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+ "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+ "dev": true,
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.6",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 0.12"
+ }
+ },
+ "node_modules/forwarded": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
+ "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fragment-cache": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+ "dev": true,
+ "dependencies": {
+ "map-cache": "^0.2.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/from2": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
+ "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.0.0"
+ }
+ },
+ "node_modules/fs-extra": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
+ "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=6 <7 || >=8"
+ }
+ },
+ "node_modules/fs-monkey": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.1.tgz",
+ "integrity": "sha512-fcSa+wyTqZa46iWweI7/ZiUfegOZl0SG8+dltIwFXo7+zYU9J9kpS3NB6pZcSlJdhvIwp81Adx2XhZorncxiaA==",
+ "dev": true
+ },
+ "node_modules/fs-readdir-recursive": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz",
+ "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==",
+ "dev": true
+ },
+ "node_modules/fs-write-stream-atomic": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz",
+ "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "iferr": "^0.1.5",
+ "imurmurhash": "^0.1.4",
+ "readable-stream": "1 || 2"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "node_modules/fsevents": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
+ "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "dependencies": {
+ "bindings": "^1.5.0",
+ "nan": "^2.12.1"
+ },
+ "engines": {
+ "node": ">= 4.0"
+ }
+ },
+ "node_modules/fstream": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz",
+ "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "inherits": "~2.0.0",
+ "mkdirp": ">=0.5 0",
+ "rimraf": "2"
+ },
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true
+ },
+ "node_modules/functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+ "dev": true
+ },
+ "node_modules/gauge": {
+ "version": "2.7.4",
+ "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
+ "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
+ "dev": true,
+ "dependencies": {
+ "aproba": "^1.0.3",
+ "console-control-strings": "^1.0.0",
+ "has-unicode": "^2.0.0",
+ "object-assign": "^4.1.0",
+ "signal-exit": "^3.0.0",
+ "string-width": "^1.0.1",
+ "strip-ansi": "^3.0.1",
+ "wide-align": "^1.1.0"
+ }
+ },
+ "node_modules/gauge/node_modules/is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+ "dev": true,
+ "dependencies": {
+ "number-is-nan": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/gauge/node_modules/string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "dev": true,
+ "dependencies": {
+ "code-point-at": "^1.0.0",
+ "is-fullwidth-code-point": "^1.0.0",
+ "strip-ansi": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/gaze": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz",
+ "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==",
+ "dev": true,
+ "dependencies": {
+ "globule": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.1",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz",
+ "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
+ "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-stdin": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
+ "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/get-stream": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
+ "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
+ "dev": true,
+ "dependencies": {
+ "pump": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/getpass": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+ "dev": true,
+ "dependencies": {
+ "assert-plus": "^1.0.0"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^3.1.0",
+ "path-dirname": "^1.0.0"
+ }
+ },
+ "node_modules/glob-parent/node_modules/is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "dependencies": {
+ "is-extglob": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/global-modules": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
+ "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
+ "dev": true,
+ "dependencies": {
+ "global-prefix": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/global-modules/node_modules/global-prefix": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
+ "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
+ "dev": true,
+ "dependencies": {
+ "ini": "^1.3.5",
+ "kind-of": "^6.0.2",
+ "which": "^1.3.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/global-prefix": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
+ "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
+ "dev": true,
+ "dependencies": {
+ "expand-tilde": "^2.0.2",
+ "homedir-polyfill": "^1.0.1",
+ "ini": "^1.3.4",
+ "is-windows": "^1.0.1",
+ "which": "^1.2.14"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/globby": {
+ "version": "11.0.1",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz",
+ "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==",
+ "dev": true,
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.1.1",
+ "ignore": "^5.1.4",
+ "merge2": "^1.3.0",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/globby/node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/globule": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.2.tgz",
+ "integrity": "sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA==",
+ "dev": true,
+ "dependencies": {
+ "glob": "~7.1.1",
+ "lodash": "~4.17.10",
+ "minimatch": "~3.0.2"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
+ "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
+ "dev": true
+ },
+ "node_modules/growly": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz",
+ "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=",
+ "dev": true
+ },
+ "node_modules/handle-thing": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz",
+ "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==",
+ "dev": true
+ },
+ "node_modules/har-schema": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+ "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/har-validator": {
+ "version": "5.1.5",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
+ "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.12.3",
+ "har-schema": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/has-bigints": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz",
+ "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
+ "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-unicode": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+ "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
+ "dev": true
+ },
+ "node_modules/has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "dev": true,
+ "dependencies": {
+ "get-value": "^2.0.6",
+ "has-values": "^1.0.0",
+ "isobject": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/has-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+ "dev": true,
+ "dependencies": {
+ "is-number": "^3.0.0",
+ "kind-of": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/has-values/node_modules/kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "dev": true,
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/hash-base": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz",
+ "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.6.0",
+ "safe-buffer": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/hash-base/node_modules/readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/hash-base/node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true
+ },
+ "node_modules/hash.js": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
+ "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "minimalistic-assert": "^1.0.1"
+ }
+ },
+ "node_modules/he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "dev": true,
+ "bin": {
+ "he": "bin/he"
+ }
+ },
+ "node_modules/hex-color-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz",
+ "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==",
+ "dev": true
+ },
+ "node_modules/hmac-drbg": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+ "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
+ "dev": true,
+ "dependencies": {
+ "hash.js": "^1.0.3",
+ "minimalistic-assert": "^1.0.0",
+ "minimalistic-crypto-utils": "^1.0.1"
+ }
+ },
+ "node_modules/homedir-polyfill": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz",
+ "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==",
+ "dev": true,
+ "dependencies": {
+ "parse-passwd": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/hosted-git-info": {
+ "version": "2.8.9",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
+ "dev": true
+ },
+ "node_modules/hpack.js": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
+ "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "obuf": "^1.0.0",
+ "readable-stream": "^2.0.1",
+ "wbuf": "^1.1.0"
+ }
+ },
+ "node_modules/hsl-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz",
+ "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=",
+ "dev": true
+ },
+ "node_modules/hsla-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz",
+ "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=",
+ "dev": true
+ },
+ "node_modules/html-encoding-sniffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz",
+ "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==",
+ "dev": true,
+ "dependencies": {
+ "whatwg-encoding": "^1.0.1"
+ }
+ },
+ "node_modules/html-entities": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz",
+ "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==",
+ "dev": true
+ },
+ "node_modules/html-escaper": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
+ "dev": true
+ },
+ "node_modules/html-loader": {
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-0.5.5.tgz",
+ "integrity": "sha512-7hIW7YinOYUpo//kSYcPB6dCKoceKLmOwjEMmhIobHuWGDVl0Nwe4l68mdG/Ru0wcUxQjVMEoZpkalZ/SE7zog==",
+ "dev": true,
+ "dependencies": {
+ "es6-templates": "^0.2.3",
+ "fastparse": "^1.1.1",
+ "html-minifier": "^3.5.8",
+ "loader-utils": "^1.1.0",
+ "object-assign": "^4.1.1"
+ }
+ },
+ "node_modules/html-minifier": {
+ "version": "3.5.21",
+ "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz",
+ "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==",
+ "dev": true,
+ "dependencies": {
+ "camel-case": "3.0.x",
+ "clean-css": "4.2.x",
+ "commander": "2.17.x",
+ "he": "1.2.x",
+ "param-case": "2.1.x",
+ "relateurl": "0.2.x",
+ "uglify-js": "3.4.x"
+ },
+ "bin": {
+ "html-minifier": "cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/html-minifier/node_modules/commander": {
+ "version": "2.17.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz",
+ "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==",
+ "dev": true
+ },
+ "node_modules/html-webpack-plugin": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz",
+ "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=",
+ "dev": true,
+ "dependencies": {
+ "html-minifier": "^3.2.3",
+ "loader-utils": "^0.2.16",
+ "lodash": "^4.17.3",
+ "pretty-error": "^2.0.2",
+ "tapable": "^1.0.0",
+ "toposort": "^1.0.0",
+ "util.promisify": "1.0.0"
+ },
+ "engines": {
+ "node": ">=6.9"
+ }
+ },
+ "node_modules/html-webpack-plugin/node_modules/big.js": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz",
+ "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/html-webpack-plugin/node_modules/emojis-list": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
+ "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/html-webpack-plugin/node_modules/json5": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
+ "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
+ "dev": true,
+ "bin": {
+ "json5": "lib/cli.js"
+ }
+ },
+ "node_modules/html-webpack-plugin/node_modules/loader-utils": {
+ "version": "0.2.17",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz",
+ "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=",
+ "dev": true,
+ "dependencies": {
+ "big.js": "^3.1.3",
+ "emojis-list": "^2.0.0",
+ "json5": "^0.5.0",
+ "object-assign": "^4.0.1"
+ }
+ },
+ "node_modules/html-webpack-plugin/node_modules/util.promisify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz",
+ "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==",
+ "dev": true,
+ "dependencies": {
+ "define-properties": "^1.1.2",
+ "object.getownpropertydescriptors": "^2.0.3"
+ }
+ },
+ "node_modules/htmlparser2": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz",
+ "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==",
+ "dev": true,
+ "dependencies": {
+ "domelementtype": "^1.3.1",
+ "domhandler": "^2.3.0",
+ "domutils": "^1.5.1",
+ "entities": "^1.1.1",
+ "inherits": "^2.0.1",
+ "readable-stream": "^3.1.1"
+ }
+ },
+ "node_modules/htmlparser2/node_modules/entities": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
+ "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==",
+ "dev": true
+ },
+ "node_modules/htmlparser2/node_modules/readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/http-deceiver": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
+ "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=",
+ "dev": true
+ },
+ "node_modules/http-errors": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
+ "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
+ "dev": true,
+ "dependencies": {
+ "depd": "~1.1.2",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.1.1",
+ "statuses": ">= 1.5.0 < 2",
+ "toidentifier": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/http-errors/node_modules/inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "node_modules/http-proxy": {
+ "version": "1.18.1",
+ "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
+ "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
+ "dev": true,
+ "dependencies": {
+ "eventemitter3": "^4.0.0",
+ "follow-redirects": "^1.0.0",
+ "requires-port": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/http-proxy-middleware": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz",
+ "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==",
+ "dev": true,
+ "dependencies": {
+ "http-proxy": "^1.17.0",
+ "is-glob": "^4.0.0",
+ "lodash": "^4.17.11",
+ "micromatch": "^3.1.10"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/http-signature": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+ "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+ "dev": true,
+ "dependencies": {
+ "assert-plus": "^1.0.0",
+ "jsprim": "^1.2.2",
+ "sshpk": "^1.7.0"
+ },
+ "engines": {
+ "node": ">=0.8",
+ "npm": ">=1.3.7"
+ }
+ },
+ "node_modules/https-browserify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
+ "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=",
+ "dev": true
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dev": true,
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/icss-replace-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz",
+ "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=",
+ "dev": true
+ },
+ "node_modules/icss-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz",
+ "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=",
+ "dev": true,
+ "dependencies": {
+ "postcss": "^6.0.1"
+ }
+ },
+ "node_modules/ieee754": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
+ "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==",
+ "dev": true
+ },
+ "node_modules/iferr": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz",
+ "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=",
+ "dev": true
+ },
+ "node_modules/ignore": {
+ "version": "5.1.8",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
+ "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dev": true,
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/import-local": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz",
+ "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==",
+ "dev": true,
+ "dependencies": {
+ "pkg-dir": "^3.0.0",
+ "resolve-cwd": "^2.0.0"
+ },
+ "bin": {
+ "import-local-fixture": "fixtures/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/in-publish": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz",
+ "integrity": "sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==",
+ "dev": true,
+ "bin": {
+ "in-install": "in-install.js",
+ "in-publish": "in-publish.js",
+ "not-in-install": "not-in-install.js",
+ "not-in-publish": "not-in-publish.js"
+ }
+ },
+ "node_modules/indent-string": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
+ "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
+ "dev": true,
+ "dependencies": {
+ "repeating": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/indexes-of": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
+ "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=",
+ "dev": true
+ },
+ "node_modules/infer-owner": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz",
+ "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==",
+ "dev": true
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "node_modules/ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+ "dev": true
+ },
+ "node_modules/internal-ip": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz",
+ "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==",
+ "dev": true,
+ "dependencies": {
+ "default-gateway": "^4.2.0",
+ "ipaddr.js": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/interpret": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
+ "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "dev": true,
+ "dependencies": {
+ "loose-envify": "^1.0.0"
+ }
+ },
+ "node_modules/ip": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
+ "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
+ "dev": true
+ },
+ "node_modules/ip-regex": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz",
+ "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ipaddr.js": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/is-absolute-url": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz",
+ "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "dependencies": {
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-accessor-descriptor/node_modules/kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-arguments": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz",
+ "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+ "dev": true
+ },
+ "node_modules/is-bigint": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz",
+ "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-binary-path": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
+ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
+ "dev": true,
+ "dependencies": {
+ "binary-extensions": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-boolean-object": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz",
+ "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
+ "node_modules/is-callable": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz",
+ "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-ci": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
+ "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
+ "dev": true,
+ "dependencies": {
+ "ci-info": "^2.0.0"
+ },
+ "bin": {
+ "is-ci": "bin.js"
+ }
+ },
+ "node_modules/is-color-stop": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz",
+ "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=",
+ "dev": true,
+ "dependencies": {
+ "css-color-names": "^0.0.4",
+ "hex-color-regex": "^1.1.0",
+ "hsl-regex": "^1.0.0",
+ "hsla-regex": "^1.0.0",
+ "rgb-regex": "^1.0.1",
+ "rgba-regex": "^1.0.0"
+ }
+ },
+ "node_modules/is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "dependencies": {
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-data-descriptor/node_modules/kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-date-object": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
+ "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "dependencies": {
+ "is-accessor-descriptor": "^0.1.6",
+ "is-data-descriptor": "^0.1.4",
+ "kind-of": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-descriptor/node_modules/kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-directory": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
+ "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-finite": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz",
+ "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-generator-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
+ "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
+ "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+ "dev": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-negative-zero": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz",
+ "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "dependencies": {
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-number-object": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz",
+ "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-number/node_modules/kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-obj": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
+ "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-path-cwd": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
+ "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/is-path-in-cwd": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz",
+ "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==",
+ "dev": true,
+ "dependencies": {
+ "is-path-inside": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/is-path-inside": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz",
+ "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==",
+ "dev": true,
+ "dependencies": {
+ "path-is-inside": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "dependencies": {
+ "isobject": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-regex": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz",
+ "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-symbols": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-resolvable": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
+ "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==",
+ "dev": true
+ },
+ "node_modules/is-stream": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-string": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz",
+ "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-symbol": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
+ "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
+ "dev": true,
+ "dependencies": {
+ "has-symbols": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+ "dev": true
+ },
+ "node_modules/is-utf8": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
+ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
+ "dev": true
+ },
+ "node_modules/is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-wsl": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
+ "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true
+ },
+ "node_modules/isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "node_modules/istanbul-lib-coverage": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz",
+ "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/istanbul-lib-instrument": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz",
+ "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/generator": "^7.4.0",
+ "@babel/parser": "^7.4.3",
+ "@babel/template": "^7.4.0",
+ "@babel/traverse": "^7.4.3",
+ "@babel/types": "^7.4.0",
+ "istanbul-lib-coverage": "^2.0.5",
+ "semver": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/istanbul-lib-instrument/node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/istanbul-lib-report": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz",
+ "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==",
+ "dev": true,
+ "dependencies": {
+ "istanbul-lib-coverage": "^2.0.5",
+ "make-dir": "^2.1.0",
+ "supports-color": "^6.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/istanbul-lib-report/node_modules/supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/istanbul-lib-source-maps": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz",
+ "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.1.1",
+ "istanbul-lib-coverage": "^2.0.5",
+ "make-dir": "^2.1.0",
+ "rimraf": "^2.6.3",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/istanbul-lib-source-maps/node_modules/debug": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
+ "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/istanbul-lib-source-maps/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/istanbul-lib-source-maps/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/istanbul-reports": {
+ "version": "2.2.7",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz",
+ "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==",
+ "dev": true,
+ "dependencies": {
+ "html-escaper": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/jest": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/jest/-/jest-24.9.0.tgz",
+ "integrity": "sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==",
+ "dev": true,
+ "dependencies": {
+ "import-local": "^2.0.0",
+ "jest-cli": "^24.9.0"
+ },
+ "bin": {
+ "jest": "bin/jest.js"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/jest-changed-files": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz",
+ "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==",
+ "dev": true,
+ "dependencies": {
+ "@jest/types": "^24.9.0",
+ "execa": "^1.0.0",
+ "throat": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/jest-config": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.9.0.tgz",
+ "integrity": "sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.1.0",
+ "@jest/test-sequencer": "^24.9.0",
+ "@jest/types": "^24.9.0",
+ "babel-jest": "^24.9.0",
+ "chalk": "^2.0.1",
+ "glob": "^7.1.1",
+ "jest-environment-jsdom": "^24.9.0",
+ "jest-environment-node": "^24.9.0",
+ "jest-get-type": "^24.9.0",
+ "jest-jasmine2": "^24.9.0",
+ "jest-regex-util": "^24.3.0",
+ "jest-resolve": "^24.9.0",
+ "jest-util": "^24.9.0",
+ "jest-validate": "^24.9.0",
+ "micromatch": "^3.1.10",
+ "pretty-format": "^24.9.0",
+ "realpath-native": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/jest-diff": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.9.0.tgz",
+ "integrity": "sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.0.1",
+ "diff-sequences": "^24.9.0",
+ "jest-get-type": "^24.9.0",
+ "pretty-format": "^24.9.0"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/jest-docblock": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.9.0.tgz",
+ "integrity": "sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==",
+ "dev": true,
+ "dependencies": {
+ "detect-newline": "^2.1.0"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/jest-each": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.9.0.tgz",
+ "integrity": "sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==",
+ "dev": true,
+ "dependencies": {
+ "@jest/types": "^24.9.0",
+ "chalk": "^2.0.1",
+ "jest-get-type": "^24.9.0",
+ "jest-util": "^24.9.0",
+ "pretty-format": "^24.9.0"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/jest-environment-jsdom": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz",
+ "integrity": "sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==",
+ "dev": true,
+ "dependencies": {
+ "@jest/environment": "^24.9.0",
+ "@jest/fake-timers": "^24.9.0",
+ "@jest/types": "^24.9.0",
+ "jest-mock": "^24.9.0",
+ "jest-util": "^24.9.0",
+ "jsdom": "^11.5.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/jest-environment-node": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz",
+ "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==",
+ "dev": true,
+ "dependencies": {
+ "@jest/environment": "^24.9.0",
+ "@jest/fake-timers": "^24.9.0",
+ "@jest/types": "^24.9.0",
+ "jest-mock": "^24.9.0",
+ "jest-util": "^24.9.0"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/jest-get-type": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz",
+ "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/jest-haste-map": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz",
+ "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==",
+ "dev": true,
+ "dependencies": {
+ "@jest/types": "^24.9.0",
+ "anymatch": "^2.0.0",
+ "fb-watchman": "^2.0.0",
+ "graceful-fs": "^4.1.15",
+ "invariant": "^2.2.4",
+ "jest-serializer": "^24.9.0",
+ "jest-util": "^24.9.0",
+ "jest-worker": "^24.9.0",
+ "micromatch": "^3.1.10",
+ "sane": "^4.0.3",
+ "walker": "^1.0.7"
+ },
+ "engines": {
+ "node": ">= 6"
+ },
+ "optionalDependencies": {
+ "fsevents": "^1.2.7"
+ }
+ },
+ "node_modules/jest-jasmine2": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz",
+ "integrity": "sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/traverse": "^7.1.0",
+ "@jest/environment": "^24.9.0",
+ "@jest/test-result": "^24.9.0",
+ "@jest/types": "^24.9.0",
+ "chalk": "^2.0.1",
+ "co": "^4.6.0",
+ "expect": "^24.9.0",
+ "is-generator-fn": "^2.0.0",
+ "jest-each": "^24.9.0",
+ "jest-matcher-utils": "^24.9.0",
+ "jest-message-util": "^24.9.0",
+ "jest-runtime": "^24.9.0",
+ "jest-snapshot": "^24.9.0",
+ "jest-util": "^24.9.0",
+ "pretty-format": "^24.9.0",
+ "throat": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/jest-leak-detector": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz",
+ "integrity": "sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==",
+ "dev": true,
+ "dependencies": {
+ "jest-get-type": "^24.9.0",
+ "pretty-format": "^24.9.0"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/jest-localstorage-mock": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/jest-localstorage-mock/-/jest-localstorage-mock-2.4.3.tgz",
+ "integrity": "sha512-UgifkHKoWVRUoSqO4Z4Z+Hl1NbiYBVDlmkmulFFeRRneGECWAlAdGWJdyz+2NisjOZnnQoxQl0s5dQ7ch62Jxw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.16.0"
+ }
+ },
+ "node_modules/jest-matcher-utils": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz",
+ "integrity": "sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.0.1",
+ "jest-diff": "^24.9.0",
+ "jest-get-type": "^24.9.0",
+ "pretty-format": "^24.9.0"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/jest-message-util": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz",
+ "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.0.0",
+ "@jest/test-result": "^24.9.0",
+ "@jest/types": "^24.9.0",
+ "@types/stack-utils": "^1.0.1",
+ "chalk": "^2.0.1",
+ "micromatch": "^3.1.10",
+ "slash": "^2.0.0",
+ "stack-utils": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/jest-mock": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz",
+ "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==",
+ "dev": true,
+ "dependencies": {
+ "@jest/types": "^24.9.0"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/jest-pnp-resolver": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz",
+ "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/jest-regex-util": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz",
+ "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/jest-resolve": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.9.0.tgz",
+ "integrity": "sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==",
+ "dev": true,
+ "dependencies": {
+ "@jest/types": "^24.9.0",
+ "browser-resolve": "^1.11.3",
+ "chalk": "^2.0.1",
+ "jest-pnp-resolver": "^1.2.1",
+ "realpath-native": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/jest-resolve-dependencies": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz",
+ "integrity": "sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==",
+ "dev": true,
+ "dependencies": {
+ "@jest/types": "^24.9.0",
+ "jest-regex-util": "^24.3.0",
+ "jest-snapshot": "^24.9.0"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/jest-runner": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.9.0.tgz",
+ "integrity": "sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==",
+ "dev": true,
+ "dependencies": {
+ "@jest/console": "^24.7.1",
+ "@jest/environment": "^24.9.0",
+ "@jest/test-result": "^24.9.0",
+ "@jest/types": "^24.9.0",
+ "chalk": "^2.4.2",
+ "exit": "^0.1.2",
+ "graceful-fs": "^4.1.15",
+ "jest-config": "^24.9.0",
+ "jest-docblock": "^24.3.0",
+ "jest-haste-map": "^24.9.0",
+ "jest-jasmine2": "^24.9.0",
+ "jest-leak-detector": "^24.9.0",
+ "jest-message-util": "^24.9.0",
+ "jest-resolve": "^24.9.0",
+ "jest-runtime": "^24.9.0",
+ "jest-util": "^24.9.0",
+ "jest-worker": "^24.6.0",
+ "source-map-support": "^0.5.6",
+ "throat": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/jest-runtime": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.9.0.tgz",
+ "integrity": "sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==",
+ "dev": true,
+ "dependencies": {
+ "@jest/console": "^24.7.1",
+ "@jest/environment": "^24.9.0",
+ "@jest/source-map": "^24.3.0",
+ "@jest/transform": "^24.9.0",
+ "@jest/types": "^24.9.0",
+ "@types/yargs": "^13.0.0",
+ "chalk": "^2.0.1",
+ "exit": "^0.1.2",
+ "glob": "^7.1.3",
+ "graceful-fs": "^4.1.15",
+ "jest-config": "^24.9.0",
+ "jest-haste-map": "^24.9.0",
+ "jest-message-util": "^24.9.0",
+ "jest-mock": "^24.9.0",
+ "jest-regex-util": "^24.3.0",
+ "jest-resolve": "^24.9.0",
+ "jest-snapshot": "^24.9.0",
+ "jest-util": "^24.9.0",
+ "jest-validate": "^24.9.0",
+ "realpath-native": "^1.1.0",
+ "slash": "^2.0.0",
+ "strip-bom": "^3.0.0",
+ "yargs": "^13.3.0"
+ },
+ "bin": {
+ "jest-runtime": "bin/jest-runtime.js"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/jest-serializer": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz",
+ "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/jest-snapshot": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.9.0.tgz",
+ "integrity": "sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.0.0",
+ "@jest/types": "^24.9.0",
+ "chalk": "^2.0.1",
+ "expect": "^24.9.0",
+ "jest-diff": "^24.9.0",
+ "jest-get-type": "^24.9.0",
+ "jest-matcher-utils": "^24.9.0",
+ "jest-message-util": "^24.9.0",
+ "jest-resolve": "^24.9.0",
+ "mkdirp": "^0.5.1",
+ "natural-compare": "^1.4.0",
+ "pretty-format": "^24.9.0",
+ "semver": "^6.2.0"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/jest-snapshot/node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/jest-util": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz",
+ "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==",
+ "dev": true,
+ "dependencies": {
+ "@jest/console": "^24.9.0",
+ "@jest/fake-timers": "^24.9.0",
+ "@jest/source-map": "^24.9.0",
+ "@jest/test-result": "^24.9.0",
+ "@jest/types": "^24.9.0",
+ "callsites": "^3.0.0",
+ "chalk": "^2.0.1",
+ "graceful-fs": "^4.1.15",
+ "is-ci": "^2.0.0",
+ "mkdirp": "^0.5.1",
+ "slash": "^2.0.0",
+ "source-map": "^0.6.0"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/jest-util/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/jest-validate": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz",
+ "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==",
+ "dev": true,
+ "dependencies": {
+ "@jest/types": "^24.9.0",
+ "camelcase": "^5.3.1",
+ "chalk": "^2.0.1",
+ "jest-get-type": "^24.9.0",
+ "leven": "^3.1.0",
+ "pretty-format": "^24.9.0"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/jest-watcher": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.9.0.tgz",
+ "integrity": "sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==",
+ "dev": true,
+ "dependencies": {
+ "@jest/test-result": "^24.9.0",
+ "@jest/types": "^24.9.0",
+ "@types/yargs": "^13.0.0",
+ "ansi-escapes": "^3.0.0",
+ "chalk": "^2.0.1",
+ "jest-util": "^24.9.0",
+ "string-length": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/jest-watcher/node_modules/ansi-escapes": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
+ "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/jest-worker": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz",
+ "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==",
+ "dev": true,
+ "dependencies": {
+ "merge-stream": "^2.0.0",
+ "supports-color": "^6.1.0"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/jest-worker/node_modules/supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/jest/node_modules/jest-cli": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.9.0.tgz",
+ "integrity": "sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==",
+ "dev": true,
+ "dependencies": {
+ "@jest/core": "^24.9.0",
+ "@jest/test-result": "^24.9.0",
+ "@jest/types": "^24.9.0",
+ "chalk": "^2.0.1",
+ "exit": "^0.1.2",
+ "import-local": "^2.0.0",
+ "is-ci": "^2.0.0",
+ "jest-config": "^24.9.0",
+ "jest-util": "^24.9.0",
+ "jest-validate": "^24.9.0",
+ "prompts": "^2.0.1",
+ "realpath-native": "^1.1.0",
+ "yargs": "^13.3.0"
+ },
+ "bin": {
+ "jest": "bin/jest.js"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/js-base64": {
+ "version": "2.6.4",
+ "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz",
+ "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==",
+ "dev": true
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "node_modules/js-yaml": {
+ "version": "3.14.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
+ "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
+ "dev": true
+ },
+ "node_modules/jsdom": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz",
+ "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==",
+ "dev": true,
+ "dependencies": {
+ "abab": "^2.0.0",
+ "acorn": "^5.5.3",
+ "acorn-globals": "^4.1.0",
+ "array-equal": "^1.0.0",
+ "cssom": ">= 0.3.2 < 0.4.0",
+ "cssstyle": "^1.0.0",
+ "data-urls": "^1.0.0",
+ "domexception": "^1.0.1",
+ "escodegen": "^1.9.1",
+ "html-encoding-sniffer": "^1.0.2",
+ "left-pad": "^1.3.0",
+ "nwsapi": "^2.0.7",
+ "parse5": "4.0.0",
+ "pn": "^1.1.0",
+ "request": "^2.87.0",
+ "request-promise-native": "^1.0.5",
+ "sax": "^1.2.4",
+ "symbol-tree": "^3.2.2",
+ "tough-cookie": "^2.3.4",
+ "w3c-hr-time": "^1.0.1",
+ "webidl-conversions": "^4.0.2",
+ "whatwg-encoding": "^1.0.3",
+ "whatwg-mimetype": "^2.1.0",
+ "whatwg-url": "^6.4.1",
+ "ws": "^5.2.0",
+ "xml-name-validator": "^3.0.0"
+ }
+ },
+ "node_modules/jsdom/node_modules/acorn": {
+ "version": "5.7.4",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz",
+ "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/jsdom/node_modules/tr46": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+ "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
+ "dev": true,
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/jsdom/node_modules/whatwg-url": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz",
+ "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==",
+ "dev": true,
+ "dependencies": {
+ "lodash.sortby": "^4.7.0",
+ "tr46": "^1.0.1",
+ "webidl-conversions": "^4.0.2"
+ }
+ },
+ "node_modules/jsesc": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "dev": true,
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/json-parse-better-errors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
+ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
+ "dev": true
+ },
+ "node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "dev": true
+ },
+ "node_modules/json-schema": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
+ "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
+ "dev": true
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+ "dev": true
+ },
+ "node_modules/json-stringify-safe": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
+ "dev": true
+ },
+ "node_modules/json3": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz",
+ "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==",
+ "dev": true
+ },
+ "node_modules/json5": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz",
+ "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==",
+ "dev": true,
+ "dependencies": {
+ "minimist": "^1.2.5"
+ },
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/jsprim": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
+ "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+ "dev": true,
+ "engines": [
+ "node >=0.6.0"
+ ],
+ "dependencies": {
+ "assert-plus": "1.0.0",
+ "extsprintf": "1.3.0",
+ "json-schema": "0.2.3",
+ "verror": "1.10.0"
+ }
+ },
+ "node_modules/killable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz",
+ "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==",
+ "dev": true
+ },
+ "node_modules/kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/kleur": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
+ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/last-call-webpack-plugin": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz",
+ "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==",
+ "dev": true,
+ "dependencies": {
+ "lodash": "^4.17.5",
+ "webpack-sources": "^1.1.0"
+ }
+ },
+ "node_modules/left-pad": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz",
+ "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==",
+ "dev": true
+ },
+ "node_modules/leven": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
+ "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/levenary": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz",
+ "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==",
+ "dev": true,
+ "dependencies": {
+ "leven": "^3.1.0"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
+ "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=",
+ "dev": true
+ },
+ "node_modules/load-json-file": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
+ "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "parse-json": "^4.0.0",
+ "pify": "^3.0.0",
+ "strip-bom": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/load-json-file/node_modules/pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/loader-runner": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz",
+ "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.3.0 <5.0.0 || >=5.10"
+ }
+ },
+ "node_modules/loader-utils": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
+ "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+ "dev": true,
+ "dependencies": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/loader-utils/node_modules/json5": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+ "dev": true,
+ "dependencies": {
+ "minimist": "^1.2.0"
+ },
+ "bin": {
+ "json5": "lib/cli.js"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
+ },
+ "node_modules/lodash.memoize": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
+ "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=",
+ "dev": true
+ },
+ "node_modules/lodash.sortby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+ "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
+ "dev": true
+ },
+ "node_modules/lodash.uniq": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
+ "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=",
+ "dev": true
+ },
+ "node_modules/loglevel": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.0.tgz",
+ "integrity": "sha512-i2sY04nal5jDcagM3FMfG++T69GEEM8CYuOfeOIvmXzOIcwE9a/CJPR0MFM97pYMj/u10lzz7/zd7+qwhrBTqQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6.0"
+ }
+ },
+ "node_modules/loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "dev": true,
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
+ "node_modules/loud-rejection": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
+ "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
+ "dev": true,
+ "dependencies": {
+ "currently-unhandled": "^0.4.1",
+ "signal-exit": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/lower-case": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz",
+ "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=",
+ "dev": true
+ },
+ "node_modules/lru-cache": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
+ "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
+ "dev": true,
+ "dependencies": {
+ "pseudomap": "^1.0.2",
+ "yallist": "^2.1.2"
+ }
+ },
+ "node_modules/make-dir": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
+ "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+ "dev": true,
+ "dependencies": {
+ "pify": "^4.0.1",
+ "semver": "^5.6.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/makeerror": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz",
+ "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=",
+ "dev": true,
+ "dependencies": {
+ "tmpl": "1.0.x"
+ }
+ },
+ "node_modules/map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/map-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+ "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/map-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+ "dev": true,
+ "dependencies": {
+ "object-visit": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/md5.js": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
+ "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
+ "dev": true,
+ "dependencies": {
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "node_modules/mdn-data": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
+ "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==",
+ "dev": true
+ },
+ "node_modules/media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/memfs": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.2.0.tgz",
+ "integrity": "sha512-f/xxz2TpdKv6uDn6GtHee8ivFyxwxmPuXatBb1FBwxYNuVpbM3k/Y1Z+vC0mH/dIXXrukYfe3qe5J32Dfjg93A==",
+ "dev": true,
+ "dependencies": {
+ "fs-monkey": "1.0.1"
+ },
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/memory-fs": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
+ "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
+ "dev": true,
+ "dependencies": {
+ "errno": "^0.1.3",
+ "readable-stream": "^2.0.1"
+ }
+ },
+ "node_modules/memorystream": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz",
+ "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.10.0"
+ }
+ },
+ "node_modules/meow": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
+ "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
+ "dev": true,
+ "dependencies": {
+ "camelcase-keys": "^2.0.0",
+ "decamelize": "^1.1.2",
+ "loud-rejection": "^1.0.0",
+ "map-obj": "^1.0.1",
+ "minimist": "^1.1.3",
+ "normalize-package-data": "^2.3.4",
+ "object-assign": "^4.0.1",
+ "read-pkg-up": "^1.0.1",
+ "redent": "^1.0.0",
+ "trim-newlines": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/meow/node_modules/find-up": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+ "dev": true,
+ "dependencies": {
+ "path-exists": "^2.0.0",
+ "pinkie-promise": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/meow/node_modules/load-json-file": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "parse-json": "^2.2.0",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0",
+ "strip-bom": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/meow/node_modules/parse-json": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+ "dev": true,
+ "dependencies": {
+ "error-ex": "^1.2.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/meow/node_modules/path-exists": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+ "dev": true,
+ "dependencies": {
+ "pinkie-promise": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/meow/node_modules/path-type": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
+ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/meow/node_modules/pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/meow/node_modules/read-pkg": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
+ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+ "dev": true,
+ "dependencies": {
+ "load-json-file": "^1.0.0",
+ "normalize-package-data": "^2.3.2",
+ "path-type": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/meow/node_modules/read-pkg-up": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
+ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
+ "dev": true,
+ "dependencies": {
+ "find-up": "^1.0.0",
+ "read-pkg": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/meow/node_modules/strip-bom": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+ "dev": true,
+ "dependencies": {
+ "is-utf8": "^0.2.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/merge-descriptors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+ "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
+ "dev": true
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "dependencies": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "braces": "^2.3.1",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "extglob": "^2.0.4",
+ "fragment-cache": "^0.2.1",
+ "kind-of": "^6.0.2",
+ "nanomatch": "^1.2.9",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/miller-rabin": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
+ "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
+ "dev": true,
+ "dependencies": {
+ "bn.js": "^4.0.0",
+ "brorand": "^1.0.1"
+ },
+ "bin": {
+ "miller-rabin": "bin/miller-rabin"
+ }
+ },
+ "node_modules/miller-rabin/node_modules/bn.js": {
+ "version": "4.11.9",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
+ "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+ "dev": true
+ },
+ "node_modules/mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "dev": true,
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.44.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
+ "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.27",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
+ "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
+ "dev": true,
+ "dependencies": {
+ "mime-db": "1.44.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mini-css-extract-plugin": {
+ "version": "0.4.5",
+ "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.5.tgz",
+ "integrity": "sha512-dqBanNfktnp2hwL2YguV9Jh91PFX7gu7nRLs4TGsbAfAG6WOtlynFRYzwDwmmeSb5uIwHo9nx1ta0f7vAZVp2w==",
+ "dev": true,
+ "dependencies": {
+ "loader-utils": "^1.1.0",
+ "schema-utils": "^1.0.0",
+ "webpack-sources": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 6.9.0 <7.0.0 || >= 8.9.0"
+ }
+ },
+ "node_modules/mini-css-extract-plugin/node_modules/schema-utils": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
+ "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.1.0",
+ "ajv-errors": "^1.0.0",
+ "ajv-keywords": "^3.1.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/minimalistic-assert": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
+ "dev": true
+ },
+ "node_modules/minimalistic-crypto-utils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
+ "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=",
+ "dev": true
+ },
+ "node_modules/minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+ "dev": true
+ },
+ "node_modules/mississippi": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz",
+ "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==",
+ "dev": true,
+ "dependencies": {
+ "concat-stream": "^1.5.0",
+ "duplexify": "^3.4.2",
+ "end-of-stream": "^1.1.0",
+ "flush-write-stream": "^1.0.0",
+ "from2": "^2.1.0",
+ "parallel-transform": "^1.1.0",
+ "pump": "^3.0.0",
+ "pumpify": "^1.3.3",
+ "stream-each": "^1.1.0",
+ "through2": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/mixin-deep": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
+ "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
+ "dev": true,
+ "dependencies": {
+ "for-in": "^1.0.2",
+ "is-extendable": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/mixin-deep/node_modules/is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "dependencies": {
+ "is-plain-object": "^2.0.4"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/mkdirp": {
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+ "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+ "dev": true,
+ "dependencies": {
+ "minimist": "^1.2.5"
+ },
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ }
+ },
+ "node_modules/move-concurrently": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
+ "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=",
+ "dev": true,
+ "dependencies": {
+ "aproba": "^1.1.1",
+ "copy-concurrently": "^1.0.0",
+ "fs-write-stream-atomic": "^1.0.8",
+ "mkdirp": "^0.5.1",
+ "rimraf": "^2.5.4",
+ "run-queue": "^1.0.3"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "node_modules/multicast-dns": {
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz",
+ "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==",
+ "dev": true,
+ "dependencies": {
+ "dns-packet": "^1.3.1",
+ "thunky": "^1.0.2"
+ },
+ "bin": {
+ "multicast-dns": "cli.js"
+ }
+ },
+ "node_modules/multicast-dns-service-types": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz",
+ "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=",
+ "dev": true
+ },
+ "node_modules/nan": {
+ "version": "2.14.1",
+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz",
+ "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==",
+ "dev": true
+ },
+ "node_modules/nanomatch": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
+ "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
+ "dev": true,
+ "dependencies": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "fragment-cache": "^0.2.1",
+ "is-windows": "^1.0.2",
+ "kind-of": "^6.0.2",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+ "dev": true
+ },
+ "node_modules/negotiator": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
+ "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/neo-async": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+ "dev": true
+ },
+ "node_modules/nice-try": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
+ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
+ "dev": true
+ },
+ "node_modules/no-case": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz",
+ "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==",
+ "dev": true,
+ "dependencies": {
+ "lower-case": "^1.1.1"
+ }
+ },
+ "node_modules/node-forge": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz",
+ "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/node-gyp": {
+ "version": "3.8.0",
+ "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz",
+ "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==",
+ "dev": true,
+ "dependencies": {
+ "fstream": "^1.0.0",
+ "glob": "^7.0.3",
+ "graceful-fs": "^4.1.2",
+ "mkdirp": "^0.5.0",
+ "nopt": "2 || 3",
+ "npmlog": "0 || 1 || 2 || 3 || 4",
+ "osenv": "0",
+ "request": "^2.87.0",
+ "rimraf": "2",
+ "semver": "~5.3.0",
+ "tar": "^2.0.0",
+ "which": "1"
+ },
+ "bin": {
+ "node-gyp": "bin/node-gyp.js"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/node-gyp/node_modules/semver": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
+ "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/node-int64": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
+ "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=",
+ "dev": true
+ },
+ "node_modules/node-libs-browser": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz",
+ "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==",
+ "dev": true,
+ "dependencies": {
+ "assert": "^1.1.1",
+ "browserify-zlib": "^0.2.0",
+ "buffer": "^4.3.0",
+ "console-browserify": "^1.1.0",
+ "constants-browserify": "^1.0.0",
+ "crypto-browserify": "^3.11.0",
+ "domain-browser": "^1.1.1",
+ "events": "^3.0.0",
+ "https-browserify": "^1.0.0",
+ "os-browserify": "^0.3.0",
+ "path-browserify": "0.0.1",
+ "process": "^0.11.10",
+ "punycode": "^1.2.4",
+ "querystring-es3": "^0.2.0",
+ "readable-stream": "^2.3.3",
+ "stream-browserify": "^2.0.1",
+ "stream-http": "^2.7.2",
+ "string_decoder": "^1.0.0",
+ "timers-browserify": "^2.0.4",
+ "tty-browserify": "0.0.0",
+ "url": "^0.11.0",
+ "util": "^0.11.0",
+ "vm-browserify": "^1.0.1"
+ }
+ },
+ "node_modules/node-libs-browser/node_modules/punycode": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+ "dev": true
+ },
+ "node_modules/node-modules-regexp": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz",
+ "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/node-notifier": {
+ "version": "5.4.3",
+ "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.3.tgz",
+ "integrity": "sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==",
+ "dev": true,
+ "dependencies": {
+ "growly": "^1.3.0",
+ "is-wsl": "^1.1.0",
+ "semver": "^5.5.0",
+ "shellwords": "^0.1.1",
+ "which": "^1.3.0"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "1.1.61",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.61.tgz",
+ "integrity": "sha512-DD5vebQLg8jLCOzwupn954fbIiZht05DAZs0k2u8NStSe6h9XdsuIQL8hSRKYiU8WUQRznmSDrKGbv3ObOmC7g==",
+ "dev": true
+ },
+ "node_modules/node-sass": {
+ "version": "4.14.1",
+ "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.14.1.tgz",
+ "integrity": "sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g==",
+ "dev": true,
+ "hasInstallScript": true,
+ "dependencies": {
+ "async-foreach": "^0.1.3",
+ "chalk": "^1.1.1",
+ "cross-spawn": "^3.0.0",
+ "gaze": "^1.0.0",
+ "get-stdin": "^4.0.1",
+ "glob": "^7.0.3",
+ "in-publish": "^2.0.0",
+ "lodash": "^4.17.15",
+ "meow": "^3.7.0",
+ "mkdirp": "^0.5.1",
+ "nan": "^2.13.2",
+ "node-gyp": "^3.8.0",
+ "npmlog": "^4.0.0",
+ "request": "^2.88.0",
+ "sass-graph": "2.2.5",
+ "stdout-stream": "^1.4.0",
+ "true-case-path": "^1.0.2"
+ },
+ "bin": {
+ "node-sass": "bin/node-sass"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/node-sass/node_modules/ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/node-sass/node_modules/chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^2.2.1",
+ "escape-string-regexp": "^1.0.2",
+ "has-ansi": "^2.0.0",
+ "strip-ansi": "^3.0.0",
+ "supports-color": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/node-sass/node_modules/cross-spawn": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz",
+ "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^4.0.1",
+ "which": "^1.2.9"
+ }
+ },
+ "node_modules/node-sass/node_modules/supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/nopt": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
+ "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
+ "dev": true,
+ "dependencies": {
+ "abbrev": "1"
+ },
+ "bin": {
+ "nopt": "bin/nopt.js"
+ }
+ },
+ "node_modules/normalize-package-data": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "dev": true,
+ "dependencies": {
+ "hosted-git-info": "^2.1.4",
+ "resolve": "^1.10.0",
+ "semver": "2 || 3 || 4 || 5",
+ "validate-npm-package-license": "^3.0.1"
+ }
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalize-url": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz",
+ "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/npm-run-all": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz",
+ "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "chalk": "^2.4.1",
+ "cross-spawn": "^6.0.5",
+ "memorystream": "^0.3.1",
+ "minimatch": "^3.0.4",
+ "pidtree": "^0.3.0",
+ "read-pkg": "^3.0.0",
+ "shell-quote": "^1.6.1",
+ "string.prototype.padend": "^3.0.0"
+ },
+ "bin": {
+ "npm-run-all": "bin/npm-run-all/index.js",
+ "run-p": "bin/run-p/index.js",
+ "run-s": "bin/run-s/index.js"
+ },
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/npm-run-path": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
+ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/npmlog": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
+ "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
+ "dev": true,
+ "dependencies": {
+ "are-we-there-yet": "~1.1.2",
+ "console-control-strings": "~1.1.0",
+ "gauge": "~2.7.3",
+ "set-blocking": "~2.0.0"
+ }
+ },
+ "node_modules/nth-check": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
+ "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
+ "dev": true,
+ "dependencies": {
+ "boolbase": "~1.0.0"
+ }
+ },
+ "node_modules/number-is-nan": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/nwsapi": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz",
+ "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==",
+ "dev": true
+ },
+ "node_modules/oauth-sign": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "dev": true,
+ "dependencies": {
+ "copy-descriptor": "^0.1.0",
+ "define-property": "^0.2.5",
+ "kind-of": "^3.0.3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-copy/node_modules/define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "dependencies": {
+ "is-descriptor": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-copy/node_modules/kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-hash": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.0.3.tgz",
+ "integrity": "sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.10.3",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz",
+ "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-is": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz",
+ "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==",
+ "dev": true,
+ "dependencies": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.5"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "dev": true,
+ "dependencies": {
+ "isobject": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object.assign": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
+ "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3",
+ "has-symbols": "^1.0.1",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.getownpropertydescriptors": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz",
+ "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==",
+ "dev": true,
+ "dependencies": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0-next.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "dev": true,
+ "dependencies": {
+ "isobject": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object.values": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.3.tgz",
+ "integrity": "sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.18.0-next.2",
+ "has": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/obuf": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
+ "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
+ "dev": true
+ },
+ "node_modules/on-finished": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+ "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+ "dev": true,
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/on-headers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
+ "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/opn": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz",
+ "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==",
+ "dev": true,
+ "dependencies": {
+ "is-wsl": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/optimize-css-assets-webpack-plugin": {
+ "version": "5.0.6",
+ "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.6.tgz",
+ "integrity": "sha512-JAYw7WrIAIuHWoKeSBB3lJ6ZG9PSDK3JJduv/FMpIY060wvbA8Lqn/TCtxNGICNlg0X5AGshLzIhpYrkltdq+A==",
+ "dev": true,
+ "dependencies": {
+ "cssnano": "^4.1.10",
+ "last-call-webpack-plugin": "^3.0.0"
+ },
+ "peerDependencies": {
+ "webpack": "^4.0.0"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.8.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+ "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+ "dev": true,
+ "dependencies": {
+ "deep-is": "~0.1.3",
+ "fast-levenshtein": "~2.0.6",
+ "levn": "~0.3.0",
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2",
+ "word-wrap": "~1.2.3"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/original": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz",
+ "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==",
+ "dev": true,
+ "dependencies": {
+ "url-parse": "^1.4.3"
+ }
+ },
+ "node_modules/os-browserify": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
+ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
+ "dev": true
+ },
+ "node_modules/os-homedir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/os-tmpdir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/osenv": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
+ "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
+ "dev": true,
+ "dependencies": {
+ "os-homedir": "^1.0.0",
+ "os-tmpdir": "^1.0.0"
+ }
+ },
+ "node_modules/p-each-series": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz",
+ "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=",
+ "dev": true,
+ "dependencies": {
+ "p-reduce": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/p-finally": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
+ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/p-map": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz",
+ "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/p-reduce": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz",
+ "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/p-retry": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz",
+ "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==",
+ "dev": true,
+ "dependencies": {
+ "retry": "^0.12.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pako": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
+ "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
+ "dev": true
+ },
+ "node_modules/parallel-transform": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz",
+ "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==",
+ "dev": true,
+ "dependencies": {
+ "cyclist": "^1.0.1",
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.1.5"
+ }
+ },
+ "node_modules/param-case": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz",
+ "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=",
+ "dev": true,
+ "dependencies": {
+ "no-case": "^2.2.0"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parse-asn1": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz",
+ "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==",
+ "dev": true,
+ "dependencies": {
+ "asn1.js": "^5.2.0",
+ "browserify-aes": "^1.0.0",
+ "evp_bytestokey": "^1.0.0",
+ "pbkdf2": "^3.0.3",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "node_modules/parse-json": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
+ "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
+ "dev": true,
+ "dependencies": {
+ "error-ex": "^1.3.1",
+ "json-parse-better-errors": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/parse-passwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
+ "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/parse5": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz",
+ "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==",
+ "dev": true
+ },
+ "node_modules/parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-browserify": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz",
+ "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==",
+ "dev": true
+ },
+ "node_modules/path-dirname": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+ "dev": true
+ },
+ "node_modules/path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+ "dev": true
+ },
+ "node_modules/path-key": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+ "dev": true
+ },
+ "node_modules/path-to-regexp": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+ "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
+ "dev": true
+ },
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pbkdf2": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz",
+ "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==",
+ "dev": true,
+ "dependencies": {
+ "create-hash": "^1.1.2",
+ "create-hmac": "^1.1.4",
+ "ripemd160": "^2.0.1",
+ "safe-buffer": "^5.0.1",
+ "sha.js": "^2.4.8"
+ },
+ "engines": {
+ "node": ">=0.12"
+ }
+ },
+ "node_modules/performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
+ "dev": true
+ },
+ "node_modules/picomatch": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
+ "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/pidtree": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz",
+ "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==",
+ "dev": true,
+ "bin": {
+ "pidtree": "bin/pidtree.js"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/pify": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pinkie": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+ "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/pinkie-promise": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+ "dev": true,
+ "dependencies": {
+ "pinkie": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/pirates": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz",
+ "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==",
+ "dev": true,
+ "dependencies": {
+ "node-modules-regexp": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/pkg-dir": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
+ "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
+ "dev": true,
+ "dependencies": {
+ "find-up": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pn": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz",
+ "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==",
+ "dev": true
+ },
+ "node_modules/portfinder": {
+ "version": "1.0.28",
+ "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz",
+ "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==",
+ "dev": true,
+ "dependencies": {
+ "async": "^2.6.2",
+ "debug": "^3.1.1",
+ "mkdirp": "^0.5.5"
+ },
+ "engines": {
+ "node": ">= 0.12.0"
+ }
+ },
+ "node_modules/portfinder/node_modules/debug": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/portfinder/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/posix-character-classes": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "6.0.23",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
+ "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.4.1",
+ "source-map": "^0.6.1",
+ "supports-color": "^5.4.0"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/postcss-calc": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz",
+ "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==",
+ "dev": true,
+ "dependencies": {
+ "postcss": "^7.0.27",
+ "postcss-selector-parser": "^6.0.2",
+ "postcss-value-parser": "^4.0.2"
+ }
+ },
+ "node_modules/postcss-calc/node_modules/postcss": {
+ "version": "7.0.35",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+ "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.4.2",
+ "source-map": "^0.6.1",
+ "supports-color": "^6.1.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-calc/node_modules/postcss-value-parser": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz",
+ "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==",
+ "dev": true
+ },
+ "node_modules/postcss-calc/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-calc/node_modules/supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/postcss-colormin": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz",
+ "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.0.0",
+ "color": "^3.0.0",
+ "has": "^1.0.0",
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/postcss-colormin/node_modules/postcss": {
+ "version": "7.0.35",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+ "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.4.2",
+ "source-map": "^0.6.1",
+ "supports-color": "^6.1.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-colormin/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-colormin/node_modules/supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/postcss-convert-values": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz",
+ "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==",
+ "dev": true,
+ "dependencies": {
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/postcss-convert-values/node_modules/postcss": {
+ "version": "7.0.35",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+ "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.4.2",
+ "source-map": "^0.6.1",
+ "supports-color": "^6.1.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-convert-values/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-convert-values/node_modules/supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/postcss-discard-comments": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz",
+ "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==",
+ "dev": true,
+ "dependencies": {
+ "postcss": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/postcss-discard-comments/node_modules/postcss": {
+ "version": "7.0.35",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+ "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.4.2",
+ "source-map": "^0.6.1",
+ "supports-color": "^6.1.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-discard-comments/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-discard-comments/node_modules/supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/postcss-discard-duplicates": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz",
+ "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==",
+ "dev": true,
+ "dependencies": {
+ "postcss": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/postcss-discard-duplicates/node_modules/postcss": {
+ "version": "7.0.35",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+ "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.4.2",
+ "source-map": "^0.6.1",
+ "supports-color": "^6.1.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-discard-duplicates/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-discard-duplicates/node_modules/supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/postcss-discard-empty": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz",
+ "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==",
+ "dev": true,
+ "dependencies": {
+ "postcss": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/postcss-discard-empty/node_modules/postcss": {
+ "version": "7.0.35",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+ "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.4.2",
+ "source-map": "^0.6.1",
+ "supports-color": "^6.1.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-discard-empty/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-discard-empty/node_modules/supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/postcss-discard-overridden": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz",
+ "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==",
+ "dev": true,
+ "dependencies": {
+ "postcss": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/postcss-discard-overridden/node_modules/postcss": {
+ "version": "7.0.35",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+ "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.4.2",
+ "source-map": "^0.6.1",
+ "supports-color": "^6.1.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-discard-overridden/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-discard-overridden/node_modules/supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/postcss-merge-longhand": {
+ "version": "4.0.11",
+ "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz",
+ "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==",
+ "dev": true,
+ "dependencies": {
+ "css-color-names": "0.0.4",
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0",
+ "stylehacks": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/postcss-merge-longhand/node_modules/postcss": {
+ "version": "7.0.35",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+ "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.4.2",
+ "source-map": "^0.6.1",
+ "supports-color": "^6.1.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-merge-longhand/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-merge-longhand/node_modules/supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/postcss-merge-rules": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz",
+ "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.0.0",
+ "caniuse-api": "^3.0.0",
+ "cssnano-util-same-parent": "^4.0.0",
+ "postcss": "^7.0.0",
+ "postcss-selector-parser": "^3.0.0",
+ "vendors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/postcss-merge-rules/node_modules/postcss": {
+ "version": "7.0.35",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+ "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.4.2",
+ "source-map": "^0.6.1",
+ "supports-color": "^6.1.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-merge-rules/node_modules/postcss-selector-parser": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
+ "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
+ "dev": true,
+ "dependencies": {
+ "dot-prop": "^5.2.0",
+ "indexes-of": "^1.0.1",
+ "uniq": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/postcss-merge-rules/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-merge-rules/node_modules/supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/postcss-minify-font-values": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz",
+ "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==",
+ "dev": true,
+ "dependencies": {
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/postcss-minify-font-values/node_modules/postcss": {
+ "version": "7.0.35",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+ "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.4.2",
+ "source-map": "^0.6.1",
+ "supports-color": "^6.1.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-minify-font-values/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-minify-font-values/node_modules/supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/postcss-minify-gradients": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz",
+ "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==",
+ "dev": true,
+ "dependencies": {
+ "cssnano-util-get-arguments": "^4.0.0",
+ "is-color-stop": "^1.0.0",
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/postcss-minify-gradients/node_modules/postcss": {
+ "version": "7.0.35",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+ "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.4.2",
+ "source-map": "^0.6.1",
+ "supports-color": "^6.1.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-minify-gradients/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-minify-gradients/node_modules/supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/postcss-minify-params": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz",
+ "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==",
+ "dev": true,
+ "dependencies": {
+ "alphanum-sort": "^1.0.0",
+ "browserslist": "^4.0.0",
+ "cssnano-util-get-arguments": "^4.0.0",
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0",
+ "uniqs": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/postcss-minify-params/node_modules/postcss": {
+ "version": "7.0.35",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+ "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.4.2",
+ "source-map": "^0.6.1",
+ "supports-color": "^6.1.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-minify-params/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-minify-params/node_modules/supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/postcss-minify-selectors": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz",
+ "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==",
+ "dev": true,
+ "dependencies": {
+ "alphanum-sort": "^1.0.0",
+ "has": "^1.0.0",
+ "postcss": "^7.0.0",
+ "postcss-selector-parser": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/postcss-minify-selectors/node_modules/postcss": {
+ "version": "7.0.35",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+ "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.4.2",
+ "source-map": "^0.6.1",
+ "supports-color": "^6.1.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-minify-selectors/node_modules/postcss-selector-parser": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
+ "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
+ "dev": true,
+ "dependencies": {
+ "dot-prop": "^5.2.0",
+ "indexes-of": "^1.0.1",
+ "uniq": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/postcss-minify-selectors/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-minify-selectors/node_modules/supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/postcss-modules-extract-imports": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz",
+ "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==",
+ "dev": true,
+ "dependencies": {
+ "postcss": "^6.0.1"
+ }
+ },
+ "node_modules/postcss-modules-local-by-default": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz",
+ "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=",
+ "dev": true,
+ "dependencies": {
+ "css-selector-tokenizer": "^0.7.0",
+ "postcss": "^6.0.1"
+ }
+ },
+ "node_modules/postcss-modules-scope": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz",
+ "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=",
+ "dev": true,
+ "dependencies": {
+ "css-selector-tokenizer": "^0.7.0",
+ "postcss": "^6.0.1"
+ }
+ },
+ "node_modules/postcss-modules-values": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz",
+ "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=",
+ "dev": true,
+ "dependencies": {
+ "icss-replace-symbols": "^1.1.0",
+ "postcss": "^6.0.1"
+ }
+ },
+ "node_modules/postcss-normalize-charset": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz",
+ "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==",
+ "dev": true,
+ "dependencies": {
+ "postcss": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/postcss-normalize-charset/node_modules/postcss": {
+ "version": "7.0.35",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+ "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.4.2",
+ "source-map": "^0.6.1",
+ "supports-color": "^6.1.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-normalize-charset/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-normalize-charset/node_modules/supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/postcss-normalize-display-values": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz",
+ "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==",
+ "dev": true,
+ "dependencies": {
+ "cssnano-util-get-match": "^4.0.0",
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/postcss-normalize-display-values/node_modules/postcss": {
+ "version": "7.0.35",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+ "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.4.2",
+ "source-map": "^0.6.1",
+ "supports-color": "^6.1.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-normalize-display-values/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-normalize-display-values/node_modules/supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/postcss-normalize-positions": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz",
+ "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==",
+ "dev": true,
+ "dependencies": {
+ "cssnano-util-get-arguments": "^4.0.0",
+ "has": "^1.0.0",
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/postcss-normalize-positions/node_modules/postcss": {
+ "version": "7.0.35",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+ "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.4.2",
+ "source-map": "^0.6.1",
+ "supports-color": "^6.1.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-normalize-positions/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-normalize-positions/node_modules/supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/postcss-normalize-repeat-style": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz",
+ "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==",
+ "dev": true,
+ "dependencies": {
+ "cssnano-util-get-arguments": "^4.0.0",
+ "cssnano-util-get-match": "^4.0.0",
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/postcss-normalize-repeat-style/node_modules/postcss": {
+ "version": "7.0.35",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+ "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.4.2",
+ "source-map": "^0.6.1",
+ "supports-color": "^6.1.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-normalize-repeat-style/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-normalize-repeat-style/node_modules/supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/postcss-normalize-string": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz",
+ "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==",
+ "dev": true,
+ "dependencies": {
+ "has": "^1.0.0",
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/postcss-normalize-string/node_modules/postcss": {
+ "version": "7.0.35",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+ "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.4.2",
+ "source-map": "^0.6.1",
+ "supports-color": "^6.1.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-normalize-string/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-normalize-string/node_modules/supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/postcss-normalize-timing-functions": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz",
+ "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==",
+ "dev": true,
+ "dependencies": {
+ "cssnano-util-get-match": "^4.0.0",
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/postcss-normalize-timing-functions/node_modules/postcss": {
+ "version": "7.0.35",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+ "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.4.2",
+ "source-map": "^0.6.1",
+ "supports-color": "^6.1.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-normalize-timing-functions/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-normalize-timing-functions/node_modules/supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/postcss-normalize-unicode": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz",
+ "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.0.0",
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/postcss-normalize-unicode/node_modules/postcss": {
+ "version": "7.0.35",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+ "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.4.2",
+ "source-map": "^0.6.1",
+ "supports-color": "^6.1.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-normalize-unicode/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-normalize-unicode/node_modules/supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/postcss-normalize-url": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz",
+ "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==",
+ "dev": true,
+ "dependencies": {
+ "is-absolute-url": "^2.0.0",
+ "normalize-url": "^3.0.0",
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/postcss-normalize-url/node_modules/postcss": {
+ "version": "7.0.35",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+ "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.4.2",
+ "source-map": "^0.6.1",
+ "supports-color": "^6.1.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-normalize-url/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-normalize-url/node_modules/supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/postcss-normalize-whitespace": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz",
+ "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==",
+ "dev": true,
+ "dependencies": {
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/postcss-normalize-whitespace/node_modules/postcss": {
+ "version": "7.0.35",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+ "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.4.2",
+ "source-map": "^0.6.1",
+ "supports-color": "^6.1.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-normalize-whitespace/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-normalize-whitespace/node_modules/supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/postcss-ordered-values": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz",
+ "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==",
+ "dev": true,
+ "dependencies": {
+ "cssnano-util-get-arguments": "^4.0.0",
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/postcss-ordered-values/node_modules/postcss": {
+ "version": "7.0.35",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+ "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.4.2",
+ "source-map": "^0.6.1",
+ "supports-color": "^6.1.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-ordered-values/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-ordered-values/node_modules/supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/postcss-reduce-initial": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz",
+ "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.0.0",
+ "caniuse-api": "^3.0.0",
+ "has": "^1.0.0",
+ "postcss": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/postcss-reduce-initial/node_modules/postcss": {
+ "version": "7.0.35",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+ "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.4.2",
+ "source-map": "^0.6.1",
+ "supports-color": "^6.1.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-reduce-initial/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-reduce-initial/node_modules/supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/postcss-reduce-transforms": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz",
+ "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==",
+ "dev": true,
+ "dependencies": {
+ "cssnano-util-get-match": "^4.0.0",
+ "has": "^1.0.0",
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/postcss-reduce-transforms/node_modules/postcss": {
+ "version": "7.0.35",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+ "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.4.2",
+ "source-map": "^0.6.1",
+ "supports-color": "^6.1.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-reduce-transforms/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-reduce-transforms/node_modules/supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz",
+ "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==",
+ "dev": true,
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "indexes-of": "^1.0.1",
+ "uniq": "^1.0.1",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-svgo": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz",
+ "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==",
+ "dev": true,
+ "dependencies": {
+ "postcss": "^7.0.0",
+ "postcss-value-parser": "^3.0.0",
+ "svgo": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/postcss-svgo/node_modules/postcss": {
+ "version": "7.0.35",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+ "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.4.2",
+ "source-map": "^0.6.1",
+ "supports-color": "^6.1.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/postcss-svgo/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-svgo/node_modules/supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/postcss-unique-selectors": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz",
+ "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==",
+ "dev": true,
+ "dependencies": {
+ "alphanum-sort": "^1.0.0",
+ "postcss": "^7.0.0",
+ "uniqs": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/postcss-unique-selectors/node_modules/postcss": {
+ "version": "7.0.35",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+ "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.4.2",
+ "source-map": "^0.6.1",
+ "supports-color": "^6.1.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-unique-selectors/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-unique-selectors/node_modules/supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/postcss-value-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+ "dev": true
+ },
+ "node_modules/postcss/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/pretty-error": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz",
+ "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=",
+ "dev": true,
+ "dependencies": {
+ "renderkid": "^2.0.1",
+ "utila": "~0.4"
+ }
+ },
+ "node_modules/pretty-format": {
+ "version": "24.9.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz",
+ "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==",
+ "dev": true,
+ "dependencies": {
+ "@jest/types": "^24.9.0",
+ "ansi-regex": "^4.0.0",
+ "ansi-styles": "^3.2.0",
+ "react-is": "^16.8.4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/pretty-format/node_modules/ansi-regex": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/private": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
+ "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/process": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+ "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6.0"
+ }
+ },
+ "node_modules/process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+ "dev": true
+ },
+ "node_modules/progress": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/promise-inflight": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
+ "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=",
+ "dev": true
+ },
+ "node_modules/prompts": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz",
+ "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==",
+ "dev": true,
+ "dependencies": {
+ "kleur": "^3.0.3",
+ "sisteransi": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/proxy-addr": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
+ "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==",
+ "dev": true,
+ "dependencies": {
+ "forwarded": "~0.1.2",
+ "ipaddr.js": "1.9.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/prr": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
+ "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
+ "dev": true
+ },
+ "node_modules/pseudomap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
+ "dev": true
+ },
+ "node_modules/psl": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
+ "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==",
+ "dev": true
+ },
+ "node_modules/public-encrypt": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
+ "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
+ "dev": true,
+ "dependencies": {
+ "bn.js": "^4.1.0",
+ "browserify-rsa": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "parse-asn1": "^5.0.0",
+ "randombytes": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "node_modules/public-encrypt/node_modules/bn.js": {
+ "version": "4.11.9",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz",
+ "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==",
+ "dev": true
+ },
+ "node_modules/pump": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+ "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+ "dev": true,
+ "dependencies": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ },
+ "node_modules/pumpify": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz",
+ "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==",
+ "dev": true,
+ "dependencies": {
+ "duplexify": "^3.6.0",
+ "inherits": "^2.0.3",
+ "pump": "^2.0.0"
+ }
+ },
+ "node_modules/pumpify/node_modules/pump": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
+ "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
+ "dev": true,
+ "dependencies": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/q": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
+ "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.6.0",
+ "teleport": ">=0.2.0"
+ }
+ },
+ "node_modules/qs": {
+ "version": "6.5.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/querystring": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
+ "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.x"
+ }
+ },
+ "node_modules/querystring-es3": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
+ "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.x"
+ }
+ },
+ "node_modules/querystringify": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
+ "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
+ "dev": true
+ },
+ "node_modules/randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "node_modules/randomfill": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
+ "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
+ "dev": true,
+ "dependencies": {
+ "randombytes": "^2.0.5",
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "node_modules/range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/raw-body": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
+ "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
+ "dev": true,
+ "dependencies": {
+ "bytes": "3.1.0",
+ "http-errors": "1.7.2",
+ "iconv-lite": "0.4.24",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/raw-body/node_modules/bytes": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
+ "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+ "dev": true
+ },
+ "node_modules/read-pkg": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
+ "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=",
+ "dev": true,
+ "dependencies": {
+ "load-json-file": "^4.0.0",
+ "normalize-package-data": "^2.3.2",
+ "path-type": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/read-pkg-up": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz",
+ "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==",
+ "dev": true,
+ "dependencies": {
+ "find-up": "^3.0.0",
+ "read-pkg": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/read-pkg/node_modules/path-type": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
+ "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
+ "dev": true,
+ "dependencies": {
+ "pify": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/read-pkg/node_modules/pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "dev": true,
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
+ "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.1.11",
+ "micromatch": "^3.1.10",
+ "readable-stream": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/realistic-structured-clone": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/realistic-structured-clone/-/realistic-structured-clone-2.0.2.tgz",
+ "integrity": "sha512-5IEvyfuMJ4tjQOuKKTFNvd+H9GSbE87IcendSBannE28PTrbolgaVg5DdEApRKhtze794iXqVUFKV60GLCNKEg==",
+ "dev": true,
+ "dependencies": {
+ "core-js": "^2.5.3",
+ "domexception": "^1.0.1",
+ "typeson": "^5.8.2",
+ "typeson-registry": "^1.0.0-alpha.20"
+ }
+ },
+ "node_modules/realpath-native": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz",
+ "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==",
+ "dev": true,
+ "dependencies": {
+ "util.promisify": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/recast": {
+ "version": "0.11.23",
+ "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz",
+ "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=",
+ "dev": true,
+ "dependencies": {
+ "ast-types": "0.9.6",
+ "esprima": "~3.1.0",
+ "private": "~0.1.5",
+ "source-map": "~0.5.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/recast/node_modules/esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true,
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/redent": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
+ "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+ "dev": true,
+ "dependencies": {
+ "indent-string": "^2.1.0",
+ "strip-indent": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/regenerate": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz",
+ "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==",
+ "dev": true
+ },
+ "node_modules/regenerate-unicode-properties": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz",
+ "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==",
+ "dev": true,
+ "dependencies": {
+ "regenerate": "^1.4.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regenerator-runtime": {
+ "version": "0.13.7",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
+ "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew=="
+ },
+ "node_modules/regenerator-transform": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz",
+ "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/runtime": "^7.8.4"
+ }
+ },
+ "node_modules/regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "dev": true,
+ "dependencies": {
+ "extend-shallow": "^3.0.2",
+ "safe-regex": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/regexp.prototype.flags": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz",
+ "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==",
+ "dev": true,
+ "dependencies": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0-next.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/regexpp": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz",
+ "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/regexpu-core": {
+ "version": "4.7.1",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz",
+ "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==",
+ "dev": true,
+ "dependencies": {
+ "regenerate": "^1.4.0",
+ "regenerate-unicode-properties": "^8.2.0",
+ "regjsgen": "^0.5.1",
+ "regjsparser": "^0.6.4",
+ "unicode-match-property-ecmascript": "^1.0.4",
+ "unicode-match-property-value-ecmascript": "^1.2.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regjsgen": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz",
+ "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==",
+ "dev": true
+ },
+ "node_modules/regjsparser": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz",
+ "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==",
+ "dev": true,
+ "dependencies": {
+ "jsesc": "~0.5.0"
+ },
+ "bin": {
+ "regjsparser": "bin/parser"
+ }
+ },
+ "node_modules/regjsparser/node_modules/jsesc": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+ "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+ "dev": true,
+ "bin": {
+ "jsesc": "bin/jsesc"
+ }
+ },
+ "node_modules/relateurl": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
+ "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/remove-trailing-separator": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
+ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
+ "dev": true
+ },
+ "node_modules/renderkid": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz",
+ "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==",
+ "dev": true,
+ "dependencies": {
+ "css-select": "^1.1.0",
+ "dom-converter": "^0.2",
+ "htmlparser2": "^3.3.0",
+ "strip-ansi": "^3.0.0",
+ "utila": "^0.4.0"
+ }
+ },
+ "node_modules/repeat-element": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
+ "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "dependencies": {
+ "is-finite": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/request": {
+ "version": "2.88.2",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
+ "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
+ "dev": true,
+ "dependencies": {
+ "aws-sign2": "~0.7.0",
+ "aws4": "^1.8.0",
+ "caseless": "~0.12.0",
+ "combined-stream": "~1.0.6",
+ "extend": "~3.0.2",
+ "forever-agent": "~0.6.1",
+ "form-data": "~2.3.2",
+ "har-validator": "~5.1.3",
+ "http-signature": "~1.2.0",
+ "is-typedarray": "~1.0.0",
+ "isstream": "~0.1.2",
+ "json-stringify-safe": "~5.0.1",
+ "mime-types": "~2.1.19",
+ "oauth-sign": "~0.9.0",
+ "performance-now": "^2.1.0",
+ "qs": "~6.5.2",
+ "safe-buffer": "^5.1.2",
+ "tough-cookie": "~2.5.0",
+ "tunnel-agent": "^0.6.0",
+ "uuid": "^3.3.2"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/request-promise-core": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz",
+ "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==",
+ "dev": true,
+ "dependencies": {
+ "lodash": "^4.17.19"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/request-promise-native": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz",
+ "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==",
+ "dev": true,
+ "dependencies": {
+ "request-promise-core": "1.1.4",
+ "stealthy-require": "^1.1.1",
+ "tough-cookie": "^2.3.3"
+ },
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/require-main-filename": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
+ "dev": true
+ },
+ "node_modules/requires-port": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
+ "dev": true
+ },
+ "node_modules/resolve": {
+ "version": "1.17.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
+ "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
+ "dev": true,
+ "dependencies": {
+ "path-parse": "^1.0.6"
+ }
+ },
+ "node_modules/resolve-cwd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz",
+ "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=",
+ "dev": true,
+ "dependencies": {
+ "resolve-from": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/resolve-cwd/node_modules/resolve-from": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
+ "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/resolve-dir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
+ "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
+ "dev": true,
+ "dependencies": {
+ "expand-tilde": "^2.0.0",
+ "global-modules": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/resolve-dir/node_modules/global-modules": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
+ "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
+ "dev": true,
+ "dependencies": {
+ "global-prefix": "^1.0.1",
+ "is-windows": "^1.0.1",
+ "resolve-dir": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+ "dev": true
+ },
+ "node_modules/ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12"
+ }
+ },
+ "node_modules/retry": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
+ "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true,
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rgb-regex": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz",
+ "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=",
+ "dev": true
+ },
+ "node_modules/rgba-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz",
+ "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=",
+ "dev": true
+ },
+ "node_modules/rimraf": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
+ "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ }
+ },
+ "node_modules/ripemd160": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
+ "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
+ "dev": true,
+ "dependencies": {
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1"
+ }
+ },
+ "node_modules/rsvp": {
+ "version": "4.8.5",
+ "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz",
+ "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==",
+ "dev": true,
+ "engines": {
+ "node": "6.* || >= 7.*"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.1.10",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz",
+ "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==",
+ "dev": true
+ },
+ "node_modules/run-queue": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz",
+ "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=",
+ "dev": true,
+ "dependencies": {
+ "aproba": "^1.1.1"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true
+ },
+ "node_modules/safe-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+ "dev": true,
+ "dependencies": {
+ "ret": "~0.1.10"
+ }
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true
+ },
+ "node_modules/sane": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz",
+ "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==",
+ "dev": true,
+ "dependencies": {
+ "@cnakazawa/watch": "^1.0.3",
+ "anymatch": "^2.0.0",
+ "capture-exit": "^2.0.0",
+ "exec-sh": "^0.3.2",
+ "execa": "^1.0.0",
+ "fb-watchman": "^2.0.0",
+ "micromatch": "^3.1.4",
+ "minimist": "^1.1.1",
+ "walker": "~1.0.5"
+ },
+ "bin": {
+ "sane": "src/cli.js"
+ },
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/sass-graph": {
+ "version": "2.2.5",
+ "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz",
+ "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.0.0",
+ "lodash": "^4.0.0",
+ "scss-tokenizer": "^0.2.3",
+ "yargs": "^13.3.2"
+ }
+ },
+ "node_modules/sass-loader": {
+ "version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.3.1.tgz",
+ "integrity": "sha512-tuU7+zm0pTCynKYHpdqaPpe+MMTQ76I9TPZ7i4/5dZsigE350shQWe5EZNl5dBidM49TPET75tNqRbcsUZWeNA==",
+ "dev": true,
+ "dependencies": {
+ "clone-deep": "^4.0.1",
+ "loader-utils": "^1.0.1",
+ "neo-async": "^2.5.0",
+ "pify": "^4.0.1",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">= 6.9.0"
+ }
+ },
+ "node_modules/sass-loader/node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/sax": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
+ "dev": true
+ },
+ "node_modules/schema-utils": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
+ "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==",
+ "dev": true,
+ "dependencies": {
+ "@types/json-schema": "^7.0.5",
+ "ajv": "^6.12.4",
+ "ajv-keywords": "^3.5.2"
+ },
+ "engines": {
+ "node": ">= 8.9.0"
+ }
+ },
+ "node_modules/scss-tokenizer": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz",
+ "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=",
+ "dev": true,
+ "dependencies": {
+ "js-base64": "^2.1.8",
+ "source-map": "^0.4.2"
+ }
+ },
+ "node_modules/scss-tokenizer/node_modules/source-map": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
+ "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
+ "dev": true,
+ "dependencies": {
+ "amdefine": ">=0.0.4"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/select-hose": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
+ "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=",
+ "dev": true
+ },
+ "node_modules/selfsigned": {
+ "version": "1.10.8",
+ "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz",
+ "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==",
+ "dev": true,
+ "dependencies": {
+ "node-forge": "^0.10.0"
+ }
+ },
+ "node_modules/semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/send": {
+ "version": "0.17.1",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
+ "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
+ "dev": true,
+ "dependencies": {
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "destroy": "~1.0.4",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "~1.7.2",
+ "mime": "1.6.0",
+ "ms": "2.1.1",
+ "on-finished": "~2.3.0",
+ "range-parser": "~1.2.1",
+ "statuses": "~1.5.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/send/node_modules/ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+ "dev": true
+ },
+ "node_modules/serialize-javascript": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
+ "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==",
+ "dev": true,
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "node_modules/serve-index": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
+ "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
+ "dev": true,
+ "dependencies": {
+ "accepts": "~1.3.4",
+ "batch": "0.6.1",
+ "debug": "2.6.9",
+ "escape-html": "~1.0.3",
+ "http-errors": "~1.6.2",
+ "mime-types": "~2.1.17",
+ "parseurl": "~1.3.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/serve-index/node_modules/http-errors": {
+ "version": "1.6.3",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
+ "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
+ "dev": true,
+ "dependencies": {
+ "depd": "~1.1.2",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.1.0",
+ "statuses": ">= 1.4.0 < 2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/serve-index/node_modules/inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "node_modules/serve-index/node_modules/setprototypeof": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
+ "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
+ "dev": true
+ },
+ "node_modules/serve-static": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
+ "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
+ "dev": true,
+ "dependencies": {
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "0.17.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/set-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
+ "dev": true
+ },
+ "node_modules/set-value": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
+ "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
+ "dev": true,
+ "dependencies": {
+ "extend-shallow": "^2.0.1",
+ "is-extendable": "^0.1.1",
+ "is-plain-object": "^2.0.3",
+ "split-string": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/set-value/node_modules/extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "dependencies": {
+ "is-extendable": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/setimmediate": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
+ "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=",
+ "dev": true
+ },
+ "node_modules/setprototypeof": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
+ "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==",
+ "dev": true
+ },
+ "node_modules/sha.js": {
+ "version": "2.4.11",
+ "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
+ "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ },
+ "bin": {
+ "sha.js": "bin.js"
+ }
+ },
+ "node_modules/shallow-clone": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
+ "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
+ "dev": true,
+ "dependencies": {
+ "kind-of": "^6.0.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/shell-quote": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz",
+ "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==",
+ "dev": true
+ },
+ "node_modules/shellwords": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz",
+ "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==",
+ "dev": true
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
+ "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
+ "dev": true
+ },
+ "node_modules/simple-swizzle": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
+ "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=",
+ "dev": true,
+ "dependencies": {
+ "is-arrayish": "^0.3.1"
+ }
+ },
+ "node_modules/simple-swizzle/node_modules/is-arrayish": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
+ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
+ "dev": true
+ },
+ "node_modules/sisteransi": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
+ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
+ "dev": true
+ },
+ "node_modules/slash": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
+ "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/slice-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/slice-ansi/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/slice-ansi/node_modules/astral-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/slice-ansi/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/slice-ansi/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/snapdragon": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+ "dev": true,
+ "dependencies": {
+ "base": "^0.11.1",
+ "debug": "^2.2.0",
+ "define-property": "^0.2.5",
+ "extend-shallow": "^2.0.1",
+ "map-cache": "^0.2.2",
+ "source-map": "^0.5.6",
+ "source-map-resolve": "^0.5.0",
+ "use": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/snapdragon-node": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "dev": true,
+ "dependencies": {
+ "define-property": "^1.0.0",
+ "isobject": "^3.0.0",
+ "snapdragon-util": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/snapdragon-node/node_modules/define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "dependencies": {
+ "is-descriptor": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "dependencies": {
+ "kind-of": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/snapdragon-node/node_modules/is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "dependencies": {
+ "kind-of": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/snapdragon-node/node_modules/is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "dependencies": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "dev": true,
+ "dependencies": {
+ "kind-of": "^3.2.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/snapdragon-util/node_modules/kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/snapdragon/node_modules/define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "dependencies": {
+ "is-descriptor": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/snapdragon/node_modules/extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "dependencies": {
+ "is-extendable": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/sockjs": {
+ "version": "0.3.20",
+ "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz",
+ "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==",
+ "dev": true,
+ "dependencies": {
+ "faye-websocket": "^0.10.0",
+ "uuid": "^3.4.0",
+ "websocket-driver": "0.6.5"
+ }
+ },
+ "node_modules/sockjs-client": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz",
+ "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^3.2.5",
+ "eventsource": "^1.0.7",
+ "faye-websocket": "~0.11.1",
+ "inherits": "^2.0.3",
+ "json3": "^3.3.2",
+ "url-parse": "^1.4.3"
+ }
+ },
+ "node_modules/sockjs-client/node_modules/debug": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/sockjs-client/node_modules/faye-websocket": {
+ "version": "0.11.3",
+ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz",
+ "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==",
+ "dev": true,
+ "dependencies": {
+ "websocket-driver": ">=0.5.1"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/sockjs-client/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/source-list-map": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
+ "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==",
+ "dev": true
+ },
+ "node_modules/source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-resolve": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
+ "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
+ "dev": true,
+ "dependencies": {
+ "atob": "^2.1.2",
+ "decode-uri-component": "^0.2.0",
+ "resolve-url": "^0.2.1",
+ "source-map-url": "^0.4.0",
+ "urix": "^0.1.0"
+ }
+ },
+ "node_modules/source-map-support": {
+ "version": "0.5.19",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
+ "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
+ "dev": true,
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/source-map-support/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-url": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+ "dev": true
+ },
+ "node_modules/spdx-correct": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
+ "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
+ "dev": true,
+ "dependencies": {
+ "spdx-expression-parse": "^3.0.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/spdx-exceptions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
+ "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
+ "dev": true
+ },
+ "node_modules/spdx-expression-parse": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+ "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+ "dev": true,
+ "dependencies": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/spdx-license-ids": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz",
+ "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==",
+ "dev": true
+ },
+ "node_modules/spdy": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
+ "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.1.0",
+ "handle-thing": "^2.0.0",
+ "http-deceiver": "^1.2.7",
+ "select-hose": "^2.0.0",
+ "spdy-transport": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/spdy-transport": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz",
+ "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.1.0",
+ "detect-node": "^2.0.4",
+ "hpack.js": "^2.1.6",
+ "obuf": "^1.1.2",
+ "readable-stream": "^3.0.6",
+ "wbuf": "^1.7.3"
+ }
+ },
+ "node_modules/spdy-transport/node_modules/debug": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
+ "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/spdy-transport/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/spdy-transport/node_modules/readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/spdy/node_modules/debug": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
+ "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/spdy/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/split-string": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+ "dev": true,
+ "dependencies": {
+ "extend-shallow": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "node_modules/sshpk": {
+ "version": "1.16.1",
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
+ "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
+ "dev": true,
+ "dependencies": {
+ "asn1": "~0.2.3",
+ "assert-plus": "^1.0.0",
+ "bcrypt-pbkdf": "^1.0.0",
+ "dashdash": "^1.12.0",
+ "ecc-jsbn": "~0.1.1",
+ "getpass": "^0.1.1",
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.0.2",
+ "tweetnacl": "~0.14.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ssri": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz",
+ "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==",
+ "dev": true,
+ "dependencies": {
+ "figgy-pudding": "^3.5.1"
+ }
+ },
+ "node_modules/stable": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
+ "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
+ "dev": true
+ },
+ "node_modules/stack-utils": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz",
+ "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+ "dev": true,
+ "dependencies": {
+ "define-property": "^0.2.5",
+ "object-copy": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/static-extend/node_modules/define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "dependencies": {
+ "is-descriptor": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/statuses": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/stdout-stream": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz",
+ "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==",
+ "dev": true,
+ "dependencies": {
+ "readable-stream": "^2.0.1"
+ }
+ },
+ "node_modules/stealthy-require": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz",
+ "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/stream-browserify": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz",
+ "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "~2.0.1",
+ "readable-stream": "^2.0.2"
+ }
+ },
+ "node_modules/stream-each": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz",
+ "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==",
+ "dev": true,
+ "dependencies": {
+ "end-of-stream": "^1.1.0",
+ "stream-shift": "^1.0.0"
+ }
+ },
+ "node_modules/stream-http": {
+ "version": "2.8.3",
+ "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz",
+ "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==",
+ "dev": true,
+ "dependencies": {
+ "builtin-status-codes": "^3.0.0",
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.3.6",
+ "to-arraybuffer": "^1.0.0",
+ "xtend": "^4.0.0"
+ }
+ },
+ "node_modules/stream-shift": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz",
+ "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==",
+ "dev": true
+ },
+ "node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/string-length": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz",
+ "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=",
+ "dev": true,
+ "dependencies": {
+ "astral-regex": "^1.0.0",
+ "strip-ansi": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/string-length/node_modules/ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/string-length/node_modules/strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/string-natural-compare": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz",
+ "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==",
+ "dev": true
+ },
+ "node_modules/string-width": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+ "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width/node_modules/ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width/node_modules/strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string.prototype.padend": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.0.tgz",
+ "integrity": "sha512-3aIv8Ffdp8EZj8iLwREGpQaUZiPyrWrpzMBHvkiSW/bK/EGve9np07Vwy7IJ5waydpGXzQZu/F8Oze2/IWkBaA==",
+ "dev": true,
+ "dependencies": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0-next.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/string.prototype.trimend": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz",
+ "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimstart": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz",
+ "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/strip-eof": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/strip-indent": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
+ "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
+ "dev": true,
+ "dependencies": {
+ "get-stdin": "^4.0.1"
+ },
+ "bin": {
+ "strip-indent": "cli.js"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/style-loader": {
+ "version": "0.23.1",
+ "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz",
+ "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==",
+ "dev": true,
+ "dependencies": {
+ "loader-utils": "^1.1.0",
+ "schema-utils": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.12.0"
+ }
+ },
+ "node_modules/style-loader/node_modules/schema-utils": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
+ "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.1.0",
+ "ajv-errors": "^1.0.0",
+ "ajv-keywords": "^3.1.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/stylehacks": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz",
+ "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.0.0",
+ "postcss": "^7.0.0",
+ "postcss-selector-parser": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/stylehacks/node_modules/postcss": {
+ "version": "7.0.35",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+ "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.4.2",
+ "source-map": "^0.6.1",
+ "supports-color": "^6.1.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/stylehacks/node_modules/postcss-selector-parser": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
+ "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
+ "dev": true,
+ "dependencies": {
+ "dot-prop": "^5.2.0",
+ "indexes-of": "^1.0.1",
+ "uniq": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/stylehacks/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/stylehacks/node_modules/supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/svgo": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz",
+ "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.4.1",
+ "coa": "^2.0.2",
+ "css-select": "^2.0.0",
+ "css-select-base-adapter": "^0.1.1",
+ "css-tree": "1.0.0-alpha.37",
+ "csso": "^4.0.2",
+ "js-yaml": "^3.13.1",
+ "mkdirp": "~0.5.1",
+ "object.values": "^1.1.0",
+ "sax": "~1.2.4",
+ "stable": "^0.1.8",
+ "unquote": "~1.1.1",
+ "util.promisify": "~1.0.0"
+ },
+ "bin": {
+ "svgo": "bin/svgo"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/svgo/node_modules/css-select": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz",
+ "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==",
+ "dev": true,
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^3.2.1",
+ "domutils": "^1.7.0",
+ "nth-check": "^1.0.2"
+ }
+ },
+ "node_modules/svgo/node_modules/css-what": {
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz",
+ "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/svgo/node_modules/domutils": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
+ "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
+ "dev": true,
+ "dependencies": {
+ "dom-serializer": "0",
+ "domelementtype": "1"
+ }
+ },
+ "node_modules/symbol-tree": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
+ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
+ "dev": true
+ },
+ "node_modules/table": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/table/-/table-6.0.4.tgz",
+ "integrity": "sha512-sBT4xRLdALd+NFBvwOz8bw4b15htyythha+q+DVZqy2RS08PPC8O2sZFgJYEY7bJvbCFKccs+WIZ/cd+xxTWCw==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "lodash": "^4.17.20",
+ "slice-ansi": "^4.0.0",
+ "string-width": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/tapable": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz",
+ "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/tar": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz",
+ "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==",
+ "dev": true,
+ "dependencies": {
+ "block-stream": "*",
+ "fstream": "^1.0.12",
+ "inherits": "2"
+ }
+ },
+ "node_modules/terser": {
+ "version": "3.17.0",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz",
+ "integrity": "sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==",
+ "dev": true,
+ "dependencies": {
+ "commander": "^2.19.0",
+ "source-map": "~0.6.1",
+ "source-map-support": "~0.5.10"
+ },
+ "bin": {
+ "terser": "bin/uglifyjs"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/terser-webpack-plugin": {
+ "version": "1.4.5",
+ "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz",
+ "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==",
+ "dev": true,
+ "dependencies": {
+ "cacache": "^12.0.2",
+ "find-cache-dir": "^2.1.0",
+ "is-wsl": "^1.1.0",
+ "schema-utils": "^1.0.0",
+ "serialize-javascript": "^4.0.0",
+ "source-map": "^0.6.1",
+ "terser": "^4.1.2",
+ "webpack-sources": "^1.4.0",
+ "worker-farm": "^1.7.0"
+ },
+ "engines": {
+ "node": ">= 6.9.0"
+ }
+ },
+ "node_modules/terser-webpack-plugin/node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "dev": true
+ },
+ "node_modules/terser-webpack-plugin/node_modules/schema-utils": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
+ "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.1.0",
+ "ajv-errors": "^1.0.0",
+ "ajv-keywords": "^3.1.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/terser-webpack-plugin/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/terser-webpack-plugin/node_modules/terser": {
+ "version": "4.8.0",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz",
+ "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==",
+ "dev": true,
+ "dependencies": {
+ "commander": "^2.20.0",
+ "source-map": "~0.6.1",
+ "source-map-support": "~0.5.12"
+ },
+ "bin": {
+ "terser": "bin/terser"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/terser/node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "dev": true
+ },
+ "node_modules/terser/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/test-exclude": {
+ "version": "5.2.3",
+ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz",
+ "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3",
+ "minimatch": "^3.0.4",
+ "read-pkg-up": "^4.0.0",
+ "require-main-filename": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+ "dev": true
+ },
+ "node_modules/throat": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz",
+ "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=",
+ "dev": true
+ },
+ "node_modules/through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
+ "dev": true
+ },
+ "node_modules/through2": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+ "dev": true,
+ "dependencies": {
+ "readable-stream": "~2.3.6",
+ "xtend": "~4.0.1"
+ }
+ },
+ "node_modules/thunky": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
+ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==",
+ "dev": true
+ },
+ "node_modules/timers-browserify": {
+ "version": "2.0.11",
+ "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz",
+ "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==",
+ "dev": true,
+ "dependencies": {
+ "setimmediate": "^1.0.4"
+ },
+ "engines": {
+ "node": ">=0.6.0"
+ }
+ },
+ "node_modules/timsort": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz",
+ "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=",
+ "dev": true
+ },
+ "node_modules/tmpl": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz",
+ "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=",
+ "dev": true
+ },
+ "node_modules/to-arraybuffer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
+ "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
+ "dev": true
+ },
+ "node_modules/to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "dev": true,
+ "dependencies": {
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/to-object-path/node_modules/kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/to-regex": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "dev": true,
+ "dependencies": {
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "regex-not": "^1.0.2",
+ "safe-regex": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "dev": true,
+ "dependencies": {
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/toidentifier": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
+ "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/toposort": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz",
+ "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=",
+ "dev": true
+ },
+ "node_modules/tough-cookie": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+ "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+ "dev": true,
+ "dependencies": {
+ "psl": "^1.1.28",
+ "punycode": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/tr46": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz",
+ "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==",
+ "dev": true,
+ "dependencies": {
+ "punycode": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/trim-newlines": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
+ "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/true-case-path": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz",
+ "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.2"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "1.13.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
+ "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
+ "dev": true
+ },
+ "node_modules/tsutils": {
+ "version": "3.17.1",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz",
+ "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^1.8.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/tty-browserify": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
+ "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=",
+ "dev": true
+ },
+ "node_modules/tunnel-agent": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/tweetnacl": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
+ "dev": true
+ },
+ "node_modules/type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/type-is": {
+ "version": "1.6.18",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "dev": true,
+ "dependencies": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
+ "dev": true
+ },
+ "node_modules/typescript": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.3.tgz",
+ "integrity": "sha512-tEu6DGxGgRJPb/mVPIZ48e69xCn2yRmCgYmDugAVwmJ6o+0u1RI18eO7E7WBTLYLaEVVOhwQmcdhQHweux/WPg==",
+ "dev": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=4.2.0"
+ }
+ },
+ "node_modules/typeson": {
+ "version": "5.18.2",
+ "resolved": "https://registry.npmjs.org/typeson/-/typeson-5.18.2.tgz",
+ "integrity": "sha512-Vetd+OGX05P4qHyHiSLdHZ5Z5GuQDrHHwSdjkqho9NSCYVSLSfRMjklD/unpHH8tXBR9Z/R05rwJSuMpMFrdsw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.1.14"
+ }
+ },
+ "node_modules/typeson-registry": {
+ "version": "1.0.0-alpha.38",
+ "resolved": "https://registry.npmjs.org/typeson-registry/-/typeson-registry-1.0.0-alpha.38.tgz",
+ "integrity": "sha512-6lt2IhbNT9hyow5hljZqjWtVDXBIaC1X8bBGlBva0Pod2f42g23bVqww09ruquwSC48I8BSSCPi+B2dFHM5ihQ==",
+ "dev": true,
+ "dependencies": {
+ "base64-arraybuffer-es6": "^0.6.0",
+ "typeson": "^5.18.2",
+ "whatwg-url": "^8.1.0"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/uglify-js": {
+ "version": "3.4.10",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz",
+ "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==",
+ "dev": true,
+ "dependencies": {
+ "commander": "~2.19.0",
+ "source-map": "~0.6.1"
+ },
+ "bin": {
+ "uglifyjs": "bin/uglifyjs"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/uglify-js/node_modules/commander": {
+ "version": "2.19.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz",
+ "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==",
+ "dev": true
+ },
+ "node_modules/uglify-js/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/unbox-primitive": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz",
+ "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.1",
+ "has-bigints": "^1.0.1",
+ "has-symbols": "^1.0.2",
+ "which-boxed-primitive": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/unicode-canonical-property-names-ecmascript": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
+ "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-ecmascript": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz",
+ "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==",
+ "dev": true,
+ "dependencies": {
+ "unicode-canonical-property-names-ecmascript": "^1.0.4",
+ "unicode-property-aliases-ecmascript": "^1.0.4"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-value-ecmascript": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz",
+ "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-property-aliases-ecmascript": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz",
+ "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/union-value": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
+ "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
+ "dev": true,
+ "dependencies": {
+ "arr-union": "^3.1.0",
+ "get-value": "^2.0.6",
+ "is-extendable": "^0.1.1",
+ "set-value": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/uniq": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
+ "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=",
+ "dev": true
+ },
+ "node_modules/uniqs": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz",
+ "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=",
+ "dev": true
+ },
+ "node_modules/unique-filename": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
+ "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
+ "dev": true,
+ "dependencies": {
+ "unique-slug": "^2.0.0"
+ }
+ },
+ "node_modules/unique-slug": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz",
+ "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==",
+ "dev": true,
+ "dependencies": {
+ "imurmurhash": "^0.1.4"
+ }
+ },
+ "node_modules/universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/unquote": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz",
+ "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=",
+ "dev": true
+ },
+ "node_modules/unset-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+ "dev": true,
+ "dependencies": {
+ "has-value": "^0.3.1",
+ "isobject": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/unset-value/node_modules/has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+ "dev": true,
+ "dependencies": {
+ "get-value": "^2.0.3",
+ "has-values": "^0.1.4",
+ "isobject": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/unset-value/node_modules/has-value/node_modules/isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "dependencies": {
+ "isarray": "1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/unset-value/node_modules/has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/upath": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
+ "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
+ "dev": true,
+ "engines": {
+ "node": ">=4",
+ "yarn": "*"
+ }
+ },
+ "node_modules/upper-case": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz",
+ "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=",
+ "dev": true
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz",
+ "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==",
+ "dev": true,
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+ "dev": true
+ },
+ "node_modules/url": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
+ "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
+ "dev": true,
+ "dependencies": {
+ "punycode": "1.3.2",
+ "querystring": "0.2.0"
+ }
+ },
+ "node_modules/url-parse": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz",
+ "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==",
+ "dev": true,
+ "dependencies": {
+ "querystringify": "^2.1.1",
+ "requires-port": "^1.0.0"
+ }
+ },
+ "node_modules/url/node_modules/punycode": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
+ "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
+ "dev": true
+ },
+ "node_modules/use": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
+ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/util": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz",
+ "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "2.0.3"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+ "dev": true
+ },
+ "node_modules/util.promisify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz",
+ "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==",
+ "dev": true,
+ "dependencies": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.2",
+ "has-symbols": "^1.0.1",
+ "object.getownpropertydescriptors": "^2.1.0"
+ }
+ },
+ "node_modules/util/node_modules/inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "node_modules/utila": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz",
+ "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=",
+ "dev": true
+ },
+ "node_modules/utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/uuid": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
+ "dev": true,
+ "bin": {
+ "uuid": "bin/uuid"
+ }
+ },
+ "node_modules/v8-compile-cache": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz",
+ "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==",
+ "dev": true
+ },
+ "node_modules/validate-npm-package-license": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+ "dev": true,
+ "dependencies": {
+ "spdx-correct": "^3.0.0",
+ "spdx-expression-parse": "^3.0.0"
+ }
+ },
+ "node_modules/vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/vendors": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz",
+ "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==",
+ "dev": true
+ },
+ "node_modules/verror": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+ "dev": true,
+ "engines": [
+ "node >=0.6.0"
+ ],
+ "dependencies": {
+ "assert-plus": "^1.0.0",
+ "core-util-is": "1.0.2",
+ "extsprintf": "^1.2.0"
+ }
+ },
+ "node_modules/vm-browserify": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
+ "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==",
+ "dev": true
+ },
+ "node_modules/w3c-hr-time": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
+ "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==",
+ "dev": true,
+ "dependencies": {
+ "browser-process-hrtime": "^1.0.0"
+ }
+ },
+ "node_modules/walker": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz",
+ "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=",
+ "dev": true,
+ "dependencies": {
+ "makeerror": "1.0.x"
+ }
+ },
+ "node_modules/watchpack": {
+ "version": "1.7.4",
+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz",
+ "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "neo-async": "^2.5.0"
+ },
+ "optionalDependencies": {
+ "chokidar": "^3.4.1",
+ "watchpack-chokidar2": "^2.0.0"
+ }
+ },
+ "node_modules/watchpack-chokidar2": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz",
+ "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "chokidar": "^2.1.8"
+ },
+ "engines": {
+ "node": "<8.10.0"
+ }
+ },
+ "node_modules/watchpack/node_modules/anymatch": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
+ "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/watchpack/node_modules/binary-extensions": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz",
+ "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/watchpack/node_modules/braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/watchpack/node_modules/chokidar": {
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz",
+ "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "anymatch": "~3.1.1",
+ "braces": "~3.0.2",
+ "fsevents": "~2.1.2",
+ "glob-parent": "~5.1.0",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.4.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ }
+ },
+ "node_modules/watchpack/node_modules/fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/watchpack/node_modules/fsevents": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
+ "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/watchpack/node_modules/glob-parent": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
+ "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/watchpack/node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/watchpack/node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/watchpack/node_modules/readdirp": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz",
+ "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/watchpack/node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/wbuf": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
+ "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
+ "dev": true,
+ "dependencies": {
+ "minimalistic-assert": "^1.0.0"
+ }
+ },
+ "node_modules/webidl-conversions": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
+ "dev": true
+ },
+ "node_modules/webpack": {
+ "version": "4.44.2",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz",
+ "integrity": "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.9.0",
+ "@webassemblyjs/helper-module-context": "1.9.0",
+ "@webassemblyjs/wasm-edit": "1.9.0",
+ "@webassemblyjs/wasm-parser": "1.9.0",
+ "acorn": "^6.4.1",
+ "ajv": "^6.10.2",
+ "ajv-keywords": "^3.4.1",
+ "chrome-trace-event": "^1.0.2",
+ "enhanced-resolve": "^4.3.0",
+ "eslint-scope": "^4.0.3",
+ "json-parse-better-errors": "^1.0.2",
+ "loader-runner": "^2.4.0",
+ "loader-utils": "^1.2.3",
+ "memory-fs": "^0.4.1",
+ "micromatch": "^3.1.10",
+ "mkdirp": "^0.5.3",
+ "neo-async": "^2.6.1",
+ "node-libs-browser": "^2.2.1",
+ "schema-utils": "^1.0.0",
+ "tapable": "^1.1.3",
+ "terser-webpack-plugin": "^1.4.3",
+ "watchpack": "^1.7.4",
+ "webpack-sources": "^1.4.1"
+ },
+ "bin": {
+ "webpack": "bin/webpack.js"
+ },
+ "engines": {
+ "node": ">=6.11.5"
+ }
+ },
+ "node_modules/webpack-cli": {
+ "version": "3.3.12",
+ "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz",
+ "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.4.2",
+ "cross-spawn": "^6.0.5",
+ "enhanced-resolve": "^4.1.1",
+ "findup-sync": "^3.0.0",
+ "global-modules": "^2.0.0",
+ "import-local": "^2.0.0",
+ "interpret": "^1.4.0",
+ "loader-utils": "^1.4.0",
+ "supports-color": "^6.1.0",
+ "v8-compile-cache": "^2.1.1",
+ "yargs": "^13.3.2"
+ },
+ "bin": {
+ "webpack-cli": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=6.11.5"
+ }
+ },
+ "node_modules/webpack-cli/node_modules/supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/webpack-dev-middleware": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz",
+ "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==",
+ "dev": true,
+ "dependencies": {
+ "memory-fs": "^0.4.1",
+ "mime": "^2.4.4",
+ "mkdirp": "^0.5.1",
+ "range-parser": "^1.2.1",
+ "webpack-log": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/webpack-dev-middleware/node_modules/mime": {
+ "version": "2.4.6",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz",
+ "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==",
+ "dev": true,
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/webpack-dev-server": {
+ "version": "3.11.0",
+ "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz",
+ "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==",
+ "dev": true,
+ "dependencies": {
+ "ansi-html": "0.0.7",
+ "bonjour": "^3.5.0",
+ "chokidar": "^2.1.8",
+ "compression": "^1.7.4",
+ "connect-history-api-fallback": "^1.6.0",
+ "debug": "^4.1.1",
+ "del": "^4.1.1",
+ "express": "^4.17.1",
+ "html-entities": "^1.3.1",
+ "http-proxy-middleware": "0.19.1",
+ "import-local": "^2.0.0",
+ "internal-ip": "^4.3.0",
+ "ip": "^1.1.5",
+ "is-absolute-url": "^3.0.3",
+ "killable": "^1.0.1",
+ "loglevel": "^1.6.8",
+ "opn": "^5.5.0",
+ "p-retry": "^3.0.1",
+ "portfinder": "^1.0.26",
+ "schema-utils": "^1.0.0",
+ "selfsigned": "^1.10.7",
+ "semver": "^6.3.0",
+ "serve-index": "^1.9.1",
+ "sockjs": "0.3.20",
+ "sockjs-client": "1.4.0",
+ "spdy": "^4.0.2",
+ "strip-ansi": "^3.0.1",
+ "supports-color": "^6.1.0",
+ "url": "^0.11.0",
+ "webpack-dev-middleware": "^3.7.2",
+ "webpack-log": "^2.0.0",
+ "ws": "^6.2.1",
+ "yargs": "^13.3.2"
+ },
+ "bin": {
+ "webpack-dev-server": "bin/webpack-dev-server.js"
+ },
+ "engines": {
+ "node": ">= 6.11.5"
+ }
+ },
+ "node_modules/webpack-dev-server/node_modules/debug": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
+ "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/webpack-dev-server/node_modules/is-absolute-url": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz",
+ "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/webpack-dev-server/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/webpack-dev-server/node_modules/schema-utils": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
+ "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.1.0",
+ "ajv-errors": "^1.0.0",
+ "ajv-keywords": "^3.1.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/webpack-dev-server/node_modules/semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/webpack-dev-server/node_modules/supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/webpack-dev-server/node_modules/ws": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz",
+ "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==",
+ "dev": true,
+ "dependencies": {
+ "async-limiter": "~1.0.0"
+ }
+ },
+ "node_modules/webpack-log": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz",
+ "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==",
+ "dev": true,
+ "dependencies": {
+ "ansi-colors": "^3.0.0",
+ "uuid": "^3.3.2"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/webpack-sources": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz",
+ "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==",
+ "dev": true,
+ "dependencies": {
+ "source-list-map": "^2.0.0",
+ "source-map": "~0.6.1"
+ }
+ },
+ "node_modules/webpack-sources/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/webpack/node_modules/acorn": {
+ "version": "6.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz",
+ "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/webpack/node_modules/eslint-scope": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz",
+ "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.1.0",
+ "estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/webpack/node_modules/schema-utils": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
+ "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.1.0",
+ "ajv-errors": "^1.0.0",
+ "ajv-keywords": "^3.1.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/websocket-driver": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz",
+ "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=",
+ "dev": true,
+ "dependencies": {
+ "websocket-extensions": ">=0.1.1"
+ },
+ "engines": {
+ "node": ">=0.6.0"
+ }
+ },
+ "node_modules/websocket-extensions": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
+ "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/whatwg-encoding": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
+ "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==",
+ "dev": true,
+ "dependencies": {
+ "iconv-lite": "0.4.24"
+ }
+ },
+ "node_modules/whatwg-mimetype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz",
+ "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==",
+ "dev": true
+ },
+ "node_modules/whatwg-url": {
+ "version": "8.2.2",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.2.2.tgz",
+ "integrity": "sha512-PcVnO6NiewhkmzV0qn7A+UZ9Xx4maNTI+O+TShmfE4pqjoCMwUMjkvoNhNHPTvgR7QH9Xt3R13iHuWy2sToFxQ==",
+ "dev": true,
+ "dependencies": {
+ "lodash.sortby": "^4.7.0",
+ "tr46": "^2.0.2",
+ "webidl-conversions": "^6.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/whatwg-url/node_modules/webidl-conversions": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
+ "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.4"
+ }
+ },
+ "node_modules/which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "which": "bin/which"
+ }
+ },
+ "node_modules/which-boxed-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
+ "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+ "dev": true,
+ "dependencies": {
+ "is-bigint": "^1.0.1",
+ "is-boolean-object": "^1.1.0",
+ "is-number-object": "^1.0.4",
+ "is-string": "^1.0.5",
+ "is-symbol": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-module": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
+ "dev": true
+ },
+ "node_modules/wide-align": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
+ "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^1.0.2 || 2"
+ }
+ },
+ "node_modules/wide-align/node_modules/ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/wide-align/node_modules/is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/wide-align/node_modules/string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "dev": true,
+ "dependencies": {
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/wide-align/node_modules/strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/worker-farm": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz",
+ "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==",
+ "dev": true,
+ "dependencies": {
+ "errno": "~0.1.7"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
+ "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^3.2.0",
+ "string-width": "^3.0.0",
+ "strip-ansi": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/ansi-regex": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/emoji-regex": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+ "dev": true
+ },
+ "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/string-width": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+ "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^7.0.1",
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/strip-ansi": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ },
+ "node_modules/write-file-atomic": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz",
+ "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.1.11",
+ "imurmurhash": "^0.1.4",
+ "signal-exit": "^3.0.2"
+ }
+ },
+ "node_modules/ws": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz",
+ "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==",
+ "dev": true,
+ "dependencies": {
+ "async-limiter": "~1.0.0"
+ }
+ },
+ "node_modules/xml-name-validator": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
+ "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==",
+ "dev": true
+ },
+ "node_modules/xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4"
+ }
+ },
+ "node_modules/y18n": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
+ "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
+ "dev": true
+ },
+ "node_modules/yallist": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+ "dev": true
+ },
+ "node_modules/yaml": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz",
+ "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/yargs": {
+ "version": "13.3.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
+ "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
+ "dev": true,
+ "dependencies": {
+ "cliui": "^5.0.0",
+ "find-up": "^3.0.0",
+ "get-caller-file": "^2.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^2.0.0",
+ "set-blocking": "^2.0.0",
+ "string-width": "^3.0.0",
+ "which-module": "^2.0.0",
+ "y18n": "^4.0.0",
+ "yargs-parser": "^13.1.2"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "13.1.2",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
+ "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
+ "dev": true,
+ "dependencies": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ }
+ },
+ "node_modules/yargs/node_modules/ansi-regex": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/yargs/node_modules/emoji-regex": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+ "dev": true
+ },
+ "node_modules/yargs/node_modules/is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/yargs/node_modules/string-width": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+ "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^7.0.1",
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/yargs/node_modules/strip-ansi": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ }
+ },
"dependencies": {
"@babel/cli": {
"version": "7.11.6",
@@ -1156,9 +17696,9 @@
}
},
"@eslint/eslintrc": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.1.3.tgz",
- "integrity": "sha512-4YVwPkANLeNtRjMekzux1ci8hIaH5eGKktGqR0d3LWsKNn5B2X/1Z6Trxy7jQXl9EBGE6Yj02O+t09FMeRllaA==",
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.2.tgz",
+ "integrity": "sha512-EfB5OHNYp1F4px/LI/FEnGylop7nOqkQ1LRzCM0KccA2U8tvV8w01KBv37LbO7nW4H+YhKyo2LcJhRwjjV17QQ==",
"dev": true,
"requires": {
"ajv": "^6.12.4",
@@ -1174,9 +17714,9 @@
},
"dependencies": {
"debug": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
- "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
"dev": true,
"requires": {
"ms": "2.1.2"
@@ -1421,28 +17961,28 @@
}
},
"@nodelib/fs.scandir": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz",
- "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==",
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz",
+ "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==",
"dev": true,
"requires": {
- "@nodelib/fs.stat": "2.0.3",
+ "@nodelib/fs.stat": "2.0.4",
"run-parallel": "^1.1.9"
}
},
"@nodelib/fs.stat": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz",
- "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==",
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz",
+ "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==",
"dev": true
},
"@nodelib/fs.walk": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz",
- "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==",
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz",
+ "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==",
"dev": true,
"requires": {
- "@nodelib/fs.scandir": "2.1.3",
+ "@nodelib/fs.scandir": "2.1.4",
"fastq": "^1.6.0"
}
},
@@ -1487,12 +18027,6 @@
"@babel/types": "^7.3.0"
}
},
- "@types/color-name": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
- "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==",
- "dev": true
- },
"@types/glob": {
"version": "7.1.3",
"resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz",
@@ -1528,6 +18062,146 @@
"@types/istanbul-lib-report": "*"
}
},
+ "@types/jest": {
+ "version": "26.0.23",
+ "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.23.tgz",
+ "integrity": "sha512-ZHLmWMJ9jJ9PTiT58juykZpL7KjwJywFN3Rr2pTSkyQfydf/rk22yS7W8p5DaVUMQ2BQC7oYiU3FjbTM/mYrOA==",
+ "dev": true,
+ "requires": {
+ "jest-diff": "^26.0.0",
+ "pretty-format": "^26.0.0"
+ },
+ "dependencies": {
+ "@jest/types": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
+ "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^15.0.0",
+ "chalk": "^4.0.0"
+ }
+ },
+ "@types/istanbul-reports": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz",
+ "integrity": "sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==",
+ "dev": true,
+ "requires": {
+ "@types/istanbul-lib-report": "*"
+ }
+ },
+ "@types/yargs": {
+ "version": "15.0.13",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.13.tgz",
+ "integrity": "sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==",
+ "dev": true,
+ "requires": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
+ "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "diff-sequences": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-26.6.2.tgz",
+ "integrity": "sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "jest-diff": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-26.6.2.tgz",
+ "integrity": "sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==",
+ "dev": true,
+ "requires": {
+ "chalk": "^4.0.0",
+ "diff-sequences": "^26.6.2",
+ "jest-get-type": "^26.3.0",
+ "pretty-format": "^26.6.2"
+ }
+ },
+ "jest-get-type": {
+ "version": "26.3.0",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-26.3.0.tgz",
+ "integrity": "sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==",
+ "dev": true
+ },
+ "pretty-format": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz",
+ "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==",
+ "dev": true,
+ "requires": {
+ "@jest/types": "^26.6.2",
+ "ansi-regex": "^5.0.0",
+ "ansi-styles": "^4.0.0",
+ "react-is": "^17.0.1"
+ }
+ },
+ "react-is": {
+ "version": "17.0.2",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
+ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
"@types/json-schema": {
"version": "7.0.6",
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz",
@@ -1546,6 +18220,12 @@
"integrity": "sha512-jiE3QIxJ8JLNcb1Ps6rDbysDhN4xa8DJJvuC9prr6w+1tIh+QAbYyNF3tyiZNLDBIuBCf4KEcV2UvQm/V60xfA==",
"dev": true
},
+ "@types/parse-json": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
+ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
+ "dev": true
+ },
"@types/q": {
"version": "1.5.4",
"resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.4.tgz",
@@ -1574,13 +18254,13 @@
"dev": true
},
"@typescript-eslint/eslint-plugin": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.3.0.tgz",
- "integrity": "sha512-RqEcaHuEKnn3oPFislZ6TNzsBLqpZjN93G69SS+laav/I8w/iGMuMq97P0D2/2/kW4SCebHggqhbcCfbDaaX+g==",
+ "version": "4.11.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.11.1.tgz",
+ "integrity": "sha512-fABclAX2QIEDmTMk6Yd7Muv1CzFLwWM4505nETzRHpP3br6jfahD9UUJkhnJ/g2m7lwfz8IlswcwGGPGiq9exw==",
"dev": true,
"requires": {
- "@typescript-eslint/experimental-utils": "4.3.0",
- "@typescript-eslint/scope-manager": "4.3.0",
+ "@typescript-eslint/experimental-utils": "4.11.1",
+ "@typescript-eslint/scope-manager": "4.11.1",
"debug": "^4.1.1",
"functional-red-black-tree": "^1.0.1",
"regexpp": "^3.0.0",
@@ -1589,14 +18269,23 @@
},
"dependencies": {
"debug": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
- "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
"dev": true,
"requires": {
"ms": "2.1.2"
}
},
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
@@ -1604,43 +18293,52 @@
"dev": true
},
"semver": {
- "version": "7.3.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
- "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
+ "version": "7.3.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
+ "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ },
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
"dev": true
}
}
},
"@typescript-eslint/experimental-utils": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.3.0.tgz",
- "integrity": "sha512-cmmIK8shn3mxmhpKfzMMywqiEheyfXLV/+yPDnOTvQX/ztngx7Lg/OD26J8gTZfkLKUmaEBxO2jYP3keV7h2OQ==",
+ "version": "4.11.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.11.1.tgz",
+ "integrity": "sha512-mAlWowT4A6h0TC9F+J5pdbEhjNiEMO+kqPKQ4sc3fVieKL71dEqfkKgtcFVSX3cjSBwYwhImaQ/mXQF0oaI38g==",
"dev": true,
"requires": {
"@types/json-schema": "^7.0.3",
- "@typescript-eslint/scope-manager": "4.3.0",
- "@typescript-eslint/types": "4.3.0",
- "@typescript-eslint/typescript-estree": "4.3.0",
+ "@typescript-eslint/scope-manager": "4.11.1",
+ "@typescript-eslint/types": "4.11.1",
+ "@typescript-eslint/typescript-estree": "4.11.1",
"eslint-scope": "^5.0.0",
"eslint-utils": "^2.0.0"
}
},
"@typescript-eslint/parser": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.3.0.tgz",
- "integrity": "sha512-JyfRnd72qRuUwItDZ00JNowsSlpQGeKfl9jxwO0FHK1qQ7FbYdoy5S7P+5wh1ISkT2QyAvr2pc9dAemDxzt75g==",
+ "version": "4.11.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.11.1.tgz",
+ "integrity": "sha512-BJ3jwPQu1jeynJ5BrjLuGfK/UJu6uwHxJ/di7sanqmUmxzmyIcd3vz58PMR7wpi8k3iWq2Q11KMYgZbUpRoIPw==",
"dev": true,
"requires": {
- "@typescript-eslint/scope-manager": "4.3.0",
- "@typescript-eslint/types": "4.3.0",
- "@typescript-eslint/typescript-estree": "4.3.0",
+ "@typescript-eslint/scope-manager": "4.11.1",
+ "@typescript-eslint/types": "4.11.1",
+ "@typescript-eslint/typescript-estree": "4.11.1",
"debug": "^4.1.1"
},
"dependencies": {
"debug": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
- "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
"dev": true,
"requires": {
"ms": "2.1.2"
@@ -1655,29 +18353,29 @@
}
},
"@typescript-eslint/scope-manager": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.3.0.tgz",
- "integrity": "sha512-cTeyP5SCNE8QBRfc+Lgh4Xpzje46kNUhXYfc3pQWmJif92sjrFuHT9hH4rtOkDTo/si9Klw53yIr+djqGZS1ig==",
+ "version": "4.11.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.11.1.tgz",
+ "integrity": "sha512-Al2P394dx+kXCl61fhrrZ1FTI7qsRDIUiVSuN6rTwss6lUn8uVO2+nnF4AvO0ug8vMsy3ShkbxLu/uWZdTtJMQ==",
"dev": true,
"requires": {
- "@typescript-eslint/types": "4.3.0",
- "@typescript-eslint/visitor-keys": "4.3.0"
+ "@typescript-eslint/types": "4.11.1",
+ "@typescript-eslint/visitor-keys": "4.11.1"
}
},
"@typescript-eslint/types": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.3.0.tgz",
- "integrity": "sha512-Cx9TpRvlRjOppGsU6Y6KcJnUDOelja2NNCX6AZwtVHRzaJkdytJWMuYiqi8mS35MRNA3cJSwDzXePfmhU6TANw==",
+ "version": "4.11.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.11.1.tgz",
+ "integrity": "sha512-5kvd38wZpqGY4yP/6W3qhYX6Hz0NwUbijVsX2rxczpY6OXaMxh0+5E5uLJKVFwaBM7PJe1wnMym85NfKYIh6CA==",
"dev": true
},
"@typescript-eslint/typescript-estree": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.3.0.tgz",
- "integrity": "sha512-ZAI7xjkl+oFdLV/COEz2tAbQbR3XfgqHEGy0rlUXzfGQic6EBCR4s2+WS3cmTPG69aaZckEucBoTxW9PhzHxxw==",
+ "version": "4.11.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.11.1.tgz",
+ "integrity": "sha512-tC7MKZIMRTYxQhrVAFoJq/DlRwv1bnqA4/S2r3+HuHibqvbrPcyf858lNzU7bFmy4mLeIHFYr34ar/1KumwyRw==",
"dev": true,
"requires": {
- "@typescript-eslint/types": "4.3.0",
- "@typescript-eslint/visitor-keys": "4.3.0",
+ "@typescript-eslint/types": "4.11.1",
+ "@typescript-eslint/visitor-keys": "4.11.1",
"debug": "^4.1.1",
"globby": "^11.0.1",
"is-glob": "^4.0.1",
@@ -1687,14 +18385,23 @@
},
"dependencies": {
"debug": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
- "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
"dev": true,
"requires": {
"ms": "2.1.2"
}
},
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
@@ -1702,20 +18409,29 @@
"dev": true
},
"semver": {
- "version": "7.3.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
- "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
+ "version": "7.3.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
+ "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ },
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
"dev": true
}
}
},
"@typescript-eslint/visitor-keys": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.3.0.tgz",
- "integrity": "sha512-xZxkuR7XLM6RhvLkgv9yYlTcBHnTULzfnw4i6+z2TGBLy9yljAypQaZl9c3zFvy7PNI7fYWyvKYtohyF8au3cw==",
+ "version": "4.11.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.11.1.tgz",
+ "integrity": "sha512-IrlBhD9bm4bdYcS8xpWarazkKXlE7iYb1HzRuyBP114mIaj5DJPo11Us1HgH60dTt41TCZXMaTCAW+OILIYPOg==",
"dev": true,
"requires": {
- "@typescript-eslint/types": "4.3.0",
+ "@typescript-eslint/types": "4.11.1",
"eslint-visitor-keys": "^2.0.0"
}
},
@@ -1929,9 +18645,9 @@
}
},
"acorn": {
- "version": "7.4.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz",
- "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==",
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
"dev": true
},
"acorn-globals": {
@@ -2240,6 +18956,12 @@
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
"dev": true
},
+ "at-least-node": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
+ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
+ "dev": true
+ },
"atob": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
@@ -2985,6 +19707,16 @@
"unset-value": "^1.0.0"
}
},
+ "call-bind": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.0.2"
+ }
+ },
"caller-callsite": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz",
@@ -3731,13 +20463,13 @@
"dev": true
},
"cssnano": {
- "version": "4.1.10",
- "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz",
- "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==",
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz",
+ "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==",
"dev": true,
"requires": {
"cosmiconfig": "^5.0.0",
- "cssnano-preset-default": "^4.0.7",
+ "cssnano-preset-default": "^4.0.8",
"is-resolvable": "^1.0.0",
"postcss": "^7.0.0"
},
@@ -3771,9 +20503,9 @@
}
},
"cssnano-preset-default": {
- "version": "4.0.7",
- "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz",
- "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==",
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz",
+ "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==",
"dev": true,
"requires": {
"css-declaration-sorter": "^4.0.1",
@@ -3804,7 +20536,7 @@
"postcss-ordered-values": "^4.1.2",
"postcss-reduce-initial": "^4.0.3",
"postcss-reduce-transforms": "^4.0.2",
- "postcss-svgo": "^4.0.2",
+ "postcss-svgo": "^4.0.3",
"postcss-unique-selectors": "^4.0.1"
},
"dependencies": {
@@ -3892,28 +20624,28 @@
"dev": true
},
"csso": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz",
- "integrity": "sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==",
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz",
+ "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==",
"dev": true,
"requires": {
- "css-tree": "1.0.0-alpha.39"
+ "css-tree": "^1.1.2"
},
"dependencies": {
"css-tree": {
- "version": "1.0.0-alpha.39",
- "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz",
- "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==",
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
+ "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
"dev": true,
"requires": {
- "mdn-data": "2.0.6",
+ "mdn-data": "2.0.14",
"source-map": "^0.6.1"
}
},
"mdn-data": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz",
- "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==",
+ "version": "2.0.14",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
+ "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
"dev": true
},
"source-map": {
@@ -4037,6 +20769,12 @@
"integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
"dev": true
},
+ "deepmerge": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
+ "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
+ "dev": true
+ },
"default-gateway": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz",
@@ -4375,18 +21113,18 @@
"dev": true
},
"elliptic": {
- "version": "6.5.3",
- "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz",
- "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==",
+ "version": "6.5.4",
+ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
+ "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
"dev": true,
"requires": {
- "bn.js": "^4.4.0",
- "brorand": "^1.0.1",
+ "bn.js": "^4.11.9",
+ "brorand": "^1.1.0",
"hash.js": "^1.0.0",
- "hmac-drbg": "^1.0.0",
- "inherits": "^2.0.1",
- "minimalistic-assert": "^1.0.0",
- "minimalistic-crypto-utils": "^1.0.0"
+ "hmac-drbg": "^1.0.1",
+ "inherits": "^2.0.4",
+ "minimalistic-assert": "^1.0.1",
+ "minimalistic-crypto-utils": "^1.0.1"
},
"dependencies": {
"bn.js": {
@@ -4398,9 +21136,9 @@
}
},
"emoji-regex": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
- "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"dev": true
},
"emojis-list": {
@@ -4489,23 +21227,27 @@
}
},
"es-abstract": {
- "version": "1.18.0-next.0",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.0.tgz",
- "integrity": "sha512-elZXTZXKn51hUBdJjSZGYRujuzilgXo8vSPQzjGYXLvSlGiCo8VO8ZGV3kjo9a0WNJJ57hENagwbtlRuHuzkcQ==",
+ "version": "1.18.0",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz",
+ "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==",
"dev": true,
"requires": {
+ "call-bind": "^1.0.2",
"es-to-primitive": "^1.2.1",
"function-bind": "^1.1.1",
+ "get-intrinsic": "^1.1.1",
"has": "^1.0.3",
- "has-symbols": "^1.0.1",
- "is-callable": "^1.2.0",
- "is-negative-zero": "^2.0.0",
- "is-regex": "^1.1.1",
- "object-inspect": "^1.8.0",
+ "has-symbols": "^1.0.2",
+ "is-callable": "^1.2.3",
+ "is-negative-zero": "^2.0.1",
+ "is-regex": "^1.1.2",
+ "is-string": "^1.0.5",
+ "object-inspect": "^1.9.0",
"object-keys": "^1.1.1",
- "object.assign": "^4.1.0",
- "string.prototype.trimend": "^1.0.1",
- "string.prototype.trimstart": "^1.0.1"
+ "object.assign": "^4.1.2",
+ "string.prototype.trimend": "^1.0.4",
+ "string.prototype.trimstart": "^1.0.4",
+ "unbox-primitive": "^1.0.0"
}
},
"es-to-primitive": {
@@ -4576,13 +21318,13 @@
}
},
"eslint": {
- "version": "7.10.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.10.0.tgz",
- "integrity": "sha512-BDVffmqWl7JJXqCjAK6lWtcQThZB/aP1HXSH1JKwGwv0LQEdvpR7qzNrUT487RM39B5goWuboFad5ovMBmD8yA==",
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.16.0.tgz",
+ "integrity": "sha512-iVWPS785RuDA4dWuhhgXTNrGxHHK3a8HLSMBgbbU59ruJDubUraXN8N5rn7kb8tG6sjg74eE0RA3YWT51eusEw==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.0.0",
- "@eslint/eslintrc": "^0.1.3",
+ "@eslint/eslintrc": "^0.2.2",
"ajv": "^6.10.0",
"chalk": "^4.0.0",
"cross-spawn": "^7.0.2",
@@ -4591,11 +21333,11 @@
"enquirer": "^2.3.5",
"eslint-scope": "^5.1.1",
"eslint-utils": "^2.1.0",
- "eslint-visitor-keys": "^1.3.0",
- "espree": "^7.3.0",
+ "eslint-visitor-keys": "^2.0.0",
+ "espree": "^7.3.1",
"esquery": "^1.2.0",
"esutils": "^2.0.2",
- "file-entry-cache": "^5.0.1",
+ "file-entry-cache": "^6.0.0",
"functional-red-black-tree": "^1.0.1",
"glob-parent": "^5.0.0",
"globals": "^12.1.0",
@@ -4615,7 +21357,7 @@
"semver": "^7.2.1",
"strip-ansi": "^6.0.0",
"strip-json-comments": "^3.1.0",
- "table": "^5.2.3",
+ "table": "^6.0.4",
"text-table": "^0.2.0",
"v8-compile-cache": "^2.0.3"
},
@@ -4627,12 +21369,11 @@
"dev": true
},
"ansi-styles": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
- "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"requires": {
- "@types/color-name": "^1.1.1",
"color-convert": "^2.0.1"
}
},
@@ -4673,20 +21414,14 @@
}
},
"debug": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
- "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+ "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
"dev": true,
"requires": {
"ms": "2.1.2"
}
},
- "eslint-visitor-keys": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
- "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
- "dev": true
- },
"glob-parent": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
@@ -4727,6 +21462,15 @@
"type-check": "~0.4.0"
}
},
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
@@ -4760,10 +21504,13 @@
"dev": true
},
"semver": {
- "version": "7.3.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
- "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
- "dev": true
+ "version": "7.3.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
+ "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
},
"shebang-command": {
"version": "2.0.0",
@@ -4815,6 +21562,12 @@
"requires": {
"isexe": "^2.0.0"
}
+ },
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
}
}
},
@@ -4923,6 +21676,15 @@
"string-natural-compare": "^3.0.1"
}
},
+ "eslint-plugin-jest": {
+ "version": "24.3.6",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.3.6.tgz",
+ "integrity": "sha512-WOVH4TIaBLIeCX576rLcOgjNXqP+jNlCiEmRgFTfQtJ52DpwnIQKAVGlGPAN7CZ33bW6eNfHD6s8ZbEUTQubJg==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/experimental-utils": "^4.0.1"
+ }
+ },
"eslint-scope": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
@@ -4957,13 +21719,13 @@
"dev": true
},
"espree": {
- "version": "7.3.0",
- "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz",
- "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==",
+ "version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
+ "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
"dev": true,
"requires": {
"acorn": "^7.4.0",
- "acorn-jsx": "^5.2.0",
+ "acorn-jsx": "^5.3.1",
"eslint-visitor-keys": "^1.3.0"
},
"dependencies": {
@@ -5403,9 +22165,9 @@
"dev": true
},
"fastq": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz",
- "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==",
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.10.0.tgz",
+ "integrity": "sha512-NL2Qc5L3iQEsyYzweq7qfgy5OtXCmGzGvhElGEd/SoFWEMOEczNh5s5ocaF01HDetxz+p8ecjNPA6cZxxIHmzA==",
"dev": true,
"requires": {
"reusify": "^1.0.4"
@@ -5436,12 +22198,12 @@
"dev": true
},
"file-entry-cache": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
- "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz",
+ "integrity": "sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==",
"dev": true,
"requires": {
- "flat-cache": "^2.0.1"
+ "flat-cache": "^3.0.4"
}
},
"file-loader": {
@@ -5545,20 +22307,30 @@
}
},
"flat-cache": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
- "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
"dev": true,
"requires": {
- "flatted": "^2.0.0",
- "rimraf": "2.6.3",
- "write": "1.0.3"
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
+ },
+ "dependencies": {
+ "rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ }
}
},
"flatted": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz",
- "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.0.tgz",
+ "integrity": "sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA==",
"dev": true
},
"flow-bin": {
@@ -5583,24 +22355,290 @@
"readable-stream": "^2.3.6"
}
},
- "follow-redirects": {
- "version": "1.13.0",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz",
- "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==",
- "dev": true
- },
- "for-in": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
- "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
- "dev": true
- },
- "forever-agent": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
- "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
- "dev": true
- },
+ "follow-redirects": {
+ "version": "1.13.0",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz",
+ "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==",
+ "dev": true
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+ "dev": true
+ },
+ "forever-agent": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
+ "dev": true
+ },
+ "fork-ts-checker-webpack-plugin": {
+ "version": "6.0.8",
+ "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.0.8.tgz",
+ "integrity": "sha512-2K6Ozamm6TSL5heFIwPhX5+VsOBiiKf9PzaPFS7kwzrILKX+jlN3DBQc5v/6YYZ2oKJyImg3bY0/uZc7cDbDYQ==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.8.3",
+ "@types/json-schema": "^7.0.5",
+ "chalk": "^4.1.0",
+ "chokidar": "^3.4.2",
+ "cosmiconfig": "^6.0.0",
+ "deepmerge": "^4.2.2",
+ "fs-extra": "^9.0.0",
+ "memfs": "^3.1.2",
+ "minimatch": "^3.0.4",
+ "schema-utils": "2.7.0",
+ "semver": "^7.3.2",
+ "tapable": "^1.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "anymatch": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
+ "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
+ "dev": true,
+ "requires": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ }
+ },
+ "binary-extensions": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz",
+ "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==",
+ "dev": true
+ },
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "requires": {
+ "fill-range": "^7.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "chokidar": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz",
+ "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==",
+ "dev": true,
+ "requires": {
+ "anymatch": "~3.1.1",
+ "braces": "~3.0.2",
+ "fsevents": "~2.1.2",
+ "glob-parent": "~5.1.0",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.5.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "cosmiconfig": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz",
+ "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==",
+ "dev": true,
+ "requires": {
+ "@types/parse-json": "^4.0.0",
+ "import-fresh": "^3.1.0",
+ "parse-json": "^5.0.0",
+ "path-type": "^4.0.0",
+ "yaml": "^1.7.2"
+ }
+ },
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "requires": {
+ "to-regex-range": "^5.0.1"
+ }
+ },
+ "fs-extra": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz",
+ "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==",
+ "dev": true,
+ "requires": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^1.0.0"
+ }
+ },
+ "fsevents": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
+ "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
+ "dev": true,
+ "optional": true
+ },
+ "glob-parent": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
+ "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
+ "dev": true,
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "requires": {
+ "binary-extensions": "^2.0.0"
+ }
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.6",
+ "universalify": "^2.0.0"
+ },
+ "dependencies": {
+ "universalify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
+ "dev": true
+ }
+ }
+ },
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
+ "parse-json": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz",
+ "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ }
+ },
+ "readdirp": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz",
+ "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==",
+ "dev": true,
+ "requires": {
+ "picomatch": "^2.2.1"
+ }
+ },
+ "schema-utils": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz",
+ "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==",
+ "dev": true,
+ "requires": {
+ "@types/json-schema": "^7.0.4",
+ "ajv": "^6.12.2",
+ "ajv-keywords": "^3.4.1"
+ }
+ },
+ "semver": {
+ "version": "7.3.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
+ "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "^7.0.0"
+ }
+ },
+ "universalify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz",
+ "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==",
+ "dev": true
+ },
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ }
+ }
+ },
"form-data": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
@@ -5654,6 +22692,12 @@
"universalify": "^0.1.0"
}
},
+ "fs-monkey": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.1.tgz",
+ "integrity": "sha512-fcSa+wyTqZa46iWweI7/ZiUfegOZl0SG8+dltIwFXo7+zYU9J9kpS3NB6pZcSlJdhvIwp81Adx2XhZorncxiaA==",
+ "dev": true
+ },
"fs-readdir-recursive": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz",
@@ -5772,6 +22816,17 @@
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
"dev": true
},
+ "get-intrinsic": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
+ "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1"
+ }
+ },
"get-stdin": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
@@ -5963,6 +23018,12 @@
"ansi-regex": "^2.0.0"
}
},
+ "has-bigints": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz",
+ "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==",
+ "dev": true
+ },
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
@@ -5970,9 +23031,9 @@
"dev": true
},
"has-symbols": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
- "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
+ "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
"dev": true
},
"has-unicode": {
@@ -6086,9 +23147,9 @@
}
},
"hosted-git-info": {
- "version": "2.8.8",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
- "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
+ "version": "2.8.9",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
"dev": true
},
"hpack.js": {
@@ -6115,12 +23176,6 @@
"integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=",
"dev": true
},
- "html-comment-regex": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz",
- "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==",
- "dev": true
- },
"html-encoding-sniffer": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz",
@@ -6378,9 +23433,9 @@
"dev": true
},
"import-fresh": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz",
- "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==",
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
"dev": true,
"requires": {
"parent-module": "^1.0.0",
@@ -6447,9 +23502,9 @@
"dev": true
},
"ini": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
- "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
"dev": true
},
"internal-ip": {
@@ -6533,6 +23588,12 @@
"integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
"dev": true
},
+ "is-bigint": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz",
+ "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==",
+ "dev": true
+ },
"is-binary-path": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
@@ -6542,6 +23603,15 @@
"binary-extensions": "^1.0.0"
}
},
+ "is-boolean-object": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz",
+ "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2"
+ }
+ },
"is-buffer": {
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
@@ -6549,9 +23619,9 @@
"dev": true
},
"is-callable": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz",
- "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==",
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz",
+ "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==",
"dev": true
},
"is-ci": {
@@ -6647,9 +23717,9 @@
"dev": true
},
"is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"dev": true
},
"is-generator-fn": {
@@ -6668,9 +23738,9 @@
}
},
"is-negative-zero": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz",
- "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz",
+ "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==",
"dev": true
},
"is-number": {
@@ -6693,6 +23763,12 @@
}
}
},
+ "is-number-object": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz",
+ "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==",
+ "dev": true
+ },
"is-obj": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
@@ -6733,12 +23809,13 @@
}
},
"is-regex": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz",
- "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==",
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz",
+ "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==",
"dev": true,
"requires": {
- "has-symbols": "^1.0.1"
+ "call-bind": "^1.0.2",
+ "has-symbols": "^1.0.2"
}
},
"is-resolvable": {
@@ -6753,14 +23830,11 @@
"integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
"dev": true
},
- "is-svg": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz",
- "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==",
- "dev": true,
- "requires": {
- "html-comment-regex": "^1.1.0"
- }
+ "is-string": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz",
+ "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==",
+ "dev": true
},
"is-symbol": {
"version": "1.0.3",
@@ -7465,6 +24539,12 @@
"integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
"dev": true
},
+ "json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "dev": true
+ },
"json-schema": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
@@ -7584,6 +24664,12 @@
"type-check": "~0.3.2"
}
},
+ "lines-and-columns": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
+ "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=",
+ "dev": true
+ },
"load-json-file": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
@@ -7643,9 +24729,9 @@
}
},
"lodash": {
- "version": "4.17.20",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
- "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"dev": true
},
"lodash.memoize": {
@@ -7770,6 +24856,15 @@
"integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
"dev": true
},
+ "memfs": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.2.0.tgz",
+ "integrity": "sha512-f/xxz2TpdKv6uDn6GtHee8ivFyxwxmPuXatBb1FBwxYNuVpbM3k/Y1Z+vC0mH/dIXXrukYfe3qe5J32Dfjg93A==",
+ "dev": true,
+ "requires": {
+ "fs-monkey": "1.0.1"
+ }
+ },
"memory-fs": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
@@ -8479,9 +25574,9 @@
"dev": true
},
"object-inspect": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz",
- "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==",
+ "version": "1.10.3",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz",
+ "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==",
"dev": true
},
"object-is": {
@@ -8492,27 +25587,6 @@
"requires": {
"define-properties": "^1.1.3",
"es-abstract": "^1.17.5"
- },
- "dependencies": {
- "es-abstract": {
- "version": "1.17.6",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz",
- "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==",
- "dev": true,
- "requires": {
- "es-to-primitive": "^1.2.1",
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.1",
- "is-callable": "^1.2.0",
- "is-regex": "^1.1.0",
- "object-inspect": "^1.7.0",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.0",
- "string.prototype.trimend": "^1.0.1",
- "string.prototype.trimstart": "^1.0.1"
- }
- }
}
},
"object-keys": {
@@ -8531,13 +25605,13 @@
}
},
"object.assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz",
- "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==",
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
+ "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
"dev": true,
"requires": {
+ "call-bind": "^1.0.0",
"define-properties": "^1.1.3",
- "es-abstract": "^1.18.0-next.0",
"has-symbols": "^1.0.1",
"object-keys": "^1.1.1"
}
@@ -8550,27 +25624,6 @@
"requires": {
"define-properties": "^1.1.3",
"es-abstract": "^1.17.0-next.1"
- },
- "dependencies": {
- "es-abstract": {
- "version": "1.17.6",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz",
- "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==",
- "dev": true,
- "requires": {
- "es-to-primitive": "^1.2.1",
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.1",
- "is-callable": "^1.2.0",
- "is-regex": "^1.1.0",
- "object-inspect": "^1.7.0",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.0",
- "string.prototype.trimend": "^1.0.1",
- "string.prototype.trimstart": "^1.0.1"
- }
- }
}
},
"object.pick": {
@@ -8583,36 +25636,15 @@
}
},
"object.values": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz",
- "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==",
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.3.tgz",
+ "integrity": "sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw==",
"dev": true,
"requires": {
+ "call-bind": "^1.0.2",
"define-properties": "^1.1.3",
- "es-abstract": "^1.17.0-next.1",
- "function-bind": "^1.1.1",
+ "es-abstract": "^1.18.0-next.2",
"has": "^1.0.3"
- },
- "dependencies": {
- "es-abstract": {
- "version": "1.17.6",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz",
- "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==",
- "dev": true,
- "requires": {
- "es-to-primitive": "^1.2.1",
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.1",
- "is-callable": "^1.2.0",
- "is-regex": "^1.1.0",
- "object-inspect": "^1.7.0",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.0",
- "string.prototype.trimend": "^1.0.1",
- "string.prototype.trimstart": "^1.0.1"
- }
- }
}
},
"obuf": {
@@ -8655,9 +25687,9 @@
}
},
"optimize-css-assets-webpack-plugin": {
- "version": "5.0.4",
- "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz",
- "integrity": "sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A==",
+ "version": "5.0.6",
+ "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.6.tgz",
+ "integrity": "sha512-JAYw7WrIAIuHWoKeSBB3lJ6ZG9PSDK3JJduv/FMpIY060wvbA8Lqn/TCtxNGICNlg0X5AGshLzIhpYrkltdq+A==",
"dev": true,
"requires": {
"cssnano": "^4.1.10",
@@ -9041,9 +26073,9 @@
}
},
"postcss-calc": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.4.tgz",
- "integrity": "sha512-0I79VRAd1UTkaHzY9w83P39YGO/M3bG7/tNLrHGEunBolfoGM0hSjrGvjoeaj0JE/zIw5GsI2KZ0UwDJqv5hjw==",
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz",
+ "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==",
"dev": true,
"requires": {
"postcss": "^7.0.27",
@@ -10098,12 +27130,11 @@
}
},
"postcss-svgo": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz",
- "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==",
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz",
+ "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==",
"dev": true,
"requires": {
- "is-svg": "^3.0.0",
"postcss": "^7.0.0",
"postcss-value-parser": "^3.0.0",
"svgo": "^1.0.0"
@@ -10590,27 +27621,6 @@
"requires": {
"define-properties": "^1.1.3",
"es-abstract": "^1.17.0-next.1"
- },
- "dependencies": {
- "es-abstract": {
- "version": "1.17.6",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz",
- "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==",
- "dev": true,
- "requires": {
- "es-to-primitive": "^1.2.1",
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.1",
- "is-callable": "^1.2.0",
- "is-regex": "^1.1.0",
- "object-inspect": "^1.7.0",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.0",
- "string.prototype.trimend": "^1.0.1",
- "string.prototype.trimstart": "^1.0.1"
- }
- }
}
},
"regexpp": {
@@ -10885,9 +27895,9 @@
"dev": true
},
"run-parallel": {
- "version": "1.1.9",
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz",
- "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==",
+ "version": "1.1.10",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz",
+ "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==",
"dev": true
},
"run-queue": {
@@ -11243,14 +28253,46 @@
"dev": true
},
"slice-ansi": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
- "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
"dev": true,
"requires": {
- "ansi-styles": "^3.2.0",
- "astral-regex": "^1.0.0",
- "is-fullwidth-code-point": "^2.0.0"
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "astral-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+ "dev": true
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ }
}
},
"snapdragon": {
@@ -11597,9 +28639,9 @@
}
},
"ssri": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz",
- "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==",
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz",
+ "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==",
"dev": true,
"requires": {
"figgy-pudding": "^3.5.1"
@@ -11698,6 +28740,15 @@
"integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==",
"dev": true
},
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
"string-length": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz",
@@ -11732,29 +28783,29 @@
"dev": true
},
"string-width": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
- "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+ "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
"dev": true,
"requires": {
- "emoji-regex": "^7.0.1",
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^5.1.0"
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.0"
},
"dependencies": {
"ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
"dev": true
},
"strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
"dev": true,
"requires": {
- "ansi-regex": "^4.1.0"
+ "ansi-regex": "^5.0.0"
}
}
}
@@ -11767,98 +28818,26 @@
"requires": {
"define-properties": "^1.1.3",
"es-abstract": "^1.17.0-next.1"
- },
- "dependencies": {
- "es-abstract": {
- "version": "1.17.6",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz",
- "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==",
- "dev": true,
- "requires": {
- "es-to-primitive": "^1.2.1",
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.1",
- "is-callable": "^1.2.0",
- "is-regex": "^1.1.0",
- "object-inspect": "^1.7.0",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.0",
- "string.prototype.trimend": "^1.0.1",
- "string.prototype.trimstart": "^1.0.1"
- }
- }
}
},
"string.prototype.trimend": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz",
- "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz",
+ "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==",
"dev": true,
"requires": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.5"
- },
- "dependencies": {
- "es-abstract": {
- "version": "1.17.6",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz",
- "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==",
- "dev": true,
- "requires": {
- "es-to-primitive": "^1.2.1",
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.1",
- "is-callable": "^1.2.0",
- "is-regex": "^1.1.0",
- "object-inspect": "^1.7.0",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.0",
- "string.prototype.trimend": "^1.0.1",
- "string.prototype.trimstart": "^1.0.1"
- }
- }
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3"
}
},
"string.prototype.trimstart": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz",
- "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==",
- "dev": true,
- "requires": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.5"
- },
- "dependencies": {
- "es-abstract": {
- "version": "1.17.6",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz",
- "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==",
- "dev": true,
- "requires": {
- "es-to-primitive": "^1.2.1",
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.1",
- "is-callable": "^1.2.0",
- "is-regex": "^1.1.0",
- "object-inspect": "^1.7.0",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.0",
- "string.prototype.trimend": "^1.0.1",
- "string.prototype.trimstart": "^1.0.1"
- }
- }
- }
- },
- "string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz",
+ "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==",
"dev": true,
"requires": {
- "safe-buffer": "~5.1.0"
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3"
}
},
"strip-ansi": {
@@ -12013,9 +28992,9 @@
}
},
"css-what": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.3.0.tgz",
- "integrity": "sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg==",
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz",
+ "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==",
"dev": true
},
"domutils": {
@@ -12037,15 +29016,15 @@
"dev": true
},
"table": {
- "version": "5.4.6",
- "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
- "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/table/-/table-6.0.4.tgz",
+ "integrity": "sha512-sBT4xRLdALd+NFBvwOz8bw4b15htyythha+q+DVZqy2RS08PPC8O2sZFgJYEY7bJvbCFKccs+WIZ/cd+xxTWCw==",
"dev": true,
"requires": {
- "ajv": "^6.10.2",
- "lodash": "^4.17.14",
- "slice-ansi": "^2.1.0",
- "string-width": "^3.0.0"
+ "ajv": "^6.12.4",
+ "lodash": "^4.17.20",
+ "slice-ansi": "^4.0.0",
+ "string-width": "^4.2.0"
}
},
"tapable": {
@@ -12424,6 +29403,18 @@
}
}
},
+ "unbox-primitive": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz",
+ "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==",
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.1.1",
+ "has-bigints": "^1.0.1",
+ "has-symbols": "^1.0.2",
+ "which-boxed-primitive": "^1.0.2"
+ }
+ },
"unicode-canonical-property-names-ecmascript": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
@@ -12598,9 +29589,9 @@
}
},
"url-parse": {
- "version": "1.4.7",
- "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz",
- "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==",
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz",
+ "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==",
"dev": true,
"requires": {
"querystringify": "^2.1.1",
@@ -12646,27 +29637,6 @@
"es-abstract": "^1.17.2",
"has-symbols": "^1.0.1",
"object.getownpropertydescriptors": "^2.1.0"
- },
- "dependencies": {
- "es-abstract": {
- "version": "1.17.6",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz",
- "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==",
- "dev": true,
- "requires": {
- "es-to-primitive": "^1.2.1",
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.1",
- "is-callable": "^1.2.0",
- "is-regex": "^1.1.0",
- "object-inspect": "^1.7.0",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.0",
- "string.prototype.trimend": "^1.0.1",
- "string.prototype.trimstart": "^1.0.1"
- }
- }
}
},
"utila": {
@@ -13194,6 +30164,19 @@
"isexe": "^2.0.0"
}
},
+ "which-boxed-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
+ "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+ "dev": true,
+ "requires": {
+ "is-bigint": "^1.0.1",
+ "is-boolean-object": "^1.1.0",
+ "is-number-object": "^1.0.4",
+ "is-string": "^1.0.5",
+ "is-symbol": "^1.0.3"
+ }
+ },
"which-module": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
@@ -13314,15 +30297,6 @@
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"dev": true
},
- "write": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
- "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
- "dev": true,
- "requires": {
- "mkdirp": "^0.5.1"
- }
- },
"write-file-atomic": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz",
@@ -13356,9 +30330,9 @@
"dev": true
},
"y18n": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
- "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
+ "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
"dev": true
},
"yallist": {
@@ -13367,6 +30341,12 @@
"integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
"dev": true
},
+ "yaml": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz",
+ "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==",
+ "dev": true
+ },
"yargs": {
"version": "13.3.2",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
diff --git a/package.json b/package.json
index c11f719..b0b9d51 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "@adjustcom/adjust-web-sdk",
- "version": "5.1.1",
+ "version": "5.1.2",
"description": "This is the guide to the Javascript SDK of Adjust™ for web sites or web apps. You can read more about Adjust™ at [adjust.com].",
"scripts": {
"build:demo": "webpack --mode production --config webpack.demo.config.js",
@@ -9,7 +9,7 @@
"build": "npm-run-all build:sdk build:demo build:snippet",
"clean": "rm -rf ./demo/*",
"start": "webpack-dev-server --content-base dist --hot --mode development --config webpack.demo.config.js",
- "lint": "eslint ./src --ext .js",
+ "lint": "eslint ./src --ext .js,.ts",
"lint:fix": "npm run lint -- --fix",
"test": "TZ=UTC jest",
"test:watch": "TZ=UTC jest --watchAll",
@@ -19,6 +19,7 @@
"prepublishOnly": "npm run test:all"
},
"main": "dist/adjust-latest.js",
+ "types": "dist/adjust-latest.d.ts",
"keywords": [],
"author": "Adjust GmbH",
"license": "MIT",
@@ -31,8 +32,9 @@
"@babel/preset-env": "^7.11.5",
"@babel/preset-flow": "^7.10.4",
"@babel/preset-typescript": "^7.10.4",
- "@typescript-eslint/eslint-plugin": "^4.3.0",
- "@typescript-eslint/parser": "^4.3.0",
+ "@types/jest": "^26.0.23",
+ "@typescript-eslint/eslint-plugin": "^4.9.0",
+ "@typescript-eslint/parser": "^4.9.0",
"babel-eslint": "^10.0.3",
"babel-jest": "^24.9.0",
"babel-loader": "^8.0.6",
@@ -41,13 +43,15 @@
"core-js-bundle": "^3.6.5",
"css-loader": "^1.0.1",
"es6-promise": "^4.2.8",
- "eslint": "^7.10.0",
+ "eslint": "^7.14.0",
"eslint-loader": "^4.0.2",
"eslint-plugin-flowtype": "^5.2.0",
+ "eslint-plugin-jest": "^24.3.6",
"fake-indexeddb": "^2.1.1",
"file-loader": "^2.0.0",
"flow-bin": "^0.106.3",
"flow-webpack-plugin": "^1.2.0",
+ "fork-ts-checker-webpack-plugin": "^6.0.4",
"html-loader": "^0.5.5",
"html-webpack-plugin": "^3.2.0",
"jest": "^24.9.0",
@@ -73,6 +77,7 @@
"doc": "docs"
},
"files": [
+ "dist/adjust-latest.d.ts",
"dist/adjust-latest.js",
"dist/adjust-latest.min.js",
"docs/**/*",
diff --git a/src/demo.html b/src/demo.html
index 7cb594c..9d4a19c 100644
--- a/src/demo.html
+++ b/src/demo.html
@@ -27,6 +27,7 @@
// externalDeviceId: 'YOUR_EXTERNAL_DEVICE_ID', // optional
// customUrl: 'YOUR_CUSTOM_URL', // optional
// eventDeduplicationListLimit: 'YOUR_EVENT_DEDUPLICATION_LIST_LIMIT' // optional, default set to 10
+ // namespace: 'YOUR_CUSTOM_STORAGE_NAMESPACE' // optional, namespace for sdk data storage
});
diff --git a/src/demo/key-value-params/key-value-params.js b/src/demo/key-value-params/key-value-params.js
index 6c82949..1816167 100644
--- a/src/demo/key-value-params/key-value-params.js
+++ b/src/demo/key-value-params/key-value-params.js
@@ -14,7 +14,8 @@ function _createNode (name, classes = [], content, attrs = {}) {
element.appendChild(document.createTextNode(content))
}
- Object.entries(attrs)
+ Object.keys(attrs)
+ .map(key => [key, attrs[key]])
.map(([key, value]) => element[key] = value)
return element
diff --git a/src/demo/storage.js b/src/demo/storage.js
index 84e21a2..ff72aa4 100644
--- a/src/demo/storage.js
+++ b/src/demo/storage.js
@@ -1,6 +1,4 @@
-import {__delete} from '../sdk/storage/indexeddb'
import Config from './config'
-import {write} from './log'
const _storageName = Config.namespace
@@ -19,11 +17,6 @@ function setItem (key, value, plainText) {
function clear () {
localStorage.clear()
- return __delete()
- .catch(error => {
- write('There was an error while attempting to delete the storage, please refresh')
- throw error
- })
}
export {
diff --git a/src/demo/tabs/tabs.js b/src/demo/tabs/tabs.js
index a65ad9c..4971114 100644
--- a/src/demo/tabs/tabs.js
+++ b/src/demo/tabs/tabs.js
@@ -97,6 +97,11 @@ function _handleReset () {
_setJson(appConfig)
clear()
+ Adjust.__testonly__.clearDatabase()
+ .catch(error => {
+ write('There was an error while attempting to delete the storage, please refresh')
+ throw error
+ })
.then(() => {
setItem('appConfig', appConfig)
write('The storage is deleted and the sdk is re-initiated')
diff --git a/src/global.d.ts b/src/global.d.ts
new file mode 100644
index 0000000..db0493e
--- /dev/null
+++ b/src/global.d.ts
@@ -0,0 +1,43 @@
+type Nullable = T | null
+
+type Maybe = T | undefined
+
+interface Window {
+ indexedDB: Maybe
+ mozIndexedDB: Maybe
+ webkitIndexedDB: Maybe
+ msIndexedDB: Maybe
+}
+
+interface IDBVersionChangeEventTarget extends EventTarget {
+ result: IDBDatabase
+ transaction: IDBTransaction
+}
+
+interface IDBVersionChangeEvent {
+ target: IDBVersionChangeEventTarget
+}
+
+interface IDBOpenDBEventTarget extends EventTarget {
+ result: IDBDatabase | null
+}
+
+interface IDBOpenDBEvent extends Event {
+ target: IDBOpenDBEventTarget
+}
+
+interface IDBOpenDBRequest {
+ onsuccess: ((this: IDBOpenDBRequest, ev: IDBOpenDBEvent) => any) | null;
+}
+
+interface OpenIDBCursorEventTarget extends EventTarget {
+ result: IDBCursorWithValue | null
+}
+
+interface OpenIDBCursorEvent extends Event {
+ target: OpenIDBCursorEventTarget
+}
+
+interface OpenIDBCursorRequest extends IDBRequest {
+ onsuccess: ((this: OpenIDBCursorRequest, ev: OpenIDBCursorEvent) => any) | null;
+}
diff --git a/src/index.js b/src/index.js
index adb2098..c9b0c12 100644
--- a/src/index.js
+++ b/src/index.js
@@ -10,7 +10,8 @@ const appConfig = {
// defaultTracker: 'YOUR_DEFAULT_TRACKER',
// externalDeviceId: 'YOUR_EXTERNAL_DEVICE_ID',
// customUrl: 'YOUR_CUSTOM_URL',
- // eventDeduplicationListLimit: 'YOUR_EVENT_DEDUPLICATION_LIST_LIMIT'
+ // eventDeduplicationListLimit: 'YOUR_EVENT_DEDUPLICATION_LIST_LIMIT',
+ // namespace: 'YOUR_CUSTOM_STORAGE_NAMESPACE'
}
const basicEventConfig = {
diff --git a/src/sdk/__tests__/config.spec.js b/src/sdk/__tests__/config.spec.js
index b6da885..8b084ba 100644
--- a/src/sdk/__tests__/config.spec.js
+++ b/src/sdk/__tests__/config.spec.js
@@ -146,19 +146,4 @@ describe('test global config', () => {
})
})
})
-
- describe('development environment', () => {
- jest.isolateModules(() => {
- global.process.env.NODE_ENV = 'development'
- const Config = require('../config')
-
- it('sets base urls for env other then test', () => {
- expect(Config.default.baseUrl).toEqual({
- app: 'https://app.adjust.com',
- gdpr: 'https://gdpr.adjust.com'
- })
- })
- })
- })
-
})
diff --git a/src/sdk/__tests__/http.spec.js b/src/sdk/__tests__/http.spec.js
index cbff1a0..fa27bc1 100644
--- a/src/sdk/__tests__/http.spec.js
+++ b/src/sdk/__tests__/http.spec.js
@@ -4,6 +4,7 @@ import * as Time from '../time'
import * as ActivityState from '../activity-state'
import * as PubSub from '../pub-sub'
import * as Config from '../config'
+import * as UrlStrategy from '../url-strategy'
jest.mock('../logger')
jest.useFakeTimers()
@@ -12,11 +13,7 @@ describe('perform api requests', () => {
const appParams = {
appToken: '123abc',
- environment: 'sandbox',
- baseUrl: {
- app: 'app-test',
- gdpr: 'gdpr-test'
- }
+ environment: 'sandbox'
}
const defaultParamsString = [
@@ -33,6 +30,9 @@ describe('perform api requests', () => {
'queue_size=0'
].join('&')
+ const urlStrategyRetriesMock = sendRequestCb => sendRequestCb({ app: 'app', gdpr: 'gdpr' })
+ const urlStrategyRetriesActual = UrlStrategy.urlStrategyRetries
+
const oldXMLHttpRequest = global.XMLHttpRequest
const oldLocale = global.navigator.language
const oldPlatform = global.navigator.platform
@@ -47,6 +47,9 @@ describe('perform api requests', () => {
Utils.setGlobalProp(global.navigator, 'platform')
Utils.setGlobalProp(global.navigator, 'doNotTrack')
+
+ jest.spyOn(UrlStrategy, 'urlStrategyRetries').mockImplementation(urlStrategyRetriesMock)
+
jest.spyOn(Time, 'getTimestamp').mockReturnValue('some-time')
ActivityState.default.init({uuid: 'some-uuid'})
@@ -418,30 +421,39 @@ describe('perform api requests', () => {
})
})
- it('overrides base and gdpr url with custom one', () => {
+ describe('custom url', () => {
+ beforeAll(() => {
+ jest.spyOn(UrlStrategy, 'urlStrategyRetries').mockImplementation(urlStrategyRetriesActual)
+ })
- Config.default.set({customUrl: 'custom-base', ...appParams})
+ afterAll(() => {
+ jest.spyOn(UrlStrategy, 'urlStrategyRetries').mockImplementation(urlStrategyRetriesMock)
+ })
- expect.assertions(4)
+ it('overrides base and gdpr url with custom one', () => {
+ Config.default.set({ customUrl: 'custom-base', ...appParams })
- expect(http.default({
- url: '/some-url'
- })).resolves.toEqual({
- status: 'success',
- ...response
- })
+ expect.assertions(4)
- return Utils.flushPromises()
- .then(() => {
+ expect(http.default({
+ url: '/some-url'
+ })).resolves.toEqual({
+ status: 'success',
+ ...response
+ })
- expect(mockXHR.open).toHaveBeenCalledWith('GET', `custom-base/some-url?${defaultParamsString}`, true)
- expect(mockXHR.setRequestHeader).toHaveBeenCalledWith('Client-SDK', 'jsTEST')
- expect(mockXHR.send).toHaveBeenCalledWith(undefined)
+ return Utils.flushPromises()
+ .then(() => {
- mockXHR.onreadystatechange()
+ expect(mockXHR.open).toHaveBeenCalledWith('GET', `custom-base/some-url?${defaultParamsString}`, true)
+ expect(mockXHR.setRequestHeader).toHaveBeenCalledWith('Client-SDK', 'jsTEST')
+ expect(mockXHR.send).toHaveBeenCalledWith(undefined)
- Config.default.set(appParams)
- })
+ mockXHR.onreadystatechange()
+
+ Config.default.set(appParams)
+ })
+ })
})
it('excludes empty values from the request params', () => {
diff --git a/src/sdk/__tests__/main/main-disabled.gdpr.spec.js b/src/sdk/__tests__/main/main-disabled.gdpr.spec.js
index a08bc27..9d82300 100644
--- a/src/sdk/__tests__/main/main-disabled.gdpr.spec.js
+++ b/src/sdk/__tests__/main/main-disabled.gdpr.spec.js
@@ -80,11 +80,17 @@ describe('main entry point - test GDPR-Forget-Me when in initially disabled stat
it('initiates and prevents running all static methods and track event', () => {
AdjustInstance.initSdk(suite.config)
- expect(Logger.default.log).toHaveBeenLastCalledWith('Adjust SDK is disabled, can not start the sdk')
+ expect.assertions(28)
- suite.expectNotStart()
- suite.expectNotRunningStatic()
- suite.expectNotRunningTrackEvent()
+ return Utils.flushPromises()
+ .then(() => {
+
+ expect(Logger.default.log).toHaveBeenLastCalledWith('Adjust SDK is disabled, can not start the sdk')
+
+ suite.expectNotStart()
+ suite.expectNotRunningStatic()
+ suite.expectNotRunningTrackEvent()
+ })
})
it('fails to run forget-me request', () => {
@@ -132,16 +138,20 @@ describe('main entry point - test GDPR-Forget-Me when in initially disabled stat
AdjustInstance.initSdk(suite.config)
- expect(Logger.default.log).toHaveBeenLastCalledWith('Adjust SDK is disabled, can not start the sdk')
+ return Utils.flushPromises()
+ .then(() => {
- Logger.default.log.mockClear()
+ expect(Logger.default.log).toHaveBeenLastCalledWith('Adjust SDK is disabled, can not start the sdk')
- const a1 = suite.expectNotGdprForgetMeCallback()
- const a2 = suite.expectNotClearAndDestroy_Async()
+ Logger.default.log.mockClear()
- return a2.promise.then(() => {
- expect.assertions(1 + a1.assertions + a2.assertions)
- })
+ const a1 = suite.expectNotGdprForgetMeCallback()
+ const a2 = suite.expectNotClearAndDestroy_Async()
+
+ return a2.promise.then(() => {
+ expect.assertions(1 + a1.assertions + a2.assertions)
+ })
+ })
})
it('prevents running all static methods and track event', () => {
@@ -171,16 +181,22 @@ describe('main entry point - test GDPR-Forget-Me when in initially disabled stat
AdjustInstance.initSdk(suite.config)
- expect(Logger.default.log).toHaveBeenCalledTimes(1)
- expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK is disabled, can not start the sdk')
+ expect.assertions(30)
- suite.expectNotStart()
- suite.expectNotRunningStatic()
- suite.expectNotRunningTrackEvent()
+ return Utils.flushPromises()
+ .then(() => {
+
+ expect(Logger.default.log).toHaveBeenCalledTimes(1)
+ expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK is disabled, can not start the sdk')
- jest.runOnlyPendingTimers()
+ suite.expectNotStart()
+ suite.expectNotRunningStatic()
+ suite.expectNotRunningTrackEvent()
- expect(http.default).not.toHaveBeenCalled()
+ jest.runOnlyPendingTimers()
+
+ expect(http.default).not.toHaveBeenCalled()
+ })
})
it('flush forget-me event but ignores it', () => {
@@ -214,16 +230,22 @@ describe('main entry point - test GDPR-Forget-Me when in initially disabled stat
AdjustInstance.initSdk(suite.config)
- expect(Logger.default.log).toHaveBeenCalledTimes(1)
- expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK is disabled, can not start the sdk')
+ expect.assertions(30)
- suite.expectNotStart()
- suite.expectNotRunningStatic()
- suite.expectNotRunningTrackEvent()
+ return Utils.flushPromises()
+ .then(() => {
+
+ expect(Logger.default.log).toHaveBeenCalledTimes(1)
+ expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK is disabled, can not start the sdk')
+
+ suite.expectNotStart()
+ suite.expectNotRunningStatic()
+ suite.expectNotRunningTrackEvent()
- jest.runOnlyPendingTimers()
+ jest.runOnlyPendingTimers()
- expect(http.default).not.toHaveBeenCalled()
+ expect(http.default).not.toHaveBeenCalled()
+ })
})
})
diff --git a/src/sdk/__tests__/main/main-disabled.general.spec.js b/src/sdk/__tests__/main/main-disabled.general.spec.js
index 5b337de..691dd0b 100644
--- a/src/sdk/__tests__/main/main-disabled.general.spec.js
+++ b/src/sdk/__tests__/main/main-disabled.general.spec.js
@@ -55,7 +55,7 @@ describe('main entry point - test disable/enable when in initially disabled stat
jest.spyOn(Scheduler, 'delay')
jest.spyOn(Scheduler, 'flush')
- Preferences.setDisabled({reason: 'general'})
+ Preferences.setDisabled({ reason: 'general' })
})
afterEach(() => {
@@ -81,9 +81,14 @@ describe('main entry point - test disable/enable when in initially disabled stat
AdjustInstance.initSdk(suite.config)
- suite.expectNotStart()
- suite.expectNotRunningStatic()
- suite.expectNotRunningTrackEvent()
+ return Utils.flushPromises()
+ .then(() => {
+ jest.runOnlyPendingTimers()
+
+ suite.expectNotStart()
+ suite.expectNotRunningStatic()
+ suite.expectNotRunningTrackEvent()
+ })
})
it('fails to disable already disabled sdk', () => {
@@ -105,7 +110,7 @@ describe('main entry point - test disable/enable when in initially disabled stat
const a = suite.expectStart_Async()
- return a.promise.then(()=>{
+ return a.promise.then(() => {
expect.assertions(3 + a.assertions)
})
})
@@ -120,11 +125,16 @@ describe('main entry point - test disable/enable when in initially disabled stat
AdjustInstance.initSdk(suite.config)
- expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK is disabled, can not start the sdk')
+ return Utils.flushPromises()
+ .then(() => {
+ jest.runOnlyPendingTimers()
- suite.expectNotStart()
- suite.expectNotRunningStatic()
- suite.expectNotRunningTrackEvent()
+ expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK is disabled, can not start the sdk')
+
+ suite.expectNotStart()
+ suite.expectNotRunningStatic()
+ suite.expectNotRunningTrackEvent()
+ })
})
it('enables sdk with restart', () => {
@@ -139,9 +149,10 @@ describe('main entry point - test disable/enable when in initially disabled stat
const a2 = suite.expectDelayedTrackEvent_Async()
const a3 = suite.expectStart_Async()
- return Promise.all([a2.promise, a3.promise]).then(()=>{
- expect.assertions(3 + a1.assertions + a2.assertions + a3.assertions)
- })
+ return Promise.all([a2.promise, a3.promise])
+ .then(() => {
+ expect.assertions(3 + a1.assertions + a2.assertions + a3.assertions)
+ })
})
it('fails to enable already enabled sdk', () => {
@@ -181,17 +192,23 @@ describe('main entry point - test disable/enable when in initially disabled stat
it('initiates, enables and disables one after another', () => {
AdjustInstance.initSdk(suite.config)
- AdjustInstance.restart()
- AdjustInstance.stop()
- expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK has been enabled')
- expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK disable process is now finished')
- expect(Disable.restore).toHaveBeenCalled()
- expect(Disable.disable).toHaveBeenCalled()
+ return Utils.flushPromises()
+ .then(() => {
+ jest.runOnlyPendingTimers()
- suite.expectShutDown()
+ AdjustInstance.restart()
+ AdjustInstance.stop()
- return Utils.flushPromises()
+ expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK has been enabled')
+ expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK disable process is now finished')
+ expect(Disable.restore).toHaveBeenCalled()
+ expect(Disable.disable).toHaveBeenCalled()
+
+ suite.expectShutDown()
+
+ return Utils.flushPromises()
+ })
})
it('ensures that everything is shutdown', () => {
@@ -222,11 +239,16 @@ describe('main entry point - test disable/enable when in initially disabled stat
AdjustInstance.initSdk(suite.config)
- expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK is disabled, can not start the sdk')
+ return Utils.flushPromises()
+ .then(() => {
+ jest.runOnlyPendingTimers()
- suite.expectNotStart()
- suite.expectNotRunningStatic()
- suite.expectNotRunningTrackEvent()
+ expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK is disabled, can not start the sdk')
+
+ suite.expectNotStart()
+ suite.expectNotRunningStatic()
+ suite.expectNotRunningTrackEvent()
+ })
})
it('fails again to disable already disabled sdk', () => {
@@ -248,7 +270,7 @@ describe('main entry point - test disable/enable when in initially disabled stat
const a = suite.expectStart_Async()
- return a.promise.then(()=>{
+ return a.promise.then(() => {
expect.assertions(3 + a.assertions)
})
})
@@ -282,13 +304,18 @@ describe('main entry point - test disable/enable when in initially disabled stat
AdjustInstance.initSdk(suite.config)
- const a1 = suite.expectRunningStatic()
- const a2 = suite.expectDelayedTrackEvent_Async()
- const a3 = suite.expectStart_Async()
+ return Utils.flushPromises()
+ .then(() => {
+ jest.runOnlyPendingTimers()
- return Promise.all([a2.promise, a3.promise]).then(()=>{
- expect.assertions(a1.assertions + a2.assertions + a3.assertions)
- })
+ const a1 = suite.expectRunningStatic()
+ const a2 = suite.expectDelayedTrackEvent_Async()
+ const a3 = suite.expectStart_Async()
+
+ return Promise.all([a2.promise, a3.promise]).then(() => {
+ expect.assertions(a1.assertions + a2.assertions + a3.assertions)
+ })
+ })
})
it('fails to enable already enabled sdk', () => {
@@ -320,16 +347,22 @@ describe('main entry point - test disable/enable when in initially disabled stat
AdjustInstance.restart()
AdjustInstance.initSdk(suite.config)
- AdjustInstance.stop()
- expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK has been enabled')
- expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK disable process is now finished')
- expect(Disable.restore).toHaveBeenCalled()
- expect(Disable.disable).toHaveBeenCalled()
+ return Utils.flushPromises()
+ .then(() => {
+ jest.runOnlyPendingTimers()
- suite.expectShutDown()
+ AdjustInstance.stop()
- return Utils.flushPromises()
+ expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK has been enabled')
+ expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK disable process is now finished')
+ expect(Disable.restore).toHaveBeenCalled()
+ expect(Disable.disable).toHaveBeenCalled()
+
+ suite.expectShutDown()
+
+ return Utils.flushPromises()
+ })
})
it('ensures that everything is shutdown', () => {
@@ -366,13 +399,21 @@ describe('main entry point - test disable/enable when in initially disabled stat
AdjustInstance.initSdk(suite.config)
- const a1 = suite.expectRunningStatic()
- const a2 = suite.expectDelayedTrackEvent_Async()
- const a3 = suite.expectStart_Async()
+ return Utils.flushPromises()
+ .then(() => {
+ jest.runOnlyPendingTimers()
- return Promise.all([a2.promise, a3.promise]).then(()=>{
- expect.assertions(a1.assertions + a2.assertions + a3.assertions)
- })
+ const a1 = suite.expectRunningStatic()
+ const a2 = suite.expectDelayedTrackEvent_Async()
+ const a3 = suite.expectStart_Async()
+
+ return Promise.all([a2.promise, a3.promise])
+ .then(() => {
+ expect.assertions(a1.assertions + a2.assertions + a3.assertions)
+
+ return Utils.flushPromises()
+ })
+ })
})
})
@@ -404,16 +445,18 @@ describe('main entry point - test disable/enable when in initially disabled stat
})
it('initiates and prevents running all static methods and track event', () => {
-
AdjustInstance.initSdk(suite.config)
- expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK is disabled, can not start the sdk')
+ return Utils.flushPromises()
+ .then(() => {
+ jest.runOnlyPendingTimers()
- suite.expectNotStart()
- suite.expectNotRunningStatic()
- suite.expectNotRunningTrackEvent()
+ expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK is disabled, can not start the sdk')
+
+ suite.expectNotStart()
+ suite.expectNotRunningStatic()
+ suite.expectNotRunningTrackEvent()
+ })
})
})
})
-
-
diff --git a/src/sdk/__tests__/main/main-enabled.gdpr.spec.js b/src/sdk/__tests__/main/main-enabled.gdpr.spec.js
index 16ef2b6..13f02e9 100644
--- a/src/sdk/__tests__/main/main-enabled.gdpr.spec.js
+++ b/src/sdk/__tests__/main/main-enabled.gdpr.spec.js
@@ -82,13 +82,17 @@ describe('main entry point - test GDPR-Forget-Me when in initially enabled state
AdjustInstance.initSdk(suite.config)
- const a1 = suite.expectRunningStatic()
- const a2 = suite.expectDelayedTrackEvent_Async()
- const a3 = suite.expectStart_Async()
+ return Utils.flushPromises()
+ .then(() => {
- return Promise.all([a2.promise, a3.promise]).then(()=>{
- expect.assertions(a1.assertions + a2.assertions + a3.assertions)
- })
+ const a1 = suite.expectRunningStatic()
+ const a2 = suite.expectDelayedTrackEvent_Async()
+ const a3 = suite.expectStart_Async()
+
+ expect.assertions(a1.assertions + a2.assertions + a3.assertions)
+
+ return Promise.all([a2.promise, a3.promise])
+ })
})
it('runs forget-me request and flush', () => {
@@ -136,6 +140,7 @@ describe('main entry point - test GDPR-Forget-Me when in initially enabled state
beforeAll(() => {
AdjustInstance.initSdk(suite.config)
+ return Utils.flushPromises()
})
it('flush forget-me event but ignores it', () => {
@@ -186,13 +191,17 @@ describe('main entry point - test GDPR-Forget-Me when in initially enabled state
AdjustInstance.initSdk(suite.config)
- const a1 = suite.expectPartialStartWithGdprRequest_Async()
- const a2 = suite.expectNotRunningStatic()
- const a3 = suite.expectNotRunningTrackEvent()
+ return Utils.flushPromises()
+ .then(() => {
+
+ const a1 = suite.expectPartialStartWithGdprRequest_Async()
+ const a2 = suite.expectNotRunningStatic()
+ const a3 = suite.expectNotRunningTrackEvent()
- return a1.promise.then(() => {
- expect.assertions(a1.assertions + a2.assertions + a3.assertions)
- })
+ return a1.promise.then(() => {
+ expect.assertions(a1.assertions + a2.assertions + a3.assertions)
+ })
+ })
})
it('flush forget-me event does clear and instance destroy', () => {
@@ -229,13 +238,17 @@ describe('main entry point - test GDPR-Forget-Me when in initially enabled state
AdjustInstance.initSdk(suite.config)
- const a1 = suite.expectPartialStartWithGdprRequest_Async()
- const a2 = suite.expectNotRunningStatic()
- const a3 = suite.expectNotRunningTrackEvent()
+ return Utils.flushPromises()
+ .then(() => {
- expect.assertions(a1.assertions + a2.assertions + a3.assertions)
+ const a1 = suite.expectPartialStartWithGdprRequest_Async()
+ const a2 = suite.expectNotRunningStatic()
+ const a3 = suite.expectNotRunningTrackEvent()
- return a1.promise
+ expect.assertions(a1.assertions + a2.assertions + a3.assertions)
+
+ return a1.promise
+ })
})
})
diff --git a/src/sdk/__tests__/main/main-enabled.general.spec.js b/src/sdk/__tests__/main/main-enabled.general.spec.js
index 0c704e0..29f6468 100644
--- a/src/sdk/__tests__/main/main-enabled.general.spec.js
+++ b/src/sdk/__tests__/main/main-enabled.general.spec.js
@@ -76,13 +76,18 @@ describe('main entry point - test enable/disable when in initially enabled state
AdjustInstance.initSdk(suite.config)
- const a1 = suite.expectRunningStatic()
- const a2 = suite.expectDelayedTrackEvent_Async()
- const a3 = suite.expectStart_Async()
+ return Utils.flushPromises()
+ .then(() => {
+ jest.runOnlyPendingTimers()
- return Promise.all([a2.promise, a3.promise]).then(()=>{
- expect.assertions(a1.assertions + a2.assertions + a3.assertions)
- })
+ const a1 = suite.expectRunningStatic()
+ const a2 = suite.expectDelayedTrackEvent_Async()
+ const a3 = suite.expectStart_Async()
+
+ expect.assertions(a1.assertions + a2.assertions + a3.assertions)
+
+ return Promise.all([a2.promise, a3.promise])
+ })
})
it('disables sdk with shutdown', () => {
@@ -131,20 +136,19 @@ describe('main entry point - test enable/disable when in initially enabled state
})
it('initiates, disables and enables one after another', () => {
- expect.assertions(5)
+ expect.assertions(4)
AdjustInstance.initSdk(suite.config)
- AdjustInstance.stop()
- AdjustInstance.restart()
-
- expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK disable process is now finished')
- expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK has been enabled')
- expect(Disable.disable).toHaveBeenCalled()
- expect(Disable.restore).toHaveBeenCalled()
return Utils.flushPromises()
.then(() => {
- expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK start already in progress')
+ AdjustInstance.stop()
+ AdjustInstance.restart()
+
+ expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK disable process is now finished')
+ expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK has been enabled')
+ expect(Disable.disable).toHaveBeenCalled()
+ expect(Disable.restore).toHaveBeenCalled()
})
})
@@ -166,13 +170,18 @@ describe('main entry point - test enable/disable when in initially enabled state
AdjustInstance.initSdk(suite.config)
- const a1 = suite.expectRunningStatic()
- const a2 = suite.expectDelayedTrackEvent_Async()
- const a3 = suite.expectStart_Async()
+ return Utils.flushPromises()
+ .then(() => {
+ jest.runOnlyPendingTimers()
- return Promise.all([a2.promise, a3.promise]).then(()=>{
- expect.assertions(a1.assertions + a2.assertions + a3.assertions)
- })
+ const a1 = suite.expectRunningStatic()
+ const a2 = suite.expectDelayedTrackEvent_Async()
+ const a3 = suite.expectStart_Async()
+
+ expect.assertions(a1.assertions + a2.assertions + a3.assertions)
+
+ return Promise.all([a2.promise, a3.promise])
+ })
})
it('fails to enable already enabled sdk', () => {
@@ -225,11 +234,17 @@ describe('main entry point - test enable/disable when in initially enabled state
AdjustInstance.initSdk(suite.config)
- expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK is disabled, can not start the sdk')
+ expect.assertions(28)
- suite.expectNotStart()
- suite.expectNotRunningStatic()
- suite.expectNotRunningTrackEvent()
+ return Utils.flushPromises()
+ .then(() => {
+
+ expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK is disabled, can not start the sdk')
+
+ suite.expectNotStart()
+ suite.expectNotRunningStatic()
+ suite.expectNotRunningTrackEvent()
+ })
})
it('fails to disable already disabled sdk', () => {
@@ -284,13 +299,18 @@ describe('main entry point - test enable/disable when in initially enabled state
AdjustInstance.initSdk(suite.config)
- const a1 = suite.expectRunningStatic()
- const a2 = suite.expectDelayedTrackEvent_Async()
- const a3 = suite.expectStart_Async()
+ return Utils.flushPromises()
+ .then(() => {
+ jest.runOnlyPendingTimers()
- return Promise.all([a2.promise, a3.promise]).then(()=>{
- expect.assertions(a1.assertions + a2.assertions + a3.assertions)
- })
+ const a1 = suite.expectRunningStatic()
+ const a2 = suite.expectDelayedTrackEvent_Async()
+ const a3 = suite.expectStart_Async()
+
+ expect.assertions(a1.assertions + a2.assertions + a3.assertions)
+
+ return Promise.all([a2.promise, a3.promise])
+ })
})
it('fails again to enable already enabled sdk', () => {
@@ -322,13 +342,17 @@ describe('main entry point - test enable/disable when in initially enabled state
AdjustInstance.restart()
AdjustInstance.initSdk(suite.config)
- AdjustInstance.stop()
-
- expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK is already enabled')
- expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK disable process is now finished')
- expect(Disable.disable).toHaveBeenCalled()
return Utils.flushPromises()
+ .then(() => {
+ AdjustInstance.stop()
+
+ expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK is already enabled')
+ expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK disable process is now finished')
+ expect(Disable.disable).toHaveBeenCalled()
+
+ return Utils.flushPromises()
+ })
})
it('ensures that everything is shutdown', () => {
@@ -367,13 +391,18 @@ describe('main entry point - test enable/disable when in initially enabled state
AdjustInstance.initSdk(suite.config)
- const a1 = suite.expectRunningStatic()
- const a2 = suite.expectDelayedTrackEvent_Async()
- const a3 = suite.expectStart_Async()
+ return Utils.flushPromises()
+ .then(() => {
+ jest.runOnlyPendingTimers()
- return Promise.all([a2.promise, a3.promise]).then(()=>{
- expect.assertions(a1.assertions + a2.assertions + a3.assertions)
- })
+ const a1 = suite.expectRunningStatic()
+ const a2 = suite.expectDelayedTrackEvent_Async()
+ const a3 = suite.expectStart_Async()
+
+ expect.assertions(a1.assertions + a2.assertions + a3.assertions)
+
+ return Promise.all([a2.promise, a3.promise])
+ })
})
})
@@ -406,11 +435,17 @@ describe('main entry point - test enable/disable when in initially enabled state
AdjustInstance.initSdk(suite.config)
- expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK is disabled, can not start the sdk')
+ expect.assertions(28)
- suite.expectNotStart()
- suite.expectNotRunningStatic()
- suite.expectNotRunningTrackEvent()
+ return Utils.flushPromises()
+ .then(() => {
+
+ expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK is disabled, can not start the sdk')
+
+ suite.expectNotStart()
+ suite.expectNotRunningStatic()
+ suite.expectNotRunningTrackEvent()
+ })
})
})
diff --git a/src/sdk/__tests__/main/main-gdpr-disabled.gdpr.spec.js b/src/sdk/__tests__/main/main-gdpr-disabled.gdpr.spec.js
index 2886b27..b6608b1 100644
--- a/src/sdk/__tests__/main/main-gdpr-disabled.gdpr.spec.js
+++ b/src/sdk/__tests__/main/main-gdpr-disabled.gdpr.spec.js
@@ -79,11 +79,17 @@ describe('main entry point - test GDPR-Forget-Me when in initially GDPR disabled
AdjustInstance.initSdk(suite.config)
- expect(Logger.default.log).toHaveBeenLastCalledWith('Adjust SDK is disabled, can not start the sdk')
+ expect.assertions(28)
- suite.expectNotStart()
- suite.expectNotRunningStatic()
- suite.expectNotRunningTrackEvent()
+ return Utils.flushPromises()
+ .then(() => {
+
+ expect(Logger.default.log).toHaveBeenLastCalledWith('Adjust SDK is disabled, can not start the sdk')
+
+ suite.expectNotStart()
+ suite.expectNotRunningStatic()
+ suite.expectNotRunningTrackEvent()
+ })
})
it('fails to run forget-me request', () => {
@@ -124,16 +130,20 @@ describe('main entry point - test GDPR-Forget-Me when in initially GDPR disabled
AdjustInstance.initSdk(suite.config)
- expect(Logger.default.log).toHaveBeenLastCalledWith('Adjust SDK is disabled, can not start the sdk')
+ return Utils.flushPromises()
+ .then(() => {
- // Logger.default.log.mockClear()
+ expect(Logger.default.log).toHaveBeenLastCalledWith('Adjust SDK is disabled, can not start the sdk')
- const a1 = suite.expectNotGdprForgetMeCallback()
- const a2 = suite.expectNotClearAndDestroy_Async()
+ Logger.default.log.mockClear()
- return a2.promise.then(() => {
- expect.assertions(1 + a1.assertions + a2.assertions)
- })
+ const a1 = suite.expectNotGdprForgetMeCallback()
+ const a2 = suite.expectNotClearAndDestroy_Async()
+
+ expect.assertions(1 + a1.assertions + a2.assertions)
+
+ return a2.promise
+ })
})
it('prevents running all static methods and track event', () => {
@@ -163,16 +173,22 @@ describe('main entry point - test GDPR-Forget-Me when in initially GDPR disabled
AdjustInstance.initSdk(suite.config)
- expect(Logger.default.log).toHaveBeenCalledTimes(1)
- expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK is disabled, can not start the sdk')
+ expect.assertions(30)
- suite.expectNotStart()
- suite.expectNotRunningStatic()
- suite.expectNotRunningTrackEvent()
+ return Utils.flushPromises()
+ .then(() => {
+
+ expect(Logger.default.log).toHaveBeenCalledTimes(1)
+ expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK is disabled, can not start the sdk')
+
+ suite.expectNotStart()
+ suite.expectNotRunningStatic()
+ suite.expectNotRunningTrackEvent()
- jest.runOnlyPendingTimers()
+ jest.runOnlyPendingTimers()
- expect(http.default).not.toHaveBeenCalled()
+ expect(http.default).not.toHaveBeenCalled()
+ })
})
it('flush forget-me event but ignores it', () => {
@@ -206,16 +222,22 @@ describe('main entry point - test GDPR-Forget-Me when in initially GDPR disabled
AdjustInstance.initSdk(suite.config)
- expect(Logger.default.log).toHaveBeenCalledTimes(1)
- expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK is disabled, can not start the sdk')
+ expect.assertions(30)
- suite.expectNotStart()
- suite.expectNotRunningStatic()
- suite.expectNotRunningTrackEvent()
+ return Utils.flushPromises()
+ .then(() => {
+
+ expect(Logger.default.log).toHaveBeenCalledTimes(1)
+ expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK is disabled, can not start the sdk')
+
+ suite.expectNotStart()
+ suite.expectNotRunningStatic()
+ suite.expectNotRunningTrackEvent()
- jest.runOnlyPendingTimers()
+ jest.runOnlyPendingTimers()
- expect(http.default).not.toHaveBeenCalled()
+ expect(http.default).not.toHaveBeenCalled()
+ })
})
})
diff --git a/src/sdk/__tests__/main/main.storage-available.spec.js b/src/sdk/__tests__/main/main.storage-available.spec.js
index e3db8a6..490de71 100644
--- a/src/sdk/__tests__/main/main.storage-available.spec.js
+++ b/src/sdk/__tests__/main/main.storage-available.spec.js
@@ -74,11 +74,20 @@ describe('main entry point - test instance initiation when storage is available'
AdjustInstance.initSdk()
- expect(Logger.default.error).toHaveBeenLastCalledWith('You must define appToken and environment')
+ expect.assertions(2)
+
+ return Utils.flushPromises()
+ .then(() => {
- AdjustInstance.initSdk({appToken: 'a-token'})
+ expect(Logger.default.error).toHaveBeenLastCalledWith('You must define appToken and environment')
- expect(Logger.default.error).toHaveBeenLastCalledWith('You must define environment')
+ AdjustInstance.initSdk({appToken: 'a-token'})
+
+ return Utils.flushPromises()
+ .then(() => {
+ expect(Logger.default.error).toHaveBeenLastCalledWith('You must define environment')
+ })
+ })
})
it('logs an error and return when trying to track event before init', () => {
@@ -95,30 +104,34 @@ describe('main entry point - test instance initiation when storage is available'
expect.assertions(6)
AdjustInstance.initSdk(suite.config)
- expect(PubSub.subscribe).toHaveBeenCalledWith('sdk:installed', expect.any(Function))
-
- AdjustInstance.trackEvent({eventToken: 'bla123'})
- expect(Logger.default.log).toHaveBeenLastCalledWith('Running track event is delayed until Adjust SDK is up')
return Utils.flushPromises()
.then(() => {
+ expect(PubSub.subscribe).toHaveBeenCalledWith('sdk:installed', expect.any(Function))
- let requests = Queue.push.mock.calls.map(call => call[0].url)
-
- expect(requests[0]).toEqual('/session')
- expect(requests[1]).toEqual('/sdk_click')
-
- PubSub.publish('sdk:installed')
- jest.runOnlyPendingTimers()
-
- expect(Logger.default.log).toHaveBeenLastCalledWith('Delayed track event task is running now')
+ AdjustInstance.trackEvent({eventToken: 'bla123'})
+ expect(Logger.default.log).toHaveBeenLastCalledWith('Running track event is delayed until Adjust SDK is up')
return Utils.flushPromises()
.then(() => {
- requests = Queue.push.mock.calls.map(call => call[0].url)
- expect(requests[2]).toEqual('/event')
- global.history.pushState({}, '', '?')
+ let requests = Queue.push.mock.calls.map(call => call[0].url)
+
+ expect(requests[0]).toEqual('/session')
+ expect(requests[1]).toEqual('/sdk_click')
+
+ PubSub.publish('sdk:installed')
+ jest.runOnlyPendingTimers()
+
+ expect(Logger.default.log).toHaveBeenLastCalledWith('Delayed track event task is running now')
+
+ return Utils.flushPromises()
+ .then(() => {
+ requests = Queue.push.mock.calls.map(call => call[0].url)
+ expect(requests[2]).toEqual('/event')
+
+ global.history.pushState({}, '', '?')
+ })
})
})
})
@@ -154,7 +167,7 @@ describe('main entry point - test instance initiation when storage is available'
.then(() => {
PubSub.publish('sdk:installed')
jest.runOnlyPendingTimers()
-
+
AdjustInstance.trackEvent({eventToken: 'bla1'})
AdjustInstance.trackEvent({eventToken: 'bla2'})
@@ -191,6 +204,8 @@ describe('main entry point - test instance initiation when storage is available'
AdjustInstance.initSdk(newConfig)
suite.expectNotAttributionCallback()
+
+ return Utils.flushPromises()
})
it('shuts down asynchronously', () => {
@@ -198,7 +213,7 @@ describe('main entry point - test instance initiation when storage is available'
const shutDownNumOfAssertions = suite.expectShutDown(true).assertions
const allDownNumOfAssertions = suite.expectAllDown(true).assertions
- expect.assertions(2 + shutDownNumOfAssertions + allDownNumOfAssertions)
+ expect.assertions(1 + shutDownNumOfAssertions + allDownNumOfAssertions)
AdjustInstance.initSdk(suite.config)
@@ -212,11 +227,10 @@ describe('main entry point - test instance initiation when storage is available'
jest.runOnlyPendingTimers()
- expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK start has been interrupted due to multiple synchronous start attempt')
expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK has been shutdown due to asynchronous disable')
- suite.expectShutDown()
suite.expectAllDown()
+ suite.expectShutDown()
})
})
@@ -234,8 +248,8 @@ describe('main entry point - test instance initiation when storage is available'
return Utils.flushPromises()
.then(() => {
expect(Logger.default.error).toHaveBeenCalledWith('Adjust SDK start has been canceled due to an error', {error: 'An error!'})
- suite.expectShutDown()
suite.expectAllDown()
+ suite.expectShutDown()
})
})
@@ -298,13 +312,14 @@ describe('main entry point - test instance initiation when storage is available'
expect(requests.length).toBe(2)
expect(requests[0][0].url).toEqual('/session')
expect(requests[1][0].url).toEqual('/disable_third_party_sharing')
+
+ return Utils.flushPromises()
})
})
it('disables third-party sharing synchronously after init', () => {
AdjustInstance.initSdk(suite.config)
AdjustInstance.disableThirdPartySharing()
-
expect.assertions(3)
return Utils.flushPromises()
@@ -317,6 +332,8 @@ describe('main entry point - test instance initiation when storage is available'
expect(requests.length).toBe(2)
expect(requests[0][0].url).toEqual('/session')
expect(requests[1][0].url).toEqual('/disable_third_party_sharing')
+
+ return Utils.flushPromises()
})
})
@@ -344,61 +361,76 @@ describe('main entry point - test instance initiation when storage is available'
expect(requests.length).toBe(2)
expect(requests[0][0].url).toEqual('/disable_third_party_sharing')
expect(requests[1][0].url).toEqual('/session')
+
+ return Utils.flushPromises()
})
})
it('prevents multiple opt-out requests when requesting opt-out multiple times synchronously after init', () => {
- AdjustInstance.initSdk(suite.config)
- AdjustInstance.disableThirdPartySharing()
- AdjustInstance.disableThirdPartySharing()
-
- expect.assertions(9)
+ expect.assertions(8)
- expect(Logger.default.log).toHaveBeenCalledTimes(2)
- expect(Logger.default.log.mock.calls[0][0]).toEqual('Running disable third-party sharing is delayed until Adjust SDK is up')
- expect(Logger.default.log.mock.calls[1][0]).toEqual('Running disable third-party sharing is delayed until Adjust SDK is up')
+ AdjustInstance.initSdk(suite.config)
return Utils.flushPromises()
.then(() => {
- PubSub.publish('sdk:installed')
- jest.runOnlyPendingTimers()
- const requests = Queue.push.mock.calls
+ AdjustInstance.disableThirdPartySharing()
+ AdjustInstance.disableThirdPartySharing()
- expect(Logger.default.log).toHaveBeenCalledWith('Delayed disable third-party sharing task is running now')
- expect(Logger.default.log).toHaveBeenCalledWith('Third-party sharing opt-out is now started')
- expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK already queued third-party sharing opt-out request')
- expect(requests.length).toBe(2)
- expect(requests[0][0].url).toEqual('/session')
- expect(requests[1][0].url).toEqual('/disable_third_party_sharing')
+ const logCallsCount = Logger.default.log.mock.calls.length
+ expect(Logger.default.log).toHaveBeenNthCalledWith(logCallsCount - 1, 'Running disable third-party sharing is delayed until Adjust SDK is up')
+ expect(Logger.default.log).toHaveBeenNthCalledWith(logCallsCount, 'Running disable third-party sharing is delayed until Adjust SDK is up')
+
+ return Utils.flushPromises()
+ .then(() => {
+ PubSub.publish('sdk:installed')
+ jest.runOnlyPendingTimers()
+
+ const requests = Queue.push.mock.calls
+
+ expect(Logger.default.log).toHaveBeenCalledWith('Delayed disable third-party sharing task is running now')
+ expect(Logger.default.log).toHaveBeenCalledWith('Third-party sharing opt-out is now started')
+ expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK already queued third-party sharing opt-out request')
+ expect(requests.length).toBe(2)
+ expect(requests[0][0].url).toEqual('/session')
+ expect(requests[1][0].url).toEqual('/disable_third_party_sharing')
+
+ return Utils.flushPromises()
+ })
})
})
it('prevents multiple opt-out requests when requesting opt-out multiple times synchronously before and after init', () => {
AdjustInstance.disableThirdPartySharing()
AdjustInstance.initSdk(suite.config)
- AdjustInstance.disableThirdPartySharing()
-
- expect.assertions(10)
-
- expect(Logger.default.log).toHaveBeenCalledTimes(3)
- expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK will run third-party sharing opt-out request after initialisation')
- expect(Logger.default.log).toHaveBeenCalledWith('Third-party sharing opt-out is now started')
- expect(Logger.default.log).toHaveBeenCalledWith('Running disable third-party sharing is delayed until Adjust SDK is up')
return Utils.flushPromises()
.then(() => {
- PubSub.publish('sdk:installed')
- jest.runOnlyPendingTimers()
- const requests = Queue.push.mock.calls
+ AdjustInstance.disableThirdPartySharing()
- expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK is running pending third-party sharing opt-out request')
- expect(Logger.default.log).toHaveBeenCalledWith('Delayed disable third-party sharing task is running now')
- expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK already queued third-party sharing opt-out request')
- expect(requests.length).toBe(2)
- expect(requests[0][0].url).toEqual('/disable_third_party_sharing')
- expect(requests[1][0].url).toEqual('/session')
+ expect.assertions(9)
+
+ expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK will run third-party sharing opt-out request after initialisation')
+ expect(Logger.default.log).toHaveBeenCalledWith('Third-party sharing opt-out is now started')
+ expect(Logger.default.log).toHaveBeenCalledWith('Running disable third-party sharing is delayed until Adjust SDK is up')
+
+ return Utils.flushPromises()
+ .then(() => {
+ PubSub.publish('sdk:installed')
+ jest.runOnlyPendingTimers()
+
+ const requests = Queue.push.mock.calls
+
+ expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK is running pending third-party sharing opt-out request')
+ expect(Logger.default.log).toHaveBeenCalledWith('Delayed disable third-party sharing task is running now')
+ expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK already queued third-party sharing opt-out request')
+ expect(requests.length).toBe(2)
+ expect(requests[0][0].url).toEqual('/disable_third_party_sharing')
+ expect(requests[1][0].url).toEqual('/session')
+
+ return Utils.flushPromises()
+ })
})
})
@@ -406,9 +438,8 @@ describe('main entry point - test instance initiation when storage is available'
AdjustInstance.disableThirdPartySharing()
AdjustInstance.initSdk(suite.config)
- expect.assertions(8)
+ expect.assertions(7)
- expect(Logger.default.log).toHaveBeenCalledTimes(2)
expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK will run third-party sharing opt-out request after initialisation')
expect(Logger.default.log).toHaveBeenCalledWith('Third-party sharing opt-out is now started')
@@ -426,58 +457,69 @@ describe('main entry point - test instance initiation when storage is available'
expect(requests.length).toBe(2)
expect(requests[0][0].url).toEqual('/disable_third_party_sharing')
expect(requests[1][0].url).toEqual('/session')
+
+ return Utils.flushPromises()
})
})
it('prevents multiple opt-out requests when requesting opt-out multiple times synchronously and then asynchronously after init', () => {
AdjustInstance.initSdk(suite.config)
- AdjustInstance.disableThirdPartySharing()
-
- expect.assertions(8)
-
- expect(Logger.default.log).toHaveBeenCalledTimes(1)
- expect(Logger.default.log).toHaveBeenCalledWith('Running disable third-party sharing is delayed until Adjust SDK is up')
return Utils.flushPromises()
.then(() => {
- PubSub.publish('sdk:installed')
- jest.runOnlyPendingTimers()
+ expect.assertions(7)
AdjustInstance.disableThirdPartySharing()
- const requests = Queue.push.mock.calls
+ expect(Logger.default.log).toHaveBeenLastCalledWith('Running disable third-party sharing is delayed until Adjust SDK is up')
- expect(Logger.default.log).toHaveBeenCalledWith('Delayed disable third-party sharing task is running now')
- expect(Logger.default.log).toHaveBeenCalledWith('Third-party sharing opt-out is now started')
- expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK already queued third-party sharing opt-out request')
- expect(requests.length).toBe(2)
- expect(requests[0][0].url).toEqual('/session')
- expect(requests[1][0].url).toEqual('/disable_third_party_sharing')
+ return Utils.flushPromises()
+ .then(() => {
+ PubSub.publish('sdk:installed')
+ jest.runOnlyPendingTimers()
+
+ AdjustInstance.disableThirdPartySharing()
+
+ const requests = Queue.push.mock.calls
+
+ expect(Logger.default.log).toHaveBeenCalledWith('Delayed disable third-party sharing task is running now')
+ expect(Logger.default.log).toHaveBeenCalledWith('Third-party sharing opt-out is now started')
+ expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK already queued third-party sharing opt-out request')
+ expect(requests.length).toBe(2)
+ expect(requests[0][0].url).toEqual('/session')
+ expect(requests[1][0].url).toEqual('/disable_third_party_sharing')
+
+ return Utils.flushPromises()
+ })
})
})
it('prevents multiple opt-out requests when requesting opt-out multiple times asynchronously after init', () => {
AdjustInstance.initSdk(suite.config)
- expect.assertions(6)
-
- expect(Logger.default.log).not.toHaveBeenCalled()
+ expect.assertions(5)
return Utils.flushPromises()
.then(() => {
- PubSub.publish('sdk:installed')
- jest.runOnlyPendingTimers()
- AdjustInstance.disableThirdPartySharing()
- AdjustInstance.disableThirdPartySharing()
+ return Utils.flushPromises()
+ .then(() => {
+ PubSub.publish('sdk:installed')
+ jest.runOnlyPendingTimers()
- const requests = Queue.push.mock.calls
+ AdjustInstance.disableThirdPartySharing()
+ AdjustInstance.disableThirdPartySharing()
- expect(Logger.default.log).toHaveBeenCalledWith('Third-party sharing opt-out is now started')
- expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK already queued third-party sharing opt-out request')
- expect(requests.length).toBe(2)
- expect(requests[0][0].url).toEqual('/session')
- expect(requests[1][0].url).toEqual('/disable_third_party_sharing')
+ const requests = Queue.push.mock.calls
+
+ expect(Logger.default.log).toHaveBeenCalledWith('Third-party sharing opt-out is now started')
+ expect(Logger.default.log).toHaveBeenCalledWith('Adjust SDK already queued third-party sharing opt-out request')
+ expect(requests.length).toBe(2)
+ expect(requests[0][0].url).toEqual('/session')
+ expect(requests[1][0].url).toEqual('/disable_third_party_sharing')
+
+ return Utils.flushPromises()
+ })
})
})
})
@@ -488,6 +530,7 @@ describe('main entry point - test instance initiation when storage is available'
beforeAll(() => {
suite.teardown()
AdjustInstance.initSdk(suite.config)
+ return Utils.flushPromises()
})
it('sets basic configuration', () => {
@@ -516,7 +559,6 @@ describe('main entry point - test instance initiation when storage is available'
expect(AdjustInstance).toBe(OtherInstance)
expect(baseParams.appToken).toEqual('some-app-token')
expect(baseParams.environment).toEqual('production')
-
})
it('runs all static methods', () => {
@@ -524,10 +566,8 @@ describe('main entry point - test instance initiation when storage is available'
})
it('runs track event', () => {
- suite.expectRunningTrackEvent()
+ return suite.expectRunningTrackEvent_Async().promise
})
})
})
-
-
diff --git a/src/sdk/__tests__/main/main.storage-not-available.spec.js b/src/sdk/__tests__/main/main.storage-not-available.spec.js
index 7d3f79b..b32dd3a 100644
--- a/src/sdk/__tests__/main/main.storage-not-available.spec.js
+++ b/src/sdk/__tests__/main/main.storage-not-available.spec.js
@@ -10,6 +10,7 @@ import * as GdprForgetDevice from '../../gdpr-forget-device'
import * as Listeners from '../../listeners'
import * as Scheduler from '../../scheduler'
import Suite from './main.suite'
+import { STORAGE_TYPES } from '../../constants'
jest.mock('../../logger')
@@ -43,7 +44,12 @@ describe('main entry point - test instance initiation when storage is not availa
})
it('prevents initiation if storage is not available', () => {
- jest.doMock('../../storage/storage', () => { return null })
+ jest.doMock('../../storage/storage', () => {
+ return {
+ init: () => Promise.resolve({ storage: null, type: STORAGE_TYPES.NO_STORAGE }),
+ getType: () => STORAGE_TYPES.NO_STORAGE
+ }
+ })
const AdjustInstance = require('../../main').default
@@ -51,10 +57,15 @@ describe('main entry point - test instance initiation when storage is not availa
AdjustInstance.initSdk(suite.config)
- expect(Logger.default.error).toHaveBeenCalledWith('Adjust SDK can not start, there is no storage available')
- suite.expectNotStart()
- suite.expectNotRunningStaticWhenNoStorage()
- suite.expectNotRunningTrackEventWhenNoStorage()
+ expect.assertions(27)
+
+ return Utils.flushPromises()
+ .then(() => {
+ expect(Logger.default.error).toHaveBeenCalledWith('Adjust SDK can not start, there is no storage available')
+ suite.expectNotStart()
+ suite.expectNotRunningStaticWhenNoStorage()
+ suite.expectNotRunningTrackEventWhenNoStorage()
+ })
})
diff --git a/src/sdk/__tests__/main/main.suite.js b/src/sdk/__tests__/main/main.suite.js
index a707d7a..825f683 100644
--- a/src/sdk/__tests__/main/main.suite.js
+++ b/src/sdk/__tests__/main/main.suite.js
@@ -115,13 +115,18 @@ function expectDelayedTrackEvent_Async () {
return {assertions: 4, promise}
}
-function expectRunningTrackEvent () {
+function expectRunningTrackEvent_Async () {
+ const promise = Utils.flushPromises()
+ .then(() => {
+ PubSub.publish('sdk:installed')
+ jest.runOnlyPendingTimers()
- _instance.trackEvent({eventToken: 'blabla'})
+ _instance.trackEvent({eventToken: 'blabla'})
- expect(event.default).toHaveBeenCalledWith({eventToken: 'blabla'}, undefined)
+ expect(event.default).toHaveBeenCalledWith({eventToken: 'blabla'}, undefined)
+ })
- return {assertions: 1}
+ return {assertions: 1, promise}
}
function expectNotRunningTrackEvent () {
@@ -503,7 +508,7 @@ export default function Suite (instance) {
expectPartialStartWithGdprRequest_Async,
expectNotStart,
expectDelayedTrackEvent_Async,
- expectRunningTrackEvent,
+ expectRunningTrackEvent_Async,
expectNotRunningTrackEvent,
expectNotRunningTrackEventWhenNoInstance,
expectNotRunningTrackEventWhenNoStorage,
diff --git a/src/sdk/__tests__/storage/custom-namespace.spec.js b/src/sdk/__tests__/storage/custom-namespace.spec.js
new file mode 100644
index 0000000..6cc0bfb
--- /dev/null
+++ b/src/sdk/__tests__/storage/custom-namespace.spec.js
@@ -0,0 +1,281 @@
+import fakeIDB from 'fake-indexeddb'
+import * as IDBKeyRange from 'fake-indexeddb/lib/FDBKeyRange'
+import { values } from '../../utilities'
+
+jest.useFakeTimers()
+
+jest.mock('../../http')
+jest.mock('../../logger')
+
+describe('Custom namespace functionality', () => {
+ global.indexedDB = fakeIDB
+ global.IDBKeyRange = IDBKeyRange
+
+ let AdjustInstance
+ let Storage
+ let IndexedDB
+ let LocalStorage
+ let QuickStorage
+
+ const config = {
+ appToken: 'some-app-token',
+ environment: 'production',
+ logLevel: 'verbose'
+ }
+
+ function nextTick (times = 1) {
+ let result = Promise.resolve()
+ for (let i = 0; i < times; i++) {
+ result = result.then(() => {
+ jest.runOnlyPendingTimers()
+ return Utils.flushPromises()
+ })
+ }
+ return result
+ }
+
+ function getFromLocalStorage (storage, storeName) {
+ return localStorage.getItem(`${storage}.${storeName}`)
+ }
+
+ /**
+ * Checks the localStorage contains saved preferences object
+ */
+ function expectStorageExists (storage) {
+ const prefsStoreName = QuickStorage.storeNames.preferences.name
+ const preferences = getFromLocalStorage(storage, prefsStoreName)
+ expect(preferences).not.toBeNull()
+ }
+
+ /**
+ * Checks the localStorage contains all the stores
+ */
+ function expectLocalStorageExists (storage, expectExists = true) {
+ const storeNames = values(QuickStorage.storeNames)
+ const stores = storeNames
+ .map((storeOptions) => getFromLocalStorage(storage, storeOptions.name))
+ .filter(i => i !== null && i !== undefined)
+
+ if (expectExists) {
+ expect(stores.length).toBe(storeNames.length)
+ } else {
+ // Preferences store exists even if IndexedDb available, so we expect there is 0 or 1 stores in local storage
+ expect(stores.length).toBeLessThanOrEqual(1)
+ }
+ }
+
+ /**
+ * Checks indexeddb database exists or doesn't depending on `expectExists` argument
+ * Function tries to open a database with provided name and expects callbacks called properly
+ * 3 assertions
+ */
+ function expectDatabaseExists (name, expectExists = true) {
+ let existedBefore = true
+
+ const upgradeneededMock = jest.fn(() => existedBefore = false)
+ const successMock = jest.fn((event) => {
+ event.target.result.close()
+ if (!existedBefore) {
+ global.indexedDB.deleteDatabase(name)
+ }
+ })
+ const errorMock = jest.fn()
+
+ const request = global.indexedDB.open(name)
+
+ request.onupgradeneeded = upgradeneededMock
+ request.onerror = errorMock
+ request.onsuccess = successMock
+
+ return nextTick()
+ .then(() => {
+ if (expectExists) {
+ expect(upgradeneededMock).not.toHaveBeenCalled()
+ } else {
+ expect(upgradeneededMock).toHaveBeenCalled()
+ }
+
+ jest.runOnlyPendingTimers()
+
+ expect(successMock).toHaveBeenCalled()
+ expect(errorMock).not.toHaveBeenCalled()
+ })
+ }
+
+ describe('Checks namespace is correct', () => {
+
+ beforeEach(() => {
+ QuickStorage = require('../../storage/quick-storage').default
+ IndexedDB = require('../../storage/indexeddb').IndexedDB
+ AdjustInstance = require('../../main').default
+
+ jest.spyOn(IndexedDB, 'isSupported').mockImplementation(() => Promise.resolve(false))
+ })
+
+ afterEach(() => {
+ return AdjustInstance.__testonly__.clearDatabase()
+ .then(() => {
+ QuickStorage.deleteData(true)
+
+ jest.clearAllMocks()
+ jest.resetModules()
+ })
+
+ })
+
+ function checkStorageMigrated (config) {
+ const { namespace } = config
+ const custom = !!namespace && namespace.length
+
+ AdjustInstance.initSdk(config)
+
+ expect.assertions(1)
+
+ return Utils.flushPromises()
+ .then(() => expectStorageExists(custom ? 'adjust-sdk-' + namespace : 'adjust-sdk'))
+ }
+
+ it.each([
+ [{ ...config, namespace: undefined }],
+ [{ ...config, namespace: null }],
+ [{ ...config, namespace: '' }],
+ [{ ...config, namespace: 'test' }]
+ ])('Migrates only if proper namespace provided', checkStorageMigrated)
+
+ })
+
+ describe('No default-named storage created', () => {
+
+ beforeEach(() => {
+ QuickStorage = require('../../storage/quick-storage').default
+ IndexedDB = require('../../storage/indexeddb').IndexedDB
+ LocalStorage = require('../../storage/localstorage').LocalStorage
+ AdjustInstance = require('../../main').default
+ })
+
+ afterEach(() => {
+ QuickStorage.deleteData(true)
+
+ jest.clearAllMocks()
+ jest.resetModules()
+ })
+
+ it('Creates a custom-named IndexedDb storage', () => {
+ AdjustInstance.initSdk({ ...config, namespace: 'test' })
+
+ expect.assertions(3)
+
+ return Utils.flushPromises()
+ .then(() => nextTick(4))
+ .then(() => expectDatabaseExists('adjust-sdk-test'))
+ .then(() => AdjustInstance.__testonly__.clearDatabase())
+ })
+
+ it('Creates a custom-named LocalStorage storage', () => {
+ jest.spyOn(IndexedDB, 'isSupported').mockImplementation(() => Promise.resolve(false))
+ jest.spyOn(LocalStorage, 'isSupported').mockImplementation(() => Promise.resolve(true))
+
+ AdjustInstance.initSdk({ ...config, namespace: 'test' })
+
+ expect.assertions(1)
+
+ return Utils.flushPromises()
+ .then(() => {
+ expectLocalStorageExists('adjust-sdk-test')
+ })
+ })
+ })
+
+ describe('Default-named storage exists', () => {
+
+ const activityState = { 'uuid': 'fake-uuid' }
+ const namespace = 'test'
+ const defaultName = 'adjust-sdk'
+ const customName = `adjust-sdk-${namespace}`
+
+ afterEach(() => {
+ QuickStorage.deleteData(true)
+ jest.resetModules()
+ })
+
+ describe('IndexedDb', () => {
+ let Logger
+
+ beforeEach(() => {
+ QuickStorage = require('../../storage/quick-storage').default
+ IndexedDB = require('../../storage/indexeddb').IndexedDB
+ Storage = require('../../storage/storage').default
+
+ return Storage.init() // No namespace initially set
+ .then(() => Storage.addItem('activityState', activityState)) // Add some data to check it was cloned into new database
+ .then(() => Storage.destroy())
+ .then(Utils.flushPromises)
+ .then(() => {
+ jest.resetModules() // Reset Storage module to clear cached initialisation promise
+
+ QuickStorage = require('../../storage/quick-storage').default
+ IndexedDB = require('../../storage/indexeddb').IndexedDB
+ Storage = require('../../storage/storage').default
+ Logger = require('../../logger')
+
+ jest.spyOn(IndexedDB.prototype, 'setCustomName') // Set mocks
+ jest.spyOn(Logger.default, 'info')
+ })
+ })
+
+ afterEach(() => {
+ global.indexedDB.deleteDatabase(customName)
+ })
+
+ it('Migrates data', () => {
+ expect.assertions(9)
+
+ return Storage.init(namespace)
+ .then(() => expect(IndexedDB.prototype.setCustomName).toHaveBeenCalledWith(namespace))
+ .then(() => expect(Logger.default.info).toHaveBeenCalledWith('Database migration finished'))
+ .then(() => expectDatabaseExists(defaultName, false)) // Check default-named database was removed
+ .then(() => expectDatabaseExists(customName)) // And a custom-named one exists
+ .then(() => Storage.getAll('activityState')) // Check new database contains data that was put into old one
+ .then(records => expect(records[0]).toEqual(activityState))
+ })
+
+ })
+
+ describe('LocalStorage', () => {
+ function requireModules () {
+ QuickStorage = require('../../storage/quick-storage').default
+ LocalStorage = require('../../storage/localstorage').LocalStorage
+ IndexedDB = require('../../storage/indexeddb').IndexedDB
+ Storage = require('../../storage/storage').default
+
+ jest.spyOn(IndexedDB, 'isSupported').mockImplementation(() => Promise.resolve(false))
+ jest.spyOn(LocalStorage, 'isSupported').mockImplementation(() => Promise.resolve(true))
+ }
+
+ beforeAll(() => {
+ requireModules()
+
+ return Storage.init() // No namespace initially set
+ .then(() => Storage.addItem('activityState', activityState)) // Add some data to check it was cloned into new database
+ .then(() => {
+ jest.resetModules() // Reset Storage module to clear cached initialisation promise
+
+ requireModules()
+
+ jest.spyOn(QuickStorage, 'setCustomName') // Set mocks
+ })
+ })
+
+ it('Migrates data', () => {
+
+ return Storage.init(namespace)
+ .then(() => expect(QuickStorage.setCustomName).toHaveBeenCalledWith(namespace))
+ .then(() => expectLocalStorageExists(defaultName, false)) // Check default-named database was removed
+ .then(() => expectLocalStorageExists(customName)) // And a custom-named one exists
+ .then(() => Storage.getAll('activityState')) // Check new database contains data that was put into old one
+ .then(records => expect(records[0]).toEqual(activityState))
+ })
+ })
+ })
+
+})
diff --git a/src/sdk/__tests__/storage/indexeddb.spec.js b/src/sdk/__tests__/storage/indexeddb.spec.js
index a8ce090..3eb2937 100644
--- a/src/sdk/__tests__/storage/indexeddb.spec.js
+++ b/src/sdk/__tests__/storage/indexeddb.spec.js
@@ -1,70 +1,117 @@
import fakeIDB from 'fake-indexeddb'
import * as IDBKeyRange from 'fake-indexeddb/lib/FDBKeyRange'
-import * as IndexedDB from '../../storage/indexeddb'
-import * as ActivityState from '../../activity-state'
import * as QuickStorage from '../../storage/quick-storage'
-import * as Logger from '../../logger'
import * as SchemeMap from '../../storage/scheme-map'
import Suite from './storage.suite'
+import { STORAGE_TYPES } from '../../constants'
jest.mock('../../logger')
describe('IndexedDB usage', () => {
- const storeNames = SchemeMap.default.storeNames.left
-
global.indexedDB = fakeIDB
global.IDBKeyRange = IDBKeyRange
- beforeAll(() => {
- jest.spyOn(Logger.default, 'warn')
- })
-
afterAll(() => {
jest.restoreAllMocks()
})
- it('checks if indexedDB is supported', () => {
+ describe('testing indexedDB support', () => {
+ let Logger
- let supported = IndexedDB.isSupported()
+ jest.isolateModules(() => {
+ beforeEach(() => {
+ jest.resetModules()
- expect(supported).toBeTruthy()
- expect(Logger.default.warn).not.toHaveBeenCalled()
+ Logger = require('../../logger')
+ jest.spyOn(Logger.default, 'warn')
+ })
- delete global.indexedDB
+ it('checks if indexedDB is supported', () => {
+ expect.assertions(2)
- supported = IndexedDB.isSupported()
+ const IndexedDB = require('../../storage/indexeddb').IndexedDB
- expect(supported).toBeFalsy()
- expect(Logger.default.warn).toHaveBeenCalledWith('IndexedDB is not supported in this browser')
+ return IndexedDB.isSupported()
+ .then(supported => {
- global.indexedDB = fakeIDB
+ expect(supported).toBeTruthy()
+ expect(Logger.default.warn).not.toHaveBeenCalled()
+ })
+ })
- })
+ it('caches result of indexedDB support', () => {
+ expect.assertions(4)
- it('forces no-support of indexedDB on iOS devices', () => {
+ jest.spyOn(global.indexedDB, 'open')
- expect.assertions(4)
+ const IndexedDB = require('../../storage/indexeddb').IndexedDB
- Utils.setGlobalProp(global.navigator, 'platform')
- const platformSpy = jest.spyOn(global.navigator, 'platform', 'get')
- platformSpy.mockReturnValue('iPhone')
+ return IndexedDB.isSupported()
+ .then(supported => {
+ expect(supported).toBeTruthy()
+ expect(global.indexedDB.open).toHaveBeenCalledTimes(1)
+ return IndexedDB.isSupported()
+ })
+ .then(supported => {
+ expect(supported).toBeTruthy()
+ expect(global.indexedDB.open).toHaveBeenCalledTimes(1)
+ })
+ })
+
+ it('throws error if indexedDB is not supported', () => {
+ expect.assertions(3)
+
+ const IndexedDB = require('../../storage/indexeddb').IndexedDB
+
+ delete global.indexedDB
+
+ return IndexedDB.isSupported()
+ .then(supported => {
- expect(IndexedDB.isSupported()).toBeFalsy()
- expect(Logger.default.warn).toHaveBeenCalledWith('IndexedDB is not supported in this browser')
+ expect(supported).toBeFalsy()
+ expect(Logger.default.warn).toHaveBeenCalledTimes(1)
+ expect(Logger.default.warn).toHaveBeenCalledWith('IndexedDB is not supported in this browser')
- IndexedDB.getAll('activityState')
- .catch(error => {
- expect(error.name).toEqual('IDBNotSupported')
- expect(error.message).toEqual('IndexedDB is not supported')
+ global.indexedDB = fakeIDB
+ })
})
- platformSpy.mockRestore()
+ it('forces no-support of indexedDB on iOS devices', (done) => {
+ expect.assertions(2)
+
+ const IndexedDB = require('../../storage/indexeddb').IndexedDB
+
+ Utils.setGlobalProp(global.navigator, 'platform')
+ const platformSpy = jest.spyOn(global.navigator, 'platform', 'get')
+ platformSpy.mockReturnValue('iPhone')
+
+ return IndexedDB.isSupported()
+ .then(supported => {
+ expect(supported).toBeFalsy()
+ expect(Logger.default.warn).toHaveBeenCalledWith('IndexedDB is not supported in this browser')
+ })
+ .then(() => {
+ platformSpy.mockRestore()
+ done()
+ })
+ })
+ })
})
describe('run common tests for IndexedDB implementation', () => {
jest.isolateModules(() => {
- const Storage = require('../../storage/storage').default
+
+ let Storage = null
+
+ beforeAll(() => {
+ jest.resetModules()
+
+ require('../../storage/indexeddb')
+ Storage = require('../../storage/storage').default
+
+ return Storage.init()
+ })
afterEach(() => {
fakeIDB._databases.clear()
@@ -72,17 +119,31 @@ describe('IndexedDB usage', () => {
})
it('sets storage type to indexedDB', () => {
- expect(Storage.type).toBe('indexedDB')
+ expect(Storage.getType()).toBe(STORAGE_TYPES.INDEXED_DB)
})
- Suite(Storage)()
+ Suite(() => Storage)()
})
})
describe('integration with Identity and data restore', () => {
jest.isolateModules(() => {
- const Identity = require('../../identity')
- const Storage = require('../../storage/storage').default
+ jest.useFakeTimers()
+
+ let Identity = null
+ let Storage = null
+
+ beforeAll(() => {
+ jest.resetModules()
+ require('../../storage/indexeddb')
+
+ Storage = require('../../storage/storage').default
+
+ jest.spyOn(Storage, 'addItem')
+
+ return Storage.init()
+ .then(() => Identity = require('../../identity'))
+ })
it('restores activityState record from the running memory when db gets destroyed', () => {
@@ -90,19 +151,25 @@ describe('IndexedDB usage', () => {
expect.assertions(4)
- expect(Storage.type).toBe('indexedDB')
+ expect(Storage.getType()).toBe(STORAGE_TYPES.INDEXED_DB)
return Identity.start()
- .then(() => {
+ .then((createdActivityState) => {
+ activityState = createdActivityState
Storage.destroy()
fakeIDB._databases.clear()
- activityState = ActivityState.default.current
-
expect(activityState.uuid).toBeDefined()
- return Storage.getFirst('activityState')
+ const promise = Storage.getFirst('activityState')
+
+ return Utils.flushPromises()
+ .then(() => {
+ jest.runOnlyPendingTimers()
+
+ return promise
+ })
})
.then(stored => {
@@ -110,22 +177,25 @@ describe('IndexedDB usage', () => {
expect(stored.uuid).toBeDefined()
Identity.destroy()
+
+ return Utils.flushPromises()
})
})
describe('tests in case indexedDB got supported due to a browser upgrade', () => {
+ const storeNames = SchemeMap.default.storeNames.left
const queueSet = [
- {t: 1, u: '/url'},
- {t: 2, u: 2}
+ { t: 1, u: '/url' },
+ { t: 2, u: 2 }
]
const activityStateSet = [
- {u: 1, la: 12345, at: {a: 'blabla', tt: '123abc', tn: 'tracker', nt: 'bla'}}
+ { u: 1, la: 12345, at: { a: 'blabla', tt: '123abc', tn: 'tracker', nt: 'bla' } }
]
const globalParamsSet = [
- {kt: 'key-11', k: 'key-1', v: 'value-1', t: 1},
- {kt: 'key-21', k: 'key-2', v: 'value-2', t: 1},
- {kt: 'key-32', k: 'key-3', v: 'value-3', t: 2}
+ { kt: 'key-11', k: 'key-1', v: 'value-1', t: 1 },
+ { kt: 'key-21', k: 'key-2', v: 'value-2', t: 1 },
+ { kt: 'key-32', k: 'key-3', v: 'value-3', t: 2 }
]
beforeEach(() => {
@@ -177,8 +247,8 @@ describe('IndexedDB usage', () => {
})
.then(result => {
expect(result).toEqual([
- {timestamp: 1, url: '/url'},
- {timestamp: 2, url: '/event'}
+ { timestamp: 1, url: '/url' },
+ { timestamp: 2, url: '/event' }
])
expect(QuickStorage.default.stores[storeNames.queue.name]).toBeNull()
expect(QuickStorage.default.stores[storeNames.activityState.name]).toBeNull()
@@ -188,9 +258,9 @@ describe('IndexedDB usage', () => {
})
.then(result => {
expect(result).toEqual([
- {keyType: 'key-11', key: 'key-1', value: 'value-1', type: 'callback'},
- {keyType: 'key-21', key: 'key-2', value: 'value-2', type: 'callback'},
- {keyType: 'key-32', key: 'key-3', value: 'value-3', type: 'partner'}
+ { keyType: 'key-11', key: 'key-1', value: 'value-1', type: 'callback' },
+ { keyType: 'key-21', key: 'key-2', value: 'value-2', type: 'callback' },
+ { keyType: 'key-32', key: 'key-3', value: 'value-3', type: 'partner' }
])
})
})
@@ -202,9 +272,9 @@ describe('IndexedDB usage', () => {
let inMemoryActivityState = null
return Identity.start()
- .then(() => {
+ .then((activityState) => {
- inMemoryActivityState = ActivityState.default.current
+ inMemoryActivityState = activityState
expect(inMemoryActivityState.uuid).toBeDefined()
@@ -227,8 +297,8 @@ describe('IndexedDB usage', () => {
})
.then(result => {
expect(result).toEqual([
- {timestamp: 1, url: '/url'},
- {timestamp: 2, url: '/event'}
+ { timestamp: 1, url: '/url' },
+ { timestamp: 2, url: '/event' }
])
expect(QuickStorage.default.stores[storeNames.queue.name]).toBeNull()
expect(QuickStorage.default.stores[storeNames.activityState.name]).toBeNull()
@@ -238,9 +308,9 @@ describe('IndexedDB usage', () => {
})
.then(result => {
expect(result).toEqual([
- {keyType: 'key-11', key: 'key-1', value: 'value-1', type: 'callback'},
- {keyType: 'key-21', key: 'key-2', value: 'value-2', type: 'callback'},
- {keyType: 'key-32', key: 'key-3', value: 'value-3', type: 'partner'}
+ { keyType: 'key-11', key: 'key-1', value: 'value-1', type: 'callback' },
+ { keyType: 'key-21', key: 'key-2', value: 'value-2', type: 'callback' },
+ { keyType: 'key-32', key: 'key-3', value: 'value-3', type: 'partner' }
])
})
})
diff --git a/src/sdk/__tests__/storage/localstorage.spec.js b/src/sdk/__tests__/storage/localstorage.spec.js
index d1aeeca..5d99a61 100644
--- a/src/sdk/__tests__/storage/localstorage.spec.js
+++ b/src/sdk/__tests__/storage/localstorage.spec.js
@@ -1,80 +1,83 @@
-import * as LocalStorage from '../../storage/localstorage'
-import * as Storage from '../../storage/storage'
+import Storage from '../../storage/storage'
import * as Identity from '../../identity'
import * as ActivityState from '../../activity-state'
-import * as Logger from '../../logger'
import Suite from './storage.suite'
+import { STORAGE_TYPES } from '../../constants'
jest.mock('../../logger')
describe('LocalStorage usage', () => {
- beforeAll(() => {
- jest.spyOn(Logger.default, 'warn')
- })
-
afterAll(() => {
jest.restoreAllMocks()
})
- it('checks if localStorage is supported', () => {
+ describe('testing localStorage support', () => {
+ let Logger
- expect.assertions(10)
+ jest.isolateModules(() => {
- const original = global.localStorage
- let supported = LocalStorage.isSupported()
+ beforeEach(() => {
+ jest.resetModules()
- expect(supported).toBeTruthy()
- expect(Logger.default.warn).not.toHaveBeenCalled()
+ require('../../preferences')
- delete global.localStorage
+ Logger = require('../../logger')
+ jest.spyOn(Logger.default, 'warn')
- supported = LocalStorage.isSupported()
+ return Storage.init().then(() => Logger.default.warn.mockClear())
+ })
- expect(supported).toBeFalsy()
- expect(Logger.default.warn).toHaveBeenCalledWith('LocalStorage is not supported in this browser')
+ it('checks if localStorage is supported', () => {
+ expect.assertions(2)
- return Storage.default.getItem('activityState')
- .catch(error => {
- expect(error.name).toEqual('LSNotSupported')
- expect(error.message).toEqual('LocalStorage is not supported')
+ const LocalStorage = require('../../storage/localstorage').LocalStorage
- return Storage.default.getAll('activityState')
+ return LocalStorage.isSupported()
+ .then(supported => {
+ expect(supported).toBeTruthy()
+ expect(Logger.default.warn).not.toHaveBeenCalled()
+ })
})
- .catch(error => {
- expect(error.name).toEqual('LSNotSupported')
- expect(error.message).toEqual('LocalStorage is not supported')
- return Storage.default.clear('activityState')
- })
- .catch(error => {
- expect(error.name).toEqual('LSNotSupported')
- expect(error.message).toEqual('LocalStorage is not supported')
+ it('throws error if localStorage is not supported', () => {
+ expect.assertions(2)
+
+ const original = global.localStorage
+ delete global.localStorage
+
+ const LocalStorage = require('../../storage/localstorage').LocalStorage
- global.localStorage = original
+ return LocalStorage.isSupported()
+ .then(supported => {
+ expect(supported).toBeFalsy()
+ expect(Logger.default.warn).toHaveBeenCalledWith('LocalStorage is not supported in this browser')
+
+ global.localStorage = original
+ })
})
+ })
})
-
it('restores activityState record from the running memory when db gets destroyed', () => {
let activityState = null
expect.assertions(4)
- expect(Storage.default.type).toBe('localStorage')
+ expect(Storage.getType()).toBe(STORAGE_TYPES.LOCAL_STORAGE)
return Identity.start()
.then(() => {
- Storage.default.destroy()
+ Storage.destroy()
localStorage.clear()
activityState = ActivityState.default.current
expect(activityState.uuid).toBeDefined()
- return Storage.default.getFirst('activityState')
+ return Storage.getFirst('activityState')
})
.then(stored => {
@@ -87,16 +90,30 @@ describe('LocalStorage usage', () => {
})
describe('run common tests for LocalStorage implementation', () => {
- afterEach(() => {
- localStorage.clear()
- Storage.default.destroy()
- })
+ jest.isolateModules(() => {
- it('sets storage type to localStorage', () => {
- expect(Storage.default.type).toBe('localStorage')
- })
+ let Storage = null
- Suite(Storage.default)()
+ beforeAll(() => {
+ jest.resetModules()
+
+ require('../../storage/localstorage')
+ Storage = require('../../storage/storage').default
+
+ return Storage.init()
+ })
+
+ afterEach(() => {
+ localStorage.clear()
+ Storage.destroy()
+ })
+
+ it('sets storage type to localStorage', () => {
+ expect(Storage.getType()).toBe(STORAGE_TYPES.LOCAL_STORAGE)
+ })
+
+ Suite(() => Storage)()
+ })
})
})
diff --git a/src/sdk/__tests__/storage/storage.spec.js b/src/sdk/__tests__/storage/storage.spec.js
index db8806b..3eb4d89 100644
--- a/src/sdk/__tests__/storage/storage.spec.js
+++ b/src/sdk/__tests__/storage/storage.spec.js
@@ -1,16 +1,20 @@
import * as Logger from '../../logger'
+import { STORAGE_TYPES } from '../../constants'
+import * as IndexedDB from '../../storage/indexeddb'
+import * as LocalStorage from '../../storage/localstorage'
jest.mock('../../logger')
+jest.mock('../../storage/indexeddb')
+jest.mock('../../storage/localstorage')
+
describe('test storage availability', () => {
function mockAvailability (idbSupport, lsSupport) {
- jest.doMock('../../storage/indexeddb', () => ({
- isSupported () { return idbSupport }
- }))
- jest.doMock('../../storage/localstorage', () => ({
- isSupported () { return lsSupport }
- }))
+ jest.spyOn(IndexedDB.IndexedDB, 'isSupported').mockImplementation(() => Promise.resolve(idbSupport))
+ jest.spyOn(IndexedDB.IndexedDB.prototype, 'setCustomName').mockImplementation(() => Promise.resolve())
+
+ jest.spyOn(LocalStorage.LocalStorage, 'isSupported').mockImplementation(() => Promise.resolve(lsSupport))
}
beforeAll(() => {
@@ -25,7 +29,7 @@ describe('test storage availability', () => {
jest.restoreAllMocks()
})
- it('reports that there is no storage available', () => {
+ it('reports that there is no storage available', (done) => {
expect.assertions(2)
@@ -34,8 +38,14 @@ describe('test storage availability', () => {
const Storage = require('../../storage/storage').default
- expect(Storage).toBeNull()
- expect(Logger.default.error).toHaveBeenCalledWith('There is no storage available, app will run with minimum set of features')
+ return Storage.init()
+ .then(storage => {
+ expect(storage.type).toBe(STORAGE_TYPES.NO_STORAGE)
+
+ expect(Logger.default.error).toHaveBeenCalledWith('There is no storage available, app will run with minimum set of features')
+
+ done()
+ })
})
})
@@ -48,8 +58,11 @@ describe('test storage availability', () => {
const Storage = require('../../storage/storage').default
- expect(Storage).not.toBeNull()
- expect(Storage.type).toBe('indexedDB')
+ return Storage.init()
+ .then(storage => {
+ expect(storage).not.toBeNull()
+ expect(Storage.getType()).toBe(STORAGE_TYPES.INDEXED_DB)
+ })
})
})
@@ -62,8 +75,11 @@ describe('test storage availability', () => {
const Storage = require('../../storage/storage').default
- expect(Storage).not.toBeNull()
- expect(Storage.type).toBe('localStorage')
+ return Storage.init()
+ .then(storage => {
+ expect(storage).not.toBeNull()
+ expect(Storage.getType()).toBe(STORAGE_TYPES.LOCAL_STORAGE)
+ })
})
})
@@ -76,8 +92,11 @@ describe('test storage availability', () => {
const Storage = require('../../storage/storage').default
- expect(Storage).not.toBeNull()
- expect(Storage.type).toBe('indexedDB')
+ return Storage.init()
+ .then(storage => {
+ expect(storage).not.toBeNull()
+ expect(Storage.getType()).toBe(STORAGE_TYPES.INDEXED_DB)
+ })
})
})
diff --git a/src/sdk/__tests__/storage/storage.suite.js b/src/sdk/__tests__/storage/storage.suite.js
index c80fa41..4d58de5 100644
--- a/src/sdk/__tests__/storage/storage.suite.js
+++ b/src/sdk/__tests__/storage/storage.suite.js
@@ -1,957 +1,964 @@
-export default function Suite (Storage) {
+export default function Suite (getStorageCb) {
return () => {
- it('returns rows from particular store', () => {
+ describe('storage common tests', () => {
- // prepare some rows manually
- const queueSet = [
- {timestamp: 1, url: '/url1'},
- {timestamp: 2, url: '/url2'},
- {timestamp: 3, url: '/url3'}
- ]
+ let Storage = null
- expect.assertions(5)
+ beforeAll(() => { Storage = getStorageCb() })
- return Storage.getAll('test')
- .catch(error => {
+ it('returns rows from particular store', () => {
- expect(error.name).toEqual('NotFoundError')
- expect(error.message).toEqual('No objectStore named test in this database')
-
- return Storage.getAll('queue')
- })
- .then(result => {
-
- expect(result).toEqual([])
-
- return Storage.addBulk('queue', queueSet)
- })
- .then(result => {
- expect(result).toEqual([1, 2, 3])
-
- return Storage.getAll('queue')
- })
- .then(result => {
- expect(result).toEqual([
- {timestamp: 1, url: '/url1'},
- {timestamp: 2, url: '/url2'},
- {timestamp: 3, url: '/url3'}
- ])
- })
- })
-
- it('returns undefined if no row present', () => {
-
- expect.assertions(1)
-
- return Storage.getFirst('activityState')
- .then(result => {
- expect(result).toBeUndefined()
- })
-
- })
-
- it('returns empty array if no rows present', () => {
-
- expect.assertions(1)
-
- return Storage.getAll('queue')
- .then(result => {
- expect(result).toEqual([])
- })
-
- })
-
- it('returns first row from particular store', () => {
-
- // prepare some rows manually
- const queueSet = [
- {timestamp: 1552701608300, url: '/url1'},
- {timestamp: 1552705208300, url: '/url2'},
- {timestamp: 1552911178981, url: '/url3'}
- ]
-
- expect.assertions(1)
-
- return Storage.addBulk('queue', queueSet)
- .then(() => Storage.getFirst('queue'))
- .then(result => {
- expect(result).toEqual({timestamp: 1552701608300, url: '/url1'})
- })
-
- })
-
- it('gets item from the activityState store', () => {
-
- // prepare some rows manually
- const activityStateSet = [
- {uuid: 1, lastActive: 12345},
- {uuid: 2, lastActive: 12346}
- ]
-
- expect.assertions(3)
+ // prepare some rows manually
+ const queueSet = [
+ {timestamp: 1, url: '/url1'},
+ {timestamp: 2, url: '/url2'},
+ {timestamp: 3, url: '/url3'}
+ ]
- return Storage.addBulk('activityState', activityStateSet)
- .then(() => Storage.getItem('activityState', 2))
- .then(result => {
- expect(result).toEqual({uuid: 2, lastActive: 12346})
+ expect.assertions(5)
- return Storage.getItem('activityState', 3)
- })
- .catch(error => {
- expect(error.name).toEqual('NotRecordFoundError')
- expect(error.message).toEqual('Requested record not found in activityState store')
- })
- })
-
- it('gets item from the globalParams store - with (quasi)composite key', () => {
+ return Storage.getAll('test')
+ .catch(error => {
- // prepare some rows manually
- const globalParamsSet = [
- {key: 'key1', value: 'cvalue1', type: 'callback'},
- {key: 'key2', value: 'cvalue2', type: 'callback'},
- {key: 'key1', value: 'pvalue1', type: 'partner'}
- ]
+ expect(error.name).toEqual('NotFoundError')
+ expect(error.message).toEqual('No objectStore named test in this database')
- expect.assertions(3)
+ return Storage.getAll('queue')
+ })
+ .then(result => {
- return Storage.addBulk('globalParams', globalParamsSet)
- .then(() => Storage.getItem('globalParams', ['key1', 'callback']))
- .then(result => {
- expect(result).toEqual({keyType: 'key11', key: 'key1', value: 'cvalue1', type: 'callback'})
+ expect(result).toEqual([])
- return Storage.getItem('globalParams', ['key3', 'callback'])
- })
- .catch(error => {
- expect(error.name).toEqual('NotRecordFoundError')
- expect(error.message).toEqual('Requested record not found in globalParams store')
- })
+ return Storage.addBulk('queue', queueSet)
+ })
+ .then(result => {
+ expect(result).toEqual([1, 2, 3])
- })
+ return Storage.getAll('queue')
+ })
+ .then(result => {
+ expect(result).toEqual([
+ {timestamp: 1, url: '/url1'},
+ {timestamp: 2, url: '/url2'},
+ {timestamp: 3, url: '/url3'}
+ ])
+ })
+ })
- it('adds items to the queue store', () => {
+ it('returns undefined if no row present', () => {
- expect.assertions(5)
+ expect.assertions(1)
- return Storage.addItem('queue', {timestamp: 1, url: '/url1'})
- .then(id => {
+ return Storage.getFirst('activityState')
+ .then(result => {
+ expect(result).toBeUndefined()
+ })
- expect(id).toEqual(1)
+ })
- return Storage.getAll('queue')
- })
- .then(result => {
+ it('returns empty array if no rows present', () => {
- expect(result).toEqual([
- {timestamp: 1, url: '/url1'}
- ])
+ expect.assertions(1)
- return Storage.addItem('queue', {timestamp: 2, url: '/url2'})
- })
- .then(id => {
+ return Storage.getAll('queue')
+ .then(result => {
+ expect(result).toEqual([])
+ })
- expect(id).toEqual(2)
+ })
- return Storage.getAll('queue')
- })
- .then(result => {
+ it('returns first row from particular store', () => {
- expect(result).toEqual([
- {timestamp: 1, url: '/url1'},
- {timestamp: 2, url: '/url2'}
- ])
+ // prepare some rows manually
+ const queueSet = [
+ {timestamp: 1552701608300, url: '/url1'},
+ {timestamp: 1552705208300, url: '/url2'},
+ {timestamp: 1552911178981, url: '/url3'}
+ ]
- return Storage.addItem('queue', {timestamp: 2, url: '/url2'})
- })
- .catch(error => {
- expect(error.name).toBe('ConstraintError')
- })
+ expect.assertions(1)
- })
+ return Storage.addBulk('queue', queueSet)
+ .then(() => Storage.getFirst('queue'))
+ .then(result => {
+ expect(result).toEqual({timestamp: 1552701608300, url: '/url1'})
+ })
- it('adds items to the globalParams store - with (quasi)composite key', () => {
+ })
- expect.assertions(7)
+ it('gets item from the activityState store', () => {
- return Storage.addItem('globalParams', {key: 'key1', value: 'value1', type: 'callback'})
- .then(id => {
+ // prepare some rows manually
+ const activityStateSet = [
+ {uuid: 1, lastActive: 12345},
+ {uuid: 2, lastActive: 12346}
+ ]
- expect(id).toEqual(['key1', 'callback'])
+ expect.assertions(3)
- return Storage.getAll('globalParams')
- })
- .then(result => {
+ return Storage.addBulk('activityState', activityStateSet)
+ .then(() => Storage.getItem('activityState', 2))
+ .then(result => {
+ expect(result).toEqual({uuid: 2, lastActive: 12346})
- expect(result).toEqual([
- {keyType: 'key11', key: 'key1', value: 'value1', type: 'callback'}
- ])
+ return Storage.getItem('activityState', 3)
+ })
+ .catch(error => {
+ expect(error.name).toEqual('NotRecordFoundError')
+ expect(error.message).toEqual('Requested record not found in activityState store')
+ })
+ })
- return Storage.addItem('globalParams', {key: 'key2', value: 'value2', type: 'callback'})
- })
- .then(id => {
+ it('gets item from the globalParams store - with (quasi)composite key', () => {
- expect(id).toEqual(['key2', 'callback'])
+ // prepare some rows manually
+ const globalParamsSet = [
+ {key: 'key1', value: 'cvalue1', type: 'callback'},
+ {key: 'key2', value: 'cvalue2', type: 'callback'},
+ {key: 'key1', value: 'pvalue1', type: 'partner'}
+ ]
- return Storage.getAll('globalParams')
- })
- .then(result => {
+ expect.assertions(3)
- expect(result).toEqual([
- {keyType: 'key11', key: 'key1', value: 'value1', type: 'callback'},
- {keyType: 'key21', key: 'key2', value: 'value2', type: 'callback'}
- ])
+ return Storage.addBulk('globalParams', globalParamsSet)
+ .then(() => Storage.getItem('globalParams', ['key1', 'callback']))
+ .then(result => {
+ expect(result).toEqual({keyType: 'key11', key: 'key1', value: 'cvalue1', type: 'callback'})
- return Storage.addItem('globalParams', {key: 'key1', value: 'value1', type: 'partner'})
- })
- .then(id => {
+ return Storage.getItem('globalParams', ['key3', 'callback'])
+ })
+ .catch(error => {
+ expect(error.name).toEqual('NotRecordFoundError')
+ expect(error.message).toEqual('Requested record not found in globalParams store')
+ })
- expect(id).toEqual(['key1', 'partner'])
+ })
- return Storage.getAll('globalParams')
- })
- .then(result => {
+ it('adds items to the queue store', () => {
- expect(result).toEqual([
- {keyType: 'key11', key: 'key1', value: 'value1', type: 'callback'},
- {keyType: 'key21', key: 'key2', value: 'value2', type: 'callback'},
- {keyType: 'key12', key: 'key1', value: 'value1', type: 'partner'}
- ])
+ expect.assertions(5)
- return Storage.addItem('globalParams', {key: 'key1', value: 'value1', type: 'callback'})
- })
- .catch(error => {
- expect(error.name).toBe('ConstraintError')
- })
+ return Storage.addItem('queue', {timestamp: 1, url: '/url1'})
+ .then(id => {
- })
+ expect(id).toEqual(1)
- it('updates items in the activityState store', () => {
+ return Storage.getAll('queue')
+ })
+ .then(result => {
- // prepare some rows manually
- const activityStateSet = [
- {uuid: 1, lastActive: 12345},
- {uuid: 2, lastActive: 12346}
- ]
+ expect(result).toEqual([
+ {timestamp: 1, url: '/url1'}
+ ])
- expect.assertions(8)
+ return Storage.addItem('queue', {timestamp: 2, url: '/url2'})
+ })
+ .then(id => {
- return Storage.addBulk('activityState', activityStateSet)
- .then(() => Storage.updateItem('activityState', {uuid: 1, lastActive: 12347, attribution: {adid: 'something'}}))
- .then(update => {
+ expect(id).toEqual(2)
- expect(update).toEqual(1)
+ return Storage.getAll('queue')
+ })
+ .then(result => {
- return Storage.getAll('activityState')
- })
- .then(result => {
+ expect(result).toEqual([
+ {timestamp: 1, url: '/url1'},
+ {timestamp: 2, url: '/url2'}
+ ])
- expect(result).toEqual([
- {uuid: 1, lastActive: 12347, attribution: {adid: 'something'}},
- {uuid: 2, lastActive: 12346}
- ])
+ return Storage.addItem('queue', {timestamp: 2, url: '/url2'})
+ })
+ .catch(error => {
+ expect(error.name).toBe('ConstraintError')
+ })
- return Storage.updateItem('activityState', {uuid: 1, lastActive: 12348})
- })
- .then(update => {
+ })
- expect(update).toEqual(1)
+ it('adds items to the globalParams store - with (quasi)composite key', () => {
- return Storage.getItem('activityState', 1)
- })
- .then(result => {
+ expect.assertions(7)
- expect(result).toEqual({uuid: 1, lastActive: 12348})
+ return Storage.addItem('globalParams', {key: 'key1', value: 'value1', type: 'callback'})
+ .then(id => {
- return Storage.updateItem('activityState', {uuid: 2, lastActive: 12349, attribution: {adid: 'something'}})
- })
- .then(update => {
+ expect(id).toEqual(['key1', 'callback'])
- expect(update).toEqual(2)
+ return Storage.getAll('globalParams')
+ })
+ .then(result => {
- return Storage.getAll('activityState')
- })
- .then(result => {
+ expect(result).toEqual([
+ {keyType: 'key11', key: 'key1', value: 'value1', type: 'callback'}
+ ])
- expect(result).toEqual([
- {uuid: 1, lastActive: 12348},
- {uuid: 2, lastActive: 12349, attribution: {adid: 'something'}}
- ])
+ return Storage.addItem('globalParams', {key: 'key2', value: 'value2', type: 'callback'})
+ })
+ .then(id => {
- return Storage.updateItem('activityState', {uuid: 3, lastActive: 12350})
- })
- .then(update => {
+ expect(id).toEqual(['key2', 'callback'])
- expect(update).toEqual(3)
+ return Storage.getAll('globalParams')
+ })
+ .then(result => {
- return Storage.getAll('activityState')
- })
- .then(result => {
+ expect(result).toEqual([
+ {keyType: 'key11', key: 'key1', value: 'value1', type: 'callback'},
+ {keyType: 'key21', key: 'key2', value: 'value2', type: 'callback'}
+ ])
- expect(result).toEqual([
- {uuid: 1, lastActive: 12348},
- {uuid: 2, lastActive: 12349, attribution: {adid: 'something'}},
- {uuid: 3, lastActive: 12350}
- ])
- })
+ return Storage.addItem('globalParams', {key: 'key1', value: 'value1', type: 'partner'})
+ })
+ .then(id => {
- })
+ expect(id).toEqual(['key1', 'partner'])
- it('updates items in the globalParams store - with (quasi)composite key', () => {
+ return Storage.getAll('globalParams')
+ })
+ .then(result => {
- // prepare some rows manually
- const globalParamsSet = [
- {key: 'key1', value: 'value1', type: 'callback'},
- {key: 'key2', value: 'value2', type: 'callback'},
- {key: 'key1', value: 'value1', type: 'partner'}
- ]
+ expect(result).toEqual([
+ {keyType: 'key11', key: 'key1', value: 'value1', type: 'callback'},
+ {keyType: 'key21', key: 'key2', value: 'value2', type: 'callback'},
+ {keyType: 'key12', key: 'key1', value: 'value1', type: 'partner'}
+ ])
- expect.assertions(6)
+ return Storage.addItem('globalParams', {key: 'key1', value: 'value1', type: 'callback'})
+ })
+ .catch(error => {
+ expect(error.name).toBe('ConstraintError')
+ })
- return Storage.addBulk('globalParams', globalParamsSet)
- .then(() => Storage.updateItem('globalParams', {key: 'key1', value: 'updated value1', type: 'callback'}))
- .then(update => {
+ })
- expect(update).toEqual(['key1', 'callback'])
+ it('updates items in the activityState store', () => {
- return Storage.getAll('globalParams')
- })
- .then(result => {
+ // prepare some rows manually
+ const activityStateSet = [
+ {uuid: 1, lastActive: 12345},
+ {uuid: 2, lastActive: 12346}
+ ]
- expect(result).toEqual([
- {keyType: 'key11', key: 'key1', value: 'updated value1', type: 'callback'},
- {keyType: 'key21', key: 'key2', value: 'value2', type: 'callback'},
- {keyType: 'key12', key: 'key1', value: 'value1', type: 'partner'}
- ])
+ expect.assertions(8)
- return Storage.updateItem('globalParams', {key: 'key2', value: 'updated value2', type: 'callback'})
- })
- .then(update => {
+ return Storage.addBulk('activityState', activityStateSet)
+ .then(() => Storage.updateItem('activityState', {uuid: 1, lastActive: 12347, attribution: {adid: 'something'}}))
+ .then(update => {
- expect(update).toEqual(['key2', 'callback'])
+ expect(update).toEqual(1)
- return Storage.getAll('globalParams')
- })
- .then(result => {
+ return Storage.getAll('activityState')
+ })
+ .then(result => {
- expect(result).toEqual([
- {keyType: 'key11', key: 'key1', value: 'updated value1', type: 'callback'},
- {keyType: 'key21', key: 'key2', value: 'updated value2', type: 'callback'},
- {keyType: 'key12', key: 'key1', value: 'value1', type: 'partner'}
- ])
+ expect(result).toEqual([
+ {uuid: 1, lastActive: 12347, attribution: {adid: 'something'}},
+ {uuid: 2, lastActive: 12346}
+ ])
- return Storage.updateItem('globalParams', {key: 'key2', value: 'value2', type: 'partner'})
- })
- .then(update => {
+ return Storage.updateItem('activityState', {uuid: 1, lastActive: 12348})
+ })
+ .then(update => {
- expect(update).toEqual(['key2', 'partner'])
+ expect(update).toEqual(1)
- return Storage.getAll('globalParams')
- })
- .then(result => {
- expect(result).toEqual([
- {keyType: 'key11', key: 'key1', value: 'updated value1', type: 'callback'},
- {keyType: 'key21', key: 'key2', value: 'updated value2', type: 'callback'},
- {keyType: 'key12', key: 'key1', value: 'value1', type: 'partner'},
- {keyType: 'key22', key: 'key2', value: 'value2', type: 'partner'}
- ])
- })
+ return Storage.getItem('activityState', 1)
+ })
+ .then(result => {
- })
+ expect(result).toEqual({uuid: 1, lastActive: 12348})
- it('deletes item by item in the queue store', () => {
+ return Storage.updateItem('activityState', {uuid: 2, lastActive: 12349, attribution: {adid: 'something'}})
+ })
+ .then(update => {
- // prepare some rows manually
- const queueSet = [
- {timestamp: 1, url: '/url1'},
- {timestamp: 2, url: '/url2'},
- {timestamp: 3, url: '/url3'}
- ]
+ expect(update).toEqual(2)
- expect.assertions(7)
+ return Storage.getAll('activityState')
+ })
+ .then(result => {
- return Storage.addBulk('queue', queueSet)
- .then(() => Storage.getAll('queue'))
- .then(result => {
+ expect(result).toEqual([
+ {uuid: 1, lastActive: 12348},
+ {uuid: 2, lastActive: 12349, attribution: {adid: 'something'}}
+ ])
- expect(result).toEqual([
- {timestamp: 1, url: '/url1'},
- {timestamp: 2, url: '/url2'},
- {timestamp: 3, url: '/url3'}
- ])
+ return Storage.updateItem('activityState', {uuid: 3, lastActive: 12350})
+ })
+ .then(update => {
- return Storage.deleteItem('queue', 2)
- })
- .then(deleted => {
+ expect(update).toEqual(3)
- expect(deleted).toEqual(2)
+ return Storage.getAll('activityState')
+ })
+ .then(result => {
- return Storage.getAll('queue')
- })
- .then(result => {
+ expect(result).toEqual([
+ {uuid: 1, lastActive: 12348},
+ {uuid: 2, lastActive: 12349, attribution: {adid: 'something'}},
+ {uuid: 3, lastActive: 12350}
+ ])
+ })
- expect(result).toEqual([
- {timestamp: 1, url: '/url1'},
- {timestamp: 3, url: '/url3'}
- ])
+ })
- return Storage.deleteItem('queue', 1)
- })
- .then(deleted => {
+ it('updates items in the globalParams store - with (quasi)composite key', () => {
- expect(deleted).toEqual(1)
+ // prepare some rows manually
+ const globalParamsSet = [
+ {key: 'key1', value: 'value1', type: 'callback'},
+ {key: 'key2', value: 'value2', type: 'callback'},
+ {key: 'key1', value: 'value1', type: 'partner'}
+ ]
- return Storage.getAll('queue')
- })
- .then(result => {
+ expect.assertions(6)
- expect(result).toEqual([
- {timestamp: 3, url: '/url3'}
- ])
+ return Storage.addBulk('globalParams', globalParamsSet)
+ .then(() => Storage.updateItem('globalParams', {key: 'key1', value: 'updated value1', type: 'callback'}))
+ .then(update => {
- return Storage.deleteItem('queue', 5)
- })
- .then(deleted => {
+ expect(update).toEqual(['key1', 'callback'])
- expect(deleted).toEqual(5)
+ return Storage.getAll('globalParams')
+ })
+ .then(result => {
- return Storage.getAll('queue')
- })
- .then(result => {
- expect(result).toEqual([
- {timestamp: 3, url: '/url3'}
- ])
- })
- })
+ expect(result).toEqual([
+ {keyType: 'key11', key: 'key1', value: 'updated value1', type: 'callback'},
+ {keyType: 'key21', key: 'key2', value: 'value2', type: 'callback'},
+ {keyType: 'key12', key: 'key1', value: 'value1', type: 'partner'}
+ ])
- it('deletes item by item in the globalParams store - with (quasi)composite key', () => {
+ return Storage.updateItem('globalParams', {key: 'key2', value: 'updated value2', type: 'callback'})
+ })
+ .then(update => {
- // prepare some rows manually
- const globalParamsSet = [
- {key: 'key1', value: 'value1', type: 'callback'},
- {key: 'key2', value: 'value2', type: 'callback'},
- {key: 'key1', value: 'value1', type: 'partner'},
- {key: 'key2', value: 'value2', type: 'partner'}
- ]
+ expect(update).toEqual(['key2', 'callback'])
- expect.assertions(6)
+ return Storage.getAll('globalParams')
+ })
+ .then(result => {
- return Storage.addBulk('globalParams', globalParamsSet)
- .then(() => Storage.deleteItem('globalParams', ['key2', 'callback']))
- .then(deleted => {
+ expect(result).toEqual([
+ {keyType: 'key11', key: 'key1', value: 'updated value1', type: 'callback'},
+ {keyType: 'key21', key: 'key2', value: 'updated value2', type: 'callback'},
+ {keyType: 'key12', key: 'key1', value: 'value1', type: 'partner'}
+ ])
- expect(deleted).toEqual(['key2', 'callback'])
+ return Storage.updateItem('globalParams', {key: 'key2', value: 'value2', type: 'partner'})
+ })
+ .then(update => {
- return Storage.getAll('globalParams')
- })
- .then(result => {
+ expect(update).toEqual(['key2', 'partner'])
- expect(result).toEqual([
- {keyType: 'key11', key: 'key1', value: 'value1', type: 'callback'},
- {keyType: 'key12', key: 'key1', value: 'value1', type: 'partner'},
- {keyType: 'key22', key: 'key2', value: 'value2', type: 'partner'}
- ])
+ return Storage.getAll('globalParams')
+ })
+ .then(result => {
+ expect(result).toEqual([
+ {keyType: 'key11', key: 'key1', value: 'updated value1', type: 'callback'},
+ {keyType: 'key21', key: 'key2', value: 'updated value2', type: 'callback'},
+ {keyType: 'key12', key: 'key1', value: 'value1', type: 'partner'},
+ {keyType: 'key22', key: 'key2', value: 'value2', type: 'partner'}
+ ])
+ })
- return Storage.deleteItem('globalParams', ['key1', 'partner'])
- })
- .then(deleted => {
+ })
- expect(deleted).toEqual(['key1', 'partner'])
+ it('deletes item by item in the queue store', () => {
- return Storage.getAll('globalParams')
- })
- .then(result => {
+ // prepare some rows manually
+ const queueSet = [
+ {timestamp: 1, url: '/url1'},
+ {timestamp: 2, url: '/url2'},
+ {timestamp: 3, url: '/url3'}
+ ]
- expect(result).toEqual([
- {keyType: 'key11', key: 'key1', value: 'value1', type: 'callback'},
- {keyType: 'key22', key: 'key2', value: 'value2', type: 'partner'}
- ])
+ expect.assertions(7)
- return Storage.deleteItem('globalParams', ['key5', 'callback'])
- })
- .then(deleted => {
+ return Storage.addBulk('queue', queueSet)
+ .then(() => Storage.getAll('queue'))
+ .then(result => {
- expect(deleted).toEqual(['key5', 'callback'])
+ expect(result).toEqual([
+ {timestamp: 1, url: '/url1'},
+ {timestamp: 2, url: '/url2'},
+ {timestamp: 3, url: '/url3'}
+ ])
- return Storage.getAll('globalParams')
- })
- .then(result => {
+ return Storage.deleteItem('queue', 2)
+ })
+ .then(deleted => {
- expect(result).toEqual([
- {keyType: 'key11', key: 'key1', value: 'value1', type: 'callback'},
- {keyType: 'key22', key: 'key2', value: 'value2', type: 'partner'}
- ])
- })
+ expect(deleted).toEqual(2)
- })
+ return Storage.getAll('queue')
+ })
+ .then(result => {
- it('deletes items until certain point from the queue store', () => {
+ expect(result).toEqual([
+ {timestamp: 1, url: '/url1'},
+ {timestamp: 3, url: '/url3'}
+ ])
- // prepare some rows manually
- const queueSet = [
- {timestamp: 1552701608300, url: '/url1'},
- {timestamp: 1552705208300, url: '/url2'},
- {timestamp: 1552911178981, url: '/url3'}
- ]
+ return Storage.deleteItem('queue', 1)
+ })
+ .then(deleted => {
- expect.assertions(3)
+ expect(deleted).toEqual(1)
- return Storage.addBulk('queue', queueSet)
- .then(() => Storage.getAll('queue'))
- .then(result => {
+ return Storage.getAll('queue')
+ })
+ .then(result => {
- expect(result).toEqual([
- {timestamp: 1552701608300, url: '/url1'},
- {timestamp: 1552705208300, url: '/url2'},
- {timestamp: 1552911178981, url: '/url3'}
- ])
+ expect(result).toEqual([
+ {timestamp: 3, url: '/url3'}
+ ])
- return Storage.deleteBulk('queue', 1552705208300, 'upperBound')
- })
- .then(deleted => {
- expect(deleted).toEqual([1552701608300, 1552705208300])
- })
- .then(() => Storage.getAll('queue'))
- .then(result => {
- expect(result).toEqual([
- {timestamp: 1552911178981, url: '/url3'}
- ])
- })
+ return Storage.deleteItem('queue', 5)
+ })
+ .then(deleted => {
- })
+ expect(deleted).toEqual(5)
- it('deletes items from certain point from the queue store', () => {
+ return Storage.getAll('queue')
+ })
+ .then(result => {
+ expect(result).toEqual([
+ {timestamp: 3, url: '/url3'}
+ ])
+ })
+ })
- // prepare some rows manually
- const queueSet = [
- {timestamp: 1552701608300, url: '/url1'},
- {timestamp: 1552705208300, url: '/url2'},
- {timestamp: 1552911178981, url: '/url3'},
- {timestamp: 1552911178991, url: '/url4'},
- {timestamp: 1552921178991, url: '/url5'}
- ]
+ it('deletes item by item in the globalParams store - with (quasi)composite key', () => {
- expect.assertions(3)
+ // prepare some rows manually
+ const globalParamsSet = [
+ {key: 'key1', value: 'value1', type: 'callback'},
+ {key: 'key2', value: 'value2', type: 'callback'},
+ {key: 'key1', value: 'value1', type: 'partner'},
+ {key: 'key2', value: 'value2', type: 'partner'}
+ ]
- return Storage.addBulk('queue', queueSet)
- .then(() => Storage.getAll('queue'))
- .then(result => {
+ expect.assertions(6)
- expect(result).toEqual([
- {timestamp: 1552701608300, url: '/url1'},
- {timestamp: 1552705208300, url: '/url2'},
- {timestamp: 1552911178981, url: '/url3'},
- {timestamp: 1552911178991, url: '/url4'},
- {timestamp: 1552921178991, url: '/url5'}
- ])
+ return Storage.addBulk('globalParams', globalParamsSet)
+ .then(() => Storage.deleteItem('globalParams', ['key2', 'callback']))
+ .then(deleted => {
- return Storage.deleteBulk('queue', 1552911178981, 'lowerBound')
- })
- .then(deleted => {
- expect(deleted).toEqual([1552911178981, 1552911178991, 1552921178991])
- })
- .then(() => Storage.getAll('queue'))
- .then(result => {
- expect(result).toEqual([
- {timestamp: 1552701608300, url: '/url1'},
- {timestamp: 1552705208300, url: '/url2'}
- ])
- })
+ expect(deleted).toEqual(['key2', 'callback'])
- })
+ return Storage.getAll('globalParams')
+ })
+ .then(result => {
- it('deletes items in bulk by type from the globalParams store - with (quasi)composite key', () => {
-
- // prepare some rows manually
- const globalParamsSet = [
- {key: 'key4', value: 'value4', type: 'callback'},
- {key: 'key2', value: 'value2', type: 'callback'},
- {key: 'key2', value: 'value2', type: 'partner'},
- {key: 'key3', value: 'value3', type: 'callback'},
- {key: 'key1', value: 'value1', type: 'partner'},
- {key: 'key1', value: 'value1', type: 'callback'}
- ]
-
- expect.assertions(5)
-
- return Storage.addBulk('globalParams', globalParamsSet)
- .then(() => Storage.getAll('globalParams'))
- .then(result => {
- expect(result).toEqual([
- {keyType: 'key11', key: 'key1', value: 'value1', type: 'callback'},
- {keyType: 'key21', key: 'key2', value: 'value2', type: 'callback'},
- {keyType: 'key31', key: 'key3', value: 'value3', type: 'callback'},
- {keyType: 'key41', key: 'key4', value: 'value4', type: 'callback'},
- {keyType: 'key12', key: 'key1', value: 'value1', type: 'partner'},
- {keyType: 'key22', key: 'key2', value: 'value2', type: 'partner'}
- ])
-
- return Storage.deleteBulk('globalParams', 'partner')
- })
- .then(deleted => {
- expect(deleted).toEqualArrayIgnoringOrder([
- ['key1', 'partner'],
- ['key2', 'partner']
- ])
+ expect(result).toEqual([
+ {keyType: 'key11', key: 'key1', value: 'value1', type: 'callback'},
+ {keyType: 'key12', key: 'key1', value: 'value1', type: 'partner'},
+ {keyType: 'key22', key: 'key2', value: 'value2', type: 'partner'}
+ ])
- return Storage.getAll('globalParams')
- })
- .then(result => {
- expect(result).toEqual([
- {keyType: 'key11', key: 'key1', value: 'value1', type: 'callback'},
- {keyType: 'key21', key: 'key2', value: 'value2', type: 'callback'},
- {keyType: 'key31', key: 'key3', value: 'value3', type: 'callback'},
- {keyType: 'key41', key: 'key4', value: 'value4', type: 'callback'}
- ])
-
- return Storage.deleteBulk('globalParams', 'callback')
- })
- .then(deleted => {
- expect(deleted).toEqualArrayIgnoringOrder([
- ['key1', 'callback'],
- ['key2', 'callback'],
- ['key3', 'callback'],
- ['key4', 'callback']
- ])
-
- return Storage.getAll('globalParams')
- })
- .then(result => {
- expect(result).toEqual([])
- })
+ return Storage.deleteItem('globalParams', ['key1', 'partner'])
+ })
+ .then(deleted => {
- })
+ expect(deleted).toEqual(['key1', 'partner'])
- it('deletes items in bulk from activityState store', () => {
- const activityStateSet = [
- {uuid: 'abcd1'},
- {uuid: 'abcd2'},
- {uuid: 'abcd3'},
- {uuid: 'abcd4'}
- ]
+ return Storage.getAll('globalParams')
+ })
+ .then(result => {
- expect.assertions(2)
+ expect(result).toEqual([
+ {keyType: 'key11', key: 'key1', value: 'value1', type: 'callback'},
+ {keyType: 'key22', key: 'key2', value: 'value2', type: 'partner'}
+ ])
- return Storage.addBulk('activityState', activityStateSet)
- .then(() => Storage.deleteBulk('activityState', 'abcd3', 'upperBound'))
- .then(result => {
- expect(result).toEqual(['abcd1', 'abcd2', 'abcd3'])
+ return Storage.deleteItem('globalParams', ['key5', 'callback'])
+ })
+ .then(deleted => {
- return Storage.getAll('activityState')
- })
- .then(result => {
- expect(result).toEqual([{uuid: 'abcd4'}])
- })
- })
+ expect(deleted).toEqual(['key5', 'callback'])
- it('auto-increments ids when adding to the eventDeduplication store', () => {
+ return Storage.getAll('globalParams')
+ })
+ .then(result => {
- expect.assertions(1)
+ expect(result).toEqual([
+ {keyType: 'key11', key: 'key1', value: 'value1', type: 'callback'},
+ {keyType: 'key22', key: 'key2', value: 'value2', type: 'partner'}
+ ])
+ })
- return Storage.addItem('eventDeduplication', {id: 'd'})
- .then(() => Storage.addBulk('eventDeduplication', [
- {id: 'c'},
- {id: 'x'},
- {id: 'b'},
- {id: 'a'}
- ]))
- .then(() => Storage.updateItem('eventDeduplication', {internalId: 3, id: 'xxx'}))
- .then(() => Storage.updateItem('eventDeduplication', {id: 'eee'}))
- .then(() => Storage.deleteItem('eventDeduplication', 2))
- .then(() => Storage.addItem('eventDeduplication', {id: 'ccc'}))
- .then(() => Storage.getAll('eventDeduplication'))
- .then(result => {
- expect(result).toEqual([
- {internalId: 1, id: 'd'},
- {internalId: 3, id: 'xxx'},
- {internalId: 4, id: 'b'},
- {internalId: 5, id: 'a'},
- {internalId: 6, id: 'eee'},
- {internalId: 7, id: 'ccc'}
- ])
- })
- })
+ })
- it('deletes items in bulk from eventDeduplication store', () => {
- const ids = [
- {id: 'ddd'},
- {id: 'ccc'},
- {id: 'xxx'},
- {id: 'bbb'},
- {id: 'aaa'}
- ]
+ it('deletes items until certain point from the queue store', () => {
- expect.assertions(2)
+ // prepare some rows manually
+ const queueSet = [
+ {timestamp: 1552701608300, url: '/url1'},
+ {timestamp: 1552705208300, url: '/url2'},
+ {timestamp: 1552911178981, url: '/url3'}
+ ]
- return Storage.addBulk('eventDeduplication', ids)
- .then(() => Storage.getAll('eventDeduplication'))
- .then(() => Storage.deleteBulk('eventDeduplication', 3, 'lowerBound'))
- .then(result => {
- expect(result).toEqual([3, 4, 5])
+ expect.assertions(3)
- return Storage.getAll('eventDeduplication')
- })
- .then(result => {
- expect(result).toEqual([
- {internalId: 1, id: 'ddd'},
- {internalId: 2, id: 'ccc'}
- ])
- })
- })
+ return Storage.addBulk('queue', queueSet)
+ .then(() => Storage.getAll('queue'))
+ .then(result => {
- it('trim from the left', () => {
- const ids = [
- {id: 'a'},
- {id: 'd'},
- {id: 'b'},
- {id: 'e'},
- {id: 'c'}
- ]
+ expect(result).toEqual([
+ {timestamp: 1552701608300, url: '/url1'},
+ {timestamp: 1552705208300, url: '/url2'},
+ {timestamp: 1552911178981, url: '/url3'}
+ ])
- expect.assertions(3)
+ return Storage.deleteBulk('queue', 1552705208300, 'upperBound')
+ })
+ .then(deleted => {
+ expect(deleted).toEqual([1552701608300, 1552705208300])
+ })
+ .then(() => Storage.getAll('queue'))
+ .then(result => {
+ expect(result).toEqual([
+ {timestamp: 1552911178981, url: '/url3'}
+ ])
+ })
- return Storage.trimItems('eventDeduplication', 5)
- .then(result => {
- expect(result).toEqual([])
+ })
- return Storage.addBulk('eventDeduplication', ids)
- })
- .then(() => Storage.trimItems('eventDeduplication', 3))
- .then(result => {
- expect(result).toEqual([1, 2, 3])
+ it('deletes items from certain point from the queue store', () => {
- return Storage.getAll('eventDeduplication')
- })
- .then(result => {
- expect(result).toEqual([
- {internalId: 4, id: 'e'},
- {internalId: 5, id: 'c'}
- ])
- })
+ // prepare some rows manually
+ const queueSet = [
+ {timestamp: 1552701608300, url: '/url1'},
+ {timestamp: 1552705208300, url: '/url2'},
+ {timestamp: 1552911178981, url: '/url3'},
+ {timestamp: 1552911178991, url: '/url4'},
+ {timestamp: 1552921178991, url: '/url5'}
+ ]
- })
+ expect.assertions(3)
- it('returns number of items in the store', () => {
- const ids = [
- {id: 'id1'},
- {id: 'id2'},
- {id: 'id3'}
- ]
+ return Storage.addBulk('queue', queueSet)
+ .then(() => Storage.getAll('queue'))
+ .then(result => {
- expect.assertions(2)
+ expect(result).toEqual([
+ {timestamp: 1552701608300, url: '/url1'},
+ {timestamp: 1552705208300, url: '/url2'},
+ {timestamp: 1552911178981, url: '/url3'},
+ {timestamp: 1552911178991, url: '/url4'},
+ {timestamp: 1552921178991, url: '/url5'}
+ ])
- return Storage.count('eventDeduplication')
- .then(count => {
- expect(count).toEqual(0)
+ return Storage.deleteBulk('queue', 1552911178981, 'lowerBound')
+ })
+ .then(deleted => {
+ expect(deleted).toEqual([1552911178981, 1552911178991, 1552921178991])
+ })
+ .then(() => Storage.getAll('queue'))
+ .then(result => {
+ expect(result).toEqual([
+ {timestamp: 1552701608300, url: '/url1'},
+ {timestamp: 1552705208300, url: '/url2'}
+ ])
+ })
- return Storage.addBulk('eventDeduplication', ids)
- })
- .then(() => Storage.count('eventDeduplication'))
- .then(count => {
- expect(count).toEqual(3)
- })
+ })
- })
+ it('deletes items in bulk by type from the globalParams store - with (quasi)composite key', () => {
- it('clears items from the queue store', () => {
+ // prepare some rows manually
+ const globalParamsSet = [
+ {key: 'key4', value: 'value4', type: 'callback'},
+ {key: 'key2', value: 'value2', type: 'callback'},
+ {key: 'key2', value: 'value2', type: 'partner'},
+ {key: 'key3', value: 'value3', type: 'callback'},
+ {key: 'key1', value: 'value1', type: 'partner'},
+ {key: 'key1', value: 'value1', type: 'callback'}
+ ]
- // prepare some rows manually
- const queueSet = [
- {timestamp: 1, url: '/url1'},
- {timestamp: 2, url: '/url2'}
- ]
+ expect.assertions(5)
- expect.assertions(2)
+ return Storage.addBulk('globalParams', globalParamsSet)
+ .then(() => Storage.getAll('globalParams'))
+ .then(result => {
+ expect(result).toEqual([
+ {keyType: 'key11', key: 'key1', value: 'value1', type: 'callback'},
+ {keyType: 'key21', key: 'key2', value: 'value2', type: 'callback'},
+ {keyType: 'key31', key: 'key3', value: 'value3', type: 'callback'},
+ {keyType: 'key41', key: 'key4', value: 'value4', type: 'callback'},
+ {keyType: 'key12', key: 'key1', value: 'value1', type: 'partner'},
+ {keyType: 'key22', key: 'key2', value: 'value2', type: 'partner'}
+ ])
- return Storage.addBulk('queue', queueSet)
- .then(() => Storage.getAll('queue'))
- .then(result => {
+ return Storage.deleteBulk('globalParams', 'partner')
+ })
+ .then(deleted => {
+ expect(deleted).toEqualArrayIgnoringOrder([
+ ['key1', 'partner'],
+ ['key2', 'partner']
+ ])
- expect(result).toEqual([
- {timestamp: 1, url: '/url1'},
- {timestamp: 2, url: '/url2'}
- ])
+ return Storage.getAll('globalParams')
+ })
+ .then(result => {
+ expect(result).toEqual([
+ {keyType: 'key11', key: 'key1', value: 'value1', type: 'callback'},
+ {keyType: 'key21', key: 'key2', value: 'value2', type: 'callback'},
+ {keyType: 'key31', key: 'key3', value: 'value3', type: 'callback'},
+ {keyType: 'key41', key: 'key4', value: 'value4', type: 'callback'}
+ ])
- return Storage.clear('queue')
- })
- .then(() => Storage.getAll('queue'))
- .then(result => {
- expect(result).toEqual([])
- })
+ return Storage.deleteBulk('globalParams', 'callback')
+ })
+ .then(deleted => {
+ expect(deleted).toEqualArrayIgnoringOrder([
+ ['key1', 'callback'],
+ ['key2', 'callback'],
+ ['key3', 'callback'],
+ ['key4', 'callback']
+ ])
- })
+ return Storage.getAll('globalParams')
+ })
+ .then(result => {
+ expect(result).toEqual([])
+ })
- describe('performing add bulk operation', () => {
+ })
- it('fails when array is not provided', () => {
+ it('deletes items in bulk from activityState store', () => {
+ const activityStateSet = [
+ {uuid: 'abcd1'},
+ {uuid: 'abcd2'},
+ {uuid: 'abcd3'},
+ {uuid: 'abcd4'}
+ ]
- expect.assertions(4)
+ expect.assertions(2)
- return Storage.addBulk('globalParams', [])
- .catch(error => {
- expect(error.name).toEqual('NoTargetDefined')
- expect(error.message).toEqual('No array provided to perform add bulk operation into globalParams store')
+ return Storage.addBulk('activityState', activityStateSet)
+ .then(() => Storage.deleteBulk('activityState', 'abcd3', 'upperBound'))
+ .then(result => {
+ expect(result).toEqual(['abcd1', 'abcd2', 'abcd3'])
- return Storage.addBulk('queue')
+ return Storage.getAll('activityState')
})
- .catch(error => {
- expect(error.name).toEqual('NoTargetDefined')
- expect(error.message).toEqual('No array provided to perform add bulk operation into queue store')
+ .then(result => {
+ expect(result).toEqual([{uuid: 'abcd4'}])
})
-
})
- it('adds rows into globalParams store', () => {
+ it('auto-increments ids when adding to the eventDeduplication store', () => {
- const globalParamsSet1 = [
- {key: 'bla', value: 'truc', type: 'callback'},
- {key: 'key1', value: 'value1', type: 'callback'},
- {key: 'eto', value: 'tako', type: 'partner'}
- ]
-
- const globalParamsSet2 = [
- {key: 'key2', value: 'value2', type: 'callback'},
- {key: 'par', value: 'tner', type: 'partner'}
- ]
-
- expect.assertions(3)
+ expect.assertions(1)
- return Storage.addBulk('globalParams', globalParamsSet1)
+ return Storage.addItem('eventDeduplication', {id: 'd'})
+ .then(() => Storage.addBulk('eventDeduplication', [
+ {id: 'c'},
+ {id: 'x'},
+ {id: 'b'},
+ {id: 'a'}
+ ]))
+ .then(() => Storage.updateItem('eventDeduplication', {internalId: 3, id: 'xxx'}))
+ .then(() => Storage.updateItem('eventDeduplication', {id: 'eee'}))
+ .then(() => Storage.deleteItem('eventDeduplication', 2))
+ .then(() => Storage.addItem('eventDeduplication', {id: 'ccc'}))
+ .then(() => Storage.getAll('eventDeduplication'))
.then(result => {
- expect(result).toEqualArrayIgnoringOrder([
- ['bla', 'callback'],
- ['key1', 'callback'],
- ['eto', 'partner']
+ expect(result).toEqual([
+ {internalId: 1, id: 'd'},
+ {internalId: 3, id: 'xxx'},
+ {internalId: 4, id: 'b'},
+ {internalId: 5, id: 'a'},
+ {internalId: 6, id: 'eee'},
+ {internalId: 7, id: 'ccc'}
])
-
- return Storage.addBulk('globalParams', globalParamsSet2)
})
+ })
+
+ it('deletes items in bulk from eventDeduplication store', () => {
+ const ids = [
+ {id: 'ddd'},
+ {id: 'ccc'},
+ {id: 'xxx'},
+ {id: 'bbb'},
+ {id: 'aaa'}
+ ]
+
+ expect.assertions(2)
+
+ return Storage.addBulk('eventDeduplication', ids)
+ .then(() => Storage.getAll('eventDeduplication'))
+ .then(() => Storage.deleteBulk('eventDeduplication', 3, 'lowerBound'))
.then(result => {
- expect(result).toEqual([
- ['key2', 'callback'],
- ['par', 'partner']
- ])
+ expect(result).toEqual([3, 4, 5])
- return Storage.getAll('globalParams')
+ return Storage.getAll('eventDeduplication')
})
.then(result => {
expect(result).toEqual([
- {keyType: 'bla1', key: 'bla', value: 'truc', type: 'callback'},
- {keyType: 'key11', key: 'key1', value: 'value1', type: 'callback'},
- {keyType: 'key21', key: 'key2', value: 'value2', type: 'callback'},
- {keyType: 'eto2', key: 'eto', value: 'tako', type: 'partner'},
- {keyType: 'par2', key: 'par', value: 'tner', type: 'partner'}
+ {internalId: 1, id: 'ddd'},
+ {internalId: 2, id: 'ccc'}
])
})
})
- it('adds rows into globalParams store and overwrite existing key at later point', () => {
-
- const globalParamsSet1 = [
- {key: 'bla', value: 'truc', type: 'callback'},
- {key: 'key1', value: 'value1', type: 'callback'},
- {key: 'eto', value: 'tako', type: 'partner'},
- {key: 'key2', value: 'value2', type: 'callback'}
- ]
-
- const globalParamsSet2 = [
- {key: 'key1', value: 'new key1 value', type: 'callback'},
- {key: 'par', value: 'tner', type: 'partner'},
- {key: 'bla', value: 'truc', type: 'partner'},
- {key: 'eto', value: 'tako new', type: 'partner'}
+ it('trim from the left', () => {
+ const ids = [
+ {id: 'a'},
+ {id: 'd'},
+ {id: 'b'},
+ {id: 'e'},
+ {id: 'c'}
]
expect.assertions(3)
- return Storage.addBulk('globalParams', globalParamsSet1)
+ return Storage.trimItems('eventDeduplication', 5)
.then(result => {
- expect(result).toEqual([
- ['bla', 'callback'],
- ['key1', 'callback'],
- ['eto', 'partner'],
- ['key2', 'callback']
- ])
+ expect(result).toEqual([])
- return Storage.addBulk('globalParams', globalParamsSet2, true)
+ return Storage.addBulk('eventDeduplication', ids)
})
+ .then(() => Storage.trimItems('eventDeduplication', 3))
.then(result => {
- expect(result).toEqualArrayIgnoringOrder([
- ['key1', 'callback'],
- ['par', 'partner'],
- ['bla', 'partner'],
- ['eto', 'partner']
- ])
+ expect(result).toEqual([1, 2, 3])
- return Storage.getAll('globalParams')
+ return Storage.getAll('eventDeduplication')
})
.then(result => {
expect(result).toEqual([
- {keyType: 'bla1', key: 'bla', value: 'truc', type: 'callback'},
- {keyType: 'key11', key: 'key1', value: 'new key1 value', type: 'callback'},
- {keyType: 'key21', key: 'key2', value: 'value2', type: 'callback'},
- {keyType: 'bla2', key: 'bla', value: 'truc', type: 'partner'},
- {keyType: 'eto2', key: 'eto', value: 'tako new', type: 'partner'},
- {keyType: 'par2', key: 'par', value: 'tner', type: 'partner'}
+ {internalId: 4, id: 'e'},
+ {internalId: 5, id: 'c'}
])
})
- })
-
- it('adds rows into globalParams store and catches an error when adding existing key', () => {
- const globalParamsSet1 = [
- {key: 'bla', value: 'truc', type: 'callback'},
- {key: 'key1', value: 'value1', type: 'callback'},
- {key: 'eto', value: 'tako', type: 'partner'}
- ]
+ })
- const globalParamsSet2 = [
- {key: 'key1', value: 'new key1 value', type: 'callback'},
- {key: 'par', value: 'tner', type: 'partner'},
- {key: 'eto', value: 'tako', type: 'partner'}
+ it('returns number of items in the store', () => {
+ const ids = [
+ {id: 'id1'},
+ {id: 'id2'},
+ {id: 'id3'}
]
expect.assertions(2)
- return Storage.addBulk('globalParams', globalParamsSet1)
- .then(result => {
- expect(result).toEqual([['bla', 'callback'], ['key1', 'callback'], ['eto', 'partner']])
+ return Storage.count('eventDeduplication')
+ .then(count => {
+ expect(count).toEqual(0)
- return Storage.addBulk('globalParams', globalParamsSet2)
+ return Storage.addBulk('eventDeduplication', ids)
})
- .catch(error => {
- expect(error.name).toEqual('ConstraintError')
+ .then(() => Storage.count('eventDeduplication'))
+ .then(count => {
+ expect(count).toEqual(3)
})
+
})
- it('returns callback and partner params from the globalParams store', () => {
+ it('clears items from the queue store', () => {
- const globalParamsSet = [
- {key: 'key1', value: 'value1', type: 'callback'},
- {key: 'key2', value: 'value2', type: 'partner'},
- {key: 'key3', value: 'value3', type: 'partner'},
- {key: 'key4', value: 'value4', type: 'callback'},
- {key: 'key5', value: 'value5', type: 'callback'},
+ // prepare some rows manually
+ const queueSet = [
+ {timestamp: 1, url: '/url1'},
+ {timestamp: 2, url: '/url2'}
]
expect.assertions(2)
- return Storage.addBulk('globalParams', globalParamsSet)
- .then(() => Promise.all([
- Storage.filterBy('globalParams', 'callback'),
- Storage.filterBy('globalParams', 'partner')
- ]))
- .then(([callbackParams, partnerParams]) => {
- expect(callbackParams).toEqual([
- {keyType: 'key11', key: 'key1', value: 'value1', type: 'callback'},
- {keyType: 'key41', key: 'key4', value: 'value4', type: 'callback'},
- {keyType: 'key51', key: 'key5', value: 'value5', type: 'callback'},
- ])
- expect(partnerParams).toEqual([
- {keyType: 'key22', key: 'key2', value: 'value2', type: 'partner'},
- {keyType: 'key32', key: 'key3', value: 'value3', type: 'partner'}
+ return Storage.addBulk('queue', queueSet)
+ .then(() => Storage.getAll('queue'))
+ .then(result => {
+
+ expect(result).toEqual([
+ {timestamp: 1, url: '/url1'},
+ {timestamp: 2, url: '/url2'}
])
+
+ return Storage.clear('queue')
})
+ .then(() => Storage.getAll('queue'))
+ .then(result => {
+ expect(result).toEqual([])
+ })
+
})
+ describe('performing add bulk operation', () => {
+
+ it('fails when array is not provided', () => {
+
+ expect.assertions(4)
+
+ return Storage.addBulk('globalParams', [])
+ .catch(error => {
+ expect(error.name).toEqual('NoTargetDefined')
+ expect(error.message).toEqual('No array provided to perform add bulk operation into globalParams store')
+
+ return Storage.addBulk('queue')
+ })
+ .catch(error => {
+ expect(error.name).toEqual('NoTargetDefined')
+ expect(error.message).toEqual('No array provided to perform add bulk operation into queue store')
+ })
+
+ })
+
+ it('adds rows into globalParams store', () => {
+
+ const globalParamsSet1 = [
+ {key: 'bla', value: 'truc', type: 'callback'},
+ {key: 'key1', value: 'value1', type: 'callback'},
+ {key: 'eto', value: 'tako', type: 'partner'}
+ ]
+
+ const globalParamsSet2 = [
+ {key: 'key2', value: 'value2', type: 'callback'},
+ {key: 'par', value: 'tner', type: 'partner'}
+ ]
+
+ expect.assertions(3)
+
+ return Storage.addBulk('globalParams', globalParamsSet1)
+ .then(result => {
+ expect(result).toEqualArrayIgnoringOrder([
+ ['bla', 'callback'],
+ ['key1', 'callback'],
+ ['eto', 'partner']
+ ])
+
+ return Storage.addBulk('globalParams', globalParamsSet2)
+ })
+ .then(result => {
+ expect(result).toEqual([
+ ['key2', 'callback'],
+ ['par', 'partner']
+ ])
+
+ return Storage.getAll('globalParams')
+ })
+ .then(result => {
+ expect(result).toEqual([
+ {keyType: 'bla1', key: 'bla', value: 'truc', type: 'callback'},
+ {keyType: 'key11', key: 'key1', value: 'value1', type: 'callback'},
+ {keyType: 'key21', key: 'key2', value: 'value2', type: 'callback'},
+ {keyType: 'eto2', key: 'eto', value: 'tako', type: 'partner'},
+ {keyType: 'par2', key: 'par', value: 'tner', type: 'partner'}
+ ])
+ })
+ })
+
+ it('adds rows into globalParams store and overwrite existing key at later point', () => {
+
+ const globalParamsSet1 = [
+ {key: 'bla', value: 'truc', type: 'callback'},
+ {key: 'key1', value: 'value1', type: 'callback'},
+ {key: 'eto', value: 'tako', type: 'partner'},
+ {key: 'key2', value: 'value2', type: 'callback'}
+ ]
+
+ const globalParamsSet2 = [
+ {key: 'key1', value: 'new key1 value', type: 'callback'},
+ {key: 'par', value: 'tner', type: 'partner'},
+ {key: 'bla', value: 'truc', type: 'partner'},
+ {key: 'eto', value: 'tako new', type: 'partner'}
+ ]
+
+ expect.assertions(3)
+
+ return Storage.addBulk('globalParams', globalParamsSet1)
+ .then(result => {
+ expect(result).toEqual([
+ ['bla', 'callback'],
+ ['key1', 'callback'],
+ ['eto', 'partner'],
+ ['key2', 'callback']
+ ])
+
+ return Storage.addBulk('globalParams', globalParamsSet2, true)
+ })
+ .then(result => {
+ expect(result).toEqualArrayIgnoringOrder([
+ ['key1', 'callback'],
+ ['par', 'partner'],
+ ['bla', 'partner'],
+ ['eto', 'partner']
+ ])
+
+ return Storage.getAll('globalParams')
+ })
+ .then(result => {
+ expect(result).toEqual([
+ {keyType: 'bla1', key: 'bla', value: 'truc', type: 'callback'},
+ {keyType: 'key11', key: 'key1', value: 'new key1 value', type: 'callback'},
+ {keyType: 'key21', key: 'key2', value: 'value2', type: 'callback'},
+ {keyType: 'bla2', key: 'bla', value: 'truc', type: 'partner'},
+ {keyType: 'eto2', key: 'eto', value: 'tako new', type: 'partner'},
+ {keyType: 'par2', key: 'par', value: 'tner', type: 'partner'}
+ ])
+ })
+ })
+
+ it('adds rows into globalParams store and catches an error when adding existing key', () => {
+
+ const globalParamsSet1 = [
+ {key: 'bla', value: 'truc', type: 'callback'},
+ {key: 'key1', value: 'value1', type: 'callback'},
+ {key: 'eto', value: 'tako', type: 'partner'}
+ ]
+
+ const globalParamsSet2 = [
+ {key: 'key1', value: 'new key1 value', type: 'callback'},
+ {key: 'par', value: 'tner', type: 'partner'},
+ {key: 'eto', value: 'tako', type: 'partner'}
+ ]
+
+ expect.assertions(2)
+
+ return Storage.addBulk('globalParams', globalParamsSet1)
+ .then(result => {
+ expect(result).toEqual([['bla', 'callback'], ['key1', 'callback'], ['eto', 'partner']])
+
+ return Storage.addBulk('globalParams', globalParamsSet2)
+ })
+ .catch(error => {
+ expect(error.name).toEqual('ConstraintError')
+ })
+ })
+
+ it('returns callback and partner params from the globalParams store', () => {
+
+ const globalParamsSet = [
+ {key: 'key1', value: 'value1', type: 'callback'},
+ {key: 'key2', value: 'value2', type: 'partner'},
+ {key: 'key3', value: 'value3', type: 'partner'},
+ {key: 'key4', value: 'value4', type: 'callback'},
+ {key: 'key5', value: 'value5', type: 'callback'},
+ ]
+
+ expect.assertions(2)
+
+ return Storage.addBulk('globalParams', globalParamsSet)
+ .then(() => Promise.all([
+ Storage.filterBy('globalParams', 'callback'),
+ Storage.filterBy('globalParams', 'partner')
+ ]))
+ .then(([callbackParams, partnerParams]) => {
+ expect(callbackParams).toEqual([
+ {keyType: 'key11', key: 'key1', value: 'value1', type: 'callback'},
+ {keyType: 'key41', key: 'key4', value: 'value4', type: 'callback'},
+ {keyType: 'key51', key: 'key5', value: 'value5', type: 'callback'},
+ ])
+ expect(partnerParams).toEqual([
+ {keyType: 'key22', key: 'key2', value: 'value2', type: 'partner'},
+ {keyType: 'key32', key: 'key3', value: 'value3', type: 'partner'}
+ ])
+ })
+ })
+
+ })
})
}
}
diff --git a/src/sdk/__tests__/url-strategy.spec.ts b/src/sdk/__tests__/url-strategy.spec.ts
new file mode 100644
index 0000000..21a395b
--- /dev/null
+++ b/src/sdk/__tests__/url-strategy.spec.ts
@@ -0,0 +1,113 @@
+import { UrlStrategy, urlStrategyRetries } from '../url-strategy'
+import * as Globals from '../globals'
+
+jest.mock('../logger')
+
+describe('test url strategy', () => {
+
+ describe('development environment', () => {
+ let Config
+
+ const options = {
+ appToken: '123abc',
+ environment: 'sandbox'
+ }
+
+ const sendRequestMock = jest.fn(() => Promise.reject({ code: 'NO_CONNECTION' }))
+
+ const testEndpoints = {
+ default: {
+ app: 'app.default',
+ gdpr: 'gdpr.default'
+ },
+ india: {
+ app: 'app.india',
+ gdpr: 'gdpr.india'
+ },
+ china: {
+ app: 'app.china',
+ gdpr: 'gdpr.china'
+ }
+ }
+
+ const env = Globals.default.env
+
+ beforeAll(() => {
+ Globals.default.env = 'development'
+ })
+
+ beforeEach(() => {
+ Config = require('../config').default
+ })
+
+ afterEach(() => {
+ Config.destroy()
+ jest.clearAllMocks()
+ })
+
+ afterAll(() => {
+ Globals.default.env = env
+ jest.restoreAllMocks()
+ })
+
+ it('does not override custom url', () => {
+ const customUrl = 'custom-url'
+ Config.set({ ...options, customUrl })
+
+ return urlStrategyRetries(sendRequestMock, testEndpoints)
+ .catch(reason => expect(reason).toEqual({ code: 'NO_CONNECTION' }))
+ .then(() => expect(sendRequestMock).toHaveBeenCalledWith({ app: customUrl, gdpr: customUrl }))
+ })
+
+ it('retries send requesrt to endpoints iteratively', () => {
+ return urlStrategyRetries(sendRequestMock, testEndpoints)
+ .catch(reason => expect(reason).toEqual({ code: 'NO_CONNECTION' }))
+ .then(() => {
+ expect(sendRequestMock).toHaveBeenCalledTimes(3)
+ expect(sendRequestMock).toHaveBeenCalledWith({ app: testEndpoints.default.app, gdpr: testEndpoints.default.gdpr })
+ expect(sendRequestMock).toHaveBeenCalledWith({ app: testEndpoints.india.app, gdpr: testEndpoints.india.gdpr })
+ expect(sendRequestMock).toHaveBeenCalledWith({ app: testEndpoints.china.app, gdpr: testEndpoints.china.gdpr })
+ })
+ })
+
+ it('prefers Indian enpoint and does not try reach Chinese one when india url strategy set', () => {
+ Config.set({ ...options, urlStrategy: UrlStrategy.India })
+
+ return urlStrategyRetries(sendRequestMock, testEndpoints)
+ .catch(reason => expect(reason).toEqual({ code: 'NO_CONNECTION' }))
+ .then(() => {
+ expect(sendRequestMock).toHaveBeenCalledTimes(2)
+ expect(sendRequestMock).toHaveBeenCalledWith({ app: testEndpoints.india.app, gdpr: testEndpoints.india.gdpr })
+ expect(sendRequestMock).toHaveBeenCalledWith({ app: testEndpoints.default.app, gdpr: testEndpoints.default.gdpr })
+ })
+ })
+
+ it('prefers Chinese enpoint and does not try reach Indian one when china url strategy set', () => {
+ Config.set({ ...options, urlStrategy: UrlStrategy.China })
+
+ return urlStrategyRetries(sendRequestMock, testEndpoints)
+ .catch(reason => expect(reason).toEqual({ code: 'NO_CONNECTION' }))
+ .then(() => {
+ expect(sendRequestMock).toHaveBeenCalledTimes(2)
+ expect(sendRequestMock).toHaveBeenCalledWith({ app: testEndpoints.china.app, gdpr: testEndpoints.china.gdpr })
+ expect(sendRequestMock).toHaveBeenCalledWith({ app: testEndpoints.default.app, gdpr: testEndpoints.default.gdpr })
+ })
+ })
+
+ it('stops to iterate endpoints if connected succesfully', () => {
+ const sendRequestMock = jest.fn()
+ .mockImplementationOnce(() => Promise.reject({ code: 'NO_CONNECTION' }))
+ .mockImplementationOnce(() => Promise.resolve())
+
+ return urlStrategyRetries(sendRequestMock, testEndpoints)
+ .then(() => expect(sendRequestMock).toHaveBeenCalledTimes(2))
+ })
+
+ it('does not iterate endpoints if another error happened', () => {
+ const sendRequestMock = jest.fn(() => Promise.reject({ code: 'UNKNOWN' }))
+
+ return urlStrategyRetries(sendRequestMock, testEndpoints)
+ .catch(() => expect(sendRequestMock).toHaveBeenCalledTimes(1))
+ })
+ })
+})
diff --git a/src/sdk/config.js b/src/sdk/config.js
index afbe375..85fff76 100644
--- a/src/sdk/config.js
+++ b/src/sdk/config.js
@@ -7,7 +7,6 @@ import {
type BaseParamsMandatoryListT,
type CustomConfigListT
} from './types'
-import Globals from './globals'
import {MINUTE, SECOND, DAY} from './constants'
import {buildList, reducer} from './utilities'
import Logger from './logger'
@@ -64,8 +63,10 @@ const _allowedParams: BaseParamsListT = [
* @private
*/
const _allowedConfig: CustomConfigListT = [
+ 'urlStrategy',
'customUrl',
- 'eventDeduplicationListLimit'
+ 'eventDeduplicationListLimit',
+ 'namespace'
]
/**
@@ -76,17 +77,13 @@ const _allowedConfig: CustomConfigListT = [
* version: string,
* sessionWindow: number,
* sessionTimerWindow: number,
- * requestValidityWindow: number,
- * baseUrl: {app: string, gdpr: string}
+ * requestValidityWindow: number
* }}
*/
const _baseConfig = {
sessionWindow: 30 * MINUTE,
sessionTimerWindow: 60 * SECOND,
- requestValidityWindow: 28 * DAY,
- baseUrl: Globals.env === 'test'
- ? {app: 'app', gdpr: 'gdpr'}
- : {app: 'https://app.adjust.com', gdpr: 'https://gdpr.adjust.com'}
+ requestValidityWindow: 28 * DAY
}
/**
diff --git a/src/sdk/constants.js b/src/sdk/constants.js
index 857fb6c..f65f137 100644
--- a/src/sdk/constants.js
+++ b/src/sdk/constants.js
@@ -13,3 +13,9 @@ export const HTTP_ERRORS = {
'SKIP': 'Skipping slower attempt',
'MISSING_URL': 'Url is not provided'
}
+
+export const STORAGE_TYPES = {
+ NO_STORAGE: 'noStorage',
+ INDEXED_DB: 'indexedDB',
+ LOCAL_STORAGE: 'localStorage'
+}
diff --git a/src/sdk/http.js b/src/sdk/http.js
index 6a450ea..8dd51ac 100644
--- a/src/sdk/http.js
+++ b/src/sdk/http.js
@@ -14,6 +14,7 @@ import Logger from './logger'
import {isObject, isValidJson, isRequest, entries, isEmptyEntry, reducer} from './utilities'
import {publish} from './pub-sub'
import defaultParams from './default-params'
+import {urlStrategyRetries, BaseUrlsMap} from './url-strategy'
type ParamsWithAttemptsT = $PropertyType
@@ -174,11 +175,10 @@ function _handleReadyStateChange (reject, resolve, {xhr, url}: {xhr: XMLHttpRequ
* @returns {{encodedParams: string, fullUrl: string}}
* @private
*/
-function _prepareUrlAndParams ({url, method, params}: HttpRequestParamsT, defaultParams: DefaultParamsT): {fullUrl: string, encodedParams: string} {
+function _prepareUrlAndParams ({url, method, params}: HttpRequestParamsT, defaultParams: DefaultParamsT, baseUrlsMap: BaseUrlsMap): {fullUrl: string, encodedParams: string} {
const encodedParams = _encodeParams(params, defaultParams)
const base = url === '/gdpr_forget_device' ? 'gdpr' : 'app'
- const customConfig = Config.getCustomConfig()
- const baseUrl = customConfig.customUrl || Config.baseUrl[base]
+ const baseUrl = baseUrlsMap[base]
return {
fullUrl: baseUrl + url + (method === 'GET' ? `?${encodedParams}` : ''),
@@ -217,8 +217,8 @@ function _prepareHeaders (xhr: XMLHttpRequest, method: $PropertyType {
- const {fullUrl, encodedParams} = _prepareUrlAndParams({url, method, params}, defaultParams)
+function _buildXhr ({url, method = 'GET', params = {}}: HttpRequestParamsT, defaultParams: DefaultParamsT, baseUrlsMap: BaseUrlsMap): Promise {
+ const {fullUrl, encodedParams} = _prepareUrlAndParams({url, method, params}, defaultParams, baseUrlsMap)
return new Promise((resolve, reject) => {
let xhr = new XMLHttpRequest()
@@ -232,6 +232,10 @@ function _buildXhr ({url, method = 'GET', params = {}}: HttpRequestParamsT, defa
})
}
+function _sendRequestWithUrlStrategyRetries (options: HttpRequestParamsT, defaultParams: DefaultParamsT) {
+ return urlStrategyRetries(baseUrlsMap => _buildXhr(options, defaultParams, baseUrlsMap))
+}
+
/**
* Intercept response from backend
*
@@ -298,6 +302,6 @@ function _interceptSuccess (result: HttpSuccessResponseT, url): HttpSuccessRespo
*/
export default function http (options: HttpRequestParamsT): Promise {
return defaultParams()
- .then(defaultParams => _buildXhr(options, defaultParams))
+ .then(defaultParams => _sendRequestWithUrlStrategyRetries(options, defaultParams))
.then(result => _interceptResponse(result, options.url))
}
diff --git a/src/sdk/identity.js b/src/sdk/identity.js
index d47301e..10e190b 100644
--- a/src/sdk/identity.js
+++ b/src/sdk/identity.js
@@ -138,7 +138,7 @@ function sync (): Promise {
const lastActive = current.lastActive || 0
if (_isLive() && lastActive < activityState.lastActive) {
-
+
// Checking if another SDK instance was installed while this one was in backgound
const installedUpdated = !current.installed && activityState.installed
const sessionCountUpdated = (current.sessionCount || 0) < (activityState.sessionCount || 0)
diff --git a/src/sdk/logger.js b/src/sdk/logger.js
index f947e6b..e38b4d9 100644
--- a/src/sdk/logger.js
+++ b/src/sdk/logger.js
@@ -106,7 +106,7 @@ function setLogLevel (logLevel: LogLevelT, logOutput: string): void {
* @param {Array} args
* @private
*/
-function _log (methodName: MethodNameT, logLevel: LogLevelT, ...args: Array): void {
+function _log (methodName: MethodNameT, logLevel: LogLevelT, ...args: Array): void {
if (_levels[_level] < _levels[logLevel]) {
return
}
@@ -129,11 +129,11 @@ function _log (methodName: MethodNameT, logLevel: LogLevelT, ...args: Array void}
* @private
*/
function _applyLevel (name: MethodNameT, logLevel: LogLevelT) {
- return (...args: Array) => {
+ return (...args: Array) => {
_log(name, logLevel, ...args)
}
}
diff --git a/src/sdk/main.js b/src/sdk/main.js
index f9247ac..792fad1 100644
--- a/src/sdk/main.js
+++ b/src/sdk/main.js
@@ -24,6 +24,7 @@ import {delay, flush, destroy as schedulerDestroy} from './scheduler'
import event from './event'
import sdkClick from './sdk-click'
import ActivityState from './activity-state'
+import { STORAGE_TYPES } from './constants'
type InitConfigT = $ReadOnly<{|...InitOptionsT, ...LogOptionsT|}>
@@ -35,6 +36,14 @@ type InitConfigT = $ReadOnly<{|...InitOptionsT, ...LogOptionsT|}>
*/
let _options: ?InitOptionsT = null
+/**
+ * Flag to mark id sdk is in starting process
+ *
+ * @type {boolean}
+ * @private
+ */
+let _isInitialising: boolean = false
+
/**
* Flag to mark if sdk is started
*
@@ -59,17 +68,9 @@ let _isInstalled: boolean = false
* @param {string} logOutput
*/
function initSdk ({logLevel, logOutput, ...options}: InitConfigT = {}): void {
-
Logger.setLogLevel(logLevel, logOutput)
- if (!Storage) {
- Logger.error('Adjust SDK can not start, there is no storage available')
- return
- }
-
- Logger.info(`Available storage is ${Storage.type}`)
-
- if (Config.isInitialised()) {
+ if (_isInitialised()) {
Logger.error('You already initiated your instance')
return
}
@@ -78,9 +79,22 @@ function initSdk ({logLevel, logOutput, ...options}: InitConfigT = {}): void {
return
}
- _options = {...options}
+ _isInitialising = true
+
+ Storage.init(options.namespace)
+ .then(availableStorage => {
+
+ if (availableStorage.type === STORAGE_TYPES.NO_STORAGE) {
+ Logger.error('Adjust SDK can not start, there is no storage available')
+ return
+ }
- _start(options)
+ Logger.info(`Available storage is ${availableStorage.type}`)
+
+ _options = { ...options }
+
+ _start(options)
+ })
}
/**
@@ -243,6 +257,15 @@ function _handleGdprForgetMe (): void {
}
+/**
+ * Check if sdk initialisation was started
+ *
+ * @private
+ */
+function _isInitialised (): boolean {
+ return _isInitialising || Config.isInitialised()
+}
+
/**
* Pause sdk by canceling:
* - queue execution
@@ -252,6 +275,7 @@ function _handleGdprForgetMe (): void {
* @private
*/
function _pause (): void {
+ _isInitialising = false
_isStarted = false
schedulerDestroy()
@@ -284,6 +308,8 @@ function _shutdown (async): void {
* @private
*/
function _destroy (): void {
+ _isInstalled = false
+
_shutdown()
gdprForgetDestroy()
@@ -331,6 +357,7 @@ function _continue (activityState: ActivityStateMapT): Promise {
return sessionWatch()
.then(() => {
+ _isInitialising = false
_isStarted = true
if (isInstalled) {
@@ -345,7 +372,7 @@ function _continue (activityState: ActivityStateMapT): Promise {
*/
function _handleSdkInstalled () {
_isInstalled = true
-
+
flush()
unsubscribe('sdk:installed')
@@ -427,7 +454,7 @@ function _start (options: InitOptionsT): void {
* @private
*/
function _preCheck (description: string, callback: () => mixed, {schedule, stopBeforeInit}: {schedule?: boolean, stopBeforeInit?: boolean} = {}) {
- if (!Storage) {
+ if (Storage.getType() === STORAGE_TYPES.NO_STORAGE) {
Logger.log(`Adjust SDK can not ${description}, no storage available`)
return
}
@@ -437,13 +464,13 @@ function _preCheck (description: string, callback: () => mixed, {schedule, stopB
return
}
- if (schedule && stopBeforeInit && !Config.isInitialised()) {
+ if (schedule && stopBeforeInit && !_isInitialised()) {
Logger.error(`Adjust SDK can not ${description}, sdk instance is not initialized`)
return
}
if (typeof callback === 'function') {
- if (schedule && !(_isInstalled && _isStarted) && (stopBeforeInit || Config.isInitialised())) {
+ if (schedule && !(_isInstalled && _isStarted) && (stopBeforeInit || _isInitialised())) {
delay(callback, description)
Logger.log(`Running ${description} is delayed until Adjust SDK is up`)
} else {
@@ -452,6 +479,10 @@ function _preCheck (description: string, callback: () => mixed, {schedule, stopB
}
}
+function _clearDatabase () {
+ return Storage.deleteDatabase()
+}
+
const Adjust = {
initSdk,
trackEvent,
@@ -468,7 +499,8 @@ const Adjust = {
gdprForgetMe,
disableThirdPartySharing,
__testonly__: {
- destroy: _destroy
+ destroy: _destroy,
+ clearDatabase: _clearDatabase
}
}
diff --git a/src/sdk/preferences.js b/src/sdk/preferences.js
index 6feb957..6e9ab42 100644
--- a/src/sdk/preferences.js
+++ b/src/sdk/preferences.js
@@ -1,6 +1,7 @@
// @flow
import {publish} from './pub-sub'
import QuickStorage from './storage/quick-storage'
+import Scheme from './storage/scheme'
import {REASON_GDPR, REASON_GENERAL} from './constants'
type SdkDisabledT = {|
@@ -24,7 +25,7 @@ type PreferencesT = {|
* @type {string}
* @private
*/
-let _storeName: string = QuickStorage.storeNames.preferences.name
+let _storeName: string = Scheme.preferences.name
/**
* Local reference to be used for recovering preserved state
diff --git a/src/sdk/storage/converter.js b/src/sdk/storage/converter.js
deleted file mode 100644
index 6deb274..0000000
--- a/src/sdk/storage/converter.js
+++ /dev/null
@@ -1,136 +0,0 @@
-import SchemeMap from './scheme-map'
-import {isObject, entries} from '../utilities'
-
-/**
- * Get value from the map if available
- *
- * @param {Object} map
- * @param {*} value
- * @returns {*}
- * @private
- */
-function _getValue (map, value) {
- return map ? (map[value] !== undefined ? map[value] : value) : value
-}
-
-/**
- * Convert key and value by defined scheme
- *
- * @param {string} storeName
- * @param {Object} scheme
- * @param {string} dir
- * @param {string} key
- * @param {*} value
- * @returns {[string, *]}
- * @private
- */
-function _convert ({storeName, scheme, dir, key, value}) {
- if (!scheme) {
- return [key, value]
- }
-
- const encodedKey = scheme.key || scheme
-
- if (isObject(value)) {
- return [encodedKey, convertRecord({storeName, dir, record: value, scheme: scheme.keys})]
- }
-
- return [encodedKey, _getValue(scheme.values, value)]
-}
-
-/**
- * Convert record by defined direction and scheme
- *
- * @param {string} storeName
- * @param {string} dir
- * @param {Object} record
- * @param {Object=} scheme
- * @returns {Object|undefined}
- */
-function convertRecord ({storeName, dir, record, scheme}) {
- if (!record) {
- return
- }
-
- scheme = scheme || SchemeMap[dir][convertStoreName({storeName, dir: 'right'})].fields
-
- return entries(record)
- .map(([key, value]) => _convert({storeName, scheme: scheme[key], dir, key, value}))
- .reduce((acc, [key, value]) => ({...acc, [key]: value}), {})
-}
-
-/**
- * Convert records by defined direction
- *
- * @param {string} storeName
- * @param {string} dir
- * @param {Array} records
- * @returns {Object[]}
- */
-function convertRecords ({storeName, dir, records = []}) {
- return records
- .map(record => convertRecord({storeName, dir, record}))
-}
-
-/**
- * Convert values by defined direction
- *
- * @param {string} storeName
- * @param {string} dir
- * @param {*|*[]} target
- * @returns {*|*[]}
- */
-function convertValues ({storeName, dir, target}) {
- const scheme = SchemeMap[dir][convertStoreName({storeName, dir: 'right'})]
- const keyPathScheme = scheme.fields[scheme.keyPath]
- const values = target instanceof Array ? target.slice() : [target]
- const keys = keyPathScheme.composite || [scheme.keyPath]
- const converted = keys
- .map((key, index) => _getValue(scheme.fields[key].values, values[index]))
-
- return converted.length === 1 ? converted[0] : converted
-}
-
-/**
- * Encode value by defined scheme
- *
- * @param {*} target
- * @returns {*}
- */
-function encodeValue (target) {
- return SchemeMap.values[target] || target
-}
-
-/**
- * Convert store name by defined direction
- *
- * @param {string} storeName
- * @param {string} dir
- * @returns {string}
- */
-function convertStoreName ({storeName, dir}) {
- return (SchemeMap.storeNames[dir][storeName] || {}).name || storeName
-}
-
-/**
- * Decode error message by replacing short store name with long readable one
- *
- * @param {string} storeName
- * @param {Object} error
- * @returns {{name: string, message: string}}
- */
-function decodeErrorMessage ({storeName, error}) {
- return {
- name: error.name,
- message: error.message.replace(`"${storeName}"`, convertStoreName({storeName, dir: 'right'}))
- }
-}
-
-export {
- convertRecord,
- convertRecords,
- convertValues,
- encodeValue,
- convertStoreName,
- decodeErrorMessage
-}
diff --git a/src/sdk/storage/converter.ts b/src/sdk/storage/converter.ts
new file mode 100644
index 0000000..e7dbeb4
--- /dev/null
+++ b/src/sdk/storage/converter.ts
@@ -0,0 +1,133 @@
+import SchemeMap from './scheme-map'
+import { isObject, entries } from '../utilities'
+import { Error } from './types'
+
+enum Direction {
+ right = 'right',
+ left = 'left'
+}
+
+interface StoreConverterParameters {
+ storeName: string;
+ dir: Direction;
+}
+
+interface ConverterParameters extends StoreConverterParameters {
+ scheme?: any;
+}
+
+interface RecordConverterParameters extends ConverterParameters {
+ record: any;
+}
+
+interface KeyValueConverterParameters extends ConverterParameters {
+ key: string;
+ value: any;
+}
+
+interface RecordsConverterParameters extends StoreConverterParameters {
+ records: Array;
+}
+
+interface TargetConverterParameters extends StoreConverterParameters {
+ target: any;
+}
+
+/**
+ * Get value from the map if available
+ *
+ * @private
+ */
+function _getValue(map, value) {
+ return map ? (map[value] !== undefined ? map[value] : value) : value
+}
+
+/**
+ * Convert key and value by defined scheme
+ *
+ * @private
+ */
+function _convert({ storeName, scheme, dir, key, value }: KeyValueConverterParameters): [string, any] {
+ if (!scheme) {
+ return [key, value]
+ }
+
+ const encodedKey = scheme.key || scheme
+
+ if (isObject(value)) {
+ return [encodedKey, convertRecord({ storeName, dir, record: value, scheme: scheme.keys })]
+ }
+
+ return [encodedKey, _getValue(scheme.values, value)]
+}
+
+/**
+ * Convert record by defined direction and scheme
+ */
+function convertRecord({ storeName, dir, record, scheme }: RecordConverterParameters) {
+ if (!record) {
+ return
+ }
+
+ scheme = scheme || SchemeMap[dir][convertStoreName({ storeName, dir: Direction.right })].fields
+
+ return entries(record)
+ .map(([key, value]) => _convert({ storeName, scheme: scheme[key], dir, key, value }))
+ .reduce((acc, [key, value]) => ({ ...acc, [key]: value }), {})
+}
+
+/**
+ * Convert records by defined direction
+ */
+function convertRecords({ storeName, dir, records = [] }: RecordsConverterParameters): Array<{ [key: string]: any }> {
+ return records
+ .map(record => convertRecord({ storeName, dir, record }))
+}
+
+/**
+ * Convert values by defined direction
+ */
+function convertValues({ storeName, dir, target }: TargetConverterParameters) {
+ const scheme = SchemeMap[dir][convertStoreName({ storeName, dir: Direction.right })]
+ const keyPathScheme = scheme.fields[scheme.keyPath]
+ const values = target instanceof Array ? target.slice() : [target]
+ const keys = keyPathScheme.composite || [scheme.keyPath]
+ const converted = keys
+ .map((key, index) => _getValue(scheme.fields[key].values, values[index]))
+
+ return converted.length === 1 ? converted[0] : converted
+}
+
+/**
+ * Encode value by defined scheme
+ */
+function encodeValue(target: any) {
+ return SchemeMap.values[target] || target
+}
+
+/**
+ * Convert store name by defined direction
+ */
+function convertStoreName({ storeName, dir }: StoreConverterParameters): string {
+ return (SchemeMap.storeNames[dir][storeName] || {}).name || storeName
+}
+
+/**
+ * Decode error message by replacing short store name with long readable one
+ */
+function decodeErrorMessage({ storeName, error }: { storeName: string; error: Error }): Error {
+ return {
+ name: error.name,
+ message: error.message.replace(`"${storeName}"`, convertStoreName({ storeName, dir: Direction.right }))
+ }
+}
+
+export {
+ Direction,
+ convertRecord,
+ convertRecords,
+ convertValues,
+ encodeValue,
+ convertStoreName,
+ decodeErrorMessage
+}
diff --git a/src/sdk/storage/indexeddb.ts b/src/sdk/storage/indexeddb.ts
index ad8a56e..91e6777 100644
--- a/src/sdk/storage/indexeddb.ts
+++ b/src/sdk/storage/indexeddb.ts
@@ -1,542 +1,638 @@
import Globals from '../globals'
import SchemeMap from './scheme-map'
import ActivityState from '../activity-state'
-import QuickStorage from '../storage/quick-storage'
+import QuickStorage from './quick-storage'
import Logger from '../logger'
-import {recover as recoverPreferences} from '../preferences'
-import {isEmpty, isObject, entries} from '../utilities'
-import {convertRecord, convertStoreName} from './converter'
+import { recover as recoverPreferences } from '../preferences'
+import { isEmpty, isObject, entries, values } from '../utilities'
+import { Direction, convertRecord, convertStoreName } from './converter'
+import { IStorage } from './types'
+
+enum Action {
+ add = 'add',
+ put = 'put',
+ get = 'get',
+ list = 'list',
+ clear = 'clear',
+ delete = 'delete',
+}
-const _dbName = Globals.namespace
-const _dbVersion = 1
-let _db: IDBDatabase | null
+type Request = {
+ storeName: string;
+ action: Action;
+ target?: any;
+ mode?: IDBTransactionMode;
+ range?: Nullable;
+ firstOnly?: boolean;
+}
-/**
- * Check if IndexedDB is supported in the current browser (exclude iOS forcefully)
- *
- * @returns {boolean}
- */
-function isSupported (): boolean {
- const indexedDB = _getIDB()
- const iOS = !!navigator.platform && /iPad|iPhone|iPod/.test(navigator.platform)
- const supported = !!indexedDB && !iOS
+type Transaction = {
+ transaction: IDBTransaction;
+ store: IDBObjectStore;
+ index: IDBIndex;
+ options: any;
+}
- if (!supported) {
- Logger.warn('IndexedDB is not supported in this browser')
- }
+class IndexedDBWrapper implements IStorage {
+ private static dbValidationName = 'validate-db-openable'
- return supported
-}
+ private dbDefaultName = Globals.namespace
-/**
- * Get indexedDB instance
- *
- * @returns {IDBFactory}
- * @private
- */
-function _getIDB (): IDBFactory {
- return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB
-}
+ private dbName = this.dbDefaultName
-/**
- * Handle database upgrade/initialization
- * - store activity state from memory if database unexpectedly got lost in the middle of the window session
- * - migrate data from localStorage if available on browser upgrade
- *
- * @param {Object} e
- * @param {Function} reject
- * @private
- */
-function _handleUpgradeNeeded (e: IDBVersionChangeEvent, reject: Function) {
-
- const db = e.target.result
-
- e.target.transaction.onerror = reject
- e.target.transaction.onabort = reject
-
- const storeNames = SchemeMap.storeNames.left
- const activityState = ActivityState.current || {}
- const inMemoryAvailable = activityState && !isEmpty(activityState)
-
- entries(storeNames)
- .filter(([, store]) => !store.permanent)
- .forEach(([longStoreName, store]) => {
- const options = SchemeMap.right[longStoreName]
- const objectStore = db.createObjectStore(store.name, {
- keyPath: options.keyPath,
- autoIncrement: options.autoIncrement || false
- })
+ private dbVersion = 1
- if (options.index) {
- objectStore.createIndex(`${options.index}Index`, options.index)
- }
+ private idbFactory: IDBFactory
- if (store.name === storeNames.activityState.name && inMemoryAvailable) {
- objectStore.add(convertRecord({
- storeName: longStoreName,
- record: activityState,
- dir: 'left'
- }))
- Logger.info('Activity state has been recovered')
- } else if (QuickStorage.stores[store.name]) {
- QuickStorage.stores[store.name].forEach(record => objectStore.add(record))
- Logger.info(`Migration from localStorage done for ${longStoreName} store`)
- }
- })
+ private indexedDbConnection: Nullable = null
- recoverPreferences()
- QuickStorage.clear()
-}
+ private notSupportedError = { name: 'IDBNotSupported', message: 'IndexedDB is not supported' }
-/**
- * Handle successful database opening
- *
- * @param {Object} e
- * @param {Function} resolve
- * @private
- */
-function _handleOpenSuccess (e, resolve) {
+ private databaseOpenError = { name: 'CannotOpenDatabaseError', message: 'Cannot open a database' }
- _db = e.target.result
+ private noConnectionError = { name: 'NoDatabaseConnection', message: 'Cannot open a transaction' }
- resolve({success: true})
+ /**
+ * Cached promise of IndexedDB validation
+ */
+ private static isSupportedPromise: Nullable> = null
- _db.onclose = destroy
-}
+ /**
+ * Tries to open a temporary database
+ */
+ private static tryOpen(db: IDBFactory): Promise {
+
+ return new Promise((resolve) => {
+ try {
+ const request = db.open(IndexedDBWrapper.dbValidationName)
-/**
- * Open the database connection and create store if not existent
- *
- * @returns {Promise}
- * @private
- */
-function _open () {
+ request.onsuccess = () => {
+ request.result.close()
+ db.deleteDatabase(IndexedDBWrapper.dbValidationName)
+ resolve(true)
+ }
+ request.onerror = () => resolve(false)
+ } catch (error) {
+ resolve(false)
+ }
+ })
+ }
- const indexedDB = _getIDB()
+ /**
+ * Check if IndexedDB is supported in the current browser (exclude iOS forcefully)
+ */
+ public static isSupported(): Promise {
+ if (IndexedDBWrapper.isSupportedPromise) {
+ return IndexedDBWrapper.isSupportedPromise
+ } else {
+ IndexedDBWrapper.isSupportedPromise = new Promise(resolve => {
+ const indexedDB = IndexedDBWrapper.getIndexedDB()
+ const iOS = !!navigator.platform && /iPad|iPhone|iPod/.test(navigator.platform)
+
+ if (!indexedDB || iOS) {
+ Logger.warn('IndexedDB is not supported in this browser')
+ resolve(false)
+ } else {
+ const dbOpenablePromise = IndexedDBWrapper.tryOpen(indexedDB)
+ .then((dbOpenable) => {
+ if (!dbOpenable) {
+ Logger.warn('IndexedDB is not supported in this browser')
+ }
+
+ return dbOpenable
+ })
+
+ resolve(dbOpenablePromise)
+ }
+ })
+ }
- if (!isSupported()) {
- return Promise.reject({name: 'IDBNotSupported', message: 'IndexedDB is not supported'})
+ return IndexedDBWrapper.isSupportedPromise
}
- return new Promise((resolve, reject) => {
+ /**
+ * Get indexedDB instance
+ */
+ private static getIndexedDB(): Maybe {
+ return window.indexedDB ||
+ window.mozIndexedDB ||
+ window.webkitIndexedDB ||
+ window.msIndexedDB
+ }
- if (_db) {
- resolve({success: true})
- return
+ constructor() {
+ const idb = IndexedDBWrapper.getIndexedDB()
+ if (!idb) {
+ throw this.notSupportedError
}
- const request = indexedDB.open(_dbName, _dbVersion)
+ this.idbFactory = idb
+ }
- request.onupgradeneeded = e => _handleUpgradeNeeded(e, reject)
- request.onsuccess = e => _handleOpenSuccess(e, resolve)
- request.onerror = reject
- })
-}
+ /**
+ * Sets custom name if provided and migrates database
+ */
+ setCustomName(customName?: string): Promise {
+ if (customName && customName.length > 0) {
+ this.dbName = `${Globals.namespace}-${customName}`
+ return this.migrateDb(this.dbDefaultName, this.dbName)
+ }
-/**
- * Get transaction and the store
- *
- * @param {string} storeName
- * @param {string} mode
- * @param {Function} reject
- * @returns {{transaction, store: IDBObjectStore, index: IDBIndex}}
- * @private
- */
-function _getTranStore ({storeName, mode}: {storeName: string, mode: string}, reject: Function): {transaction: IDBTransaction, store: IDBObjectStore, index: IDBIndex, options: any} {
+ return Promise.resolve()
+ }
- const transaction = _db.transaction([storeName], mode)
- const store = transaction.objectStore(storeName)
- const options = SchemeMap.right[convertStoreName({storeName, dir: 'right'})]
- let index
+ /**
+ * Opens database with defined name and resolves with database connection if successed
+ * @param name name of database to open
+ * @param version optional version of database schema
+ * @param upgradeCallback optional `IDBOpenRequest.onupgradeneeded` event handler
+ */
+ private openDatabase(name: string, version?: number, upgradeCallback?: (event: IDBVersionChangeEvent, reject: () => void) => void): Promise {
+
+ return IndexedDBWrapper.isSupported()
+ .then(supported => {
+ if (!supported) {
+ return Promise.reject(this.notSupportedError)
+ } else {
+
+ return new Promise((resolve, reject) => {
+ const request = this.idbFactory.open(name, version)
+
+ if (upgradeCallback) {
+ request.onupgradeneeded = (event) => upgradeCallback(event, reject)
+ }
+
+ request.onsuccess = (event: IDBOpenDBEvent) => {
+ const connection = event.target.result
+ if (connection) {
+ resolve(connection)
+ } else {
+ reject(this.databaseOpenError)
+ }
+ }
- if (options.index) {
- index = store.index(`${options.index}Index`)
+ request.onerror = reject
+ })
+ }
+ })
}
- transaction.onerror = reject
- transaction.onabort = reject
+ /**
+ * Checks if database with passed name exists
+ */
+ private databaseExists(name: string): Promise {
+ return new Promise((resolve: (result: boolean) => void) => {
+ let existed = true
- return {transaction, store, index, options}
-}
+ this.openDatabase(name, undefined, () => { existed = false })
+ .then(connection => {
+ connection.close()
-/**
- * Override the error by extracting only name and message of the error
- *
- * @param {Function} reject
- * @param {Object} error
- * @returns {Object}
- * @private
- */
-function _overrideError (reject, error) {
- const {name, message} = error.target.error
- return reject({name, message})
-}
+ if (existed) {
+ return
+ }
-/**
- * Get list of composite keys if available
- * @param options
- * @returns {Array|null}
- * @private
- */
-function _getCompositeKeys (options) {
- return options.fields[options.keyPath].composite || null
-}
+ // We didn't have this database before the check, so remove it
+ return this.deleteDatabaseByName(name)
+ })
+ .then(() => resolve(existed))
+ })
+ }
-/**
- * Prepare the target to be queried depending on the composite key if defined
- *
- * @param {Object} options
- * @param {*} target
- * @param {string} action
- * @returns {*}
- * @private
- */
-function _prepareTarget (options, target, action) {
- const addOrPut = ['add', 'put'].indexOf(action) !== -1
- const composite = _getCompositeKeys(options)
-
- return composite
- ? addOrPut
- ? {[options.keyPath]: composite.map(key => target[key]).join(''), ...target}
- : target ? target.join('') : null
- : target
-}
+ private cloneData(defaultDbConnection: IDBDatabase, customDbConnection: IDBDatabase): Promise {
-/**
- * Prepare the result to be return depending on the composite key definition
- *
- * @param {Object} options
- * @param {Object} target
- * @returns {Array|null}
- * @private
- */
-function _prepareResult (options, target) {
- const composite = _getCompositeKeys(options)
- return composite && isObject(target)
- ? composite.map(key => target[key])
- : null
-}
+ // Function to clone a single store
+ const cloneStore = (storeName: string) => {
+ const connection = this.indexedDbConnection
+ this.indexedDbConnection = defaultDbConnection
-/**
- * Initiate the database request
- *
- * @param {string} storeName
- * @param {*=} target
- * @param {string} action
- * @param {string} [mode=readonly]
- * @returns {Promise}
- * @private
- */
-function _initRequest ({storeName, target = null, action, mode = 'readonly'}) {
- return _open()
- .then(() => {
- return new Promise((resolve, reject) => {
- const {store, options} = _getTranStore({storeName, mode}, reject)
- const request = store[action](_prepareTarget(options, target, action))
- const result = _prepareResult(options, target)
+ return this.getAll(storeName) // Get all records from default-named database
+ .then((records: Array) => {
+ this.indexedDbConnection = customDbConnection
- request.onsuccess = () => {
- if (action === 'get' && !request.result) {
- reject({name: 'NotRecordFoundError', message: `Requested record not found in "${storeName}" store`})
- } else {
- resolve(result || request.result || target)
+ if (records.length < 1) { // There is no records in the store
+ return
}
- }
- request.onerror = error => _overrideError(reject, error)
+ return this.addBulk(storeName, records, true) // Put all records into custom-named database
+ })
+ .then(() => {
+ this.indexedDbConnection = connection // Restore initial state
+ })
+ }
+
+ // Get names of stores
+ const storeNames: string[] = values(SchemeMap.storeNames.left)
+ .filter(store => !store.permanent)
+ .map(store => store.name)
+
+ const cloneStorePromises = storeNames.map(name => () => cloneStore(name))
+
+ // Run clone operations one by one
+ return cloneStorePromises.reduce(
+ (previousTask, currentTask) => previousTask.then(currentTask),
+ Promise.resolve()
+ )
+ }
+
+ /**
+ * Migrates created database with default name to custom
+ * The IndexedDb API doesn't provide method to rename existing database so we have to create a new database, clone
+ * data and remove the old one.
+ */
+ private migrateDb(defaultName: string, customName: string): Promise {
+ return this.databaseExists(defaultName)
+ .then((defaultExists) => {
+ if (defaultExists) {
+ // Migration hadn't finished yet
+ return Promise.all([
+ this.openDatabase(defaultName, this.dbVersion, this.handleUpgradeNeeded), // Open the default database, migrate version if needed
+ this.openDatabase(customName, this.dbVersion, this.handleUpgradeNeeded), // Open or create a new database, migrate version if needed
+ ])
+ .then(([defaultDbConnection, customDbConnection]) => {
+ return this.cloneData(defaultDbConnection, customDbConnection)
+ .then(() => {
+ this.indexedDbConnection = customDbConnection
+
+ defaultDbConnection.close()
+ return this.deleteDatabaseByName(defaultName)
+ })
+ })
+ .then(() => Logger.info('Database migration finished'))
+
+ } else {
+ // There is no default-named database, let's just create or open a custom-named one
+ return this.openDatabase(customName, this.dbVersion, this.handleUpgradeNeeded)
+ .then(customDbConnection => { this.indexedDbConnection = customDbConnection })
+ }
})
- })
-}
+ }
+
+ /**
+ * Handle database upgrade/initialization
+ * - store activity state from memory if database unexpectedly got lost in the middle of the window session
+ * - migrate data from localStorage if available on browser upgrade
+ */
+ private handleUpgradeNeeded(e: IDBVersionChangeEvent, reject: (reason: any) => void) {
+ const db = e.target.result
+
+ e.target.transaction.onerror = reject
+ e.target.transaction.onabort = reject
+
+ const storeNames = SchemeMap.storeNames.left
+ const activityState = ActivityState.current || {}
+ const inMemoryAvailable = activityState && !isEmpty(activityState)
+
+ entries(storeNames)
+ .filter(([, store]) => !store.permanent)
+ .forEach(([longStoreName, store]) => {
+ const options = SchemeMap.right[longStoreName]
+ const objectStore = db.createObjectStore(store.name, {
+ keyPath: options.keyPath,
+ autoIncrement: options.autoIncrement || false
+ })
+
+ if (options.index) {
+ objectStore.createIndex(`${options.index}Index`, options.index)
+ }
-/**
- * Initiate bulk database request by reusing the same transaction to perform the operation
- *
- * @param {string} storeName
- * @param {Array} target
- * @param {string} action
- * @param {string} mode
- * @returns {Promise}
- * @private
- */
-function _initBulkRequest ({storeName, target, action, mode}) {
- return _open()
- .then(() => {
- return new Promise((resolve, reject) => {
- if (!target || target && !target.length) {
- return reject({name: 'NoTargetDefined', message: `No array provided to perform ${action} bulk operation into "${storeName}" store`})
+ if (store.name === storeNames.activityState.name && inMemoryAvailable) {
+ objectStore.add(convertRecord({
+ storeName: longStoreName,
+ record: activityState,
+ dir: Direction.left
+ }))
+ Logger.info('Activity state has been recovered')
+ } else if (QuickStorage.stores[store.name]) {
+ QuickStorage.stores[store.name].forEach(record => objectStore.add(record))
+ Logger.info(`Migration from localStorage done for ${longStoreName} store`)
}
+ })
+
+ recoverPreferences()
+ QuickStorage.clear()
+ }
+
+ /**
+ * Open the database connection and create store if not existent
+ */
+ private open(): Promise<{ success: boolean }> {
+ if (this.indexedDbConnection) {
+ return Promise.resolve({ success: true })
+ }
- const {transaction, store, options} = _getTranStore({storeName, mode}, reject)
- let result = []
- let current = target[0]
+ return this.openDatabase(this.dbName, this.dbVersion, this.handleUpgradeNeeded)
+ .then(connection => {
+ this.indexedDbConnection = connection
+ this.indexedDbConnection.onclose = () => this.destroy
+ return ({ success: true })
+ })
+ }
+
+ /**
+ * Get transaction and the store
+ */
+ private getTransactionStore({ storeName, mode }: { storeName: string, mode: IDBTransactionMode }, reject: (reason: any) => void, db: IDBDatabase): Transaction {
+ const transaction: IDBTransaction = db.transaction([storeName], mode)
+ const store = transaction.objectStore(storeName)
+ const options = SchemeMap.right[convertStoreName({ storeName, dir: Direction.right })]
+ let index
+
+ if (options.index) {
+ index = store.index(`${options.index}Index`)
+ }
- transaction.oncomplete = () => resolve(result)
+ transaction.onerror = reject
+ transaction.onabort = reject
+
+ return { transaction, store, index, options }
+ }
+
+ /**
+ * Override the error by extracting only name and message of the error
+ */
+ private overrideError(reject, error): Promise {
+ const { name, message } = error.target.error
+ return reject({ name, message })
+ }
- request(store[action](_prepareTarget(options, current, action)))
+ /**
+ * Get list of composite keys if available
+ */
+ private getCompositeKeys(options): Nullable> {
+ return options.fields[options.keyPath].composite || null
+ }
- function request (req) {
- req.onerror = error => _overrideError(reject, error)
- req.onsuccess = () => {
- result.push(_prepareResult(options, current) || req.result)
+ /**
+ * Prepare the target to be queried depending on the composite key if defined
+ */
+ private prepareTarget(options, target, action: Action) {
+ const addOrPut = [Action.add, Action.put].indexOf(action) !== -1
+ const composite = this.getCompositeKeys(options)
+
+ return composite
+ ? addOrPut
+ ? { [options.keyPath]: composite.map(key => target[key]).join(''), ...target }
+ : target ? target.join('') : null
+ : target
+ }
- current = target[result.length]
+ /**
+ * Prepare the result to be return depending on the composite key definition
+ */
+ private prepareResult(options, target) {
+ const composite = this.getCompositeKeys(options)
+ return composite && isObject(target)
+ ? composite.map(key => target[key])
+ : null
+ }
- if (result.length < target.length) {
- request(store[action](_prepareTarget(options, current, action)))
+ /**
+ * Initiate the database request
+ */
+ private initRequest({ storeName, target = null, action, mode = 'readonly' as IDBTransactionMode }: Request): Promise {
+ return this.open()
+ .then(() => {
+ return new Promise((resolve, reject) => {
+ if (!this.indexedDbConnection) {
+ reject(this.noConnectionError)
+ } else {
+ const { store, options } = this.getTransactionStore({ storeName, mode }, reject, this.indexedDbConnection)
+ const request = store[action](this.prepareTarget(options, target, action))
+ const result = this.prepareResult(options, target)
+
+ request.onsuccess = () => {
+ if (action === Action.get && !request.result) {
+ reject({ name: 'NotRecordFoundError', message: `Requested record not found in "${storeName}" store` })
+ } else {
+ resolve(result || request.result || target)
+ }
}
+
+ request.onerror = error => this.overrideError(reject, error)
}
- }
+ })
})
- })
-}
+ }
-/**
- * Open cursor for bulk operations or listing
- *
- * @param {string} storeName
- * @param {string} action
- * @param {IDBKeyRange=} range
- * @param {boolean=} firstOnly
- * @param {string} [mode=readonly]
- * @returns {Promise}
- * @private
- */
-function _openCursor ({storeName, action = 'list', range = null, firstOnly, mode = 'readonly'}) {
- return _open()
- .then(() => {
- return new Promise((resolve, reject) => {
- const {transaction, store, index, options} = _getTranStore({storeName, mode}, reject)
- const cursorRequest = (index || store).openCursor(range)
- const items = []
-
- transaction.oncomplete = () => resolve(firstOnly ? items[0] : items)
-
- cursorRequest.onsuccess = e => {
-
- const cursor = e.target.result
-
- if (cursor) {
- if (action === 'delete') {
- cursor.delete()
- items.push(_prepareResult(options, cursor.value) || cursor.value[options.keyPath])
- } else {
- items.push(cursor.value)
- }
+ /**
+ * Initiate bulk database request by reusing the same transaction to perform the operation
+ */
+ private initBulkRequest({ storeName, target, action, mode = 'readwrite' }: Request): Promise {
+ if (!target || target && !target.length) {
+ return Promise.reject({ name: 'NoTargetDefined', message: `No array provided to perform ${action} bulk operation into "${storeName}" store` })
+ }
+
+ return this.open()
+ .then(() => {
+ return new Promise((resolve, reject) => {
+ if (!this.indexedDbConnection) {
+ reject(this.noConnectionError)
+ } else {
+ const { transaction, store, options } = this.getTransactionStore({ storeName, mode }, reject, this.indexedDbConnection)
+ const result = new Array()
+ let current = target[0]
- if (!firstOnly) {
- cursor.continue()
+ transaction.oncomplete = () => resolve(result)
+
+ const request = (req) => {
+ req.onerror = error => this.overrideError(reject, error)
+ req.onsuccess = () => {
+ result.push(this.prepareResult(options, current) || req.result)
+
+ current = target[result.length]
+
+ if (result.length < target.length) {
+ request(store[action](this.prepareTarget(options, current, action)))
+ }
+ }
}
+
+ request(store[action](this.prepareTarget(options, current, action)))
}
- }
+ })
+ })
+ }
+
+ /**
+ * Open cursor for bulk operations or listing
+ */
+ private openCursor({ storeName, action, range = null, firstOnly = false, mode = 'readonly' }: Request): Promise> {
+ return this.open()
+ .then(() => {
+ return new Promise((resolve, reject) => {
+ if (!this.indexedDbConnection) {
+ reject(this.noConnectionError)
+ } else {
+ const { transaction, store, index, options } = this.getTransactionStore({ storeName, mode }, reject, this.indexedDbConnection)
+
+ const cursorRequest: OpenIDBCursorRequest = (index || store).openCursor(range)
+ const items = new Array()
+
+ transaction.oncomplete = () => resolve(firstOnly ? items[0] : items)
+
+ cursorRequest.onsuccess = e => {
+ const cursor = e.target.result
+
+ if (cursor) {
+ if (action === Action.delete) {
+ cursor.delete()
+ items.push(this.prepareResult(options, cursor.value) || cursor.value[options.keyPath])
+ } else {
+ items.push(cursor.value)
+ }
- cursorRequest.onerror = error => _overrideError(reject, error)
+ if (!firstOnly) {
+ cursor.continue()
+ }
+ }
+ }
+
+ cursorRequest.onerror = error => this.overrideError(reject, error)
+ }
+ })
})
- })
-}
+ }
-/**
- * Get all records from particular store
- *
- * @param {string} storeName
- * @param {boolean=} firstOnly
- * @returns {Promise}
- */
+ private deleteDatabaseByName(dbName: string): Promise {
+ return new Promise((resolve, reject) => {
+ const request = this.idbFactory.deleteDatabase(dbName)
-function getAll (storeName, firstOnly) {
- return _openCursor({storeName, firstOnly})
-}
+ request.onerror = error => this.overrideError(reject, error)
+ request.onsuccess = resolve
+ request.onblocked = e => reject(e.target)
+ })
+ }
-/**
- * Get the first row from the store
- *
- * @param {string} storeName
- * @returns {Promise}
- */
-function getFirst (storeName) {
- return getAll(storeName, true)
-}
+ /**
+ * Get all records from particular store
+ */
+ getAll(storeName: string, firstOnly = false): Promise> {
+ return this.openCursor({ storeName, action: Action.list, firstOnly })
+ }
-/**
- * Get item from a particular store
- *
- * @param {string} storeName
- * @param {*} target
- * @returns {Promise}
- */
-function getItem (storeName, target) {
- return _initRequest({storeName, target, action: 'get'})
-}
+ /**
+ * Get the first row from the store
+ */
+ getFirst(storeName: string): Promise {
+ return this.getAll(storeName, true)
+ }
-/**
- * Return filtered result by value on available index
- *
- * @param {string} storeName
- * @param {string} by
- * @returns {Promise}
- */
-function filterBy (storeName, by) {
+ /**
+ * Get item from a particular store
+ */
+ getItem(storeName: string, target: any): Promise {
+ return this.initRequest({ storeName, target, action: Action.get })
+ }
- const range = IDBKeyRange.only(by)
+ /**
+ * Return filtered result by value on available index
+ */
+ filterBy(storeName: string, by: string): Promise {
- return _openCursor({storeName, range})
-}
+ const range = IDBKeyRange.only(by)
-/**
- * Add item to a particular store
- *
- * @param {string} storeName
- * @param {Object} target
- * @returns {Promise}
- */
-function addItem (storeName, target) {
- return _initRequest({storeName, target, action: 'add', mode: 'readwrite'})
-}
+ return this.openCursor({ storeName, action: Action.list, range })
+ }
-/**
- * Add multiple items into particular store
- *
- * @param {string} storeName
- * @param {Array} target
- * @param {boolean=} overwrite
- * @returns {Promise}
- */
-function addBulk (storeName, target, overwrite) {
- return _initBulkRequest({storeName, target, action: (overwrite ? 'put' : 'add'), mode: 'readwrite'})
-}
+ /**
+ * Add item to a particular store
+ */
+ addItem(storeName: string, target): Promise {
+ return this.initRequest({ storeName, target, action: Action.add, mode: 'readwrite' })
+ }
-/**
- * Update item in a particular store
- *
- * @param {string} storeName
- * @param {Object} target
- * @returns {Promise}
- */
-function updateItem (storeName, target) {
- return _initRequest({storeName, target, action: 'put', mode: 'readwrite'})
-}
+ /**
+ * Add multiple items into particular store
+ */
+ addBulk(storeName: string, target, overwrite: boolean): Promise {
+ return this.initBulkRequest({ storeName, target, action: (overwrite ? Action.put : Action.add), mode: 'readwrite' })
+ }
-/**
- * Delete item from a particular store
- *
- * @param {string} storeName
- * @param {*} target
- * @returns {Promise}
- */
-function deleteItem (storeName, target) {
- return _initRequest({storeName, target, action: 'delete', mode: 'readwrite'})
-}
+ /**
+ * Update item in a particular store
+ */
+ updateItem(storeName: string, target): Promise {
+ return this.initRequest({ storeName, target, action: Action.put, mode: 'readwrite' })
+ }
-/**
- * Delete items until certain bound (primary key as a bound scope)
- *
- * @param {string} storeName
- * @param {*} value
- * @param {string=} condition
- * @returns {Promise}
- */
-function deleteBulk (storeName, value, condition) {
- const range = condition
- ? IDBKeyRange[condition](value)
- : IDBKeyRange.only(value)
-
- return _openCursor({storeName, action: 'delete', range, mode: 'readwrite'})
-}
+ /**
+ * Delete item from a particular store
+ */
+ deleteItem(storeName: string, target): Promise {
+ return this.initRequest({ storeName, target, action: Action.delete, mode: 'readwrite' })
+ }
-/**
- * Trim the store from the left by specified length
- *
- * @param {string} storeName
- * @param {number} length
- * @returns {Promise}
- */
-function trimItems (storeName, length) {
- const options = SchemeMap.right[convertStoreName({storeName, dir: 'right'})]
-
- return getAll(storeName)
- .then(records => records.length ? records[length - 1] : null)
- .then(record => record ? deleteBulk(storeName, record[options.keyPath], 'upperBound') : [])
-}
+ /**
+ * Delete items until certain bound (primary key as a bound scope)
+ */
+ deleteBulk(storeName: string, value: any, condition?: 'lowerBound' | 'upperBound'): Promise {
+ const range = condition
+ ? IDBKeyRange[condition](value)
+ : IDBKeyRange.only(value)
-/**
- * Count the number of records in the store
- *
- * @param {string} storeName
- * @returns {Promise}
- */
-function count (storeName) {
- return _open()
- .then(() => {
- return new Promise((resolve, reject) => {
- const {store} = _getTranStore({storeName, mode: 'readonly'}, reject)
- const request = store.count()
-
- request.onsuccess = () => resolve(request.result)
- request.onerror = error => _overrideError(reject, error)
- })
- })
-}
+ return this.openCursor({ storeName, action: Action.delete, range, mode: 'readwrite' })
+ }
-/**
- * Clear all records from a particular store
- *
- * @param {string} storeName
- * @returns {Promise}
- */
-function clear (storeName) {
- return _initRequest({storeName, action: 'clear', mode: 'readwrite'})
-}
+ /**
+ * Trim the store from the left by specified length
+ */
+ trimItems(storeName: string, length: number): Promise {
+ const options = SchemeMap.right[convertStoreName({ storeName, dir: Direction.right })]
+
+ return this.getAll(storeName)
+ .then(records => records.length ? records[length - 1] : null)
+ .then(record => record ? this.deleteBulk(storeName, record[options.keyPath], 'upperBound') : [])
+ }
-/**
- * Close db connection and delete the db
- * WARNING: should be used only by adjust's demo app!
- *
- * @returns {Promise}
- * @private
- */
-function __delete () {
- const indexedDB = _getIDB()
+ /**
+ * Count the number of records in the store
+ */
+ count(storeName: string): Promise {
+ return this.open()
+ .then(() => {
+ return new Promise((resolve, reject) => {
+ if (!this.indexedDbConnection) {
+ reject(this.noConnectionError)
+ } else {
+ const { store } = this.getTransactionStore({ storeName, mode: 'readonly' }, reject, this.indexedDbConnection)
- destroy()
+ const request = store.count()
- return new Promise((resolve, reject) => {
- const request = indexedDB.deleteDatabase(_dbName)
+ request.onsuccess = () => resolve(request.result)
+ request.onerror = error => this.overrideError(reject, error)
+ }
+ })
+ })
+ }
- request.onerror = error => _overrideError(reject, error)
+ /**
+ * Clear all records from a particular store
+ */
+ clear(storeName: string): Promise {
+ return this.initRequest({ storeName, action: Action.clear, mode: 'readwrite' })
+ }
- request.onsuccess = e => {
- resolve(e.result)
+ /**
+ * Close the database and destroy the reference to it
+ */
+ destroy() {
+ if (this.indexedDbConnection) {
+ this.indexedDbConnection.close()
}
+ this.indexedDbConnection = null
+ }
- request.onerror = e => reject(e.target)
- request.onblocked = e => reject(e.target)
- })
-}
+ /**
+ * Close db connection and delete the db
+ * WARNING: should be used only by adjust's demo app!
+ */
+ deleteDatabase(): Promise {
+ this.destroy()
-/**
- * Close the database and destroy the reference to it
- */
-function destroy () {
- if (_db) {
- _db.close()
+ return this.deleteDatabaseByName(this.dbName)
}
- _db = null
-}
-export {
- isSupported,
- getAll,
- getFirst,
- getItem,
- filterBy,
- addItem,
- addBulk,
- updateItem,
- deleteItem,
- deleteBulk,
- trimItems,
- count,
- clear,
- destroy,
- __delete
}
+export { IndexedDBWrapper as IndexedDB }
diff --git a/src/sdk/storage/localstorage.js b/src/sdk/storage/localstorage.js
deleted file mode 100644
index 6230507..0000000
--- a/src/sdk/storage/localstorage.js
+++ /dev/null
@@ -1,489 +0,0 @@
-import ActivityState from '../activity-state'
-import QuickStorage from '../storage/quick-storage'
-import SchemeMap from './scheme-map'
-import Logger from '../logger'
-import {recover as recoverPreferences} from '../preferences'
-import {entries, findIndex, isEmpty, isObject, reducer} from '../utilities'
-import {convertRecord, convertStoreName} from './converter'
-
-/**
- * Check if LocalStorage is supported in the current browser
- *
- * @returns {boolean}
- */
-function isSupported () {
-
- let uid = (new Date).toString()
- let storage
- let result
-
- try {
- (storage = window.localStorage).setItem(uid, uid)
- result = storage.getItem(uid) === uid
- storage.removeItem(uid)
- return !!(result && storage)
- } catch (exception) {
- Logger.warn('LocalStorage is not supported in this browser')
- return false
- }
-
-}
-
-/**
- * Prepare schema details if not existent
- *
- * @private
- */
-function _open () {
-
- if (!isSupported()) {
- return {status: 'error', error: {name: 'LSNotSupported', message: 'LocalStorage is not supported'}}
- }
-
- const storeNames = SchemeMap.storeNames.left
- const activityState = ActivityState.current || {}
- const inMemoryAvailable = activityState && !isEmpty(activityState)
-
- entries(storeNames)
- .filter(([, store]) => !store.permanent)
- .forEach(([longStoreName, store]) => {
- const asStoreName = storeNames.activityState.name
-
- if (store.name === asStoreName && !QuickStorage.stores[asStoreName]) {
- QuickStorage.stores[asStoreName] = inMemoryAvailable ? [convertRecord({
- storeName: longStoreName,
- record: activityState,
- dir: 'left'
- })] : []
- } else if (!QuickStorage.stores[store.name]) {
- QuickStorage.stores[store.name] = []
- }
- })
-
- recoverPreferences()
-
- return {status: 'success'}
-}
-
-/**
- * Get list of composite keys if available
- * @param options
- * @returns {Array|null}
- * @private
- */
-function _getCompositeKeys (options) {
- return options.fields[options.keyPath].composite || null
-}
-
-/**
- * Get composite keys when defined or fallback to primary key for particular store
- *
- * @param {string} storeName
- * @returns {Array}
- * @private
- */
-function _getKeys (storeName) {
- const options = SchemeMap.right[convertStoreName({storeName, dir: 'right'})]
-
- return _getCompositeKeys(options, true) || [options.keyPath]
-}
-
-/**
- * Initiate quasi-database request
- *
- * @param {string} storeName
- * @param {*=} id
- * @param {Object=} item
- * @param {Function} action
- * @returns {Promise}
- * @private
- */
-function _initRequest ({storeName, id, item}, action) {
- const open = _open()
- const options = SchemeMap.right[convertStoreName({storeName, dir: 'right'})]
-
- if (open.status === 'error') {
- return Promise.reject(open.error)
- }
-
- return new Promise((resolve, reject) => {
- const items = QuickStorage.stores[storeName]
- const keys = _getKeys(storeName)
- const ids = id instanceof Array ? id.slice() : [id]
- const lastId = (items[items.length - 1] || {})[options.keyPath] || 0
- const target = id
- ? keys
- .map((key, index) => [key, ids[index]])
- .reduce(reducer, {})
- : {...item}
-
-
- const index = target ? findIndex(items, keys, target) : null
-
- return action(resolve, reject, {keys, items, index, options, lastId})
- })
-}
-
-/**
- * Sort the array by provided key (key can be a composite one)
- * - by default sorts in ascending order by primary keys
- * - force order by provided value
- *
- * @param {Array} items
- * @param {Array} keys
- * @param {string=} exact
- * @returns {Array}
- * @private
- */
-function _sort (items, keys, exact) {
- const clone = [...items]
- const reversed = keys.slice().reverse()
-
- function compare (a, b, key) {
- const expr1 = exact ? exact === a[key] : a[key] < b[key]
- const expr2 = exact ? exact > a[key] : a[key] > b[key]
-
- return expr1 ? -1 : (expr2 ? 1 : 0)
- }
-
- return clone.sort((a, b) => reversed
- .reduce((acc, key) => {
- return acc || compare(a, b, key)
- }, 0))
-}
-
-/**
- * Prepare the target to be queried depending on the composite key if defined
- *
- * @param {Object} options
- * @param {*} target
- * @param {number} next
- * @returns {*}
- * @private
- */
-function _prepareTarget (options, target, next) {
- const composite = _getCompositeKeys(options)
- return composite
- ? {[options.keyPath]: composite.map(key => target[key]).join(''), ...target}
- : options.autoIncrement && next
- ? {[options.keyPath]: next, ...target}
- : {...target}
-}
-
-/**
- * Prepare the result to be return depending on the composite key definition
- *
- * @param {Object} options
- * @param {Object} target
- * @returns {*}
- * @private
- */
-function _prepareResult (options, target) {
- const composite = _getCompositeKeys(options)
- return composite && isObject(target)
- ? composite.map(key => target[key])
- : (target[options.keyPath] || target)
-}
-
-/**
- * Get all records from particular store
- *
- * @param {string} storeName
- * @param {boolean=} firstOnly
- * @returns {Promise}
- */
-function getAll (storeName, firstOnly) {
- const open = _open()
-
- if (open.status === 'error') {
- return Promise.reject(open.error)
- }
-
- return new Promise((resolve, reject) => {
- const value = QuickStorage.stores[storeName]
-
- if (value instanceof Array) {
- resolve(firstOnly ? value[0] : _sort(value, _getKeys(storeName)))
- } else {
- reject({name: 'NotFoundError', message: `No objectStore named ${storeName} in this database`})
- }
- })
-}
-
-/**
- * Get the first row from the store
- *
- * @param {string} storeName
- * @returns {Promise}
- */
-function getFirst (storeName) {
- return getAll(storeName, true)
-}
-
-/**
- * Get item from a particular store
- *
- * @param {string} storeName
- * @param {*} id
- * @returns {Promise}
- */
-function getItem (storeName, id) {
- return _initRequest({storeName, id}, (resolve, reject, {items, index, options}) => {
- if (index === -1) {
- reject({name: 'NotRecordFoundError', message: `Requested record not found in "${storeName}" store`})
- } else {
- resolve(_prepareTarget(options, items[index]))
- }
- })
-}
-
-/**
- * Return filtered result by value on available index
- *
- * @param {string} storeName
- * @param {string} by
- * @returns {Promise}
- */
-function filterBy (storeName, by) {
- return getAll(storeName)
- .then(result => result
- .filter(item => {
- return item[SchemeMap.right[convertStoreName({storeName, dir: 'right'})].index] === by
- }))
-}
-
-/**
- * Add item to a particular store
- *
- * @param {string} storeName
- * @param {Object} item
- * @returns {Promise}
- */
-function addItem (storeName, item) {
- return _initRequest({storeName, item}, (resolve, reject, {items, index, options, lastId}) => {
- if (index !== -1) {
- reject({name: 'ConstraintError', message: `Constraint was not satisfied, trying to add existing item into "${storeName}" store`})
- } else {
- items.push(_prepareTarget(options, item, (lastId + 1)))
- QuickStorage.stores[storeName] = items
- resolve(_prepareResult(options, item))
- }
- })
-}
-
-/**
- * Add multiple items into particular store
- *
- * @param {string} storeName
- * @param {Object} target
- * @param {boolean=} overwrite
- * @returns {Promise}
- */
-function addBulk (storeName, target, overwrite) {
- return _initRequest({storeName}, (resolve, reject, {keys, items, options, lastId}) => {
- if (!target || target && !target.length) {
- return reject({name: 'NoTargetDefined', message: `No array provided to perform add bulk operation into "${storeName}" store`})
- }
-
- let id = lastId
- const newItems = target
- .map(item => _prepareTarget(options, item, ++id))
-
- const overlapping = newItems
- .filter(item => findIndex(items, keys, item) !== -1)
- .map(item => item[options.keyPath])
-
- const currentItems = overwrite ? items.filter(item => overlapping.indexOf(item[options.keyPath]) === -1) : [...items]
-
- if (overlapping.length && !overwrite) {
- reject({name: 'ConstraintError', message: `Constraint was not satisfied, trying to add existing items into "${storeName}" store`})
- } else {
- QuickStorage.stores[storeName] = _sort([...currentItems, ...newItems], keys)
- resolve(target.map(item => _prepareResult(options, item)))
- }
- })
-}
-
-/**
- * Update item in a particular store
- *
- * @param {string} storeName
- * @param {Object} item
- * @returns {Promise}
- */
-function updateItem (storeName, item) {
- return _initRequest({storeName, item}, (resolve, _, {items, index, options, lastId}) => {
- const nextId = index === -1 ? (lastId + 1) : null
- const target = _prepareTarget(options, item, nextId)
-
- if (index === -1) {
- items.push(target)
- } else {
- items.splice(index, 1, target)
- }
-
- QuickStorage.stores[storeName] = items
- resolve(_prepareResult(options, item))
- })
-}
-
-/**
- * Delete item from a particular store
- *
- * @param {string} storeName
- * @param {*} id
- * @returns {Promise}
- */
-function deleteItem (storeName, id) {
- return _initRequest({storeName, id}, (resolve, _, {items, index}) => {
- if (index !== -1) {
- items.splice(index, 1)
- QuickStorage.stores[storeName] = items
- }
-
- resolve(id)
- })
-}
-
-/**
- * Find index of the item with the closest value to the bound
- *
- * @param {Array} array
- * @param {string} key
- * @param {number|string} value
- * @returns {number}
- * @private
- */
-function _findMax (array, key, value) {
-
- if (!array.length) {
- return -1
- }
-
- let max = {index: -1, value: (isNaN(value) ? '' : 0)}
-
- for (let i = 0; i < array.length; i += 1) {
- if (array[i][key] <= value) {
- if (array[i][key] >= max.value) {
- max = {value: array[i][key], index: i}
- }
- } else {
- return max.index
- }
- }
-
- return max.index
-}
-
-/**
- * Delete items until certain bound (primary key as a bound scope)
- *
- * @param {string} storeName
- * @param {*} value
- * @param {string=} condition
- * @returns {Promise}
- */
-function deleteBulk (storeName, value, condition) {
- return getAll(storeName)
- .then(items => {
-
- const keys = _getKeys(storeName)
- const key = SchemeMap.right[convertStoreName({storeName, dir: 'right'})].index || keys[0]
- const exact = condition ? null : value
- const sorted = _sort(items, keys, exact)
- const index = _findMax(sorted, key, value)
-
- if (index === -1) {
- return []
- }
-
- const start = condition === 'lowerBound' ? index : 0
- const end = !condition || condition === 'upperBound' ? (index + 1) : sorted.length
- const deleted = sorted
- .splice(start, end)
- .map(item => keys.length === 1
- ? item[key]
- : keys.map(k => item[k]))
-
- QuickStorage.stores[storeName] = sorted
-
- return deleted
- })
-}
-
-/**
- * Trim the store from the left by specified length
- *
- * @param {string} storeName
- * @param {number} length
- * @returns {Promise}
- */
-function trimItems (storeName, length) {
- const open = _open()
- const options = SchemeMap.right[convertStoreName({storeName, dir: 'right'})]
-
- if (open.status === 'error') {
- return Promise.reject(open.error)
- }
-
- return getAll(storeName)
- .then(records => records.length ? records[length - 1] : null)
- .then(record => record ? deleteBulk(storeName, record[options.keyPath], 'upperBound') : [])
-}
-
-/**
- * Count the number of records in the store
- *
- * @param {string} storeName
- * @returns {Promise}
- */
-function count (storeName) {
- const open = _open()
-
- if (open.status === 'error') {
- return Promise.reject(open.error)
- }
-
- return Promise.resolve(QuickStorage.stores[storeName].length)
-}
-
-/**
- * Clear all records from a particular store
- *
- * @param {string} storeName
- * @returns {Promise}
- */
-function clear (storeName) {
- const open = _open()
-
- if (open.status === 'error') {
- return Promise.reject(open.error)
- }
-
- return new Promise(resolve => {
- QuickStorage.stores[storeName] = []
- resolve({})
- })
-}
-
-/**
- * Does nothing, it simply matches the common storage interface
- */
-function destroy () {}
-
-export {
- isSupported,
- getAll,
- getFirst,
- getItem,
- filterBy,
- addItem,
- addBulk,
- updateItem,
- deleteItem,
- deleteBulk,
- trimItems,
- count,
- clear,
- destroy
-}
diff --git a/src/sdk/storage/localstorage.ts b/src/sdk/storage/localstorage.ts
new file mode 100644
index 0000000..f8446a3
--- /dev/null
+++ b/src/sdk/storage/localstorage.ts
@@ -0,0 +1,500 @@
+import ActivityState from '../activity-state'
+import QuickStorage from './quick-storage'
+import SchemeMap from './scheme-map'
+import Logger from '../logger'
+import { recover as recoverPreferences } from '../preferences'
+import { entries, findIndex, isEmpty, isObject, reducer } from '../utilities'
+import { Direction, convertRecord, convertStoreName } from './converter'
+import { IStorage, Error } from './types'
+
+type ActionParameters = { keys, items, index, options, lastId }
+type RequestParameters = { storeName: string; id?: any; item?: any }
+type Action = (resolve, reject, options: ActionParameters) => void
+type StorageOpenStatus = { status: string; error?: Error }
+
+class LocalStorageWrapper implements IStorage {
+
+ /**
+ * Cached promise of LocalStorage validation
+ */
+ private static isSupportedPromise: Nullable> = null
+
+ /**
+ * Check if LocalStorage is supported in the current browser
+ */
+ static isSupported(): Promise {
+
+ if (LocalStorageWrapper.isSupportedPromise) {
+ return LocalStorageWrapper.isSupportedPromise
+ } else {
+ const uid = (new Date).toString()
+ const storage = window.localStorage
+
+ LocalStorageWrapper.isSupportedPromise = new Promise((resolve: (value: boolean) => void) => {
+ storage.setItem(uid, uid)
+ const result = storage.getItem(uid) === uid
+ storage.removeItem(uid)
+ const support = !!(result && storage)
+ resolve(support)
+ })
+ .catch(() => {
+ Logger.warn('LocalStorage is not supported in this browser')
+ return Promise.resolve(false)
+ })
+ }
+
+ return LocalStorageWrapper.isSupportedPromise
+ }
+
+ /**
+ * Prepare schema details if not existent
+ */
+ private open(): Promise {
+
+ return LocalStorageWrapper.isSupported()
+ .then(supported => {
+ if (!supported) {
+ return { status: 'error', error: { name: 'LSNotSupported', message: 'LocalStorage is not supported' } }
+ }
+
+ const storeNames = SchemeMap.storeNames.left
+ const activityState = ActivityState.current || {}
+ const inMemoryAvailable = activityState && !isEmpty(activityState)
+
+ entries(storeNames)
+ .filter(([, store]) => !store.permanent)
+ .forEach(([longStoreName, store]) => {
+ const asStoreName = storeNames.activityState.name
+
+ if (store.name === asStoreName && !QuickStorage.stores[asStoreName]) {
+ QuickStorage.stores[asStoreName] = inMemoryAvailable ? [convertRecord({
+ storeName: longStoreName,
+ record: activityState,
+ dir: Direction.left
+ })] : []
+ } else if (!QuickStorage.stores[store.name]) {
+ QuickStorage.stores[store.name] = []
+ }
+ })
+
+ recoverPreferences()
+
+ return { status: 'success' }
+ })
+ }
+
+ /**
+ * Get list of composite keys if available
+ * @param options
+ * @returns {Array|null}
+ * @private
+ */
+ private getCompositeKeys(options) {
+ return options.fields[options.keyPath].composite || null
+ }
+
+ /**
+ * Get composite keys when defined or fallback to primary key for particular store
+ *
+ * @param {string} storeName
+ * @returns {Array}
+ * @private
+ */
+ private getKeys(storeName) {
+ const options = SchemeMap.right[convertStoreName({ storeName, dir: Direction.right })]
+
+ return this.getCompositeKeys(options) || [options.keyPath]
+ }
+
+ /**
+ * Initiate quasi-database request
+ *
+ * @param {string} storeName
+ * @param {*=} id
+ * @param {Object=} item
+ * @param {Function} action
+ * @returns {Promise}
+ * @private
+ */
+ private initRequest({ storeName, id, item }: RequestParameters, action: Action) {
+
+ const options = SchemeMap.right[convertStoreName({ storeName, dir: Direction.right })]
+
+ return this.open()
+ .then(open => {
+ if (open.status === 'error') {
+ return Promise.reject(open.error)
+ }
+
+ return new Promise((resolve, reject) => {
+ const items = QuickStorage.stores[storeName]
+ const keys = this.getKeys(storeName)
+ const ids = id instanceof Array ? id.slice() : [id]
+ const lastId = (items[items.length - 1] || {})[options.keyPath] || 0
+ const target = id
+ ? keys
+ .map((key, index) => [key, ids[index]])
+ .reduce(reducer, {})
+ : { ...item }
+
+
+ const index = target ? findIndex(items, keys, target) : null
+
+ return action(resolve, reject, { keys, items, index, options, lastId })
+ })
+ })
+ }
+
+ /**
+ * Sort the array by provided key (key can be a composite one)
+ * - by default sorts in ascending order by primary keys
+ * - force order by provided value
+ *
+ * @param {Array} items
+ * @param {Array} keys
+ * @param {string=} exact
+ * @returns {Array}
+ * @private
+ */
+ private sort(items, keys, exact?: string) {
+ const clone = [...items]
+ const reversed = keys.slice().reverse()
+
+ function compare(a, b, key) {
+ const expr1 = exact ? exact === a[key] : a[key] < b[key]
+ const expr2 = exact ? exact > a[key] : a[key] > b[key]
+
+ return expr1 ? -1 : (expr2 ? 1 : 0)
+ }
+
+ return clone.sort((a, b) => reversed
+ .reduce((acc, key) => {
+ return acc || compare(a, b, key)
+ }, 0))
+ }
+
+ /**
+ * Prepare the target to be queried depending on the composite key if defined
+ *
+ * @param {Object} options
+ * @param {*} target
+ * @param {number} next
+ * @returns {*}
+ * @private
+ */
+ private prepareTarget(options, target: any, next?: number) {
+ const composite = this.getCompositeKeys(options)
+ return composite
+ ? { [options.keyPath]: composite.map(key => target[key]).join(''), ...target }
+ : options.autoIncrement && next
+ ? { [options.keyPath]: next, ...target }
+ : { ...target }
+ }
+
+ /**
+ * Prepare the result to be return depending on the composite key definition
+ *
+ * @param {Object} options
+ * @param {Object} target
+ * @returns {*}
+ * @private
+ */
+ private prepareResult(options, target) {
+ const composite = this.getCompositeKeys(options)
+ return composite && isObject(target)
+ ? composite.map(key => target[key])
+ : (target[options.keyPath] || target)
+ }
+
+ /**
+ * Get all records from particular store
+ *
+ * @param {string} storeName
+ * @param {boolean=} firstOnly
+ * @returns {Promise}
+ */
+ getAll(storeName: string, firstOnly?: boolean): Promise> {
+ return this.open()
+ .then(open => {
+ if (open.status === 'error') {
+ return Promise.reject(open.error)
+ }
+
+ return new Promise((resolve, reject) => {
+ const value = QuickStorage.stores[storeName]
+
+ if (value instanceof Array) {
+ resolve(firstOnly ? value[0] : this.sort(value, this.getKeys(storeName)))
+ } else {
+ reject({ name: 'NotFoundError', message: `No objectStore named ${storeName} in this database` })
+ }
+ })
+ })
+ }
+
+ /**
+ * Get the first row from the store
+ *
+ * @param {string} storeName
+ * @returns {Promise}
+ */
+ getFirst(storeName: string): Promise {
+ return this.getAll(storeName, true)
+ }
+
+ /**
+ * Get item from a particular store
+ *
+ * @param {string} storeName
+ * @param {*} id
+ * @returns {Promise}
+ */
+ getItem(storeName: string, id): Promise {
+ return this.initRequest({ storeName, id }, (resolve, reject, { items, index, options }) => {
+ if (index === -1) {
+ reject({ name: 'NotRecordFoundError', message: `Requested record not found in "${storeName}" store` })
+ } else {
+ resolve(this.prepareTarget(options, items[index]))
+ }
+ })
+ }
+
+ /**
+ * Return filtered result by value on available index
+ *
+ * @param {string} storeName
+ * @param {string} by
+ * @returns {Promise}
+ */
+ filterBy(storeName: string, by: string): Promise {
+ return this.getAll(storeName)
+ .then(result => result
+ .filter(item => {
+ return item[SchemeMap.right[convertStoreName({ storeName, dir: Direction.right })].index] === by
+ }))
+ }
+
+ /**
+ * Add item to a particular store
+ *
+ * @param {string} storeName
+ * @param {Object} item
+ * @returns {Promise}
+ */
+ addItem(storeName: string, item): Promise {
+ return this.initRequest({ storeName, item }, (resolve, reject, { items, index, options, lastId }) => {
+ if (index !== -1) {
+ reject({ name: 'ConstraintError', message: `Constraint was not satisfied, trying to add existing item into "${storeName}" store` })
+ } else {
+ items.push(this.prepareTarget(options, item, (lastId + 1)))
+ QuickStorage.stores[storeName] = items
+ resolve(this.prepareResult(options, item))
+ }
+ })
+ }
+
+ /**
+ * Add multiple items into particular store
+ *
+ * @param {string} storeName
+ * @param {Object} target
+ * @param {boolean=} overwrite
+ * @returns {Promise}
+ */
+ addBulk(storeName: string, target, overwrite: boolean): Promise {
+ return this.initRequest({ storeName }, (resolve, reject, { keys, items, options, lastId }) => {
+ if (!target || target && !target.length) {
+ return reject({ name: 'NoTargetDefined', message: `No array provided to perform add bulk operation into "${storeName}" store` })
+ }
+
+ let id = lastId
+ const newItems = target
+ .map(item => this.prepareTarget(options, item, ++id))
+
+ const overlapping = newItems
+ .filter(item => findIndex(items, keys, item) !== -1)
+ .map(item => item[options.keyPath])
+
+ const currentItems = overwrite ? items.filter(item => overlapping.indexOf(item[options.keyPath]) === -1) : [...items]
+
+ if (overlapping.length && !overwrite) {
+ reject({ name: 'ConstraintError', message: `Constraint was not satisfied, trying to add existing items into "${storeName}" store` })
+ } else {
+ QuickStorage.stores[storeName] = this.sort([...currentItems, ...newItems], keys)
+ resolve(target.map(item => this.prepareResult(options, item)))
+ }
+ })
+ }
+
+ /**
+ * Update item in a particular store
+ *
+ * @param {string} storeName
+ * @param {Object} item
+ * @returns {Promise}
+ */
+ updateItem(storeName: string, item): Promise {
+ return this.initRequest({ storeName, item }, (resolve, _, { items, index, options, lastId }) => {
+ const nextId = index === -1 ? (lastId + 1) : null
+ const target = this.prepareTarget(options, item, nextId)
+
+ if (index === -1) {
+ items.push(target)
+ } else {
+ items.splice(index, 1, target)
+ }
+
+ QuickStorage.stores[storeName] = items
+ resolve(this.prepareResult(options, item))
+ })
+ }
+
+ /**
+ * Delete item from a particular store
+ *
+ * @param {string} storeName
+ * @param {*} id
+ * @returns {Promise}
+ */
+ deleteItem(storeName: string, id): Promise {
+ return this.initRequest({ storeName, id }, (resolve, _, { items, index }) => {
+ if (index !== -1) {
+ items.splice(index, 1)
+ QuickStorage.stores[storeName] = items
+ }
+
+ resolve(id)
+ })
+ }
+
+ /**
+ * Find index of the item with the closest value to the bound
+ *
+ * @param {Array} array
+ * @param {string} key
+ * @param {number|string} value
+ * @returns {number}
+ * @private
+ */
+ private findMax(array, key, value) {
+
+ if (!array.length) {
+ return -1
+ }
+
+ let max = { index: -1, value: (isNaN(value) ? '' : 0) }
+
+ for (let i = 0; i < array.length; i += 1) {
+ if (array[i][key] <= value) {
+ if (array[i][key] >= max.value) {
+ max = { value: array[i][key], index: i }
+ }
+ } else {
+ return max.index
+ }
+ }
+
+ return max.index
+ }
+
+ /**
+ * Delete items until certain bound (primary key as a bound scope)
+ *
+ * @param {string} storeName
+ * @param {*} value
+ * @param {string=} condition
+ * @returns {Promise}
+ */
+ deleteBulk(storeName: string, value: any, condition?: 'lowerBound' | 'upperBound'): Promise {
+ return this.getAll(storeName)
+ .then(items => {
+
+ const keys = this.getKeys(storeName)
+ const key = SchemeMap.right[convertStoreName({ storeName, dir: Direction.right })].index || keys[0]
+ const exact = condition ? null : value
+ const sorted = this.sort(items, keys, exact)
+ const index = this.findMax(sorted, key, value)
+
+ if (index === -1) {
+ return []
+ }
+
+ const start = condition === 'lowerBound' ? index : 0
+ const end = !condition || condition === 'upperBound' ? (index + 1) : sorted.length
+ const deleted = sorted
+ .splice(start, end)
+ .map(item => keys.length === 1
+ ? item[key]
+ : keys.map(k => item[k]))
+
+ QuickStorage.stores[storeName] = sorted
+
+ return deleted
+ })
+ }
+
+ /**
+ * Trim the store from the left by specified length
+ *
+ * @param {string} storeName
+ * @param {number} length
+ * @returns {Promise}
+ */
+ trimItems(storeName: string, length: number): Promise {
+ const options = SchemeMap.right[convertStoreName({ storeName, dir: Direction.right })]
+
+ return this.getAll(storeName)
+ .then(records => records.length ? records[length - 1] : null)
+ .then(record => record ? this.deleteBulk(storeName, record[options.keyPath], 'upperBound') : [])
+ }
+
+ /**
+ * Count the number of records in the store
+ *
+ * @param {string} storeName
+ * @returns {Promise}
+ */
+ count(storeName: string): Promise {
+ return this.open()
+ .then(open => {
+ if (open.status === 'error') {
+ return Promise.reject(open.error)
+ }
+
+ return Promise.resolve(QuickStorage.stores[storeName].length)
+ })
+ }
+
+ /**
+ * Clear all records from a particular store
+ *
+ * @param {string} storeName
+ * @returns {Promise}
+ */
+ clear(storeName: string): Promise {
+ return this.open()
+ .then(open => {
+ if (open.status === 'error') {
+ return Promise.reject(open.error)
+ }
+
+ return new Promise(resolve => {
+ QuickStorage.stores[storeName] = []
+ resolve({})
+ })
+ })
+ }
+
+ /**
+ * Does nothing, it simply matches the common storage interface
+ */
+ destroy() { } // eslint-disable-line
+
+ /**
+ * Does nothing, it simply matches the common storage interface
+ */
+ deleteDatabase() { } // eslint-disable-line
+
+}
+
+export { LocalStorageWrapper as LocalStorage }
diff --git a/src/sdk/storage/quick-storage.js b/src/sdk/storage/quick-storage.js
deleted file mode 100644
index fb71a3b..0000000
--- a/src/sdk/storage/quick-storage.js
+++ /dev/null
@@ -1,78 +0,0 @@
-import {convertRecord} from './converter'
-import {entries} from '../utilities'
-import Globals from '../globals'
-import SchemeMap from './scheme-map'
-
-const _storageName = Globals.namespace
-const _storeNames = SchemeMap.storeNames.left
-
-/**
- * Get the value for specified key
- *
- * @param {string} key
- * @returns {*}
- * @private
- */
-function _get (key) {
- const value = JSON.parse(localStorage.getItem(`${_storageName}.${key}`))
- return (value instanceof Array
- ? value
- : convertRecord({
- storeName: _storeNames.preferences.name,
- dir: 'right',
- record: value
- })) || null
-}
-
-/**
- * Set the value for specified key
- *
- * @param {string} key
- * @param {*} value
- * @private
- */
-function _set (key, value) {
- if (!value) {
- localStorage.removeItem(`${_storageName}.${key}`)
- } else {
- localStorage.setItem(`${_storageName}.${key}`, JSON.stringify(
- value instanceof Array
- ? value
- : convertRecord({
- storeName: _storeNames.preferences.name,
- dir: 'left',
- record: value
- })
- ))
- }
-}
-
-/**
- * Clear all data related to the sdk
- */
-function clear () {
- entries(_storeNames)
- .forEach(([, store]) => {
- if (!store.permanent) {
- localStorage.removeItem(`${_storageName}.${store.name}`)
- }
- })
-}
-
-const QuickStorage = {
- storeNames: _storeNames,
- stores: {},
- clear
-}
-
-entries(_storeNames)
- .forEach(([, store]) => {
- Object.defineProperty(QuickStorage.stores, store.name, {
- get () { return _get(store.name) },
- set (value) { _set(store.name, value) }
- })
- })
-
-Object.freeze(QuickStorage.stores)
-
-export default QuickStorage
diff --git a/src/sdk/storage/quick-storage.ts b/src/sdk/storage/quick-storage.ts
new file mode 100644
index 0000000..108baf3
--- /dev/null
+++ b/src/sdk/storage/quick-storage.ts
@@ -0,0 +1,123 @@
+import { convertRecord, Direction } from './converter'
+import { values } from '../utilities'
+import Globals from '../globals'
+import SchemeMap from './scheme-map'
+import { ShortStoreName } from './scheme'
+
+interface Store {
+ get: () => T | T[]
+ set: (value: T[]) => void
+}
+
+type StoresMap = { [key in ShortStoreName]: Store }
+
+class QuickStorage {
+ private defaultName = Globals.namespace
+
+ private storageName = this.defaultName
+
+ private storeNames = SchemeMap.storeNames.left
+
+ private storesMap: StoresMap
+
+ /**
+ * Get the value for specified key
+ */
+ private read(key: string) {
+ const raw = localStorage.getItem(`${this.storageName}.${key}`)
+ const value = JSON.parse(raw || 'null')
+ return (value instanceof Array
+ ? value
+ : convertRecord({
+ storeName: this.storeNames.preferences.name,
+ dir: Direction.right,
+ record: value
+ })) || null
+ }
+
+ /**
+ * Set the value for specified key
+ */
+ private write(key: string, value: any) {
+ if (!value) {
+ localStorage.removeItem(`${this.storageName}.${key}`)
+ } else {
+ localStorage.setItem(`${this.storageName}.${key}`, JSON.stringify(
+ value instanceof Array
+ ? value
+ : convertRecord({
+ storeName: this.storeNames.preferences.name,
+ dir: Direction.left,
+ record: value
+ })
+ ))
+ }
+ }
+
+ /**
+ * Clear all data related to the sdk
+ */
+ clear() {
+ this.deleteData()
+ }
+
+ /**
+ * Clear all data related to the sdk
+ *
+ * @param wipe if true then also remove permanent data such as user's preferences
+ */
+ private deleteData(wipe = false) {
+ values(this.storeNames)
+ .forEach((store) => {
+ if (wipe || !store.permanent) {
+ localStorage.removeItem(`${this.storageName}.${store.name}`)
+ }
+ })
+ }
+
+ constructor() {
+ this.storesMap = {} as StoresMap
+
+ const read = this.read.bind(this)
+ const write = this.write.bind(this)
+
+ values(this.storeNames)
+ .forEach((store) => {
+ Object.defineProperty(this.storesMap, store.name, {
+ get() { return read(store.name) },
+ set(value) { write(store.name, value) }
+ })
+ })
+
+ Object.freeze(this.storesMap)
+ }
+
+ /**
+ * Sets custom name to use in data keys and updates existing keys in localStorage
+ */
+ setCustomName(customName?: string) {
+ if (!customName || !customName.length) {
+ return
+ }
+
+ const newName = `${Globals.namespace}-${customName}`
+
+ // Clone data
+ values(this.storeNames)
+ .forEach((store) => {
+ const key = store.name
+ const rawData = localStorage.getItem(`${this.storageName}.${key}`) // Get data from the store, no need to encode it
+ if (rawData) {
+ localStorage.setItem(`${newName}.${key}`, rawData) // Put data into a new store
+ }
+ })
+
+ this.deleteData(true)
+
+ this.storageName = newName
+ }
+
+ get stores() { return this.storesMap }
+}
+
+export default new QuickStorage()
diff --git a/src/sdk/storage/scheme-map.js b/src/sdk/storage/scheme-map.ts
similarity index 80%
rename from src/sdk/storage/scheme-map.js
rename to src/sdk/storage/scheme-map.ts
index 9c621c8..5729aa2 100644
--- a/src/sdk/storage/scheme-map.js
+++ b/src/sdk/storage/scheme-map.ts
@@ -1,4 +1,4 @@
-import {reducer, entries} from '../utilities'
+import { reducer, entries } from '../utilities'
import Scheme from './scheme'
/**
@@ -8,7 +8,7 @@ import Scheme from './scheme'
* @returns {*}
* @private
*/
-function _parseValue (value) {
+function _parseValue(value) {
try {
return JSON.parse(value)
} catch (e) {
@@ -23,7 +23,7 @@ function _parseValue (value) {
* @returns {Object}
* @private
*/
-function _flipObject (obj) {
+function _flipObject(obj) {
return entries(obj)
.map(([key, value]) => [value, _parseValue(key)])
.reduce(reducer, {})
@@ -37,7 +37,7 @@ function _flipObject (obj) {
* @returns {Object}
* @private
*/
-function _flipStoreNames (obj) {
+function _flipStoreNames(obj) {
return entries(obj)
.map(([name, options]) => [options.name, {
name,
@@ -55,12 +55,12 @@ function _flipStoreNames (obj) {
* @returns {Object}
* @private
*/
-function _flipStoreScheme (storeName, key, scheme) {
- const values = scheme.values ? {values: _flipObject(scheme.values)} : {}
- const keys = scheme.keys ? {keys: _flipScheme(storeName, scheme.keys)} : {}
- const composite = scheme.composite ? {composite: scheme.composite.map(key => _getShortKey(storeName, key))} : {}
+function _flipStoreScheme(storeName, key, scheme) {
+ const values = scheme.values ? { values: _flipObject(scheme.values) } : {}
+ const keys = scheme.keys ? { keys: _flipScheme(storeName, scheme.keys) } : {}
+ const composite = scheme.composite ? { composite: scheme.composite.map(key => _getShortKey(storeName, key)) } : {}
- return {key, ...values, ...keys, ...composite}
+ return { key, ...values, ...keys, ...composite }
}
/**
@@ -71,7 +71,7 @@ function _flipStoreScheme (storeName, key, scheme) {
* @returns {Object}
* @private
*/
-function _flipScheme (storeName, fieldsScheme) {
+function _flipScheme(storeName, fieldsScheme) {
return entries(fieldsScheme)
.map(([key, scheme]) => scheme.key
? [scheme.key, _flipStoreScheme(storeName, key, scheme)]
@@ -85,7 +85,7 @@ function _flipScheme (storeName, fieldsScheme) {
* @returns {Object}
* @private
*/
-function _prepareLeft () {
+function _prepareLeft() {
return entries(Scheme)
.map(([storeName, store]) => [
storeName,
@@ -105,7 +105,7 @@ function _prepareLeft () {
* @returns {Object}
* @private
*/
-function _prepareRight () {
+function _prepareRight() {
return entries(Left)
.map(([storeName, storeScheme]) => [
storeName,
@@ -125,7 +125,7 @@ function _prepareRight () {
* @returns {Object}
* @private
*/
-function _getValuesMap () {
+function _getValuesMap() {
return entries(Scheme)
.reduce((acc, [, store]) => acc.concat(store.scheme.fields), [])
.map(scheme => entries(scheme)
@@ -144,7 +144,7 @@ function _getValuesMap () {
* @returns {string}
* @private
*/
-function _getShortKey (storeName, key) {
+function _getShortKey(storeName, key) {
const map = Scheme[storeName].scheme.fields[key]
return map ? (map.key || map) : key
}
@@ -155,7 +155,7 @@ function _getShortKey (storeName, key) {
* @returns {Object}
* @private
*/
-function _getStoreNames () {
+function _getStoreNames(): {[shortName: string]: {name: string; permanent: boolean}} {
return entries(Scheme)
.map(([storeName, scheme]) => [storeName, {
name: scheme.name,
diff --git a/src/sdk/storage/scheme.js b/src/sdk/storage/scheme.ts
similarity index 68%
rename from src/sdk/storage/scheme.js
rename to src/sdk/storage/scheme.ts
index 55a8796..f1470ff 100644
--- a/src/sdk/storage/scheme.js
+++ b/src/sdk/storage/scheme.ts
@@ -1,7 +1,47 @@
-import {REASON_GDPR, REASON_GENERAL} from '../constants'
+import { REASON_GDPR, REASON_GENERAL } from '../constants'
+
+type StoreFieldScheme = string // Just a short name for the field
+ | { // Field with predefined values
+ key: string; // Short name of the field
+ values: { [key: string]: number | string }; // Map of possible values
+ }
+ | { // Field containing a nested one
+ key: string; // Short name of the field
+ keys: { [key: string]: StoreFieldScheme } // Field scheme
+ }
+ | { // Composite key, stored as a field because of IE doesn't support composite keys feature
+ key: string; // Short name of the composite key
+ composite: Array // Names (not short) of fields used to generate a key
+ }
+
+interface StoreKeyOptions {
+ keyPath?: string;
+ autoIncrement?: boolean;
+}
+
+interface StoreScheme extends StoreKeyOptions {
+ index?: string | Array;
+ fields: { [key: string]: StoreFieldScheme };
+}
+
+interface Store {
+ name: string;
+ scheme: StoreScheme;
+ permanent?: boolean;
+}
+
+interface Scheme {
+ queue: Store;
+ activityState: Store;
+ globalParams: Store;
+ eventDeduplication: Store;
+ preferences: Store;
+}
+
+type ShortStoreName = 'q' | 'as' | 'gp' | 'ed' | 'p'
const _queueName = 'q'
-const _queueScheme = {
+const _queueScheme: StoreScheme = {
keyPath: 'timestamp',
autoIncrement: false,
fields: {
@@ -45,7 +85,7 @@ const _queueScheme = {
}
const _activityStateName = 'as'
-const _activityStateScheme = {
+const _activityStateScheme: StoreScheme = {
keyPath: 'uuid',
autoIncrement: false,
fields: {
@@ -92,7 +132,7 @@ const _activityStateScheme = {
}
const _globalParamsName = 'gp'
-const _globalParamsScheme = {
+const _globalParamsScheme: StoreScheme = {
keyPath: 'keyType',
autoIncrement: false,
index: 'type',
@@ -114,7 +154,7 @@ const _globalParamsScheme = {
}
const _eventDeduplicationName = 'ed'
-const _eventDeduplicationScheme = {
+const _eventDeduplicationScheme: StoreScheme = {
keyPath: 'internalId',
autoIncrement: true,
fields: {
@@ -124,7 +164,7 @@ const _eventDeduplicationScheme = {
}
const _preferencesName = 'p'
-const _preferencesScheme = {
+const _preferencesScheme: StoreScheme = {
fields: {
thirdPartySharingDisabled: {
key: 'td',
@@ -166,7 +206,7 @@ const _preferencesScheme = {
}
}
-export default {
+const scheme: Scheme = {
queue: {
name: _queueName,
scheme: _queueScheme
@@ -189,3 +229,7 @@ export default {
permanent: true
}
}
+
+export { ShortStoreName }
+
+export default scheme
diff --git a/src/sdk/storage/storage.js b/src/sdk/storage/storage.js
deleted file mode 100644
index b79c8cf..0000000
--- a/src/sdk/storage/storage.js
+++ /dev/null
@@ -1,259 +0,0 @@
-import * as IndexedDB from './indexeddb'
-import * as LocalStorage from './localstorage'
-import Logger from '../logger'
-import {reducer, entries} from '../utilities'
-import {convertRecord, convertRecords, convertValues, encodeValue, convertStoreName, decodeErrorMessage} from './converter'
-
-/**
- * Methods to extend
- *
- * @type {Object}
- * @private
- */
-const _methods = {
- getAll: _getAll,
- getFirst: _getFirst,
- getItem: _getItem,
- filterBy: _filterBy,
- addItem: _addItem,
- addBulk: _addBulk,
- updateItem: _updateItem,
- deleteItem: _deleteItem,
- deleteBulk: _deleteBulk,
- trimItems: _trimItems,
- count: _count,
- clear: _clear
-}
-
-/**
- * Extends storage's getAll method by decoding returned records
- *
- * @param {Object} storage
- * @param {string} storeName
- * @returns {Promise}
- * @private
- */
-function _getAll (storage, storeName) {
- return storage.getAll(storeName)
- .then(records => convertRecords({storeName, dir: 'right', records}))
-}
-
-/**
- * Extends storage's getFirst method by decoding returned record
- *
- * @param {Object} storage
- * @param {string} storeName
- * @returns {Promise}
- * @private
- */
-function _getFirst (storage, storeName) {
- return storage.getFirst(storeName)
- .then(record => convertRecord({storeName, dir: 'right', record}))
-}
-
-/**
- * Extends storage's getItem method by encoding target value and then decoding returned record
- *
- * @param {Object} storage
- * @param {string} storeName
- * @param {string|string[]} target
- * @returns {Promise}
- * @private
- */
-function _getItem (storage, storeName, target) {
- return storage.getItem(storeName, convertValues({storeName, dir: 'left', target}))
- .then(record => convertRecord({storeName, dir: 'right', record}))
- .catch(error => Promise.reject(decodeErrorMessage({storeName, error})))
-}
-
-/**
- * Extends storage's filterBy method by encoding target value and then decoding returned records
- *
- * @param {Object} storage
- * @param {string} storeName
- * @param {string} target
- * @returns {Promise}
- * @private
- */
-function _filterBy (storage, storeName, target) {
- return storage.filterBy(storeName, encodeValue(target))
- .then(records => convertRecords({storeName, dir: 'right', records}))
-}
-
-/**
- * Extends storage's addItem method by encoding target record and then decoding returned keys
- *
- * @param {Object} storage
- * @param {string} storeName
- * @param {Object} record
- * @returns {Promise}
- * @private
- */
-function _addItem (storage, storeName, record) {
- return storage.addItem(storeName, convertRecord({storeName, dir: 'left', record}))
- .then(target => convertValues({storeName, dir: 'right', target}))
- .catch(error => Promise.reject(decodeErrorMessage({storeName, error})))
-}
-
-/**
- * Extends storage's addBulk method by encoding target records and then decoding returned keys
- *
- * @param {Object} storage
- * @param {string} storeName
- * @param {Object[]} records
- * @param {boolean} overwrite
- * @returns {Promise}
- * @private
- */
-function _addBulk (storage, storeName, records, overwrite) {
- return storage.addBulk(storeName, convertRecords({storeName, dir: 'left', records}), overwrite)
- .then(values => values.map(target => convertValues({storeName, dir: 'right', target})))
- .catch(error => Promise.reject(decodeErrorMessage({storeName, error})))
-}
-
-/**
- * Extends storage's updateItem method by encoding target record and then decoding returned keys
- *
- * @param {Object} storage
- * @param {string} storeName
- * @param record
- * @returns {Promise}
- * @private
- */
-function _updateItem (storage, storeName, record) {
- return storage.updateItem(storeName, convertRecord({storeName, dir: 'left', record}))
- .then(target => convertValues({storeName, dir: 'right', target}))
-}
-
-/**
- * Extends storage's deleteItem method by encoding target value and then decoding returned keys
- *
- * @param {Object} storage
- * @param {string} storeName
- * @param {string|string[]} target
- * @returns {Promise}
- * @private
- */
-function _deleteItem (storage, storeName, target) {
- return storage.deleteItem(storeName, convertValues({storeName, dir: 'left', target}))
- .then(target => convertValues({storeName, dir: 'right', target}))
-}
-
-/**
- * Extends storage's deleteBulk method by encoding target value and then decoding returned records that are deleted
- *
- * @param {Object} storage
- * @param {string} storeName
- * @param {string} target
- * @param {string?} condition
- * @returns {Promise}
- * @private
- */
-function _deleteBulk (storage, storeName, target, condition) {
- return storage.deleteBulk(storeName, encodeValue(target), condition)
- .then(records => records.map(record => convertValues({storeName, dir: 'right', target: record})))
-}
-
-/**
- * Extends storage's trimItems method by passing encoded storage name
- *
- * @param {Object} storage
- * @param {string} storeName
- * @param {number} length
- * @returns {Promise}
- * @private
- */
-function _trimItems (storage, storeName, length) {
- return storage.trimItems(storeName, length)
-}
-
-/**
- * Extends storage's count method by passing encoded storage name
- *
- * @param {Object} storage
- * @param {string} storeName
- * @returns {Promise}
- * @private
- */
-function _count (storage, storeName) {
- return storage.count(storeName)
-}
-
-/**
- * Extends storage's clear method by passing encoded storage name
- *
- * @param {Object} storage
- * @param {string} storeName
- * @returns {Promise}
- * @private
- */
-function _clear (storage, storeName) {
- return storage.clear(storeName)
-}
-
-/**
- * Augment whitelisted methods with encoding/decoding functionality
- *
- * @param {Object} storage
- * @returns {Object}
- * @private
- */
-function _augment (storage) {
- return entries(_methods)
- .map(([methodName, method]) => {
- return [methodName, (storeName, ...args) => {
- return method.call(null, storage, convertStoreName({storeName, dir: 'left'}), ...args)
- }]
- })
- .reduce(reducer, {})
-}
-
-/**
- * Check which storage is available and pick it up
- * Prefer indexedDB over localStorage
- *
- * @returns {{
- * isSupported,
- * getAll,
- * getFirst,
- * getItem,
- * filterBy,
- * addItem,
- * addBulk,
- * updateItem,
- * deleteItem,
- * deleteBulk,
- * trimItems,
- * count,
- * clear,
- * destroy
- * }|null}
- */
-function init () {
- let storage
- let type
-
- if (IndexedDB.isSupported()) {
- storage = IndexedDB
- type = 'indexedDB'
- } else if (LocalStorage.isSupported()) {
- storage = LocalStorage
- type = 'localStorage'
- }
-
- if (type) {
- return {
- type,
- isSupported: storage.isSupported,
- destroy: storage.destroy,
- ..._augment(storage)
- }
- }
-
- Logger.error('There is no storage available, app will run with minimum set of features')
- return null
-
-}
-
-export default init()
-
diff --git a/src/sdk/storage/storage.ts b/src/sdk/storage/storage.ts
new file mode 100644
index 0000000..80aa501
--- /dev/null
+++ b/src/sdk/storage/storage.ts
@@ -0,0 +1,323 @@
+import { IStorage } from './types'
+import { IndexedDB } from './indexeddb'
+import { LocalStorage } from './localstorage'
+import QuickStorage from './quick-storage'
+import Logger from '../logger'
+import { reducer, entries } from '../utilities'
+import {
+ Direction,
+ convertRecord,
+ convertRecords,
+ convertValues,
+ encodeValue,
+ convertStoreName,
+ decodeErrorMessage
+} from './converter'
+import { STORAGE_TYPES } from '../constants'
+
+enum StorageType {
+ noStorage = STORAGE_TYPES.NO_STORAGE,
+ indexedDB = STORAGE_TYPES.INDEXED_DB,
+ localStorage = STORAGE_TYPES.LOCAL_STORAGE
+}
+
+type Storage = {
+ type: StorageType;
+ storage: Nullable;
+}
+
+/**
+ * Methods to extend
+ *
+ * @type {Object}
+ * @private
+ */
+const _methods = {
+ getAll: _getAll,
+ getFirst: _getFirst,
+ getItem: _getItem,
+ filterBy: _filterBy,
+ addItem: _addItem,
+ addBulk: _addBulk,
+ updateItem: _updateItem,
+ deleteItem: _deleteItem,
+ deleteBulk: _deleteBulk,
+ trimItems: _trimItems,
+ count: _count,
+ clear: _clear,
+ destroy: _destroy,
+ deleteDatabase: _deleteDatabase
+}
+
+/**
+ * Extends storage's getAll method by decoding returned records
+ *
+ * @param {Object} storage
+ * @param {string} storeName
+ * @returns {Promise}
+ * @private
+ */
+function _getAll(storage, storeName) {
+ return storage.getAll(storeName)
+ .then(records => convertRecords({ storeName, dir: Direction.right, records }))
+}
+
+/**
+ * Extends storage's getFirst method by decoding returned record
+ *
+ * @param {Object} storage
+ * @param {string} storeName
+ * @returns {Promise}
+ * @private
+ */
+function _getFirst(storage, storeName) {
+ return storage.getFirst(storeName)
+ .then(record => convertRecord({ storeName, dir: Direction.right, record }))
+}
+
+/**
+ * Extends storage's getItem method by encoding target value and then decoding returned record
+ *
+ * @param {Object} storage
+ * @param {string} storeName
+ * @param {string|string[]} target
+ * @returns {Promise}
+ * @private
+ */
+function _getItem(storage, storeName, target) {
+ return storage.getItem(storeName, convertValues({ storeName, dir: Direction.left, target }))
+ .then(record => convertRecord({ storeName, dir: Direction.right, record }))
+ .catch(error => Promise.reject(decodeErrorMessage({ storeName, error })))
+}
+
+/**
+ * Extends storage's filterBy method by encoding target value and then decoding returned records
+ *
+ * @param {Object} storage
+ * @param {string} storeName
+ * @param {string} target
+ * @returns {Promise}
+ * @private
+ */
+function _filterBy(storage, storeName, target) {
+ return storage.filterBy(storeName, encodeValue(target))
+ .then(records => convertRecords({ storeName, dir: Direction.right, records }))
+}
+
+/**
+ * Extends storage's addItem method by encoding target record and then decoding returned keys
+ *
+ * @param {Object} storage
+ * @param {string} storeName
+ * @param {Object} record
+ * @returns {Promise}
+ * @private
+ */
+function _addItem(storage, storeName, record) {
+ return storage.addItem(storeName, convertRecord({ storeName, dir: Direction.left, record }))
+ .then(target => convertValues({ storeName, dir: Direction.right, target }))
+ .catch(error => Promise.reject(decodeErrorMessage({ storeName, error })))
+}
+
+/**
+ * Extends storage's addBulk method by encoding target records and then decoding returned keys
+ *
+ * @param {Object} storage
+ * @param {string} storeName
+ * @param {Object[]} records
+ * @param {boolean} overwrite
+ * @returns {Promise}
+ * @private
+ */
+function _addBulk(storage, storeName, records, overwrite) {
+ return storage.addBulk(storeName, convertRecords({ storeName, dir: Direction.left, records }), overwrite)
+ .then(values => values.map(target => convertValues({ storeName, dir: Direction.right, target })))
+ .catch(error => Promise.reject(decodeErrorMessage({ storeName, error })))
+}
+
+/**
+ * Extends storage's updateItem method by encoding target record and then decoding returned keys
+ *
+ * @param {Object} storage
+ * @param {string} storeName
+ * @param record
+ * @returns {Promise}
+ * @private
+ */
+function _updateItem(storage, storeName, record) {
+ return storage.updateItem(storeName, convertRecord({ storeName, dir: Direction.left, record }))
+ .then(target => convertValues({ storeName, dir: Direction.right, target }))
+}
+
+/**
+ * Extends storage's deleteItem method by encoding target value and then decoding returned keys
+ *
+ * @param {Object} storage
+ * @param {string} storeName
+ * @param {string|string[]} target
+ * @returns {Promise}
+ * @private
+ */
+function _deleteItem(storage, storeName, target) {
+ return storage.deleteItem(storeName, convertValues({ storeName, dir: Direction.left, target }))
+ .then(target => convertValues({ storeName, dir: Direction.right, target }))
+}
+
+/**
+ * Extends storage's deleteBulk method by encoding target value and then decoding returned records that are deleted
+ *
+ * @param {Object} storage
+ * @param {string} storeName
+ * @param {string} target
+ * @param {string?} condition
+ * @returns {Promise}
+ * @private
+ */
+function _deleteBulk(storage, storeName, target, condition) {
+ return storage.deleteBulk(storeName, encodeValue(target), condition)
+ .then(records => records.map(record => convertValues({ storeName, dir: Direction.right, target: record })))
+}
+
+/**
+ * Extends storage's trimItems method by passing encoded storage name
+ *
+ * @param {Object} storage
+ * @param {string} storeName
+ * @param {number} length
+ * @returns {Promise}
+ * @private
+ */
+function _trimItems(storage, storeName, length) {
+ return storage.trimItems(storeName, length)
+}
+
+/**
+ * Extends storage's count method by passing encoded storage name
+ *
+ * @param {Object} storage
+ * @param {string} storeName
+ * @returns {Promise}
+ * @private
+ */
+function _count(storage, storeName) {
+ return storage.count(storeName)
+}
+
+/**
+ * Extends storage's clear method by passing encoded storage name
+ *
+ * @param {Object} storage
+ * @param {string} storeName
+ * @returns {Promise}
+ * @private
+ */
+function _clear(storage, storeName) {
+ return storage.clear(storeName)
+}
+
+/**
+ * Calls storage's destroy method
+ *
+ * @param {Object} storage
+ * @private
+ */
+function _destroy(storage) {
+ return storage.destroy()
+}
+
+/**
+ * Calls storage's deleteDatabase method
+ *
+ * @param {Object} storage
+ * @private
+ */
+function _deleteDatabase(storage) {
+ return storage.deleteDatabase()
+}
+
+/**
+ * Augment whitelisted methods with encoding/decoding functionality
+ *
+ * @param {Object} storage
+ * @returns {Object}
+ * @private
+ */
+function _augment() {
+
+ return entries(_methods)
+ .map(([methodName, method]) => {
+ return [methodName, (storeName, ...args) => {
+ return init()
+ .then(({ storage }) => {
+ if (storage) {
+ return method.call(null, storage, convertStoreName({ storeName, dir: Direction.left }), ...args)
+ }
+ })
+ }]
+ })
+ .reduce(reducer, {})
+}
+
+/**
+ * Type of available storage
+ */
+let type: StorageType
+
+/**
+ * Returns type of used storage which is one of possible values INDEXED_DB, LOCAL_STORAGE or NO_STORAGE if there is no
+ * storage available
+ */
+function getType(): StorageType {
+ return type
+}
+
+/**
+ * Cached promise of Storage initialization
+ */
+let _initializationPromise: Nullable> = null
+
+/**
+ * Check which storage is available and pick it up
+ * Prefer indexedDB over localStorage
+ */
+function init(dbName?: string): Promise {
+ let storage: Nullable = null
+
+ if (_initializationPromise !== null) {
+ return _initializationPromise
+ } else {
+ _initializationPromise = Promise.all([IndexedDB.isSupported(), LocalStorage.isSupported()])
+ .then(([idbSupported, lsSupported]) => {
+ QuickStorage.setCustomName(dbName)
+
+ if (idbSupported) {
+ type = StorageType.indexedDB
+ const idb = new IndexedDB()
+ return idb.setCustomName(dbName).then(() => storage = idb)
+ } else if (lsSupported) {
+ type = StorageType.localStorage
+ storage = new LocalStorage()
+ return Promise.resolve(storage)
+ } else {
+ Logger.error('There is no storage available, app will run with minimum set of features')
+ type = StorageType.noStorage
+ storage = null
+ return Promise.resolve(storage)
+ }
+ })
+ .then(() => {
+ return {
+ type,
+ storage
+ }
+ })
+ }
+
+ return _initializationPromise
+}
+
+export default {
+ init,
+ getType,
+ ..._augment()
+}
diff --git a/src/sdk/storage/types.ts b/src/sdk/storage/types.ts
new file mode 100644
index 0000000..df1d2c4
--- /dev/null
+++ b/src/sdk/storage/types.ts
@@ -0,0 +1,24 @@
+interface IStorage {
+ getAll: (storeName: string, firstOnly: boolean) => Promise>;
+ getFirst: (storeName: string) => Promise;
+ getItem: (storeName: string, target: any) => Promise;
+ filterBy: (storeName: string, by: string) => Promise;
+ addItem: (storeName: string, target) => Promise;
+ addBulk: (storeName: string, target, overwrite: boolean) => Promise;
+ updateItem: (storeName: string, target) => Promise;
+ deleteItem: (storeName: string, target) => Promise;
+ deleteBulk: (storeName: string, value: any, condition?: 'lowerBound' | 'upperBound') => Promise;
+ trimItems: (storeName: string, length: number) => Promise;
+ count: (storeName: string) => Promise;
+ clear: (storeName: string) => void;
+ destroy: () => void;
+}
+
+type Error = {
+ name: string;
+ message: string;
+}
+
+export {
+ IStorage, Error
+}
diff --git a/src/sdk/types.js b/src/sdk/types.js
index 52286af..5c4165b 100644
--- a/src/sdk/types.js
+++ b/src/sdk/types.js
@@ -160,8 +160,10 @@ export type BaseParamsT = $ReadOnly<$Shape<{
}>>
export type CustomConfigT = $ReadOnly<$Shape<{
+ urlStrategy: 'india' | 'china',
customUrl: string,
- eventDeduplicationListLimit: number
+ eventDeduplicationListLimit: number,
+ namespace: string
}>>
export type LogOptionsT = $ReadOnly<$Shape<{|
@@ -174,8 +176,10 @@ export type InitOptionsT = $ReadOnly<$Shape<{|
environment: $PropertyType,
defaultTracker: $PropertyType,
externalDeviceId: $PropertyType,
+ urlStrategy: $PropertyType,
customUrl: $PropertyType,
eventDeduplicationListLimit: $PropertyType,
+ namespace: $PropertyType,
attributionCallback: (string, Object) => mixed
|}>>
diff --git a/src/sdk/url-strategy.ts b/src/sdk/url-strategy.ts
new file mode 100644
index 0000000..7f5cba8
--- /dev/null
+++ b/src/sdk/url-strategy.ts
@@ -0,0 +1,100 @@
+import Config from './config'
+import Logger from './logger'
+
+enum UrlStrategy {
+ Default = 'default',
+ India = 'india',
+ China = 'china'
+}
+
+type EndpointName = UrlStrategy
+
+type BaseUrlsMap = {
+ app: string;
+ gdpr: string;
+}
+
+/**
+ * Returns a map of base URLs or a list of endpoint names depending on SDK configuration
+ */
+function getEndpointPreference(): BaseUrlsMap | EndpointName[] {
+ const { customUrl, urlStrategy } = Config.getCustomConfig()
+
+ if (customUrl) { // If custom URL is set then send all requests there
+ return { app: customUrl, gdpr: customUrl }
+ }
+
+ if (urlStrategy === UrlStrategy.India) {
+ return [UrlStrategy.India, UrlStrategy.Default]
+ }
+
+ if (urlStrategy === UrlStrategy.China) {
+ return [UrlStrategy.China, UrlStrategy.Default]
+ }
+
+ return [UrlStrategy.Default, UrlStrategy.India, UrlStrategy.China]
+}
+
+const endpointMap: Record = {
+ [UrlStrategy.Default]: {
+ app: 'https://app.adjust.com',
+ gdpr: 'https://gdpr.adjust.com'
+ },
+ [UrlStrategy.India]: {
+ app: 'https://app.adjust.net.in',
+ gdpr: 'https://gdpr.adjust.net.in'
+ },
+ [UrlStrategy.China]: {
+ app: 'https://app.adjust.world',
+ gdpr: 'https://gdpr.adjust.world'
+ }
+}
+
+const endpointNiceNames: Record = {
+ [UrlStrategy.Default]: 'default',
+ [UrlStrategy.India]: 'Indian',
+ [UrlStrategy.China]: 'Chinese'
+}
+
+/**
+ * Gets the list of preferred endpoints and wraps `sendRequest` function with iterative retries until available
+ * endpoint found or another error occurred.
+ */
+function urlStrategyRetries(
+ sendRequest: (urls: BaseUrlsMap) => Promise,
+ endpoints: Record = endpointMap
+): Promise {
+ const preferredUrls = getEndpointPreference()
+
+ if (!Array.isArray(preferredUrls)) {
+ // There is only one endpoint
+ return sendRequest(preferredUrls)
+ } else {
+ let attempt = 0
+
+ const trySendRequest: () => Promise = () => {
+ const endpointKey = preferredUrls[attempt++]
+ const urlsMap = endpoints[endpointKey]
+
+ return sendRequest(urlsMap)
+ .catch((reason) => {
+ if (reason.code === 'NO_CONNECTION') {
+ Logger.log(`Failed to connect ${endpointNiceNames[endpointKey]} endpoint`)
+
+ if (attempt < preferredUrls.length) {
+ Logger.log(`Trying ${endpointNiceNames[preferredUrls[attempt]]} one`)
+
+ return trySendRequest() // Trying next endpoint
+ }
+ }
+
+ // Another error occurred or we ran out of attempts, re-throw
+ throw reason
+ })
+ }
+
+ return trySendRequest()
+ }
+}
+
+export { urlStrategyRetries, UrlStrategy, BaseUrlsMap }
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..dd9875d
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,70 @@
+{
+ "compilerOptions": {
+ /* Visit https://aka.ms/tsconfig.json to read more about this file */
+
+ /* Basic Options */
+ // "incremental": true, /* Enable incremental compilation */
+ "target": "ES2015", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */
+ "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */
+ // "lib": [], /* Specify library files to be included in the compilation. */
+ // "allowJs": true, /* Allow javascript files to be compiled. */
+ // "checkJs": true, /* Report errors in .js files. */
+ // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
+ // "declaration": true, /* Generates corresponding '.d.ts' file. */
+ // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
+ "sourceMap": true, /* Generates corresponding '.map' file. */
+ // "outFile": "./", /* Concatenate and emit output to single file. */
+ // "outDir": "./", /* Redirect output structure to the directory. */
+ // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
+ // "composite": true, /* Enable project compilation */
+ // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */
+ // "removeComments": true, /* Do not emit comments to output. */
+ // "noEmit": true, /* Do not emit outputs. */
+ // "importHelpers": true, /* Import emit helpers from 'tslib'. */
+ // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
+ // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
+
+ /* Strict Type-Checking Options */
+ // "strict": true, /* Enable all strict type-checking options. */
+ // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
+ "strictNullChecks": true, /* Enable strict null checks. */
+ // "strictFunctionTypes": true, /* Enable strict checking of function types. */
+ // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
+ // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */
+ // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
+ // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
+
+ /* Additional Checks */
+ // "noUnusedLocals": true, /* Report errors on unused locals. */
+ // "noUnusedParameters": true, /* Report errors on unused parameters. */
+ "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
+ // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
+ // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */
+
+ /* Module Resolution Options */
+ // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
+ // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
+ // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
+ // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
+ // "typeRoots": [], /* List of folders to include type definitions from. */
+ // "types": [], /* Type declaration files to be included in compilation. */
+ // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
+ "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
+ // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
+ // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
+
+ /* Source Map Options */
+ // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
+ // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
+ // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
+ // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
+
+ /* Experimental Options */
+ // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
+ // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
+
+ /* Advanced Options */
+ "skipLibCheck": true, /* Skip type checking of declaration files. */
+ "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */
+ }
+}
diff --git a/webpack.demo.config.js b/webpack.demo.config.js
index 5c1a721..d138cd5 100644
--- a/webpack.demo.config.js
+++ b/webpack.demo.config.js
@@ -4,6 +4,7 @@ const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const TerserPlugin = require('terser-webpack-plugin')
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin')
const FlowWebpackPlugin = require('flow-webpack-plugin')
+const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin');
const webpack = require('webpack')
const packageJson = require('./package.json')
const namespace = 'adjust-sdk'
@@ -36,7 +37,8 @@ module.exports = () => ({
__ADJUST__NAMESPACE: JSON.stringify(namespace),
__ADJUST__SDK_VERSION: JSON.stringify(version)
}),
- new FlowWebpackPlugin()
+ new FlowWebpackPlugin(),
+ new ForkTsCheckerWebpackPlugin()
],
resolve: {
extensions: ['.ts', '.js', '.json']