From 7709925efc513277d593b0d7667d8443049cbce7 Mon Sep 17 00:00:00 2001 From: adrianmroz <78143552+adrianmroz-allegro@users.noreply.github.com> Date: Wed, 14 Apr 2021 12:34:36 +0200 Subject: [PATCH 001/264] Add Oauth support on the client: (#727) * AppSettings are inlined as previously without data soruces and clusters. * AppSettingsProvider is used to fetch sources and clusters * Ajax module sends token and handles 401/403 if oauth is configured * TurniloApplication handles rethrown Authorization errors * CodeHandler and OauthMessage views are added to handle messaging and returned code from oauth provider * Specific views handle "no data" condition --- package-lock.json | 15924 +++++++++++++++- package.json | 5 + .../app-settings-provider.tsx | 93 + .../turnilo-application.tsx | 250 +- .../applications/turnilo-application/view.ts | 77 + .../message-panel/message-panel.scss} | 10 +- .../message-panel/message-panel.tsx | 42 + .../no-data/data-cube-not-found.tsx | 26 + .../no-data/empty-data-cube-list.scss | 40 + .../no-data/empty-data-cube-list.tsx | 30 + .../components/query-error/query-error.tsx | 6 +- .../components/side-drawer/side-drawer.tsx | 13 +- src/client/main.tsx | 26 +- src/client/oauth/oauth-code-handler.tsx | 81 + src/client/oauth/oauth-message-view.tsx | 31 + src/client/oauth/oauth.ts | 119 + src/client/utils/ajax/ajax.ts | 80 +- .../utils/local-storage/local-storage.ts | 11 +- .../views/cube-view/cube-view.mocha.tsx | 5 +- src/client/views/cube-view/cube-view.tsx | 28 +- .../{error-view.tsx => general-error.tsx} | 24 +- src/client/views/home-view/home-view.tsx | 26 +- .../views/no-data-view/no-data-view.scss | 60 - .../views/no-data-view/no-data-view.tsx | 64 - .../models/app-settings/app-settings.ts | 28 +- src/common/models/oauth/oauth.ts | 54 + src/server/app.ts | 2 + src/server/routes/plywood/plywood.ts | 2 +- src/server/routes/settings/settings.ts | 48 + src/server/routes/turnilo/turnilo.ts | 4 +- src/server/views.ts | 4 +- 31 files changed, 16641 insertions(+), 572 deletions(-) create mode 100644 src/client/applications/turnilo-application/app-settings-provider.tsx create mode 100644 src/client/applications/turnilo-application/view.ts rename src/client/{views/error-view/error-view.scss => components/message-panel/message-panel.scss} (90%) create mode 100644 src/client/components/message-panel/message-panel.tsx create mode 100644 src/client/components/no-data/data-cube-not-found.tsx create mode 100644 src/client/components/no-data/empty-data-cube-list.scss create mode 100644 src/client/components/no-data/empty-data-cube-list.tsx create mode 100644 src/client/oauth/oauth-code-handler.tsx create mode 100644 src/client/oauth/oauth-message-view.tsx create mode 100644 src/client/oauth/oauth.ts rename src/client/views/error-view/{error-view.tsx => general-error.tsx} (67%) delete mode 100644 src/client/views/no-data-view/no-data-view.scss delete mode 100644 src/client/views/no-data-view/no-data-view.tsx create mode 100644 src/common/models/oauth/oauth.ts create mode 100644 src/server/routes/settings/settings.ts diff --git a/package-lock.json b/package-lock.json index 3b2afd468..e0850ce82 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,8 +1,15522 @@ { "name": "turnilo", "version": "1.31.0", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "version": "1.31.0", + "license": "Apache-2.0", + "dependencies": { + "@sentry/browser": "5.0.6", + "@vx/heatmap": "0.0.183", + "@vx/scale": "0.0.182", + "@vx/tooltip": "0.0.184", + "axios": "0.21.1", + "body-parser": "1.18.2", + "chronoshift": "0.9.6", + "compression": "1.7.1", + "core-js": "2.6.0", + "d3": "3.5.17", + "express": "4.16.2", + "file-saver": "1.3.3", + "fs-promise": "2.0.3", + "helmet": "3.21.2", + "immutable": "4.0.0-rc.9", + "immutable-class": "0.9.8", + "js-yaml": "3.13.1", + "lz-string": "1.4.4", + "marked": "0.7.0", + "moment-timezone": "0.5.27", + "node-spawn-server": "1.0.1", + "nopt": "4.0.1", + "numbro": "2.1.0", + "plywood": "0.21.2", + "plywood-base-api": "0.2.8", + "plywood-druid-requester": "2.6.1", + "react": "16.6.3", + "react-copy-to-clipboard": "5.0.1", + "react-dom": "16.6.3", + "react-syntax-highlighter": "7.0.2", + "react-transition-group": "2.2.1", + "request": "2.87.0", + "request-promise-native": "1.0.5" + }, + "bin": { + "turnilo": "bin/turnilo" + }, + "devDependencies": { + "@babel/core": "7.7.2", + "@babel/preset-env": "7.7.1", + "@types/body-parser": "1.16.8", + "@types/chai": "4.2.7", + "@types/chai-datetime": "0.0.33", + "@types/compression": "0.0.35", + "@types/d3": "3.5.40", + "@types/d3-scale": "2.1.1", + "@types/enzyme": "3.1.11", + "@types/express": "4.11.0", + "@types/express-session": "1.15.6", + "@types/file-saver": "1.3.0", + "@types/fs-promise": "1.0.3", + "@types/geojson": "7946.0.0", + "@types/helmet": "0.0.37", + "@types/js-yaml": "3.10.1", + "@types/jsdom": "2.0.28", + "@types/lz-string": "1.3.32", + "@types/marked": "0.4.0", + "@types/mime": "2.0.0", + "@types/mocha": "2.2.46", + "@types/moment-timezone": "0.5.12", + "@types/nock": "9.1.3", + "@types/node": "8.5.2", + "@types/nopt": "3.0.29", + "@types/randomstring": "1.1.6", + "@types/react": "16.7.0", + "@types/react-copy-to-clipboard": "4.3.0", + "@types/react-dom": "16.0.11", + "@types/react-syntax-highlighter": "0.0.5", + "@types/react-transition-group": "2.0.7", + "@types/request-promise-native": "1.0.14", + "@types/rewire": "2.5.28", + "@types/sinon": "4.1.4", + "@types/superagent": "3.5.6", + "@types/supertest": "2.0.4", + "@types/webpack": "4.41.0", + "@types/webpack-env": "1.14.1", + "babel-loader": "8.0.6", + "base64-arraybuffer": "0.2.0", + "chai": "4.2.0", + "chai-datetime": "1.5.0", + "create-react-class": "15.6.2", + "css-loader": "2.1.1", + "css-modules-require-hook": "4.2.3", + "cypress": "3.4.1", + "enzyme": "3.3.0", + "enzyme-adapter-react-16": "1.7.1", + "ignore-styles": "5.0.1", + "immutable-class-tester": "0.5.12", + "jsdom": "9.4.2", + "memoize-one": "5.1.1", + "mime": "2.3.1", + "mocha": "4.1.0", + "nock": "11.0.0", + "node-sass": "4.13.1", + "npm-run-all": "4.1.5", + "querystring": "0.2.0", + "randomstring": "1.1.5", + "react-hot-loader": "3.1.3", + "react-test-renderer": "16.2.0", + "regex-replace-loader": "1.0.0", + "rewire": "2.5.2", + "rimraf": "2.6.2", + "sass-lint": "1.12.1", + "sass-loader": "6.0.6", + "sinon": "4.1.4", + "source-map-loader": "0.2.3", + "start-server-and-test": "1.10.0", + "style-loader": "0.19.1", + "supertest": "3.0.0", + "svg-inline-loader": "0.8.0", + "svg-loader": "0.0.2", + "terser-webpack-plugin": "2.3.1", + "ts-loader": "6.2.1", + "ts-node": "4.1.0", + "tslint": "5.10.0", + "tslint-eslint-rules": "5.3.1", + "tslint-no-focused-test": "0.5.0", + "tslint-react": "3.6.0", + "typescript": "3.3.1", + "webpack": "4.41.5", + "webpack-cli": "3.3.10", + "webpack-dev-middleware": "3.7.2", + "webpack-hot-middleware": "2.25.0", + "webpack-merge": "4.2.2" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.0.0" + } + }, + "node_modules/@babel/core": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.7.2.tgz", + "integrity": "sha512-eeD7VEZKfhK1KUXGiyPFettgF3m513f8FoBSWiQ1xTvl1RAopLs42Wp9+Ze911I6H0N9lNqJMDgoZT7gHsipeQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.7.2", + "@babel/helpers": "^7.7.0", + "@babel/parser": "^7.7.2", + "@babel/template": "^7.7.0", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.7.2", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "json5": "^2.1.0", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "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.7.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.4.tgz", + "integrity": "sha512-m5qo2WgdOJeyYngKImbkyQrnUN1mPceaG5BV+G0E3gWsa4l/jCSryWJdM2x8OuGAOyh+3d5pVYfZWCiNFtynxg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.7.4", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.7.4.tgz", + "integrity": "sha512-2BQmQgECKzYKFPpiycoF9tlb5HA4lrVyAmLLVK177EcQAqjVLciUb2/R+n1boQ9y5ENV3uz2ZqiNw7QMBBw1Og==", + "dev": true, + "dependencies": { + "@babel/types": "^7.7.4" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.7.4.tgz", + "integrity": "sha512-Biq/d/WtvfftWZ9Uf39hbPBYDUo986m5Bb4zhkeYDGUllF43D+nUe5M6Vuo6/8JDK/0YX/uBdeoQpyaNhNugZQ==", + "dev": true, + "dependencies": { + "@babel/helper-explode-assignable-expression": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "node_modules/@babel/helper-call-delegate": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.7.4.tgz", + "integrity": "sha512-8JH9/B7J7tCYJ2PpWVpw9JhPuEVHztagNVuQAFBVFYluRMlpG7F1CgKEgGeL6KFqcsIa92ZYVj6DSc0XwmN1ZA==", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.7.4.tgz", + "integrity": "sha512-Mt+jBKaxL0zfOIWrfQpnfYCN7/rS6GKx6CCCfuoqVVd+17R8zNDlzVYmIi9qyb2wOk002NsmSTDymkIygDUH7A==", + "dev": true, + "dependencies": { + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.6.0" + } + }, + "node_modules/@babel/helper-define-map": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.7.4.tgz", + "integrity": "sha512-v5LorqOa0nVQUvAUTUF3KPastvUt/HzByXNamKQ6RdJRTV7j8rLL+WB5C/MzzWAwOomxDhYFb1wLLxHqox86lg==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.7.4", + "@babel/types": "^7.7.4", + "lodash": "^4.17.13" + } + }, + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.7.4.tgz", + "integrity": "sha512-2/SicuFrNSXsZNBxe5UGdLr+HZg+raWBLE9vC98bdYOKX/U6PY0mdGlYUJdtTDPSU0Lw0PNbKKDpwYHJLn2jLg==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz", + "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "node_modules/@babel/helper-get-function-arity": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz", + "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.7.4" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.7.4.tgz", + "integrity": "sha512-wQC4xyvc1Jo/FnLirL6CEgPgPCa8M74tOdjWpRhQYapz5JC7u3NYU1zCVoVAGCE3EaIP9T1A3iW0WLJ+reZlpQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.7.4" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.7.4.tgz", + "integrity": "sha512-9KcA1X2E3OjXl/ykfMMInBK+uVdfIVakVe7W7Lg3wfXUNyS3Q1HWLFRwZIjhqiCGbslummPDnmb7vIekS0C1vw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.7.4" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.7.4.tgz", + "integrity": "sha512-dGcrX6K9l8258WFjyDLJwuVKxR4XZfU0/vTUgOQYWEnRD8mgr+p4d6fCUMq/ys0h4CCt/S5JhbvtyErjWouAUQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.7.4" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.7.4.tgz", + "integrity": "sha512-ehGBu4mXrhs0FxAqN8tWkzF8GSIGAiEumu4ONZ/hD9M88uHcD+Yu2ttKfOCgwzoesJOJrtQh7trI5YPbRtMmnA==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.7.4", + "@babel/helper-simple-access": "^7.7.4", + "@babel/helper-split-export-declaration": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/types": "^7.7.4", + "lodash": "^4.17.13" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.4.tgz", + "integrity": "sha512-VB7gWZ2fDkSuqW6b1AKXkJWO5NyNI3bFL/kK79/30moK57blr6NbH8xcl2XcKCwOmJosftWunZqfO84IGq3ZZg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.7.4" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz", + "integrity": "sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA==", + "dev": true + }, + "node_modules/@babel/helper-regex": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.5.5.tgz", + "integrity": "sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw==", + "dev": true, + "dependencies": { + "lodash": "^4.17.13" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.7.4.tgz", + "integrity": "sha512-Sk4xmtVdM9sA/jCI80f+KS+Md+ZHIpjuqmYPk1M7F/upHou5e4ReYmExAiu6PVe65BhJPZA2CY9x9k4BqE5klw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.7.4", + "@babel/helper-wrap-function": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.7.4.tgz", + "integrity": "sha512-pP0tfgg9hsZWo5ZboYGuBn/bbYT/hdLPVSS4NMmiRJdwWhP0IznPwN9AE1JwyGsjSPLC364I0Qh5p+EPkGPNpg==", + "dev": true, + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.7.4", + "@babel/helper-optimise-call-expression": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.7.4.tgz", + "integrity": "sha512-zK7THeEXfan7UlWsG2A6CI/L9jVnI5+xxKZOdej39Y0YtDYKx9raHk5F2EtK9K8DHRTihYwg20ADt9S36GR78A==", + "dev": true, + "dependencies": { + "@babel/template": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz", + "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==", + "dev": true, + "dependencies": { + "@babel/types": "^7.7.4" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.7.4.tgz", + "integrity": "sha512-VsfzZt6wmsocOaVU0OokwrIytHND55yvyT4BPB9AIIgwr8+x7617hetdJTsuGwygN5RC6mxA9EJztTjuwm2ofg==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.7.4", + "@babel/template": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "node_modules/@babel/helpers": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.7.4.tgz", + "integrity": "sha512-ak5NGZGJ6LV85Q1Zc9gn2n+ayXOizryhjSUBTdu5ih1tlVCJeuQENzc4ItyCVhINVXvIT/ZQ4mheGIsfBkpskg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.7.4", + "@babel/traverse": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "node_modules/@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "dependencies": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.4.tgz", + "integrity": "sha512-jIwvLO0zCL+O/LmEJQjWA75MQTWwx3c3u2JOTDK5D3/9egrWRRA0/0hk9XXywYnXZVVpzrBYeIQTmhwUaePI9g==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.7.4.tgz", + "integrity": "sha512-1ypyZvGRXriY/QP668+s8sFr2mqinhkRDMPSQLNghCQE+GAkFtp+wkHVvg2+Hdki8gwP+NFzJBJ/N1BfzCCDEw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.7.4", + "@babel/plugin-syntax-async-generators": "^7.7.4" + } + }, + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.7.4.tgz", + "integrity": "sha512-StH+nGAdO6qDB1l8sZ5UBV8AC3F2VW2I8Vfld73TMKyptMU9DY5YsJAS8U81+vEtxcH3Y/La0wG0btDrhpnhjQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^7.7.4" + } + }, + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.7.4.tgz", + "integrity": "sha512-wQvt3akcBTfLU/wYoqm/ws7YOAQKu8EVJEvHip/mzkNtjaclQoCCIqKXFP5/eyfnfbQCDV3OLRIK3mIVyXuZlw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-json-strings": "^7.7.4" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.7.4.tgz", + "integrity": "sha512-rnpnZR3/iWKmiQyJ3LKJpSwLDcX/nSXhdLk4Aq/tXOApIvyu7qoabrige0ylsAJffaUC51WiBu209Q0U+86OWQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.7.4" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.7.4.tgz", + "integrity": "sha512-DyM7U2bnsQerCQ+sejcTNZh8KQEUuC3ufzdnVnSiUv/qoGJp2Z3hanKL18KDhsBT5Wj6a7CMT5mdyCNJsEaA9w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.7.4" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.7.4.tgz", + "integrity": "sha512-cHgqHgYvffluZk85dJ02vloErm3Y6xtH+2noOBOJ2kXOJH3aVCDnj5eR/lVNlTnYu4hndAPJD3rTFjW3qee0PA==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.7.4", + "@babel/helper-plugin-utils": "^7.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.7.4.tgz", + "integrity": "sha512-Li4+EjSpBgxcsmeEF8IFcfV/+yJGxHXDirDkEoyFjumuwbmfCVHUt0HuowD/iGM7OhIRyXJH9YXxqiH6N815+g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.7.4.tgz", + "integrity": "sha512-jHQW0vbRGvwQNgyVxwDh4yuXu4bH1f5/EICJLAhl1SblLs2CDhrsmCk+v5XLdE9wxtAFRyxx+P//Iw+a5L/tTg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.7.4.tgz", + "integrity": "sha512-QpGupahTQW1mHRXddMG5srgpHWqRLwJnJZKXTigB9RPFCCGbDGCgBeM/iC82ICXp414WeYx/tD54w7M2qRqTMg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.7.4.tgz", + "integrity": "sha512-mObR+r+KZq0XhRVS2BrBKBpr5jqrqzlPvS9C9vuOf5ilSwzloAl7RPWLrgKdWS6IreaVrjHxTjtyqFiOisaCwg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.7.4.tgz", + "integrity": "sha512-4ZSuzWgFxqHRE31Glu+fEr/MirNZOMYmD/0BhBWyLyOOQz/gTAl7QmWm2hX1QxEIXsr2vkdlwxIzTyiYRC4xcQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.7.4.tgz", + "integrity": "sha512-wdsOw0MvkL1UIgiQ/IFr3ETcfv1xb8RMM0H9wbiDyLaJFyiDg5oZvDLCXosIXmFeIlweML5iOBXAkqddkYNizg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.7.4.tgz", + "integrity": "sha512-zUXy3e8jBNPiffmqkHRNDdZM2r8DWhCB7HhcoyZjiK1TxYEluLHAvQuYnTT+ARqRpabWqy/NHkO6e3MsYB5YfA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.7.4.tgz", + "integrity": "sha512-zpUTZphp5nHokuy8yLlyafxCJ0rSlFoSHypTUWgpdwoDXWQcseaect7cJ8Ppk6nunOM6+5rPMkod4OYKPR5MUg==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.7.4", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-remap-async-to-generator": "^7.7.4" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.7.4.tgz", + "integrity": "sha512-kqtQzwtKcpPclHYjLK//3lH8OFsCDuDJBaFhVwf8kqdnF6MN4l618UDlcA7TfRs3FayrHj+svYnSX8MC9zmUyQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.7.4.tgz", + "integrity": "sha512-2VBe9u0G+fDt9B5OV5DQH4KBf5DoiNkwFKOz0TCvBWvdAN2rOykCTkrL+jTLxfCAm76l9Qo5OqL7HBOx2dWggg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "lodash": "^4.17.13" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.7.4.tgz", + "integrity": "sha512-sK1mjWat7K+buWRuImEzjNf68qrKcrddtpQo3swi9j7dUcG6y6R6+Di039QN2bD1dykeswlagupEmpOatFHHUg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.7.4", + "@babel/helper-define-map": "^7.7.4", + "@babel/helper-function-name": "^7.7.4", + "@babel/helper-optimise-call-expression": "^7.7.4", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.7.4", + "@babel/helper-split-export-declaration": "^7.7.4", + "globals": "^11.1.0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.7.4.tgz", + "integrity": "sha512-bSNsOsZnlpLLyQew35rl4Fma3yKWqK3ImWMSC/Nc+6nGjC9s5NFWAer1YQ899/6s9HxO2zQC1WoFNfkOqRkqRQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.7.4.tgz", + "integrity": "sha512-4jFMXI1Cu2aXbcXXl8Lr6YubCn6Oc7k9lLsu8v61TZh+1jny2BWmdtvY9zSUlLdGUvcy9DMAWyZEOqjsbeg/wA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.7.4.tgz", + "integrity": "sha512-mk0cH1zyMa/XHeb6LOTXTbG7uIJ8Rrjlzu91pUx/KS3JpcgaTDwMS8kM+ar8SLOvlL2Lofi4CGBAjCo3a2x+lw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.7.4", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.7.4.tgz", + "integrity": "sha512-g1y4/G6xGWMD85Tlft5XedGaZBCIVN+/P0bs6eabmcPP9egFleMAo65OOjlhcz1njpwagyY3t0nsQC9oTFegJA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.7.4.tgz", + "integrity": "sha512-MCqiLfCKm6KEA1dglf6Uqq1ElDIZwFuzz1WH5mTf8k2uQSxEJMbOIEh7IZv7uichr7PMfi5YVSrr1vz+ipp7AQ==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.7.4", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.7.4.tgz", + "integrity": "sha512-zZ1fD1B8keYtEcKF+M1TROfeHTKnijcVQm0yO/Yu1f7qoDoxEIc/+GX6Go430Bg84eM/xwPFp0+h4EbZg7epAA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.7.4.tgz", + "integrity": "sha512-E/x09TvjHNhsULs2IusN+aJNRV5zKwxu1cpirZyRPw+FyyIKEHPXTsadj48bVpc1R5Qq1B5ZkzumuFLytnbT6g==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.7.4", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.7.4.tgz", + "integrity": "sha512-X2MSV7LfJFm4aZfxd0yLVFrEXAgPqYoDG53Br/tCKiKYfX0MjVjQeWPIhPHHsCqzwQANq+FLN786fF5rgLS+gw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.7.4.tgz", + "integrity": "sha512-9VMwMO7i69LHTesL0RdGy93JU6a+qOPuvB4F4d0kR0zyVjJRVJRaoaGjhtki6SzQUu8yen/vxPKN6CWnCUw6bA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.7.4.tgz", + "integrity": "sha512-/542/5LNA18YDtg1F+QHvvUSlxdvjZoD/aldQwkq+E3WCkbEjNSN9zdrOXaSlfg3IfGi22ijzecklF/A7kVZFQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.7.4", + "@babel/helper-plugin-utils": "^7.0.0", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.4.tgz", + "integrity": "sha512-k8iVS7Jhc367IcNF53KCwIXtKAH7czev866ThsTgy8CwlXjnKZna2VHwChglzLleYrcHz1eQEIJlGRQxB53nqA==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.7.4", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-simple-access": "^7.7.4", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.7.4.tgz", + "integrity": "sha512-y2c96hmcsUi6LrMqvmNDPBBiGCiQu0aYqpHatVVu6kD4mFEXKjyNxd/drc18XXAf9dv7UXjrZwBVmTTGaGP8iw==", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.7.4", + "@babel/helper-plugin-utils": "^7.0.0", + "babel-plugin-dynamic-import-node": "^2.3.0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.7.4.tgz", + "integrity": "sha512-u2B8TIi0qZI4j8q4C51ktfO7E3cQ0qnaXFI1/OXITordD40tt17g/sXqgNNCcMTcBFKrUPcGDx+TBJuZxLx7tw==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.7.4", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.7.4.tgz", + "integrity": "sha512-jBUkiqLKvUWpv9GLSuHUFYdmHg0ujC1JEYoZUfeOOfNydZXp1sXObgyPatpcwjWgsdBGsagWW0cdJpX/DO2jMw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.7.4" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.7.4.tgz", + "integrity": "sha512-CnPRiNtOG1vRodnsyGX37bHQleHE14B9dnnlgSeEs3ek3fHN1A1SScglTCg1sfbe7sRQ2BUcpgpTpWSfMKz3gg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.7.4.tgz", + "integrity": "sha512-ho+dAEhC2aRnff2JCA0SAK7V2R62zJd/7dmtoe7MHcso4C2mS+vZjn1Pb1pCVZvJs1mgsvv5+7sT+m3Bysb6eg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-replace-supers": "^7.7.4" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.7.4.tgz", + "integrity": "sha512-VJwhVePWPa0DqE9vcfptaJSzNDKrWU/4FbYCjZERtmqEs05g3UMXnYMZoXja7JAJ7Y7sPZipwm/pGApZt7wHlw==", + "dev": true, + "dependencies": { + "@babel/helper-call-delegate": "^7.7.4", + "@babel/helper-get-function-arity": "^7.7.4", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.7.4.tgz", + "integrity": "sha512-MatJhlC4iHsIskWYyawl53KuHrt+kALSADLQQ/HkhTjX954fkxIEh4q5slL4oRAnsm/eDoZ4q0CIZpcqBuxhJQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.7.4.tgz", + "integrity": "sha512-e7MWl5UJvmPEwFJTwkBlPmqixCtr9yAASBqff4ggXTNicZiwbF8Eefzm6NVgfiBp7JdAGItecnctKTgH44q2Jw==", + "dev": true, + "dependencies": { + "regenerator-transform": "^0.14.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.7.4.tgz", + "integrity": "sha512-OrPiUB5s5XvkCO1lS7D8ZtHcswIC57j62acAnJZKqGGnHP+TIc/ljQSrgdX/QyOTdEK5COAhuc820Hi1q2UgLQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.7.4.tgz", + "integrity": "sha512-q+suddWRfIcnyG5YiDP58sT65AJDZSUhXQDZE3r04AuqD6d/XLaQPPXSBzP2zGerkgBivqtQm9XKGLuHqBID6Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.7.4.tgz", + "integrity": "sha512-8OSs0FLe5/80cndziPlg4R0K6HcWSM0zyNhHhLsmw/Nc5MaA49cAsnoJ/t/YZf8qkG7fD+UjTRaApVDB526d7Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.7.4.tgz", + "integrity": "sha512-Ls2NASyL6qtVe1H1hXts9yuEeONV2TJZmplLONkMPUG158CtmnrzW5Q5teibM5UVOFjG0D3IC5mzXR6pPpUY7A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-regex": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.7.4.tgz", + "integrity": "sha512-sA+KxLwF3QwGj5abMHkHgshp9+rRz+oY9uoRil4CyLtgEuE/88dpkeWgNk5qKVsJE9iSfly3nvHapdRiIS2wnQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.7.4", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.7.4.tgz", + "integrity": "sha512-KQPUQ/7mqe2m0B8VecdyaW5XcQYaePyl9R7IsKd+irzj6jvbhoGnRE+M0aNkyAzI07VfUQ9266L5xMARitV3wg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.7.4.tgz", + "integrity": "sha512-N77UUIV+WCvE+5yHw+oks3m18/umd7y392Zv7mYTpFqHtkpcc+QUz+gLJNTWVlWROIWeLqY0f3OjZxV5TcXnRw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.7.4", + "@babel/helper-plugin-utils": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.7.1.tgz", + "integrity": "sha512-/93SWhi3PxcVTDpSqC+Dp4YxUu3qZ4m7I76k0w73wYfn7bGVuRIO4QUz95aJksbS+AD1/mT1Ie7rbkT0wSplaA==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.7.0", + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-async-generator-functions": "^7.7.0", + "@babel/plugin-proposal-dynamic-import": "^7.7.0", + "@babel/plugin-proposal-json-strings": "^7.2.0", + "@babel/plugin-proposal-object-rest-spread": "^7.6.2", + "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.7.0", + "@babel/plugin-syntax-async-generators": "^7.2.0", + "@babel/plugin-syntax-dynamic-import": "^7.2.0", + "@babel/plugin-syntax-json-strings": "^7.2.0", + "@babel/plugin-syntax-object-rest-spread": "^7.2.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", + "@babel/plugin-syntax-top-level-await": "^7.7.0", + "@babel/plugin-transform-arrow-functions": "^7.2.0", + "@babel/plugin-transform-async-to-generator": "^7.7.0", + "@babel/plugin-transform-block-scoped-functions": "^7.2.0", + "@babel/plugin-transform-block-scoping": "^7.6.3", + "@babel/plugin-transform-classes": "^7.7.0", + "@babel/plugin-transform-computed-properties": "^7.2.0", + "@babel/plugin-transform-destructuring": "^7.6.0", + "@babel/plugin-transform-dotall-regex": "^7.7.0", + "@babel/plugin-transform-duplicate-keys": "^7.5.0", + "@babel/plugin-transform-exponentiation-operator": "^7.2.0", + "@babel/plugin-transform-for-of": "^7.4.4", + "@babel/plugin-transform-function-name": "^7.7.0", + "@babel/plugin-transform-literals": "^7.2.0", + "@babel/plugin-transform-member-expression-literals": "^7.2.0", + "@babel/plugin-transform-modules-amd": "^7.5.0", + "@babel/plugin-transform-modules-commonjs": "^7.7.0", + "@babel/plugin-transform-modules-systemjs": "^7.7.0", + "@babel/plugin-transform-modules-umd": "^7.7.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.7.0", + "@babel/plugin-transform-new-target": "^7.4.4", + "@babel/plugin-transform-object-super": "^7.5.5", + "@babel/plugin-transform-parameters": "^7.4.4", + "@babel/plugin-transform-property-literals": "^7.2.0", + "@babel/plugin-transform-regenerator": "^7.7.0", + "@babel/plugin-transform-reserved-words": "^7.2.0", + "@babel/plugin-transform-shorthand-properties": "^7.2.0", + "@babel/plugin-transform-spread": "^7.6.2", + "@babel/plugin-transform-sticky-regex": "^7.2.0", + "@babel/plugin-transform-template-literals": "^7.4.4", + "@babel/plugin-transform-typeof-symbol": "^7.2.0", + "@babel/plugin-transform-unicode-regex": "^7.7.0", + "@babel/types": "^7.7.1", + "browserslist": "^4.6.0", + "core-js-compat": "^3.1.1", + "invariant": "^2.2.2", + "js-levenshtein": "^1.1.3", + "semver": "^5.5.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.4.tgz", + "integrity": "sha512-r24eVUUr0QqNZa+qrImUk8fn5SPhHq+IfYvIoIMg0do3GdK9sMdiLKP3GYVVaxpPKORgm8KRKaNTEhAjgIpLMw==", + "dependencies": { + "regenerator-runtime": "^0.13.2" + } + }, + "node_modules/@babel/runtime/node_modules/regenerator-runtime": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", + "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==" + }, + "node_modules/@babel/template": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz", + "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4" + } + }, + "node_modules/@babel/traverse": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.4.tgz", + "integrity": "sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.7.4", + "@babel/helper-function-name": "^7.7.4", + "@babel/helper-split-export-declaration": "^7.7.4", + "@babel/parser": "^7.7.4", + "@babel/types": "^7.7.4", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "node_modules/@babel/traverse/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "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.7.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz", + "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "node_modules/@cypress/listr-verbose-renderer": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@cypress/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz", + "integrity": "sha1-p3SS9LEdzHxEajSz4ochr9M8ZCo=", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "cli-cursor": "^1.0.2", + "date-fns": "^1.27.2", + "figures": "^1.7.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@cypress/listr-verbose-renderer/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/@cypress/listr-verbose-renderer/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/@cypress/listr-verbose-renderer/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/@cypress/xvfb": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", + "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", + "dev": true, + "dependencies": { + "debug": "^3.1.0", + "lodash.once": "^4.1.1" + } + }, + "node_modules/@hapi/address": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", + "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==", + "dev": true + }, + "node_modules/@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==", + "dev": true + }, + "node_modules/@hapi/hoek": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", + "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", + "dev": true + }, + "node_modules/@hapi/joi": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", + "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", + "dev": true, + "dependencies": { + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" + } + }, + "node_modules/@hapi/topo": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", + "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "dev": true, + "dependencies": { + "@hapi/hoek": "^8.3.0" + } + }, + "node_modules/@sentry/browser": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-5.0.6.tgz", + "integrity": "sha512-I0/3aRECsH0CYxdI9cdUKZdhGAJC5hZXRJjTMVZkShUCiVKFt5uLfZWqc3nnJCKksEeFvJHJ530f9nZ7d0I03Q==", + "dependencies": { + "@sentry/core": "5.0.6", + "@sentry/types": "5.0.6", + "@sentry/utils": "5.0.6", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/core": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.0.6.tgz", + "integrity": "sha512-+SOoxMAmi6yhu3ROuUj3qQIedvtpt2XVSoT8iYUwN1U2LZVYM2KFpJKqdpuQt3r1SvEGGEQKYVdGhCGhb6L88Q==", + "dependencies": { + "@sentry/hub": "5.0.6", + "@sentry/minimal": "5.0.6", + "@sentry/types": "5.0.6", + "@sentry/utils": "5.0.6", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/hub": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.0.6.tgz", + "integrity": "sha512-ku4rYu2Fy4VLCzPQGY+Oh6dOcDHC4q98hiMR7+adJ79vHjxAL0H+ig1WUGkuWsFZE87VZ+2NhR08l4rpmsEB9g==", + "dependencies": { + "@sentry/types": "5.0.6", + "@sentry/utils": "5.0.6", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/minimal": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.0.6.tgz", + "integrity": "sha512-xPaokcBUlc6excZdfswnZceISpb43elhqHmW2BZ5SXemEOQ6OsUPQ1TosgsQQXqTJ6E0LIltBZoV+eA1FsKj3Q==", + "dependencies": { + "@sentry/hub": "5.0.6", + "@sentry/types": "5.0.6", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/types": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.0.6.tgz", + "integrity": "sha512-EJYzjfnTfTQgqR3p6dSvIVZe0xe2Jz+tSmvuPABf7VoCmrFtEYkMCSf5IshMHeebmXUS5prrPSCAgVcIrJC+Bw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/utils": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.0.6.tgz", + "integrity": "sha512-JsDlCY3t5g+E1a34IqCpqvj8ZGv/t1nPpySxmlXuk4awnvgGTm+zsN+bauzYPTucqqJLHEILsQnasbJa2H15TA==", + "dependencies": { + "@sentry/types": "5.0.6", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sinonjs/commons": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.6.0.tgz", + "integrity": "sha512-w4/WHG7C4WWFyE5geCieFJF6MZkbW4VAriol5KlmQXpAQdxvV0p26sqNZOW6Qyw6Y0l9K4g+cHvvczR2sEEpqg==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/formatio": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.2.tgz", + "integrity": "sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1", + "@sinonjs/samsam": "^3.1.0" + } + }, + "node_modules/@sinonjs/samsam": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.3.tgz", + "integrity": "sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.3.0", + "array-from": "^2.1.1", + "lodash": "^4.17.15" + } + }, + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", + "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", + "dev": true + }, + "node_modules/@types/anymatch": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz", + "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==", + "dev": true + }, + "node_modules/@types/body-parser": { + "version": "1.16.8", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.16.8.tgz", + "integrity": "sha512-BdN2PXxOFnTXFcyONPW6t0fHjz2fvRZHVMFpaS0wYr+Y8fWEaNOs4V8LEu/fpzQlMx+ahdndgTaGTwPC+J/EeA==", + "dev": true, + "dependencies": { + "@types/express": "*", + "@types/node": "*" + } + }, + "node_modules/@types/caseless": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", + "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==", + "dev": true + }, + "node_modules/@types/chai": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.7.tgz", + "integrity": "sha512-luq8meHGYwvky0O7u0eQZdA7B4Wd9owUCqvbw2m3XCrCU8mplYOujMBbvyS547AxJkC+pGnd0Cm15eNxEUNU8g==", + "dev": true + }, + "node_modules/@types/chai-datetime": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/chai-datetime/-/chai-datetime-0.0.33.tgz", + "integrity": "sha512-WRo2HJtCBCNQYWNPOLgzikBjiHy4BKl2z8TIYLPjFoWvkiTasVMhmu2cDqocxaLTowNSaJ1khKvmJPDhOWU5cQ==", + "dev": true, + "dependencies": { + "@types/chai": "*" + } + }, + "node_modules/@types/cheerio": { + "version": "0.22.14", + "resolved": "https://registry.npmjs.org/@types/cheerio/-/cheerio-0.22.14.tgz", + "integrity": "sha512-SVtcP2fvPYrebTwpyqxjxb7K5v3ZOAdH409yAEWFPpZThCSGa1K2IFfx6Rg6ttvThCBQXP4fU9WF94sqLoiQGg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/compression": { + "version": "0.0.35", + "resolved": "https://registry.npmjs.org/@types/compression/-/compression-0.0.35.tgz", + "integrity": "sha512-SrHPmzvC5AL6cCrq0fDCU2AX9sOK/Azik2mdkbLhGpxOlzS7rTALjtdk/WzvKY3pQqEz3byvz1nnX/AmMk6X0Q==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/d3": { + "version": "3.5.40", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-3.5.40.tgz", + "integrity": "sha512-GrJeI6Yg6uCIYRtWlMGxDtgsKSs2aMW0edrO/GJk+O7y4iayn8lEoHAn50wkjb9voRq9JimhCN/FIXLzAxkCoA==", + "dev": true + }, + "node_modules/@types/d3-scale": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-2.1.1.tgz", + "integrity": "sha512-kNTkbZQ+N/Ip8oX9PByXfDLoCSaZYm+VUOasbmsa6KD850/ziMdYepg/8kLg2plHzoLANdMqPoYQbvExevLUHg==", + "dev": true, + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-1.0.10.tgz", + "integrity": "sha512-aKf62rRQafDQmSiv1NylKhIMmznsjRN+MnXRXTqHoqm0U/UZzVpdrtRnSIfdiLS616OuC1soYeX1dBg2n1u8Xw==", + "dev": true + }, + "node_modules/@types/enzyme": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/@types/enzyme/-/enzyme-3.1.11.tgz", + "integrity": "sha512-abPTpLuveNVd2ibafCjwoZT9MerzgnBKd6ijNKdtlfJREGKXk5dxzKAXGoY9IuiYarH2YXTc197WeyIVQUFjQg==", + "dev": true, + "dependencies": { + "@types/cheerio": "*", + "@types/react": "*" + } + }, + "node_modules/@types/express": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.11.0.tgz", + "integrity": "sha512-N1Wdp3v4KmdO3W/CM7KXrDwM4xcVZjlHF2dAOs7sNrTUX8PY3G4n9NkaHlfjGFEfgFeHmRRjywoBd4VkujDs9w==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.0.tgz", + "integrity": "sha512-Xnub7w57uvcBqFdIGoRg1KhNOeEj0vB6ykUM7uFWyxvbdE89GFyqgmUcanAriMr4YOxNFZBAWkfcWIb4WBPt3g==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/range-parser": "*" + } + }, + "node_modules/@types/express-session": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/@types/express-session/-/express-session-1.15.6.tgz", + "integrity": "sha512-yOWF/CQsw20YBy9phGtGXhXafcwEgc2nQXorTI8Uegi4+viguBWBw8XQU3Ctd8fiLkqX5zklJD8ow4bGJKbDKw==", + "dev": true, + "dependencies": { + "@types/express": "*", + "@types/node": "*" + } + }, + "node_modules/@types/file-saver": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@types/file-saver/-/file-saver-1.3.0.tgz", + "integrity": "sha512-fC12hKtEzVkrV/ZRcrmqvpHG/TMYDZtgpAmgMUA4F7KneDaQeFMwmPz8AfygKKJMqsdTi8bL+E+fciaaMLxUhg==", + "dev": true + }, + "node_modules/@types/fs-promise": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/fs-promise/-/fs-promise-1.0.3.tgz", + "integrity": "sha1-Huceeh7dNQOpBc3sJiQPSF3Ny68=", + "dev": true, + "dependencies": { + "@types/mz": "*", + "@types/node": "*" + } + }, + "node_modules/@types/geojson": { + "version": "7946.0.0", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.0.tgz", + "integrity": "sha512-lbWmXFxIpEzpH7OprsCRvxj7kie+248Y2ItjeVsF+0+IqvwG+R+0xgZmxq1ofYNTszvuihDahas7O5dscfxTsw==", + "dev": true + }, + "node_modules/@types/helmet": { + "version": "0.0.37", + "resolved": "https://registry.npmjs.org/@types/helmet/-/helmet-0.0.37.tgz", + "integrity": "sha512-E45vdnx+7+HIN5jsywhzfd+hUI/2yBFr6RT7tsMVrwp+uTvyVANBf4dyVUNW/+ZqAvcx23t2YtGTndQJR3tXIA==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/jquery": { + "version": "1.10.35", + "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-1.10.35.tgz", + "integrity": "sha512-SVtqEcudm7yjkTwoRA1gC6CNMhGDdMx4Pg8BPdiqI7bXXdCn1BPmtxgeWYQOgDxrq53/5YTlhq5ULxBEAlWIBg==", + "dev": true + }, + "node_modules/@types/js-yaml": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-3.10.1.tgz", + "integrity": "sha512-IpKg0KGIUNcydttaGURhSLrq1eSNoSjN7T1MokAuasIPBKzsHxcz3MAdFGzasmYQVWf6XxG+jQTJ9UFOL29Ubg==", + "dev": true + }, + "node_modules/@types/jsdom": { + "version": "2.0.28", + "resolved": "http://registry.npmjs.org/@types/jsdom/-/jsdom-2.0.28.tgz", + "integrity": "sha1-p+w5WPQIE1YXTEKClx2S32ivDfY=", + "dev": true, + "dependencies": { + "@types/jquery": "1.10.*", + "@types/node": "4.0.*" + } + }, + "node_modules/@types/jsdom/node_modules/@types/node": { + "version": "4.0.48", + "resolved": "https://registry.npmjs.org/@types/node/-/node-4.0.48.tgz", + "integrity": "sha512-cTtoXQrP6iG3GRSJgMRxqaz5wPPJNUjGAi4GukDluPng4YNJoAX7Twtu63vR1oM7mgSFFSjjf633ox/MaFj0sQ==", + "dev": true + }, + "node_modules/@types/lz-string": { + "version": "1.3.32", + "resolved": "https://registry.npmjs.org/@types/lz-string/-/lz-string-1.3.32.tgz", + "integrity": "sha1-YOJtD3Dapr84W5Q3uwL2YaVxP4E=", + "dev": true + }, + "node_modules/@types/marked": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@types/marked/-/marked-0.4.0.tgz", + "integrity": "sha512-xkURX55US18wHme+O2UlqJf3Fo7FqT5VAL+OJ/zK+jP2NX57naryDHoiqt/pMIwZjDc62sRvXUWuQQxQiBdheQ==", + "dev": true + }, + "node_modules/@types/mime": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.0.tgz", + "integrity": "sha512-A2TAGbTFdBw9azHbpVd+/FkdW2T6msN1uct1O9bH3vTerEHKZhTXJUQXy+hNq1B0RagfU8U+KBdqiZpxjhOUQA==", + "dev": true + }, + "node_modules/@types/mocha": { + "version": "2.2.46", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.46.tgz", + "integrity": "sha512-fwTTP5QLf4xHMkv7ovcKvmlLWX3GrxCa5DRQDOilVyYGCp+arZTAQJCy7/4GKezzYJjfWMpB/Cy4e8nrc9XioA==", + "dev": true + }, + "node_modules/@types/moment-timezone": { + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/@types/moment-timezone/-/moment-timezone-0.5.12.tgz", + "integrity": "sha512-hnHH2+Efg2vExr/dSz+IX860nSiyk9Sk4pJF2EmS11lRpMcNXeB4KBW5xcgw2QPsb9amTXdsVNEe5IoJXiT0uw==", + "dev": true, + "dependencies": { + "moment": ">=2.14.0" + } + }, + "node_modules/@types/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@types/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-Q5TZYMKnH0hdV5fNstmMWL2LLw5eRRtTd73KNtsZxoQ2gtCQyET5X79uERUEwGneuxPglg441I7OSY00+9CkSw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/nock": { + "version": "9.1.3", + "resolved": "http://registry.npmjs.org/@types/nock/-/nock-9.1.3.tgz", + "integrity": "sha512-S8rJ+SaW82ICX87pZP62UcMifrMfjEdqNzSp+llx4YcvKw6bO650Ye6HwTqER1Dar3S40GIZECQisOrAICDCjA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.5.2.tgz", + "integrity": "sha512-KA4GKOpgXnrqEH2eCVhiv2CsxgXGQJgV1X0vsGlh+WCnxbeAE1GT44ZsTU1IN5dEeV/gDupKa7gWo08V5IxWVQ==", + "dev": true + }, + "node_modules/@types/nopt": { + "version": "3.0.29", + "resolved": "http://registry.npmjs.org/@types/nopt/-/nopt-3.0.29.tgz", + "integrity": "sha1-8Z3z20yX7hRZonQAKDIKcdcJZM4=", + "dev": true + }, + "node_modules/@types/prop-types": { + "version": "15.7.3", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", + "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==", + "dev": true + }, + "node_modules/@types/randomstring": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@types/randomstring/-/randomstring-1.1.6.tgz", + "integrity": "sha512-XRIZIMTxjcUukqQcYBdpFWGbcRDyNBXrvTEtTYgFMIbBNUVt+9mCKsU+jUUDLeFO/RXopUgR5OLiBqbY18vSHQ==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", + "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==", + "dev": true + }, + "node_modules/@types/react": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.7.0.tgz", + "integrity": "sha512-bHwfht6kILzUj1Hs5vmr9vpokDmcNXPbR55tKE/ZEylb3WtSt9hAuO68rsm73/sre2/MwLijfo8sD4ANe+HDUg==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "csstype": "^2.2.0" + } + }, + "node_modules/@types/react-copy-to-clipboard": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@types/react-copy-to-clipboard/-/react-copy-to-clipboard-4.3.0.tgz", + "integrity": "sha512-iideNPRyroENqsOFh1i2Dv3zkviYS9r/9qD9Uh3Z9NNoAAqqa2x53i7iGndGNnJFIo20wIu7Hgh77tx1io8bgw==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-dom": { + "version": "16.0.11", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.0.11.tgz", + "integrity": "sha512-x6zUx9/42B5Kl2Vl9HlopV8JF64wLpX3c+Pst9kc1HgzrsH+mkehe/zmHMQTplIrR48H2gpU7ZqurQolYu8XBA==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-syntax-highlighter": { + "version": "0.0.5", + "resolved": "http://registry.npmjs.org/@types/react-syntax-highlighter/-/react-syntax-highlighter-0.0.5.tgz", + "integrity": "sha512-QRJL5Lkk+vijY1pigXtV44J/vg2l8hh/SQ5DD/L5whKuVLLbqdrtIa8Zh7X/uurrIjTH6jLlcHenPSZjJjvhIA==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-transition-group": { + "version": "2.0.7", + "resolved": "http://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-2.0.7.tgz", + "integrity": "sha512-aTbd37E2XJ5Zi/lRrXo74RMhZikS/r5a06EStXEdapy4pqzvPrdY9BpWGNSpnyp8oNaggL0duljNdC8T0dRIUA==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/request": { + "version": "2.48.3", + "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.3.tgz", + "integrity": "sha512-3Wo2jNYwqgXcIz/rrq18AdOZUQB8cQ34CXZo+LUwPJNpvRAL86+Kc2wwI8mqpz9Cr1V+enIox5v+WZhy/p3h8w==", + "dev": true, + "dependencies": { + "@types/caseless": "*", + "@types/node": "*", + "@types/tough-cookie": "*", + "form-data": "^2.5.0" + } + }, + "node_modules/@types/request-promise-native": { + "version": "1.0.14", + "resolved": "http://registry.npmjs.org/@types/request-promise-native/-/request-promise-native-1.0.14.tgz", + "integrity": "sha512-m6PNeopPU75gjN3+dD9AeWwm7h2QIOuLnmn143+Qs0bMYFyri9/bhCgikHlgzH0gk7xR48nef82GWeRV6N3DxA==", + "dev": true, + "dependencies": { + "@types/request": "*" + } + }, + "node_modules/@types/request/node_modules/form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/@types/rewire": { + "version": "2.5.28", + "resolved": "https://registry.npmjs.org/@types/rewire/-/rewire-2.5.28.tgz", + "integrity": "sha512-uD0j/AQOa5le7afuK+u+woi8jNKF1vf3DN0H7LCJhft/lNNibUr7VcAesdgtWfEKveZol3ZG1CJqwx2Bhrnl8w==", + "dev": true + }, + "node_modules/@types/serve-static": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.3.tgz", + "integrity": "sha512-oprSwp094zOglVrXdlo/4bAHtKTAxX6VT8FOZlBKrmyLbNvE1zxZyJ6yikMVtHIvwP45+ZQGJn+FdXGKTozq0g==", + "dev": true, + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/mime": "*" + } + }, + "node_modules/@types/sinon": { + "version": "4.1.4", + "resolved": "http://registry.npmjs.org/@types/sinon/-/sinon-4.1.4.tgz", + "integrity": "sha512-t3Gr6kIhBRfQELZYkrLIKsH5gQrMvHzBlpi+h5V6nC+CypJioLyfQqbAo4VNz7dJmck9uNEuL4wa5aoUr9D3Lw==", + "dev": true + }, + "node_modules/@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", + "dev": true + }, + "node_modules/@types/strip-bom": { + "version": "3.0.0", + "resolved": "http://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=", + "dev": true + }, + "node_modules/@types/strip-json-comments": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", + "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", + "dev": true + }, + "node_modules/@types/superagent": { + "version": "3.5.6", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-3.5.6.tgz", + "integrity": "sha512-yGiVkRbB1qtIkRCpEJIxlHazBoILmu33xbbu4IiwxTJjwDi/EudiPYAD7QwWe035jkE40yQgTVXZsAePFtleww==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/supertest": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.4.tgz", + "integrity": "sha512-0TvOJ+6XVMSImgqc2ClNllfVffCxHQhFbsbwOGzGTjdFydoaG052LPqnP8SnmSlnokOcQiPPcbz+Yi30LxWPyA==", + "dev": true, + "dependencies": { + "@types/superagent": "*" + } + }, + "node_modules/@types/tapable": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.4.tgz", + "integrity": "sha512-78AdXtlhpCHT0K3EytMpn4JNxaf5tbqbLcbIRoQIHzpTIyjpxLQKRoxU55ujBXAtg3Nl2h/XWvfDa9dsMOd0pQ==", + "dev": true + }, + "node_modules/@types/tough-cookie": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-2.3.5.tgz", + "integrity": "sha512-SCcK7mvGi3+ZNz833RRjFIxrn4gI1PPR3NtuIS+6vMkvmsGjosqTJwRt5bAEFLRz+wtJMWv8+uOnZf2hi2QXTg==", + "dev": true + }, + "node_modules/@types/uglify-js": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.0.4.tgz", + "integrity": "sha512-SudIN9TRJ+v8g5pTG8RRCqfqTMNqgWCKKd3vtynhGzkIIjxaicNAMuY5TRadJ6tzDu3Dotf3ngaMILtmOdmWEQ==", + "dev": true, + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/@types/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/@types/webpack": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.0.tgz", + "integrity": "sha512-tWkdf9nO0zFgAY/EumUKwrDUhraHKDqCPhwfFR/R8l0qnPdgb9le0Gzhvb7uzVpouuDGBgiE//ZdY+5jcZy2TA==", + "dev": true, + "dependencies": { + "@types/anymatch": "*", + "@types/node": "*", + "@types/tapable": "*", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "source-map": "^0.6.0" + } + }, + "node_modules/@types/webpack-env": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.14.1.tgz", + "integrity": "sha512-0Ki9jAAhKDSuLDXOIMADg54Hu60SuBTEsWaJGGy5cV+SSUQ63J2a+RrYYGrErzz39fXzTibhKrAQJAb8M7PNcA==", + "dev": true + }, + "node_modules/@types/webpack-sources": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.5.tgz", + "integrity": "sha512-zfvjpp7jiafSmrzJ2/i3LqOyTYTuJ7u1KOXlKgDlvsj9Rr0x7ZiYu5lZbXwobL7lmsRNtPXlBfmaUD8eU2Hu8w==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.6.1" + } + }, + "node_modules/@types/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/@types/webpack/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/@vx/bounds": { + "version": "0.0.182", + "resolved": "https://registry.npmjs.org/@vx/bounds/-/bounds-0.0.182.tgz", + "integrity": "sha512-ep3jAh79fWBYAx9rdoe9z9pec8bNHfyWXP/E60t2HWsCfwoAdtsNXuPKpmHs4AiQlznOe+eqBlz0MG5yFA9o7g==", + "dependencies": { + "prop-types": "^15.5.10" + } + }, + "node_modules/@vx/group": { + "version": "0.0.183", + "resolved": "https://registry.npmjs.org/@vx/group/-/group-0.0.183.tgz", + "integrity": "sha512-iD2tDL8sl6HjZsMn+kkBjRb29px7qlHF8o6MQ3VbzVjUp+WZEYvA/s1bkqvn3q9tPtFAMBG+YWp9oSnkMdfpYQ==", + "dependencies": { + "classnames": "^2.2.5", + "prop-types": "^15.6.2" + } + }, + "node_modules/@vx/heatmap": { + "version": "0.0.183", + "resolved": "https://registry.npmjs.org/@vx/heatmap/-/heatmap-0.0.183.tgz", + "integrity": "sha512-Ucskk5q/9e0w/JV8dc0LIHVr+hriRcHJhf6SZw4xgVLOZi8xSN0iFLPXnHXeLnOy74IemRn7LkRhW8jtESx64w==", + "dependencies": { + "@vx/group": "0.0.183", + "classnames": "^2.2.5", + "prop-types": "^15.6.1" + } + }, + "node_modules/@vx/scale": { + "version": "0.0.182", + "resolved": "https://registry.npmjs.org/@vx/scale/-/scale-0.0.182.tgz", + "integrity": "sha512-QFNWElBUscZD40SZoBOJtzqNU9fS5RAZypvYYJE1mipcEMLXLa8MExpeu/VushAbkSBz2B3T6K9myBL0QYi2xQ==", + "dependencies": { + "d3-scale": "^2.0.0" + } + }, + "node_modules/@vx/tooltip": { + "version": "0.0.184", + "resolved": "https://registry.npmjs.org/@vx/tooltip/-/tooltip-0.0.184.tgz", + "integrity": "sha512-XxEuh54FpKr87ooKpOMv4VYVWyub7F0Npdgp1TMLXn92Wi/07MMe8+u6dCfDyFtnPl20xkwQWe0XkXKOTaw6kw==", + "dependencies": { + "@vx/bounds": "0.0.182", + "classnames": "^2.2.5", + "prop-types": "^15.5.10" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", + "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", + "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", + "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", + "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-code-frame": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", + "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "node_modules/@webassemblyjs/helper-fsm": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", + "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-module-context": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", + "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.8.5", + "mamacro": "^0.0.3" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", + "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", + "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", + "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", + "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", + "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", + "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/helper-wasm-section": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-opt": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", + "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", + "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", + "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "node_modules/@webassemblyjs/wast-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", + "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/floating-point-hex-parser": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-code-frame": "1.8.5", + "@webassemblyjs/helper-fsm": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", + "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5", + "@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": "1.0.4", + "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", + "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=", + "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==" + }, + "node_modules/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dependencies": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "2.7.0", + "resolved": "http://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", + "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "1.0.9", + "resolved": "http://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz", + "integrity": "sha1-VbtemGkVB7dFedBRNBMhfDgMVM8=", + "dev": true, + "dependencies": { + "acorn": "^2.1.0" + } + }, + "node_modules/acorn-jsx": { + "version": "3.0.1", + "resolved": "http://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, + "dependencies": { + "acorn": "^3.0.4" + } + }, + "node_modules/acorn-jsx/node_modules/acorn": { + "version": "3.3.0", + "resolved": "http://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", + "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/aggregate-error/node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/airbnb-prop-types": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/airbnb-prop-types/-/airbnb-prop-types-2.15.0.tgz", + "integrity": "sha512-jUh2/hfKsRjNFC4XONQrxo/n/3GG4Tn6Hl0WlFQN5PY9OMC9loSCoAYKnZsWaP8wEfd5xcrPloK0Zg6iS1xwVA==", + "dev": true, + "dependencies": { + "array.prototype.find": "^2.1.0", + "function.prototype.name": "^1.1.1", + "has": "^1.0.3", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object.assign": "^4.1.0", + "object.entries": "^1.1.0", + "prop-types": "^15.7.2", + "prop-types-exact": "^1.2.0", + "react-is": "^16.9.0" + } + }, + "node_modules/ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "dependencies": { + "fast-deep-equal": "^2.0.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.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", + "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-escapes": { + "version": "1.4.0", + "resolved": "http://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + }, + "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/arch": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.1.1.tgz", + "integrity": "sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg==", + "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/are-we-there-yet/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/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "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": "http://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": "1.1.1", + "resolved": "http://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "node_modules/array-from": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", + "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", + "dev": true + }, + "node_modules/array-uniq": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.2.tgz", + "integrity": "sha1-X8w3OSB3VyPP1k1lxkvvU7+eum0=", + "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/array.prototype.find": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.1.0.tgz", + "integrity": "sha512-Wn41+K1yuO5p7wRZDl7890c3xvv5UBrfVXTVIe28rSQb6LS0fZMDrQB6PAcxQFRFy6vJTLDc3A2+3CjQdzVKRg==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.13.0" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true + }, + "node_modules/asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "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=", + "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": "http://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "dependencies": { + "inherits": "2.0.1" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "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/async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "dev": true, + "dependencies": { + "lodash": "^4.17.10" + } + }, + "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/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "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=", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.0.tgz", + "integrity": "sha512-Uvq6hVe90D0B2WEnUqtdgY1bATGz3mw33nH9Y+dmA+w5DHvUmBgkr5rM/KCHpCsiFNRUfokW/szpPPgMK2hm4A==" + }, + "node_modules/axios": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", + "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "dependencies": { + "follow-redirects": "^1.10.0" + } + }, + "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-loader": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.6.tgz", + "integrity": "sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==", + "dev": true, + "dependencies": { + "find-cache-dir": "^2.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1", + "pify": "^4.0.1" + }, + "engines": { + "node": ">= 6.9" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", + "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", + "dev": true, + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "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=", + "dependencies": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "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": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.2.0.tgz", + "integrity": "sha512-7emyCsu1/xiBXgQZrscw/8KPRT44I4Yq9Pe6EGs3aPRTsWuggML1/1DTuZUuIaJPIm1FTDUVXl4x/yW8s0kQDQ==", + "dev": true, + "engines": { + "node": ">= 0.6.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/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "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/bignumber.js": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-4.1.0.tgz", + "integrity": "sha512-eJzYkFYy9L4JzXsbymsFn3p54D+llV27oTQ+ziJG7WFRheJcNZilgVXMG0LoZtlQSKBsJdWtLFqOD0u+U0jZKA==", + "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.5.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", + "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=", + "dev": true + }, + "node_modules/bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "node_modules/body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "dependencies": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.1", + "http-errors": "~1.6.2", + "iconv-lite": "0.4.19", + "on-finished": "~2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "~1.6.15" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.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/bowser": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.8.1.tgz", + "integrity": "sha512-FxxltGKqMHkVa3KtpA+kdnxH0caHPDewccyrK3vW1bsMw6Zco4vRPmMunowX0pXlDZqhxkKSpToADQI2Sk4OeQ==" + }, + "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-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "http://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-des/node_modules/safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "dev": true + }, + "node_modules/browserify-rsa": { + "version": "4.0.1", + "resolved": "http://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-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "dependencies": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "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.7.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.3.tgz", + "integrity": "sha512-jWvmhqYpx+9EZm/FxcZSbUZyDEvDTLDi3nSAKbzEkyWvtI0mNSmUosey+5awDW1RUlrgXbQb5A6qY1xQH9U6MQ==", + "dev": true, + "dependencies": { + "caniuse-lite": "^1.0.30001010", + "electron-to-chromium": "^1.3.306", + "node-releases": "^1.1.40" + }, + "bin": { + "browserslist": "cli.js" + } + }, + "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-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true, + "engines": { + "node": "*" + } + }, + "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==" + }, + "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-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz", + "integrity": "sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==", + "dev": true, + "dependencies": { + "chownr": "^1.1.2", + "figgy-pudding": "^3.5.1", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.2", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "minipass": "^3.0.0", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "p-map": "^3.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^2.7.1", + "ssri": "^7.0.0", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "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/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacache/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "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/cachedir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-1.3.0.tgz", + "integrity": "sha512-O1ji32oyON9laVPJL1IZ5bmwd2cB46VfpxkDequezH+15FDzzVddEyrGEeX4WusDSqKxdyFdDQDEG1yo1GoWkg==", + "dev": true, + "dependencies": { + "os-homedir": "^1.0.1" + } + }, + "node_modules/caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "dependencies": { + "callsites": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/callsites": { + "version": "0.2.0", + "resolved": "http://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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": "http://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/camelize": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", + "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=" + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001012", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001012.tgz", + "integrity": "sha512-7RR4Uh04t9K1uYRWzOJmzplgEOAXbfK72oVNokCdMzA67trrhPzy93ahKk1AWHiA0c58tD2P+NHqxrA8FZ+Trg==", + "dev": true + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "node_modules/chai": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", + "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.0", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chai-datetime": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/chai-datetime/-/chai-datetime-1.5.0.tgz", + "integrity": "sha1-N0LxiwJMdbdqK37uKRZiMkRnWWw=", + "dev": true, + "dependencies": { + "chai": ">1.9.0" + } + }, + "node_modules/chain-function": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/chain-function/-/chain-function-1.0.1.tgz", + "integrity": "sha512-SxltgMwL9uCko5/ZCLiyG2B7R9fY4pDZUw7hJ4MhirdjBLosoDqkWABi3XMucddHdLiFJMb7PD2MZifZriuMTg==" + }, + "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/character-entities": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.3.tgz", + "integrity": "sha512-yB4oYSAa9yLcGyTbB4ItFwHw43QHdH129IJ5R+WvxOkWlyFnR5FAaBNnUq4mcxsTVZGh28bHoeTHMKXH1wZf3w==" + }, + "node_modules/character-entities-legacy": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.3.tgz", + "integrity": "sha512-YAxUpPoPwxYFsslbdKkhrGnXAtXoHNgYjlBM3WMXkWGTl5RsY3QmOyhwAgL8Nxm9l5LBThXGawxKPn68y6/fww==" + }, + "node_modules/character-reference-invalid": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.3.tgz", + "integrity": "sha512-VOq6PRzQBam/8Jm6XBGk2fNEnHXAdGd6go0rtd4weAGECBamHDwwCQSOT12TACIYUZegUXnV6xBXqUssijtxIg==" + }, + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/check-more-types": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", + "integrity": "sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA=", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.3", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.3.tgz", + "integrity": "sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA==", + "dev": true, + "dependencies": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.1", + "entities": "~1.1.1", + "htmlparser2": "^3.9.1", + "lodash": "^4.15.0", + "parse5": "^3.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "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.3", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", + "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==", + "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/chronoshift": { + "version": "0.9.6", + "resolved": "https://registry.npmjs.org/chronoshift/-/chronoshift-0.9.6.tgz", + "integrity": "sha512-0WMvtRqVgwTP7JGXVcerMDSQ7FlrS56jAEtAGxUg8k/pa3WqKFs9ZJUWIPkLxUzPNdb1holpzbqHmZiI6l+3Nw==", + "dependencies": { + "immutable-class": "^0.9.4", + "moment-timezone": "^0.5.26", + "tslib": "^1.10.0" + } + }, + "node_modules/chronoshift/node_modules/moment-timezone": { + "version": "0.5.27", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.27.tgz", + "integrity": "sha512-EIKQs7h5sAsjhPCqN6ggx6cEbs94GK050254TIJySD1bzoM5JTYDwAU1IoVOeTOL6Gm27kYJ51/uuvq1kIlrbw==", + "dependencies": { + "moment": ">= 2.9.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "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/circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true + }, + "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/classnames": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", + "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "dependencies": { + "restore-cursor": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-spinners": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-0.1.2.tgz", + "integrity": "sha1-u3ZNiOGF+54eaiofGXcjGPYF4xw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-truncate": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", + "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", + "dev": true, + "dependencies": { + "slice-ansi": "0.0.4", + "string-width": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "node_modules/clipboard": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.4.tgz", + "integrity": "sha512-Vw26VSLRpJfBofiVaFb/I8PVfdI1OxKcYShe6fm0sP/DtmiWQNCjhM/okTvdCo0G+lMMm1rMYbk4IK4x1X+kgQ==", + "optional": true, + "dependencies": { + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" + } + }, + "node_modules/cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "node_modules/clone-deep": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.3.0.tgz", + "integrity": "sha1-NIxhrpzb4O3+BT2R/0zFIdeQ7eg=", + "dev": true, + "dependencies": { + "for-own": "^1.0.0", + "is-plain-object": "^2.0.1", + "kind-of": "^3.2.2", + "shallow-clone": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clone-deep/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/clone-deep/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/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.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-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/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/comma-separated-tokens": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.7.tgz", + "integrity": "sha512-Jrx3xsP4pPv4AwJUDWY9wOXGtwPXARej6Xd99h4TUGotmf8APuquKMpK+dnD3UgyxK7OEWaisjZz+3b5jtL6xQ==" + }, + "node_modules/commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true + }, + "node_modules/common-tags": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", + "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "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.17", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz", + "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==", + "dependencies": { + "mime-db": ">= 1.40.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.1.tgz", + "integrity": "sha1-7/JgPvwuIs+G810uuTWJ+YdTc9s=", + "dependencies": { + "accepts": "~1.3.4", + "bytes": "3.0.0", + "compressible": "~2.0.11", + "debug": "2.6.9", + "on-headers": "~1.0.1", + "safe-buffer": "5.1.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.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==", + "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/concat-stream/node_modules/readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "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/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.2", + "resolved": "http://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-security-policy-builder": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/content-security-policy-builder/-/content-security-policy-builder-2.1.0.tgz", + "integrity": "sha512-/MtLWhJVvJNkA9dVLAp6fg9LxD2gfI6R2Fi1hPmfjYXSahJJzcfvoeDOxSyp4NvxMuwWv3WMssE9o31DoULHrQ==", + "engines": { + "node": ">=4.0.0" + } + }, + "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==", + "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.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "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=" + }, + "node_modules/cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==", + "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/copy-to-clipboard": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.2.0.tgz", + "integrity": "sha512-eOZERzvCmxS8HWzugj4Uxl8OJxa7T2k1Gi0X5qavwydHIfuSHq2dTD09LOg/XyGq4Zpb5IsR/2OJ5lbOegz78w==", + "dependencies": { + "toggle-selection": "^1.0.6" + } + }, + "node_modules/core-js": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.0.tgz", + "integrity": "sha512-kLRC6ncVpuEW/1kwrOXYX6KQASCVtrh1gQr/UiaVgFlf9WE5Vp+lNe5+h3LuMr5PAucWnnEXwH0nQHRH/gpGtw==" + }, + "node_modules/core-js-compat": { + "version": "3.4.5", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.4.5.tgz", + "integrity": "sha512-rYVvzvKJDKoefdAC+q6VP63vp5hMmeVONCi9pVUbU1qRrtVrmAk/nPhnRg+i+XFd775m1hpG2Yd5RY3X45ccuw==", + "dev": true, + "dependencies": { + "browserslist": "^4.7.3", + "semver": "^6.3.0" + } + }, + "node_modules/core-js-compat/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/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=" + }, + "node_modules/create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "http://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": "http://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/create-react-class": { + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.6.2.tgz", + "integrity": "sha1-zx7RXxKq1/FO9fLf4F5sQvke8Co=", + "dev": true, + "dependencies": { + "fbjs": "^0.8.9", + "loose-envify": "^1.3.1", + "object-assign": "^4.1.1" + } + }, + "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-loader": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-2.1.1.tgz", + "integrity": "sha512-OcKJU/lt232vl1P9EEDamhoO9iKY3tIjY5GU+XDLblAykTdgs6Ux9P1hTHve8nFKy5KPpOXOsVI/hIwi3841+w==", + "dev": true, + "dependencies": { + "camelcase": "^5.2.0", + "icss-utils": "^4.1.0", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.14", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^2.0.6", + "postcss-modules-scope": "^2.1.0", + "postcss-modules-values": "^2.0.0", + "postcss-value-parser": "^3.3.0", + "schema-utils": "^1.0.0" + }, + "engines": { + "node": ">= 6.9.0" + } + }, + "node_modules/css-loader/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/css-modules-require-hook": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/css-modules-require-hook/-/css-modules-require-hook-4.2.3.tgz", + "integrity": "sha1-Z5LKQSsV4j5vm+agfc739Xf/kE0=", + "dev": true, + "dependencies": { + "debug": "^2.2.0", + "generic-names": "^1.0.1", + "glob-to-regexp": "^0.3.0", + "icss-replace-symbols": "^1.0.2", + "lodash": "^4.3.0", + "postcss": "^6.0.1", + "postcss-modules-extract-imports": "^1.0.0", + "postcss-modules-local-by-default": "^1.0.1", + "postcss-modules-resolve-imports": "^1.3.0", + "postcss-modules-scope": "^1.0.0", + "postcss-modules-values": "^1.1.1", + "seekout": "^1.0.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/css-modules-require-hook/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/css-modules-require-hook/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/css-modules-require-hook/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/css-modules-require-hook/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/css-modules-require-hook/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/css-modules-require-hook/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/css-modules-require-hook/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-select": { + "version": "1.2.0", + "resolved": "http://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-selector-tokenizer": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz", + "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==", + "dev": true, + "dependencies": { + "cssesc": "^0.1.0", + "fastparse": "^1.1.1", + "regexpu-core": "^1.0.0" + } + }, + "node_modules/css-selector-tokenizer/node_modules/cssesc": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", + "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + } + }, + "node_modules/css-selector-tokenizer/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/css-selector-tokenizer/node_modules/regexpu-core": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", + "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", + "dev": true, + "dependencies": { + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" + } + }, + "node_modules/css-selector-tokenizer/node_modules/regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "node_modules/css-selector-tokenizer/node_modules/regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "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/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": "0.2.37", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", + "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", + "dev": true, + "dependencies": { + "cssom": "0.3.x" + } + }, + "node_modules/csstype": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.9.tgz", + "integrity": "sha512-xz39Sb4+OaTsULgUERcCk+TJj8ylkL4aSVDQiX/ksxbELSqwkgt4d4RD7fovIdgJGSuNYqwZEiVjYY5l0ask+Q==", + "dev": true + }, + "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/cypress": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-3.4.1.tgz", + "integrity": "sha512-1HBS7t9XXzkt6QHbwfirWYty8vzxNMawGj1yI+Fu6C3/VZJ8UtUngMW6layqwYZzLTZV8tiDpdCNBypn78V4Dg==", + "dev": true, + "dependencies": { + "@cypress/listr-verbose-renderer": "0.4.1", + "@cypress/xvfb": "1.2.4", + "arch": "2.1.1", + "bluebird": "3.5.0", + "cachedir": "1.3.0", + "chalk": "2.4.2", + "check-more-types": "2.24.0", + "commander": "2.15.1", + "common-tags": "1.8.0", + "debug": "3.2.6", + "execa": "0.10.0", + "executable": "4.1.1", + "extract-zip": "1.6.7", + "fs-extra": "5.0.0", + "getos": "3.1.1", + "is-ci": "1.2.1", + "is-installed-globally": "0.1.0", + "lazy-ass": "1.6.0", + "listr": "0.12.0", + "lodash": "4.17.15", + "log-symbols": "2.2.0", + "minimist": "1.2.0", + "moment": "2.24.0", + "ramda": "0.24.1", + "request": "2.88.0", + "request-progress": "3.0.0", + "supports-color": "5.5.0", + "tmp": "0.1.0", + "url": "0.11.0", + "yauzl": "2.10.0" + }, + "bin": { + "cypress": "bin/cypress" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/cypress/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/cypress/node_modules/fs-extra": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", + "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "node_modules/cypress/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/cypress/node_modules/moment": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/cypress/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/cypress/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/cypress/node_modules/request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "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.0", + "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.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/cypress/node_modules/safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "dev": true + }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/d3": { + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/d3/-/d3-3.5.17.tgz", + "integrity": "sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g=" + }, + "node_modules/d3-array": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", + "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" + }, + "node_modules/d3-collection": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", + "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" + }, + "node_modules/d3-color": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.0.tgz", + "integrity": "sha512-TzNPeJy2+iEepfiL92LAAB7fvnp/dV2YwANPVHdDWmYMm23qIJBYww3qT8I8C1wXrmrg4UWs7BKc2tKIgyjzHg==" + }, + "node_modules/d3-format": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.2.tgz", + "integrity": "sha512-gco1Ih54PgMsyIXgttLxEhNy/mXxq8+rLnCb5shQk+P5TsiySrwWU5gpB4zen626J4LIwBxHvDChyA8qDm57ww==" + }, + "node_modules/d3-interpolate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz", + "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==", + "dependencies": { + "d3-color": "1" + } + }, + "node_modules/d3-scale": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", + "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==", + "dependencies": { + "d3-array": "^1.2.0", + "d3-collection": "1", + "d3-format": "1", + "d3-interpolate": "1", + "d3-time": "1", + "d3-time-format": "2" + } + }, + "node_modules/d3-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", + "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" + }, + "node_modules/d3-time-format": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.2.2.tgz", + "integrity": "sha512-pweL2Ri2wqMY+wlW/wpkl8T3CUzKAha8S9nmiQlMABab8r5MJN0PD1V4YyRNVaKQfeh4Z0+VO70TLw6ESVOYzw==", + "dependencies": { + "d3-time": "1" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dasherize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dasherize/-/dasherize-2.0.0.tgz", + "integrity": "sha1-bYCcnNDPe7iVLYD8hPoT1H3bEwg=" + }, + "node_modules/date-fns": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", + "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", + "dev": true + }, + "node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "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-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "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/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/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegate": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==", + "optional": true + }, + "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=", + "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=" + }, + "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/diff": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", + "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "http://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/discontinuous-range": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", + "integrity": "sha1-44Mx8IRLukm5qctxx3FYWqsbxlo=", + "dev": true + }, + "node_modules/dns-prefetch-control": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dns-prefetch-control/-/dns-prefetch-control-0.2.0.tgz", + "integrity": "sha512-hvSnros73+qyZXhHFjx2CMLwoj3Fe7eR9EJsFsqmcI1bB2OBWL/+0YzaEaKssCHnj/6crawNnUyw74Gm2EKe+Q==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/doctrine": { + "version": "1.5.0", + "resolved": "http://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "dependencies": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dom-helpers": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", + "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", + "dependencies": { + "@babel/runtime": "^7.1.2" + } + }, + "node_modules/dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "dev": true, + "dependencies": { + "domelementtype": "^1.3.0", + "entities": "^1.1.1" + } + }, + "node_modules/dom-walk": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", + "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=", + "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/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/dont-sniff-mimetype": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/dont-sniff-mimetype/-/dont-sniff-mimetype-1.1.0.tgz", + "integrity": "sha512-ZjI4zqTaxveH2/tTlzS1wFp+7ncxNZaIEWYg3lzZRHkKf5zPT/MnEG6WL0BhHMJUabkh8GeU5NL5j+rEUCb7Ug==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true + }, + "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/duplexify/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/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "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=" + }, + "node_modules/electron-to-chromium": { + "version": "1.3.314", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.314.tgz", + "integrity": "sha512-IKDR/xCxKFhPts7h+VaSXS02Z1mznP3fli1BbXWXeN89i2gCzKraU8qLpEid8YzKcmZdZD3Mly3cn5/lY9xsBQ==", + "dev": true + }, + "node_modules/elegant-spinner": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", + "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/elliptic": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", + "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "dev": true, + "dependencies": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "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/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/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "dev": true, + "dependencies": { + "iconv-lite": "~0.4.13" + } + }, + "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.1.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", + "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", + "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/enhanced-resolve/node_modules/readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "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/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/enzyme": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-3.3.0.tgz", + "integrity": "sha512-l8csyPyLmtxskTz6pX9W8eDOyH1ckEtDttXk/vlFWCjv00SkjTjtoUrogqp4yEvMyneU9dUJoOLnqFoiHb8IHA==", + "dev": true, + "dependencies": { + "cheerio": "^1.0.0-rc.2", + "function.prototype.name": "^1.0.3", + "has": "^1.0.1", + "is-boolean-object": "^1.0.0", + "is-callable": "^1.1.3", + "is-number-object": "^1.0.3", + "is-string": "^1.0.4", + "is-subset": "^0.1.1", + "lodash": "^4.17.4", + "object-inspect": "^1.5.0", + "object-is": "^1.0.1", + "object.assign": "^4.1.0", + "object.entries": "^1.0.4", + "object.values": "^1.0.4", + "raf": "^3.4.0", + "rst-selector-parser": "^2.2.3" + } + }, + "node_modules/enzyme-adapter-react-16": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.7.1.tgz", + "integrity": "sha512-OQXKgfHWyHN3sFu2nKj3mhgRcqIPIJX6aOzq5AHVFES4R9Dw/vCBZFMPyaG81g2AZ5DogVh39P3MMNUbqNLTcw==", + "dev": true, + "dependencies": { + "enzyme-adapter-utils": "^1.9.0", + "function.prototype.name": "^1.1.0", + "object.assign": "^4.1.0", + "object.values": "^1.0.4", + "prop-types": "^15.6.2", + "react-is": "^16.6.1", + "react-test-renderer": "^16.0.0-0" + } + }, + "node_modules/enzyme-adapter-utils": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.12.1.tgz", + "integrity": "sha512-KWiHzSjZaLEoDCOxY8Z1RAbUResbqKN5bZvenPbfKtWorJFVETUw754ebkuCQ3JKm0adx1kF8JaiR+PHPiP47g==", + "dev": true, + "dependencies": { + "airbnb-prop-types": "^2.15.0", + "function.prototype.name": "^1.1.1", + "object.assign": "^4.1.0", + "object.fromentries": "^2.0.1", + "prop-types": "^15.7.2", + "semver": "^5.7.0" + } + }, + "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/error-stack-parser": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-1.3.6.tgz", + "integrity": "sha1-4Oc7k+QXE40c18C3RrGkoUhUwpI=", + "dev": true, + "dependencies": { + "stackframe": "^0.3.1" + } + }, + "node_modules/es-abstract": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.2.tgz", + "integrity": "sha512-jYo/J8XU2emLXl3OLwfwtuFfuF2w6DYPs+xy9ZfVyPkDcrauu6LYrw/q2TyCtrbc/KUdCiC5e9UajRhgNkVopA==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "string.prototype.trimleft": "^2.1.0", + "string.prototype.trimright": "^2.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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/es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "dev": true, + "dependencies": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" + } + }, + "node_modules/es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-symbol": "3.1.1", + "event-emitter": "~0.3.5" + } + }, + "node_modules/es6-set/node_modules/es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "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.12.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.12.0.tgz", + "integrity": "sha512-TuA+EhsanGcme5T3R0L80u4t8CpbXQjegRmf7+FPTJrtCTErXFeelblRgHQa1FofEzqYYJmJ/OqjTwREp9qgmg==", + "dev": true, + "dependencies": { + "esprima": "^3.1.3", + "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/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/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/escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "dev": true, + "dependencies": { + "es6-map": "^0.1.3", + "es6-weak-map": "^2.0.1", + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/eslint": { + "version": "2.13.1", + "resolved": "http://registry.npmjs.org/eslint/-/eslint-2.13.1.tgz", + "integrity": "sha1-5MyPoPAJ+4KaquI4VaKTYL4fbBE=", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "concat-stream": "^1.4.6", + "debug": "^2.1.1", + "doctrine": "^1.2.2", + "es6-map": "^0.1.3", + "escope": "^3.6.0", + "espree": "^3.1.6", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^1.1.1", + "glob": "^7.0.3", + "globals": "^9.2.0", + "ignore": "^3.1.2", + "imurmurhash": "^0.1.4", + "inquirer": "^0.12.0", + "is-my-json-valid": "^2.10.0", + "is-resolvable": "^1.0.0", + "js-yaml": "^3.5.1", + "json-stable-stringify": "^1.0.0", + "levn": "^0.3.0", + "lodash": "^4.0.0", + "mkdirp": "^0.5.0", + "optionator": "^0.8.1", + "path-is-absolute": "^1.0.0", + "path-is-inside": "^1.0.1", + "pluralize": "^1.2.1", + "progress": "^1.1.8", + "require-uncached": "^1.0.2", + "shelljs": "^0.6.0", + "strip-json-comments": "~1.0.1", + "table": "^3.7.8", + "text-table": "~0.2.0", + "user-home": "^2.0.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "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/eslint/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/eslint/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/eslint/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/eslint/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/eslint/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/espree": { + "version": "3.5.4", + "resolved": "http://registry.npmjs.org/espree/-/espree-3.5.4.tgz", + "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", + "dev": true, + "dependencies": { + "acorn": "^5.5.0", + "acorn-jsx": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/espree/node_modules/acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "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==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "dependencies": { + "estraverse": "^4.1.0" + }, + "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=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/event-stream": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", + "dev": true, + "dependencies": { + "duplexer": "~0.1.1", + "from": "~0", + "map-stream": "~0.1.0", + "pause-stream": "0.0.11", + "split": "0.3", + "stream-combiner": "~0.0.4", + "through": "~2.3.1" + } + }, + "node_modules/events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", + "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "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/execa": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", + "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", + "dev": true, + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^3.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": ">=4" + } + }, + "node_modules/executable": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "dev": true, + "dependencies": { + "pify": "^2.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/executable/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/exit-hook": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", + "dev": true, + "engines": { + "node": ">=0.10.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/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/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-ct": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/expect-ct/-/expect-ct-0.2.0.tgz", + "integrity": "sha512-6SK3MG/Bbhm8MsgyJAylg+ucIOU71/FzyFalcfu5nY19dH8y/z0tBJU0wrNBXD4B27EoQtqPF/9wqH0iYAd04g==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/express": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz", + "integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=", + "dependencies": { + "accepts": "~1.3.4", + "array-flatten": "1.1.1", + "body-parser": "1.18.2", + "content-disposition": "0.5.2", + "content-type": "~1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.1", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.1.0", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.2", + "qs": "6.5.1", + "range-parser": "~1.2.0", + "safe-buffer": "5.1.1", + "send": "0.16.1", + "serve-static": "1.13.1", + "setprototypeof": "1.1.0", + "statuses": "~1.3.1", + "type-is": "~1.6.15", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ext": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.3.0.tgz", + "integrity": "sha512-LErT9cIGZZjSvFkyocVXXeYlj7z8xiA+4oQlM9cX4X/Kfc18cefv3Dd9mNKwFuzUJ7neMMAQz1u1r3gBa/6wGg==", + "dev": true, + "dependencies": { + "type": "^2.0.0" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", + "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==", + "dev": true + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "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/extract-zip": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", + "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", + "dev": true, + "dependencies": { + "concat-stream": "1.6.2", + "debug": "2.6.9", + "mkdirp": "0.5.1", + "yauzl": "2.4.1" + }, + "bin": { + "extract-zip": "cli.js" + } + }, + "node_modules/extract-zip/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/extract-zip/node_modules/yauzl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", + "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", + "dev": true, + "dependencies": { + "fd-slicer": "~1.0.1" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "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/fault": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.3.tgz", + "integrity": "sha512-sfFuP4X0hzrbGKjAUNXYvNqsZ5F6ohx/dZ9I0KQud/aiZNwg263r5L9yGB0clvXHCkzXh5W3t7RSHchggYIFmA==", + "dependencies": { + "format": "^0.2.2" + } + }, + "node_modules/fbjs": { + "version": "0.8.17", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz", + "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", + "dev": true, + "dependencies": { + "core-js": "^1.0.0", + "isomorphic-fetch": "^2.1.1", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.18" + } + }, + "node_modules/fbjs/node_modules/core-js": { + "version": "1.2.7", + "resolved": "http://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", + "dev": true + }, + "node_modules/fd-slicer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/feature-policy": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/feature-policy/-/feature-policy-0.3.0.tgz", + "integrity": "sha512-ZtijOTFN7TzCujt1fnNhfWPFPSHeZkesff9AXZj+UEjYBynWNUIYpC87Ve4wHzyexQsImicLu7WsC2LHq7/xrQ==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/figgy-pudding": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", + "dev": true + }, + "node_modules/figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/file-entry-cache": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-1.3.1.tgz", + "integrity": "sha1-RMYepgeuS+nBQC9B9EJwy/4zT/g=", + "dev": true, + "dependencies": { + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/file-saver": { + "version": "1.3.3", + "resolved": "http://registry.npmjs.org/file-saver/-/file-saver-1.3.3.tgz", + "integrity": "sha1-zdTETTqiZOrC9o7BZbx5HDSvEjI=" + }, + "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.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "engines": { + "node": ">= 0.6" + } + }, + "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": "1.3.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", + "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", + "dev": true, + "dependencies": { + "circular-json": "^0.3.1", + "graceful-fs": "^4.1.2", + "rimraf": "~2.6.2", + "write": "^0.2.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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/flush-write-stream/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/follow-redirects": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.1.tgz", + "integrity": "sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg==", + "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/for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "dependencies": { + "for-in": "^1.0.1" + }, + "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=", + "engines": { + "node": "*" + } + }, + "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==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/formatio": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz", + "integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=", + "dev": true, + "dependencies": { + "samsam": "1.x" + } + }, + "node_modules/formidable": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz", + "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==", + "dev": true + }, + "node_modules/forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "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/frameguard": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/frameguard/-/frameguard-3.1.0.tgz", + "integrity": "sha512-TxgSKM+7LTA6sidjOiSZK9wxY0ffMPY3Wta//MqwmX0nZuEHc8QrkV8Fh3ZhMJeiH+Uyh/tcaarImRy8u77O7g==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", + "dev": true + }, + "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/from2/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/front-matter": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-2.1.2.tgz", + "integrity": "sha1-91mDufL0E75ljJPf172M5AePXNs=", + "dev": true, + "dependencies": { + "js-yaml": "^3.4.6" + } + }, + "node_modules/fs-extra": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz", + "integrity": "sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU=", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0" + } + }, + "node_modules/fs-minipass": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.0.0.tgz", + "integrity": "sha512-40Qz+LFXmd9tzYVnnBmZvFfvAADfUA14TXPK1s7IfElJTIZ97rA8w4Kin7Wt5JBrC3ShnnFJO/5vPjPEeJIq9A==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-promise": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fs-promise/-/fs-promise-2.0.3.tgz", + "integrity": "sha1-9k5PhUvPaJqovdy6JokW2z20aFQ=", + "dependencies": { + "any-promise": "^1.3.0", + "fs-extra": "^2.0.0", + "mz": "^2.6.0", + "thenify-all": "^1.6.0" + } + }, + "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-write-stream-atomic/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/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.11", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", + "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", + "bundleDependencies": [ + "abbrev", + "ansi-regex", + "aproba", + "are-we-there-yet", + "balanced-match", + "brace-expansion", + "chownr", + "code-point-at", + "concat-map", + "console-control-strings", + "core-util-is", + "debug", + "deep-extend", + "delegates", + "detect-libc", + "fs-minipass", + "fs.realpath", + "gauge", + "glob", + "has-unicode", + "iconv-lite", + "ignore-walk", + "inflight", + "inherits", + "is-fullwidth-code-point", + "isarray", + "minimatch", + "minimist", + "minipass", + "minizlib", + "mkdirp", + "ms", + "needle", + "node-pre-gyp", + "nopt", + "npm-bundled", + "npm-normalize-package-bin", + "npm-packlist", + "npmlog", + "number-is-nan", + "object-assign", + "once", + "os-homedir", + "os-tmpdir", + "osenv", + "path-is-absolute", + "process-nextick-args", + "rc", + "readable-stream", + "rimraf", + "safe-buffer", + "safer-buffer", + "sax", + "semver", + "set-blocking", + "signal-exit", + "string-width", + "string_decoder", + "strip-ansi", + "strip-json-comments", + "tar", + "util-deprecate", + "wide-align", + "wrappy", + "yallist", + "ini" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1", + "node-pre-gyp": "*" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/fsevents/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==", + "extraneous": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/fsevents/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "extraneous": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "extraneous": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/fsevents/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==", + "extraneous": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "node_modules/fsevents/node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "extraneous": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/fsevents/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==", + "extraneous": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/fsevents/node_modules/chownr": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", + "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==", + "extraneous": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/fsevents/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=", + "extraneous": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/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=", + "extraneous": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/fsevents/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=", + "extraneous": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/fsevents/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=", + "extraneous": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/fsevents/node_modules/debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "extraneous": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/fsevents/node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "extraneous": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/fsevents/node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "extraneous": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/fsevents/node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "extraneous": true, + "inBundle": true, + "license": "Apache-2.0", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/fsevents/node_modules/fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "extraneous": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^2.6.0" + } + }, + "node_modules/fsevents/node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "extraneous": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/fsevents/node_modules/gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "extraneous": true, + "inBundle": true, + "license": "ISC", + "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/fsevents/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "extraneous": true, + "inBundle": true, + "license": "ISC", + "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": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fsevents/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=", + "extraneous": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/fsevents/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==", + "extraneous": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/ignore-walk": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", + "extraneous": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "minimatch": "^3.0.4" + } + }, + "node_modules/fsevents/node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "extraneous": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/fsevents/node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "extraneous": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/fsevents/node_modules/ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "extraneous": true, + "inBundle": true, + "license": "ISC", + "engines": { + "node": "*" + } + }, + "node_modules/fsevents/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=", + "extraneous": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "extraneous": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/fsevents/node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "extraneous": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/fsevents/node_modules/minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "extraneous": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/fsevents/node_modules/minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "extraneous": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "node_modules/fsevents/node_modules/minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "extraneous": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^2.9.0" + } + }, + "node_modules/fsevents/node_modules/mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "extraneous": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "minimist": "0.0.8" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/fsevents/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==", + "extraneous": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/fsevents/node_modules/needle": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz", + "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", + "extraneous": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/fsevents/node_modules/node-pre-gyp": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz", + "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==", + "extraneous": true, + "inBundle": true, + "license": "BSD-3-Clause", + "dependencies": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4.4.2" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/fsevents/node_modules/nopt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "extraneous": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "abbrev": "1", + "osenv": "^0.1.4" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/fsevents/node_modules/npm-bundled": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", + "extraneous": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "node_modules/fsevents/node_modules/npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "extraneous": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/fsevents/node_modules/npm-packlist": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.7.tgz", + "integrity": "sha512-vAj7dIkp5NhieaGZxBJB8fF4R0078rqsmhJcAfXZ6O7JJhjhPK96n5Ry1oZcfLXgfun0GWTZPOxaEyqv8GBykQ==", + "extraneous": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "node_modules/fsevents/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==", + "extraneous": true, + "inBundle": true, + "license": "ISC", + "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/fsevents/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=", + "extraneous": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/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=", + "extraneous": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "extraneous": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/fsevents/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=", + "extraneous": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/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=", + "extraneous": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "extraneous": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "node_modules/fsevents/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=", + "extraneous": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/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==", + "extraneous": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/fsevents/node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "extraneous": true, + "inBundle": true, + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/fsevents/node_modules/rc/node_modules/minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "extraneous": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/fsevents/node_modules/readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "extraneous": true, + "inBundle": true, + "license": "MIT", + "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/fsevents/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "extraneous": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/fsevents/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==", + "extraneous": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/fsevents/node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "extraneous": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/fsevents/node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "extraneous": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/fsevents/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "extraneous": true, + "inBundle": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/fsevents/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=", + "extraneous": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/fsevents/node_modules/signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "extraneous": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/fsevents/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==", + "extraneous": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/fsevents/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "extraneous": true, + "inBundle": true, + "license": "MIT", + "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/fsevents/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=", + "extraneous": true, + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "extraneous": true, + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fsevents/node_modules/tar": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "extraneous": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + }, + "engines": { + "node": ">=4.5" + } + }, + "node_modules/fsevents/node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "extraneous": true, + "inBundle": true, + "license": "MIT" + }, + "node_modules/fsevents/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==", + "extraneous": true, + "inBundle": true, + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2" + } + }, + "node_modules/fsevents/node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "extraneous": true, + "inBundle": true, + "license": "ISC" + }, + "node_modules/fsevents/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "extraneous": true, + "inBundle": true, + "license": "ISC" + }, + "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/function.prototype.name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.1.tgz", + "integrity": "sha512-e1NzkiJuw6xqVH7YSdiW/qDHebcmMhPNe6w+4ZYYEg0VA+LaLzx37RimbPLuonHhYGFGPx1ME2nSi74JiaCr/Q==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1", + "functions-have-names": "^1.1.1", + "is-callable": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.0.tgz", + "integrity": "sha512-zKXyzksTeaCSw5wIX79iCA40YAa6CJMJgNg9wdkU/ERBrIdPSimPICYiLp65lRbSBqtiHql/HZfS2DyI/AH6tQ==", + "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/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/generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "dev": true, + "dependencies": { + "is-property": "^1.0.2" + } + }, + "node_modules/generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, + "dependencies": { + "is-property": "^1.0.0" + } + }, + "node_modules/generic-names": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-1.0.3.tgz", + "integrity": "sha1-LXhqEhruUIh2eWk56OO/+DbCCRc=", + "dev": true, + "dependencies": { + "loader-utils": "^0.2.16" + } + }, + "node_modules/generic-names/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/generic-names/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/generic-names/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/get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true, + "engines": { + "node": "*" + } + }, + "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": "3.0.0", + "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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/getos": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/getos/-/getos-3.1.1.tgz", + "integrity": "sha512-oUP1rnEhAr97rkitiszGP9EgDVYnmchgFzfqRzSkgtfv7ai6tEi7Ko8GgjNXts7VLWEqrTWyhsOKLe5C5b/Zkg==", + "dev": true, + "dependencies": { + "async": "2.6.1" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "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/glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, + "node_modules/global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "dev": true, + "dependencies": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "node_modules/global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "dependencies": { + "ini": "^1.3.4" + }, + "engines": { + "node": ">=4" + } + }, + "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/globule": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", + "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", + "dev": true, + "dependencies": { + "glob": "~7.1.1", + "lodash": "~4.17.10", + "minimatch": "~3.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/gonzales-pe-sl": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/gonzales-pe-sl/-/gonzales-pe-sl-4.2.3.tgz", + "integrity": "sha1-aoaLw4BkXxQf7rBCxvl/zHG1n+Y=", + "dev": true, + "dependencies": { + "minimist": "1.1.x" + }, + "bin": { + "gonzales": "bin/gonzales.js" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/gonzales-pe-sl/node_modules/minimist": { + "version": "1.1.3", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.1.3.tgz", + "integrity": "sha1-O+39kaktOQFvz6ocaB6Pqhoe/ag=", + "dev": true + }, + "node_modules/good-listener": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", + "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", + "optional": true, + "dependencies": { + "delegate": "^3.1.2" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" + }, + "node_modules/growl": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", + "dev": true, + "engines": { + "node": ">=4.x" + } + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dependencies": { + "ajv": "^6.5.5", + "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-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-own-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-own-prop/-/has-own-prop-2.0.0.tgz", + "integrity": "sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "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/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/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.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "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/hast-util-parse-selector": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.3.tgz", + "integrity": "sha512-nxbeqjQNxsvo/uYYAw9kij6td05YVUlf1qti09rVfbWSLT5H6wo3c+USIwX6nzXWk5kFZzXnEqO82856r0aM2Q==" + }, + "node_modules/hastscript": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-5.1.1.tgz", + "integrity": "sha512-xHo1Hkcqd0LlWNuDL3/BxwhgAGp3d7uEvCMgCTrBY+zsOooPPH+8KAvW8PCgl+GB8H3H44nfSaF0A4BQ+4xlYg==", + "dependencies": { + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + } + }, + "node_modules/he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/helmet": { + "version": "3.21.2", + "resolved": "https://registry.npmjs.org/helmet/-/helmet-3.21.2.tgz", + "integrity": "sha512-okUo+MeWgg00cKB8Csblu8EXgcIoDyb5ZS/3u0W4spCimeVuCUvVZ6Vj3O2VJ1Sxpyb8jCDvzu0L1KKT11pkIg==", + "dependencies": { + "depd": "2.0.0", + "dns-prefetch-control": "0.2.0", + "dont-sniff-mimetype": "1.1.0", + "expect-ct": "0.2.0", + "feature-policy": "0.3.0", + "frameguard": "3.1.0", + "helmet-crossdomain": "0.4.0", + "helmet-csp": "2.9.4", + "hide-powered-by": "1.1.0", + "hpkp": "2.0.0", + "hsts": "2.2.0", + "ienoopen": "1.1.0", + "nocache": "2.1.0", + "referrer-policy": "1.2.0", + "x-xss-protection": "1.3.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/helmet-crossdomain": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/helmet-crossdomain/-/helmet-crossdomain-0.4.0.tgz", + "integrity": "sha512-AB4DTykRw3HCOxovD1nPR16hllrVImeFp5VBV9/twj66lJ2nU75DP8FPL0/Jp4jj79JhTfG+pFI2MD02kWJ+fA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/helmet-csp": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/helmet-csp/-/helmet-csp-2.9.4.tgz", + "integrity": "sha512-qUgGx8+yk7Xl8XFEGI4MFu1oNmulxhQVTlV8HP8tV3tpfslCs30OZz/9uQqsWPvDISiu/NwrrCowsZBhFADYqg==", + "dependencies": { + "bowser": "^2.7.0", + "camelize": "1.0.0", + "content-security-policy-builder": "2.1.0", + "dasherize": "2.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/helmet/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/hide-powered-by": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hide-powered-by/-/hide-powered-by-1.1.0.tgz", + "integrity": "sha512-Io1zA2yOA1YJslkr+AJlWSf2yWFkKjvkcL9Ni1XSUqnGLr/qRQe2UI3Cn/J9MsJht7yEVCe0SscY1HgVMujbgg==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/highlight.js": { + "version": "9.12.0", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.12.0.tgz", + "integrity": "sha1-5tnb5Xy+/mB1HwKvM2GVhwyQwB4=", + "engines": { + "node": "*" + } + }, + "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.5", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz", + "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==", + "dev": true + }, + "node_modules/hpkp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hpkp/-/hpkp-2.0.0.tgz", + "integrity": "sha1-EOFCJk52IVpdMMROxD3mTe5tFnI=" + }, + "node_modules/hsts": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/hsts/-/hsts-2.2.0.tgz", + "integrity": "sha512-ToaTnQ2TbJkochoVcdXYm4HOCliNozlviNsg+X2XQLQvZNI/kCHR9rZxVYpJB3UPcHz80PgxRyWQ7PdU1r+VBQ==", + "dependencies": { + "depd": "2.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/hsts/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "dev": true, + "engines": [ + "node >= 0.4.0" + ] + }, + "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/http-errors": { + "version": "1.6.3", + "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "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.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", + "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": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.14" + }, + "engines": { + "node": ">= 6" + } + }, + "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/ienoopen": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ienoopen/-/ienoopen-1.1.0.tgz", + "integrity": "sha512-MFs36e/ca6ohEKtinTJ5VvAJ6oDRAYFdYXweUnGY9L9vcoqFOU4n2ZhmJ0C4z/cwGZ3YIQRSB3XZ1+ghZkY5NQ==", + "engines": { + "node": ">=4.0.0" + } + }, + "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": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "node_modules/ignore-styles": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ignore-styles/-/ignore-styles-5.0.1.tgz", + "integrity": "sha1-tJ7yJ0va/NikiAqWa/440aC/RnE=", + "dev": true + }, + "node_modules/immutable": { + "version": "4.0.0-rc.9", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0-rc.9.tgz", + "integrity": "sha512-uw4u9Jy3G2Y1qkIFtEGy9NgJxFJT1l3HKgeSFHfrvy91T8W54cJoQ+qK3fTwhil8XkEHuc2S+MI+fbD0vKObDA==" + }, + "node_modules/immutable-class": { + "version": "0.9.8", + "resolved": "https://registry.npmjs.org/immutable-class/-/immutable-class-0.9.8.tgz", + "integrity": "sha512-zud6SunU4SX5XzNAXSfrAcG8LK8hpw4twTojzAIH9P2lFFGsVCUcBXeDM2tCDjT8O6C+TvQ2WTFbijgEYSjz8g==", + "dependencies": { + "has-own-prop": "^2.0.0", + "tslib": "^1.10.0" + } + }, + "node_modules/immutable-class-tester": { + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/immutable-class-tester/-/immutable-class-tester-0.5.12.tgz", + "integrity": "sha512-bClP/uHCdLDA+/yHA0kQLf+f4ytjgz0uGEKYAC11b9VFjJK7x2zKuy7Ibf1kSKdc69t8eYa6Yo+Mt+7vsYPYsQ==", + "dev": true, + "dependencies": { + "chai": "4.1.2", + "has-own-prop": "1.0.0" + } + }, + "node_modules/immutable-class-tester/node_modules/chai": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", + "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", + "dev": true, + "dependencies": { + "assertion-error": "^1.0.1", + "check-error": "^1.0.1", + "deep-eql": "^3.0.0", + "get-func-name": "^2.0.0", + "pathval": "^1.0.0", + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/immutable-class-tester/node_modules/has-own-prop": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-own-prop/-/has-own-prop-1.0.0.tgz", + "integrity": "sha1-e14EUF7lWJa6MuUBgJi0gaL4oOU=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "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/inquirer": { + "version": "0.12.0", + "resolved": "http://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", + "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", + "dev": true, + "dependencies": { + "ansi-escapes": "^1.1.0", + "ansi-regex": "^2.0.0", + "chalk": "^1.0.0", + "cli-cursor": "^1.0.1", + "cli-width": "^2.0.0", + "figures": "^1.3.5", + "lodash": "^4.3.0", + "readline2": "^1.0.1", + "run-async": "^0.1.0", + "rx-lite": "^3.1.2", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.0", + "through": "^2.3.6" + } + }, + "node_modules/inquirer/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/inquirer/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/inquirer/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/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/invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ip-address": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-6.1.0.tgz", + "integrity": "sha512-u9YYtb1p2fWSbzpKmZ/b3QXWA+diRYPxc2c4y5lFB/MMk5WZ7wNZv8S3CFcIGVJ5XtlaCAl/FQy/D3eQ2XtdOA==", + "dependencies": { + "jsbn": "1.1.0", + "lodash": "^4.17.15", + "sprintf-js": "1.1.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/ip-address/node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha1-sBMHyym2GKHtJux56RH4A8TaAEA=" + }, + "node_modules/ip-address/node_modules/sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", + "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "http://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/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-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-alphabetical": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.3.tgz", + "integrity": "sha512-eEMa6MKpHFzw38eKm56iNNi6GJ7lf6aLLio7Kr23sJPAECscgRtZvOBYybejWDQ2bM949Y++61PY+udzj5QMLA==" + }, + "node_modules/is-alphanumerical": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.3.tgz", + "integrity": "sha512-A1IGAPO5AW9vSh7omxIlOGwIqEvpW/TA+DksVOPM5ODuxKlZS09+TEM1E3275lJqO2oJ38vDpeAL3DCIiHE6eA==", + "dependencies": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + } + }, + "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-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.0.0", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.0.tgz", + "integrity": "sha1-mPiygDBoQhmpXzdc+9iM40Bd/5M=", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "dependencies": { + "ci-info": "^1.5.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "http://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/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-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.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-decimal": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.3.tgz", + "integrity": "sha512-bvLSwoDg2q6Gf+E2LEPiklHZxxiSi3XAh4Mav65mKqTfCO1HM3uBs24TjEH8iJX3bbDdLXKJXBTmGzuTUuAEjQ==" + }, + "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-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.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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/is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.3.tgz", + "integrity": "sha512-zxQ9//Q3D/34poZf8fiy3m3XVpbQc7ren15iKqrTtLPwkPD/t3Scy9Imp63FujULGxuK0ZlCwoo5xNpktFgbOA==" + }, + "node_modules/is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "dev": true, + "dependencies": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-my-ip-valid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", + "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==", + "dev": true + }, + "node_modules/is-my-json-valid": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.20.0.tgz", + "integrity": "sha512-XTHBZSIIxNsIsZXg7XB5l8z/OBFosl1Wao4tXLpeC7eKU4Vm/kdop2azkPqULwnfGQjmeDIyey9g7afMMtdWAA==", + "dev": true, + "dependencies": { + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "is-my-ip-valid": "^1.0.0", + "jsonpointer": "^4.0.0", + "xtend": "^4.0.0" + } + }, + "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.3", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.3.tgz", + "integrity": "sha1-8mWrian0RQNO9q/xWo8AsA9VF5k=", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-number/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-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-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "dependencies": { + "path-is-inside": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "node_modules/is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true + }, + "node_modules/is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "dependencies": { + "has": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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.4", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.4.tgz", + "integrity": "sha1-zDqbaYV9Yh6WNyWiTK7shzuCbmQ=", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-subset": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", + "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", + "dev": true + }, + "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=" + }, + "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=" + }, + "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/isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "dev": true, + "dependencies": { + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=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=" + }, + "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/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-levenshtein": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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==" + }, + "node_modules/js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "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=" + }, + "node_modules/jsdom": { + "version": "9.4.2", + "resolved": "http://registry.npmjs.org/jsdom/-/jsdom-9.4.2.tgz", + "integrity": "sha1-/3xczjq4ZX/3b2g0CZ8y4H12Z/s=", + "dev": true, + "dependencies": { + "abab": "^1.0.0", + "acorn": "^2.4.0", + "acorn-globals": "^1.0.4", + "array-equal": "^1.0.0", + "cssom": ">= 0.3.0 < 0.4.0", + "cssstyle": ">= 0.2.36 < 0.3.0", + "escodegen": "^1.6.1", + "iconv-lite": "^0.4.13", + "nwmatcher": ">= 1.3.7 < 2.0.0", + "parse5": "^1.5.1", + "request": "^2.55.0", + "sax": "^1.1.4", + "symbol-tree": ">= 3.1.0 < 4.0.0", + "tough-cookie": "^2.3.1", + "webidl-conversions": "^3.0.1", + "whatwg-url": "^3.0.0", + "xml-name-validator": ">= 2.0.1 < 3.0.0" + } + }, + "node_modules/jsdom/node_modules/parse5": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", + "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=", + "dev": true + }, + "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-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "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==" + }, + "node_modules/json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "dependencies": { + "jsonify": "~0.0.0" + } + }, + "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=" + }, + "node_modules/json5": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", + "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "2.4.0", + "resolved": "http://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "dependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "node_modules/jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "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/just-extend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.0.2.tgz", + "integrity": "sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw==", + "dev": true + }, + "node_modules/kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/known-css-properties": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.3.0.tgz", + "integrity": "sha512-QMQcnKAiQccfQTqtBh/qwquGZ2XK/DXND1jrcN9M8gMMy99Gwla7GQjndVUsEqIaRyP6bsFRuhwRj5poafBGJQ==", + "dev": true + }, + "node_modules/lazy-ass": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", + "integrity": "sha1-eZllXoZGwX8In90YfRUNMyTVRRM=", + "dev": true, + "engines": { + "node": "> 0.8" + } + }, + "node_modules/lazy-cache": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", + "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "dependencies": { + "invert-kv": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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/listr": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/listr/-/listr-0.12.0.tgz", + "integrity": "sha1-a84sD1YD+klYDqF81qAMwOX6RRo=", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "cli-truncate": "^0.2.1", + "figures": "^1.7.0", + "indent-string": "^2.1.0", + "is-promise": "^2.1.0", + "is-stream": "^1.1.0", + "listr-silent-renderer": "^1.1.1", + "listr-update-renderer": "^0.2.0", + "listr-verbose-renderer": "^0.4.0", + "log-symbols": "^1.0.2", + "log-update": "^1.0.2", + "ora": "^0.2.3", + "p-map": "^1.1.1", + "rxjs": "^5.0.0-beta.11", + "stream-to-observable": "^0.1.0", + "strip-ansi": "^3.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/listr-silent-renderer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", + "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/listr-update-renderer": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.2.0.tgz", + "integrity": "sha1-yoDhd5tOcCZoB+ju0a1qvjmFUPk=", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "cli-truncate": "^0.2.1", + "elegant-spinner": "^1.0.1", + "figures": "^1.7.0", + "indent-string": "^3.0.0", + "log-symbols": "^1.0.2", + "log-update": "^1.0.2", + "strip-ansi": "^3.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/listr-update-renderer/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/listr-update-renderer/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/listr-update-renderer/node_modules/indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/listr-update-renderer/node_modules/log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "dev": true, + "dependencies": { + "chalk": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/listr-update-renderer/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/listr-verbose-renderer": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz", + "integrity": "sha1-ggb0z21S3cWCfl/RSYng6WWTOjU=", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "cli-cursor": "^1.0.2", + "date-fns": "^1.27.2", + "figures": "^1.7.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/listr-verbose-renderer/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/listr-verbose-renderer/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/listr-verbose-renderer/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/listr/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/listr/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/listr/node_modules/log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "dev": true, + "dependencies": { + "chalk": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/listr/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/load-json-file": { + "version": "1.1.0", + "resolved": "http://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/load-json-file/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/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.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^2.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.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "node_modules/lodash.capitalize": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", + "integrity": "sha1-+CbJtOKoUR2E46yinbBeGk87cqk=", + "dev": true + }, + "node_modules/lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, + "node_modules/lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=", + "dev": true + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=", + "dev": true + }, + "node_modules/lodash.tail": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz", + "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=", + "dev": true + }, + "node_modules/log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "dependencies": { + "chalk": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-update": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-1.0.2.tgz", + "integrity": "sha1-GZKfZMQJPS0ucHWh2tivWcKWuNE=", + "dev": true, + "dependencies": { + "ansi-escapes": "^1.0.0", + "cli-cursor": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lolex": { + "version": "2.7.5", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.7.5.tgz", + "integrity": "sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q==", + "dev": true + }, + "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==", + "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/lowlight": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.9.2.tgz", + "integrity": "sha512-Ek18ElVCf/wF/jEm1b92gTnigh94CtBNWiZ2ad+vTgW7cTmQxUY3I98BjHK68gZAJEWmybGBZgx9qv3QxLQB/Q==", + "dependencies": { + "fault": "^1.0.2", + "highlight.js": "~9.12.0" + } + }, + "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/lz-string": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", + "integrity": "sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY=", + "bin": { + "lz-string": "bin/bin.js" + } + }, + "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/make-error": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", + "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "dev": true + }, + "node_modules/mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", + "dev": true + }, + "node_modules/map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "dependencies": { + "p-defer": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", + "dev": true + }, + "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/marked": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.7.0.tgz", + "integrity": "sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg==", + "bin": { + "marked": "bin/marked" + }, + "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/md5.js/node_modules/safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "dev": true + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "dependencies": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/memoize-one": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.1.1.tgz", + "integrity": "sha512-HKeeBpWvqiVJD57ZUAsJNm71eHTykffzcLZVYWiVfQeI1rJtuEaS7hQiEpWfVVk18donPwJEcFKIkCmPJNOhHA==", + "dev": true + }, + "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/memory-fs/node_modules/readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "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/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": "http://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/merge": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", + "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==", + "dev": true + }, + "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=" + }, + "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/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "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/mime": { + "version": "2.3.1", + "resolved": "http://registry.npmjs.org/mime/-/mime-2.3.1.tgz", + "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.42.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.42.0.tgz", + "integrity": "sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.25", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.25.tgz", + "integrity": "sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg==", + "dependencies": { + "mime-db": "1.42.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "dev": true, + "dependencies": { + "dom-walk": "^0.1.0" + } + }, + "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.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "node_modules/minipass": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", + "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz", + "integrity": "sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass/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/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/mixin-object": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", + "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", + "dev": true, + "dependencies": { + "for-in": "^0.1.3", + "is-extendable": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-object/node_modules/for-in": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", + "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.1", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "dependencies": { + "minimist": "0.0.8" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mkdirp/node_modules/minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "node_modules/mocha": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", + "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", + "dev": true, + "dependencies": { + "browser-stdout": "1.3.0", + "commander": "2.11.0", + "debug": "3.1.0", + "diff": "3.3.1", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.3", + "he": "1.1.1", + "mkdirp": "0.5.1", + "supports-color": "4.4.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/mocha/node_modules/commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true + }, + "node_modules/mocha/node_modules/glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "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/mocha/node_modules/has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "dev": true, + "dependencies": { + "has-flag": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/moment": { + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.20.1.tgz", + "integrity": "sha512-Yh9y73JRljxW5QxN08Fner68eFLxM5ynNOAw2LbIB1YAGeQzZT8QFSUvkAz609Zf+IHhhaUxqZK8dG3W/+HEvg==", + "engines": { + "node": "*" + } + }, + "node_modules/moment-timezone": { + "version": "0.5.27", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.27.tgz", + "integrity": "sha512-EIKQs7h5sAsjhPCqN6ggx6cEbs94GK050254TIJySD1bzoM5JTYDwAU1IoVOeTOL6Gm27kYJ51/uuvq1kIlrbw==", + "dependencies": { + "moment": ">= 2.9.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/moo": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/moo/-/moo-0.4.3.tgz", + "integrity": "sha512-gFD2xGCl8YFgGHsqJ9NKRVdwlioeW3mI1iqfLNYQOv0+6JRwG58Zk9DIGQgyIaffSYaO1xsKnMaYzzNr1KyIAw==", + "dev": true + }, + "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=" + }, + "node_modules/mute-stream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", + "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", + "dev": true + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "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/nearley": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.19.0.tgz", + "integrity": "sha512-2v52FTw7RPqieZr3Gth1luAXZR7Je6q3KaDHY5bjl/paDUdMu35fZ8ICNgiYJRr3tf3NMvIQQR1r27AvEr9CRA==", + "dev": true, + "dependencies": { + "commander": "^2.19.0", + "moo": "^0.4.3", + "railroad-diagrams": "^1.0.0", + "randexp": "0.4.6", + "semver": "^5.4.1" + }, + "bin": { + "nearley-railroad": "bin/nearley-railroad.js", + "nearley-test": "bin/nearley-test.js", + "nearley-unparse": "bin/nearley-unparse.js", + "nearleyc": "bin/nearleyc.js" + } + }, + "node_modules/nearley/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/negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, + "node_modules/next-tick": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "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/nise": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.2.tgz", + "integrity": "sha512-/6RhOUlicRCbE9s+94qCUsyE+pKlVJ5AhIv+jEE7ESKwnbXqulKZ1FYU+XAtHHWE9TinYvAxDUJAb912PwPoWA==", + "dev": true, + "dependencies": { + "@sinonjs/formatio": "^3.2.1", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "lolex": "^4.1.0", + "path-to-regexp": "^1.7.0" + } + }, + "node_modules/nise/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "node_modules/nise/node_modules/lolex": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-4.2.0.tgz", + "integrity": "sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg==", + "dev": true + }, + "node_modules/nise/node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/nocache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/nocache/-/nocache-2.1.0.tgz", + "integrity": "sha512-0L9FvHG3nfnnmaEQPjT9xhfN4ISk0A8/2j4M37Np4mcDesJjHgEUfgPhdCyZuFI954tjokaIj/A3NdpFNdEh4Q==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/nock": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/nock/-/nock-11.0.0.tgz", + "integrity": "sha512-lrlqTP3Ii8pT/j86F6tR2kRPUPA/aMWQ8TADzvLLDsZtqXlPdasKbg4G86bsnXUfM5yMlDIs9gIe/i7ZtPmCoA==", + "dev": true, + "dependencies": { + "chai": "^4.1.2", + "debug": "^4.1.0", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.13", + "mkdirp": "^0.5.0", + "propagate": "^2.0.0" + }, + "engines": { + "node": ">= 8.0" + } + }, + "node_modules/nock/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nock/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/node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "dev": true, + "dependencies": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + }, + "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/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/node-gyp/node_modules/semver": { + "version": "5.3.0", + "resolved": "http://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "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-libs-browser/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/node-libs-browser/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/node-releases": { + "version": "1.1.41", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.41.tgz", + "integrity": "sha512-+IctMa7wIs8Cfsa8iYzeaLTFwv5Y4r5jZud+4AnfymzeEXKBCavFX0KBgzVaPVqf0ywa6PrO8/b+bPqdwjGBSg==", + "dev": true, + "dependencies": { + "semver": "^6.3.0" + } + }, + "node_modules/node-releases/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/node-sass": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.13.1.tgz", + "integrity": "sha512-TTWFx+ZhyDx1Biiez2nB0L3YrCZ/8oHagaDalbuBSlqXgUPsdkUSzJsVxeDO9LtPB49+Fh3WQl3slABo6AotNw==", + "dev": 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.4", + "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/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/node-sass/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/node-sass/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/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/node-sass/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/node-spawn-server": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/node-spawn-server/-/node-spawn-server-1.0.1.tgz", + "integrity": "sha1-Bi/myOvIdY7oJk7qoYqbAGzm7Lk=" + }, + "node_modules/nopt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "dependencies": { + "abbrev": "1", + "osenv": "^0.1.4" + }, + "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/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-all/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/npm-run-all/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/npm-run-all/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/npm-run-all/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/npm-run-all/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/npm-run-all/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/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/numbro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/numbro/-/numbro-2.1.0.tgz", + "integrity": "sha1-YYrG5LLzLy5iMZDOSwX0yLCcMgc=", + "dependencies": { + "bignumber.js": "^4.0.4" + }, + "engines": { + "node": "*" + } + }, + "node_modules/nwmatcher": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz", + "integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==", + "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==", + "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=", + "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/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/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-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + }, + "node_modules/object-is": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz", + "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=", + "dev": true, + "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.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.entries": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz", + "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.1.tgz", + "integrity": "sha512-PUQv8Hbg3j2QX0IQYv3iAGCbGcu4yY4KQ92/dhA4sFSixBmSmp13UpDLs6jGK8rBtbmhNNIK99LD2k293jpiGA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.15.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz", + "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "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==", + "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/onetime": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true, + "engines": { + "node": ">=0.10.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/ora": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/ora/-/ora-0.2.3.tgz", + "integrity": "sha1-N1J9Igrc1Tw5tzVx11QVbV22V6Q=", + "dev": true, + "dependencies": { + "chalk": "^1.1.1", + "cli-cursor": "^1.0.2", + "cli-spinners": "^0.1.2", + "object-assign": "^4.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ora/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/ora/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/ora/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/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": "http://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-locale": { + "version": "1.4.0", + "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "dependencies": { + "lcid": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "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==", + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "node_modules/p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true, + "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-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-limit": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", + "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", + "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": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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.10", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", + "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/parallel-transform/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/parse-asn1": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "dev": true, + "dependencies": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/parse-entities": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz", + "integrity": "sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==", + "dependencies": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + } + }, + "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/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": "3.0.3", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", + "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/parser-toolkit": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parser-toolkit/-/parser-toolkit-0.0.5.tgz", + "integrity": "sha1-7EthcpyGMYtW6pcb+6azxnLWLAE=" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "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": "http://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=" + }, + "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/path-type/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/pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "dev": true, + "dependencies": { + "through": "~2.3" + } + }, + "node_modules/pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "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/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "node_modules/picomatch": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.1.1.tgz", + "integrity": "sha512-OYMyqkKzK7blWO/+XZYP6w8hH0LDvkBvdvKukti+7kqYFCiEAk+gI3DWnryapc0Dau05ugGTy0foQ6mqn4AHYA==", + "dev": true, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/pidtree": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.0.tgz", + "integrity": "sha512-9CT4NFlDcosssyg8KVFltgokyKZIFjoBxw8CTGy+5F38Y1eQWrt8tRayiUOXE+zVKQnYu5BR8JjCtvK3BcnBhg==", + "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/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/pluralize": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", + "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", + "dev": true + }, + "node_modules/plywood": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/plywood/-/plywood-0.21.2.tgz", + "integrity": "sha512-DO2VlsIp6sCoVWPUCsGMNUAxAH0Zk5NcHPyTJrbgcBURaR3ExH3KgM3m4xYI4XWZcRoUWxmSnFXXJb3KS8+Y7Q==", + "dependencies": { + "chronoshift": "^0.9.4", + "druid.d.ts": "^0.12.1", + "has-own-prop": "^1.0.1", + "immutable-class": "^0.9.4", + "moment-timezone": "^0.5.26", + "plywood-base-api": "^0.2.8", + "readable-stream": "^3.0.3", + "stream-to-array": "^2.3.0", + "tslib": "^1.10.0" + } + }, + "node_modules/plywood-base-api": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/plywood-base-api/-/plywood-base-api-0.2.8.tgz", + "integrity": "sha512-4ypDkMcXi57G11g6rM8VLs4juL7Gr52f+IE6BgYjjObcKn/ytHTYetg3puadUcum5x9cJIvaiDW2NmIjZuL/1g==", + "dependencies": { + "readable-stream": "^2.3.3" + } + }, + "node_modules/plywood-base-api/node_modules/readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "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/plywood-druid-requester": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/plywood-druid-requester/-/plywood-druid-requester-2.6.1.tgz", + "integrity": "sha512-qtKsJz4vg8NK0H6GskVUtBJHW6UPcrGWhOsoQtjDsOQI+ksKszVq0q3Of7P40toJoGTWNaqaAyQCPMa+oYfjZQ==", + "dependencies": { + "concat-stream": "~1.6.2", + "has-own-prop": "~1.0.1", + "plywood-base-api": "~0.2.8", + "readable-stream": "~3.0.3", + "request": "~2.88.0", + "request-promise-native": "~1.0.5", + "socks5-http-client": "~1.0.4", + "socks5-https-client": "~1.2.1", + "stream-json": "~0.6.1", + "tslib": "~1.9.3" + } + }, + "node_modules/plywood-druid-requester/node_modules/has-own-prop": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-own-prop/-/has-own-prop-1.0.1.tgz", + "integrity": "sha512-ZYvbzPe2HdCr1vWrmjZPajdPPfitAqctTZl4KW/UTmJv4S2An40pApQGT5c4NUaC3Nlc+lM+RJDLWu+Jed/hRw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/plywood-druid-requester/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==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/plywood-druid-requester/node_modules/readable-stream": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.0.6.tgz", + "integrity": "sha512-9E1oLoOWfhSXHGv6QlwXJim7uNzd9EVlWK+21tCU9Ju/kR0/p2AZYPz4qSchgO8PlLIH4FpZYfzwS+rEksZjIg==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/plywood-druid-requester/node_modules/request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "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.0", + "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.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/plywood-druid-requester/node_modules/safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + }, + "node_modules/plywood-druid-requester/node_modules/tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + }, + "node_modules/plywood/node_modules/druid.d.ts": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/druid.d.ts/-/druid.d.ts-0.12.1.tgz", + "integrity": "sha512-DokhXN0N5fSMPChO2D14wXbZOUX2soq+W/6U6W0XUfKj7o7A1Fh+zV5wSiD3MLvMP/aB6N1D4L0cGpCxDI4NUg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/plywood/node_modules/has-own-prop": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-own-prop/-/has-own-prop-1.0.1.tgz", + "integrity": "sha512-ZYvbzPe2HdCr1vWrmjZPajdPPfitAqctTZl4KW/UTmJv4S2An40pApQGT5c4NUaC3Nlc+lM+RJDLWu+Jed/hRw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/plywood/node_modules/moment-timezone": { + "version": "0.5.27", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.27.tgz", + "integrity": "sha512-EIKQs7h5sAsjhPCqN6ggx6cEbs94GK050254TIJySD1bzoM5JTYDwAU1IoVOeTOL6Gm27kYJ51/uuvq1kIlrbw==", + "dependencies": { + "moment": ">= 2.9.0" + }, + "engines": { + "node": "*" + } + }, + "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": "7.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.23.tgz", + "integrity": "sha512-hOlMf3ouRIFXD+j2VJecwssTwbvsPGJVMzupptg+85WA+i7MwyrydmQAgY3R+m0Bc0exunhbJmijy8u8+vufuQ==", + "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-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "dev": true, + "dependencies": { + "postcss": "^7.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-2.0.6.tgz", + "integrity": "sha512-oLUV5YNkeIBa0yQl7EYnxMgy4N6noxmiwZStaEJUSe2xPMcdNc8WmBQuQCx18H5psYbVxz8zoHk0RAAYZXP9gA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0", + "postcss-value-parser": "^3.3.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-modules-resolve-imports": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/postcss-modules-resolve-imports/-/postcss-modules-resolve-imports-1.3.0.tgz", + "integrity": "sha1-OY0wALla6WlCDN9M2D+oBn8cXq4=", + "dev": true, + "dependencies": { + "css-selector-tokenizer": "^0.7.0", + "icss-utils": "^3.0.1", + "minimist": "^1.2.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/postcss-modules-resolve-imports/node_modules/icss-utils": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-3.0.1.tgz", + "integrity": "sha1-7nDTroysOMa+XtkehRsn7tNDrQ8=", + "dev": true, + "dependencies": { + "postcss": "^6.0.2" + } + }, + "node_modules/postcss-modules-resolve-imports/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-modules-resolve-imports/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-modules-scope": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.1.1.tgz", + "integrity": "sha512-OXRUPecnHCg8b9xWvldG/jUpRIGPNRka0r4D4j0ESUU2/5IOnpsjfPPmDprM3Ih8CgZ8FXjWqaniK5v4rWt3oQ==", + "dev": true, + "dependencies": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-modules-values": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-2.0.0.tgz", + "integrity": "sha512-Ki7JZa7ff1N3EIMlPnGTZfUMe69FFwiQPnVSXC9mnn3jozCRBYIxiZd44yJOV2AmabOo4qFf8s0dC/+lweG7+w==", + "dev": true, + "dependencies": { + "icss-replace-symbols": "^1.1.0", + "postcss": "^7.0.6" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", + "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "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/postcss/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/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/prismjs": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.17.1.tgz", + "integrity": "sha512-PrEDJAFdUGbOP6xK/UsfkC5ghJsPJviKgnQOoxaDbBjwc8op68Quupwt1DeAFoG8GImPhiKXAvvsH7wDSLsu1Q==", + "optionalDependencies": { + "clipboard": "^2.0.0" + } + }, + "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==" + }, + "node_modules/progress": { + "version": "1.1.8", + "resolved": "http://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "dependencies": { + "asap": "~2.0.3" + } + }, + "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/prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "node_modules/prop-types-exact": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/prop-types-exact/-/prop-types-exact-1.2.0.tgz", + "integrity": "sha512-K+Tk3Kd9V0odiXFP9fwDHUYRyvK3Nun3GVyPapSIs5OBkITAm15W0CPFD/YKTkMUAbc0b9CUwRQp2ybiBIq+eA==", + "dev": true, + "dependencies": { + "has": "^1.0.3", + "object.assign": "^4.1.0", + "reflect.ownkeys": "^0.2.0" + } + }, + "node_modules/propagate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz", + "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/property-information": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.3.0.tgz", + "integrity": "sha512-IslotQn1hBCZDY7SaJ3zmCjVea219VTwmOk6Pu3z9haU9m4+T8GwaDubur+6NMHEU+Fjs/6/p66z6QULPkcL1w==", + "dependencies": { + "xtend": "^4.0.1" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", + "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", + "dependencies": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.0" + }, + "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/ps-tree": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz", + "integrity": "sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==", + "dev": true, + "dependencies": { + "event-stream": "=3.3.4" + }, + "bin": { + "ps-tree": "bin/ps-tree.js" + }, + "engines": { + "node": ">= 0.10" + } + }, + "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.4.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz", + "integrity": "sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==" + }, + "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/safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "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/raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "dev": true, + "dependencies": { + "performance-now": "^2.1.0" + } + }, + "node_modules/railroad-diagrams": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", + "integrity": "sha1-635iZ1SN3t+4mcG5Dlc3RVnN234=", + "dev": true + }, + "node_modules/ramda": { + "version": "0.24.1", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.24.1.tgz", + "integrity": "sha1-w7d1UZfzW43DUCIoJixMkd22uFc=", + "dev": true + }, + "node_modules/randexp": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", + "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", + "dev": true, + "dependencies": { + "discontinuous-range": "1.0.0", + "ret": "~0.1.10" + }, + "engines": { + "node": ">=0.12" + } + }, + "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/randomstring": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/randomstring/-/randomstring-1.1.5.tgz", + "integrity": "sha1-bfBij3XL1ZMpMNn+OrTpVqGFGMM=", + "dev": true, + "dependencies": { + "array-uniq": "1.0.2" + }, + "bin": { + "randomstring": "bin/randomstring" + }, + "engines": { + "node": "*" + } + }, + "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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "dependencies": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body/node_modules/http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "dependencies": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": ">= 1.3.1 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body/node_modules/setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + }, + "node_modules/react": { + "version": "16.6.3", + "resolved": "https://registry.npmjs.org/react/-/react-16.6.3.tgz", + "integrity": "sha512-zCvmH2vbEolgKxtqXL2wmGCUxUyNheYn/C+PD1YAjfxHC54+MhdruyhO7QieQrYsYeTxrn93PM2y0jRH1zEExw==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.11.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-copy-to-clipboard": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.0.1.tgz", + "integrity": "sha512-ELKq31/E3zjFs5rDWNCfFL4NvNFQvGRoJdAKReD/rUPA+xxiLPQmZBZBvy2vgH7V0GE9isIQpT9WXbwIVErYdA==", + "dependencies": { + "copy-to-clipboard": "^3", + "prop-types": "^15.5.8" + } + }, + "node_modules/react-deep-force-update": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/react-deep-force-update/-/react-deep-force-update-2.1.3.tgz", + "integrity": "sha512-lqD4eHKVuB65RyO/hGbEST53E2/GPbcIPcFYyeW/p4vNngtH4G7jnKGlU6u1OqrFo0uNfIvwuBOg98IbLHlNEA==", + "dev": true + }, + "node_modules/react-dom": { + "version": "16.6.3", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.6.3.tgz", + "integrity": "sha512-8ugJWRCWLGXy+7PmNh8WJz3g1TaTUt1XyoIcFN+x0Zbkoz+KKdUyx1AQLYJdbFXjuF41Nmjn5+j//rxvhFjgSQ==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.11.2" + } + }, + "node_modules/react-hot-loader": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/react-hot-loader/-/react-hot-loader-3.1.3.tgz", + "integrity": "sha512-d7nZf78irxoGN5PY4zd6CSgZiroOhvIWzRast3qwTn4sSnBwlt08kV8WMQ9mitmxEdlCTwZt+5ClrRSjxWguMQ==", + "dev": true, + "dependencies": { + "global": "^4.3.0", + "react-deep-force-update": "^2.1.1", + "react-proxy": "^3.0.0-alpha.0", + "redbox-react": "^1.3.6", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/react-hot-loader/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/react-is": { + "version": "16.12.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", + "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==" + }, + "node_modules/react-proxy": { + "version": "3.0.0-alpha.1", + "resolved": "https://registry.npmjs.org/react-proxy/-/react-proxy-3.0.0-alpha.1.tgz", + "integrity": "sha1-RABCa8+oDKpnJMd1VpUxUgn6Swc=", + "dev": true, + "dependencies": { + "lodash": "^4.6.1" + } + }, + "node_modules/react-syntax-highlighter": { + "version": "7.0.2", + "resolved": "http://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-7.0.2.tgz", + "integrity": "sha512-TA88LVeNz+qFGpUeCGN190Chrvh16Utywa+SpYL7c768JVr821XD7bdSVJBP9nr6NWRG6TB63h4R2cFVZ+M2tg==", + "dependencies": { + "babel-runtime": "^6.18.0", + "highlight.js": "~9.12.0", + "lowlight": "~1.9.1", + "prismjs": "^1.8.4", + "refractor": "^2.0.0" + } + }, + "node_modules/react-test-renderer": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.2.0.tgz", + "integrity": "sha512-Kd4gJFtpNziR9ElOE/C23LeflKLZPRpNQYWP3nQBY43SJ5a+xyEGSeMrm2zxNKXcnCbBS/q1UpD9gqd5Dv+rew==", + "dev": true, + "dependencies": { + "fbjs": "^0.8.16", + "object-assign": "^4.1.1", + "prop-types": "^15.6.0" + } + }, + "node_modules/react-transition-group": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.2.1.tgz", + "integrity": "sha512-q54UBM22bs/CekG8r3+vi9TugSqh0t7qcEVycaRc9M0p0aCEu+h6rp/RFiW7fHfgd1IKpd9oILFTl5QK+FpiPA==", + "dependencies": { + "chain-function": "^1.0.0", + "classnames": "^2.2.5", + "dom-helpers": "^3.2.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.5.8", + "warning": "^3.0.0" + } + }, + "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/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/read-pkg-up/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/read-pkg-up/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/readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "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/readdirp/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/readline2": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", + "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", + "dev": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "mute-stream": "0.0.5" + } + }, + "node_modules/redbox-react": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/redbox-react/-/redbox-react-1.6.0.tgz", + "integrity": "sha512-mLjM5eYR41yOp5YKHpd3syFeGq6B4Wj5vZr64nbLvTZW5ZLff4LYk7VE4ITpVxkZpCY6OZuqh0HiP3A3uEaCpg==", + "dev": true, + "dependencies": { + "error-stack-parser": "^1.3.6", + "object-assign": "^4.0.1", + "prop-types": "^15.5.4", + "sourcemapped-stacktrace": "^1.1.6" + } + }, + "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/referrer-policy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/referrer-policy/-/referrer-policy-1.2.0.tgz", + "integrity": "sha512-LgQJIuS6nAy1Jd88DCQRemyE3mS+ispwlqMk3b0yjZ257fI1v9c+/p6SD5gP5FGyXUIgrNOAfmyioHwZtYv2VA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/reflect.ownkeys": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz", + "integrity": "sha1-dJrO7H8/34tj+SegSAnpDFwLNGA=", + "dev": true + }, + "node_modules/refractor": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/refractor/-/refractor-2.10.0.tgz", + "integrity": "sha512-maW2ClIkm9IYruuFYGTqKzj+m31heq92wlheW4h7bOstP+gf8bocmMec+j7ljLcaB1CAID85LMB3moye31jH1g==", + "dependencies": { + "hastscript": "^5.0.0", + "parse-entities": "^1.1.2", + "prismjs": "~1.17.0" + } + }, + "node_modules/regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz", + "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "node_modules/regenerator-transform": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz", + "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==", + "dev": true, + "dependencies": { + "private": "^0.1.6" + } + }, + "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/regex-replace-loader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regex-replace-loader/-/regex-replace-loader-1.0.0.tgz", + "integrity": "sha512-a4rgOBgyv4imlxhwTuRRoe8/imglZpQld7XTKtqBo13HJ8tadda4C0+zcZ2VCZ5WNvoLQE9N6v9JJdQksMSvuA==", + "dev": true, + "dependencies": { + "loader-utils": "^1.1.0" + } + }, + "node_modules/regexpu-core": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz", + "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.1.0", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz", + "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==", + "dev": true + }, + "node_modules/regjsparser": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", + "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", + "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/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/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.87.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", + "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.6.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.1", + "forever-agent": "~0.6.1", + "form-data": "~2.3.1", + "har-validator": "~5.0.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.17", + "oauth-sign": "~0.8.2", + "performance-now": "^2.1.0", + "qs": "~6.5.1", + "safe-buffer": "^5.1.1", + "tough-cookie": "~2.3.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/request-progress": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", + "integrity": "sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4=", + "dev": true, + "dependencies": { + "throttleit": "^1.0.0" + } + }, + "node_modules/request-promise-core": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz", + "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", + "dependencies": { + "lodash": "^4.13.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/request-promise-native": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.5.tgz", + "integrity": "sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=", + "dependencies": { + "request-promise-core": "1.1.1", + "stealthy-require": "^1.1.0", + "tough-cookie": ">=2.3.3" + }, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/request/node_modules/ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dependencies": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "node_modules/request/node_modules/fast-deep-equal": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" + }, + "node_modules/request/node_modules/har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "dependencies": { + "ajv": "^5.1.0", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/request/node_modules/json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + }, + "node_modules/request/node_modules/oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "engines": { + "node": "*" + } + }, + "node_modules/request/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "node_modules/request/node_modules/tough-cookie": { + "version": "2.3.4", + "resolved": "http://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "dependencies": { + "punycode": "^1.4.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "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": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "node_modules/require-uncached": { + "version": "1.0.3", + "resolved": "http://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "dependencies": { + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.13.1.tgz", + "integrity": "sha512-CxqObCX8K8YtAhOBRg+lrcdn+LK+WYOS8tSjqSFbjtrI5PnS63QPhZl4+yKfrU9tdsbMu9Anr/amegT87M9Z6w==", + "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": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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/restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "dependencies": { + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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/rewire": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/rewire/-/rewire-2.5.2.tgz", + "integrity": "sha1-ZCfee3/u+n02QBUH62SlOFvFjcc=", + "dev": true + }, + "node_modules/rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "dependencies": { + "glob": "^7.0.5" + }, + "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/rst-selector-parser": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz", + "integrity": "sha1-gbIw6i/MYGbInjRy3nlChdmwPZE=", + "dev": true, + "dependencies": { + "lodash.flattendeep": "^4.4.0", + "nearley": "^2.7.10" + } + }, + "node_modules/run-async": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", + "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + "dev": true, + "dependencies": { + "once": "^1.3.0" + } + }, + "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/rx": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", + "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", + "dev": true + }, + "node_modules/rx-lite": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", + "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", + "dev": true + }, + "node_modules/rxjs": { + "version": "5.5.12", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", + "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "dev": true, + "dependencies": { + "symbol-observable": "1.0.1" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "http://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==" + }, + "node_modules/samsam": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz", + "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==", + "dev": true + }, + "node_modules/sass-graph": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.6.tgz", + "integrity": "sha512-MKuEYXFSGuRSi8FZ3A7imN1CeVn9Gpw0/SFJKdL1ejXJneI9a5rwlEZrKejhEFAA3O6yr3eIyl/WuvASvlT36g==", + "dev": true, + "dependencies": { + "glob": "^7.0.0", + "lodash": "^4.0.0", + "scss-tokenizer": "^0.2.3", + "yargs": "^7.0.0" + } + }, + "node_modules/sass-lint": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/sass-lint/-/sass-lint-1.12.1.tgz", + "integrity": "sha1-Yw9pwhaqIGuCMvsqqQe98zNrbYM=", + "dev": true, + "dependencies": { + "commander": "^2.8.1", + "eslint": "^2.7.0", + "front-matter": "2.1.2", + "fs-extra": "^3.0.1", + "glob": "^7.0.0", + "globule": "^1.0.0", + "gonzales-pe-sl": "^4.2.3", + "js-yaml": "^3.5.4", + "known-css-properties": "^0.3.0", + "lodash.capitalize": "^4.1.0", + "lodash.kebabcase": "^4.0.0", + "merge": "^1.2.0", + "path-is-absolute": "^1.0.0", + "util": "^0.10.3" + }, + "bin": { + "sass-lint": "bin/sass-lint.js" + } + }, + "node_modules/sass-lint/node_modules/fs-extra": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", + "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^3.0.0", + "universalify": "^0.1.0" + } + }, + "node_modules/sass-lint/node_modules/jsonfile": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", + "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/sass-loader": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-6.0.6.tgz", + "integrity": "sha512-c3/Zc+iW+qqDip6kXPYLEgsAu2lf4xz0EZDplB7EmSUMda12U1sGJPetH55B/j9eu0bTtKzKlNPWWyYC7wFNyQ==", + "dev": true, + "dependencies": { + "async": "^2.1.5", + "clone-deep": "^0.3.0", + "loader-utils": "^1.0.1", + "lodash.tail": "^4.1.1", + "pify": "^3.0.0" + }, + "engines": { + "node": ">= 4.3 < 5.0.0 || >= 5.10" + } + }, + "node_modules/sass-loader/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/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/scheduler": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.11.3.tgz", + "integrity": "sha512-i9X9VRRVZDd3xZw10NY5Z2cVMbdYg6gqFecfj79USv1CFN+YrJ3gIPRKf1qlY+Sxly4djoKdfx1T+m9dnRB8kQ==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "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/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": "http://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/seekout": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/seekout/-/seekout-1.0.2.tgz", + "integrity": "sha1-CbqfG9W0b7sTRxjrGaaDgsuxuck=", + "dev": true, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/select": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", + "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=", + "optional": true + }, + "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.16.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", + "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.1", + "destroy": "~1.0.4", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.3.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "bin": { + "mime": "cli.js" + } + }, + "node_modules/send/node_modules/statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serialize-javascript": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", + "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", + "dev": true + }, + "node_modules/serve-static": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", + "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", + "dependencies": { + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.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.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "http://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": "0.1.2", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", + "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.1", + "kind-of": "^2.0.1", + "lazy-cache": "^0.2.3", + "mixin-object": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shallow-clone/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/shallow-clone/node_modules/kind-of": { + "version": "2.0.1", + "resolved": "http://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", + "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", + "dev": true, + "dependencies": { + "is-buffer": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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/shelljs": { + "version": "0.6.1", + "resolved": "http://registry.npmjs.org/shelljs/-/shelljs-0.6.1.tgz", + "integrity": "sha1-7GIRvtGSBEIIj+D3Cyg3Iy7SyKg=", + "dev": true, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "node_modules/simple-html-tokenizer": { + "version": "0.1.1", + "resolved": "http://registry.npmjs.org/simple-html-tokenizer/-/simple-html-tokenizer-0.1.1.tgz", + "integrity": "sha1-BcLuxXn//+FFoDCsJs/qYbmA+r4=", + "dev": true + }, + "node_modules/sinon": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-4.1.4.tgz", + "integrity": "sha512-ISJZDPf8RS2z4/LAgy1gIimAvF9zg9C9ClQhLTWYWm4HBZjo1WELXlVfkudjdYeN+GtQ2uVBe52m0npIV0gDow==", + "dev": true, + "dependencies": { + "diff": "^3.1.0", + "formatio": "1.2.0", + "lodash.get": "^4.4.2", + "lolex": "^2.2.0", + "nise": "^1.2.0", + "supports-color": "^4.4.0", + "type-detect": "^4.0.5" + } + }, + "node_modules/sinon/node_modules/has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sinon/node_modules/supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "dependencies": { + "has-flag": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/slice-ansi": { + "version": "0.0.4", + "resolved": "http://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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/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/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/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/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/socks5-client": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/socks5-client/-/socks5-client-1.2.8.tgz", + "integrity": "sha512-js8WqQ/JjZS3IQwUxRwSThvXzcRIHE8sde8nE5q7nqxiFGb8EoHmNJ9SF2lXqn3ux6pUV3+InH7ng7mANK6XfA==", + "dependencies": { + "ip-address": "~6.1.0" + }, + "engines": { + "node": ">= 6.4.0" + } + }, + "node_modules/socks5-http-client": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/socks5-http-client/-/socks5-http-client-1.0.4.tgz", + "integrity": "sha512-K16meYkltPtps6yDOqK9Mwlfz+pdD2kQQQ/TCO/gu2AImUmfO6nF2uXX1YWrPs4NCfClQNih19wqLXmuUcZCrA==", + "dependencies": { + "socks5-client": "~1.2.6" + }, + "engines": { + "node": ">= 6.4.0" + } + }, + "node_modules/socks5-https-client": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/socks5-https-client/-/socks5-https-client-1.2.1.tgz", + "integrity": "sha512-FbZ/X/2Xq3DAMhuRA4bnN0jy1QxaPTVPLFvyv6CEj0QDKSTdWp9yRxo1JhqXmWKhPQeJyUMajHJB2UjT43pFcw==", + "dependencies": { + "socks5-client": "~1.2.3" + }, + "engines": { + "node": ">= 6.4.0" + } + }, + "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-loader": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-0.2.3.tgz", + "integrity": "sha512-MYbFX9DYxmTQFfy2v8FC1XZwpwHKYxg3SK8Wb7VPBKuhDjz8gi9re2819MsG4p49HDyiOSUKlmZ+nQBArW5CGw==", + "dev": true, + "dependencies": { + "async": "^2.5.0", + "loader-utils": "~0.2.2", + "source-map": "~0.6.1" + } + }, + "node_modules/source-map-loader/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/source-map-loader/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/source-map-loader/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/source-map-loader/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-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "dependencies": { + "atob": "^2.1.1", + "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.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "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/sourcemapped-stacktrace": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/sourcemapped-stacktrace/-/sourcemapped-stacktrace-1.1.11.tgz", + "integrity": "sha512-O0pcWjJqzQFVsisPlPXuNawJHHg9N9UgpJ/aDmvi9+vnS3x1C0NhwkVFzzZ1VN0Xo+bekyweoqYvBw5ZBKiNnQ==", + "dev": true, + "dependencies": { + "source-map": "0.5.6" + } + }, + "node_modules/sourcemapped-stacktrace/node_modules/source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.4.tgz", + "integrity": "sha512-UyhMSmeIqZrQn2UdjYpxEkwY9JUrn8pP+7L4f91zRzOQuI8MF1FGLfYU9DKCYeLdo7LXMxwrX5zKFy7eeeVHuA==" + }, + "node_modules/spdx-correct": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "dev": true + }, + "node_modules/split": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", + "dev": true, + "dependencies": { + "through": "2" + }, + "engines": { + "node": "*" + } + }, + "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": "http://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "node_modules/sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "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": "7.1.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz", + "integrity": "sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==", + "dev": true, + "dependencies": { + "figgy-pudding": "^3.5.1", + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/stackframe": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-0.3.1.tgz", + "integrity": "sha1-M6qE8Rd6VUjIk1Uzy/6zQgl19aQ=", + "dev": true + }, + "node_modules/start-server-and-test": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/start-server-and-test/-/start-server-and-test-1.10.0.tgz", + "integrity": "sha512-wp6x++18wNUIkI0qT+EkgwVQFwoXh003u/PPUJVEEyh9lSNDONLD9CK2qleghS/kl5LxipbrIUw+FJVEFRVkGw==", + "dev": true, + "dependencies": { + "bluebird": "3.5.5", + "check-more-types": "2.24.0", + "debug": "4.1.1", + "execa": "0.11.0", + "lazy-ass": "1.6.0", + "ps-tree": "1.2.0", + "wait-on": "3.3.0" + }, + "bin": { + "server-test": "src/bin/start.js", + "start-server-and-test": "src/bin/start.js", + "start-test": "src/bin/start.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/start-server-and-test/node_modules/bluebird": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", + "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", + "dev": true + }, + "node_modules/start-server-and-test/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/start-server-and-test/node_modules/execa": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.11.0.tgz", + "integrity": "sha512-k5AR22vCt1DcfeiRixW46U5tMLtBg44ssdJM9PiXw3D8Bn5qyxFCSnKY/eR22y+ctFDGPqafpaXg2G4Emyua4A==", + "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/start-server-and-test/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/start-server-and-test/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/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=", + "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/stdout-stream/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/stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "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-browserify/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/stream-combiner": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", + "dev": true, + "dependencies": { + "duplexer": "~0.1.1" + } + }, + "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-http/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/stream-json": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/stream-json/-/stream-json-0.6.1.tgz", + "integrity": "sha512-Tmhl5yUVusgkgCiWnoHD1BA8/LqFX5/OlYj+YMCgUuUMjbacQvSWV8p1grbKvzP6s4EBS4nK5WNsMHX7kugzyg==", + "dependencies": { + "parser-toolkit": ">=0.0.3" + } + }, + "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/stream-to-array": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/stream-to-array/-/stream-to-array-2.3.0.tgz", + "integrity": "sha1-u/azn19D7DC8cbq8s3VXrOzzQ1M=", + "dependencies": { + "any-promise": "^1.1.0" + } + }, + "node_modules/stream-to-observable": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stream-to-observable/-/stream-to-observable-0.1.0.tgz", + "integrity": "sha1-Rb8dny19wJvtgfHDB8Qw5ouEz/4=", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "1.0.2", + "resolved": "http://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/string.prototype.padend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz", + "integrity": "sha1-86rvfBcZ8XDF6rHDK/eA2W4h8vA=", + "dev": true, + "dependencies": { + "define-properties": "^1.1.2", + "es-abstract": "^1.4.3", + "function-bind": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.trimleft": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", + "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.trimright": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", + "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "http://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": "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/strip-eof": { + "version": "1.0.0", + "resolved": "http://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": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "dev": true, + "bin": { + "strip-json-comments": "cli.js" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/style-loader": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.19.1.tgz", + "integrity": "sha512-IRE+ijgojrygQi3rsqT0U4dd+UcPCqcVvauZpCnQrGAlEe+FUIyrK93bUDScamesjP08JlQNsFJU+KmPedP5Og==", + "dev": true, + "dependencies": { + "loader-utils": "^1.0.2", + "schema-utils": "^0.3.0" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/style-loader/node_modules/ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "dependencies": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "node_modules/style-loader/node_modules/fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true + }, + "node_modules/style-loader/node_modules/json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "node_modules/style-loader/node_modules/schema-utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", + "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "dev": true, + "dependencies": { + "ajv": "^5.0.0" + }, + "engines": { + "node": ">= 4.3 < 5.0.0 || >= 5.10" + } + }, + "node_modules/superagent": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", + "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", + "dev": true, + "dependencies": { + "component-emitter": "^1.2.0", + "cookiejar": "^2.1.0", + "debug": "^3.1.0", + "extend": "^3.0.0", + "form-data": "^2.3.1", + "formidable": "^1.2.0", + "methods": "^1.1.1", + "mime": "^1.4.1", + "qs": "^6.5.1", + "readable-stream": "^2.3.5" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/superagent/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/superagent/node_modules/readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "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/supertest": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-3.0.0.tgz", + "integrity": "sha1-jUu2j9GDDuBwM7HFpamkAhyWUpY=", + "dev": true, + "dependencies": { + "methods": "~1.1.2", + "superagent": "^3.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "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/svg-inline-loader": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/svg-inline-loader/-/svg-inline-loader-0.8.0.tgz", + "integrity": "sha512-rynplY2eXFrdNomL1FvyTFQlP+dx0WqbzHglmNtA9M4IHRC3no2aPAl3ny9lUpJzFzFMZfWRK5YIclNU+FRePA==", + "dev": true, + "dependencies": { + "loader-utils": "^0.2.11", + "object-assign": "^4.0.1", + "simple-html-tokenizer": "^0.1.1" + } + }, + "node_modules/svg-inline-loader/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/svg-inline-loader/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/svg-inline-loader/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/svg-loader": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/svg-loader/-/svg-loader-0.0.2.tgz", + "integrity": "sha1-YBqy/aodra48qZdbVQ3pKgfh2Ss=", + "dev": true + }, + "node_modules/symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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": "3.8.3", + "resolved": "http://registry.npmjs.org/table/-/table-3.8.3.tgz", + "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", + "dev": true, + "dependencies": { + "ajv": "^4.7.0", + "ajv-keywords": "^1.0.0", + "chalk": "^1.1.1", + "lodash": "^4.0.0", + "slice-ansi": "0.0.4", + "string-width": "^2.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "dependencies": { + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" + } + }, + "node_modules/table/node_modules/ajv-keywords": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", + "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", + "dev": true + }, + "node_modules/table/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/table/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/table/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/table/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/table/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/table/node_modules/string-width/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/table/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/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": "4.6.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.1.tgz", + "integrity": "sha512-w0f2OWFD7ka3zwetgVAhNMeyzEbj39ht2Tb0qKflw9PmW9Qbo5tjTh01QJLkhO9t9RDDQYvk+WXqpECI2C6i2A==", + "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-webpack-plugin": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-2.3.1.tgz", + "integrity": "sha512-dNxivOXmDgZqrGxOttBH6B4xaxT4zNC+Xd+2K8jwGDMK5q2CZI+KZMA1AAnSRT+BTRvuzKsDx+fpxzPAmAMVcA==", + "dev": true, + "dependencies": { + "cacache": "^13.0.1", + "find-cache-dir": "^3.2.0", + "jest-worker": "^24.9.0", + "schema-utils": "^2.6.1", + "serialize-javascript": "^2.1.2", + "source-map": "^0.6.1", + "terser": "^4.4.3", + "webpack-sources": "^1.4.3" + }, + "engines": { + "node": ">= 8.9.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/find-cache-dir": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.2.0.tgz", + "integrity": "sha512-1JKclkYYsf1q9WIJKLZa9S9muC+08RIjzAlLrK4QcYLJMS6mk9yombQ9qf+zJ7H9LS800k0s44L4sDq9VYzqyg==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.0", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/terser-webpack-plugin/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/terser-webpack-plugin/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/terser-webpack-plugin/node_modules/make-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz", + "integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/terser-webpack-plugin/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/terser-webpack-plugin/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/terser-webpack-plugin/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/terser-webpack-plugin/node_modules/schema-utils": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.1.tgz", + "integrity": "sha512-0WXHDs1VDJyo+Zqs9TKLKyD/h7yDpHUhEFsM2CzkICFdoX1av+GBq/J2xRTFfsQO5kBfhZzANf2VcIm84jqDbg==", + "dev": true, + "dependencies": { + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + } + }, + "node_modules/terser-webpack-plugin/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/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/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/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/thenify": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz", + "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/throttleit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "http://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/through2/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/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/tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", + "optional": true + }, + "node_modules/tmp": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz", + "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==", + "dev": true, + "dependencies": { + "rimraf": "^2.6.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tmp/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "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/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/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/toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha1-bkWxJj8gF/oKzH2J14sVuL932jI=" + }, + "node_modules/tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dependencies": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tough-cookie/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", + "dev": true + }, + "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/ts-loader": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-6.2.1.tgz", + "integrity": "sha512-Dd9FekWuABGgjE1g0TlQJ+4dFUfYGbYcs52/HQObE0ZmUNjQlmLAS7xXsSzy23AMaMwipsx5sNHvoEpT2CZq1g==", + "dev": true, + "dependencies": { + "chalk": "^2.3.0", + "enhanced-resolve": "^4.0.0", + "loader-utils": "^1.0.2", + "micromatch": "^4.0.0", + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/ts-loader/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/ts-loader/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/ts-loader/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/ts-loader/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/ts-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/ts-loader/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/ts-node": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-4.1.0.tgz", + "integrity": "sha512-xcZH12oVg9PShKhy3UHyDmuDLV3y7iKwX25aMVPt1SIXSuAfWkFiGPEkg+th8R4YKW/QCxDoW7lJdb15lx6QWg==", + "dev": true, + "dependencies": { + "arrify": "^1.0.0", + "chalk": "^2.3.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.0", + "tsconfig": "^7.0.0", + "v8flags": "^3.0.0", + "yn": "^2.0.0" + }, + "bin": { + "_ts-node": "dist/_bin.js", + "ts-node": "dist/bin.js" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/ts-node/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/ts-node/node_modules/source-map-support": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", + "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/tsconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", + "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", + "dev": true, + "dependencies": { + "@types/strip-bom": "^3.0.0", + "@types/strip-json-comments": "0.0.30", + "strip-bom": "^3.0.0", + "strip-json-comments": "^2.0.0" + } + }, + "node_modules/tsconfig/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/tsconfig/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" + }, + "node_modules/tslint": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.10.0.tgz", + "integrity": "sha1-EeJrzLiK+gLdDZlWyuPUVAtfVMM=", + "dev": true, + "dependencies": { + "babel-code-frame": "^6.22.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^3.2.0", + "glob": "^7.1.1", + "js-yaml": "^3.7.0", + "minimatch": "^3.0.4", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.12.1" + }, + "bin": { + "tslint": "bin/tslint" + }, + "engines": { + "node": ">=4.8.0" + } + }, + "node_modules/tslint-eslint-rules": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/tslint-eslint-rules/-/tslint-eslint-rules-5.3.1.tgz", + "integrity": "sha512-qq2H/AU/FlFbQJKXuxhtIk+ni/nQu9jHHhsFKa6hnA0/n3zl1/RWRc3TVFlL8HfWFMzkST350VeTrFpy1u4OUg==", + "dev": true, + "dependencies": { + "doctrine": "0.7.2", + "tslib": "1.9.0", + "tsutils": "2.8.0" + } + }, + "node_modules/tslint-eslint-rules/node_modules/doctrine": { + "version": "0.7.2", + "resolved": "http://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz", + "integrity": "sha1-fLhgNZujvpDgQLJrcpzkv6ZUxSM=", + "dev": true, + "dependencies": { + "esutils": "^1.1.6", + "isarray": "0.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tslint-eslint-rules/node_modules/esutils": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.1.6.tgz", + "integrity": "sha1-wBzKqa5LiXxtDD4hCuUvPHqEQ3U=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tslint-eslint-rules/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "node_modules/tslint-eslint-rules/node_modules/tslib": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", + "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==", + "dev": true + }, + "node_modules/tslint-eslint-rules/node_modules/tsutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.8.0.tgz", + "integrity": "sha1-AWAXNymzvxOGKN0UoVN+AIUdgUo=", + "dev": true, + "dependencies": { + "tslib": "^1.7.1" + } + }, + "node_modules/tslint-no-focused-test": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/tslint-no-focused-test/-/tslint-no-focused-test-0.5.0.tgz", + "integrity": "sha512-YK0PSY5XAdJaTzVIXxnUGyvB5VAi+H9yTc3e40YVtu8Ix3+zLSz4ufvX6rXT3nWpim0DR6fxXoL/Zk8JI641Vg==", + "dev": true + }, + "node_modules/tslint-react": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/tslint-react/-/tslint-react-3.6.0.tgz", + "integrity": "sha512-AIv1QcsSnj7e9pFir6cJ6vIncTqxfqeFF3Lzh8SuuBljueYzEAtByuB6zMaD27BL0xhMEqsZ9s5eHuCONydjBw==", + "dev": true, + "dependencies": { + "tsutils": "^2.13.1" + } + }, + "node_modules/tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + } + }, + "node_modules/tty-browserify": { + "version": "0.0.0", + "resolved": "http://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=", + "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=" + }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "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-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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==", + "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=" + }, + "node_modules/typescript": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.3.1.tgz", + "integrity": "sha512-cTmIDFW7O0IHbn1DPYjkiebHxwtCMU+eTy30ZtJNBPF9j2O1ITu5XH2YnBeVRKWHqF+3JQwWJv0Q0aUgX8W7IA==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/ua-parser-js": { + "version": "0.7.19", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.19.tgz", + "integrity": "sha512-T3PVJ6uz8i0HzPxOF9SWzWAlfN/DavlpQqepn22xgve/5QecC+XMCAtmUNnY7C9StehaV6exjUCI801lOI7QlQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "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.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz", + "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz", + "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==", + "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/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=", + "engines": { + "node": ">= 0.8" + } + }, + "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/uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "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/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/user-home": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", + "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", + "dev": true, + "dependencies": { + "os-homedir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "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=" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", + "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz", + "integrity": "sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w==", + "dev": true + }, + "node_modules/v8flags": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz", + "integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==", + "dev": true, + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "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=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "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/wait-on": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-3.3.0.tgz", + "integrity": "sha512-97dEuUapx4+Y12aknWZn7D25kkjMk16PbWoYzpSdA8bYpVfS6hpl2a2pOWZ3c+Tyt3/i4/pglyZctG3J4V1hWQ==", + "dev": true, + "dependencies": { + "@hapi/joi": "^15.0.3", + "core-js": "^2.6.5", + "minimist": "^1.2.0", + "request": "^2.88.0", + "rx": "^4.1.0" + }, + "bin": { + "wait-on": "bin/wait-on" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/wait-on/node_modules/core-js": { + "version": "2.6.10", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.10.tgz", + "integrity": "sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA==", + "dev": true + }, + "node_modules/wait-on/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/wait-on/node_modules/request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "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.0", + "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.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/wait-on/node_modules/safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", + "dev": true + }, + "node_modules/warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz", + "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "dev": true, + "dependencies": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", + "dev": true + }, + "node_modules/webpack": { + "version": "4.41.5", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.5.tgz", + "integrity": "sha512-wp0Co4vpyumnp3KlkmpM5LWuzvZYayDwM2n17EHFr4qxBBbRokC7DJawPJC7TfSFZ9HZ6GsdH40EBj4UV0nmpw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/wasm-edit": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "acorn": "^6.2.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.1.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.1", + "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.6.0", + "webpack-sources": "^1.4.1" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/webpack-cli": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.10.tgz", + "integrity": "sha512-u1dgND9+MXaEt74sJR4PR7qkPxXUSQ0RXYq8x1L6Jg1MYVEmGPrH6Ah6C4arD4r0J1P5HKjRqpab36k0eIzPqg==", + "dev": true, + "dependencies": { + "chalk": "2.4.2", + "cross-spawn": "6.0.5", + "enhanced-resolve": "4.1.0", + "findup-sync": "3.0.0", + "global-modules": "2.0.0", + "import-local": "2.0.0", + "interpret": "1.2.0", + "loader-utils": "1.2.3", + "supports-color": "6.1.0", + "v8-compile-cache": "2.0.3", + "yargs": "13.2.4" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/webpack-cli/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/webpack-cli/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/webpack-cli/node_modules/enhanced-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/webpack-cli/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/webpack-cli/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/webpack-cli/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/webpack-cli/node_modules/interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/webpack-cli/node_modules/invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack-cli/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/webpack-cli/node_modules/lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "dependencies": { + "invert-kv": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-cli/node_modules/os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "dependencies": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-cli/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/webpack-cli/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/webpack-cli/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/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-cli/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/webpack-cli/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/webpack-cli/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/webpack-cli/node_modules/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==", + "dev": true + }, + "node_modules/webpack-cli/node_modules/yargs": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", + "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", + "dev": true, + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "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.0" + } + }, + "node_modules/webpack-cli/node_modules/yargs-parser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", + "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "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.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webpack-hot-middleware": { + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.25.0.tgz", + "integrity": "sha512-xs5dPOrGPCzuRXNi8F6rwhawWvQQkeli5Ro48PRuQh8pYPCPmNnltP9itiUPT4xI8oW+y0m59lyyeQk54s5VgA==", + "dev": true, + "dependencies": { + "ansi-html": "0.0.7", + "html-entities": "^1.2.0", + "querystring": "^0.2.0", + "strip-ansi": "^3.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-merge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", + "dev": true, + "dependencies": { + "lodash": "^4.17.15" + } + }, + "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.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", + "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack/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/webpack/node_modules/cacache": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", + "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", + "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/webpack/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/webpack/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/webpack/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/ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "dependencies": { + "figgy-pudding": "^3.5.1" + } + }, + "node_modules/webpack/node_modules/terser-webpack-plugin": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", + "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", + "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": "^2.1.2", + "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/webpack/node_modules/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==", + "dev": true + }, + "node_modules/webpack/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/whatwg-fetch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", + "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-3.1.0.tgz", + "integrity": "sha1-e9yuSQ+SGu9kUftnOexrvY6Qe/Y=", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "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-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "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/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": "2.1.0", + "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "dependencies": { + "mkdirp": "^0.5.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/x-xss-protection": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/x-xss-protection/-/x-xss-protection-1.3.0.tgz", + "integrity": "sha512-kpyBI9TlVipZO4diReZMAHWtS0MMa/7Kgx8hwG/EuZLiA6sg4Ah/4TRdASHhRRN3boobzcYgFRUFSgHRge6Qhg==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xml-name-validator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", + "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=", + "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==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "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/yargs": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.1.tgz", + "integrity": "sha512-huO4Fr1f9PmiJJdll5kwoS2e4GqzGSsMT3PPMpOwoVkOK8ckqAewMTZyA6LXVQWflleb/Z8oPBEvNsMft0XE+g==", + "dev": true, + "dependencies": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "5.0.0-security.0" + } + }, + "node_modules/yargs-parser": { + "version": "5.0.0-security.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0-security.0.tgz", + "integrity": "sha512-T69y4Ps64LNesYxeYGYPvfoMTt/7y1XtfpIslUeK4um+9Hu7hlGoRtaDLvdXb7+/tfq4opVa2HRY5xGip022rQ==", + "dev": true, + "dependencies": { + "camelcase": "^3.0.0", + "object.assign": "^4.1.0" + } + }, + "node_modules/yargs-parser/node_modules/camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yargs/node_modules/camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yauzl/node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "dev": true, + "engines": { + "node": ">=4" + } + } + }, "dependencies": { "@babel/code-frame": { "version": "7.5.5", @@ -1273,6 +16787,12 @@ "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==", "dev": true }, + "@types/randomstring": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@types/randomstring/-/randomstring-1.1.6.tgz", + "integrity": "sha512-XRIZIMTxjcUukqQcYBdpFWGbcRDyNBXrvTEtTYgFMIbBNUVt+9mCKsU+jUUDLeFO/RXopUgR5OLiBqbY18vSHQ==", + "dev": true + }, "@types/range-parser": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", @@ -1990,6 +17510,12 @@ "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", "dev": true }, + "array-uniq": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.2.tgz", + "integrity": "sha1-X8w3OSB3VyPP1k1lxkvvU7+eum0=", + "dev": true + }, "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", @@ -2266,6 +17792,12 @@ } } }, + "base64-arraybuffer": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.2.0.tgz", + "integrity": "sha512-7emyCsu1/xiBXgQZrscw/8KPRT44I4Yq9Pe6EGs3aPRTsWuggML1/1DTuZUuIaJPIm1FTDUVXl4x/yW8s0kQDQ==", + "dev": true + }, "base64-js": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", @@ -4181,6 +19713,7 @@ "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, "requires": { "is-arrayish": "^0.2.1" } @@ -5260,27 +20793,31 @@ "dependencies": { "abbrev": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "bundled": true, - "dev": true, - "optional": true + "extraneous": true }, "ansi-regex": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "bundled": true, - "dev": true, - "optional": true + "extraneous": true }, "aproba": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "bundled": true, - "dev": true, - "optional": true + "extraneous": true }, "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==", "bundled": true, - "dev": true, - "optional": true, + "extraneous": true, "requires": { "delegates": "^1.0.0", "readable-stream": "^2.0.6" @@ -5288,15 +20825,17 @@ }, "balanced-match": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "bundled": true, - "dev": true, - "optional": true + "extraneous": true }, "brace-expansion": { "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "bundled": true, - "dev": true, - "optional": true, + "extraneous": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -5304,81 +20843,93 @@ }, "chownr": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", + "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==", "bundled": true, - "dev": true, - "optional": true + "extraneous": true }, "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=", "bundled": true, - "dev": true, - "optional": true + "extraneous": true }, "concat-map": { "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "bundled": true, - "dev": true, - "optional": true + "extraneous": true }, "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=", "bundled": true, - "dev": true, - "optional": true + "extraneous": true }, "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=", "bundled": true, - "dev": true, - "optional": true + "extraneous": true }, "debug": { "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "bundled": true, - "dev": true, - "optional": true, + "extraneous": true, "requires": { "ms": "^2.1.1" } }, "deep-extend": { "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "bundled": true, - "dev": true, - "optional": true + "extraneous": true }, "delegates": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "bundled": true, - "dev": true, - "optional": true + "extraneous": true }, "detect-libc": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", "bundled": true, - "dev": true, - "optional": true + "extraneous": true }, "fs-minipass": { "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", "bundled": true, - "dev": true, - "optional": true, + "extraneous": true, "requires": { "minipass": "^2.6.0" } }, "fs.realpath": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "bundled": true, - "dev": true, - "optional": true + "extraneous": true }, "gauge": { "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "bundled": true, - "dev": true, - "optional": true, + "extraneous": true, "requires": { "aproba": "^1.0.3", "console-control-strings": "^1.0.0", @@ -5392,9 +20943,10 @@ }, "glob": { "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "bundled": true, - "dev": true, - "optional": true, + "extraneous": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -5406,33 +20958,37 @@ }, "has-unicode": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "bundled": true, - "dev": true, - "optional": true + "extraneous": true }, "iconv-lite": { "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "bundled": true, - "dev": true, - "optional": true, + "extraneous": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } }, "ignore-walk": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", "bundled": true, - "dev": true, - "optional": true, + "extraneous": true, "requires": { "minimatch": "^3.0.4" } }, "inflight": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "bundled": true, - "dev": true, - "optional": true, + "extraneous": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -5440,45 +20996,58 @@ }, "inherits": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "bundled": true, - "dev": true, - "optional": true + "extraneous": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "bundled": true, + "extraneous": true }, "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=", "bundled": true, - "dev": true, - "optional": true, + "extraneous": true, "requires": { "number-is-nan": "^1.0.0" } }, "isarray": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "bundled": true, - "dev": true, - "optional": true + "extraneous": true }, "minimatch": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "bundled": true, - "dev": true, - "optional": true, + "extraneous": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "bundled": true, - "dev": true, - "optional": true + "extraneous": true }, "minipass": { "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", "bundled": true, - "dev": true, - "optional": true, + "extraneous": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -5486,33 +21055,37 @@ }, "minizlib": { "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", "bundled": true, - "dev": true, - "optional": true, + "extraneous": true, "requires": { "minipass": "^2.9.0" } }, "mkdirp": { "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "bundled": true, - "dev": true, - "optional": true, + "extraneous": true, "requires": { "minimist": "0.0.8" } }, "ms": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "bundled": true, - "dev": true, - "optional": true + "extraneous": true }, "needle": { "version": "2.4.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz", + "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", "bundled": true, - "dev": true, - "optional": true, + "extraneous": true, "requires": { "debug": "^3.2.6", "iconv-lite": "^0.4.4", @@ -5521,9 +21094,10 @@ }, "node-pre-gyp": { "version": "0.14.0", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz", + "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==", "bundled": true, - "dev": true, - "optional": true, + "extraneous": true, "requires": { "detect-libc": "^1.0.2", "mkdirp": "^0.5.1", @@ -5539,9 +21113,10 @@ }, "nopt": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", "bundled": true, - "dev": true, - "optional": true, + "extraneous": true, "requires": { "abbrev": "1", "osenv": "^0.1.4" @@ -5549,24 +21124,27 @@ }, "npm-bundled": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", "bundled": true, - "dev": true, - "optional": true, + "extraneous": true, "requires": { "npm-normalize-package-bin": "^1.0.1" } }, "npm-normalize-package-bin": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", "bundled": true, - "dev": true, - "optional": true + "extraneous": true }, "npm-packlist": { "version": "1.4.7", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.7.tgz", + "integrity": "sha512-vAj7dIkp5NhieaGZxBJB8fF4R0078rqsmhJcAfXZ6O7JJhjhPK96n5Ry1oZcfLXgfun0GWTZPOxaEyqv8GBykQ==", "bundled": true, - "dev": true, - "optional": true, + "extraneous": true, "requires": { "ignore-walk": "^3.0.1", "npm-bundled": "^1.0.1" @@ -5574,9 +21152,10 @@ }, "npmlog": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "bundled": true, - "dev": true, - "optional": true, + "extraneous": true, "requires": { "are-we-there-yet": "~1.1.2", "console-control-strings": "~1.1.0", @@ -5586,42 +21165,48 @@ }, "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=", "bundled": true, - "dev": true, - "optional": true + "extraneous": true }, "object-assign": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "bundled": true, - "dev": true, - "optional": true + "extraneous": true }, "once": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "bundled": true, - "dev": true, - "optional": true, + "extraneous": true, "requires": { "wrappy": "1" } }, "os-homedir": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "bundled": true, - "dev": true, - "optional": true + "extraneous": true }, "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=", "bundled": true, - "dev": true, - "optional": true + "extraneous": true }, "osenv": { "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "bundled": true, - "dev": true, - "optional": true, + "extraneous": true, "requires": { "os-homedir": "^1.0.0", "os-tmpdir": "^1.0.0" @@ -5629,21 +21214,24 @@ }, "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=", "bundled": true, - "dev": true, - "optional": true + "extraneous": true }, "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==", "bundled": true, - "dev": true, - "optional": true + "extraneous": true }, "rc": { "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "bundled": true, - "dev": true, - "optional": true, + "extraneous": true, "requires": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -5653,17 +21241,19 @@ "dependencies": { "minimist": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "bundled": true, - "dev": true, - "optional": true + "extraneous": true } } }, "readable-stream": { "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "bundled": true, - "dev": true, - "optional": true, + "extraneous": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -5676,89 +21266,101 @@ }, "rimraf": { "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "bundled": true, - "dev": true, - "optional": true, + "extraneous": true, "requires": { "glob": "^7.1.3" } }, "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==", "bundled": true, - "dev": true, - "optional": true + "extraneous": true }, "safer-buffer": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "bundled": true, - "dev": true, - "optional": true + "extraneous": true }, "sax": { "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "bundled": true, - "dev": true, - "optional": true + "extraneous": true }, "semver": { "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "bundled": true, - "dev": true, - "optional": true + "extraneous": true }, "set-blocking": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "bundled": true, - "dev": true, - "optional": true + "extraneous": true }, "signal-exit": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "bundled": true, - "dev": true, - "optional": true + "extraneous": 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==", + "bundled": true, + "extraneous": true, + "requires": { + "safe-buffer": "~5.1.0" + } }, "string-width": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "bundled": true, - "dev": true, - "optional": true, + "extraneous": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", "strip-ansi": "^3.0.0" } }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, "strip-ansi": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "bundled": true, - "dev": true, - "optional": true, + "extraneous": true, "requires": { "ansi-regex": "^2.0.0" } }, "strip-json-comments": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "bundled": true, - "dev": true, - "optional": true + "extraneous": true }, "tar": { "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", "bundled": true, - "dev": true, - "optional": true, + "extraneous": true, "requires": { "chownr": "^1.1.1", "fs-minipass": "^1.2.5", @@ -5771,30 +21373,34 @@ }, "util-deprecate": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "bundled": true, - "dev": true, - "optional": true + "extraneous": true }, "wide-align": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "bundled": true, - "dev": true, - "optional": true, + "extraneous": true, "requires": { "string-width": "^1.0.2 || 2" } }, "wrappy": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "bundled": true, - "dev": true, - "optional": true + "extraneous": true }, "yallist": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "bundled": true, - "dev": true, - "optional": true + "extraneous": true } } }, @@ -6683,7 +22289,8 @@ "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true }, "is-binary-path": { "version": "1.0.1", @@ -8933,6 +24540,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, "requires": { "error-ex": "^1.2.0" } @@ -9636,6 +25244,15 @@ "safe-buffer": "^5.1.0" } }, + "randomstring": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/randomstring/-/randomstring-1.1.5.tgz", + "integrity": "sha1-bfBij3XL1ZMpMNn+OrTpVqGFGMM=", + "dev": true, + "requires": { + "array-uniq": "1.0.2" + } + }, "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -11256,6 +26873,14 @@ "integrity": "sha1-Rb8dny19wJvtgfHDB8Qw5ouEz/4=", "dev": true }, + "string_decoder": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, "string-width": { "version": "1.0.2", "resolved": "http://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", @@ -11298,14 +26923,6 @@ "function-bind": "^1.1.1" } }, - "string_decoder": { - "version": "1.1.1", - "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, "strip-ansi": { "version": "3.0.1", "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -12787,15 +28404,6 @@ "invert-kv": "^2.0.0" } }, - "load-json-file": { - "version": "2.0.0", - "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0" - } - }, "os-locale": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", diff --git a/package.json b/package.json index c70610879..1f35bee82 100644 --- a/package.json +++ b/package.json @@ -54,6 +54,7 @@ "build": "npm-run-all -s clean build:server build:client", "clean": "rimraf build/*", "tsc": "tsc", + "tsc:watch": "tsc -p tsconfig.json -w --pretty", "lint": "npm-run-all -p lint:*", "lint:ts": "tslint -p . --format verbose", "lint:sass": "sass-lint -v", @@ -122,6 +123,7 @@ "@types/nock": "9.1.3", "@types/node": "8.5.2", "@types/nopt": "3.0.29", + "@types/randomstring": "1.1.6", "@types/react": "16.7.0", "@types/react-copy-to-clipboard": "4.3.0", "@types/react-dom": "16.0.11", @@ -135,6 +137,7 @@ "@types/webpack": "4.41.0", "@types/webpack-env": "1.14.1", "babel-loader": "8.0.6", + "base64-arraybuffer": "0.2.0", "chai": "4.2.0", "chai-datetime": "1.5.0", "create-react-class": "15.6.2", @@ -152,6 +155,8 @@ "nock": "11.0.0", "node-sass": "4.13.1", "npm-run-all": "4.1.5", + "querystring": "0.2.0", + "randomstring": "1.1.5", "react-hot-loader": "3.1.3", "react-test-renderer": "16.2.0", "regex-replace-loader": "1.0.0", diff --git a/src/client/applications/turnilo-application/app-settings-provider.tsx b/src/client/applications/turnilo-application/app-settings-provider.tsx new file mode 100644 index 000000000..3bed513fd --- /dev/null +++ b/src/client/applications/turnilo-application/app-settings-provider.tsx @@ -0,0 +1,93 @@ +/* + * Copyright 2017-2018 Allegro.pl + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as React from "react"; +import { AppSettings } from "../../../common/models/app-settings/app-settings"; +import { Unary } from "../../../common/utils/functional/functional"; +import { Loader } from "../../components/loader/loader"; +import { Ajax } from "../../utils/ajax/ajax"; + +enum SettingsResourceStatus { LOADED, LOADING, ERROR } + +interface SettingsResourceBase { + status: SettingsResourceStatus; +} + +interface SettingsResourceLoading extends SettingsResourceBase { + status: SettingsResourceStatus.LOADING; +} + +interface SettingsResourceLoaded extends SettingsResourceBase { + status: SettingsResourceStatus.LOADED; + settings: AppSettings; +} + +interface SettingsResourceLoadError extends SettingsResourceBase { + status: SettingsResourceStatus.ERROR; + error: Error; +} + +type SettingsResource = SettingsResourceLoading | SettingsResourceLoadError | SettingsResourceLoaded; + +const loading: SettingsResource = { status: SettingsResourceStatus.LOADING }; +const loaded = (settings: AppSettings): SettingsResource => ({ + status: SettingsResourceStatus.LOADED, + settings +}); +const errored = (error: Error): SettingsResource => ({ + status: SettingsResourceStatus.ERROR, + error +}); + +interface AppSettingsProviderProps { + clientAppSettings: AppSettings; + children: Unary<{ appSettings: AppSettings }, React.ReactNode>; +} + +interface AppSettingsProviderState { + appSettings: SettingsResource; +} + +export class AppSettingsProvider extends React.Component { + + state: AppSettingsProviderState = { appSettings: loading }; + + componentDidMount() { + Ajax.settings(this.props.clientAppSettings) + .then(appSettings => { + this.setState({ + appSettings: loaded(appSettings) + }); + }) + .catch(error => { + this.setState({ + appSettings: errored(error) + }); + }); + } + + render() { + const { appSettings } = this.state; + switch (appSettings.status) { + case SettingsResourceStatus.LOADING: + return ; + case SettingsResourceStatus.ERROR: + throw appSettings.error; + case SettingsResourceStatus.LOADED: + return this.props.children({ appSettings: appSettings.settings }); + } + } +} diff --git a/src/client/applications/turnilo-application/turnilo-application.tsx b/src/client/applications/turnilo-application/turnilo-application.tsx index 1ca79b6b2..30d38d54f 100644 --- a/src/client/applications/turnilo-application/turnilo-application.tsx +++ b/src/client/applications/turnilo-application/turnilo-application.tsx @@ -21,17 +21,22 @@ import { AppSettings } from "../../../common/models/app-settings/app-settings"; import { DataCube } from "../../../common/models/data-cube/data-cube"; import { Essence } from "../../../common/models/essence/essence"; import { Timekeeper } from "../../../common/models/timekeeper/timekeeper"; -import { UrlHashConverter, urlHashConverter } from "../../../common/utils/url-hash-converter/url-hash-converter"; +import { urlHashConverter } from "../../../common/utils/url-hash-converter/url-hash-converter"; +import { DataCubeNotFound } from "../../components/no-data/data-cube-not-found"; import { Notifications, Questions } from "../../components/notifications/notifications"; import { AboutModal } from "../../modals/about-modal/about-modal"; +import { getCode, hasCode, isOauthError, resetToken } from "../../oauth/oauth"; +import { OauthCodeHandler } from "../../oauth/oauth-code-handler"; +import { OauthMessageView } from "../../oauth/oauth-message-view"; import { Ajax } from "../../utils/ajax/ajax"; import { reportError } from "../../utils/error-reporter/error-reporter"; import { replaceHash } from "../../utils/url/url"; import { CubeView } from "../../views/cube-view/cube-view"; -import { ErrorView } from "../../views/error-view/error-view"; +import { GeneralError } from "../../views/error-view/general-error"; import { HomeView } from "../../views/home-view/home-view"; -import { NoDataView } from "../../views/no-data-view/no-data-view"; +import { AppSettingsProvider } from "./app-settings-provider"; import "./turnilo-application.scss"; +import { cube, generalError, home, oauthCodeHandler, oauthMessageView, View } from "./view"; export interface TurniloApplicationProps { version: string; @@ -41,101 +46,53 @@ export interface TurniloApplicationProps { } export interface TurniloApplicationState { - appSettings?: AppSettings; timekeeper?: Timekeeper; drawerOpen?: boolean; - selectedItem?: DataCube; - viewType?: ViewType; - viewHash?: string; + view: View; showAboutModal?: boolean; - errorId?: string; } -export type ViewType = "home" | "cube" | "no-data" | "general-error"; - -const ERROR: ViewType = "general-error"; -export const HOME: ViewType = "home"; -export const CUBE: ViewType = "cube"; -export const NO_DATA: ViewType = "no-data"; - export class TurniloApplication extends React.Component { private hashUpdating = false; - private readonly urlHashConverter: UrlHashConverter = urlHashConverter; state: TurniloApplicationState = { - appSettings: null, drawerOpen: false, - selectedItem: null, - viewType: null, - viewHash: null, - showAboutModal: false, - errorId: null + view: null, + showAboutModal: false }; componentDidCatch(error: Error) { - const errorId = reportError(error); + if (!!this.props.appSettings.oauth && isOauthError(error)) { + resetToken(); + this.setState({ + view: oauthMessageView(error) + }); + return; + } this.setState({ - viewType: ERROR, - errorId + view: generalError(reportError(error)) }); } componentWillMount() { - const { appSettings, initTimekeeper } = this.props; - const { dataCubes } = appSettings; - - const hash = window.location.hash; - let viewType = this.getViewTypeFromHash(hash); - - if (!dataCubes.length) { - window.location.hash = ""; + const { initTimekeeper, appSettings: { oauth } } = this.props; + if (!!oauth && hasCode()) { this.setState({ - viewType: NO_DATA, - viewHash: "", - appSettings + view: oauthCodeHandler(getCode()) }); - return; } - - const viewHash = this.getViewHashFromHash(hash); - - let selectedItem: DataCube; - - if (this.viewTypeNeedsAnItem(viewType)) { - selectedItem = this.getSelectedDataCubeFromHash(dataCubes, hash); - - // If datacube / collection does not exist, then bounce to home - if (!selectedItem) { - this.changeHash(""); - viewType = HOME; - } - } - - if (viewType === HOME && dataCubes.length === 1) { - viewType = CUBE; - selectedItem = dataCubes[0]; - } - - this.setState({ - viewType, - viewHash, - selectedItem, - appSettings, - timekeeper: initTimekeeper || Timekeeper.EMPTY - }); - } - - viewTypeNeedsAnItem(viewType: ViewType): boolean { - return viewType === CUBE; + const timekeeper = initTimekeeper || Timekeeper.EMPTY; + this.setState({ timekeeper }); + this.hashToState(window.location.hash); } componentDidMount() { window.addEventListener("hashchange", this.globalHashChangeListener); Ajax.settingsVersionGetter = () => { - const { appSettings } = this.state; - return appSettings.getVersion(); + const { version } = this.props; + return Number(version); }; } @@ -149,57 +106,25 @@ export class TurniloApplication extends React.Component { - const newHash = `${this.state.selectedItem.name}/${this.convertEssenceToHash(essence)}`; + updateCubeAndEssenceInHash = (dataCube: DataCube, essence: Essence, force: boolean) => { + const newHash = `${dataCube.name}/${(urlHashConverter.toHash(essence))}`; this.changeHash(newHash, force); }; - changeDataCubeWithEssence = (dataCube: DataCube, essence: Essence | null) => { - const essenceHashPart = essence && this.convertEssenceToHash(essence); - const hash = `${dataCube.name}/${essenceHashPart || ""}`; - this.changeHash(hash, true); - }; - - urlForEssence = (essence: Essence): string => { - return `${this.getUrlPrefix()}${this.convertEssenceToHash(essence)}`; + urlForEssence = (dataCube: DataCube, essence: Essence): string => { + return `${this.getUrlPrefix()}#${dataCube.name}/${(urlHashConverter.toHash(essence))}`; }; - private convertEssenceToHash(essence: Essence): string { - return this.urlHashConverter.toHash(essence); - } - getUrlPrefix(): string { const { origin, pathname } = window.location; - const dataCubeName = `${this.state.selectedItem.name}/`; - return `${origin}${pathname}#${dataCubeName}`; + return `${origin}${pathname}`; } openAboutModal = () => this.setState({ showAboutModal: true }); @@ -256,46 +170,48 @@ export class TurniloApplication extends React.Component; + switch (view.viewType) { + case "oauth-message": + return ; - case HOME: - return {({ appSettings }) => ; - - case CUBE: - return ; + />}; + + case "cube": { + return {({ appSettings }) => { + const dataCube = NamedArray.findByName(appSettings.dataCubes, view.cubeName); + if (dataCube === undefined) { + return ; + } + return ; + }}; + } - case ERROR: - return ; + case "general-error": + return ; - default: - throw new Error("unknown view"); + case "oauth-code-handler": + return ; } } @@ -304,8 +220,8 @@ export class TurniloApplication extends React.Component {this.renderView()} {this.renderAboutModal()} - - + + ; } diff --git a/src/client/applications/turnilo-application/view.ts b/src/client/applications/turnilo-application/view.ts new file mode 100644 index 000000000..7c866da0f --- /dev/null +++ b/src/client/applications/turnilo-application/view.ts @@ -0,0 +1,77 @@ +/* + * Copyright 2017-2021 Allegro.pl + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { OauthError } from "../../oauth/oauth"; + +type ViewType = "home" | "cube" | "general-error" | "oauth-code-handler" | "oauth-message"; + +interface ViewBase { + viewType: ViewType; +} + +interface Home extends ViewBase { + viewType: "home"; +} + +interface Cube extends ViewBase { + viewType: "cube"; + cubeName: string; + hash: string; +} + +interface GeneralError extends ViewBase { + viewType: "general-error"; + errorId?: string; +} + +interface OauthCodeHandler extends ViewBase { + viewType: "oauth-code-handler"; + code: string; +} + +interface OauthMessage extends ViewBase { + viewType: "oauth-message"; + error: OauthError; +} + +export type View = Home | Cube | GeneralError | OauthCodeHandler | OauthMessage; + +export const home: Home = { + viewType: "home" +}; + +export const cube = (cubeName: string, hash: string): Cube => ({ + viewType: "cube", + hash, + cubeName +}); + +export const generalError = (errorId?: string): GeneralError => ({ + viewType: "general-error", + errorId +}); + +export const oauthCodeHandler = (code: string): OauthCodeHandler => ({ + viewType: "oauth-code-handler", + code +}); + +export const oauthMessageView = (error: OauthError): OauthMessage => ({ + viewType: "oauth-message", + error +}); + +export const navigateToHome = () => window.location.href = "#"; diff --git a/src/client/views/error-view/error-view.scss b/src/client/components/message-panel/message-panel.scss similarity index 90% rename from src/client/views/error-view/error-view.scss rename to src/client/components/message-panel/message-panel.scss index c9cafeea9..5fee0bb67 100644 --- a/src/client/views/error-view/error-view.scss +++ b/src/client/components/message-panel/message-panel.scss @@ -16,7 +16,7 @@ @import '../../imports'; -.error-view { +.message-panel { @include pin-full; background: $white; display: flex; @@ -24,23 +24,23 @@ justify-content: center; } -.error-view__container { +.message-panel__container { max-width: 500px; } -.error-view__title { +.message-panel__title { @include css-variable(color, brand); margin-bottom: 12px; font-size: 20px; text-align: center; } -.error-view__message { +.message-panel__message { @include css-variable(color, text-medium); font-size: 14px; } -.error-view__reload { +.message-panel__action { @include css-variable(color, brand); margin-top: 24px; font-size: 18px; diff --git a/src/client/components/message-panel/message-panel.tsx b/src/client/components/message-panel/message-panel.tsx new file mode 100644 index 000000000..b2ba3e684 --- /dev/null +++ b/src/client/components/message-panel/message-panel.tsx @@ -0,0 +1,42 @@ +/* + * Copyright 2017-2019 Allegro.pl + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as React from "react"; +import { Nullary } from "../../../common/utils/functional/functional"; +import "./message-panel.scss"; + +interface ErrorViewActionProps { + action: Nullary; + label: string; +} + +export const MessagePanelAction: React.SFC = ({ action, label }) => +
{label}
; + +interface ErrorViewProps { + message?: string; + title: string; +} + +export const MessagePanel: React.SFC = ({ message, title, children }) => { + return
+
+
{title}
+ {message &&
{message}
} + {children} +
+
; +}; diff --git a/src/client/components/no-data/data-cube-not-found.tsx b/src/client/components/no-data/data-cube-not-found.tsx new file mode 100644 index 000000000..64e7c7f59 --- /dev/null +++ b/src/client/components/no-data/data-cube-not-found.tsx @@ -0,0 +1,26 @@ +/* + * Copyright 2017-2021 Allegro.pl + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as React from "react"; +import { navigateToHome } from "../../applications/turnilo-application/view"; +import { MessagePanel, MessagePanelAction } from "../message-panel/message-panel"; + +export const DataCubeNotFound: React.SFC<{}> = () => { + return + + ; +}; diff --git a/src/client/components/no-data/empty-data-cube-list.scss b/src/client/components/no-data/empty-data-cube-list.scss new file mode 100644 index 000000000..62387ae18 --- /dev/null +++ b/src/client/components/no-data/empty-data-cube-list.scss @@ -0,0 +1,40 @@ +/* + * Copyright 2015-2016 Imply Data, Inc. + * Copyright 2017-2019 Allegro.pl + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@import '../../imports'; + +.empty-data-cube-list { + margin-top: 60px; + + .icon { + display: inline-block; + margin-bottom: 6px; + width: 42px; + + path { + @include css-variable(fill, text-light); + } + } + + .label { + @include css-variable(color, text-light); + display: inline-block; + height: 46px; + padding-top: 13px; + font-size: 20px; + } +} diff --git a/src/client/components/no-data/empty-data-cube-list.tsx b/src/client/components/no-data/empty-data-cube-list.tsx new file mode 100644 index 000000000..2f80e0c80 --- /dev/null +++ b/src/client/components/no-data/empty-data-cube-list.tsx @@ -0,0 +1,30 @@ +/* + * Copyright 2015-2016 Imply Data, Inc. + * Copyright 2017-2019 Allegro.pl + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as React from "react"; +import { STRINGS } from "../../config/constants"; +import { SvgIcon } from "../svg-icon/svg-icon"; +import "./empty-data-cube-list.scss"; + +export const EmptyDataCubeList = () => { + return
+
+ +
+
{STRINGS.noQueryableDataCubes}
+
; +}; diff --git a/src/client/components/query-error/query-error.tsx b/src/client/components/query-error/query-error.tsx index d9ee96e70..5bf739e39 100644 --- a/src/client/components/query-error/query-error.tsx +++ b/src/client/components/query-error/query-error.tsx @@ -17,6 +17,7 @@ import * as React from "react"; import { STRINGS } from "../../config/constants"; +import { isOauthError } from "../../oauth/oauth"; import { Message } from "../message/message"; export interface QueryErrorProps { @@ -24,8 +25,11 @@ export interface QueryErrorProps { } export const QueryError: React.SFC = ({ error }) => { + if (isOauthError(error)) { + throw error; + } return ; + title={STRINGS.queryError}/>; }; diff --git a/src/client/components/side-drawer/side-drawer.tsx b/src/client/components/side-drawer/side-drawer.tsx index ab7bf9112..3050610c2 100644 --- a/src/client/components/side-drawer/side-drawer.tsx +++ b/src/client/components/side-drawer/side-drawer.tsx @@ -20,8 +20,9 @@ import * as ReactDOM from "react-dom"; import { Customization } from "../../../common/models/customization/customization"; import { DataCube } from "../../../common/models/data-cube/data-cube"; import { Essence } from "../../../common/models/essence/essence"; -import { Binary } from "../../../common/utils/functional/functional"; +import { Ternary } from "../../../common/utils/functional/functional"; import { Fn } from "../../../common/utils/general/general"; +import { navigateToHome } from "../../applications/turnilo-application/view"; import { STRINGS } from "../../config/constants"; import filterDataCubes from "../../utils/data-cubes-filter/data-cubes-filter"; import { classNames, escapeKey, isInside } from "../../utils/dom/dom"; @@ -37,11 +38,7 @@ export interface SideDrawerProps { onOpenAbout: Fn; onClose: Fn; customization?: Customization; - changeDataCubeAndEssence: Binary; -} - -function openHome() { - window.location.hash = "#"; + changeDataCubeAndEssence: Ternary; } export interface SideDrawerState { @@ -89,7 +86,7 @@ export class SideDrawer extends React.Component
Home @@ -99,7 +96,7 @@ export class SideDrawer extends React.Component { const { onClose, essence, changeDataCubeAndEssence } = this.props; - changeDataCubeAndEssence(dataCube, essence.updateDataCube(dataCube)); + changeDataCubeAndEssence(dataCube, essence.updateDataCube(dataCube), true); onClose(); }; diff --git a/src/client/main.tsx b/src/client/main.tsx index 516bb7777..7e92258b7 100644 --- a/src/client/main.tsx +++ b/src/client/main.tsx @@ -43,28 +43,26 @@ interface Config { } const config: Config = (window as any)["__CONFIG__"]; -if (!config || !config.version || !config.appSettings || !config.appSettings.dataCubes) { +if (!config) { throw new Error("config not found"); } -if (config.appSettings.customization.sentryDSN) { - errorReporterInit(config.appSettings.customization.sentryDSN, config.version); -} - const version = config.version; Ajax.version = version; -const appSettings = AppSettings.fromJS(config.appSettings, { - executorFactory: Ajax.queryUrlExecutorFactory -}); +// No context because we don't have cubes here yet Maybe we can create just customization here?! +const appSettings = AppSettings.fromJS(config.appSettings, {}); + +if (config.appSettings.customization.sentryDSN) { + errorReporterInit(config.appSettings.customization.sentryDSN, config.version); +} -const app = - ; +const app = ; ReactDOM.render(app, container); diff --git a/src/client/oauth/oauth-code-handler.tsx b/src/client/oauth/oauth-code-handler.tsx new file mode 100644 index 000000000..b02b65e2a --- /dev/null +++ b/src/client/oauth/oauth-code-handler.tsx @@ -0,0 +1,81 @@ +/* + * Copyright 2017-2021 Allegro.pl + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as React from "react"; +import { Oauth } from "../../common/models/oauth/oauth"; +import { Loader } from "../components/loader/loader"; +import { MessagePanel, MessagePanelAction } from "../components/message-panel/message-panel"; +import { exchangeCodeForToken, redirectToSavedUrl } from "./oauth"; + +interface OauthCodeHandlerProps { + oauth: Oauth; + code: string; +} + +enum RequestStatus { PENDING, ERROR } + +interface FailedRequest { + status: RequestStatus.ERROR; + error: Error; +} + +interface PendingRequest { + status: RequestStatus.PENDING; +} + +type Request = PendingRequest | FailedRequest; + +const pending: Request = { status: RequestStatus.PENDING }; +const error = (e: Error): Request => ({ status: RequestStatus.ERROR, error: e }); + +interface OauthCodeHandlerState { + request: Request; +} + +export class OauthCodeHandler extends React.Component { + + state: OauthCodeHandlerState = { request: pending }; + + private authorize() { + const { code, oauth } = this.props; + this.setState({ request: pending }); + exchangeCodeForToken(code, oauth) + .then(redirectToSavedUrl) + .catch(err => { + this.setState({ request: error(err) }); + }); + } + + componentDidMount() { + this.authorize(); + } + + render() { + const { request } = this.state; + switch (request.status) { + case RequestStatus.PENDING: + return + + ; + case RequestStatus.ERROR: + return + + ; + } + } +} diff --git a/src/client/oauth/oauth-message-view.tsx b/src/client/oauth/oauth-message-view.tsx new file mode 100644 index 000000000..517109243 --- /dev/null +++ b/src/client/oauth/oauth-message-view.tsx @@ -0,0 +1,31 @@ +/* + * Copyright 2017-2021 Allegro.pl + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as React from "react"; +import { Oauth } from "../../common/models/oauth/oauth"; +import { MessagePanel, MessagePanelAction } from "../components/message-panel/message-panel"; +import { login } from "./oauth"; + +interface OauthMessageViewProps { + oauth: Oauth; +} + +export const OauthMessageView: React.SFC = ({ oauth }) => { + return + login(oauth)} label={"Login"} /> + ; +}; diff --git a/src/client/oauth/oauth.ts b/src/client/oauth/oauth.ts new file mode 100644 index 000000000..7c64e9664 --- /dev/null +++ b/src/client/oauth/oauth.ts @@ -0,0 +1,119 @@ +/* + * Copyright 2017-2018 Allegro.pl + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import axios, { AxiosError } from "axios"; +import { encode as base64encode } from "base64-arraybuffer"; +import { stringify } from "querystring"; +import { generate } from "randomstring"; +import { Oauth } from "../../common/models/oauth/oauth"; +import { get, remove, set } from "../utils/local-storage/local-storage"; + +const TOKEN_KEY = "turnilo-oauth-access-token"; +const URL_KEY = "turnilo-oauth-redirect-url"; +const VERIFIER_KEY = "turnilo-oauth-code-verifier"; + +export const getToken = (): string | undefined => get(TOKEN_KEY); +export const resetToken = () => remove(TOKEN_KEY); +const saveToken = (token: string) => set(TOKEN_KEY, token); + +const getUrl = (): string | undefined => get(URL_KEY); +const resetUrl = () => remove(URL_KEY); +const saveUrl = (url: string) => set(URL_KEY, url); + +const getVerifier = (): string | undefined => get(VERIFIER_KEY); +const resetVerifier = () => remove(VERIFIER_KEY); +const saveVerifier = (codeVerifier: string) => set(VERIFIER_KEY, codeVerifier); + +export const getCode = () => { + const params = new URLSearchParams(window.location.search); + return params.get("code"); +}; + +export const hasCode = () => getCode() !== null; + +export class OauthError extends Error { + isOauthError = true; +} + +class OauthAuthenticationError extends OauthError { +} + +class OauthAuthorizationError extends OauthError { +} + +export const isOauthError = (error: Error): error is OauthError => + error.hasOwnProperty("isOauthError"); + +export function mapOauthError(oauth: Oauth, error: AxiosError): Error { + if (!!oauth) { + const { response: { status } } = error; + if (status === 401) return new OauthAuthenticationError(); + if (status === 403) return new OauthAuthorizationError(); + } + return error; +} + +export function exchangeCodeForToken(code: string, oauth: Oauth) { + const codeVerifier = getVerifier(); + return axios.post(oauth.tokenEndpoint, stringify({ + client_id: oauth.clientId, + code, + redirect_uri: oauth.redirectUri, + grant_type: "authorization_code", + code_verifier: codeVerifier + }), { + headers: { + "Content-Type": "application/x-www-form-urlencoded" + } + }).then(response => { + resetVerifier(); + saveToken(String(response.data["access_token"])); + }); +} + +export function redirectToSavedUrl() { + const url = getUrl(); + resetUrl(); + window.location.href = url; +} + +function generateCodeChallenge(codeVerifier: string): PromiseLike { + const encoder = new TextEncoder(); + const data = encoder.encode(codeVerifier); + return window.crypto.subtle.digest("SHA-256", data).then(digest => { + const base64Digest = base64encode(digest); + return base64Digest + .replace(/\+/g, "-") + .replace(/\//g, "_") + .replace(/=/g, ""); + }); +} + +function getCodeChallenge(): PromiseLike { + const codeVerifier = generate(128); + saveVerifier(codeVerifier); + return generateCodeChallenge(codeVerifier); +} + +export function login(oauth: Oauth) { + function redirectToAuthorization(codeChallenge: string) { + saveUrl(window.location.href); + const queryParams = `?client_id=${oauth.clientId}&redirect_uri=${encodeURIComponent(oauth.redirectUri)}&response_type=code&code_challenge_method=S256&code_challenge=${codeChallenge}`; + window.location.href = `${oauth.authorizationEndpoint}${queryParams}`; + } + + getCodeChallenge().then(redirectToAuthorization); +} diff --git a/src/client/utils/ajax/ajax.ts b/src/client/utils/ajax/ajax.ts index 1871fcca4..64ab75319 100644 --- a/src/client/utils/ajax/ajax.ts +++ b/src/client/utils/ajax/ajax.ts @@ -16,31 +16,10 @@ */ import axios from "axios"; -import { ChainableExpression, Dataset, DatasetJS, Environment, Executor, Expression, SplitExpression } from "plywood"; -import { Cluster } from "../../../common/models/cluster/cluster"; -import { DataCube } from "../../../common/models/data-cube/data-cube"; - -function getSplitsDescription(ex: Expression): string { - var splits: string[] = []; - ex.forEach(ex => { - if (ex instanceof ChainableExpression) { - ex.getArgumentExpressions().forEach(action => { - if (action instanceof SplitExpression) { - splits.push(action.firstSplitExpression().toString()); - } - }); - } - }); - return splits.join(";"); -} - -var reloadRequested = false; - -function reload() { - if (reloadRequested) return; - reloadRequested = true; - window.location.reload(true); -} +import { Dataset, DatasetJS, Environment, Executor, Expression } from "plywood"; +import { AppSettings, AppSettingsJS } from "../../../common/models/app-settings/app-settings"; +import { Oauth } from "../../../common/models/oauth/oauth"; +import { getToken, mapOauthError } from "../../oauth/oauth"; export interface AjaxOptions { method: "GET" | "POST"; @@ -55,43 +34,56 @@ export class Ajax { static version: string; static settingsVersionGetter: () => number; - static onUpdate: () => void; - static query({ data, url, timeout, method }: AjaxOptions): Promise { + static headers(oauth: Oauth) { + if (!oauth) return {}; + const headerName = oauth.tokenHeaderName; + const token = getToken(); + return !token ? {} : { + [headerName]: getToken() + }; + } + + // NOTE: in argument we pass AppSettings without Sources/Clusters + static query({ data, url, timeout, method }: AjaxOptions, oauth?: Oauth): Promise { if (data) { if (Ajax.version) data.version = Ajax.version; if (Ajax.settingsVersionGetter) data.settingsVersion = Ajax.settingsVersionGetter(); } - return axios({ method, url, data, timeout, validateStatus }) + const headers = Ajax.headers(oauth); + return axios({ method, url, data, timeout, validateStatus, headers }) .then(res => { - if (res && res.data.action === "update" && Ajax.onUpdate) Ajax.onUpdate(); return res.data; }) .catch(error => { - if (error.response && error.response.data) { - if (error.response.data.action === "reload") { - reload(); - } else if (error.response.data.action === "update" && Ajax.onUpdate) { - Ajax.onUpdate(); - } - throw new Error("error with response: " + error.response.status + ", " + error.message); - } else if (error.request) { - throw new Error("no response received, " + error.message); - } else { - throw new Error(error.message); - } + throw mapOauthError(oauth, error); }); } - static queryUrlExecutorFactory(dataCubeName: string, timeout: number): Executor { + // NOTE: in argument we pass AppSettings without Sources/Clusters + static queryUrlExecutorFactory(dataCubeName: string, { oauth, clientTimeout: timeout }: AppSettings): Executor { return (ex: Expression, env: Environment = {}) => { const method = "POST"; - const url = `plywood?by=${getSplitsDescription(ex)}`; + const url = "plywood"; const timezone = env ? env.timezone : null; const data = { dataCube: dataCubeName, expression: ex.toJS(), timezone }; - return Ajax.query<{result: DatasetJS}>({ method, url, timeout, data }) + return Ajax.query<{ result: DatasetJS }>({ method, url, timeout, data }, oauth) .then(res => Dataset.fromJS(res.result)); }; } + + // NOTE: in argument we pass AppSettings without Sources/Clusters + static settings(clientAppSettings: AppSettings): Promise { + const headers = Ajax.headers(clientAppSettings.oauth); + return axios.get("/settings", { headers }) + .then(resp => resp.data) + .catch(error => { + throw mapOauthError(clientAppSettings.oauth, error); + }) + // TODO: type assertion should not be needed there! + .then(appSettingsJS => AppSettings.fromJS(appSettingsJS as AppSettingsJS, { + executorFactory: (cubeName: string) => Ajax.queryUrlExecutorFactory(cubeName, clientAppSettings) + })); + } } diff --git a/src/client/utils/local-storage/local-storage.ts b/src/client/utils/local-storage/local-storage.ts index 99dceed74..a9d096cf7 100644 --- a/src/client/utils/local-storage/local-storage.ts +++ b/src/client/utils/local-storage/local-storage.ts @@ -17,7 +17,7 @@ export function get(key: string): any { try { - return JSON.parse(localStorage[key]); + return JSON.parse(localStorage.getItem(key)); } catch (e) { return undefined; } @@ -25,7 +25,14 @@ export function get(key: string): any { export function set(key: string, value: any) { try { - localStorage[key] = JSON.stringify(value); + localStorage.setItem(key, JSON.stringify(value)); + } catch (e) { + } +} + +export function remove(key: string) { + try { + localStorage.removeItem(key); } catch (e) { } } diff --git a/src/client/views/cube-view/cube-view.mocha.tsx b/src/client/views/cube-view/cube-view.mocha.tsx index 359a2f492..0773e424c 100644 --- a/src/client/views/cube-view/cube-view.mocha.tsx +++ b/src/client/views/cube-view/cube-view.mocha.tsx @@ -36,10 +36,9 @@ describe.skip("CubeView", () => { hash={null} initTimekeeper={TimekeeperFixtures.fixed()} dataCube={DataCubeFixtures.wiki()} - changeDataCubeAndEssence={null} getEssenceFromHash={null} - changeEssence={noop} - urlForEssence={null} + changeCubeAndEssence={noop} + urlForCubeAndEssence={null} /> ); diff --git a/src/client/views/cube-view/cube-view.tsx b/src/client/views/cube-view/cube-view.tsx index 3a648d83b..5ff5fc634 100644 --- a/src/client/views/cube-view/cube-view.tsx +++ b/src/client/views/cube-view/cube-view.tsx @@ -38,7 +38,7 @@ import { Timekeeper } from "../../../common/models/timekeeper/timekeeper"; import { VisualizationManifest } from "../../../common/models/visualization-manifest/visualization-manifest"; import { VisualizationProps } from "../../../common/models/visualization-props/visualization-props"; import { VisualizationSettings } from "../../../common/models/visualization-settings/visualization-settings"; -import { Binary, Unary } from "../../../common/utils/functional/functional"; +import { Binary, Ternary } from "../../../common/utils/functional/functional"; import { Fn } from "../../../common/utils/general/general"; import { datesEqual } from "../../../common/utils/time/time"; import { DimensionMeasurePanel } from "../../components/dimension-measure-panel/dimension-measure-panel"; @@ -90,9 +90,8 @@ export interface CubeViewProps { initTimekeeper?: Timekeeper; maxFilters?: number; hash: string; - changeDataCubeAndEssence: Binary; - changeEssence: Binary; - urlForEssence: Unary; + changeCubeAndEssence: Ternary; + urlForCubeAndEssence: Binary; getEssenceFromHash: Binary; dataCube: DataCube; openAboutModal: Fn; @@ -264,10 +263,10 @@ export class CubeView extends React.Component { } componentWillUpdate(nextProps: CubeViewProps, nextState: CubeViewState): void { - const { changeEssence } = this.props; + const { changeCubeAndEssence, dataCube } = this.props; const { essence } = this.state; if (!nextState.essence.equals(essence)) { - changeEssence(nextState.essence, false); + changeCubeAndEssence(dataCube, nextState.essence, false); } } @@ -287,9 +286,9 @@ export class CubeView extends React.Component { try { essence = this.getEssenceFromHash(hash, dataCube); } catch (e) { - const { changeEssence } = this.props; + const { changeCubeAndEssence } = this.props; essence = this.getEssenceFromDataCube(dataCube); - changeEssence(essence, true); + changeCubeAndEssence(dataCube, essence, true); } this.setState({ essence }); } @@ -526,6 +525,11 @@ export class CubeView extends React.Component { return this.constructContext(essence, this.clicker); } + private urlForEssence = (essence: Essence): string => { + const { dataCube, urlForCubeAndEssence } = this.props; + return urlForCubeAndEssence(dataCube, essence); + } + private constructContext = memoizeOne( (essence: Essence, clicker: Clicker) => ({ essence, clicker }), @@ -535,7 +539,7 @@ export class CubeView extends React.Component { render() { const clicker = this.clicker; - const { urlForEssence, customization } = this.props; + const { customization } = this.props; const { layout, essence, timekeeper, menuStage, visualizationStage, dragOver, updatingMaxTime, lastRefreshRequestTimestamp } = this.state; if (!essence) return null; @@ -547,7 +551,7 @@ export class CubeView extends React.Component { essence={essence} timekeeper={timekeeper} onNavClick={this.sideDrawerOpen} - urlForEssence={urlForEssence} + urlForEssence={this.urlForEssence} refreshMaxTime={this.refreshMaxTime} openRawDataModal={this.openRawDataModal} openViewDefinitionModal={this.openViewDefinitionModal} @@ -663,7 +667,7 @@ export class CubeView extends React.Component { }; renderSideDrawer() { - const { changeDataCubeAndEssence, openAboutModal, appSettings } = this.props; + const { changeCubeAndEssence, openAboutModal, appSettings } = this.props; const { showSideBar, essence } = this.state; const { dataCubes, customization } = appSettings; const transitionTimeout = { enter: 500, exit: 300 }; @@ -681,7 +685,7 @@ export class CubeView extends React.Component { onOpenAbout={openAboutModal} onClose={this.sideDrawerClose} customization={customization} - changeDataCubeAndEssence={changeDataCubeAndEssence} + changeDataCubeAndEssence={changeCubeAndEssence} /> ; } diff --git a/src/client/views/error-view/error-view.tsx b/src/client/views/error-view/general-error.tsx similarity index 67% rename from src/client/views/error-view/error-view.tsx rename to src/client/views/error-view/general-error.tsx index 89cd7e7ef..ad727207e 100644 --- a/src/client/views/error-view/error-view.tsx +++ b/src/client/views/error-view/general-error.tsx @@ -1,5 +1,5 @@ /* - * Copyright 2017-2019 Allegro.pl + * Copyright 2017-2021 Allegro.pl * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,24 +15,20 @@ */ import * as React from "react"; -import "./error-view.scss"; - -interface ErrorViewProps { - errorId: string | null; -} +import { MessagePanel, MessagePanelAction } from "../../components/message-panel/message-panel"; const reload = () => window.location.reload(); const recordedErrorMsg = (errorId: string) => `Unexpected error occurred. We recorded it and assigned code: ${errorId}.`; const defaultErrorMsg = "Unexpected error occurred"; -export const ErrorView: React.SFC = ({ errorId }) => { +interface GeneralErrorProps { + errorId: string | null; +} + +export const GeneralError: React.SFC = ({ errorId }) => { const message = errorId !== null ? recordedErrorMsg(errorId) : defaultErrorMsg; - return
-
-
General error
-
{message}
-
Reload view
-
-
; + return + + ; }; diff --git a/src/client/views/home-view/home-view.tsx b/src/client/views/home-view/home-view.tsx index f09e26cdf..41a4cc3b0 100644 --- a/src/client/views/home-view/home-view.tsx +++ b/src/client/views/home-view/home-view.tsx @@ -21,6 +21,7 @@ import { DataCube } from "../../../common/models/data-cube/data-cube"; import { Fn } from "../../../common/utils/general/general"; import { ClearableInput } from "../../components/clearable-input/clearable-input"; import { HeaderBar } from "../../components/header-bar/header-bar"; +import { EmptyDataCubeList } from "../../components/no-data/empty-data-cube-list"; import { STRINGS } from "../../config/constants"; import filterDataCubes from "../../utils/data-cubes-filter/data-cubes-filter"; import { DataCubeCard } from "./data-cube-card/data-cube-card"; @@ -72,8 +73,9 @@ export class HomeView extends React.Component { } render() { - const { onOpenAbout, customization } = this.props; + const { onOpenAbout, dataCubes, customization } = this.props; const { query } = this.state; + const hasDataCubes = dataCubes.length > 0; return
{
-
-
- -
- {this.renderDataCubes()} -
+ {!hasDataCubes + ? + :
+
+ +
+ {this.renderDataCubes()} +
}
; } diff --git a/src/client/views/no-data-view/no-data-view.scss b/src/client/views/no-data-view/no-data-view.scss deleted file mode 100644 index d1683e377..000000000 --- a/src/client/views/no-data-view/no-data-view.scss +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2015-2016 Imply Data, Inc. - * Copyright 2017-2019 Allegro.pl - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -@import '../../imports'; - -.no-data-view { - @import '../../utils/styles/grid'; - - .container { - position: absolute; - top: 50%; - left: 50%; - - transform: translate(-50%, -50%); - text-align: center; - - .title { - .icon { - display: inline-block; - margin-bottom: 6px; - width: 42px; - - path { - @include css-variable(fill, text-light); - } - } - - .label { - @include css-variable(color, text-light); - display: inline-block; - height: 46px; - padding-top: 13px; - font-size: 20px; - } - } - - .action { - @include css-variable(color, text-light); - - a { - @include css-variable(color, brand); - border-bottom: 1px dashed; - } - } - } -} diff --git a/src/client/views/no-data-view/no-data-view.tsx b/src/client/views/no-data-view/no-data-view.tsx deleted file mode 100644 index beced52eb..000000000 --- a/src/client/views/no-data-view/no-data-view.tsx +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright 2015-2016 Imply Data, Inc. - * Copyright 2017-2019 Allegro.pl - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import * as React from "react"; -import { AppSettings } from "../../../common/models/app-settings/app-settings"; -import { Customization } from "../../../common/models/customization/customization"; -import { Fn } from "../../../common/utils/general/general"; -import { HeaderBar } from "../../components/header-bar/header-bar"; -import { SvgIcon } from "../../components/svg-icon/svg-icon"; -import { STRINGS } from "../../config/constants"; -import "./no-data-view.scss"; - -export interface NoDataViewProps { - appSettings?: AppSettings; - onOpenAbout: Fn; - customization?: Customization; -} - -function label(appSettings: AppSettings): string { - const { clusters } = appSettings; - - const hasClusters = clusters && clusters.length > 0; - return !hasClusters ? STRINGS.noConnectedData : STRINGS.noQueryableDataCubes; -} - -const NoDataTitle: React.SFC<{ appSettings: AppSettings }> = props => { - return
-
- -
-
{label(props.appSettings)}
-
; -}; - -export const NoDataView: React.SFC = props => { - const { onOpenAbout, customization, appSettings } = props; - return
- - - -
- -
-
; -}; diff --git a/src/common/models/app-settings/app-settings.ts b/src/common/models/app-settings/app-settings.ts index b78f738dc..b968c79f6 100644 --- a/src/common/models/app-settings/app-settings.ts +++ b/src/common/models/app-settings/app-settings.ts @@ -23,6 +23,7 @@ import { Cluster, ClusterJS } from "../cluster/cluster"; import { findCluster } from "../cluster/find-cluster"; import { Customization, CustomizationJS } from "../customization/customization"; import { DataCube, DataCubeJS } from "../data-cube/data-cube"; +import { Oauth, OauthJS } from "../oauth/oauth"; const DEFAULT_CLIENT_TIMEOUT = 0; @@ -32,6 +33,7 @@ export interface AppSettingsValue { clusters?: Cluster[]; customization?: Customization; dataCubes?: DataCube[]; + oauth?: Oauth; } export interface AppSettingsJS { @@ -40,10 +42,11 @@ export interface AppSettingsJS { clusters?: ClusterJS[]; customization?: CustomizationJS; dataCubes?: DataCubeJS[]; + oauth?: OauthJS; } export interface AppSettingsContext { - executorFactory?: (dataCubeName: string, timeout: number) => Executor; + executorFactory?: (dataCubeName: string) => Executor; } var check: Class; @@ -80,16 +83,19 @@ export class AppSettings implements Instance { let dataCubeObject = DataCube.fromJS(dataCubeJS, { cluster }); if (executorFactory) { - const executor = executorFactory(dataCubeObject.name, clientTimeout); + const executor = executorFactory(dataCubeObject.name); if (executor) dataCubeObject = dataCubeObject.attachExecutor(executor); } return dataCubeObject; }); + const oauth = parameters.oauth ? Oauth.fromJS(parameters.oauth) : undefined; + const value: AppSettingsValue = { version: parameters.version, clientTimeout, clusters, + oauth, customization: Customization.fromJS(parameters.customization || {}), dataCubes }; @@ -101,6 +107,7 @@ export class AppSettings implements Instance { public clientTimeout: number; public clusters: Cluster[]; public customization: Customization; + public oauth?: Oauth; public dataCubes: DataCube[]; constructor(parameters: AppSettingsValue) { @@ -109,7 +116,8 @@ export class AppSettings implements Instance { clientTimeout, clusters, customization, - dataCubes + dataCubes, + oauth } = parameters; for (const dataCube of dataCubes) { @@ -124,6 +132,7 @@ export class AppSettings implements Instance { this.clusters = clusters; this.customization = customization; this.dataCubes = dataCubes; + this.oauth = oauth; } public valueOf(): AppSettingsValue { @@ -132,6 +141,7 @@ export class AppSettings implements Instance { clientTimeout: this.clientTimeout, clusters: this.clusters, customization: this.customization, + oauth: this.oauth, dataCubes: this.dataCubes }; } @@ -142,6 +152,7 @@ export class AppSettings implements Instance { js.clientTimeout = this.clientTimeout; js.clusters = this.clusters.map(cluster => cluster.toJS()); js.customization = this.customization.toJS(); + if (this.oauth) js.oauth = this.oauth.toJS(); js.dataCubes = this.dataCubes.map(dataCube => dataCube.toJS()); return js; } @@ -160,6 +171,7 @@ export class AppSettings implements Instance { this.clientTimeout === other.clientTimeout && immutableArraysEqual(this.clusters, other.clusters) && immutableEqual(this.customization, other.customization) && + immutableEqual(this.oauth, other.oauth) && immutableArraysEqual(this.dataCubes, other.dataCubes); } @@ -175,6 +187,16 @@ export class AppSettings implements Instance { return new AppSettings(value); } + public withoutSources(): AppSettings { + let value = this.valueOf(); + + value.clusters = []; + + value.dataCubes = []; + + return new AppSettings(value); + } + public getVersion(): number { return this.version; } diff --git a/src/common/models/oauth/oauth.ts b/src/common/models/oauth/oauth.ts new file mode 100644 index 000000000..998d61519 --- /dev/null +++ b/src/common/models/oauth/oauth.ts @@ -0,0 +1,54 @@ +/* + * Copyright 2017-2021 Allegro.pl + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { BaseImmutable, Property } from "immutable-class"; + +interface OauthValue { + clientId: string; + tokenEndpoint: string; + authorizationEndpoint: string; + tokenHeaderName: string; + redirectUri: string; +} + +export interface OauthJS { + clientId: string; + tokenEndpoint: string; + authorizationEndpoint: string; + tokenHeaderName: string; + redirectUri: string; +} + +export class Oauth extends BaseImmutable { + + static PROPERTIES: Property[] = [ + { name: "clientId" }, + { name: "tokenEndpoint" }, + { name: "authorizationEndpoint" }, + { name: "tokenHeaderName" }, + { name: "redirectUri" } + ]; + + static fromJS(params: OauthJS): Oauth { + return new Oauth(BaseImmutable.jsToValue(Oauth.PROPERTIES, params)); + } + + public clientId: string; + public tokenEndpoint: string; + public authorizationEndpoint: string; + public tokenHeaderName: string; + public redirectUri: string; +} diff --git a/src/server/app.ts b/src/server/app.ts index b75dbd198..f7269693c 100644 --- a/src/server/app.ts +++ b/src/server/app.ts @@ -29,6 +29,7 @@ import { mkurlRouter } from "./routes/mkurl/mkurl"; import { plyqlRouter } from "./routes/plyql/plyql"; import { plywoodRouter } from "./routes/plywood/plywood"; import { readinessRouter } from "./routes/readiness/readiness"; +import { settingsRouter } from "./routes/settings/settings"; import { shortenRouter } from "./routes/shorten/shorten"; import { turniloRouter } from "./routes/turnilo/turnilo"; import { loadPlugin } from "./utils/plugin-loader/load-plugin"; @@ -140,6 +141,7 @@ attachRouter(SERVER_SETTINGS.getReadinessEndpoint(), readinessRouter(appSettings attachRouter(SERVER_SETTINGS.getLivenessEndpoint(), livenessRouter); // Data routes +attachRouter("/settings", settingsRouter(appSettings)); attachRouter("/plywood", plywoodRouter(SETTINGS_MANAGER)); attachRouter("/plyql", plyqlRouter(appSettings)); attachRouter("/mkurl", mkurlRouter(appSettings)); diff --git a/src/server/routes/plywood/plywood.ts b/src/server/routes/plywood/plywood.ts index c7b8b1223..893669ea1 100644 --- a/src/server/routes/plywood/plywood.ts +++ b/src/server/routes/plywood/plywood.ts @@ -83,7 +83,7 @@ export function plywoodRouter(settingsManager: Pick { + + try { + const settings = await settingsGetter(); + const clientSettings = settings.toClientSettings(); + clientSettings.dataCubes = clientSettings.dataCubes.filter( dataCube => checkAccess(dataCube, req.headers) ); + res.json(clientSettings); + } catch (error) { + logger.error(error.message); + if (error.hasOwnProperty("stack")) { + logger.error(error.stack); + } + res.status(500).send({ + error: "Can't fetch settings", + message: error.message + }); + } + }); + + return router; +} diff --git a/src/server/routes/turnilo/turnilo.ts b/src/server/routes/turnilo/turnilo.ts index 5eeb1d67a..bc4526e35 100644 --- a/src/server/routes/turnilo/turnilo.ts +++ b/src/server/routes/turnilo/turnilo.ts @@ -17,7 +17,6 @@ import { Request, Response, Router } from "express"; import { SETTINGS_MANAGER } from "../../config"; -import { checkAccess } from "../../utils/datacube-guard/datacube-guard"; import { SettingsGetter } from "../../utils/settings-manager/settings-manager"; import { mainLayout } from "../../views"; @@ -28,8 +27,7 @@ export function turniloRouter(settingsGetter: SettingsGetter, version: string) { router.get("/", async (req: Request, res: Response) => { try { const settings = await settingsGetter(); - const clientSettings = settings.toClientSettings(); - clientSettings.dataCubes = clientSettings.dataCubes.filter( dataCube => checkAccess(dataCube, req.headers) ); + const clientSettings = settings.withoutSources(); res.send(mainLayout({ version, title: settings.customization.getTitle(version), diff --git a/src/server/views.ts b/src/server/views.ts index 6a46347d9..dc8d24c38 100644 --- a/src/server/views.ts +++ b/src/server/views.ts @@ -77,9 +77,9 @@ export function mainLayout(options: ViewOptions): string { } return layout(options, `
- + -${cssOverrides}` +${cssOverrides || ""}` ); } From 2ede4faf456e995573c6a835a86a921a41bf2465 Mon Sep 17 00:00:00 2001 From: adrianmroz-allegro Date: Wed, 14 Apr 2021 10:45:42 +0000 Subject: [PATCH 002/264] Release 1.31.1-beta.0 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index e0850ce82..9d0e5c832 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "turnilo", - "version": "1.31.0", + "version": "1.31.1-beta.0", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/package.json b/package.json index 1f35bee82..824faa7d7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "turnilo", - "version": "1.31.0", + "version": "1.31.1-beta.0", "description": "A web-based exploratory visualization UI for Druid.io", "keywords": [ "imply", From 7bce2934b5e43ad182843aa6d97138ab710982c4 Mon Sep 17 00:00:00 2001 From: adrianmroz-allegro Date: Wed, 14 Apr 2021 10:59:39 +0000 Subject: [PATCH 003/264] Release 1.31.1-beta.1 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9d0e5c832..61ebfe730 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "turnilo", - "version": "1.31.1-beta.0", + "version": "1.31.1-beta.1", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/package.json b/package.json index 824faa7d7..08a202258 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "turnilo", - "version": "1.31.1-beta.0", + "version": "1.31.1-beta.1", "description": "A web-based exploratory visualization UI for Druid.io", "keywords": [ "imply", From 79de390a1f6662e4155c3a4942862a636d0d6af6 Mon Sep 17 00:00:00 2001 From: adrianmroz <78143552+adrianmroz-allegro@users.noreply.github.com> Date: Wed, 14 Apr 2021 13:40:30 +0200 Subject: [PATCH 004/264] dry-run for beta release action --- .github/workflows/release-beta.yml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/release-beta.yml b/.github/workflows/release-beta.yml index 4f2fc9d15..a87f23a7b 100644 --- a/.github/workflows/release-beta.yml +++ b/.github/workflows/release-beta.yml @@ -34,20 +34,20 @@ jobs: ${{ runner.OS }}-node- ${{ runner.OS }}- - - name: Install dependencies - run: npm ci + #- name: Install dependencies + # run: npm ci - - name: Lint - run: npm run lint + #- name: Lint + # run: npm run lint - - name: Build - run: npm run build + #- name: Build + # run: npm run build - - name: Unit Test - run: npm run test + #- name: Unit Test + # run: npm run test - - name: E2E Test - run: npm run e2e + #- name: E2E Test + # run: npm run e2e - name: Configure GIT run: | @@ -63,4 +63,4 @@ jobs: NPM_TOKEN: ${{ secrets.NPM_TOKEN }} NPM_CONFIG_USERCONFIG: .npmrc-publish run: | - release-it ${{ github.event.inputs.increment }} --preRelease=beta --ci + release-it ${{ github.event.inputs.increment }} --preRelease=beta --ci --dry-run From 5c349fce7f372048af6770bd50a60699592552ff Mon Sep 17 00:00:00 2001 From: adrianmroz <78143552+adrianmroz-allegro@users.noreply.github.com> Date: Wed, 14 Apr 2021 13:52:01 +0200 Subject: [PATCH 005/264] Bump release-it version --- .github/workflows/release-beta.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release-beta.yml b/.github/workflows/release-beta.yml index a87f23a7b..2dde9b818 100644 --- a/.github/workflows/release-beta.yml +++ b/.github/workflows/release-beta.yml @@ -55,7 +55,7 @@ jobs: git config user.email "${GITHUB_ACTOR}@users.noreply.github.com" - name: Install release-it - run: npm install -g release-it@13.7.1 + run: npm install -g release-it@14.6.1 - name: Beta Release env: From 0cdb0351b8c9819c764b4ff1d1843ab33dfdbf8b Mon Sep 17 00:00:00 2001 From: Adrian Mroz Date: Wed, 14 Apr 2021 13:55:37 +0200 Subject: [PATCH 006/264] Pin release-it version in github release actions --- .github/workflows/release-beta.yml | 23 ++++++++++++----------- .github/workflows/release-final.yml | 2 +- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/.github/workflows/release-beta.yml b/.github/workflows/release-beta.yml index 2dde9b818..3445aea19 100644 --- a/.github/workflows/release-beta.yml +++ b/.github/workflows/release-beta.yml @@ -5,6 +5,7 @@ on: inputs: increment: description: 'Defines which part of a SemVer should be increased during the release process, e.g "major", "minor", "patch" or empty for consecutive release' + required: false jobs: build: @@ -34,20 +35,20 @@ jobs: ${{ runner.OS }}-node- ${{ runner.OS }}- - #- name: Install dependencies - # run: npm ci + - name: Install dependencies + run: npm ci - #- name: Lint - # run: npm run lint + - name: Lint + run: npm run lint - #- name: Build - # run: npm run build + - name: Build + run: npm run build - #- name: Unit Test - # run: npm run test + - name: Unit Test + run: npm run test - #- name: E2E Test - # run: npm run e2e + - name: E2E Test + run: npm run e2e - name: Configure GIT run: | @@ -63,4 +64,4 @@ jobs: NPM_TOKEN: ${{ secrets.NPM_TOKEN }} NPM_CONFIG_USERCONFIG: .npmrc-publish run: | - release-it ${{ github.event.inputs.increment }} --preRelease=beta --ci --dry-run + release-it ${{ github.event.inputs.increment }} --preRelease=beta --ci diff --git a/.github/workflows/release-final.yml b/.github/workflows/release-final.yml index dd0071643..2981a0944 100644 --- a/.github/workflows/release-final.yml +++ b/.github/workflows/release-final.yml @@ -61,7 +61,7 @@ jobs: git config user.email "${GITHUB_ACTOR}@users.noreply.github.com" - name: Install release-it - run: npm install -g release-it@13.7.1 + run: npm install -g release-it@14.6.1 - name: Final Release env: From a379d99cb141f1aead968801fa7b01e7a1e76a0b Mon Sep 17 00:00:00 2001 From: adrianmroz-allegro Date: Wed, 14 Apr 2021 12:08:05 +0000 Subject: [PATCH 007/264] Release 1.32.0-beta.0 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 61ebfe730..f74fbf35d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "turnilo", - "version": "1.31.1-beta.1", + "version": "1.32.0-beta.0", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/package.json b/package.json index 08a202258..e85498115 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "turnilo", - "version": "1.31.1-beta.1", + "version": "1.32.0-beta.0", "description": "A web-based exploratory visualization UI for Druid.io", "keywords": [ "imply", From 885629961ed17df2c6068526decc83235b14f2aa Mon Sep 17 00:00:00 2001 From: adrianmroz <78143552+adrianmroz-allegro@users.noreply.github.com> Date: Thu, 15 Apr 2021 10:51:44 +0200 Subject: [PATCH 008/264] use arrow function to avoid binding context (#728) --- src/client/oauth/oauth-code-handler.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/oauth/oauth-code-handler.tsx b/src/client/oauth/oauth-code-handler.tsx index b02b65e2a..2013c86f4 100644 --- a/src/client/oauth/oauth-code-handler.tsx +++ b/src/client/oauth/oauth-code-handler.tsx @@ -49,7 +49,7 @@ export class OauthCodeHandler extends React.Component { const { code, oauth } = this.props; this.setState({ request: pending }); exchangeCodeForToken(code, oauth) From ef053d2aeb6b5571132468666ed571cb06fdf0d9 Mon Sep 17 00:00:00 2001 From: adrianmroz <78143552+adrianmroz-allegro@users.noreply.github.com> Date: Fri, 16 Apr 2021 12:55:01 +0200 Subject: [PATCH 009/264] Bugfix/oauth visual issues (#730) * Use button for MessagePanel action * Use MessagePanel with Loader for AppSettings loading state --- .../turnilo-application/app-settings-provider.tsx | 5 ++++- .../components/message-panel/message-panel.scss | 14 ++++---------- .../components/message-panel/message-panel.tsx | 7 +++++-- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/client/applications/turnilo-application/app-settings-provider.tsx b/src/client/applications/turnilo-application/app-settings-provider.tsx index 3bed513fd..17f32a7e7 100644 --- a/src/client/applications/turnilo-application/app-settings-provider.tsx +++ b/src/client/applications/turnilo-application/app-settings-provider.tsx @@ -18,6 +18,7 @@ import * as React from "react"; import { AppSettings } from "../../../common/models/app-settings/app-settings"; import { Unary } from "../../../common/utils/functional/functional"; import { Loader } from "../../components/loader/loader"; +import { MessagePanel } from "../../components/message-panel/message-panel"; import { Ajax } from "../../utils/ajax/ajax"; enum SettingsResourceStatus { LOADED, LOADING, ERROR } @@ -83,7 +84,9 @@ export class AppSettingsProvider extends React.Component; + return + + ; case SettingsResourceStatus.ERROR: throw appSettings.error; case SettingsResourceStatus.LOADED: diff --git a/src/client/components/message-panel/message-panel.scss b/src/client/components/message-panel/message-panel.scss index 5fee0bb67..71ce0dafc 100644 --- a/src/client/components/message-panel/message-panel.scss +++ b/src/client/components/message-panel/message-panel.scss @@ -40,14 +40,8 @@ font-size: 14px; } -.message-panel__action { - @include css-variable(color, brand); - margin-top: 24px; - font-size: 18px; - cursor: pointer; - text-align: center; - - &:hover { - text-decoration: underline; - } +.message-panel__children { + margin-top: 36px; + display: flex; + justify-content: center; } diff --git a/src/client/components/message-panel/message-panel.tsx b/src/client/components/message-panel/message-panel.tsx index b2ba3e684..6a8864723 100644 --- a/src/client/components/message-panel/message-panel.tsx +++ b/src/client/components/message-panel/message-panel.tsx @@ -16,6 +16,7 @@ import * as React from "react"; import { Nullary } from "../../../common/utils/functional/functional"; +import { Button } from "../button/button"; import "./message-panel.scss"; interface ErrorViewActionProps { @@ -24,7 +25,7 @@ interface ErrorViewActionProps { } export const MessagePanelAction: React.SFC = ({ action, label }) => -
{label}
; +
; }; From f2213ae81fe70fc1b55eef03c2d20499502760e8 Mon Sep 17 00:00:00 2001 From: adrianmroz <78143552+adrianmroz-allegro@users.noreply.github.com> Date: Tue, 20 Apr 2021 09:44:25 +0200 Subject: [PATCH 010/264] response field is optional on AxiosError, so we need to check if it exists (#732) --- src/client/oauth/oauth.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/client/oauth/oauth.ts b/src/client/oauth/oauth.ts index 7c64e9664..319bbbeb8 100644 --- a/src/client/oauth/oauth.ts +++ b/src/client/oauth/oauth.ts @@ -58,10 +58,10 @@ export const isOauthError = (error: Error): error is OauthError => error.hasOwnProperty("isOauthError"); export function mapOauthError(oauth: Oauth, error: AxiosError): Error { - if (!!oauth) { + if (!!oauth && !!error.response) { const { response: { status } } = error; - if (status === 401) return new OauthAuthenticationError(); - if (status === 403) return new OauthAuthorizationError(); + if (status === 401) return new OauthAuthenticationError(error.message); + if (status === 403) return new OauthAuthorizationError(error.message); } return error; } From a6d232bae47d8a833a027ff93418b42350a7b719 Mon Sep 17 00:00:00 2001 From: adrianmroz <78143552+adrianmroz-allegro@users.noreply.github.com> Date: Thu, 22 Apr 2021 10:26:40 +0200 Subject: [PATCH 011/264] Histograms are assigned correct percentile when selected as default measure (#735) * Force exit for mocha. * DataCube returns SeriesList for default selected measures. It now creates Series from Measures, not just names. That way histograms are created with regular constructor and can read default percentile. --- package.json | 6 +++--- src/common/models/data-cube/data-cube.ts | 7 +++++-- src/common/models/essence/essence.fixtures.ts | 19 +++++++++++++++---- src/common/models/essence/essence.mocha.ts | 4 ++-- src/common/models/essence/essence.ts | 4 ++-- src/common/models/series-list/series-list.ts | 4 ---- 6 files changed, 27 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index e85498115..6a2e8ff9d 100644 --- a/package.json +++ b/package.json @@ -38,9 +38,9 @@ "scripts": { "test": "npm-run-all -s test:*", "watch:test": "npm-run-all -p watch:test:*", - "test:common": "mocha --require ./test/setup/mocha.js src/common/**/*.mocha.{ts,tsx}", - "test:client": "mocha --require ./test/setup/mocha.js src/client/**/*.mocha.{ts,tsx}", - "test:server": "mocha --require ./test/setup/mocha.js src/server/**/*.mocha.ts", + "test:common": "mocha --exit --require ./test/setup/mocha.js src/common/**/*.mocha.{ts,tsx}", + "test:client": "mocha --exit --require ./test/setup/mocha.js src/client/**/*.mocha.{ts,tsx}", + "test:server": "mocha --exit --require ./test/setup/mocha.js src/server/**/*.mocha.ts", "watch:test:common": "npm run test:common -- --watch --watch-extensions ts,tsx", "watch:test:client": "npm run test:client -- --watch --watch-extensions ts,tsx", "watch:test:server": "npm run test:server -- --watch --watch-extensions ts,tsx", diff --git a/src/common/models/data-cube/data-cube.ts b/src/common/models/data-cube/data-cube.ts index a74a2f580..65893ef9e 100644 --- a/src/common/models/data-cube/data-cube.ts +++ b/src/common/models/data-cube/data-cube.ts @@ -52,6 +52,7 @@ import { MeasureOrGroupJS } from "../measure/measure-group"; import { Measures } from "../measure/measures"; import { QueryDecoratorDefinition, QueryDecoratorDefinitionJS } from "../query-decorator/query-decorator"; import { RefreshRule, RefreshRuleJS } from "../refresh-rule/refresh-rule"; +import { SeriesList } from "../series-list/series-list"; import { EMPTY_SPLITS, Splits } from "../splits/splits"; import { Timekeeper } from "../timekeeper/timekeeper"; @@ -904,8 +905,10 @@ export class DataCube implements Instance { return isTruthy(this.maxQueries) ? this.maxQueries : DataCube.DEFAULT_MAX_QUERIES; } - public getDefaultSelectedMeasures(): OrderedSet { - return this.defaultSelectedMeasures || this.measures.getFirstNMeasureNames(4); + public getDefaultSeries(): SeriesList { + const measureNames = this.defaultSelectedMeasures || this.measures.getFirstNMeasureNames(4); + const measures = measureNames.toArray().map(name => this.getMeasure(name)); + return SeriesList.fromMeasures(measures); } public getDefaultPinnedDimensions(): OrderedSet { diff --git a/src/common/models/essence/essence.fixtures.ts b/src/common/models/essence/essence.fixtures.ts index 702b4e111..b24c50c9a 100644 --- a/src/common/models/essence/essence.fixtures.ts +++ b/src/common/models/essence/essence.fixtures.ts @@ -26,6 +26,7 @@ import { NumberFilterClause, NumberRange, RelativeTimeFilterClause, TimeFilterPe import { boolean, numberRange, stringContains, stringIn, stringMatch, timePeriod, timeRange } from "../filter-clause/filter-clause.fixtures"; import { Filter } from "../filter/filter"; import { EMPTY_SERIES, SeriesList } from "../series-list/series-list"; +import { measureSeries } from "../series/series.fixtures"; import { SortDirection } from "../sort/sort"; import { numberSplitCombine, stringSplitCombine, timeSplitCombine } from "../split/split.fixtures"; import { EMPTY_SPLITS, Splits } from "../splits/splits"; @@ -55,7 +56,7 @@ export class EssenceFixtures { return { ...defaultEssence, visualization: TOTALS_MANIFEST, - series: SeriesList.fromMeasureNames(["count"]) + series: SeriesList.fromSeries([measureSeries("count")]) }; } @@ -101,7 +102,7 @@ export class EssenceFixtures { timeShift: TimeShift.empty(), filter: Filter.fromClauses(filterClauses), splits: new Splits({ splits: List(splitCombines) }), - series: SeriesList.fromMeasureNames(["added"]), + series: SeriesList.fromSeries([measureSeries("added")]), pinnedDimensions: OrderedSet(["channel", "namespace", "isRobot"]), pinnedSort: "delta" }); @@ -122,6 +123,11 @@ export class EssenceFixtures { numberSplitCombine("commentLength", 10, { sort: { reference: "delta", direction: SortDirection.descending }, limit: 5 }), timeSplitCombine("time", "PT1H", { sort: { reference: "delta", direction: SortDirection.descending }, limit: null }) ]; + const series = [ + measureSeries("delta"), + measureSeries("count"), + measureSeries("added") + ]; return new Essence({ dataCube: DataCubeFixtures.wiki(), visualization: TABLE_MANIFEST, @@ -130,7 +136,7 @@ export class EssenceFixtures { timeShift: TimeShift.empty(), filter: Filter.fromClauses(filterClauses), splits: new Splits({ splits: List(splitCombines) }), - series: SeriesList.fromMeasureNames(["delta", "count", "added"]), + series: SeriesList.fromSeries(series), pinnedDimensions: OrderedSet(["channel", "namespace", "isRobot"]), pinnedSort: "delta" }); @@ -145,6 +151,11 @@ export class EssenceFixtures { stringSplitCombine("channel", { sort: { reference: "delta", direction: SortDirection.descending }, limit: 50 }), timeSplitCombine("time", "PT1H", { sort: { reference: "delta", direction: SortDirection.descending }, limit: null }) ]; + const series = [ + measureSeries("delta"), + measureSeries("count"), + measureSeries("added") + ]; return new Essence({ dataCube: DataCubeFixtures.wiki(), visualization: LINE_CHART_MANIFEST, @@ -153,7 +164,7 @@ export class EssenceFixtures { timeShift: TimeShift.empty(), filter: Filter.fromClauses(filterClauses), splits: new Splits({ splits: List(splitCombines) }), - series: SeriesList.fromMeasureNames(["delta", "count", "added"]), + series: SeriesList.fromSeries(series), pinnedDimensions: OrderedSet(["channel", "namespace", "isRobot"]), pinnedSort: "delta" }); diff --git a/src/common/models/essence/essence.mocha.ts b/src/common/models/essence/essence.mocha.ts index 247285ba3..c70d29eac 100644 --- a/src/common/models/essence/essence.mocha.ts +++ b/src/common/models/essence/essence.mocha.ts @@ -139,7 +139,7 @@ describe("EssenceProps", () => { describe("vis picking", () => { describe("#getBestVisualization", () => { - const series = ["count"]; + const series = [new MeasureSeries({ reference: "count" })]; const tests = [ { splits: [], @@ -185,7 +185,7 @@ describe("EssenceProps", () => { const { visualization } = Essence.getBestVisualization( DataCubeFixtures.twitter(), Splits.fromSplits(splits), - SeriesList.fromMeasureNames(series), + SeriesList.fromSeries(series), current); expect(visualization).to.deep.equal(expected); diff --git a/src/common/models/essence/essence.ts b/src/common/models/essence/essence.ts index 2fc618344..239112d10 100644 --- a/src/common/models/essence/essence.ts +++ b/src/common/models/essence/essence.ts @@ -155,7 +155,7 @@ export class Essence extends ImmutableRecord(defaultEssence) { filter: dataCube.getDefaultFilter(), timeShift: TimeShift.empty(), splits: dataCube.getDefaultSplits(), - series: SeriesList.fromMeasureNames(dataCube.getDefaultSelectedMeasures().toArray()), + series: dataCube.getDefaultSeries(), pinnedDimensions: dataCube.getDefaultPinnedDimensions(), pinnedSort: dataCube.getDefaultSortMeasure() }); @@ -422,7 +422,7 @@ export class Essence extends ImmutableRecord(defaultEssence) { const seriesValidInNewCube = essence.series.constrainToMeasures(newDataCube.measures); const newSeriesList = !seriesValidInNewCube.isEmpty() ? seriesValidInNewCube - : SeriesList.fromMeasureNames(newDataCube.getDefaultSelectedMeasures().toArray()); + : newDataCube.getDefaultSeries(); return essence .update("filter", filter => filter.constrainToDimensions(newDataCube.dimensions)) diff --git a/src/common/models/series-list/series-list.ts b/src/common/models/series-list/series-list.ts index abe9e052c..0735f245e 100644 --- a/src/common/models/series-list/series-list.ts +++ b/src/common/models/series-list/series-list.ts @@ -32,10 +32,6 @@ const defaultSeriesList: SeriesListValue = { series: List([]) }; export class SeriesList extends Record(defaultSeriesList) { - static fromMeasureNames(names: string[]): SeriesList { - return new SeriesList({ series: List(names.map(reference => new MeasureSeries({ reference }))) }); - } - static fromMeasures(measures: Measure[]): SeriesList { const series = List(measures.map(fromMeasure)); return new SeriesList({ series }); From e83afb771fe4ff0e741dd5643f983f525a714be7 Mon Sep 17 00:00:00 2001 From: adrianmroz <78143552+adrianmroz-allegro@users.noreply.github.com> Date: Thu, 22 Apr 2021 10:39:28 +0200 Subject: [PATCH 012/264] Apply time shift period filter after counting whole expression (#737) --- src/common/models/series/concrete-series.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/common/models/series/concrete-series.ts b/src/common/models/series/concrete-series.ts index 2526b57ed..9b0bc898b 100644 --- a/src/common/models/series/concrete-series.ts +++ b/src/common/models/series/concrete-series.ts @@ -57,8 +57,12 @@ export abstract class ConcreteSeries { case TimeShiftEnvType.WITH_PREVIOUS: { const currentName = this.plywoodKey(); const previousName = this.plywoodKey(SeriesDerivation.PREVIOUS); - const current = this.applyExpression(this.filterMainRefs(expression, timeShiftEnv.currentFilter), currentName, nestingLevel); - const previous = this.applyExpression(this.filterMainRefs(expression, timeShiftEnv.previousFilter), previousName, nestingLevel); + const current = this.filterMainRefs( + this.applyExpression(expression, currentName, nestingLevel), + timeShiftEnv.currentFilter); + const previous = this.filterMainRefs( + this.applyExpression(expression, previousName, nestingLevel), + timeShiftEnv.previousFilter); const delta = new ApplyExpression({ name: this.plywoodKey(SeriesDerivation.DELTA), expression: $(currentName).subtract($(previousName)) From 36fd8716acc3bca57bd638cf978a5b0b7d6a0276 Mon Sep 17 00:00:00 2001 From: adrianmroz-allegro Date: Thu, 22 Apr 2021 08:54:18 +0000 Subject: [PATCH 013/264] Release 1.32.0-beta.1 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index f74fbf35d..7d18c64a9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "turnilo", - "version": "1.32.0-beta.0", + "version": "1.32.0-beta.1", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/package.json b/package.json index 6a2e8ff9d..e1cd5ea9a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "turnilo", - "version": "1.32.0-beta.0", + "version": "1.32.0-beta.1", "description": "A web-based exploratory visualization UI for Druid.io", "keywords": [ "imply", From 4754142b8588382a54ab5952229a32efa22223bc Mon Sep 17 00:00:00 2001 From: adrianmroz <78143552+adrianmroz-allegro@users.noreply.github.com> Date: Thu, 29 Apr 2021 15:53:52 +0200 Subject: [PATCH 014/264] Cleanup AppSettings (#739) * Split AppSettings into AppSettings and Sources. Drop immutable structures and use POJsOs. * Oauth settings (#740) * Write Oauth settings object using new patterns * Rename imported function * Better error message --- .../app-settings-provider.tsx | 96 --- .../turnilo-application.tsx | 77 ++- .../sources-provider/sources-provider.tsx | 97 +++ src/client/main.tsx | 7 +- src/client/oauth/oauth-code-handler.tsx | 4 +- src/client/oauth/oauth-message-view.tsx | 4 +- src/client/oauth/oauth.ts | 8 +- src/client/utils/ajax/ajax.ts | 23 +- src/client/views/cube-view/cube-view.tsx | 5 +- .../app-settings/app-settings.fixtures.ts | 305 +-------- .../models/app-settings/app-settings.mocha.ts | 594 +++++++++--------- .../models/app-settings/app-settings.ts | 291 ++------- src/common/models/cluster/cluster.fixtures.ts | 13 +- src/common/models/oauth/oauth.ts | 52 +- src/common/models/sources/sources.fixtures.ts | 302 +++++++++ src/common/models/sources/sources.ts | 134 ++++ src/common/utils/yaml-helper/yaml-helper.ts | 40 +- src/server/app.ts | 25 +- src/server/config.ts | 84 +-- .../models/plugin-settings/plugin-settings.ts | 8 +- src/server/routes/mkurl/mkurl.mocha.ts | 4 +- src/server/routes/mkurl/mkurl.ts | 13 +- src/server/routes/plyql/plyql.mocha.ts | 4 +- src/server/routes/plyql/plyql.ts | 9 +- src/server/routes/plywood/plywood.mocha.ts | 4 +- src/server/routes/plywood/plywood.ts | 11 +- .../routes/readiness/readiness.mocha.ts | 6 +- src/server/routes/readiness/readiness.ts | 8 +- src/server/routes/shorten/shorten.mocha.ts | 12 +- src/server/routes/shorten/shorten.ts | 5 +- .../settings.ts => sources/sources.ts} | 14 +- src/server/routes/turnilo/turnilo.ts | 8 +- .../utils/cluster-manager/cluster-manager.ts | 1 - .../settings-manager/settings-manager.ts | 85 +-- .../utils/settings-store/settings-store.ts | 30 - src/server/views.ts | 4 +- 36 files changed, 1179 insertions(+), 1208 deletions(-) delete mode 100644 src/client/applications/turnilo-application/app-settings-provider.tsx create mode 100644 src/client/components/sources-provider/sources-provider.tsx create mode 100644 src/common/models/sources/sources.fixtures.ts create mode 100644 src/common/models/sources/sources.ts rename src/server/routes/{settings/settings.ts => sources/sources.ts} (74%) delete mode 100644 src/server/utils/settings-store/settings-store.ts diff --git a/src/client/applications/turnilo-application/app-settings-provider.tsx b/src/client/applications/turnilo-application/app-settings-provider.tsx deleted file mode 100644 index 17f32a7e7..000000000 --- a/src/client/applications/turnilo-application/app-settings-provider.tsx +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright 2017-2018 Allegro.pl - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import * as React from "react"; -import { AppSettings } from "../../../common/models/app-settings/app-settings"; -import { Unary } from "../../../common/utils/functional/functional"; -import { Loader } from "../../components/loader/loader"; -import { MessagePanel } from "../../components/message-panel/message-panel"; -import { Ajax } from "../../utils/ajax/ajax"; - -enum SettingsResourceStatus { LOADED, LOADING, ERROR } - -interface SettingsResourceBase { - status: SettingsResourceStatus; -} - -interface SettingsResourceLoading extends SettingsResourceBase { - status: SettingsResourceStatus.LOADING; -} - -interface SettingsResourceLoaded extends SettingsResourceBase { - status: SettingsResourceStatus.LOADED; - settings: AppSettings; -} - -interface SettingsResourceLoadError extends SettingsResourceBase { - status: SettingsResourceStatus.ERROR; - error: Error; -} - -type SettingsResource = SettingsResourceLoading | SettingsResourceLoadError | SettingsResourceLoaded; - -const loading: SettingsResource = { status: SettingsResourceStatus.LOADING }; -const loaded = (settings: AppSettings): SettingsResource => ({ - status: SettingsResourceStatus.LOADED, - settings -}); -const errored = (error: Error): SettingsResource => ({ - status: SettingsResourceStatus.ERROR, - error -}); - -interface AppSettingsProviderProps { - clientAppSettings: AppSettings; - children: Unary<{ appSettings: AppSettings }, React.ReactNode>; -} - -interface AppSettingsProviderState { - appSettings: SettingsResource; -} - -export class AppSettingsProvider extends React.Component { - - state: AppSettingsProviderState = { appSettings: loading }; - - componentDidMount() { - Ajax.settings(this.props.clientAppSettings) - .then(appSettings => { - this.setState({ - appSettings: loaded(appSettings) - }); - }) - .catch(error => { - this.setState({ - appSettings: errored(error) - }); - }); - } - - render() { - const { appSettings } = this.state; - switch (appSettings.status) { - case SettingsResourceStatus.LOADING: - return - - ; - case SettingsResourceStatus.ERROR: - throw appSettings.error; - case SettingsResourceStatus.LOADED: - return this.props.children({ appSettings: appSettings.settings }); - } - } -} diff --git a/src/client/applications/turnilo-application/turnilo-application.tsx b/src/client/applications/turnilo-application/turnilo-application.tsx index 30d38d54f..c78d254bd 100644 --- a/src/client/applications/turnilo-application/turnilo-application.tsx +++ b/src/client/applications/turnilo-application/turnilo-application.tsx @@ -20,10 +20,12 @@ import * as React from "react"; import { AppSettings } from "../../../common/models/app-settings/app-settings"; import { DataCube } from "../../../common/models/data-cube/data-cube"; import { Essence } from "../../../common/models/essence/essence"; +import { isEnabled as isOAuthEnabled } from "../../../common/models/oauth/oauth"; import { Timekeeper } from "../../../common/models/timekeeper/timekeeper"; import { urlHashConverter } from "../../../common/utils/url-hash-converter/url-hash-converter"; import { DataCubeNotFound } from "../../components/no-data/data-cube-not-found"; import { Notifications, Questions } from "../../components/notifications/notifications"; +import { SourcesProvider } from "../../components/sources-provider/sources-provider"; import { AboutModal } from "../../modals/about-modal/about-modal"; import { getCode, hasCode, isOauthError, resetToken } from "../../oauth/oauth"; import { OauthCodeHandler } from "../../oauth/oauth-code-handler"; @@ -34,7 +36,6 @@ import { replaceHash } from "../../utils/url/url"; import { CubeView } from "../../views/cube-view/cube-view"; import { GeneralError } from "../../views/error-view/general-error"; import { HomeView } from "../../views/home-view/home-view"; -import { AppSettingsProvider } from "./app-settings-provider"; import "./turnilo-application.scss"; import { cube, generalError, home, oauthCodeHandler, oauthMessageView, View } from "./view"; @@ -175,43 +176,53 @@ export class TurniloApplication extends React.Component; + case "oauth-message": { + const oauth = appSettings.oauth; + if (!isOAuthEnabled(oauth)) throw new Error("Expected OAuth to be enabled in configuration."); + return ; + } case "home": - return {({ appSettings }) => }; - - case "cube": { - return {({ appSettings }) => { - const dataCube = NamedArray.findByName(appSettings.dataCubes, view.cubeName); - if (dataCube === undefined) { - return ; - } - return ; - }}; - } + return + {({ sources }) => + } + ; + + case "cube": + return + {({ sources }) => { + const dataCube = NamedArray.findByName(sources.dataCubes, view.cubeName); + if (dataCube === undefined) { + return ; + } + return ; + }} + ; case "general-error": - return ; + return ; - case "oauth-code-handler": - return ; + case "oauth-code-handler": { + const oauth = appSettings.oauth; + if (!isOAuthEnabled(oauth)) throw new Error("Expected OAuth to be enabled in configuration."); + return ; + } } } diff --git a/src/client/components/sources-provider/sources-provider.tsx b/src/client/components/sources-provider/sources-provider.tsx new file mode 100644 index 000000000..5c3b44a9f --- /dev/null +++ b/src/client/components/sources-provider/sources-provider.tsx @@ -0,0 +1,97 @@ +/* + * Copyright 2017-2018 Allegro.pl + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as React from "react"; +import { AppSettings } from "../../../common/models/app-settings/app-settings"; +import { Sources } from "../../../common/models/sources/sources"; +import { Unary } from "../../../common/utils/functional/functional"; +import { Ajax } from "../../utils/ajax/ajax"; +import { Loader } from "../loader/loader"; +import { MessagePanel } from "../message-panel/message-panel"; + +enum SourcesRequestStatus { LOADED, LOADING, ERROR } + +interface SourcesRequestBase { + status: SourcesRequestStatus; +} + +interface SourcesRequestLoading extends SourcesRequestBase { + status: SourcesRequestStatus.LOADING; +} + +interface SourcesRequestLoaded extends SourcesRequestBase { + status: SourcesRequestStatus.LOADED; + sources: Sources; +} + +interface SourcesRequestLoadError extends SourcesRequestBase { + status: SourcesRequestStatus.ERROR; + error: Error; +} + +type SourcesRequest = SourcesRequestLoading | SourcesRequestLoadError | SourcesRequestLoaded; + +const loading: SourcesRequest = { status: SourcesRequestStatus.LOADING }; +const loaded = (sources: Sources): SourcesRequest => ({ + status: SourcesRequestStatus.LOADED, + sources +}); +const errored = (error: Error): SourcesRequest => ({ + status: SourcesRequestStatus.ERROR, + error +}); + +interface SourcesProviderProps { + appSettings: AppSettings; + children: Unary<{ sources: Sources }, React.ReactNode>; +} + +interface SourcesProviderState { + sourcesRequest: SourcesRequest; +} + +export class SourcesProvider extends React.Component { + + state: SourcesProviderState = { sourcesRequest: loading }; + + componentDidMount() { + Ajax.sources(this.props.appSettings) + .then(sources => { + this.setState({ + sourcesRequest: loaded(sources) + }); + }) + .catch(error => { + this.setState({ + sourcesRequest: errored(error) + }); + }); + } + + render() { + const { sourcesRequest } = this.state; + switch (sourcesRequest.status) { + case SourcesRequestStatus.LOADING: + return + + ; + case SourcesRequestStatus.ERROR: + throw sourcesRequest.error; + case SourcesRequestStatus.LOADED: + return this.props.children({ sources: sourcesRequest.sources }); + } + } +} diff --git a/src/client/main.tsx b/src/client/main.tsx index 7e92258b7..eac9e89e6 100644 --- a/src/client/main.tsx +++ b/src/client/main.tsx @@ -17,7 +17,7 @@ import * as React from "react"; import * as ReactDOM from "react-dom"; -import { AppSettings, AppSettingsJS } from "../common/models/app-settings/app-settings"; +import { deserialize, SerializedAppSettings } from "../common/models/app-settings/app-settings"; import { Timekeeper, TimekeeperJS } from "../common/models/timekeeper/timekeeper"; import { TurniloApplication } from "./applications/turnilo-application/turnilo-application"; import { Loader } from "./components/loader/loader"; @@ -38,7 +38,7 @@ ReactDOM.render( interface Config { version: string; - appSettings: AppSettingsJS; + appSettings: SerializedAppSettings; timekeeper: TimekeeperJS; } @@ -51,8 +51,7 @@ const version = config.version; Ajax.version = version; -// No context because we don't have cubes here yet Maybe we can create just customization here?! -const appSettings = AppSettings.fromJS(config.appSettings, {}); +const appSettings = deserialize(config.appSettings); if (config.appSettings.customization.sentryDSN) { errorReporterInit(config.appSettings.customization.sentryDSN, config.version); diff --git a/src/client/oauth/oauth-code-handler.tsx b/src/client/oauth/oauth-code-handler.tsx index 2013c86f4..173cd7d06 100644 --- a/src/client/oauth/oauth-code-handler.tsx +++ b/src/client/oauth/oauth-code-handler.tsx @@ -15,13 +15,13 @@ */ import * as React from "react"; -import { Oauth } from "../../common/models/oauth/oauth"; +import { OauthEnabled } from "../../common/models/oauth/oauth"; import { Loader } from "../components/loader/loader"; import { MessagePanel, MessagePanelAction } from "../components/message-panel/message-panel"; import { exchangeCodeForToken, redirectToSavedUrl } from "./oauth"; interface OauthCodeHandlerProps { - oauth: Oauth; + oauth: OauthEnabled; code: string; } diff --git a/src/client/oauth/oauth-message-view.tsx b/src/client/oauth/oauth-message-view.tsx index 517109243..0f6cba001 100644 --- a/src/client/oauth/oauth-message-view.tsx +++ b/src/client/oauth/oauth-message-view.tsx @@ -15,12 +15,12 @@ */ import * as React from "react"; -import { Oauth } from "../../common/models/oauth/oauth"; +import { OauthEnabled } from "../../common/models/oauth/oauth"; import { MessagePanel, MessagePanelAction } from "../components/message-panel/message-panel"; import { login } from "./oauth"; interface OauthMessageViewProps { - oauth: Oauth; + oauth: OauthEnabled; } export const OauthMessageView: React.SFC = ({ oauth }) => { diff --git a/src/client/oauth/oauth.ts b/src/client/oauth/oauth.ts index 319bbbeb8..e94f24d2c 100644 --- a/src/client/oauth/oauth.ts +++ b/src/client/oauth/oauth.ts @@ -18,7 +18,7 @@ import axios, { AxiosError } from "axios"; import { encode as base64encode } from "base64-arraybuffer"; import { stringify } from "querystring"; import { generate } from "randomstring"; -import { Oauth } from "../../common/models/oauth/oauth"; +import { isEnabled, Oauth, OauthEnabled } from "../../common/models/oauth/oauth"; import { get, remove, set } from "../utils/local-storage/local-storage"; const TOKEN_KEY = "turnilo-oauth-access-token"; @@ -58,7 +58,7 @@ export const isOauthError = (error: Error): error is OauthError => error.hasOwnProperty("isOauthError"); export function mapOauthError(oauth: Oauth, error: AxiosError): Error { - if (!!oauth && !!error.response) { + if (isEnabled(oauth) && !!error.response) { const { response: { status } } = error; if (status === 401) return new OauthAuthenticationError(error.message); if (status === 403) return new OauthAuthorizationError(error.message); @@ -66,7 +66,7 @@ export function mapOauthError(oauth: Oauth, error: AxiosError): Error { return error; } -export function exchangeCodeForToken(code: string, oauth: Oauth) { +export function exchangeCodeForToken(code: string, oauth: OauthEnabled) { const codeVerifier = getVerifier(); return axios.post(oauth.tokenEndpoint, stringify({ client_id: oauth.clientId, @@ -108,7 +108,7 @@ function getCodeChallenge(): PromiseLike { return generateCodeChallenge(codeVerifier); } -export function login(oauth: Oauth) { +export function login(oauth: OauthEnabled) { function redirectToAuthorization(codeChallenge: string) { saveUrl(window.location.href); const queryParams = `?client_id=${oauth.clientId}&redirect_uri=${encodeURIComponent(oauth.redirectUri)}&response_type=code&code_challenge_method=S256&code_challenge=${codeChallenge}`; diff --git a/src/client/utils/ajax/ajax.ts b/src/client/utils/ajax/ajax.ts index 64ab75319..8f7684553 100644 --- a/src/client/utils/ajax/ajax.ts +++ b/src/client/utils/ajax/ajax.ts @@ -17,8 +17,9 @@ import axios from "axios"; import { Dataset, DatasetJS, Environment, Executor, Expression } from "plywood"; -import { AppSettings, AppSettingsJS } from "../../../common/models/app-settings/app-settings"; -import { Oauth } from "../../../common/models/oauth/oauth"; +import { AppSettings } from "../../../common/models/app-settings/app-settings"; +import { isEnabled, Oauth } from "../../../common/models/oauth/oauth"; +import { deserialize, SerializedSources, Sources } from "../../../common/models/sources/sources"; import { getToken, mapOauthError } from "../../oauth/oauth"; export interface AjaxOptions { @@ -36,7 +37,7 @@ export class Ajax { static settingsVersionGetter: () => number; static headers(oauth: Oauth) { - if (!oauth) return {}; + if (!isEnabled(oauth)) return {}; const headerName = oauth.tokenHeaderName; const token = getToken(); return !token ? {} : { @@ -44,7 +45,6 @@ export class Ajax { }; } - // NOTE: in argument we pass AppSettings without Sources/Clusters static query({ data, url, timeout, method }: AjaxOptions, oauth?: Oauth): Promise { if (data) { if (Ajax.version) data.version = Ajax.version; @@ -61,7 +61,6 @@ export class Ajax { }); } - // NOTE: in argument we pass AppSettings without Sources/Clusters static queryUrlExecutorFactory(dataCubeName: string, { oauth, clientTimeout: timeout }: AppSettings): Executor { return (ex: Expression, env: Environment = {}) => { const method = "POST"; @@ -73,17 +72,13 @@ export class Ajax { }; } - // NOTE: in argument we pass AppSettings without Sources/Clusters - static settings(clientAppSettings: AppSettings): Promise { - const headers = Ajax.headers(clientAppSettings.oauth); - return axios.get("/settings", { headers }) + static sources(appSettings: AppSettings): Promise { + const headers = Ajax.headers(appSettings.oauth); + return axios.get("/settings", { headers }) .then(resp => resp.data) .catch(error => { - throw mapOauthError(clientAppSettings.oauth, error); + throw mapOauthError(appSettings.oauth, error); }) - // TODO: type assertion should not be needed there! - .then(appSettingsJS => AppSettings.fromJS(appSettingsJS as AppSettingsJS, { - executorFactory: (cubeName: string) => Ajax.queryUrlExecutorFactory(cubeName, clientAppSettings) - })); + .then(sourcesJS => deserialize(sourcesJS, appSettings)); } } diff --git a/src/client/views/cube-view/cube-view.tsx b/src/client/views/cube-view/cube-view.tsx index 5ff5fc634..f06e3fc87 100644 --- a/src/client/views/cube-view/cube-view.tsx +++ b/src/client/views/cube-view/cube-view.tsx @@ -94,6 +94,7 @@ export interface CubeViewProps { urlForCubeAndEssence: Binary; getEssenceFromHash: Binary; dataCube: DataCube; + dataCubes: DataCube[]; openAboutModal: Fn; customization?: Customization; appSettings: AppSettings; @@ -667,9 +668,9 @@ export class CubeView extends React.Component { }; renderSideDrawer() { - const { changeCubeAndEssence, openAboutModal, appSettings } = this.props; + const { dataCubes, changeCubeAndEssence, openAboutModal, appSettings } = this.props; const { showSideBar, essence } = this.state; - const { dataCubes, customization } = appSettings; + const { customization } = appSettings; const transitionTimeout = { enter: 500, exit: 300 }; return { - return basicExecutorFactory({ - datasets: { - main: Dataset.fromJS(SMALL_WIKI_DATA) - } - }); - }); + return fromConfig(AppSettingsFixtures.wikiOnlyJS()); } static wikiTwitter() { - return AppSettings.fromJS(AppSettingsFixtures.wikiTwitterJS(), AppSettingsFixtures.getContext()); + return fromConfig(AppSettingsFixtures.wikiTwitterJS()); } } diff --git a/src/common/models/app-settings/app-settings.mocha.ts b/src/common/models/app-settings/app-settings.mocha.ts index fdd123720..aeab17e6d 100644 --- a/src/common/models/app-settings/app-settings.mocha.ts +++ b/src/common/models/app-settings/app-settings.mocha.ts @@ -15,300 +15,300 @@ * limitations under the License. */ -import { expect } from "chai"; -import { testImmutableClass } from "immutable-class-tester"; - -import { DataCubeFixtures } from "../data-cube/data-cube.fixtures"; -import { AppSettings } from "./app-settings"; -import { AppSettingsFixtures } from "./app-settings.fixtures"; - -describe("AppSettings", () => { - var context = AppSettingsFixtures.getContext(); - - it("is an immutable class", () => { - testImmutableClass( - AppSettings, - [ - AppSettingsFixtures.wikiOnlyJS(), - AppSettingsFixtures.wikiTwitterJS() - ], - { context }); - }); - - describe("errors", () => { - it("errors if there is no matching cluster", () => { - var js = AppSettingsFixtures.wikiOnlyJS(); - js.clusters = []; - expect(() => AppSettings.fromJS(js, context)).to.throw("Can not find cluster 'druid-wiki' for data cube 'wiki'"); - }); - - }); - - describe.skip("back compat", () => { - it("works with dataSources", () => { - var oldJS: any = AppSettingsFixtures.wikiOnlyJS(); - oldJS.dataSources = oldJS.dataCubes; - delete oldJS.dataCubes; - expect(AppSettings.fromJS(oldJS, context).toJS()).to.deep.equal(AppSettingsFixtures.wikiOnlyJS()); - }); - - it("deals with old config style", () => { - var wikiDataCubeJS = DataCubeFixtures.WIKI_JS; - delete wikiDataCubeJS.clusterName; - (wikiDataCubeJS as any).engine = "druid"; - - var oldJS: any = { - customization: {}, - druidHost: "192.168.99.100", - timeout: 30003, - sourceListScan: "auto", - sourceListRefreshInterval: 10001, - sourceReintrospectInterval: 10002, - sourceReintrospectOnLoad: true, - dataSources: [ - wikiDataCubeJS - ] - }; - - expect(AppSettings.fromJS(oldJS, context).toJS().clusters).to.deep.equal([ - { - name: "druid", - type: "druid", - host: "192.168.99.100", - sourceListRefreshInterval: 10001, - sourceListScan: "auto", - sourceReintrospectInterval: 10002, - sourceReintrospectOnLoad: true, - timeout: 30003 - } - ]); - }); - - it("deals with old config style no sourceListScan=disabled", () => { - var oldJS: any = { - druidHost: "192.168.99.100", - sourceListScan: "disable", - dataSources: [ - { ...DataCubeFixtures.WIKI_JS, clusterName: "druid" } - ] - }; - - expect(AppSettings.fromJS(oldJS, context).toJS().clusters).to.deep.equal([ - { - host: "192.168.99.100", - name: "druid", - sourceListScan: "disable", - type: "druid" - } - ]); - }); - - }); - - describe("general", () => { - it("blank", () => { - expect(AppSettings.BLANK.toJS()).to.deep.equal({ - clusters: [], - customization: {}, - dataCubes: [], - clientTimeout: 0 - }); - }); - - it("converts to client settings", () => { - const settings = AppSettingsFixtures.wikiOnlyWithExecutor(); - - expect(settings.toClientSettings().toJS()).to.deep.equal({ - clusters: [ - { - name: "druid-wiki", - timeout: 30000 - } - ], - clientTimeout: 100, - customization: { - customLogoSvg: "ansvgstring", - headerBackground: "brown", - title: "Hello World" - }, - dataCubes: [ - { - attributes: [ - { - name: "time", - type: "TIME" - }, - { - name: "articleName", - type: "STRING" - }, - { - name: "page", - type: "STRING" - }, - { - name: "userChars", - type: "SET/STRING" - }, - { - maker: { - op: "count" - }, - name: "count", - type: "NUMBER", - unsplitable: true - } - ], - clusterName: "druid-wiki", - defaultDuration: "P3D", - defaultPinnedDimensions: [ - "articleName" - ], - defaultSelectedMeasures: [ - "count" - ], - defaultSortMeasure: "count", - defaultTimezone: "Etc/UTC", - description: "Wiki full description something about articles and editors", - dimensions: [ - { - formula: "$time", - kind: "time", - name: "time", - title: "Time" - }, - { - kind: "string", - name: "country", - title: "Country", - formula: "$country" - }, - { - formula: "$channel", - kind: "string", - name: "channel", - title: "Channel" - }, - { - name: "comment_group", - title: "Comment Group", - dimensions: [ - { - kind: "string", - name: "comment", - title: "Comment", - formula: "$comment" - }, - { - kind: "number", - name: "commentLength", - title: "Comment Length", - formula: "$commentLength" - }, - { - kind: "boolean", - name: "commentLengthOver100", - title: "Comment Length Over 100", - formula: "$commentLength > 100" - } - ] - }, - { - formula: "$isRobot", - kind: "string", - name: "isRobot", - title: "Is Robot" - }, - { - kind: "string", - name: "namespace", - title: "Namespace", - formula: "$namespace" - }, - { - formula: "$articleName", - kind: "string", - name: "articleName", - title: "Article Name" - }, - { - formula: "$page", - kind: "string", - name: "page", - title: "Page" - }, - { - formula: "$page.lookup(page_last_author)", - kind: "string", - name: "page_last_author", - title: "Page Author" - }, - { - formula: "$userChars", - kind: "string", - name: "userChars", - title: "User Chars" - } - ], - measures: [ - { - formula: "$main.sum($count)", - name: "count", - title: "Count" - }, - { - name: "other", - title: "Other", - measures: [ - { - name: "added_group", - title: "Added Group", - measures: [ - { - name: "added", - title: "Added", - formula: "$main.sum($added)" - }, - { - name: "avg_added", - title: "Avg Added", - formula: "$main.average($added)" - } - ] - }, - { - name: "delta_group", - title: "Delta Group", - measures: [ - { - name: "delta", - title: "Delta", - formula: "$main.sum($delta)" - }, - { - name: "avg_delta", - title: "Avg Delta", - formula: "$main.average($delta)" - } - ] - } - ] - } - ], - name: "wiki", - refreshRule: { - rule: "fixed", - time: new Date("2016-04-30T12:39:51.350Z") - }, - maxSplits: 4, - source: "wiki", - timeAttribute: "time", - title: "Wiki" - } - ] - }); - }); - - }); - -}); +// import { expect } from "chai"; +// import { testImmutableClass } from "immutable-class-tester"; +// +// import { DataCubeFixtures } from "../data-cube/data-cube.fixtures"; +// import { OldAppSettings } from "./app-settings"; +// import { AppSettingsFixtures } from "./app-settings.fixtures"; +// +// describe("AppSettings", () => { +// var context = AppSettingsFixtures.getContext(); +// +// it("is an immutable class", () => { +// testImmutableClass( +// OldAppSettings, +// [ +// AppSettingsFixtures.wikiOnlyJS(), +// AppSettingsFixtures.wikiTwitterJS() +// ], +// { context }); +// }); +// +// describe("errors", () => { +// it("errors if there is no matching cluster", () => { +// var js = AppSettingsFixtures.wikiOnlyJS(); +// js.clusters = []; +// expect(() => OldAppSettings.fromJS(js, context)).to.throw("Can not find cluster 'druid-wiki' for data cube 'wiki'"); +// }); +// +// }); +// +// describe.skip("back compat", () => { +// it("works with dataSources", () => { +// var oldJS: any = AppSettingsFixtures.wikiOnlyJS(); +// oldJS.dataSources = oldJS.dataCubes; +// delete oldJS.dataCubes; +// expect(OldAppSettings.fromJS(oldJS, context).toJS()).to.deep.equal(AppSettingsFixtures.wikiOnlyJS()); +// }); +// +// it("deals with old config style", () => { +// var wikiDataCubeJS = DataCubeFixtures.WIKI_JS; +// delete wikiDataCubeJS.clusterName; +// (wikiDataCubeJS as any).engine = "druid"; +// +// var oldJS: any = { +// customization: {}, +// druidHost: "192.168.99.100", +// timeout: 30003, +// sourceListScan: "auto", +// sourceListRefreshInterval: 10001, +// sourceReintrospectInterval: 10002, +// sourceReintrospectOnLoad: true, +// dataSources: [ +// wikiDataCubeJS +// ] +// }; +// +// expect(OldAppSettings.fromJS(oldJS, context).toJS().clusters).to.deep.equal([ +// { +// name: "druid", +// type: "druid", +// host: "192.168.99.100", +// sourceListRefreshInterval: 10001, +// sourceListScan: "auto", +// sourceReintrospectInterval: 10002, +// sourceReintrospectOnLoad: true, +// timeout: 30003 +// } +// ]); +// }); +// +// it("deals with old config style no sourceListScan=disabled", () => { +// var oldJS: any = { +// druidHost: "192.168.99.100", +// sourceListScan: "disable", +// dataSources: [ +// { ...DataCubeFixtures.WIKI_JS, clusterName: "druid" } +// ] +// }; +// +// expect(OldAppSettings.fromJS(oldJS, context).toJS().clusters).to.deep.equal([ +// { +// host: "192.168.99.100", +// name: "druid", +// sourceListScan: "disable", +// type: "druid" +// } +// ]); +// }); +// +// }); +// +// describe("general", () => { +// it("blank", () => { +// expect(OldAppSettings.BLANK.toJS()).to.deep.equal({ +// clusters: [], +// customization: {}, +// dataCubes: [], +// clientTimeout: 0 +// }); +// }); +// +// it("converts to client settings", () => { +// const settings = AppSettingsFixtures.wikiOnlyWithExecutor(); +// +// expect(settings.toClientSettings().toJS()).to.deep.equal({ +// clusters: [ +// { +// name: "druid-wiki", +// timeout: 30000 +// } +// ], +// clientTimeout: 100, +// customization: { +// customLogoSvg: "ansvgstring", +// headerBackground: "brown", +// title: "Hello World" +// }, +// dataCubes: [ +// { +// attributes: [ +// { +// name: "time", +// type: "TIME" +// }, +// { +// name: "articleName", +// type: "STRING" +// }, +// { +// name: "page", +// type: "STRING" +// }, +// { +// name: "userChars", +// type: "SET/STRING" +// }, +// { +// maker: { +// op: "count" +// }, +// name: "count", +// type: "NUMBER", +// unsplitable: true +// } +// ], +// clusterName: "druid-wiki", +// defaultDuration: "P3D", +// defaultPinnedDimensions: [ +// "articleName" +// ], +// defaultSelectedMeasures: [ +// "count" +// ], +// defaultSortMeasure: "count", +// defaultTimezone: "Etc/UTC", +// description: "Wiki full description something about articles and editors", +// dimensions: [ +// { +// formula: "$time", +// kind: "time", +// name: "time", +// title: "Time" +// }, +// { +// kind: "string", +// name: "country", +// title: "Country", +// formula: "$country" +// }, +// { +// formula: "$channel", +// kind: "string", +// name: "channel", +// title: "Channel" +// }, +// { +// name: "comment_group", +// title: "Comment Group", +// dimensions: [ +// { +// kind: "string", +// name: "comment", +// title: "Comment", +// formula: "$comment" +// }, +// { +// kind: "number", +// name: "commentLength", +// title: "Comment Length", +// formula: "$commentLength" +// }, +// { +// kind: "boolean", +// name: "commentLengthOver100", +// title: "Comment Length Over 100", +// formula: "$commentLength > 100" +// } +// ] +// }, +// { +// formula: "$isRobot", +// kind: "string", +// name: "isRobot", +// title: "Is Robot" +// }, +// { +// kind: "string", +// name: "namespace", +// title: "Namespace", +// formula: "$namespace" +// }, +// { +// formula: "$articleName", +// kind: "string", +// name: "articleName", +// title: "Article Name" +// }, +// { +// formula: "$page", +// kind: "string", +// name: "page", +// title: "Page" +// }, +// { +// formula: "$page.lookup(page_last_author)", +// kind: "string", +// name: "page_last_author", +// title: "Page Author" +// }, +// { +// formula: "$userChars", +// kind: "string", +// name: "userChars", +// title: "User Chars" +// } +// ], +// measures: [ +// { +// formula: "$main.sum($count)", +// name: "count", +// title: "Count" +// }, +// { +// name: "other", +// title: "Other", +// measures: [ +// { +// name: "added_group", +// title: "Added Group", +// measures: [ +// { +// name: "added", +// title: "Added", +// formula: "$main.sum($added)" +// }, +// { +// name: "avg_added", +// title: "Avg Added", +// formula: "$main.average($added)" +// } +// ] +// }, +// { +// name: "delta_group", +// title: "Delta Group", +// measures: [ +// { +// name: "delta", +// title: "Delta", +// formula: "$main.sum($delta)" +// }, +// { +// name: "avg_delta", +// title: "Avg Delta", +// formula: "$main.average($delta)" +// } +// ] +// } +// ] +// } +// ], +// name: "wiki", +// refreshRule: { +// rule: "fixed", +// time: new Date("2016-04-30T12:39:51.350Z") +// }, +// maxSplits: 4, +// source: "wiki", +// timeAttribute: "time", +// title: "Wiki" +// } +// ] +// }); +// }); +// +// }); +// +// }); diff --git a/src/common/models/app-settings/app-settings.ts b/src/common/models/app-settings/app-settings.ts index b968c79f6..cbca43bdb 100644 --- a/src/common/models/app-settings/app-settings.ts +++ b/src/common/models/app-settings/app-settings.ts @@ -15,269 +15,70 @@ * limitations under the License. */ -import { Class, immutableArraysEqual, immutableEqual, Instance, NamedArray } from "immutable-class"; import { Executor } from "plywood"; -import { hasOwnProperty } from "../../utils/general/general"; -import { ImmutableUtils } from "../../utils/immutable-utils/immutable-utils"; -import { Cluster, ClusterJS } from "../cluster/cluster"; -import { findCluster } from "../cluster/find-cluster"; import { Customization, CustomizationJS } from "../customization/customization"; -import { DataCube, DataCubeJS } from "../data-cube/data-cube"; -import { Oauth, OauthJS } from "../oauth/oauth"; +import { deserialize as oauthDeserialize, fromConfig as oauthFromConfig, Oauth, OauthJS, serialize as oauthSerialize, SerializedOauth } from "../oauth/oauth"; const DEFAULT_CLIENT_TIMEOUT = 0; -export interface AppSettingsValue { - version?: number; - clientTimeout?: number; - clusters?: Cluster[]; - customization?: Customization; - dataCubes?: DataCube[]; - oauth?: Oauth; +export interface AppSettings { + readonly version: number; + readonly clientTimeout: number; + readonly customization: Customization; + readonly oauth?: Oauth; } export interface AppSettingsJS { version?: number; clientTimeout?: number; - clusters?: ClusterJS[]; customization?: CustomizationJS; - dataCubes?: DataCubeJS[]; oauth?: OauthJS; } -export interface AppSettingsContext { - executorFactory?: (dataCubeName: string) => Executor; +export interface SerializedAppSettings { + readonly version: number; + readonly clientTimeout: number; + readonly customization: CustomizationJS; // SerializedCustomization + readonly oauth: SerializedOauth; } -var check: Class; - -export class AppSettings implements Instance { - static BLANK = AppSettings.fromJS({}, {}); - - static isAppSettings(candidate: any): candidate is AppSettings { - return candidate instanceof AppSettings; - } - - static fromJS(parameters: AppSettingsJS, context?: AppSettingsContext): AppSettings { - if (!context) throw new Error("AppSettings must have context"); - let clusters: Cluster[]; - if (parameters.clusters) { - clusters = parameters.clusters.map(cluster => Cluster.fromJS(cluster)); - - } else if (hasOwnProperty(parameters, "druidHost") || hasOwnProperty(parameters, "brokerHost")) { - let clusterJS: any = JSON.parse(JSON.stringify(parameters)); - clusterJS.name = "druid"; - clusterJS.type = "druid"; - clusterJS.host = clusterJS.druidHost || clusterJS.brokerHost; - clusters = [Cluster.fromJS(clusterJS)]; - - } else { - clusters = []; - } - - const clientTimeout = parameters.clientTimeout || DEFAULT_CLIENT_TIMEOUT; - - const executorFactory = context.executorFactory; - const dataCubes = (parameters.dataCubes || (parameters as any).dataSources || []).map((dataCubeJS: DataCubeJS) => { - const cluster = findCluster(dataCubeJS, clusters); - - let dataCubeObject = DataCube.fromJS(dataCubeJS, { cluster }); - if (executorFactory) { - const executor = executorFactory(dataCubeObject.name); - if (executor) dataCubeObject = dataCubeObject.attachExecutor(executor); - } - return dataCubeObject; - }); - - const oauth = parameters.oauth ? Oauth.fromJS(parameters.oauth) : undefined; - - const value: AppSettingsValue = { - version: parameters.version, - clientTimeout, - clusters, - oauth, - customization: Customization.fromJS(parameters.customization || {}), - dataCubes - }; - - return new AppSettings(value); - } - - public version: number; - public clientTimeout: number; - public clusters: Cluster[]; - public customization: Customization; - public oauth?: Oauth; - public dataCubes: DataCube[]; - - constructor(parameters: AppSettingsValue) { - const { - version, - clientTimeout, - clusters, - customization, - dataCubes, - oauth - } = parameters; - - for (const dataCube of dataCubes) { - if (dataCube.clusterName === "native") continue; - if (!NamedArray.findByName(clusters, dataCube.clusterName)) { - throw new Error(`data cube ${dataCube.name} refers to an unknown cluster ${dataCube.clusterName}`); - } - } - - this.clientTimeout = clientTimeout || DEFAULT_CLIENT_TIMEOUT; - this.version = version || 0; - this.clusters = clusters; - this.customization = customization; - this.dataCubes = dataCubes; - this.oauth = oauth; - } - - public valueOf(): AppSettingsValue { - return { - version: this.version, - clientTimeout: this.clientTimeout, - clusters: this.clusters, - customization: this.customization, - oauth: this.oauth, - dataCubes: this.dataCubes - }; - } - - public toJS(): AppSettingsJS { - let js: AppSettingsJS = {}; - if (this.version) js.version = this.version; - js.clientTimeout = this.clientTimeout; - js.clusters = this.clusters.map(cluster => cluster.toJS()); - js.customization = this.customization.toJS(); - if (this.oauth) js.oauth = this.oauth.toJS(); - js.dataCubes = this.dataCubes.map(dataCube => dataCube.toJS()); - return js; - } - - public toJSON(): AppSettingsJS { - return this.toJS(); - } - - public toString(): string { - return `[AppSettings v${this.version} dataCubes=${this.dataCubes.length}]`; - } - - public equals(other: AppSettings): boolean { - return AppSettings.isAppSettings(other) && - this.version === other.version && - this.clientTimeout === other.clientTimeout && - immutableArraysEqual(this.clusters, other.clusters) && - immutableEqual(this.customization, other.customization) && - immutableEqual(this.oauth, other.oauth) && - immutableArraysEqual(this.dataCubes, other.dataCubes); - } - - public toClientSettings(): AppSettings { - let value = this.valueOf(); - - value.clusters = value.clusters.map(c => c.toClientCluster()); - - value.dataCubes = value.dataCubes - .filter(ds => ds.isQueryable()) - .map(ds => ds.toClientDataCube()); - - return new AppSettings(value); - } - - public withoutSources(): AppSettings { - let value = this.valueOf(); - - value.clusters = []; - - value.dataCubes = []; - - return new AppSettings(value); - } - - public getVersion(): number { - return this.version; - } - - public getDataCubesForCluster(clusterName: string): DataCube[] { - return this.dataCubes.filter(dataCube => dataCube.clusterName === clusterName); - } - - public getDataCube(dataCubeName: string): DataCube { - return NamedArray.findByName(this.dataCubes, dataCubeName); - } - - public addOrUpdateDataCube(dataCube: DataCube): AppSettings { - let value = this.valueOf(); - value.dataCubes = NamedArray.overrideByName(value.dataCubes, dataCube); - return new AppSettings(value); - } - - public deleteDataCube(dataCube: DataCube): AppSettings { - let value = this.valueOf(); - const index = value.dataCubes.indexOf(dataCube); - - if (index === -1) { - throw new Error(`Unknown dataCube : ${dataCube.toString()}`); - } - - let newDataCubes = value.dataCubes.concat(); - newDataCubes.splice(index, 1); - - value.dataCubes = newDataCubes; - return new AppSettings(value); - } - - public attachExecutors(executorFactory: (dataCube: DataCube) => Executor): AppSettings { - let value = this.valueOf(); - value.dataCubes = value.dataCubes.map(ds => { - const executor = executorFactory(ds); - if (executor) ds = ds.attachExecutor(executor); - return ds; - }); - return new AppSettings(value); - } - - public getSuggestedCubes(): DataCube[] { - return this.dataCubes; - } - - public validate(): boolean { - return this.customization.validate(); - } - - changeCustomization(customization: Customization): AppSettings { - return this.change("customization", customization); - } - - changeClusters(clusters: Cluster[]): AppSettings { - return this.change("clusters", clusters); - } - - addCluster(cluster: Cluster): AppSettings { - return this.changeClusters(NamedArray.overrideByName(this.clusters, cluster)); - } - - change(propertyName: string, newValue: any): AppSettings { - return ImmutableUtils.change(this, propertyName, newValue); - } - - changeDataCubes(dataCubes: DataCube[]): AppSettings { - return this.change("dataCubes", dataCubes); - } +export function fromConfig(config: AppSettingsJS): AppSettings { + const clientTimeout = config.clientTimeout === undefined ? DEFAULT_CLIENT_TIMEOUT : config.clientTimeout; + const version = config.version || 0; + const customization = Customization.fromJS(config.customization || {}); + const oauth = oauthFromConfig(config.oauth); + + // make part of Customization server side smart constructor + customization.validate(); + + return { + clientTimeout, + version, + customization, + oauth + }; +} - addDataCube(dataCube: DataCube): AppSettings { - return this.changeDataCubes(NamedArray.overrideByName(this.dataCubes, dataCube)); - } +export const EMPTY_APP_SETTINGS = fromConfig({}); - filterDataCubes(fn: (dataCube: DataCube, index?: number, dataCubes?: DataCube[]) => boolean): AppSettings { - let value = this.valueOf(); - value.dataCubes = value.dataCubes.filter(fn); - return new AppSettings(value); - } +export function serialize({ oauth, clientTimeout, customization, version }: AppSettings): SerializedAppSettings { + return { + clientTimeout, + version, + customization: customization.toJS(), + oauth: oauthSerialize(oauth) + }; +} +export function deserialize({ oauth, clientTimeout, customization, version }: SerializedAppSettings): AppSettings { + return { + clientTimeout, + version, + customization: Customization.fromJS(customization), + oauth: oauthDeserialize(oauth) + }; } -check = AppSettings; +export interface AppSettingsContext { + executorFactory?: (dataCubeName: string) => Executor; +} diff --git a/src/common/models/cluster/cluster.fixtures.ts b/src/common/models/cluster/cluster.fixtures.ts index 90346f4e7..cb712112d 100644 --- a/src/common/models/cluster/cluster.fixtures.ts +++ b/src/common/models/cluster/cluster.fixtures.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { Cluster, ClusterJS, ClusterValue } from "./cluster"; +import { Cluster, ClusterJS } from "./cluster"; export class ClusterFixtures { static druidWikiClusterJS(): ClusterJS { @@ -32,6 +32,10 @@ export class ClusterFixtures { }; } + static druidWikiCluster(): Cluster { + return Cluster.fromJS(ClusterFixtures.druidWikiClusterJS()); + } + static druidTwitterClusterJS(): ClusterJS { return { name: "druid-twitter", @@ -46,7 +50,12 @@ export class ClusterFixtures { introspectionStrategy: "segment-metadata-fallback" }; } - static druidTwitterClusterJSWithGuard(): Cluster { + + static druidTwitterCluster(): Cluster { + return Cluster.fromJS(ClusterFixtures.druidTwitterClusterJS()); + } + + static druidTwitterClusterJSWithGuard(): Cluster { return Cluster.fromJS({ name: "druid-custom", url: "http://192.168.99.101", diff --git a/src/common/models/oauth/oauth.ts b/src/common/models/oauth/oauth.ts index 998d61519..4e6422e8b 100644 --- a/src/common/models/oauth/oauth.ts +++ b/src/common/models/oauth/oauth.ts @@ -14,9 +14,7 @@ * limitations under the License. */ -import { BaseImmutable, Property } from "immutable-class"; - -interface OauthValue { +export interface OauthJS { clientId: string; tokenEndpoint: string; authorizationEndpoint: string; @@ -24,7 +22,12 @@ interface OauthValue { redirectUri: string; } -export interface OauthJS { +interface OauthDisabled { + status: "disabled"; +} + +export interface OauthEnabled { + status: "enabled"; clientId: string; tokenEndpoint: string; authorizationEndpoint: string; @@ -32,23 +35,26 @@ export interface OauthJS { redirectUri: string; } -export class Oauth extends BaseImmutable { - - static PROPERTIES: Property[] = [ - { name: "clientId" }, - { name: "tokenEndpoint" }, - { name: "authorizationEndpoint" }, - { name: "tokenHeaderName" }, - { name: "redirectUri" } - ]; - - static fromJS(params: OauthJS): Oauth { - return new Oauth(BaseImmutable.jsToValue(Oauth.PROPERTIES, params)); - } - - public clientId: string; - public tokenEndpoint: string; - public authorizationEndpoint: string; - public tokenHeaderName: string; - public redirectUri: string; +export function isEnabled(oauth: Oauth): oauth is OauthEnabled { + return oauth.status === "enabled"; +} + +export type Oauth = OauthDisabled | OauthEnabled; + +export function fromConfig(config?: OauthJS): Oauth { + if (!config) return { status: "disabled" }; + return { + status: "enabled", + ...config + }; +} + +export type SerializedOauth = Oauth; + +export function serialize(oauth: Oauth): SerializedOauth { + return oauth; +} + +export function deserialize(oauth: SerializedOauth): Oauth { + return oauth; } diff --git a/src/common/models/sources/sources.fixtures.ts b/src/common/models/sources/sources.fixtures.ts new file mode 100644 index 000000000..5858fa651 --- /dev/null +++ b/src/common/models/sources/sources.fixtures.ts @@ -0,0 +1,302 @@ +/* + * Copyright 2017-2021 Allegro.pl + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { basicExecutorFactory, Dataset } from "plywood"; +import { ClusterFixtures } from "../cluster/cluster.fixtures"; +import { DataCubeFixtures } from "../data-cube/data-cube.fixtures"; +import { Sources } from "./sources"; + +export const wikiSources: Sources = { + clusters: [ClusterFixtures.druidWikiCluster()], + dataCubes: [DataCubeFixtures.wiki()] +}; + +export const wikiTwitterSources: Sources = { + clusters: [ClusterFixtures.druidWikiCluster(), ClusterFixtures.druidTwitterCluster()], + dataCubes: [DataCubeFixtures.wiki(), DataCubeFixtures.twitter()] +}; + +const SMALL_WIKI_DATA = [ + { + time: new Date("2015-09-12T00:46:58Z"), + channel: "en", + cityName: null, + comment: "added project", + commentLength: 13, + countryIsoCode: null, + countryName: null, + deltaBucket100: 0, + isAnonymous: false, + isMinor: false, + isNew: false, + isRobot: false, + isUnpatrolled: false, + metroCode: null, + namespace: "Talk", + page: "Talk:Oswald Tilghman", + regionIsoCode: null, + regionName: null, + user: "GELongstreet", + userChars: ["E", "G", "L", "N", "O", "R", "S", "T"], + delta: 36, + added: 36, + deleted: 0, + deltaByTen: 3.6 + }, + { + time: new Date("2015-09-12T00:47:00Z"), + channel: "ca", + cityName: null, + comment: "Robot inserta {{Commonscat}} que enllaça amb [[commons:category:Rallicula]]", + commentLength: 75, + countryIsoCode: null, + countryName: null, + deltaBucket100: 0, + isAnonymous: false, + isMinor: true, + isNew: false, + isRobot: true, + isUnpatrolled: false, + metroCode: null, + namespace: "Main", + page: "Rallicula", + regionIsoCode: null, + regionName: null, + user: "PereBot", + userChars: ["B", "E", "O", "P", "R", "T"], + delta: 17, + added: 17, + deleted: 0, + deltaByTen: 1.7 + }, + { + time: new Date("2015-09-12T00:47:05Z"), + channel: "en", + cityName: "Auburn", + comment: "/* Status of peremptory norms under international law */ fixed spelling of 'Wimbledon'", + commentLength: 86, + countryIsoCode: "AU", + countryName: "Australia", + deltaBucket100: 0, + isAnonymous: true, + isMinor: false, + isNew: false, + isRobot: false, + isUnpatrolled: false, + metroCode: "123", + namespace: "Main", + page: "Peremptory norm", + regionIsoCode: "NSW", + regionName: "New South Wales", + user: "60.225.66.142", + userChars: [".", "0", "1", "2", "4", "5", "6"], + delta: 0, + added: 0, + deleted: 0, + deltaByTen: 0 + }, + { + time: new Date("2015-09-12T00:47:08Z"), + channel: "vi", + cityName: null, + comment: "fix Lỗi CS1: ngày tháng", + commentLength: 23, + countryIsoCode: null, + countryName: null, + deltaBucket100: 0, + isAnonymous: false, + isMinor: true, + isNew: false, + isRobot: true, + isUnpatrolled: false, + metroCode: null, + namespace: "Main", + page: "Apamea abruzzorum", + regionIsoCode: null, + regionName: null, + user: "Cheers!-bot", + userChars: ["!", "-", "B", "C", "E", "H", "O", "R", "S", "T"], + delta: 18, + added: 18, + deleted: 0, + deltaByTen: 1.8 + }, + { + time: new Date("2015-09-12T00:47:11Z"), + channel: "vi", + cityName: null, + comment: "clean up using [[Project:AWB|AWB]]", + commentLength: 34, + countryIsoCode: null, + countryName: null, + deltaBucket100: 0, + isAnonymous: false, + isMinor: false, + isNew: false, + isRobot: true, + isUnpatrolled: false, + metroCode: null, + namespace: "Main", + page: "Atractus flammigerus", + regionIsoCode: null, + regionName: null, + user: "ThitxongkhoiAWB", + userChars: ["A", "B", "G", "H", "I", "K", "N", "O", "T", "W", "X"], + delta: 18, + added: 18, + deleted: 0, + deltaByTen: 1.8 + }, + { + time: new Date("2015-09-12T00:47:13Z"), + channel: "vi", + cityName: null, + comment: "clean up using [[Project:AWB|AWB]]", + commentLength: 34, + countryIsoCode: null, + countryName: null, + deltaBucket100: 0, + isAnonymous: false, + isMinor: false, + isNew: false, + isRobot: true, + isUnpatrolled: false, + metroCode: null, + namespace: "Main", + page: "Agama mossambica", + regionIsoCode: null, + regionName: null, + user: "ThitxongkhoiAWB", + userChars: ["A", "B", "G", "H", "I", "K", "N", "O", "T", "W", "X"], + delta: 18, + added: 18, + deleted: 0, + deltaByTen: 1.8 + }, + { + time: new Date("2015-09-12T00:47:17Z"), + channel: "ca", + cityName: null, + comment: "/* Imperi Austrohongarès */", + commentLength: 27, + countryIsoCode: null, + countryName: null, + deltaBucket100: -100, + isAnonymous: false, + isMinor: false, + isNew: false, + isRobot: false, + isUnpatrolled: false, + metroCode: null, + namespace: "Main", + page: "Campanya dels Balcans (1914-1918)", + regionIsoCode: null, + regionName: null, + user: "Jaumellecha", + userChars: ["A", "C", "E", "H", "J", "L", "M", "U"], + delta: -20, + added: 0, + deleted: 20, + deltaByTen: -2 + }, + { + time: new Date("2015-09-12T00:47:19Z"), + channel: "en", + cityName: null, + comment: "adding comment on notability and possible COI", + commentLength: 45, + countryIsoCode: null, + countryName: null, + deltaBucket100: 300, + isAnonymous: false, + isMinor: false, + isNew: true, + isRobot: false, + isUnpatrolled: true, + metroCode: null, + namespace: "Talk", + page: "Talk:Dani Ploeger", + regionIsoCode: null, + regionName: null, + user: "New Media Theorist", + userChars: [" ", "A", "D", "E", "H", "I", "M", "N", "O", "R", "S", "T", "W"], + delta: 345, + added: 345, + deleted: 0, + deltaByTen: 34.5 + }, + { + time: new Date("2015-09-12T00:47:21Z"), + channel: "en", + cityName: null, + comment: "Copying assessment table to wiki", + commentLength: 32, + countryIsoCode: null, + countryName: null, + deltaBucket100: 100, + isAnonymous: false, + isMinor: false, + isNew: false, + isRobot: true, + isUnpatrolled: false, + metroCode: null, + namespace: "User", + page: "User:WP 1.0 bot/Tables/Project/Pubs", + regionIsoCode: null, + regionName: null, + user: "WP 1.0 bot", + userChars: [" ", ".", "0", "1", "B", "O", "P", "T", "W"], + delta: 121, + added: 121, + deleted: 0, + deltaByTen: 12.1 + }, + { + time: new Date("2015-09-12T00:47:25Z"), + channel: "vi", + cityName: null, + comment: "clean up using [[Project:AWB|AWB]]", + commentLength: 34, + countryIsoCode: null, + countryName: null, + deltaBucket100: 0, + isAnonymous: false, + isMinor: false, + isNew: false, + isRobot: true, + isUnpatrolled: false, + metroCode: null, + namespace: "Main", + page: "Agama persimilis", + regionIsoCode: null, + regionName: null, + user: "ThitxongkhoiAWB", + userChars: ["A", "B", "G", "H", "I", "K", "N", "O", "T", "W", "X"], + delta: 18, + added: 18, + deleted: 0, + deltaByTen: 1.8 + } +]; + +export const wikiSourcesWithExecutor = { + clusters: [ClusterFixtures.druidWikiCluster()], + dataCubes: [DataCubeFixtures.wiki().attachExecutor(basicExecutorFactory({ + datasets: { + main: Dataset.fromJS(SMALL_WIKI_DATA) + } + }))] +}; diff --git a/src/common/models/sources/sources.ts b/src/common/models/sources/sources.ts new file mode 100644 index 000000000..9f8b47480 --- /dev/null +++ b/src/common/models/sources/sources.ts @@ -0,0 +1,134 @@ +/* + * Copyright 2017-2021 Allegro.pl + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { NamedArray } from "immutable-class"; +import { Ajax } from "../../../client/utils/ajax/ajax"; +import { isTruthy } from "../../utils/general/general"; +import { AppSettings } from "../app-settings/app-settings"; +import { Cluster, ClusterJS } from "../cluster/cluster"; +import { findCluster } from "../cluster/find-cluster"; +import { DataCube, DataCubeJS } from "../data-cube/data-cube"; + +export interface SourcesJS { + clusters?: ClusterJS[]; + dataCubes?: DataCubeJS[]; +} + +export interface Sources { + readonly clusters: Cluster[]; + readonly dataCubes: DataCube[]; +} + +export interface SerializedSources { + clusters: ClusterJS[]; // SerializedCluster[] + dataCubes: DataCubeJS[]; // SerializedDataCube[] +} + +interface ClustersConfig { + clusters?: ClusterJS[]; + druidHost?: string; + brokerHost?: string; +} + +function readClusters({ clusters, druidHost, brokerHost }: ClustersConfig): Cluster[] { + if (Array.isArray(clusters)) return clusters.map(cluster => Cluster.fromJS(cluster)); + if (isTruthy(druidHost) || isTruthy(brokerHost)) { + return [Cluster.fromJS({ + name: "druid", + url: druidHost || brokerHost + })]; + } + return []; +} + +interface DataCubesConfig { + dataCubes?: DataCubeJS[]; + dataSources?: DataCubeJS[]; +} + +function readDataCubes({ dataCubes, dataSources }: DataCubesConfig, clusters: Cluster[]): DataCube[] { + const cubes = dataCubes || dataSources || []; + return cubes.map(cube => { + const cluster = findCluster(cube, clusters); + return DataCube.fromJS(cube, { cluster }); + }); +} + +export function fromConfig(config: SourcesJS): Sources { + const clusters = readClusters(config); + const dataCubes = readDataCubes(config, clusters); + + return { + clusters, + dataCubes + }; +} + +export function serialize({ + clusters: serverClusters, + dataCubes: serverDataCubes + }: Sources): SerializedSources { + const clusters = serverClusters.map(c => c.toClientCluster().toJS()); + + const dataCubes = serverDataCubes + .filter(ds => ds.isQueryable()) + .map(ds => ds.toClientDataCube().toJS()); + + return { + clusters, + dataCubes + }; +} + +export function deserialize(settings: SerializedSources, appSettings: AppSettings): Sources { + const clusters = settings.clusters.map(cluster => Cluster.fromJS(cluster)); + + const dataCubes = settings.dataCubes.map((dataCubeJS: DataCubeJS) => { + const cluster = findCluster(dataCubeJS, clusters); + let dataCubeObject = DataCube.fromJS(dataCubeJS, { cluster }); + const executor = Ajax.queryUrlExecutorFactory(dataCubeObject.name, appSettings); + dataCubeObject = dataCubeObject.attachExecutor(executor); + return dataCubeObject; + }); + + return { + clusters, + dataCubes + }; +} + +export function getDataCubesForCluster(sources: Sources, clusterName: string): DataCube[] { + return sources.dataCubes.filter(dataCube => dataCube.clusterName === clusterName); +} + +export function getDataCube(sources: Sources, dataCubeName: string): DataCube { + return NamedArray.findByName(sources.dataCubes, dataCubeName); +} + +export function addOrUpdateDataCube(sources: Sources, dataCube: DataCube): Sources { + const dataCubes = NamedArray.overrideByName(sources.dataCubes, dataCube); + return { + ...sources, + dataCubes + }; +} + +export function deleteDataCube(sources: Sources, dataCube: DataCube): Sources { + return { + ...sources, + dataCubes: sources.dataCubes.filter(dc => dc.equals(dataCube)) + }; +} diff --git a/src/common/utils/yaml-helper/yaml-helper.ts b/src/common/utils/yaml-helper/yaml-helper.ts index 5e48ddda0..5dee7c6f0 100644 --- a/src/common/utils/yaml-helper/yaml-helper.ts +++ b/src/common/utils/yaml-helper/yaml-helper.ts @@ -16,13 +16,14 @@ */ import { AttributeInfo } from "plywood"; -import { CLUSTER, CUSTOMIZATION, DATA_CUBE } from "../../../common/models/labels"; import { AppSettings } from "../../models/app-settings/app-settings"; import { Cluster } from "../../models/cluster/cluster"; import { Customization } from "../../models/customization/customization"; import { DataCube, Source } from "../../models/data-cube/data-cube"; import { Dimension } from "../../models/dimension/dimension"; +import { CLUSTER, CUSTOMIZATION, DATA_CUBE } from "../../models/labels"; import { Measure } from "../../models/measure/measure"; +import { Sources } from "../../models/sources/sources"; function spaces(n: number) { return (new Array(n + 1)).join(" "); @@ -435,12 +436,8 @@ interface Extra { port?: number; } -export function appSettingsToYAML(appSettings: AppSettings, withComments: boolean, extra: Extra = {}): string { - const { dataCubes, clusters, customization } = appSettings; - - if (!dataCubes.length) throw new Error("Could not find any data cubes, please verify network connectivity"); - - let lines: string[] = []; +export function printExtra(extra: Extra, withComments: boolean): string { + const lines = []; if (extra.header && extra.version) { lines.push( @@ -452,30 +449,49 @@ export function appSettingsToYAML(appSettings: AppSettings, withComments: boolea if (extra.verbose) { if (withComments) { - lines.push("# Run Swiv in verbose mode so it prints out the queries that it issues"); + lines.push("# Run Turnilo in verbose mode so it prints out the queries that it issues"); } lines.push("verbose: true", ""); } if (extra.port) { if (withComments) { - lines.push("# The port on which the Swiv server will listen on"); + lines.push("# The port on which the Turnilo server will listen on"); } lines.push(`port: ${extra.port}`, ""); } + return lines.join("\n"); +} + +export function sourcesToYaml(sources: Sources, withComments: boolean): string { + const { dataCubes, clusters } = sources; + + if (!dataCubes.length) throw new Error("Could not find any data cubes, please verify network connectivity"); + + let lines: string[] = []; + if (clusters.length) { lines.push("clusters:"); lines = lines.concat.apply(lines, clusters.map(c => clusterToYAML(c, withComments))); } + lines.push("dataCubes:"); + lines = lines.concat.apply(lines, dataCubes.map(d => dataCubeToYAML(d, withComments))); + + return lines.join("\n"); +} + +export function appSettingsToYaml(settings: AppSettings, withComments: boolean): string { + // TODO: shouldn't we print oauth and clientTimeout? + const { customization, oauth, clientTimeout } = settings; + + const lines = []; + if (customization) { lines.push("customization:"); lines.push(...customizationToYAML(customization, withComments)); } - lines.push("dataCubes:"); - lines = lines.concat.apply(lines, dataCubes.map(d => dataCubeToYAML(d, withComments))); - return lines.join("\n"); } diff --git a/src/server/app.ts b/src/server/app.ts index f7269693c..30fcb4bf9 100644 --- a/src/server/app.ts +++ b/src/server/app.ts @@ -29,11 +29,10 @@ import { mkurlRouter } from "./routes/mkurl/mkurl"; import { plyqlRouter } from "./routes/plyql/plyql"; import { plywoodRouter } from "./routes/plywood/plywood"; import { readinessRouter } from "./routes/readiness/readiness"; -import { settingsRouter } from "./routes/settings/settings"; import { shortenRouter } from "./routes/shorten/shorten"; +import { sourcesRouter } from "./routes/sources/sources"; import { turniloRouter } from "./routes/turnilo/turnilo"; import { loadPlugin } from "./utils/plugin-loader/load-plugin"; -import { SettingsGetter } from "./utils/settings-manager/settings-manager"; import { errorLayout } from "./views"; declare module "express" { @@ -96,14 +95,17 @@ app.use((req: Request, res: Response, next: Function) => { next(); }); -const appSettings: SettingsGetter = opts => SETTINGS_MANAGER.getSettings(opts); - SERVER_SETTINGS.getPlugins().forEach(({ path, name, settings }: PluginSettings) => { try { LOGGER.log(`Loading plugin ${name} module`); const module = loadPlugin(path, SETTINGS_MANAGER.anchorPath); LOGGER.log(`Invoking plugin ${name}`); - module.plugin(app, settings, SERVER_SETTINGS, appSettings, LOGGER.addPrefix(name)); + module.plugin(app, + settings, + SERVER_SETTINGS, + SETTINGS_MANAGER.appSettings, + SETTINGS_MANAGER.sourcesGetter, + LOGGER.addPrefix(name)); } catch (e) { LOGGER.warn(`Plugin ${name} threw an error: ${e.message}`); } @@ -137,18 +139,17 @@ if (app.get("env") === "dev-hmr") { attachRouter("/", express.static(join(__dirname, "../../build/public"))); attachRouter("/", express.static(join(__dirname, "../../assets"))); -attachRouter(SERVER_SETTINGS.getReadinessEndpoint(), readinessRouter(appSettings)); +attachRouter(SERVER_SETTINGS.getReadinessEndpoint(), readinessRouter(SETTINGS_MANAGER.sourcesGetter)); attachRouter(SERVER_SETTINGS.getLivenessEndpoint(), livenessRouter); // Data routes -attachRouter("/settings", settingsRouter(appSettings)); +attachRouter("/settings", sourcesRouter(SETTINGS_MANAGER.sourcesGetter)); attachRouter("/plywood", plywoodRouter(SETTINGS_MANAGER)); -attachRouter("/plyql", plyqlRouter(appSettings)); -attachRouter("/mkurl", mkurlRouter(appSettings)); -attachRouter("/shorten", shortenRouter(appSettings, isTrustedProxy)); +attachRouter("/plyql", plyqlRouter(SETTINGS_MANAGER.sourcesGetter)); +attachRouter("/mkurl", mkurlRouter(SETTINGS_MANAGER.sourcesGetter)); +attachRouter("/shorten", shortenRouter(SETTINGS_MANAGER.appSettings, isTrustedProxy)); -const freshSettingsGetter: SettingsGetter = opts => SETTINGS_MANAGER.getFreshSettings(opts); -attachRouter("/", turniloRouter(freshSettingsGetter, VERSION)); +attachRouter("/", turniloRouter(SETTINGS_MANAGER.appSettings, VERSION)); // Catch 404 and redirect to / app.use((req: Request, res: Response) => { diff --git a/src/server/config.ts b/src/server/config.ts index 805459ad8..7f7fd97e0 100644 --- a/src/server/config.ts +++ b/src/server/config.ts @@ -18,17 +18,20 @@ import * as nopt from "nopt"; import * as path from "path"; import { LOGGER, NULL_LOGGER } from "../common/logger/logger"; -import { AppSettings } from "../common/models/app-settings/app-settings"; +import { + AppSettingsJS, + EMPTY_APP_SETTINGS, + fromConfig as appSettingsFromConfig +} from "../common/models/app-settings/app-settings"; import { Cluster } from "../common/models/cluster/cluster"; import { DataCube } from "../common/models/data-cube/data-cube"; -import { arraySum } from "../common/utils/general/general"; -import { appSettingsToYAML } from "../common/utils/yaml-helper/yaml-helper"; +import { fromConfig as sourcesFromConfig, SourcesJS } from "../common/models/sources/sources"; +import { arraySum, isTruthy } from "../common/utils/general/general"; +import { appSettingsToYaml, printExtra, sourcesToYaml } from "../common/utils/yaml-helper/yaml-helper"; import { ServerSettings, ServerSettingsJS } from "./models/server-settings/server-settings"; import { loadFileSync } from "./utils/file/file"; import { SettingsManager } from "./utils/settings-manager/settings-manager"; -import { SettingsStore } from "./utils/settings-store/settings-store"; -const AUTH_MODULE_VERSION = 1; const PACKAGE_FILE = path.join(__dirname, "../../package.json"); function exitWithMessage(message: string): void { @@ -211,31 +214,16 @@ if (START_SERVER) { logger.log(`Starting Turnilo v${VERSION}`); } -// --- Location ------------------------------- - -let settingsStore: SettingsStore; - -if (configContent) { - const appSettings = AppSettings.fromJS(configContent, {}); - // TODO: this validation should be done via #365 - appSettings.validate(); - settingsStore = SettingsStore.create(appSettings); -} else { - let initAppSettings = AppSettings.BLANK; - - // If a file is specified add it as a dataCube - const fileToLoad = parsedArgs["file"]; - if (fileToLoad) { - initAppSettings = initAppSettings.addDataCube(new DataCube({ - name: path.basename(fileToLoad, path.extname(fileToLoad)), - clusterName: "native", - source: fileToLoad - })); - } +function readConfig(config: AppSettingsJS & SourcesJS) { + return { + appSettings: appSettingsFromConfig(config), + sources: sourcesFromConfig(config) + }; +} - const url = parsedArgs.druid; - if (url) { - initAppSettings = initAppSettings.addCluster(new Cluster({ +function readArgs(file: string | undefined, url: string | undefined) { + const sources = { + clusters: !isTruthy(url) ? [] : [new Cluster({ name: "druid", url, sourceListScan: "auto", @@ -243,13 +231,26 @@ if (configContent) { sourceListRefreshOnLoad: Cluster.DEFAULT_SOURCE_LIST_REFRESH_ON_LOAD, sourceReintrospectInterval: Cluster.DEFAULT_SOURCE_REINTROSPECT_INTERVAL, sourceReintrospectOnLoad: Cluster.DEFAULT_SOURCE_REINTROSPECT_ON_LOAD - })); - } - - settingsStore = SettingsStore.create(initAppSettings); + })], + dataCubes: !isTruthy(file) ? [] : [new DataCube({ + name: path.basename(file, path.extname(file)), + clusterName: "native", + source: file + }) + ] + }; + + return { + appSettings: EMPTY_APP_SETTINGS, + sources + }; } -export const SETTINGS_MANAGER = new SettingsManager(settingsStore, { +const { appSettings, sources } = configContent + ? readConfig(configContent) + : readArgs(parsedArgs.file, parsedArgs.druid); + +export const SETTINGS_MANAGER = new SettingsManager(appSettings, sources, { logger, verbose: VERBOSE, anchorPath: configDirPath, @@ -259,17 +260,22 @@ export const SETTINGS_MANAGER = new SettingsManager(settingsStore, { // --- Printing ------------------------------- if (PRINT_CONFIG) { - var withComments = Boolean(parsedArgs["with-comments"]); + const withComments = Boolean(parsedArgs["with-comments"]); - SETTINGS_MANAGER.getFreshSettings({ + SETTINGS_MANAGER.getFreshSources({ timeout: 10000 - }).then(appSettings => { - const config = appSettingsToYAML(appSettings, withComments, { + }).then(sources => { + const extra = { header: true, version: VERSION, verbose: VERBOSE, port: SERVER_SETTINGS.getPort() - }); + }; + const config = [ + printExtra(extra, withComments), + appSettingsToYaml(appSettings, withComments), + sourcesToYaml(sources, withComments) + ].join("\n"); process.stdout.write(config, () => process.exit()); }).catch((e: Error) => { exitWithError("There was an error generating a config: " + e.message); diff --git a/src/server/models/plugin-settings/plugin-settings.ts b/src/server/models/plugin-settings/plugin-settings.ts index 4e55a0a62..5a8e9a23e 100644 --- a/src/server/models/plugin-settings/plugin-settings.ts +++ b/src/server/models/plugin-settings/plugin-settings.ts @@ -20,12 +20,18 @@ import { dictEqual } from "plywood"; import { Logger } from "../../../common/logger/logger"; import { AppSettings } from "../../../common/models/app-settings/app-settings"; import { isNil } from "../../../common/utils/general/general"; +import { SourcesGetter } from "../../utils/settings-manager/settings-manager"; import { ServerSettings } from "../server-settings/server-settings"; type PluginSettingsObject = object; export interface PluginModule { - plugin: (app: Application, pluginSettings: PluginSettingsObject, serverSettings: ServerSettings, appSettings: () => Promise, logger: Logger) => void; + plugin: (app: Application, + pluginSettings: PluginSettingsObject, + serverSettings: ServerSettings, + appSettings: AppSettings, + sources: SourcesGetter, + logger: Logger) => void; } interface PluginSettingsValue { diff --git a/src/server/routes/mkurl/mkurl.mocha.ts b/src/server/routes/mkurl/mkurl.mocha.ts index 2724a8419..7c0f2e233 100644 --- a/src/server/routes/mkurl/mkurl.mocha.ts +++ b/src/server/routes/mkurl/mkurl.mocha.ts @@ -19,7 +19,7 @@ import * as bodyParser from "body-parser"; import * as express from "express"; import { $ } from "plywood"; import * as supertest from "supertest"; -import { AppSettingsFixtures } from "../../../common/models/app-settings/app-settings.fixtures"; +import { wikiSourcesWithExecutor } from "../../../common/models/sources/sources.fixtures"; import { UrlHashConverterFixtures } from "../../../common/utils/url-hash-converter/url-hash-converter.fixtures"; import { mkurlRouter } from "./mkurl"; @@ -29,7 +29,7 @@ let app = express(); app.use(bodyParser.json()); -app.use(mkurlPath, mkurlRouter(() => Promise.resolve(AppSettingsFixtures.wikiOnlyWithExecutor()))); +app.use(mkurlPath, mkurlRouter(() => Promise.resolve(wikiSourcesWithExecutor))); describe("mkurl router", () => { it("gets a simple url back", (testComplete: any) => { diff --git a/src/server/routes/mkurl/mkurl.ts b/src/server/routes/mkurl/mkurl.ts index def7df404..0fe3cafca 100644 --- a/src/server/routes/mkurl/mkurl.ts +++ b/src/server/routes/mkurl/mkurl.ts @@ -16,14 +16,13 @@ */ import { Request, Response, Router } from "express"; -import { AppSettings } from "../../../common/models/app-settings/app-settings"; import { Essence } from "../../../common/models/essence/essence"; +import { getDataCube, Sources } from "../../../common/models/sources/sources"; import { urlHashConverter } from "../../../common/utils/url-hash-converter/url-hash-converter"; import { definitionConverters, ViewDefinitionVersion } from "../../../common/view-definitions"; -import { MANIFESTS } from "../../../common/visualization-manifests"; -import { GetSettingsOptions, SettingsGetter } from "../../utils/settings-manager/settings-manager"; +import { SourcesGetter } from "../../utils/settings-manager/settings-manager"; -export function mkurlRouter(settingsGetter: SettingsGetter) { +export function mkurlRouter(sourcesGetter: SourcesGetter) { const router = Router(); @@ -53,14 +52,14 @@ export function mkurlRouter(settingsGetter: SettingsGetter) { return; } - let settings: AppSettings; + let sources: Sources; try { - settings = await settingsGetter(); + sources = await sourcesGetter(); } catch (e) { res.status(400).send({ error: "Couldn't load settings" }); return; } - const myDataCube = settings.getDataCube(dataCubeName); + const myDataCube = getDataCube(sources, dataCubeName); if (!myDataCube) { res.status(400).send({ error: "unknown data cube" }); return; diff --git a/src/server/routes/plyql/plyql.mocha.ts b/src/server/routes/plyql/plyql.mocha.ts index b3cbb4cb7..34c4dd147 100644 --- a/src/server/routes/plyql/plyql.mocha.ts +++ b/src/server/routes/plyql/plyql.mocha.ts @@ -19,14 +19,14 @@ import * as bodyParser from "body-parser"; import * as express from "express"; import * as mime from "mime"; import * as supertest from "supertest"; -import { AppSettingsFixtures } from "../../../common/models/app-settings/app-settings.fixtures"; +import { wikiSourcesWithExecutor } from "../../../common/models/sources/sources.fixtures"; import { plyqlRouter } from "./plyql"; let app = express(); app.use(bodyParser.json()); -app.use("/", plyqlRouter(() => Promise.resolve(AppSettingsFixtures.wikiOnlyWithExecutor()))); +app.use("/", plyqlRouter(() => Promise.resolve(wikiSourcesWithExecutor))); const pageQuery = "SELECT SUM(added) as Added FROM `wiki` GROUP BY page ORDER BY Added DESC LIMIT 10;"; const timeQuery = "SELECT TIME_BUCKET(time, 'PT1H', 'Etc/UTC') as TimeByHour, SUM(added) as Added FROM `wiki` GROUP BY 1 ORDER BY TimeByHour ASC"; diff --git a/src/server/routes/plyql/plyql.ts b/src/server/routes/plyql/plyql.ts index 35b1e60f0..baf186342 100644 --- a/src/server/routes/plyql/plyql.ts +++ b/src/server/routes/plyql/plyql.ts @@ -17,7 +17,8 @@ import { Request, Response, Router } from "express"; import { $, Dataset, Expression, RefExpression } from "plywood"; -import { GetSettingsOptions, SettingsGetter } from "../../utils/settings-manager/settings-manager"; +import { getDataCube } from "../../../common/models/sources/sources"; +import { SourcesGetter } from "../../utils/settings-manager/settings-manager"; interface PlyqlOutputFunctions { [key: string]: (data: Dataset) => string; @@ -33,7 +34,7 @@ const outputFunctions: PlyqlOutputFunctions = { tsv: (data: Dataset): string => data.toTSV() }; -export function plyqlRouter(settingsGetter: SettingsGetter) { +export function plyqlRouter(sourcesGetter: SourcesGetter) { const router = Router(); @@ -79,8 +80,8 @@ export function plyqlRouter(settingsGetter: SettingsGetter) { }); try { - const settings = await settingsGetter(); - const myDataCube = settings.getDataCube(dataCube); + const sources = await sourcesGetter(); + const myDataCube = getDataCube(sources, dataCube); if (!myDataCube) { res.status(400).send({ error: "unknown data cube" }); diff --git a/src/server/routes/plywood/plywood.mocha.ts b/src/server/routes/plywood/plywood.mocha.ts index 643959a6e..a5ef72ac8 100644 --- a/src/server/routes/plywood/plywood.mocha.ts +++ b/src/server/routes/plywood/plywood.mocha.ts @@ -19,11 +19,11 @@ import * as bodyParser from "body-parser"; import * as express from "express"; import { $ } from "plywood"; import * as supertest from "supertest"; -import { AppSettingsFixtures } from "../../../common/models/app-settings/app-settings.fixtures"; +import { wikiSourcesWithExecutor } from "../../../common/models/sources/sources.fixtures"; import { plywoodRouter } from "./plywood"; const settingsManagerFixture = { - getSettings: () => Promise.resolve(AppSettingsFixtures.wikiOnlyWithExecutor()), + getSources: () => Promise.resolve(wikiSourcesWithExecutor), anchorPath: "." }; diff --git a/src/server/routes/plywood/plywood.ts b/src/server/routes/plywood/plywood.ts index 893669ea1..8b3601163 100644 --- a/src/server/routes/plywood/plywood.ts +++ b/src/server/routes/plywood/plywood.ts @@ -19,11 +19,12 @@ import { Timezone } from "chronoshift"; import { Request, Response, Router } from "express"; import { Dataset, Expression } from "plywood"; import { LOGGER } from "../../../common/logger/logger"; +import { getDataCube } from "../../../common/models/sources/sources"; import { checkAccess } from "../../utils/datacube-guard/datacube-guard"; import { loadQueryDecorator } from "../../utils/query-decorator-loader/load-query-decorator"; import { SettingsManager } from "../../utils/settings-manager/settings-manager"; -export function plywoodRouter(settingsManager: Pick) { +export function plywoodRouter(settingsManager: Pick) { const router = Router(); @@ -62,15 +63,15 @@ export function plywoodRouter(settingsManager: Pick { describe("single druid cluster", () => { before(done => { app = express(); - app.use("/", readinessRouter(() => Promise.resolve(AppSettingsFixtures.wikiOnly()))); + app.use("/", readinessRouter(() => Promise.resolve(wikiSources))); server = app.listen(0, done); }); @@ -71,7 +71,7 @@ describe("readiness router", () => { describe("multiple druid clusters", () => { before(done => { app = express(); - app.use("/", readinessRouter(() => Promise.resolve(AppSettingsFixtures.wikiTwitter()))); + app.use("/", readinessRouter(() => Promise.resolve(wikiTwitterSources))); server = app.listen(0, done); }); diff --git a/src/server/routes/readiness/readiness.ts b/src/server/routes/readiness/readiness.ts index 28bebd2dc..6f743b31d 100644 --- a/src/server/routes/readiness/readiness.ts +++ b/src/server/routes/readiness/readiness.ts @@ -19,7 +19,7 @@ import { Request, Response, Router } from "express"; import * as request from "request-promise-native"; import { LOGGER } from "../../../common/logger/logger"; import { Cluster } from "../../../common/models/cluster/cluster"; -import { SettingsGetter } from "../../utils/settings-manager/settings-manager"; +import { SourcesGetter } from "../../utils/settings-manager/settings-manager"; const unhealthyHttpStatus = 503; const healthyHttpStatus = 200; @@ -82,14 +82,14 @@ function logUnhealthy(clusterHealths: ClusterHealth[]): void { }); } -export function readinessRouter(getSettings: SettingsGetter) { +export function readinessRouter(getSources: SourcesGetter) { const router = Router(); router.get("/", async (req: Request, res: Response) => { try { - const settings = await getSettings(); - const clusterHealths = await checkClusters(settings.clusters); + const sources = await getSources(); + const clusterHealths = await checkClusters(sources.clusters); logUnhealthy(clusterHealths); const overallHealthStatus = aggregateHealthStatus(clusterHealths); const httpState = statusToHttpStatus(overallHealthStatus); diff --git a/src/server/routes/shorten/shorten.mocha.ts b/src/server/routes/shorten/shorten.mocha.ts index fc88a1f82..1922c3b2f 100644 --- a/src/server/routes/shorten/shorten.mocha.ts +++ b/src/server/routes/shorten/shorten.mocha.ts @@ -19,7 +19,6 @@ import * as express from "express"; import { Express } from "express"; import * as http from "http"; import * as supertest from "supertest"; -import { AppSettingsFixtures } from "../../../common/models/app-settings/app-settings.fixtures"; import { Customization } from "../../../common/models/customization/customization"; import { UrlShortenerDef } from "../../../common/models/url-shortener/url-shortener"; import { FailUrlShortenerJS, SuccessUrlShortenerJS } from "../../../common/models/url-shortener/url-shortener.fixtures"; @@ -27,10 +26,11 @@ import { shortenRouter } from "./shorten"; const shortenPath = "/shorten"; -const settingsGetterFactory = (urlShortener: UrlShortenerDef) => () => Promise.resolve( - AppSettingsFixtures.wikiOnly().changeCustomization(Customization.fromJS({ +const settingsFactory = (urlShortener: UrlShortenerDef) => ({ + customization: Customization.fromJS({ urlShortener - }))); + }) +}); const callShortener = (app: Express) => supertest(app) .get(shortenPath) @@ -44,7 +44,7 @@ describe("url shortener", () => { describe("with succesful shortener", () => { before(done => { app = express(); - app.use(shortenPath, shortenRouter(settingsGetterFactory(SuccessUrlShortenerJS), true)); + app.use(shortenPath, shortenRouter(settingsFactory(SuccessUrlShortenerJS), true)); server = app.listen(0, done); }); @@ -63,7 +63,7 @@ describe("url shortener", () => { describe("without failing shortener", () => { before(done => { app = express(); - app.use(shortenPath, shortenRouter(settingsGetterFactory(FailUrlShortenerJS), true)); + app.use(shortenPath, shortenRouter(settingsFactory(FailUrlShortenerJS), true)); app.use(bodyParser.json()); server = app.listen(0, done); }); diff --git a/src/server/routes/shorten/shorten.ts b/src/server/routes/shorten/shorten.ts index 463cd4ae7..f4a362613 100644 --- a/src/server/routes/shorten/shorten.ts +++ b/src/server/routes/shorten/shorten.ts @@ -16,17 +16,16 @@ import { Request, Response, Router } from "express"; import * as request from "request-promise-native"; +import { AppSettings } from "../../../common/models/app-settings/app-settings"; import { UrlShortenerContext } from "../../../common/models/url-shortener/url-shortener"; -import { SettingsGetter } from "../../utils/settings-manager/settings-manager"; -export function shortenRouter(settingsGetter: SettingsGetter, isTrustedProxy: boolean) { +export function shortenRouter(settings: Pick, isTrustedProxy: boolean) { const router = Router(); router.get("/", async (req: Request, res: Response) => { const { url } = req.query; try { - const settings = await settingsGetter(); const shortener = settings.customization.urlShortener; const context: UrlShortenerContext = { // If trust proxy is not enabled, app is understood as directly facing the internet diff --git a/src/server/routes/settings/settings.ts b/src/server/routes/sources/sources.ts similarity index 74% rename from src/server/routes/settings/settings.ts rename to src/server/routes/sources/sources.ts index 1263cbdcf..83f36283b 100644 --- a/src/server/routes/settings/settings.ts +++ b/src/server/routes/sources/sources.ts @@ -16,10 +16,11 @@ import { Request, Response, Router } from "express"; import { LOGGER } from "../../../common/logger/logger"; +import { serialize } from "../../../common/models/sources/sources"; import { checkAccess } from "../../utils/datacube-guard/datacube-guard"; -import { SettingsGetter } from "../../utils/settings-manager/settings-manager"; +import { SourcesGetter } from "../../utils/settings-manager/settings-manager"; -export function settingsRouter(settingsGetter: SettingsGetter) { +export function sourcesRouter(sourcesGetter: SourcesGetter) { const logger = LOGGER.addPrefix("Settings Endpoint: "); @@ -28,10 +29,11 @@ export function settingsRouter(settingsGetter: SettingsGetter) { router.get("/", async (req: Request, res: Response) => { try { - const settings = await settingsGetter(); - const clientSettings = settings.toClientSettings(); - clientSettings.dataCubes = clientSettings.dataCubes.filter( dataCube => checkAccess(dataCube, req.headers) ); - res.json(clientSettings); + const { clusters, dataCubes } = await sourcesGetter(); + res.json(serialize({ + clusters, + dataCubes: dataCubes.filter( dataCube => checkAccess(dataCube, req.headers) ) + })); } catch (error) { logger.error(error.message); if (error.hasOwnProperty("stack")) { diff --git a/src/server/routes/turnilo/turnilo.ts b/src/server/routes/turnilo/turnilo.ts index bc4526e35..f1c95022c 100644 --- a/src/server/routes/turnilo/turnilo.ts +++ b/src/server/routes/turnilo/turnilo.ts @@ -16,22 +16,20 @@ */ import { Request, Response, Router } from "express"; +import { AppSettings, serialize } from "../../../common/models/app-settings/app-settings"; import { SETTINGS_MANAGER } from "../../config"; -import { SettingsGetter } from "../../utils/settings-manager/settings-manager"; import { mainLayout } from "../../views"; -export function turniloRouter(settingsGetter: SettingsGetter, version: string) { +export function turniloRouter(settings: AppSettings, version: string) { const router = Router(); router.get("/", async (req: Request, res: Response) => { try { - const settings = await settingsGetter(); - const clientSettings = settings.withoutSources(); res.send(mainLayout({ version, title: settings.customization.getTitle(version), - appSettings: clientSettings, + appSettings: serialize(settings), timekeeper: SETTINGS_MANAGER.getTimekeeper() })); } catch (e) { diff --git a/src/server/utils/cluster-manager/cluster-manager.ts b/src/server/utils/cluster-manager/cluster-manager.ts index 15bc39246..1775f3f2d 100644 --- a/src/server/utils/cluster-manager/cluster-manager.ts +++ b/src/server/utils/cluster-manager/cluster-manager.ts @@ -15,7 +15,6 @@ * limitations under the License. */ -import * as path from "path"; import { External } from "plywood"; import { PlywoodRequester } from "plywood-base-api"; import { DruidRequestDecorator } from "plywood-druid-requester"; diff --git a/src/server/utils/settings-manager/settings-manager.ts b/src/server/utils/settings-manager/settings-manager.ts index 4b1a8e640..7e4d241c2 100644 --- a/src/server/utils/settings-manager/settings-manager.ts +++ b/src/server/utils/settings-manager/settings-manager.ts @@ -20,14 +20,20 @@ import { Logger } from "../../../common/logger/logger"; import { AppSettings } from "../../../common/models/app-settings/app-settings"; import { Cluster } from "../../../common/models/cluster/cluster"; import { DataCube } from "../../../common/models/data-cube/data-cube"; +import { + addOrUpdateDataCube, + deleteDataCube, + getDataCube, + getDataCubesForCluster, + Sources +} from "../../../common/models/sources/sources"; import { Timekeeper } from "../../../common/models/timekeeper/timekeeper"; -import { noop } from "../../../common/utils/functional/functional"; +import { noop, Unary } from "../../../common/utils/functional/functional"; import { pluralIfNeeded } from "../../../common/utils/general/general"; import { timeout } from "../../../common/utils/promise/promise"; import { TimeMonitor } from "../../../common/utils/time-monitor/time-monitor"; import { ClusterManager } from "../cluster-manager/cluster-manager"; import { FileManager } from "../file-manager/file-manager"; -import { SettingsStore } from "../settings-store/settings-store"; export interface SettingsManagerOptions { logger: Logger; @@ -36,40 +42,41 @@ export interface SettingsManagerOptions { anchorPath: string; } -export interface GetSettingsOptions { +export interface GetSourcesOptions { timeout?: number; } -export type SettingsGetter = (opts?: GetSettingsOptions) => Promise; +export type SourcesGetter = (opts?: GetSourcesOptions) => Promise; export class SettingsManager { public logger: Logger; public verbose: boolean; public anchorPath: string; - public settingsStore: SettingsStore; public appSettings: AppSettings; + public sources: Sources; public timeMonitor: TimeMonitor; public fileManagers: FileManager[]; public clusterManagers: ClusterManager[]; public settingsLoaded: Promise; public initialLoadTimeout: number; - constructor(settingsStore: SettingsStore, options: SettingsManagerOptions) { + constructor(appSettings: AppSettings, + sources: Sources, + options: SettingsManagerOptions) { const logger = options.logger; this.logger = logger; this.verbose = Boolean(options.verbose); this.anchorPath = options.anchorPath; this.timeMonitor = new TimeMonitor(logger); - this.settingsStore = settingsStore; + this.appSettings = appSettings; this.fileManagers = []; this.clusterManagers = []; this.initialLoadTimeout = options.initialLoadTimeout || 30000; - this.appSettings = AppSettings.BLANK; + this.sources = sources; - this.settingsLoaded = settingsStore.readSettings() - .then(appSettings => this.reviseSettings(appSettings)) + this.settingsLoaded = this.reviseSources() .catch(e => { logger.error(`Fatal settings load error: ${e.message}`); logger.error(e.stack); @@ -109,7 +116,7 @@ export class SettingsManager { if (Array.isArray(dataCube.source)) throw new Error(`native data cube can't have multiple sources: ${dataCube.source.join(", ")}`); const { verbose, logger, anchorPath } = this; - var fileManager = new FileManager({ + const fileManager = new FileManager({ logger, verbose, anchorPath, @@ -126,58 +133,60 @@ export class SettingsManager { return this.timeMonitor.timekeeper; } - handleSettingsTask(task: Promise, opts: GetSettingsOptions = {}): Promise { + handleSourcesTask(task: Promise, opts: GetSourcesOptions = {}): Promise { const timeoutMs = opts.timeout || this.initialLoadTimeout; if (timeoutMs === 0) { - return task.then(() => this.appSettings); + return task.then(() => this.sources); } return Promise.race([task, timeout(timeoutMs)]) .catch(() => { this.logger.warn(`Settings load timeout (${timeoutMs}ms) hit, continuing`); }) - .then(() => this.appSettings); + .then(() => this.sources); } - getFreshSettings(opts: GetSettingsOptions = {}): Promise { + getFreshSources(opts: GetSourcesOptions = {}): Promise { const task = this.settingsLoaded.then(() => { return Promise.all(this.clusterManagers.map(clusterManager => clusterManager.refresh())) as any; }); - return this.handleSettingsTask(task, opts); + return this.handleSourcesTask(task, opts); } - getSettings(opts: GetSettingsOptions = {}): Promise { - return this.handleSettingsTask(this.settingsLoaded, opts); + getSources(opts: GetSourcesOptions = {}): Promise { + return this.handleSourcesTask(this.settingsLoaded, opts); } - reviseSettings(newSettings: AppSettings): Promise { + sourcesGetter: Unary> = opts => this.getSources(opts); + + reviseSources(): Promise { + const { sources } = this; const tasks = [ - this.reviseClusters(newSettings), - this.reviseDataCubes(newSettings) + this.reviseClusters(sources), + this.reviseDataCubes(sources) ]; - this.appSettings = newSettings; return Promise.all(tasks).then(noop); } - reviseClusters(settings: AppSettings): Promise { - const { clusters } = settings; - const tasks: Array> = clusters.map(cluster => this.addClusterManager(cluster, settings.getDataCubesForCluster(cluster.name))); + reviseClusters(sources: Sources): Promise { + const { clusters } = sources; + const tasks: Array> = clusters.map(cluster => this.addClusterManager(cluster, getDataCubesForCluster(sources, cluster.name))); return Promise.all(tasks).then(noop); } - reviseDataCubes(settings: AppSettings): Promise { - const nativeDataCubes = settings.getDataCubesForCluster("native"); + reviseDataCubes(sources: Sources): Promise { + const nativeDataCubes = getDataCubesForCluster(sources, "native"); const tasks: Array> = nativeDataCubes.map(dc => this.addFileManager(dc)); return Promise.all(tasks).then(noop); } generateDataCubeName = (external: External): string => { - const { appSettings } = this; + const { sources } = this; const source = String(external.source); let candidateName = source; let i = 0; - while (appSettings.getDataCube(candidateName)) { + while (getDataCube(sources, candidateName)) { i++; candidateName = source + i; } @@ -185,11 +194,11 @@ export class SettingsManager { }; onDatasetChange = (dataCubeName: string, changedDataset: Dataset): void => { - const { logger } = this; + const { logger, sources } = this; logger.log(`Got native dataset update for ${dataCubeName}`); - let dataCube = this.appSettings.getDataCube(dataCubeName); + let dataCube = getDataCube(sources, dataCubeName); if (!dataCube) throw new Error(`Unknown dataset ${dataCubeName}`); dataCube = dataCube.updateWithDataset(changedDataset); @@ -199,16 +208,16 @@ export class SettingsManager { }); } - this.appSettings = this.appSettings.addOrUpdateDataCube(dataCube); + this.sources = addOrUpdateDataCube(sources, dataCube); }; onExternalChange = (cluster: Cluster, dataCubeName: string, changedExternal: External): Promise => { if (!changedExternal.attributes || !changedExternal.requester) return Promise.resolve(null); - const { logger } = this; + const { sources, logger } = this; logger.log(`Got queryable external dataset update for ${dataCubeName} in cluster ${cluster.name}`); - let dataCube = this.appSettings.getDataCube(dataCubeName); + let dataCube = getDataCube(sources, dataCubeName); if (!dataCube) { dataCube = DataCube.fromClusterAndExternal(dataCubeName, cluster, changedExternal); } @@ -220,19 +229,19 @@ export class SettingsManager { }); } - this.appSettings = this.appSettings.addOrUpdateDataCube(dataCube); + this.sources = addOrUpdateDataCube(sources, dataCube); return Promise.resolve(null); }; onExternalRemoved = (cluster: Cluster, dataCubeName: string, changedExternal: External): Promise => { if (!changedExternal.attributes || !changedExternal.requester) return Promise.resolve(null); - const { logger } = this; + const { sources, logger } = this; logger.log(`Got external dataset removal for ${dataCubeName} in cluster ${cluster.name}`); - let dataCube = this.appSettings.getDataCube(dataCubeName); + let dataCube = getDataCube(sources, dataCubeName); if (dataCube) { - this.appSettings = this.appSettings.deleteDataCube(dataCube); + this.sources = deleteDataCube(sources, dataCube); this.timeMonitor.removeCheck(dataCube.name); } return Promise.resolve(null); diff --git a/src/server/utils/settings-store/settings-store.ts b/src/server/utils/settings-store/settings-store.ts deleted file mode 100644 index b9c5143ad..000000000 --- a/src/server/utils/settings-store/settings-store.ts +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright 2015-2016 Imply Data, Inc. - * Copyright 2017-2019 Allegro.pl - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { AppSettings } from "../../../common/models/app-settings/app-settings"; -import { Nullary } from "../../../common/utils/functional/functional"; - -type SettingsPromise = Nullary>; - -export class SettingsStore { - static create(appSettings: AppSettings): SettingsStore { - return new SettingsStore(() => Promise.resolve(appSettings)); - } - - constructor(public readSettings: SettingsPromise) { - } -} diff --git a/src/server/views.ts b/src/server/views.ts index dc8d24c38..0ca85fd42 100644 --- a/src/server/views.ts +++ b/src/server/views.ts @@ -15,13 +15,13 @@ * limitations under the License. */ -import { AppSettings } from "../common/models/app-settings/app-settings"; +import { SerializedAppSettings } from "../common/models/app-settings/app-settings"; import { Timekeeper } from "../common/models/timekeeper/timekeeper"; export interface ViewOptions { version: string; title: string; - appSettings?: AppSettings; + appSettings?: SerializedAppSettings; timekeeper?: Timekeeper; } From 24a8032be91367b58b15e13991395bde0b5850db Mon Sep 17 00:00:00 2001 From: adrianmroz <78143552+adrianmroz-allegro@users.noreply.github.com> Date: Fri, 30 Apr 2021 09:50:04 +0200 Subject: [PATCH 015/264] Use d3-dsv package for parsing tsv/csv files. (#741) * Use d3-dsv package for parsing tsv/csv files. We can pass autoType function which converts values from tsv/csv file to javascript types. * Add Unemployment dataset and few e2e smoke tests --- assets/data/unemployment-2016-02-18.csv | 1709 +++++++++++++++++ config-examples.yaml | 33 + cypress/integration/csv-data-source.spec.js | 71 + cypress/integration/home-page.spec.js | 5 +- package-lock.json | 61 +- package.json | 2 + src/server/utils/file-manager/file-manager.ts | 2 +- src/{common => server}/utils/parser/parser.ts | 6 +- 8 files changed, 1883 insertions(+), 6 deletions(-) create mode 100644 assets/data/unemployment-2016-02-18.csv create mode 100644 cypress/integration/csv-data-source.spec.js rename src/{common => server}/utils/parser/parser.ts (93%) diff --git a/assets/data/unemployment-2016-02-18.csv b/assets/data/unemployment-2016-02-18.csv new file mode 100644 index 000000000..fbade49ba --- /dev/null +++ b/assets/data/unemployment-2016-02-18.csv @@ -0,0 +1,1709 @@ +date,count,industry +2000-01-01T08:00:00.000Z,430,Government +2000-02-01T08:00:00.000Z,409,Government +2000-03-01T08:00:00.000Z,311,Government +2000-04-01T08:00:00.000Z,269,Government +2000-05-01T07:00:00.000Z,370,Government +2000-06-01T07:00:00.000Z,603,Government +2000-07-01T07:00:00.000Z,545,Government +2000-08-01T07:00:00.000Z,583,Government +2000-09-01T07:00:00.000Z,408,Government +2000-10-01T07:00:00.000Z,391,Government +2000-11-01T08:00:00.000Z,384,Government +2000-12-01T08:00:00.000Z,365,Government +2001-01-01T08:00:00.000Z,463,Government +2001-02-01T08:00:00.000Z,298,Government +2001-03-01T08:00:00.000Z,355,Government +2001-04-01T08:00:00.000Z,369,Government +2001-05-01T07:00:00.000Z,361,Government +2001-06-01T07:00:00.000Z,525,Government +2001-07-01T07:00:00.000Z,548,Government +2001-08-01T07:00:00.000Z,540,Government +2001-09-01T07:00:00.000Z,438,Government +2001-10-01T07:00:00.000Z,429,Government +2001-11-01T08:00:00.000Z,420,Government +2001-12-01T08:00:00.000Z,419,Government +2002-01-01T08:00:00.000Z,486,Government +2002-02-01T08:00:00.000Z,508,Government +2002-03-01T08:00:00.000Z,477,Government +2002-04-01T08:00:00.000Z,447,Government +2002-05-01T07:00:00.000Z,484,Government +2002-06-01T07:00:00.000Z,561,Government +2002-07-01T07:00:00.000Z,645,Government +2002-08-01T07:00:00.000Z,596,Government +2002-09-01T07:00:00.000Z,530,Government +2002-10-01T07:00:00.000Z,499,Government +2002-11-01T08:00:00.000Z,468,Government +2002-12-01T08:00:00.000Z,446,Government +2003-01-01T08:00:00.000Z,571,Government +2003-02-01T08:00:00.000Z,483,Government +2003-03-01T08:00:00.000Z,526,Government +2003-04-01T08:00:00.000Z,440,Government +2003-05-01T07:00:00.000Z,478,Government +2003-06-01T07:00:00.000Z,704,Government +2003-07-01T07:00:00.000Z,749,Government +2003-08-01T07:00:00.000Z,745,Government +2003-09-01T07:00:00.000Z,556,Government +2003-10-01T07:00:00.000Z,500,Government +2003-11-01T08:00:00.000Z,542,Government +2003-12-01T08:00:00.000Z,516,Government +2004-01-01T08:00:00.000Z,511,Government +2004-02-01T08:00:00.000Z,490,Government +2004-03-01T08:00:00.000Z,530,Government +2004-04-01T08:00:00.000Z,433,Government +2004-05-01T07:00:00.000Z,468,Government +2004-06-01T07:00:00.000Z,580,Government +2004-07-01T07:00:00.000Z,741,Government +2004-08-01T07:00:00.000Z,676,Government +2004-09-01T07:00:00.000Z,568,Government +2004-10-01T07:00:00.000Z,561,Government +2004-11-01T08:00:00.000Z,514,Government +2004-12-01T08:00:00.000Z,499,Government +2005-01-01T08:00:00.000Z,555,Government +2005-02-01T08:00:00.000Z,472,Government +2005-03-01T08:00:00.000Z,468,Government +2005-04-01T08:00:00.000Z,478,Government +2005-05-01T07:00:00.000Z,453,Government +2005-06-01T07:00:00.000Z,681,Government +2005-07-01T07:00:00.000Z,683,Government +2005-08-01T07:00:00.000Z,664,Government +2005-09-01T07:00:00.000Z,568,Government +2005-10-01T07:00:00.000Z,502,Government +2005-11-01T08:00:00.000Z,494,Government +2005-12-01T08:00:00.000Z,393,Government +2006-01-01T08:00:00.000Z,457,Government +2006-02-01T08:00:00.000Z,472,Government +2006-03-01T08:00:00.000Z,461,Government +2006-04-01T08:00:00.000Z,414,Government +2006-05-01T07:00:00.000Z,429,Government +2006-06-01T07:00:00.000Z,578,Government +2006-07-01T07:00:00.000Z,659,Government +2006-08-01T07:00:00.000Z,595,Government +2006-09-01T07:00:00.000Z,396,Government +2006-10-01T07:00:00.000Z,424,Government +2006-11-01T08:00:00.000Z,400,Government +2006-12-01T08:00:00.000Z,395,Government +2007-01-01T08:00:00.000Z,476,Government +2007-02-01T08:00:00.000Z,405,Government +2007-03-01T08:00:00.000Z,419,Government +2007-04-01T07:00:00.000Z,408,Government +2007-05-01T07:00:00.000Z,428,Government +2007-06-01T07:00:00.000Z,572,Government +2007-07-01T07:00:00.000Z,704,Government +2007-08-01T07:00:00.000Z,695,Government +2007-09-01T07:00:00.000Z,525,Government +2007-10-01T07:00:00.000Z,492,Government +2007-11-01T07:00:00.000Z,482,Government +2007-12-01T08:00:00.000Z,451,Government +2008-01-01T08:00:00.000Z,471,Government +2008-02-01T08:00:00.000Z,372,Government +2008-03-01T08:00:00.000Z,425,Government +2008-04-01T07:00:00.000Z,373,Government +2008-05-01T07:00:00.000Z,461,Government +2008-06-01T07:00:00.000Z,654,Government +2008-07-01T07:00:00.000Z,770,Government +2008-08-01T07:00:00.000Z,721,Government +2008-09-01T07:00:00.000Z,573,Government +2008-10-01T07:00:00.000Z,552,Government +2008-11-01T07:00:00.000Z,527,Government +2008-12-01T08:00:00.000Z,511,Government +2009-01-01T08:00:00.000Z,652,Government +2009-02-01T08:00:00.000Z,563,Government +2009-03-01T08:00:00.000Z,598,Government +2009-04-01T07:00:00.000Z,575,Government +2009-05-01T07:00:00.000Z,702,Government +2009-06-01T07:00:00.000Z,991,Government +2009-07-01T07:00:00.000Z,1129,Government +2009-08-01T07:00:00.000Z,1118,Government +2009-09-01T07:00:00.000Z,928,Government +2009-10-01T07:00:00.000Z,785,Government +2009-11-01T07:00:00.000Z,748,Government +2009-12-01T08:00:00.000Z,797,Government +2010-01-01T08:00:00.000Z,948,Government +2010-02-01T08:00:00.000Z,880,Government +2000-01-01T08:00:00.000Z,19,Mining and Extraction +2000-02-01T08:00:00.000Z,25,Mining and Extraction +2000-03-01T08:00:00.000Z,17,Mining and Extraction +2000-04-01T08:00:00.000Z,20,Mining and Extraction +2000-05-01T07:00:00.000Z,27,Mining and Extraction +2000-06-01T07:00:00.000Z,13,Mining and Extraction +2000-07-01T07:00:00.000Z,16,Mining and Extraction +2000-08-01T07:00:00.000Z,23,Mining and Extraction +2000-09-01T07:00:00.000Z,25,Mining and Extraction +2000-10-01T07:00:00.000Z,39,Mining and Extraction +2000-11-01T08:00:00.000Z,11,Mining and Extraction +2000-12-01T08:00:00.000Z,20,Mining and Extraction +2001-01-01T08:00:00.000Z,11,Mining and Extraction +2001-02-01T08:00:00.000Z,27,Mining and Extraction +2001-03-01T08:00:00.000Z,14,Mining and Extraction +2001-04-01T08:00:00.000Z,24,Mining and Extraction +2001-05-01T07:00:00.000Z,34,Mining and Extraction +2001-06-01T07:00:00.000Z,26,Mining and Extraction +2001-07-01T07:00:00.000Z,17,Mining and Extraction +2001-08-01T07:00:00.000Z,18,Mining and Extraction +2001-09-01T07:00:00.000Z,23,Mining and Extraction +2001-10-01T07:00:00.000Z,32,Mining and Extraction +2001-11-01T08:00:00.000Z,20,Mining and Extraction +2001-12-01T08:00:00.000Z,27,Mining and Extraction +2002-01-01T08:00:00.000Z,33,Mining and Extraction +2002-02-01T08:00:00.000Z,35,Mining and Extraction +2002-03-01T08:00:00.000Z,28,Mining and Extraction +2002-04-01T08:00:00.000Z,33,Mining and Extraction +2002-05-01T07:00:00.000Z,25,Mining and Extraction +2002-06-01T07:00:00.000Z,35,Mining and Extraction +2002-07-01T07:00:00.000Z,19,Mining and Extraction +2002-08-01T07:00:00.000Z,32,Mining and Extraction +2002-09-01T07:00:00.000Z,42,Mining and Extraction +2002-10-01T07:00:00.000Z,36,Mining and Extraction +2002-11-01T08:00:00.000Z,32,Mining and Extraction +2002-12-01T08:00:00.000Z,45,Mining and Extraction +2003-01-01T08:00:00.000Z,54,Mining and Extraction +2003-02-01T08:00:00.000Z,41,Mining and Extraction +2003-03-01T08:00:00.000Z,46,Mining and Extraction +2003-04-01T08:00:00.000Z,41,Mining and Extraction +2003-05-01T07:00:00.000Z,40,Mining and Extraction +2003-06-01T07:00:00.000Z,36,Mining and Extraction +2003-07-01T07:00:00.000Z,43,Mining and Extraction +2003-08-01T07:00:00.000Z,20,Mining and Extraction +2003-09-01T07:00:00.000Z,25,Mining and Extraction +2003-10-01T07:00:00.000Z,31,Mining and Extraction +2003-11-01T08:00:00.000Z,34,Mining and Extraction +2003-12-01T08:00:00.000Z,32,Mining and Extraction +2004-01-01T08:00:00.000Z,31,Mining and Extraction +2004-02-01T08:00:00.000Z,24,Mining and Extraction +2004-03-01T08:00:00.000Z,22,Mining and Extraction +2004-04-01T08:00:00.000Z,34,Mining and Extraction +2004-05-01T07:00:00.000Z,22,Mining and Extraction +2004-06-01T07:00:00.000Z,27,Mining and Extraction +2004-07-01T07:00:00.000Z,28,Mining and Extraction +2004-08-01T07:00:00.000Z,10,Mining and Extraction +2004-09-01T07:00:00.000Z,8,Mining and Extraction +2004-10-01T07:00:00.000Z,15,Mining and Extraction +2004-11-01T08:00:00.000Z,20,Mining and Extraction +2004-12-01T08:00:00.000Z,16,Mining and Extraction +2005-01-01T08:00:00.000Z,29,Mining and Extraction +2005-02-01T08:00:00.000Z,25,Mining and Extraction +2005-03-01T08:00:00.000Z,32,Mining and Extraction +2005-04-01T08:00:00.000Z,19,Mining and Extraction +2005-05-01T07:00:00.000Z,16,Mining and Extraction +2005-06-01T07:00:00.000Z,25,Mining and Extraction +2005-07-01T07:00:00.000Z,22,Mining and Extraction +2005-08-01T07:00:00.000Z,12,Mining and Extraction +2005-09-01T07:00:00.000Z,12,Mining and Extraction +2005-10-01T07:00:00.000Z,2,Mining and Extraction +2005-11-01T08:00:00.000Z,18,Mining and Extraction +2005-12-01T08:00:00.000Z,23,Mining and Extraction +2006-01-01T08:00:00.000Z,26,Mining and Extraction +2006-02-01T08:00:00.000Z,25,Mining and Extraction +2006-03-01T08:00:00.000Z,14,Mining and Extraction +2006-04-01T08:00:00.000Z,17,Mining and Extraction +2006-05-01T07:00:00.000Z,20,Mining and Extraction +2006-06-01T07:00:00.000Z,31,Mining and Extraction +2006-07-01T07:00:00.000Z,25,Mining and Extraction +2006-08-01T07:00:00.000Z,32,Mining and Extraction +2006-09-01T07:00:00.000Z,14,Mining and Extraction +2006-10-01T07:00:00.000Z,15,Mining and Extraction +2006-11-01T08:00:00.000Z,22,Mining and Extraction +2006-12-01T08:00:00.000Z,25,Mining and Extraction +2007-01-01T08:00:00.000Z,35,Mining and Extraction +2007-02-01T08:00:00.000Z,33,Mining and Extraction +2007-03-01T08:00:00.000Z,24,Mining and Extraction +2007-04-01T07:00:00.000Z,17,Mining and Extraction +2007-05-01T07:00:00.000Z,22,Mining and Extraction +2007-06-01T07:00:00.000Z,33,Mining and Extraction +2007-07-01T07:00:00.000Z,33,Mining and Extraction +2007-08-01T07:00:00.000Z,33,Mining and Extraction +2007-09-01T07:00:00.000Z,25,Mining and Extraction +2007-10-01T07:00:00.000Z,9,Mining and Extraction +2007-11-01T07:00:00.000Z,16,Mining and Extraction +2007-12-01T08:00:00.000Z,24,Mining and Extraction +2008-01-01T08:00:00.000Z,28,Mining and Extraction +2008-02-01T08:00:00.000Z,16,Mining and Extraction +2008-03-01T08:00:00.000Z,28,Mining and Extraction +2008-04-01T07:00:00.000Z,28,Mining and Extraction +2008-05-01T07:00:00.000Z,28,Mining and Extraction +2008-06-01T07:00:00.000Z,28,Mining and Extraction +2008-07-01T07:00:00.000Z,13,Mining and Extraction +2008-08-01T07:00:00.000Z,17,Mining and Extraction +2008-09-01T07:00:00.000Z,25,Mining and Extraction +2008-10-01T07:00:00.000Z,15,Mining and Extraction +2008-11-01T07:00:00.000Z,32,Mining and Extraction +2008-12-01T08:00:00.000Z,46,Mining and Extraction +2009-01-01T08:00:00.000Z,59,Mining and Extraction +2009-02-01T08:00:00.000Z,63,Mining and Extraction +2009-03-01T08:00:00.000Z,105,Mining and Extraction +2009-04-01T07:00:00.000Z,125,Mining and Extraction +2009-05-01T07:00:00.000Z,98,Mining and Extraction +2009-06-01T07:00:00.000Z,100,Mining and Extraction +2009-07-01T07:00:00.000Z,95,Mining and Extraction +2009-08-01T07:00:00.000Z,93,Mining and Extraction +2009-09-01T07:00:00.000Z,76,Mining and Extraction +2009-10-01T07:00:00.000Z,84,Mining and Extraction +2009-11-01T07:00:00.000Z,96,Mining and Extraction +2009-12-01T08:00:00.000Z,89,Mining and Extraction +2010-01-01T08:00:00.000Z,68,Mining and Extraction +2010-02-01T08:00:00.000Z,79,Mining and Extraction +2000-01-01T08:00:00.000Z,745,Construction +2000-02-01T08:00:00.000Z,812,Construction +2000-03-01T08:00:00.000Z,669,Construction +2000-04-01T08:00:00.000Z,447,Construction +2000-05-01T07:00:00.000Z,397,Construction +2000-06-01T07:00:00.000Z,389,Construction +2000-07-01T07:00:00.000Z,384,Construction +2000-08-01T07:00:00.000Z,446,Construction +2000-09-01T07:00:00.000Z,386,Construction +2000-10-01T07:00:00.000Z,417,Construction +2000-11-01T08:00:00.000Z,482,Construction +2000-12-01T08:00:00.000Z,580,Construction +2001-01-01T08:00:00.000Z,836,Construction +2001-02-01T08:00:00.000Z,826,Construction +2001-03-01T08:00:00.000Z,683,Construction +2001-04-01T08:00:00.000Z,596,Construction +2001-05-01T07:00:00.000Z,478,Construction +2001-06-01T07:00:00.000Z,443,Construction +2001-07-01T07:00:00.000Z,447,Construction +2001-08-01T07:00:00.000Z,522,Construction +2001-09-01T07:00:00.000Z,489,Construction +2001-10-01T07:00:00.000Z,535,Construction +2001-11-01T08:00:00.000Z,670,Construction +2001-12-01T08:00:00.000Z,785,Construction +2002-01-01T08:00:00.000Z,1211,Construction +2002-02-01T08:00:00.000Z,1060,Construction +2002-03-01T08:00:00.000Z,1009,Construction +2002-04-01T08:00:00.000Z,855,Construction +2002-05-01T07:00:00.000Z,626,Construction +2002-06-01T07:00:00.000Z,593,Construction +2002-07-01T07:00:00.000Z,594,Construction +2002-08-01T07:00:00.000Z,654,Construction +2002-09-01T07:00:00.000Z,615,Construction +2002-10-01T07:00:00.000Z,680,Construction +2002-11-01T08:00:00.000Z,758,Construction +2002-12-01T08:00:00.000Z,941,Construction +2003-01-01T08:00:00.000Z,1196,Construction +2003-02-01T08:00:00.000Z,1173,Construction +2003-03-01T08:00:00.000Z,987,Construction +2003-04-01T08:00:00.000Z,772,Construction +2003-05-01T07:00:00.000Z,715,Construction +2003-06-01T07:00:00.000Z,710,Construction +2003-07-01T07:00:00.000Z,677,Construction +2003-08-01T07:00:00.000Z,650,Construction +2003-09-01T07:00:00.000Z,681,Construction +2003-10-01T07:00:00.000Z,651,Construction +2003-11-01T08:00:00.000Z,690,Construction +2003-12-01T08:00:00.000Z,813,Construction +2004-01-01T08:00:00.000Z,994,Construction +2004-02-01T08:00:00.000Z,1039,Construction +2004-03-01T08:00:00.000Z,1011,Construction +2004-04-01T08:00:00.000Z,849,Construction +2004-05-01T07:00:00.000Z,665,Construction +2004-06-01T07:00:00.000Z,668,Construction +2004-07-01T07:00:00.000Z,610,Construction +2004-08-01T07:00:00.000Z,563,Construction +2004-09-01T07:00:00.000Z,629,Construction +2004-10-01T07:00:00.000Z,635,Construction +2004-11-01T08:00:00.000Z,695,Construction +2004-12-01T08:00:00.000Z,870,Construction +2005-01-01T08:00:00.000Z,1079,Construction +2005-02-01T08:00:00.000Z,1150,Construction +2005-03-01T08:00:00.000Z,961,Construction +2005-04-01T08:00:00.000Z,693,Construction +2005-05-01T07:00:00.000Z,567,Construction +2005-06-01T07:00:00.000Z,559,Construction +2005-07-01T07:00:00.000Z,509,Construction +2005-08-01T07:00:00.000Z,561,Construction +2005-09-01T07:00:00.000Z,572,Construction +2005-10-01T07:00:00.000Z,519,Construction +2005-11-01T08:00:00.000Z,564,Construction +2005-12-01T08:00:00.000Z,813,Construction +2006-01-01T08:00:00.000Z,868,Construction +2006-02-01T08:00:00.000Z,836,Construction +2006-03-01T08:00:00.000Z,820,Construction +2006-04-01T08:00:00.000Z,674,Construction +2006-05-01T07:00:00.000Z,647,Construction +2006-06-01T07:00:00.000Z,569,Construction +2006-07-01T07:00:00.000Z,633,Construction +2006-08-01T07:00:00.000Z,618,Construction +2006-09-01T07:00:00.000Z,586,Construction +2006-10-01T07:00:00.000Z,456,Construction +2006-11-01T08:00:00.000Z,618,Construction +2006-12-01T08:00:00.000Z,725,Construction +2007-01-01T08:00:00.000Z,922,Construction +2007-02-01T08:00:00.000Z,1086,Construction +2007-03-01T08:00:00.000Z,924,Construction +2007-04-01T07:00:00.000Z,853,Construction +2007-05-01T07:00:00.000Z,676,Construction +2007-06-01T07:00:00.000Z,600,Construction +2007-07-01T07:00:00.000Z,617,Construction +2007-08-01T07:00:00.000Z,558,Construction +2007-09-01T07:00:00.000Z,596,Construction +2007-10-01T07:00:00.000Z,641,Construction +2007-11-01T07:00:00.000Z,645,Construction +2007-12-01T08:00:00.000Z,968,Construction +2008-01-01T08:00:00.000Z,1099,Construction +2008-02-01T08:00:00.000Z,1118,Construction +2008-03-01T08:00:00.000Z,1170,Construction +2008-04-01T07:00:00.000Z,1057,Construction +2008-05-01T07:00:00.000Z,809,Construction +2008-06-01T07:00:00.000Z,785,Construction +2008-07-01T07:00:00.000Z,783,Construction +2008-08-01T07:00:00.000Z,814,Construction +2008-09-01T07:00:00.000Z,970,Construction +2008-10-01T07:00:00.000Z,1078,Construction +2008-11-01T07:00:00.000Z,1237,Construction +2008-12-01T08:00:00.000Z,1438,Construction +2009-01-01T08:00:00.000Z,1744,Construction +2009-02-01T08:00:00.000Z,2025,Construction +2009-03-01T08:00:00.000Z,1979,Construction +2009-04-01T07:00:00.000Z,1737,Construction +2009-05-01T07:00:00.000Z,1768,Construction +2009-06-01T07:00:00.000Z,1601,Construction +2009-07-01T07:00:00.000Z,1687,Construction +2009-08-01T07:00:00.000Z,1542,Construction +2009-09-01T07:00:00.000Z,1594,Construction +2009-10-01T07:00:00.000Z,1744,Construction +2009-11-01T07:00:00.000Z,1780,Construction +2009-12-01T08:00:00.000Z,2044,Construction +2010-01-01T08:00:00.000Z,2194,Construction +2010-02-01T08:00:00.000Z,2440,Construction +2000-01-01T08:00:00.000Z,734,Manufacturing +2000-02-01T08:00:00.000Z,694,Manufacturing +2000-03-01T08:00:00.000Z,739,Manufacturing +2000-04-01T08:00:00.000Z,736,Manufacturing +2000-05-01T07:00:00.000Z,685,Manufacturing +2000-06-01T07:00:00.000Z,621,Manufacturing +2000-07-01T07:00:00.000Z,708,Manufacturing +2000-08-01T07:00:00.000Z,685,Manufacturing +2000-09-01T07:00:00.000Z,667,Manufacturing +2000-10-01T07:00:00.000Z,693,Manufacturing +2000-11-01T08:00:00.000Z,672,Manufacturing +2000-12-01T08:00:00.000Z,653,Manufacturing +2001-01-01T08:00:00.000Z,911,Manufacturing +2001-02-01T08:00:00.000Z,902,Manufacturing +2001-03-01T08:00:00.000Z,954,Manufacturing +2001-04-01T08:00:00.000Z,855,Manufacturing +2001-05-01T07:00:00.000Z,903,Manufacturing +2001-06-01T07:00:00.000Z,956,Manufacturing +2001-07-01T07:00:00.000Z,1054,Manufacturing +2001-08-01T07:00:00.000Z,1023,Manufacturing +2001-09-01T07:00:00.000Z,996,Manufacturing +2001-10-01T07:00:00.000Z,1065,Manufacturing +2001-11-01T08:00:00.000Z,1108,Manufacturing +2001-12-01T08:00:00.000Z,1172,Manufacturing +2002-01-01T08:00:00.000Z,1377,Manufacturing +2002-02-01T08:00:00.000Z,1296,Manufacturing +2002-03-01T08:00:00.000Z,1367,Manufacturing +2002-04-01T08:00:00.000Z,1322,Manufacturing +2002-05-01T07:00:00.000Z,1194,Manufacturing +2002-06-01T07:00:00.000Z,1187,Manufacturing +2002-07-01T07:00:00.000Z,1185,Manufacturing +2002-08-01T07:00:00.000Z,1108,Manufacturing +2002-09-01T07:00:00.000Z,1076,Manufacturing +2002-10-01T07:00:00.000Z,1046,Manufacturing +2002-11-01T08:00:00.000Z,1115,Manufacturing +2002-12-01T08:00:00.000Z,1188,Manufacturing +2003-01-01T08:00:00.000Z,1302,Manufacturing +2003-02-01T08:00:00.000Z,1229,Manufacturing +2003-03-01T08:00:00.000Z,1222,Manufacturing +2003-04-01T08:00:00.000Z,1199,Manufacturing +2003-05-01T07:00:00.000Z,1150,Manufacturing +2003-06-01T07:00:00.000Z,1232,Manufacturing +2003-07-01T07:00:00.000Z,1193,Manufacturing +2003-08-01T07:00:00.000Z,1186,Manufacturing +2003-09-01T07:00:00.000Z,1175,Manufacturing +2003-10-01T07:00:00.000Z,1041,Manufacturing +2003-11-01T08:00:00.000Z,1034,Manufacturing +2003-12-01T08:00:00.000Z,1025,Manufacturing +2004-01-01T08:00:00.000Z,1110,Manufacturing +2004-02-01T08:00:00.000Z,1094,Manufacturing +2004-03-01T08:00:00.000Z,1083,Manufacturing +2004-04-01T08:00:00.000Z,1004,Manufacturing +2004-05-01T07:00:00.000Z,966,Manufacturing +2004-06-01T07:00:00.000Z,957,Manufacturing +2004-07-01T07:00:00.000Z,1019,Manufacturing +2004-08-01T07:00:00.000Z,840,Manufacturing +2004-09-01T07:00:00.000Z,852,Manufacturing +2004-10-01T07:00:00.000Z,884,Manufacturing +2004-11-01T08:00:00.000Z,905,Manufacturing +2004-12-01T08:00:00.000Z,872,Manufacturing +2005-01-01T08:00:00.000Z,889,Manufacturing +2005-02-01T08:00:00.000Z,889,Manufacturing +2005-03-01T08:00:00.000Z,879,Manufacturing +2005-04-01T08:00:00.000Z,793,Manufacturing +2005-05-01T07:00:00.000Z,743,Manufacturing +2005-06-01T07:00:00.000Z,743,Manufacturing +2005-07-01T07:00:00.000Z,883,Manufacturing +2005-08-01T07:00:00.000Z,767,Manufacturing +2005-09-01T07:00:00.000Z,775,Manufacturing +2005-10-01T07:00:00.000Z,800,Manufacturing +2005-11-01T08:00:00.000Z,823,Manufacturing +2005-12-01T08:00:00.000Z,757,Manufacturing +2006-01-01T08:00:00.000Z,778,Manufacturing +2006-02-01T08:00:00.000Z,821,Manufacturing +2006-03-01T08:00:00.000Z,701,Manufacturing +2006-04-01T08:00:00.000Z,745,Manufacturing +2006-05-01T07:00:00.000Z,680,Manufacturing +2006-06-01T07:00:00.000Z,635,Manufacturing +2006-07-01T07:00:00.000Z,736,Manufacturing +2006-08-01T07:00:00.000Z,680,Manufacturing +2006-09-01T07:00:00.000Z,632,Manufacturing +2006-10-01T07:00:00.000Z,618,Manufacturing +2006-11-01T08:00:00.000Z,702,Manufacturing +2006-12-01T08:00:00.000Z,660,Manufacturing +2007-01-01T08:00:00.000Z,752,Manufacturing +2007-02-01T08:00:00.000Z,774,Manufacturing +2007-03-01T08:00:00.000Z,742,Manufacturing +2007-04-01T07:00:00.000Z,749,Manufacturing +2007-05-01T07:00:00.000Z,651,Manufacturing +2007-06-01T07:00:00.000Z,653,Manufacturing +2007-07-01T07:00:00.000Z,621,Manufacturing +2007-08-01T07:00:00.000Z,596,Manufacturing +2007-09-01T07:00:00.000Z,673,Manufacturing +2007-10-01T07:00:00.000Z,729,Manufacturing +2007-11-01T07:00:00.000Z,762,Manufacturing +2007-12-01T08:00:00.000Z,772,Manufacturing +2008-01-01T08:00:00.000Z,837,Manufacturing +2008-02-01T08:00:00.000Z,820,Manufacturing +2008-03-01T08:00:00.000Z,831,Manufacturing +2008-04-01T07:00:00.000Z,796,Manufacturing +2008-05-01T07:00:00.000Z,879,Manufacturing +2008-06-01T07:00:00.000Z,862,Manufacturing +2008-07-01T07:00:00.000Z,908,Manufacturing +2008-08-01T07:00:00.000Z,960,Manufacturing +2008-09-01T07:00:00.000Z,984,Manufacturing +2008-10-01T07:00:00.000Z,1007,Manufacturing +2008-11-01T07:00:00.000Z,1144,Manufacturing +2008-12-01T08:00:00.000Z,1315,Manufacturing +2009-01-01T08:00:00.000Z,1711,Manufacturing +2009-02-01T08:00:00.000Z,1822,Manufacturing +2009-03-01T08:00:00.000Z,1912,Manufacturing +2009-04-01T07:00:00.000Z,1968,Manufacturing +2009-05-01T07:00:00.000Z,2010,Manufacturing +2009-06-01T07:00:00.000Z,2010,Manufacturing +2009-07-01T07:00:00.000Z,1988,Manufacturing +2009-08-01T07:00:00.000Z,1866,Manufacturing +2009-09-01T07:00:00.000Z,1876,Manufacturing +2009-10-01T07:00:00.000Z,1884,Manufacturing +2009-11-01T07:00:00.000Z,1882,Manufacturing +2009-12-01T08:00:00.000Z,1747,Manufacturing +2010-01-01T08:00:00.000Z,1918,Manufacturing +2010-02-01T08:00:00.000Z,1814,Manufacturing +2000-01-01T08:00:00.000Z,1000,Wholesale and Retail Trade +2000-02-01T08:00:00.000Z,1023,Wholesale and Retail Trade +2000-03-01T08:00:00.000Z,983,Wholesale and Retail Trade +2000-04-01T08:00:00.000Z,793,Wholesale and Retail Trade +2000-05-01T07:00:00.000Z,821,Wholesale and Retail Trade +2000-06-01T07:00:00.000Z,837,Wholesale and Retail Trade +2000-07-01T07:00:00.000Z,792,Wholesale and Retail Trade +2000-08-01T07:00:00.000Z,853,Wholesale and Retail Trade +2000-09-01T07:00:00.000Z,791,Wholesale and Retail Trade +2000-10-01T07:00:00.000Z,739,Wholesale and Retail Trade +2000-11-01T08:00:00.000Z,701,Wholesale and Retail Trade +2000-12-01T08:00:00.000Z,715,Wholesale and Retail Trade +2001-01-01T08:00:00.000Z,908,Wholesale and Retail Trade +2001-02-01T08:00:00.000Z,990,Wholesale and Retail Trade +2001-03-01T08:00:00.000Z,1037,Wholesale and Retail Trade +2001-04-01T08:00:00.000Z,820,Wholesale and Retail Trade +2001-05-01T07:00:00.000Z,875,Wholesale and Retail Trade +2001-06-01T07:00:00.000Z,955,Wholesale and Retail Trade +2001-07-01T07:00:00.000Z,833,Wholesale and Retail Trade +2001-08-01T07:00:00.000Z,928,Wholesale and Retail Trade +2001-09-01T07:00:00.000Z,936,Wholesale and Retail Trade +2001-10-01T07:00:00.000Z,941,Wholesale and Retail Trade +2001-11-01T08:00:00.000Z,1046,Wholesale and Retail Trade +2001-12-01T08:00:00.000Z,1074,Wholesale and Retail Trade +2002-01-01T08:00:00.000Z,1212,Wholesale and Retail Trade +2002-02-01T08:00:00.000Z,1264,Wholesale and Retail Trade +2002-03-01T08:00:00.000Z,1269,Wholesale and Retail Trade +2002-04-01T08:00:00.000Z,1222,Wholesale and Retail Trade +2002-05-01T07:00:00.000Z,1138,Wholesale and Retail Trade +2002-06-01T07:00:00.000Z,1240,Wholesale and Retail Trade +2002-07-01T07:00:00.000Z,1132,Wholesale and Retail Trade +2002-08-01T07:00:00.000Z,1170,Wholesale and Retail Trade +2002-09-01T07:00:00.000Z,1171,Wholesale and Retail Trade +2002-10-01T07:00:00.000Z,1212,Wholesale and Retail Trade +2002-11-01T08:00:00.000Z,1242,Wholesale and Retail Trade +2002-12-01T08:00:00.000Z,1150,Wholesale and Retail Trade +2003-01-01T08:00:00.000Z,1342,Wholesale and Retail Trade +2003-02-01T08:00:00.000Z,1238,Wholesale and Retail Trade +2003-03-01T08:00:00.000Z,1179,Wholesale and Retail Trade +2003-04-01T08:00:00.000Z,1201,Wholesale and Retail Trade +2003-05-01T07:00:00.000Z,1247,Wholesale and Retail Trade +2003-06-01T07:00:00.000Z,1434,Wholesale and Retail Trade +2003-07-01T07:00:00.000Z,1387,Wholesale and Retail Trade +2003-08-01T07:00:00.000Z,1161,Wholesale and Retail Trade +2003-09-01T07:00:00.000Z,1229,Wholesale and Retail Trade +2003-10-01T07:00:00.000Z,1189,Wholesale and Retail Trade +2003-11-01T08:00:00.000Z,1156,Wholesale and Retail Trade +2003-12-01T08:00:00.000Z,1081,Wholesale and Retail Trade +2004-01-01T08:00:00.000Z,1389,Wholesale and Retail Trade +2004-02-01T08:00:00.000Z,1369,Wholesale and Retail Trade +2004-03-01T08:00:00.000Z,1386,Wholesale and Retail Trade +2004-04-01T08:00:00.000Z,1248,Wholesale and Retail Trade +2004-05-01T07:00:00.000Z,1183,Wholesale and Retail Trade +2004-06-01T07:00:00.000Z,1182,Wholesale and Retail Trade +2004-07-01T07:00:00.000Z,1163,Wholesale and Retail Trade +2004-08-01T07:00:00.000Z,1079,Wholesale and Retail Trade +2004-09-01T07:00:00.000Z,1127,Wholesale and Retail Trade +2004-10-01T07:00:00.000Z,1138,Wholesale and Retail Trade +2004-11-01T08:00:00.000Z,1045,Wholesale and Retail Trade +2004-12-01T08:00:00.000Z,1058,Wholesale and Retail Trade +2005-01-01T08:00:00.000Z,1302,Wholesale and Retail Trade +2005-02-01T08:00:00.000Z,1301,Wholesale and Retail Trade +2005-03-01T08:00:00.000Z,1173,Wholesale and Retail Trade +2005-04-01T08:00:00.000Z,1131,Wholesale and Retail Trade +2005-05-01T07:00:00.000Z,1145,Wholesale and Retail Trade +2005-06-01T07:00:00.000Z,1197,Wholesale and Retail Trade +2005-07-01T07:00:00.000Z,1194,Wholesale and Retail Trade +2005-08-01T07:00:00.000Z,1130,Wholesale and Retail Trade +2005-09-01T07:00:00.000Z,1038,Wholesale and Retail Trade +2005-10-01T07:00:00.000Z,1050,Wholesale and Retail Trade +2005-11-01T08:00:00.000Z,1013,Wholesale and Retail Trade +2005-12-01T08:00:00.000Z,968,Wholesale and Retail Trade +2006-01-01T08:00:00.000Z,1203,Wholesale and Retail Trade +2006-02-01T08:00:00.000Z,1141,Wholesale and Retail Trade +2006-03-01T08:00:00.000Z,1022,Wholesale and Retail Trade +2006-04-01T08:00:00.000Z,972,Wholesale and Retail Trade +2006-05-01T07:00:00.000Z,1025,Wholesale and Retail Trade +2006-06-01T07:00:00.000Z,1085,Wholesale and Retail Trade +2006-07-01T07:00:00.000Z,1083,Wholesale and Retail Trade +2006-08-01T07:00:00.000Z,977,Wholesale and Retail Trade +2006-09-01T07:00:00.000Z,1008,Wholesale and Retail Trade +2006-10-01T07:00:00.000Z,972,Wholesale and Retail Trade +2006-11-01T08:00:00.000Z,1018,Wholesale and Retail Trade +2006-12-01T08:00:00.000Z,965,Wholesale and Retail Trade +2007-01-01T08:00:00.000Z,1166,Wholesale and Retail Trade +2007-02-01T08:00:00.000Z,1045,Wholesale and Retail Trade +2007-03-01T08:00:00.000Z,896,Wholesale and Retail Trade +2007-04-01T07:00:00.000Z,872,Wholesale and Retail Trade +2007-05-01T07:00:00.000Z,795,Wholesale and Retail Trade +2007-06-01T07:00:00.000Z,979,Wholesale and Retail Trade +2007-07-01T07:00:00.000Z,1089,Wholesale and Retail Trade +2007-08-01T07:00:00.000Z,1028,Wholesale and Retail Trade +2007-09-01T07:00:00.000Z,1027,Wholesale and Retail Trade +2007-10-01T07:00:00.000Z,907,Wholesale and Retail Trade +2007-11-01T07:00:00.000Z,893,Wholesale and Retail Trade +2007-12-01T08:00:00.000Z,1009,Wholesale and Retail Trade +2008-01-01T08:00:00.000Z,1120,Wholesale and Retail Trade +2008-02-01T08:00:00.000Z,1007,Wholesale and Retail Trade +2008-03-01T08:00:00.000Z,992,Wholesale and Retail Trade +2008-04-01T07:00:00.000Z,919,Wholesale and Retail Trade +2008-05-01T07:00:00.000Z,1049,Wholesale and Retail Trade +2008-06-01T07:00:00.000Z,1160,Wholesale and Retail Trade +2008-07-01T07:00:00.000Z,1329,Wholesale and Retail Trade +2008-08-01T07:00:00.000Z,1366,Wholesale and Retail Trade +2008-09-01T07:00:00.000Z,1277,Wholesale and Retail Trade +2008-10-01T07:00:00.000Z,1313,Wholesale and Retail Trade +2008-11-01T07:00:00.000Z,1397,Wholesale and Retail Trade +2008-12-01T08:00:00.000Z,1535,Wholesale and Retail Trade +2009-01-01T08:00:00.000Z,1794,Wholesale and Retail Trade +2009-02-01T08:00:00.000Z,1847,Wholesale and Retail Trade +2009-03-01T08:00:00.000Z,1852,Wholesale and Retail Trade +2009-04-01T07:00:00.000Z,1833,Wholesale and Retail Trade +2009-05-01T07:00:00.000Z,1835,Wholesale and Retail Trade +2009-06-01T07:00:00.000Z,1863,Wholesale and Retail Trade +2009-07-01T07:00:00.000Z,1854,Wholesale and Retail Trade +2009-08-01T07:00:00.000Z,1794,Wholesale and Retail Trade +2009-09-01T07:00:00.000Z,1809,Wholesale and Retail Trade +2009-10-01T07:00:00.000Z,1919,Wholesale and Retail Trade +2009-11-01T07:00:00.000Z,1879,Wholesale and Retail Trade +2009-12-01T08:00:00.000Z,1851,Wholesale and Retail Trade +2010-01-01T08:00:00.000Z,2154,Wholesale and Retail Trade +2010-02-01T08:00:00.000Z,2071,Wholesale and Retail Trade +2000-01-01T08:00:00.000Z,236,Transportation and Utilities +2000-02-01T08:00:00.000Z,223,Transportation and Utilities +2000-03-01T08:00:00.000Z,192,Transportation and Utilities +2000-04-01T08:00:00.000Z,191,Transportation and Utilities +2000-05-01T07:00:00.000Z,190,Transportation and Utilities +2000-06-01T07:00:00.000Z,183,Transportation and Utilities +2000-07-01T07:00:00.000Z,228,Transportation and Utilities +2000-08-01T07:00:00.000Z,198,Transportation and Utilities +2000-09-01T07:00:00.000Z,231,Transportation and Utilities +2000-10-01T07:00:00.000Z,153,Transportation and Utilities +2000-11-01T08:00:00.000Z,129,Transportation and Utilities +2000-12-01T08:00:00.000Z,168,Transportation and Utilities +2001-01-01T08:00:00.000Z,194,Transportation and Utilities +2001-02-01T08:00:00.000Z,189,Transportation and Utilities +2001-03-01T08:00:00.000Z,193,Transportation and Utilities +2001-04-01T08:00:00.000Z,232,Transportation and Utilities +2001-05-01T07:00:00.000Z,178,Transportation and Utilities +2001-06-01T07:00:00.000Z,242,Transportation and Utilities +2001-07-01T07:00:00.000Z,236,Transportation and Utilities +2001-08-01T07:00:00.000Z,226,Transportation and Utilities +2001-09-01T07:00:00.000Z,214,Transportation and Utilities +2001-10-01T07:00:00.000Z,321,Transportation and Utilities +2001-11-01T08:00:00.000Z,302,Transportation and Utilities +2001-12-01T08:00:00.000Z,310,Transportation and Utilities +2002-01-01T08:00:00.000Z,368,Transportation and Utilities +2002-02-01T08:00:00.000Z,331,Transportation and Utilities +2002-03-01T08:00:00.000Z,313,Transportation and Utilities +2002-04-01T08:00:00.000Z,280,Transportation and Utilities +2002-05-01T07:00:00.000Z,257,Transportation and Utilities +2002-06-01T07:00:00.000Z,274,Transportation and Utilities +2002-07-01T07:00:00.000Z,270,Transportation and Utilities +2002-08-01T07:00:00.000Z,221,Transportation and Utilities +2002-09-01T07:00:00.000Z,235,Transportation and Utilities +2002-10-01T07:00:00.000Z,262,Transportation and Utilities +2002-11-01T08:00:00.000Z,233,Transportation and Utilities +2002-12-01T08:00:00.000Z,243,Transportation and Utilities +2003-01-01T08:00:00.000Z,331,Transportation and Utilities +2003-02-01T08:00:00.000Z,316,Transportation and Utilities +2003-03-01T08:00:00.000Z,319,Transportation and Utilities +2003-04-01T08:00:00.000Z,274,Transportation and Utilities +2003-05-01T07:00:00.000Z,260,Transportation and Utilities +2003-06-01T07:00:00.000Z,300,Transportation and Utilities +2003-07-01T07:00:00.000Z,289,Transportation and Utilities +2003-08-01T07:00:00.000Z,255,Transportation and Utilities +2003-09-01T07:00:00.000Z,255,Transportation and Utilities +2003-10-01T07:00:00.000Z,260,Transportation and Utilities +2003-11-01T08:00:00.000Z,275,Transportation and Utilities +2003-12-01T08:00:00.000Z,267,Transportation and Utilities +2004-01-01T08:00:00.000Z,243,Transportation and Utilities +2004-02-01T08:00:00.000Z,291,Transportation and Utilities +2004-03-01T08:00:00.000Z,284,Transportation and Utilities +2004-04-01T08:00:00.000Z,239,Transportation and Utilities +2004-05-01T07:00:00.000Z,230,Transportation and Utilities +2004-06-01T07:00:00.000Z,227,Transportation and Utilities +2004-07-01T07:00:00.000Z,231,Transportation and Utilities +2004-08-01T07:00:00.000Z,236,Transportation and Utilities +2004-09-01T07:00:00.000Z,208,Transportation and Utilities +2004-10-01T07:00:00.000Z,219,Transportation and Utilities +2004-11-01T08:00:00.000Z,217,Transportation and Utilities +2004-12-01T08:00:00.000Z,204,Transportation and Utilities +2005-01-01T08:00:00.000Z,276,Transportation and Utilities +2005-02-01T08:00:00.000Z,245,Transportation and Utilities +2005-03-01T08:00:00.000Z,267,Transportation and Utilities +2005-04-01T08:00:00.000Z,257,Transportation and Utilities +2005-05-01T07:00:00.000Z,223,Transportation and Utilities +2005-06-01T07:00:00.000Z,247,Transportation and Utilities +2005-07-01T07:00:00.000Z,222,Transportation and Utilities +2005-08-01T07:00:00.000Z,187,Transportation and Utilities +2005-09-01T07:00:00.000Z,211,Transportation and Utilities +2005-10-01T07:00:00.000Z,251,Transportation and Utilities +2005-11-01T08:00:00.000Z,199,Transportation and Utilities +2005-12-01T08:00:00.000Z,202,Transportation and Utilities +2006-01-01T08:00:00.000Z,287,Transportation and Utilities +2006-02-01T08:00:00.000Z,260,Transportation and Utilities +2006-03-01T08:00:00.000Z,263,Transportation and Utilities +2006-04-01T08:00:00.000Z,272,Transportation and Utilities +2006-05-01T07:00:00.000Z,226,Transportation and Utilities +2006-06-01T07:00:00.000Z,225,Transportation and Utilities +2006-07-01T07:00:00.000Z,237,Transportation and Utilities +2006-08-01T07:00:00.000Z,217,Transportation and Utilities +2006-09-01T07:00:00.000Z,183,Transportation and Utilities +2006-10-01T07:00:00.000Z,206,Transportation and Utilities +2006-11-01T08:00:00.000Z,183,Transportation and Utilities +2006-12-01T08:00:00.000Z,190,Transportation and Utilities +2007-01-01T08:00:00.000Z,248,Transportation and Utilities +2007-02-01T08:00:00.000Z,251,Transportation and Utilities +2007-03-01T08:00:00.000Z,249,Transportation and Utilities +2007-04-01T07:00:00.000Z,188,Transportation and Utilities +2007-05-01T07:00:00.000Z,216,Transportation and Utilities +2007-06-01T07:00:00.000Z,242,Transportation and Utilities +2007-07-01T07:00:00.000Z,309,Transportation and Utilities +2007-08-01T07:00:00.000Z,205,Transportation and Utilities +2007-09-01T07:00:00.000Z,224,Transportation and Utilities +2007-10-01T07:00:00.000Z,218,Transportation and Utilities +2007-11-01T07:00:00.000Z,242,Transportation and Utilities +2007-12-01T08:00:00.000Z,210,Transportation and Utilities +2008-01-01T08:00:00.000Z,271,Transportation and Utilities +2008-02-01T08:00:00.000Z,289,Transportation and Utilities +2008-03-01T08:00:00.000Z,267,Transportation and Utilities +2008-04-01T07:00:00.000Z,245,Transportation and Utilities +2008-05-01T07:00:00.000Z,269,Transportation and Utilities +2008-06-01T07:00:00.000Z,329,Transportation and Utilities +2008-07-01T07:00:00.000Z,359,Transportation and Utilities +2008-08-01T07:00:00.000Z,309,Transportation and Utilities +2008-09-01T07:00:00.000Z,337,Transportation and Utilities +2008-10-01T07:00:00.000Z,316,Transportation and Utilities +2008-11-01T07:00:00.000Z,331,Transportation and Utilities +2008-12-01T08:00:00.000Z,421,Transportation and Utilities +2009-01-01T08:00:00.000Z,522,Transportation and Utilities +2009-02-01T08:00:00.000Z,563,Transportation and Utilities +2009-03-01T08:00:00.000Z,558,Transportation and Utilities +2009-04-01T07:00:00.000Z,541,Transportation and Utilities +2009-05-01T07:00:00.000Z,506,Transportation and Utilities +2009-06-01T07:00:00.000Z,499,Transportation and Utilities +2009-07-01T07:00:00.000Z,511,Transportation and Utilities +2009-08-01T07:00:00.000Z,547,Transportation and Utilities +2009-09-01T07:00:00.000Z,538,Transportation and Utilities +2009-10-01T07:00:00.000Z,480,Transportation and Utilities +2009-11-01T07:00:00.000Z,493,Transportation and Utilities +2009-12-01T08:00:00.000Z,539,Transportation and Utilities +2010-01-01T08:00:00.000Z,657,Transportation and Utilities +2010-02-01T08:00:00.000Z,591,Transportation and Utilities +2000-01-01T08:00:00.000Z,125,Information +2000-02-01T08:00:00.000Z,112,Information +2000-03-01T08:00:00.000Z,140,Information +2000-04-01T08:00:00.000Z,95,Information +2000-05-01T07:00:00.000Z,131,Information +2000-06-01T07:00:00.000Z,102,Information +2000-07-01T07:00:00.000Z,144,Information +2000-08-01T07:00:00.000Z,143,Information +2000-09-01T07:00:00.000Z,130,Information +2000-10-01T07:00:00.000Z,96,Information +2000-11-01T08:00:00.000Z,117,Information +2000-12-01T08:00:00.000Z,151,Information +2001-01-01T08:00:00.000Z,161,Information +2001-02-01T08:00:00.000Z,109,Information +2001-03-01T08:00:00.000Z,148,Information +2001-04-01T08:00:00.000Z,148,Information +2001-05-01T07:00:00.000Z,164,Information +2001-06-01T07:00:00.000Z,163,Information +2001-07-01T07:00:00.000Z,206,Information +2001-08-01T07:00:00.000Z,210,Information +2001-09-01T07:00:00.000Z,219,Information +2001-10-01T07:00:00.000Z,233,Information +2001-11-01T08:00:00.000Z,241,Information +2001-12-01T08:00:00.000Z,275,Information +2002-01-01T08:00:00.000Z,263,Information +2002-02-01T08:00:00.000Z,279,Information +2002-03-01T08:00:00.000Z,266,Information +2002-04-01T08:00:00.000Z,257,Information +2002-05-01T07:00:00.000Z,260,Information +2002-06-01T07:00:00.000Z,255,Information +2002-07-01T07:00:00.000Z,264,Information +2002-08-01T07:00:00.000Z,270,Information +2002-09-01T07:00:00.000Z,231,Information +2002-10-01T07:00:00.000Z,211,Information +2002-11-01T08:00:00.000Z,220,Information +2002-12-01T08:00:00.000Z,255,Information +2003-01-01T08:00:00.000Z,243,Information +2003-02-01T08:00:00.000Z,321,Information +2003-03-01T08:00:00.000Z,267,Information +2003-04-01T08:00:00.000Z,268,Information +2003-05-01T07:00:00.000Z,251,Information +2003-06-01T07:00:00.000Z,239,Information +2003-07-01T07:00:00.000Z,224,Information +2003-08-01T07:00:00.000Z,224,Information +2003-09-01T07:00:00.000Z,248,Information +2003-10-01T07:00:00.000Z,182,Information +2003-11-01T08:00:00.000Z,257,Information +2003-12-01T08:00:00.000Z,224,Information +2004-01-01T08:00:00.000Z,236,Information +2004-02-01T08:00:00.000Z,194,Information +2004-03-01T08:00:00.000Z,216,Information +2004-04-01T08:00:00.000Z,168,Information +2004-05-01T07:00:00.000Z,190,Information +2004-06-01T07:00:00.000Z,172,Information +2004-07-01T07:00:00.000Z,174,Information +2004-08-01T07:00:00.000Z,191,Information +2004-09-01T07:00:00.000Z,178,Information +2004-10-01T07:00:00.000Z,185,Information +2004-11-01T08:00:00.000Z,187,Information +2004-12-01T08:00:00.000Z,173,Information +2005-01-01T08:00:00.000Z,168,Information +2005-02-01T08:00:00.000Z,204,Information +2005-03-01T08:00:00.000Z,177,Information +2005-04-01T08:00:00.000Z,178,Information +2005-05-01T07:00:00.000Z,145,Information +2005-06-01T07:00:00.000Z,160,Information +2005-07-01T07:00:00.000Z,142,Information +2005-08-01T07:00:00.000Z,156,Information +2005-09-01T07:00:00.000Z,168,Information +2005-10-01T07:00:00.000Z,162,Information +2005-11-01T08:00:00.000Z,172,Information +2005-12-01T08:00:00.000Z,128,Information +2006-01-01T08:00:00.000Z,105,Information +2006-02-01T08:00:00.000Z,119,Information +2006-03-01T08:00:00.000Z,116,Information +2006-04-01T08:00:00.000Z,132,Information +2006-05-01T07:00:00.000Z,158,Information +2006-06-01T07:00:00.000Z,114,Information +2006-07-01T07:00:00.000Z,103,Information +2006-08-01T07:00:00.000Z,132,Information +2006-09-01T07:00:00.000Z,170,Information +2006-10-01T07:00:00.000Z,116,Information +2006-11-01T08:00:00.000Z,137,Information +2006-12-01T08:00:00.000Z,108,Information +2007-01-01T08:00:00.000Z,143,Information +2007-02-01T08:00:00.000Z,139,Information +2007-03-01T08:00:00.000Z,109,Information +2007-04-01T07:00:00.000Z,77,Information +2007-05-01T07:00:00.000Z,110,Information +2007-06-01T07:00:00.000Z,114,Information +2007-07-01T07:00:00.000Z,112,Information +2007-08-01T07:00:00.000Z,140,Information +2007-09-01T07:00:00.000Z,124,Information +2007-10-01T07:00:00.000Z,120,Information +2007-11-01T07:00:00.000Z,132,Information +2007-12-01T08:00:00.000Z,125,Information +2008-01-01T08:00:00.000Z,169,Information +2008-02-01T08:00:00.000Z,193,Information +2008-03-01T08:00:00.000Z,155,Information +2008-04-01T07:00:00.000Z,143,Information +2008-05-01T07:00:00.000Z,170,Information +2008-06-01T07:00:00.000Z,157,Information +2008-07-01T07:00:00.000Z,141,Information +2008-08-01T07:00:00.000Z,144,Information +2008-09-01T07:00:00.000Z,166,Information +2008-10-01T07:00:00.000Z,168,Information +2008-11-01T07:00:00.000Z,173,Information +2008-12-01T08:00:00.000Z,219,Information +2009-01-01T08:00:00.000Z,232,Information +2009-02-01T08:00:00.000Z,224,Information +2009-03-01T08:00:00.000Z,252,Information +2009-04-01T07:00:00.000Z,320,Information +2009-05-01T07:00:00.000Z,303,Information +2009-06-01T07:00:00.000Z,347,Information +2009-07-01T07:00:00.000Z,373,Information +2009-08-01T07:00:00.000Z,358,Information +2009-09-01T07:00:00.000Z,362,Information +2009-10-01T07:00:00.000Z,261,Information +2009-11-01T07:00:00.000Z,243,Information +2009-12-01T08:00:00.000Z,256,Information +2010-01-01T08:00:00.000Z,313,Information +2010-02-01T08:00:00.000Z,300,Information +2000-01-01T08:00:00.000Z,228,Finance +2000-02-01T08:00:00.000Z,240,Finance +2000-03-01T08:00:00.000Z,226,Finance +2000-04-01T08:00:00.000Z,197,Finance +2000-05-01T07:00:00.000Z,195,Finance +2000-06-01T07:00:00.000Z,216,Finance +2000-07-01T07:00:00.000Z,190,Finance +2000-08-01T07:00:00.000Z,213,Finance +2000-09-01T07:00:00.000Z,187,Finance +2000-10-01T07:00:00.000Z,224,Finance +2000-11-01T08:00:00.000Z,184,Finance +2000-12-01T08:00:00.000Z,200,Finance +2001-01-01T08:00:00.000Z,232,Finance +2001-02-01T08:00:00.000Z,235,Finance +2001-03-01T08:00:00.000Z,211,Finance +2001-04-01T08:00:00.000Z,232,Finance +2001-05-01T07:00:00.000Z,191,Finance +2001-06-01T07:00:00.000Z,249,Finance +2001-07-01T07:00:00.000Z,289,Finance +2001-08-01T07:00:00.000Z,256,Finance +2001-09-01T07:00:00.000Z,268,Finance +2001-10-01T07:00:00.000Z,281,Finance +2001-11-01T08:00:00.000Z,320,Finance +2001-12-01T08:00:00.000Z,258,Finance +2002-01-01T08:00:00.000Z,267,Finance +2002-02-01T08:00:00.000Z,318,Finance +2002-03-01T08:00:00.000Z,287,Finance +2002-04-01T08:00:00.000Z,292,Finance +2002-05-01T07:00:00.000Z,340,Finance +2002-06-01T07:00:00.000Z,373,Finance +2002-07-01T07:00:00.000Z,345,Finance +2002-08-01T07:00:00.000Z,343,Finance +2002-09-01T07:00:00.000Z,299,Finance +2002-10-01T07:00:00.000Z,312,Finance +2002-11-01T08:00:00.000Z,337,Finance +2002-12-01T08:00:00.000Z,322,Finance +2003-01-01T08:00:00.000Z,327,Finance +2003-02-01T08:00:00.000Z,310,Finance +2003-03-01T08:00:00.000Z,357,Finance +2003-04-01T08:00:00.000Z,323,Finance +2003-05-01T07:00:00.000Z,320,Finance +2003-06-01T07:00:00.000Z,358,Finance +2003-07-01T07:00:00.000Z,284,Finance +2003-08-01T07:00:00.000Z,342,Finance +2003-09-01T07:00:00.000Z,305,Finance +2003-10-01T07:00:00.000Z,303,Finance +2003-11-01T08:00:00.000Z,311,Finance +2003-12-01T08:00:00.000Z,283,Finance +2004-01-01T08:00:00.000Z,403,Finance +2004-02-01T08:00:00.000Z,363,Finance +2004-03-01T08:00:00.000Z,343,Finance +2004-04-01T08:00:00.000Z,312,Finance +2004-05-01T07:00:00.000Z,302,Finance +2004-06-01T07:00:00.000Z,335,Finance +2004-07-01T07:00:00.000Z,307,Finance +2004-08-01T07:00:00.000Z,312,Finance +2004-09-01T07:00:00.000Z,374,Finance +2004-10-01T07:00:00.000Z,358,Finance +2004-11-01T08:00:00.000Z,290,Finance +2004-12-01T08:00:00.000Z,290,Finance +2005-01-01T08:00:00.000Z,252,Finance +2005-02-01T08:00:00.000Z,301,Finance +2005-03-01T08:00:00.000Z,261,Finance +2005-04-01T08:00:00.000Z,255,Finance +2005-05-01T07:00:00.000Z,288,Finance +2005-06-01T07:00:00.000Z,307,Finance +2005-07-01T07:00:00.000Z,309,Finance +2005-08-01T07:00:00.000Z,300,Finance +2005-09-01T07:00:00.000Z,260,Finance +2005-10-01T07:00:00.000Z,255,Finance +2005-11-01T08:00:00.000Z,268,Finance +2005-12-01T08:00:00.000Z,204,Finance +2006-01-01T08:00:00.000Z,233,Finance +2006-02-01T08:00:00.000Z,268,Finance +2006-03-01T08:00:00.000Z,298,Finance +2006-04-01T08:00:00.000Z,293,Finance +2006-05-01T07:00:00.000Z,289,Finance +2006-06-01T07:00:00.000Z,299,Finance +2006-07-01T07:00:00.000Z,329,Finance +2006-08-01T07:00:00.000Z,263,Finance +2006-09-01T07:00:00.000Z,235,Finance +2006-10-01T07:00:00.000Z,211,Finance +2006-11-01T08:00:00.000Z,229,Finance +2006-12-01T08:00:00.000Z,227,Finance +2007-01-01T08:00:00.000Z,233,Finance +2007-02-01T08:00:00.000Z,295,Finance +2007-03-01T08:00:00.000Z,252,Finance +2007-04-01T07:00:00.000Z,231,Finance +2007-05-01T07:00:00.000Z,281,Finance +2007-06-01T07:00:00.000Z,303,Finance +2007-07-01T07:00:00.000Z,307,Finance +2007-08-01T07:00:00.000Z,371,Finance +2007-09-01T07:00:00.000Z,316,Finance +2007-10-01T07:00:00.000Z,307,Finance +2007-11-01T07:00:00.000Z,261,Finance +2007-12-01T08:00:00.000Z,315,Finance +2008-01-01T08:00:00.000Z,285,Finance +2008-02-01T08:00:00.000Z,323,Finance +2008-03-01T08:00:00.000Z,323,Finance +2008-04-01T07:00:00.000Z,324,Finance +2008-05-01T07:00:00.000Z,361,Finance +2008-06-01T07:00:00.000Z,337,Finance +2008-07-01T07:00:00.000Z,350,Finance +2008-08-01T07:00:00.000Z,409,Finance +2008-09-01T07:00:00.000Z,380,Finance +2008-10-01T07:00:00.000Z,434,Finance +2008-11-01T07:00:00.000Z,494,Finance +2008-12-01T08:00:00.000Z,540,Finance +2009-01-01T08:00:00.000Z,571,Finance +2009-02-01T08:00:00.000Z,637,Finance +2009-03-01T08:00:00.000Z,639,Finance +2009-04-01T07:00:00.000Z,561,Finance +2009-05-01T07:00:00.000Z,536,Finance +2009-06-01T07:00:00.000Z,513,Finance +2009-07-01T07:00:00.000Z,570,Finance +2009-08-01T07:00:00.000Z,566,Finance +2009-09-01T07:00:00.000Z,657,Finance +2009-10-01T07:00:00.000Z,646,Finance +2009-11-01T07:00:00.000Z,619,Finance +2009-12-01T08:00:00.000Z,665,Finance +2010-01-01T08:00:00.000Z,623,Finance +2010-02-01T08:00:00.000Z,708,Finance +2000-01-01T08:00:00.000Z,655,Business services +2000-02-01T08:00:00.000Z,587,Business services +2000-03-01T08:00:00.000Z,623,Business services +2000-04-01T08:00:00.000Z,517,Business services +2000-05-01T07:00:00.000Z,561,Business services +2000-06-01T07:00:00.000Z,545,Business services +2000-07-01T07:00:00.000Z,636,Business services +2000-08-01T07:00:00.000Z,584,Business services +2000-09-01T07:00:00.000Z,559,Business services +2000-10-01T07:00:00.000Z,504,Business services +2000-11-01T08:00:00.000Z,547,Business services +2000-12-01T08:00:00.000Z,564,Business services +2001-01-01T08:00:00.000Z,734,Business services +2001-02-01T08:00:00.000Z,724,Business services +2001-03-01T08:00:00.000Z,652,Business services +2001-04-01T08:00:00.000Z,655,Business services +2001-05-01T07:00:00.000Z,652,Business services +2001-06-01T07:00:00.000Z,694,Business services +2001-07-01T07:00:00.000Z,731,Business services +2001-08-01T07:00:00.000Z,790,Business services +2001-09-01T07:00:00.000Z,810,Business services +2001-10-01T07:00:00.000Z,910,Business services +2001-11-01T08:00:00.000Z,946,Business services +2001-12-01T08:00:00.000Z,921,Business services +2002-01-01T08:00:00.000Z,1120,Business services +2002-02-01T08:00:00.000Z,973,Business services +2002-03-01T08:00:00.000Z,964,Business services +2002-04-01T08:00:00.000Z,951,Business services +2002-05-01T07:00:00.000Z,983,Business services +2002-06-01T07:00:00.000Z,1079,Business services +2002-07-01T07:00:00.000Z,1075,Business services +2002-08-01T07:00:00.000Z,926,Business services +2002-09-01T07:00:00.000Z,1007,Business services +2002-10-01T07:00:00.000Z,962,Business services +2002-11-01T08:00:00.000Z,1029,Business services +2002-12-01T08:00:00.000Z,1038,Business services +2003-01-01T08:00:00.000Z,1112,Business services +2003-02-01T08:00:00.000Z,1140,Business services +2003-03-01T08:00:00.000Z,1190,Business services +2003-04-01T08:00:00.000Z,1076,Business services +2003-05-01T07:00:00.000Z,1105,Business services +2003-06-01T07:00:00.000Z,1092,Business services +2003-07-01T07:00:00.000Z,1021,Business services +2003-08-01T07:00:00.000Z,881,Business services +2003-09-01T07:00:00.000Z,975,Business services +2003-10-01T07:00:00.000Z,1014,Business services +2003-11-01T08:00:00.000Z,948,Business services +2003-12-01T08:00:00.000Z,948,Business services +2004-01-01T08:00:00.000Z,1070,Business services +2004-02-01T08:00:00.000Z,964,Business services +2004-03-01T08:00:00.000Z,999,Business services +2004-04-01T08:00:00.000Z,752,Business services +2004-05-01T07:00:00.000Z,819,Business services +2004-06-01T07:00:00.000Z,814,Business services +2004-07-01T07:00:00.000Z,790,Business services +2004-08-01T07:00:00.000Z,845,Business services +2004-09-01T07:00:00.000Z,750,Business services +2004-10-01T07:00:00.000Z,781,Business services +2004-11-01T08:00:00.000Z,872,Business services +2004-12-01T08:00:00.000Z,875,Business services +2005-01-01T08:00:00.000Z,958,Business services +2005-02-01T08:00:00.000Z,916,Business services +2005-03-01T08:00:00.000Z,807,Business services +2005-04-01T08:00:00.000Z,714,Business services +2005-05-01T07:00:00.000Z,730,Business services +2005-06-01T07:00:00.000Z,743,Business services +2005-07-01T07:00:00.000Z,804,Business services +2005-08-01T07:00:00.000Z,728,Business services +2005-09-01T07:00:00.000Z,862,Business services +2005-10-01T07:00:00.000Z,748,Business services +2005-11-01T08:00:00.000Z,711,Business services +2005-12-01T08:00:00.000Z,788,Business services +2006-01-01T08:00:00.000Z,825,Business services +2006-02-01T08:00:00.000Z,841,Business services +2006-03-01T08:00:00.000Z,824,Business services +2006-04-01T08:00:00.000Z,644,Business services +2006-05-01T07:00:00.000Z,695,Business services +2006-06-01T07:00:00.000Z,753,Business services +2006-07-01T07:00:00.000Z,735,Business services +2006-08-01T07:00:00.000Z,681,Business services +2006-09-01T07:00:00.000Z,736,Business services +2006-10-01T07:00:00.000Z,768,Business services +2006-11-01T08:00:00.000Z,658,Business services +2006-12-01T08:00:00.000Z,791,Business services +2007-01-01T08:00:00.000Z,885,Business services +2007-02-01T08:00:00.000Z,825,Business services +2007-03-01T08:00:00.000Z,775,Business services +2007-04-01T07:00:00.000Z,689,Business services +2007-05-01T07:00:00.000Z,743,Business services +2007-06-01T07:00:00.000Z,722,Business services +2007-07-01T07:00:00.000Z,743,Business services +2007-08-01T07:00:00.000Z,683,Business services +2007-09-01T07:00:00.000Z,655,Business services +2007-10-01T07:00:00.000Z,675,Business services +2007-11-01T07:00:00.000Z,679,Business services +2007-12-01T08:00:00.000Z,803,Business services +2008-01-01T08:00:00.000Z,893,Business services +2008-02-01T08:00:00.000Z,866,Business services +2008-03-01T08:00:00.000Z,876,Business services +2008-04-01T07:00:00.000Z,736,Business services +2008-05-01T07:00:00.000Z,829,Business services +2008-06-01T07:00:00.000Z,890,Business services +2008-07-01T07:00:00.000Z,866,Business services +2008-08-01T07:00:00.000Z,961,Business services +2008-09-01T07:00:00.000Z,951,Business services +2008-10-01T07:00:00.000Z,1052,Business services +2008-11-01T07:00:00.000Z,992,Business services +2008-12-01T08:00:00.000Z,1147,Business services +2009-01-01T08:00:00.000Z,1445,Business services +2009-02-01T08:00:00.000Z,1512,Business services +2009-03-01T08:00:00.000Z,1597,Business services +2009-04-01T07:00:00.000Z,1448,Business services +2009-05-01T07:00:00.000Z,1514,Business services +2009-06-01T07:00:00.000Z,1580,Business services +2009-07-01T07:00:00.000Z,1531,Business services +2009-08-01T07:00:00.000Z,1560,Business services +2009-09-01T07:00:00.000Z,1596,Business services +2009-10-01T07:00:00.000Z,1488,Business services +2009-11-01T07:00:00.000Z,1514,Business services +2009-12-01T08:00:00.000Z,1486,Business services +2010-01-01T08:00:00.000Z,1614,Business services +2010-02-01T08:00:00.000Z,1740,Business services +2000-01-01T08:00:00.000Z,353,Education and Health +2000-02-01T08:00:00.000Z,349,Education and Health +2000-03-01T08:00:00.000Z,381,Education and Health +2000-04-01T08:00:00.000Z,329,Education and Health +2000-05-01T07:00:00.000Z,423,Education and Health +2000-06-01T07:00:00.000Z,452,Education and Health +2000-07-01T07:00:00.000Z,478,Education and Health +2000-08-01T07:00:00.000Z,450,Education and Health +2000-09-01T07:00:00.000Z,398,Education and Health +2000-10-01T07:00:00.000Z,339,Education and Health +2000-11-01T08:00:00.000Z,351,Education and Health +2000-12-01T08:00:00.000Z,293,Education and Health +2001-01-01T08:00:00.000Z,428,Education and Health +2001-02-01T08:00:00.000Z,423,Education and Health +2001-03-01T08:00:00.000Z,456,Education and Health +2001-04-01T08:00:00.000Z,341,Education and Health +2001-05-01T07:00:00.000Z,390,Education and Health +2001-06-01T07:00:00.000Z,476,Education and Health +2001-07-01T07:00:00.000Z,513,Education and Health +2001-08-01T07:00:00.000Z,595,Education and Health +2001-09-01T07:00:00.000Z,455,Education and Health +2001-10-01T07:00:00.000Z,486,Education and Health +2001-11-01T08:00:00.000Z,516,Education and Health +2001-12-01T08:00:00.000Z,483,Education and Health +2002-01-01T08:00:00.000Z,586,Education and Health +2002-02-01T08:00:00.000Z,590,Education and Health +2002-03-01T08:00:00.000Z,540,Education and Health +2002-04-01T08:00:00.000Z,493,Education and Health +2002-05-01T07:00:00.000Z,533,Education and Health +2002-06-01T07:00:00.000Z,638,Education and Health +2002-07-01T07:00:00.000Z,671,Education and Health +2002-08-01T07:00:00.000Z,660,Education and Health +2002-09-01T07:00:00.000Z,562,Education and Health +2002-10-01T07:00:00.000Z,517,Education and Health +2002-11-01T08:00:00.000Z,493,Education and Health +2002-12-01T08:00:00.000Z,558,Education and Health +2003-01-01T08:00:00.000Z,559,Education and Health +2003-02-01T08:00:00.000Z,576,Education and Health +2003-03-01T08:00:00.000Z,518,Education and Health +2003-04-01T08:00:00.000Z,611,Education and Health +2003-05-01T07:00:00.000Z,618,Education and Health +2003-06-01T07:00:00.000Z,769,Education and Health +2003-07-01T07:00:00.000Z,697,Education and Health +2003-08-01T07:00:00.000Z,760,Education and Health +2003-09-01T07:00:00.000Z,649,Education and Health +2003-10-01T07:00:00.000Z,639,Education and Health +2003-11-01T08:00:00.000Z,662,Education and Health +2003-12-01T08:00:00.000Z,620,Education and Health +2004-01-01T08:00:00.000Z,662,Education and Health +2004-02-01T08:00:00.000Z,608,Education and Health +2004-03-01T08:00:00.000Z,584,Education and Health +2004-04-01T08:00:00.000Z,589,Education and Health +2004-05-01T07:00:00.000Z,570,Education and Health +2004-06-01T07:00:00.000Z,769,Education and Health +2004-07-01T07:00:00.000Z,725,Education and Health +2004-08-01T07:00:00.000Z,647,Education and Health +2004-09-01T07:00:00.000Z,593,Education and Health +2004-10-01T07:00:00.000Z,526,Education and Health +2004-11-01T08:00:00.000Z,570,Education and Health +2004-12-01T08:00:00.000Z,562,Education and Health +2005-01-01T08:00:00.000Z,613,Education and Health +2005-02-01T08:00:00.000Z,619,Education and Health +2005-03-01T08:00:00.000Z,614,Education and Health +2005-04-01T08:00:00.000Z,591,Education and Health +2005-05-01T07:00:00.000Z,648,Education and Health +2005-06-01T07:00:00.000Z,667,Education and Health +2005-07-01T07:00:00.000Z,635,Education and Health +2005-08-01T07:00:00.000Z,644,Education and Health +2005-09-01T07:00:00.000Z,658,Education and Health +2005-10-01T07:00:00.000Z,628,Education and Health +2005-11-01T08:00:00.000Z,677,Education and Health +2005-12-01T08:00:00.000Z,529,Education and Health +2006-01-01T08:00:00.000Z,593,Education and Health +2006-02-01T08:00:00.000Z,528,Education and Health +2006-03-01T08:00:00.000Z,563,Education and Health +2006-04-01T08:00:00.000Z,558,Education and Health +2006-05-01T07:00:00.000Z,543,Education and Health +2006-06-01T07:00:00.000Z,617,Education and Health +2006-07-01T07:00:00.000Z,659,Education and Health +2006-08-01T07:00:00.000Z,611,Education and Health +2006-09-01T07:00:00.000Z,576,Education and Health +2006-10-01T07:00:00.000Z,531,Education and Health +2006-11-01T08:00:00.000Z,536,Education and Health +2006-12-01T08:00:00.000Z,502,Education and Health +2007-01-01T08:00:00.000Z,563,Education and Health +2007-02-01T08:00:00.000Z,489,Education and Health +2007-03-01T08:00:00.000Z,495,Education and Health +2007-04-01T07:00:00.000Z,555,Education and Health +2007-05-01T07:00:00.000Z,622,Education and Health +2007-06-01T07:00:00.000Z,653,Education and Health +2007-07-01T07:00:00.000Z,665,Education and Health +2007-08-01T07:00:00.000Z,648,Education and Health +2007-09-01T07:00:00.000Z,630,Education and Health +2007-10-01T07:00:00.000Z,534,Education and Health +2007-11-01T07:00:00.000Z,526,Education and Health +2007-12-01T08:00:00.000Z,521,Education and Health +2008-01-01T08:00:00.000Z,576,Education and Health +2008-02-01T08:00:00.000Z,562,Education and Health +2008-03-01T08:00:00.000Z,609,Education and Health +2008-04-01T07:00:00.000Z,551,Education and Health +2008-05-01T07:00:00.000Z,619,Education and Health +2008-06-01T07:00:00.000Z,669,Education and Health +2008-07-01T07:00:00.000Z,776,Education and Health +2008-08-01T07:00:00.000Z,844,Education and Health +2008-09-01T07:00:00.000Z,835,Education and Health +2008-10-01T07:00:00.000Z,797,Education and Health +2008-11-01T07:00:00.000Z,748,Education and Health +2008-12-01T08:00:00.000Z,791,Education and Health +2009-01-01T08:00:00.000Z,792,Education and Health +2009-02-01T08:00:00.000Z,847,Education and Health +2009-03-01T08:00:00.000Z,931,Education and Health +2009-04-01T07:00:00.000Z,964,Education and Health +2009-05-01T07:00:00.000Z,1005,Education and Health +2009-06-01T07:00:00.000Z,1267,Education and Health +2009-07-01T07:00:00.000Z,1269,Education and Health +2009-08-01T07:00:00.000Z,1239,Education and Health +2009-09-01T07:00:00.000Z,1257,Education and Health +2009-10-01T07:00:00.000Z,1280,Education and Health +2009-11-01T07:00:00.000Z,1168,Education and Health +2009-12-01T08:00:00.000Z,1183,Education and Health +2010-01-01T08:00:00.000Z,1175,Education and Health +2010-02-01T08:00:00.000Z,1200,Education and Health +2000-01-01T08:00:00.000Z,782,Leisure and hospitality +2000-02-01T08:00:00.000Z,779,Leisure and hospitality +2000-03-01T08:00:00.000Z,789,Leisure and hospitality +2000-04-01T08:00:00.000Z,658,Leisure and hospitality +2000-05-01T07:00:00.000Z,675,Leisure and hospitality +2000-06-01T07:00:00.000Z,833,Leisure and hospitality +2000-07-01T07:00:00.000Z,786,Leisure and hospitality +2000-08-01T07:00:00.000Z,675,Leisure and hospitality +2000-09-01T07:00:00.000Z,636,Leisure and hospitality +2000-10-01T07:00:00.000Z,691,Leisure and hospitality +2000-11-01T08:00:00.000Z,694,Leisure and hospitality +2000-12-01T08:00:00.000Z,639,Leisure and hospitality +2001-01-01T08:00:00.000Z,806,Leisure and hospitality +2001-02-01T08:00:00.000Z,821,Leisure and hospitality +2001-03-01T08:00:00.000Z,817,Leisure and hospitality +2001-04-01T08:00:00.000Z,744,Leisure and hospitality +2001-05-01T07:00:00.000Z,731,Leisure and hospitality +2001-06-01T07:00:00.000Z,821,Leisure and hospitality +2001-07-01T07:00:00.000Z,813,Leisure and hospitality +2001-08-01T07:00:00.000Z,767,Leisure and hospitality +2001-09-01T07:00:00.000Z,900,Leisure and hospitality +2001-10-01T07:00:00.000Z,903,Leisure and hospitality +2001-11-01T08:00:00.000Z,935,Leisure and hospitality +2001-12-01T08:00:00.000Z,938,Leisure and hospitality +2002-01-01T08:00:00.000Z,947,Leisure and hospitality +2002-02-01T08:00:00.000Z,973,Leisure and hospitality +2002-03-01T08:00:00.000Z,976,Leisure and hospitality +2002-04-01T08:00:00.000Z,953,Leisure and hospitality +2002-05-01T07:00:00.000Z,1022,Leisure and hospitality +2002-06-01T07:00:00.000Z,1034,Leisure and hospitality +2002-07-01T07:00:00.000Z,999,Leisure and hospitality +2002-08-01T07:00:00.000Z,884,Leisure and hospitality +2002-09-01T07:00:00.000Z,885,Leisure and hospitality +2002-10-01T07:00:00.000Z,956,Leisure and hospitality +2002-11-01T08:00:00.000Z,978,Leisure and hospitality +2002-12-01T08:00:00.000Z,922,Leisure and hospitality +2003-01-01T08:00:00.000Z,1049,Leisure and hospitality +2003-02-01T08:00:00.000Z,1145,Leisure and hospitality +2003-03-01T08:00:00.000Z,1035,Leisure and hospitality +2003-04-01T08:00:00.000Z,986,Leisure and hospitality +2003-05-01T07:00:00.000Z,955,Leisure and hospitality +2003-06-01T07:00:00.000Z,1048,Leisure and hospitality +2003-07-01T07:00:00.000Z,1020,Leisure and hospitality +2003-08-01T07:00:00.000Z,1050,Leisure and hospitality +2003-09-01T07:00:00.000Z,978,Leisure and hospitality +2003-10-01T07:00:00.000Z,933,Leisure and hospitality +2003-11-01T08:00:00.000Z,990,Leisure and hospitality +2003-12-01T08:00:00.000Z,885,Leisure and hospitality +2004-01-01T08:00:00.000Z,1097,Leisure and hospitality +2004-02-01T08:00:00.000Z,987,Leisure and hospitality +2004-03-01T08:00:00.000Z,1039,Leisure and hospitality +2004-04-01T08:00:00.000Z,925,Leisure and hospitality +2004-05-01T07:00:00.000Z,977,Leisure and hospitality +2004-06-01T07:00:00.000Z,1189,Leisure and hospitality +2004-07-01T07:00:00.000Z,965,Leisure and hospitality +2004-08-01T07:00:00.000Z,1010,Leisure and hospitality +2004-09-01T07:00:00.000Z,854,Leisure and hospitality +2004-10-01T07:00:00.000Z,853,Leisure and hospitality +2004-11-01T08:00:00.000Z,916,Leisure and hospitality +2004-12-01T08:00:00.000Z,850,Leisure and hospitality +2005-01-01T08:00:00.000Z,993,Leisure and hospitality +2005-02-01T08:00:00.000Z,1008,Leisure and hospitality +2005-03-01T08:00:00.000Z,967,Leisure and hospitality +2005-04-01T08:00:00.000Z,882,Leisure and hospitality +2005-05-01T07:00:00.000Z,944,Leisure and hospitality +2005-06-01T07:00:00.000Z,950,Leisure and hospitality +2005-07-01T07:00:00.000Z,929,Leisure and hospitality +2005-08-01T07:00:00.000Z,844,Leisure and hospitality +2005-09-01T07:00:00.000Z,842,Leisure and hospitality +2005-10-01T07:00:00.000Z,796,Leisure and hospitality +2005-11-01T08:00:00.000Z,966,Leisure and hospitality +2005-12-01T08:00:00.000Z,930,Leisure and hospitality +2006-01-01T08:00:00.000Z,910,Leisure and hospitality +2006-02-01T08:00:00.000Z,1040,Leisure and hospitality +2006-03-01T08:00:00.000Z,917,Leisure and hospitality +2006-04-01T08:00:00.000Z,882,Leisure and hospitality +2006-05-01T07:00:00.000Z,830,Leisure and hospitality +2006-06-01T07:00:00.000Z,942,Leisure and hospitality +2006-07-01T07:00:00.000Z,867,Leisure and hospitality +2006-08-01T07:00:00.000Z,855,Leisure and hospitality +2006-09-01T07:00:00.000Z,810,Leisure and hospitality +2006-10-01T07:00:00.000Z,795,Leisure and hospitality +2006-11-01T08:00:00.000Z,836,Leisure and hospitality +2006-12-01T08:00:00.000Z,701,Leisure and hospitality +2007-01-01T08:00:00.000Z,911,Leisure and hospitality +2007-02-01T08:00:00.000Z,879,Leisure and hospitality +2007-03-01T08:00:00.000Z,845,Leisure and hospitality +2007-04-01T07:00:00.000Z,822,Leisure and hospitality +2007-05-01T07:00:00.000Z,831,Leisure and hospitality +2007-06-01T07:00:00.000Z,917,Leisure and hospitality +2007-07-01T07:00:00.000Z,920,Leisure and hospitality +2007-08-01T07:00:00.000Z,877,Leisure and hospitality +2007-09-01T07:00:00.000Z,892,Leisure and hospitality +2007-10-01T07:00:00.000Z,911,Leisure and hospitality +2007-11-01T07:00:00.000Z,986,Leisure and hospitality +2007-12-01T08:00:00.000Z,961,Leisure and hospitality +2008-01-01T08:00:00.000Z,1176,Leisure and hospitality +2008-02-01T08:00:00.000Z,1056,Leisure and hospitality +2008-03-01T08:00:00.000Z,944,Leisure and hospitality +2008-04-01T07:00:00.000Z,874,Leisure and hospitality +2008-05-01T07:00:00.000Z,1074,Leisure and hospitality +2008-06-01T07:00:00.000Z,1154,Leisure and hospitality +2008-07-01T07:00:00.000Z,1172,Leisure and hospitality +2008-08-01T07:00:00.000Z,1122,Leisure and hospitality +2008-09-01T07:00:00.000Z,1029,Leisure and hospitality +2008-10-01T07:00:00.000Z,1126,Leisure and hospitality +2008-11-01T07:00:00.000Z,1283,Leisure and hospitality +2008-12-01T08:00:00.000Z,1210,Leisure and hospitality +2009-01-01T08:00:00.000Z,1487,Leisure and hospitality +2009-02-01T08:00:00.000Z,1477,Leisure and hospitality +2009-03-01T08:00:00.000Z,1484,Leisure and hospitality +2009-04-01T07:00:00.000Z,1322,Leisure and hospitality +2009-05-01T07:00:00.000Z,1599,Leisure and hospitality +2009-06-01T07:00:00.000Z,1688,Leisure and hospitality +2009-07-01T07:00:00.000Z,1600,Leisure and hospitality +2009-08-01T07:00:00.000Z,1636,Leisure and hospitality +2009-09-01T07:00:00.000Z,1469,Leisure and hospitality +2009-10-01T07:00:00.000Z,1604,Leisure and hospitality +2009-11-01T07:00:00.000Z,1524,Leisure and hospitality +2009-12-01T08:00:00.000Z,1624,Leisure and hospitality +2010-01-01T08:00:00.000Z,1804,Leisure and hospitality +2010-02-01T08:00:00.000Z,1597,Leisure and hospitality +2000-01-01T08:00:00.000Z,274,Other +2000-02-01T08:00:00.000Z,232,Other +2000-03-01T08:00:00.000Z,247,Other +2000-04-01T08:00:00.000Z,240,Other +2000-05-01T07:00:00.000Z,254,Other +2000-06-01T07:00:00.000Z,225,Other +2000-07-01T07:00:00.000Z,202,Other +2000-08-01T07:00:00.000Z,187,Other +2000-09-01T07:00:00.000Z,220,Other +2000-10-01T07:00:00.000Z,161,Other +2000-11-01T08:00:00.000Z,217,Other +2000-12-01T08:00:00.000Z,167,Other +2001-01-01T08:00:00.000Z,197,Other +2001-02-01T08:00:00.000Z,243,Other +2001-03-01T08:00:00.000Z,200,Other +2001-04-01T08:00:00.000Z,220,Other +2001-05-01T07:00:00.000Z,172,Other +2001-06-01T07:00:00.000Z,246,Other +2001-07-01T07:00:00.000Z,228,Other +2001-08-01T07:00:00.000Z,241,Other +2001-09-01T07:00:00.000Z,225,Other +2001-10-01T07:00:00.000Z,239,Other +2001-11-01T08:00:00.000Z,256,Other +2001-12-01T08:00:00.000Z,277,Other +2002-01-01T08:00:00.000Z,304,Other +2002-02-01T08:00:00.000Z,339,Other +2002-03-01T08:00:00.000Z,314,Other +2002-04-01T08:00:00.000Z,268,Other +2002-05-01T07:00:00.000Z,264,Other +2002-06-01T07:00:00.000Z,335,Other +2002-07-01T07:00:00.000Z,356,Other +2002-08-01T07:00:00.000Z,353,Other +2002-09-01T07:00:00.000Z,281,Other +2002-10-01T07:00:00.000Z,272,Other +2002-11-01T08:00:00.000Z,284,Other +2002-12-01T08:00:00.000Z,241,Other +2003-01-01T08:00:00.000Z,304,Other +2003-02-01T08:00:00.000Z,331,Other +2003-03-01T08:00:00.000Z,370,Other +2003-04-01T08:00:00.000Z,331,Other +2003-05-01T07:00:00.000Z,339,Other +2003-06-01T07:00:00.000Z,359,Other +2003-07-01T07:00:00.000Z,405,Other +2003-08-01T07:00:00.000Z,373,Other +2003-09-01T07:00:00.000Z,338,Other +2003-10-01T07:00:00.000Z,378,Other +2003-11-01T08:00:00.000Z,357,Other +2003-12-01T08:00:00.000Z,278,Other +2004-01-01T08:00:00.000Z,322,Other +2004-02-01T08:00:00.000Z,366,Other +2004-03-01T08:00:00.000Z,366,Other +2004-04-01T08:00:00.000Z,347,Other +2004-05-01T07:00:00.000Z,310,Other +2004-06-01T07:00:00.000Z,326,Other +2004-07-01T07:00:00.000Z,346,Other +2004-08-01T07:00:00.000Z,341,Other +2004-09-01T07:00:00.000Z,301,Other +2004-10-01T07:00:00.000Z,300,Other +2004-11-01T08:00:00.000Z,294,Other +2004-12-01T08:00:00.000Z,276,Other +2005-01-01T08:00:00.000Z,290,Other +2005-02-01T08:00:00.000Z,325,Other +2005-03-01T08:00:00.000Z,308,Other +2005-04-01T08:00:00.000Z,306,Other +2005-05-01T07:00:00.000Z,314,Other +2005-06-01T07:00:00.000Z,291,Other +2005-07-01T07:00:00.000Z,274,Other +2005-08-01T07:00:00.000Z,306,Other +2005-09-01T07:00:00.000Z,307,Other +2005-10-01T07:00:00.000Z,319,Other +2005-11-01T08:00:00.000Z,300,Other +2005-12-01T08:00:00.000Z,269,Other +2006-01-01T08:00:00.000Z,308,Other +2006-02-01T08:00:00.000Z,281,Other +2006-03-01T08:00:00.000Z,292,Other +2006-04-01T08:00:00.000Z,266,Other +2006-05-01T07:00:00.000Z,265,Other +2006-06-01T07:00:00.000Z,265,Other +2006-07-01T07:00:00.000Z,305,Other +2006-08-01T07:00:00.000Z,341,Other +2006-09-01T07:00:00.000Z,310,Other +2006-10-01T07:00:00.000Z,268,Other +2006-11-01T08:00:00.000Z,306,Other +2006-12-01T08:00:00.000Z,306,Other +2007-01-01T08:00:00.000Z,275,Other +2007-02-01T08:00:00.000Z,257,Other +2007-03-01T08:00:00.000Z,222,Other +2007-04-01T07:00:00.000Z,224,Other +2007-05-01T07:00:00.000Z,242,Other +2007-06-01T07:00:00.000Z,256,Other +2007-07-01T07:00:00.000Z,243,Other +2007-08-01T07:00:00.000Z,239,Other +2007-09-01T07:00:00.000Z,257,Other +2007-10-01T07:00:00.000Z,182,Other +2007-11-01T07:00:00.000Z,255,Other +2007-12-01T08:00:00.000Z,235,Other +2008-01-01T08:00:00.000Z,264,Other +2008-02-01T08:00:00.000Z,313,Other +2008-03-01T08:00:00.000Z,283,Other +2008-04-01T07:00:00.000Z,251,Other +2008-05-01T07:00:00.000Z,275,Other +2008-06-01T07:00:00.000Z,322,Other +2008-07-01T07:00:00.000Z,352,Other +2008-08-01T07:00:00.000Z,412,Other +2008-09-01T07:00:00.000Z,374,Other +2008-10-01T07:00:00.000Z,334,Other +2008-11-01T07:00:00.000Z,434,Other +2008-12-01T08:00:00.000Z,367,Other +2009-01-01T08:00:00.000Z,431,Other +2009-02-01T08:00:00.000Z,453,Other +2009-03-01T08:00:00.000Z,377,Other +2009-04-01T07:00:00.000Z,403,Other +2009-05-01T07:00:00.000Z,476,Other +2009-06-01T07:00:00.000Z,557,Other +2009-07-01T07:00:00.000Z,490,Other +2009-08-01T07:00:00.000Z,528,Other +2009-09-01T07:00:00.000Z,462,Other +2009-10-01T07:00:00.000Z,541,Other +2009-11-01T07:00:00.000Z,491,Other +2009-12-01T08:00:00.000Z,513,Other +2010-01-01T08:00:00.000Z,609,Other +2010-02-01T08:00:00.000Z,603,Other +2000-01-01T08:00:00.000Z,154,Agriculture +2000-02-01T08:00:00.000Z,173,Agriculture +2000-03-01T08:00:00.000Z,152,Agriculture +2000-04-01T08:00:00.000Z,135,Agriculture +2000-05-01T07:00:00.000Z,73,Agriculture +2000-06-01T07:00:00.000Z,109,Agriculture +2000-07-01T07:00:00.000Z,77,Agriculture +2000-08-01T07:00:00.000Z,110,Agriculture +2000-09-01T07:00:00.000Z,124,Agriculture +2000-10-01T07:00:00.000Z,113,Agriculture +2000-11-01T08:00:00.000Z,192,Agriculture +2000-12-01T08:00:00.000Z,196,Agriculture +2001-01-01T08:00:00.000Z,188,Agriculture +2001-02-01T08:00:00.000Z,193,Agriculture +2001-03-01T08:00:00.000Z,267,Agriculture +2001-04-01T08:00:00.000Z,140,Agriculture +2001-05-01T07:00:00.000Z,109,Agriculture +2001-06-01T07:00:00.000Z,130,Agriculture +2001-07-01T07:00:00.000Z,113,Agriculture +2001-08-01T07:00:00.000Z,141,Agriculture +2001-09-01T07:00:00.000Z,101,Agriculture +2001-10-01T07:00:00.000Z,118,Agriculture +2001-11-01T08:00:00.000Z,145,Agriculture +2001-12-01T08:00:00.000Z,192,Agriculture +2002-01-01T08:00:00.000Z,195,Agriculture +2002-02-01T08:00:00.000Z,187,Agriculture +2002-03-01T08:00:00.000Z,269,Agriculture +2002-04-01T08:00:00.000Z,151,Agriculture +2002-05-01T07:00:00.000Z,89,Agriculture +2002-06-01T07:00:00.000Z,89,Agriculture +2002-07-01T07:00:00.000Z,114,Agriculture +2002-08-01T07:00:00.000Z,125,Agriculture +2002-09-01T07:00:00.000Z,92,Agriculture +2002-10-01T07:00:00.000Z,97,Agriculture +2002-11-01T08:00:00.000Z,137,Agriculture +2002-12-01T08:00:00.000Z,120,Agriculture +2003-01-01T08:00:00.000Z,159,Agriculture +2003-02-01T08:00:00.000Z,172,Agriculture +2003-03-01T08:00:00.000Z,161,Agriculture +2003-04-01T08:00:00.000Z,154,Agriculture +2003-05-01T07:00:00.000Z,133,Agriculture +2003-06-01T07:00:00.000Z,94,Agriculture +2003-07-01T07:00:00.000Z,113,Agriculture +2003-08-01T07:00:00.000Z,173,Agriculture +2003-09-01T07:00:00.000Z,98,Agriculture +2003-10-01T07:00:00.000Z,136,Agriculture +2003-11-01T08:00:00.000Z,148,Agriculture +2003-12-01T08:00:00.000Z,137,Agriculture +2004-01-01T08:00:00.000Z,184,Agriculture +2004-02-01T08:00:00.000Z,168,Agriculture +2004-03-01T08:00:00.000Z,153,Agriculture +2004-04-01T08:00:00.000Z,107,Agriculture +2004-05-01T07:00:00.000Z,99,Agriculture +2004-06-01T07:00:00.000Z,106,Agriculture +2004-07-01T07:00:00.000Z,140,Agriculture +2004-08-01T07:00:00.000Z,103,Agriculture +2004-09-01T07:00:00.000Z,88,Agriculture +2004-10-01T07:00:00.000Z,102,Agriculture +2004-11-01T08:00:00.000Z,131,Agriculture +2004-12-01T08:00:00.000Z,165,Agriculture +2005-01-01T08:00:00.000Z,153,Agriculture +2005-02-01T08:00:00.000Z,107,Agriculture +2005-03-01T08:00:00.000Z,139,Agriculture +2005-04-01T08:00:00.000Z,84,Agriculture +2005-05-01T07:00:00.000Z,66,Agriculture +2005-06-01T07:00:00.000Z,76,Agriculture +2005-07-01T07:00:00.000Z,69,Agriculture +2005-08-01T07:00:00.000Z,100,Agriculture +2005-09-01T07:00:00.000Z,127,Agriculture +2005-10-01T07:00:00.000Z,85,Agriculture +2005-11-01T08:00:00.000Z,118,Agriculture +2005-12-01T08:00:00.000Z,127,Agriculture +2006-01-01T08:00:00.000Z,140,Agriculture +2006-02-01T08:00:00.000Z,139,Agriculture +2006-03-01T08:00:00.000Z,117,Agriculture +2006-04-01T08:00:00.000Z,81,Agriculture +2006-05-01T07:00:00.000Z,79,Agriculture +2006-06-01T07:00:00.000Z,35,Agriculture +2006-07-01T07:00:00.000Z,55,Agriculture +2006-08-01T07:00:00.000Z,76,Agriculture +2006-09-01T07:00:00.000Z,78,Agriculture +2006-10-01T07:00:00.000Z,77,Agriculture +2006-11-01T08:00:00.000Z,125,Agriculture +2006-12-01T08:00:00.000Z,139,Agriculture +2007-01-01T08:00:00.000Z,128,Agriculture +2007-02-01T08:00:00.000Z,127,Agriculture +2007-03-01T08:00:00.000Z,123,Agriculture +2007-04-01T07:00:00.000Z,67,Agriculture +2007-05-01T07:00:00.000Z,64,Agriculture +2007-06-01T07:00:00.000Z,59,Agriculture +2007-07-01T07:00:00.000Z,40,Agriculture +2007-08-01T07:00:00.000Z,54,Agriculture +2007-09-01T07:00:00.000Z,53,Agriculture +2007-10-01T07:00:00.000Z,47,Agriculture +2007-11-01T07:00:00.000Z,80,Agriculture +2007-12-01T08:00:00.000Z,96,Agriculture +2008-01-01T08:00:00.000Z,113,Agriculture +2008-02-01T08:00:00.000Z,135,Agriculture +2008-03-01T08:00:00.000Z,175,Agriculture +2008-04-01T07:00:00.000Z,108,Agriculture +2008-05-01T07:00:00.000Z,94,Agriculture +2008-06-01T07:00:00.000Z,86,Agriculture +2008-07-01T07:00:00.000Z,125,Agriculture +2008-08-01T07:00:00.000Z,111,Agriculture +2008-09-01T07:00:00.000Z,84,Agriculture +2008-10-01T07:00:00.000Z,97,Agriculture +2008-11-01T07:00:00.000Z,119,Agriculture +2008-12-01T08:00:00.000Z,229,Agriculture +2009-01-01T08:00:00.000Z,245,Agriculture +2009-02-01T08:00:00.000Z,251,Agriculture +2009-03-01T08:00:00.000Z,241,Agriculture +2009-04-01T07:00:00.000Z,176,Agriculture +2009-05-01T07:00:00.000Z,136,Agriculture +2009-06-01T07:00:00.000Z,182,Agriculture +2009-07-01T07:00:00.000Z,180,Agriculture +2009-08-01T07:00:00.000Z,195,Agriculture +2009-09-01T07:00:00.000Z,150,Agriculture +2009-10-01T07:00:00.000Z,166,Agriculture +2009-11-01T07:00:00.000Z,180,Agriculture +2009-12-01T08:00:00.000Z,292,Agriculture +2010-01-01T08:00:00.000Z,318,Agriculture +2010-02-01T08:00:00.000Z,285,Agriculture +2000-01-01T08:00:00.000Z,239,Self-employed +2000-02-01T08:00:00.000Z,262,Self-employed +2000-03-01T08:00:00.000Z,213,Self-employed +2000-04-01T08:00:00.000Z,218,Self-employed +2000-05-01T07:00:00.000Z,206,Self-employed +2000-06-01T07:00:00.000Z,188,Self-employed +2000-07-01T07:00:00.000Z,222,Self-employed +2000-08-01T07:00:00.000Z,186,Self-employed +2000-09-01T07:00:00.000Z,213,Self-employed +2000-10-01T07:00:00.000Z,226,Self-employed +2000-11-01T08:00:00.000Z,273,Self-employed +2000-12-01T08:00:00.000Z,178,Self-employed +2001-01-01T08:00:00.000Z,194,Self-employed +2001-02-01T08:00:00.000Z,209,Self-employed +2001-03-01T08:00:00.000Z,181,Self-employed +2001-04-01T08:00:00.000Z,216,Self-employed +2001-05-01T07:00:00.000Z,206,Self-employed +2001-06-01T07:00:00.000Z,187,Self-employed +2001-07-01T07:00:00.000Z,191,Self-employed +2001-08-01T07:00:00.000Z,243,Self-employed +2001-09-01T07:00:00.000Z,256,Self-employed +2001-10-01T07:00:00.000Z,247,Self-employed +2001-11-01T08:00:00.000Z,234,Self-employed +2001-12-01T08:00:00.000Z,249,Self-employed +2002-01-01T08:00:00.000Z,263,Self-employed +2002-02-01T08:00:00.000Z,250,Self-employed +2002-03-01T08:00:00.000Z,217,Self-employed +2002-04-01T08:00:00.000Z,255,Self-employed +2002-05-01T07:00:00.000Z,264,Self-employed +2002-06-01T07:00:00.000Z,246,Self-employed +2002-07-01T07:00:00.000Z,249,Self-employed +2002-08-01T07:00:00.000Z,271,Self-employed +2002-09-01T07:00:00.000Z,266,Self-employed +2002-10-01T07:00:00.000Z,275,Self-employed +2002-11-01T08:00:00.000Z,297,Self-employed +2002-12-01T08:00:00.000Z,327,Self-employed +2003-01-01T08:00:00.000Z,324,Self-employed +2003-02-01T08:00:00.000Z,304,Self-employed +2003-03-01T08:00:00.000Z,279,Self-employed +2003-04-01T08:00:00.000Z,248,Self-employed +2003-05-01T07:00:00.000Z,271,Self-employed +2003-06-01T07:00:00.000Z,295,Self-employed +2003-07-01T07:00:00.000Z,270,Self-employed +2003-08-01T07:00:00.000Z,302,Self-employed +2003-09-01T07:00:00.000Z,287,Self-employed +2003-10-01T07:00:00.000Z,338,Self-employed +2003-11-01T08:00:00.000Z,308,Self-employed +2003-12-01T08:00:00.000Z,299,Self-employed +2004-01-01T08:00:00.000Z,302,Self-employed +2004-02-01T08:00:00.000Z,260,Self-employed +2004-03-01T08:00:00.000Z,260,Self-employed +2004-04-01T08:00:00.000Z,242,Self-employed +2004-05-01T07:00:00.000Z,287,Self-employed +2004-06-01T07:00:00.000Z,306,Self-employed +2004-07-01T07:00:00.000Z,291,Self-employed +2004-08-01T07:00:00.000Z,324,Self-employed +2004-09-01T07:00:00.000Z,362,Self-employed +2004-10-01T07:00:00.000Z,301,Self-employed +2004-11-01T08:00:00.000Z,353,Self-employed +2004-12-01T08:00:00.000Z,341,Self-employed +2005-01-01T08:00:00.000Z,346,Self-employed +2005-02-01T08:00:00.000Z,363,Self-employed +2005-03-01T08:00:00.000Z,312,Self-employed +2005-04-01T08:00:00.000Z,273,Self-employed +2005-05-01T07:00:00.000Z,299,Self-employed +2005-06-01T07:00:00.000Z,268,Self-employed +2005-07-01T07:00:00.000Z,282,Self-employed +2005-08-01T07:00:00.000Z,249,Self-employed +2005-09-01T07:00:00.000Z,282,Self-employed +2005-10-01T07:00:00.000Z,255,Self-employed +2005-11-01T08:00:00.000Z,319,Self-employed +2005-12-01T08:00:00.000Z,327,Self-employed +2006-01-01T08:00:00.000Z,341,Self-employed +2006-02-01T08:00:00.000Z,332,Self-employed +2006-03-01T08:00:00.000Z,300,Self-employed +2006-04-01T08:00:00.000Z,334,Self-employed +2006-05-01T07:00:00.000Z,251,Self-employed +2006-06-01T07:00:00.000Z,245,Self-employed +2006-07-01T07:00:00.000Z,291,Self-employed +2006-08-01T07:00:00.000Z,306,Self-employed +2006-09-01T07:00:00.000Z,299,Self-employed +2006-10-01T07:00:00.000Z,275,Self-employed +2006-11-01T08:00:00.000Z,257,Self-employed +2006-12-01T08:00:00.000Z,287,Self-employed +2007-01-01T08:00:00.000Z,376,Self-employed +2007-02-01T08:00:00.000Z,300,Self-employed +2007-03-01T08:00:00.000Z,311,Self-employed +2007-04-01T07:00:00.000Z,240,Self-employed +2007-05-01T07:00:00.000Z,276,Self-employed +2007-06-01T07:00:00.000Z,258,Self-employed +2007-07-01T07:00:00.000Z,324,Self-employed +2007-08-01T07:00:00.000Z,315,Self-employed +2007-09-01T07:00:00.000Z,304,Self-employed +2007-10-01T07:00:00.000Z,338,Self-employed +2007-11-01T07:00:00.000Z,336,Self-employed +2007-12-01T08:00:00.000Z,326,Self-employed +2008-01-01T08:00:00.000Z,338,Self-employed +2008-02-01T08:00:00.000Z,340,Self-employed +2008-03-01T08:00:00.000Z,346,Self-employed +2008-04-01T07:00:00.000Z,338,Self-employed +2008-05-01T07:00:00.000Z,366,Self-employed +2008-06-01T07:00:00.000Z,364,Self-employed +2008-07-01T07:00:00.000Z,345,Self-employed +2008-08-01T07:00:00.000Z,378,Self-employed +2008-09-01T07:00:00.000Z,414,Self-employed +2008-10-01T07:00:00.000Z,396,Self-employed +2008-11-01T07:00:00.000Z,411,Self-employed +2008-12-01T08:00:00.000Z,559,Self-employed +2009-01-01T08:00:00.000Z,659,Self-employed +2009-02-01T08:00:00.000Z,586,Self-employed +2009-03-01T08:00:00.000Z,625,Self-employed +2009-04-01T07:00:00.000Z,488,Self-employed +2009-05-01T07:00:00.000Z,530,Self-employed +2009-06-01T07:00:00.000Z,472,Self-employed +2009-07-01T07:00:00.000Z,552,Self-employed +2009-08-01T07:00:00.000Z,569,Self-employed +2009-09-01T07:00:00.000Z,636,Self-employed +2009-10-01T07:00:00.000Z,610,Self-employed +2009-11-01T07:00:00.000Z,592,Self-employed +2009-12-01T08:00:00.000Z,609,Self-employed +2010-01-01T08:00:00.000Z,730,Self-employed +2010-02-01T08:00:00.000Z,680,Self-employed diff --git a/config-examples.yaml b/config-examples.yaml index 0872ffbc3..dc9084826 100644 --- a/config-examples.yaml +++ b/config-examples.yaml @@ -197,6 +197,39 @@ dataCubes: title: Records count formula: $main.count() + - name: unemployment + title: Unemployment Across Industries + description: | + Data cube with unemployment count across industriess in 2000-2010. + --- + *Based on vega-datasets*. [Source repository](https://github.com/vega/vega-datasets/blob/master/data/unemployment-across-industries.json) + clusterName: native + source: assets/data/unemployment-2016-02-18.csv + timeAttribute: date + + refreshRule: + rule: fixed + time: 2010-02-01T08:00:00.000Z + + defaultDuration: P1M + defaultSortMeasure: count + defaultSelectedMeasures: [ "count" ] + introspection: no-autofill + dimensions: + - name: date + title: Date + kind: time + formula: $date + + - name: industry + title: Industry + formula: $industry + + measures: + - name: count + title: Count + formula: $main.sum($count) + - name: wiki title: Wikipedia description: | diff --git a/cypress/integration/csv-data-source.spec.js b/cypress/integration/csv-data-source.spec.js new file mode 100644 index 000000000..010269811 --- /dev/null +++ b/cypress/integration/csv-data-source.spec.js @@ -0,0 +1,71 @@ +context('CSV Data Source', () => { + + const count = () => cy.get('.total .measure-value'); + const leftGutter = () => cy.get('.table .left-gutter'); + const body = () => cy.get('.table .body'); + const splitValue = (idx) => leftGutter().get(`.split-value:nth-child(${idx})`); + const measureValue = (idx) => body().get(`.measure-row:nth-child(${idx}) .measure-label`); + + function assertDates(...dates) { + dates.forEach((date, idx) => { + splitValue(idx + 1).should('contain', date); + }); + } + + function assertValues(...values) { + values.forEach((value, idx) => { + measureValue(idx + 1).should('contain', value); + }); + } + + describe('Data load', () => { + const urls = { + baseView: 'http://localhost:9090/#unemployment/4/N4IgbglgzgrghgGwgLzgFwgewHYgFwhqZqJQgA0408SqGOAygKZobYDmZe2MCClGALZNkOJvhABRNAGMA9AFUAKgGEKIAGYQEaJgCcuAbVBoAngAdxBIeMp6mGiQBN0twhGEAFfVidHQTjB66Fi4BJ4AjACy6lC65vgAtBECFlYgCK5xIAC+ALr5lFDmSGhGeUU+TP4g9hr6TNgy6TKYMNho6hqYeoLo+CZpzg5wvJ2UYIgw6bmplhLCcLD2uRUg5hDY2ExOACIejVCh5ZQbWzsMPZ0Ere2dOUA=', + lastYearTable: 'http://localhost:9090/#unemployment/4/N4IgbglgzgrghgGwgLzgFwgewHYgFwhpwBGCApiADTjTxKoY4DKZaG2A5lPqAMaYIEcAA5QyAJUwB3bngBmiMQF9qGALZlkOCgQCiaXgHoAqgBUAwlRByICNGQBOsgNqg0AT2E7CEDVYdkcvggACboFKq+ZAAKjlghLqAhMA7oWLgE0QCMAJpWUPbC+AC0Waqe3kL2BSBKALr11FDCSGiJhBXB6hGhUdhQ6cFh9lYcqdgwQg4QHsHZALL5mA5oPCABQQTDPR5eQ30DOFYhEAG8jBkgcFC8ZNgnnLXUSGoz+BOCjSBi02TtG447rdgvwYNhVtQ5Ms1Og1rtvCFAnBJhDwIgYN4nh09gQNNcUhQvsIINhsGQQgARA7pFx1ajE0nkpjLVYEUHg2pAA=' + }; + + it('should load last month count', () => { + cy.visit(urls.baseView); + + count().should('contain', '15.0 k'); + }); + + it('should load table for last year counts', () => { + cy.visit(urls.lastYearTable); + + assertDates( + 'Total', + '1 Mar 2009', + '1 Apr 2009', + '1 May 2009', + '1 Jun 2009', + '1 Jul 2009', + '1 Aug 2009', + '1 Sep 2009', + '1 Oct 2009', + '1 Nov 2009', + '1 Dec 2009', + '1 Jan 2010', + '1 Feb 2010' + ); + + assertValues( + '163.7 k', + '13.2 k', + '12.5 k', + '13.0 k', + '13.7 k', + '13.8 k', + '13.6 k', + '13.4 k', + '13.5 k', + '13.2 k', + '13.7 k', + '15.1 k', + '15.0 k' + ); + + }); + + }); +}); diff --git a/cypress/integration/home-page.spec.js b/cypress/integration/home-page.spec.js index ac9a7cfa9..a53b7d5f7 100644 --- a/cypress/integration/home-page.spec.js +++ b/cypress/integration/home-page.spec.js @@ -7,11 +7,14 @@ context("Home Page", () => { cy.visit("http://localhost:9090"); }); - it("should load Covid datacube", () => { getCubeCard("COVID").should("exist"); }); + it("should load Unemployment datacube", () => { + getCubeCard("Unemployment").should("exist"); + }); + it("should load Wikipedia datacube", () => { getCubeCard("Wikipedia").should("exist"); }); diff --git a/package-lock.json b/package-lock.json index 7d18c64a9..5ee3abaaf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,7 +5,7 @@ "requires": true, "packages": { "": { - "version": "1.31.0", + "version": "1.32.0-beta.1", "license": "Apache-2.0", "dependencies": { "@sentry/browser": "5.0.6", @@ -53,6 +53,7 @@ "@types/chai-datetime": "0.0.33", "@types/compression": "0.0.35", "@types/d3": "3.5.40", + "@types/d3-dsv": "2.0.0", "@types/d3-scale": "2.1.1", "@types/enzyme": "3.1.11", "@types/express": "4.11.0", @@ -92,6 +93,7 @@ "css-loader": "2.1.1", "css-modules-require-hook": "4.2.3", "cypress": "3.4.1", + "d3-dsv": "2.0.0", "enzyme": "3.3.0", "enzyme-adapter-react-16": "1.7.1", "ignore-styles": "5.0.1", @@ -1251,6 +1253,12 @@ "integrity": "sha512-GrJeI6Yg6uCIYRtWlMGxDtgsKSs2aMW0edrO/GJk+O7y4iayn8lEoHAn50wkjb9voRq9JimhCN/FIXLzAxkCoA==", "dev": true }, + "node_modules/@types/d3-dsv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-2.0.0.tgz", + "integrity": "sha512-wYqy7T8tQ/DmocwxmlPujllLI5fg3lb6/FrVVWkLUD+NsRV+kcE4nbRZg10G9yjJ8pK2ZXqu+VP5jQbN13uNRQ==", + "dev": true + }, "node_modules/@types/d3-scale": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-2.1.1.tgz", @@ -4139,6 +4147,28 @@ "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.0.tgz", "integrity": "sha512-TzNPeJy2+iEepfiL92LAAB7fvnp/dV2YwANPVHdDWmYMm23qIJBYww3qT8I8C1wXrmrg4UWs7BKc2tKIgyjzHg==" }, + "node_modules/d3-dsv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-2.0.0.tgz", + "integrity": "sha512-E+Pn8UJYx9mViuIUkoc93gJGGYut6mSDKy2+XaPwccwkRGlR+LO97L2VCCRjQivTwLHkSnAJG7yo00BWY6QM+w==", + "dev": true, + "dependencies": { + "commander": "2", + "iconv-lite": "0.4", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json", + "csv2tsv": "bin/dsv2dsv", + "dsv2dsv": "bin/dsv2dsv", + "dsv2json": "bin/dsv2json", + "json2csv": "bin/json2dsv", + "json2dsv": "bin/json2dsv", + "json2tsv": "bin/json2dsv", + "tsv2csv": "bin/dsv2dsv", + "tsv2json": "bin/dsv2json" + } + }, "node_modules/d3-format": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.2.tgz", @@ -12157,6 +12187,12 @@ "aproba": "^1.1.1" } }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=", + "dev": true + }, "node_modules/rx": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", @@ -16601,6 +16637,12 @@ "integrity": "sha512-GrJeI6Yg6uCIYRtWlMGxDtgsKSs2aMW0edrO/GJk+O7y4iayn8lEoHAn50wkjb9voRq9JimhCN/FIXLzAxkCoA==", "dev": true }, + "@types/d3-dsv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-2.0.0.tgz", + "integrity": "sha512-wYqy7T8tQ/DmocwxmlPujllLI5fg3lb6/FrVVWkLUD+NsRV+kcE4nbRZg10G9yjJ8pK2ZXqu+VP5jQbN13uNRQ==", + "dev": true + }, "@types/d3-scale": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-2.1.1.tgz", @@ -19207,6 +19249,17 @@ "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.0.tgz", "integrity": "sha512-TzNPeJy2+iEepfiL92LAAB7fvnp/dV2YwANPVHdDWmYMm23qIJBYww3qT8I8C1wXrmrg4UWs7BKc2tKIgyjzHg==" }, + "d3-dsv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-2.0.0.tgz", + "integrity": "sha512-E+Pn8UJYx9mViuIUkoc93gJGGYut6mSDKy2+XaPwccwkRGlR+LO97L2VCCRjQivTwLHkSnAJG7yo00BWY6QM+w==", + "dev": true, + "requires": { + "commander": "2", + "iconv-lite": "0.4", + "rw": "1" + } + }, "d3-format": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.2.tgz", @@ -25902,6 +25955,12 @@ "aproba": "^1.1.1" } }, + "rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=", + "dev": true + }, "rx": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", diff --git a/package.json b/package.json index e1cd5ea9a..095c8bf83 100644 --- a/package.json +++ b/package.json @@ -105,6 +105,7 @@ "@types/chai-datetime": "0.0.33", "@types/compression": "0.0.35", "@types/d3": "3.5.40", + "@types/d3-dsv": "2.0.0", "@types/d3-scale": "2.1.1", "@types/enzyme": "3.1.11", "@types/express": "4.11.0", @@ -144,6 +145,7 @@ "css-loader": "2.1.1", "css-modules-require-hook": "4.2.3", "cypress": "3.4.1", + "d3-dsv": "2.0.0", "enzyme": "3.3.0", "enzyme-adapter-react-16": "1.7.1", "ignore-styles": "5.0.1", diff --git a/src/server/utils/file-manager/file-manager.ts b/src/server/utils/file-manager/file-manager.ts index 8f6b68df3..41aa15190 100644 --- a/src/server/utils/file-manager/file-manager.ts +++ b/src/server/utils/file-manager/file-manager.ts @@ -20,7 +20,7 @@ import * as path from "path"; import { Dataset, Expression, PseudoDatum } from "plywood"; import { Logger } from "../../../common/logger/logger"; import { noop } from "../../../common/utils/functional/functional"; -import { parseData } from "../../../common/utils/parser/parser"; +import { parseData } from "../parser/parser"; export function getFileData(filePath: string): Promise { return fs.readFile(filePath, "utf-8") diff --git a/src/common/utils/parser/parser.ts b/src/server/utils/parser/parser.ts similarity index 93% rename from src/common/utils/parser/parser.ts rename to src/server/utils/parser/parser.ts index 1a1c01d89..a4a4ad4ca 100644 --- a/src/common/utils/parser/parser.ts +++ b/src/server/utils/parser/parser.ts @@ -15,14 +15,14 @@ * limitations under the License. */ -import * as d3 from "d3"; +import { autoType, csvParse, tsvParse } from "d3-dsv"; export function parseCSV(text: string): any[] { - return d3.csv.parse(text); + return csvParse(text, autoType); } export function parseTSV(text: string): any[] { - return d3.tsv.parse(text); + return tsvParse(text, autoType); } export function parseJSON(text: string): any[] { From b0e92c36b5152f21ae1905da64e8d26f815daf74 Mon Sep 17 00:00:00 2001 From: adrianmroz <78143552+adrianmroz-allegro@users.noreply.github.com> Date: Thu, 6 May 2021 16:07:20 +0200 Subject: [PATCH 016/264] customization new settings (#742) * Reorganize Customization as POJsOs. * Move deserializers to client directory, so we don't reference bundle dependencies in server application (#745) * week start configuration (#743) * Locale section in Customization settings * cyclicShift example * Pass Locale to date-range-picker and use to select days names based on locale settings * Export file encoding is specified in Locale configuration. (#747) * Rename /sources endpoint * AppSettings tests * Few more tests --- package-lock.json | 1 + package.json | 1 + .../turnilo-application.tsx | 4 +- .../date-range-picker/calendar.mocha.ts | 13 +- .../components/date-range-picker/calendar.ts | 4 +- .../date-range-picker.mocha.tsx | 3 + .../date-range-picker/date-range-picker.tsx | 13 +- .../filter-menu/filter-menu.mocha.tsx | 2 + .../components/filter-menu/filter-menu.tsx | 2 + .../time-filter-menu/fixed-time-tab.tsx | 5 +- .../time-filter-menu/time-filter-menu.tsx | 6 +- .../filter-tile/filter-tile.mocha.tsx | 3 +- .../components/filter-tile/filter-tile.tsx | 8 +- .../components/header-bar/header-bar.tsx | 4 +- .../components/share-menu/share-menu.tsx | 18 +- .../components/side-drawer/side-drawer.tsx | 4 +- .../sources-provider/sources-provider.tsx | 4 +- src/client/config/constants.ts | 11 - src/client/deserializers/app-settings.ts | 28 ++ src/client/deserializers/customization.ts | 32 ++ .../deserializers/oauth.ts} | 17 +- src/client/deserializers/sources.ts | 39 ++ src/client/main.tsx | 5 +- .../modals/raw-data-modal/raw-data-modal.tsx | 10 +- src/client/utils/ajax/ajax.ts | 11 +- src/client/utils/download/download.mocha.ts | 3 - src/client/utils/download/download.ts | 65 +-- .../cube-header-bar/cube-header-bar.tsx | 6 +- .../views/cube-view/cube-view.mocha.tsx | 4 +- src/client/views/cube-view/cube-view.tsx | 11 +- src/client/views/home-view/home-view.tsx | 4 +- .../app-settings/app-settings.fixtures.ts | 53 +- .../models/app-settings/app-settings.mocha.ts | 454 ++++++------------ .../models/app-settings/app-settings.ts | 44 +- .../customization/customization.fixtures.ts | 38 ++ .../customization/customization.mocha.ts | 286 +++++++++-- .../models/customization/customization.ts | 295 +++++------- src/common/models/locale/locale.mocha.ts | 45 ++ src/common/models/locale/locale.ts | 64 +++ src/common/models/oauth/oauth.ts | 4 - src/common/models/sources/sources.ts | 19 - .../url-shortener/url-shortener.fixtures.ts | 4 - .../models/url-shortener/url-shortener.ts | 36 +- .../utils/functional/functional.mocha.ts | 8 +- src/common/utils/functional/functional.ts | 5 + src/common/utils/time/time.ts | 8 +- src/server/app.ts | 2 +- src/server/routes/shorten/shorten.mocha.ts | 4 +- src/server/routes/shorten/shorten.ts | 2 +- src/server/routes/turnilo/turnilo.ts | 9 +- src/server/views.ts | 18 +- 51 files changed, 944 insertions(+), 795 deletions(-) create mode 100644 src/client/deserializers/app-settings.ts create mode 100644 src/client/deserializers/customization.ts rename src/{common/models/url-shortener/url-shortener.mocha.ts => client/deserializers/oauth.ts} (56%) create mode 100644 src/client/deserializers/sources.ts create mode 100644 src/common/models/customization/customization.fixtures.ts create mode 100644 src/common/models/locale/locale.mocha.ts create mode 100644 src/common/models/locale/locale.ts diff --git a/package-lock.json b/package-lock.json index 5ee3abaaf..4f3dc65db 100644 --- a/package-lock.json +++ b/package-lock.json @@ -96,6 +96,7 @@ "d3-dsv": "2.0.0", "enzyme": "3.3.0", "enzyme-adapter-react-16": "1.7.1", + "iconv-lite": "0.4.19", "ignore-styles": "5.0.1", "immutable-class-tester": "0.5.12", "jsdom": "9.4.2", diff --git a/package.json b/package.json index 095c8bf83..c7b4370b1 100644 --- a/package.json +++ b/package.json @@ -148,6 +148,7 @@ "d3-dsv": "2.0.0", "enzyme": "3.3.0", "enzyme-adapter-react-16": "1.7.1", + "iconv-lite": "0.4.19", "ignore-styles": "5.0.1", "immutable-class-tester": "0.5.12", "jsdom": "9.4.2", diff --git a/src/client/applications/turnilo-application/turnilo-application.tsx b/src/client/applications/turnilo-application/turnilo-application.tsx index c78d254bd..143410b6d 100644 --- a/src/client/applications/turnilo-application/turnilo-application.tsx +++ b/src/client/applications/turnilo-application/turnilo-application.tsx @@ -17,7 +17,7 @@ import { NamedArray } from "immutable-class"; import * as React from "react"; -import { AppSettings } from "../../../common/models/app-settings/app-settings"; +import { ClientAppSettings } from "../../../common/models/app-settings/app-settings"; import { DataCube } from "../../../common/models/data-cube/data-cube"; import { Essence } from "../../../common/models/essence/essence"; import { isEnabled as isOAuthEnabled } from "../../../common/models/oauth/oauth"; @@ -42,7 +42,7 @@ import { cube, generalError, home, oauthCodeHandler, oauthMessageView, View } fr export interface TurniloApplicationProps { version: string; maxFilters?: number; - appSettings: AppSettings; + appSettings: ClientAppSettings; initTimekeeper?: Timekeeper; } diff --git a/src/client/components/date-range-picker/calendar.mocha.ts b/src/client/components/date-range-picker/calendar.mocha.ts index a6113e08a..3c772e47e 100644 --- a/src/client/components/date-range-picker/calendar.mocha.ts +++ b/src/client/components/date-range-picker/calendar.mocha.ts @@ -17,7 +17,7 @@ import { expect, use } from "chai"; import * as chaiDatetime from "chai-datetime"; import { Timezone } from "chronoshift"; import { tz as getMomentWithTimezone } from "moment-timezone"; -import { getLocale } from "../../config/constants"; +import { LOCALES } from "../../../common/models/locale/locale"; import { calendarDays, monthToWeeks, nextNDates, previousNDates } from "./calendar"; use(chaiDatetime); @@ -39,6 +39,7 @@ function assertEqualCalendarMatrix(a: Date[][], b: Date[][]) { } const utc = Timezone.UTC; +const en_us = LOCALES.EN_US; const warsawTZ = Timezone.fromJS("Europe/Warsaw"); const getDateInTimezone = (day: string, timezone: Timezone) => getMomentWithTimezone(day, timezone.toString()).toDate(); @@ -59,13 +60,13 @@ describe("monthToWeeks", () => { it("should calculate for UTC (no DST)", () => { const firstMarch2010 = getDateInTimezone("2010-03-01", utc); const utcMarch2010 = convertDatesToTimezone(march2010Weeks, utc); - assertEqualCalendarMatrix(monthToWeeks(firstMarch2010, utc, getLocale()), utcMarch2010); + assertEqualCalendarMatrix(monthToWeeks(firstMarch2010, utc, en_us), utcMarch2010); }); it("should calculate for Warsaw (DST)", () => { const firstMarch2010 = getDateInTimezone("2010-03-01", warsawTZ); const warsawMarch2010 = convertDatesToTimezone(march2010Weeks, warsawTZ); - assertEqualCalendarMatrix(monthToWeeks(firstMarch2010, warsawTZ, getLocale()), warsawMarch2010); + assertEqualCalendarMatrix(monthToWeeks(firstMarch2010, warsawTZ, en_us), warsawMarch2010); }); }); @@ -81,13 +82,13 @@ describe("monthToWeeks", () => { it("should calculate for UTC october (no DST)", () => { const firstOctober2019 = getDateInTimezone("2019-10-01", utc); const utcOctober2019 = convertDatesToTimezone(october2019Weeks, utc); - assertEqualCalendarMatrix(monthToWeeks(firstOctober2019, utc, getLocale()), utcOctober2019); + assertEqualCalendarMatrix(monthToWeeks(firstOctober2019, utc, en_us), utcOctober2019); }); it("should calculate for Warsaw october (DST)", () => { const firstOctober2019 = getDateInTimezone("2019-10-01", warsawTZ); const warsawOctober2019 = convertDatesToTimezone(october2019Weeks, warsawTZ); - assertEqualCalendarMatrix(monthToWeeks(firstOctober2019, warsawTZ, getLocale()), warsawOctober2019); + assertEqualCalendarMatrix(monthToWeeks(firstOctober2019, warsawTZ, en_us), warsawOctober2019); }); }); }); @@ -103,7 +104,7 @@ describe("calendarDays", () => { ["2010-03-28", "2010-03-29", "2010-03-30", "2010-03-31", "2010-04-01", "2010-04-02", "2010-04-03"] ]; const utcMarch2010CalendarPage = convertDatesToTimezone(march2010, utc); - assertEqualCalendarMatrix(calendarDays(firstMarch2010, utc, getLocale()), utcMarch2010CalendarPage); + assertEqualCalendarMatrix(calendarDays(firstMarch2010, utc, en_us), utcMarch2010CalendarPage); }); }); diff --git a/src/client/components/date-range-picker/calendar.ts b/src/client/components/date-range-picker/calendar.ts index ad926c63f..3dbf08151 100644 --- a/src/client/components/date-range-picker/calendar.ts +++ b/src/client/components/date-range-picker/calendar.ts @@ -14,9 +14,9 @@ * limitations under the License. */ import { day, Timezone } from "chronoshift"; -import { Moment } from "moment-timezone/moment-timezone"; +import { Locale } from "../../../common/models/locale/locale"; import { range } from "../../../common/utils/functional/functional"; -import { getMoment, Locale } from "../../../common/utils/time/time"; +import { getMoment } from "../../../common/utils/time/time"; export function calendarDays(startDay: Date, timezone: Timezone, locale: Locale): Date[][] { const monthWeeks = monthToWeeks(startDay, timezone, locale); diff --git a/src/client/components/date-range-picker/date-range-picker.mocha.tsx b/src/client/components/date-range-picker/date-range-picker.mocha.tsx index d324e18cc..b7482f146 100644 --- a/src/client/components/date-range-picker/date-range-picker.mocha.tsx +++ b/src/client/components/date-range-picker/date-range-picker.mocha.tsx @@ -20,6 +20,7 @@ import { Timezone } from "chronoshift"; import * as React from "react"; import * as ReactDOM from "react-dom"; import * as TestUtils from "react-dom/test-utils"; +import { LOCALES } from "../../../common/models/locale/locale"; import { renderIntoDocument } from "../../utils/test-utils"; import { DateRangePicker } from "./date-range-picker"; @@ -27,6 +28,7 @@ describe("DateRangePicker", () => { it("adds the correct class", () => { var renderedComponent = renderIntoDocument( { expect(() => { renderIntoDocument( void; onEndChange: (t: Date) => void; + locale: Locale; } export interface DateRangePickerState { @@ -154,8 +156,8 @@ export class DateRangePicker extends React.Component
@@ -195,7 +198,7 @@ export class DateRangePicker extends React.Component {this.renderCalendarNav(activeMonthStartDate)}
- {getLocale().shortDays.map((day, i) => { + {days.map((day, i) => { return
{day}
; }) } diff --git a/src/client/components/filter-menu/filter-menu.mocha.tsx b/src/client/components/filter-menu/filter-menu.mocha.tsx index e9fb56455..cf0f85344 100644 --- a/src/client/components/filter-menu/filter-menu.mocha.tsx +++ b/src/client/components/filter-menu/filter-menu.mocha.tsx @@ -19,6 +19,7 @@ import { expect } from "chai"; import * as React from "react"; import { DimensionFixtures } from "../../../common/models/dimension/dimension.fixtures"; import { EssenceFixtures } from "../../../common/models/essence/essence.fixtures"; +import { LOCALES } from "../../../common/models/locale/locale"; import { TimekeeperFixtures } from "../../../common/models/timekeeper/timekeeper.fixtures"; import { findDOMNode, renderIntoDocument } from "../../utils/test-utils"; import { FilterMenu } from "./filter-menu"; @@ -28,6 +29,7 @@ class Wrap extends React.Component { return this.setState({ tab }); render() { - const { essence, timekeeper, clicker, dimension, onClose, containerStage, openOn, inside } = this.props; + const { essence, timekeeper, clicker, dimension, onClose, containerStage, locale, openOn, inside } = this.props; if (!dimension) return null; const { tab } = this.state; const menuSize = Stage.fromSize(MENU_WIDTH, 410); const isRelativeTab = tab === TimeFilterTab.RELATIVE; - const tabProps = { essence, dimension, timekeeper, onClose, clicker }; + const tabProps = { essence, dimension, timekeeper, onClose, clicker, locale }; return { essence={EssenceFixtures.wikiTotals()} timekeeper={TimekeeperFixtures.fixed()} menuStage={null} - /> + locale={LOCALES.EN_US}/> ); expect(TestUtils.isCompositeComponent(renderedComponent), "should be composite").to.equal(true); diff --git a/src/client/components/filter-tile/filter-tile.tsx b/src/client/components/filter-tile/filter-tile.tsx index 9880a1b2e..385c34981 100644 --- a/src/client/components/filter-tile/filter-tile.tsx +++ b/src/client/components/filter-tile/filter-tile.tsx @@ -23,6 +23,7 @@ import { Dimension } from "../../../common/models/dimension/dimension"; import { DragPosition } from "../../../common/models/drag-position/drag-position"; import { Essence } from "../../../common/models/essence/essence"; import { FilterClause, isTimeFilter } from "../../../common/models/filter-clause/filter-clause"; +import { Locale } from "../../../common/models/locale/locale"; import { Stage } from "../../../common/models/stage/stage"; import { Timekeeper } from "../../../common/models/timekeeper/timekeeper"; import { getFormattedClause } from "../../../common/utils/formatter/formatter"; @@ -39,7 +40,6 @@ import { SvgIcon } from "../svg-icon/svg-icon"; import "./filter-tile.scss"; const FILTER_CLASS_NAME = "filter"; -const ANIMATION_DURATION = 400; export interface ItemBlank { dimension: Dimension; @@ -55,6 +55,7 @@ export interface FilterTileProps { clicker: Clicker; essence: Essence; timekeeper: Timekeeper; + locale: Locale; menuStage: Stage; } @@ -350,7 +351,7 @@ export class FilterTile extends React.Component; - customization: Customization; + customization: ClientCustomization; urlForEssence: (essence: Essence) => string; getDownloadableDataset?: () => DataSetWithTabOptions; } -type ExportProps = Pick; +type ExportProps = Pick; function onExport(fileFormat: FileFormat, props: ExportProps) { - const { onClose, getDownloadableDataset, essence, timekeeper } = props; + const { onClose, getDownloadableDataset, customization: { locale: { exportEncoding } } } = props; const dataSetWithTabOptions = getDownloadableDataset(); if (!dataSetWithTabOptions.dataset) return; - const { dataCube } = essence; - const effectiveFilter = essence.getEffectiveFilter(timekeeper); - - const fileName = makeFileName(dataCube.name, dateFromFilter(effectiveFilter)); - download(dataSetWithTabOptions, fileFormat, fileName); + download(dataSetWithTabOptions, fileFormat, "turnilo-export", exportEncoding); onClose(); } @@ -87,7 +83,7 @@ function linkItems({ essence, customization, timekeeper, onClose, urlForEssence, } - {customization.urlShortener && + {customization.hasUrlShortener &&
  • openShortenerModal(hash, isRelative ? STRINGS.copyRelativeTimeUrl : STRINGS.copyUrl)}> diff --git a/src/client/components/side-drawer/side-drawer.tsx b/src/client/components/side-drawer/side-drawer.tsx index 3050610c2..07adac916 100644 --- a/src/client/components/side-drawer/side-drawer.tsx +++ b/src/client/components/side-drawer/side-drawer.tsx @@ -17,7 +17,7 @@ import * as React from "react"; import * as ReactDOM from "react-dom"; -import { Customization } from "../../../common/models/customization/customization"; +import { ClientCustomization } from "../../../common/models/customization/customization"; import { DataCube } from "../../../common/models/data-cube/data-cube"; import { Essence } from "../../../common/models/essence/essence"; import { Ternary } from "../../../common/utils/functional/functional"; @@ -37,7 +37,7 @@ export interface SideDrawerProps { dataCubes: DataCube[]; onOpenAbout: Fn; onClose: Fn; - customization?: Customization; + customization?: ClientCustomization; changeDataCubeAndEssence: Ternary; } diff --git a/src/client/components/sources-provider/sources-provider.tsx b/src/client/components/sources-provider/sources-provider.tsx index 5c3b44a9f..5507bf5ea 100644 --- a/src/client/components/sources-provider/sources-provider.tsx +++ b/src/client/components/sources-provider/sources-provider.tsx @@ -15,7 +15,7 @@ */ import * as React from "react"; -import { AppSettings } from "../../../common/models/app-settings/app-settings"; +import { ClientAppSettings } from "../../../common/models/app-settings/app-settings"; import { Sources } from "../../../common/models/sources/sources"; import { Unary } from "../../../common/utils/functional/functional"; import { Ajax } from "../../utils/ajax/ajax"; @@ -55,7 +55,7 @@ const errored = (error: Error): SourcesRequest => ({ }); interface SourcesProviderProps { - appSettings: AppSettings; + appSettings: ClientAppSettings; children: Unary<{ sources: Sources }, React.ReactNode>; } diff --git a/src/client/config/constants.ts b/src/client/config/constants.ts index aed091545..16e529d78 100644 --- a/src/client/config/constants.ts +++ b/src/client/config/constants.ts @@ -15,7 +15,6 @@ * limitations under the License. */ -import { Locale } from "../../common/utils/time/time"; import { FileFormat } from "../utils/download/download"; export const TITLE_HEIGHT = 36; @@ -177,16 +176,6 @@ export const DATA_CUBES_STRATEGIES_LABELS = { "autofill-all": "Autofill all" }; -const EN_US: Locale = { - shortDays: ["S", "M", "T", "W", "T", "F", "S"], - shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], - weekStart: 0 -}; - -export function getLocale(): Locale { - return EN_US; -} - export const exportOptions: Array<{ label: string, fileFormat: FileFormat }> = [ { label: STRINGS.exportToCSV, fileFormat: "csv" }, { label: STRINGS.exportToTSV, fileFormat: "tsv" } diff --git a/src/client/deserializers/app-settings.ts b/src/client/deserializers/app-settings.ts new file mode 100644 index 000000000..35d80f28d --- /dev/null +++ b/src/client/deserializers/app-settings.ts @@ -0,0 +1,28 @@ +/* + * Copyright 2017-2021 Allegro.pl + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { ClientAppSettings, SerializedAppSettings } from "../../common/models/app-settings/app-settings"; +import { deserialize as customizationDeserialize } from "./customization"; +import { deserialize as oauthDeserialize } from "./oauth"; + +export function deserialize({ oauth, clientTimeout, customization, version }: SerializedAppSettings): ClientAppSettings { + return { + clientTimeout, + version, + customization: customizationDeserialize(customization), + oauth: oauthDeserialize(oauth) + }; +} diff --git a/src/client/deserializers/customization.ts b/src/client/deserializers/customization.ts new file mode 100644 index 000000000..01d0fe9c3 --- /dev/null +++ b/src/client/deserializers/customization.ts @@ -0,0 +1,32 @@ +/* + * Copyright 2017-2021 Allegro.pl + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Timezone } from "chronoshift"; +import { ClientCustomization, SerializedCustomization } from "../../common/models/customization/customization"; +import { deserialize as localeDeserialize } from "../../common/models/locale/locale"; + +export function deserialize(customization: SerializedCustomization): ClientCustomization { + const { headerBackground, locale, customLogoSvg, timezones, externalViews, hasUrlShortener, sentryDSN } = customization; + return { + headerBackground, + customLogoSvg, + externalViews, + hasUrlShortener, + sentryDSN, + locale: localeDeserialize(locale), + timezones: timezones.map(Timezone.fromJS) + }; +} diff --git a/src/common/models/url-shortener/url-shortener.mocha.ts b/src/client/deserializers/oauth.ts similarity index 56% rename from src/common/models/url-shortener/url-shortener.mocha.ts rename to src/client/deserializers/oauth.ts index adb8b503b..efba451a3 100644 --- a/src/common/models/url-shortener/url-shortener.mocha.ts +++ b/src/client/deserializers/oauth.ts @@ -1,5 +1,5 @@ /* - * Copyright 2017-2019 Allegro.pl + * Copyright 2017-2021 Allegro.pl * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,15 +14,8 @@ * limitations under the License. */ -import { testImmutableClass } from "immutable-class-tester"; -import { UrlShortener, UrlShortenerDef } from "./url-shortener"; -import { FailUrlShortenerJS, SuccessUrlShortenerJS } from "./url-shortener.fixtures"; +import { Oauth, SerializedOauth } from "../../common/models/oauth/oauth"; -describe("UrlShortener", () => { - it("is an immutable class", () => { - testImmutableClass(UrlShortener, [ - SuccessUrlShortenerJS, - FailUrlShortenerJS - ]); - }); -}); +export function deserialize(oauth: SerializedOauth): Oauth { + return oauth; +} diff --git a/src/client/deserializers/sources.ts b/src/client/deserializers/sources.ts new file mode 100644 index 000000000..8a6727524 --- /dev/null +++ b/src/client/deserializers/sources.ts @@ -0,0 +1,39 @@ +/* + * Copyright 2017-2021 Allegro.pl + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { ClientAppSettings } from "../../common/models/app-settings/app-settings"; +import { Cluster } from "../../common/models/cluster/cluster"; +import { findCluster } from "../../common/models/cluster/find-cluster"; +import { DataCube, DataCubeJS } from "../../common/models/data-cube/data-cube"; +import { SerializedSources, Sources } from "../../common/models/sources/sources"; +import { Ajax } from "../utils/ajax/ajax"; + +export function deserialize(settings: SerializedSources, appSettings: ClientAppSettings): Sources { + const clusters = settings.clusters.map(cluster => Cluster.fromJS(cluster)); + + const dataCubes = settings.dataCubes.map((dataCubeJS: DataCubeJS) => { + const cluster = findCluster(dataCubeJS, clusters); + let dataCubeObject = DataCube.fromJS(dataCubeJS, { cluster }); + const executor = Ajax.queryUrlExecutorFactory(dataCubeObject.name, appSettings); + dataCubeObject = dataCubeObject.attachExecutor(executor); + return dataCubeObject; + }); + + return { + clusters, + dataCubes + }; +} diff --git a/src/client/main.tsx b/src/client/main.tsx index eac9e89e6..bfa524ae9 100644 --- a/src/client/main.tsx +++ b/src/client/main.tsx @@ -17,10 +17,11 @@ import * as React from "react"; import * as ReactDOM from "react-dom"; -import { deserialize, SerializedAppSettings } from "../common/models/app-settings/app-settings"; +import { SerializedAppSettings } from "../common/models/app-settings/app-settings"; import { Timekeeper, TimekeeperJS } from "../common/models/timekeeper/timekeeper"; import { TurniloApplication } from "./applications/turnilo-application/turnilo-application"; import { Loader } from "./components/loader/loader"; +import { deserialize as deserializeAppSettings } from "./deserializers/app-settings"; import applyDragAndDropPolyfill from "./drag-and-drop-polyfill"; import "./main.scss"; import "./polyfills"; @@ -51,7 +52,7 @@ const version = config.version; Ajax.version = version; -const appSettings = deserialize(config.appSettings); +const appSettings = deserializeAppSettings(config.appSettings); if (config.appSettings.customization.sentryDSN) { errorReporterInit(config.appSettings.customization.sentryDSN, config.version); diff --git a/src/client/modals/raw-data-modal/raw-data-modal.tsx b/src/client/modals/raw-data-modal/raw-data-modal.tsx index a8013871e..c785b1bef 100644 --- a/src/client/modals/raw-data-modal/raw-data-modal.tsx +++ b/src/client/modals/raw-data-modal/raw-data-modal.tsx @@ -21,6 +21,7 @@ import { $, AttributeInfo, Dataset, Datum, Expression } from "plywood"; import * as React from "react"; import { DataCube } from "../../../common/models/data-cube/data-cube"; import { Essence } from "../../../common/models/essence/essence"; +import { Locale } from "../../../common/models/locale/locale"; import { Stage } from "../../../common/models/stage/stage"; import { Timekeeper } from "../../../common/models/timekeeper/timekeeper"; import { formatFilterClause } from "../../../common/utils/formatter/formatter"; @@ -32,7 +33,7 @@ import { QueryError } from "../../components/query-error/query-error"; import { Scroller, ScrollerLayout } from "../../components/scroller/scroller"; import { exportOptions, STRINGS } from "../../config/constants"; import { classNames } from "../../utils/dom/dom"; -import { dateFromFilter, download, FileFormat, makeFileName } from "../../utils/download/download"; +import { download, FileFormat } from "../../utils/download/download"; import { getVisibleSegments } from "../../utils/sizing/sizing"; import tabularOptions from "../../utils/tabular-options/tabular-options"; import "./raw-data-modal.scss"; @@ -49,6 +50,7 @@ export interface RawDataModalProps { onClose: Fn; essence: Essence; timekeeper: Timekeeper; + locale: Locale; } export interface RawDataModalState { @@ -290,12 +292,10 @@ export class RawDataModal extends React.Component { const method = "POST"; const url = "plywood"; @@ -72,9 +73,9 @@ export class Ajax { }; } - static sources(appSettings: AppSettings): Promise { + static sources(appSettings: ClientAppSettings): Promise { const headers = Ajax.headers(appSettings.oauth); - return axios.get("/settings", { headers }) + return axios.get("/sources", { headers }) .then(resp => resp.data) .catch(error => { throw mapOauthError(appSettings.oauth, error); diff --git a/src/client/utils/download/download.mocha.ts b/src/client/utils/download/download.mocha.ts index 96a237234..633ba5b59 100644 --- a/src/client/utils/download/download.mocha.ts +++ b/src/client/utils/download/download.mocha.ts @@ -36,9 +36,6 @@ describe("Download", () => { it("works as expected", () => { expect(getMIMEType("csv"), "csv").to.equal("text/csv"); expect(getMIMEType("tsv"), "tsv").to.equal("text/tsv"); - expect(getMIMEType(""), "csv").to.equal("application/json"); - expect(getMIMEType("json"), "csv").to.equal("application/json"); - expect(getMIMEType("invalid"), "csv").to.equal("application/json"); }); }); }); diff --git a/src/client/utils/download/download.ts b/src/client/utils/download/download.ts index d78a38d7f..569d123de 100644 --- a/src/client/utils/download/download.ts +++ b/src/client/utils/download/download.ts @@ -15,63 +15,44 @@ * limitations under the License. */ -import { Timezone } from "chronoshift"; -import * as filesaver from "file-saver"; -import { tz as getMomentWithTimezone } from "moment-timezone"; -import { Dataset, DatasetJSFull, TabulatorOptions } from "plywood"; -import { FixedTimeFilterClause } from "../../../common/models/filter-clause/filter-clause"; -import { Filter } from "../../../common/models/filter/filter"; -import { complement } from "../../../common/utils/functional/functional"; -import { isBlank } from "../../../common/utils/general/general"; +import * as fileSaver from "file-saver"; +import { Dataset, TabulatorOptions } from "plywood"; import { DataSetWithTabOptions } from "../../views/cube-view/cube-view"; -export type FileFormat = "csv" | "tsv" | "json"; +export type FileFormat = "csv" | "tsv"; -export function getMIMEType(fileType: string) { +export function getMIMEType(fileType: FileFormat) { switch (fileType) { case "csv": return "text/csv"; case "tsv": return "text/tsv"; - default: - return "application/json"; } } -export function download({ dataset, options }: DataSetWithTabOptions, fileFormat: FileFormat, fileName?: string): void { - const type = `${getMIMEType(fileFormat)};charset=utf-8`; - const blob = new Blob([datasetToFileString(dataset, fileFormat, options)], { type }); - if (!fileName) fileName = `${new Date()}-data`; - fileName += `.${fileFormat}`; - filesaver.saveAs(blob, fileName, true); // true == disable auto BOM +function saveFile(part: string | Buffer, fileName: string, fileFormat: FileFormat, fileEncoding: string) { + const type = `${getMIMEType(fileFormat)};charset=${fileEncoding}`; + const blob = new Blob([part], { type }); + fileSaver.saveAs(blob, `${fileName}.${fileFormat}`, true); // true == disable auto BOM } -export function datasetToFileString(dataset: Dataset, fileFormat: FileFormat, options?: TabulatorOptions): string { - if (fileFormat === "csv") { - return dataset.toCSV(options); - } else if (fileFormat === "tsv") { - return dataset.toTSV(options); - } else { - const datasetJS = dataset.toJS() as DatasetJSFull; - return JSON.stringify(datasetJS.data, null, 2); - } -} - -function dateToFileString(date: Date): string { - return getMomentWithTimezone(date, Timezone.UTC.toString()).format("YYYY-MM-DD_HH_mm_ss"); +function encodeContent(content: string, encoding: string): Promise { + if (encoding === "utf-8") return Promise.resolve(content); + return import("iconv-lite").then(iconv => iconv.encode(content, encoding)); } -export function dateFromFilter(filter: Filter): string { - const timeFilter: FixedTimeFilterClause = filter.clauses.find(clause => clause instanceof FixedTimeFilterClause) as FixedTimeFilterClause; - if (!timeFilter) return ""; - const { start, end } = timeFilter.values.first(); - return `${dateToFileString(start)}_${dateToFileString(end)}`; +export function download({ dataset, options }: DataSetWithTabOptions, fileFormat: FileFormat, fileName: string, fileEncoding: string) { + const result = datasetToFileString(dataset, fileFormat, options); + encodeContent(result, fileEncoding).then(content => { + saveFile(content, fileName, fileFormat, fileEncoding); + }); } -export function makeFileName(...nameComponents: string[]): string { - return nameComponents - .filter(complement(isBlank)) - .map(name => name.toLowerCase()) - .join("_") - .substr(0, 200); +export function datasetToFileString(dataset: Dataset, fileFormat: FileFormat, options?: TabulatorOptions): string { + switch (fileFormat) { + case "csv": + return dataset.toCSV(options); + case "tsv": + return dataset.toTSV(options); + } } diff --git a/src/client/views/cube-view/cube-header-bar/cube-header-bar.tsx b/src/client/views/cube-view/cube-header-bar/cube-header-bar.tsx index 5b6d1b01d..97fa2fce5 100644 --- a/src/client/views/cube-view/cube-header-bar/cube-header-bar.tsx +++ b/src/client/views/cube-view/cube-header-bar/cube-header-bar.tsx @@ -19,7 +19,7 @@ import { Duration, Timezone } from "chronoshift"; import { immutableEqual } from "immutable-class"; import * as React from "react"; import { Clicker } from "../../../../common/models/clicker/clicker"; -import { Customization } from "../../../../common/models/customization/customization"; +import { ClientCustomization } from "../../../../common/models/customization/customization"; import { Essence } from "../../../../common/models/essence/essence"; import { Timekeeper } from "../../../../common/models/timekeeper/timekeeper"; import { Binary } from "../../../../common/utils/functional/functional"; @@ -46,7 +46,7 @@ export interface CubeHeaderBarProps { openViewDefinitionModal?: Fn; openDruidQueryModal?: Fn; openUrlShortenerModal?: Binary; - customization?: Customization; + customization?: ClientCustomization; getDownloadableDataset?: () => DataSetWithTabOptions; changeTimezone?: (timezone: Timezone) => void; } @@ -186,7 +186,7 @@ export class CubeHeaderBar extends React.Component { const cubeView = mount( { renderRawDataModal() { const { showRawDataModal, essence, timekeeper } = this.state; + const { customization } = this.props; if (!showRawDataModal) return null; return ; } @@ -596,6 +598,7 @@ export class CubeView extends React.Component {
  • { -// var context = AppSettingsFixtures.getContext(); -// -// it("is an immutable class", () => { -// testImmutableClass( -// OldAppSettings, -// [ -// AppSettingsFixtures.wikiOnlyJS(), -// AppSettingsFixtures.wikiTwitterJS() -// ], -// { context }); -// }); -// -// describe("errors", () => { -// it("errors if there is no matching cluster", () => { -// var js = AppSettingsFixtures.wikiOnlyJS(); -// js.clusters = []; -// expect(() => OldAppSettings.fromJS(js, context)).to.throw("Can not find cluster 'druid-wiki' for data cube 'wiki'"); -// }); -// -// }); -// -// describe.skip("back compat", () => { -// it("works with dataSources", () => { -// var oldJS: any = AppSettingsFixtures.wikiOnlyJS(); -// oldJS.dataSources = oldJS.dataCubes; -// delete oldJS.dataCubes; -// expect(OldAppSettings.fromJS(oldJS, context).toJS()).to.deep.equal(AppSettingsFixtures.wikiOnlyJS()); -// }); -// -// it("deals with old config style", () => { -// var wikiDataCubeJS = DataCubeFixtures.WIKI_JS; -// delete wikiDataCubeJS.clusterName; -// (wikiDataCubeJS as any).engine = "druid"; -// -// var oldJS: any = { -// customization: {}, -// druidHost: "192.168.99.100", -// timeout: 30003, -// sourceListScan: "auto", -// sourceListRefreshInterval: 10001, -// sourceReintrospectInterval: 10002, -// sourceReintrospectOnLoad: true, -// dataSources: [ -// wikiDataCubeJS -// ] -// }; -// -// expect(OldAppSettings.fromJS(oldJS, context).toJS().clusters).to.deep.equal([ -// { -// name: "druid", -// type: "druid", -// host: "192.168.99.100", -// sourceListRefreshInterval: 10001, -// sourceListScan: "auto", -// sourceReintrospectInterval: 10002, -// sourceReintrospectOnLoad: true, -// timeout: 30003 -// } -// ]); -// }); -// -// it("deals with old config style no sourceListScan=disabled", () => { -// var oldJS: any = { -// druidHost: "192.168.99.100", -// sourceListScan: "disable", -// dataSources: [ -// { ...DataCubeFixtures.WIKI_JS, clusterName: "druid" } -// ] -// }; -// -// expect(OldAppSettings.fromJS(oldJS, context).toJS().clusters).to.deep.equal([ -// { -// host: "192.168.99.100", -// name: "druid", -// sourceListScan: "disable", -// type: "druid" -// } -// ]); -// }); -// -// }); -// -// describe("general", () => { -// it("blank", () => { -// expect(OldAppSettings.BLANK.toJS()).to.deep.equal({ -// clusters: [], -// customization: {}, -// dataCubes: [], -// clientTimeout: 0 -// }); -// }); -// -// it("converts to client settings", () => { -// const settings = AppSettingsFixtures.wikiOnlyWithExecutor(); -// -// expect(settings.toClientSettings().toJS()).to.deep.equal({ -// clusters: [ -// { -// name: "druid-wiki", -// timeout: 30000 -// } -// ], -// clientTimeout: 100, -// customization: { -// customLogoSvg: "ansvgstring", -// headerBackground: "brown", -// title: "Hello World" -// }, -// dataCubes: [ -// { -// attributes: [ -// { -// name: "time", -// type: "TIME" -// }, -// { -// name: "articleName", -// type: "STRING" -// }, -// { -// name: "page", -// type: "STRING" -// }, -// { -// name: "userChars", -// type: "SET/STRING" -// }, -// { -// maker: { -// op: "count" -// }, -// name: "count", -// type: "NUMBER", -// unsplitable: true -// } -// ], -// clusterName: "druid-wiki", -// defaultDuration: "P3D", -// defaultPinnedDimensions: [ -// "articleName" -// ], -// defaultSelectedMeasures: [ -// "count" -// ], -// defaultSortMeasure: "count", -// defaultTimezone: "Etc/UTC", -// description: "Wiki full description something about articles and editors", -// dimensions: [ -// { -// formula: "$time", -// kind: "time", -// name: "time", -// title: "Time" -// }, -// { -// kind: "string", -// name: "country", -// title: "Country", -// formula: "$country" -// }, -// { -// formula: "$channel", -// kind: "string", -// name: "channel", -// title: "Channel" -// }, -// { -// name: "comment_group", -// title: "Comment Group", -// dimensions: [ -// { -// kind: "string", -// name: "comment", -// title: "Comment", -// formula: "$comment" -// }, -// { -// kind: "number", -// name: "commentLength", -// title: "Comment Length", -// formula: "$commentLength" -// }, -// { -// kind: "boolean", -// name: "commentLengthOver100", -// title: "Comment Length Over 100", -// formula: "$commentLength > 100" -// } -// ] -// }, -// { -// formula: "$isRobot", -// kind: "string", -// name: "isRobot", -// title: "Is Robot" -// }, -// { -// kind: "string", -// name: "namespace", -// title: "Namespace", -// formula: "$namespace" -// }, -// { -// formula: "$articleName", -// kind: "string", -// name: "articleName", -// title: "Article Name" -// }, -// { -// formula: "$page", -// kind: "string", -// name: "page", -// title: "Page" -// }, -// { -// formula: "$page.lookup(page_last_author)", -// kind: "string", -// name: "page_last_author", -// title: "Page Author" -// }, -// { -// formula: "$userChars", -// kind: "string", -// name: "userChars", -// title: "User Chars" -// } -// ], -// measures: [ -// { -// formula: "$main.sum($count)", -// name: "count", -// title: "Count" -// }, -// { -// name: "other", -// title: "Other", -// measures: [ -// { -// name: "added_group", -// title: "Added Group", -// measures: [ -// { -// name: "added", -// title: "Added", -// formula: "$main.sum($added)" -// }, -// { -// name: "avg_added", -// title: "Avg Added", -// formula: "$main.average($added)" -// } -// ] -// }, -// { -// name: "delta_group", -// title: "Delta Group", -// measures: [ -// { -// name: "delta", -// title: "Delta", -// formula: "$main.sum($delta)" -// }, -// { -// name: "avg_delta", -// title: "Avg Delta", -// formula: "$main.average($delta)" -// } -// ] -// } -// ] -// } -// ], -// name: "wiki", -// refreshRule: { -// rule: "fixed", -// time: new Date("2016-04-30T12:39:51.350Z") -// }, -// maxSplits: 4, -// source: "wiki", -// timeAttribute: "time", -// title: "Wiki" -// } -// ] -// }); -// }); -// -// }); -// -// }); +import { expect } from "chai"; +import * as sinon from "sinon"; +import * as customizationModule from "../customization/customization"; +import * as oauthModule from "../oauth/oauth"; +import { AppSettings, fromConfig, serialize } from "./app-settings"; +import { appSettings } from "./app-settings.fixtures"; + +describe("AppSettings", () => { + + describe("fromConfig", () => { + it("should read client timeout", () => { + const settings = fromConfig({ clientTimeout: 42 }); + + expect(settings).to.contain({ clientTimeout: 42 }); + }); + + it("should read version", () => { + const settings = fromConfig({ version: 42 }); + + expect(settings).to.contain({ version: 42 }); + }); + + describe("oauth", () => { + let oauthFromConfig: sinon.SinonStub; + + beforeEach(() => { + oauthFromConfig = sinon + .stub(oauthModule, "fromConfig") + .returns({ foobar: true }); + }); + + afterEach(() => { + oauthFromConfig.restore(); + }); + + it("should call oauth fromConfig", () => { + fromConfig({ oauth: { input: 42 } } as any); + + expect(oauthFromConfig.calledWith({ input: 42 })).to.be.true; + }); + + it("should use result of customization fromConfig", () => { + const settings = fromConfig({ oauth: { input: 42 } } as any); + + expect(settings).to.deep.contain({ + oauth: { + foobar: true + } + }); + }); + }); + + describe("customization", () => { + let customizationFromConfig: sinon.SinonStub; + + beforeEach(() => { + customizationFromConfig = sinon + .stub(customizationModule, "fromConfig") + .returns({ foobar: true }); + }); + + afterEach(() => { + customizationFromConfig.restore(); + }); + + it("should call customization fromConfig", () => { + fromConfig({ customization: { input: 42 } } as any); + + expect(customizationFromConfig.calledWith({ input: 42 })).to.be.true; + }); + + it("should use result of customization fromConfig", () => { + const settings = fromConfig({ customization: { input: 42 } } as any); + + expect(settings).to.deep.contain({ + customization: { + foobar: true + } + }); + }); + }); + }); + + describe("serialize", () => { + it("should pass clientTimeout", () => { + const serialized = serialize({ ...appSettings, clientTimeout: 42 }); + + expect(serialized).to.contain({ clientTimeout: 42 }); + }); + + it("should pass version", () => { + const serialized = serialize({ ...appSettings, version: 42 }); + + expect(serialized).to.contain({ version: 42 }); + }); + + describe("oauth", () => { + let oauthSerialize: sinon.SinonStub; + + beforeEach(() => { + oauthSerialize = sinon + .stub(oauthModule, "serialize") + .returns({ foobar: true }); + }); + + afterEach(() => { + oauthSerialize.restore(); + }); + + it("should call oauth serialize", () => { + serialize({ ...appSettings, oauth: { input: 42 } } as any); + + expect(oauthSerialize.calledWith({ input: 42 })).to.be.true; + }); + + it("should use result of oauth serialize", () => { + const serialized = serialize({ ...appSettings, oauth: { input: 42 } } as any); + + expect(serialized).to.deep.contain({ + oauth: { + foobar: true + } + }); + }); + }); + + describe("customization", () => { + let customizationSerialize: sinon.SinonStub; + + beforeEach(() => { + customizationSerialize = sinon + .stub(customizationModule, "serialize") + .returns({ foobar: true }); + }); + + afterEach(() => { + customizationSerialize.restore(); + }); + + it("should call customization serialize", () => { + serialize({ ...appSettings, customization: { input: 42 } } as any); + + expect(customizationSerialize.calledWith({ input: 42 })).to.be.true; + }); + + it("should use result of customization serialize", () => { + const serialized = serialize({ ...appSettings, customization: { input: 42 } } as any); + + expect(serialized).to.deep.contain({ + customization: { + foobar: true + } + }); + }); + }); + }); +}); diff --git a/src/common/models/app-settings/app-settings.ts b/src/common/models/app-settings/app-settings.ts index cbca43bdb..f85edb29b 100644 --- a/src/common/models/app-settings/app-settings.ts +++ b/src/common/models/app-settings/app-settings.ts @@ -16,8 +16,21 @@ */ import { Executor } from "plywood"; -import { Customization, CustomizationJS } from "../customization/customization"; -import { deserialize as oauthDeserialize, fromConfig as oauthFromConfig, Oauth, OauthJS, serialize as oauthSerialize, SerializedOauth } from "../oauth/oauth"; +import { + ClientCustomization, + Customization, + CustomizationJS, + fromConfig as customizationFromConfig, + serialize as customizationSerialize, + SerializedCustomization +} from "../customization/customization"; +import { + fromConfig as oauthFromConfig, + Oauth, + OauthJS, + serialize as oauthSerialize, + SerializedOauth +} from "../oauth/oauth"; const DEFAULT_CLIENT_TIMEOUT = 0; @@ -25,7 +38,7 @@ export interface AppSettings { readonly version: number; readonly clientTimeout: number; readonly customization: Customization; - readonly oauth?: Oauth; + readonly oauth: Oauth; } export interface AppSettingsJS { @@ -38,19 +51,23 @@ export interface AppSettingsJS { export interface SerializedAppSettings { readonly version: number; readonly clientTimeout: number; - readonly customization: CustomizationJS; // SerializedCustomization + readonly customization: SerializedCustomization; readonly oauth: SerializedOauth; } +export interface ClientAppSettings { + readonly version: number; + readonly clientTimeout: number; + readonly customization: ClientCustomization; + readonly oauth: Oauth; +} + export function fromConfig(config: AppSettingsJS): AppSettings { const clientTimeout = config.clientTimeout === undefined ? DEFAULT_CLIENT_TIMEOUT : config.clientTimeout; const version = config.version || 0; - const customization = Customization.fromJS(config.customization || {}); + const customization = customizationFromConfig(config.customization); const oauth = oauthFromConfig(config.oauth); - // make part of Customization server side smart constructor - customization.validate(); - return { clientTimeout, version, @@ -65,20 +82,11 @@ export function serialize({ oauth, clientTimeout, customization, version }: AppS return { clientTimeout, version, - customization: customization.toJS(), + customization: customizationSerialize(customization), oauth: oauthSerialize(oauth) }; } -export function deserialize({ oauth, clientTimeout, customization, version }: SerializedAppSettings): AppSettings { - return { - clientTimeout, - version, - customization: Customization.fromJS(customization), - oauth: oauthDeserialize(oauth) - }; -} - export interface AppSettingsContext { executorFactory?: (dataCubeName: string) => Executor; } diff --git a/src/common/models/customization/customization.fixtures.ts b/src/common/models/customization/customization.fixtures.ts new file mode 100644 index 000000000..285e7e61d --- /dev/null +++ b/src/common/models/customization/customization.fixtures.ts @@ -0,0 +1,38 @@ +/* + * Copyright 2017-2021 Allegro.pl + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { UrlShortenerContext } from "../url-shortener/url-shortener"; +import { Customization, CustomizationJS } from "./customization"; + +export const customization: Customization = { + cssVariables: { + "brand-selected": "orange", + "brand": "red", + "button-primary-active": "blue" + }, + customLogoSvg: "", + externalViews: [], + headerBackground: "", + locale: undefined, + sentryDSN: "", + timezones: [], + title: "", + urlShortener: (request: any, url: string, context: UrlShortenerContext): Promise => Promise.resolve(url) +}; + +export const customizationJS: CustomizationJS = { + +}; diff --git a/src/common/models/customization/customization.mocha.ts b/src/common/models/customization/customization.mocha.ts index 1b4177a10..fad05f634 100644 --- a/src/common/models/customization/customization.mocha.ts +++ b/src/common/models/customization/customization.mocha.ts @@ -16,64 +16,244 @@ */ import { expect } from "chai"; -import { testImmutableClass } from "immutable-class-tester"; -import { SuccessUrlShortenerJS } from "../url-shortener/url-shortener.fixtures"; -import { Customization, CustomizationJS } from "./customization"; +import { Timezone } from "chronoshift"; +import * as sinon from "sinon"; +import * as localeModule from "../locale/locale"; +import * as urlShortenerModule from "../url-shortener/url-shortener"; +import { Customization, DEFAULT_TIMEZONES, DEFAULT_TITLE, fromConfig, serialize } from "./customization"; +import { customization, customizationJS } from "./customization.fixtures"; describe("Customization", () => { - it("is an immutable class", () => { - testImmutableClass(Customization, [ - { - title: "Hello World", - headerBackground: "brown", - customLogoSvg: "ansvgstring" - }, - { - urlShortener: SuccessUrlShortenerJS, - headerBackground: "green", - externalViews: [] - }, - { - urlShortener: SuccessUrlShortenerJS, - externalViews: [ - { - title: "corporate dashboard", - linkGenerator: "{ return 'https://dashboard.corporate.com/'+filter.toString() }", - sameWindow: true - }, - { - title: "google docs", - linkGenerator: "{ return 'http://182.343.32.2273:8080/'+dataCube.name }" - }, - { - title: "google docs", - linkGenerator: "{ return 'http://182.343.32.2273:8080/'+timezone.timezone }" + describe("fromConfig", () => { + it("should pass headerBackground", () => { + const customization = fromConfig({ ...customizationJS, headerBackground: "foobar" }); + + expect(customization).to.contain({ headerBackground: "foobar" }); + }); + + it("should pass customLogoSvg", () => { + const customization = fromConfig({ ...customizationJS, customLogoSvg: "foobar" }); + + expect(customization).to.contain({ customLogoSvg: "foobar" }); + }); + + it("should pass sentryDSN", () => { + const customization = fromConfig({ ...customizationJS, sentryDSN: "foobar" }); + + expect(customization).to.contain({ sentryDSN: "foobar" }); + }); + + describe("title", () => { + it("should pass title", () => { + const customization = fromConfig({ ...customizationJS, title: "foobar" }); + + expect(customization).to.contain({ title: "foobar" }); + }); + + it("should use default title", () => { + const customization = fromConfig({ ...customizationJS, title: undefined }); + + expect(customization).to.contain({ title: DEFAULT_TITLE }); + }); + }); + + describe("timezones", () => { + it("should create timezone objects from strings", () => { + const customization = fromConfig({ + ...customizationJS, + timezones: ["Europe/Warsaw", "Asia/Manila"] + }); + + expect(customization.timezones).to.have.length(2); + expect(customization.timezones[0].equals(Timezone.fromJS("Europe/Warsaw"))).to.be.true; + expect(customization.timezones[1].equals(Timezone.fromJS("Asia/Manila"))).to.be.true; + }); + + it("should use default timezones if empty", () => { + const customization = fromConfig({ ...customizationJS, timezones: undefined }); + + expect(customization.timezones).to.deep.equal(DEFAULT_TIMEZONES); + }); + }); + + describe("externalViews", () => { + // TODO: Implement + }); + + describe("urlShortener", () => { + let urlShortenerFromConfig: sinon.SinonStub; + + beforeEach(() => { + urlShortenerFromConfig = sinon + .stub(urlShortenerModule, "fromConfig") + .returns("foobar"); + }); + + afterEach(() => { + urlShortenerFromConfig.restore(); + }); + + it("should call urlShortener fromConfig", () => { + fromConfig({ urlShortener: { input: 42 } } as any); + + expect(urlShortenerFromConfig.calledWith({ input: 42 })).to.be.true; + }); + + it("should use result of urlShortener fromConfig", () => { + const settings = fromConfig({ urlShortener: { input: 42 } } as any); + + expect(settings).to.deep.contain({ + urlShortener: "foobar" + }); + }); + }); + + describe("locale", () => { + let localeFromConfig: sinon.SinonStub; + + beforeEach(() => { + localeFromConfig = sinon + .stub(localeModule, "fromConfig") + .returns("foobar"); + }); + + afterEach(() => { + localeFromConfig.restore(); + }); + + it("should call locale fromConfig", () => { + fromConfig({ locale: { input: 42 } } as any); + + expect(localeFromConfig.calledWith({ input: 42 })).to.be.true; + }); + + it("should use result of locale fromConfig", () => { + const settings = fromConfig({ locale: { input: 42 } } as any); + + expect(settings).to.deep.contain({ + locale: "foobar" + }); + }); + }); + + describe("cssVariables", () => { + it("should create empty object as default", () => { + const customization = fromConfig({ ...customizationJS, cssVariables: undefined }); + + expect(customization).to.deep.contain({ cssVariables: {} }); + }); + + it("should pass only valid variables", () => { + const customization = fromConfig({ + ...customizationJS, + cssVariables: { + "brand": "foobar", + "brand-selected": "foobar-selected", + "invalid-name": "invalid" } - ] - }, - { - headerBackground: "green", - externalViews: [], - timezones: ["Pacific/Niue", "America/Los_Angeles"] - }, - { - headerBackground: "green", - externalViews: [], - urlShortener: SuccessUrlShortenerJS, - timezones: ["Pacific/Niue", "America/Los_Angeles"], - logoutHref: "/log-me-out-now" - } - ]); - }); + }); - it("throws for invalid timezone", () => { - expect(() => { - Customization.fromJS({ - headerBackground: "green", - externalViews: [], - timezones: ["Pacific/Niue", "Not a timezone"] + expect(customization).to.deep.contain({ + cssVariables: { + "brand": "foobar", + "brand-selected": "foobar-selected" + } + }); }); - }).to.throw("timezone 'Not a timezone' does not exist"); + }); }); + describe("serialize", () => { + it("should pass headerBackground", () => { + const serialized = serialize({ ...customization, headerBackground: "foobar" }); + + expect(serialized).to.contain({ headerBackground: "foobar" }); + }); + + it("should pass customLogoSvg", () => { + const serialized = serialize({ ...customization, customLogoSvg: "foobar" }); + + expect(serialized).to.contain({ customLogoSvg: "foobar" }); + }); + + it("should pass sentryDSN", () => { + const serialized = serialize({ ...customization, sentryDSN: "foobar" }); + + expect(serialized).to.contain({ sentryDSN: "foobar" }); + }); + + it("should not pass title", () => { + const serialized = serialize({ ...customization, title: "foobar" }); + + expect(serialized).to.not.have.property("title"); + }); + + it("should not pass cssVariables", () => { + const serialized = serialize({ ...customization, cssVariables: { brand: "foobar" } }); + + expect(serialized).to.not.have.property("cssVariables"); + }); + + it("should serialize timezone objects to strings", () => { + const serialized = serialize({ + ...customization, + timezones: [Timezone.fromJS("Europe/Warsaw"), Timezone.fromJS("Asia/Manila")] + }); + + expect(serialized).to.deep.contain({ timezones: ["Europe/Warsaw", "Asia/Manila"] }); + }); + + describe("externalViews", () => { + // TODO: Implement + }); + + describe("urlShortener", () => { + + it("should return hasUrlShortener true if has url shortener", () => { + const serialized = serialize({ + ...customization, + urlShortener: (() => {}) as any + }); + + expect(serialized).to.contain({ hasUrlShortener: true }); + }); + + it("should return hasUrlShortener true if has url shortener", () => { + const serialized = serialize({ + ...customization, + urlShortener: undefined + }); + + expect(serialized).to.contain({ hasUrlShortener: false }); + }); + }); + + describe("locale", () => { + let localeSerialize: sinon.SinonStub; + + beforeEach(() => { + localeSerialize = sinon + .stub(localeModule, "serialize") + .returns("foobar"); + }); + + afterEach(() => { + localeSerialize.restore(); + }); + + it("should call locale serialize", () => { + serialize({ ...customization, locale: { input: 42 } } as any); + + expect(localeSerialize.calledWith({ input: 42 })).to.be.true; + }); + + it("should use result of locale serialize", () => { + const serialized = serialize({ ...customization, locale: { input: 42 } } as any); + + expect(serialized).to.deep.contain({ + locale: "foobar" + }); + }); + }); + }); }); diff --git a/src/common/models/customization/customization.ts b/src/common/models/customization/customization.ts index 5c1e6f34b..659fb43c0 100644 --- a/src/common/models/customization/customization.ts +++ b/src/common/models/customization/customization.ts @@ -16,11 +16,33 @@ */ import { Timezone } from "chronoshift"; -import { Class, immutableArraysEqual, Instance } from "immutable-class"; import { LOGGER } from "../../logger/logger"; -import { ImmutableUtils } from "../../utils/immutable-utils/immutable-utils"; +import { assoc } from "../../utils/functional/functional"; +import { isTruthy } from "../../utils/general/general"; import { ExternalView, ExternalViewValue } from "../external-view/external-view"; -import { UrlShortener, UrlShortenerDef } from "../url-shortener/url-shortener"; +import { fromConfig as localeFromConfig, Locale, LocaleJS, serialize as localeSerialize } from "../locale/locale"; +import { fromConfig as urlShortenerFromConfig, UrlShortener, UrlShortenerDef } from "../url-shortener/url-shortener"; + +export const DEFAULT_TITLE = "Turnilo (%v)"; + +export const DEFAULT_TIMEZONES: Timezone[] = [ + new Timezone("America/Juneau"), // -9.0 + new Timezone("America/Los_Angeles"), // -8.0 + new Timezone("America/Yellowknife"), // -7.0 + new Timezone("America/Phoenix"), // -7.0 + new Timezone("America/Denver"), // -7.0 + new Timezone("America/Mexico_City"), // -6.0 + new Timezone("America/Chicago"), // -6.0 + new Timezone("America/New_York"), // -5.0 + new Timezone("America/Argentina/Buenos_Aires"), // -4.0 + Timezone.UTC, + new Timezone("Asia/Jerusalem"), // +2.0 + new Timezone("Europe/Paris"), // +1.0 + new Timezone("Asia/Kathmandu"), // +5.8 + new Timezone("Asia/Hong_Kong"), // +8.0 + new Timezone("Asia/Seoul"), // +9.0 + new Timezone("Pacific/Guam") // +10.0 +]; const availableCssVariables = [ "background-base", @@ -80,205 +102,116 @@ const availableCssVariables = [ "text-standard" ]; -export interface CustomizationValue { +// Note: We could use some TS magick to link this type to availableCssVariables +type CssVariables = Record; + +export interface Customization { title?: string; headerBackground?: string; customLogoSvg?: string; - externalViews?: ExternalView[]; - timezones?: Timezone[]; - logoutHref?: string; + externalViews: ExternalView[]; + timezones: Timezone[]; urlShortener?: UrlShortener; sentryDSN?: string; - cssVariables?: Record; + cssVariables: CssVariables; + locale: Locale; } export interface CustomizationJS { title?: string; + locale?: LocaleJS; headerBackground?: string; customLogoSvg?: string; externalViews?: ExternalViewValue[]; timezones?: string[]; - logoutHref?: string; urlShortener?: UrlShortenerDef; sentryDSN?: string; cssVariables?: Record; } -var check: Class; - -export class Customization implements Instance { - static DEFAULT_TITLE = "Turnilo (%v)"; - - static DEFAULT_TIMEZONES: Timezone[] = [ - new Timezone("America/Juneau"), // -9.0 - new Timezone("America/Los_Angeles"), // -8.0 - new Timezone("America/Yellowknife"), // -7.0 - new Timezone("America/Phoenix"), // -7.0 - new Timezone("America/Denver"), // -7.0 - new Timezone("America/Mexico_City"), // -6.0 - new Timezone("America/Chicago"), // -6.0 - new Timezone("America/New_York"), // -5.0 - new Timezone("America/Argentina/Buenos_Aires"), // -4.0 - Timezone.UTC, - new Timezone("Asia/Jerusalem"), // +2.0 - new Timezone("Europe/Paris"), // +1.0 - new Timezone("Asia/Kathmandu"), // +5.8 - new Timezone("Asia/Hong_Kong"), // +8.0 - new Timezone("Asia/Seoul"), // +9.0 - new Timezone("Pacific/Guam") // +10.0 - ]; - - static DEFAULT_LOGOUT_HREF = "logout"; - - static isCustomization(candidate: any): candidate is Customization { - return candidate instanceof Customization; - } - - static fromJS(parameters: CustomizationJS): Customization { - var value: CustomizationValue = { - title: parameters.title, - headerBackground: parameters.headerBackground, - customLogoSvg: parameters.customLogoSvg, - logoutHref: parameters.logoutHref, - sentryDSN: parameters.sentryDSN, - cssVariables: parameters.cssVariables - }; - - var paramViewsJS = parameters.externalViews; - var externalViews: ExternalView[] = null; - if (Array.isArray(paramViewsJS)) { - externalViews = paramViewsJS.map((view, i) => ExternalView.fromJS(view)); - value.externalViews = externalViews; - } - - var timezonesJS = parameters.timezones; - var timezones: Timezone[] = null; - if (Array.isArray(timezonesJS)) { - timezones = timezonesJS.map(Timezone.fromJS); - value.timezones = timezones; - } - - if (parameters.urlShortener) { - value.urlShortener = UrlShortener.fromJS(parameters.urlShortener); - } - - return new Customization(value); - } - - public headerBackground: string; - public customLogoSvg: string; - public externalViews: ExternalView[]; - public timezones: Timezone[]; - public title: string; - public logoutHref: string; - public urlShortener: UrlShortener; - public sentryDSN: string; - public cssVariables?: Record; - - constructor(parameters: CustomizationValue) { - this.title = parameters.title || null; - this.headerBackground = parameters.headerBackground || null; - this.customLogoSvg = parameters.customLogoSvg || null; - if (parameters.externalViews) this.externalViews = parameters.externalViews; - if (parameters.timezones) this.timezones = parameters.timezones; - this.logoutHref = parameters.logoutHref; - if (parameters.urlShortener) this.urlShortener = parameters.urlShortener; - if (parameters.sentryDSN) this.sentryDSN = parameters.sentryDSN; - if (parameters.cssVariables) this.cssVariables = parameters.cssVariables; - } - - public valueOf(): CustomizationValue { - return { - title: this.title, - headerBackground: this.headerBackground, - customLogoSvg: this.customLogoSvg, - externalViews: this.externalViews, - timezones: this.timezones, - urlShortener: this.urlShortener, - logoutHref: this.logoutHref, - sentryDSN: this.sentryDSN, - cssVariables: this.cssVariables - }; - } - - public toJS(): CustomizationJS { - var js: CustomizationJS = {}; - if (this.title) js.title = this.title; - if (this.sentryDSN) js.sentryDSN = this.sentryDSN; - if (this.headerBackground) js.headerBackground = this.headerBackground; - if (this.customLogoSvg) js.customLogoSvg = this.customLogoSvg; - if (this.externalViews) { - js.externalViews = this.externalViews.map(view => view.toJS()); - } - if (this.timezones) { - js.timezones = this.timezones.map(tz => tz.toJS()); - } - if (this.urlShortener) { - js.urlShortener = this.urlShortener.toJS(); - } - if (this.logoutHref) js.logoutHref = this.logoutHref; - if (this.cssVariables) js.cssVariables = this.cssVariables; - - return js; - } - - public toJSON(): CustomizationJS { - return this.toJS(); - } - - public toString(): string { - return `[custom: (${this.headerBackground}) logo: ${Boolean(this.customLogoSvg)}, externalViews: ${Boolean(this.externalViews)}, timezones: ${Boolean( - this.timezones)}]`; - } - - public equals(other: Customization): boolean { - return Customization.isCustomization(other) && - this.title === other.title && - this.headerBackground === other.headerBackground && - this.customLogoSvg === other.customLogoSvg && - (!this.urlShortener || this.urlShortener.equals(other.urlShortener)) && - immutableArraysEqual(this.externalViews, other.externalViews) && - immutableArraysEqual(this.timezones, other.timezones) && - this.sentryDSN === other.sentryDSN && - this.logoutHref === other.logoutHref && - this.cssVariables === other.cssVariables; - } - - public getTitle(version: string): string { - var title = this.title || Customization.DEFAULT_TITLE; - return title.replace(/%v/g, version); - } - - change(propertyName: string, newValue: any): Customization { - return ImmutableUtils.change(this, propertyName, newValue); - } - - public changeTitle(title: string): Customization { - return this.change("title", title); - } - - public getTimezones() { - return this.timezones || Customization.DEFAULT_TIMEZONES; - } +export interface SerializedCustomization { + headerBackground?: string; + customLogoSvg?: string; + timezones: string[]; + externalViews: ExternalViewValue[]; + hasUrlShortener: boolean; + sentryDSN?: string; + locale: Locale; +} - public getLogoutHref() { - return this.logoutHref || Customization.DEFAULT_LOGOUT_HREF; - } +export interface ClientCustomization { + headerBackground?: string; + customLogoSvg?: string; + timezones: Timezone[]; + externalViews: ExternalViewValue[]; + hasUrlShortener: boolean; + sentryDSN?: string; + locale: Locale; +} - validate(): boolean { - let valid = true; +function verifyCssVariables(cssVariables: Record): CssVariables { + return Object.keys(cssVariables) + .filter(variableName => { + const valid = availableCssVariables.indexOf(variableName) > -1; + if (!valid) { + LOGGER.warn(`Unsupported css variables "${variableName}" found.`); + } + return valid; + }) + .reduce((variables: CssVariables, key: string) => { + return assoc(variables, key, cssVariables[key]); + }, {}); +} - if (this.cssVariables) { - Object.keys(this.cssVariables).forEach(variableName => { - if (availableCssVariables.indexOf(variableName) < 0) { - valid = false; - LOGGER.warn(`Unsupported css variables "${variableName}" found.`); - } - }); - } +export function fromConfig(config: CustomizationJS = {}): Customization { + const { + title = DEFAULT_TITLE, + headerBackground, + customLogoSvg, + externalViews: configExternalViews, + timezones: configTimezones, + urlShortener, + sentryDSN, + cssVariables = {}, + locale + } = config; + + const timezones = Array.isArray(configTimezones) + ? configTimezones.map(Timezone.fromJS) + : DEFAULT_TIMEZONES; + + const externalViews = Array.isArray(configExternalViews) + ? configExternalViews.map(ExternalView.fromJS) + : []; + + const customization = { + title, + headerBackground, + customLogoSvg, + sentryDSN, + cssVariables: verifyCssVariables(cssVariables), + urlShortener: urlShortenerFromConfig(urlShortener), + timezones, + locale: localeFromConfig(locale), + externalViews + }; + + return customization; +} - return valid; - } +export function serialize(customization: Customization): SerializedCustomization { + const { customLogoSvg, timezones, headerBackground, locale, externalViews, sentryDSN, urlShortener } = customization; + return { + customLogoSvg, + externalViews, + hasUrlShortener: isTruthy(urlShortener), + headerBackground, + sentryDSN, + locale: localeSerialize(locale), + timezones: timezones.map(t => t.toJS()) + }; } -check = Customization; +export function getTitle({ title }: Customization, version: string): string { + return title.replace(/%v/g, version); +} diff --git a/src/common/models/locale/locale.mocha.ts b/src/common/models/locale/locale.mocha.ts new file mode 100644 index 000000000..3088a24d4 --- /dev/null +++ b/src/common/models/locale/locale.mocha.ts @@ -0,0 +1,45 @@ +/* + * Copyright 2017-2021 Allegro.pl + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { expect } from "chai"; +import { fromConfig, LOCALES } from "./locale"; + +const en_us = LOCALES.EN_US; + +describe("locale", () => { + describe("fromConfig", () => { + it("should return default locale if passed undefined", () => { + const locale = fromConfig(); + + expect(locale).to.deep.equal(en_us); + }); + + it("should use base locale", () => { + const locale = fromConfig({ base: "EN_US", overrides: {} }); + + expect(locale).to.deep.equal(en_us); + }); + + it("should use base locale and override desired fields", () => { + const locale = fromConfig({ base: "EN_US", overrides: { weekStart: 42 } }); + + expect(locale).to.deep.equal({ + ...en_us, + weekStart: 42 + }); + }); + }); +}); diff --git a/src/common/models/locale/locale.ts b/src/common/models/locale/locale.ts new file mode 100644 index 000000000..e3ef63811 --- /dev/null +++ b/src/common/models/locale/locale.ts @@ -0,0 +1,64 @@ +/* + * Copyright 2017-2021 Allegro.pl + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { isObject } from "../../utils/general/general"; + +const EN_US: Locale = { + shortDays: ["S", "M", "T", "W", "T", "F", "S"], + shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], + weekStart: 0, + exportEncoding: "utf-8" +}; + +type LocaleName = "EN_US"; + +export const LOCALES: Record = { + EN_US +}; + +const DEFAULT_LOCALE = EN_US; + +export interface LocaleJS { + base: LocaleName; + overrides: Partial; +} + +export type LocaleSerialized = Locale; + +export interface Locale { + shortDays: string[]; + shortMonths: string[]; + weekStart: number; + exportEncoding: string; +} + +export function fromConfig(locale?: LocaleJS): Locale { + if (!isObject(locale)) return DEFAULT_LOCALE; + const { base, overrides } = locale; + return { + ...LOCALES[base], + ...overrides + }; + +} + +export function serialize(locale: Locale): LocaleSerialized { + return locale; +} + +export function deserialize(locale: Locale): Locale { + return locale; +} diff --git a/src/common/models/oauth/oauth.ts b/src/common/models/oauth/oauth.ts index 4e6422e8b..1f87e5e54 100644 --- a/src/common/models/oauth/oauth.ts +++ b/src/common/models/oauth/oauth.ts @@ -54,7 +54,3 @@ export type SerializedOauth = Oauth; export function serialize(oauth: Oauth): SerializedOauth { return oauth; } - -export function deserialize(oauth: SerializedOauth): Oauth { - return oauth; -} diff --git a/src/common/models/sources/sources.ts b/src/common/models/sources/sources.ts index 9f8b47480..51345f6cc 100644 --- a/src/common/models/sources/sources.ts +++ b/src/common/models/sources/sources.ts @@ -15,9 +15,7 @@ */ import { NamedArray } from "immutable-class"; -import { Ajax } from "../../../client/utils/ajax/ajax"; import { isTruthy } from "../../utils/general/general"; -import { AppSettings } from "../app-settings/app-settings"; import { Cluster, ClusterJS } from "../cluster/cluster"; import { findCluster } from "../cluster/find-cluster"; import { DataCube, DataCubeJS } from "../data-cube/data-cube"; @@ -93,23 +91,6 @@ export function serialize({ }; } -export function deserialize(settings: SerializedSources, appSettings: AppSettings): Sources { - const clusters = settings.clusters.map(cluster => Cluster.fromJS(cluster)); - - const dataCubes = settings.dataCubes.map((dataCubeJS: DataCubeJS) => { - const cluster = findCluster(dataCubeJS, clusters); - let dataCubeObject = DataCube.fromJS(dataCubeJS, { cluster }); - const executor = Ajax.queryUrlExecutorFactory(dataCubeObject.name, appSettings); - dataCubeObject = dataCubeObject.attachExecutor(executor); - return dataCubeObject; - }); - - return { - clusters, - dataCubes - }; -} - export function getDataCubesForCluster(sources: Sources, clusterName: string): DataCube[] { return sources.dataCubes.filter(dataCube => dataCube.clusterName === clusterName); } diff --git a/src/common/models/url-shortener/url-shortener.fixtures.ts b/src/common/models/url-shortener/url-shortener.fixtures.ts index 6faba29a4..37b5aa4f4 100644 --- a/src/common/models/url-shortener/url-shortener.fixtures.ts +++ b/src/common/models/url-shortener/url-shortener.fixtures.ts @@ -14,10 +14,6 @@ * limitations under the License. */ -import { UrlShortener } from "./url-shortener"; - export const FailUrlShortenerJS = "return Promise.reject(new Error('error message'));"; -export const FailUrlShortener = new UrlShortener(FailUrlShortenerJS); export const SuccessUrlShortenerJS = "return Promise.resolve('http://foobar');"; -export const SuccessUrlShortener = new UrlShortener(SuccessUrlShortenerJS); diff --git a/src/common/models/url-shortener/url-shortener.ts b/src/common/models/url-shortener/url-shortener.ts index f92c3e4d7..fb454bec0 100644 --- a/src/common/models/url-shortener/url-shortener.ts +++ b/src/common/models/url-shortener/url-shortener.ts @@ -14,45 +14,15 @@ * limitations under the License. */ -import { Instance } from "immutable-class"; import { Ternary } from "../../utils/functional/functional"; export interface UrlShortenerContext { clientIp: string; } -export type UrlShortenerFn = Ternary>; +export type UrlShortener = Ternary>; export type UrlShortenerDef = string; -export class UrlShortener implements Instance { - - static fromJS(definition: UrlShortenerDef): UrlShortener { - return new UrlShortener(definition); - } - - public readonly shortenerFunction: UrlShortenerFn; - - constructor(private shortenerDefinition: string) { - this.shortenerFunction = new Function("request", "url", "context", shortenerDefinition) as UrlShortenerFn; - } - - public toJS(): UrlShortenerDef { - return this.shortenerDefinition; - } - - public valueOf(): UrlShortenerDef { - return this.shortenerDefinition; - } - - public toJSON(): UrlShortenerDef { - return this.toJS(); - } - - public equals(other: UrlShortener): boolean { - return other instanceof UrlShortener && this.valueOf() === other.valueOf(); - } - - public toString(): string { - return this.shortenerDefinition; - } +export function fromConfig(definition?: UrlShortenerDef): UrlShortener | undefined { + return definition && Function("request", "url", "context", definition) as UrlShortener; } diff --git a/src/common/utils/functional/functional.mocha.ts b/src/common/utils/functional/functional.mocha.ts index 43cd8a605..e2f98581d 100644 --- a/src/common/utils/functional/functional.mocha.ts +++ b/src/common/utils/functional/functional.mocha.ts @@ -23,7 +23,7 @@ import { complement, concatTruthy, cons, - constant, + constant, cyclicShift, debounceWithPromise, flatMap, mapTruthy, @@ -89,6 +89,12 @@ describe("Functional utilities", () => { }); }); + describe("cyclicShift", () => { + it("should rotate array by one element", () => { + expect(cyclicShift([1, 2, 3, 4], 1)).to.deep.eq([2, 3, 4, 1]); + }); + }); + describe("zip", () => { it("should merge arrays with same length", () => { expect(zip([1, 2, 3], ["a", "b", "c"])).to.deep.eq([ diff --git a/src/common/utils/functional/functional.ts b/src/common/utils/functional/functional.ts index 5654b7cfe..da2e838ab 100644 --- a/src/common/utils/functional/functional.ts +++ b/src/common/utils/functional/functional.ts @@ -66,6 +66,11 @@ export function flatMap(coll: T[], mapper: Binary): S[] { return [].concat(...coll.map(mapper)); } +export function cyclicShift(coll: T[], count: number): T[] { + const n = count % coll.length; + return coll.slice(n, coll.length).concat(coll.slice(0, n)); +} + export function concatTruthy(...elements: T[]): T[] { return elements.reduce((result: T[], element: T) => isTruthy(element) ? cons(result, element) : result, []); } diff --git a/src/common/utils/time/time.ts b/src/common/utils/time/time.ts index e98a79d7d..005b20fe2 100644 --- a/src/common/utils/time/time.ts +++ b/src/common/utils/time/time.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -import { day, Timezone } from "chronoshift"; +import { Timezone } from "chronoshift"; import * as d3 from "d3"; import { Moment, tz } from "moment-timezone"; import { Unary } from "../functional/functional"; @@ -29,12 +29,6 @@ export function getMoment(date: Date, timezone: Timezone): Moment { return tz(date, timezone.toString()); } -export interface Locale { - shortDays: string[]; - shortMonths: string[]; - weekStart: number; -} - const FULL_FORMAT = "D MMM YYYY H:mm"; const WITHOUT_YEAR_FORMAT = "D MMM H:mm"; const WITHOUT_HOUR_FORMAT = "D MMM YYYY"; diff --git a/src/server/app.ts b/src/server/app.ts index 30fcb4bf9..396d75340 100644 --- a/src/server/app.ts +++ b/src/server/app.ts @@ -143,7 +143,7 @@ attachRouter(SERVER_SETTINGS.getReadinessEndpoint(), readinessRouter(SETTINGS_MA attachRouter(SERVER_SETTINGS.getLivenessEndpoint(), livenessRouter); // Data routes -attachRouter("/settings", sourcesRouter(SETTINGS_MANAGER.sourcesGetter)); +attachRouter("/sources", sourcesRouter(SETTINGS_MANAGER.sourcesGetter)); attachRouter("/plywood", plywoodRouter(SETTINGS_MANAGER)); attachRouter("/plyql", plyqlRouter(SETTINGS_MANAGER.sourcesGetter)); attachRouter("/mkurl", mkurlRouter(SETTINGS_MANAGER.sourcesGetter)); diff --git a/src/server/routes/shorten/shorten.mocha.ts b/src/server/routes/shorten/shorten.mocha.ts index 1922c3b2f..bf1ae7270 100644 --- a/src/server/routes/shorten/shorten.mocha.ts +++ b/src/server/routes/shorten/shorten.mocha.ts @@ -19,7 +19,7 @@ import * as express from "express"; import { Express } from "express"; import * as http from "http"; import * as supertest from "supertest"; -import { Customization } from "../../../common/models/customization/customization"; +import { fromConfig } from "../../../common/models/customization/customization"; import { UrlShortenerDef } from "../../../common/models/url-shortener/url-shortener"; import { FailUrlShortenerJS, SuccessUrlShortenerJS } from "../../../common/models/url-shortener/url-shortener.fixtures"; import { shortenRouter } from "./shorten"; @@ -27,7 +27,7 @@ import { shortenRouter } from "./shorten"; const shortenPath = "/shorten"; const settingsFactory = (urlShortener: UrlShortenerDef) => ({ - customization: Customization.fromJS({ + customization: fromConfig({ urlShortener }) }); diff --git a/src/server/routes/shorten/shorten.ts b/src/server/routes/shorten/shorten.ts index f4a362613..c4252b0b9 100644 --- a/src/server/routes/shorten/shorten.ts +++ b/src/server/routes/shorten/shorten.ts @@ -31,7 +31,7 @@ export function shortenRouter(settings: Pick, isTr // If trust proxy is not enabled, app is understood as directly facing the internet clientIp: isTrustedProxy ? req.ip : req.connection.remoteAddress }; - const shortUrl = await shortener.shortenerFunction(request, url, context); + const shortUrl = await shortener(request, url, context); res.json({ shortUrl }); } catch (error) { console.log("error:", error.message); diff --git a/src/server/routes/turnilo/turnilo.ts b/src/server/routes/turnilo/turnilo.ts index f1c95022c..6ebd35b44 100644 --- a/src/server/routes/turnilo/turnilo.ts +++ b/src/server/routes/turnilo/turnilo.ts @@ -16,11 +16,12 @@ */ import { Request, Response, Router } from "express"; -import { AppSettings, serialize } from "../../../common/models/app-settings/app-settings"; +import { AppSettings } from "../../../common/models/app-settings/app-settings"; +import { getTitle } from "../../../common/models/customization/customization"; import { SETTINGS_MANAGER } from "../../config"; import { mainLayout } from "../../views"; -export function turniloRouter(settings: AppSettings, version: string) { +export function turniloRouter(appSettings: AppSettings, version: string) { const router = Router(); @@ -28,8 +29,8 @@ export function turniloRouter(settings: AppSettings, version: string) { try { res.send(mainLayout({ version, - title: settings.customization.getTitle(version), - appSettings: serialize(settings), + title: getTitle(appSettings.customization, version), + appSettings, timekeeper: SETTINGS_MANAGER.getTimekeeper() })); } catch (e) { diff --git a/src/server/views.ts b/src/server/views.ts index 0ca85fd42..51f3404b0 100644 --- a/src/server/views.ts +++ b/src/server/views.ts @@ -15,13 +15,13 @@ * limitations under the License. */ -import { SerializedAppSettings } from "../common/models/app-settings/app-settings"; +import { AppSettings, serialize } from "../common/models/app-settings/app-settings"; import { Timekeeper } from "../common/models/timekeeper/timekeeper"; export interface ViewOptions { version: string; title: string; - appSettings?: SerializedAppSettings; + appSettings?: AppSettings; timekeeper?: Timekeeper; } @@ -64,22 +64,18 @@ ${content} export function mainLayout(options: ViewOptions): string { const { version, appSettings, timekeeper } = options; - let cssOverrides: string | undefined; - - if (appSettings.customization.cssVariables) { - const cssVariables = appSettings.customization.cssVariables; - const renderedCssVariables = Object.keys(cssVariables).map(name => `--${name}: ${cssVariables[name]};`).join("\n"); - cssOverrides = ``; - } return layout(options, `
    - + -${cssOverrides || ""}` +${cssOverrides}` ); } From e9544c2d17645b7185a9da0b7fb4fd88ce823b06 Mon Sep 17 00:00:00 2001 From: adrianmroz <78143552+adrianmroz-allegro@users.noreply.github.com> Date: Thu, 6 May 2021 17:52:26 +0200 Subject: [PATCH 017/264] move d3-dsv to production deps (#748) --- package-lock.json | 16 +++++----------- package.json | 2 +- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4f3dc65db..ca7b57b6c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,6 +18,7 @@ "compression": "1.7.1", "core-js": "2.6.0", "d3": "3.5.17", + "d3-dsv": "2.0.0", "express": "4.16.2", "file-saver": "1.3.3", "fs-promise": "2.0.3", @@ -93,7 +94,6 @@ "css-loader": "2.1.1", "css-modules-require-hook": "4.2.3", "cypress": "3.4.1", - "d3-dsv": "2.0.0", "enzyme": "3.3.0", "enzyme-adapter-react-16": "1.7.1", "iconv-lite": "0.4.19", @@ -3419,8 +3419,7 @@ "node_modules/commander": { "version": "2.15.1", "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", - "dev": true + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==" }, "node_modules/common-tags": { "version": "1.8.0", @@ -4152,7 +4151,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-2.0.0.tgz", "integrity": "sha512-E+Pn8UJYx9mViuIUkoc93gJGGYut6mSDKy2+XaPwccwkRGlR+LO97L2VCCRjQivTwLHkSnAJG7yo00BWY6QM+w==", - "dev": true, "dependencies": { "commander": "2", "iconv-lite": "0.4", @@ -12191,8 +12189,7 @@ "node_modules/rw": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=", - "dev": true + "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=" }, "node_modules/rx": { "version": "4.1.0", @@ -18594,8 +18591,7 @@ "commander": { "version": "2.15.1", "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", - "dev": true + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==" }, "common-tags": { "version": "1.8.0", @@ -19254,7 +19250,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-2.0.0.tgz", "integrity": "sha512-E+Pn8UJYx9mViuIUkoc93gJGGYut6mSDKy2+XaPwccwkRGlR+LO97L2VCCRjQivTwLHkSnAJG7yo00BWY6QM+w==", - "dev": true, "requires": { "commander": "2", "iconv-lite": "0.4", @@ -25959,8 +25954,7 @@ "rw": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=", - "dev": true + "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=" }, "rx": { "version": "4.1.0", diff --git a/package.json b/package.json index c7b4370b1..a17d74f3a 100644 --- a/package.json +++ b/package.json @@ -73,6 +73,7 @@ "compression": "1.7.1", "core-js": "2.6.0", "d3": "3.5.17", + "d3-dsv": "2.0.0", "express": "4.16.2", "file-saver": "1.3.3", "fs-promise": "2.0.3", @@ -145,7 +146,6 @@ "css-loader": "2.1.1", "css-modules-require-hook": "4.2.3", "cypress": "3.4.1", - "d3-dsv": "2.0.0", "enzyme": "3.3.0", "enzyme-adapter-react-16": "1.7.1", "iconv-lite": "0.4.19", From 29f170202ca5360e5fa29939d1d4c795e630769d Mon Sep 17 00:00:00 2001 From: adrianmroz <78143552+adrianmroz-allegro@users.noreply.github.com> Date: Mon, 10 May 2021 11:23:04 +0200 Subject: [PATCH 018/264] Use POSIX locale identifier (#749) --- src/client/components/date-range-picker/calendar.mocha.ts | 2 +- .../date-range-picker/date-range-picker.mocha.tsx | 4 ++-- src/client/components/filter-menu/filter-menu.mocha.tsx | 2 +- src/client/components/filter-tile/filter-tile.mocha.tsx | 2 +- src/common/models/app-settings/app-settings.fixtures.ts | 4 ++-- src/common/models/locale/locale.mocha.ts | 6 +++--- src/common/models/locale/locale.ts | 8 ++++---- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/client/components/date-range-picker/calendar.mocha.ts b/src/client/components/date-range-picker/calendar.mocha.ts index 3c772e47e..6d3b5fd90 100644 --- a/src/client/components/date-range-picker/calendar.mocha.ts +++ b/src/client/components/date-range-picker/calendar.mocha.ts @@ -39,7 +39,7 @@ function assertEqualCalendarMatrix(a: Date[][], b: Date[][]) { } const utc = Timezone.UTC; -const en_us = LOCALES.EN_US; +const en_us = LOCALES["en-US"]; const warsawTZ = Timezone.fromJS("Europe/Warsaw"); const getDateInTimezone = (day: string, timezone: Timezone) => getMomentWithTimezone(day, timezone.toString()).toDate(); diff --git a/src/client/components/date-range-picker/date-range-picker.mocha.tsx b/src/client/components/date-range-picker/date-range-picker.mocha.tsx index b7482f146..29e713d29 100644 --- a/src/client/components/date-range-picker/date-range-picker.mocha.tsx +++ b/src/client/components/date-range-picker/date-range-picker.mocha.tsx @@ -28,7 +28,7 @@ describe("DateRangePicker", () => { it("adds the correct class", () => { var renderedComponent = renderIntoDocument( { expect(() => { renderIntoDocument( { essence={EssenceFixtures.wikiTotals()} timekeeper={TimekeeperFixtures.fixed()} menuStage={null} - locale={LOCALES.EN_US}/> + locale={LOCALES["en-US"]}/> ); expect(TestUtils.isCompositeComponent(renderedComponent), "should be composite").to.equal(true); diff --git a/src/common/models/app-settings/app-settings.fixtures.ts b/src/common/models/app-settings/app-settings.fixtures.ts index 38ef35a85..fc15f065e 100644 --- a/src/common/models/app-settings/app-settings.fixtures.ts +++ b/src/common/models/app-settings/app-settings.fixtures.ts @@ -24,7 +24,7 @@ export const clientAppSettings: ClientAppSettings = { hasUrlShortener: false, externalViews: [], timezones: [], - locale: LOCALES.EN_US + locale: LOCALES["en-US"] }, oauth: { status: "disabled" }, clientTimeout: 1000 @@ -34,7 +34,7 @@ export const appSettings: AppSettings = { clientTimeout: 1000, customization: { timezones: [], - locale: LOCALES.EN_US, + locale: LOCALES["en-US"], externalViews: [], cssVariables: {} }, diff --git a/src/common/models/locale/locale.mocha.ts b/src/common/models/locale/locale.mocha.ts index 3088a24d4..4916693ad 100644 --- a/src/common/models/locale/locale.mocha.ts +++ b/src/common/models/locale/locale.mocha.ts @@ -17,7 +17,7 @@ import { expect } from "chai"; import { fromConfig, LOCALES } from "./locale"; -const en_us = LOCALES.EN_US; +const en_us = LOCALES["en-US"]; describe("locale", () => { describe("fromConfig", () => { @@ -28,13 +28,13 @@ describe("locale", () => { }); it("should use base locale", () => { - const locale = fromConfig({ base: "EN_US", overrides: {} }); + const locale = fromConfig({ base: "en-US", overrides: {} }); expect(locale).to.deep.equal(en_us); }); it("should use base locale and override desired fields", () => { - const locale = fromConfig({ base: "EN_US", overrides: { weekStart: 42 } }); + const locale = fromConfig({ base: "en-US", overrides: { weekStart: 42 } }); expect(locale).to.deep.equal({ ...en_us, diff --git a/src/common/models/locale/locale.ts b/src/common/models/locale/locale.ts index e3ef63811..278c1fdf2 100644 --- a/src/common/models/locale/locale.ts +++ b/src/common/models/locale/locale.ts @@ -16,20 +16,20 @@ import { isObject } from "../../utils/general/general"; -const EN_US: Locale = { +const enUS: Locale = { shortDays: ["S", "M", "T", "W", "T", "F", "S"], shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"], weekStart: 0, exportEncoding: "utf-8" }; -type LocaleName = "EN_US"; +type LocaleName = "en-US"; export const LOCALES: Record = { - EN_US + "en-US": enUS }; -const DEFAULT_LOCALE = EN_US; +const DEFAULT_LOCALE = enUS; export interface LocaleJS { base: LocaleName; From 84776c65d7fee2dc496cc86320798c046a823d69 Mon Sep 17 00:00:00 2001 From: adrianmroz-allegro Date: Mon, 10 May 2021 09:38:56 +0000 Subject: [PATCH 019/264] Release 1.32.0-beta.2 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index ca7b57b6c..019612a74 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "turnilo", - "version": "1.32.0-beta.1", + "version": "1.32.0-beta.2", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/package.json b/package.json index a17d74f3a..bf2c5c28c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "turnilo", - "version": "1.32.0-beta.1", + "version": "1.32.0-beta.2", "description": "A web-based exploratory visualization UI for Druid.io", "keywords": [ "imply", From b7408eef18ef6e442a1f7d4845ceffd4fb48d1f3 Mon Sep 17 00:00:00 2001 From: adrianmroz <78143552+adrianmroz-allegro@users.noreply.github.com> Date: Mon, 10 May 2021 13:32:00 +0200 Subject: [PATCH 020/264] add locale doscs (#750) --- docs/configuration-customizations.md | 34 ++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/docs/configuration-customizations.md b/docs/configuration-customizations.md index 768d7919d..a16ee8558 100644 --- a/docs/configuration-customizations.md +++ b/docs/configuration-customizations.md @@ -94,6 +94,40 @@ These timezones will appear in the dropdown instead of the default, which are `['America/Juneau', 'America/Los_Angeles', 'America/Yellowknife', 'America/Phoenix', 'America/Denver', 'America/Mexico_City', 'America/Chicago', 'America/New_York', 'America/Argentina/Buenos_Aires', 'Etc/UTC', 'Asia/Jerusalem', 'Europe/Paris', 'Asia/Kathmandu', 'Asia/Hong_Kong', 'Asia/Seoul', 'Pacific/Guam']` +## Locale + +Note: Turnilo has very basic support of locale. Right now we are working on finding places in application which should be configurable. + +You can set Turnilo locale and override some settings + +```yaml +locale: + base: en-US + overrides: + shortMonths: + - [J, F, M, A, M, J, J, A, S, O, N, D] +``` + +You need to select base locale using POSIX locale identifier. (Right now Turnilo supports only `en-US` value). +You can override following settings: + +* `shortDays` - array of strings, default: `["S", "M", "T", "W", "T", "F", "S"]` + +Short day names used in date picker component + +* `shortMonths` - array of strings, default: `["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"]` + +Short month names used in date picker component + +* `weekStart` - number, default: 0 + +Index of day at which week starts. 0 is Sunday. Please note that is purely visual and does not influence #709. + +* `exportEncoding` - string, default: `utf-8` + +Encoding of files created by export function. + + ## Sentry DSN Add Sentry DSN to report errors to Sentry. [Sentry documentation](https://docs.sentry.io/platforms/javascript/?platform=browsernpm) From 99765bf3a6a91086f404682a7ee48ed0dd8c1845 Mon Sep 17 00:00:00 2001 From: adrianmroz <78143552+adrianmroz-allegro@users.noreply.github.com> Date: Wed, 12 May 2021 11:27:53 +0200 Subject: [PATCH 021/264] Add OAuth docs (#752) * Add OAuth docs * Typos and stuff --- docs/index.md | 4 ++++ docs/oauth.md | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 docs/oauth.md diff --git a/docs/index.md b/docs/index.md index 9c8de72d3..0bb0bb680 100644 --- a/docs/index.md +++ b/docs/index.md @@ -29,3 +29,7 @@ How to release Turnilo in semi-automatic way using Github actions. ## [Custom Extensions](extending-turnilo.md) How to customize Turnilo, plugins, query and request decorators. + +## [OAuth integration](oauth.md) + +How to integrate Turnilo with OAuth provider diff --git a/docs/oauth.md b/docs/oauth.md new file mode 100644 index 000000000..e422d8e56 --- /dev/null +++ b/docs/oauth.md @@ -0,0 +1,37 @@ +# OAuth integration + +* TOC + {:toc} + +## Overview + +Turnilo can integrate with your OAuth provider. +Turnilo will: +* Redirect your users to authentication page, +* Handle authorization code flow with PKCE (Proof Key for Code Exchange ) +* Will decorate all data requests with access token. + +## Configuration + +To enable OAuth support you need to add top level `oauth` option in your config with following fields: + +- `clientId`: OAuth Client Identifier for your Turnilo instance +- `tokenEndpoint`: Full address of your [token endpoint](https://tools.ietf.org/html/rfc6749#section-3.2) +- `authorizationEndpoint`: Full address of your [authorization endpoint](https://tools.ietf.org/html/rfc6749#section-3.1) +- `redirectUri`: Full address of your Turnilo installation. If you go to this address in browser, your Turnilo install should launch and show home view. +- `tokenHeaderName`: Name of your choosing for the OAuth token header. You will be reading this header in your server plugin. + +Example: + +```yaml +oauth: + clientId: "turnilo" + tokenEndpoint: "https://oauth.example.com/auth/oauth/token" + authorizationEndpoint: "https://oauth.example.com/auth/oauth/authorize" + tokenHeaderName: "x-turnilo-oauth-token" + redirectUri: "https://turnilo.example.com/" +``` + +## Further reading + +Please refer to our [github discussion](https://github.com/allegro/turnilo/discussions/734) for our use case. From 2ddcce3436199cfba2ecabfad596ea0a812308e6 Mon Sep 17 00:00:00 2001 From: adrianmroz <78143552+adrianmroz-allegro@users.noreply.github.com> Date: Wed, 12 May 2021 12:04:37 +0200 Subject: [PATCH 022/264] Return default locale if passed unrecognized locale identifier (#753) * Return default locale if passed unrecognized locale identifier * Better messaging for locale fallback. --- src/common/models/locale/locale.mocha.ts | 6 ++++++ src/common/models/locale/locale.ts | 7 ++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/common/models/locale/locale.mocha.ts b/src/common/models/locale/locale.mocha.ts index 4916693ad..2ce93c481 100644 --- a/src/common/models/locale/locale.mocha.ts +++ b/src/common/models/locale/locale.mocha.ts @@ -33,6 +33,12 @@ describe("locale", () => { expect(locale).to.deep.equal(en_us); }); + it("should return default locale if passed unrecognized base identifier", () => { + const locale = fromConfig({ base: "foobar" } as any); + + expect(locale).to.deep.equal(en_us); + }); + it("should use base locale and override desired fields", () => { const locale = fromConfig({ base: "en-US", overrides: { weekStart: 42 } }); diff --git a/src/common/models/locale/locale.ts b/src/common/models/locale/locale.ts index 278c1fdf2..0ffe34b56 100644 --- a/src/common/models/locale/locale.ts +++ b/src/common/models/locale/locale.ts @@ -14,7 +14,8 @@ * limitations under the License. */ -import { isObject } from "../../utils/general/general"; +import { LOGGER } from "../../logger/logger"; +import { isObject, isTruthy } from "../../utils/general/general"; const enUS: Locale = { shortDays: ["S", "M", "T", "W", "T", "F", "S"], @@ -48,6 +49,10 @@ export interface Locale { export function fromConfig(locale?: LocaleJS): Locale { if (!isObject(locale)) return DEFAULT_LOCALE; const { base, overrides } = locale; + if (!isTruthy(LOCALES[base])) { + LOGGER.warn(`Unsupported locale identifier: ${base}. Fallback to en-US.`); + return DEFAULT_LOCALE; + } return { ...LOCALES[base], ...overrides From 1980538ef4de0a93cc953ef65e68b07cfccc53cf Mon Sep 17 00:00:00 2001 From: adrianmroz <78143552+adrianmroz-allegro@users.noreply.github.com> Date: Wed, 12 May 2021 14:09:27 +0200 Subject: [PATCH 023/264] Promoted values in StringValuesList (#754) * Show already selected values in StringFilterMenu at the top of the list. These values are also filtered with search text field. Remove unnecessary limit prop in StringValuesList. Parent already limits it's query. * Add `downlevelIteration` to mocha ts-node config so it can still compile code with target es5 --- .../selectable-string-filter-menu.tsx | 4 +-- .../string-values-list.tsx | 36 +++++++++---------- test/setup/mocha.js | 1 + 3 files changed, 19 insertions(+), 22 deletions(-) diff --git a/src/client/components/selectable-string-filter-menu/selectable-string-filter-menu.tsx b/src/client/components/selectable-string-filter-menu/selectable-string-filter-menu.tsx index ff240911f..e5199cd59 100644 --- a/src/client/components/selectable-string-filter-menu/selectable-string-filter-menu.tsx +++ b/src/client/components/selectable-string-filter-menu/selectable-string-filter-menu.tsx @@ -199,7 +199,6 @@ export class SelectableStringFilterMenu extends React.Component TOP_N; return
    @@ -214,14 +213,13 @@ export class SelectableStringFilterMenu extends React.Component
    -
    +
    {isLoaded(dataset) && } diff --git a/src/client/components/selectable-string-filter-menu/string-values-list.tsx b/src/client/components/selectable-string-filter-menu/string-values-list.tsx index cad8fc049..dd99fb96a 100644 --- a/src/client/components/selectable-string-filter-menu/string-values-list.tsx +++ b/src/client/components/selectable-string-filter-menu/string-values-list.tsx @@ -23,42 +23,40 @@ import { Binary } from "../../../common/utils/functional/functional"; import { StringValue } from "./string-value"; import "./string-values-list.scss"; -function filterRows(rows: T[], searchText: string): T[] { +function filterRows(rows: string[], searchText: string): string[] { if (!searchText) return rows; const searchTextLower = searchText.toLowerCase(); - return rows.filter(d => String(d).toLowerCase().indexOf(searchTextLower) !== -1); + return rows.filter(d => d.toLowerCase().indexOf(searchTextLower) !== -1); +} + +function prependPromotedValues(rows: string[], promoted: Set): string[] { + return [ + ...promoted, + ...rows.filter(value => !promoted.contains(value)) + ]; } interface RowsListProps { dimension: Dimension; dataset: Dataset; searchText: string; - limit: number; - selectedValues: Set; - promotedValues: Set; + selectedValues: Set; + promotedValues: Set; filterMode: FilterMode; onRowSelect: Binary; } -function sortRows(rows: T[], promoted: Set): T[] { - return rows.sort((a, b) => { - if (promoted.has(a) && !promoted.has(b)) return -1; - if (!promoted.has(a) && promoted.has(b)) return 1; - return 0; - }); -} - export const StringValuesList: React.SFC = props => { - const { onRowSelect, filterMode, dataset, dimension, searchText, limit, promotedValues, selectedValues } = props; - const rows = dataset.data.slice(0, limit).map(d => d[dimension.name] as string); - const matchingRows = filterRows(rows, searchText); - if (searchText && matchingRows.length === 0) { + const { onRowSelect, filterMode, dataset, dimension, searchText, promotedValues, selectedValues } = props; + const rowValues = dataset.data.map(d => String(d[dimension.name])); + const values = prependPromotedValues(rowValues, promotedValues); + const matchingValues = filterRows(values, searchText); + if (searchText && matchingValues.length === 0) { return
    {`No results for "${searchText}"`}
    ; } - const sortedRows = sortRows(matchingRows, promotedValues); const checkboxStyle = filterMode === FilterMode.EXCLUDE ? "cross" : "check"; return - {sortedRows.map(value => ( + {matchingValues.map(value => ( Date: Fri, 14 May 2021 08:21:42 +0000 Subject: [PATCH 024/264] Release 1.32.0-beta.3 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 019612a74..bfa2d274b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "turnilo", - "version": "1.32.0-beta.2", + "version": "1.32.0-beta.3", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/package.json b/package.json index bf2c5c28c..45d9e306c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "turnilo", - "version": "1.32.0-beta.2", + "version": "1.32.0-beta.3", "description": "A web-based exploratory visualization UI for Druid.io", "keywords": [ "imply", From b21547abac702d779a16a822d5c882a2ce2a98a9 Mon Sep 17 00:00:00 2001 From: adrianmroz <78143552+adrianmroz-allegro@users.noreply.github.com> Date: Wed, 19 May 2021 09:57:44 +0200 Subject: [PATCH 025/264] Bump node-sass dependency (#760) --- package-lock.json | 646 ++++++++++++++++++++++++---------------------- package.json | 2 +- 2 files changed, 332 insertions(+), 316 deletions(-) diff --git a/package-lock.json b/package-lock.json index bfa2d274b..c53a1e7c4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,7 +5,7 @@ "requires": true, "packages": { "": { - "version": "1.32.0-beta.1", + "version": "1.32.0-beta.3", "license": "Apache-2.0", "dependencies": { "@sentry/browser": "5.0.6", @@ -104,7 +104,7 @@ "mime": "2.3.1", "mocha": "4.1.0", "nock": "11.0.0", - "node-sass": "4.13.1", + "node-sass": "4.14.1", "npm-run-all": "4.1.5", "querystring": "0.2.0", "randomstring": "1.1.5", @@ -3311,14 +3311,58 @@ } }, "node_modules/cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" + "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/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": { @@ -6956,10 +7000,13 @@ } }, "node_modules/get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true + "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-func-name": { "version": "2.0.0", @@ -7794,15 +7841,6 @@ "loose-envify": "^1.0.0" } }, - "node_modules/invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/ip-address": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-6.1.0.tgz", @@ -8503,18 +8541,6 @@ "node": ">=0.10.0" } }, - "node_modules/lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "dependencies": { - "invert-kv": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -9813,10 +9839,11 @@ } }, "node_modules/node-sass": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.13.1.tgz", - "integrity": "sha512-TTWFx+ZhyDx1Biiez2nB0L3YrCZ/8oHagaDalbuBSlqXgUPsdkUSzJsVxeDO9LtPB49+Fh3WQl3slABo6AotNw==", + "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", @@ -9832,7 +9859,7 @@ "node-gyp": "^3.8.0", "npmlog": "^4.0.0", "request": "^2.88.0", - "sass-graph": "^2.2.4", + "sass-graph": "2.2.5", "stdout-stream": "^1.4.0", "true-case-path": "^1.0.2" }, @@ -10425,18 +10452,6 @@ "node": ">=0.10.0" } }, - "node_modules/os-locale": { - "version": "1.4.0", - "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "dependencies": { - "lcid": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/os-tmpdir": { "version": "1.0.2", "resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -12018,9 +12033,9 @@ } }, "node_modules/require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "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/require-uncached": { @@ -12241,15 +12256,18 @@ "dev": true }, "node_modules/sass-graph": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.6.tgz", - "integrity": "sha512-MKuEYXFSGuRSi8FZ3A7imN1CeVn9Gpw0/SFJKdL1ejXJneI9a5rwlEZrKejhEFAA3O6yr3eIyl/WuvASvlT36g==", + "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": "^7.0.0" + "yargs": "^13.3.2" + }, + "bin": { + "sassgraph": "bin/sassgraph" } }, "node_modules/sass-lint": { @@ -12363,7 +12381,7 @@ }, "node_modules/scss-tokenizer/node_modules/source-map": { "version": "0.4.4", - "resolved": "http://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "dev": true, "dependencies": { @@ -14929,17 +14947,6 @@ "node": ">=6" } }, - "node_modules/webpack-cli/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/webpack-cli/node_modules/enhanced-resolve": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", @@ -14972,15 +14979,6 @@ "node": ">=6" } }, - "node_modules/webpack-cli/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/webpack-cli/node_modules/get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -15046,12 +15044,6 @@ "node": ">=6" } }, - "node_modules/webpack-cli/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/webpack-cli/node_modules/string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -15099,32 +15091,6 @@ "node": ">=6" } }, - "node_modules/webpack-cli/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/webpack-cli/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/webpack-cli/node_modules/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==", - "dev": true - }, "node_modules/webpack-cli/node_modules/yargs": { "version": "13.2.4", "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", @@ -15144,16 +15110,6 @@ "yargs-parser": "^13.1.0" } }, - "node_modules/webpack-cli/node_modules/yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, "node_modules/webpack-dev-middleware": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", @@ -15335,12 +15291,6 @@ "node": ">= 6.9.0" } }, - "node_modules/webpack/node_modules/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==", - "dev": true - }, "node_modules/webpack/node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -15376,9 +15326,9 @@ } }, "node_modules/which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "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": { @@ -15409,16 +15359,61 @@ } }, "node_modules/wrap-ansi": { - "version": "2.1.0", - "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "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": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" }, "engines": { - "node": ">=0.10.0" + "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/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": { @@ -15462,9 +15457,9 @@ } }, "node_modules/y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "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": { @@ -15474,52 +15469,75 @@ "dev": true }, "node_modules/yargs": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.1.tgz", - "integrity": "sha512-huO4Fr1f9PmiJJdll5kwoS2e4GqzGSsMT3PPMpOwoVkOK8ckqAewMTZyA6LXVQWflleb/Z8oPBEvNsMft0XE+g==", + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dev": true, "dependencies": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", + "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "5.0.0-security.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": "5.0.0-security.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0-security.0.tgz", - "integrity": "sha512-T69y4Ps64LNesYxeYGYPvfoMTt/7y1XtfpIslUeK4um+9Hu7hlGoRtaDLvdXb7+/tfq4opVa2HRY5xGip022rQ==", + "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": "^3.0.0", - "object.assign": "^4.1.0" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } }, - "node_modules/yargs-parser/node_modules/camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "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": ">=0.10.0" + "node": ">=6" } }, - "node_modules/yargs/node_modules/camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "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": ">=0.10.0" + "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" } }, "node_modules/yauzl": { @@ -18500,14 +18518,48 @@ } }, "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.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==", + "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=", + "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==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "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, + "requires": { + "ansi-regex": "^4.1.0" + } + } } }, "clone-deep": { @@ -21568,9 +21620,9 @@ } }, "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "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 }, "get-func-name": { @@ -22262,12 +22314,6 @@ "loose-envify": "^1.0.0" } }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, "ip-address": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-6.1.0.tgz", @@ -22850,15 +22896,6 @@ "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=", "dev": true }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -23964,9 +24001,9 @@ } }, "node-sass": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.13.1.tgz", - "integrity": "sha512-TTWFx+ZhyDx1Biiez2nB0L3YrCZ/8oHagaDalbuBSlqXgUPsdkUSzJsVxeDO9LtPB49+Fh3WQl3slABo6AotNw==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.14.1.tgz", + "integrity": "sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g==", "dev": true, "requires": { "async-foreach": "^0.1.3", @@ -23983,7 +24020,7 @@ "node-gyp": "^3.8.0", "npmlog": "^4.0.0", "request": "^2.88.0", - "sass-graph": "^2.2.4", + "sass-graph": "2.2.5", "stdout-stream": "^1.4.0", "true-case-path": "^1.0.2" }, @@ -24453,15 +24490,6 @@ "resolved": "http://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" }, - "os-locale": { - "version": "1.4.0", - "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dev": true, - "requires": { - "lcid": "^1.0.0" - } - }, "os-tmpdir": { "version": "1.0.2", "resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -25806,9 +25834,9 @@ "dev": true }, "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "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 }, "require-uncached": { @@ -26003,15 +26031,15 @@ "dev": true }, "sass-graph": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.6.tgz", - "integrity": "sha512-MKuEYXFSGuRSi8FZ3A7imN1CeVn9Gpw0/SFJKdL1ejXJneI9a5rwlEZrKejhEFAA3O6yr3eIyl/WuvASvlT36g==", + "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, "requires": { "glob": "^7.0.0", "lodash": "^4.0.0", "scss-tokenizer": "^0.2.3", - "yargs": "^7.0.0" + "yargs": "^13.3.2" } }, "sass-lint": { @@ -26117,7 +26145,7 @@ "dependencies": { "source-map": { "version": "0.4.4", - "resolved": "http://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "dev": true, "requires": { @@ -28340,12 +28368,6 @@ "worker-farm": "^1.7.0" } }, - "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==", - "dev": true - }, "yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -28379,17 +28401,6 @@ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, "enhanced-resolve": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", @@ -28416,12 +28427,6 @@ "strip-eof": "^1.0.0" } }, - "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 - }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -28469,12 +28474,6 @@ "mem": "^4.0.0" } }, - "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 - }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -28510,29 +28509,6 @@ "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", "dev": true }, - "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 - }, - "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, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "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==", - "dev": true - }, "yargs": { "version": "13.2.4", "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", @@ -28551,16 +28527,6 @@ "y18n": "^4.0.0", "yargs-parser": "^13.1.0" } - }, - "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } } } }, @@ -28660,9 +28626,9 @@ } }, "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, "wide-align": { @@ -28690,13 +28656,48 @@ } }, "wrap-ansi": { - "version": "2.1.0", - "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "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, "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.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==", + "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=", + "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==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "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, + "requires": { + "ansi-regex": "^4.1.0" + } + } } }, "wrappy": { @@ -28731,9 +28732,9 @@ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "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": { @@ -28743,50 +28744,65 @@ "dev": true }, "yargs": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.1.tgz", - "integrity": "sha512-huO4Fr1f9PmiJJdll5kwoS2e4GqzGSsMT3PPMpOwoVkOK8ckqAewMTZyA6LXVQWflleb/Z8oPBEvNsMft0XE+g==", + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dev": true, "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", + "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "5.0.0-security.0" + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" }, "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "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 + }, + "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 + }, + "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, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "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, + "requires": { + "ansi-regex": "^4.1.0" + } } } }, "yargs-parser": { - "version": "5.0.0-security.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0-security.0.tgz", - "integrity": "sha512-T69y4Ps64LNesYxeYGYPvfoMTt/7y1XtfpIslUeK4um+9Hu7hlGoRtaDLvdXb7+/tfq4opVa2HRY5xGip022rQ==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dev": true, "requires": { - "camelcase": "^3.0.0", - "object.assign": "^4.1.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - } + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } }, "yauzl": { diff --git a/package.json b/package.json index 45d9e306c..020222908 100644 --- a/package.json +++ b/package.json @@ -156,7 +156,7 @@ "mime": "2.3.1", "mocha": "4.1.0", "nock": "11.0.0", - "node-sass": "4.13.1", + "node-sass": "4.14.1", "npm-run-all": "4.1.5", "querystring": "0.2.0", "randomstring": "1.1.5", From 98a198e4b2ce4f184599643df11fc8c9c31cfba0 Mon Sep 17 00:00:00 2001 From: adrianmroz <78143552+adrianmroz-allegro@users.noreply.github.com> Date: Wed, 19 May 2021 10:13:41 +0200 Subject: [PATCH 026/264] Remove incorrect output type from 400 response on /plyql to prevent xss attack (#759) --- src/server/routes/plyql/plyql.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/routes/plyql/plyql.ts b/src/server/routes/plyql/plyql.ts index baf186342..bdcd9bc09 100644 --- a/src/server/routes/plyql/plyql.ts +++ b/src/server/routes/plyql/plyql.ts @@ -61,7 +61,7 @@ export function plyqlRouter(sourcesGetter: SourcesGetter) { const outputFn = outputFunctions[outputType]; if (outputFn === undefined) { - res.status(400).send("Invalid output type: " + outputType); + res.status(400).send("Invalid output type"); return; } From 5375f9eede5a127b24a9d79f5d7881ce120e830e Mon Sep 17 00:00:00 2001 From: adrianmroz-allegro Date: Fri, 21 May 2021 08:22:17 +0000 Subject: [PATCH 027/264] Release 1.32.0 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index c53a1e7c4..a9cafd8d2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "turnilo", - "version": "1.32.0-beta.3", + "version": "1.32.0", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/package.json b/package.json index 020222908..fb318ee5b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "turnilo", - "version": "1.32.0-beta.3", + "version": "1.32.0", "description": "A web-based exploratory visualization UI for Druid.io", "keywords": [ "imply", From aa761ccf8d1659100e0dfdc4383a4f203aba1559 Mon Sep 17 00:00:00 2001 From: adrianmroz <78143552+adrianmroz-allegro@users.noreply.github.com> Date: Wed, 2 Jun 2021 13:44:46 +0200 Subject: [PATCH 028/264] Sources refactor (#764) * Refactor DataCube * Clear code a bit * Refactor Dimensions * Simplify DataCube types * Remove few TODOs * essene tests * Fix tests * Bunch of tests * Measures refactor --- .../turnilo-application.tsx | 6 +- .../auto-refresh-menu/auto-refresh-menu.tsx | 8 +- .../components/debug-menu/debug-menu.tsx | 4 +- .../dimension-actions-menu.mocha.tsx | 5 +- .../dimension-list-tile/dimension-item.tsx | 9 +- .../dimension-list-tile.tsx | 34 +- .../dimensions-converter.ts | 74 +- .../dimensions-renderer.tsx | 4 +- .../dimension-measure-panel.mocha.tsx | 4 +- .../dimension-measure-panel.tsx | 10 +- .../time-filter-menu/fixed-time-tab.tsx | 3 +- .../time-filter-menu/preset-time-tab.tsx | 3 +- .../filter-menu/time-filter-menu/presets.ts | 10 +- .../components/filter-tile/filter-tile.tsx | 16 +- .../immutable-dropdown.mocha.tsx | 86 -- .../immutable-dropdown/immutable-dropdown.tsx | 84 -- .../immutable-input/immutable-input.mocha.tsx | 176 --- .../immutable-input/immutable-input.tsx | 207 --- .../immutable-list/immutable-list.scss | 95 -- .../immutable-list/immutable-list.tsx | 142 -- .../add-measure-series.mocha.tsx | 4 +- .../measure-actions-menu.tsx | 6 +- .../measures-tile/measures-converter.ts | 68 +- .../measures-tile/measures-tile.tsx | 14 +- .../pinboard-panel/pinboard-tiles.tsx | 3 +- .../pinboard-tile/utils/should-fetch.ts | 2 +- .../series-menu/arithmetic-series-menu.tsx | 27 +- .../components/series-menu/format-picker.tsx | 21 +- .../components/series-tile/add-series.tsx | 5 +- .../components/series-tile/series-tiles.tsx | 3 +- .../components/side-drawer/side-drawer.tsx | 8 +- .../sources-provider/sources-provider.tsx | 8 +- .../split-menu/granularity-picker.tsx | 4 +- .../components/split-menu/split-menu.tsx | 4 +- .../components/split-tile/add-split.tsx | 5 +- .../components/split-tile/split-tiles-row.tsx | 5 +- .../components/split-tile/split-tiles.tsx | 3 +- .../header/splits/split-columns.tsx | 3 +- .../vis-measure-label.mocha.tsx | 2 +- src/client/deserializers/data-cube.ts | 132 ++ src/client/deserializers/dimension.ts | 81 ++ src/client/deserializers/dimensions.ts | 26 + src/client/deserializers/measure.ts | 33 + .../measures.ts} | 16 +- src/client/deserializers/sources.ts | 17 +- .../modals/raw-data-modal/raw-data-modal.tsx | 11 +- src/client/utils/ajax/ajax.ts | 4 +- .../data-cubes-filter.mocha.ts | 12 +- .../data-cubes-filter/data-cubes-filter.ts | 8 +- src/client/utils/extent/extent.mocha.ts | 6 +- .../utils/tabular-options/tabular-options.ts | 5 +- .../views/cube-view/cube-view.mocha.tsx | 4 +- src/client/views/cube-view/cube-view.tsx | 29 +- src/client/views/home-view/home-view.tsx | 6 +- .../visualizations/bar-chart/bar-chart.tsx | 15 +- src/client/visualizations/grid/make-query.ts | 7 +- .../heat-map/heatmap-corner.tsx | 5 +- .../utils/create-highlight-clauses.ts | 7 +- .../heat-map/utils/scales.mocha.ts | 2 +- .../line-chart/legend/split-legend.tsx | 3 +- .../line-chart/utils/splits.mocha.ts | 24 +- .../visualizations/line-chart/utils/splits.ts | 3 +- .../line-chart/utils/x-scale.ts | 3 +- .../header/splits/combined-splits-title.tsx | 3 +- .../models/cluster/find-cluster.mocha.ts | 7 +- .../models/data-cube/data-cube.fixtures.ts | 301 +++-- .../models/data-cube/data-cube.mocha.ts | 172 +-- src/common/models/data-cube/data-cube.ts | 1148 +++++------------ .../models/data-cube/queryable-data-cube.ts | 172 +++ .../dimension/dimension-group.fixtures.ts | 85 -- .../models/dimension/dimension-group.mocha.ts | 61 - .../models/dimension/dimension-group.ts | 125 -- .../models/dimension/dimension.fixtures.ts | 109 +- .../models/dimension/dimension.mocha.ts | 136 -- src/common/models/dimension/dimension.ts | 495 ++++--- .../models/dimension/dimensions.fixtures.ts | 155 ++- .../models/dimension/dimensions.mocha.ts | 111 +- src/common/models/dimension/dimensions.ts | 205 +-- src/common/models/essence/essence.fixtures.ts | 14 +- src/common/models/essence/essence.mocha.ts | 49 +- src/common/models/essence/essence.ts | 84 +- .../expression/concreteArithmeticOperation.ts | 4 +- .../models/external-view/external-view.ts | 6 +- src/common/models/filter/filter.mocha.ts | 8 +- src/common/models/filter/filter.ts | 26 +- src/common/models/labels.ts | 12 +- .../models/measure/measure-group.fixtures.ts | 96 -- .../models/measure/measure-group.mocha.ts | 35 +- src/common/models/measure/measure-group.ts | 125 -- src/common/models/measure/measure.fixtures.ts | 152 +-- src/common/models/measure/measure.mocha.ts | 137 +- src/common/models/measure/measure.ts | 263 ++-- .../models/measure/measures.fixtures.ts | 99 +- src/common/models/measure/measures.mocha.ts | 123 +- src/common/models/measure/measures.ts | 249 ++-- src/common/models/series-list/series-list.ts | 8 +- src/common/models/series/concrete-series.ts | 2 +- .../series/quantile-concrete-series.mocha.ts | 4 +- .../models/series/quantile-series.mocha.ts | 6 +- src/common/models/series/series-format.ts | 2 +- src/common/models/series/series.mocha.ts | 14 +- src/common/models/sort-on/sort-on.fixtures.ts | 18 +- src/common/models/sort-on/sort-on.ts | 3 +- src/common/models/sources/sources.fixtures.ts | 19 +- src/common/models/sources/sources.ts | 27 +- src/common/models/splits/splits.ts | 25 +- .../split-canonical-length.mocha.ts | 6 +- .../split-canonical-length.ts | 6 +- .../utils/external/datacube-to-external.ts | 118 ++ .../utils/functional/functional.mocha.ts | 18 +- src/common/utils/functional/functional.ts | 4 + .../immutable-array-equals.mocha.ts | 48 + .../immutable-array-equals.ts} | 13 +- src/common/utils/object/object.mocha.ts | 20 +- src/common/utils/object/object.ts | 7 +- src/common/utils/query/max-time-query.ts | 31 + .../query/preview-string-filter-query.ts | 3 +- .../query/selectable-string-filter-query.ts | 3 +- src/common/utils/query/visualization-query.ts | 11 +- src/common/utils/rules/actions.ts | 9 +- src/common/utils/rules/predicates.ts | 7 +- src/common/utils/rules/resolutions.ts | 20 +- .../visualization-dependent-evaluator.ts | 6 +- .../visualization-independent-evaluator.ts | 4 +- .../url-hash-converter.mocha.ts | 16 +- .../url-hash-converter/url-hash-converter.ts | 15 +- src/common/utils/yaml-helper/yaml-helper.ts | 28 +- .../test/data-cube.fixture.ts | 24 +- src/common/view-definitions/test/dimension.ts | 28 +- src/common/view-definitions/test/measure.ts | 13 +- .../view-definition-converter-2.mocha.ts | 8 +- .../version-2/view-definition-converter-2.ts | 24 +- .../version-3/measures-definition.ts | 4 +- .../version-3/view-definition-converter-3.ts | 4 +- .../version-4/filter-definition.ts | 12 +- .../version-4/test/filter-definition.mocha.ts | 12 +- .../version-4/view-definition-converter-4.ts | 4 +- .../view-definition-converter.ts | 5 +- .../bar-chart/bar-chart.ts | 9 +- .../heat-map/heat-map.ts | 31 +- .../line-chart/line-chart.ts | 16 +- .../visualization-manifests/table/table.ts | 3 +- src/server/config.ts | 6 +- src/server/routes/mkurl/mkurl.ts | 13 +- src/server/routes/plyql/plyql.ts | 7 + src/server/routes/plywood/plywood.ts | 5 +- .../datacube-guard/datacube-guard.mocha.ts | 14 +- .../settings-manager/settings-manager.ts | 31 +- 148 files changed, 2949 insertions(+), 4246 deletions(-) delete mode 100644 src/client/components/immutable-dropdown/immutable-dropdown.mocha.tsx delete mode 100644 src/client/components/immutable-dropdown/immutable-dropdown.tsx delete mode 100644 src/client/components/immutable-input/immutable-input.mocha.tsx delete mode 100644 src/client/components/immutable-input/immutable-input.tsx delete mode 100644 src/client/components/immutable-list/immutable-list.scss delete mode 100644 src/client/components/immutable-list/immutable-list.tsx create mode 100644 src/client/deserializers/data-cube.ts create mode 100644 src/client/deserializers/dimension.ts create mode 100644 src/client/deserializers/dimensions.ts create mode 100644 src/client/deserializers/measure.ts rename src/client/{components/immutable-dropdown/immutable-dropdown.scss => deserializers/measures.ts} (58%) create mode 100644 src/common/models/data-cube/queryable-data-cube.ts delete mode 100644 src/common/models/dimension/dimension-group.fixtures.ts delete mode 100644 src/common/models/dimension/dimension-group.mocha.ts delete mode 100644 src/common/models/dimension/dimension-group.ts delete mode 100644 src/common/models/dimension/dimension.mocha.ts delete mode 100644 src/common/models/measure/measure-group.fixtures.ts delete mode 100644 src/common/models/measure/measure-group.ts create mode 100644 src/common/utils/external/datacube-to-external.ts create mode 100644 src/common/utils/immutable-utils/immutable-array-equals.mocha.ts rename src/{client/components/immutable-input/immutable-input.scss => common/utils/immutable-utils/immutable-array-equals.ts} (62%) create mode 100644 src/common/utils/query/max-time-query.ts diff --git a/src/client/applications/turnilo-application/turnilo-application.tsx b/src/client/applications/turnilo-application/turnilo-application.tsx index 143410b6d..8bb909e19 100644 --- a/src/client/applications/turnilo-application/turnilo-application.tsx +++ b/src/client/applications/turnilo-application/turnilo-application.tsx @@ -18,7 +18,7 @@ import { NamedArray } from "immutable-class"; import * as React from "react"; import { ClientAppSettings } from "../../../common/models/app-settings/app-settings"; -import { DataCube } from "../../../common/models/data-cube/data-cube"; +import { ClientDataCube } from "../../../common/models/data-cube/data-cube"; import { Essence } from "../../../common/models/essence/essence"; import { isEnabled as isOAuthEnabled } from "../../../common/models/oauth/oauth"; import { Timekeeper } from "../../../common/models/timekeeper/timekeeper"; @@ -142,12 +142,12 @@ export class TurniloApplication extends React.Component { + updateCubeAndEssenceInHash = (dataCube: ClientDataCube, essence: Essence, force: boolean) => { const newHash = `${dataCube.name}/${(urlHashConverter.toHash(essence))}`; this.changeHash(newHash, force); }; - urlForEssence = (dataCube: DataCube, essence: Essence): string => { + urlForEssence = (dataCube: ClientDataCube, essence: Essence): string => { return `${this.getUrlPrefix()}#${dataCube.name}/${(urlHashConverter.toHash(essence))}`; }; diff --git a/src/client/components/auto-refresh-menu/auto-refresh-menu.tsx b/src/client/components/auto-refresh-menu/auto-refresh-menu.tsx index d80121ab1..fe0431251 100644 --- a/src/client/components/auto-refresh-menu/auto-refresh-menu.tsx +++ b/src/client/components/auto-refresh-menu/auto-refresh-menu.tsx @@ -17,7 +17,7 @@ import { Duration, Timezone } from "chronoshift"; import * as React from "react"; -import { DataCube } from "../../../common/models/data-cube/data-cube"; +import { ClientDataCube, getMaxTime } from "../../../common/models/data-cube/data-cube"; import { Stage } from "../../../common/models/stage/stage"; import { Timekeeper } from "../../../common/models/timekeeper/timekeeper"; import { Unary } from "../../../common/utils/functional/functional"; @@ -54,7 +54,7 @@ export interface AutoRefreshMenuProps { autoRefreshRate: Duration; setAutoRefreshRate: Unary; refreshMaxTime: Fn; - dataCube: DataCube; + dataCube: ClientDataCube; timekeeper: Timekeeper; timezone: Timezone; } @@ -71,14 +71,14 @@ function renderRefreshIntervalDropdown(autoRefreshRate: Duration, setAutoRefresh />; } -function updatedText(dataCube: DataCube, timekeeper: Timekeeper, timezone: Timezone): string { +function updatedText(dataCube: ClientDataCube, timekeeper: Timekeeper, timezone: Timezone): string { const { refreshRule } = dataCube; if (refreshRule.isRealtime()) { return "Updated ~1 second ago"; } else if (refreshRule.isFixed()) { return `Fixed to ${formatDateTime(refreshRule.time, timezone)}`; } else { // refreshRule is query - const maxTime = dataCube.getMaxTime(timekeeper); + const maxTime = getMaxTime(dataCube, timekeeper); if (!maxTime) return null; return `Updated ${formatTimeElapsed(maxTime, timezone)} ago`; } diff --git a/src/client/components/debug-menu/debug-menu.tsx b/src/client/components/debug-menu/debug-menu.tsx index acaf67797..8a059bf4b 100644 --- a/src/client/components/debug-menu/debug-menu.tsx +++ b/src/client/components/debug-menu/debug-menu.tsx @@ -15,7 +15,7 @@ */ import * as React from "react"; -import { DataCube } from "../../../common/models/data-cube/data-cube"; +import { ClientDataCube } from "../../../common/models/data-cube/data-cube"; import { Stage } from "../../../common/models/stage/stage"; import { Fn } from "../../../common/utils/general/general"; import { STRINGS } from "../../config/constants"; @@ -27,7 +27,7 @@ export interface DebugMenuProps { openRawDataModal: Fn; openViewDefinitionModal: Fn; openDruidQueryModal: Fn; - dataCube: DataCube; + dataCube: ClientDataCube; } export const DebugMenu: React.SFC = ({ dataCube, openOn, onClose, openDruidQueryModal, openRawDataModal, openViewDefinitionModal }) => { diff --git a/src/client/components/dimension-actions-menu/dimension-actions-menu.mocha.tsx b/src/client/components/dimension-actions-menu/dimension-actions-menu.mocha.tsx index c913680cd..a079bc2ce 100644 --- a/src/client/components/dimension-actions-menu/dimension-actions-menu.mocha.tsx +++ b/src/client/components/dimension-actions-menu/dimension-actions-menu.mocha.tsx @@ -16,7 +16,6 @@ import { expect } from "chai"; import { mount, shallow } from "enzyme"; -import { List } from "immutable"; import * as React from "react"; import * as sinon from "sinon"; import { SinonSpy } from "sinon"; @@ -56,7 +55,7 @@ describe("", () => { it("renders disabled action when dimension is only selected split", () => { const dimension = DimensionFixtures.wikiCommentLength(); - const essenceWithOneSplit = EssenceFixtures.wikiTable().changeSplits(Splits.fromDimensions(List.of(dimension)), VisStrategy.FairGame); + const essenceWithOneSplit = EssenceFixtures.wikiTable().changeSplits(Splits.fromDimensions([dimension]), VisStrategy.FairGame); const actions = dimActions(dimension, essenceWithOneSplit); @@ -93,7 +92,7 @@ describe("", () => { it("calls onClose but not clicker.changeSplit when dimension is selected", () => { const dimension = DimensionFixtures.countryURL(); - const essenceWithOneSplit = EssenceFixtures.wikiTable().changeSplits(Splits.fromDimensions(List.of(dimension)), VisStrategy.FairGame); + const essenceWithOneSplit = EssenceFixtures.wikiTable().changeSplits(Splits.fromDimensions([dimension]), VisStrategy.FairGame); const actions = dimActions(dimension, essenceWithOneSplit); actions.find(".split").simulate("click"); diff --git a/src/client/components/dimension-list-tile/dimension-item.tsx b/src/client/components/dimension-list-tile/dimension-item.tsx index 312994d44..245c267fa 100644 --- a/src/client/components/dimension-list-tile/dimension-item.tsx +++ b/src/client/components/dimension-list-tile/dimension-item.tsx @@ -16,6 +16,7 @@ import * as React from "react"; import { DragEvent, MouseEvent } from "react"; +import { DimensionKind } from "../../../common/models/dimension/dimension"; import { classNames } from "../../utils/dom/dom"; import { HighlightString } from "../highlight-string/highlight-string"; import { InfoBubble } from "../info-bubble/info-bubble"; @@ -28,19 +29,19 @@ export interface DimensionItemProps { name: string; title: string; description?: string; - classSuffix: string; dimensionClick: DimensionClickHandler; dimensionDragStart: DimensionDragStartHandler; searchText: string; selected: boolean; + kind: DimensionKind; } export type DimensionClickHandler = (dimensionName: string, e: MouseEvent) => void; export type DimensionDragStartHandler = (dimensionName: string, e: DragEvent) => void; -export const DimensionItem: React.SFC = ({ name, title, dimensionClick, dimensionDragStart, description, classSuffix, searchText, selected }) => { +export const DimensionItem: React.SFC = ({ name, title, dimensionClick, dimensionDragStart, description, searchText, kind, selected }) => { const infoBubbleClassName = "info-icon"; - const className = classNames(DIMENSION_CLASS_NAME, "type-" + classSuffix, { selected }); + const className = classNames(DIMENSION_CLASS_NAME, { selected }); const handleClick = (e: MouseEvent) => { const target = e.currentTarget; @@ -60,7 +61,7 @@ export const DimensionItem: React.SFC = ({ name, title, dime >
    - +
    diff --git a/src/client/components/dimension-list-tile/dimension-list-tile.tsx b/src/client/components/dimension-list-tile/dimension-list-tile.tsx index b88636986..32a7b0592 100644 --- a/src/client/components/dimension-list-tile/dimension-list-tile.tsx +++ b/src/client/components/dimension-list-tile/dimension-list-tile.tsx @@ -18,8 +18,8 @@ import * as React from "react"; import { Component, CSSProperties, DragEvent, MouseEvent } from "react"; import { Clicker } from "../../../common/models/clicker/clicker"; -import { DataCube } from "../../../common/models/data-cube/data-cube"; import { Dimension } from "../../../common/models/dimension/dimension"; +import { findDimensionByName } from "../../../common/models/dimension/dimensions"; import { Essence } from "../../../common/models/essence/essence"; import { Filter } from "../../../common/models/filter/filter"; import { Splits } from "../../../common/models/splits/splits"; @@ -32,7 +32,7 @@ import { SearchableTile } from "../searchable-tile/searchable-tile"; import { TileHeaderIcon } from "../tile-header/tile-header"; import { DIMENSION_CLASS_NAME } from "./dimension-item"; import "./dimension-list-tile.scss"; -import { DimensionOrGroupForView, DimensionsConverter } from "./dimensions-converter"; +import { convert, DimensionOrGroupForView } from "./dimensions-converter"; import { DimensionsRenderer } from "./dimensions-renderer"; export interface DimensionListTileProps { @@ -55,21 +55,21 @@ const hasSearchTextPredicate = (searchText: string) => (dimension: Dimension): b }; const isFilteredOrSplitPredicate = (essence: Essence) => (dimension: Dimension): boolean => { - const { dataCube, filter, splits } = essence; - return isFiltered(dimension, filter, dataCube) || isSplit(dimension, splits, dataCube); + const { filter, splits } = essence; + return isFiltered(dimension, filter) || isSplit(dimension, splits); }; -const isSplit = (dimension: Dimension, { splits }: Splits, dataCube: DataCube): boolean => { +const isSplit = (dimension: Dimension, { splits }: Splits): boolean => { return splits - .map(split => dataCube.dimensions.getDimensionByName(split.reference)) - .contains(dimension); + .map(split => split.reference) + .contains(dimension.name); }; -const isFiltered = (dimension: Dimension, filter: Filter, dataCube: DataCube): boolean => { +const isFiltered = (dimension: Dimension, filter: Filter): boolean => { return filter .clauses - .map(clause => dataCube.dimensions.getDimensionByName(clause.reference)) - .contains(dimension); + .map(clause => clause.reference) + .contains(dimension.name); }; const isSelectedDimensionPredicate = (menuDimension: Dimension) => (dimension: Dimension): boolean => { @@ -93,7 +93,7 @@ export class DimensionListTile extends Component) => { const { essence: { dataCube } } = this.props; - const dimension = dataCube.dimensions.getDimensionByName(dimensionName); + const dimension = findDimensionByName(dataCube.dimensions, dimensionName); const dataTransfer = e.dataTransfer; dataTransfer.effectAllowed = "all"; @@ -141,8 +141,8 @@ export class DimensionListTile extends Component { - constructor( - private readonly hasSearchTextPredicate: (dimension: Dimension) => boolean, - private readonly isFilteredOrSplitPredicate: (dimension: Dimension) => boolean, - private readonly isSelectedDimensionPredicate: (dimension: Dimension) => boolean - ) { - } +export function convert( + dimensions: Dimensions, + hasSearchTextPredicate: (dimension: Dimension) => boolean, + isFilteredOrSplitPredicate: (dimension: Dimension) => boolean, + isSelectedDimensionPredicate: (dimension: Dimension) => boolean): DimensionOrGroupForView[] { - visitDimension(dimension: Dimension): DimensionOrGroupForView { - const { hasSearchTextPredicate, isFilteredOrSplitPredicate, isSelectedDimensionPredicate } = this; - const { name, title, description, className } = dimension; + const { byName, tree } = dimensions; - return { - name, - title, - description, - classSuffix: className, - isFilteredOrSplit: isFilteredOrSplitPredicate(dimension), - hasSearchText: hasSearchTextPredicate(dimension), - selected: isSelectedDimensionPredicate(dimension), - type: DimensionForViewType.dimension - }; - } + function convertElement(el: DimensionOrGroup): DimensionOrGroupForView { + if (isDimensionId(el)) { + const dimension = byName[el]; + const { name, title, kind, description } = dimension; - visitDimensionGroup(dimensionGroup: DimensionGroup): DimensionOrGroupForView { - const { name, description, title, dimensions } = dimensionGroup; - const dimensionsForView = dimensions.map(item => item.accept(this)); + return { + name, + title, + description, + kind, + isFilteredOrSplit: isFilteredOrSplitPredicate(dimension), + hasSearchText: hasSearchTextPredicate(dimension), + selected: isSelectedDimensionPredicate(dimension), + type: DimensionForViewType.dimension + }; + } else { + const { name, description, title, dimensions } = el; + const dimensionsForView = dimensions.map(item => convertElement(item)); - return { - name, - title, - description, - hasSearchText: dimensionsForView.some(item => item.hasSearchText), - isFilteredOrSplit: dimensionsForView.some(item => item.isFilteredOrSplit), - children: dimensionsForView, - type: DimensionForViewType.group - }; + return { + name, + title, + description, + hasSearchText: dimensionsForView.some(item => item.hasSearchText), + isFilteredOrSplit: dimensionsForView.some(item => item.isFilteredOrSplit), + children: dimensionsForView, + type: DimensionForViewType.group + }; + } } + + return tree.map(convertElement); } diff --git a/src/client/components/dimension-list-tile/dimensions-renderer.tsx b/src/client/components/dimension-list-tile/dimensions-renderer.tsx index ca2d1e8fc..61dddc6b7 100644 --- a/src/client/components/dimension-list-tile/dimensions-renderer.tsx +++ b/src/client/components/dimension-list-tile/dimensions-renderer.tsx @@ -59,7 +59,7 @@ export class DimensionsRenderer { private renderDimension(dimensionView: DimensionForView): JSX.Element { const { dimensionClick, dimensionDragStart, searchText } = this; - const { name, title, description, classSuffix, selected } = dimensionView; + const { name, title, description, kind, selected } = dimensionView; return ; } diff --git a/src/client/components/dimension-measure-panel/dimension-measure-panel.mocha.tsx b/src/client/components/dimension-measure-panel/dimension-measure-panel.mocha.tsx index 665fd406c..ce08944ce 100644 --- a/src/client/components/dimension-measure-panel/dimension-measure-panel.mocha.tsx +++ b/src/client/components/dimension-measure-panel/dimension-measure-panel.mocha.tsx @@ -19,7 +19,7 @@ import { expect } from "chai"; import { shallow } from "enzyme"; import * as React from "react"; import { Clicker } from "../../../common/models/clicker/clicker"; -import { DataCubeFixtures } from "../../../common/models/data-cube/data-cube.fixtures"; +import { wikiClientDataCube } from "../../../common/models/data-cube/data-cube.fixtures"; import { EssenceFixtures } from "../../../common/models/essence/essence.fixtures"; import { ResizeHandle } from "../resize-handle/resize-handle"; import { DimensionMeasurePanel, initialPosition, MIN_PANEL_SIZE } from "./dimension-measure-panel"; @@ -56,7 +56,7 @@ describe("DimensionMeasurePanel", () => { describe("initialPosition", () => { [300, 500, 1000].forEach(height => { it(`should calculate position according to ratio for height ${height}`, () => { - const position = initialPosition(height, DataCubeFixtures.wiki()); + const position = initialPosition(height, wikiClientDataCube); expect(position, "lower than total height").to.be.lt(height); expect(position, "should leave minimal space for dimensions").to.be.gte(MIN_PANEL_SIZE); diff --git a/src/client/components/dimension-measure-panel/dimension-measure-panel.tsx b/src/client/components/dimension-measure-panel/dimension-measure-panel.tsx index d4e14face..454b39933 100644 --- a/src/client/components/dimension-measure-panel/dimension-measure-panel.tsx +++ b/src/client/components/dimension-measure-panel/dimension-measure-panel.tsx @@ -17,9 +17,11 @@ import * as React from "react"; import { Clicker } from "../../../common/models/clicker/clicker"; -import { DataCube } from "../../../common/models/data-cube/data-cube"; +import { ClientDataCube } from "../../../common/models/data-cube/data-cube"; import { Dimension } from "../../../common/models/dimension/dimension"; +import { allDimensions } from "../../../common/models/dimension/dimensions"; import { Essence } from "../../../common/models/essence/essence"; +import { allMeasures } from "../../../common/models/measure/measures"; import { Series } from "../../../common/models/series/series"; import { Stage } from "../../../common/models/stage/stage"; import { Unary } from "../../../common/utils/functional/functional"; @@ -52,9 +54,9 @@ function dividerConstraints(height: number) { return { minDividerPosition, maxDividerPosition }; } -export function initialPosition(height: number, dataCube: DataCube) { - const dimensionsCount = dataCube.dimensions.size(); - const measuresCount = dataCube.measures.size(); +export function initialPosition(height: number, dataCube: ClientDataCube) { + const dimensionsCount = allDimensions(dataCube.dimensions).length; + const measuresCount = allMeasures(dataCube.measures).length; const ratio = dimensionsCount / (measuresCount + dimensionsCount); const { minDividerPosition, maxDividerPosition } = dividerConstraints(height); diff --git a/src/client/components/filter-menu/time-filter-menu/fixed-time-tab.tsx b/src/client/components/filter-menu/time-filter-menu/fixed-time-tab.tsx index 58eaa4309..cd8b2c983 100644 --- a/src/client/components/filter-menu/time-filter-menu/fixed-time-tab.tsx +++ b/src/client/components/filter-menu/time-filter-menu/fixed-time-tab.tsx @@ -18,6 +18,7 @@ import { day } from "chronoshift"; import { List } from "immutable"; import * as React from "react"; import { Clicker } from "../../../../common/models/clicker/clicker"; +import { getMaxTime } from "../../../../common/models/data-cube/data-cube"; import { DateRange } from "../../../../common/models/date-range/date-range"; import { Dimension } from "../../../../common/models/dimension/dimension"; import { Essence } from "../../../../common/models/essence/essence"; @@ -146,7 +147,7 @@ export class FixedTimeTab extends React.Component - {essence.dataCube.isTimeAttribute(dimension.expression) && this.renderLatestPresets()} + {isTimeAttribute(essence.dataCube, dimension.expression) && this.renderLatestPresets()} {this.renderButtonGroup(STRINGS.current, TimeFilterPeriod.CURRENT)} {this.renderButtonGroup(STRINGS.previous, TimeFilterPeriod.PREVIOUS)}
    {previewText}
    diff --git a/src/client/components/filter-menu/time-filter-menu/presets.ts b/src/client/components/filter-menu/time-filter-menu/presets.ts index 72b946197..e50785ffe 100644 --- a/src/client/components/filter-menu/time-filter-menu/presets.ts +++ b/src/client/components/filter-menu/time-filter-menu/presets.ts @@ -56,6 +56,14 @@ export interface ShiftPreset { shift: TimeShift; } +export const DEFAULT_TIME_SHIFT_DURATIONS = [ + "P1D", "P1W", "P1M", "P3M" +]; + +export const DEFAULT_LATEST_PERIOD_DURATIONS = [ + "PT1H", "PT6H", "P1D", "P7D", "P30D" +]; + export const COMPARISON_PRESETS: ShiftPreset[] = [ { label: "Off", shift: TimeShift.empty() }, { label: "D", shift: TimeShift.fromJS("P1D") }, @@ -78,7 +86,7 @@ export function constructFilter(period: TimeFilterPeriod, duration: string): Exp } export function getTimeFilterPresets(period: TimeFilterPeriod): TimeFilterPreset[] { - switch (period) { + switch (period) { case TimeFilterPeriod.PREVIOUS: return PREVIOUS_PRESETS; case TimeFilterPeriod.LATEST: diff --git a/src/client/components/filter-tile/filter-tile.tsx b/src/client/components/filter-tile/filter-tile.tsx index 385c34981..6f9921080 100644 --- a/src/client/components/filter-tile/filter-tile.tsx +++ b/src/client/components/filter-tile/filter-tile.tsx @@ -19,7 +19,9 @@ import { Timezone } from "chronoshift"; import * as React from "react"; import * as ReactDOM from "react-dom"; import { Clicker } from "../../../common/models/clicker/clicker"; +import { isTimeAttribute } from "../../../common/models/data-cube/data-cube"; import { Dimension } from "../../../common/models/dimension/dimension"; +import { allDimensions, findDimensionByName } from "../../../common/models/dimension/dimensions"; import { DragPosition } from "../../../common/models/drag-position/drag-position"; import { Essence } from "../../../common/models/essence/essence"; import { FilterClause, isTimeFilter } from "../../../common/models/filter-clause/filter-clause"; @@ -279,7 +281,7 @@ export class FilterTile extends React.Component
    ; @@ -425,7 +427,7 @@ export class FilterTile extends React.Component { - const dimension = dataCube.getDimension(clause.reference); + const dimension = findDimensionByName(dataCube.dimensions, clause.reference); if (!dimension) return null; return { dimension, @@ -516,8 +518,8 @@ export class FilterTile extends React.Component !filter.getClauseForDimension(dimension)) + const tiles = allDimensions(dataCube.dimensions) + .filter(dimension => !filter.getClauseForDimension(dimension)) .map(dimension => { return { key: dimension.name, diff --git a/src/client/components/immutable-dropdown/immutable-dropdown.mocha.tsx b/src/client/components/immutable-dropdown/immutable-dropdown.mocha.tsx deleted file mode 100644 index 299714346..000000000 --- a/src/client/components/immutable-dropdown/immutable-dropdown.mocha.tsx +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright 2015-2016 Imply Data, Inc. - * Copyright 2017-2019 Allegro.pl - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { expect } from "chai"; -import * as React from "react"; -import * as TestUtils from "react-dom/test-utils"; -import * as sinon from "sinon"; -import { DataCube } from "../../../common/models/data-cube/data-cube"; -import { DataCubeFixtures } from "../../../common/models/data-cube/data-cube.fixtures"; -import { ListItem } from "../../../common/models/list-item/list-item"; - -import { findDOMNode, renderIntoDocument } from "../../utils/test-utils"; - -import { ImmutableDropdown } from "./immutable-dropdown"; - -const ITEMS = [{ value: "value1", label: "label1" }, { value: "value2", label: "label2" }]; - -describe("ImmutableDropdown", () => { - let component: any; - let node: any; - let onChange: any; - - beforeEach(() => { - - onChange = sinon.spy(); - - component = renderIntoDocument( - - instance={DataCubeFixtures.twitter()} - path={"clusterName"} - label="Cluster" - - onChange={onChange} - - items={ITEMS} - - equal={(a: ListItem, b: ListItem) => a.value === b.value} - renderItem={(a: ListItem) => a.label} - keyItem={(a: ListItem) => a.value} - /> - ); - - node = findDOMNode(component) as any; - }); - - it("adds the correct class", () => { - expect(TestUtils.isCompositeComponent(component), "should be composite").to.equal(true); - expect(node.className, "should contain class").to.contain("immutable-dropdown"); - }); - - it("selects an item and calls onChange", () => { - expect(onChange.callCount).to.equal(0); - - TestUtils.Simulate.click(node); - - const items = TestUtils.scryRenderedDOMComponentsWithClass(component, "dropdown-item"); - - TestUtils.Simulate.click(items[1]); - - expect(onChange.callCount).to.equal(1); - - const args = onChange.args[0]; - - expect(args[0]).to.be.instanceOf(DataCube); - expect(args[0].clusterName).to.equal(ITEMS[1].value); - - expect(args[1]).to.equal(true); - - expect(args[2]).to.equal("clusterName"); - }); - -}); diff --git a/src/client/components/immutable-dropdown/immutable-dropdown.tsx b/src/client/components/immutable-dropdown/immutable-dropdown.tsx deleted file mode 100644 index ed98af968..000000000 --- a/src/client/components/immutable-dropdown/immutable-dropdown.tsx +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright 2015-2016 Imply Data, Inc. - * Copyright 2017-2019 Allegro.pl - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import * as React from "react"; -import { ListItem } from "../../../common/models/list-item/list-item"; -import { ImmutableUtils } from "../../../common/utils/immutable-utils/immutable-utils"; -import { ChangeFn } from "../../utils/immutable-form-delegate/immutable-form-delegate"; -import { Dropdown } from "../dropdown/dropdown"; -import "./immutable-dropdown.scss"; - -export interface ImmutableDropdownProps { - instance: any; - path: string; - label?: string; - - items: T[]; - equal: (a: T, b: T) => boolean; - renderItem: (a: T) => string; - keyItem: (a: T) => any; - onChange: ChangeFn; -} - -export interface ImmutableDropdownState { -} - -export class ImmutableDropdown extends React.Component, ImmutableDropdownState> { - - static simpleGenerator(instance: any, changeFn: ChangeFn) { - return (name: string, items: ListItem[]) => { - return - items={items} - instance={instance} - path={name} - equal={(a: ListItem, b: ListItem) => a.value === b.value} - renderItem={(a: ListItem) => a ? a.label : ""} - keyItem={(a: ListItem) => a.value || "default_value"} - onChange={changeFn} - />; - }; - } - - onChange = (newSelectedItem: T) => { - const { instance, path, onChange, keyItem } = this.props; - - onChange( - ImmutableUtils.setProperty(instance, path, keyItem(newSelectedItem)), - true, - path, - undefined - ); - }; - - render() { - const { label, items, equal, renderItem, keyItem, instance, path } = this.props; - const selectedValue = ImmutableUtils.getProperty(instance, path); - - const selectedItem: T = items.filter(item => keyItem(item) === selectedValue)[0] || items[0]; - - return - className="immutable-dropdown input" - label={label} - items={items} - selectedItem={selectedItem} - equal={equal} - renderItem={renderItem} - keyItem={keyItem} - onSelect={this.onChange} - />; - } -} diff --git a/src/client/components/immutable-input/immutable-input.mocha.tsx b/src/client/components/immutable-input/immutable-input.mocha.tsx deleted file mode 100644 index f4aae8d99..000000000 --- a/src/client/components/immutable-input/immutable-input.mocha.tsx +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Copyright 2015-2016 Imply Data, Inc. - * Copyright 2017-2019 Allegro.pl - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { expect } from "chai"; -import * as React from "react"; -import * as TestUtils from "react-dom/test-utils"; -import * as sinon from "sinon"; -import { DataCube } from "../../../common/models/data-cube/data-cube"; -import { DataCubeFixtures } from "../../../common/models/data-cube/data-cube.fixtures"; -import { findDOMNode, renderIntoDocument } from "../../utils/test-utils"; -import { ImmutableInput } from "./immutable-input"; - -describe("ImmutableInput", () => { - var component: any; - var node: any; - var onChange: any; - var onInvalid: any; - - beforeEach(() => { - onChange = sinon.spy(); - onInvalid = sinon.spy(); - - component = renderIntoDocument( - - ); - - node = findDOMNode(component) as any; - }); - - it("adds the correct class", () => { - expect(TestUtils.isCompositeComponent(component), "should be composite").to.equal(true); - expect(node.className, "should contain class").to.contain("immutable-input"); - }); - - it("works for valid values", () => { - node.value = "giraffe"; - TestUtils.Simulate.change(node); - - expect(onInvalid.callCount).to.equal(0); - - expect(onChange.callCount).to.equal(1); - const args = onChange.args[0]; - - expect(args[0]).to.be.instanceOf(DataCube); - expect(args[0].clusterName).to.equal("giraffe"); - - expect(args[1]).to.equal(true); - - expect(args[2]).to.equal("clusterName"); - }); - - it("works for invalid values", () => { - node.value = ""; - TestUtils.Simulate.change(node); - - expect(onInvalid.callCount).to.equal(1); - expect(onInvalid.args[0][0]).to.equal(""); - - expect(onChange.callCount).to.equal(1); - var args = onChange.args[0]; - - expect(args[0]).to.be.instanceOf(DataCube); - expect(args[0].clusterName).to.equal(DataCubeFixtures.twitter().clusterName); - - expect(args[1]).to.equal(false); - - expect(args[2]).to.equal("clusterName"); - - expect(node.value).to.equal(""); - - // Back to valid value - - node.value = "pouet"; - TestUtils.Simulate.change(node); - - expect(onInvalid.callCount).to.equal(1); - - expect(onChange.callCount).to.equal(2); - args = onChange.args[1]; - - expect(args[0]).to.be.instanceOf(DataCube); - expect(args[0].clusterName).to.equal("pouet"); - - expect(args[1]).to.equal(true); - - expect(args[2]).to.equal("clusterName"); - - expect(node.value).to.equal("pouet"); - }); - - describe("with stringToValue/valueToString", () => { - beforeEach(() => { - let stringToValue = (str: string) => { - if (str === "PLATYPUS") throw new Error("It's not even like a real animal amirite"); - return str.toLowerCase(); - }; - - let valueToString = (str: string) => str.toUpperCase(); - - component = renderIntoDocument( - - ); - - node = findDOMNode(component) as any; - }); - - it("works for valid values", () => { - expect(node.value).to.equal("DRUID-TWITTER"); - - node.value = "GIRAFFE"; - TestUtils.Simulate.change(node); - - expect(onInvalid.callCount).to.equal(0); - - expect(onChange.callCount).to.equal(1); - const args = onChange.args[0]; - - expect(args[0]).to.be.instanceOf(DataCube); - expect(args[0].clusterName).to.equal("giraffe"); - - expect(args[1]).to.equal(true); - - expect(args[2]).to.equal("clusterName"); - }); - - it("works when an error is thrown", () => { - expect(node.value).to.equal("DRUID-TWITTER"); - - node.value = "PLATYPUS"; - TestUtils.Simulate.change(node); - - expect(onInvalid.callCount).to.equal(1); - expect(onInvalid.args[0][0]).to.equal(undefined); - - expect(onChange.callCount).to.equal(1); - var args = onChange.args[0]; - - expect(args[0]).to.be.instanceOf(DataCube); - expect(args[0].clusterName).to.equal(DataCubeFixtures.twitter().clusterName); - - expect(args[1]).to.equal(false); - - expect(args[2]).to.equal("clusterName"); - - expect(node.value).to.equal("PLATYPUS"); - }); - }); -}); diff --git a/src/client/components/immutable-input/immutable-input.tsx b/src/client/components/immutable-input/immutable-input.tsx deleted file mode 100644 index 5d345ecd5..000000000 --- a/src/client/components/immutable-input/immutable-input.tsx +++ /dev/null @@ -1,207 +0,0 @@ -/* - * Copyright 2015-2016 Imply Data, Inc. - * Copyright 2017-2019 Allegro.pl - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import * as React from "react"; -import { ImmutableUtils } from "../../../common/utils/immutable-utils/immutable-utils"; -import { classNames } from "../../utils/dom/dom"; -import { ChangeFn } from "../../utils/immutable-form-delegate/immutable-form-delegate"; -import "./immutable-input.scss"; - -export type InputType = "text" | "textarea"; - -export interface ImmutableInputProps { - instance: any; - className?: string; - path: string; - focusOnStartUp?: boolean; - onChange?: ChangeFn; - onInvalid?: (invalidString: string) => void; - validator?: RegExp | ((str: string) => boolean); - stringToValue?: (str: string) => any; - valueToString?: (value: any) => string; - type?: InputType; -} - -export interface ImmutableInputState { - myInstance?: any; - invalidString?: string; - validString?: string; -} - -export class ImmutableInput extends React.Component { - static defaultProps: Partial = { - type: "text", - stringToValue: String, - valueToString: (value: any) => value ? String(value) : "" - }; - - static simpleGenerator(instance: any, changeFn: ChangeFn) { - return (name: string, validator = /^.+$/, focusOnStartUp = false) => { - return ; - }; - } - - private focusAlreadyGiven = false; - private input = React.createRef(); - - constructor(props: ImmutableInputProps) { - super(props); - this.state = {}; - } - - initFromProps(props: ImmutableInputProps) { - if (!props.instance || !props.path) return; - - let validString: string; - - if (this.state.validString === undefined) { - validString = props.valueToString(ImmutableUtils.getProperty(props.instance, props.path)); - } else { - const currentCanonical = props.valueToString(props.stringToValue(this.state.validString)); - const possibleCanonical = props.valueToString(ImmutableUtils.getProperty(props.instance, props.path)); - - validString = currentCanonical === possibleCanonical ? this.state.validString : possibleCanonical; - } - - this.setState({ - myInstance: props.instance, - invalidString: undefined, - validString - }); - } - - reset(callback?: () => void) { - this.setState( - { - invalidString: undefined, - validString: undefined - }, - callback - ); - } - - componentWillReceiveProps(nextProps: ImmutableInputProps) { - if (nextProps.instance === undefined) { - this.reset(() => this.initFromProps(nextProps)); - return; - } - - if (this.state.invalidString === undefined && nextProps.instance !== this.state.myInstance) { - this.initFromProps(nextProps); - } - } - - componentDidUpdate() { - this.maybeFocus(); - } - - componentDidMount() { - this.initFromProps(this.props); - this.maybeFocus(); - } - - maybeFocus() { - if (!this.focusAlreadyGiven && this.props.focusOnStartUp && this.input.current) { - this.input.current.select(); - this.focusAlreadyGiven = true; - } - } - - isValueValid(value: string): boolean { - const { validator } = this.props; - - if (!validator) return true; - - if (validator instanceof RegExp) { - return validator.test(value); - } - - if (validator instanceof Function) { - return !!validator(value); - } - - return true; - } - - update(newString: string) { - const { path, onChange, instance, validator, onInvalid, stringToValue } = this.props; - - let myInstance: any; - let invalidString: string; - let validString: string; - let error = ""; - let newValue; - - try { - newValue = stringToValue ? stringToValue(newString) : newString; - - if (validator && !this.isValueValid(newString)) { - myInstance = instance; - invalidString = newString; - if (onInvalid) onInvalid(newValue); - - } else { - myInstance = ImmutableUtils.setProperty(instance, path, newValue); - validString = newString; - } - } catch (e) { - myInstance = instance; - invalidString = newString; - error = (e as Error).message; - if (onInvalid) onInvalid(newValue); - } - - this.setState({ myInstance, invalidString, validString }, () => { - if (onChange) onChange(myInstance, invalidString === undefined, path, error); - }); - } - - onChange = (event: React.ChangeEvent) => this.update(event.target.value); - - render() { - const { path, type, className } = this.props; - const { myInstance, invalidString, validString } = this.state; - const isInvalid = invalidString !== undefined; - - if (!path || !myInstance) return null; - - if (type === "textarea") { - return