From 5eedfa13bd3e323aaf84f2506d80c96b5463a2c1 Mon Sep 17 00:00:00 2001 From: anweshknayak Date: Mon, 28 May 2018 21:01:27 +0530 Subject: [PATCH] initial codebase --- .editorconfig | 15 + .gitignore | 54 + .htmlhintrc | 21 + .stylelintrc | 38 + README.md | 97 + angular.json | 135 + docs/analytics.md | 5 + docs/backend-proxy.md | 42 + docs/coding-guides/angular.md | 171 + docs/coding-guides/e2e-tests.md | 90 + docs/coding-guides/html.md | 40 + docs/coding-guides/sass.md | 95 + docs/coding-guides/typescript.md | 63 + docs/coding-guides/unit-tests.md | 46 + docs/corporate-proxy.md | 49 + docs/i18n.md | 53 + docs/readme.md | 9 + docs/routing.md | 43 + docs/updating.md | 42 + e2e/protractor.conf.js | 30 + e2e/src/app.e2e-spec.ts | 21 + e2e/src/app.po.ts | 32 + e2e/tsconfig.e2e.json | 14 + ngsw-config.json | 27 + package-lock.json | 14082 ++++++++++++++++ package.json | 75 + proxy.conf.js | 41 + src/app/about/about-routing.module.ts | 18 + src/app/about/about.component.html | 10 + src/app/about/about.component.scss | 0 src/app/about/about.component.spec.ts | 25 + src/app/about/about.component.ts | 18 + src/app/about/about.module.ts | 18 + src/app/app-routing.module.ts | 14 + src/app/app.component.html | 1 + src/app/app.component.scss | 0 src/app/app.component.spec.ts | 27 + src/app/app.component.ts | 61 + src/app/app.module.ts | 40 + src/app/clients/clients-routing.module.ts | 16 + src/app/clients/clients.component.html | 4 + src/app/clients/clients.component.scss | 0 src/app/clients/clients.component.ts | 18 + src/app/clients/clients.module.ts | 23 + .../authentication.guard.spec.ts | 55 + .../authentication/authentication.guard.ts | 25 + .../authentication.service.mock.ts | 28 + .../authentication.service.spec.ts | 144 + .../authentication/authentication.service.ts | 94 + src/app/core/core.module.ts | 63 + .../core/http/api-prefix.interceptor.spec.ts | 44 + src/app/core/http/api-prefix.interceptor.ts | 18 + src/app/core/http/cache.interceptor.spec.ts | 135 + src/app/core/http/cache.interceptor.ts | 58 + .../http/error-handler.interceptor.spec.ts | 59 + .../core/http/error-handler.interceptor.ts | 30 + src/app/core/http/http-cache.service.spec.ts | 194 + src/app/core/http/http-cache.service.ts | 118 + src/app/core/http/http.service.spec.ts | 140 + src/app/core/http/http.service.ts | 119 + src/app/core/i18n.service.spec.ts | 152 + src/app/core/i18n.service.ts | 83 + src/app/core/index.ts | 13 + src/app/core/logger.service.spec.ts | 72 + src/app/core/logger.service.ts | 113 + src/app/core/route-reusable-strategy.ts | 28 + src/app/core/route.service.spec.ts | 40 + src/app/core/route.service.ts | 27 + .../core/shell/header/header.component.html | 71 + .../core/shell/header/header.component.scss | 10 + .../shell/header/header.component.spec.ts | 40 + src/app/core/shell/header/header.component.ts | 48 + src/app/core/shell/shell.component.html | 2 + src/app/core/shell/shell.component.scss | 0 src/app/core/shell/shell.component.spec.ts | 39 + src/app/core/shell/shell.component.ts | 14 + src/app/home/home-routing.module.ts | 19 + src/app/home/home.component.html | 7 + src/app/home/home.component.scss | 9 + src/app/home/home.component.spec.ts | 35 + src/app/home/home.component.ts | 25 + src/app/home/home.module.ts | 26 + src/app/home/quote.service.spec.ts | 72 + src/app/home/quote.service.ts | 30 + src/app/login/login-routing.module.ts | 16 + src/app/login/login.component.html | 62 + src/app/login/login.component.scss | 29 + src/app/login/login.component.spec.ts | 37 + src/app/login/login.component.ts | 68 + src/app/login/login.module.ts | 22 + src/app/shared/index.ts | 2 + src/app/shared/loader/loader.component.html | 4 + src/app/shared/loader/loader.component.scss | 3 + .../shared/loader/loader.component.spec.ts | 65 + src/app/shared/loader/loader.component.ts | 17 + src/app/shared/shared.module.ts | 17 + src/apple-touch-icon.png | Bin 0 -> 11328 bytes src/assets/images/833.svg | 1 + src/assets/images/MifosX_logo.png | Bin 0 -> 1551 bytes src/assets/images/MifosX_logoSmall.png | Bin 0 -> 1445 bytes src/assets/images/chosen-sprite.png | Bin 0 -> 559 bytes .../images/client-image-placeholder.png | Bin 0 -> 8026 bytes src/assets/images/cubic_loader.gif | Bin 0 -> 7371 bytes src/assets/images/favicon.ico | Bin 0 -> 318 bytes src/assets/images/loader.gif | Bin 0 -> 80595 bytes src/assets/images/logo.jpg | Bin 0 -> 26946 bytes src/assets/images/mifos-logo-flat.png | Bin 0 -> 7489 bytes src/assets/images/mifos_lg-logo.jpg | Bin 0 -> 75684 bytes src/assets/images/ring.svg | 1 + src/assets/images/small-loader.gif | Bin 0 -> 5213 bytes src/assets/images/user_new.png | Bin 0 -> 2013 bytes src/assets/ngx-rocket-logo.png | Bin 0 -> 17141 bytes src/browserslist | 10 + src/environments/environment.prod.ts | 13 + src/environments/environment.ts | 18 + src/favicon.ico | Bin 0 -> 15086 bytes src/index.html | 30 + src/karma.conf.js | 45 + src/main.scss | 25 + src/main.ts | 18 + src/manifest.json | 14 + src/polyfills.ts | 80 + src/robots.txt | 5 + src/styles/_loader.scss | 49 + .../bootstrap-material/_bootswatch.scss | 666 + src/styles/bootstrap-material/_variables.scss | 129 + src/test.ts | 23 + src/theme/theme-variables.scss | 55 + src/theme/theme.scss | 5 + src/translations/en-US.json | 16 + src/translations/fr-FR.json | 16 + src/tsconfig.app.json | 17 + src/tsconfig.spec.json | 22 + src/typings.d.ts | 12 + tsconfig.json | 26 + tslint.json | 152 + 136 files changed, 19812 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 .htmlhintrc create mode 100644 .stylelintrc create mode 100644 README.md create mode 100644 angular.json create mode 100644 docs/analytics.md create mode 100644 docs/backend-proxy.md create mode 100644 docs/coding-guides/angular.md create mode 100644 docs/coding-guides/e2e-tests.md create mode 100644 docs/coding-guides/html.md create mode 100644 docs/coding-guides/sass.md create mode 100644 docs/coding-guides/typescript.md create mode 100644 docs/coding-guides/unit-tests.md create mode 100644 docs/corporate-proxy.md create mode 100644 docs/i18n.md create mode 100644 docs/readme.md create mode 100644 docs/routing.md create mode 100644 docs/updating.md create mode 100644 e2e/protractor.conf.js create mode 100644 e2e/src/app.e2e-spec.ts create mode 100644 e2e/src/app.po.ts create mode 100644 e2e/tsconfig.e2e.json create mode 100644 ngsw-config.json create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 proxy.conf.js create mode 100644 src/app/about/about-routing.module.ts create mode 100644 src/app/about/about.component.html create mode 100644 src/app/about/about.component.scss create mode 100644 src/app/about/about.component.spec.ts create mode 100644 src/app/about/about.component.ts create mode 100644 src/app/about/about.module.ts create mode 100644 src/app/app-routing.module.ts create mode 100644 src/app/app.component.html create mode 100644 src/app/app.component.scss create mode 100644 src/app/app.component.spec.ts create mode 100644 src/app/app.component.ts create mode 100644 src/app/app.module.ts create mode 100644 src/app/clients/clients-routing.module.ts create mode 100644 src/app/clients/clients.component.html create mode 100644 src/app/clients/clients.component.scss create mode 100644 src/app/clients/clients.component.ts create mode 100644 src/app/clients/clients.module.ts create mode 100644 src/app/core/authentication/authentication.guard.spec.ts create mode 100644 src/app/core/authentication/authentication.guard.ts create mode 100644 src/app/core/authentication/authentication.service.mock.ts create mode 100644 src/app/core/authentication/authentication.service.spec.ts create mode 100644 src/app/core/authentication/authentication.service.ts create mode 100644 src/app/core/core.module.ts create mode 100644 src/app/core/http/api-prefix.interceptor.spec.ts create mode 100644 src/app/core/http/api-prefix.interceptor.ts create mode 100644 src/app/core/http/cache.interceptor.spec.ts create mode 100644 src/app/core/http/cache.interceptor.ts create mode 100644 src/app/core/http/error-handler.interceptor.spec.ts create mode 100644 src/app/core/http/error-handler.interceptor.ts create mode 100644 src/app/core/http/http-cache.service.spec.ts create mode 100644 src/app/core/http/http-cache.service.ts create mode 100644 src/app/core/http/http.service.spec.ts create mode 100644 src/app/core/http/http.service.ts create mode 100644 src/app/core/i18n.service.spec.ts create mode 100644 src/app/core/i18n.service.ts create mode 100644 src/app/core/index.ts create mode 100644 src/app/core/logger.service.spec.ts create mode 100644 src/app/core/logger.service.ts create mode 100644 src/app/core/route-reusable-strategy.ts create mode 100644 src/app/core/route.service.spec.ts create mode 100644 src/app/core/route.service.ts create mode 100644 src/app/core/shell/header/header.component.html create mode 100644 src/app/core/shell/header/header.component.scss create mode 100644 src/app/core/shell/header/header.component.spec.ts create mode 100644 src/app/core/shell/header/header.component.ts create mode 100644 src/app/core/shell/shell.component.html create mode 100644 src/app/core/shell/shell.component.scss create mode 100644 src/app/core/shell/shell.component.spec.ts create mode 100644 src/app/core/shell/shell.component.ts create mode 100644 src/app/home/home-routing.module.ts create mode 100644 src/app/home/home.component.html create mode 100644 src/app/home/home.component.scss create mode 100644 src/app/home/home.component.spec.ts create mode 100644 src/app/home/home.component.ts create mode 100644 src/app/home/home.module.ts create mode 100644 src/app/home/quote.service.spec.ts create mode 100644 src/app/home/quote.service.ts create mode 100644 src/app/login/login-routing.module.ts create mode 100644 src/app/login/login.component.html create mode 100644 src/app/login/login.component.scss create mode 100644 src/app/login/login.component.spec.ts create mode 100644 src/app/login/login.component.ts create mode 100644 src/app/login/login.module.ts create mode 100644 src/app/shared/index.ts create mode 100644 src/app/shared/loader/loader.component.html create mode 100644 src/app/shared/loader/loader.component.scss create mode 100644 src/app/shared/loader/loader.component.spec.ts create mode 100644 src/app/shared/loader/loader.component.ts create mode 100644 src/app/shared/shared.module.ts create mode 100644 src/apple-touch-icon.png create mode 100644 src/assets/images/833.svg create mode 100644 src/assets/images/MifosX_logo.png create mode 100644 src/assets/images/MifosX_logoSmall.png create mode 100644 src/assets/images/chosen-sprite.png create mode 100644 src/assets/images/client-image-placeholder.png create mode 100644 src/assets/images/cubic_loader.gif create mode 100644 src/assets/images/favicon.ico create mode 100644 src/assets/images/loader.gif create mode 100644 src/assets/images/logo.jpg create mode 100644 src/assets/images/mifos-logo-flat.png create mode 100644 src/assets/images/mifos_lg-logo.jpg create mode 100644 src/assets/images/ring.svg create mode 100644 src/assets/images/small-loader.gif create mode 100644 src/assets/images/user_new.png create mode 100644 src/assets/ngx-rocket-logo.png create mode 100644 src/browserslist create mode 100644 src/environments/environment.prod.ts create mode 100644 src/environments/environment.ts create mode 100644 src/favicon.ico create mode 100644 src/index.html create mode 100644 src/karma.conf.js create mode 100644 src/main.scss create mode 100644 src/main.ts create mode 100644 src/manifest.json create mode 100644 src/polyfills.ts create mode 100755 src/robots.txt create mode 100644 src/styles/_loader.scss create mode 100644 src/styles/bootstrap-material/_bootswatch.scss create mode 100644 src/styles/bootstrap-material/_variables.scss create mode 100644 src/test.ts create mode 100644 src/theme/theme-variables.scss create mode 100644 src/theme/theme.scss create mode 100644 src/translations/en-US.json create mode 100644 src/translations/fr-FR.json create mode 100644 src/tsconfig.app.json create mode 100644 src/tsconfig.spec.json create mode 100644 src/typings.d.ts create mode 100644 tsconfig.json create mode 100644 tslint.json diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..819d984be --- /dev/null +++ b/.editorconfig @@ -0,0 +1,15 @@ +# Editor configuration, see http://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true +end_of_line = lf +max_line_length = 120 + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..28de86872 --- /dev/null +++ b/.gitignore @@ -0,0 +1,54 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# Compiled output +/dist +/tmp +/out-tsc + +# Dependencies +/node_modules + +# Cordova +/www +/plugins +/platforms + +# IDEs and editors +.idea/* +!.idea/runConfigurations/ +!.idea/codeStyleSettings.xml +.project +.classpath +.c9/ +*.launch +.settings/ +xcuserdata/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +# Maven +/target +/log + +# Misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +yarn-error.log +testem.log +/typings +/reports +/src/translations/template.* +/src/environments/.env.* + +# System Files +.DS_Store +Thumbs.db diff --git a/.htmlhintrc b/.htmlhintrc new file mode 100644 index 000000000..809be5840 --- /dev/null +++ b/.htmlhintrc @@ -0,0 +1,21 @@ +{ + "tagname-lowercase": false, + "attr-lowercase": false, + "attr-value-double-quotes": true, + "tag-pair": true, + "spec-char-escape": true, + "id-unique": true, + "src-not-empty": true, + "attr-no-duplication": true, + "title-require": true, + "tag-self-close": true, + "head-script-disabled": true, + "doctype-html5": true, + "id-class-value": "dash", + "style-disabled": true, + "inline-style-disabled": true, + "inline-script-disabled": true, + "space-tab-mixed-disabled": "true", + "id-class-ad-disabled": true, + "attr-unsafe-chars": true +} diff --git a/.stylelintrc b/.stylelintrc new file mode 100644 index 000000000..4eee4c79c --- /dev/null +++ b/.stylelintrc @@ -0,0 +1,38 @@ +{ + "extends": ["stylelint-config-standard", "stylelint-config-recommended-scss"], + "rules": { + "font-family-name-quotes": "always-where-recommended", + "function-url-quotes": [ + "always", + { + "except": ["empty"] + } + ], + "selector-attribute-quotes": "always", + "string-quotes": "double", + "max-nesting-depth": 3, + "selector-max-compound-selectors": 3, + "selector-max-specificity": "0,3,2", + "declaration-no-important": true, + "at-rule-no-vendor-prefix": true, + "media-feature-name-no-vendor-prefix": true, + "property-no-vendor-prefix": true, + "selector-no-vendor-prefix": true, + "value-no-vendor-prefix": true, + "no-empty-source": null, + "selector-class-pattern": "[a-z-]+", + "selector-id-pattern": "[a-z-]+", + "selector-max-id": 0, + "selector-no-qualifying-type": true, + "selector-max-universal": 0, + "selector-pseudo-element-no-unknown": [ + true, + { + "ignorePseudoElements": ["ng-deep"] + } + ], + "unit-whitelist": ["px", "%", "em", "rem", "vw", "vh", "deg", "s"], + "max-empty-lines": 2, + "max-line-length": 120 + } +} diff --git a/README.md b/README.md new file mode 100644 index 000000000..ba86c7214 --- /dev/null +++ b/README.md @@ -0,0 +1,97 @@ +# MifosX + +Revamped codebase of community-app + +# Getting started + +1. Go to project folder and install dependencies: + ```bash + npm install + ``` + +2. Launch development server, and open `localhost:4200` in your browser: + ```bash + npm start + ``` + +# Main tasks + +Task automation is based on [NPM scripts](https://docs.npmjs.com/misc/scripts). + +Tasks | Description +------------------------------|--------------------------------------------------------------------------------------- +npm start | Run development server on `http://localhost:4200/` +npm run build [-- --env=prod] | Lint code and build app for production in `dist/` folder +npm test | Run unit tests via [Karma](https://karma-runner.github.io) in watch mode +npm run test:ci | Lint code and run unit tests once for continuous integration +npm run e2e | Run e2e tests using [Protractor](http://www.protractortest.org) +npm run lint | Lint code +npm run translations:extract | Extract strings from code and templates to `src/app/translations/template.json` +npm run docs | Display project documentation + +When building the application, you can specify the target environment using the additional flag `--env ` (do not +forget to prepend `--` to pass arguments to npm scripts). + +The default build environment is `prod`. + +## Development server + +Run `npm start` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change +any of the source files. +You should not use `ng serve` directly, as it does not use the backend proxy configuration by default. + +## Code scaffolding + +Run `npm run generate -- component ` to generate a new component. You can also use +`npm run generate -- directive|pipe|service|class|module`. + +If you have installed [angular-cli](https://github.com/angular/angular-cli) globally with `npm install -g @angular/cli`, +you can also use the command `ng generate` directly. + +## Additional tools + +Tasks are mostly based on the `angular-cli` tool. Use `ng help` to get more help or go check out the +[Angular-CLI README](https://github.com/angular/angular-cli). + +# What's in the box + +The app template is based on [HTML5](http://whatwg.org/html), [TypeScript](http://www.typescriptlang.org) and +[Sass](http://sass-lang.com). + +#### Design guides + +- [Bootstrap Material](https://bootswatch.com/materia/) +- [Angular Material](https://material.angular.io/components/categories) + + +#### Steps to add component + + 1. Create a module using + `ng generate module [name]` + 2. Go to *app.module.ts* + - import the module + + + import { module_name } from './module' + +- declare the module in + + +``` + @NgModule({ + imports: [ module_name ]}) + ``` + +3. Setup routing in newly created module + + +#### Coding guides + +- [Angular](docs/coding-guides/angular.md) +- [TypeScript](docs/coding-guides/typescript.md) +- [Sass](docs/coding-guides/sass.md) +- [HTML](docs/coding-guides/html.md) +- [Unit tests](docs/coding-guides/unit-tests.md) +- [End-to-end tests](docs/coding-guides/e2e-tests.md) + + diff --git a/angular.json b/angular.json new file mode 100644 index 000000000..b00e39abc --- /dev/null +++ b/angular.json @@ -0,0 +1,135 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "ng-x-rocket": { + "root": "", + "sourceRoot": "src", + "projectType": "application", + "prefix": "app", + "schematics": { + "@schematics/angular:component": { + "styleext": "scss" + } + }, + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:browser", + "options": { + "outputPath": "dist", + "index": "src/index.html", + "main": "src/main.ts", + "tsConfig": "src/tsconfig.app.json", + "polyfills": "src/polyfills.ts", + "assets": [ + "src/favicon.ico", + "src/apple-touch-icon.png", + "src/robots.txt", + "src/manifest.json", + "src/assets" + ], + "styles": [ + "src/main.scss" + ], + "scripts": [] + }, + "configurations": { + "production": { + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "extractCss": true, + "namedChunks": false, + "aot": true, + "extractLicenses": true, + "vendorChunk": false, + "buildOptimizer": true, + "serviceWorker": true, + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + } + ] + } + } + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "options": { + "browserTarget": "ng-x-rocket:build" + }, + "configurations": { + "production": { + "browserTarget": "ng-x-rocket:build:production" + } + } + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "browserTarget": "ng-x-rocket:build" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "src/test.ts", + "karmaConfig": "src/karma.conf.js", + "polyfills": "src/polyfills.ts", + "tsConfig": "src/tsconfig.spec.json", + "scripts": [], + "styles": [ + "src/main.scss" + ], + "assets": [ + "src/favicon.ico", + "src/apple-touch-icon.png", + "src/robots.txt", + "src/manifest.json", + "src/assets" + ] + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "src/tsconfig.app.json", + "src/tsconfig.spec.json" + ], + "exclude": [ + "**/node_modules/**" + ] + } + } + } + }, + "ng-x-rocket-e2e": { + "root": "e2e", + "projectType": "application", + "architect": { + "e2e": { + "builder": "@angular-devkit/build-angular:protractor", + "options": { + "protractorConfig": "e2e/protractor.conf.js", + "devServerTarget": "ng-x-rocket:serve" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "e2e/tsconfig.e2e.json" + ], + "exclude": [ + "**/node_modules/**" + ] + } + } + } + } + }, + "defaultProject": "ng-x-rocket" +} diff --git a/docs/analytics.md b/docs/analytics.md new file mode 100644 index 000000000..2cee4402c --- /dev/null +++ b/docs/analytics.md @@ -0,0 +1,5 @@ +# Analytics + +This project does not come with any analytics library. +Should you decide to use one, you may want to consider [Angulartics2](https://github.com/angulartics/angulartics2). + diff --git a/docs/backend-proxy.md b/docs/backend-proxy.md new file mode 100644 index 000000000..494eb56ec --- /dev/null +++ b/docs/backend-proxy.md @@ -0,0 +1,42 @@ +# Backend proxy + +Usually when working on a web application you consume data from custom-made APIs. + +To ease development with our development server integrating live reload while keeping your backend API calls working, +we also have setup a backend proxy to redirect API calls to whatever URL and port you want. This allows you: + +- To develop frontend features without the need to run an API backend locally +- To use a local development server without [CORS](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing) issues +- To debug frontend code with data from a remote testing platform directly + +## How to configure + +In the root folder you will find a `proxy.conf.js`, containing the backend proxy configuration. + +The interesting part is there: +```js +const proxyConfig = [ + { + context: '/api', + pathRewrite: {'^/api': ''}, + target: 'http://api.icndb.com', + changeOrigin: true + } +]; +``` + +This is where you can setup one or more proxy rules. + +For the complete set of options, see the `http-proxy-middleware` +[documentation](https://github.com/chimurai/http-proxy-middleware#options). + +### Corporate proxy support + +To allow external API calls redirection through a corporate proxy, you will also find a `setupForCorporateProxy()` +function in the proxy configuration file. By default, this method configures a corporate proxy agent based on the +`HTTP_PROXY` environment variable, see the [corporate proxy documentation](corporate-proxy.md) for more details. + +If you need to, you can further customize this function to fit the network of your working environment. + +If your corporate proxy use a custom SSL certificate, your may need to add the `secure: false` option to your +backend proxy configuration. diff --git a/docs/coding-guides/angular.md b/docs/coding-guides/angular.md new file mode 100644 index 000000000..507b8de0b --- /dev/null +++ b/docs/coding-guides/angular.md @@ -0,0 +1,171 @@ +# Introduction to Angular and modern design patterns + +[Angular](https://angular.io) (aka Angular 2, 4, 5, 6...) is a new framework completely rewritten from the ground up, +replacing the now well-known [AngularJS](https://angularjs.org) framework (aka Angular 1.x). + +More that just a framework, Angular should now be considered as a whole *platform* which comes with a complete set of +tools, like its own [CLI](https://github.com/angular/angular-cli), [debug utilities](https://augury.angular.io) or +[performance tools](https://github.com/angular/angular/tree/master/packages/benchpress). + +Angular has been around for some time now, but I still get the feeling that it’s not getting the love it deserved, +probably because of other players in the field like React or VueJS. While the simplicity behind these frameworks can +definitely be attractive, they lack in my opinion what is essential when making big, enterprise-grade apps: a solid +frame to lead both experienced developers and beginners in the same direction and a rational convergence of tools, +patterns and documentation. Yes, the Angular learning curve may seems a little steep, but it’s definitely worth it. + +## Getting started + +#### Newcomer + +If you're new to Angular you may feel overwhelmed by the quantity of new concepts to apprehend, so before digging +into this project you may want to start with [this progressive tutorial](https://angular.io/tutorial) that will guide +you step by step into building a complete Angular application. + +#### AngularJS veteran + +If you come from AngularJS and want to dig straight in the new version, you may want to take a look at the +[AngularJS vs 2 quick reference](https://angular.io/guide/ajs-quick-reference). + +#### Cheatsheet + +Until you know the full Angular API by heart, you may want to keep this +[cheatsheet](https://angular.io/guide/cheatsheet) that resumes the syntax and features on a single page at hand. + +## Style guide + +This project follows the standard [Angular style guide](https://angular.io/guide/styleguide). + +More that just coding rules, this style guide also gives advices and best practices for a good application architecture +and is an **essential reading** for starters. Reading deeper, you can even find many explanations for some design +choices of the framework. + +## Going deeper + +Even though they are not mandatory, Angular was designed for the use of design patterns you may not be accustomed to, +like [reactive programming](#reactive-programming), [unidirectional data flow](#unidirectional-data-flow) and +[centralized state management](#centralized-state-management). + +These concepts are difficult to resume in a few words, and despite being tightly related to each other they concern +specific parts of an application flow, each being quite deep to learn on its own. + +You will essentially find here a list of good starting points to learn more on these subjects. + +#### Reactive programming + +You may not be aware of it, but Angular is now a *reactive system* by design. +Although you are not forced to use reactive programming patterns, they make the core of the framework and it is +definitely recommended to learn them if you want to leverage the best of Angular. + +Angular uses [RxJS](http://reactivex.io/rxjs/) to implement the *Observable* pattern. + +> An *Observable* is a stream of asynchronous events that can be processed with array-like operators. + +##### From promises to observables + +While AngularJS used to rely heavily on [*Promises*](https://docs.angularjs.org/api/ng/service/$q) to handle +asynchronous events, *Observables* are now used instead in Angular. Even though in specific cases like for HTTP +requests, an *Observable* can be converted into a *Promise*, it is recommended to embrace the new paradigm as it can a +lot more than *Promises*, with way less code. This transition is also explained in the +[Angular tutorial](https://angular.io/tutorial/toh-pt6#!%23observables). +Once you have made the switch, you will never look back again. + +##### Learning references + +- [What is reactive programming?](http://paulstovell.com/blog/reactive-programming), explained nicely through a simple + imaged story *(5 min)* + +- [The introduction to reactive programming you've been missing](https://gist.github.com/staltz/868e7e9bc2a7b8c1f754), + the title says it all *(30 min)* + +- [Functional reactive programming for Angular 2 developers](http://blog.angular-university.io/functional-reactive-programming-for-angular-2-developers-rxjs-and-observables/), + see the functional reactive programming principles in practice with Angular *(15 min)* + +- [RxMarbles](http://rxmarbles.com), a graphical representation of Rx operators that greatly help to understand their + usage + +#### Unidirectional data flow + +In opposition with AngularJS where one of its selling points was two-way data binding which ended up causing a lot of +major headaches for complex applications, Angular now enforces unidirectional data flow. + +What does it means? Said with other words, it means that change detection cannot cause cycles, which was one of +AngularJS problematic points. It also helps to maintain simpler and more predictable data flows in applications, along +with substantial performance improvements. + +**Wait, then why the Angular documentation have mention of a +[two-way binding syntax](https://angular.io/guide/template-syntax#binding-syntax-an-overview)?** + +If you look closely, the new two-way binding syntax is just syntactic sugar to combine two *one-way* bindings (a +*property* and *event* binding), keeping the data flow unidirectional. + +This change is really important, as it was often the cause of performance issues with AngularJS, and it one of the +pillars enabling better performance in new Angular apps. + +While Angular tries to stay *pattern-agnostic* and can be used with conventional MV* patterns, it was designed with +reactive programming in mind and really shines when used with reactive data flow patterns like +[redux](http://redux.js.org/docs/basics/DataFlow.html), +[Flux](https://facebook.github.io/flux/docs/in-depth-overview.html#content) or +[MVI](http://futurice.com/blog/reactive-mvc-and-the-virtual-dom). + +#### Centralized state management + +As applications grow in size, keeping track of the all its individual components state and data flows can become +tedious, and tend to be difficult to manage and debug. + +The main goal of using a centralized state management is to make state changes *predictable* by imposing certain +restrictions on how and when updates can happen, using *unidirectional data flow*. + +This approach was first made popular with React with introduction of the +[Flux](https://facebook.github.io/flux/docs/in-depth-overview.html#content) architecture. Many libraries emerged then +trying to adapt and refine the original concept, and one of these gained massive popularity by providing a simpler, +elegant alternative: [Redux](http://redux.js.org/docs/basics/DataFlow.html). + +Redux is at the same time a library (with the big *R*) and a design pattern (with the little *r*), the latter being +framework-agnostic and working very well with Angular. + +The *redux* design pattern is based on these [3 principles](http://redux.js.org/docs/introduction/ThreePrinciples.html): + +- The application state is a *single immutable* data structure +- A state change is triggered by an *action*, an object describing what happened +- Pure functions called *reducers* take the previous state and the next action to compute the new state + +The core concepts behind these principles are nicely explained in +[this example](http://redux.js.org/docs/introduction/CoreConcepts.html) *(3 min)*. + +##### Which library to use? + +You can make Angular work with any state management library you like, but your best bet would be to use +[@ngrx/store](https://github.com/ngrx/store). It works the same as the popular [Redux](http://redux.js.org) library, +but with a tight integration with Angular and [RxJS](http://reactivex.io/rxjs/), with some nice additional developer +utilities. + +Here are some resources to get started: + +- [Build a better Angular 2 application with redux and ngrx](http://onehungrymind.com/build-better-angular-2-application-redux-ngrx/), + a nice tutorial for @ngrx/store *(30 min)* + +- [Comprehensive introduction to @ngrx/store](https://gist.github.com/btroncone/a6e4347326749f938510), an in-depth + walkthrough to this library usage in Angular *(60 min)* + +##### When to use it? + +You may have noticed that the starter template does not include a centralized state management system out of the box. +Why is that? Well, while there is many benefits from using this pattern, the choice is ultimately up to your team and +what you want to achieve with your app. + +Keep in mind that using a single centralized state for your app introduces a new layer a complexity +[that might not be needed](https://medium.com/@dan_abramov/you-might-not-need-redux-be46360cf367), depending of your +goal. + +## Optimizing performance + +While the new Angular version resolves by design most of the performance issues that could be experienced with +AngularJS, there is always room for improvements. Just keep in mind that delivering an app with good performance is +often a matter of common sense and sane development practices. + +Here is [a list of key points](https://github.com/mgechev/angular-performance-checklist) to check for in your app to +make sure you deliver the best experience to your customers. + +After going through the checklist, make sure to also run an audit of your page through +[**Lighthouse**](https://developers.google.com/web/tools/lighthouse/), the latest Google tool that gives you meaningful +insight about your app performance, accessibility, mobile compatibility and more. diff --git a/docs/coding-guides/e2e-tests.md b/docs/coding-guides/e2e-tests.md new file mode 100644 index 000000000..95430d225 --- /dev/null +++ b/docs/coding-guides/e2e-tests.md @@ -0,0 +1,90 @@ +# End-to-end tests coding guide + +End-to-end (E2E for short) tests are meant to test the behavior of your application, from start to finish. + +While unit tests are the first choice for catching bugs and regression on individual components, it is a good idea to +complement them with test cases covering the integration between the individual components, hence the need for E2E +tests. + +These tests use [Protractor](https://github.com/angular/protractor), which is a framework built for Angular on top of +[Selenium](https://github.com/SeleniumHQ/selenium) to control browsers and simulate user inputs. +[Jasmine](http://jasmine.github.io) is used as the base test framework. + +## Good practices + +- Avoid whenever possible inter-dependencies between your E2E tests +- Run E2E tests on your continuous integration server against different browsers +- If you use an Agile methodology, cover each user story acceptance factors with an E2E test + +## Page objects + +E2E tests should follow the *[Page Object](https://github.com/SeleniumHQ/selenium/wiki/PageObjects)* pattern. + +#### What is a page object? + +A page object: + +- Models the objects on a page under test: + * *Properties* wrap page elements + * *Methods* wrap code that interacts with the page elements +- Simplifies the test scripts +- Reduces the amount of duplicated code + +If the UI changes, the fix only needs to be applied in one place. + +#### How to define a page object + +```typescript +// login.po.ts +import { browser, element, by } from 'protractor'; + +export class LoginPage { + emailInput = element(by.css('input[name=^"email"]')); + passwordInput = element(by.css('input[name=^"password"]')); + loginButton = element(by.css('button[(click)^="login"]')); + registerButton = element(by.css('button[(click)^="register"]')); + + navigateTo() { + return browser.get('/'); + } + + getGreetingText() { + return element(by.css('.greeting')).getText(); + } +} +``` + +#### How to use a page object + +```typescript +// login.e2e-spec.ts +import { LoginPage } from './login.po'; + +describe('Login', () => { + let page: LoginPage ; + + beforeEach(() => { + page = new LoginPage(); + page.navigateTo(); + }); + + it('should navigate to the register page when the register button is clicked', () => { + page.registerButton.click(); + + expect(browser.getCurrentUrl()).toContain('/register'); + }); + + it('should allow a user to log in', () => { + page.emailInput.sendKeys('test@mail.com'); + page.passwordInput.sendKeys('abc123'); + page.loginButton.click(); + + expect(page.getGreetingText()).toContain('Welcome, Test User'); + }); +}); +``` + +## Credits + +Parts of this guide were freely inspired by this +[presentation](https://docs.google.com/presentation/d/1B6manhG0zEXkC-H-tPo2vwU06JhL8w9-XCF9oehXzAQ). diff --git a/docs/coding-guides/html.md b/docs/coding-guides/html.md new file mode 100644 index 000000000..4fa093d38 --- /dev/null +++ b/docs/coding-guides/html.md @@ -0,0 +1,40 @@ +# HTML coding guide + +## Naming conventions + +- Everything should be named in `kebab-case` (lowercase words separated with a `-`): tags, attributes, IDs, etc, + **except for everything bound to Angular** such variables, directives or events which should be in `camelCase` +- File names should always be in `kebab-case` + +## Coding rules + +- Use HTML5 doctype: `` +- Use HTML [semantic elements](https://developer.mozilla.org/docs/Web/HTML/Sections_and_Outlines_of_an_HTML5_document) +- Use double quotes `"` around attribute values in tags +- Use a new line for every block, list, or table element, and indent every such child element +- Clearly Separate structure (HTML) from presentation (CSS) from behavior (JavaScript): + * Never use inline CSS or JavaScript + * Keep any logic out of the HTML +- `type` attribute for stylesheets and script tags should be omitted + +## Common pitfalls + +- **Block**-type tags cannot be nested inside **inline**-type tags: a `
` tag cannot be nested in a ``. + This rule also applies regarding the `display` value of an element. +- HTML is **not** XML: empty tags cannot be self-closing and will result in improper results + * `
` will be interpreted as a simple `
` without closing tag! + * The only tags that allows self-closing are the one that does not require a closing tag in first place: + these are the void elements that do not not accept content `
`, `
`, ``, ``, ``, `` + (and others). + +## Templates + +In accordance with the [Angular style guide](https://angular.io/guide/styleguide), HTML templates should be extracted in +separate files, when more than 3 lines. + +Only use inline templates sparingly in very simple components with less than 3 lines of HTML. + +## Enforcement + +Coding rules enforcement and basic sanity checks are done in this project by [HTMLHint](http://htmlhint.com). + diff --git a/docs/coding-guides/sass.md b/docs/coding-guides/sass.md new file mode 100644 index 000000000..f0d7bb3a0 --- /dev/null +++ b/docs/coding-guides/sass.md @@ -0,0 +1,95 @@ +# Sass coding guide + +[Sass](http://sass-lang.com) is a superset of CSS, which brings a lot of developer candy to help scaling CSS in large +projects and keeping it maintainable. + +The main benefits of using Sass over plain CSS are *variables*, *nesting* and *mixins*, see the +[basics guide](http://sass-lang.com/guide) for more details. + +> Note that this project use the newer, CSS-compatible **SCSS** syntax over the old + [indented syntax](http://sass-lang.com/documentation/file.INDENTED_SYNTAX.html). + +## Naming conventions + +- In the CSS world, everything should be named in `kebab-case` (lowercase words separated with a `-`). +- File names should always be in `kebab-case` + +## Coding rules + +- Use single quotes `'` for strings +- Use this general nesting hierarchy when constructing your styles: + ```scss + // The base component class acts as the namespace, to avoid naming and style collisions + .my-component { + // Put here all component elements (flat) + .my-element { + // Use a third-level only for modifiers and state variations + &.active { ... } + } + } + ``` + Note that with + [Angular view encapsulation](https://angular.io/docs/ts/latest/guide/component-styles.html#!#view-encapsulation), + the first "namespace" level of nesting is not necessary as Angular takes care of the scoping for avoid collisions. + + > As a side note, we are aware of the [BEM naming approach](https://en.bem.info/tools/bem/bem-naming/), but we found + it impractical for large projects. The nesting approach has drawbacks such as increased specificity, but it helps + keeping everything nicely organized, and more importantly, *scoped*. + + +Also keep in mind this general rules: +- Always use **class selectors**, never use ID selectors and avoid element selectors whenever possible +- No more than **3 levels** of nesting +- No more than **3 qualifiers** + +## Best practices + +- Use object-oriented CSS (OOCSS): + * Factorize common code in base class, and extend it, for example: + ```scss + // Base button class + .btn { ... } + + // Color variation + .btn-warning { ... } + + // Size variation + .btn-small { ... } + ``` + * Try to name class by semantic, not style nor function for better reusability: + Use `.btn-warning`, not `btn-orange` nor `btn-cancel` + * Avoid undoing style, refactor using common base classes and extensions + +- Keep your style scoped + * Clearly separate **global** (think *framework*) and **components** style + * Global style should only go in `src/theme/`, never in components + * Avoid style interactions between components, if some style may need to be shared, refactor it as a framework + component in put it in your global theme. + * Avoid using wider selectors than needed: always use classes if you can! + +- Avoid rules multiplication + * The less CSS the better, factorize rules whenever it's possible + * CSS is code, and like any code frequent refactoring is healthy + +- When ugly hacks cannot be avoided, create an explicit `src/hacks.scss` file and put it in: + * These ugly hacks should only be **temporary** + * Each hack should be documented with the author name, the problem and hack reason + * Limit this file to a reasonable length (~100 lines) and refactor hacks with proper solutions when the limit is + reached. + +## Pitfalls + +- Never use the `!important` keyword. Ever. +- Never use **inline** style in html, even *just for debugging* (because we **KNOW** it will end up in your commit) + +## Browser compatibility + +You should never use browser-specific prefixes in your code, as [autoprefixer](https://github.com/postcss/autoprefixer) +takes care of that part for you during the build process. +You just need to declare which browsers you target in the [`browserslist`](https://github.com/ai/browserslist) file. + +## Enforcement + +Coding rules are enforced in this project with [stylelint](https://stylelint.io). +This tool also checks the compatibility of the rules used against the browsers you are targeting (specified in the +[`browserslist`](https://github.com/ai/browserslist) file), via [doiuse](https://github.com/anandthakker/doiuse). diff --git a/docs/coding-guides/typescript.md b/docs/coding-guides/typescript.md new file mode 100644 index 000000000..d4d162c44 --- /dev/null +++ b/docs/coding-guides/typescript.md @@ -0,0 +1,63 @@ +# TypeScript coding guide + +[TypeScript](http://www.typescriptlang.org) is a superset of JavaScript that greatly helps building large web +applications. + +Coding conventions and best practices comes from the +[TypeScript guidelines](https://github.com/Microsoft/TypeScript/wiki/Coding-guidelines), and are also detailed in the +[TypeScript Deep Dive Style Guide](https://basarat.gitbooks.io/typescript/content/docs/styleguide/styleguide.html). +In addition, this project also follows the general [Angular style guide](https://angular.io/guide/styleguide). + +## Naming conventions + +- Use `PascalCase` for types, classes, interfaces, constants and enum values. +- Use `camelCase` for variables, properties and functions +- Avoid prefixing interfaces with a capital `I`, see [Angular style guide](https://angular.io/guide/styleguide#!#03-03) +- Do not use `_` as a prefix for private properties. An exception can be made for backing fields like this: + ```typescript + private _foo: string; + get foo() { return this._foo; } // foo is read-only to consumers + ``` + +## Ordering + +- Within a file, type definitions should come first +- Within a class, these priorities should be respected: + * Properties comes before functions + * Static symbols comes before instance symbols + * Public symbols comes before private symbols + +## Coding rules + +- Use single quotes `'` for strings +- Always use strict equality checks: `===` and `!==` instead of `==` or `!=` to avoid comparison pitfalls (see + [JavaScript equality table](https://dorey.github.io/JavaScript-Equality-Table/)). + The only accepted usage for `==` is when you want to check a value against `null` or `undefined`. +- Use `[]` instead of `Array` constructor +- Use `{}` instead of `Object` constructor +- Always specify types for function parameters and returns (if applicable) +- Do not export types/functions unless you need to share it across multiple components +- Do not introduce new types/values to the global namespace +- Use arrow functions over anonymous function expressions +- Only surround arrow function parameters when necessary. + For example, `(x) => x + x` is wrong but the following are correct: + * `x => x + x` + * `(x, y) => x + y` + * `(x: T, y: T) => x === y` + +## Definitions + +In order to infer types from JavaScript modules, TypeScript language supports external type definitions. They are +located in the `node_modules/@types` folder. + +To manage type definitions, use standard `npm install|update|remove` commands. + +## Enforcement + +Coding rules are enforced in this project via [TSLint](https://github.com/palantir/tslint). +Angular-specific rules are also enforced via the [Codelyzer](https://github.com/mgechev/codelyzer) rule extensions. + +## Learn more + +The read of [TypeScript Deep Dive](https://basarat.gitbooks.io/typescript) is recommended, this is a very good +reference book for TypeScript (and also open-source). diff --git a/docs/coding-guides/unit-tests.md b/docs/coding-guides/unit-tests.md new file mode 100644 index 000000000..9e0e1b99d --- /dev/null +++ b/docs/coding-guides/unit-tests.md @@ -0,0 +1,46 @@ +# Unit tests coding guide + +The main objective of unit tests is to detect regressions and to help you design software components. A suite of +*good* unit tests can be *immensely* valuable for your project and makes it easier to refactor and expand your code. +But keep in mind that a suite of *bad* unit tests can also be *immensely* painful, and hurt your development by +inhibiting your ability to refactor or alter your code in any way. + +## What to test? + +Everything! But if you need priorities, at least all business logic code must be tested: services, helpers, models... +Shared directives/components should also be covered by unit tests, if you do not have the time to test every single +component. + +Keep in mind that component unit tests should not overlap with [end-to-end tests](e2e-tests.md): while unit the tests +cover the isolated behavior of the component bindings and methods, the end-to-end tests in opposition should cover the +integration and interactions with other app components based on real use cases scenarios. + +## Good practices + +- Name your tests cleanly and consistently +- Do not only test nominal cases, the most important tests are the one covering the edge cases +- Each test should be independent to all the others +- Avoid unnecessary assertions: it's counter-productive to assert anything covered by another test, it just increase + pointless failures and maintenance workload +- Test only one code unit at a time: if you cannot do this, it means you have an architecture problem in your app +- Mock out all external dependencies and state: if there is too much to mock, it is often a sign that maybe you + should split your tested module into several more independent modules +- Clearly separate or identify these 3 stages of each unit test (the *3A*): *arrange*, *act* and *assert* +- When you fix a bug, add a test case for it to prevent regression + +## Pitfalls + +- Sometimes your architecture might mean your code modify static variables during unit tests. Avoid this if you can, + but if you can't, at least make sure each test resets the relevant statics before and after your tests. +- Don’t unit-test configuration settings +- Improving test coverage is good, but having meaningful tests is better: start with the latter first, and **only after + essential features of your code unit are tested**, your can think of improving the coverage. + +## Unit testing with Angular + +A good starting point for learning is the official +[testing guide](https://angular.io/docs/ts/latest/guide/testing.html). + +But as you will most likely want to go bit further in real world apps, these +[example test snippets](https://gist.github.com/wkwiatek/e8a4a9d92abc4739f04f5abddd3de8a7) are also very helpful to +learn how to cover most common testing use cases. diff --git a/docs/corporate-proxy.md b/docs/corporate-proxy.md new file mode 100644 index 000000000..64e8a3b46 --- /dev/null +++ b/docs/corporate-proxy.md @@ -0,0 +1,49 @@ +# Working behind a corporate proxy + +## Environment + +Most tools (including npm and git) use the `HTTP_PROXY` and `HTTPS_PROXY` environment variables to work with a +corporate proxy. + +### Windows + +In Windows environments, add the `HTTP_PROXY` and `HTTPS_PROXY` system environment variable, with these values: + +- HTTP_PROXY: `http://:@:` +- HTTPS_PROXY: `%HTTP_PROXY%` + +### Unix + +Add these lines to your `~/.bash_profile` or `~/.profile`: +```sh +export HTTP_PROXY="http://:@:" +export HTTPS_PROXY="$HTTP_PROXY" +``` + +## Proxy with SSL custom certificate + +Some proxy like **zscaler** use a custom SSL certificate to inspect request, which may cause npm commands to fail. + +To solve this problem, you can disable the `strict-ssl` option in npm. + +## Proxy exceptions + +If you need to access repositories on your local network that should bypass proxy, set the `NO_PROXY` environment +variable, in the same way as `HTTP_PROXY`: + +### Windows + +- NO_PROXY: `127.0.0.1, localhost, ` + +### Unix + +```sh +export NO_PROXY="127.0.0.1, localhost, " +``` + +### Npm + +Run this command in your project directory: +```sh +npm set strict-ssl false +``` diff --git a/docs/i18n.md b/docs/i18n.md new file mode 100644 index 000000000..e6f45ac68 --- /dev/null +++ b/docs/i18n.md @@ -0,0 +1,53 @@ +# I18n + +The internationalization of the application is managed by [ngx-translate](https://github.com/ngx-translate/core). + +## Adding translatable strings + +### In HTML templates + +Use the `translate` directive on an HTML element to automatically translate its content: +```html +This text will be translated. +``` + +You can also use the `translate` pipe if needed: +```html + +``` + +### In TypeScript code + +If you need to translate strings in JavaScript code, import the `TranslateService` dependency and use the asynchronous +`get()` method: + +```typescript +let title; +translateService.get('My page title').subscribe((res: string) => { title = res; }); +``` + +## Extracting strings to translate + +Once you are ready to translate your app, just run `npm translations:extract`. +It will create a `template.json` file in the `src/translations` folder. + +You can then use any text or code editor to generate the `.json` files for each of your supported languages, and put +them in the `src/translations` folder. + +Do no forget to edit the files in `src/environment` to add the supported languages of your application. + +### Marking strings for extraction + +If strings are not directly passed to `translateService` or put in HTML templates, they may be missing from the +extraction process. + +For these cases, you have to use the dummy `extract()` function: +```typescript +import { extract } from './core/i18n.service'; + +function toBeTranslatedLater() { + return extract('A string to be translated'); +} +``` + +Strings marked like this will then be properly extracted. diff --git a/docs/readme.md b/docs/readme.md new file mode 100644 index 000000000..bf8e246bb --- /dev/null +++ b/docs/readme.md @@ -0,0 +1,9 @@ +# ngX-Rocket + +Welcome to the project documentation! + +Use `npm run docs` for easier navigation. + +## Available documentation + +[[index]] diff --git a/docs/routing.md b/docs/routing.md new file mode 100644 index 000000000..785b42588 --- /dev/null +++ b/docs/routing.md @@ -0,0 +1,43 @@ +# Browser routing + +To allow navigation without triggering a server request, Angular now use by default the +[HTML5 pushState](https://developer.mozilla.org/en-US/docs/Web/API/History_API#Adding_and_modifying_history_entries) +API enabling natural URL style (like `localhost:4200/home/`), in opposition to Angular 1 which used the *hashbang* hack +routing style (like `localhost:4200/#/home/`). + +This change has several consequences you should know of, be sure to read the +[browser URL styles](https://angular.io/docs/ts/latest/guide/router.html#!#browser-url-styles) notice to fully +understand the differences between the two approaches. + +In short: + +- It is only supported on modern browsers (IE10+), a [polyfill](https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-Browser-Polyfills#html5-history-api-pushstate-replacestate-popstate) + is required for older browsers. + +- You have the option to perform *server-side rendering* later if you need to increase your app perceived performance. + +- You need to [configure URL rewriting](#server-configuration) on your server so that all routes serve your index file. + +It is still possible to revert to the hash strategy, but unless you have specific needs, you should stick with the +default HTML5 routing mode. + +## Server configuration + +To allow your angular application working properly as a *Single Page Application* (SPA) and allow bookmarking or +refreshing any page, you need some configuration on your server, otherwise you will be running into troubles. + +> Note that during development, the live reload server already supports SPA mode. + +The basic idea is simply to serve the `index.html` file for every request aimed at your application. + +Here is an example on how to perform this on an [Express](http://expressjs.com) NodeJS server: + +```js +// Put this in your `server.js` file, after your other rules (APIs, static files...) +app.get('/*', function(req, res) { + res.sendFile(__dirname + '/index.html') +}); +``` + +For other servers like [Nginx](https://www.nginx.com/blog/creating-nginx-rewrite-rules/) or +[Apache](http://httpd.apache.org/docs/2.0/misc/rewriteguide.html), you may look for how to perform *URL rewriting*. diff --git a/docs/updating.md b/docs/updating.md new file mode 100644 index 000000000..35a8014b3 --- /dev/null +++ b/docs/updating.md @@ -0,0 +1,42 @@ +# Updating npm dependencies + +- Check outdated packages +```sh +npm outdated +``` + +- Update local packages according to `package.json` +```sh +npm update +``` + +- Upgrade packages manually +```sh +npm install --save[-dev] @latest +``` + +Alternatively, you can use [npm-check](https://github.com/dylang/npm-check) to perform an interactive upgrade: +```sh +npm-check -u --skip-unused +``` + +## Locking package versions + +Starting from `npm@5` a new `package-lock.json` file is +[automatically generated](https://docs.npmjs.com/files/package-locks) when using `npm install` commands, to ensure a +reproducible dependency tree and avoid unwanted package updates. + +If you use a previous npm version, it is recommended to use [npm shrinkwrap](https://docs.npmjs.com/cli/shrinkwrap) to +lock down all your dependencies version: +```sh +npm shrinkwrap --dev +``` + +This will create a file `npm-shrinkwrap.json` alongside your `package.json` files. + +> Do not forget to run shrinkwrap each time you manually update your dependencies! + +# Updating angular-cli + +The `angular-cli` package needs extra care with updating, see +[this doc](https://github.com/angular/angular-cli#updating-angular-cli). diff --git a/e2e/protractor.conf.js b/e2e/protractor.conf.js new file mode 100644 index 000000000..734a9404c --- /dev/null +++ b/e2e/protractor.conf.js @@ -0,0 +1,30 @@ +// Protractor configuration file, see link for more information +// https://github.com/angular/protractor/blob/master/lib/config.ts + +const { SpecReporter } = require('jasmine-spec-reporter'); + +exports.config = { + allScriptsTimeout: 11000, + specs: [ + './src/**/*.e2e-spec.ts' + ], + capabilities: { + 'browserName': process.env.PROTRACTOR_BROWSER || 'chrome' + }, + // Only works with Chrome and Firefox + directConnect: true, + baseUrl: 'http://localhost:4200/', + framework: 'jasmine2', + jasmineNodeOpts: { + showColors: true, + defaultTimeoutInterval: 30000, + print: function() {} + }, + onPrepare() { + require('ts-node').register({ + project: require('path').join(__dirname, './tsconfig.e2e.json') + }); + // Better console spec reporter + jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); + } +}; diff --git a/e2e/src/app.e2e-spec.ts b/e2e/src/app.e2e-spec.ts new file mode 100644 index 000000000..14bf35055 --- /dev/null +++ b/e2e/src/app.e2e-spec.ts @@ -0,0 +1,21 @@ +import { browser } from 'protractor'; +import { AppPage } from './app.po'; + +describe('app', () => { + let page: AppPage; + + beforeEach(() => { + page = new AppPage(); + }); + + it('should display login page and login into app', () => { + page.navigateTo(); + expect(browser.getCurrentUrl()).toContain('/login'); + page.login(); + }); + + it('should display hello message', () => { + page.navigateTo(); + expect(page.getParagraphText()).toEqual('Hello world !'); + }); +}); diff --git a/e2e/src/app.po.ts b/e2e/src/app.po.ts new file mode 100644 index 000000000..b4151c395 --- /dev/null +++ b/e2e/src/app.po.ts @@ -0,0 +1,32 @@ +/* + * Use the Page Object pattern to define the page under test. + * See docs/coding-guide/e2e-tests.md for more info. + */ + +import { browser, element, by } from 'protractor'; + +export class AppPage { + usernameField = element(by.css('input[formControlName="username"]')); + passwordField = element(by.css('input[formControlName="password"]')); + loginButton = element(by.css('button[type="submit"]')); + + constructor() { + // Forces default language + this.navigateTo(); + browser.executeScript(() => localStorage.setItem('language', 'en-US')); + } + + navigateTo() { + return browser.get('/'); + } + + login() { + this.usernameField.sendKeys('test'); + this.passwordField.sendKeys('123'); + this.loginButton.click(); + } + + getParagraphText() { + return element(by.css('app-root h1')).getText(); + } +} diff --git a/e2e/tsconfig.e2e.json b/e2e/tsconfig.e2e.json new file mode 100644 index 000000000..1d9e5edf0 --- /dev/null +++ b/e2e/tsconfig.e2e.json @@ -0,0 +1,14 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/e2e", + "baseUrl": "./", + "module": "commonjs", + "target": "es5", + "types": [ + "jasmine", + "jasminewd2", + "node" + ] + } +} diff --git a/ngsw-config.json b/ngsw-config.json new file mode 100644 index 000000000..a56383890 --- /dev/null +++ b/ngsw-config.json @@ -0,0 +1,27 @@ +{ + "index": "/index.html", + "assetGroups": [ + { + "name": "app", + "installMode": "prefetch", + "resources": { + "files": [ + "/favicon.ico", + "/index.html", + "/*.css", + "/*.js" + ] + } + }, + { + "name": "assets", + "installMode": "lazy", + "updateMode": "prefetch", + "resources": { + "files": [ + "/assets/**" + ] + } + } + ] +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..ed95694b5 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,14082 @@ +{ + "name": "ng-x-rocket", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@angular-devkit/architect": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.6.3.tgz", + "integrity": "sha512-w9tK3VACU+CnOQQZT6o7QO2brn/OVNDf2Y11rI+ZQH7UIn6N0ZFoMl9WyFB//K2Gkoa7hAobykhRTtP8lrTF1g==", + "dev": true, + "requires": { + "@angular-devkit/core": "0.6.3", + "rxjs": "6.1.0" + } + }, + "@angular-devkit/build-angular": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.6.3.tgz", + "integrity": "sha512-ce+uAXQXyuMy6IxSnsGKeHlLVjsI77DblNvkcO1NilP7iYxujEJx6qDq/Hrf1uhuqRpm+8pt5zY6QD90gQrDcg==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.6.3", + "@angular-devkit/build-optimizer": "0.6.3", + "@angular-devkit/core": "0.6.3", + "@ngtools/webpack": "6.0.3", + "ajv": "6.4.0", + "autoprefixer": "8.5.0", + "cache-loader": "1.2.2", + "chalk": "2.2.2", + "circular-dependency-plugin": "5.0.2", + "clean-css": "4.1.11", + "copy-webpack-plugin": "4.5.1", + "file-loader": "1.1.11", + "glob": "7.1.2", + "html-webpack-plugin": "3.2.0", + "istanbul": "0.4.5", + "istanbul-instrumenter-loader": "3.0.1", + "karma-source-map-support": "1.3.0", + "less": "3.0.4", + "less-loader": "4.1.0", + "license-webpack-plugin": "1.3.1", + "lodash": "4.17.10", + "memory-fs": "0.4.1", + "mini-css-extract-plugin": "0.4.0", + "minimatch": "3.0.4", + "node-sass": "4.9.0", + "opn": "5.3.0", + "parse5": "4.0.0", + "portfinder": "1.0.13", + "postcss": "6.0.22", + "postcss-import": "11.1.0", + "postcss-loader": "2.1.5", + "postcss-url": "7.3.2", + "raw-loader": "0.5.1", + "resolve": "1.7.1", + "rxjs": "6.1.0", + "sass-loader": "7.0.1", + "silent-error": "1.1.0", + "source-map-support": "0.5.6", + "stats-webpack-plugin": "0.6.2", + "style-loader": "0.21.0", + "stylus": "0.54.5", + "stylus-loader": "3.0.2", + "tree-kill": "1.2.0", + "uglifyjs-webpack-plugin": "1.2.5", + "url-loader": "1.0.1", + "webpack": "4.8.3", + "webpack-dev-middleware": "3.1.3", + "webpack-dev-server": "3.1.4", + "webpack-merge": "4.1.2", + "webpack-sources": "1.1.0", + "webpack-subresource-integrity": "1.1.0-rc.4" + } + }, + "@angular-devkit/build-optimizer": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.6.3.tgz", + "integrity": "sha512-C0LGWh7+rYjpE1T1guaq9EMovwhEJ1QR25qjJxUoYvN+sM+MfVpMhoa6ruqnxh+eQCfRiMdIsnbOboiZxNHTQw==", + "dev": true, + "requires": { + "loader-utils": "1.1.0", + "source-map": "0.5.7", + "typescript": "2.7.2", + "webpack-sources": "1.1.0" + } + }, + "@angular-devkit/core": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.6.3.tgz", + "integrity": "sha512-97hFVW6in8oYJUEqjmUP0Tb/mPlTG3sc0THpe5MCGEkDPjlp2cObt9rUCAVOjugBlScV8rzTpVQ+95PT60Py8A==", + "dev": true, + "requires": { + "ajv": "6.4.0", + "chokidar": "2.0.3", + "rxjs": "6.1.0", + "source-map": "0.5.7" + } + }, + "@angular-devkit/schematics": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-0.6.3.tgz", + "integrity": "sha512-dXlyVNuFRhiOnhAk0NojEUThLrZBpVZmWvEQ4h/pnyHS0P9CfnHqJ8DCcCrjOwYkzdBwBrYchXOCYfo8zuxYGw==", + "dev": true, + "requires": { + "@angular-devkit/core": "0.6.3", + "rxjs": "6.1.0" + } + }, + "@angular/animations": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-6.0.3.tgz", + "integrity": "sha512-X8ey0dvh2ielxPCJOCcdNPAmKW5toCpzHdbjdZqlR9o6uP1UmzEKHd7Un7jVIINRtq9ZB7vnFWIJl0BA7C8U0g==", + "requires": { + "tslib": "1.9.1" + } + }, + "@angular/cdk": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-6.1.0.tgz", + "integrity": "sha512-IrM+cjeUW0TmFIZb7nMtARa9dKOVU9vXlwzllcwcBYHJNb9YcnLPaWqB2LqDQFuH/JQyt+oAG+VyfMmU+yk9uw==", + "requires": { + "tslib": "1.9.1" + } + }, + "@angular/cli": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-6.0.3.tgz", + "integrity": "sha512-G8jfgJublsRjveX1P+F5awHvpC07mKAF7f5lebowIs+QAHSOD6HxQ/JhMbJTwz/aj20iWgZOygA5LhkP0Wr+UQ==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.6.3", + "@angular-devkit/core": "0.6.3", + "@angular-devkit/schematics": "0.6.3", + "@schematics/angular": "0.6.3", + "@schematics/update": "0.6.3", + "opn": "5.3.0", + "resolve": "1.7.1", + "rxjs": "6.1.0", + "semver": "5.5.0", + "silent-error": "1.1.0", + "symbol-observable": "1.2.0", + "yargs-parser": "10.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "yargs-parser": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.0.0.tgz", + "integrity": "sha512-+DHejWujTVYeMHLff8U96rLc4uE4Emncoftvn5AjhB1Jw1pWxLzgBUT/WYbPrHmy6YPEBTZQx5myHhVcuuu64g==", + "dev": true, + "requires": { + "camelcase": "4.1.0" + } + } + } + }, + "@angular/common": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-6.0.2.tgz", + "integrity": "sha512-Yc3NnLGs1ltnDhUCOoMCQMRSkJv/sCv+jKx3uSdrvd8Y55APl2boZhZUK4WphPfWIkpvC7odpiLXAmnVgP6vcw==", + "requires": { + "tslib": "1.9.1" + } + }, + "@angular/compiler": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-6.0.2.tgz", + "integrity": "sha512-uKuM7dcTWwcElklT4E/tckp5fnGNUq4wDna3gZWO6fvc7FQK0SUU4l+A6C1d5YdCRgAsv6gxIrk3MxbSF9UwEw==", + "requires": { + "tslib": "1.9.1" + } + }, + "@angular/compiler-cli": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-6.0.2.tgz", + "integrity": "sha512-6hupeihL+MKYbP0xvHZiaVpYVF1XAlLpI1aTVLUhpzgnR8vgXCwni9iJlr7BZFyicVgApn6l7Oh2xIvMWftYhw==", + "dev": true, + "requires": { + "chokidar": "1.7.0", + "minimist": "1.2.0", + "reflect-metadata": "0.1.12", + "tsickle": "0.27.5" + }, + "dependencies": { + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "requires": { + "micromatch": "2.3.11", + "normalize-path": "2.1.1" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "1.1.0" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true, + "requires": { + "anymatch": "1.3.2", + "async-each": "1.0.1", + "fsevents": "1.2.4", + "glob-parent": "2.0.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "2.0.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "2.0.1" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "@angular/core": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-6.0.2.tgz", + "integrity": "sha512-+ahJofKZFyaq0kLhKUOCa3Fo4WQ4mkMmYRqwFjKgjPupzPgMh0FkBsojuP1WiBd5KTIkv7U8B4sTziUxRDrKgg==", + "requires": { + "tslib": "1.9.1" + } + }, + "@angular/forms": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-6.0.2.tgz", + "integrity": "sha512-Oc234cLjTj1tx2gF/nS/TIC3Auc+LCyC8H6GYqTxXQUyZQeGHqUptvDQz3KwM9Num3EKFUr9J2yzGPnz6lZVmQ==", + "requires": { + "tslib": "1.9.1" + } + }, + "@angular/http": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@angular/http/-/http-6.0.2.tgz", + "integrity": "sha512-BONrdNMKOaQdXiWnrCAaUiP1akf/nuUG6xm/PJe684SrgcqWHN4JJuwgMhGRGIZZCIKEWcIEaZSp+DbWqnj1kg==", + "requires": { + "tslib": "1.9.1" + } + }, + "@angular/language-service": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-6.0.2.tgz", + "integrity": "sha512-EznIei5QGv4Hv+RtfCnI8TQPW7gLZBw7LrGPXSbwV/CXfY11ziEsd/h1lBfN3Wch3soIOXs3Qqk3zx//MrBG/Q==", + "dev": true + }, + "@angular/material": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-6.1.0.tgz", + "integrity": "sha512-9FLWjVnHFzAoGSWU5dz8X/QYeBtZGijMJIp1k94QDYz+2xA10IbesEgnv8I5Ri3EPnjV/gCspeSkt1ClLc95CA==", + "requires": { + "tslib": "1.9.1" + } + }, + "@angular/platform-browser": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-6.0.2.tgz", + "integrity": "sha512-iMBHckhknJ8Wfw9ZVloiw0WPZDtzQFLE2e7D42of7SgXuHloStXUchb0qLr6ZTZwTY0oBPSvDKgJJVmEjZUZvw==", + "requires": { + "tslib": "1.9.1" + } + }, + "@angular/platform-browser-dynamic": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-6.0.2.tgz", + "integrity": "sha512-g1EC0wIWd4OhcEvUnisTfp3y0eMAXgXbACdtgsrozG//xzyqiRFUnBTYTAP4ecninCEltyZYK7EBGfzp8KwQjw==", + "requires": { + "tslib": "1.9.1" + } + }, + "@angular/router": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-6.0.2.tgz", + "integrity": "sha512-XqTtfs/UzT2k2MeVQG1pOP+wR1zcH8V71S6kmWIwFcfyKUgZfIm45sNsZyBZPwY2RUqwCeZYQFjPlVW8wD1PBw==", + "requires": { + "tslib": "1.9.1" + } + }, + "@angular/service-worker": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-6.0.2.tgz", + "integrity": "sha512-vJ9QGi2O0Ft3tEYwVXm0Y3hV721iqByemYoptVxwGvxyi4fcoeMImrvmc8Z4UCHDRIaziXhLHKOvAgH9ao+VGQ==", + "requires": { + "tslib": "1.9.1" + } + }, + "@biesbjerg/ngx-translate-extract": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@biesbjerg/ngx-translate-extract/-/ngx-translate-extract-2.3.4.tgz", + "integrity": "sha512-FzOdm5Jr2TMgdzTW+c6CGIgMQMCAXCyN6JYzz+hfnYjcvPrYbyR05AhM08W70nXD3a2RnbqjImNjEEcXY9pZ/g==", + "dev": true, + "requires": { + "chalk": "2.0.1", + "cheerio": "1.0.0-rc.2", + "flat": "2.0.1", + "fs": "0.0.1-security", + "gettext-parser": "1.2.2", + "glob": "7.1.2", + "mkdirp": "0.5.1", + "path": "0.12.7", + "typescript": "2.4.1", + "yargs": "8.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "chalk": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.0.1.tgz", + "integrity": "sha512-Mp+FXEI+FrwY/XYV45b2YD3E8i3HwnEAoFcM0qlZzq/RZ9RwWitt2Y/c7cqRAz70U7hfekqx6qNYthuKFO6K0g==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + } + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + } + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "2.3.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "2.0.0", + "normalize-package-data": "2.4.0", + "path-type": "2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "2.0.0" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "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 + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + }, + "typescript": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.4.1.tgz", + "integrity": "sha1-w8yxbdqgsjFN4DHn5v7onlujRrw=", + "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 + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", + "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", + "dev": true, + "requires": { + "camelcase": "4.1.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "read-pkg-up": "2.0.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "7.0.0" + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "dev": true, + "requires": { + "camelcase": "4.1.0" + } + } + } + }, + "@fortawesome/fontawesome-free-webfonts": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free-webfonts/-/fontawesome-free-webfonts-1.0.9.tgz", + "integrity": "sha512-nLgl6b6a+tXaoJJnSRw0hjN8cWM/Q5DhxKAwI9Xr0AiC43lQ2F98vQ1KLA6kw5OoYeAyisGGqmlwtBj0WqOI5Q==" + }, + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "dev": true, + "requires": { + "call-me-maybe": "1.0.1", + "glob-to-regexp": "0.3.0" + } + }, + "@ng-bootstrap/ng-bootstrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-2.0.0.tgz", + "integrity": "sha512-t4QZ3es/u/yB6QchmyJemJbdtrVH4FtenlKgHJZ8095IOeKy8YVXgUwBqyLLZdU2JAwkOESmEns5ESciJHR18Q==" + }, + "@ngtools/webpack": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-6.0.3.tgz", + "integrity": "sha512-wrhSFItcZp4Yzp6lgSuy23YdhaUs9D+KdGZPjwzzXtJIJCSzGkWuXzwlCwyKSFRQ6thyH/T3nffpHNaS3dWn2A==", + "dev": true, + "requires": { + "@angular-devkit/core": "0.6.3", + "tree-kill": "1.2.0", + "webpack-sources": "1.1.0" + } + }, + "@ngx-rocket/ascii-logo": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@ngx-rocket/ascii-logo/-/ascii-logo-1.1.0.tgz", + "integrity": "sha1-39lVFQ4+meIktZ1fQnPkQSXQPpg=", + "dev": true, + "requires": { + "chalk": "2.2.2" + } + }, + "@ngx-rocket/scripts": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ngx-rocket/scripts/-/scripts-2.2.0.tgz", + "integrity": "sha512-PCio9bRkLLN97mX7EK7q/5cYdNvVuas9SwmNd614eGIzbEy6+clq3m5ItPeYrGPN3XMMe74/yU/cRNscweySaA==", + "dev": true, + "requires": { + "@ngx-rocket/ascii-logo": "1.1.0", + "chalk": "2.4.1", + "fs-extra": "5.0.0", + "minimist": "1.2.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "@ngx-translate/core": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-10.0.1.tgz", + "integrity": "sha1-nzo+0HfoR90NKVGmZNpu40igbSI=", + "requires": { + "tslib": "1.9.1" + } + }, + "@nodelib/fs.stat": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.0.2.tgz", + "integrity": "sha512-vCpf75JDcdomXvUd7Rn6DfYAVqPAFI66FVjxiWGwh85OLdvfo3paBoPJaam5keIYRyUolnS7SleS/ZPCidCvzw==", + "dev": true + }, + "@schematics/angular": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-0.6.3.tgz", + "integrity": "sha512-YhldE1K6x/8D0PxFusjtB32iOAayyD1PSxPCx/q7I7T6x/lG7l35ZDV6ZZE6bDvIaxQBsjhIm8ACy2n+xwFxTA==", + "dev": true, + "requires": { + "@angular-devkit/core": "0.6.3", + "@angular-devkit/schematics": "0.6.3", + "typescript": "2.7.2" + } + }, + "@schematics/update": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.6.3.tgz", + "integrity": "sha512-UsKrg02+jwdsz9BdMVxDMeAZCF+c+dvHRWww4D2RcNzWdCTVWeBqRAmlreJJ0TGE54r7PEBnmQe0t5mS4F3d4w==", + "dev": true, + "requires": { + "@angular-devkit/core": "0.6.3", + "@angular-devkit/schematics": "0.6.3", + "npm-registry-client": "8.5.1", + "rxjs": "6.1.0", + "semver": "5.5.0", + "semver-intersect": "1.3.1" + } + }, + "@types/babel-types": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.2.tgz", + "integrity": "sha512-ylggu8DwwxT6mk3jVoJeohWAePWMNWEYm06MSoJ19kwp3hT9eY2Z4NNZn3oevzgFmClgNQ2GQF500hPDvNsGHg==", + "dev": true + }, + "@types/babylon": { + "version": "6.16.2", + "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.2.tgz", + "integrity": "sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q==", + "dev": true, + "requires": { + "@types/babel-types": "7.0.2" + } + }, + "@types/jasmine": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.8.7.tgz", + "integrity": "sha512-RdbrPcW1aD78UmdLiDa9ZCKrbR5Go8PXh6GCpb4oIOkWVEusubSJJDrP4c5RYOu8m/CBz+ygZpicj6Pgms5a4Q==", + "dev": true + }, + "@types/jasminewd2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.3.tgz", + "integrity": "sha512-hYDVmQZT5VA2kigd4H4bv7vl/OhlympwREUemqBdOqtrYTo5Ytm12a5W5/nGgGYdanGVxj0x/VhZ7J3hOg/YKg==", + "dev": true, + "requires": { + "@types/jasmine": "2.8.7" + } + }, + "@types/lodash": { + "version": "4.14.109", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.109.tgz", + "integrity": "sha512-hop8SdPUEzbcJm6aTsmuwjIYQo1tqLseKCM+s2bBqTU2gErwI4fE+aqUVOlscPSQbKHKgtMMPoC+h4AIGOJYvw==", + "dev": true + }, + "@types/node": { + "version": "8.10.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.17.tgz", + "integrity": "sha512-3N3FRd/rA1v5glXjb90YdYUa+sOB7WrkU2rAhKZnF4TKD86Cym9swtulGuH0p9nxo7fP5woRNa8b0oFTpCO1bg==", + "dev": true + }, + "@types/q": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", + "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", + "dev": true + }, + "@types/selenium-webdriver": { + "version": "2.53.43", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-2.53.43.tgz", + "integrity": "sha512-UBYHWph6P3tutkbXpW6XYg9ZPbTKjw/YC2hGG1/GEvWwTbvezBUv3h+mmUFw79T3RFPnmedpiXdOBbXX+4l0jg==", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.4.3.tgz", + "integrity": "sha512-S6npYhPcTHDYe9nlsKa9CyWByFi8Vj8HovcAgtmMAQZUOczOZbQ8CnwMYKYC5HEZzxEE+oY0jfQk4cVlI3J59Q==", + "dev": true, + "requires": { + "@webassemblyjs/helper-wasm-bytecode": "1.4.3", + "@webassemblyjs/wast-parser": "1.4.3", + "debug": "3.1.0", + "webassemblyjs": "1.4.3" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.4.3.tgz", + "integrity": "sha512-3zTkSFswwZOPNHnzkP9ONq4bjJSeKVMcuahGXubrlLmZP8fmTIJ58dW7h/zOVWiFSuG2em3/HH3BlCN7wyu9Rw==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.4.3.tgz", + "integrity": "sha512-e8+KZHh+RV8MUvoSRtuT1sFXskFnWG9vbDy47Oa166xX+l0dD5sERJ21g5/tcH8Yo95e9IN3u7Jc3NbhnUcSkw==", + "dev": true, + "requires": { + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.4.3.tgz", + "integrity": "sha512-9FgHEtNsZQYaKrGCtsjswBil48Qp1agrzRcPzCbQloCoaTbOXLJ9IRmqT+uEZbenpULLRNFugz3I4uw18hJM8w==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.4.3" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.4.3.tgz", + "integrity": "sha512-JINY76U+702IRf7ePukOt037RwmtH59JHvcdWbTTyHi18ixmQ+uOuNhcdCcQHTquDAH35/QgFlp3Y9KqtyJsCQ==", + "dev": true + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.4.3.tgz", + "integrity": "sha512-I7bS+HaO0K07Io89qhJv+z1QipTpuramGwUSDkwEaficbSvCcL92CUZEtgykfNtk5wb0CoLQwWlmXTwGbNZUeQ==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.4.3.tgz", + "integrity": "sha512-p0yeeO/h2r30PyjnJX9xXSR6EDcvJd/jC6xa/Pxg4lpfcNi7JUswOpqDToZQ55HMMVhXDih/yqkaywHWGLxqyQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.4.3", + "@webassemblyjs/helper-buffer": "1.4.3", + "@webassemblyjs/helper-wasm-bytecode": "1.4.3", + "@webassemblyjs/wasm-gen": "1.4.3", + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "@webassemblyjs/leb128": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.4.3.tgz", + "integrity": "sha512-4u0LJLSPzuRDWHwdqsrThYn+WqMFVqbI2ltNrHvZZkzFPO8XOZ0HFQ5eVc4jY/TNHgXcnwrHjONhPGYuuf//KQ==", + "dev": true, + "requires": { + "leb": "0.3.0" + } + }, + "@webassemblyjs/validation": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/validation/-/validation-1.4.3.tgz", + "integrity": "sha512-R+rRMKfhd9mq0rj2mhU9A9NKI2l/Rw65vIYzz4lui7eTKPcCu1l7iZNi4b9Gen8D42Sqh/KGiaQNk/x5Tn/iBQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.4.3" + } + }, + "@webassemblyjs/wasm-edit": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.4.3.tgz", + "integrity": "sha512-qzuwUn771PV6/LilqkXcS0ozJYAeY/OKbXIWU3a8gexuqb6De2p4ya/baBeH5JQ2WJdfhWhSvSbu86Vienttpw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.4.3", + "@webassemblyjs/helper-buffer": "1.4.3", + "@webassemblyjs/helper-wasm-bytecode": "1.4.3", + "@webassemblyjs/helper-wasm-section": "1.4.3", + "@webassemblyjs/wasm-gen": "1.4.3", + "@webassemblyjs/wasm-opt": "1.4.3", + "@webassemblyjs/wasm-parser": "1.4.3", + "@webassemblyjs/wast-printer": "1.4.3", + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.4.3.tgz", + "integrity": "sha512-eR394T8dHZfpLJ7U/Z5pFSvxl1L63JdREebpv9gYc55zLhzzdJPAuxjBYT4XqevUdW67qU2s0nNA3kBuNJHbaQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.4.3", + "@webassemblyjs/helper-wasm-bytecode": "1.4.3", + "@webassemblyjs/leb128": "1.4.3" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.4.3.tgz", + "integrity": "sha512-7Gp+nschuKiDuAL1xmp4Xz0rgEbxioFXw4nCFYEmy+ytynhBnTeGc9W9cB1XRu1w8pqRU2lbj2VBBA4cL5Z2Kw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.4.3", + "@webassemblyjs/helper-buffer": "1.4.3", + "@webassemblyjs/wasm-gen": "1.4.3", + "@webassemblyjs/wasm-parser": "1.4.3", + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.4.3.tgz", + "integrity": "sha512-KXBjtlwA3BVukR/yWHC9GF+SCzBcgj0a7lm92kTOaa4cbjaTaa47bCjXw6cX4SGQpkncB9PU2hHGYVyyI7wFRg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.4.3", + "@webassemblyjs/helper-wasm-bytecode": "1.4.3", + "@webassemblyjs/leb128": "1.4.3", + "@webassemblyjs/wasm-parser": "1.4.3", + "webassemblyjs": "1.4.3" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.4.3.tgz", + "integrity": "sha512-QhCsQzqV0CpsEkRYyTzQDilCNUZ+5j92f+g35bHHNqS22FppNTywNFfHPq8ZWZfYCgbectc+PoghD+xfzVFh1Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.4.3", + "@webassemblyjs/floating-point-hex-parser": "1.4.3", + "@webassemblyjs/helper-code-frame": "1.4.3", + "@webassemblyjs/helper-fsm": "1.4.3", + "long": "3.2.0", + "webassemblyjs": "1.4.3" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.4.3.tgz", + "integrity": "sha512-EgXk4anf8jKmuZJsqD8qy5bz2frEQhBvZruv+bqwNoLWUItjNSFygk8ywL3JTEz9KtxTlAmqTXNrdD1d9gNDtg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.4.3", + "@webassemblyjs/wast-parser": "1.4.3", + "long": "3.2.0" + } + }, + "abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", + "dev": true + }, + "accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "dev": true, + "requires": { + "mime-types": "2.1.18", + "negotiator": "0.6.1" + } + }, + "ace-builds": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.3.3.tgz", + "integrity": "sha512-PbSdoHw42kt5vaXkEVSfUYCd3K1BCfAvyXW9TvR/2ATkk65oImjS1v0evHmzHhOYPSTUO8BprvmpfYT9Vp2akA==", + "dev": true + }, + "acorn": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", + "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", + "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", + "dev": true, + "requires": { + "acorn": "5.5.3" + } + }, + "acorn-globals": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", + "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", + "dev": true, + "requires": { + "acorn": "4.0.13" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + } + } + }, + "addressparser": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/addressparser/-/addressparser-1.0.1.tgz", + "integrity": "sha1-R6++GiqSYhkdtoOOT9HTm0CCF0Y=", + "dev": true, + "optional": true + }, + "adm-zip": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.4.tgz", + "integrity": "sha1-ph7VrmkFw66lizplfSUDMJEFJzY=", + "dev": true + }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", + "dev": true + }, + "agent-base": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.0.tgz", + "integrity": "sha512-c+R/U5X+2zz2+UCrCFv6odQzJdoqI+YecuhnAJLa1zYaMc13zPfwMwZrr91Pd1DYNo/yPRbiM4WVf9whgwFsIg==", + "dev": true, + "requires": { + "es6-promisify": "5.0.0" + } + }, + "ajv": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.4.0.tgz", + "integrity": "sha1-06/3jpJ3VJdx2vAWTP9ISCt1T8Y=", + "dev": true, + "requires": { + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1", + "uri-js": "3.0.2" + } + }, + "ajv-keywords": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", + "dev": true + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "amqplib": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.5.2.tgz", + "integrity": "sha512-l9mCs6LbydtHqRniRwYkKdqxVa6XMz3Vw1fh+2gJaaVgTM6Jk3o8RccAKWKtlhT1US5sWrFh+KKxsVUALURSIA==", + "dev": true, + "optional": true, + "requires": { + "bitsyntax": "0.0.4", + "bluebird": "3.5.1", + "buffer-more-ints": "0.0.2", + "readable-stream": "1.1.14", + "safe-buffer": "5.1.2" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true, + "optional": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "optional": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true, + "optional": true + } + } + }, + "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 + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "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, + "requires": { + "color-convert": "1.9.1" + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "3.1.10", + "normalize-path": "2.1.1" + } + }, + "app-root-path": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.0.1.tgz", + "integrity": "sha1-zWLc+OT9WkF+/GZNLlsQZTxlG0Y=", + "dev": true + }, + "append-field": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-0.1.0.tgz", + "integrity": "sha1-bdxY+gg8e8VF08WZWygwzCNm1Eo=", + "dev": true + }, + "append-transform": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", + "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", + "dev": true, + "requires": { + "default-require-extensions": "1.0.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "dev": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.6" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "1.0.3" + } + }, + "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 + }, + "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 + }, + "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 + }, + "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 + }, + "array-flatten": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", + "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=", + "dev": true + }, + "array-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "dev": true, + "requires": { + "define-properties": "1.1.2", + "es-abstract": "1.11.0" + } + }, + "array-iterate": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-1.1.2.tgz", + "integrity": "sha512-1hWSHTIlG/8wtYD+PPX5AOBtKWngpDFjrsrHgZpe+JdgNGz0udYu6ZIkAa/xuenIUEqFv7DvE2Yr60jxweJSrQ==", + "dev": true + }, + "array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "1.0.3" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "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 + }, + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true + }, + "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, + "requires": { + "bn.js": "4.11.8", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.1" + } + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "dev": true, + "requires": { + "util": "0.10.3" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "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 + }, + "ast-types": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.11.4.tgz", + "integrity": "sha512-RbY3UMcOcGhc3pOfQ6sliVjt3lqGib9lRjfH1UXJ8YfBFWbcWSJ8jr/VB2W6ulCzTSO/DSnCASqsHYuqa8O7yw==", + "dev": true, + "optional": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, + "async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", + "dev": true, + "optional": true + }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", + "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", + "dev": true + }, + "autoprefixer": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-8.5.0.tgz", + "integrity": "sha512-buY1XxFoBrXvLsoFb0jP+niSu1tCj2RwMwHj96+RfQ8DJTgb0vUhh0dg6wjJT3JzsFYBrkSj8/sGtarNdlxTFw==", + "dev": true, + "requires": { + "browserslist": "3.2.7", + "caniuse-lite": "1.0.30000843", + "normalize-range": "0.1.2", + "num2fraction": "1.2.2", + "postcss": "6.0.22", + "postcss-value-parser": "3.3.0" + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", + "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==", + "dev": true + }, + "axios": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.15.3.tgz", + "integrity": "sha1-LJ1jiy4ZGgjqHWzJiOrda6W9wFM=", + "dev": true, + "optional": true, + "requires": { + "follow-redirects": "1.0.0" + }, + "dependencies": { + "follow-redirects": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.0.0.tgz", + "integrity": "sha1-jjQpjL0uF28lTv/sdaHHjMhJ/Tc=", + "dev": true, + "optional": true, + "requires": { + "debug": "2.6.9" + } + } + } + }, + "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, + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "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 + } + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "requires": { + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "detect-indent": "4.0.0", + "jsesc": "1.3.0", + "lodash": "4.17.10", + "source-map": "0.5.7", + "trim-right": "1.0.1" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "2.5.6", + "regenerator-runtime": "0.11.1" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "lodash": "4.17.10" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "debug": "2.6.9", + "globals": "9.18.0", + "invariant": "2.2.4", + "lodash": "4.17.10" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "esutils": "2.0.2", + "lodash": "4.17.10", + "to-fast-properties": "1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "dev": true + }, + "bail": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.3.tgz", + "integrity": "sha512-1X8CnjFVQ+a+KW36uBNMTU5s8+v5FzeqrP7hTG5aTb4aPreSbZJlhwPon9VKMuEVgV++JM+SQrALY3kr7eswdg==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "1.0.1", + "class-utils": "0.3.6", + "component-emitter": "1.2.1", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.1", + "pascalcase": "0.1.1" + }, + "dependencies": { + "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, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "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, + "requires": { + "kind-of": "6.0.2" + } + }, + "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, + "requires": { + "kind-of": "6.0.2" + } + }, + "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, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + } + } + }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "dev": true + }, + "base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", + "dev": true + }, + "base64id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", + "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "dev": true, + "requires": { + "callsite": "1.0.0" + } + }, + "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 + }, + "binary-extensions": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", + "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", + "dev": true + }, + "bitsyntax": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/bitsyntax/-/bitsyntax-0.0.4.tgz", + "integrity": "sha1-6xDMb4K4xJDj6FaY8H6D1G4MuoI=", + "dev": true, + "optional": true, + "requires": { + "buffer-more-ints": "0.0.2" + } + }, + "bl": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.1.2.tgz", + "integrity": "sha1-/cqHGplxOqANGeO7ukHER4emU5g=", + "dev": true, + "optional": true, + "requires": { + "readable-stream": "2.0.6" + }, + "dependencies": { + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true, + "optional": true + }, + "readable-stream": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", + "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", + "dev": true, + "optional": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "0.10.31", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true, + "optional": true + } + } + }, + "blob": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", + "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=", + "dev": true + }, + "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, + "optional": true, + "requires": { + "inherits": "2.0.3" + } + }, + "blocking-proxy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz", + "integrity": "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==", + "dev": true, + "requires": { + "minimist": "1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", + "dev": true + }, + "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 + }, + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "content-type": "1.0.4", + "debug": "2.6.9", + "depd": "1.1.2", + "http-errors": "1.6.3", + "iconv-lite": "0.4.19", + "on-finished": "2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "1.6.16" + }, + "dependencies": { + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "dev": true + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "2.1.1", + "deep-equal": "1.0.1", + "dns-equal": "1.0.0", + "dns-txt": "2.0.2", + "multicast-dns": "6.2.3", + "multicast-dns-service-types": "1.1.0" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "boom": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", + "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", + "dev": true, + "requires": { + "hoek": "4.2.1" + } + }, + "bootstrap": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.1.1.tgz", + "integrity": "sha512-SpiDSOcbg4J/PjVSt4ny5eY6j74VbVSjROY4Fb/WIUXBV9cnb5luyR4KnPvNoXuGnBK1T+nJIWqRsvU3yP8Mcg==" + }, + "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, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "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.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "1.0.3", + "cipher-base": "1.0.4", + "create-hash": "1.2.0", + "evp_bytestokey": "1.0.3", + "inherits": "2.0.3", + "safe-buffer": "5.1.2" + } + }, + "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, + "requires": { + "browserify-aes": "1.2.0", + "browserify-des": "1.0.1", + "evp_bytestokey": "1.0.3" + } + }, + "browserify-des": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.1.tgz", + "integrity": "sha512-zy0Cobe3hhgpiOM32Tj7KQ3Vl91m0njwsjzZQK1L+JDf11dzP9qIvjreVinsvXrgfjhStXwUWAEpB9D7Gwmayw==", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "des.js": "1.0.0", + "inherits": "2.0.3" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "randombytes": "2.0.6" + } + }, + "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, + "requires": { + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "elliptic": "6.4.0", + "inherits": "2.0.3", + "parse-asn1": "5.1.1" + } + }, + "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, + "requires": { + "pako": "1.0.6" + } + }, + "browserslist": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.7.tgz", + "integrity": "sha512-oYVLxFVqpX9uMhOIQBLtZL+CX4uY8ZpWcjNTaxyWl5rO8yA9SSNikFnAfvk8J3P/7z3BZwNmEqFKaJoYltj3MQ==", + "dev": true, + "requires": { + "caniuse-lite": "1.0.30000843", + "electron-to-chromium": "1.3.47" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "1.3.0", + "ieee754": "1.1.11", + "isarray": "1.0.0" + } + }, + "buffer-from": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", + "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==", + "dev": true + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "buffer-more-ints": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-0.0.2.tgz", + "integrity": "sha1-JrOIXRD6E9t/wBquOquHAZngEkw=", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "buildmail": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/buildmail/-/buildmail-4.0.1.tgz", + "integrity": "sha1-h393OLeHKYccmhBeO4N9K+EaenI=", + "dev": true, + "optional": true, + "requires": { + "addressparser": "1.0.1", + "libbase64": "0.1.0", + "libmime": "3.0.0", + "libqp": "1.1.0", + "nodemailer-fetch": "1.6.0", + "nodemailer-shared": "1.1.0", + "punycode": "1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true, + "optional": true + } + } + }, + "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 + }, + "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 + }, + "builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", + "dev": true + }, + "busboy": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", + "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=", + "dev": true, + "requires": { + "dicer": "0.2.5", + "readable-stream": "1.1.14" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "cacache": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", + "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", + "dev": true, + "requires": { + "bluebird": "3.5.1", + "chownr": "1.0.1", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "lru-cache": "4.1.3", + "mississippi": "2.0.0", + "mkdirp": "0.5.1", + "move-concurrently": "1.0.1", + "promise-inflight": "1.0.1", + "rimraf": "2.6.2", + "ssri": "5.3.0", + "unique-filename": "1.1.0", + "y18n": "4.0.0" + } + }, + "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, + "requires": { + "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" + } + }, + "cache-loader": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-1.2.2.tgz", + "integrity": "sha512-rsGh4SIYyB9glU+d0OcHwiXHXBoUgDhHZaQ1KAbiXqfz1CDPxtTboh1gPbJ0q2qdO8a9lfcjgC5CJ2Ms32y5bw==", + "dev": true, + "requires": { + "loader-utils": "1.1.0", + "mkdirp": "0.5.1", + "neo-async": "2.5.1", + "schema-utils": "0.4.5" + } + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "dev": true + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "requires": { + "no-case": "2.3.2", + "upper-case": "1.1.3" + } + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "2.1.1", + "map-obj": "1.0.1" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + } + } + }, + "caniuse-lite": { + "version": "1.0.30000843", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000843.tgz", + "integrity": "sha512-1ntiW826MhRBmM0CeI7w1cQr16gxwOoM8doJWh3BFalPZoKWdZXs27Bc04xth/3NR1/wNXn9cpP4F92lVenCvg==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "ccount": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.3.tgz", + "integrity": "sha512-Jt9tIBkRc9POUof7QA/VwWd+58fKkEEfI+/t1/eOlxKM7ZhrczNzMFefge7Ai+39y1pR/pP6cI19guHy3FSLmw==", + "dev": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + } + }, + "chalk": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.2.2.tgz", + "integrity": "sha512-LvixLAQ4MYhbf7hgL4o5PeK32gJKvVzDRiSNIApDofQvyhl8adgG2lJVXn4+ekQoK7HL9RF8lqxwerpe0x2pCw==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + }, + "dependencies": { + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + } + } + }, + "character-entities": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.2.tgz", + "integrity": "sha512-sMoHX6/nBiy3KKfC78dnEalnpn0Az0oSNvqUWYTtYrhRI5iUIYsROU48G+E+kMFQzqXaJ8kHJZ85n7y6/PHgwQ==", + "dev": true + }, + "character-entities-html4": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.2.tgz", + "integrity": "sha512-sIrXwyna2+5b0eB9W149izTPJk/KkJTg6mEzDGibwBUkyH1SbDa+nf515Ppdi3MaH35lW0JFJDWeq9Luzes1Iw==", + "dev": true + }, + "character-entities-legacy": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.2.tgz", + "integrity": "sha512-9NB2VbXtXYWdXzqrvAHykE/f0QJxzaKIpZ5QzNZrrgQ7Iyxr2vnfS8fCBNVW9nUEZE0lo57nxKRqnzY/dKrwlA==", + "dev": true + }, + "character-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", + "integrity": "sha1-x84o821LzZdE5f/CxfzeHHMmH8A=", + "dev": true, + "requires": { + "is-regex": "1.0.4" + } + }, + "character-reference-invalid": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.2.tgz", + "integrity": "sha512-7I/xceXfKyUJmSAn/jw8ve/9DyOP7XxufNYLI9Px7CmsKgEUaZLUTax6nZxGQtaoiZCjpu6cHPj20xC/vqRReQ==", + "dev": true + }, + "cheerio": { + "version": "1.0.0-rc.2", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", + "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", + "dev": true, + "requires": { + "css-select": "1.2.0", + "dom-serializer": "0.1.0", + "entities": "1.1.1", + "htmlparser2": "3.9.2", + "lodash": "4.17.10", + "parse5": "3.0.3" + }, + "dependencies": { + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "requires": { + "domelementtype": "1.3.0" + } + }, + "htmlparser2": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", + "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", + "dev": true, + "requires": { + "domelementtype": "1.3.0", + "domhandler": "2.4.2", + "domutils": "1.5.1", + "entities": "1.1.1", + "inherits": "2.0.3", + "readable-stream": "2.3.6" + } + }, + "parse5": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz", + "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==", + "dev": true, + "requires": { + "@types/node": "8.10.17" + } + } + } + }, + "chokidar": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.3.tgz", + "integrity": "sha512-zW8iXYZtXMx4kux/nuZVXjkLP+CyIK5Al5FHnj1OgTKGZfp4Oy6/ymtMSKFv3GD8DviEmUPmJg9eFdJ/JzudMg==", + "dev": true, + "requires": { + "anymatch": "2.0.0", + "async-each": "1.0.1", + "braces": "2.3.2", + "fsevents": "1.2.4", + "glob-parent": "3.1.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "4.0.0", + "normalize-path": "2.1.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0", + "upath": "1.1.0" + } + }, + "chownr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", + "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", + "dev": true + }, + "chrome-trace-event": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-0.1.3.tgz", + "integrity": "sha512-sjndyZHrrWiu4RY7AkHgjn80GfAM2ZSzUkZLV/Js59Ldmh6JDThf0SUmOHU53rFu2rVxxfCzJ30Ukcfch3Gb/A==", + "dev": true + }, + "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, + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.2" + } + }, + "circular-dependency-plugin": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.0.2.tgz", + "integrity": "sha512-oC7/DVAyfcY3UWKm0sN/oVoDedQDQiw/vIiAnuTWTpE5s0zWf7l3WY417Xw/Fbi/QbAjctAkxgMiS9P0s3zkmA==", + "dev": true + }, + "circular-json": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.4.tgz", + "integrity": "sha512-vnJA8KS0BfOihugYEUkLRcnmq21FbuivbxgzDLXNs3zIk4KllV4Mx4UuTzBXht9F00C7QfD1YqMXg1zP6EXpig==", + "dev": true + }, + "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, + "requires": { + "arr-union": "3.1.0", + "define-property": "0.2.5", + "isobject": "3.0.1", + "static-extend": "0.1.2" + }, + "dependencies": { + "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, + "requires": { + "is-descriptor": "0.1.6" + } + } + } + }, + "clean-css": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz", + "integrity": "sha1-Ls3xRaujj1R0DybO/Q/z4D4SXWo=", + "dev": true, + "requires": { + "source-map": "0.5.7" + } + }, + "cli": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/cli/-/cli-0.6.6.tgz", + "integrity": "sha1-Aq1Eo4Cr8nraxebwzdewQ9dMU+M=", + "dev": true, + "requires": { + "exit": "0.1.2", + "glob": "3.2.11" + }, + "dependencies": { + "glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "minimatch": "0.3.0" + } + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", + "dev": true + }, + "minimatch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", + "dev": true, + "requires": { + "lru-cache": "2.7.3", + "sigmund": "1.0.1" + } + } + } + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true + } + } + }, + "clone": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", + "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", + "dev": true + }, + "clone-deep": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz", + "integrity": "sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==", + "dev": true, + "requires": { + "for-own": "1.0.0", + "is-plain-object": "2.0.4", + "kind-of": "6.0.2", + "shallow-clone": "1.0.0" + } + }, + "clone-regexp": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-1.0.1.tgz", + "integrity": "sha512-Fcij9IwRW27XedRIJnSOEupS7RVcXtObJXbcUOX93UCLqqOdRpkvzKywOOSizmEK/Is3S/RHX9dLdfo6R1Q1mw==", + "dev": true, + "requires": { + "is-regexp": "1.0.0", + "is-supported-regexp-flag": "1.0.1" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": 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=", + "dev": true + }, + "codelyzer": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-4.3.0.tgz", + "integrity": "sha512-RLMrtLwrBS0dfo2/KTP+2NHofCpzcuh0bEp/A/naqvQonbUL4AW/qWQdbpn8dMNudtpmzEx9eS8KEpGdVPg1BA==", + "dev": true, + "requires": { + "app-root-path": "2.0.1", + "css-selector-tokenizer": "0.7.0", + "cssauron": "1.4.0", + "semver-dsl": "1.0.1", + "source-map": "0.5.7", + "sprintf-js": "1.0.3" + } + }, + "collapse-white-space": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.4.tgz", + "integrity": "sha512-YfQ1tAUZm561vpYD+5eyWN8+UsceQbSrqqlc/6zDY2gtAE+uZLSdkkovhnGpmCThsvKBFakq4EdY/FF93E8XIw==", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "1.0.0", + "object-visit": "1.0.1" + } + }, + "color-convert": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", + "dev": true + }, + "combine-lists": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/combine-lists/-/combine-lists-1.0.1.tgz", + "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=", + "dev": true, + "requires": { + "lodash": "4.17.10" + } + }, + "combined-stream": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "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 + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "compare-versions": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.2.1.tgz", + "integrity": "sha512-2y2nHcopMG/NAyk6vWXlLs86XeM9sik4jmx1tKIgzMi9/RQ2eo758RGpxQO3ErihHmg0RlQITPqgz73y6s7quA==", + "dev": true + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "dev": true + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "dev": true + }, + "compressible": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.13.tgz", + "integrity": "sha1-DRAgq5JLL9tNYnmHXH1tq6a6p6k=", + "dev": true, + "requires": { + "mime-db": "1.33.0" + } + }, + "compression": { + "version": "1.7.2", + "resolved": "http://registry.npmjs.org/compression/-/compression-1.7.2.tgz", + "integrity": "sha1-qv+81qr4VLROuygDU9WtFlH1mmk=", + "dev": true, + "requires": { + "accepts": "1.3.5", + "bytes": "3.0.0", + "compressible": "2.0.13", + "debug": "2.6.9", + "on-headers": "1.0.1", + "safe-buffer": "5.1.1", + "vary": "1.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true + } + } + }, + "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 + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "1.0.0", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "typedarray": "0.0.6" + } + }, + "connect": { + "version": "3.6.6", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", + "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.0", + "parseurl": "1.3.2", + "utils-merge": "1.0.1" + }, + "dependencies": { + "finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "statuses": "1.3.1", + "unpipe": "1.0.0" + } + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true + } + } + }, + "connect-history-api-fallback": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", + "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=", + "dev": true + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "0.1.4" + } + }, + "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 + }, + "constantinople": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.1.2.tgz", + "integrity": "sha512-yePcBqEFhLOqSBtwYOGGS1exHo/s1xjekXiinh4itpNQGCu4KA1euPh1fg07N2wMITZXQkBz75Ntdt1ctGZouw==", + "dev": true, + "requires": { + "@types/babel-types": "7.0.2", + "@types/babylon": "6.16.2", + "babel-types": "6.26.0", + "babylon": "6.18.0" + } + }, + "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 + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", + "dev": true + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", + "dev": true + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "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, + "requires": { + "aproba": "1.2.0", + "fs-write-stream-atomic": "1.0.10", + "iferr": "0.1.5", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "run-queue": "1.0.3" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "copy-webpack-plugin": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.5.1.tgz", + "integrity": "sha512-OlTo6DYg0XfTKOF8eLf79wcHm4Ut10xU2cRBRPMW/NA5F9VMjZGTfRHWDIYC3s+1kObGYrBLshXWU1K0hILkNQ==", + "dev": true, + "requires": { + "cacache": "10.0.4", + "find-cache-dir": "1.0.0", + "globby": "7.1.1", + "is-glob": "4.0.0", + "loader-utils": "1.1.0", + "minimatch": "3.0.4", + "p-limit": "1.2.0", + "serialize-javascript": "1.5.0" + } + }, + "core-js": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.6.tgz", + "integrity": "sha512-lQUVfQi0aLix2xpyjrrJEvfuYCqPc/HwmTKsC/VNf8q0zsjX7SQZtp4+oRONN5Tsur9GDETPjj+Ub2iDiGZfSQ==" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cosmiconfig": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", + "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", + "dev": true, + "requires": { + "is-directory": "0.3.1", + "js-yaml": "3.11.0", + "minimist": "1.2.0", + "object-assign": "4.1.1", + "os-homedir": "1.0.2", + "parse-json": "2.2.0", + "require-from-string": "1.2.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "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, + "requires": { + "bn.js": "4.11.8", + "elliptic": "6.4.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "inherits": "2.0.3", + "md5.js": "1.3.4", + "ripemd160": "2.0.2", + "sha.js": "2.4.11" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "create-hash": "1.2.0", + "inherits": "2.0.3", + "ripemd160": "2.0.2", + "safe-buffer": "5.1.2", + "sha.js": "2.4.11" + } + }, + "cross-spawn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "dev": true, + "optional": true, + "requires": { + "lru-cache": "4.1.3", + "which": "1.3.0" + } + }, + "cryptiles": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", + "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", + "dev": true, + "requires": { + "boom": "5.2.0" + }, + "dependencies": { + "boom": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", + "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", + "dev": true, + "requires": { + "hoek": "4.2.1" + } + } + } + }, + "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, + "requires": { + "browserify-cipher": "1.0.1", + "browserify-sign": "4.0.4", + "create-ecdh": "4.0.3", + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "diffie-hellman": "5.0.3", + "inherits": "2.0.3", + "pbkdf2": "3.0.16", + "public-encrypt": "4.0.2", + "randombytes": "2.0.6", + "randomfill": "1.0.4" + } + }, + "css-parse": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz", + "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=", + "dev": true + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "1.0.0", + "css-what": "2.1.0", + "domutils": "1.5.1", + "nth-check": "1.0.1" + } + }, + "css-selector-tokenizer": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", + "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", + "dev": true, + "requires": { + "cssesc": "0.1.0", + "fastparse": "1.1.1", + "regexpu-core": "1.0.0" + } + }, + "css-what": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", + "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", + "dev": true + }, + "cssauron": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz", + "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=", + "dev": true, + "requires": { + "through": "2.3.8" + } + }, + "cssesc": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", + "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", + "dev": true + }, + "csslint": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/csslint/-/csslint-0.10.0.tgz", + "integrity": "sha1-OmoE51Zcjp0ZvrSXZ8fslug2WAU=", + "dev": true, + "requires": { + "parserlib": "0.2.5" + } + }, + "cuint": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", + "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=", + "dev": true + }, + "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, + "requires": { + "array-find-index": "1.0.2" + } + }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "dev": true + }, + "cyclist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "dev": true + }, + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true, + "requires": { + "es5-ext": "0.10.42" + } + }, + "d3": { + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/d3/-/d3-3.5.17.tgz", + "integrity": "sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g=", + "dev": true + }, + "dagre-d3-renderer": { + "version": "0.4.26", + "resolved": "https://registry.npmjs.org/dagre-d3-renderer/-/dagre-d3-renderer-0.4.26.tgz", + "integrity": "sha512-vOWj1uA4/APTrfDyfHaH/xpfXhPh9rszW+HOaEwPCeA6Afl06Lobfh7OpESuVMQW2QGuY4UQ7pte/p0WhdDs7w==", + "dev": true, + "requires": { + "d3": "3.5.17", + "dagre-layout": "0.8.8", + "graphlib": "2.1.5", + "lodash": "4.17.10" + } + }, + "dagre-layout": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/dagre-layout/-/dagre-layout-0.8.8.tgz", + "integrity": "sha512-ZNV15T9za7X+fV8Z07IZquUKugCxm5owoiPPxfEx6OJRD331nkiIaF3vSt0JEY5FkrY0KfRQxcpQ3SpXB7pLPQ==", + "dev": true, + "requires": { + "graphlibrary": "2.2.0", + "lodash": "4.17.10" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + } + }, + "data-uri-to-buffer": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-1.2.0.tgz", + "integrity": "sha512-vKQ9DTQPN1FLYiiEEOQ6IBGFqvjCa5rSK3cWMy/Nespm5d/x3dGFT9UBZnkLxCwua/IXBi2TYnwTEpsOvhC4UQ==", + "dev": true, + "optional": true + }, + "date-format": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-1.2.0.tgz", + "integrity": "sha1-YV6CjiM90aubua4JUODOzPpuytg=", + "dev": true + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "requires": { + "decamelize": "1.2.0", + "map-obj": "1.0.1" + } + }, + "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 + }, + "deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", + "dev": true + }, + "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 + }, + "default-require-extensions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", + "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "dev": true, + "requires": { + "strip-bom": "2.0.0" + } + }, + "define-properties": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "dev": true, + "requires": { + "foreach": "2.0.5", + "object-keys": "1.0.11" + } + }, + "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, + "requires": { + "is-descriptor": "1.0.2", + "isobject": "3.0.1" + }, + "dependencies": { + "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, + "requires": { + "kind-of": "6.0.2" + } + }, + "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, + "requires": { + "kind-of": "6.0.2" + } + }, + "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, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + } + } + }, + "degenerator": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-1.0.4.tgz", + "integrity": "sha1-/PSQo37OJmRk2cxDGrmMWBnO0JU=", + "dev": true, + "optional": true, + "requires": { + "ast-types": "0.11.4", + "escodegen": "1.8.1", + "esprima": "3.1.3" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true, + "optional": true + } + } + }, + "del": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", + "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "dev": true, + "requires": { + "globby": "6.1.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.1", + "p-map": "1.2.0", + "pify": "3.0.0", + "rimraf": "2.6.2" + }, + "dependencies": { + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "minimalistic-assert": "1.0.1" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "detect-node": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.3.tgz", + "integrity": "sha1-ogM8CcyOFY03dI+951B4Mr1s4Sc=", + "dev": true + }, + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "dev": true + }, + "dicer": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", + "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=", + "dev": true, + "requires": { + "readable-stream": "1.1.14", + "streamsearch": "0.1.2" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "miller-rabin": "4.0.1", + "randombytes": "2.0.6" + } + }, + "dir-glob": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", + "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "dev": true, + "requires": { + "arrify": "1.0.1", + "path-type": "3.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "dev": true, + "requires": { + "ip": "1.1.5", + "safe-buffer": "5.1.2" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "1.1.1" + } + }, + "doctypes": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", + "integrity": "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk=", + "dev": true + }, + "dom-converter": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz", + "integrity": "sha1-pF71cnuJDJv/5tfIduexnLDhfzs=", + "dev": true, + "requires": { + "utila": "0.3.3" + }, + "dependencies": { + "utila": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", + "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=", + "dev": true + } + } + }, + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "dev": true, + "requires": { + "custom-event": "1.0.1", + "ent": "2.2.0", + "extend": "3.0.1", + "void-elements": "2.0.1" + } + }, + "dom-serializer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "dev": true, + "requires": { + "domelementtype": "1.1.3", + "entities": "1.1.1" + }, + "dependencies": { + "domelementtype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "dev": true + } + } + }, + "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 + }, + "domelementtype": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "dev": true + }, + "domhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz", + "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=", + "dev": true, + "requires": { + "domelementtype": "1.3.0" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0.1.0", + "domelementtype": "1.3.0" + } + }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "dev": true, + "requires": { + "is-obj": "1.0.1" + } + }, + "double-ended-queue": { + "version": "2.1.0-0", + "resolved": "https://registry.npmjs.org/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz", + "integrity": "sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw=", + "dev": true, + "optional": true + }, + "dropzone": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/dropzone/-/dropzone-5.4.0.tgz", + "integrity": "sha1-MpDAf1mxietaEemaWMmyra5az+w=", + "dev": true + }, + "duplexify": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", + "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", + "dev": true, + "requires": { + "end-of-stream": "1.4.1", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "stream-shift": "1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "ejs": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", + "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==", + "dev": true + }, + "elasticlunr": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/elasticlunr/-/elasticlunr-0.9.5.tgz", + "integrity": "sha1-ZVQbswnd3Qz5Ty0ciGGyvmUbsNU=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.47", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.47.tgz", + "integrity": "sha1-dk6IfKkQTQGgrI6r7n38DizhQQQ=", + "dev": true + }, + "elliptic": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", + "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "brorand": "1.1.0", + "hash.js": "1.1.3", + "hmac-drbg": "1.0.1", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.1", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "dev": true, + "requires": { + "iconv-lite": "0.4.19" + } + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "1.4.0" + } + }, + "engine.io": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.1.5.tgz", + "integrity": "sha512-D06ivJkYxyRrcEe0bTpNnBQNgP9d3xog+qZlLbui8EsMr/DouQpf5o9FzJnWYHEYE0YsFHllUv2R1dkgYZXHcA==", + "dev": true, + "requires": { + "accepts": "1.3.5", + "base64id": "1.0.0", + "cookie": "0.3.1", + "debug": "3.1.0", + "engine.io-parser": "2.1.2", + "uws": "9.14.0", + "ws": "3.3.3" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "engine.io-client": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.1.6.tgz", + "integrity": "sha512-hnuHsFluXnsKOndS4Hv6SvUrgdYx1pk2NqfaDMW+GWdgfU3+/V25Cj7I8a0x92idSpa5PIhJRKxPvp9mnoLsfg==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "3.1.0", + "engine.io-parser": "2.1.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "3.3.3", + "xmlhttprequest-ssl": "1.5.5", + "yeast": "0.1.2" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "engine.io-parser": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.2.tgz", + "integrity": "sha512-dInLFzr80RijZ1rGpx1+56/uFoH7/7InhH3kZt+Ms6hT8tNx3NGW/WNSA/f8As1WkOfkuyb3tnRyuXGxusclMw==", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.4", + "has-binary2": "1.0.3" + } + }, + "enhanced-resolve": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.0.0.tgz", + "integrity": "sha512-jox/62b2GofV1qTUQTMPEJSDIGycS43evqYzD/KVtEb9OCoki9cnacUPxCrZa7JfPzZSYOCZhu9O9luaMxAX8g==", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "memory-fs": "0.4.1", + "tapable": "1.0.0" + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, + "entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "dev": true + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "1.0.1" + } + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "es-abstract": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.11.0.tgz", + "integrity": "sha512-ZnQrE/lXTTQ39ulXZ+J1DTFazV9qBy61x2bY071B+qGco8Z8q1QddsLdt/EF8Ai9hcWH72dWS0kFqXLxOxqslA==", + "dev": true, + "requires": { + "es-to-primitive": "1.1.1", + "function-bind": "1.1.1", + "has": "1.0.1", + "is-callable": "1.1.3", + "is-regex": "1.0.4" + } + }, + "es-to-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "dev": true, + "requires": { + "is-callable": "1.1.3", + "is-date-object": "1.0.1", + "is-symbol": "1.0.1" + } + }, + "es5-ext": { + "version": "0.10.42", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.42.tgz", + "integrity": "sha512-AJxO1rmPe1bDEfSR6TJ/FgMFYuTBhR5R57KW58iCkYACMyFbrkqVyzXSurYoScDGvgyMpk7uRF/lPUPPTmsRSA==", + "dev": true, + "requires": { + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1", + "next-tick": "1.0.0" + } + }, + "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, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.42", + "es6-symbol": "3.1.1" + } + }, + "es6-promise": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", + "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==", + "dev": true + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true, + "requires": { + "es6-promise": "4.2.4" + } + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.42" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "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 + }, + "escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", + "dev": true, + "requires": { + "esprima": "2.7.3", + "estraverse": "1.9.3", + "esutils": "2.0.2", + "optionator": "0.8.2", + "source-map": "0.2.0" + }, + "dependencies": { + "source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", + "dev": true, + "optional": true, + "requires": { + "amdefine": "1.0.1" + } + } + } + }, + "eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "dev": true, + "requires": { + "esrecurse": "4.2.1", + "estraverse": "4.2.0" + }, + "dependencies": { + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + } + } + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "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, + "requires": { + "estraverse": "4.2.0" + }, + "dependencies": { + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + } + } + }, + "estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "eventemitter3": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", + "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==", + "dev": true + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true + }, + "eventsource": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", + "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", + "dev": true, + "requires": { + "original": "1.0.1" + } + }, + "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, + "requires": { + "md5.js": "1.3.4", + "safe-buffer": "5.1.2" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "4.1.3", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + } + } + }, + "execall": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execall/-/execall-1.0.0.tgz", + "integrity": "sha1-c9CQTjlbPKsGWLCNCewlMH8pu3M=", + "dev": true, + "requires": { + "clone-regexp": "1.0.1" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-braces": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz", + "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=", + "dev": true, + "requires": { + "array-slice": "0.2.3", + "array-unique": "0.2.1", + "braces": "0.1.5" + }, + "dependencies": { + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "braces": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz", + "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=", + "dev": true, + "requires": { + "expand-range": "0.1.1" + } + }, + "expand-range": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz", + "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=", + "dev": true, + "requires": { + "is-number": "0.1.1", + "repeat-string": "0.2.2" + } + }, + "is-number": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz", + "integrity": "sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY=", + "dev": true + }, + "repeat-string": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz", + "integrity": "sha1-x6jTI2BoNiBZp+RlH8aITosftK4=", + "dev": true + } + } + }, + "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, + "requires": { + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "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, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "2.2.4" + }, + "dependencies": { + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "3.0.0", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "express": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", + "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", + "dev": true, + "requires": { + "accepts": "1.3.5", + "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.2", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", + "finalhandler": "1.1.1", + "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.3", + "qs": "6.5.1", + "range-parser": "1.2.0", + "safe-buffer": "5.1.1", + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "1.4.0", + "type-is": "1.6.16", + "utils-merge": "1.0.1", + "vary": "1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "dev": true + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" + }, + "dependencies": { + "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, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "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.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "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, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "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, + "requires": { + "kind-of": "6.0.2" + } + }, + "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, + "requires": { + "kind-of": "6.0.2" + } + }, + "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, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + } + } + }, + "extract-zip": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.6.tgz", + "integrity": "sha1-EpDt6NINCHK0Kf0/NRyhKOxe+Fw=", + "dev": true, + "requires": { + "concat-stream": "1.6.0", + "debug": "2.6.9", + "mkdirp": "0.5.0", + "yauzl": "2.4.1" + }, + "dependencies": { + "concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "typedarray": "0.0.6" + } + }, + "mkdirp": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", + "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "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 + }, + "fast-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.2.tgz", + "integrity": "sha512-TR6zxCKftDQnUAPvkrCWdBgDq/gbqx8A3ApnBrR5rMvpp6+KMJI0Igw7fkWPgeVK0uhRXTXdvO3O+YP0CaUX2g==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "2.2.1", + "@nodelib/fs.stat": "1.0.2", + "glob-parent": "3.1.0", + "is-glob": "4.0.0", + "merge2": "1.2.2", + "micromatch": "3.1.10" + } + }, + "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=", + "dev": true + }, + "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 + }, + "fastparse": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", + "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=", + "dev": true + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": "0.7.0" + } + }, + "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, + "requires": { + "pend": "1.2.0" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "requires": { + "flat-cache": "1.3.0", + "object-assign": "4.1.1" + } + }, + "file-loader": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz", + "integrity": "sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg==", + "dev": true, + "requires": { + "loader-utils": "1.1.0", + "schema-utils": "0.4.5" + } + }, + "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 + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true, + "requires": { + "glob": "7.1.2", + "minimatch": "3.0.4" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "finalhandler": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "statuses": "1.4.0", + "unpipe": "1.0.0" + } + }, + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "dev": true, + "requires": { + "commondir": "1.0.1", + "make-dir": "1.3.0", + "pkg-dir": "2.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "flat": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat/-/flat-2.0.1.tgz", + "integrity": "sha1-cOKRiKdL4MPIlAnu0fqVd5B64y8=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + }, + "flat-cache": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", + "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "dev": true, + "requires": { + "circular-json": "0.3.3", + "del": "2.2.2", + "graceful-fs": "4.1.11", + "write": "0.2.1" + }, + "dependencies": { + "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 + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "5.0.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.1", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "rimraf": "2.6.2" + } + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "arrify": "1.0.1", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "flush-write-stream": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", + "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.6" + } + }, + "follow-redirects": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.4.1.tgz", + "integrity": "sha512-uxYePVPogtya1ktGnAAXOacnbIuRMB4dkvqeNz2qTtTQsuzSfbDolV+wMMKxAmCx0bLgAKLbBOkjItMbbkR1vg==", + "dev": true, + "requires": { + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "font-awesome": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz", + "integrity": "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM=", + "dev": true + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "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, + "requires": { + "for-in": "1.0.2" + } + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.6", + "mime-types": "2.1.18" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "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, + "requires": { + "map-cache": "0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.6" + } + }, + "fs": { + "version": "0.0.1-security", + "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", + "integrity": "sha1-invTcYa23d84E/I4WLV+yq9eQdQ=", + "dev": true + }, + "fs-access": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", + "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", + "dev": true, + "requires": { + "null-check": "1.0.0" + } + }, + "fs-extra": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", + "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "4.0.0", + "universalify": "0.1.1" + } + }, + "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, + "requires": { + "graceful-fs": "4.1.11", + "iferr": "0.1.5", + "imurmurhash": "0.1.4", + "readable-stream": "2.3.6" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", + "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "dev": true, + "optional": true, + "requires": { + "nan": "2.10.0", + "node-pre-gyp": "0.10.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "2.2.4" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "1.2.0", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.21", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": "2.1.2" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.2.4", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "5.1.1", + "yallist": "3.0.2" + } + }, + "minizlib": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "2.2.4" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "2.6.9", + "iconv-lite": "0.4.21", + "sax": "1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "1.0.3", + "mkdirp": "0.5.1", + "needle": "2.2.0", + "nopt": "4.0.1", + "npm-packlist": "1.1.10", + "npmlog": "4.1.2", + "rc": "1.2.7", + "rimraf": "2.6.2", + "semver": "5.5.0", + "tar": "4.4.1" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1.1.1", + "osenv": "0.1.5" + } + }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "3.0.1", + "npm-bundled": "1.0.3" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "0.5.1", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "1.0.2", + "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.2" + } + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.1.1", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.5.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "1.0.1", + "fs-minipass": "1.2.5", + "minipass": "2.2.4", + "minizlib": "1.1.0", + "mkdirp": "0.5.1", + "safe-buffer": "5.1.1", + "yallist": "3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.0.2", + "bundled": true, + "dev": true + } + } + }, + "fstream": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.2" + } + }, + "ftp": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz", + "integrity": "sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=", + "dev": true, + "optional": true, + "requires": { + "readable-stream": "1.1.14", + "xregexp": "2.0.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true, + "optional": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "optional": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true, + "optional": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "requires": { + "aproba": "1.2.0", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "gaze": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.2.tgz", + "integrity": "sha1-hHIkZ3rbiHDWeSV+0ziP22HkAQU=", + "dev": true, + "optional": true, + "requires": { + "globule": "1.2.0" + } + }, + "generate-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "dev": true, + "optional": true + }, + "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, + "optional": true, + "requires": { + "is-property": "1.0.2" + } + }, + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", + "dev": true + }, + "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 + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "get-uri": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-2.0.2.tgz", + "integrity": "sha512-ZD325dMZOgerGqF/rF6vZXyFGTAay62svjQIT+X/oU2PtxYpFxvSkbsdi+oxIrsNxlZVd4y8wUDqkaExWTI/Cw==", + "dev": true, + "optional": true, + "requires": { + "data-uri-to-buffer": "1.2.0", + "debug": "2.6.9", + "extend": "3.0.1", + "file-uri-to-path": "1.0.0", + "ftp": "0.3.10", + "readable-stream": "2.3.6" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + } + }, + "gettext-parser": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/gettext-parser/-/gettext-parser-1.2.2.tgz", + "integrity": "sha1-HvDadcHnWa4wicc++k0Z5AKYdI4=", + "dev": true, + "requires": { + "encoding": "0.1.12" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + }, + "dependencies": { + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "2.0.1" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + } + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "3.1.0", + "path-dirname": "1.0.2" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + } + } + }, + "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 + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "dir-glob": "2.0.0", + "glob": "7.1.2", + "ignore": "3.3.8", + "pify": "3.0.0", + "slash": "1.0.0" + } + }, + "globjoin": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", + "integrity": "sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=", + "dev": true + }, + "globule": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.0.tgz", + "integrity": "sha1-HcScaCLdnoovoAuiopUAboZkvQk=", + "dev": true, + "optional": true, + "requires": { + "glob": "7.1.2", + "lodash": "4.17.10", + "minimatch": "3.0.4" + } + }, + "gonzales-pe": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.2.3.tgz", + "integrity": "sha512-Kjhohco0esHQnOiqqdJeNz/5fyPkOMD/d6XVjwTAoPGUFh0mCollPUTUTa2OZy4dYNAqlPIQdTiNzJTWdd9Htw==", + "dev": true, + "requires": { + "minimist": "1.1.3" + }, + "dependencies": { + "minimist": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.1.3.tgz", + "integrity": "sha1-O+39kaktOQFvz6ocaB6Pqhoe/ag=", + "dev": true + } + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "graphlib": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.5.tgz", + "integrity": "sha512-XvtbqCcw+EM5SqQrIetIKKD+uZVNQtDPD1goIg7K73RuRZtVI5rYMdcCVSHm/AS1sCBZ7vt0p5WgXouucHQaOA==", + "dev": true, + "requires": { + "lodash": "4.17.10" + } + }, + "graphlibrary": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/graphlibrary/-/graphlibrary-2.2.0.tgz", + "integrity": "sha512-XTcvT55L8u4MBZrM37zXoUxsgxs/7sow7YSygd9CIwfWTVO8RVu7AYXhhCiTuFEf+APKgx6Jk4SuQbYR0vYKmQ==", + "dev": true, + "requires": { + "lodash": "4.17.10" + } + }, + "hads": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/hads/-/hads-1.6.1.tgz", + "integrity": "sha512-lZAO/rG2e14Ni+5VZkbP5EDDqIP5mQwCfu4IMj0QiEgqD9YimhITOymfcyqkJ1tgoMvrd6cTIFirYqGA29YfTg==", + "dev": true, + "requires": { + "ace-builds": "1.3.3", + "bluebird": "3.5.1", + "body-parser": "1.18.2", + "dropzone": "5.4.0", + "elasticlunr": "0.9.5", + "express": "4.16.3", + "font-awesome": "4.7.0", + "highlight.js": "9.12.0", + "lodash": "4.17.10", + "marked": "0.3.19", + "mermaid": "7.1.2", + "mkdirp": "0.5.1", + "moment": "2.22.1", + "multer": "1.3.0", + "octicons": "4.4.0", + "open": "0.0.5", + "optimist": "0.6.1", + "pug": "2.0.3", + "recursive-readdir": "2.2.2", + "remove-markdown": "0.2.2", + "shortid": "2.2.8", + "string-humanize": "1.0.0" + } + }, + "hammerjs": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", + "integrity": "sha1-BO93hiz/K7edMPdpIJWTAiK/YPE=" + }, + "handle-thing": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", + "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=", + "dev": true + }, + "handlebars": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", + "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", + "dev": true, + "requires": { + "async": "1.5.2", + "optimist": "0.6.1", + "source-map": "0.4.4", + "uglify-js": "2.8.29" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": "1.0.1" + } + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "optional": true, + "requires": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "optional": true + } + } + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "dev": true, + "requires": { + "ajv": "5.5.2", + "har-schema": "2.0.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + } + } + }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "dev": true, + "requires": { + "function-bind": "1.1.1" + } + }, + "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, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "dev": true, + "requires": { + "isarray": "2.0.1" + }, + "dependencies": { + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + } + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, + "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 + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "1.0.0", + "isobject": "3.0.1" + } + }, + "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, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "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, + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.2" + } + }, + "hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "minimalistic-assert": "1.0.1" + } + }, + "hawk": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", + "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", + "dev": true, + "requires": { + "boom": "4.3.1", + "cryptiles": "3.1.2", + "hoek": "4.2.1", + "sntp": "2.1.0" + } + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "highlight.js": { + "version": "9.12.0", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.12.0.tgz", + "integrity": "sha1-5tnb5Xy+/mB1HwKvM2GVhwyQwB4=", + "dev": true + }, + "hipchat-notifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hipchat-notifier/-/hipchat-notifier-1.1.0.tgz", + "integrity": "sha1-ttJJdVQ3wZEII2d5nTupoPI7Ix4=", + "dev": true, + "optional": true, + "requires": { + "lodash": "4.17.10", + "request": "2.86.0" + } + }, + "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, + "requires": { + "hash.js": "1.1.3", + "minimalistic-assert": "1.0.1", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "hoek": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", + "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==", + "dev": true + }, + "hosted-git-info": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", + "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", + "dev": true + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "obuf": "1.1.2", + "readable-stream": "2.3.6", + "wbuf": "1.7.3" + } + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "dev": true + }, + "html-minifier": { + "version": "3.5.15", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.15.tgz", + "integrity": "sha512-OZa4rfb6tZOZ3Z8Xf0jKxXkiDcFWldQePGYFDcgKqES2sXeWaEv9y6QQvWUtX3ySI3feApQi5uCsHLINQ6NoAw==", + "dev": true, + "requires": { + "camel-case": "3.0.0", + "clean-css": "4.1.11", + "commander": "2.15.1", + "he": "1.1.1", + "param-case": "2.1.1", + "relateurl": "0.2.7", + "uglify-js": "3.3.25" + } + }, + "html-tags": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", + "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=", + "dev": true + }, + "html-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", + "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", + "dev": true, + "requires": { + "html-minifier": "3.5.15", + "loader-utils": "0.2.17", + "lodash": "4.17.10", + "pretty-error": "2.1.1", + "tapable": "1.0.0", + "toposort": "1.0.7", + "util.promisify": "1.0.0" + }, + "dependencies": { + "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, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1", + "object-assign": "4.1.1" + } + } + } + }, + "htmlhint": { + "version": "0.9.13", + "resolved": "https://registry.npmjs.org/htmlhint/-/htmlhint-0.9.13.tgz", + "integrity": "sha1-CBY8seaqUFBI67C0EGOnygfcbIg=", + "dev": true, + "requires": { + "async": "1.4.2", + "colors": "1.0.3", + "commander": "2.6.0", + "csslint": "0.10.0", + "glob": "5.0.15", + "jshint": "2.8.0", + "parse-glob": "3.0.4", + "strip-json-comments": "1.0.4", + "xml": "1.0.0" + }, + "dependencies": { + "async": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.4.2.tgz", + "integrity": "sha1-bJ7csRztTw3S8tQNsNSaEJwIiqs=", + "dev": true + }, + "commander": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.6.0.tgz", + "integrity": "sha1-nfflL7Kgyw+4kFjugMMQQiXzfh0=", + "dev": true + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + } + } + }, + "htmlparser2": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", + "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=", + "dev": true, + "requires": { + "domelementtype": "1.3.0", + "domhandler": "2.1.0", + "domutils": "1.1.6", + "readable-stream": "1.0.34" + }, + "dependencies": { + "domutils": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz", + "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=", + "dev": true, + "requires": { + "domelementtype": "1.3.0" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": "1.4.0" + } + }, + "http-parser-js": { + "version": "0.4.12", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.12.tgz", + "integrity": "sha1-uc+/Sizybw/DSxDKFImid3HjR08=", + "dev": true + }, + "http-proxy": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", + "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", + "dev": true, + "requires": { + "eventemitter3": "3.1.0", + "follow-redirects": "1.4.1", + "requires-port": "1.0.0" + } + }, + "http-proxy-agent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "dev": true, + "requires": { + "agent-base": "4.2.0", + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "http-proxy-middleware": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz", + "integrity": "sha512-Fs25KVMPAIIcgjMZkVHJoKg9VcXcC1C8yb9JUgeDvVXY0S/zgVIhMb+qVswDIgtJe2DfckMSY2d6TuTEutlk6Q==", + "dev": true, + "requires": { + "http-proxy": "1.17.0", + "is-glob": "4.0.0", + "lodash": "4.17.10", + "micromatch": "3.1.10" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.14.1" + } + }, + "httpntlm": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/httpntlm/-/httpntlm-1.6.1.tgz", + "integrity": "sha1-rQFScUOi6Hc8+uapb1hla7UqNLI=", + "dev": true, + "requires": { + "httpreq": "0.4.24", + "underscore": "1.7.0" + } + }, + "httpreq": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/httpreq/-/httpreq-0.4.24.tgz", + "integrity": "sha1-QzX/2CzZaWaKOUZckprGHWOTYn8=", + "dev": true + }, + "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 + }, + "https-proxy-agent": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", + "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", + "dev": true, + "requires": { + "agent-base": "4.2.0", + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "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==", + "dev": true + }, + "ieee754": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.11.tgz", + "integrity": "sha512-VhDzCKN7K8ufStx/CLj5/PDTMgph+qwN5Pkd5i0sGnVwk56zJ0lkT8Qzi1xqWLS0Wp29DgDtNeS7v8/wMoZeHg==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.8.tgz", + "integrity": "sha512-pUh+xUQQhQzevjRHHFqqcTy0/dP/kS9I8HSrUydhihjuD09W6ldVWFtIrwhXdUJHis3i2rZNqEHpZH/cbinFbg==", + "dev": true + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true, + "optional": true + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "dev": true + }, + "import-lazy": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-3.1.0.tgz", + "integrity": "sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ==", + "dev": true + }, + "import-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", + "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "dev": true, + "requires": { + "pkg-dir": "2.0.0", + "resolve-cwd": "2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "in-publish": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", + "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=", + "dev": true, + "optional": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "inflection": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz", + "integrity": "sha1-ogCTVlbW9fa8TcdQLhrstwMihBY=", + "dev": true, + "optional": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "internal-ip": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz", + "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=", + "dev": true, + "requires": { + "meow": "3.7.0" + } + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "1.3.1" + } + }, + "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": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ipaddr.js": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", + "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-alphabetical": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.2.tgz", + "integrity": "sha512-V0xN4BYezDHcBSKb1QHUFMlR4as/XEuCZBzMJUU4n7+Cbt33SmUnSol+pnXFvLxSHNq2CemUXNdaXV6Flg7+xg==", + "dev": true + }, + "is-alphanumeric": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz", + "integrity": "sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ=", + "dev": true + }, + "is-alphanumerical": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.2.tgz", + "integrity": "sha512-pyfU/0kHdISIgslFfZN9nfY1Gk3MquQgUm1mJTjdkEPpkAKNWuBTSqFwewOpR7N351VkErCiyV71zX7mlQQqsg==", + "dev": true, + "requires": { + "is-alphabetical": "1.0.2", + "is-decimal": "1.0.2" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "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, + "requires": { + "binary-extensions": "1.11.0" + } + }, + "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 + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-callable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", + "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", + "dev": true + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "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 + }, + "is-decimal": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.2.tgz", + "integrity": "sha512-TRzl7mOCchnhchN+f3ICUCzYvL9ul7R+TYOsZ8xia++knyZAJfv/uA1FvQXsAnYIl1T3B2X5E/J7Wb1QXiIBXg==", + "dev": true + }, + "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, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + }, + "dependencies": { + "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 + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-expression": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-3.0.0.tgz", + "integrity": "sha1-Oayqa+f9HzRx3ELHQW5hwkMXrJ8=", + "dev": true, + "requires": { + "acorn": "4.0.13", + "object-assign": "4.1.1" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + } + } + }, + "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 + }, + "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 + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "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, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "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, + "requires": { + "is-extglob": "2.1.1" + } + }, + "is-hexadecimal": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.2.tgz", + "integrity": "sha512-but/G3sapV3MNyqiDBLrOi4x8uCIw0RY3o/Vb5GT0sMFHrVV7731wFSVy41T5FO1og7G0gXLJh0MkgPRouko/A==", + "dev": true + }, + "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, + "optional": true + }, + "is-my-json-valid": { + "version": "2.17.2", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz", + "integrity": "sha512-IBhBslgngMQN8DDSppmgDv7RNrlFotuuDsKcrCP3+HbFaVivIBU7u9oiiErw8sH4ynx3+gOGQ3q2otkgiSi6kg==", + "dev": true, + "optional": true, + "requires": { + "generate-function": "2.0.0", + "generate-object-property": "1.2.0", + "is-my-ip-valid": "1.0.0", + "jsonpointer": "4.0.1", + "xtend": "4.0.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-odd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", + "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", + "dev": true, + "requires": { + "is-number": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, + "requires": { + "is-path-inside": "1.0.1" + } + }, + "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, + "requires": { + "path-is-inside": "1.0.2" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "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, + "requires": { + "isobject": "3.0.1" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "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 + }, + "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, + "optional": true + }, + "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, + "requires": { + "has": "1.0.1" + } + }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-supported-regexp-flag": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-supported-regexp-flag/-/is-supported-regexp-flag-1.0.1.tgz", + "integrity": "sha512-3vcJecUUrpgCqc/ca0aWeNu64UGgxcvO60K/Fkr1N6RSvfGCTU60UKN68JDmKokgba0rFFJs12EnzOQa14ubKQ==", + "dev": true + }, + "is-symbol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-whitespace-character": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.2.tgz", + "integrity": "sha512-SzM+T5GKUCtLhlHFKt2SDAX2RFzfS6joT91F2/WSi9LxgFdsnhfPK/UIA+JhRR2xuyLdrCys2PiFDrtn1fU5hQ==", + "dev": true + }, + "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 + }, + "is-word-character": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.2.tgz", + "integrity": "sha512-T3FlsX8rCHAH8e7RE7PfOPZVFQlcV3XRF9eOOBQ1uf70OxO7CjjSOjeImMPCADBdYWcStAbVbYvJ1m2D3tb+EA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isbinaryfile": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz", + "integrity": "sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", + "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", + "dev": true, + "requires": { + "abbrev": "1.0.9", + "async": "1.5.2", + "escodegen": "1.8.1", + "esprima": "2.7.3", + "glob": "5.0.15", + "handlebars": "4.0.11", + "js-yaml": "3.11.0", + "mkdirp": "0.5.1", + "nopt": "3.0.6", + "once": "1.4.0", + "resolve": "1.1.7", + "supports-color": "3.2.3", + "which": "1.3.0", + "wordwrap": "1.0.0" + }, + "dependencies": { + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "istanbul-api": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.1.tgz", + "integrity": "sha512-duj6AlLcsWNwUpfyfHt0nWIeRiZpuShnP40YTxOGQgtaN8fd6JYSxsvxUphTDy8V5MfDXo4s/xVCIIvVCO808g==", + "dev": true, + "requires": { + "async": "2.6.0", + "compare-versions": "3.2.1", + "fileset": "2.0.3", + "istanbul-lib-coverage": "1.2.0", + "istanbul-lib-hook": "1.2.0", + "istanbul-lib-instrument": "1.10.1", + "istanbul-lib-report": "1.1.4", + "istanbul-lib-source-maps": "1.2.4", + "istanbul-reports": "1.3.0", + "js-yaml": "3.11.0", + "mkdirp": "0.5.1", + "once": "1.4.0" + }, + "dependencies": { + "async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", + "dev": true, + "requires": { + "lodash": "4.17.10" + } + } + } + }, + "istanbul-instrumenter-loader": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.1.tgz", + "integrity": "sha512-a5SPObZgS0jB/ixaKSMdn6n/gXSrK2S6q/UfRJBT3e6gQmVjwZROTODQsYW5ZNwOu78hG62Y3fWlebaVOL0C+w==", + "dev": true, + "requires": { + "convert-source-map": "1.5.1", + "istanbul-lib-instrument": "1.10.1", + "loader-utils": "1.1.0", + "schema-utils": "0.3.0" + }, + "dependencies": { + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "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, + "requires": { + "ajv": "5.5.2" + } + } + } + }, + "istanbul-lib-coverage": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz", + "integrity": "sha512-GvgM/uXRwm+gLlvkWHTjDAvwynZkL9ns15calTrmhGgowlwJBbWMYzWbKqE2DT6JDP1AFXKa+Zi0EkqNCUqY0A==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.0.tgz", + "integrity": "sha512-p3En6/oGkFQV55Up8ZPC2oLxvgSxD8CzA0yBrhRZSh3pfv3OFj9aSGVC0yoerAi/O4u7jUVnOGVX1eVFM+0tmQ==", + "dev": true, + "requires": { + "append-transform": "0.4.0" + } + }, + "istanbul-lib-instrument": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz", + "integrity": "sha512-1dYuzkOCbuR5GRJqySuZdsmsNKPL3PTuyPevQfoCXJePT9C8y1ga75neU+Tuy9+yS3G/dgx8wgOmp2KLpgdoeQ==", + "dev": true, + "requires": { + "babel-generator": "6.26.1", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "istanbul-lib-coverage": "1.2.0", + "semver": "5.5.0" + } + }, + "istanbul-lib-report": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.4.tgz", + "integrity": "sha512-Azqvq5tT0U09nrncK3q82e/Zjkxa4tkFZv7E6VcqP0QCPn6oNljDPfrZEC/umNXds2t7b8sRJfs6Kmpzt8m2kA==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "1.2.0", + "mkdirp": "0.5.1", + "path-parse": "1.0.5", + "supports-color": "3.2.3" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.4.tgz", + "integrity": "sha512-UzuK0g1wyQijiaYQxj/CdNycFhAd2TLtO2obKQMTZrZ1jzEMRY3rvpASEKkaxbRR6brvdovfA03znPa/pXcejg==", + "dev": true, + "requires": { + "debug": "3.1.0", + "istanbul-lib-coverage": "1.2.0", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "source-map": "0.5.7" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "istanbul-reports": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.3.0.tgz", + "integrity": "sha512-y2Z2IMqE1gefWUaVjrBm0mSKvUkaBy9Vqz8iwr/r40Y9hBbIteH5wqHG/9DLTfJ9xUnUT2j7A3+VVJ6EaYBllA==", + "dev": true, + "requires": { + "handlebars": "4.0.11" + } + }, + "jasmine": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", + "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=", + "dev": true, + "requires": { + "exit": "0.1.2", + "glob": "7.1.2", + "jasmine-core": "2.8.0" + }, + "dependencies": { + "jasmine-core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", + "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=", + "dev": true + } + } + }, + "jasmine-core": { + "version": "2.99.1", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.99.1.tgz", + "integrity": "sha1-5kAN8ea1bhMLYcS80JPap/boyhU=", + "dev": true + }, + "jasmine-spec-reporter": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz", + "integrity": "sha512-FZBoZu7VE5nR7Nilzy+Np8KuVIOxF4oXDPDknehCYBDE080EnlPu0afdZNmpGDBRCUBv3mj5qgqCRmk6W/K8vg==", + "dev": true, + "requires": { + "colors": "1.1.2" + }, + "dependencies": { + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + } + } + }, + "jasminewd2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", + "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=", + "dev": true + }, + "js-base64": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.5.tgz", + "integrity": "sha512-aUnNwqMOXw3yvErjMPSQu6qIIzUmT1e5KcU1OZxRDU1g/am6mzBvcrmLAYwzmB59BHPrh5/tKaiF4OPhqRWESQ==", + "dev": true + }, + "js-stringify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", + "integrity": "sha1-Fzb939lyTyijaCrcYjCufk6Weds=", + "dev": true + }, + "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 + }, + "js-yaml": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz", + "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==", + "dev": true, + "requires": { + "argparse": "1.0.10", + "esprima": "4.0.0" + }, + "dependencies": { + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "dev": true + } + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "jshint": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.8.0.tgz", + "integrity": "sha1-HQmjvZE8TK36gb8Y1YK9hb/+DUQ=", + "dev": true, + "requires": { + "cli": "0.6.6", + "console-browserify": "1.1.0", + "exit": "0.1.2", + "htmlparser2": "3.8.3", + "lodash": "3.7.0", + "minimatch": "2.0.10", + "shelljs": "0.3.0", + "strip-json-comments": "1.0.4" + }, + "dependencies": { + "domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + "dev": true, + "requires": { + "domelementtype": "1.3.0" + } + }, + "entities": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", + "dev": true + }, + "htmlparser2": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", + "dev": true, + "requires": { + "domelementtype": "1.3.0", + "domhandler": "2.3.0", + "domutils": "1.5.1", + "entities": "1.0.0", + "readable-stream": "1.1.14" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "lodash": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.7.0.tgz", + "integrity": "sha1-Nni9irmVBXwHreg27S7wh9qBHUU=", + "dev": true + }, + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "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 + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "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 + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + } + }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true, + "optional": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "jstransformer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", + "integrity": "sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM=", + "dev": true, + "requires": { + "is-promise": "2.1.0", + "promise": "7.3.1" + } + }, + "jszip": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.1.5.tgz", + "integrity": "sha512-5W8NUaFRFRqTOL7ZDDrx5qWHJyBXy6velVudIzQUSoqAAYqzSh2Z7/m0Rf1QbmQJccegD0r+YZxBjzqoBiEeJQ==", + "dev": true, + "requires": { + "core-js": "2.3.0", + "es6-promise": "3.0.2", + "lie": "3.1.1", + "pako": "1.0.6", + "readable-stream": "2.0.6" + }, + "dependencies": { + "core-js": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.3.0.tgz", + "integrity": "sha1-+rg/uwstjchfpjbEudNMdUIMbWU=", + "dev": true + }, + "es6-promise": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz", + "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "readable-stream": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", + "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "0.10.31", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "karma": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/karma/-/karma-2.0.2.tgz", + "integrity": "sha1-TS25QChQpmVR+nhLAWT7CCTtjEs=", + "dev": true, + "requires": { + "bluebird": "3.5.1", + "body-parser": "1.18.2", + "chokidar": "1.7.0", + "colors": "1.2.5", + "combine-lists": "1.0.1", + "connect": "3.6.6", + "core-js": "2.5.6", + "di": "0.0.1", + "dom-serialize": "2.2.1", + "expand-braces": "0.1.2", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "http-proxy": "1.17.0", + "isbinaryfile": "3.0.2", + "lodash": "4.17.10", + "log4js": "2.6.1", + "mime": "1.6.0", + "minimatch": "3.0.4", + "optimist": "0.6.1", + "qjobs": "1.2.0", + "range-parser": "1.2.0", + "rimraf": "2.6.2", + "safe-buffer": "5.1.2", + "socket.io": "2.0.4", + "source-map": "0.6.1", + "tmp": "0.0.33", + "useragent": "2.2.1" + }, + "dependencies": { + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "requires": { + "micromatch": "2.3.11", + "normalize-path": "2.1.1" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "1.1.0" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true, + "requires": { + "anymatch": "1.3.2", + "async-each": "1.0.1", + "fsevents": "1.2.4", + "glob-parent": "2.0.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "2.0.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0" + } + }, + "colors": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", + "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", + "dev": true + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "2.0.1" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "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 + } + } + }, + "karma-chrome-launcher": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz", + "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==", + "dev": true, + "requires": { + "fs-access": "1.0.1", + "which": "1.3.0" + } + }, + "karma-cli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/karma-cli/-/karma-cli-1.0.1.tgz", + "integrity": "sha1-rmw8WKMTodALRRZMRVubhs4X+WA=", + "dev": true, + "requires": { + "resolve": "1.7.1" + } + }, + "karma-coverage-istanbul-reporter": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-1.4.3.tgz", + "integrity": "sha1-O13/RmT6W41RlrmInj9hwforgNk=", + "dev": true, + "requires": { + "istanbul-api": "1.3.1", + "minimatch": "3.0.4" + } + }, + "karma-jasmine": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.2.tgz", + "integrity": "sha1-OU8rJf+0pkS5rabyLUQ+L9CIhsM=", + "dev": true + }, + "karma-junit-reporter": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/karma-junit-reporter/-/karma-junit-reporter-1.2.0.tgz", + "integrity": "sha1-T5xAzt+xo5X4rvh2q/lhiZF8Y5Y=", + "dev": true, + "requires": { + "path-is-absolute": "1.0.1", + "xmlbuilder": "8.2.2" + } + }, + "karma-source-map-support": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.3.0.tgz", + "integrity": "sha512-HcPqdAusNez/ywa+biN4EphGz62MmQyPggUsDfsHqa7tSe4jdsxgvTKuDfIazjL+IOxpVWyT7Pr4dhAV+sxX5Q==", + "dev": true, + "requires": { + "source-map-support": "0.5.6" + } + }, + "killable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.0.tgz", + "integrity": "sha1-2ouEvUfeU5WHj5XWTQLyRJ/gXms=", + "dev": true + }, + "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 + }, + "known-css-properties": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.6.1.tgz", + "integrity": "sha512-nQRpMcHm1cQ6gmztdvLcIvxocznSMqH/y6XtERrWrHaymOYdDGroRqetJvJycxGEr1aakXiigDgn7JnzuXlk6A==", + "dev": true + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "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" + } + }, + "leb": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/leb/-/leb-0.3.0.tgz", + "integrity": "sha1-Mr7p+tFoMo1q6oUi2DP0GA7tHaM=", + "dev": true + }, + "less": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/less/-/less-3.0.4.tgz", + "integrity": "sha512-q3SyEnPKbk9zh4l36PGeW2fgynKu+FpbhiUNx/yaiBUQ3V0CbACCgb9FzYWcRgI2DJlP6eI4jc8XPrCTi55YcQ==", + "dev": true, + "requires": { + "errno": "0.1.7", + "graceful-fs": "4.1.11", + "image-size": "0.5.5", + "mime": "1.6.0", + "mkdirp": "0.5.1", + "promise": "7.3.1", + "request": "2.86.0", + "source-map": "0.6.1" + }, + "dependencies": { + "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 + } + } + }, + "less-loader": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-4.1.0.tgz", + "integrity": "sha512-KNTsgCE9tMOM70+ddxp9yyt9iHqgmSs0yTZc5XH5Wo+g80RWRIYNqE58QJKm/yMud5wZEvz50ugRDuzVIkyahg==", + "dev": true, + "requires": { + "clone": "2.1.1", + "loader-utils": "1.1.0", + "pify": "3.0.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2", + "type-check": "0.3.2" + } + }, + "libbase64": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/libbase64/-/libbase64-0.1.0.tgz", + "integrity": "sha1-YjUag5VjrF/1vSbxL2Dpgwu3UeY=", + "dev": true + }, + "libmime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/libmime/-/libmime-3.0.0.tgz", + "integrity": "sha1-UaGp50SOy9Ms2lRCFnW7IbwJPaY=", + "dev": true, + "requires": { + "iconv-lite": "0.4.15", + "libbase64": "0.1.0", + "libqp": "1.1.0" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz", + "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es=", + "dev": true + } + } + }, + "libqp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/libqp/-/libqp-1.1.0.tgz", + "integrity": "sha1-9ebgatdLeU+1tbZpiL9yjvHe2+g=", + "dev": true + }, + "license-webpack-plugin": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-1.3.1.tgz", + "integrity": "sha512-NqAFodJdpBUuf1iD+Ij8hQvF0rCFKlO2KaieoQzAPhFgzLCtJnC7Z7x5gQbGNjoe++wOKAtAmwVEIBLqq2Yp1A==", + "dev": true, + "requires": { + "ejs": "2.6.1" + } + }, + "lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", + "dev": true, + "requires": { + "immediate": "3.0.6" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "loader-runner": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", + "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", + "dev": true + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + } + }, + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" + }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", + "dev": true, + "optional": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.mergewith": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz", + "integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==", + "dev": true, + "optional": true + }, + "lodash.tail": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz", + "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=", + "dev": true + }, + "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, + "requires": { + "chalk": "2.2.2" + } + }, + "log4js": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-2.6.1.tgz", + "integrity": "sha512-BOoWTr8gxJ9XRkQr/f68KUciHR6qnLESgbXuoD7VAhtu/aMq5kD1WD7IFMMaKjCDKLUHsjwT3V2cw34ENiJKig==", + "dev": true, + "requires": { + "amqplib": "0.5.2", + "axios": "0.15.3", + "circular-json": "0.5.4", + "date-format": "1.2.0", + "debug": "3.1.0", + "hipchat-notifier": "1.1.0", + "loggly": "1.1.1", + "mailgun-js": "0.18.0", + "nodemailer": "2.7.2", + "redis": "2.8.0", + "semver": "5.5.0", + "slack-node": "0.2.0", + "streamroller": "0.7.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "loggly": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/loggly/-/loggly-1.1.1.tgz", + "integrity": "sha1-Cg/B0/o6XsRP3HuJe+uipGlc6+4=", + "dev": true, + "optional": true, + "requires": { + "json-stringify-safe": "5.0.1", + "request": "2.75.0", + "timespan": "2.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true, + "optional": true + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true, + "optional": true + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "dev": true, + "optional": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "optional": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true, + "optional": true, + "requires": { + "boom": "2.10.1" + } + }, + "form-data": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.0.0.tgz", + "integrity": "sha1-bwrrrcxdoWwT4ezBETfYX5uIOyU=", + "dev": true, + "optional": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.6", + "mime-types": "2.1.18" + } + }, + "har-validator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "dev": true, + "optional": true, + "requires": { + "chalk": "1.1.3", + "commander": "2.15.1", + "is-my-json-valid": "2.17.2", + "pinkie-promise": "2.0.1" + } + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dev": true, + "optional": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.1", + "sshpk": "1.14.1" + } + }, + "node-uuid": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", + "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=", + "dev": true, + "optional": true + }, + "qs": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.3.tgz", + "integrity": "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=", + "dev": true, + "optional": true + }, + "request": { + "version": "2.75.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.75.0.tgz", + "integrity": "sha1-0rgmiihtoT6qXQGt9dGMyQ9lfZM=", + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.7.0", + "bl": "1.1.2", + "caseless": "0.11.0", + "combined-stream": "1.0.6", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.0.0", + "har-validator": "2.0.6", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.18", + "node-uuid": "1.4.8", + "oauth-sign": "0.8.2", + "qs": "6.2.3", + "stringstream": "0.0.6", + "tough-cookie": "2.3.4", + "tunnel-agent": "0.4.3" + } + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true, + "optional": true, + "requires": { + "hoek": "2.16.3" + } + }, + "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, + "optional": true + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", + "dev": true, + "optional": true + } + } + }, + "loglevel": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz", + "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=", + "dev": true + }, + "loglevelnext": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/loglevelnext/-/loglevelnext-1.0.5.tgz", + "integrity": "sha512-V/73qkPuJmx4BcBF19xPBr+0ZRVBhc4POxvZTZdMeXpJ4NItXSJ/MSwuFT0kQJlCbXvdlZoQQ/418bS1y9Jh6A==", + "dev": true, + "requires": { + "es6-symbol": "3.1.1", + "object.assign": "4.1.0" + } + }, + "long": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", + "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=", + "dev": true + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "longest-streak": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.2.tgz", + "integrity": "sha512-TmYTeEYxiAmSVdpbnQDXGtvYOIRsCMg89CVZzwzc2o7GFL1CjoiRPjH5ec0NFAVlAx3fVof9dX/t6KKRAo2OWA==", + "dev": true + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "dev": true, + "requires": { + "js-tokens": "3.0.2" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "0.4.1", + "signal-exit": "3.0.2" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, + "lru-cache": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "mailcomposer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/mailcomposer/-/mailcomposer-4.0.1.tgz", + "integrity": "sha1-DhxEsqB890DuF9wUm6AJ8Zyt/rQ=", + "dev": true, + "optional": true, + "requires": { + "buildmail": "4.0.1", + "libmime": "3.0.0" + } + }, + "mailgun-js": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/mailgun-js/-/mailgun-js-0.18.0.tgz", + "integrity": "sha512-o0P6jjZlx5CQj12tvVgDTbgjTqVN0+5h6/6P1+3c6xmozVKBwniQ6Qt3MkCSF0+ueVTbobAfWyGpWRZMJu8t1g==", + "dev": true, + "optional": true, + "requires": { + "async": "2.6.0", + "debug": "3.1.0", + "form-data": "2.3.2", + "inflection": "1.12.0", + "is-stream": "1.1.0", + "path-proxy": "1.0.0", + "promisify-call": "2.0.4", + "proxy-agent": "3.0.0", + "tsscmp": "1.0.5" + }, + "dependencies": { + "async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", + "dev": true, + "optional": true, + "requires": { + "lodash": "4.17.10" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "3.0.0" + } + }, + "make-error": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.4.tgz", + "integrity": "sha512-0Dab5btKVPhibSalc9QGXb559ED7G7iLjFXBaj9Wq8O3vorueR5K5jaE3hkG6ZQINyhA/JgG6Qk4qdFQjsYV6g==", + "dev": true + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "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, + "requires": { + "object-visit": "1.0.1" + } + }, + "markdown-escapes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.2.tgz", + "integrity": "sha512-lbRZ2mE3Q9RtLjxZBZ9+IMl68DKIXaVAhwvwn9pmjnPLS0h/6kyBMgNhqi1xFJ/2yv6cSyv0jbiZavZv93JkkA==", + "dev": true + }, + "markdown-table": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.2.tgz", + "integrity": "sha512-NcWuJFHDA8V3wkDgR/j4+gZx+YQwstPgfQDV8ndUeWWzta3dnDTBxpVzqS9lkmJAuV5YX35lmyojl6HO5JXAgw==", + "dev": true + }, + "marked": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz", + "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==", + "dev": true + }, + "math-random": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", + "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", + "dev": true + }, + "mathml-tag-names": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.0.tgz", + "integrity": "sha512-3Zs9P/0zzwTob2pdgT0CHZuMbnSUSp8MB1bddfm+HDmnFWHGT4jvEZRf+2RuPoa+cjdn/z25SEt5gFTqdhvJAg==", + "dev": true + }, + "md5.js": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", + "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "dev": true, + "requires": { + "hash-base": "3.0.4", + "inherits": "2.0.3" + } + }, + "mdast-util-compact": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-1.0.1.tgz", + "integrity": "sha1-zbX4TitqLTEU3zO9BdnLMuPECDo=", + "dev": true, + "requires": { + "unist-util-modify-children": "1.1.2", + "unist-util-visit": "1.3.1" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "1.2.0" + } + }, + "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, + "requires": { + "errno": "0.1.7", + "readable-stream": "2.3.6" + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "2.1.0", + "decamelize": "1.2.0", + "loud-rejection": "1.6.0", + "map-obj": "1.0.1", + "minimist": "1.2.0", + "normalize-package-data": "2.4.0", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "redent": "1.0.0", + "trim-newlines": "1.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "merge2": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.2.tgz", + "integrity": "sha512-bgM8twH86rWni21thii6WCMQMRMmwqqdW3sGWi9IipnVAszdLXRjwDwAnyrVXo6DuP3AjRMMttZKUB48QWIFGg==", + "dev": true + }, + "mermaid": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-7.1.2.tgz", + "integrity": "sha512-bDLu3fQuf3/R0fNkNzB0GTaF7+6SxnZpfTs9DVQF1ougsuP23MBzvEIGfL0ML8zeyg7+J2D+0AaoLVhskW5ulw==", + "dev": true, + "requires": { + "d3": "3.5.17", + "dagre-d3-renderer": "0.4.26", + "dagre-layout": "0.8.8", + "he": "1.1.1", + "lodash": "4.17.10", + "moment": "2.22.1" + } + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "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.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } + }, + "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, + "requires": { + "bn.js": "4.11.8", + "brorand": "1.1.0" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "dev": true + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "dev": true, + "requires": { + "mime-db": "1.33.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "mini-css-extract-plugin": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.0.tgz", + "integrity": "sha512-2Zik6PhUZ/MbiboG6SDS9UTPL4XXy4qnyGjSdCIWRrr8xb6PwLtHE+AYOjkXJWdF0OG8vo/yrJ8CgS5WbMpzIg==", + "dev": true, + "requires": { + "loader-utils": "1.1.0", + "webpack-sources": "1.1.0" + } + }, + "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 + }, + "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 + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "dev": true, + "requires": { + "arrify": "1.0.1", + "is-plain-obj": "1.1.0" + } + }, + "mississippi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", + "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", + "dev": true, + "requires": { + "concat-stream": "1.6.2", + "duplexify": "3.6.0", + "end-of-stream": "1.4.1", + "flush-write-stream": "1.0.3", + "from2": "2.3.0", + "parallel-transform": "1.1.0", + "pump": "2.0.1", + "pumpify": "1.5.1", + "stream-each": "1.2.2", + "through2": "2.0.3" + } + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "1.0.2", + "is-extendable": "1.0.1" + }, + "dependencies": { + "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, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "mixin-object": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", + "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", + "dev": true, + "requires": { + "for-in": "0.1.8", + "is-extendable": "0.1.1" + }, + "dependencies": { + "for-in": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", + "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=", + "dev": true + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "moment": { + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.1.tgz", + "integrity": "sha512-shJkRTSebXvsVqk56I+lkb2latjBs8I+pc2TzWc545y2iFnSjm7Wg0QMh+ZWcdSLQyGEau5jI8ocnmkyTgr9YQ==", + "dev": true + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "1.2.0", + "copy-concurrently": "1.0.5", + "fs-write-stream-atomic": "1.0.10", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "run-queue": "1.0.3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "multer": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.3.0.tgz", + "integrity": "sha1-CSsmcPaEb6SRSWXvyM+Uwg/sbNI=", + "dev": true, + "requires": { + "append-field": "0.1.0", + "busboy": "0.2.14", + "concat-stream": "1.6.2", + "mkdirp": "0.5.1", + "object-assign": "3.0.0", + "on-finished": "2.3.0", + "type-is": "1.6.16", + "xtend": "4.0.1" + }, + "dependencies": { + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "dev": true + } + } + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "1.3.1", + "thunky": "1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "nan": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", + "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", + "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", + "dev": true, + "requires": { + "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-odd": "2.0.0", + "is-windows": "1.0.2", + "kind-of": "6.0.2", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "dev": true + }, + "neo-async": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.1.tgz", + "integrity": "sha512-3KL3fvuRkZ7s4IFOMfztb7zJp3QaVWnBeGoJlgB38XnCRPj/0tLzzLG5IB8NYOHbJ8g8UGrgZv44GLDk6CxTxA==", + "dev": true + }, + "netmask": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-1.0.6.tgz", + "integrity": "sha1-ICl+idhvb2QA8lDZ9Pa0wZRfzTU=", + "dev": true, + "optional": true + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "requires": { + "lower-case": "1.1.4" + } + }, + "node-forge": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz", + "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==", + "dev": true + }, + "node-gyp": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.6.2.tgz", + "integrity": "sha1-m/vlRWIoYoSDjnUOrAUpWFP6HGA=", + "dev": true, + "optional": true, + "requires": { + "fstream": "1.0.11", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "nopt": "3.0.6", + "npmlog": "4.1.2", + "osenv": "0.1.5", + "request": "2.86.0", + "rimraf": "2.6.2", + "semver": "5.3.0", + "tar": "2.2.1", + "which": "1.3.0" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true, + "optional": true + } + } + }, + "node-libs-browser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", + "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", + "dev": true, + "requires": { + "assert": "1.4.1", + "browserify-zlib": "0.2.0", + "buffer": "4.9.1", + "console-browserify": "1.1.0", + "constants-browserify": "1.0.0", + "crypto-browserify": "3.12.0", + "domain-browser": "1.2.0", + "events": "1.1.1", + "https-browserify": "1.0.0", + "os-browserify": "0.3.0", + "path-browserify": "0.0.0", + "process": "0.11.10", + "punycode": "1.4.1", + "querystring-es3": "0.2.1", + "readable-stream": "2.3.6", + "stream-browserify": "2.0.1", + "stream-http": "2.8.2", + "string_decoder": "1.1.1", + "timers-browserify": "2.0.10", + "tty-browserify": "0.0.0", + "url": "0.11.0", + "util": "0.10.3", + "vm-browserify": "0.0.4" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "node-sass": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.9.0.tgz", + "integrity": "sha512-QFHfrZl6lqRU3csypwviz2XLgGNOoWQbo2GOvtsfQqOfL4cy1BtWnhx/XUeAO9LT3ahBzSRXcEO6DdvAH9DzSg==", + "dev": true, + "optional": true, + "requires": { + "async-foreach": "0.1.3", + "chalk": "1.1.3", + "cross-spawn": "3.0.1", + "gaze": "1.1.2", + "get-stdin": "4.0.1", + "glob": "7.1.2", + "in-publish": "2.0.0", + "lodash.assign": "4.2.0", + "lodash.clonedeep": "4.5.0", + "lodash.mergewith": "4.6.1", + "meow": "3.7.0", + "mkdirp": "0.5.1", + "nan": "2.10.0", + "node-gyp": "3.6.2", + "npmlog": "4.1.2", + "request": "2.79.0", + "sass-graph": "2.2.4", + "stdout-stream": "1.4.0", + "true-case-path": "1.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true, + "optional": true + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "dev": true, + "optional": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true, + "optional": true, + "requires": { + "boom": "2.10.1" + } + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "dev": true, + "optional": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.6", + "mime-types": "2.1.18" + } + }, + "har-validator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "dev": true, + "optional": true, + "requires": { + "chalk": "1.1.3", + "commander": "2.15.1", + "is-my-json-valid": "2.17.2", + "pinkie-promise": "2.0.1" + } + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dev": true, + "optional": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.1", + "sshpk": "1.14.1" + } + }, + "qs": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", + "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", + "dev": true, + "optional": true + }, + "request": { + "version": "2.79.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", + "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.7.0", + "caseless": "0.11.0", + "combined-stream": "1.0.6", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "2.0.6", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.18", + "oauth-sign": "0.8.2", + "qs": "6.3.2", + "stringstream": "0.0.6", + "tough-cookie": "2.3.4", + "tunnel-agent": "0.4.3", + "uuid": "3.2.1" + } + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true, + "optional": true, + "requires": { + "hoek": "2.16.3" + } + }, + "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 + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", + "dev": true, + "optional": true + } + } + }, + "nodemailer": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-2.7.2.tgz", + "integrity": "sha1-8kLmSa7q45tsftdA73sGHEBNMPk=", + "dev": true, + "optional": true, + "requires": { + "libmime": "3.0.0", + "mailcomposer": "4.0.1", + "nodemailer-direct-transport": "3.3.2", + "nodemailer-shared": "1.1.0", + "nodemailer-smtp-pool": "2.8.2", + "nodemailer-smtp-transport": "2.7.2", + "socks": "1.1.9" + }, + "dependencies": { + "socks": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/socks/-/socks-1.1.9.tgz", + "integrity": "sha1-Yo1+TQSRJDVEWsC25Fk3bLPm1pE=", + "dev": true, + "optional": true, + "requires": { + "ip": "1.1.5", + "smart-buffer": "1.1.15" + } + } + } + }, + "nodemailer-direct-transport": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/nodemailer-direct-transport/-/nodemailer-direct-transport-3.3.2.tgz", + "integrity": "sha1-6W+vuQNYVglH5WkBfZfmBzilCoY=", + "dev": true, + "optional": true, + "requires": { + "nodemailer-shared": "1.1.0", + "smtp-connection": "2.12.0" + } + }, + "nodemailer-fetch": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/nodemailer-fetch/-/nodemailer-fetch-1.6.0.tgz", + "integrity": "sha1-ecSQihwPXzdbc/6IjamCj23JY6Q=", + "dev": true + }, + "nodemailer-shared": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/nodemailer-shared/-/nodemailer-shared-1.1.0.tgz", + "integrity": "sha1-z1mU4v0mjQD1zw+nZ6CBae2wfsA=", + "dev": true, + "requires": { + "nodemailer-fetch": "1.6.0" + } + }, + "nodemailer-smtp-pool": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/nodemailer-smtp-pool/-/nodemailer-smtp-pool-2.8.2.tgz", + "integrity": "sha1-LrlNbPhXgLG0clzoU7nL1ejajHI=", + "dev": true, + "optional": true, + "requires": { + "nodemailer-shared": "1.1.0", + "nodemailer-wellknown": "0.1.10", + "smtp-connection": "2.12.0" + } + }, + "nodemailer-smtp-transport": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/nodemailer-smtp-transport/-/nodemailer-smtp-transport-2.7.2.tgz", + "integrity": "sha1-A9ccdjFPFKx9vHvwM6am0W1n+3c=", + "dev": true, + "optional": true, + "requires": { + "nodemailer-shared": "1.1.0", + "nodemailer-wellknown": "0.1.10", + "smtp-connection": "2.12.0" + } + }, + "nodemailer-wellknown": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/nodemailer-wellknown/-/nodemailer-wellknown-0.1.10.tgz", + "integrity": "sha1-WG24EB2zDLRDjrVGc3pBqtDPE9U=", + "dev": true + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1.0.9" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "2.6.0", + "is-builtin-module": "1.0.0", + "semver": "5.5.0", + "validate-npm-package-license": "3.0.3" + } + }, + "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, + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize-selector": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/normalize-selector/-/normalize-selector-0.2.0.tgz", + "integrity": "sha1-0LFF62kRicY6eNIB3E/bEpPvDAM=", + "dev": true + }, + "npm-package-arg": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.0.tgz", + "integrity": "sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA==", + "dev": true, + "requires": { + "hosted-git-info": "2.6.0", + "osenv": "0.1.5", + "semver": "5.5.0", + "validate-npm-package-name": "3.0.0" + } + }, + "npm-registry-client": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/npm-registry-client/-/npm-registry-client-8.5.1.tgz", + "integrity": "sha512-7rjGF2eA7hKDidGyEWmHTiKfXkbrcQAsGL/Rh4Rt3x3YNRNHhwaTzVJfW3aNvvlhg4G62VCluif0sLCb/i51Hg==", + "dev": true, + "requires": { + "concat-stream": "1.6.2", + "graceful-fs": "4.1.11", + "normalize-package-data": "2.4.0", + "npm-package-arg": "6.1.0", + "npmlog": "4.1.2", + "once": "1.4.0", + "request": "2.86.0", + "retry": "0.10.1", + "safe-buffer": "5.1.2", + "semver": "5.5.0", + "slide": "1.1.6", + "ssri": "5.3.0" + } + }, + "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, + "requires": { + "path-key": "2.0.1" + } + }, + "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, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "nth-check": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", + "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", + "dev": true, + "requires": { + "boolbase": "1.0.0" + } + }, + "null-check": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", + "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", + "dev": true + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "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 + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "0.1.1", + "define-property": "0.2.5", + "kind-of": "3.2.2" + }, + "dependencies": { + "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, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "object-keys": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", + "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", + "dev": true + }, + "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, + "requires": { + "isobject": "3.0.1" + } + }, + "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, + "requires": { + "define-properties": "1.1.2", + "function-bind": "1.1.1", + "has-symbols": "1.0.0", + "object-keys": "1.0.11" + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "1.1.2", + "es-abstract": "1.11.0" + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + }, + "dependencies": { + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + } + } + }, + "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, + "requires": { + "isobject": "3.0.1" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "octicons": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/octicons/-/octicons-4.4.0.tgz", + "integrity": "sha1-rKO9MvXcHZB6jQ3nRPeODFThlEY=", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "open": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/open/-/open-0.0.5.tgz", + "integrity": "sha1-QsPhjslUZra/DcQvOilFw/DK2Pw=", + "dev": true + }, + "opn": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", + "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", + "dev": true, + "requires": { + "is-wsl": "1.1.0" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "0.0.8", + "wordwrap": "0.0.3" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + } + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "0.1.3", + "fast-levenshtein": "2.0.6", + "levn": "0.3.0", + "prelude-ls": "1.1.2", + "type-check": "0.3.2", + "wordwrap": "1.0.0" + } + }, + "options": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", + "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=", + "dev": true + }, + "original": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.1.tgz", + "integrity": "sha512-IEvtB5vM5ULvwnqMxWBLxkS13JIEXbakizMSo3yoPNPCIWzg8TG3Usn/UhXoZFM/m+FuEA20KdzPSFq/0rS+UA==", + "dev": true, + "requires": { + "url-parse": "1.4.0" + } + }, + "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 + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "optional": true, + "requires": { + "lcid": "1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", + "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", + "dev": true, + "requires": { + "p-try": "1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "1.2.0" + } + }, + "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 + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "pac-proxy-agent": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-2.0.2.tgz", + "integrity": "sha512-cDNAN1Ehjbf5EHkNY5qnRhGPUCp6SnpyVof5fRzN800QV1Y2OkzbH9rmjZkbBRa8igof903yOnjIl6z0SlAhxA==", + "dev": true, + "optional": true, + "requires": { + "agent-base": "4.2.0", + "debug": "3.1.0", + "get-uri": "2.0.2", + "http-proxy-agent": "2.1.0", + "https-proxy-agent": "2.2.1", + "pac-resolver": "3.0.0", + "raw-body": "2.3.2", + "socks-proxy-agent": "3.0.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "pac-resolver": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-3.0.0.tgz", + "integrity": "sha512-tcc38bsjuE3XZ5+4vP96OfhOugrX+JcnpUbhfuc4LuXBLQhoTthOstZeoQJBDnQUDYzYmdImKsbz0xSl1/9qeA==", + "dev": true, + "optional": true, + "requires": { + "co": "4.6.0", + "degenerator": "1.0.4", + "ip": "1.1.5", + "netmask": "1.0.6", + "thunkify": "2.1.2" + } + }, + "pako": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", + "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", + "dev": true + }, + "parallel-transform": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", + "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "dev": true, + "requires": { + "cyclist": "0.2.2", + "inherits": "2.0.3", + "readable-stream": "2.3.6" + } + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "requires": { + "no-case": "2.3.2" + } + }, + "parse-asn1": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", + "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", + "dev": true, + "requires": { + "asn1.js": "4.10.1", + "browserify-aes": "1.2.0", + "create-hash": "1.2.0", + "evp_bytestokey": "1.0.3", + "pbkdf2": "3.0.16" + } + }, + "parse-entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.1.2.tgz", + "integrity": "sha512-5N9lmQ7tmxfXf+hO3X6KRG6w7uYO/HL9fHalSySTdyn63C3WNvTM/1R8tn1u1larNcEbo3Slcy2bsVDQqvEpUg==", + "dev": true, + "requires": { + "character-entities": "1.2.2", + "character-entities-legacy": "1.1.2", + "character-reference-invalid": "1.1.2", + "is-alphanumerical": "1.0.2", + "is-decimal": "1.0.2", + "is-hexadecimal": "1.0.2" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + } + } + }, + "parse-json": { + "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.3.1" + } + }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "dev": true, + "requires": { + "better-assert": "1.0.2" + } + }, + "parserlib": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/parserlib/-/parserlib-0.2.5.tgz", + "integrity": "sha1-hZB92GBaoGq7PdKV1QuyuPpN0Rc=", + "dev": true + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "dev": true, + "requires": { + "better-assert": "1.0.2" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path": { + "version": "0.12.7", + "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", + "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=", + "dev": true, + "requires": { + "process": "0.11.10", + "util": "0.10.3" + } + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "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 + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "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 + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, + "path-proxy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/path-proxy/-/path-proxy-1.0.0.tgz", + "integrity": "sha1-GOijaFn8nS8aU7SN7hOFQ8Ag3l4=", + "dev": true, + "optional": true, + "requires": { + "inflection": "1.3.8" + }, + "dependencies": { + "inflection": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.3.8.tgz", + "integrity": "sha1-y9Fg2p91sUw8xjV41POWeEvzAU4=", + "dev": true, + "optional": true + } + } + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "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, + "requires": { + "pify": "3.0.0" + } + }, + "pbkdf2": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz", + "integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==", + "dev": true, + "requires": { + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "ripemd160": "2.0.2", + "safe-buffer": "5.1.2", + "sha.js": "2.4.11" + } + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "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, + "requires": { + "pinkie": "2.0.4" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "2.1.0" + } + }, + "portfinder": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz", + "integrity": "sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek=", + "dev": true, + "requires": { + "async": "1.5.2", + "debug": "2.6.9", + "mkdirp": "0.5.1" + } + }, + "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 + }, + "postcss": { + "version": "6.0.22", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.22.tgz", + "integrity": "sha512-Toc9lLoUASwGqxBSJGTVcOQiDqjK+Z2XlWBg+IgYwQMY9vA2f7iMpXVc1GpPcfTSyM5lkxNo0oDwDRO+wm7XHA==", + "dev": true, + "requires": { + "chalk": "2.4.1", + "source-map": "0.6.1", + "supports-color": "5.4.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + } + }, + "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 + } + } + }, + "postcss-html": { + "version": "0.23.7", + "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-0.23.7.tgz", + "integrity": "sha1-RxRsFeIbnAB0bEARXc/4JwxDnzI=", + "dev": true, + "requires": { + "htmlparser2": "3.9.2" + }, + "dependencies": { + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "requires": { + "domelementtype": "1.3.0" + } + }, + "htmlparser2": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", + "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", + "dev": true, + "requires": { + "domelementtype": "1.3.0", + "domhandler": "2.4.2", + "domutils": "1.5.1", + "entities": "1.1.1", + "inherits": "2.0.3", + "readable-stream": "2.3.6" + } + } + } + }, + "postcss-import": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-11.1.0.tgz", + "integrity": "sha512-5l327iI75POonjxkXgdRCUS+AlzAdBx4pOvMEhTKTCjb1p8IEeVR9yx3cPbmN7LIWJLbfnIXxAhoB4jpD0c/Cw==", + "dev": true, + "requires": { + "postcss": "6.0.22", + "postcss-value-parser": "3.3.0", + "read-cache": "1.0.0", + "resolve": "1.7.1" + } + }, + "postcss-less": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-1.1.5.tgz", + "integrity": "sha512-QQIiIqgEjNnquc0d4b6HDOSFZxbFQoy4MPpli2lSLpKhMyBkKwwca2HFqu4xzxlKID/F2fxSOowwtKpgczhF7A==", + "dev": true, + "requires": { + "postcss": "5.2.18" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "dependencies": { + "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 + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "js-base64": "2.4.5", + "source-map": "0.5.7", + "supports-color": "3.2.3" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "postcss-load-config": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz", + "integrity": "sha1-U56a/J3chiASHr+djDZz4M5Q0oo=", + "dev": true, + "requires": { + "cosmiconfig": "2.2.2", + "object-assign": "4.1.1", + "postcss-load-options": "1.2.0", + "postcss-load-plugins": "2.3.0" + } + }, + "postcss-load-options": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz", + "integrity": "sha1-sJixVZ3awt8EvAuzdfmaXP4rbYw=", + "dev": true, + "requires": { + "cosmiconfig": "2.2.2", + "object-assign": "4.1.1" + } + }, + "postcss-load-plugins": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz", + "integrity": "sha1-dFdoEWWZrKLwCfrUJrABdQSdjZI=", + "dev": true, + "requires": { + "cosmiconfig": "2.2.2", + "object-assign": "4.1.1" + } + }, + "postcss-loader": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.1.5.tgz", + "integrity": "sha512-pV7kB5neJ0/1tZ8L1uGOBNTVBCSCXQoIsZMsrwvO8V2rKGa2tBl/f80GGVxow2jJnRJ2w1ocx693EKhZAb9Isg==", + "dev": true, + "requires": { + "loader-utils": "1.1.0", + "postcss": "6.0.22", + "postcss-load-config": "1.2.0", + "schema-utils": "0.4.5" + } + }, + "postcss-markdown": { + "version": "0.23.7", + "resolved": "https://registry.npmjs.org/postcss-markdown/-/postcss-markdown-0.23.7.tgz", + "integrity": "sha1-fjo5h5QpXEJeUeTwq97m0TrT0TQ=", + "dev": true, + "requires": { + "remark": "9.0.0", + "unist-util-find-all-after": "1.0.2" + } + }, + "postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=", + "dev": true + }, + "postcss-reporter": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-5.0.0.tgz", + "integrity": "sha512-rBkDbaHAu5uywbCR2XE8a25tats3xSOsGNx6mppK6Q9kSFGKc/FyAzfci+fWM2l+K402p1D0pNcfDGxeje5IKg==", + "dev": true, + "requires": { + "chalk": "2.2.2", + "lodash": "4.17.10", + "log-symbols": "2.2.0", + "postcss": "6.0.22" + } + }, + "postcss-resolve-nested-selector": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", + "integrity": "sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=", + "dev": true + }, + "postcss-safe-parser": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-3.0.1.tgz", + "integrity": "sha1-t1Pv9sfArqXoN1++TN6L+QY/8UI=", + "dev": true, + "requires": { + "postcss": "6.0.22" + } + }, + "postcss-sass": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/postcss-sass/-/postcss-sass-0.3.1.tgz", + "integrity": "sha512-jyrOsP3MoLv57avdbi7GEITKrM23qeoFzZi8zmbXPjcPklRt83zzoxF/CEZ/cwRAJsHSkEwHc28Qhkm+8/OoUA==", + "dev": true, + "requires": { + "gonzales-pe": "4.2.3", + "postcss": "6.0.22" + } + }, + "postcss-scss": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-1.0.5.tgz", + "integrity": "sha512-gJB1tKYMkBy0MU+COt6WXA4ZiRctAKoWLa6qD7a6bbEbBMqrpa/BhfQdN80eYMV+JkKddZVEpZlOggnGShpvyg==", + "dev": true, + "requires": { + "postcss": "6.0.22" + } + }, + "postcss-selector-parser": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", + "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", + "dev": true, + "requires": { + "dot-prop": "4.2.0", + "indexes-of": "1.0.1", + "uniq": "1.0.1" + } + }, + "postcss-syntax": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/postcss-syntax/-/postcss-syntax-0.9.1.tgz", + "integrity": "sha512-oC78MbSKmT/kPgqRl9sQrBIsbfr4TN+vH0STuUa7gnewVg9cs+wjJ00Lclu1GbKy38vJE7tBrhvjlEWvyxiZcg==", + "dev": true + }, + "postcss-url": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-7.3.2.tgz", + "integrity": "sha512-QMV5mA+pCYZQcUEPQkmor9vcPQ2MT+Ipuu8qdi1gVxbNiIiErEGft+eny1ak19qALoBkccS5AHaCaCDzh7b9MA==", + "dev": true, + "requires": { + "mime": "1.6.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "postcss": "6.0.22", + "xxhashjs": "0.2.2" + } + }, + "postcss-value-parser": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", + "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=", + "dev": true + }, + "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 + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "pretty-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", + "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "dev": true, + "requires": { + "renderkid": "2.0.1", + "utila": "0.4.0" + } + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "progress": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", + "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", + "dev": true + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "requires": { + "asap": "2.0.6" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "promisify-call": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/promisify-call/-/promisify-call-2.0.4.tgz", + "integrity": "sha1-1IwtRWUszM1SgB3ey9UzptS9X7o=", + "dev": true, + "optional": true, + "requires": { + "with-callback": "1.0.2" + } + }, + "protractor": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.3.2.tgz", + "integrity": "sha512-pw4uwwiy5lHZjIguxNpkEwJJa7hVz+bJsvaTI+IbXlfn2qXwzbF8eghW/RmrZwE2sGx82I8etb8lVjQ+JrjejA==", + "dev": true, + "requires": { + "@types/node": "6.0.111", + "@types/q": "0.0.32", + "@types/selenium-webdriver": "2.53.43", + "blocking-proxy": "1.0.1", + "chalk": "1.1.3", + "glob": "7.1.2", + "jasmine": "2.8.0", + "jasminewd2": "2.2.0", + "optimist": "0.6.1", + "q": "1.4.1", + "saucelabs": "1.5.0", + "selenium-webdriver": "3.6.0", + "source-map-support": "0.4.18", + "webdriver-js-extender": "1.0.0", + "webdriver-manager": "12.0.6" + }, + "dependencies": { + "@types/node": { + "version": "6.0.111", + "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.111.tgz", + "integrity": "sha512-DoWK5a544Jcr6C1qBadalyj3gQT5V9B87qFBb+uOOq1Id309Lbe10zwsCGCURZEOBoS/pOsmbDN4FnD4sOwJaw==", + "dev": true + }, + "adm-zip": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.11.tgz", + "integrity": "sha512-L8vcjDTCOIJk7wFvmlEUN7AsSb8T+2JrdP7KINBjzr24TJ5Mwj590sLu3BC7zNZowvJWa/JtPmD8eJCzdtDWjA==", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "5.0.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.1", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "rimraf": "2.6.2" + } + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "arrify": "1.0.1", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "0.5.7" + } + }, + "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 + }, + "webdriver-manager": { + "version": "12.0.6", + "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.0.6.tgz", + "integrity": "sha1-PfGkgZdwELTL+MnYXHpXeCjA5ws=", + "dev": true, + "requires": { + "adm-zip": "0.4.11", + "chalk": "1.1.3", + "del": "2.2.2", + "glob": "7.1.2", + "ini": "1.3.5", + "minimist": "1.2.0", + "q": "1.4.1", + "request": "2.86.0", + "rimraf": "2.6.2", + "semver": "5.5.0", + "xml2js": "0.4.19" + } + } + } + }, + "proxy-addr": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", + "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", + "dev": true, + "requires": { + "forwarded": "0.1.2", + "ipaddr.js": "1.6.0" + } + }, + "proxy-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-3.0.0.tgz", + "integrity": "sha512-g6n6vnk8fRf705ShN+FEXFG/SDJaW++lSs0d9KaJh4uBWW/wi7en4Cpo5VYQW3SZzAE121lhB/KLQrbURoubZw==", + "dev": true, + "optional": true, + "requires": { + "agent-base": "4.2.0", + "debug": "3.1.0", + "http-proxy-agent": "2.1.0", + "https-proxy-agent": "2.2.1", + "lru-cache": "4.1.3", + "pac-proxy-agent": "2.0.2", + "proxy-from-env": "1.0.0", + "socks-proxy-agent": "3.0.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "proxy-from-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", + "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=", + "dev": true + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "public-encrypt": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", + "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.2.0", + "parse-asn1": "5.1.1", + "randombytes": "2.0.6" + } + }, + "pug": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pug/-/pug-2.0.3.tgz", + "integrity": "sha1-ccuoJTfJWl6rftBGluQiH1Oqh44=", + "dev": true, + "requires": { + "pug-code-gen": "2.0.1", + "pug-filters": "3.1.0", + "pug-lexer": "4.0.0", + "pug-linker": "3.0.5", + "pug-load": "2.0.11", + "pug-parser": "5.0.0", + "pug-runtime": "2.0.4", + "pug-strip-comments": "1.0.3" + } + }, + "pug-attrs": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-2.0.3.tgz", + "integrity": "sha1-owlflw5kFR972tlX7vVftdeQXRU=", + "dev": true, + "requires": { + "constantinople": "3.1.2", + "js-stringify": "1.0.2", + "pug-runtime": "2.0.4" + } + }, + "pug-code-gen": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-2.0.1.tgz", + "integrity": "sha1-CVHsgyJddNjPxHan+Zolm199BQw=", + "dev": true, + "requires": { + "constantinople": "3.1.2", + "doctypes": "1.1.0", + "js-stringify": "1.0.2", + "pug-attrs": "2.0.3", + "pug-error": "1.3.2", + "pug-runtime": "2.0.4", + "void-elements": "2.0.1", + "with": "5.1.1" + } + }, + "pug-error": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-1.3.2.tgz", + "integrity": "sha1-U659nSm7A89WRJOgJhCfVMR/XyY=", + "dev": true + }, + "pug-filters": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-3.1.0.tgz", + "integrity": "sha1-JxZVVbwEwjbkqisDZiRt+gIbYm4=", + "dev": true, + "requires": { + "clean-css": "4.1.11", + "constantinople": "3.1.2", + "jstransformer": "1.0.0", + "pug-error": "1.3.2", + "pug-walk": "1.1.7", + "resolve": "1.7.1", + "uglify-js": "2.8.29" + }, + "dependencies": { + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "requires": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + } + } + } + }, + "pug-lexer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-4.0.0.tgz", + "integrity": "sha1-IQwYRX7y4XYCQnQMXmR715TOwng=", + "dev": true, + "requires": { + "character-parser": "2.2.0", + "is-expression": "3.0.0", + "pug-error": "1.3.2" + } + }, + "pug-linker": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-3.0.5.tgz", + "integrity": "sha1-npp65ABWgtAn3uuWsAD4juuDoC8=", + "dev": true, + "requires": { + "pug-error": "1.3.2", + "pug-walk": "1.1.7" + } + }, + "pug-load": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-2.0.11.tgz", + "integrity": "sha1-5kjlftET/iwfRdV4WOorrWvAFSc=", + "dev": true, + "requires": { + "object-assign": "4.1.1", + "pug-walk": "1.1.7" + } + }, + "pug-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-5.0.0.tgz", + "integrity": "sha1-45Stmz/KkxI5QK/4hcBuRKt+aOQ=", + "dev": true, + "requires": { + "pug-error": "1.3.2", + "token-stream": "0.0.1" + } + }, + "pug-runtime": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-2.0.4.tgz", + "integrity": "sha1-4XjhvaaKsujArPybztLFT9iM61g=", + "dev": true + }, + "pug-strip-comments": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-1.0.3.tgz", + "integrity": "sha1-8VWVkiBu3G+FMQ2s9K+0igJa9Z8=", + "dev": true, + "requires": { + "pug-error": "1.3.2" + } + }, + "pug-walk": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-1.1.7.tgz", + "integrity": "sha1-wA1cUSi6xYBr7BXSt+fNq+QlMfM=", + "dev": true + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "1.4.1", + "once": "1.4.0" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "3.6.0", + "inherits": "2.0.3", + "pump": "2.0.1" + } + }, + "punycode": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", + "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=", + "dev": true + }, + "puppeteer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.4.0.tgz", + "integrity": "sha512-WDnC1FSHTedvRSS8BZB73tPAx2svUCWFdcxVjrybw8pbKOAB1v5S/pW0EamkqQoL1mXiBc+v8lyYjhhzMHIk1Q==", + "dev": true, + "requires": { + "debug": "3.1.0", + "extract-zip": "1.6.6", + "https-proxy-agent": "2.2.1", + "mime": "2.3.1", + "progress": "2.0.0", + "proxy-from-env": "1.0.0", + "rimraf": "2.6.2", + "ws": "3.3.3" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "mime": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", + "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==", + "dev": true + } + } + }, + "q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", + "dev": true + }, + "qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true + }, + "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 + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "querystringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.0.0.tgz", + "integrity": "sha512-eTPo5t/4bgaMNZxyjWx6N2a6AuE0mq51KWvpc7nU/MAqixcI6v6KrGUKES0HaomdnolQBBXU/++X6/QQ9KL4tw==", + "dev": true + }, + "quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", + "dev": true + }, + "randomatic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", + "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==", + "dev": true, + "requires": { + "is-number": "4.0.0", + "kind-of": "6.0.2", + "math-random": "1.0.1" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "randombytes": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", + "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "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, + "requires": { + "randombytes": "2.0.6", + "safe-buffer": "5.1.2" + } + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "dev": true + }, + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + }, + "dependencies": { + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", + "dev": true + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "dev": true, + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": "1.4.0" + } + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", + "dev": true + } + } + }, + "raw-loader": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", + "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=", + "dev": true + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "dev": true, + "requires": { + "pify": "2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "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, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + }, + "dependencies": { + "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, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "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, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "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, + "requires": { + "pinkie-promise": "2.0.1" + } + } + } + }, + "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, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "readable-stream": "2.3.6", + "set-immediate-shim": "1.0.1" + } + }, + "recursive-readdir": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", + "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", + "dev": true, + "requires": { + "minimatch": "3.0.4" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "2.1.0", + "strip-indent": "1.0.1" + } + }, + "redis": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/redis/-/redis-2.8.0.tgz", + "integrity": "sha512-M1OkonEQwtRmZv4tEWF2VgpG0JWJ8Fv1PhlgT5+B+uNq2cA3Rt1Yt/ryoR+vQNOQcIEgdCdfH0jr3bDpihAw1A==", + "dev": true, + "optional": true, + "requires": { + "double-ended-queue": "2.1.0-0", + "redis-commands": "1.3.5", + "redis-parser": "2.6.0" + } + }, + "redis-commands": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.3.5.tgz", + "integrity": "sha512-foGF8u6MXGFF++1TZVC6icGXuMYPftKXt1FBT2vrfU9ZATNtZJ8duRC5d1lEfE8hyVe3jhelHGB91oB7I6qLsA==", + "dev": true, + "optional": true + }, + "redis-parser": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-2.6.0.tgz", + "integrity": "sha1-Uu0J2srBCPGmMcB+m2mUHnoZUEs=", + "dev": true, + "optional": true + }, + "reflect-metadata": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.12.tgz", + "integrity": "sha512-n+IyV+nGz3+0q3/Yf1ra12KpCyi001bi4XFxSjbiWWjfqb52iTTtpGXmCCAOWWIAn9KEuFZKGqBERHmrtScZ3A==", + "dev": true + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "0.1.3" + } + }, + "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, + "requires": { + "extend-shallow": "3.0.2", + "safe-regex": "1.1.0" + } + }, + "regexpu-core": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", + "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", + "dev": true, + "requires": { + "regenerate": "1.4.0", + "regjsgen": "0.2.0", + "regjsparser": "0.1.5" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true + }, + "remark": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/remark/-/remark-9.0.0.tgz", + "integrity": "sha512-amw8rGdD5lHbMEakiEsllmkdBP+/KpjW/PRK6NSGPZKCQowh0BT4IWXDAkRMyG3SB9dKPXWMviFjNusXzXNn3A==", + "dev": true, + "requires": { + "remark-parse": "5.0.0", + "remark-stringify": "5.0.0", + "unified": "6.2.0" + } + }, + "remark-parse": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-5.0.0.tgz", + "integrity": "sha512-b3iXszZLH1TLoyUzrATcTQUZrwNl1rE70rVdSruJFlDaJ9z5aMkhrG43Pp68OgfHndL/ADz6V69Zow8cTQu+JA==", + "dev": true, + "requires": { + "collapse-white-space": "1.0.4", + "is-alphabetical": "1.0.2", + "is-decimal": "1.0.2", + "is-whitespace-character": "1.0.2", + "is-word-character": "1.0.2", + "markdown-escapes": "1.0.2", + "parse-entities": "1.1.2", + "repeat-string": "1.6.1", + "state-toggle": "1.0.1", + "trim": "0.0.1", + "trim-trailing-lines": "1.1.1", + "unherit": "1.1.1", + "unist-util-remove-position": "1.1.2", + "vfile-location": "2.0.3", + "xtend": "4.0.1" + } + }, + "remark-stringify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-5.0.0.tgz", + "integrity": "sha512-Ws5MdA69ftqQ/yhRF9XhVV29mhxbfGhbz0Rx5bQH+oJcNhhSM6nCu1EpLod+DjrFGrU0BMPs+czVmJZU7xiS7w==", + "dev": true, + "requires": { + "ccount": "1.0.3", + "is-alphanumeric": "1.0.0", + "is-decimal": "1.0.2", + "is-whitespace-character": "1.0.2", + "longest-streak": "2.0.2", + "markdown-escapes": "1.0.2", + "markdown-table": "1.1.2", + "mdast-util-compact": "1.0.1", + "parse-entities": "1.1.2", + "repeat-string": "1.6.1", + "state-toggle": "1.0.1", + "stringify-entities": "1.3.2", + "unherit": "1.1.1", + "xtend": "4.0.1" + } + }, + "remove-markdown": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/remove-markdown/-/remove-markdown-0.2.2.tgz", + "integrity": "sha1-ZrDO66n7d8qWNrsbAwfOIaMqEqY=", + "dev": true + }, + "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 + }, + "renderkid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.1.tgz", + "integrity": "sha1-iYyr/Ivt5Le5ETWj/9Mj5YwNsxk=", + "dev": true, + "requires": { + "css-select": "1.2.0", + "dom-converter": "0.1.4", + "htmlparser2": "3.3.0", + "strip-ansi": "3.0.1", + "utila": "0.3.3" + }, + "dependencies": { + "utila": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", + "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=", + "dev": true + } + } + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "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 + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "1.0.2" + } + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true + }, + "request": { + "version": "2.86.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.86.0.tgz", + "integrity": "sha512-BQZih67o9r+Ys94tcIW4S7Uu8pthjrQVxhsZ/weOwHbDfACxvIyvnAbzFQxjy1jMtvFSzv5zf4my6cZsJBbVzw==", + "dev": true, + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.7.0", + "caseless": "0.12.0", + "combined-stream": "1.0.6", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.3.2", + "har-validator": "5.0.3", + "hawk": "6.0.2", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.18", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.2", + "safe-buffer": "5.1.2", + "tough-cookie": "2.3.4", + "tunnel-agent": "0.6.0", + "uuid": "3.2.1" + } + }, + "requestretry": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/requestretry/-/requestretry-1.13.0.tgz", + "integrity": "sha512-Lmh9qMvnQXADGAQxsXHP4rbgO6pffCfuR8XUBdP9aitJcLQJxhp7YZK4xAVYXnPJ5E52mwrfiKQtKonPL8xsmg==", + "dev": true, + "optional": true, + "requires": { + "extend": "3.0.1", + "lodash": "4.17.10", + "request": "2.86.0", + "when": "3.7.8" + }, + "dependencies": { + "when": { + "version": "3.7.8", + "resolved": "https://registry.npmjs.org/when/-/when-3.7.8.tgz", + "integrity": "sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I=", + "dev": true, + "optional": true + } + } + }, + "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 + }, + "require-from-string": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", + "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=", + "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=", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", + "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", + "dev": true, + "requires": { + "path-parse": "1.0.5" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "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 + }, + "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 + }, + "retry": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", + "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", + "dev": true + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "requires": { + "align-text": "0.1.4" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "3.0.4", + "inherits": "2.0.3" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "1.2.0" + } + }, + "rxjs": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.1.0.tgz", + "integrity": "sha512-lMZdl6xbHJCSb5lmnb6nOhsoBVCyoDC5LDJQK9WWyq+tsI7KnlDIZ0r0AZAlBpRPLbwQA9kzSBAZwNIZEZ+hcw==", + "requires": { + "tslib": "1.9.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "0.1.15" + } + }, + "sass-graph": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", + "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", + "dev": true, + "optional": true, + "requires": { + "glob": "7.1.2", + "lodash": "4.17.10", + "scss-tokenizer": "0.2.3", + "yargs": "7.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, + "optional": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "optional": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + } + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true, + "optional": true + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "dev": true, + "optional": true, + "requires": { + "camelcase": "3.0.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "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" + } + } + } + }, + "sass-loader": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.0.1.tgz", + "integrity": "sha512-MeVVJFejJELlAbA7jrRchi88PGP6U9yIfqyiG+bBC4a9s2PX+ulJB9h8bbEohtPBfZmlLhNZ0opQM9hovRXvlw==", + "dev": true, + "requires": { + "clone-deep": "2.0.2", + "loader-utils": "1.1.0", + "lodash.tail": "4.1.1", + "neo-async": "2.5.1", + "pify": "3.0.0" + } + }, + "saucelabs": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz", + "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==", + "dev": true, + "requires": { + "https-proxy-agent": "2.2.1" + } + }, + "sax": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", + "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=", + "dev": true + }, + "schema-utils": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.5.tgz", + "integrity": "sha512-yYrjb9TX2k/J1Y5UNy3KYdZq10xhYcF8nMpAW6o3hy6Q8WSIEf9lJHG/ePnOBfziPM3fvQwfOwa13U/Fh8qTfA==", + "dev": true, + "requires": { + "ajv": "6.4.0", + "ajv-keywords": "3.2.0" + } + }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "dev": true, + "optional": true, + "requires": { + "js-base64": "2.4.5", + "source-map": "0.4.4" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "optional": true, + "requires": { + "amdefine": "1.0.1" + } + } + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selenium-webdriver": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", + "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", + "dev": true, + "requires": { + "jszip": "3.1.5", + "rimraf": "2.6.2", + "tmp": "0.0.30", + "xml2js": "0.4.19" + }, + "dependencies": { + "tmp": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", + "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", + "dev": true, + "requires": { + "os-tmpdir": "1.0.2" + } + } + } + }, + "selfsigned": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.3.tgz", + "integrity": "sha512-vmZenZ+8Al3NLHkWnhBQ0x6BkML1eCP2xEi3JE+f3D9wW9fipD9NNJHYtE9XJM4TsPaHGZJIamrSI6MTg1dU2Q==", + "dev": true, + "requires": { + "node-forge": "0.7.5" + } + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + }, + "semver-dsl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz", + "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=", + "dev": true, + "requires": { + "semver": "5.5.0" + } + }, + "semver-intersect": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.3.1.tgz", + "integrity": "sha1-j6hKnhAovSOeRTDRo+GB5pjYhLo=", + "dev": true, + "requires": { + "semver": "5.5.0" + } + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "1.1.2", + "destroy": "1.0.4", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", + "fresh": "0.5.2", + "http-errors": "1.6.3", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.4.0" + }, + "dependencies": { + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz", + "integrity": "sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ==", + "dev": true + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "1.3.5", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "1.0.3", + "http-errors": "1.6.3", + "mime-types": "2.1.18", + "parseurl": "1.3.2" + } + }, + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "dev": true, + "requires": { + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "parseurl": "1.3.2", + "send": "0.16.2" + } + }, + "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 + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "split-string": "3.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.2" + } + }, + "shallow-clone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz", + "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==", + "dev": true, + "requires": { + "is-extendable": "0.1.1", + "kind-of": "5.1.0", + "mixin-object": "2.0.1" + }, + "dependencies": { + "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 + } + } + }, + "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, + "requires": { + "shebang-regex": "1.0.0" + } + }, + "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 + }, + "shelljs": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", + "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", + "dev": true + }, + "shortid": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/shortid/-/shortid-2.2.8.tgz", + "integrity": "sha1-AzsRfWoul1gE9vCWnb59PQs1UTE=", + "dev": true + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "silent-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/silent-error/-/silent-error-1.1.0.tgz", + "integrity": "sha1-IglwbxyFCp8dENDYQJGLRvJuG8k=", + "dev": true, + "requires": { + "debug": "2.6.9" + } + }, + "slack-node": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/slack-node/-/slack-node-0.2.0.tgz", + "integrity": "sha1-3kuN3aqLeT9h29KTgQT9q/N9+jA=", + "dev": true, + "optional": true, + "requires": { + "requestretry": "1.13.0" + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "slice-ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0" + }, + "dependencies": { + "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 + } + } + }, + "slide": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", + "dev": true + }, + "smart-buffer": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-1.1.15.tgz", + "integrity": "sha1-fxFLW2X6s+KjWqd1uxLw0cZJvxY=", + "dev": true + }, + "smtp-connection": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/smtp-connection/-/smtp-connection-2.12.0.tgz", + "integrity": "sha1-1275EnyyPCJZ7bHoNJwujV4tdME=", + "dev": true, + "requires": { + "httpntlm": "1.6.1", + "nodemailer-shared": "1.1.0" + } + }, + "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, + "requires": { + "base": "0.11.2", + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "map-cache": "0.2.2", + "source-map": "0.5.7", + "source-map-resolve": "0.5.2", + "use": "3.1.0" + }, + "dependencies": { + "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, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "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, + "requires": { + "define-property": "1.0.0", + "isobject": "3.0.1", + "snapdragon-util": "3.0.1" + }, + "dependencies": { + "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, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "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, + "requires": { + "kind-of": "6.0.2" + } + }, + "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, + "requires": { + "kind-of": "6.0.2" + } + }, + "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, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + } + } + }, + "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, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "sntp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", + "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", + "dev": true, + "requires": { + "hoek": "4.2.1" + } + }, + "socket.io": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.0.4.tgz", + "integrity": "sha1-waRZDO/4fs8TxyZS8Eb3FrKeYBQ=", + "dev": true, + "requires": { + "debug": "2.6.9", + "engine.io": "3.1.5", + "socket.io-adapter": "1.1.1", + "socket.io-client": "2.0.4", + "socket.io-parser": "3.1.3" + } + }, + "socket.io-adapter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", + "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=", + "dev": true + }, + "socket.io-client": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.0.4.tgz", + "integrity": "sha1-CRilUkBtxeVAs4Dc2Xr8SmQzL44=", + "dev": true, + "requires": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "2.6.9", + "engine.io-client": "3.1.6", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "3.1.3", + "to-array": "0.1.4" + } + }, + "socket.io-parser": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.1.3.tgz", + "integrity": "sha512-g0a2HPqLguqAczs3dMECuA1RgoGFPyvDqcbaDEdCWY9g59kdUAz3YRmaJBNKXflrHNwB7Q12Gkf/0CZXfdHR7g==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "debug": "3.1.0", + "has-binary2": "1.0.3", + "isarray": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + } + } + }, + "sockjs": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", + "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "dev": true, + "requires": { + "faye-websocket": "0.10.0", + "uuid": "3.2.1" + } + }, + "sockjs-client": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.4.tgz", + "integrity": "sha1-W6vjhrd15M8U51IJEUUmVAFsixI=", + "dev": true, + "requires": { + "debug": "2.6.9", + "eventsource": "0.1.6", + "faye-websocket": "0.11.1", + "inherits": "2.0.3", + "json3": "3.3.2", + "url-parse": "1.4.0" + }, + "dependencies": { + "faye-websocket": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", + "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", + "dev": true, + "requires": { + "websocket-driver": "0.7.0" + } + } + } + }, + "socks": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/socks/-/socks-1.1.10.tgz", + "integrity": "sha1-W4t/x8jzQcU+0FbpKbe/Tei6e1o=", + "dev": true, + "requires": { + "ip": "1.1.5", + "smart-buffer": "1.1.15" + } + }, + "socks-proxy-agent": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-3.0.1.tgz", + "integrity": "sha512-ZwEDymm204mTzvdqyUqOdovVr2YRd2NYskrYrF2LXyZ9qDiMAoFESGK8CRphiO7rtbo2Y757k2Nia3x2hGtalA==", + "dev": true, + "requires": { + "agent-base": "4.2.0", + "socks": "1.1.10" + } + }, + "source-list-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", + "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "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, + "requires": { + "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" + } + }, + "source-map-support": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", + "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", + "dev": true, + "requires": { + "buffer-from": "1.0.0", + "source-map": "0.6.1" + }, + "dependencies": { + "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 + } + } + }, + "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 + }, + "spdx-correct": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", + "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "dev": true, + "requires": { + "spdx-expression-parse": "3.0.0", + "spdx-license-ids": "3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", + "dev": true + }, + "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, + "requires": { + "spdx-exceptions": "2.1.0", + "spdx-license-ids": "3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", + "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", + "dev": true + }, + "spdy": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", + "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", + "dev": true, + "requires": { + "debug": "2.6.9", + "handle-thing": "1.2.5", + "http-deceiver": "1.2.7", + "safe-buffer": "5.1.2", + "select-hose": "2.0.0", + "spdy-transport": "2.1.0" + } + }, + "spdy-transport": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.1.0.tgz", + "integrity": "sha512-bpUeGpZcmZ692rrTiqf9/2EUakI6/kXX1Rpe0ib/DyOzbiexVfXkw6GnvI9hVGvIwVaUhkaBojjCZwLNRGQg1g==", + "dev": true, + "requires": { + "debug": "2.6.9", + "detect-node": "2.0.3", + "hpack.js": "2.1.6", + "obuf": "1.1.2", + "readable-stream": "2.3.6", + "safe-buffer": "5.1.2", + "wbuf": "1.7.3" + } + }, + "specificity": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.3.2.tgz", + "integrity": "sha512-Nc/QN/A425Qog7j9aHmwOrlwX2e7pNI47ciwxwy4jOlvbbMHkNNJchit+FX+UjF3IAdiaaV5BKeWuDUnws6G1A==", + "dev": true + }, + "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, + "requires": { + "extend-shallow": "3.0.2" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", + "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", + "dev": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + } + }, + "ssri": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", + "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "state-toggle": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.1.tgz", + "integrity": "sha512-Qe8QntFrrpWTnHwvwj2FZTgv+PKIsp0B9VxLzLLbSpPXWOgRgc5LVj/aTiSfK1RqIeF9jeC1UeOH8Q8y60A7og==", + "dev": true + }, + "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, + "requires": { + "define-property": "0.2.5", + "object-copy": "0.1.0" + }, + "dependencies": { + "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, + "requires": { + "is-descriptor": "0.1.6" + } + } + } + }, + "stats-webpack-plugin": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/stats-webpack-plugin/-/stats-webpack-plugin-0.6.2.tgz", + "integrity": "sha1-LFlJtTHgf4eojm6k3PrFOqjHWis=", + "dev": true, + "requires": { + "lodash": "4.17.10" + } + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true + }, + "stdout-stream": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.0.tgz", + "integrity": "sha1-osfIWH5U2UJ+qe2zrD8s1SLfN4s=", + "dev": true, + "optional": true, + "requires": { + "readable-stream": "2.3.6" + } + }, + "stream-browserify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.6" + } + }, + "stream-each": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.2.tgz", + "integrity": "sha512-mc1dbFhGBxvTM3bIWmAAINbqiuAk9TATcfIQC8P+/+HJefgaiTlMn2dHvkX8qlI12KeYKSQ1Ua9RrIqrn1VPoA==", + "dev": true, + "requires": { + "end-of-stream": "1.4.1", + "stream-shift": "1.0.0" + } + }, + "stream-http": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.2.tgz", + "integrity": "sha512-QllfrBhqF1DPcz46WxKTs6Mz1Bpc+8Qm6vbqOpVav5odAXwbyzwnEczoWqtxrsmlO+cJqtPrp/8gWKWjaKLLlA==", + "dev": true, + "requires": { + "builtin-status-codes": "3.0.0", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "to-arraybuffer": "1.0.1", + "xtend": "4.0.1" + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "streamroller": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-0.7.0.tgz", + "integrity": "sha512-WREzfy0r0zUqp3lGO096wRuUp7ho1X6uo/7DJfTlEi0Iv/4gT7YHqXDjKC2ioVGBZtE8QzsQD9nx1nIuoZ57jQ==", + "dev": true, + "requires": { + "date-format": "1.2.0", + "debug": "3.1.0", + "mkdirp": "0.5.1", + "readable-stream": "2.3.6" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "streamsearch": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", + "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=", + "dev": true + }, + "string-capitalize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string-capitalize/-/string-capitalize-1.0.1.tgz", + "integrity": "sha1-qGZfdzYbTOBKa95tm7shcSu5dJ4=", + "dev": true + }, + "string-humanize": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string-humanize/-/string-humanize-1.0.0.tgz", + "integrity": "sha1-7t23fUcTgzPNVYrRdXDiHOiohs8=", + "dev": true, + "requires": { + "string-capitalize": "1.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "stringify-entities": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-1.3.2.tgz", + "integrity": "sha512-nrBAQClJAPN2p+uGCVJRPIPakKeKWZ9GtBCmormE7pWOSlHat7+x5A8gx85M7HM5Dt0BP3pP5RhVW77WdbJJ3A==", + "dev": true, + "requires": { + "character-entities-html4": "1.1.2", + "character-entities-legacy": "1.1.2", + "is-alphanumerical": "1.0.2", + "is-hexadecimal": "1.0.2" + } + }, + "stringstream": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz", + "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==", + "dev": true, + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "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, + "requires": { + "is-utf8": "0.2.1" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "4.0.1" + } + }, + "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 + }, + "style-loader": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.21.0.tgz", + "integrity": "sha512-T+UNsAcl3Yg+BsPKs1vd22Fr8sVT+CJMtzqc6LEw9bbJZb43lm9GoeIfUcDEefBSWC0BhYbcdupV1GtI4DGzxg==", + "dev": true, + "requires": { + "loader-utils": "1.1.0", + "schema-utils": "0.4.5" + } + }, + "style-search": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", + "integrity": "sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI=", + "dev": true + }, + "stylelint": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-9.2.1.tgz", + "integrity": "sha512-zR0rSMITL8VjTVoIEGsUh5m0lMluHaIbDLAJTrFYVLElYhP6d5HcJc5/cexA1mrKzQkKu7gvmbDclNLgAeiabw==", + "dev": true, + "requires": { + "autoprefixer": "8.5.0", + "balanced-match": "1.0.0", + "chalk": "2.4.1", + "cosmiconfig": "5.0.3", + "debug": "3.1.0", + "execall": "1.0.0", + "file-entry-cache": "2.0.0", + "get-stdin": "6.0.0", + "globby": "8.0.1", + "globjoin": "0.1.4", + "html-tags": "2.0.0", + "ignore": "3.3.8", + "import-lazy": "3.1.0", + "imurmurhash": "0.1.4", + "known-css-properties": "0.6.1", + "lodash": "4.17.10", + "log-symbols": "2.2.0", + "mathml-tag-names": "2.1.0", + "meow": "5.0.0", + "micromatch": "2.3.11", + "normalize-selector": "0.2.0", + "pify": "3.0.0", + "postcss": "6.0.22", + "postcss-html": "0.23.7", + "postcss-less": "1.1.5", + "postcss-markdown": "0.23.7", + "postcss-media-query-parser": "0.2.3", + "postcss-reporter": "5.0.0", + "postcss-resolve-nested-selector": "0.1.1", + "postcss-safe-parser": "3.0.1", + "postcss-sass": "0.3.1", + "postcss-scss": "1.0.5", + "postcss-selector-parser": "3.1.1", + "postcss-syntax": "0.9.1", + "postcss-value-parser": "3.3.0", + "resolve-from": "4.0.0", + "signal-exit": "3.0.2", + "specificity": "0.3.2", + "string-width": "2.1.1", + "style-search": "0.1.0", + "sugarss": "1.0.1", + "svg-tags": "1.0.0", + "table": "4.0.3" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "1.1.0" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "dev": true, + "requires": { + "camelcase": "4.1.0", + "map-obj": "2.0.0", + "quick-lru": "1.1.0" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + } + }, + "cosmiconfig": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.0.3.tgz", + "integrity": "sha512-x7vMpNH5favpvFjxwSzfQkB5ozdxikcmWzxah9aOh8BCOKeR+j6TM6PxQ2zyMm3+EDZcSajQrzzPKrsVqbsUDA==", + "dev": true, + "requires": { + "is-directory": "0.3.1", + "js-yaml": "3.11.0", + "parse-json": "4.0.0" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "get-stdin": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", + "dev": true + }, + "globby": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.1.tgz", + "integrity": "sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw==", + "dev": true, + "requires": { + "array-union": "1.0.2", + "dir-glob": "2.0.0", + "fast-glob": "2.2.2", + "glob": "7.1.2", + "ignore": "3.3.8", + "pify": "3.0.0", + "slash": "1.0.0" + } + }, + "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 + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "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 + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + }, + "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, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "4.0.0", + "pify": "3.0.0", + "strip-bom": "3.0.0" + } + }, + "map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", + "dev": true + }, + "meow": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz", + "integrity": "sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==", + "dev": true, + "requires": { + "camelcase-keys": "4.2.0", + "decamelize-keys": "1.1.0", + "loud-rejection": "1.6.0", + "minimist-options": "3.0.2", + "normalize-package-data": "2.4.0", + "read-pkg-up": "3.0.0", + "redent": "2.0.0", + "trim-newlines": "2.0.0", + "yargs-parser": "10.0.0" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "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, + "requires": { + "error-ex": "1.3.1", + "json-parse-better-errors": "1.0.2" + } + }, + "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, + "requires": { + "load-json-file": "4.0.0", + "normalize-package-data": "2.4.0", + "path-type": "3.0.0" + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "3.0.0" + } + }, + "redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "dev": true, + "requires": { + "indent-string": "3.2.0", + "strip-indent": "2.0.0" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, + "trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", + "dev": true + }, + "yargs-parser": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.0.0.tgz", + "integrity": "sha512-+DHejWujTVYeMHLff8U96rLc4uE4Emncoftvn5AjhB1Jw1pWxLzgBUT/WYbPrHmy6YPEBTZQx5myHhVcuuu64g==", + "dev": true, + "requires": { + "camelcase": "4.1.0" + } + } + } + }, + "stylelint-config-recommended": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-2.1.0.tgz", + "integrity": "sha512-ajMbivOD7JxdsnlS5945KYhvt7L/HwN6YeYF2BH6kE4UCLJR0YvXMf+2j7nQpJyYLZx9uZzU5G1ZOSBiWAc6yA==", + "dev": true + }, + "stylelint-config-recommended-scss": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-3.2.0.tgz", + "integrity": "sha512-M8BFHMRf8KNz5EQPKJd8nMCGmBd2o5coDEObfHVbEkyLDgjIf1V+U5dHjaGgvhm0zToUxshxN+Gc5wpbOOew4g==", + "dev": true, + "requires": { + "stylelint-config-recommended": "2.1.0" + } + }, + "stylelint-config-standard": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-18.2.0.tgz", + "integrity": "sha512-07x0TaSIzvXlbOioUU4ORkCIM07kyIuojkbSVCyFWNVgXMXYHfhnQSCkqu+oHWJf3YADAnPGWzdJ53NxkoJ7RA==", + "dev": true, + "requires": { + "stylelint-config-recommended": "2.1.0" + } + }, + "stylelint-scss": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-3.1.0.tgz", + "integrity": "sha512-R8M4j4MBpqE3ZHy26pdb3OkuunGZ6KZ1eBacobByMOqcAB+HfXqNhO+AcE73eWbyWoTOE/rzOThgWJGOHbWCRw==", + "dev": true, + "requires": { + "lodash": "4.17.10", + "postcss-media-query-parser": "0.2.3", + "postcss-resolve-nested-selector": "0.1.1", + "postcss-selector-parser": "4.0.0", + "postcss-value-parser": "3.3.0" + }, + "dependencies": { + "cssesc": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-1.0.1.tgz", + "integrity": "sha512-S2hzrpWvE6G/rW7i7IxJfWBYn27QWfOIncUW++8Rbo1VB5zsJDSVPcnI+Q8z7rhxT6/yZeLOCja4cZnghJrNGA==", + "dev": true + }, + "postcss-selector-parser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-4.0.0.tgz", + "integrity": "sha512-5h+MvEjnzu1qy6MabjuoPatsGAjjDV9B24e7Cktjl+ClNtjVjmvAXjOFQr1u7RlWULKNGYaYVE4s+DIIQ4bOGA==", + "dev": true, + "requires": { + "cssesc": "1.0.1", + "indexes-of": "1.0.1", + "uniq": "1.0.1" + } + } + } + }, + "stylus": { + "version": "0.54.5", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.5.tgz", + "integrity": "sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=", + "dev": true, + "requires": { + "css-parse": "1.7.0", + "debug": "2.6.9", + "glob": "7.0.6", + "mkdirp": "0.5.1", + "sax": "0.5.8", + "source-map": "0.1.43" + }, + "dependencies": { + "glob": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", + "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dev": true, + "requires": { + "amdefine": "1.0.1" + } + } + } + }, + "stylus-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-3.0.2.tgz", + "integrity": "sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA==", + "dev": true, + "requires": { + "loader-utils": "1.1.0", + "lodash.clonedeep": "4.5.0", + "when": "3.6.4" + } + }, + "sugarss": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-1.0.1.tgz", + "integrity": "sha512-3qgLZytikQQEVn1/FrhY7B68gPUUGY3R1Q1vTiD5xT+Ti1DP/8iZuwFet9ONs5+bmL8pZoDQ6JrQHVgrNlK6mA==", + "dev": true, + "requires": { + "postcss": "6.0.22" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + }, + "svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", + "dev": true + }, + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "dev": true + }, + "table": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.3.tgz", + "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==", + "dev": true, + "requires": { + "ajv": "6.4.0", + "ajv-keywords": "3.2.0", + "chalk": "2.2.2", + "lodash": "4.17.10", + "slice-ansi": "1.0.0", + "string-width": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "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": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "tapable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.0.0.tgz", + "integrity": "sha512-dQRhbNQkRnaqauC7WqSJ21EEksgT0fYZX2lqXzGkpo8JNig9zGZTYoMGvyI2nWmXlE2VSVXVDu7wLVGu/mQEsg==", + "dev": true + }, + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "dev": true, + "optional": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "2.3.6", + "xtend": "4.0.1" + } + }, + "thunkify": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/thunkify/-/thunkify-2.1.2.tgz", + "integrity": "sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0=", + "dev": true, + "optional": true + }, + "thunky": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.2.tgz", + "integrity": "sha1-qGLgGOP7HqLsP85dVWBc9X8kc3E=", + "dev": true + }, + "timers-browserify": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", + "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", + "dev": true, + "requires": { + "setimmediate": "1.0.5" + } + }, + "timespan": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/timespan/-/timespan-2.3.0.tgz", + "integrity": "sha1-SQLOBAvRPYRcj1myfp1ZutbzmSk=", + "dev": true, + "optional": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "1.0.2" + } + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", + "dev": true + }, + "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 + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "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, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "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, + "requires": { + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "regex-not": "1.0.2", + "safe-regex": "1.1.0" + } + }, + "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, + "requires": { + "is-number": "3.0.0", + "repeat-string": "1.6.1" + } + }, + "token-stream": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-0.0.1.tgz", + "integrity": "sha1-zu78cXp2xDFvEm0LnbqlXX598Bo=", + "dev": true + }, + "toposort": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", + "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", + "dev": true + }, + "tough-cookie": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "dev": true, + "requires": { + "punycode": "1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "tree-kill": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.0.tgz", + "integrity": "sha512-DlX6dR0lOIRDFxI0mjL9IYg6OTncLm/Zt+JiBhE5OlFcAR8yc9S7FFXU9so0oda47frdM/JFsk7UjNt9vscKcg==", + "dev": true + }, + "trim": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", + "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=", + "dev": true + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "trim-trailing-lines": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.1.tgz", + "integrity": "sha512-bWLv9BbWbbd7mlqqs2oQYnLD/U/ZqeJeJwbO0FG2zA1aTq+HTvxfHNKFa/HGCVyJpDiioUYaBhfiT6rgk+l4mg==", + "dev": true + }, + "trough": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.2.tgz", + "integrity": "sha512-FHkoUZvG6Egrv9XZAyYGKEyb1JMsFphgPjoczkZC2y6W93U1jswcVURB8MUvtsahEPEVACyxD47JAL63vF4JsQ==", + "dev": true + }, + "true-case-path": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.2.tgz", + "integrity": "sha1-fskRMJJHZsf1c74wIMNPj9/QDWI=", + "dev": true, + "optional": true, + "requires": { + "glob": "6.0.4" + }, + "dependencies": { + "glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "dev": true, + "optional": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + } + } + }, + "ts-node": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-6.0.3.tgz", + "integrity": "sha512-ARaOMNFEPKg2ZuC1qJddFvHxHNFVckR0g9xLxMIoMqSSIkDc8iS4/LoV53EdDWWNq2FGwqcEf0bVVGJIWpsznw==", + "dev": true, + "requires": { + "arrify": "1.0.1", + "chalk": "2.4.1", + "diff": "3.5.0", + "make-error": "1.3.4", + "minimist": "1.2.0", + "mkdirp": "0.5.1", + "source-map-support": "0.5.6", + "yn": "2.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "tsickle": { + "version": "0.27.5", + "resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.27.5.tgz", + "integrity": "sha512-NP+CjM1EXza/M8mOXBLH3vkFEJiu1zfEAlC5WdJxHPn8l96QPz5eooP6uAgYtw1CcKfuSyIiheNUdKxtDWCNeg==", + "dev": true, + "requires": { + "minimist": "1.2.0", + "mkdirp": "0.5.1", + "source-map": "0.6.1", + "source-map-support": "0.5.6" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "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 + } + } + }, + "tslib": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.1.tgz", + "integrity": "sha512-avfPS28HmGLLc2o4elcc2EIq2FcH++Yo5YxpBZi9Yw93BCTGFthI4HPE4Rpep6vSYQaK8e69PelM44tPj+RaQg==" + }, + "tslint": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.10.0.tgz", + "integrity": "sha1-EeJrzLiK+gLdDZlWyuPUVAtfVMM=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "builtin-modules": "1.1.1", + "chalk": "2.4.1", + "commander": "2.15.1", + "diff": "3.5.0", + "glob": "7.1.2", + "js-yaml": "3.11.0", + "minimatch": "3.0.4", + "resolve": "1.7.1", + "semver": "5.5.0", + "tslib": "1.9.1", + "tsutils": "2.27.1" + }, + "dependencies": { + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + } + } + } + }, + "tsscmp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.5.tgz", + "integrity": "sha1-fcSjOvcVgatDN9qR2FylQn69mpc=", + "dev": true, + "optional": true + }, + "tsutils": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.27.1.tgz", + "integrity": "sha512-AE/7uzp32MmaHvNNFES85hhUDHFdFZp6OAiZcd6y4ZKKIg6orJTm8keYWBhIhrJQH3a4LzNKat7ZPXZt5aTf6w==", + "dev": true, + "requires": { + "tslib": "1.9.1" + } + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2" + } + }, + "type-is": { + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", + "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "2.1.18" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typescript": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.7.2.tgz", + "integrity": "sha512-p5TCYZDAO0m4G344hD+wx/LATebLWZNkkh2asWUFqSsD2OrDNhbAHuSjobrmsUmdzjJjEeZVU9g1h3O6vpstnw==", + "dev": true + }, + "uglify-js": { + "version": "3.3.25", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.25.tgz", + "integrity": "sha512-hobogryjDV36VrLK3Y69ou4REyrTApzUblVFmdQOYRe8cYaSmFJXMb4dR9McdvYDSbeNdzUgYr2YVukJaErJcA==", + "dev": true, + "requires": { + "commander": "2.15.1", + "source-map": "0.6.1" + }, + "dependencies": { + "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 + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true, + "optional": true + }, + "uglifyjs-webpack-plugin": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.5.tgz", + "integrity": "sha512-hIQJ1yxAPhEA2yW/i7Fr+SXZVMp+VEI3d42RTHBgQd2yhp/1UdBcR3QEWPV5ahBxlqQDMEMTuTEvDHSFINfwSw==", + "dev": true, + "requires": { + "cacache": "10.0.4", + "find-cache-dir": "1.0.0", + "schema-utils": "0.4.5", + "serialize-javascript": "1.5.0", + "source-map": "0.6.1", + "uglify-es": "3.3.9", + "webpack-sources": "1.1.0", + "worker-farm": "1.6.0" + }, + "dependencies": { + "commander": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", + "dev": true + }, + "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 + }, + "uglify-es": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", + "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", + "dev": true, + "requires": { + "commander": "2.13.0", + "source-map": "0.6.1" + } + } + } + }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", + "dev": true + }, + "underscore": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", + "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=", + "dev": true + }, + "unherit": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.1.tgz", + "integrity": "sha512-+XZuV691Cn4zHsK0vkKYwBEwB74T3IZIcxrgn2E4rKwTfFyI1zCh7X7grwh9Re08fdPlarIdyWgI8aVB3F5A5g==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "xtend": "4.0.1" + } + }, + "unified": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-6.2.0.tgz", + "integrity": "sha512-1k+KPhlVtqmG99RaTbAv/usu85fcSRu3wY8X+vnsEhIxNP5VbVIDiXnLqyKIG+UMdyTg0ZX9EI6k2AfjJkHPtA==", + "dev": true, + "requires": { + "bail": "1.0.3", + "extend": "3.0.1", + "is-plain-obj": "1.1.0", + "trough": "1.0.2", + "vfile": "2.3.0", + "x-is-string": "0.1.0" + } + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "3.1.0", + "get-value": "2.0.6", + "is-extendable": "0.1.1", + "set-value": "0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "to-object-path": "0.3.0" + } + } + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "unique-filename": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz", + "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", + "dev": true, + "requires": { + "unique-slug": "2.0.0" + } + }, + "unique-slug": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.0.tgz", + "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", + "dev": true, + "requires": { + "imurmurhash": "0.1.4" + } + }, + "unist-util-find-all-after": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-1.0.2.tgz", + "integrity": "sha512-nDl79mKpffXojLpCimVXnxhlH/jjaTnDuScznU9J4jjsaUtBdDbxmlc109XtcqxY4SDO0SwzngsxxW8DIISt1w==", + "dev": true, + "requires": { + "unist-util-is": "2.1.2" + } + }, + "unist-util-is": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-2.1.2.tgz", + "integrity": "sha512-YkXBK/H9raAmG7KXck+UUpnKiNmUdB+aBGrknfQ4EreE1banuzrKABx3jP6Z5Z3fMSPMQQmeXBlKpCbMwBkxVw==", + "dev": true + }, + "unist-util-modify-children": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-1.1.2.tgz", + "integrity": "sha512-GRi04yhng1WqBf5RBzPkOtWAadcZS2gvuOgNn/cyJBYNxtTuyYqTKN0eg4rC1YJwGnzrqfRB3dSKm8cNCjNirg==", + "dev": true, + "requires": { + "array-iterate": "1.1.2" + } + }, + "unist-util-remove-position": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.2.tgz", + "integrity": "sha512-XxoNOBvq1WXRKXxgnSYbtCF76TJrRoe5++pD4cCBsssSiWSnPEktyFrFLE8LTk3JW5mt9hB0Sk5zn4x/JeWY7Q==", + "dev": true, + "requires": { + "unist-util-visit": "1.3.1" + } + }, + "unist-util-stringify-position": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", + "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==", + "dev": true + }, + "unist-util-visit": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.3.1.tgz", + "integrity": "sha512-0fdB9EQJU0tho5tK0VzOJzAQpPv2LyLZ030b10GxuzAWEfvd54mpY7BMjQ1L69k2YNvL+SvxRzH0yUIehOO8aA==", + "dev": true, + "requires": { + "unist-util-is": "2.1.2" + } + }, + "universalify": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", + "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "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, + "requires": { + "has-value": "0.3.1", + "isobject": "3.0.1" + }, + "dependencies": { + "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, + "requires": { + "get-value": "2.0.6", + "has-values": "0.1.4", + "isobject": "2.1.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "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 + } + } + }, + "upath": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", + "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", + "dev": true + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, + "uri-js": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-3.0.2.tgz", + "integrity": "sha1-+QuFhQf4HepNz7s8TD2/orVX+qo=", + "dev": true, + "requires": { + "punycode": "2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-join": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.0.tgz", + "integrity": "sha1-TTNA6AfTdzvamZH4MFrNzCpmXSo=", + "dev": true + }, + "url-loader": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.0.1.tgz", + "integrity": "sha512-rAonpHy7231fmweBKUFe0bYnlGDty77E+fm53NZdij7j/YOpyGzc7ttqG1nAXl3aRs0k41o0PC3TvGXQiw2Zvw==", + "dev": true, + "requires": { + "loader-utils": "1.1.0", + "mime": "2.3.1", + "schema-utils": "0.4.5" + }, + "dependencies": { + "mime": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", + "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==", + "dev": true + } + } + }, + "url-parse": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.0.tgz", + "integrity": "sha512-ERuGxDiQ6Xw/agN4tuoCRbmwRuZP0cJ1lJxJubXr5Q/5cDa78+Dc4wfvtxzhzhkm5VvmW6Mf8EVj9SPGN4l8Lg==", + "dev": true, + "requires": { + "querystringify": "2.0.0", + "requires-port": "1.0.0" + } + }, + "use": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", + "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "useragent": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.2.1.tgz", + "integrity": "sha1-z1k+9PLRdYdei7ZY6pLhik/QbY4=", + "dev": true, + "requires": { + "lru-cache": "2.2.4", + "tmp": "0.0.33" + }, + "dependencies": { + "lru-cache": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.2.4.tgz", + "integrity": "sha1-bGWGGb7PFAMdDQtZSxYELOTcBj0=", + "dev": true + } + } + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "1.1.2", + "object.getownpropertydescriptors": "2.0.3" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", + "dev": true + }, + "uws": { + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/uws/-/uws-9.14.0.tgz", + "integrity": "sha512-HNMztPP5A1sKuVFmdZ6BPVpBQd5bUjNC8EFMFiICK+oho/OQsAJy5hnIx4btMHiOk8j04f/DbIlqnEZ9d72dqg==", + "dev": true, + "optional": true + }, + "validate-npm-package-license": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", + "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", + "dev": true, + "requires": { + "spdx-correct": "3.0.0", + "spdx-expression-parse": "3.0.0" + } + }, + "validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "dev": true, + "requires": { + "builtins": "1.0.3" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + } + }, + "vfile": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-2.3.0.tgz", + "integrity": "sha512-ASt4mBUHcTpMKD/l5Q+WJXNtshlWxOogYyGYYrg4lt/vuRjC1EFQtlAofL5VmtVNIZJzWYFJjzGWZ0Gw8pzW1w==", + "dev": true, + "requires": { + "is-buffer": "1.1.6", + "replace-ext": "1.0.0", + "unist-util-stringify-position": "1.1.2", + "vfile-message": "1.0.1" + } + }, + "vfile-location": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.3.tgz", + "integrity": "sha512-zM5/l4lfw1CBoPx3Jimxoc5RNDAHHpk6AM6LM0pTIkm5SUSsx8ZekZ0PVdf0WEZ7kjlhSt7ZlqbRL6Cd6dBs6A==", + "dev": true + }, + "vfile-message": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.0.1.tgz", + "integrity": "sha512-vSGCkhNvJzO6VcWC6AlJW4NtYOVtS+RgCaqFIYUjoGIlHnFL+i0LbtYvonDWOMcB97uTPT4PRsyYY7REWC9vug==", + "dev": true, + "requires": { + "unist-util-stringify-position": "1.1.2" + } + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "dev": true, + "requires": { + "indexof": "0.0.1" + } + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "dev": true + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "dev": true, + "requires": { + "chokidar": "2.0.3", + "graceful-fs": "4.1.11", + "neo-async": "2.5.1" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "1.0.1" + } + }, + "webassemblyjs": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webassemblyjs/-/webassemblyjs-1.4.3.tgz", + "integrity": "sha512-4lOV1Lv6olz0PJkDGQEp82HempAn147e6BXijWDzz9g7/2nSebVP9GVg62Fz5ZAs55mxq13GA0XLyvY8XkyDjg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.4.3", + "@webassemblyjs/validation": "1.4.3", + "@webassemblyjs/wasm-parser": "1.4.3", + "@webassemblyjs/wast-parser": "1.4.3", + "long": "3.2.0" + } + }, + "webdriver-js-extender": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-1.0.0.tgz", + "integrity": "sha1-gcUzqeM9W/tZe05j4s2yW1R3dRU=", + "dev": true, + "requires": { + "@types/selenium-webdriver": "2.53.43", + "selenium-webdriver": "2.53.3" + }, + "dependencies": { + "sax": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-0.6.1.tgz", + "integrity": "sha1-VjsZx8HeiS4Jv8Ty/DDjwn8JUrk=", + "dev": true + }, + "selenium-webdriver": { + "version": "2.53.3", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-2.53.3.tgz", + "integrity": "sha1-0p/1qVff8aG0ncRXdW5OS/vc4IU=", + "dev": true, + "requires": { + "adm-zip": "0.4.4", + "rimraf": "2.6.2", + "tmp": "0.0.24", + "ws": "1.1.5", + "xml2js": "0.4.4" + } + }, + "tmp": { + "version": "0.0.24", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.24.tgz", + "integrity": "sha1-1qXhmNFKmDXMby18PZ4wJCjIzxI=", + "dev": true + }, + "ultron": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", + "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", + "dev": true + }, + "ws": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz", + "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==", + "dev": true, + "requires": { + "options": "0.0.6", + "ultron": "1.0.2" + } + }, + "xml2js": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.4.tgz", + "integrity": "sha1-MREBAAMAiuGSQOuhdJe1fHKcVV0=", + "dev": true, + "requires": { + "sax": "0.6.1", + "xmlbuilder": "8.2.2" + } + } + } + }, + "webpack": { + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.8.3.tgz", + "integrity": "sha512-/hfAjBISycdK597lxONjKEFX7dSIU1PsYwC3XlXUXoykWBlv9QV5HnO+ql3HvrrgfBJ7WXdnjO9iGPR2aAc5sw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.4.3", + "@webassemblyjs/wasm-edit": "1.4.3", + "@webassemblyjs/wasm-parser": "1.4.3", + "acorn": "5.5.3", + "acorn-dynamic-import": "3.0.0", + "ajv": "6.4.0", + "ajv-keywords": "3.2.0", + "chrome-trace-event": "0.1.3", + "enhanced-resolve": "4.0.0", + "eslint-scope": "3.7.1", + "loader-runner": "2.3.0", + "loader-utils": "1.1.0", + "memory-fs": "0.4.1", + "micromatch": "3.1.10", + "mkdirp": "0.5.1", + "neo-async": "2.5.1", + "node-libs-browser": "2.1.0", + "schema-utils": "0.4.5", + "tapable": "1.0.0", + "uglifyjs-webpack-plugin": "1.2.5", + "watchpack": "1.6.0", + "webpack-sources": "1.1.0" + } + }, + "webpack-core": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz", + "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=", + "dev": true, + "requires": { + "source-list-map": "0.1.8", + "source-map": "0.4.4" + }, + "dependencies": { + "source-list-map": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", + "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=", + "dev": true + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": "1.0.1" + } + } + } + }, + "webpack-dev-middleware": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.1.3.tgz", + "integrity": "sha512-I6Mmy/QjWU/kXwCSFGaiOoL5YEQIVmbb0o45xMoCyQAg/mClqZVTcsX327sPfekDyJWpCxb+04whNyLOIxpJdQ==", + "dev": true, + "requires": { + "loud-rejection": "1.6.0", + "memory-fs": "0.4.1", + "mime": "2.3.1", + "path-is-absolute": "1.0.1", + "range-parser": "1.2.0", + "url-join": "4.0.0", + "webpack-log": "1.2.0" + }, + "dependencies": { + "mime": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", + "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==", + "dev": true + } + } + }, + "webpack-dev-server": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.1.4.tgz", + "integrity": "sha512-itcIUDFkHuj1/QQxzUFOEXXmxOj5bku2ScLEsOFPapnq2JRTm58gPdtnBphBJOKL2+M3p6+xygL64bI+3eyzzw==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "array-includes": "3.0.3", + "bonjour": "3.5.0", + "chokidar": "2.0.3", + "compression": "1.7.2", + "connect-history-api-fallback": "1.5.0", + "debug": "3.1.0", + "del": "3.0.0", + "express": "4.16.3", + "html-entities": "1.2.1", + "http-proxy-middleware": "0.18.0", + "import-local": "1.0.0", + "internal-ip": "1.2.0", + "ip": "1.1.5", + "killable": "1.0.0", + "loglevel": "1.6.1", + "opn": "5.3.0", + "portfinder": "1.0.13", + "selfsigned": "1.10.3", + "serve-index": "1.9.1", + "sockjs": "0.3.19", + "sockjs-client": "1.1.4", + "spdy": "3.4.7", + "strip-ansi": "3.0.1", + "supports-color": "5.4.0", + "webpack-dev-middleware": "3.1.3", + "webpack-log": "1.2.0", + "yargs": "11.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "wrap-ansi": "2.1.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "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 + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "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 + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.0.0.tgz", + "integrity": "sha512-Rjp+lMYQOWtgqojx1dEWorjCofi1YN7AoFvYV7b1gx/7dAAeuI4kN5SZiEvr0ZmsZTOpDRcCqrpI10L31tFkBw==", + "dev": true, + "requires": { + "cliui": "4.1.0", + "decamelize": "1.2.0", + "find-up": "2.1.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "9.0.2" + } + }, + "yargs-parser": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", + "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", + "dev": true, + "requires": { + "camelcase": "4.1.0" + } + } + } + }, + "webpack-log": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-1.2.0.tgz", + "integrity": "sha512-U9AnICnu50HXtiqiDxuli5gLB5PGBo7VvcHx36jRZHwK4vzOYLbImqT4lwWwoMHdQWwEKw736fCHEekokTEKHA==", + "dev": true, + "requires": { + "chalk": "2.2.2", + "log-symbols": "2.2.0", + "loglevelnext": "1.0.5", + "uuid": "3.2.1" + } + }, + "webpack-merge": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.2.tgz", + "integrity": "sha512-/0QYwW/H1N/CdXYA2PNPVbsxO3u2Fpz34vs72xm03SRfg6bMNGfMJIQEpQjKRvkG2JvT6oRJFpDtSrwbX8Jzvw==", + "dev": true, + "requires": { + "lodash": "4.17.10" + } + }, + "webpack-sources": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", + "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", + "dev": true, + "requires": { + "source-list-map": "2.0.0", + "source-map": "0.6.1" + }, + "dependencies": { + "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 + } + } + }, + "webpack-subresource-integrity": { + "version": "1.1.0-rc.4", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.1.0-rc.4.tgz", + "integrity": "sha1-xcTj1pD50vZKlVDgeodn+Xlqpdg=", + "dev": true, + "requires": { + "webpack-core": "0.6.9" + } + }, + "websocket-driver": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", + "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", + "dev": true, + "requires": { + "http-parser-js": "0.4.12", + "websocket-extensions": "0.1.3" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", + "dev": true + }, + "when": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/when/-/when-3.6.4.tgz", + "integrity": "sha1-RztRfsFZ4rhQBUl6E5g/CVQS404=", + "dev": true + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "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, + "optional": true + }, + "wide-align": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", + "dev": true, + "requires": { + "string-width": "1.0.2" + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true + }, + "with": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/with/-/with-5.1.1.tgz", + "integrity": "sha1-+k2qktrzLE6pTtRTyB8EaGtXXf4=", + "dev": true, + "requires": { + "acorn": "3.3.0", + "acorn-globals": "3.1.0" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + } + } + }, + "with-callback": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/with-callback/-/with-callback-1.0.2.tgz", + "integrity": "sha1-oJYpuakgAo1yFAT7Q1vc/1yRvCE=", + "dev": true, + "optional": true + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "worker-farm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", + "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", + "dev": true, + "requires": { + "errno": "0.1.7" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "requires": { + "mkdirp": "0.5.1" + } + }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dev": true, + "requires": { + "async-limiter": "1.0.0", + "safe-buffer": "5.1.2", + "ultron": "1.1.1" + } + }, + "x-is-string": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz", + "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=", + "dev": true + }, + "xml": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.0.tgz", + "integrity": "sha1-3j7pEkd74vJQtg9hLzSoxNphbv4=", + "dev": true + }, + "xml2js": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "dev": true, + "requires": { + "sax": "1.2.4", + "xmlbuilder": "9.0.7" + }, + "dependencies": { + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "dev": true + } + } + }, + "xmlbuilder": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz", + "integrity": "sha1-aSSGc0ELS6QuGmE2VR0pIjNap3M=", + "dev": true + }, + "xmlhttprequest-ssl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", + "dev": true + }, + "xregexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", + "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=", + "dev": true, + "optional": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "xxhashjs": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz", + "integrity": "sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==", + "dev": true, + "requires": { + "cuint": "0.2.2" + } + }, + "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": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + }, + "yargs-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", + "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "dev": true, + "optional": true, + "requires": { + "camelcase": "3.0.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, + "optional": true + } + } + }, + "yauzl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", + "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", + "dev": true, + "requires": { + "fd-slicer": "1.0.1" + } + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "dev": true + }, + "yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "dev": true + }, + "zone.js": { + "version": "0.8.26", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.26.tgz", + "integrity": "sha512-W9Nj+UmBJG251wkCacIkETgra4QgBo/vgoEkb4a2uoLzpQG7qF9nzwoLXWU5xj3Fg2mxGvEDh47mg24vXccYjA==" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 000000000..b712e18a7 --- /dev/null +++ b/package.json @@ -0,0 +1,75 @@ +{ + "name": "ng-x-rocket", + "version": "1.0.0", + "private": true, + "scripts": { + "ng": "ng", + "build": "npm run env -s && ng build --prod", + "start": "npm run env -s && ng serve --aot --proxy-config proxy.conf.js", + "serve:sw": "npm run build -s && npx http-server ./dist -p 4200", + "lint": "ng lint && stylelint \"src/**/*.scss\" --syntax scss && htmlhint \"src\" --config .htmlhintrc", + "test": "npm run env -s && ng test", + "test:ci": "npm run env -s && npm run lint -s && ng test --code-coverage --watch=false", + "e2e": "npm run env -s && ng e2e", + "translations:extract": "ngx-translate-extract --input ./src --output ./src/translations/template.json --format=json --clean -sort --marker extract", + "docs": "hads ./docs -o", + "env": "ngx-scripts env npm_package_version", + "generate": "ng generate" + }, + "dependencies": { + "@angular/animations": "^6.0.3", + "@angular/cdk": "^6.1.0", + "@angular/common": "^6.0.1", + "@angular/compiler": "^6.0.1", + "@angular/core": "^6.0.1", + "@angular/forms": "^6.0.1", + "@angular/http": "^6.0.1", + "@angular/material": "^6.1.0", + "@angular/platform-browser": "^6.0.1", + "@angular/platform-browser-dynamic": "^6.0.1", + "@angular/router": "^6.0.1", + "@angular/service-worker": "^6.0.1", + "@fortawesome/fontawesome-free-webfonts": "^1.0.9", + "@ng-bootstrap/ng-bootstrap": "^2.0.0", + "@ngx-translate/core": "^10.0.1", + "bootstrap": "^4.1.1", + "core-js": "^2.5.6", + "hammerjs": "^2.0.8", + "lodash": "^4.17.10", + "rxjs": "^6.1.0", + "zone.js": "^0.8.26" + }, + "devDependencies": { + "@angular/cli": "~6.0.1", + "@angular/compiler-cli": "^6.0.1", + "@angular/language-service": "^6.0.1", + "@angular-devkit/build-angular": "~0.6.0", + "@biesbjerg/ngx-translate-extract": "^2.3.4", + "@ngx-rocket/scripts": "^2.1.0", + "@types/jasmine": "^2.8.7", + "@types/jasminewd2": "^2.0.2", + "@types/lodash": "^4.14.108", + "@types/node": "^8.10.13", + "codelyzer": "^4.3.0", + "hads": "^1.3.4", + "htmlhint": "^0.9.13", + "https-proxy-agent": "^2.0.0", + "jasmine-core": "~2.99.1", + "jasmine-spec-reporter": "^4.1.0", + "karma": "~2.0.0", + "karma-chrome-launcher": "^2.2.0", + "karma-cli": "~1.0.1", + "karma-coverage-istanbul-reporter": "^1.2.1", + "karma-jasmine": "^1.1.2", + "karma-junit-reporter": "^1.2.0", + "protractor": "~5.3.0", + "puppeteer": "^1.4.0", + "stylelint": "~9.2.0", + "stylelint-config-recommended-scss": "~3.2.0", + "stylelint-config-standard": "~18.2.0", + "stylelint-scss": "~3.1.0", + "ts-node": "~6.0.3", + "tslint": "~5.10.0", + "typescript": "~2.7.2" + } +} diff --git a/proxy.conf.js b/proxy.conf.js new file mode 100644 index 000000000..bdb7fe319 --- /dev/null +++ b/proxy.conf.js @@ -0,0 +1,41 @@ +'use strict'; + +const HttpsProxyAgent = require('https-proxy-agent'); + +/* + * API proxy configuration. + * This allows you to proxy HTTP request like `http.get('/api/stuff')` to another server/port. + * This is especially useful during app development to avoid CORS issues while running a local server. + * For more details and options, see https://github.com/angular/angular-cli#proxy-to-backend + */ +const proxyConfig = [ + { + context: '/api', + pathRewrite: { '^/api': '' }, + target: 'https://api.chucknorris.io', + changeOrigin: true, + secure: false + } +]; + +/* + * Configures a corporate proxy agent for the API proxy if needed. + */ +function setupForCorporateProxy(proxyConfig) { + if (!Array.isArray(proxyConfig)) { + proxyConfig = [proxyConfig]; + } + + const proxyServer = process.env.http_proxy || process.env.HTTP_PROXY; + let agent = null; + + if (proxyServer) { + console.log(`Using corporate proxy server: ${proxyServer}`); + agent = new HttpsProxyAgent(proxyServer); + proxyConfig.forEach(entry => { entry.agent = agent; }); + } + + return proxyConfig; +} + +module.exports = setupForCorporateProxy(proxyConfig); diff --git a/src/app/about/about-routing.module.ts b/src/app/about/about-routing.module.ts new file mode 100644 index 000000000..5cf7a3aa0 --- /dev/null +++ b/src/app/about/about-routing.module.ts @@ -0,0 +1,18 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; + +import { Route, extract } from '@app/core'; +import { AboutComponent } from './about.component'; + +const routes: Routes = [ + Route.withShell([ + { path: 'about', component: AboutComponent, data: { title: extract('About') } } + ]) +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], + providers: [] +}) +export class AboutRoutingModule { } diff --git a/src/app/about/about.component.html b/src/app/about/about.component.html new file mode 100644 index 000000000..d3f478a3d --- /dev/null +++ b/src/app/about/about.component.html @@ -0,0 +1,10 @@ +
+
+

+ APP_NAME +

+

+ Version {{version}} +

+
+
diff --git a/src/app/about/about.component.scss b/src/app/about/about.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/about/about.component.spec.ts b/src/app/about/about.component.spec.ts new file mode 100644 index 000000000..3ef7c8d6c --- /dev/null +++ b/src/app/about/about.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { AboutComponent } from './about.component'; + +describe('AboutComponent', () => { + let component: AboutComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [AboutComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(AboutComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/about/about.component.ts b/src/app/about/about.component.ts new file mode 100644 index 000000000..9bf8421f8 --- /dev/null +++ b/src/app/about/about.component.ts @@ -0,0 +1,18 @@ +import { Component, OnInit } from '@angular/core'; + +import { environment } from '@env/environment'; + +@Component({ + selector: 'app-about', + templateUrl: './about.component.html', + styleUrls: ['./about.component.scss'] +}) +export class AboutComponent implements OnInit { + + version: string = environment.version; + + constructor() { } + + ngOnInit() { } + +} diff --git a/src/app/about/about.module.ts b/src/app/about/about.module.ts new file mode 100644 index 000000000..cf6d2119f --- /dev/null +++ b/src/app/about/about.module.ts @@ -0,0 +1,18 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { TranslateModule } from '@ngx-translate/core'; + +import { AboutRoutingModule } from './about-routing.module'; +import { AboutComponent } from './about.component'; + +@NgModule({ + imports: [ + CommonModule, + TranslateModule, + AboutRoutingModule + ], + declarations: [ + AboutComponent + ] +}) +export class AboutModule { } diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts new file mode 100644 index 000000000..3f07b6a0e --- /dev/null +++ b/src/app/app-routing.module.ts @@ -0,0 +1,14 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; + +const routes: Routes = [ + // Fallback when no prior route is matched +{ path: '**', redirectTo: '', pathMatch: 'full' }, +]; + +@NgModule({ + imports: [RouterModule.forRoot(routes)], + exports: [RouterModule], + providers: [] +}) +export class AppRoutingModule { } diff --git a/src/app/app.component.html b/src/app/app.component.html new file mode 100644 index 000000000..0680b43f9 --- /dev/null +++ b/src/app/app.component.html @@ -0,0 +1 @@ + diff --git a/src/app/app.component.scss b/src/app/app.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts new file mode 100644 index 000000000..64ded582e --- /dev/null +++ b/src/app/app.component.spec.ts @@ -0,0 +1,27 @@ +import { TestBed, async } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; +import { TranslateModule } from '@ngx-translate/core'; + +import { CoreModule } from '@app/core'; +import { AppComponent } from './app.component'; + +describe('AppComponent', () => { + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [ + RouterTestingModule, + TranslateModule.forRoot(), + CoreModule + ], + declarations: [AppComponent], + providers: [] + }); + TestBed.compileComponents(); + })); + + it('should create the app', async(() => { + const fixture = TestBed.createComponent(AppComponent); + const app = fixture.debugElement.componentInstance; + expect(app).toBeTruthy(); + })); +}); diff --git a/src/app/app.component.ts b/src/app/app.component.ts new file mode 100644 index 000000000..a59bbf826 --- /dev/null +++ b/src/app/app.component.ts @@ -0,0 +1,61 @@ +import { Component, OnInit } from '@angular/core'; +import { Router, NavigationEnd, ActivatedRoute } from '@angular/router'; +import { Title } from '@angular/platform-browser'; +import { TranslateService } from '@ngx-translate/core'; +import { merge } from 'rxjs'; +import { filter, map, mergeMap } from 'rxjs/operators'; + +import { environment } from '@env/environment'; +import { Logger, I18nService } from '@app/core'; + +const log = new Logger('App'); + +@Component({ + selector: 'app-root', + templateUrl: './app.component.html', + styleUrls: ['./app.component.scss'] +}) +export class AppComponent implements OnInit { + + constructor(private router: Router, + private activatedRoute: ActivatedRoute, + private titleService: Title, + private translateService: TranslateService, + private i18nService: I18nService) { } + + ngOnInit() { + // Setup logger + if (environment.production) { + Logger.enableProductionMode(); + } + + log.debug('init'); + + + // Setup translations + this.i18nService.init(environment.defaultLanguage, environment.supportedLanguages); + + const onNavigationEnd = this.router.events.pipe(filter(event => event instanceof NavigationEnd)); + + // Change page title on navigation or language change, based on route data + merge(this.translateService.onLangChange, onNavigationEnd) + .pipe( + map(() => { + let route = this.activatedRoute; + while (route.firstChild) { + route = route.firstChild; + } + return route; + }), + filter(route => route.outlet === 'primary'), + mergeMap(route => route.data) + ) + .subscribe(event => { + const title = event['title']; + if (title) { + this.titleService.setTitle(this.translateService.instant(title)); + } + }); + } + +} diff --git a/src/app/app.module.ts b/src/app/app.module.ts new file mode 100644 index 000000000..f10ebbfdb --- /dev/null +++ b/src/app/app.module.ts @@ -0,0 +1,40 @@ +import { BrowserModule } from '@angular/platform-browser'; +import { NgModule } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { HttpClientModule } from '@angular/common/http'; +import { ServiceWorkerModule } from '@angular/service-worker'; +import { TranslateModule } from '@ngx-translate/core'; +import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; + +import { environment } from '@env/environment'; +import { CoreModule } from '@app/core'; +import { SharedModule } from '@app/shared'; +import { HomeModule } from './home/home.module'; +import { AboutModule } from './about/about.module'; +import { ClientsModule} from './clients/clients.module' +import { LoginModule } from './login/login.module'; +import { AppComponent } from './app.component'; +import { AppRoutingModule } from './app-routing.module'; + +@NgModule({ + imports: [ + BrowserModule, + ServiceWorkerModule.register('./ngsw-worker.js', { enabled: environment.production }), + FormsModule, + HttpClientModule, + TranslateModule.forRoot(), + NgbModule.forRoot(), + CoreModule, + SharedModule, + HomeModule, + AboutModule, + ClientsModule, + LoginModule, + AppRoutingModule + ], + declarations: [AppComponent,], + providers: [ + ], + bootstrap: [AppComponent] +}) +export class AppModule { } diff --git a/src/app/clients/clients-routing.module.ts b/src/app/clients/clients-routing.module.ts new file mode 100644 index 000000000..7a90a477b --- /dev/null +++ b/src/app/clients/clients-routing.module.ts @@ -0,0 +1,16 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; + +import { extract } from '@app/core'; +import { ClientsComponent } from './clients.component'; + +const routes: Routes = [ + { path: 'clients', component: ClientsComponent } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], + providers: [] +}) +export class ClientsRoutingModule { } diff --git a/src/app/clients/clients.component.html b/src/app/clients/clients.component.html new file mode 100644 index 000000000..3398ad6e5 --- /dev/null +++ b/src/app/clients/clients.component.html @@ -0,0 +1,4 @@ + +

+ clients works! +

diff --git a/src/app/clients/clients.component.scss b/src/app/clients/clients.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/clients/clients.component.ts b/src/app/clients/clients.component.ts new file mode 100644 index 000000000..1f31beda7 --- /dev/null +++ b/src/app/clients/clients.component.ts @@ -0,0 +1,18 @@ +import { Component, OnInit } from '@angular/core'; +import { environment } from '@env/environment'; + +import { HeaderComponent } from '../core/shell/header/header.component'; + +@Component({ + selector: 'app-clients', + templateUrl: './clients.component.html', + styleUrls: ['./clients.component.scss'] +}) +export class ClientsComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/app/clients/clients.module.ts b/src/app/clients/clients.module.ts new file mode 100644 index 000000000..4fe220c44 --- /dev/null +++ b/src/app/clients/clients.module.ts @@ -0,0 +1,23 @@ +import { NgModule,CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +import { ClientsComponent } from './clients.component'; +import { ClientsRoutingModule } from './clients-routing.module'; +import { CoreModule } from '../core/core.module'; + +@NgModule({ + imports: [ + CoreModule, + CommonModule, + ClientsRoutingModule, + + ], + declarations: [ + ClientsComponent + ], + schemas: [ + CUSTOM_ELEMENTS_SCHEMA +], + +}) +export class ClientsModule { } diff --git a/src/app/core/authentication/authentication.guard.spec.ts b/src/app/core/authentication/authentication.guard.spec.ts new file mode 100644 index 000000000..16a9734e9 --- /dev/null +++ b/src/app/core/authentication/authentication.guard.spec.ts @@ -0,0 +1,55 @@ +import { TestBed, inject } from '@angular/core/testing'; +import { Router } from '@angular/router'; + +import { AuthenticationService } from './authentication.service'; +import { MockAuthenticationService } from './authentication.service.mock'; +import { AuthenticationGuard } from './authentication.guard'; + +describe('AuthenticationGuard', () => { + let authenticationGuard: AuthenticationGuard; + let authenticationService: MockAuthenticationService; + let mockRouter: any; + + beforeEach(() => { + mockRouter = { + navigate: jasmine.createSpy('navigate') + }; + TestBed.configureTestingModule({ + providers: [ + AuthenticationGuard, + { provide: AuthenticationService, useClass: MockAuthenticationService }, + { provide: Router, useValue: mockRouter }, + ] + }); + }); + + beforeEach(inject([ + AuthenticationGuard, + AuthenticationService + ], (_authenticationGuard: AuthenticationGuard, + _authenticationService: MockAuthenticationService) => { + + authenticationGuard = _authenticationGuard; + authenticationService = _authenticationService; + })); + + it('should have a canActivate method', () => { + expect(typeof authenticationGuard.canActivate).toBe('function'); + }); + + it('should return true if user is authenticated', () => { + expect(authenticationGuard.canActivate()).toBe(true); + }); + + it('should return false and redirect to login if user is not authenticated', () => { + // Arrange + authenticationService.credentials = null; + + // Act + const result = authenticationGuard.canActivate(); + + // Assert + expect(mockRouter.navigate).toHaveBeenCalledWith(['/login'], {replaceUrl: true}); + expect(result).toBe(false); + }); +}); diff --git a/src/app/core/authentication/authentication.guard.ts b/src/app/core/authentication/authentication.guard.ts new file mode 100644 index 000000000..3c8f85051 --- /dev/null +++ b/src/app/core/authentication/authentication.guard.ts @@ -0,0 +1,25 @@ +import { Injectable } from '@angular/core'; +import { Router, CanActivate } from '@angular/router'; + +import { Logger } from '../logger.service'; +import { AuthenticationService } from './authentication.service'; + +const log = new Logger('AuthenticationGuard'); + +@Injectable() +export class AuthenticationGuard implements CanActivate { + + constructor(private router: Router, + private authenticationService: AuthenticationService) { } + + canActivate(): boolean { + if (this.authenticationService.isAuthenticated()) { + return true; + } + + log.debug('Not authenticated, redirecting...'); + this.router.navigate(['/login'], { replaceUrl: true }); + return false; + } + +} diff --git a/src/app/core/authentication/authentication.service.mock.ts b/src/app/core/authentication/authentication.service.mock.ts new file mode 100644 index 000000000..e8c2d0e24 --- /dev/null +++ b/src/app/core/authentication/authentication.service.mock.ts @@ -0,0 +1,28 @@ +import { Observable, of } from 'rxjs'; + +import { Credentials, LoginContext } from './authentication.service'; + +export class MockAuthenticationService { + + credentials: Credentials | null = { + username: 'test', + token: '123' + }; + + login(context: LoginContext): Observable { + return of({ + username: context.username, + token: '123456' + }); + } + + logout(): Observable { + this.credentials = null; + return of(true); + } + + isAuthenticated(): boolean { + return !!this.credentials; + } + +} diff --git a/src/app/core/authentication/authentication.service.spec.ts b/src/app/core/authentication/authentication.service.spec.ts new file mode 100644 index 000000000..9d5cfc1ae --- /dev/null +++ b/src/app/core/authentication/authentication.service.spec.ts @@ -0,0 +1,144 @@ +import { TestBed, inject, fakeAsync, tick } from '@angular/core/testing'; + +import { AuthenticationService, Credentials} from './authentication.service'; + +const credentialsKey = 'credentials'; + +describe('AuthenticationService', () => { + let authenticationService: AuthenticationService; + + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [AuthenticationService] + }); + }); + + beforeEach(inject([ + AuthenticationService + ], (_authenticationService: AuthenticationService) => { + authenticationService = _authenticationService; + })); + + afterEach(() => { + // Cleanup + localStorage.removeItem(credentialsKey); + sessionStorage.removeItem(credentialsKey); + }); + + describe('login', () => { + it('should return credentials', fakeAsync(() => { + // Act + const request = authenticationService.login({ + username: 'toto', + password: '123' + }); + tick(); + + // Assert + request.subscribe(credentials => { + expect(credentials).toBeDefined(); + expect(credentials.token).toBeDefined(); + }); + })); + + it('should authenticate user', fakeAsync(() => { + expect(authenticationService.isAuthenticated()).toBe(false); + + // Act + const request = authenticationService.login({ + username: 'toto', + password: '123' + }); + tick(); + + // Assert + request.subscribe(() => { + expect(authenticationService.isAuthenticated()).toBe(true); + expect(authenticationService.credentials).toBeDefined(); + expect(authenticationService.credentials).not.toBeNull(); + expect((authenticationService.credentials).token).toBeDefined(); + expect((authenticationService.credentials).token).not.toBeNull(); + }); + })); + + it('should persist credentials for the session', fakeAsync(() => { + // Act + const request = authenticationService.login({ + username: 'toto', + password: '123' + }); + tick(); + + // Assert + request.subscribe(() => { + expect(sessionStorage.getItem(credentialsKey)).not.toBeNull(); + }); + })); + + it('should persist credentials across sessions', fakeAsync(() => { + // Act + const request = authenticationService.login({ + username: 'toto', + password: '123', + remember: true + }); + tick(); + + // Assert + request.subscribe(() => { + expect(localStorage.getItem(credentialsKey)).not.toBeNull(); + }); + })); + }); + + describe('logout', () => { + it('should clear user authentication', fakeAsync(() => { + // Arrange + const loginRequest = authenticationService.login({ + username: 'toto', + password: '123' + }); + tick(); + + // Assert + loginRequest.subscribe(() => { + expect(authenticationService.isAuthenticated()).toBe(true); + + const request = authenticationService.logout(); + tick(); + + request.subscribe(() => { + expect(authenticationService.isAuthenticated()).toBe(false); + expect(authenticationService.credentials).toBeNull(); + expect(sessionStorage.getItem(credentialsKey)).toBeNull(); + expect(localStorage.getItem(credentialsKey)).toBeNull(); + }); + }); + })); + + it('should clear persisted user authentication', fakeAsync(() => { + // Arrange + const loginRequest = authenticationService.login({ + username: 'toto', + password: '123', + remember: true + }); + tick(); + + // Assert + loginRequest.subscribe(() => { + expect(authenticationService.isAuthenticated()).toBe(true); + + const request = authenticationService.logout(); + tick(); + + request.subscribe(() => { + expect(authenticationService.isAuthenticated()).toBe(false); + expect(authenticationService.credentials).toBeNull(); + expect(sessionStorage.getItem(credentialsKey)).toBeNull(); + expect(localStorage.getItem(credentialsKey)).toBeNull(); + }); + }); + })); + }); +}); diff --git a/src/app/core/authentication/authentication.service.ts b/src/app/core/authentication/authentication.service.ts new file mode 100644 index 000000000..59ccda88c --- /dev/null +++ b/src/app/core/authentication/authentication.service.ts @@ -0,0 +1,94 @@ +import { Injectable } from '@angular/core'; +import { Observable, of } from 'rxjs'; + +export interface Credentials { + // Customize received credentials here + username: string; + token: string; +} + +export interface LoginContext { + username: string; + password: string; + remember?: boolean; +} + +const credentialsKey = 'credentials'; + +/** + * Provides a base for authentication workflow. + * The Credentials interface as well as login/logout methods should be replaced with proper implementation. + */ +@Injectable() +export class AuthenticationService { + + private _credentials: Credentials | null; + + constructor() { + const savedCredentials = sessionStorage.getItem(credentialsKey) || localStorage.getItem(credentialsKey); + if (savedCredentials) { + this._credentials = JSON.parse(savedCredentials); + } + } + + /** + * Authenticates the user. + * @param {LoginContext} context The login parameters. + * @return {Observable} The user credentials. + */ + login(context: LoginContext): Observable { + // Replace by proper authentication call + const data = { + username: context.username, + token: '123456' + }; + this.setCredentials(data, context.remember); + return of(data); + } + + /** + * Logs out the user and clear credentials. + * @return {Observable} True if the user was logged out successfully. + */ + logout(): Observable { + // Customize credentials invalidation here + this.setCredentials(); + return of(true); + } + + /** + * Checks is the user is authenticated. + * @return {boolean} True if the user is authenticated. + */ + isAuthenticated(): boolean { + return !!this.credentials; + } + + /** + * Gets the user credentials. + * @return {Credentials} The user credentials or null if the user is not authenticated. + */ + get credentials(): Credentials | null { + return this._credentials; + } + + /** + * Sets the user credentials. + * The credentials may be persisted across sessions by setting the `remember` parameter to true. + * Otherwise, the credentials are only persisted for the current session. + * @param {Credentials=} credentials The user credentials. + * @param {boolean=} remember True to remember credentials across sessions. + */ + private setCredentials(credentials?: Credentials, remember?: boolean) { + this._credentials = credentials || null; + + if (credentials) { + const storage = remember ? localStorage : sessionStorage; + storage.setItem(credentialsKey, JSON.stringify(credentials)); + } else { + sessionStorage.removeItem(credentialsKey); + localStorage.removeItem(credentialsKey); + } + } + +} diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts new file mode 100644 index 000000000..c4f32c171 --- /dev/null +++ b/src/app/core/core.module.ts @@ -0,0 +1,63 @@ +import { NgModule, Optional, SkipSelf } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { HTTP_INTERCEPTORS, HttpClient, HttpClientModule } from '@angular/common/http'; +import { RouteReuseStrategy, RouterModule } from '@angular/router'; +import { TranslateModule } from '@ngx-translate/core'; +import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; + +import { ShellComponent } from './shell/shell.component'; +import { HeaderComponent } from './shell/header/header.component'; +import { RouteReusableStrategy } from './route-reusable-strategy'; +import { AuthenticationService } from './authentication/authentication.service'; +import { AuthenticationGuard } from './authentication/authentication.guard'; +import { I18nService } from './i18n.service'; +import { HttpService } from './http/http.service'; +import { HttpCacheService } from './http/http-cache.service'; +import { ApiPrefixInterceptor } from './http/api-prefix.interceptor'; +import { ErrorHandlerInterceptor } from './http/error-handler.interceptor'; +import { CacheInterceptor } from './http/cache.interceptor'; + +@NgModule({ + imports: [ + CommonModule, + HttpClientModule, + TranslateModule, + NgbModule, + RouterModule + ], + + declarations: [ + HeaderComponent, + ShellComponent + ], + exports: [ + HeaderComponent], + + providers: [ + AuthenticationService, + AuthenticationGuard, + I18nService, + HttpCacheService, + ApiPrefixInterceptor, + ErrorHandlerInterceptor, + CacheInterceptor, + { + provide: HttpClient, + useClass: HttpService + }, + { + provide: RouteReuseStrategy, + useClass: RouteReusableStrategy + } + ] +}) +export class CoreModule { + + constructor(@Optional() @SkipSelf() parentModule: CoreModule) { + // Import guard + if (parentModule) { + throw new Error(`${parentModule} has already been loaded. Import Core module in the AppModule only.`); + } + } + +} diff --git a/src/app/core/http/api-prefix.interceptor.spec.ts b/src/app/core/http/api-prefix.interceptor.spec.ts new file mode 100644 index 000000000..dd3175e81 --- /dev/null +++ b/src/app/core/http/api-prefix.interceptor.spec.ts @@ -0,0 +1,44 @@ +import { TestBed, inject } from '@angular/core/testing'; +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; +import { HTTP_INTERCEPTORS, HttpClient } from '@angular/common/http'; + +import { environment } from '@env/environment'; +import { ApiPrefixInterceptor } from './api-prefix.interceptor'; + +describe('ApiPrefixInterceptor', () => { + let http: HttpClient; + let httpMock: HttpTestingController; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [{ + provide: HTTP_INTERCEPTORS, + useClass: ApiPrefixInterceptor, + multi: true + }] + }); + }); + + beforeEach(inject([ + HttpClient, + HttpTestingController + ], (_http: HttpClient, + _httpMock: HttpTestingController) => { + + http = _http; + httpMock = _httpMock; + })); + + afterEach(() => { + httpMock.verify(); + }); + + it('should prepend environment.serverUrl to the request url', () => { + // Act + http.get('/toto').subscribe(); + + // Assert + httpMock.expectOne({ url: environment.serverUrl + '/toto' }); + }); +}); diff --git a/src/app/core/http/api-prefix.interceptor.ts b/src/app/core/http/api-prefix.interceptor.ts new file mode 100644 index 000000000..8b3499904 --- /dev/null +++ b/src/app/core/http/api-prefix.interceptor.ts @@ -0,0 +1,18 @@ +import { Injectable } from '@angular/core'; +import { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest } from '@angular/common/http'; +import { Observable } from 'rxjs'; + +import { environment } from '@env/environment'; + +/** + * Prefixes all requests with `environment.serverUrl`. + */ +@Injectable() +export class ApiPrefixInterceptor implements HttpInterceptor { + + intercept(request: HttpRequest, next: HttpHandler): Observable> { + request = request.clone({ url: environment.serverUrl + request.url }); + return next.handle(request); + } + +} diff --git a/src/app/core/http/cache.interceptor.spec.ts b/src/app/core/http/cache.interceptor.spec.ts new file mode 100644 index 000000000..bad72ddca --- /dev/null +++ b/src/app/core/http/cache.interceptor.spec.ts @@ -0,0 +1,135 @@ +import { TestBed, inject } from '@angular/core/testing'; +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; +import { HTTP_INTERCEPTORS, HttpClient, HttpResponse } from '@angular/common/http'; + +import { CacheInterceptor } from './cache.interceptor'; +import { HttpCacheService } from './http-cache.service'; + +describe('CacheInterceptor', () => { + let interceptorOptions: Object | null = {}; + let httpCacheService: HttpCacheService; + let cacheInterceptor: CacheInterceptor; + let http: HttpClient; + let httpMock: HttpTestingController; + + function createInterceptor(_httpCacheService: HttpCacheService) { + cacheInterceptor = new CacheInterceptor(_httpCacheService).configure(interceptorOptions); + return cacheInterceptor; + } + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [ + HttpCacheService, + { + provide: HTTP_INTERCEPTORS, + useFactory: createInterceptor, + deps: [HttpCacheService], + multi: true + } + ] + }); + }); + + afterEach(() => { + httpCacheService.cleanCache(); + httpMock.verify(); + }); + + describe('with default configuration', () => { + beforeEach(() => { + interceptorOptions = null; + }); + + beforeEach(inject([ + HttpClient, + HttpTestingController, + HttpCacheService + ], (_http: HttpClient, + _httpMock: HttpTestingController, + _httpCacheService: HttpCacheService) => { + + http = _http; + httpMock = _httpMock; + httpCacheService = _httpCacheService; + })); + + it('should cache the request', () => { + // Act + http.get('/toto').subscribe(() => { + // Assert + const cachedData = httpCacheService.getCacheData('/toto'); + expect(cachedData).toBeDefined(); + expect(cachedData ? cachedData.body : null).toEqual('someData'); + }); + + httpMock.expectOne({ url: '/toto' }).flush('someData'); + }); + + it('should respond from the cache', () => { + // Arrange + httpCacheService.setCacheData('/toto', new HttpResponse({ body: 'cachedData' })); + + // Act + http.get('/toto').subscribe(response => { + // Assert + expect(response).toEqual('cachedData'); + }); + + httpMock.expectNone({ url: '/toto' }); + }); + + it('should not cache the request in case of error', () => { + // Act + http.get('/toto').subscribe(() => {}, () => { + // Assert + expect(httpCacheService.getCacheData('/toto')).toBeNull(); + }); + + httpMock.expectOne({}).flush(null, { + status: 404, + statusText: 'error' + }); + }); + }); + + describe('with update forced configuration', () => { + beforeEach(() => { + interceptorOptions = { update: true }; + }); + + beforeEach(inject([ + HttpClient, + HttpTestingController, + HttpCacheService + ], (_http: HttpClient, + _httpMock: HttpTestingController, + _httpCacheService: HttpCacheService) => { + + http = _http; + httpMock = _httpMock; + httpCacheService = _httpCacheService; + })); + + afterEach(() => { + httpCacheService.cleanCache(); + httpMock.verify(); + }); + + it('should force cache update', () => { + // Arrange + httpCacheService.setCacheData('/toto', new HttpResponse({ body: 'oldCachedData' })); + cacheInterceptor.configure({ update: true }); + + // Act + http.get('/toto').subscribe(response => { + // Assert + expect(response).toEqual('newData'); + + }); + + httpMock.expectOne({ url: '/toto' }).flush('newData'); + }); + }); +}); diff --git a/src/app/core/http/cache.interceptor.ts b/src/app/core/http/cache.interceptor.ts new file mode 100644 index 000000000..3a077a05d --- /dev/null +++ b/src/app/core/http/cache.interceptor.ts @@ -0,0 +1,58 @@ +import { Injectable } from '@angular/core'; +import { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest, HttpResponse } from '@angular/common/http'; +import { Observable, Subscriber } from 'rxjs'; + +import { HttpCacheService } from './http-cache.service'; + +/** + * Caches HTTP requests. + * Use ExtendedHttpClient fluent API to configure caching for each request. + */ +@Injectable() +export class CacheInterceptor implements HttpInterceptor { + + private forceUpdate = false; + + constructor(private httpCacheService: HttpCacheService) { } + + /** + * Configures interceptor options + * @param {{update: boolean}} options If update option is enabled, forces request to be made and updates cache entry. + * @return {CacheInterceptor} The configured instance. + */ + configure(options?: { update?: boolean } | null): CacheInterceptor { + const instance = new CacheInterceptor(this.httpCacheService); + if (options && options.update) { + instance.forceUpdate = true; + } + return instance; + } + + intercept(request: HttpRequest, next: HttpHandler): Observable> { + if (request.method !== 'GET') { + return next.handle(request); + } + + return new Observable((subscriber: Subscriber>) => { + const cachedData = this.forceUpdate ? null : this.httpCacheService.getCacheData(request.urlWithParams); + if (cachedData !== null) { + // Create new response to avoid side-effects + subscriber.next(new HttpResponse(cachedData as Object)); + subscriber.complete(); + } else { + next.handle(request) + .subscribe( + event => { + if (event instanceof HttpResponse) { + this.httpCacheService.setCacheData(request.urlWithParams, event); + } + subscriber.next(event); + }, + error => subscriber.error(error), + () => subscriber.complete() + ); + } + }); + } + +} diff --git a/src/app/core/http/error-handler.interceptor.spec.ts b/src/app/core/http/error-handler.interceptor.spec.ts new file mode 100644 index 000000000..8bdd53d32 --- /dev/null +++ b/src/app/core/http/error-handler.interceptor.spec.ts @@ -0,0 +1,59 @@ +import { TestBed, inject } from '@angular/core/testing'; +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; +import { HTTP_INTERCEPTORS, HttpClient } from '@angular/common/http'; + +import { ErrorHandlerInterceptor } from './error-handler.interceptor'; + +describe('ErrorHandlerInterceptor', () => { + let errorHandlerInterceptor: ErrorHandlerInterceptor; + let http: HttpClient; + let httpMock: HttpTestingController; + + function createInterceptor() { + errorHandlerInterceptor = new ErrorHandlerInterceptor(); + return errorHandlerInterceptor; + } + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [{ + provide: HTTP_INTERCEPTORS, + useFactory: createInterceptor, + multi: true + }] + }); + }); + + beforeEach(inject([ + HttpClient, + HttpTestingController + ], (_http: HttpClient, + _httpMock: HttpTestingController) => { + + http = _http; + httpMock = _httpMock; + })); + + afterEach(() => { + httpMock.verify(); + }); + + it('should catch error and call error handler', () => { + // Arrange + // Note: here we spy on private method since target is customization here, + // but you should replace it by actual behavior in your app + spyOn(ErrorHandlerInterceptor.prototype as any, 'errorHandler').and.callThrough(); + + // Act + http.get('/toto').subscribe(() => fail('should error'), () => { + // Assert + expect(ErrorHandlerInterceptor.prototype['errorHandler']).toHaveBeenCalled(); + }); + + httpMock.expectOne({}).flush(null, { + status: 404, + statusText: 'error' + }); + }); +}); diff --git a/src/app/core/http/error-handler.interceptor.ts b/src/app/core/http/error-handler.interceptor.ts new file mode 100644 index 000000000..252722338 --- /dev/null +++ b/src/app/core/http/error-handler.interceptor.ts @@ -0,0 +1,30 @@ +import { Injectable } from '@angular/core'; +import { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest } from '@angular/common/http'; +import { Observable } from 'rxjs'; +import { catchError } from 'rxjs/operators'; + +import { environment } from '@env/environment'; +import { Logger } from '../logger.service'; + +const log = new Logger('ErrorHandlerInterceptor'); + +/** + * Adds a default error handler to all requests. + */ +@Injectable() +export class ErrorHandlerInterceptor implements HttpInterceptor { + + intercept(request: HttpRequest, next: HttpHandler): Observable> { + return next.handle(request).pipe(catchError(error => this.errorHandler(error))); + } + + // Customize the default error handler here if needed + private errorHandler(response: HttpEvent): Observable> { + if (!environment.production) { + // Do something with the error + log.error('Request error', response); + } + throw response; + } + +} diff --git a/src/app/core/http/http-cache.service.spec.ts b/src/app/core/http/http-cache.service.spec.ts new file mode 100644 index 000000000..ff374f699 --- /dev/null +++ b/src/app/core/http/http-cache.service.spec.ts @@ -0,0 +1,194 @@ +import { TestBed, inject } from '@angular/core/testing'; +import { HttpResponse } from '@angular/common/http'; + +import { HttpCacheService, HttpCacheEntry } from './http-cache.service'; + +const cachePersistenceKey = 'httpCache'; + +describe('HttpCacheService', () => { + let httpCacheService: HttpCacheService; + let response: HttpResponse; + + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [HttpCacheService] + }); + + // Start fresh + window.sessionStorage.removeItem(cachePersistenceKey); + window.localStorage.removeItem(cachePersistenceKey); + }); + + beforeEach(inject([HttpCacheService], (_httpCacheService: HttpCacheService) => { + httpCacheService = _httpCacheService; + + response = new HttpResponse({ body: 'data' }); + })); + + afterEach(() => { + httpCacheService.cleanCache(); + }); + + describe('setCacheData', () => { + it('should set cache data', () => { + // Act + httpCacheService.setCacheData('/popo', response); + + // Assert + expect(httpCacheService.getCacheData('/popo')).toEqual(response); + }); + + it('should replace existing data', () => { + // Arrange + const newResponse = new HttpResponse({ body: 'new data' }); + + // Act + httpCacheService.setCacheData('/popo', response); + httpCacheService.setCacheData('/popo', newResponse); + + // Assert + expect(httpCacheService.getCacheData('/popo')).toEqual(newResponse); + }); + + it('should set cache date correctly', () => { + // Act + const date = new Date(123); + httpCacheService.setCacheData('/popo', response, date); + httpCacheService.setCacheData('/hoho', response); + + // Assert + expect((httpCacheService.getHttpCacheEntry('/popo')).lastUpdated).toBe(date); + expect((httpCacheService.getHttpCacheEntry('/hoho')).lastUpdated).not.toBe(date); + }); + }); + + describe('getCacheData', () => { + it('should return null if no cache', () => { + expect(httpCacheService.getCacheData('/hoho')).toBe(null); + }); + + it('should return cached data if exists', () => { + // Act + httpCacheService.setCacheData('/hoho', response); + + // Assert + expect(httpCacheService.getCacheData('/hoho')).toEqual(response); + }); + + it('should return cached data with url parameters if exists', () => { + // Act + httpCacheService.setCacheData('/hoho?pif=paf', response); + + // Assert + expect(httpCacheService.getCacheData('/hoho?pif=paf')).toEqual(response); + }); + }); + + describe('getHttpCacheEntry', () => { + it('should return null if no cache', () => { + expect(httpCacheService.getHttpCacheEntry('/hoho')).toBe(null); + }); + + it('should return cached data date if exists', () => { + // Arrange + const date = new Date(123); + + // Act + httpCacheService.setCacheData('/hoho', response, date); + const entry = httpCacheService.getHttpCacheEntry('/hoho'); + + // Assert + expect(entry).not.toBeNull(); + expect((entry).lastUpdated).toEqual(date); + expect((entry).data).toEqual(response); + }); + }); + + describe('clearCacheData', () => { + it('should clear existing cache data', () => { + // Set cache + httpCacheService.setCacheData('/hoho', response); + expect(httpCacheService.getCacheData('/hoho')).toEqual(response); + + // Clear cache + httpCacheService.clearCache('/hoho'); + expect(httpCacheService.getCacheData('/hoho')).toBe(null); + }); + + it('should do nothing if no cache exists', () => { + expect(httpCacheService.getCacheData('/lolo')).toBe(null); + httpCacheService.clearCache('/hoho'); + expect(httpCacheService.getCacheData('/lolo')).toBe(null); + }); + }); + + describe('cleanCache', () => { + it('should clear all cache if no date is specified', () => { + // Set cache + httpCacheService.setCacheData('/hoho', response); + httpCacheService.setCacheData('/popo', response); + expect(httpCacheService.getCacheData('/hoho')).toBe(response); + expect(httpCacheService.getCacheData('/popo')).toBe(response); + + // Clean cache + httpCacheService.cleanCache(); + expect(httpCacheService.getCacheData('/hoho')).toBe(null); + expect(httpCacheService.getCacheData('/popo')).toBe(null); + }); + + it('should clear existing since specified date', () => { + // Set cache + httpCacheService.setCacheData('/hoho', response); + expect(httpCacheService.getCacheData('/hoho')).toBe(response); + + // Clean cache + httpCacheService.cleanCache(new Date()); + expect(httpCacheService.getCacheData('/hoho')).toBe(null); + }); + + it('should not affect cache entries newer than specified date', () => { + // Set cache + httpCacheService.setCacheData('/hoho', response); + expect(httpCacheService.getCacheData('/hoho')).toBe(response); + + // Clean cache + const date = new Date(); + httpCacheService.setCacheData('/lolo', response, new Date(date.getTime() + 10)); + httpCacheService.cleanCache(date); + + // Assert + expect(httpCacheService.getCacheData('/hoho')).toBe(null); + expect(httpCacheService.getCacheData('/lolo')).toBe(response); + }); + }); + + describe('setPersistence', () => { + beforeEach(() => { + httpCacheService.setPersistence(); + httpCacheService.cleanCache = jasmine.createSpy('cleanCache'); + }); + + it('should clear previous cache data when persistence value change', () => { + httpCacheService.setPersistence('local'); + expect(httpCacheService.cleanCache).toHaveBeenCalledWith(); + }); + + it('should persist cache to local storage', () => { + expect(localStorage.getItem(cachePersistenceKey)).toBeNull(); + + httpCacheService.setPersistence('local'); + httpCacheService.setCacheData('/hoho', response); + + expect(localStorage.getItem(cachePersistenceKey)).not.toBeNull(); + }); + + it('should persist cache to session storage', () => { + expect(sessionStorage.getItem(cachePersistenceKey)).toBeNull(); + + httpCacheService.setPersistence('session'); + httpCacheService.setCacheData('/hoho', response); + + expect(sessionStorage.getItem(cachePersistenceKey)).not.toBeNull(); + }); + }); +}); diff --git a/src/app/core/http/http-cache.service.ts b/src/app/core/http/http-cache.service.ts new file mode 100644 index 000000000..a3ca74bf3 --- /dev/null +++ b/src/app/core/http/http-cache.service.ts @@ -0,0 +1,118 @@ +import { Injectable } from '@angular/core'; +import { HttpResponse } from '@angular/common/http'; +import { each } from 'lodash'; + +import { Logger } from '../logger.service'; + +const log = new Logger('HttpCacheService'); +const cachePersistenceKey = 'httpCache'; + +export interface HttpCacheEntry { + lastUpdated: Date; + data: HttpResponse; +} + +/** + * Provides a cache facility for HTTP requests with configurable persistence policy. + */ +@Injectable() +export class HttpCacheService { + + private cachedData: { [key: string]: HttpCacheEntry; } = {}; + private storage: Storage | null = null; + + constructor() { + this.loadCacheData(); + } + + /** + * Sets the cache data for the specified request. + * @param {!string} url The request URL. + * @param {ResponseOptions} data The received data. + * @param {Date=} lastUpdated The cache last update, current date is used if not specified. + */ + setCacheData(url: string, data: HttpResponse, lastUpdated?: Date) { + this.cachedData[url] = { + lastUpdated: lastUpdated || new Date(), + data: data + }; + log.debug(`Cache set for key: "${url}"`); + this.saveCacheData(); + } + + /** + * Gets the cached data for the specified request. + * @param {!string} url The request URL. + * @return {?ResponseOptions} The cached data or null if no cached data exists for this request. + */ + getCacheData(url: string): HttpResponse | null { + const cacheEntry = this.cachedData[url]; + + if (cacheEntry) { + log.debug(`Cache hit for key: "${url}"`); + return cacheEntry.data; + } + + return null; + } + + /** + * Gets the cached entry for the specified request. + * @param {!string} url The request URL. + * @return {?HttpCacheEntry} The cache entry or null if no cache entry exists for this request. + */ + getHttpCacheEntry(url: string): HttpCacheEntry | null { + return this.cachedData[url] || null; + } + + /** + * Clears the cached entry (if exists) for the specified request. + * @param {!string} url The request URL. + */ + clearCache(url: string): void { + delete this.cachedData[url]; + log.debug(`Cache cleared for key: "${url}"`); + this.saveCacheData(); + } + + /** + * Cleans cache entries older than the specified date. + * @param {date=} expirationDate The cache expiration date. If no date is specified, all cache is cleared. + */ + cleanCache(expirationDate?: Date) { + if (expirationDate) { + each(this.cachedData, (value: HttpCacheEntry, key: string) => { + if (expirationDate >= value.lastUpdated) { + delete this.cachedData[key]; + } + }); + } else { + this.cachedData = {}; + } + this.saveCacheData(); + } + + /** + * Sets the cache persistence policy. + * Note that changing the cache persistence will also clear the cache from its previous storage. + * @param {'local'|'session'=} persistence How the cache should be persisted, it can be either local or session + * storage, or if no value is provided it will be only in-memory (default). + */ + setPersistence(persistence?: 'local' | 'session') { + this.cleanCache(); + this.storage = persistence === 'local' || persistence === 'session' ? window[persistence + 'Storage'] : null; + this.loadCacheData(); + } + + private saveCacheData() { + if (this.storage) { + this.storage[cachePersistenceKey] = JSON.stringify(this.cachedData); + } + } + + private loadCacheData() { + const data = this.storage ? this.storage[cachePersistenceKey] : null; + this.cachedData = data ? JSON.parse(data) : {}; + } + +} diff --git a/src/app/core/http/http.service.spec.ts b/src/app/core/http/http.service.spec.ts new file mode 100644 index 000000000..1df928bea --- /dev/null +++ b/src/app/core/http/http.service.spec.ts @@ -0,0 +1,140 @@ +import { TestBed, inject } from '@angular/core/testing'; +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; +import { HttpClient, HttpInterceptor } from '@angular/common/http'; + +import { HttpService } from './http.service'; +import { HttpCacheService } from './http-cache.service'; +import { ErrorHandlerInterceptor } from './error-handler.interceptor'; +import { CacheInterceptor } from './cache.interceptor'; +import { ApiPrefixInterceptor } from './api-prefix.interceptor'; + +describe('HttpService', () => { + let httpCacheService: HttpCacheService; + let http: HttpClient; + let httpMock: HttpTestingController; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [ + ErrorHandlerInterceptor, + CacheInterceptor, + ApiPrefixInterceptor, + HttpCacheService, + { + provide: HttpClient, + useClass: HttpService + }, + ] + }); + }); + + beforeEach(inject([ + HttpClient, + HttpTestingController, + HttpCacheService + ], (_http: HttpClient, + _httpMock: HttpTestingController, + _httpCacheService: HttpCacheService) => { + + http = _http; + httpMock = _httpMock; + httpCacheService = _httpCacheService; + })); + + afterEach(() => { + httpCacheService.cleanCache(); + httpMock.verify(); + }); + + it('should use error handler, API prefix and no cache by default', () => { + // Arrange + let interceptors: HttpInterceptor[]; + const realRequest = http.request; + spyOn(HttpService.prototype, 'request').and.callFake(function(this: any) { + interceptors = this.interceptors; + return realRequest.apply(this, arguments); + }); + + // Act + const request = http.get('/toto'); + + // Assert + request.subscribe(() => { + expect(http.request).toHaveBeenCalled(); + expect(interceptors.some(i => i instanceof ApiPrefixInterceptor)).toBeTruthy(); + expect(interceptors.some(i => i instanceof ErrorHandlerInterceptor)).toBeTruthy(); + expect(interceptors.some(i => i instanceof CacheInterceptor)).toBeFalsy(); + }); + httpMock.expectOne({}).flush({}); + }); + + it('should use cache', () => { + // Arrange + let interceptors: HttpInterceptor[]; + const realRequest = http.request; + spyOn(HttpService.prototype, 'request').and.callFake(function(this: any) { + interceptors = this.interceptors; + return realRequest.apply(this, arguments); + }); + + // Act + const request = http + .cache() + .get('/toto'); + + // Assert + request.subscribe(() => { + expect(interceptors.some(i => i instanceof ApiPrefixInterceptor)).toBeTruthy(); + expect(interceptors.some(i => i instanceof ErrorHandlerInterceptor)).toBeTruthy(); + expect(interceptors.some(i => i instanceof CacheInterceptor)).toBeTruthy(); + }); + httpMock.expectOne({}).flush({}); + }); + + it('should skip error handler', () => { + // Arrange + let interceptors: HttpInterceptor[]; + const realRequest = http.request; + spyOn(HttpService.prototype, 'request').and.callFake(function(this: any) { + interceptors = this.interceptors; + return realRequest.apply(this, arguments); + }); + + // Act + const request = http + .skipErrorHandler() + .get('/toto'); + + // Assert + request.subscribe(() => { + expect(interceptors.some(i => i instanceof ApiPrefixInterceptor)).toBeTruthy(); + expect(interceptors.some(i => i instanceof ErrorHandlerInterceptor)).toBeFalsy(); + expect(interceptors.some(i => i instanceof CacheInterceptor)).toBeFalsy(); + }); + httpMock.expectOne({}).flush({}); + }); + + it('should not use API prefix', () => { + // Arrange + let interceptors: HttpInterceptor[]; + const realRequest = http.request; + spyOn(HttpService.prototype, 'request').and.callFake(function(this: any) { + interceptors = this.interceptors; + return realRequest.apply(this, arguments); + }); + + // Act + const request = http + .disableApiPrefix() + .get('/toto'); + + // Assert + request.subscribe(() => { + expect(interceptors.some(i => i instanceof ApiPrefixInterceptor)).toBeFalsy(); + expect(interceptors.some(i => i instanceof ErrorHandlerInterceptor)).toBeTruthy(); + expect(interceptors.some(i => i instanceof CacheInterceptor)).toBeFalsy(); + }); + httpMock.expectOne({}).flush({}); + }); +}); diff --git a/src/app/core/http/http.service.ts b/src/app/core/http/http.service.ts new file mode 100644 index 000000000..e034c3193 --- /dev/null +++ b/src/app/core/http/http.service.ts @@ -0,0 +1,119 @@ +import { Inject, Injectable, InjectionToken, Injector, Optional } from '@angular/core'; +import { HttpClient, HttpEvent, HttpInterceptor, HttpHandler, HttpRequest } from '@angular/common/http'; +import { Observable } from 'rxjs'; + +import { ErrorHandlerInterceptor } from './error-handler.interceptor'; +import { CacheInterceptor } from './cache.interceptor'; +import { ApiPrefixInterceptor } from './api-prefix.interceptor'; + +// HttpClient is declared in a re-exported module, so we have to extend the original module to make it work properly +// (see https://github.com/Microsoft/TypeScript/issues/13897) +declare module '@angular/common/http/src/client' { + + // Augment HttpClient with the added configuration methods from HttpService, to allow in-place replacement of + // HttpClient with HttpService using dependency injection + export interface HttpClient { + + /** + * Enables caching for this request. + * @param {boolean} forceUpdate Forces request to be made and updates cache entry. + * @return {HttpClient} The new instance. + */ + cache(forceUpdate?: boolean): HttpClient; + + /** + * Skips default error handler for this request. + * @return {HttpClient} The new instance. + */ + skipErrorHandler(): HttpClient; + + /** + * Do not use API prefix for this request. + * @return {HttpClient} The new instance. + */ + disableApiPrefix(): HttpClient; + + } + +} + +// From @angular/common/http/src/interceptor: allows to chain interceptors +class HttpInterceptorHandler implements HttpHandler { + + constructor(private next: HttpHandler, private interceptor: HttpInterceptor) { } + + handle(request: HttpRequest): Observable> { + return this.interceptor.intercept(request, this.next); + } + +} + +/** + * Allows to override default dynamic interceptors that can be disabled with the HttpService extension. + * Except for very specific needs, you should better configure these interceptors directly in the constructor below + * for better readability. + * + * For static interceptors that should always be enabled (like ApiPrefixInterceptor), use the standard + * HTTP_INTERCEPTORS token. + */ +export const HTTP_DYNAMIC_INTERCEPTORS = new InjectionToken('HTTP_DYNAMIC_INTERCEPTORS'); + +/** + * Extends HttpClient with per request configuration using dynamic interceptors. + */ +@Injectable() +export class HttpService extends HttpClient { + + constructor(private httpHandler: HttpHandler, + private injector: Injector, + @Optional() @Inject(HTTP_DYNAMIC_INTERCEPTORS) private interceptors: HttpInterceptor[] = []) { + super(httpHandler); + + if (!this.interceptors) { + // Configure default interceptors that can be disabled here + this.interceptors = [ + this.injector.get(ApiPrefixInterceptor), + this.injector.get(ErrorHandlerInterceptor) + ]; + } + } + + cache(forceUpdate?: boolean): HttpClient { + const cacheInterceptor = this.injector.get(CacheInterceptor).configure({ update: forceUpdate }); + return this.addInterceptor(cacheInterceptor); + } + + skipErrorHandler(): HttpClient { + return this.removeInterceptor(ErrorHandlerInterceptor); + } + + disableApiPrefix(): HttpClient { + return this.removeInterceptor(ApiPrefixInterceptor); + } + + // Override the original method to wire interceptors when triggering the request. + request(method?: any, url?: any, options?: any): any { + const handler = this.interceptors.reduceRight( + (next, interceptor) => new HttpInterceptorHandler(next, interceptor), + this.httpHandler + ); + return new HttpClient(handler).request(method, url, options); + } + + private removeInterceptor(interceptorType: Function): HttpService { + return new HttpService( + this.httpHandler, + this.injector, + this.interceptors.filter(i => !(i instanceof interceptorType)) + ); + } + + private addInterceptor(interceptor: HttpInterceptor): HttpService { + return new HttpService( + this.httpHandler, + this.injector, + this.interceptors.concat([interceptor]) + ); + } + +} diff --git a/src/app/core/i18n.service.spec.ts b/src/app/core/i18n.service.spec.ts new file mode 100644 index 000000000..8cce69d38 --- /dev/null +++ b/src/app/core/i18n.service.spec.ts @@ -0,0 +1,152 @@ +import { TestBed, inject } from '@angular/core/testing'; +import { TranslateService, LangChangeEvent } from '@ngx-translate/core'; +import { Subject } from 'rxjs'; + +import { extract, I18nService } from './i18n.service'; + +const defaultLanguage = 'en-US'; +const supportedLanguages = ['eo', 'en-US', 'fr-FR']; + +class MockTranslateService { + + currentLang: string; + onLangChange = new Subject(); + + use(language: string) { + this.currentLang = language; + this.onLangChange.next({ + lang: this.currentLang, + translations: {} + }); + } + + getBrowserCultureLang() { + return 'en-US'; + } + + setTranslation(lang: string, translations: Object, shouldMerge?: boolean) { } + +} + +describe('I18nService', () => { + let i18nService: I18nService; + let translateService: TranslateService; + let onLangChangeSpy: jasmine.Spy; + + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [ + I18nService, + { provide: TranslateService, useClass: MockTranslateService }, + ] + }); + }); + + beforeEach(inject([ + I18nService, + TranslateService + ], (_i18nService: I18nService, + _translateService: TranslateService) => { + + i18nService = _i18nService; + translateService = _translateService; + + // Create spies + onLangChangeSpy = jasmine.createSpy('onLangChangeSpy'); + translateService.onLangChange + .subscribe((event: LangChangeEvent) => { + onLangChangeSpy(event.lang); + }); + spyOn(translateService, 'use').and.callThrough(); + })); + + afterEach(() => { + // Cleanup + localStorage.removeItem('language'); + }); + + describe('extract', () => { + it('should not modify string', () => { + expect(extract('Hello world !')).toEqual('Hello world !'); + }); + }); + + describe('init', () => { + it('should init with default language', () => { + // Act + i18nService.init(defaultLanguage, supportedLanguages); + + // Assert + expect(translateService.use).toHaveBeenCalledWith(defaultLanguage); + expect(onLangChangeSpy).toHaveBeenCalledWith(defaultLanguage); + }); + + it('should init with save language', () => { + // Arrange + const savedLanguage = 'eo'; + localStorage.setItem('language', savedLanguage); + + // Act + i18nService.init(defaultLanguage, supportedLanguages); + + // Assert + expect(translateService.use).toHaveBeenCalledWith(savedLanguage); + expect(onLangChangeSpy).toHaveBeenCalledWith(savedLanguage); + }); + }); + + describe('set language', () => { + it('should change current language', () => { + // Arrange + const newLanguage = 'eo'; + i18nService.init(defaultLanguage, supportedLanguages); + + // Act + i18nService.language = newLanguage; + + // Assert + expect(translateService.use).toHaveBeenCalledWith(newLanguage); + expect(onLangChangeSpy).toHaveBeenCalledWith(newLanguage); + }); + + it('should change current language without a region match', () => { + // Arrange + const newLanguage = 'fr-CA'; + i18nService.init(defaultLanguage, supportedLanguages); + + // Act + i18nService.language = newLanguage; + + // Assert + expect(translateService.use).toHaveBeenCalledWith('fr-FR'); + expect(onLangChangeSpy).toHaveBeenCalledWith('fr-FR'); + }); + + it('should change current language to default if unsupported', () => { + // Arrange + const newLanguage = 'es'; + i18nService.init(defaultLanguage, supportedLanguages); + + // Act + i18nService.language = newLanguage; + + // Assert + expect(translateService.use).toHaveBeenCalledWith(defaultLanguage); + expect(onLangChangeSpy).toHaveBeenCalledWith(defaultLanguage); + }); + }); + + describe('get language', () => { + it('should return current language', () => { + // Arrange + i18nService.init(defaultLanguage, supportedLanguages); + + // Act + const currentLanguage = i18nService.language; + + // Assert + expect(currentLanguage).toEqual(defaultLanguage); + }); + }); + +}); diff --git a/src/app/core/i18n.service.ts b/src/app/core/i18n.service.ts new file mode 100644 index 000000000..f184767c2 --- /dev/null +++ b/src/app/core/i18n.service.ts @@ -0,0 +1,83 @@ +import { Injectable } from '@angular/core'; +import { TranslateService, LangChangeEvent } from '@ngx-translate/core'; +import { includes } from 'lodash'; + +import { Logger } from './logger.service'; +import * as enUS from '../../translations/en-US.json'; +import * as frFR from '../../translations/fr-FR.json'; + +const log = new Logger('I18nService'); +const languageKey = 'language'; + +/** + * Pass-through function to mark a string for translation extraction. + * Running `npm translations:extract` will include the given string by using this. + * @param {string} s The string to extract for translation. + * @return {string} The same string. + */ +export function extract(s: string) { + return s; +} + +@Injectable() +export class I18nService { + + defaultLanguage: string; + supportedLanguages: string[]; + + constructor(private translateService: TranslateService) { + // Embed languages to avoid extra HTTP requests + translateService.setTranslation('en-US', enUS); + translateService.setTranslation('fr-FR', frFR); + } + + /** + * Initializes i18n for the application. + * Loads language from local storage if present, or sets default language. + * @param {!string} defaultLanguage The default language to use. + * @param {Array.} supportedLanguages The list of supported languages. + */ + init(defaultLanguage: string, supportedLanguages: string[]) { + this.defaultLanguage = defaultLanguage; + this.supportedLanguages = supportedLanguages; + this.language = ''; + + this.translateService.onLangChange + .subscribe((event: LangChangeEvent) => { localStorage.setItem(languageKey, event.lang); }); + } + + /** + * Sets the current language. + * Note: The current language is saved to the local storage. + * If no parameter is specified, the language is loaded from local storage (if present). + * @param {string} language The IETF language code to set. + */ + set language(language: string) { + language = language || localStorage.getItem(languageKey) || this.translateService.getBrowserCultureLang(); + let isSupportedLanguage = includes(this.supportedLanguages, language); + + // If no exact match is found, search without the region + if (language && !isSupportedLanguage) { + language = language.split('-')[0]; + language = this.supportedLanguages.find(supportedLanguage => supportedLanguage.startsWith(language)) || ''; + isSupportedLanguage = Boolean(language); + } + + // Fallback if language is not supported + if (!isSupportedLanguage) { + language = this.defaultLanguage; + } + + log.debug(`Language set to ${language}`); + this.translateService.use(language); + } + + /** + * Gets the current language. + * @return {string} The current language code. + */ + get language(): string { + return this.translateService.currentLang; + } + +} diff --git a/src/app/core/index.ts b/src/app/core/index.ts new file mode 100644 index 000000000..3826be2bc --- /dev/null +++ b/src/app/core/index.ts @@ -0,0 +1,13 @@ +export * from './core.module'; +export * from './authentication/authentication.service'; +export * from './authentication/authentication.service.mock'; +export * from './authentication/authentication.guard'; +export * from './i18n.service'; +export * from './http/http.service'; +export * from './http/http-cache.service'; +export * from './http/api-prefix.interceptor'; +export * from './http/cache.interceptor'; +export * from './http/error-handler.interceptor'; +export * from './route.service'; +export * from './route-reusable-strategy'; +export * from './logger.service'; diff --git a/src/app/core/logger.service.spec.ts b/src/app/core/logger.service.spec.ts new file mode 100644 index 000000000..0a4bf658b --- /dev/null +++ b/src/app/core/logger.service.spec.ts @@ -0,0 +1,72 @@ +import { Logger, LogLevel, LogOutput } from './logger.service'; + +const logMethods = ['log', 'info', 'warn', 'error']; + +describe('Logger', () => { + let savedConsole: Function[]; + let savedLevel: LogLevel; + let savedOutputs: LogOutput[]; + + beforeAll(() => { + savedConsole = []; + logMethods.forEach((m) => { + savedConsole[m] = console[m]; + console[m] = () => {}; + }); + savedLevel = Logger.level; + savedOutputs = Logger.outputs; + }); + + afterAll(() => { + logMethods.forEach((m) => { console[m] = savedConsole[m]; }); + Logger.level = savedLevel; + Logger.outputs = savedOutputs; + }); + + it('should create an instance', () => { + expect(new Logger()).toBeTruthy(); + }); + + it('should add a new LogOutput and receives log entries', () => { + // Arrange + const outputSpy = jasmine.createSpy('outputSpy'); + const log = new Logger('test'); + + // Act + Logger.outputs.push(outputSpy); + + log.debug('d'); + log.info('i'); + log.warn('w'); + log.error('e', { error: true }); + + // Assert + expect(outputSpy).toHaveBeenCalled(); + expect(outputSpy.calls.count()).toBe(4); + expect(outputSpy).toHaveBeenCalledWith('test', LogLevel.Debug, 'd'); + expect(outputSpy).toHaveBeenCalledWith('test', LogLevel.Info, 'i'); + expect(outputSpy).toHaveBeenCalledWith('test', LogLevel.Warning, 'w'); + expect(outputSpy).toHaveBeenCalledWith('test', LogLevel.Error, 'e', { error: true }); + }); + + it('should add a new LogOutput and receives only production log entries', () => { + // Arrange + const outputSpy = jasmine.createSpy('outputSpy'); + const log = new Logger('test'); + + // Act + Logger.outputs.push(outputSpy); + Logger.enableProductionMode(); + + log.debug('d'); + log.info('i'); + log.warn('w'); + log.error('e', { error: true }); + + // Assert + expect(outputSpy).toHaveBeenCalled(); + expect(outputSpy.calls.count()).toBe(2); + expect(outputSpy).toHaveBeenCalledWith('test', LogLevel.Warning, 'w'); + expect(outputSpy).toHaveBeenCalledWith('test', LogLevel.Error, 'e', { error: true }); + }); +}); diff --git a/src/app/core/logger.service.ts b/src/app/core/logger.service.ts new file mode 100644 index 000000000..e5e92b1de --- /dev/null +++ b/src/app/core/logger.service.ts @@ -0,0 +1,113 @@ +/** + * Simple logger system with the possibility of registering custom outputs. + * + * 4 different log levels are provided, with corresponding methods: + * - debug : for debug information + * - info : for informative status of the application (success, ...) + * - warning : for non-critical errors that do not prevent normal application behavior + * - error : for critical errors that prevent normal application behavior + * + * Example usage: + * ``` + * import { Logger } from 'app/core/logger.service'; + * + * const log = new Logger('myFile'); + * ... + * log.debug('something happened'); + * ``` + * + * To disable debug and info logs in production, add this snippet to your root component: + * ``` + * export class AppComponent implements OnInit { + * ngOnInit() { + * if (environment.production) { + * Logger.enableProductionMode(); + * } + * ... + * } + * } + * + * If you want to process logs through other outputs than console, you can add LogOutput functions to Logger.outputs. + */ + +/** + * The possible log levels. + * LogLevel.Off is never emitted and only used with Logger.level property to disable logs. + */ +export enum LogLevel { + Off = 0, + Error, + Warning, + Info, + Debug +} + +/** + * Log output handler function. + */ +export type LogOutput = (source: string, level: LogLevel, ...objects: any[]) => void; + +export class Logger { + + /** + * Current logging level. + * Set it to LogLevel.Off to disable logs completely. + */ + static level = LogLevel.Debug; + + /** + * Additional log outputs. + */ + static outputs: LogOutput[] = []; + + /** + * Enables production mode. + * Sets logging level to LogLevel.Warning. + */ + static enableProductionMode() { + Logger.level = LogLevel.Warning; + } + + constructor(private source?: string) { } + + /** + * Logs messages or objects with the debug level. + * Works the same as console.log(). + */ + debug(...objects: any[]) { + this.log(console.log, LogLevel.Debug, objects); + } + + /** + * Logs messages or objects with the info level. + * Works the same as console.log(). + */ + info(...objects: any[]) { + this.log(console.info, LogLevel.Info, objects); + } + + /** + * Logs messages or objects with the warning level. + * Works the same as console.log(). + */ + warn(...objects: any[]) { + this.log(console.warn, LogLevel.Warning, objects); + } + + /** + * Logs messages or objects with the error level. + * Works the same as console.log(). + */ + error(...objects: any[]) { + this.log(console.error, LogLevel.Error, objects); + } + + private log(func: Function, level: LogLevel, objects: any[]) { + if (level <= Logger.level) { + const log = this.source ? ['[' + this.source + ']'].concat(objects) : objects; + func.apply(console, log); + Logger.outputs.forEach((output) => output.apply(output, [this.source, level].concat(objects))); + } + } + +} diff --git a/src/app/core/route-reusable-strategy.ts b/src/app/core/route-reusable-strategy.ts new file mode 100644 index 000000000..f2ab69033 --- /dev/null +++ b/src/app/core/route-reusable-strategy.ts @@ -0,0 +1,28 @@ +import { ActivatedRouteSnapshot, DetachedRouteHandle, RouteReuseStrategy } from '@angular/router'; + +/** + * A route strategy allowing for explicit route reuse. + * Used as a workaround for https://github.com/angular/angular/issues/18374 + * To reuse a given route, add `data: { reuse: true }` to the route definition. + */ +export class RouteReusableStrategy extends RouteReuseStrategy { + + public shouldDetach(route: ActivatedRouteSnapshot): boolean { + return false; + } + + public store(route: ActivatedRouteSnapshot, detachedTree: DetachedRouteHandle | null): void { } + + public shouldAttach(route: ActivatedRouteSnapshot): boolean { + return false; + } + + public retrieve(route: ActivatedRouteSnapshot): DetachedRouteHandle | null { + return null; + } + + public shouldReuseRoute(future: ActivatedRouteSnapshot, curr: ActivatedRouteSnapshot): boolean { + return (future.routeConfig === curr.routeConfig) || future.data.reuse; + } + +} diff --git a/src/app/core/route.service.spec.ts b/src/app/core/route.service.spec.ts new file mode 100644 index 000000000..e1ba5485a --- /dev/null +++ b/src/app/core/route.service.spec.ts @@ -0,0 +1,40 @@ +import { TestBed, inject } from '@angular/core/testing'; + +import { AuthenticationService } from './authentication/authentication.service'; +import { MockAuthenticationService } from './authentication/authentication.service.mock'; +import { AuthenticationGuard } from './authentication/authentication.guard'; +import { ShellComponent } from './shell/shell.component'; +import { Route } from './route.service'; + +describe('Route', () => { + let route: Route; + + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [ + AuthenticationGuard, + { provide: AuthenticationService, useClass: MockAuthenticationService }, + Route + ] + }); + }); + + beforeEach(inject([Route], (_route: Route) => { + route = _route; + })); + + describe('withShell', () => { + it('should create routes as children of shell', () => { + // Prepare + const testRoutes = [{ path: 'test' }]; + + // Act + const result = Route.withShell(testRoutes); + + // Assert + expect(result.path).toBe(''); + expect(result.children).toBe(testRoutes); + expect(result.component).toBe(ShellComponent); + }); + }); +}); diff --git a/src/app/core/route.service.ts b/src/app/core/route.service.ts new file mode 100644 index 000000000..147bcfc82 --- /dev/null +++ b/src/app/core/route.service.ts @@ -0,0 +1,27 @@ +import { Route as ngRoute, Routes } from '@angular/router'; + +import { ShellComponent } from './shell/shell.component'; +import { AuthenticationGuard } from './authentication/authentication.guard'; + +/** + * Provides helper methods to create routes. + */ +export class Route { + + /** + * Creates routes using the shell component and authentication. + * @param routes The routes to add. + * @return {Route} The new route using shell as the base. + */ + static withShell(routes: Routes): ngRoute { + return { + path: '', + component: ShellComponent, + children: routes, + canActivate: [AuthenticationGuard], + // Reuse ShellComponent instance when navigating between child views + data: { reuse: true } + }; + } + +} diff --git a/src/app/core/shell/header/header.component.html b/src/app/core/shell/header/header.component.html new file mode 100644 index 000000000..2c87f335c --- /dev/null +++ b/src/app/core/shell/header/header.component.html @@ -0,0 +1,71 @@ + + \ No newline at end of file diff --git a/src/app/core/shell/header/header.component.scss b/src/app/core/shell/header/header.component.scss new file mode 100644 index 000000000..0c42ef419 --- /dev/null +++ b/src/app/core/shell/header/header.component.scss @@ -0,0 +1,10 @@ +/* @import "src/theme/theme-variables"; + +.navbar { + margin-bottom: $spacer; +} + +.nav-link.dropdown-toggle { + cursor: pointer; +} + */ \ No newline at end of file diff --git a/src/app/core/shell/header/header.component.spec.ts b/src/app/core/shell/header/header.component.spec.ts new file mode 100644 index 000000000..2a54c28d8 --- /dev/null +++ b/src/app/core/shell/header/header.component.spec.ts @@ -0,0 +1,40 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; +import { TranslateModule } from '@ngx-translate/core'; +import { RouterTestingModule } from '@angular/router/testing'; + +import { AuthenticationService } from '../../authentication/authentication.service'; +import { MockAuthenticationService } from '../../authentication/authentication.service.mock'; +import { I18nService } from '../../i18n.service'; +import { HeaderComponent } from './header.component'; + +describe('HeaderComponent', () => { + let component: HeaderComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [ + RouterTestingModule, + NgbModule.forRoot(), + TranslateModule.forRoot() + ], + declarations: [HeaderComponent], + providers: [ + { provide: AuthenticationService, useClass: MockAuthenticationService }, + I18nService + ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HeaderComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/core/shell/header/header.component.ts b/src/app/core/shell/header/header.component.ts new file mode 100644 index 000000000..f2ea9104b --- /dev/null +++ b/src/app/core/shell/header/header.component.ts @@ -0,0 +1,48 @@ +import { Component, OnInit } from '@angular/core'; +import { Router } from '@angular/router'; + +import { AuthenticationService } from '../../authentication/authentication.service'; +import { I18nService } from '../../i18n.service'; + +@Component({ + selector: 'app-header', + templateUrl: './header.component.html', + styleUrls: ['./header.component.scss'] +}) +export class HeaderComponent implements OnInit { + + menuHidden = true; + + constructor(private router: Router, + private authenticationService: AuthenticationService, + private i18nService: I18nService) { } + + ngOnInit() { } + + toggleMenu() { + this.menuHidden = !this.menuHidden; + } + + setLanguage(language: string) { + this.i18nService.language = language; + } + + logout() { + this.authenticationService.logout() + .subscribe(() => this.router.navigate(['/login'], { replaceUrl: true })); + } + + get currentLanguage(): string { + return this.i18nService.language; + } + + get languages(): string[] { + return this.i18nService.supportedLanguages; + } + + get username(): string | null { + const credentials = this.authenticationService.credentials; + return credentials ? credentials.username : null; + } + +} diff --git a/src/app/core/shell/shell.component.html b/src/app/core/shell/shell.component.html new file mode 100644 index 000000000..1e157542a --- /dev/null +++ b/src/app/core/shell/shell.component.html @@ -0,0 +1,2 @@ + + diff --git a/src/app/core/shell/shell.component.scss b/src/app/core/shell/shell.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/src/app/core/shell/shell.component.spec.ts b/src/app/core/shell/shell.component.spec.ts new file mode 100644 index 000000000..c27d72786 --- /dev/null +++ b/src/app/core/shell/shell.component.spec.ts @@ -0,0 +1,39 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { RouterTestingModule } from '@angular/router/testing'; +import { TranslateModule } from '@ngx-translate/core'; +import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; + +import { AuthenticationService } from '../authentication/authentication.service'; +import { MockAuthenticationService } from '../authentication/authentication.service.mock'; +import { CoreModule } from '../core.module'; +import { ShellComponent } from './shell.component'; + +describe('ShellComponent', () => { + let component: ShellComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [ + RouterTestingModule, + TranslateModule.forRoot(), + NgbModule.forRoot(), + CoreModule + ], + providers: [ + { provide: AuthenticationService, useClass: MockAuthenticationService } + ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ShellComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/core/shell/shell.component.ts b/src/app/core/shell/shell.component.ts new file mode 100644 index 000000000..48f33932c --- /dev/null +++ b/src/app/core/shell/shell.component.ts @@ -0,0 +1,14 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-shell', + templateUrl: './shell.component.html', + styleUrls: ['./shell.component.scss'] +}) +export class ShellComponent implements OnInit { + + constructor() { } + + ngOnInit() { } + +} diff --git a/src/app/home/home-routing.module.ts b/src/app/home/home-routing.module.ts new file mode 100644 index 000000000..80adeef31 --- /dev/null +++ b/src/app/home/home-routing.module.ts @@ -0,0 +1,19 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; + +import { Route, extract } from '@app/core'; +import { HomeComponent } from './home.component'; + +const routes: Routes = [ + Route.withShell([ + { path: '', redirectTo: '/home', pathMatch: 'full' }, + { path: 'home', component: HomeComponent, data: { title: extract('Home') } } + ]) +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], + providers: [] +}) +export class HomeRoutingModule { } diff --git a/src/app/home/home.component.html b/src/app/home/home.component.html new file mode 100644 index 000000000..519c32a8b --- /dev/null +++ b/src/app/home/home.component.html @@ -0,0 +1,7 @@ +
+
+ + +
+
diff --git a/src/app/home/home.component.scss b/src/app/home/home.component.scss new file mode 100644 index 000000000..c22167e45 --- /dev/null +++ b/src/app/home/home.component.scss @@ -0,0 +1,9 @@ +.logo { + width: 500px; +} + +q { + font-style: italic; + font-size: 1.2rem; + quotes: "« " " »"; +} diff --git a/src/app/home/home.component.spec.ts b/src/app/home/home.component.spec.ts new file mode 100644 index 000000000..c574c6e7d --- /dev/null +++ b/src/app/home/home.component.spec.ts @@ -0,0 +1,35 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; + +import { CoreModule } from '@app/core'; +import { SharedModule } from '@app/shared'; +import { HomeComponent } from './home.component'; +import { QuoteService } from './quote.service'; + +describe('HomeComponent', () => { + let component: HomeComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [ + CoreModule, + SharedModule, + HttpClientTestingModule + ], + declarations: [HomeComponent], + providers: [QuoteService] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(HomeComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/home/home.component.ts b/src/app/home/home.component.ts new file mode 100644 index 000000000..12f9ea543 --- /dev/null +++ b/src/app/home/home.component.ts @@ -0,0 +1,25 @@ +import { Component, OnInit } from '@angular/core'; +import { finalize } from 'rxjs/operators'; + +import { QuoteService } from './quote.service'; + +@Component({ + selector: 'app-home', + templateUrl: './home.component.html', + styleUrls: ['./home.component.scss'] +}) +export class HomeComponent implements OnInit { + + quote: string; + isLoading: boolean; + + constructor(private quoteService: QuoteService) { } + + ngOnInit() { + this.isLoading = true; + this.quoteService.getRandomQuote({ category: 'dev' }) + .pipe(finalize(() => { this.isLoading = false; })) + .subscribe((quote: string) => { this.quote = quote; }); + } + +} diff --git a/src/app/home/home.module.ts b/src/app/home/home.module.ts new file mode 100644 index 000000000..777c2200f --- /dev/null +++ b/src/app/home/home.module.ts @@ -0,0 +1,26 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { TranslateModule } from '@ngx-translate/core'; + +import { CoreModule } from '@app/core'; +import { SharedModule } from '@app/shared'; +import { HomeRoutingModule } from './home-routing.module'; +import { HomeComponent } from './home.component'; +import { QuoteService } from './quote.service'; + +@NgModule({ + imports: [ + CommonModule, + TranslateModule, + CoreModule, + SharedModule, + HomeRoutingModule + ], + declarations: [ + HomeComponent + ], + providers: [ + QuoteService + ] +}) +export class HomeModule { } diff --git a/src/app/home/quote.service.spec.ts b/src/app/home/quote.service.spec.ts new file mode 100644 index 000000000..5a7d1619b --- /dev/null +++ b/src/app/home/quote.service.spec.ts @@ -0,0 +1,72 @@ +import { TestBed, inject, async } from '@angular/core/testing'; +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; + +import { CoreModule, HttpCacheService } from '@app/core'; +import { QuoteService } from './quote.service'; + +describe('QuoteService', () => { + let quoteService: QuoteService; + let httpMock: HttpTestingController; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [ + CoreModule, + HttpClientTestingModule + ], + providers: [ + HttpCacheService, + QuoteService + ] + }); + })); + + beforeEach(inject([ + HttpCacheService, + QuoteService, + HttpTestingController + ], (htttpCacheService: HttpCacheService, + _quoteService: QuoteService, + _httpMock: HttpTestingController) => { + + quoteService = _quoteService; + httpMock = _httpMock; + + htttpCacheService.cleanCache(); + })); + + afterEach(() => { + httpMock.verify(); + }); + + describe('getRandomQuote', () => { + it('should return a random Chuck Norris quote', () => { + // Arrange + const mockQuote = { value: 'a random quote' }; + + // Act + const randomQuoteSubscription = quoteService.getRandomQuote({ category: 'toto' }); + + // Assert + randomQuoteSubscription.subscribe((quote: string) => { + expect(quote).toEqual(mockQuote.value); + }); + httpMock.expectOne({}).flush(mockQuote); + }); + + it('should return a string in case of error', () => { + // Act + const randomQuoteSubscription = quoteService.getRandomQuote({ category: 'toto' }); + + // Assert + randomQuoteSubscription.subscribe((quote: string) => { + expect(typeof quote).toEqual('string'); + expect(quote).toContain('Error'); + }); + httpMock.expectOne({}).flush(null, { + status: 500, + statusText: 'error' + }); + }); + }); +}); diff --git a/src/app/home/quote.service.ts b/src/app/home/quote.service.ts new file mode 100644 index 000000000..7028a24a0 --- /dev/null +++ b/src/app/home/quote.service.ts @@ -0,0 +1,30 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable, of } from 'rxjs'; +import { map, catchError } from 'rxjs/operators'; + +const routes = { + quote: (c: RandomQuoteContext) => `/jokes/random?category=${c.category}` +}; + +export interface RandomQuoteContext { + // The quote's category: 'dev', 'explicit'... + category: string; +} + +@Injectable() +export class QuoteService { + + constructor(private httpClient: HttpClient) { } + + getRandomQuote(context: RandomQuoteContext): Observable { + return this.httpClient + .cache() + .get(routes.quote(context)) + .pipe( + map((body: any) => body.value), + catchError(() => of('Error, could not load joke :-(')) + ); + } + +} diff --git a/src/app/login/login-routing.module.ts b/src/app/login/login-routing.module.ts new file mode 100644 index 000000000..24b872618 --- /dev/null +++ b/src/app/login/login-routing.module.ts @@ -0,0 +1,16 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; + +import { extract } from '@app/core'; +import { LoginComponent } from './login.component'; + +const routes: Routes = [ + { path: 'login', component: LoginComponent, data: { title: extract('Login') } } +]; + +@NgModule({ + imports: [RouterModule.forChild(routes)], + exports: [RouterModule], + providers: [] +}) +export class LoginRoutingModule { } diff --git a/src/app/login/login.component.html b/src/app/login/login.component.html new file mode 100644 index 000000000..1488e4c6d --- /dev/null +++ b/src/app/login/login.component.html @@ -0,0 +1,62 @@ + diff --git a/src/app/login/login.component.scss b/src/app/login/login.component.scss new file mode 100644 index 000000000..bacb29666 --- /dev/null +++ b/src/app/login/login.component.scss @@ -0,0 +1,29 @@ +@import "src/theme/theme-variables"; +@import "~bootstrap/scss/mixins/_breakpoints"; + +.login-container { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; +} + +.login-box { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + width: 100%; + min-height: 100%; +} + +.ng-invalid.ng-touched:not(form) { + border-left: 4px solid theme-color("danger"); +} + +@include media-breakpoint-down(xs) { + .container { + width: 100%; + } +} diff --git a/src/app/login/login.component.spec.ts b/src/app/login/login.component.spec.ts new file mode 100644 index 000000000..dbcc39c6d --- /dev/null +++ b/src/app/login/login.component.spec.ts @@ -0,0 +1,37 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { TranslateModule } from '@ngx-translate/core'; +import { RouterTestingModule } from '@angular/router/testing'; +import { ReactiveFormsModule } from '@angular/forms'; +import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; + +import { CoreModule } from '@app/core'; +import { LoginComponent } from './login.component'; + +describe('LoginComponent', () => { + let component: LoginComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [ + NgbModule.forRoot(), + RouterTestingModule, + TranslateModule.forRoot(), + ReactiveFormsModule, + CoreModule + ], + declarations: [LoginComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(LoginComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/login/login.component.ts b/src/app/login/login.component.ts new file mode 100644 index 000000000..83d03a354 --- /dev/null +++ b/src/app/login/login.component.ts @@ -0,0 +1,68 @@ +import { Component, OnInit } from '@angular/core'; +import { Router } from '@angular/router'; +import { FormGroup, FormBuilder, Validators } from '@angular/forms'; +import { finalize } from 'rxjs/operators'; + +import { environment } from '@env/environment'; +import { Logger, I18nService, AuthenticationService } from '@app/core'; + +const log = new Logger('Login'); + +@Component({ + selector: 'app-login', + templateUrl: './login.component.html', + styleUrls: ['./login.component.scss'] +}) +export class LoginComponent implements OnInit { + + version: string = environment.version; + error: string; + loginForm: FormGroup; + isLoading = false; + + constructor(private router: Router, + private formBuilder: FormBuilder, + private i18nService: I18nService, + private authenticationService: AuthenticationService) { + this.createForm(); + } + + ngOnInit() { } + + login() { + this.isLoading = true; + this.authenticationService.login(this.loginForm.value) + .pipe(finalize(() => { + this.loginForm.markAsPristine(); + this.isLoading = false; + })) + .subscribe(credentials => { + log.debug(`${credentials.username} successfully logged in`); + this.router.navigate(['/'], { replaceUrl: true }); + }, error => { + log.debug(`Login error: ${error}`); + this.error = error; + }); + } + + setLanguage(language: string) { + this.i18nService.language = language; + } + + get currentLanguage(): string { + return this.i18nService.language; + } + + get languages(): string[] { + return this.i18nService.supportedLanguages; + } + + private createForm() { + this.loginForm = this.formBuilder.group({ + username: ['', Validators.required], + password: ['', Validators.required], + remember: true + }); + } + +} diff --git a/src/app/login/login.module.ts b/src/app/login/login.module.ts new file mode 100644 index 000000000..803dde1a3 --- /dev/null +++ b/src/app/login/login.module.ts @@ -0,0 +1,22 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { ReactiveFormsModule } from '@angular/forms'; +import { TranslateModule } from '@ngx-translate/core'; +import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; + +import { LoginRoutingModule } from './login-routing.module'; +import { LoginComponent } from './login.component'; + +@NgModule({ + imports: [ + CommonModule, + ReactiveFormsModule, + TranslateModule, + NgbModule, + LoginRoutingModule + ], + declarations: [ + LoginComponent + ] +}) +export class LoginModule { } diff --git a/src/app/shared/index.ts b/src/app/shared/index.ts new file mode 100644 index 000000000..625069ab2 --- /dev/null +++ b/src/app/shared/index.ts @@ -0,0 +1,2 @@ +export * from './shared.module'; +export * from './loader/loader.component'; diff --git a/src/app/shared/loader/loader.component.html b/src/app/shared/loader/loader.component.html new file mode 100644 index 000000000..9ba7840c1 --- /dev/null +++ b/src/app/shared/loader/loader.component.html @@ -0,0 +1,4 @@ +
+ {{message}} +
+ diff --git a/src/app/shared/loader/loader.component.scss b/src/app/shared/loader/loader.component.scss new file mode 100644 index 000000000..4e9a06433 --- /dev/null +++ b/src/app/shared/loader/loader.component.scss @@ -0,0 +1,3 @@ +.fa { + vertical-align: middle; +} diff --git a/src/app/shared/loader/loader.component.spec.ts b/src/app/shared/loader/loader.component.spec.ts new file mode 100644 index 000000000..275168a36 --- /dev/null +++ b/src/app/shared/loader/loader.component.spec.ts @@ -0,0 +1,65 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { LoaderComponent } from './loader.component'; + +describe('LoaderComponent', () => { + let component: LoaderComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [LoaderComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(LoaderComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should not be visible by default', () => { + // Arrange + const element = fixture.nativeElement; + const div = element.querySelectorAll('div')[0]; + + // Assert + expect(div.getAttribute('hidden')).not.toBeNull(); + }); + + it('should be visible when app is loading', () => { + // Arrange + const element = fixture.nativeElement; + const div = element.querySelectorAll('div')[0]; + + // Act + fixture.componentInstance.isLoading = true; + fixture.detectChanges(); + + // Assert + expect(div.getAttribute('hidden')).toBeNull(); + }); + + it('should not display a message by default', () => { + // Arrange + const element = fixture.nativeElement; + const span = element.querySelectorAll('span')[0]; + + // Assert + expect(span.innerText).toBe(''); + }); + + it('should display specified message', () => { + // Arrange + const element = fixture.nativeElement; + const span = element.querySelectorAll('span')[0]; + + // Act + fixture.componentInstance.message = 'testing'; + fixture.detectChanges(); + + // Assert + expect(span.innerText).toBe('testing'); + }); +}); diff --git a/src/app/shared/loader/loader.component.ts b/src/app/shared/loader/loader.component.ts new file mode 100644 index 000000000..710236746 --- /dev/null +++ b/src/app/shared/loader/loader.component.ts @@ -0,0 +1,17 @@ +import { Component, OnInit, Input } from '@angular/core'; + +@Component({ + selector: 'app-loader', + templateUrl: './loader.component.html', + styleUrls: ['./loader.component.scss'] +}) +export class LoaderComponent implements OnInit { + + @Input() isLoading = false; + @Input() message: string; + + constructor() { } + + ngOnInit() { } + +} diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts new file mode 100644 index 000000000..5a81e7195 --- /dev/null +++ b/src/app/shared/shared.module.ts @@ -0,0 +1,17 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +import { LoaderComponent } from './loader/loader.component'; + +@NgModule({ + imports: [ + CommonModule + ], + declarations: [ + LoaderComponent + ], + exports: [ + LoaderComponent + ] +}) +export class SharedModule { } diff --git a/src/apple-touch-icon.png b/src/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..775c0fe5af60ed10d099dc268cc6582a0f663c99 GIT binary patch literal 11328 zcmZ`!-FN0}>?c(@3{(0arG7WkK$wNU!25BFO41*j4NdHq30ASu%kOpb`Y+U7g=NbIW?e~}@S`twq z@jTmkO5&E}rkG8bPWRwlx&ISmp2VXgXOjPVAxE9mzSYlvXF@l~nw){-W)d^-4!9Ay z5&MJ`;p-FB-r%)BW%UY+h@g&b5Q;JwIXE`RQ}iuaZg>|H3-Aa_2|E+oHpnS48*e~* z7p96pWr+(U(FGWyf?;Y-``f8L7==L+3D;nH(RxuF;DrEp2dV|VMYu9Cx`yHr-7^qZoZ_yzrMi-VjWPMO_&(M_h6L9YyiNFIM-z@Aq z!j421y?^M(WI}JUBZO^2^`1`Tti;Ax4tRQ)_6TE^Adoi$IvIkPOpHH*OGGdCI)^XF zyRy=qAEgt}2~Tx;P-em}2$ey;gcFmE@yA#|XY_S_qUAWPia|TQ+R`c+BPnM;h4_SW zV9g!5MQ}42i*P`2br&Qj5ltC~t1lp1Q#pUx9TB$42}Sd#uJZQgj$-LftK4-^@}gWI z1ON-H{f>uZF_7G+P=W~VF0yC9zA|D6uHsg>$%1-X36U9^Ntg?Sp4#EpL)!mhU55K7 z9rKF2_i458gP-dMRnU_MgnntMi)H%xx25*NHVQ0KND>swm!eouUN)IX802j0D`+&9 zkUFm??tB00B}%ujm?^^zh55 zXPP_({^a|EITesxeh+hmyEl^yCiP{8*a^Gd1H&mYwvC%8wZ@%TBht-DO{2Tqg6Ira zC9WrgKAGu136@g`BeIPf-SAGLKw7aOPDeiiIerty{+1`l47k@lleLTLltM?@*`_&# z%!U3p!)d|Xwt#e=z`<7f#a#{(^%MLyIVCmsABthtKj`GbX)oAvY9|oZ2%`W*>a@xa z&>`Fm7Pehs450Q34{CcHD_iR=*>G`(CC05`<|*^I^W!supL^zb!VMNgcbH0G zo@qws`cU_kt-phL1OJmsaDmK8U5>Y4&26KE!t2sfK5yP4;Ay`5u$_%3xzO)2oGZ7d z9LvW(&X9USWU)LU$1qZpo+s=eOVcSPuYTeA(6R`hy+c3a4HtB}O~MRcA#BW}P2^}d z`_)1_i1HVj|GY#+?Zk;Te5y+cfTGJcGDJz3`Pqok&xSM~6m&BzR$#E3kaL9w#$-0n zgg}%bl9$IhF~YteIh8mKKVk0-hq^3^WX(>$sBnLdq&PvzaPCR(!tIgx!VXK}@o$cJ z5rO2c^y0E`He5|~S7%!)Fzn}kdBd@LTVvs<@${QMr_-oWgrpXK<&A0!4GK0!gg5m; zLQPuRGRRcN^7BW`(nqvrHg0=AFQG05jTxPctMmnY<~;7X;obUrOJ(1G87p&$9QAi`2lG zZilM&-#)W@k$IlTkdyMO+uS)yPuUO5Szc=;p#BNiW8QO!a3_5In~kJN^x5fX(Y{8& zU)dZoa#!cL^>E~LE)2`its;trZF8rxXIDg(QT4iES2vgxLW;ciNm^dl>8*a<(HimVu9!Wt+fH&k66J73qJoJM(HYs?5+$>t_|lN~JmYY37}2b3wlF){oJ^V$DApoZ zo92VoTW^VEXJPb@D{NmU$bqc#*EogXiqS;}ldgL8y#!8zzxQDpWC+#Hby|`1L2W*? zJ-NM?c6X1&b1XplH87$BeYSaRig_(e^m<60#JKr+AbAaHL5QTy$Al%)ido#zGmJw_ z#^><3XBeyj4t|GcK51fmW$0pyh#!?f^!%HyJc04&Twj*p@KAo{^4+%0;{gg|A3{YH zn8IK**oZT(c+C3Jh?*U!NMwZ~MVXS?Sb~FG`y7Uv{}(u0|1o+K?o#;J!oM%tQBL$y z^tiN~Tb^R)^F0Kg!WiYmrFg6o0 zcH~yMWHGjo5}R0A`PCiH$QRELR@DETe-R?2ygJ`o>Qg<}f0Nuwq14c{)Y~E_vxW;z z4x1sQC(_{R>*2>H_9h5l%cO!AB~_PCRV(n2i)5+T@b%E68_Rg`aW&!b>$;m4Ui0hp z4$y~1WkVchhL=Q*gN>^RvJ)grq77$NAhK-4Ct_?Osq)Ao`fT^>h>EWQql4S3>g$FE zH+^_SNzHQGv#+y_Fh@X8f|kFL53HGWf=i==Hl4d1p#}tafX003aC5hDti7|g5w}D- z_pRz5@*D840FN}hC`n4(_t{CSV_4<{X70P;)!J+=d)12uKL;(EU0*+r{!a-TBI!q? zxY+NRUffwKh*5Ziz|xgDUtA>tZ%NL>+V9YL%H#kenRqm|ERM9buvD{My%)SwMP~B1 zxt+`)t!-Y;L{tUCzZG+UCd4GocAh|*Q$}B_ie})5te($&%MAr*3m$iQ>wiqQ`+X2j z^z++nnTnI8{zB<3Ivl6i!!SDM_rclG{xE&E?$Y+glmiHC-WvW^%r{45Al<~<-eCHT zt^&P{vv~{LBfNP#-u&Jsg-`%!Z~WVoCBCpLx)fd&H4R5y!?`icZ_PmHtoltdK9sUR zJmLHx>>+xcRwCn5h*VwB-}aKw@}$eXlLm5HBJIN;CncY!pEvBZ&Ws5t;cT15LH^i? zJ{0(51hK*SCd%d8$uAdUQ(KFX0iIq~*1PtZokj&%LycimSi4^K$#faB-^;*e$|r=4 zxSVIzYUXG!^-WlgLEzG1x-ir=Yy0@`HO z*1v49ugGYGC8j3H)PDMs+4cK@+MxoBWUNMEewd?2yi<E{ z0iQ^B;kOHQ`=F;(WIX+vfQ851{0W#udZgP-Qf$LsFx5Bfz(En}@(n0@_>xE&#% z#+%)o9qfK>+WZ_%5T{H+?QO1(Jf1TZYG_D-fqaImvqghjV+|*s0_fzKt1;3Lq1SG` zD+r4RmZo>FByEi7boWi{X{X|IUWu6>NuHL~xEFT`e@eXs8UCD573c+~Bgo#RJ&CQ!E ze_j6mUw?Qyfn(IWtrzP#ViU5CsV-AV6q*_ErFcdP9=CkS!^6Oi7yCrKS{Bkr@*6*S=vA!w@2 zT6t&n4}ubiSPbz3Z`9sq+6y9z1j{=BdU7Ke?|x~@<01vM8%R7;`hHqB22 z2QLr3_Vh_6;1mrWox{pz(0h@#<;PI%;fYA2#DA{s`H+0*u-WFA8wJmDHbiVHuHCxm1~&xCeY%#{Bpv_=YZmVed!FV zJ+^0>qkT1-NSyAS#Qq@j!i1l+t`Gs1>wtao8yh;kgWgy=-Go>aKh5lH1t|w3Ox?$) zELj^su>9E8Pu?_Hk{IydMYNB0OG=Qwu}2arU)m`D3Etfue{Gj_cX+UaYs>Q@BILa@ zoS@@}J-#x1?7G5=Fh}mb=^V2Azdu?szgia~4SBi$mdU{PtS7sCl@YRgib9D>R}Sbn zkIggM`42z2*}xG6vvL*J?M-^R$XhzX)cdGj zF8jB$EYEHPEuyL?chbmcV@Xb+^L3ijm5$Y%)4nVmHciZ$f-x=*HDZ`q(a++@^^ez`0=E6zhIJm^EuP2{p>W<=I(<2dsT8pxr=h;feN^in-^nKj=(7YwSN&%QHW>f^g z)l61yo-j{rOea;`%JIU;idk;av1VfkM7YQZ6y9~PGRimE`g5r75POSHuR=za1~Rv- zPDvq26aqA{6lgk{ZU4PA2x}|1PG}yTljVpjDZ4;BrkS%&^FgS)*7eZY@SD;U9x&1! zUofY63fdUD7PqaOB38B4t{GxPL3R|jl*;JbFId4%_S4%0nw&YaIxvn}hRgNSsRadPVRIrB<32Suk zPrKNr7wXDbvx zC`*2Z+xNh9be1@EmN|>nOA(M%;y<_<@1wpqpP#O8sswHk}&0a3k~H~XZ!hSGT2Xz@8i|;u68VVMAWv@^R)2Pk+G+@%+NMzL{WdpPR(e*bN zRnjcoW`(yj>ZeBzDHU~C;^9J(j}Gm{6h6xHG>`C;p>blL#4&?&>s{tg)i5)j-faaa zki4uijv1U^kF0riHC1^cTSGt2@O%5q(=nojmIC+GCCv_f5Xg02l{P+^-Qo#9anudc zj(jk-+pnHCj99{YVr`#XpQE3MWCb6c-!kO zZtap1d3F`u2V2tf5O~aMfA5rJ$SE3LE=JfIXbs!Ip&58D%8%9&iY+Y_qjNiZn@OP8 z#!H88p6)|sI1s;Umx7j3o2cmW#GU23%7{S$i!KR>u_hei5u1gJmq%tej6L#4OBWv# z`R+71CvO_=<2#+A!rPGE-yXhdFVd%1BY=xBHq28~me_3Z>+?TP{YMyoT_BBh9c6!A zVmRudqdx82nEWgmIiuQs?`)H~uuOc+Fw^se+fCjwdz4b+$L3>M6`0&$QjMej*JAqD z-qt3%B~{swNy99GROaNYqHT1bgAko&magN04q@g2Q0Wa4?j^Qys8YvA0~(IY!u!V3 z`EHg{u7p%GJ?Vz_FL2D3kL>)Y-a83PvE#!MsW=LzkfJpEnJ~K^LXX~o_#BIsq6!R$ zgWLU@zRvN56P`55yR=*+PHxIBD>=eol8J~!4+D$0;)i##aI$#mI2gP=`R@9FbsnUd zip@VIf|JfW_7my-e_KIP`u%=JBR&vAfw1b4%dO{8c1}N5;ajkLxYrh~{&qsY*66uBci$P2cq#nDo`_A$u8kpEkbnjPrNNAl5fC)3IOot|gn+&pnRvZF_pU_DT zcm+$Q(q(xPWk@ZbAA70kbqH@B35^T3vlf2aCkiJEhhf?}EKLt~%vBv{{Na7O{3*1v zzLRlPe`kTb%U1l9j0{)cnu3LzC-!6bccqZ+J@eMR0up(_We!O{S#$Ar(3O`haiQTD@Z@28`a_T{}5PYpI&hso3f z$`^&=5+mtxz?O?FZ-)sm59%w7U-DYs5fP$s10_rDh;Q;bJJt6dQmhG7+LsR0pEpSe zVaV4S>O*qs>MJ5X;o(4d;cgIc{`D^cu{X%2a5#qeC;$;LV$t+lj;4nd_@eMh^|Vebw2Y$W(2227yd}m6HJIdY42P8u zF_=5y6p;0`s$H_4$E;`sp-JeqXip~ZYu)ioYnPy_o=aVsC2bQeVEf$9ztKJ z?^bSaeg7>7)-WhC>Culn2ux;+TWF$9Um6GwEVG|r`R3Q`X+HsLb$0EtXjTsYMo1$8v$Y1Cqd?YnAx;lArBFSUJ&@NsmHcfrz1NBOCJoWyc$)39LptsABT9ii1o3Z9aOHIz~S8!U0j0ZxJ8QxY%`q#Ji?z zLrnNG&S=Prsv?GK7!9ZEjJkvsI$r7ggH@(Ykrq1$wZ|HVN*pi=bj$+MV_!2gfu8c9 z$9gFmXpO{ux49{ywmlVhjPX59Qv)HD&_i^pOp4a_iOJ&yA3c?bJ}v#V76>NNQe}|E{-+t?qz5ibAK7)w>1KAlxrlQ)v}Fol<57Xcd_MqoFBweXk6{5 z|5g9c6gz)CNFv@N3x~7ba@fR{1or7*Jc53d=BDAd=2~8q&^_BWBn8%i$gHy)l-n#O zC0fBBhw9wppF3KVRAWLDtV_X3>}2C?_x5g#g|IO=zsgvI((pYbKmYXqIMl!Lk;56E z{`uGEOE9sS>IG8_j>}awW{|5o(_`4yi^u07GrpU68Ja)mm&|2boT9yD3(~3Ii%PFJ z6^fW|o`ncs^~09&NS^oC>G1THEU&9w&MZj>dRkd4n?v-~o%ruw%S&~A6!q%YmY9Cm z(f>txA`2-X!+~a=F8?Z_geaYkVYAcIDdjQxca_Tu5gL>*%`H&BQ+nsIN2TMr%xjfq zi}y1UnlH0!5TWM8MQA__eLd>pZTLLQx#ZuDws7hTju)H=)lFX-VIfBPL!D%EuwTZW znOUBUMWgK6F#F<#%D>EM!W*fDNlExE;1BoQ&+_g39ahR#IsTBD?h3UPJ5=6kR*Oi- z?x4RMUzsxJRZpTWOZ{T6-^zl>p!~wYoW}gzR)dz%Bdh+!|8G0$j5RG9> z-z`wY1@S?fp;i*=ikTdsT)F)bQDbN@w|tq+3r=h6W^lENo+entG*N@I7(bKc=l22s4kD2J{O|wm}4VZ{!LPirLC!b zIfFWW|U=wBM3K20ZyMWJ&k4Stg|eY>hn^gP4&zs-5+- zG0Sh#r2kxV!J+L~COioDVUTcg4C8bCcRz>4FI17xd14>+k9<3QfUUW_llT>$ zy>Pf&N@3y{N!0#B=L1Q2J;NA{ng+hd^lnvaQO)<7`?JzoLmOymxb~^%VWT8{p=+l} zUTeV-xkt`K9>?GuZdusfv_dCJa08n1VRuk?+bo!Bwh)A=o|1JXd>q!1liubl+)Zfz*mGm&Kcv1cE{OesK-`GbrSp0~^U?-yDF(yXo z9GEhQheU^5JlcK7k*zVEZSlGGRj5G9G02P0=eMmBptUqqJfpXWJKa!$0ENWRtbG}Y z2j8PdXJ6;K{T8CC7BHL~QiKG1bt^}pscUj_@F$l+!{KNBlJy}KKgQf8xv(g}5m~)5 zf&e82JW+B;i-or@%;xKvo2&NtN1D`EN2GT*dii}giYVgI~HY z3rfWRIj8byAO=wn`YZXyT0!}I+3=qxTbI^X#pvX_tV&ST2b83(f}P$b@kvH1-ED;+ zWT9XAa`8zOa2O7Stsg<|Hd*sYWfc9wTi6HlwfPa|(!I2UAD@0FANY-?>M@qxWU7%0 z{3!4f2^<+xP4tX<_#z%IJA}X{g87b0!s+MWnP1p2&#G+a?stB#%C|b|jOn@A<9s#Zu4wa9_1RZ}mUI$9iV3qp91r8;PU+pv_J~r5~3k zse#an-RhLaf-NR|Svgz#$yx~#)!IQfd3a&Sh$@OuDVZX39BqT|J~g^bpPjL;9MCQCyndn;WsCG(sz=*^=lHp{@0tsk{I8d_Qf zhD)Q5FGnT%7nq&4_oo{{PEw^&7t8QhO@m6$E=vzOC5!Bh&D_K&w~)8i2nm=Snd-{Q|*j6wYR3ssXUwLF?M!qH}un#IFrdj{@tK=Rd2BIH^J5uCwaI{k0kjHp#Z6!ZL~R;uLt zgW6czpJ`E?vJ7U?3MnmuTN+j~PqTl|8glofX44!L3jR1kZN6=EnvtQgP1S_Cg5M4y z+AT8xF>GYuqu0Lqrl-9muH}7(bVRP{Pwk3Wop2Q5ZSx_Xs#52FK|+3 zUNGQm-f)tOu5o#6jFQ;;^5>!wL)nP0eU-490~&UMRr6l85Hh;-Cb#VcW|^Y-xpb$_ zfH?WM(W#v9zZ^EYPm*C?9mCwDLMW6r<5`xmGHDL-Arl;lI=D%V&mAUIL>jsR<=?24 zt~pj`a`o3pExZW^bf8YJubV3|wv~CM{X*X*Rb^h3UX))3gyp5FVy?Y-gFmpHxr@}K z&_63%|Eac{4?pAWv$nG)eCE2M%fcO%{rViEIj*hW<)Nt8Fkt6_=<5~8{l(<59)5NX zko4VlkWfw~O1!L5cHl~Tdy%yYs{C`#SuQqh?Cfut#PP+9--{F+P?awo!gK=56bHfl zPyL+fo0j!?Uy=fcGf~mhn7$H!4)XUW&Hd2xsum=V)8Oc2HC7NBSXFuj!$;|QvAq?8 zIj_c94ZDG&zu9DZCK1-Xf;I1WIr>ZI20^QLLKM2i8BK(}?U!P5s73HsTHq^)g1;*arPq&_L1;fMz^9hZOxql0E#R z7PUFumnRM!K?7wTB%`;szwjzN7L+QGqqKtFok$y;?myXPs9S8seP~BJ;bg~_Z){;2 zybu-%urZ!De}k4Cq5Iuov0BenSmsAR7aiqSw%MO{O`ob4B-cYJtGYPN*bG#y~94^6^hIE6%K)^afNjHns`)QuDagU z-D|tMyJ`CEuWhsN%#9y7n@n2zfouqYSkFQ(XpIEvX-^W*ZZ%NazvJX7O; z(i8=JZLe{bGWpsYb#~KT&WcbvKj^}XVA$d`!__?@EFxe6;X5fhQHUD;TrbivqjPZH zjjQk~lmA%yz7{b0b+ZBJt!$Pg?(Bl7`!MJwCcHOIm&=cz7eoFB#*`fEhvFpmkCr&e zH5^GWKg=qO)KZ745Gbeqzj$YWS^e8R=Fa*GUzYa?uo1=w z%O_U8)|e!MjH>T_h8h+}cFWiap&llKTep;I8;1?h(f(Ygut^SQNV3L zk5cK6p=Y-{jwKqwvm*Axfn_(3R3Fv%z)b|k{l!stVtzz$ROzGzYhz3HIf$i2q#>0d z1Ara??>03=^;n1dTtFMnMCNh}x7m%&ZrJ>r&)o*|f8qG&2})jc-}byXrL7lw?ehj_ zkfX1;KjtY=$xV(3)1BBlEHsoxbXsV(YSZ zjP&%0ry%LJfa3E0rc@Mpzt2MEC+bMmj%!aUuk#OB?d!9Hw9RJs3`!k|88Jnf&W^a` zv|S9xUeaWLK+=YS_I!5|r~X!@!jHClvU{Wwj_n*QPTe?c&O3%uu`=doBf>txa;kJ1 zy@RiV?=i}SCJmB_$)qeS5o~auv2QOL09Mt#mKDi#J~wgDb2Cx8kD2+MaNXnrJNa1D z#E*cIM@d3V6Op5+A{t~fLVyj9C)pLW!-l$^VwD zT^GifJ%oGdK;~kppb`_VT*I!0QOK|5nc)8bN?Shf&~l}m!ehBb;3_R(mn0sZ#iagJ z!j8>(NDczA4Dvk*!P(_mM zkK%hoR5i|E$*Apu@IZDa0u^!#6IeaBBZJzifM^biyRbwo{708j`4-YpPTMBg4b+XV z@-c5Hx(M+1l8LE=54X~v&v3C-3QZ7dH2hQ?;mIYWSs`-Lz|ote-YoxQLJt#UGg53e z(_JZ#N<#YI`qd~x2|y+a*uR;Rt*^bw7El!u$YuuEiHF{yEuo`{Nh-z*uc30-di_!o z#*=VR1tQW{7dWO&!>)OuL<2xzELu0Qy7Mh^V|ecfA-^w(0qP1;p$$~@wTYxRzPD%_ zk@7KHNmVg3!T~7IDhwBNicw-W3>JdU6g5(;(o}u*kZC?F9!UuxZIG5+Yh$5kXBm_KHIi;*X}#gaW0>

t0i|#Mr^GGEE@o$bI^Ths&mlt2WsMhpB54!^BJY;k|EX_Qu zge=^wpbdZv$jQ$J<7yTs$lQ0H3_WJ9K1MZAQjvwHdI&FAV@34H~-z z8ZHg4QW_o{?nmhmo)JqpnikEEGi%F}qu^1pQKXp=`65Mjz&Rnd$DJf^I&=ttf{dzk Jy`*W_{{ZhbiPZoA literal 0 HcmV?d00001 diff --git a/src/assets/images/833.svg b/src/assets/images/833.svg new file mode 100644 index 000000000..c70f78d99 --- /dev/null +++ b/src/assets/images/833.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/images/MifosX_logo.png b/src/assets/images/MifosX_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c1c0653cf3c0426c5b3f9510f86b1bdd665f021a GIT binary patch literal 1551 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/chosen-sprite.png b/src/assets/images/chosen-sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..113dc9885a6b864ac154b266f024b4597f5c6ae7 GIT binary patch literal 559 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/cubic_loader.gif b/src/assets/images/cubic_loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..ae7cfaa93c4a77ba66762ca91c584eb997b8d28c GIT binary patch literal 7371 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 k@lpqmWD;d)Kin-`gh#^K66+p^jPp4}E!P!vFvP literal 0 HcmV?d00001 diff --git a/src/assets/images/favicon.ico b/src/assets/images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..77eff08e4e9a214e8bf53b3bb27aa0609f5b0c01 GIT binary patch literal 318 zcmYk0F>3-r5QV?Z8RQ^~R|Qf8j;m50q_XoT_!ImIS_M*xDHH@TAj+ZT3+r;Y z`rcUQU@+*GoFsASS0CDv3&;F!WiHF8G%R73jcFlQG2lk|S%j~mfNd3yHQDJFCUqFe U?)@D+efn0dp1x^DvpS=*XP@asqW}N^ literal 0 HcmV?d00001 diff --git a/src/assets/images/loader.gif b/src/assets/images/loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..32143e10d09922749391942a61acbce3a8c2f8b1 GIT binary patch literal 80595 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

BT#zP^ruO%NFpa))*hw=p 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/logo.jpg b/src/assets/images/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f1817306d1cc13ea8ab151a27a7a2366adc6a0b9 GIT binary patch literal 26946 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%0A9SW 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 \ No newline at end of file diff --git a/src/assets/images/small-loader.gif b/src/assets/images/small-loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..bee2c431d75817aaf5d8e08fcc9fb590259c99a1 GIT binary patch literal 5213 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 literal 0 HcmV?d00001 diff --git a/src/assets/ngx-rocket-logo.png b/src/assets/ngx-rocket-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..4f17d9584a7b26977cacd5296b8040f7fa45d1e4 GIT binary patch literal 17141 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 OkCB0ievzI-#Qy`hVh^hT literal 0 HcmV?d00001 diff --git a/src/browserslist b/src/browserslist new file mode 100644 index 000000000..1870737e0 --- /dev/null +++ b/src/browserslist @@ -0,0 +1,10 @@ +# This file is currently used by autoprefixer to adjust CSS to support the below specified browsers +# For additional information regarding the format and rule options, please see: +# https://github.com/browserslist/browserslist#queries + +last 2 versions +> 0.5% +Firefox ESR +not dead +# For IE 9-11 support, please uncomment the next line and adjust as needed +# IE 9-11 diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts new file mode 100644 index 000000000..ff847be2c --- /dev/null +++ b/src/environments/environment.prod.ts @@ -0,0 +1,13 @@ +// `.env.ts` is generated by the `npm run env` command +import env from './.env'; + +export const environment = { + production: true, + version: env.npm_package_version, + serverUrl: '', + defaultLanguage: 'en-US', + supportedLanguages: [ + 'en-US', + 'fr-FR' + ] +}; diff --git a/src/environments/environment.ts b/src/environments/environment.ts new file mode 100644 index 000000000..6b668fc47 --- /dev/null +++ b/src/environments/environment.ts @@ -0,0 +1,18 @@ +// The file contents for the current environment will overwrite these during build. +// The build system defaults to the dev environment which uses `environment.ts`, but if you do +// `ng build --env=prod` then `environment.prod.ts` will be used instead. +// The list of which env maps to which file can be found in `.angular-cli.json`. + +// `.env.ts` is generated by the `npm run env` command +import env from './.env'; + +export const environment = { + production: false, + version: env.npm_package_version + '-dev', + serverUrl: '', + defaultLanguage: 'en-US', + supportedLanguages: [ + 'en-US', + 'fr-FR' + ] +}; diff --git a/src/favicon.ico b/src/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..f5ddd10723fc4cedc412133df79d8cfe7cf94677 GIT binary patch literal 15086 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 + + + + MifosX + + + + + + + + + + +

+ This page requires JavaScript to work properly. Please enable JavaScript in your browser. +

+ + + + + + diff --git a/src/karma.conf.js b/src/karma.conf.js new file mode 100644 index 000000000..59473222d --- /dev/null +++ b/src/karma.conf.js @@ -0,0 +1,45 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/1.0/config/configuration-file.html + +process.env.CHROME_BIN = require('puppeteer').executablePath(); +const path = require('path'); + +module.exports = function(config) { + config.set({ + basePath: '..', + frameworks: ['jasmine', '@angular-devkit/build-angular'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-junit-reporter'), + require('karma-coverage-istanbul-reporter'), + require('@angular-devkit/build-angular/plugins/karma') + ], + client: { + clearContext: false, // leave Jasmine Spec Runner output visible in browser + captureConsole: Boolean(process.env.KARMA_ENABLE_CONSOLE) + }, + junitReporter: { + outputDir: path.join(__dirname, '../reports/junit/'), + outputFile: 'TESTS-xunit.xml', + useBrowserName: false, + suite: '' // Will become the package name attribute in xml testsuite element + }, + coverageIstanbulReporter: { + reports: ['html', 'lcovonly', 'text-summary'], + dir: path.join(__dirname, '../reports/coverage'), + fixWebpackSourcePaths: true + }, + angularCli: { + environment: 'dev' + }, + reporters: ['progress', 'junit'], + port: 9876, + colors: true, + // Level of logging, can be: LOG_DISABLE || LOG_ERROR || LOG_WARN || LOG_INFO || LOG_DEBUG + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['ChromeHeadless'], + singleRun: false + }); +}; diff --git a/src/main.scss b/src/main.scss new file mode 100644 index 000000000..0648db62e --- /dev/null +++ b/src/main.scss @@ -0,0 +1,25 @@ +/* + * Entry point of global application style. + * Component-specific style should not go here and be included directly as part of the components. + */ + +// Theme variables, must be included before the libraries to allow overriding defaults + +/* +@import "theme/theme-variables"; + +// 3rd party libraries + +@import "~@fortawesome/fontawesome-free-webfonts/scss/fontawesome.scss"; +@import "~@fortawesome/fontawesome-free-webfonts/scss/fa-brands.scss"; +@import "~@fortawesome/fontawesome-free-webfonts/scss/fa-regular.scss"; +@import "~@fortawesome/fontawesome-free-webfonts/scss/fa-solid.scss"; */ + +// Theme customization +@import "styles/bootstrap-material/_variables.scss"; +@import "~bootstrap/scss/bootstrap"; +@import "styles/bootstrap-material/_bootswatch.scss"; + + +//other scss imports +@import "styles/_loader.scss" \ No newline at end of file diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 000000000..d511e4a6c --- /dev/null +++ b/src/main.ts @@ -0,0 +1,18 @@ +/* + * Entry point of the application. + * Only platform bootstrapping code should be here. + * For app-specific initialization, use `app/app.component.ts`. + */ + +import { enableProdMode } from '@angular/core'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +import { AppModule } from '@app/app.module'; +import { environment } from '@env/environment'; + +if (environment.production) { + enableProdMode(); +} + +platformBrowserDynamic().bootstrapModule(AppModule) + .catch(err => console.log(err)); diff --git a/src/manifest.json b/src/manifest.json new file mode 100644 index 000000000..5e0fd639c --- /dev/null +++ b/src/manifest.json @@ -0,0 +1,14 @@ +{ + "name": "MifosX", + "short_name": "Mifosx", + "theme_color": "#488aff", + "background_color": "#488aff", + "scope": "/", + "start_url": "/", + "display": "standalone", + "icons": [{ + "src": "assets/ngx-rocket-logo.png", + "sizes": "512x512", + "type": "image/png" + }], +} diff --git a/src/polyfills.ts b/src/polyfills.ts new file mode 100644 index 000000000..cf6caee02 --- /dev/null +++ b/src/polyfills.ts @@ -0,0 +1,80 @@ +/** + * This file includes polyfills needed by Angular and is loaded before the app. + * You can add your own extra polyfills to this file. + * + * This file is divided into 2 sections: + * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. + * 2. Application imports. Files imported after ZoneJS that should be loaded before your main + * file. + * + * The current setup is for so-called "evergreen" browsers; the last versions of browsers that + * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), + * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. + * + * Learn more in https://angular.io/docs/ts/latest/guide/browser-support.html + */ + +/*************************************************************************************************** + * BROWSER POLYFILLS + */ + +/** IE9, IE10 and IE11 requires all of the following polyfills. */ +// import 'core-js/es6/symbol'; +// import 'core-js/es6/object'; +// import 'core-js/es6/function'; +// import 'core-js/es6/parse-int'; +// import 'core-js/es6/parse-float'; +// import 'core-js/es6/number'; +// import 'core-js/es6/math'; +// import 'core-js/es6/string'; +// import 'core-js/es6/date'; +// import 'core-js/es6/array'; +// import 'core-js/es6/regexp'; +// import 'core-js/es6/map'; +// import 'core-js/es6/weak-map'; +// import 'core-js/es6/set'; + +/** IE10 and IE11 requires the following for NgClass support on SVG elements */ +// import 'classlist.js'; // Run `npm install --save classlist.js`. + +/** IE10 and IE11 requires the following for the Reflect API. */ +// import 'core-js/es6/reflect'; + + +/** Evergreen browsers require these. */ +// Used for reflect-metadata in JIT. If you use AOT (and only Angular decorators), you can remove. +import 'core-js/es7/reflect'; + + +/** + * Web Animations `@angular/platform-browser/animations` + * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. + * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). + */ +// import 'web-animations-js'; // Run `npm install --save web-animations-js`. + +/** + * By default, zone.js will patch all possible macroTask and DomEvents + * user can disable parts of macroTask/DomEvents patch by setting following flags + */ + +// (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame +// (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick +// (window as any).__zone_symbol__BLACK_LISTED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames + +/* +* in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js +* with the following flag, it will bypass `zone.js` patch for IE/Edge +*/ +// (window as any).__Zone_enable_cross_context_check = true; + +/*************************************************************************************************** + * Zone JS is required by default for Angular itself. + */ +import 'zone.js/dist/zone'; // Included with Angular CLI. + + + +/*************************************************************************************************** + * APPLICATION IMPORTS + */ diff --git a/src/robots.txt b/src/robots.txt new file mode 100755 index 000000000..d0e5f1be6 --- /dev/null +++ b/src/robots.txt @@ -0,0 +1,5 @@ +# www.robotstxt.org/ + +# Allow crawling of all content +User-agent: * +Disallow: diff --git a/src/styles/_loader.scss b/src/styles/_loader.scss new file mode 100644 index 000000000..f8c16cb92 --- /dev/null +++ b/src/styles/_loader.scss @@ -0,0 +1,49 @@ +.wrapper { + margin: 50px auto; + height: 250px; + width: 240px; + position: relative; + + .triangle { + width: 0; + height: 0; + border-style: solid; + position: absolute; + animation: rotate 0.7s infinite 1s; + } + + .bottom { + border-width: 0 100px 100px 100px; + border-color: transparent transparent #1fb050 transparent; + bottom: 10px; + left: calc(50% - 100px); + } + + .top { + border-width: 100px 100px 0 100px; + border-color: #b4d575 transparent transparent transparent; + top: 10px; + left: calc(50% - 100px); + } + + .left { + border-width: 100px 0 100px 100px; + border-color: transparent transparent transparent #1074b9; + top: calc(50% - 100px); + left: 10px; + } + + .right { + border-width: 100px 100px 100px 0; + border-color: transparent #1daeec transparent transparent; + top: calc(50% - 100px); + right: 10px; + } + + @keyframes rotate { + from { transform: rotate(0deg); } + to { transform: rotate(360deg); } + } + } + + \ No newline at end of file diff --git a/src/styles/bootstrap-material/_bootswatch.scss b/src/styles/bootstrap-material/_bootswatch.scss new file mode 100644 index 000000000..bab08601e --- /dev/null +++ b/src/styles/bootstrap-material/_bootswatch.scss @@ -0,0 +1,666 @@ +// Materia 4.1.1 +// Bootswatch + + +// Variables =================================================================== + +$web-font-path: "https://fonts.googleapis.com/css?family=Roboto:300,400,500,700" !default; +@import url($web-font-path); + +// Effects ===================================================================== + +@mixin ripple($color){ + position: relative; + + &:after { + content: ""; + display: block; + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + margin-left: 0; + @include gradient-radial($color 10%, transparent 10.01%); + background-size: 1000% 1000%; + background-position: 50%; + border: none; + opacity: 0; + pointer-events: none; + transition: background .5s, opacity 1s; + } + + &:active:after { + background-size: 0 0; + opacity: .2; + transition: 0s; + } + + &.disabled, + &[disabled] { + &:after { + display: none; + } + } +} + +// Navbar ====================================================================== + +.navbar { + border: none; + box-shadow: 0 1px 2px rgba(0,0,0,.3); + + &-brand { + font-size: 24px; + } + + &-nav .nav-link { + padding-top: 0.9rem; + padding-bottom: 0.9rem; + } + + &.bg-dark, + &.bg-primary { + + input[type=text], + input[type=password] { + color: #fff; + box-shadow: inset 0 -1px 0 rgba(255, 255, 255, 0.5); + + &:focus { + box-shadow: inset 0 -2px 0 #fff; + } + + &::placeholder { + color: rgba(255, 255, 255, 0.5); + } + } + } +} + +// Buttons ===================================================================== + +@mixin btn($class,$bg,$color){ + .btn-#{$class} { + &:focus { + background-color: $bg; + box-shadow: 0 0 0 2px rgba(204, 204, 204, 0.5); + } + + &:hover, + &:active:hover { + background-color: darken($bg, 6%); + } + + &:active { + box-shadow: 2px 2px 4px rgba(0,0,0,.4); + } + + @include ripple($color); + } + + .btn-outline-#{$class} { + @include ripple($color); + } +} + +@include btn(primary,$primary,$white); +@include btn(secondary,$secondary,$gray-500); +@include btn(success,$success,$white); +@include btn(info,$info,$white); +@include btn(warning,$warning,$white); +@include btn(danger,$danger,$white); +@include btn(dark,$dark,$white); +@include btn(light,$light,$white); + +.btn { + text-transform: uppercase; + border: none; + box-shadow: 0 1px 4px rgba(0,0,0,.4); + transition: all 0.4s; + + &-link { + box-shadow: none; + color: $link-color; + + &:hover, + &:focus { + box-shadow: none; + color: $link-hover-color; + text-decoration: $link-hover-decoration; + } + + &.disabled, // Although btn-link is intended for buttons, which want to look like link, I include here a.disable for the sake of consistency + &[disabled], + fieldset[disabled] & { + &:hover, + &:active:hover { + color: $btn-link-disabled-color; + text-decoration: none; + } + } + } + + &-secondary { + &.disabled, + &[disabled], + fieldset[disabled] & { + background-color: rgba(0, 0, 0, 0.1); + color: rgba(0, 0, 0, 0.4); + opacity: 1; + + &:hover, + &:focus { + background-color: rgba(0, 0, 0, 0.1); + } + } + } + + &-outline-secondary { + border-color: $gray-200; + color: $gray-300; + } + + &-warning { + color: $white; + } + + &.dropdown-toggle::before { + display: inline-block; + width: 0; + height: 0; + margin-left: 0.3em; + vertical-align: middle; + content: ""; + border-top: 0.3em solid; + border-right: 0.3em solid transparent; + border-left: 0.3em solid transparent; + } +} + +.btn-group { + .btn + .btn, + .btn + .btn-group, + .btn-group + .btn, + .btn-group + .btn-group { + margin-left: 0; + } + + &-vertical { + > .btn + .btn, + > .btn + .btn-group, + > .btn-group + .btn, + > .btn-group + .btn-group { + margin-top: 0; + } + } +} + +.border-secondary { + border: 1px solid #dfdfdf !important; +} + +// Typography ================================================================== + +body, +input, +button { + -webkit-font-smoothing: antialiased; + letter-spacing: .1px; +} + +p { + margin: 0 0 1em; +} + +a { + transition: all 0.2s; +} + +// Tables ====================================================================== + +.table-hover { + > tbody > tr, + > tbody > tr > th, + > tbody > tr > td { + transition: all 0.2s; + } +} + +.thead-inverse th { + background-color: $primary; + color: $white; +} + +// Forms ======================================================================= + +.col-form-label { + font-size: 16px; + + &-sm { + font-size: $font-size-sm; + } + + &-lg { + font-size: $font-size-lg; + } +} + +textarea, +textarea.form-control, +input.form-control, +input[type=text], +input[type=password], +input[type=email], +input[type=number], +[type=text].form-control, +[type=password].form-control, +[type=email].form-control, +[type=tel].form-control, +[contenteditable].form-control { + font-size: 1rem; + box-shadow: inset 0 -1px 0 #ddd; + transition: all 0.2s; + + &:focus { + box-shadow: inset 0 -2px 0 $primary; + } + + &[disabled], + &[readonly] { + box-shadow: none; + border-bottom: 1px dotted #ddd; + } + + &:not(textarea) { + height: $input-height; + } + + &.form-control { + &-sm { + height: $input-height-sm; + font-size: $font-size-sm; + } + + &-lg { + height: $input-height-lg; + font-size: $font-size-lg; + } + } + + &::-ms-clear { + display: none; + } +} + +select, +select.form-control { + appearance: none; + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAAJ1BMVEVmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmaP/QSjAAAADHRSTlMAAgMJC0uWpKa6wMxMdjkoAAAANUlEQVR4AeXJyQEAERAAsNl7Hf3X6xt0QL6JpZWq30pdvdadme+0PMdzvHm8YThHcT1H7K0BtOMDniZhWOgAAAAASUVORK5CYII=); + background-size: 13px; + background-repeat: no-repeat; + background-position: right center; + box-shadow: inset 0 -1px 0 #ddd; + + &::-ms-expand { + display: none; + } + + &.input { + &-sm { + font-size: $font-size-sm; + } + + &-lg { + font-size: $font-size-lg; + } + } + + &:focus { + box-shadow: inset 0 -2px 0 $primary; + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAAJ1BMVEUhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISF8S9ewAAAADHRSTlMAAgMJC0uWpKa6wMxMdjkoAAAANUlEQVR4AeXJyQEAERAAsNl7Hf3X6xt0QL6JpZWq30pdvdadme+0PMdzvHm8YThHcT1H7K0BtOMDniZhWOgAAAAASUVORK5CYII=); + } + + &[multiple] { + background: none; + } +} + +.custom-control-label { + &::before { + top: 0; + border: 2px solid $gray-400; + } + &::after { + top: 0; + } + + .custom-control-input:checked ~ &::before { + border-color: $primary; + } +} + +.custom-checkbox .custom-control-input:checked { + ~ .custom-control-label::after { + transform: scale(1.5); + } +} + +.custom-radio .custom-control-input { + &:checked { + ~ .custom-control-label::before { + background-color: $white; + } + ~ .custom-control-label::after { + transform: scale(1.125); + transition: 240ms; + } + } + & { + ~ .custom-control-label::after { + transform: scale(.75); + } + } +} + +.has-warning { + input:not([type=checkbox]), + .form-control, + input.form-control[readonly], + input[type=text][readonly], + [type=text].form-control[readonly], + input:not([type=checkbox]):focus, + .form-control:focus { + border-bottom: none; + box-shadow: inset 0 -2px 0 $warning; + } +} + +.has-danger { + input:not([type=checkbox]), + .form-control, + input.form-control[readonly], + input[type=text][readonly], + [type=text].form-control[readonly], + input:not([type=checkbox]):focus, + .form-control:focus { + border-bottom: none; + box-shadow: inset 0 -2px 0 $danger; + } +} + +.has-success { + input:not([type=checkbox]), + .form-control, + input.form-control[readonly], + input[type=text][readonly], + [type=text].form-control[readonly], + input:not([type=checkbox]):focus, + .form-control:focus { + border-bottom: none; + box-shadow: inset 0 -2px 0 $success; + } +} + +// Remove the Bootstrap feedback styles for input addons +.input-group-addon { + .has-warning &, .has-danger &, .has-success & { + color: $input-color; + border-color: $input-group-addon-border-color; + background-color: $input-group-addon-bg; + } +} + +.input-group { + + > .input-group-prepend > .input-group-text { + padding-right: 0.25rem; + } + + > .input-group-append > .input-group-text { + padding-left: 0.25rem; + } + + .form-control { + padding-left: 0.25rem; + padding-right: 0.25rem; + } +} + +.input-group-sm { + + > .input-group-prepend > .btn, + > .input-group-append > .btn { + padding: $input-btn-padding-y-sm $input-btn-padding-x-sm; + } + + > .input-group-prepend > .input-group-text { + padding: $input-btn-padding-y-sm $input-btn-padding-x-sm $input-btn-padding-y-sm 0; + } + + > .input-group-append > .input-group-text { + padding: $input-btn-padding-y-sm 0 $input-btn-padding-y-sm $input-btn-padding-x-sm; + } + + > .input-group-prepend > .btn { + border-top-left-radius: $btn-border-radius-sm; + border-bottom-left-radius: $btn-border-radius-sm; + } + + > .input-group-append > .btn { + border-top-right-radius: $btn-border-radius-sm; + border-bottom-right-radius: $btn-border-radius-sm; + } +} + +.input-group-lg { + + > .input-group-prepend > .btn, + > .input-group-append > .btn { + padding: $input-btn-padding-y-lg $input-btn-padding-x-lg; + } + + > .input-group-prepend > .input-group-text { + padding: $input-btn-padding-y-lg $input-btn-padding-x-lg $input-btn-padding-y-lg 0; + } + + > .input-group-append > .input-group-text { + padding: $input-btn-padding-y-lg 0 $input-btn-padding-y-lg $input-btn-padding-x-lg; + } + + > .input-group-prepend > .btn { + border-top-left-radius: $btn-border-radius-lg; + border-bottom-left-radius: $btn-border-radius-lg; + } + + > .input-group-append > .btn { + border-top-right-radius: $btn-border-radius-lg; + border-bottom-right-radius: $btn-border-radius-lg; + } +} + + +.form-group-lg { + select, + select.form-control { + line-height: 1.5; + } +} + +// Navs ======================================================================== + +.nav-tabs { + .nav-item + .nav-item { + margin-left: 0; + } + + .nav-link, + .nav-link:focus { + margin-right: 0; + background-color: transparent; + border: none; + color: $body-color; + box-shadow: inset 0 -1px 0 #ddd; + transition: all 0.2s; + + &:hover { + background-color: transparent; + box-shadow: inset 0 -2px 0 $primary; + color: $primary; + } + } + + .nav-link.active, + .nav-link.active:focus { + border: none; + box-shadow: inset 0 -2px 0 $primary; + color: $primary; + + &:hover { + border: none; + color: $primary; + } + } + + .nav-link.disabled { + box-shadow: inset 0 -1px 0 #ddd; + } + + &.nav-justified { + + .nav-link, + .nav-link:hover, + .nav-link:focus, + .nav-link.active, + .nav-link.active:hover, + .nav-link.active:focus { + border: none; + } + } + + .dropdown-menu { + margin-top: 0; + } +} + +.dropdown-menu { + margin-top: 0; + border: none; + box-shadow: 0 1px 4px rgba(0,0,0,.3); +} + +// Indicators ================================================================== + +.alert { + padding-right: 2.5rem; + + &, h1, h2, h3, h4, h5, h6 { + color: #fff; + } + + @each $color, $value in $theme-colors { + &-#{$color} { + background-color: $value; + } + } + + a:not(.btn), + .alert-link { + color: #fff; + font-weight: bold; + } + + .close { + color: #fff; + } + + &-secondary, + &-light { + &, + & a:not(.btn), + & .alert-link { + color: $body-color; + } + } +} + +.badge { + + &-secondary { + background-color: $gray-500; + color: $white; + } + + &-light { + background-color: $gray-200; + } + + &-warning { + color: $white; + } +} + +.tag { + padding: 4px 6px 4px; +} + +// Progress bars =============================================================== + +// Containers ================================================================== + +.close { + line-height: 0.5; + opacity: 0.6; + transition: all 0.2s; + + &:hover { + opacity: 1; + } +} + +.card { + box-shadow: 0 1px 4px rgba(0,0,0,.4); + + &.border-primary, + &.border-secondary, + &.border-success, + &.border-info, + &.border-warning, + &.border-danger, + &.border-light, + &.border-dark { + border-width: 1px; + } +} + +.alert-dismissible { + .close { + padding: 0.5rem 0.75rem; + } +} + +.list-group { + &-item-action.active { + h1, h2, h3, h4, h5, h6 { + color: $white; + } + } +} + +.modal-content { + border-radius: 0.2rem; + box-shadow: 0 6px 36px rgba(0,0,0,.3); +} + +.popover { + border: none; + box-shadow: 0 1px 4px rgba(0,0,0,.3); +} + +.carousel { + &-caption { + h1, h2, h3, h4, h5, h6 { + color: inherit; + } + } +} diff --git a/src/styles/bootstrap-material/_variables.scss b/src/styles/bootstrap-material/_variables.scss new file mode 100644 index 000000000..2e51bcb21 --- /dev/null +++ b/src/styles/bootstrap-material/_variables.scss @@ -0,0 +1,129 @@ +// Materia 4.1.1 +// Bootswatch + +// +// Color system +// + +$white: #fff !default; +$gray-100: #f8f9fa !default; +$gray-200: #eee !default; +$gray-300: #dee2e6 !default; +$gray-400: #ced4da !default; +$gray-500: #bbb !default; +$gray-600: #666 !default; +$gray-700: #444 !default; +$gray-800: #222 !default; +$gray-900: #212121 !default; +$black: #000 !default; + +$blue: #2196F3 !default; +$indigo: #6610f2 !default; +$purple: #6f42c1 !default; +$pink: #e83e8c !default; +$red: #e51c23 !default; +$orange: #fd7e14 !default; +$yellow: #ff9800 !default; +$green: #4CAF50 !default; +$teal: #20c997 !default; +$cyan: #9C27B0 !default; + +$primary: $blue !default; +$secondary: $white !default; +$success: $green !default; +$info: $cyan !default; +$warning: $yellow !default; +$danger: $red !default; +$light: $white !default; +$dark: $gray-800 !default; + +// Body + +$body-color: $gray-700 !default; + +// Fonts + +$font-family-sans-serif: "Roboto", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif !default; + +$font-size-base: 0.8125rem !default; + +$font-weight-base: 400 !default; + +// Buttons + +$input-btn-padding-y: 1rem !default; +$input-btn-padding-x: 1rem !default; + +// Forms + +$input-padding-y: 1rem !default; +$input-padding-x: 0 !default; + +$input-padding-y-sm: $font-size-base !default; +$input-padding-x-sm: 0 !default; + +$input-padding-y-lg: ($font-size-base * 1.25) !default; +$input-padding-x-lg: 0 !default; + +$input-bg: transparent !default; +$input-disabled-bg: transparent !default; + +$input-color: $gray-600 !default; +$input-border-color: transparent !default; +$input-border-width: 0rem !default; + +$input-border-radius: 0 !default; +$input-border-radius-lg: 0 !default; +$input-border-radius-sm: 0 !default; + +$input-placeholder-color: rgba(0,0,0,0.4) !default; + +$input-group-addon-bg: transparent !default; + +$custom-control-gutter: 1.75rem !default; + +$custom-control-indicator-focus-box-shadow: 0 !default; + +$custom-control-indicator-size: 1.25rem !default; +$custom-control-indicator-bg: $white; +$custom-checkbox-indicator-border-radius: 2px !default; + +$custom-control-indicator-disabled-bg: $gray-100 !default; + +$custom-radio-indicator-icon-checked: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='4' fill='%232196F3'/%3E%3C/svg%3E") !default; + +// Navs + +$nav-link-disabled-color: $gray-500 !default; + +$nav-tabs-border-color: transparent !default; + +// Navbar + +$navbar-padding-y: 1rem !default; + +$navbar-dark-color: rgba($white,.75) !default; +$navbar-dark-hover-color: $white !default; + +// Cards + +$card-border-width: 0; +$card-border-color: transparent; + +// Tooltips + +$tooltip-bg: $gray-700 !default; + +// Modals + +$modal-content-border-color: transparent !default; + +// Progress bars + +$progress-height: 0.375rem !default; +$progress-border-radius: 0 !default; + +// Close + +$close-font-size: 2.125rem !default; +$close-font-weight: 300 !default; diff --git a/src/test.ts b/src/test.ts new file mode 100644 index 000000000..7e24186ee --- /dev/null +++ b/src/test.ts @@ -0,0 +1,23 @@ +/* + * Prepare environment for unit tests. + * This file is required by karma.conf.js and loads recursively all the .spec and framework files. + */ + +import 'zone.js/dist/zone-testing'; +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting +} from '@angular/platform-browser-dynamic/testing'; + +declare const require: any; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting() +); +// Then we find all the tests. +const context = require.context('./', true, /\.spec\.ts$/); +// And load the modules. +context.keys().map(context); diff --git a/src/theme/theme-variables.scss b/src/theme/theme-variables.scss new file mode 100644 index 000000000..61dcae04a --- /dev/null +++ b/src/theme/theme-variables.scss @@ -0,0 +1,55 @@ +/* + * Application global variables. + */ + +// Set Font Awesome font path +$fa-font-path: "~@fortawesome/fontawesome-free-webfonts/webfonts"; + +// --------------------------------------------------------------------------- +// Bootstrap variables +// +// Override Bootstrap variables here to suite your theme. +// Copy variables you want to customize from node_modules/bootstrap/scss/_variables.scss + +// +// Color system +// + +$white: #fff; +$gray-100: #f8f9fa; +$gray-200: #e9ecef; +$gray-300: #dee2e6; +$gray-400: #ced4da; +$gray-500: #adb5bd; +$gray-600: #868e96; +$gray-700: #495057; +$gray-800: #343a40; +$gray-900: #212529; +$black: #000; + +$blue: #0073dd; +$indigo: #6610f2; +$purple: #6f42c1; +$pink: #e83e8c; +$red: #dc3545; +$orange: #fd7e14; +$yellow: #ffc107; +$green: #28a745; +$teal: #20c997; +$cyan: #17a2b8; + +$theme-colors: ( + primary: $blue, + secondary: $gray-600, + success: $green, + info: $cyan, + warning: $yellow, + danger: $red, + light: $gray-100, + dark: $gray-800 +); + +// Use Bootstrap defaults for other variables, imported here so we can access all app variables in one place when used +// in components. +@import "~bootstrap/scss/_functions"; +@import "~bootstrap/scss/_variables"; diff --git a/src/theme/theme.scss b/src/theme/theme.scss new file mode 100644 index 000000000..e49965155 --- /dev/null +++ b/src/theme/theme.scss @@ -0,0 +1,5 @@ +/* + * Global application theme. + * Framework overrides and customization goes here. + */ + diff --git a/src/translations/en-US.json b/src/translations/en-US.json new file mode 100644 index 000000000..e7973bd8f --- /dev/null +++ b/src/translations/en-US.json @@ -0,0 +1,16 @@ +{ + "APP_NAME": "MifosX", + "About": "About", + "Hello world !": "Hello world !", + "Home": "Home", + "Logged in as": "Logged in as", + "Login": "Login", + "Logout": "Logout", + "Password": "Password", + "Password is required": "Password is required", + "Username": "Username", + "Username is required": "Username is required", + "Username or password incorrect.": "Username or password incorrect.", + "Remember me": "Remember me", + "Version": "Version" +} diff --git a/src/translations/fr-FR.json b/src/translations/fr-FR.json new file mode 100644 index 000000000..6a2a0469b --- /dev/null +++ b/src/translations/fr-FR.json @@ -0,0 +1,16 @@ +{ + "APP_NAME": "MifosX", + "About": "A propos", + "Hello world !": "Bonjour le monde !", + "Home": "Accueil", + "Logged in as": "Connecté en tant que", + "Login": "Connexion", + "Logout": "Déconnexion", + "Password": "Mot de passe", + "Password is required": "Mot de passe requis", + "Username": "Identifiant", + "Username is required": "Identifiant requis", + "Username or password incorrect.": "Identifiant ou mot de passe incorrect.", + "Remember me": "Rester connecté", + "Version": "Version" +} diff --git a/src/tsconfig.app.json b/src/tsconfig.app.json new file mode 100644 index 000000000..254253739 --- /dev/null +++ b/src/tsconfig.app.json @@ -0,0 +1,17 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/app", + "baseUrl": "./", + "module": "es2015", + "types": [] + }, + "exclude": [ + "test.ts", + "**/*.spec.ts", + "**/*.mock.ts" + ], + "angularCompilerOptions": { + "preserveWhitespaces": true + } +} diff --git a/src/tsconfig.spec.json b/src/tsconfig.spec.json new file mode 100644 index 000000000..f5ed04474 --- /dev/null +++ b/src/tsconfig.spec.json @@ -0,0 +1,22 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/spec", + "baseUrl": "./", + "module": "commonjs", + "target": "es5", + "types": [ + "jasmine", + "node" + ] + }, + "files": [ + "test.ts", + "polyfills.ts" + ], + "include": [ + "**/*.spec.ts", + "**/*.mock.ts", + "**/*.d.ts" + ] +} diff --git a/src/typings.d.ts b/src/typings.d.ts new file mode 100644 index 000000000..7306c36f1 --- /dev/null +++ b/src/typings.d.ts @@ -0,0 +1,12 @@ +/* + * Extra typings definitions + */ + +// Allow .json files imports +declare module '*.json'; + +// SystemJS module definition +declare var module: NodeModule; +interface NodeModule { + id: string; +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 000000000..50db1178f --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "outDir": "./dist/out-tsc", + "sourceMap": true, + "declaration": false, + "moduleResolution": "node", + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "noImplicitAny": true, + "suppressImplicitAnyIndexErrors": true, + "target": "es5", + "typeRoots": [ + "node_modules/@types" + ], + "lib": [ + "es2017", + "dom" + ], + "baseUrl": "src", + "paths": { + "@app/*": ["app/*"], + "@env/*": ["environments/*"] + } + } +} diff --git a/tslint.json b/tslint.json new file mode 100644 index 000000000..f4dedc500 --- /dev/null +++ b/tslint.json @@ -0,0 +1,152 @@ +{ + "rulesDirectory": [ + "node_modules/codelyzer" + ], + "rules": { + "arrow-return-shorthand": true, + "callable-types": true, + "class-name": true, + "comment-format": [ + true, + "check-space" + ], + "curly": true, + "deprecation": { + "severity": "warn" + }, + "eofline": true, + "forin": true, + "import-blacklist": [ + true, + "rxjs/Rx" + ], + "import-spacing": true, + "indent": [ + true, + "spaces" + ], + "interface-over-type-literal": true, + "jsdoc-format": true, + "label-position": true, + "max-line-length": [ + true, + 120 + ], + "member-access": false, + "member-ordering": [ + true, + { + "order": [ + "static-field", + "instance-field", + "static-method", + "instance-method" + ] + } + ], + "no-arg": true, + "no-bitwise": true, + "no-console": [ + true, + "debug", + "info", + "time", + "timeEnd", + "trace" + ], + "no-construct": true, + "no-debugger": true, + "no-duplicate-variable": [ + true, + "check-parameters" + ], + "no-duplicate-super": true, + "no-empty": false, + "no-empty-interface": true, + "no-eval": true, + "no-inferrable-types": [ + true, + "ignore-params" + ], + "no-misused-new": true, + "no-non-null-assertion": true, + "no-shadowed-variable": true, + "no-string-literal": false, + "no-string-throw": true, + "no-switch-case-fall-through": true, + "no-trailing-whitespace": true, + "no-unnecessary-initializer": true, + "no-unused-expression": true, + "no-use-before-declare": true, + "no-var-keyword": true, + "object-literal-sort-keys": false, + "one-line": [ + true, + "check-open-brace", + "check-catch", + "check-else", + "check-whitespace" + ], + "prefer-const": true, + "quotemark": [ + true, + "single" + ], + "radix": true, + "semicolon": [ + true, + "always" + ], + "triple-equals": [ + true, + "allow-null-check" + ], + "typedef": [ + true, + "parameter", + "property-declaration" + ], + "typedef-whitespace": [ + true, + { + "call-signature": "nospace", + "index-signature": "nospace", + "parameter": "nospace", + "property-declaration": "nospace", + "variable-declaration": "nospace" + } + ], + "unified-signatures": true, + "variable-name": false, + "whitespace": [ + true, + "check-branch", + "check-decl", + "check-operator", + "check-separator", + "check-type" + ], + "directive-selector": [ + true, + "attribute", + "app", + "camelCase" + ], + "component-selector": [ + true, + "element", + "app", + "kebab-case" + ], + "no-output-on-prefix": true, + "use-input-property-decorator": true, + "use-output-property-decorator": true, + "use-host-property-decorator": true, + "no-input-rename": true, + "no-output-rename": true, + "use-life-cycle-interface": true, + "use-pipe-transform-interface": true, + "component-class-suffix": true, + "directive-class-suffix": true + } +}